Skip to content

Three concentric rings

PETROVA’s topology is three concentric rings. Each owns specific responsibilities; each crosses its inward boundary only through a narrow contract. The same diagram appears in /concepts/boundary-diagram/ — this page goes deeper on what each ring does.

┌───────────────────────────┐
│ Ring 2 │
│ Agent fleets │
│ (KAHN-style, etc.) │
│ │
│ Diagnose · plan · │
│ draft proposals │
└────────────┬──────────────┘
│ verbs
┌───────────────────────────┐
│ Ring 0 │
│ PETROVA-HQ control plane │
│ │
│ Methodology · verbs · │
│ registry · skills · │
│ read aggregation │
└────────────┬──────────────┘
│ PRs
┌───────────────────────────┐
│ Ring 1 │
│ Consumer repos │
│ (kahn-hq, smo1-io, …) │
│ │
│ Project intent · │
│ decisions · milestones · │
│ code │
└───────────────────────────┘

Lives at: petrova-hq itself.

Owns: methodology that’s identical across the petrova line — META-RULES, agent fleet shape, prompts, verb schemas, the registry, the CLI, the skills, the integration contracts, the shared docs/site/.

Doesn’t own: project intent, project decisions, project milestones. None of these appear in Ring 0 except as references.

Ring 0 is intentionally narrow. It contains how to do work; the what of any specific project lives elsewhere.

Lives at: each registered repo (kahn-hq, smo1-io, future additions).

Owns: the project itself. North-star intent, decision ledger, milestones, findings, code. Subagent roster (each consumer’s AGENTS.xml is its own).

Doesn’t own: the verb surface, the registry, the methodology prompts. It receives those by reference (via submodule, vendor, or documentation projection).

Each Ring 1 repo is sovereign over its content; PETROVA-HQ never reaches into Ring 1 unsolicited.

Lives at: wherever the fleet runs (a CI job, a local agent session, a long-running agent service).

Owns: diagnostic capability, planning, drafting proposed changes. The fleet’s judgment lives here — what to fix, how to sequence, when to escalate.

Doesn’t own: the action surface. A fleet that wants to act calls a verb; it does not edit Ring 1 directly.

Ring 2 is the ring most likely to be plural — you might have one fleet for diagnostics, another for implementation, another for review. Each gets its own fleet:<id> actor identity.

A fleet calling GitHub’s API directly would be a two-ring shape (fleet, repo). Ring 0 sits between them because:

  • The verb surface is narrower than the GitHub API. Nine verbs vs hundreds of endpoints. The narrowness is the audit trail.
  • The same verb surface serves humans + fleets identically. Without Ring 0, humans would shell out to gh and fleets would call Octokit, and the discipline would diverge. With Ring 0, both go through the same typed pipeline.
  • Cross-repo visibility lives somewhere. Aggregation (dashboard, status) is read-only Ring 0 functionality that doesn’t fit cleanly in either Ring 1 or Ring 2.