repo-manager/workplans/RMGR-WP-0002-retirement-dual-run-strangler.md
codex c3f4ece7ea fix(workplans): adopt ADR-007 derived identifiers for unregistered records
These workplans exist only in the retired local hub. Their random pre-ADR-007
identifiers are refused by C-06 as stale references, so they cannot be
registered. Deriving from the canonical record id takes no identity from
anything: central does not hold them and the old ids die with the cache.

Records central already holds were deliberately left untouched.

Refs CUST-WP-0068-T06

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 2583210@bnt-lap001
Assistant-Session: f2bff2d5-e9b2-4338-92ca-10282a927006
2026-08-25 20:21:52 +02:00

5 KiB
Raw Blame History

id type title domain repo status owner topic_slug created updated parent_project parent_workplan stream related state_hub_workstream_id
RMGR-WP-0002 workplan Retirement dual-run: SH adapter for writeback and reconcile infotech repo-manager finished codex repo-manager 2026-08-09 2026-08-09 prj-state-hub-retirement SHR-WP-0001 S1
RMGR-WP-0001
STATE-WP-0079
ACTIVITY-WP-0029
specs/ArchitectureBlueprint.md
history/2026-08-09-state-hub-repo-tooling-research.md
195ae0e8-79b0-5593-a491-b5a159ab64b7

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

id: RMGR-WP-0002-T01
status: done
priority: high
state_hub_task_id: "a7d18cdc-d316-506e-830c-22da0e79bd58"

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

id: RMGR-WP-0002-T02
status: done
priority: high
state_hub_task_id: "ab7120f9-874f-5120-970f-e834143192dc"

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

id: RMGR-WP-0002-T03
status: done
priority: high
state_hub_task_id: "b14c0996-fa29-568c-8fa4-6278bd2e2c3f"

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

id: RMGR-WP-0002-T04
status: done
priority: high
state_hub_task_id: "1cb43273-94a3-50d7-9b9b-6243dc259704"

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

id: RMGR-WP-0002-T05
status: done
priority: high
state_hub_task_id: "bb32ae50-b056-5c37-a060-d92a1495f85d"

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

id: RMGR-WP-0002-T06
status: done
priority: medium
state_hub_task_id: "be12491c-67e0-572a-8b9b-68e41a670427"

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

  • Feature flags + mutation meter defined and usable
  • Task-status dual-run path works with RM git_sha evidence
  • fix-consistency can delegate reconcile for pilot set
  • One pilot repo runs dual-run without regression
  • Evidence package enables STATE-WP-0079 expansion
  • 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.