Skip to content

CI records every test it ran with the commit and the run it happened in, and the site publishes the tracked ledger's verdict at that commit as current only when CI's run of the published commit measured clean trees and nothing was absent, refused or failed; otherwise as stale with its distance or its failures, as unknown with its reasons, or as unavailable with the reason

Every push to master runs the behavioural suite, the crate's tests and the coverage

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: not run 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

The evidence job of validate.yml derives the report first, through `majordomus evidence show` on its own checkout, measured clean or dirty, with the downloaded reports and its output under the runner's temporary directory, so that report is the tracked ledger's verdict at the run's commit. Only then does it record the suite's and the crate's results through `majordomus evidence record --origin ci`, which stamps each execution with the run from its environment; those rows are a run record, counted in the manifest and deciding no verdict, and a trunk run's rows reach the tracked ledger only through ADR 0080's recording pull request. The suite and the rust job each measure the tree they ran in, excluding only the outputs their run names at the paths where that run writes them (rust-check writes in the crate's directory), and the manifest's working tree is derived from those measurements; a report measured at another commit is refused, and a report that yielded no execution is absent. For a pull request the recorded commit is the merge commit that ran, with the head beside it. `scripts/pages evidence` publishes the artifact of the commit being published or its nearest ancestor into site/data/evidence.json, never committed, and withholds current, with every reason, whenever the run cannot confirm the report, a report the collector failed to derive or did not carry included. ADR 68, as ADR 0087 amends it.

What it means

Every push to master runs the behavioural suite, the crate's tests and the coverage measurement. Those runs are the evidence for most of the matrix, and until this claim none of them reached anything a reader could see. CI now keeps what it ran and the result of every test as a recorded execution. Each one carries the commit it ran against and the run it happened in: the run's identifier, its attempt, the workflow, the job, and the address the provider gave. For a pull request, the commit is the merge commit that ran, and the head it was built from is carried beside it.

What the site publishes beside the claims is the tracked ledger's verdict at the commit CI ran, not a verdict CI's own executions decided. Those executions are a run record: they are counted, and they decide nothing. The site then says whether CI's run confirms that verdict for the commit the site was built from. It is current only when the run is of that very commit, every job that ran tests measured a clean tree, the report was derived on a clean checkout and reached the artifact, and nothing was absent, refused or failed. A run of an older commit is stale, with the number of commits and changed files in between, and so is a run of that commit that recorded failures. A run of that commit that cannot confirm the report is unknown, with every reason, and a report the collector failed to derive is one of them. No evidence at all is unavailable, with the reason. Nothing but a confirming run of the very commit on the page is shown as current.

How it works

The evidence job of validate.yml downloads the reports the suite, the crate and the coverage jobs left, and the measurements the suite and the rust job took of the trees they ran in, into the runner's temporary directory, and gives them to scripts/ci/evidence-collect. Each measurement excludes by name the outputs its own run names, at the paths where that run writes them, and nothing else: the suite's report at the root, and the rust job's timings and artifact directory in the crate's directory, where scripts/rust-check runs.

The collector derives the report first: it measures its own checkout and runs majordomus evidence show before anything is recorded, so the report is the tracked ledger's verdict at that commit. Only then does it record the reports through majordomus evidence record --origin ci. For a ci origin inside a GitHub Actions environment, that stamps every execution with a run read by RunRef::from_env; a local recording names no run, even inside a CI shell. A report whose job measured another commit is refused and never recorded, and a report that yielded no execution is named as absent. The collector summarises the coverage through scripts/rust-coverage --summary-json, and writes a manifest that carries the producers' measurements, the working tree derived from them, the tree the report was derived in, and what was absent or refused. The result is kept as the artifact evidence.

Before each build, pages.yml runs scripts/pages evidence. It finds the artifact recorded against the commit being published or its nearest ancestor and writes site/data/evidence.json, which is never committed. It publishes the report as it was derived and reads the manifest only to decide the state: a reason can withhold current, and never changes the report. /evidence/ renders it through the same terminal the homepage replays runs in, and lists every reason under the state. When a master run finishes while its commit is still the tip, it dispatches the Pages workflow again, and that publication says current when the run confirms the report.

The decision is ADR 68, as ADR 0087 amends it. A validating run never commits its rows, and a trunk run's rows reach the tracked ledger only through ADR 0080's recording pull request.

How to see it

bash test/run.sh 357_ci_records_evidence
scripts/pages evidence --commit HEAD --out /tmp/evidence.json && jq 'del(.panels)' /tmp/evidence.json

The case records inside a described run and outside one, and gathers runs in a fixture with a claims matrix of its own. It shows that a claim only the run proved still reads not_run in the gathered report, that the tree is the one the producing jobs measured (one runner left unmeasured leaves it unknown beside a clean one), and that a report measured at another commit is refused. It publishes gathered evidence against the published commit, confirmed and not, a report that was not derived or not carried included, against its parent and against a commit outside its history. It reads the checked-in validate.yml for the wiring, and takes the rust job's excluded paths from its rust-check step and from where scripts/rust-check runs.

What it does not cover

The evidence is attached to claims, not yet to features, commands, MCP tools or rules, and coverage is reported for the crate and its session domain, not per subject. The recorded rows still carry the recorder's own tree stamp rather than the producers' measurement, which the manifest keeps apart; stamping the measurement into each row is a later change. A trunk run's rows are not yet committed to the tracked ledger, because the recording pull request is not wired. The evidence job does not gate a merge: a broken collector makes the site say unavailable, which is visible and does not refuse anything. The shell tool's own code has no coverage measurement at all, and nothing here pretends it has one.

Why it exists

Most claims read not_run on a repository whose CI ran their tests on every push. A proof that happens and is thrown away is, to a reader, the same as no proof. And a proof published over the run's own rows, from a checkout that measured nothing that ran, under a badge saying current, is worse: it looks like the authority's verdict and is not.

Detail rendered from docs/claims/evidence-recorded-in-ci.md.

From the statement to the proof

  1. 1 · the public statement

    CI records every test it ran with the commit and the run it happened in, and the site publishes the tracked ledger's verdict at that commit as current only when CI's run of the published commit measured clean trees and nothing was absent, refused or failed; otherwise as stale with its distance or its failures, as unknown with its reasons, or as unavailable with the reason

    No feature or README responsibility names it; this page is where it is stated.

  2. 2 · the canonical claim

    evidence-recorded-in-cideclared status: guaranteed in docs/CLAIMS.yaml

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

  3. 3 · the implementation

    scripts/ci/evidence-collect

  4. 4 · the test and the scenarios

    Test: test/cases/357_ci_records_evidence.sh

  5. 5 · the recorded runs

    recorded evidence: not run 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 357_ci_records_evidence

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