diff --git a/workplans/HUB-WP-0006-repository-classification-navigation.md b/workplans/HUB-WP-0006-repository-classification-navigation.md index a58be26..245130a 100644 --- a/workplans/HUB-WP-0006-repository-classification-navigation.md +++ b/workplans/HUB-WP-0006-repository-classification-navigation.md @@ -9,7 +9,7 @@ flavor: implementation owner: codex topic_slug: custodian created: "2026-08-22" -updated: "2026-10-04" +updated: "2026-10-13" parent_project: prj-state-hub-retirement parent_workplan: STATE-WP-0079 related: @@ -200,6 +200,65 @@ placement/networking outside this repository. Marking the workplan `blocked` rather than `active` since nothing further can move here until that external gate closes. +A5 packet intake 2026-10-13: State Hub delivered the comparison packet +(`state-hub/docs/a5-topic-spine-comparison-packet.md`, cases +`docs/evidence/a5-topic-spine-comparison-cases.json`, A5-C01..C10). It named two +hub-core gaps: no alias source, and no `RM_SLICE_TOPICSPINE`. T07 closes both in +code. The flag stays `off` everywhere, so T06 remains `wait` for the deployed +candidate run and the switch window. + +## Seed legacy topic aliases and implement the A5 rollback switch + +```task +id: HUB-WP-0006-T07 +status: done +priority: high +depends_on: [] +``` + +Done 2026-10-13 (commit `9e4d5ba`). Not pushed or deployed. The flag has not +been changed in any environment. + +- **Alias source:** `hub_core/runtime/data/legacy_topic_aliases.json`, alias set + `2026-10-13.1`. It holds the 16 active topics from State Hub's 2026-10-13 + `GET /topics/?status=active` capture. Each maps to `primary_domain` = + `domain_slug`, with `residual_owner` `STATE-WP-0079` and `expires_at` + `2027-03-31T23:59:59Z`. The expiry is a conservative choice: it covers the + switch window plus a dual run, and it can be renewed by editing the seed and + bumping its version. The seed is validated against the 1.0.0 + `legacyTopicAlias` schema and is never fetched live. Topic UUIDs are kept + verbatim. Three slugs with underscores (`inter_hub`, `vergabe_teilnahme`, + `citation_evidence_mvp`) are emitted with hyphens, because the 1.0.0 pattern + forbids `_`. Emitting the exact spelling needs a contract patch. +- **Flag:** `RM_SLICE_TOPICSPINE` takes `off`, `shadow` or `on`; the default is + `off`. + - `off` leaves the output byte-for-byte unchanged (`legacy_topic_aliases: []`). + - `shadow` serves the aliases for comparison only. + - `on` declares hub-core the switched A5 read source. + + Rollback is setting the flag back to `off`. The values are documented in + `docs/runtime.md`. +- **Local comparison against fixtures:** see `tests/test_legacy_topic_aliases.py`. + - Pass: A5-C01 (16/16 aliases equal after the `_`→`-` normalisation), A5-C02 + and the identity part of A5-C08 (each topic id resolves to exactly one alias), + and the hub-core half of A5-C10 (`off` withdraws the aliases). + - A5-C03 differs from the packet's expectation. An unknown domain returns + `400`, because the runtime validates the controlled vocabulary; it does not + return `200` with an empty list. A known domain with no repositories returns + `200 []`. + - A5-C04, C05, C06 and C07 need the deployed registry. The fixtures hold only + two synthetic repositories. + - A5-C09 has nothing to compare. + - The State Hub half of C10 is a legacy read. +- **Tests:** full suite: 488 passed, 3 skipped. +- **Still needed before T06 can run live:** + - deploy an image containing `9e4d5ba` and set `shadow` on the candidate only, + after approval; + - a verified candidate base URL and auth; + - the 154 vs 123 repository gap (out of scope here and unexplained); + - topic-route usage figures from the legacy meter; + - caller-owner switch plans. + ## Acceptance - [x] Repo Manager v1.0 authority and projection contract accepted