Skip to content

A claim that declares a guarantee no recorded run supports is named by a gate rather than displayed as guaranteed

majordomus evidence show --check exits 10 when any claim declaring status: guaranteed

declared statusdeclared status: guaranteed Declared deterministic and blocking, implemented, and naming the behavioural test that is to prove it. Whether a recorded run supports it is the evidence verdict, shown beside it.

recorded evidencerecorded evidence: stale Declared guaranteed, and not supported by a recorded run: the test is named, and no passing run of the current inputs is recorded. how evidence is recorded

`majordomus evidence show --check` exits 10 on any guaranteed claim the evidence does not support, and `scripts/evidence-check` ratchets that against .ai/repo/evidence-baseline.txt, which records the state per claim rather than a list of names. Two things fail: a guarantee the baseline recorded as supported that no longer is, and a supported guarantee that left the matrix. A claim the baseline never knew, with no recorded run, is new debt — named and counted, never a regression — because a ratchet that fired on growth taxed writing claims down. The gate is advisory while the baseline carries unsupported lines and `--strict` is the end state; only `guaranteed` is judged, because advisory, planned and rejected already say that a current proof is not what they claim.

What it means

majordomus evidence show --check exits 10 when any claim declaring status: guaranteed is in a state the recorded evidence does not support, and names each one with the reason and the command that would settle it. scripts/evidence-check renders that same answer and ratchets it against .ai/repo/evidence-baseline.txt, so a guarantee that loses its evidence is a failure while the debt that already existed is known rather than blocking.

Only guaranteed claims are judged. advisory states that enforcement is not observable from outside, planned that nothing implements the behaviour yet and rejected that nothing will; demanding a current proof of those would be demanding proof of a thing the claim already says is not there.

How it works

Of the seven proof states, the three that carry a passing run behind them — proven, inputs_unchanged and stale — are accepted as support, and are never printed as the same thing. The other four are findings: failing, because the claim guarantees a behaviour whose test most recently failed; not_run, because it names a test no run of which has ever been recorded; unrunnable, because it names a path no runner drives, so no execution of it can ever exist; and no_test, because it names no test at all. Each finding carries the claim, the status it declares, the state the evidence supports, the reason in words, and the reproduce command when running something would settle it.

scripts/evidence-check derives nothing of its own. It asks the executable for evidence show --format json and reads the findings out of that answer, because a gate with a second opinion about what is proven would be a second model of proof. It prints the tallies for the whole matrix, not only the failures, so a reader sees the shape of the evidence and when it was last recorded. Without a build it exits 12 and says so rather than passing quietly.

The ratchet is not membership of a list of names. It was, and that was the defect rather than the strictness: the baseline names the guarantees that were unsupported on the day it was written, so a claim written after that day is absent from it for the only reason a claim can be absent from a snapshot of the past — it did not exist yet. Under membership every newly merged guarantee was reported as having lost evidence it had never had, and reddened the trunk for every branch that merged afterwards. A ratchet whose alarm fires on growth rather than on regression measures the wrong thing.

So the baseline records the state per claim — a + line for a guarantee a run supported, a bare line for one no run supported — and two things fail the gate. Lost: a claim the baseline recorded as supported, and the evidence no longer supports; it had a proof and does not now, and membership could never see this, because a claim losing its proof joins the unsupported set exactly as a new claim does. Withdrawn: a supported guarantee that is no longer a guaranteed claim of the matrix at all; nothing became unproven, the denominator simply shrank, which is how a ratchet rots without ever going red.

A guaranteed claim the baseline never knew, arriving with no recorded run, is reported and counted as new debt and does not fail — refusing it is the broken behaviour above. It is admitted by scripts/evidence-check --baseline, in its own commit, with the reason. A baseline line that is now supported is reported so the list tightens instead of rotting. The file is written by --baseline and never by hand, and its unsupported half shrinks in one direction only — by recording a run that proves a claim, never by adding a line.

The gate is declared in .ai/repo/ci/gates.yaml under the structure job with always: true, and the evidence change class routes the ledger, the baseline, the gate, the matrix, the claim pages and docs/EVIDENCE.md to it.

How to see it

majordomus evidence show --check                  # exit 10 with the unsupported guarantees
majordomus evidence show --findings --format json # the findings alone, with reasons
scripts/evidence-check                            # the ratcheted verdict, with the tallies
scripts/evidence-check --strict                   # every unsupported guarantee fails
scripts/evidence-check --baseline                 # rewrite the baseline from what is found now
scripts/evidence-check --repo PATH                # judge that repository instead of this one

Filtering never narrows the tallies: an answer showing one claim still reports how much of the matrix was examined, so a filtered read cannot misreport coverage.

What it does not cover

It is advisory today, and saying otherwise would be the kind of claim this subsystem exists to refuse. The ledger starts empty, so on the day the gate arrived every guaranteed claim was not_run — true, and as a blocking gate it would have meant nothing could be merged by anybody until a full suite run had been recorded. Every one of those claims is in the baseline, so what the gate refuses right now is a guarantee that lost its proof or left the matrix, not an unproven guarantee. New unproven guarantees are named and counted and do not fail. --strict ignores the baseline and fails on all of them; it is the end state, reachable when the baseline's unsupported half is empty, and CI switches to it then.

The gate does not run anything. It reads what was recorded, so a claim proven by a run nobody recorded is indistinguishable from one nobody ran, and the remedy for a finding is to run the named command and record it — or to fix what broke.

It judges the declared status against the evidence, not the claim against reality. That the test named actually exercises the sentence claimed is a question for review, held by project.no-claim-without-test; a stale guarantee passes the gate, because a proof older than its subject is still a proof that was made.

And it is not a tamper check. The ledger is a tracked file, a hand-edited outcome is a line in a diff, and the gate believes what the ledger says.

Why it exists

A guarantee is the strongest thing this repository says about itself, and it was the one thing nothing checked: the matrix could declare a behaviour guaranteed, name a test, and be published as a guarantee with no run behind it anywhere. Making that visible had to come before making it fatal, because a gate that blocks on the day it arrives is a gate that gets disabled. So the debt was measured, written down once, and made to shrink in one direction — which is how a check that nobody can honour becomes a check nobody can regress.

Detail rendered from docs/claims/evidence-unsupported-guarantee-is-reported.md.

From the statement to the proof

  1. 1 · the public statement

    A claim that declares a guarantee no recorded run supports is named by a gate rather than displayed as guaranteed

    Made on Evidence.

  2. 2 · the canonical claim

    evidence-unsupported-guarantee-is-reporteddeclared status: guaranteed in docs/CLAIMS.yaml

    Defined in read it on this site · docs/EVIDENCE.md

  3. 3 · the implementation

    scripts/evidence-check

  4. 4 · the test and the scenarios

    Test: test/cases/124_evidence.sh

  5. 5 · the recorded runs

    recorded evidence: stale how evidence is recorded

Verify it yourself

The test runs in a disposable temporary repository and asserts the behaviour, not a string in the source.

from a clone of the repository
bash test/run.sh 124_evidence

Searches the titles and descriptions of every page this site publishes.