Stage 0 — Foundations
Control point: the Substitution Test is scored weekly, and the context plane is validated as configuration rather than asserted in a document.
Every SKILL.md must carry name, description, version and policy_owner in its
frontmatter, and every policy YAML must parse. A skill with no named policy owner is a
rule nobody has agreed to.
00-foundations.yml · make substitution
Stage 1 — Plan
Control point: the product owner accepts, and acceptance is the merge.
Intent is captured once, by whoever had it, in their own words — problem, who is affected, success criteria, out of scope, constraints. No solution. Contributors without version-control experience commit through an MCP connector and never touch git; the gate is identical for them.
Nothing in the workflow approves anything. It only checks the shape.
Stage 2 — Design
Control point: named policy owners resolve flagged conflicts, before engineering sees the spec.
On intent merge, the agent is assigned the design pass and opens the spec as a pull
request. The spec’s ## Policy conflicts section names standards that cannot both hold,
their owners, and the options with their trade-offs — and does not resolve them.
Finding the conflict during the design pass instead of in a review three weeks later is most of the value of the stage. The chain stops at
autonomy_tier: A0and waits for a human with the authority to decide.
Stage 3 — Build
Control point: plan-to-diff conformance, frozen paths, and the autonomy matrix.
A file in the diff that no plan’s ## Files section claims is a departure. The fix is to
update the plan in the same commit, not to argue it in a review comment. A change cannot
self-declare its way past a gate either: policy/risk-classes.yaml floors the risk class
from the paths actually touched.
Stage 4 — Test
Control point: the eval pass rate gates configuration changes.
A change to AGENTS.md, a skill, a gate or a model route is a change to the agent’s
behaviour, and gets regression-tested exactly like the code it produces. Twenty-four
cases, non-interactive, threshold 90%.
CI runs the same three commands AGENTS.md tells the agent to run. If CI and the
agent’s loop diverge, the agent is optimising for the wrong signal.
Stage 5 — Deploy
Control point: severity tally rather than narrative; environment approval; author ≠ approver.
Agent review runs on every pull request, identical for all of them, in three passes
defined in REVIEW.md — version-controlled, reviewable, the same next quarter. Where the
pipeline gates, it gates on the machine-readable count of critical and material
findings, never on the narrative or a model’s overall verdict.
Release is attested: signed in-toto provenance from your own CI, plus the gate results travelling with the artifact so “which controls ran on the thing that is in production” is answerable from the artifact alone.
Stage 6 — Operate
Control point: tier boundaries from version-controlled config, and no production write access for the agent.
Western Electric rules over a 30-day rolling baseline, unit-tested including the drift case that no simple threshold catches. No model in detection — a model that decides whether something is anomalous is a control you cannot evidence.
| Signal | Tier | What the agent may do |
|---|---|---|
| 2σ | A0 |
Look, and only look. Read-only tools from the MCP allowlist. |
| 3σ | A2 |
Write its diagnosis as an intent.md and open it for triage. |
From there the finding re-enters at Stage 1 like any other change, through every gate, with a human triaging the queue. That is the loop closing.
The five planes
| Plane | Here | The point |
|---|---|---|
| Model access | .agent/routes.yaml |
Routes, never model names. No provider key outside the gateway. |
| Agent runtime | .github/workflows/, .github/actions/assign-copilot/ |
Copilot, invoked in one step per stage. The most replaceable component. |
| Context | AGENTS.md, .agent/skills/, .agent/mcp-allowlist.yaml |
.github/copilot-instructions.md is a five-line pointer, never a source of truth. |
| Control | policy/, scripts/check_*.py, CODEOWNERS, environments |
The advisory layer makes violations rare; the deterministic layer makes them impossible. |
| Evidence | evidence/, ops/otel-collector.yaml, attestations |
Emitted as controls execute. Never reconstructed. |