Repository navigation
t27b: key reference verdicts by the generated code, not the t27c binary #8176
Description
Boundary
specs/tri/t27b/verdict_key.t27 (new), its gen-rust output gen/rust/tri/t27b/verdict_key.rs, its seal, and the call sites in cli/t27b/src/blockers.rs (toolchain_stamp, RefRunner::key, RefRunner::run). No workflow change. The lab's own Python cache (contrib/railway/t27b-lab/lab.py) is not touched here.
User Scenarios
The t27b reference cache keys every row on the bytes of the t27c binary. A pull request that touches bootstrap/ therefore misses every row and re-runs t27c test-report for every spec: run 37911771594 spent 1406 s in the ratchet's corpus step (cache 20539 -> 22249 rows), where the spec-only run 37911494033 spent 432 s (20000 -> 20003 rows). Most compiler changes leave the generated code of most specs unchanged, so their verdicts could be reused.
Requirements
- The key is defined in
.t27and generated with gen-rust: FNV-1a 64 over a schema number and five parts, in order: the spec and itsuseclosure; the stdout oft27c gen <spec>;bootstrap/src/test_report.rs(the test runner);zig version; the arch-os fromzig env. This is how seal v2 (t27c seal writes the v2 identity, and t27c frontier reports what may be reused (Closes #8104, Closes #8109) #8110) judges a toolchain. - The host is a key part, so a host-dependent verdict (reference: self_attention.t27 passes or fails by host -- its test iterates an undefined W585 scaffold slice (t27b ledger STALE) #8051, self_attention) is never served on another host.
- A part that cannot be computed is replaced by the t27c binary hash, so the key is never looser than today.
- Never cached: a reference timeout, a t27c that did not exit normally, a test the runner stopped at its timeout, and zig resource faults. A cached run without per-test verdicts stays a miss.
blockers.rsonly computes the parts and calls the generated functions, within the 40/80 foreign-line budget (Only-t27 gate: a foreign-line budget the label cannot lift; local hook reads exceptions from origin/master #7371).
Success Criteria
- The spec's tests pass under
t27c test-report. Mutants (host dropped, timeout check dropped) are killed. cargo test -p t27b --test refcachepasses.- On the lab, a t27c built from t27c seal writes the v2 identity, and t27c frontier reports what may be reused (Closes #8104, Closes #8109) #8110's head reuses the verdicts of every spec whose generated code did not change. The measured hit rate and corpus time go in the pull request.
Requirements
FR-001: The key MUST be defined in a .t27 spec and generated with gen-rust as FNV-1a 64 over a schema number and five parts in order: the spec and its use closure; the stdout of t27c gen <spec>; bootstrap/src/test_report.rs (the test runner); zig version; the arch-os from zig env.
FR-002: The host MUST be a key part so that a host-dependent verdict is never served on another host.
FR-003: A part that cannot be computed MUST be replaced by the t27c binary hash so the key is never looser than today.
FR-004: A reference timeout, a t27c that did not exit normally, a test the runner stopped at its timeout, and zig resource faults MUST never be cached. A cached run without per-test verdicts MUST stay a miss.
FR-005: blockers.rs MUST only compute the parts and call the generated functions, within the 40/80 foreign-line budget.
Activity
gHashTag commentedon Oct 9, 2026
Workflow follow-up for #8208 (header comment) and #8185 (step-summary line). This push token has no
workflowscope, so neither PR touches.github/workflows/. Apply by hand once both have merged:git applythis diff on master. It adds 11 lines to the 80-line foreign budget and adds or removes no step, so no census re-pin is needed.t27b: key reference verdicts by the generated code, not the t27c bina…