The control-plane decision
On 2026-04-29, after a brainstorming round weighing how to address duplication, cross-repo visibility, and agent-fleet write capability, the operator opened a decision doc proposing PETROVA evolve into a control plane with a thin centre. Eight tasksets executed against that decision; the operator countersigned it later the same day.
This page is the readable companion. The formal record lives at
/decisions/2026-04-29-petrova-control-plane/
— it has the alternatives table, the consequences breakdown, and
the sign-off block.
Why the decision was opened
Section titled “Why the decision was opened”Three pains had surfaced concurrently across the petrova line:
- Duplication. The same methodology files appearing in every consumer repo and drifting.
- No cross-repo visibility. No way to see fleet-wide status.
- No agent-fleet write path. KAHN-style fleets could diagnose but had no disciplined way to act.
The trigger for committing to a decision rather than evolving incrementally was that KAHN’s fleets were about to gain write capability. Without an agreed verb layer, they would either bypass MR-7 or stall.
Three options were weighed
Section titled “Three options were weighed”| Option | Verdict | Why |
|---|---|---|
| Status quo (template line only) | Rejected | Doesn’t solve duplication; no fleet write path. |
| Central database (Postgres source-of-truth) | Rejected | Violates MR-7 (decisions decouple from code) and MR-12 (CLAUDE.md projection breaks). See no central database. |
| Control plane with thin centre | Accepted | Centralises methodology + verbs; leaves project truth in each repo. |
What was decided
Section titled “What was decided”PETROVA-HQ centralises:
- Methodology (META-RULES, agent fleet shape, prompts).
- Action verb specifications (the 9 verbs in
spec/verbs/). - The registry of governed repos.
- Read-only cross-repo aggregation.
Project truth (north-star intent, decisions, milestones) stays in each consumer repo. Every write is PR-emitting, never direct push. Every verb is dry-run by default. Auth is via fine-grained PAT or GitHub App.
What followed
Section titled “What followed”Eight tasksets executed:
| # | Surface added |
|---|---|
| 1 | Decision doc + registry skeleton |
| 2 | shared/ namespace + CLAUDE.md.tmpl rewrite |
| 3 | 9-verb spec + worked examples + PR-body template |
| 4 | Read-only CLI |
| 5 | Write verbs + PR emission + idempotency + auth |
| 6 | petrova-act + petrova-status Claude Code skills |
| 7 | KAHN fleet integration contract; kahn-hq registered |
| 8 | Dashboard + onboarding prompt + operator runbook |
The decision was countersigned and closed on 2026-04-29 after all eight tasksets shipped. See tasksets 1–8 for the commit-by-commit history.
What this means going forward
Section titled “What this means going forward”The decision is load-bearing precedent. Any future evolution of
the verb surface, the registry shape, or the methodology scope
requires a new dated decision doc with explicit Supersedes:
pointer back to this one.
That includes deferred work in the roadmap: the webhook receiver, the SQLite cache, the web UI dashboard. None of those have been opened yet — the criteria for opening each are listed in future tasksets.