The Ouro AX standard is a list of claims about the interfaces agents use. A claim is one rule that a program can check from outside, such as "an unknown flag fails before anything runs". ax-claims holds them as data in lib/ouro/ax/claims.ts, and ax-xray checks an interface against them (the X-ray). The claims page lists them, with their tiers and what admitted them.
node lib/ouro/ax/xray.ts claims # every claim, its tier, rule and check
node lib/ouro/ax/xray.ts claims --json # the claim set as data, with its hashWhat a claim says
id- What it holds: A stable name, such as
cli.unknown-flag. surface- What it holds:
cli,http,mcporui(a component's twins). tier- What it holds:
mustorshould. applies- What it holds: Which surfaces it applies to, decided from what the interface says about itself: a command, a read, an action other people see, a route, a tool.
rule- What it holds: The rule, in one sentence.
why- What it holds: Why it matters to an agent.
evidence- What it holds: What admitted it: an evaluation run, a stated hazard, or a principle.
check- What it holds: What the X-ray does to check it.
fix- What it holds: What to change when it fails.
The tiers
A broken must claim fails the X-ray, which exits 1; a broken should claim is reported and fails nothing.exit With --conformance, a must claim that the X-ray could not check also fails it, so a skipped check never passes as a held one.conformance
How a claim enters must
A claim is must in one of two ways, and in no other:admission
- **An evaluation shows agents failing without it.** Real agents in fresh sessions do a task against the interface, and a scorer that calls no model judges the end state (the evaluation).eval The run reproduces the failure the claim forbids, and a run with the fix removes it. The claim's
evidencenames the run's file. Text taken only on stdin entered this way: on the main branch of the first adopter, the app Ouro AX was first measured on, agents limited toshell(app)could not pipe text into a send or an edit and failed both tasks, and with--textthey passed both.text - **It guards against a stated hazard.** It protects safety, compatibility or integrity, its
evidencestates the hazard, and the X-ray checks it. Refusing an unknown flag entered this way: no agent in the evaluations misspelt a flag, but an ignored flag on an action can act for real.flag
Every other claim is should until evidence arrives: it comes from a principle or from another product's experience.admission checkClaimSet refuses a must claim that rests on a principle, and an evaluation that names no run.admission
The order of work for a new claim:
- Reproduce the failure in an evaluation, and commit the run's results as evidence.
- Add the claim as
should, with its check inax-xrayand a test of the check. - Fix it in an adopter and run the evaluation again.
- When the fix removes the failure, make it
mustand cite both runs.
A claim is reviewed for demotion when repeated evaluations show that it does not change an outcome, unless it guards against a hazard. The probes found claims of that kind: the first claims, written from the first adopter's principles, matched none of the wrong turns agents made on its main branch, and fixing every one of them changed no task's outcome.principles
The claim set's version
The claim set has a version (CLAIM_SET_VERSION) and a hash: the SHA-256 of its canonical JSON.hash A report names both, so a conformance result says exactly which standard it checked.hash An adopter that copies the claims in can read its own copy with loadClaimSet, which checks it the same way.
Claim sources
- exit: test:registry/ouro/ax/xray.test.mts::the command: claims, help, usage errors with the fix, exit codes, written reports
verify:testExists(registry/ouro/ax/xray.test.mts::the command: claims, help, usage errors with the fix, exit codes, written reports) - conformance: test:registry/ouro/ax/xray.test.mts::without proof of a mock, nothing other people see is called, and it does not conform
verify:testExists(registry/ouro/ax/xray.test.mts::without proof of a mock, nothing other people see is called, and it does not conform) - admission: test:registry/ouro/ax/claims.test.mts::checkClaimSet names each problem with its fix; test:registry/ouro/ax/claims.test.mts::the claim set follows its own admission rule: every must claim cites a run or states a hazard
verify:testExists(registry/ouro/ax/claims.test.mts::checkClaimSet names each problem with its fix)verify:testExists(registry/ouro/ax/claims.test.mts::the claim set follows its own admission rule: every must claim cites a run or states a hazard) - text: evidence:docs/decisions/2026-10-30-ouro-ax/evidence/eval-baseline.md; evidence:docs/decisions/2026-10-30-ouro-ax/evidence/eval-after-440.md
verify:fileLine(docs/decisions/2026-10-30-ouro-ax/evidence/eval-baseline.md, /\| T3 Directed send others see \| 0\/2 \|/)verify:fileLine(docs/decisions/2026-10-30-ouro-ax/evidence/eval-after-440.md, /\| T3 Directed send others see \| 2\/2 \|/) - eval: evidence:docs/decisions/2026-10-30-ouro-ax/evidence/eval-method.md
verify:fileLine(docs/decisions/2026-10-30-ouro-ax/evidence/eval-method.md, /a fresh mock app per run, and scoring from the end state/) - flag: evidence:docs/decisions/2026-10-30-ouro-ax/evidence/xray-probe.md
verify:fileLine(docs/decisions/2026-10-30-ouro-ax/evidence/xray-probe.md, /In 30 agent runs no agent passed a misspelt flag or used `--dry-run`/) - principles: evidence:docs/decisions/2026-10-30-ouro-ax/evidence/xray-probe.md
verify:fileLine(docs/decisions/2026-10-30-ouro-ax/evidence/xray-probe.md, /named none of the 12 wrong turns in the baseline/) - hash: test:registry/ouro/ax/xray.test.mts::the claim set: its hash is stable and every claim the X-ray records exists
verify:testExists(registry/ouro/ax/xray.test.mts::the claim set: its hash is stable and every claim the X-ray records exists)
