Pre-launch. Not deployable to production. This page states what the tests prove and what is missing — nothing else.

Internal complexity may grow; perceived complexity must fall

How a new command gets refused

People ask this as: how do you decide whether to add another agent-facing command or tool

A decision rule, not a roadmap: it decides whether an agent-facing primitive should exist, never when it ships. New internal complexity is justified only if it reduces perceived user or agent complexity, or measurably improves reliability or evidence. Eight questions have to be answered in the PR that introduces a command, tool, contract or namespace, and a checked-in budget with an exit code holds the surface an agent must read before it can start. The budget measures surface, not capability, and it cannot tell whether what got built was any good.

Where this stops

Read this before the rest of the page. Every line below is a thing this does not do.

  • It is a decision rule, not a roadmap. It never says when anything ships, and a rail listed as future is not a commitment to build it.
  • It measures the surface an agent must read before starting — not capability, not code quality, not whether the primitive was worth building.
  • Three of the four measures sit on their ceiling today, so the next agent-facing command has to remove something rather than be added.
  • The budget is a count plus two description checks. It cannot detect a well-named command that answers the wrong question.
  • Six of the thirteen rails in the document are marked future, including project verify, the scenario runner and implementation evidence. None of them may be described as available.
  • No number here comes from a benchmark of agent build success. That run has not happened, and any such figure quoted for this project is not ours.
  • Portability is a target held by contracts, not a measured result across harnesses. The practical test — could a different agent, given only the CLI and the JSON, do this correctly — is applied in review, not by a script.

No authentication, tenancy or RBAC. The server is local-development-only. An actor header is an assertion, not an identity. Do not expose it to a network. Every claim and every limitation is on one page.

The rule, and the failure it prevents

Goal-first outside, rigorous inside. The user states a business goal; the rails are selected by the workflow rather than hand-orchestrated by the user. Every rail may be rigorous, deterministic and opinionated inside — that is what makes the result trustworthy — but none of that rigour may leak outward as a step the user has to perform, sequence or remember.

The named failure is specific: a user who has to know that app inspect comes before solution check, which comes before package scaffold, has been handed our implementation as their workflow. Every primitive is judged against that outcome rather than against its own merits.

The budget itself is deliberately asymmetric. New internal complexity is allowed to grow, and it has grown — a package contract, a conformance kit, a characterization harness. Each was justified by something that became simpler or provable on the outside. None was justified by being interesting.

The eight questions

Every new agent-facing command, tool, contract or namespace must answer all eight in the PR that introduces it. One: which concrete agent failure mode does it prevent — the failure, not the capability. Two: why are existing primitives insufficient, with the attempt shown, because if an existing command almost does it then extending it usually beats adding one. Three: does it overlap semantically with an existing tool, since two commands that answer nearly the same question are worse than one that answers it completely — the agent now has to choose, and will choose wrong. Four: can it remain deferred or on-demand, which most things can.

Five: does it preserve Claude, Codex and Gemini portability — if the behaviour lives anywhere but a CLI, a JSON contract, the Package Contract, canonical Skill semantics or the Quality Gates, the answer is no. Six: what machine-readable evidence proves its value — an exit code, a contract-versioned document, a fingerprint, a measured number; 'it feels better' is not evidence. Seven: does horizontal impact update the compatibility backfill, because a capability every domain could use, recorded for one domain only, is a fork. Eight: does the end-user goal flow become simpler rather than more manual — if the answer is 'the agent now has one more thing to run', the primitive has failed question one.

A primitive that cannot answer these is not blocked forever. It is blocked until somebody can name the failure it prevents. AGENTS.md carries the same gate as a standing review item, so the rule is cited in review rather than remembered.

The budget, with today's numbers

A principle stated in a strategy document erodes one reasonable addition at a time, so it is also a number with a ceiling, a reason and an exit code. Running node scripts/surface-check.js prints the surface an agent has to understand before it can start: goal entry points 1 / 1, skills 12 / 12, always-on tools 9 / 10, commands in skills 11 / 11, and then the line 'Internal complexity may grow. Perceived complexity has not.'

Three of the four measures are at or on their ceiling, which is what a budget looks like when it is doing something. The commands ceiling was raised from 10 to 11 on 2026-08-09, and the argument is written into scripts/surface-check.js beside the number: project doctor, package scaffold and package test shipped three genuinely new answers and took nothing out. The same comment then closes the door — eleven is where it stops, the package namespace already holds four verbs, package test already proves what package validate checks, and the next command that wants a place in a skill pays for it by folding validate into test rather than by moving the number again. A ceiling raised twice is not a ceiling.

The check is not only counting. It fails a skill whose description never says what it is not for, because the description is the routing table a harness matches against and a skill that does not exclude competes with every skill it overlaps. It fails a second skill that describes itself as answering a bare business goal, because two front doors means the user picks, and the user should not have to know there is a choice. And the ceilings are themselves exercised: tests/surface-budget.test.js builds a fixture that breaks each one, on the grounds that a budget nobody has watched fail is a budget nobody should trust.

What it deliberately does not measure

Not capability. The framework may grow a hundred capabilities; it may not grow a hundred things an agent has to read first. Those are different numbers, and conflating them is how a good architecture becomes an unusable one.

Not quality. The budget can tell you another command appeared. It cannot tell you whether the command was well designed, and no count on this page implies anything about the code behind it.

Not agent success. Question six asks for a measured number, and the one number that would settle whether coding agents can actually build with this does not exist yet — the benchmark protocol is published and has not been run (L-03). The evidence that does exist is narrower and checkable: 701 tests run on every push (C-20), one command that reads an application's real composition from checked-in source and returns a machine-readable list of what it cannot see (C-14), and MCP tools where anything that generates code or destroys state is dry-run unless an explicit apply flag is passed (C-18).

What the document is not

Not a roadmap — other documents sequence work; this one decides whether work should exist. Not permission to build the rails it lists as future: of the thirteen rails in the table, six are marked future, including skill mirror reconciliation, project verify, the scenario runner, the context pack, implementation evidence and MCP parity. Every entry is either implemented and verifiable by a command, or future and marked as such, with nothing in between.

Not marketing either. Positioning claims live elsewhere and are bounded by evidence and by an explicit list of things not to claim. The reason this page exists on a public site is narrower than a manifesto: the rule is only binding if a reviewer can cite it, and a rule with an exit code can be cited by someone who does not work here.

The evidence this page rests on

Claims and limitations are printed from site/claims.json word for word. Job statuses come from docs/benchmarks/jobs.json; a job with no page of its own is listed with its status rather than linked.

Claims

  • C-20 701 tests, run on every push, covering happy paths and the policy boundaries that matter — hostile input, transaction rollback, idempotency, concurrency and immutability among them.

    LimitA test count measures effort, not correctness — read the adversarial-review categories in docs/QUALITY_GATES.md to see what is actually attacked. Real-browser tests are run manually and are not in CI.

  • C-14 One command tells an agent what an application actually is — packages, capabilities, resources, actions, policies, providers — read from checked-in source, in a single deterministic JSON report.

    LimitSource-only and read-only. It never opens the database, contacts a provider, reads a secret, or reports runtime, CI or authorization state — and it lists those blind spots as machine-readable limitations in its own output.

  • C-18 The MCP server exposes project context and narrow write tools to a coding agent; anything that generates code or destroys state is dry-run unless you pass an explicit apply flag.

    LimitStdio only, local only. There is no hosted or authenticated MCP endpoint, and the server inherits the local process's authority.

Limitations

  • L-03 The build benchmark has not been run. The protocol is designed and published; no Successful Agent Build Rate exists yet. Any number you see quoted for this project is not ours.
  • L-08 Ownership today means copying source, not installing a dependency. There is a project bootstrap and there is no published package, and the two are different facts. The repository's bootstrap command scaffolds a project that boots, reports `valid` from `app inspect` and exits 0 from `project doctor`, offline and with no install — run from a checkout of this repository. The package published under the reserved npm name is still an empty 0.0.1 placeholder, so the `npm create` route installs nothing until a human publishes it. Either way the framework is vendored into the project rather than depended on by version: you own the result outright, and upgrading means merging, not bumping.

Jobs it covers