I1949 — CI evidence is recorded clean, and its report is the tracked ledger's verdict
Fix PR #577 on its own branch so that the CI evidence job derives its report from the tracked ledger before it records the run's executions, every job that runs tests measures its tree where it ran, and the site publishes current only under ADR 0087's interim rule (decision 1).
DONE wave 0 · p1 · implementation profile · parallel safe
Objective
Fix PR #577 on its own branch so that the CI evidence job derives its report from the tracked ledger before it records the run's executions, every job that runs tests measures its tree where it ran, and the site publishes current only under ADR 0087's interim rule (decision 1).
Why
As PR #577 is written, the collector records first and derives the report after, so the transcript the site publishes as current is a verdict over the run's own rows from a checkout nobody measured. ADR 0087 amends ADR 0068 on exactly those sentences.
Current state
Measured 2026-10-08 on master 4090b2b8ae. PR 577 and this slice (PR 645) are on master: the evidence job derives its report before recording and each producing job measures its tree (case 357 passes). Still open: every rust lane measures its tree dirty, because an untracked timings.tsv at the repository root is not among the excluded paths (.github/workflows/validate.yml excludes only apps/majordomus-cli/timings.tsv and apps/majordomus-cli/dist), so the evidence manifest of run 37744906831 carries working_tree dirty for the crate producer and the site cannot publish current from it.
Desired state
The evidence job derives its report over the tracked ledger as committed at the run's commit before it records; the suite and rust jobs measure their trees, excluding only their named outputs, and upload the measurement; scripts/pages evidence publishes current only when the run is of the published commit, every job that ran tests measured a clean tree, the report was derived on a clean checkout and nothing was absent, refused or failed, and otherwise stale or unknown, naming each reason.
Scope
- .github/workflows/validate.yml
- scripts/ci/evidence-collect
- scripts/pages
- site/templates/evidence.html
- docs/EVIDENCE.md
- docs/CLAIMS.yaml
- docs/claims/evidence-recorded-in-ci.md
- test/cases/357_ci_records_evidence.sh
Out of scope
- The behavioural-tests environment, the summary step and the ci-metrics-suite upload of the suite job
- Moving suite.tsv out of the workspace, where the suite budget of PR #627 reads it
- Any row of docs/CLAIMS.yaml other than the claim and note of evidence-recorded-in-ci
- docs/EVIDENCE.md outside its Recorded in CI section
- The leading comment and the article line of site/templates/evidence.html
Dependencies
None. This issue is a root of the graph.
What waits on this
Acceptance criteria
- The evidence job derives its report before it records, over the tracked ledger as committed at the run's commit
- Every job that ran tests measures its tree, excluding only its named outputs, and the manifest carries each measurement
- scripts/pages evidence publishes current only under ADR 0087's interim rule, and otherwise stale or unknown naming each reason
- Case 357 asserts both halves, and this slice's own pull-request run shows crate executions and clean measured trees
Validation
- bash test/run.sh 357_ci_records_evidence
Evidence required
- report_derived_before_recording
- producer_trees_measured
Evidence
| covers | type | command | result | at commit |
|---|---|---|---|---|
| report_derived_before_recording | test | MJ_TEST_JOBS=2 bash test/run.sh 357_ci_records_evidence | tests: 1 passed, 0 failed, 0 skipped (run 2026-10-14 between 07:40Z and 07:58Z on master ce5959db59) | ce5959d |
| producer_trees_measured | test | MJ_TEST_JOBS=2 bash test/run.sh 357_ci_records_evidence | tests: 1 passed, 0 failed, 0 skipped (run 2026-10-14 between 07:40Z and 07:58Z on master ce5959db59) | ce5959d |
Risk
Stacked on PR #577, which conflicts with master and so gets no pull-request run of its own: this slice's acceptance is its own pull-request run. A run of #577 after it merges master is a gate of #577's landing, not of this slice.
Timeline
- started
- 2026-10-14T07:59:48Z
- verified
- —
- completed
- 2026-10-14T07:59:56Z
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I1949.yaml. Read it back with majordomus plan show I1949.