# Architecture Blueprint — Repo Manager toward State Hub retirement **Status:** draft-for-execution **Date:** 2026-08-09 **Owner:** repo-manager **Parent program:** `prj-state-hub-retirement` **Inputs:** `history/2026-08-09-state-hub-repo-tooling-research.md`, RMGR-WP-0001 docs (REP/CMD/EXTRACT/ADR-001), project IA + hub-extension architecture --- ## 1. Purpose Define the **target shape** of repository integration so State Hub can stop owning checkouts, and so we do **not** spend the next cycle on opportunistic refactors. Improvements are only in scope when they shorten the retirement path. --- ## 2. North star ```text Agents / automation │ │ hub-core ports (MCP gateway, REST) ▼ ┌─────────────┐ port.repo / port.work ┌────────────────┐ │ hub-core │ ─────────────────────────────► │ repo-manager │ │ projections │ │ (this service)│ └─────────────┘ └────────┬───────┘ │ observe / reconcile / governed writeback │ ▼ Git repositories (file authority) ``` **Invariants (non-negotiable):** 1. Files + Git remain authoritative for repo-owned work. 2. Repo Manager owns **registry, path resolution, parse, reconcile, writeback**. 3. Hub-core owns **messages, progress, cross-domain orientation**. 4. activity-core owns **schedules**; it must not embed repo parsers. 5. No new permanent repo-mutation logic lands in State Hub. --- ## 3. Current state (after RMGR-WP-0001) | Layer | Today | Gap to retirement | | --- | --- | --- | | Docs / contracts | Representation, commands, extraction inventory, ADR-001 | OK | | CLI vertical slice | observe / reconcile / update-task-status + git evidence | Not production path | | Projection store | Local JSON `.repo-manager/index.json` | Not fleet Postgres index | | HTTP API | None | Agents still hit State Hub | | C-rules / push-seal | State Hub only | Fleet still depends on SH | | Dual-run facade | None | Cannot cut MCP without break | | Strangler metrics | Legacy meters exist for workstream routes | Need “checkout mutator” meter | --- ## 4. Target architecture (improved infrastructure) ### 4.1 Components | Component | Responsibility | Deploy | | --- | --- | --- | | **repo-manager API** | `helixforge.repo-manager` 0.1 HTTP | k8s service + Postgres | | **rmgr CLI** | Operator/agent local: reconcile, register path, commands | installed via uv/pip | | **consistency package** | Ported C-rules (minus inbox) + push-seal | library inside RM | | **SH compatibility adapter** | Temporary: SH MCP/REST → RM commands | process in SH or sidecar | | **activity-core caller** | Sweep invokes RM reconcile HTTP | schedule only | ### 4.2 Data planes | Data | Authority | Store | | --- | --- | --- | | Workplans/tasks/decisions | Git files | index in **RM Postgres** | | Classification | `.repo-classification.yaml` | cache on managed_repos | | host_paths | operator | **RM Postgres** (migrate from SH) | | Command idempotency | RM | RM Postgres | | Progress/messages | hub-core | hub-core DB | | Orientation summaries | derived | hub-core projection (reads RM + messages) | ### 4.3 Strangler stages (retirement, not polish) ```text Stage A SH still mutates checkouts; RM slice is shadow (observe-only in prod) Stage B SH MCP update_task_status + fix-consistency call RM for writeback when feature flag on (dual-run); SH index still updated Stage C RM registry is SoR for host_paths; SH reads RM or shared read model Stage D Agents point MCP at hub-core/RM; SH receives zero checkout mutations Stage E SH repo routes 410/retired; SH process only until full hub retirement ``` **Exit criterion for “repo extraction done” (G-RMGR subset):** During a stabilization window, **no State Hub process performs git write or workplan file patch** on fleet checkouts (metered). ### 4.4 What we deliberately improve (only if it enables A→E) | Improvement | Why retirement needs it | | --- | --- | | Single parser module in RM | Dual SH parsers would diverge during dual-run | | Feature-flagged SH adapter | Zero-downtime cut of agent write path | | Meter: `checkout_mutation_source=sh|rm` | Prove Stage D | | Neutral UUID field names (accept `state_hub_*` still) | Avoid rewrite of entire fleet frontmatter mid-cut | ### 4.5 What we defer (not next) - Full FastMCP surface parity with SH - SBOM/TPSC/DoI productization inside RM - Dashboard rewrite - Topic spine cleanup beyond “don’t depend on it” - Perfect policy-port integration (dev allowlist OK until hub-core ready) - Premature monorepo packaging --- ## 5. Agent write-path target (detail) **Today (simplified):** ```text MCP update_task_status → SH PATCH /tasks → DB → later fix-consistency writeback → git commit → push-seal ``` **Target Stage B:** ```text MCP update_task_status → SH facade (flag) → RM command repo.work.update_task_status → file patch + git_sha evidence → SH/RM index refresh → optional hub-core progress event (correlation_id) ``` **Target Stage D:** ```text MCP (hub-core or RM) → RM command only → hub-core progress → no SH checkout I/O ``` --- ## 6. Fleet reconcile target **Today:** `POST /consistency/sweep/remote-all` → SH runs consistency_check on each host path. **Target:** activity-core schedule → `POST {repo-manager}/v1/reconcile/fleet` or per-repo `repo.reconcile` with same C-rule semantics (inbox rules excluded; messaging stays hub-core). SH may keep a **deprecated proxy** until Stage D. --- ## 7. Risks if we “improve” instead of strangling | Distraction | Retirement cost | | --- | --- | | Rebuild full SH MCP in RM first | Months before any traffic moves | | Perfect domain model without dual-run | SH remains mutator forever | | Shared SH database “temporarily” | Cutover never clean; authority muddied | | Big-bang registry migration | Path resolution breaks multi-host workers | --- ## 8. Success metrics | Metric | Stage B | Stage D | | --- | --- | --- | | % task status writes with RM git_sha evidence | > 0 experimental host | 100% agent path | | SH checkout file patches / day | declining | 0 | | Fleet remote-all failures | ≤ baseline | ≤ baseline | | Agent session breakage | none material | none material | --- ## 9. Immediate execution focus The **next workplan** implements **Stage B for one command path** and **shadow reconcile**, not infrastructure cosmetics: → **RMGR-WP-0002** — Retirement dual-run: SH adapter for task status writeback + reconcile proxy. That is the shortest path to State Hub **no longer being required to touch Git** for the highest-frequency agent mutation, which unlocks STATE-WP-0079 slices and G-RMGR evidence.