Top-Band Alias Repair Queue Handoff
Punctuation aliases now resolve deterministically, and the remaining top-band misses now have LinkedIn-backed JD-aware intake rows.
The top-band runtime router no longer misses common punctuation aliases like f i manager versus f&i manager. The remaining top 1,000 not_found or abstain routes now have a deterministic repair queue, and every queued row has been converted into a LinkedIn-backed source-authority intake candidate for JD-aware role context. Runtime service is still gated; this slice moves the work from title-only gaps to source-backed role context.
Punctuation aliases now match
role_context_query now normalizes any non-alphanumeric separator to a space before matching. This keeps title matching deterministic while covering common marketplace and JD title variants such as ampersands, slashes, hyphens, and other punctuation.
uv run pytest tests/test_role_context_query.py::test_role_context_query_matches_punctuation_normalized_title_aliases -q
The top-band miss count dropped
The top 500 now has zero not_found rows. The top 1,000 still has gaps, but the miss count dropped from 53 to 22 after punctuation-aware matching.
| Band | Before | After | Change |
|---|---|---|---|
| Top 500 matched | 486 / 499 | 499 / 499 | +13 |
| Top 500 not found | 13 | 0 | -13 |
| Top 1,000 matched | 943 / 996 | 974 / 996 | +31 |
| Top 1,000 not found | 53 | 22 | -31 |
{
"abstain": 30,
"not_found": 22,
"serve": 944
}
Remaining gaps are explicit
The new top-band-runtime-route-repair-queue command writes JSON, JSONL, Markdown, and HTML artifacts. It queues only rows that still route as not_found or abstain, and now surfaces exact local linkedin_jobs candidates for each queued title.
| Queue | Count |
|---|---|
| Total repair rows | 52 |
| Top 500 repair rows | 16 |
| Top 1,000 repair rows | 52 |
| Rows with JD context match | 52 |
| Rows with existing JD/source-authority refs | 52 |
| Rows with exact LinkedIn title matches | 52 |
| LinkedIn source refs surfaced | 416 |
{
"jd_context_confirmation_blocked": 1,
"runtime_contract_missing_for_source_backed_role_context": 22,
"source_authority_incomplete_with_context": 29
}
Exact matches are now source-authority intake rows
The new top-band-linkedin-source-authority-intake command converts the 52 queued titles into local source-context candidates with source-ref keys that JD-aware role context can parse and join back to linkedin_jobs. These rows are not runtime authority.
| Intake | Count |
|---|---|
| Intake rows | 52 |
| Top 500 intake rows | 16 |
| Top 1,000 intake rows | 52 |
| Candidate source-ref keys | 416 |
| Rows with risk tags | 50 |
{
"blocked_until_learner_or_source_confirmation": 1,
"source_context_candidate_requires_jd_context_before_runtime_service": 51
}
| JD-aware metric | Count |
|---|---|
| Role-context rows | 1,056 |
| Top-band LinkedIn intake rows consumed | 52 |
| Rows with job context | 1,022 |
| Top 500 titles with role context | 499 / 499 |
| Top 1,000 titles with role context | 996 / 996 |
| Top-band explicit gaps | 0 |
The runtime boundary stayed locked
The proof commands passed
uv run pytest tests/test_role_context_query.py tests/test_top_band_runtime_route_coverage.py tests/test_top_band_runtime_route_repair_queue.py -q
uv run ruff check src/aina_data_engine/reports.py src/aina_data_engine/role_context_query.py src/aina_data_engine/top_band_runtime_route_repair_queue.py src/aina_data_engine/cli.py tests/test_role_context_query.py tests/test_top_band_runtime_route_repair_queue.py
uv run pytest tests/test_top_band_linkedin_source_authority_intake.py tests/test_jd_aware_role_context.py tests/test_top_band_runtime_route_repair_queue.py -q
uv run ruff check src/aina_data_engine/reports.py src/aina_data_engine/top_band_linkedin_source_authority_intake.py src/aina_data_engine/jd_aware_role_context.py src/aina_data_engine/cli.py tests/test_top_band_linkedin_source_authority_intake.py tests/test_jd_aware_role_context.py
uv run aina-data-engine --root /srv/aina/aina-data-engine-room production-runtime-readiness
uv run aina-data-engine --root /srv/aina/aina-data-engine-room ain-506-p0-gate
uv run aina-data-engine --root /srv/aina/aina-data-engine-room ain-510-retrieval-promotion-gate
uv run aina-data-engine --root /srv/aina/aina-data-engine-room top-band-linkedin-source-authority-intake
uv run aina-data-engine --root /srv/aina/aina-data-engine-room jd-aware-role-context-evidence --fixture-limit 50
uv run aina-data-engine --root /srv/aina/aina-data-engine-room validate
Key evidence: production runtime readiness is ready_to_harden_headless_production_runtime; AIN-506 passed; AIN-510 is promotion_ready; full validation passed with zero failed checks; LinkedIn intake passed with 52 rows and 416 source-ref keys; JD-aware role context now covers 499 / 499 top 500 titles and 996 / 996 top 1,000 titles.
Bridge source context into runtime contracts
Start from the 52-row source-backed intake set. The next slice should read the intake rows and JD-aware role-context rows together, promote only rows that have enough source authority to serve safely, and keep ambiguous rows as abstain with a clear learner or source confirmation path.
cd /srv/aina/aina-data-engine-room
git status --short --branch
uv run aina-data-engine --root /srv/aina/aina-data-engine-room validate
uv run aina-data-engine --root /srv/aina/aina-data-engine-room top-band-linkedin-source-authority-intake
uv run aina-data-engine --root /srv/aina/aina-data-engine-room jd-aware-role-context-evidence --fixture-limit 50
uv run aina-data-engine --root /srv/aina/aina-data-engine-room top-band-runtime-route-repair-queue
Open the 52-row LinkedIn intake first, then bridge source-backed JD context into runtime contracts without promoting ambiguous rows.