Skip to content
Like what we’re building? Star on GitHub

State of the art — how proven is each surface ​

Last measured: 2026-09-18.

current-state.md answers what ships. This page answers a different and harder question: how proven is it? A capability can be implemented, documented, and reachable from the CLI while never having been exercised against anything but its own unit test. Those two states look identical in a feature table, and telling them apart is what this page is for.

It is the repo-side twin of the GitHub board's epics: one epic per chantier, each carrying its own state of play and its open sub-issues. This page links out to them; they link back here. Keep both ends when you add a row — a one-way link rots in one direction without anyone noticing.

The maturity vocabulary ​

The same five marks are used on this page, in every epic body, and as the board's State of play field — the axis the 🚦 Chantier state view is built on. They grade evidence, not ambition:

markmeanswhat earns it
🟢 hummingruns unattended in productiona measured run, check or schedule you can point at
🟡 running, watch itin production, actively changingsame, plus open work on its surface
🟠 gap identifiedworks, with a named holethe hole is written down and ticketed
🔴 blockedcannot progress without a decisionthe decision is named, and whose it is
⚪ design stagenot exercised yeta design doc, not a run

An unknown is written unknown, never left blank. A blank cell reads as "fine" to every future reader, which is the one thing it never means.

Backends — only two are battle-tested ​

The rest of the detail (resolution chain, detection rules, fallback routes) lives in backends.md; this is the maturity read.

The declarative inventory is pkg/backend/backendcaps, with its seed and mutation witnesses. Its seven backend rows preserve implementation facts separately from the published proof cells and the live ledger: at seed commit 9e5a31e2de75, 57 targets, 55 never, 2 pass. A target's pass does not prove a backend's entire matrix. Changes to a verdict require an explicit golden diff.

backendmarkproven bynot proven
claude_code🟢the default implementation harness — every catalog bot has run on it in production—
claw🟢in-process twin; claw + GPT-5.6-sol proven end to end with positive and negative controls (#1203); anthropic + openai validatedbedrock / vertex / foundry ship but are untested
codex🟠used in real reviewsnever run against the full feature matrix
pi🟠rpc mode, permission gate + ask_user + board caps via an embedded extensionthe extension loads on the rpc transport only; print mode refuses gated nodes. No matrix proof
kimi🟠generic CLI-agent protocolpermission gate is deny only (C176 refuses ask); needs sandbox: none; session resume/fork not wired. No matrix proof
grok🟠same generic protocolsame deny-only gate, same unwired resume/fork. No matrix proof
opencode🟠generic CLI-agent protocol, multi-provider, provider-computed cost, reasoning-effort dialno permission gate at all — neither ask nor deny, so C176 refuses a gated node; C267 refuses interaction: async; resume/fork wired and proven against the real CLI (scripted local model) but session: persist and MCP forwarding not wired; a workspace carrying .opencode/plugin[s]/ is refused without ITERION_OPENCODE_TRUST_PROJECT=1. No matrix proof

The honest statement: claude_code and claw are battle-tested; the other five are supported. They compile, they run, they have detection rules and documentation — but none has been exercised against the whole iterion feature set. Structured output (schema: + output:) is the first thing to prove, because most of the catalogue depends on it, and it is not settled even on the proven path.

The parity doctrine is settled and pre-arbitrated for claw ↔ claude_code (philosophy.md): a capability wired for one is wired — or typed-refused — for the other. It says nothing yet about the five CLI-agent backends, and closing that silence is the work tracked in the Backends epic.

Adding a backend is a class, not a file. The seam is delegate.CLIAgentBackend + CLIAgentProtocol (ADR-065), one file per protocol value. But a backend is a role on a shared entity: it must be honoured at every site that selects, accepts or describes one — measured on kimi, that is ~30 non-test files across the seam, validation, execution, accounting, runtime, transport, CLI, studio and docs. A backend honoured on 20 of those 30 is worse than none: the ten silent sites contradict the twenty, and nothing goes red.

Epic: backends & execution parity

🤖 Bots — the fleet, and what it has actually done ​

38 bundles under bots/. The catalogue and its options live in examples.md; this is the maturity read, and it covers only the bots with production evidence. Everything not listed here is ⚪ or 🟠 by default — implemented and documented, not proven in production.

Every 🟢 below was downgraded on 2026-09-18 by an adversarial pass whose posture was to break the claim. Not one survived. The bar this page sets — a measured run, check or schedule you can point at — turned out to be met by dispatch evidence rather than outcome evidence in three cases out of five, and by silence in the other two. 🟢 humming is now an unused mark: it is the bar to earn, and #1422 is the mechanism that will earn it.

botpersonamarkevidence, 2026-09-18
review-prRevi🟡revi/review is a required check on iterion and buildkit-operator. The last 25 merged iterion PRs (#1342→#1392) are 25/25 SUCCESS. On the mesure-impact binding: 10 runs / 30 days, 0 failures, p50 552 s, p95 884 s, $13.68 total (~$1.37 a review)
feed-watchVigie🟠10 schedules armed on the Ministères-Sociaux tenant, last dispatched today at 05:00Z. But a schedule record carries no run id, status or error (#1426), and the runs API ignores team_id (#1419) — nothing here proves a run happened. On the operator's host the same bot family is the top error source over two months (#1425)
vuln-watchSenti🟠hourly (25 * * * *), last dispatched 2026-09-18T10:25Z — same caveat as Vigie: dispatch is not outcome
prod-watchArgus⚪slice A landed 2026-09-23 (the deterministic, zero-LLM watch tick + its hermetic harness, #1696); not wired to any deployment yet — the epic is #1695
docs-refreshDoki🟡weekly against this repo (Monday 04:00Z), opens its own MR; last fire 2026-09-14
sec-audit-sourceSeki🟡reaching the cloud; 5 open findings sit untriaged in Inbox (#1322 #1323 #1324 #1328 #1333)
branch-improve-loopBilly🟠proven in the gate loop, then paused on iterion since 2026-09-15 (auto_fix_on_gate_failure off — cost). /billy still answers on demand
dep-update-guardVetty🟠third member of the gate trio; one ticket on the whole board — effectively unmeasured

Two silences are findings in their own right, and are written up in their epics rather than passed over: Vigie carries not one tracked ticket after months on ten schedules — its epic is the only item under it — and the Assistant and Automation epics have zero open tickets. Either those surfaces are genuinely settled, or nobody is exercising them hard enough to file anything. Until a deliberate look says which, treat them as unmeasured, not solved.

Epics: Revi · Vigie · Seki · the merge gate · the bot catalogue

🚦 The merge gate — the one 🔴 ​

revi/review is required on two repos. It produces on iterion (25/25) and does not produce on buildkit-operator: the single open PR there, #17, comes from a fork, and Revi refuses forks by design. The check is required, absent, and unsatisfiable — so that PR can only land through an admin bypass.

The decision is the operator's: assume the bypass on fork PRs, or stop requiring the check on that repo. #874 (an opt-in read-only review lane for fork PRs) is the third path, and it is designed but not built.

Epic: the merge gate

Tests — the free layer and the paid layer ​

Two layers answer different questions, and confusing them is what makes "run the e2e at every change" sound unaffordable.

layerwhat it provescostwhen it runs
deterministicthe real seams, credential-free, stub executorfreeevery push and PR — go test ./e2e/... (900 s) + a -race pass, plus mongo-conformance, nats-conformance and cloud-e2e on a kind cluster
live (-tags live)what a real harness actually doesreal LLM spendnever automatically, by design — 59 task test:live:* targets, opt-in

e2e-coverage-matrix.md holds 387 rows:

statusrowsmeaning
covered-deterministic361free, runs every time
excluded15needs a third-party tenant / cloud control plane
unit-only8an e2e would only re-test the harness
covered-live7only reachable with a real model
uncovered3real gap

So the free layer carries 93% of the inventory. The paid layer is the remaining sliver — which is what makes a per-change discipline affordable at all: run the free layer always, and reach for a live target only when the change touches what only a live target can prove.

The matrix is not a wish list: TestE2ECoverageMatrixGate (bots/e2e_coverage_matrix_gate_test.go) turns an orphan claim — a covered-* row whose cited tests resolve nowhere — into matrix_ok=false, a red pass regardless of a green suite.

🟠 The paid layer has no memory ​

Measured 2026-09-18: the suite compiles (go vet -tags live ./e2e/... ./bots/... exits 0) and was last touched 2026-09-08. But the committed quality history (e2e/testdata/live/quality/) holds 6 snapshots, all dated 2026-08-07, across 2 targets out of 59.

Read that honestly: the snapshot is written by the judge panel, which ITERION_LIVE_QUALITY=off disables, so an absent snapshot does not prove an absent run. What it proves is that the repo keeps no durable record of when a live target last passed — so the question can only be answered by spending money. That is the gap #1422 closes.

Epic: end-to-end proof

The chantier map ​

All 26 epics, their mark, and where the detail lives. Counts are board items (closed + open) as of 2026-09-18.

epicmarkitemswhat it is
🚦 Merge gate🔴15revi × billy × vetty, and the repos they guard
💬 Assistant🟠13Copi & Nexie
🔌 Backends🟠18execution backends and their parity
🩺 CI health🟠16flakes, races, the merge queue
🧩 Connectors🟠12connectors, MCP, plugins, skills
📚 Docs🟠4the doc site, ADRs, this page
🧪 E2E proof🟠4the free layer always, the paid layer deliberately
👁️ Observability🟠1events, logs, error tracking
📦 Sandbox🟠19isolation and the permission gate
🎨 Studio🟠13editor, board, run console, desktop
📡 Vigie🟠1the watch feed in production
🔄 Automation🟡14board, dispatcher, triggers, schedules
🤖 Bot catalogue🟡1338 bundles, shapes, dsl: 2, dogfood
🏷️ Brand & product home🟡1what iterion says it is, and how it talks to users
☁️ Cloud plane🟡13tenancy, replicas, persistence
🔑 Credentials🟡31BYOK, quotas, metering, cost
✍️ DSL authoring🟡46the authoring-first DSL — the largest chantier
🔗 Forge🟡25GitHub App, GitLab, Forgejo, webhooks
🪞 Goldy🟡3the golden-master oracle
🚀 Prod ops🟡8deploy, rollout, incidents
📐 Public contracts🟡9contracts & execution by ports
🚚 Release & distribution🟡1the train that puts iterion in a user's hands
🔍 Revi🟡24PR review in production
⚙️ Runtime🟡24fan-out, checkpoints, resume, rewind
🛡️ Seki🟡9security audit on the cloud
🧠 Memory & knowledge⚪1scopes, the knowledge store, lifecycle, quotas

✅ Keeping this page honest ​

  • A mark lives in three places and they must agree — this page, the epic body, and the board's State of play field. Move one, move all three.
  • A mark needs a date and a source. "🟢 humming" with nothing to point at is a wish. If the evidence is older than the last release, say so rather than refresh the date.
  • Measure, don't infer. A required check is not a produced check — buildkit-operator is the whole lesson in one line. A closed ticket does not mean a surface is exercised; a green rerun does not settle an intermittent failure.
  • Both ends of every link. A row here names its epic; that epic names this page. Add them in the same change.
  • A discovery lands here. When a session burns real time finding out how proven something actually is, the answer belongs in this table, not in the transcript. Operating knowledge goes to a runbook instead — agents/ops/runbooks.md is the index, and board-epics.md is the runbook for this board.