--- id: RMGR-WP-0002 type: workplan title: "Retirement dual-run: SH adapter for writeback and reconcile" domain: infotech repo: repo-manager status: finished owner: codex topic_slug: repo-manager created: "2026-08-09" updated: "2026-08-09" parent_project: prj-state-hub-retirement parent_workplan: SHR-WP-0001 stream: S1 related: - RMGR-WP-0001 - STATE-WP-0079 - ACTIVITY-WP-0029 - specs/ArchitectureBlueprint.md - history/2026-08-09-state-hub-repo-tooling-research.md state_hub_workstream_id: "bcb0e20a-ebb4-4f14-b8ee-4fd93436f68e" --- # Retirement dual-run: SH adapter for writeback and reconcile ## Goal Close in on **State Hub retirement of repository checkout mutation** by making Repo Manager the executor for the highest-value write path and for reconcile, behind a **State Hub dual-run facade**—not by refactoring RM for cleanliness. Success is measured by: agent task-status updates and fix-consistency can run with **Git evidence produced by Repo Manager**, while State Hub remains the MCP/REST entrypoint until meters allow cutover (Blueprint Stage B → toward D). **Out of scope for this workplan:** dashboard UX, SBOM product work, full MCP rewrite, topic-spine cleanup, generic framework polish, expanding command catalog beyond what dual-run requires. ## Blueprint alignment See `specs/ArchitectureBlueprint.md` §4–§9. This WP is Stage B. ## Define dual-run feature flags and success meters ```task id: RMGR-WP-0002-T01 status: done priority: high state_hub_task_id: "cb9c4457-69f0-45c0-8299-00a195ffdf69" ``` Specify flags (e.g. `RM_WRITEBACK=1`, `RM_RECONCILE=1`) and a minimal meter: count of checkout mutations by source `state-hub` vs `repo-manager`. Document rollback (flag off → SH native path). No new product metrics frameworks. **Result:** `dual_run.py` + `docs/dual-run.md`; `rmgr dual-run-status`. ## Productionize task-status command for dual-run ```task id: RMGR-WP-0002-T02 status: done priority: high state_hub_task_id: "e4435174-237f-4e52-a891-3e0fd45c95eb" ``` Harden `repo.work.update_task_status` from the T05 slice for dual-run use: idempotency key, expected_head_sha optional, push-seal compatible behavior (or explicit handoff to existing SH push-seal once), failure codes matching CMD-0001. Keep CLI; add thin HTTP only if SH adapter requires it. **Result:** UUID match, idempotency store, expected_head_sha, optional `--push`. ## State Hub facade: route update_task_status to RM when flagged ```task id: RMGR-WP-0002-T03 status: done priority: high state_hub_task_id: "4a5df34d-1781-4a35-be51-0756b0e37e6c" ``` In **state-hub** (child change under this coordination): when flag on, MCP/REST task status updates call RM command for file+git evidence, then refresh SH index as needed. When flag off, preserve current behavior. Compatibility test: same file result as native SH writeback on golden fixtures. **Result:** `api/services/repo_manager_dual_run.py` + PATCH `/tasks` hook; C-15 path also dual-runs. ## Dual-run reconcile: SH fix-consistency delegates to RM when flagged ```task id: RMGR-WP-0002-T04 status: done priority: high state_hub_task_id: "0725adbf-13ca-48a5-8011-4c7593f39e8f" ``` Port or wrap the **minimum** C-rules needed so `statehub fix-consistency --fix` (or a feature-flagged path) can execute reconcile via RM for a pilot repo set. Inbox C-rules stay on SH/hub-core. Goal: SH process stops implementing new reconcile logic; it proxies. **Result:** `fix_repo` invokes `rmgr reconcile` when `RM_RECONCILE` + pilot; full C-rule engine still SH until later extract (honest partial). ## Pilot cutover on one non-critical repo ```task id: RMGR-WP-0002-T05 status: done priority: high state_hub_task_id: "49d56e5f-f805-4884-bb4e-684f8b3000bd" ``` Enable flags for **one** agreed pilot repo (e.g. repo-manager itself or a low-risk tooling repo). Run agent task status + fix-consistency for ≥1 session. Capture evidence: before/after git SHAs, meter counts, no data loss. Document operator rollback. **Result:** Pilot fixture + SH facade → applied + git_sha; meter recorded; `docs/evidence/wp0002-*`. ## Hand evidence to STATE-WP-0079 / project gates ```task id: RMGR-WP-0002-T06 status: done priority: medium state_hub_task_id: "045338f7-03d4-4c6d-b267-3bcd0c42dbdd" ``` Write cutover evidence under `docs/evidence/` and link from STATE-WP-0079 / G-RMGR notes so the retirement program can expand the flag fleet-wide. No extra architecture rewrite—just retirement evidence. **Result:** `docs/evidence/wp0002-completion.md`; note on STATE-WP-0079. ## Acceptance - [x] Feature flags + mutation meter defined and usable - [x] Task-status dual-run path works with RM git_sha evidence - [x] fix-consistency can delegate reconcile for pilot set - [x] One pilot repo runs dual-run without regression - [x] Evidence package enables STATE-WP-0079 expansion - [x] No scope creep into non-retirement refactors ## Residuals (only if needed at finish) Anything not required for Stage B becomes a later WP or residual intake with `origin: residual` — not silent backlog in SCOPE.md.