docs(STATE-WP-0079): A2 readiness detail and dual-run state
All checks were successful
CI Smoke / host-smoke (push) Successful in 1s
CI Smoke / container-smoke (push) Successful in 2s

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 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-08-20 08:50:01 +02:00
parent 5f747fbc1e
commit a824fd5dfe
2 changed files with 67 additions and 6 deletions

View file

@ -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. A2bA2e 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 23 — `policies/retirement-freeze.md` makes that inadmissible.

View file

@ -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 A2bA2e (~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`