From a824fd5dfe2fb7194e5c4f174a33e9632bed8a43 Mon Sep 17 00:00:00 2001 From: tegwick Date: Thu, 20 Aug 2026 08:50:01 +0200 Subject: [PATCH] docs(STATE-WP-0079): A2 readiness detail and dual-run state Applied the A3 readiness check one level down. The State Hub adapter exposes exactly three operations: rm_update_task_status, rm_reconcile, rm_scaffold. No adapter for workplan CRUD, intake, decision, dependency or human-flag records, and no repo-manager parser for them either. A2 splits into A2a (task status + reconcile, ~6 items, receivable) and A2b-A2e (~32 items, not receivable). A2a is the only slice in the plan executable today -- roughly 6 of 425 inventory items. Also records that dual-run is currently off entirely: no config file, writeback and reconcile false, no pilot repos. The 23 metered mutations are RMGR-WP-0002/0003 pilot residue. A2a's next step is operational, not code. Co-Authored-By: Claude Opus 5 --- docs/retirement-cutover-slice-plan.md | 52 +++++++++++++++++-- .../STATE-WP-0079-retirement-strangler.md | 21 ++++++-- 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/docs/retirement-cutover-slice-plan.md b/docs/retirement-cutover-slice-plan.md index fcff017..3e99460 100644 --- a/docs/retirement-cutover-slice-plan.md +++ b/docs/retirement-cutover-slice-plan.md @@ -140,6 +140,51 @@ whole slice at once. the job portion is `activity-core` (Wave C1). Cut the repo-manager portion first and leave the job dual-running. +### A2 readiness detail (2026-08-20) + +Same check as for A3, applied one level down. The State Hub adapter +(`api/services/repo_manager_dual_run.py`) exposes exactly three operations: + +| Adapter function | Routes to | Covers | +| --- | --- | --- | +| `rm_update_task_status` | `rmgr task-status` | task status writes | +| `rm_reconcile` | `rmgr reconcile` | work-record index rebuild | +| `rm_scaffold` | `rmgr scaffold` | repo scaffolding (A1 `repo-onboarding`, already cut over) | + +There is no adapter for workplan create/update/delete, intake, decision, +dependency, or human-flag records — and no parser for them on the repo-manager +side either (`parse/` is `workplan.py` only). So A2 splits: + +| Sub-slice | Items | Receivable | +| --- | --- | --- | +| **A2a** task status + reconcile | ~6 (`update_task_status`, `bulk_update_task_statuses`, `PATCH /tasks/{id}`, `POST /tasks/bulk-status-sync`, index refresh job, `table:tasks`) | **Yes — adapter exists and was proven by RMGR-WP-0002/0003** | +| A2b workplan CRUD | ~9 routes + `table:workplans` | No adapter; repo-manager parses workplans but exposes no write path | +| A2c intake | 9 | No parser, no adapter | +| A2d decision | 8 | No parser, no adapter | +| A2e dependencies + human-flag | ~6 | No parser, no adapter | + +**A2a is the only slice in the entire plan that is executable today**, and it is +roughly 6 items, not 59. + +### Dual-run is currently off + +`rmgr dual-run-status` on 2026-08-20: + +``` +config_exists: false writeback: false reconcile: false pilot_repos: null +meter: {state-hub: 15, repo-manager: 8, total: 23} +``` + +The 23 metered mutations are the RMGR-WP-0002/0003 pilot runs. Nothing is +dual-running now — the adapter is proven but switched off, and there is no +`~/.repo-manager/dual-run.yaml`. + +**So the concrete next executable step is operational, not code:** create the +dual-run config and enable `RM_WRITEBACK` + `RM_RECONCILE` for a pilot repo, +then watch the mutation meter for divergence. That is A2a moving from `off` to +`dual`. It needs an operator decision because it changes how live task writes +flow; it is reversible by clearing the flags. + ### A3 · Registers — 49 items `sbom-inventory` (10) · `repo-goals` (9) · `upstream-contributions` (9) · `register-technical-debt` (9) · `register-extension-points` (6) · `register-entries` (6) @@ -378,9 +423,10 @@ discovered live at cutover. surface (A4), and the topic-spine contract (A5). Until that exists, 79 of Wave A's 165 items have nowhere to go. This is now the critical path for the whole retirement, ahead of anything State Hub can do to itself. -3. Cut **A2** (work records, 59 items) as the first real slice — it is the only - Wave A slice with a proven adapter. Split `RM_SLICE_WORKRECORDS` by record - kind to manage the blast radius rather than cutting it whole. +3. Cut **A2a** (task status + reconcile, ~6 items) — the only slice in the plan + executable today. First step is operational: create `~/.repo-manager/dual-run.yaml` + and enable writeback/reconcile for one pilot repo, then watch the mutation + meter. A2b–A2e need repo-manager parsers and adapters that do not exist. 4. Do not open Wave B until HUB-WP-0004 reaches `ready`; 125 items sit behind it. 5. Do not build register, UI, or topic capability in State Hub to unblock items 2–3 — `policies/retirement-freeze.md` makes that inadmissible. diff --git a/workplans/STATE-WP-0079-retirement-strangler.md b/workplans/STATE-WP-0079-retirement-strangler.md index b833ef8..a2352ff 100644 --- a/workplans/STATE-WP-0079-retirement-strangler.md +++ b/workplans/STATE-WP-0079-retirement-strangler.md @@ -141,9 +141,24 @@ must build the register, UI, and topic surfaces before 79 Wave A items can move. Building them in State Hub is inadmissible under `policies/retirement-freeze.md` — it would be new permanent ownership in the component being retired. -First executable slice is therefore **A2** (work records, 59 items), the only -one with a proven adapter, with `RM_SLICE_WORKRECORDS` split by record kind to -manage blast radius. +**A2 checked the same way (2026-08-20):** the State Hub adapter exposes exactly +three operations — `rm_update_task_status`, `rm_reconcile`, `rm_scaffold`. There +is no adapter for workplan CRUD, intake, decision, dependency, or human-flag +records, and no repo-manager parser for them either. A2 therefore splits into +**A2a** (task status + reconcile, ~6 items, receivable) and A2b–A2e (~32 items, +not receivable). + +**A2a is the only slice in the whole plan executable today.** Its next step is +operational rather than code: `rmgr dual-run-status` shows dual-run entirely off +(`config_exists: false`, writeback/reconcile false, no pilot repos; the 23 +metered mutations are RMGR-WP-0002/0003 pilot residue). Moving A2a from `off` to +`dual` means creating `~/.repo-manager/dual-run.yaml`, enabling `RM_WRITEBACK` +and `RM_RECONCILE` for one pilot repo, and watching the mutation meter for +divergence. Reversible by clearing the flags; needs an operator decision because +it changes how live task writes flow. + +Net: of 425 inventory items, roughly **6 can move today**. The retirement is +gated almost entirely on owner-side capability in `repo-manager` and `hub-core`. **Inherited (2026-08-19) from `STATE-WP-0080-T04`:** this slice now also owns deletion of the templating path in `statehub_register.py` — `INTENT.md`