Skip to content

tooling: purchaser-facing evidence report (#4601) - #4603

Merged
squid-protocol merged 4 commits into
mainfrom
tooling/4601-evidence-report
Oct 7, 2026
Merged

squid-protocol merged 4 commits into
mainfrom
tooling/4601-evidence-report

Conversation

@squid-protocol

@squid-protocol squid-protocol commented Oct 7, 2026 •

Copy link
Copy Markdown
Owner

Part of #4270. Closes #4601.

Rebased onto main: #4606, #4624 and #4625 are in. A final re-render follows the next coverage-ledger refresh. The ledger on main is partly stale after #4624's coverage-tool change (the workflow fix #4631 is pending), so the committed reports here are a --refresh of the measured block from 3bcbb8c.

What it adds

tests/tools/evidence_report.py ESTATE|--all [--out DIR] writes report.md + report.json per estate (schema gitgalaxy-evidence-report/1, checked by validate()). Each estate gets one row per program, with a level and the numbers under it. Everything comes from existing tools, imported rather than re-parsed:

section source
translation: statements, translated, holes by name, whole, refused whole, named source defects cics_census survey rows
executed equivalence: the det-port verdict and its source (main's CI det-sweep ratchet; a local --sweep for Db2); the #4048 evidence record as a reported column (current / stale / none) proof_blockers, evidence.status
coverage: paragraphs, and branch outcomes raw and net of the case's reviewed infeasible outcomes --sweep line, else det_coverage_ledger.fresh_coverage (#4606); infeasible_outcomes.stated / adjust (#4602)
assumptions relied on: X-register entries named by the commands' spec entries; runtime facts stated / unstated; each stated infeasible outcome as a reviewed claim (family G/C/R, reason) cics_spec_status, oracle_assumptions.md, proof_blockers.facts_needed, infeasible_outcomes.json
oracle backing (a column, not a level): per CICS command, spec entry full / name-only, hand-traced crucible cases with stub and Java runtime agreement; DIFFERS assumptions reached: not measured cics_spec_status, tests/cics_crucible/baseline.json
det-port mutation: "not yet measured (#4628)" hook for #4628
residual risk, incl. the #4514 dimensions as "not measured"; reproducibility (translator commit, corpus and crucible pins from crucible_pins.toml, oracle image, re-run commands) the above / the repo

The ladder (owner decisions on #4601)

level condition
L0 inventoried
L1 translated whole
L2 the case's det port is equal on every scenario (CI ratchet; Db2 only via --sweep). The evidence record is reported, not required.
L3 L2 + 100% of live paragraphs
L4 L3 + 100% of branch outcomes net of the case's reviewed infeasible outcomes. Raw and net are both printed, and a stated outcome the proof reached (a refuted claim) blocks L4.
L5 L4 + every surviving det-port mutant accounted for (#4628). Not built yet, so it reads "not yet measured (#4628)" and no program is placed at L5.

Mutation scores: docs/language_status/mutation_scores.json covers the model / hand ports only, so it is left out of the report entirely. It says nothing about the det port, and showing it beside det-port levels would mislead.

CI runs --check against the status stored at build time (the record status and ledger freshness are frozen in measured). --refresh --live / --check --live recompute them, and the nightly evidence-refresh workflow runs --refresh --live. Reports are committed for burned estates only; non-burned output is written only outside the repo. The tool is read-only over records and approvals.

Level histograms (committed, --refresh of the 3bcbb8c measurement)

estate programs L0 L1 L2 L3 L4 L5
CardDemo 44 14 5 25 0 0 0
CBSA 31 14 15 2 0 0 0
GenApp 31 6 20 5 0 0 0
DBB MortgageApplication 6 3 1 2 0 0 0
zECS 5 5 0 0 0 0 0
burned total 117 42 41 34 0 0 0

The stored ledger freshness has 0 of 59 cases fresh, so no program reaches L3. With freshness recomputed now (--live: 16 of 59 ledger entries fresh), the burned totals would be L0 42 / L1 41 / L2 20 / L3 3 / L4 11 / L5 0, with all of the L3 and L4 programs in CardDemo (CardDemo L2 11 / L3 3 / L4 11). The final re-render after the next ledger refresh will commit the live figures.

Tests and gates

  • tests/tools/test_evidence_report.py: 41 passed. New tests cover net-of-infeasible L4, a refuted claim blocking L4, the L5 mutation hook, oracle backing not being a rung, and infeasible outcomes being stated and netted, never hidden. The forbidden-word test and the numbers-from-JSON test both pass on the new pages, including the reasons quoted from the infeasible ledger.
  • pr_gates.py --fast: 5/5 pass. pr_gates.py --ratchets: 6/6 pass.

Follow-ups (reported as "not measured" / "not yet measured")

  1. Final re-render after the next ledger refresh (ci: evidence-refresh actually rewrites the coverage ledger (#4270) #4631).
  2. Evidence L5: mutation testing on det ports, survivors accounted for (#4601) #4628 det-port mutation fills L5.
  3. DIFFERS assumptions reached per program.
  4. Unrun paragraphs and branch outcomes by name (the ledger keeps counts only).
  5. Db2 det verdicts in CI.
  6. Read Equivalence harness: self-report coverage, run status and actionable blockers as a generated .md page #4493's JSON once it exists.
  7. The Epic: whole-migration harness: data, job streams, interfaces, performance, security, cutover #4514 dimensions.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

🐦‍⬛ Muninn Security Scan

✅ No security issues found.

🐦‍⬛ Powered by Muninn · Skald Lab

squid-protocol and others added 4 commits October 7, 2026 13:38
tests/tools/evidence_report.py writes, per estate, report.md + report.json
(gitgalaxy-evidence-report/1): a row per program with a level L0-L5 and the
numbers under it -- translation, executed equivalence, coverage, oracle
backing, assumptions named, residual risk, reproducibility. Filled only from
cics_census / proof_blockers / evidence / cics_spec_status / the crucible
baseline / oracle_assumptions.md. Corpus- and sweep-dependent inputs are
frozen in a `measured` block, so --refresh and --check need no corpora.

Committed for the five burned estates under
docs/language_status/evidence_report/. Tests: staleness (--check),
forbidden words, every Markdown number comes from the JSON, levels.
The nightly evidence-refresh job rebuilds the reports (--refresh --live).

Part of #4270.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
L2 is the det-sweep verdict alone (main's CI ratchet; a local --sweep for
Db2); the #4048 evidence record becomes a reported column. Coverage comes
from the --sweep line or the det-sweep coverage ledger (#4606, fresh
entries, frozen at build like the record status). Bars default to 100%
paragraphs / 100% branches, with "net of reviewed infeasible outcomes"
reported as not yet available (#4602). Pins come from the #4597 manifest.
Reports re-rendered at translator commit ec87c13.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mutation rung

L4 is 100% of branch outcomes net of the case's reviewed infeasible
outcomes (infeasible_outcomes.stated, #4602), listed per program as stated
claims with family and reason; raw and net numbers both printed, and a
refuted claim blocks L4. L5 is every surviving det-port mutant accounted
for (#4628), reported as not yet measured. Oracle backing leaves the
ladder and becomes a per-program column (DIFFERS reached: not measured).
Model-port mutation scores are left out on purpose. Reports re-rendered
with --refresh.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@squid-protocol
squid-protocol force-pushed the tooling/4601-evidence-report branch from 9da4e34 to 6ffcdd3 Compare October 7, 2026 17:47
@squid-protocol
squid-protocol marked this pull request as ready for review October 7, 2026 18:21
@squid-protocol
squid-protocol merged commit 931f304 into main Oct 7, 2026
18 checks passed
@squid-protocol
squid-protocol deleted the tooling/4601-evidence-report branch October 7, 2026 18:21
squid-protocol added a commit that referenced this pull request Oct 7, 2026
… test_the_committed_reports_are_current) (#4638)

#4634 changed the GenApp Db2 cases (LGSTSQ in programs, X6 judging) after #4603's reports were
rendered, so the committed GenApp report went stale and test_evidence_report's staleness test fails
on main. Regenerated with evidence_report.py --refresh; nothing hand-edited.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
squid-protocol added a commit that referenced this pull request Oct 7, 2026
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
squid-protocol added a commit that referenced this pull request Oct 8, 2026
…ce L5, #4628)

tests/tools/det_mutation.py runs mutation.py on the det port of a case (its
service/*.java, the entry points the case's kind never calls out of scope),
records it in tests/equivalence/det_mutation.json keyed by fingerprints, and
checks the reviewed survivor list tests/equivalence/det_mutation_survivors.json
(a run that kills a stated equivalent / unreachable mutant fails). status() is
the evidence report's L5 hook (#4603). mutation.py: --port / --files, javac
stillborn check --jobs at a time.

Strengthened carddemo-signon (PF4, both XCTLs failing) and cbsa-updcust (four
scenarios) for killable survivors; evidence record and coverage ledger
regenerated. Part of #4270.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Evidence report: purchaser-facing levels and numbers per program and estate (no binary "proven")

1 participant