Repository navigation
tri test: refuse vacuous passes -- report.t27 reads the "vacuous passes N of M" line (Closes #10497) - #10507
Merged
Conversation
…es N of M" line (Closes #10497) `tri test <spec>` ran `t27c test-report` and passed any report whose tests all passed and at least one ran. It never read the line `vacuous passes N of M (passed with 0 runtime asserts executed)`, and report.t27 classified it LINE_OTHER, so a spec whose every test executed 0 runtime asserts passed `tri test`. report.t27 now reads it (the rule is .t27; the Rust is glue): - LINE_VACUOUS (`vacuous passes N of M`), LINE_VACUOUS_NAME (`0 <name> VACUOUS`), LINE_VACUOUS_UNKNOWN (`vacuous passes unknown`), and parsers vacuous_passes (N) and vacuous_of (M). - V_VACUOUS: N > 0. The VACUOUS lines name the tests. - V_UNCOUNTED: `unknown`, the counting build did not compile, so a vacuous pass cannot be ruled out. - Fail closed: M must be the report's pass total, N <= M, and N must be the number of VACUOUS names; VACUOUS names with no summary line (a cut report) are refused. - A report with no vacuous line at all (a t27c older than #6509) keeps the reading it always had. A FAIL is still read before a vacuous pass, so `tri mutate plant` keeps naming the killed tests. - 9 new tests (22 in all, 0 vacuous), including a negative control; the old LINE_OTHER test for the vacuous line now expects LINE_VACUOUS. Glue: report_summary in cli/tri/src/main.rs appends `, vacuous: <names>` to the one greppable line (3 lines changed, 0 net). gen/rust/tri/test/report.rs is regenerated with `t27c gen-rust`; the seal is saved and verifies MATCH. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
gHashTag
enabled auto-merge (squash)
October 18, 2026 15:37
16 of 21 tasks
Contributor
This was referenced Oct 18, 2026
Closed
gHashTag
added a commit
that referenced
this pull request
Oct 18, 2026
…e) and a t27o skill (Closes #10541) (#10542) * skills: tri-pipeline fast path (t27b first, frontier --only seal reuse) and a t27o skill (Closes #10541) tri-pipeline: t27b test for the inner loop (rust_std.t27 0.89 s against 94 s for t27c test-report), t27c frontier --only for unchanged specs (REUSE = the sealed verdict stands; 5 specs in about 5 s), test-report once as the final gate, symlinked release binaries instead of rebuilds, t27b exit codes, the sandbox ZIG cache trap, git add -f for gen files; drop the stale "tri test does not yet fail on vacuous" (#10507 landed). t27o: where its truth lives, making a refusal class convertible and measuring it, --check, the loop tick for #10522, tonight's traps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * skills: the net-zero hand-line rule of own-language, and $TMPDIR over the scratchpad (Closes #10541) #10538 failed the required own-language check with +9/-0 hand lines in cli/tri/src/main.rs: check_budget refuses a diff whose counted foreign lines gain more than they lose, on top of the 40/80 cap. tri-pipeline says so under PRs; the t27o skill adds the numstat one-liner. The scratchpad was wiped on a session resume (worktrees, cargo target, measurements); $TMPDIR survived, so loop worktrees live there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude <claude@anthropic.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #10497
tri test <spec>passed a spec whose every test executed 0 runtime asserts, becausespecs/tri/test/report.t27classified t27c'svacuous passes N of Mline asLINE_OTHERandcmd_testnever looked at it. The rule now lives inreport.t27(FR-002) andtri testfails when N > 0 (FR-001).What changed
specs/tri/test/report.t27LINE_VACUOUS(vacuous passes N of M),LINE_VACUOUS_NAME(0 <name> VACUOUS),LINE_VACUOUS_UNKNOWN(vacuous passes unknown). Parsersvacuous_passes(N) andvacuous_of(M).V_VACUOUS(N > 0) andV_UNCOUNTED(unknown: the counting build did not compile, so a vacuous pass cannot be ruled out). OnlyV_GREENpasses.passtotal and N <= M, otherwiseV_TOTALS_DISAGREE; N must equal the number ofVACUOUSnames, otherwiseV_NAMES_DISAGREE;VACUOUSnames with no summary line (a report cut short) are refused.V_FAILEDandtri mutate plantkeeps naming it.only_the_vacuous_lines_refuse_a_run. The oldline_kind(" vacuous passes 0 of 3") == LINE_OTHERassert now expectsLINE_VACUOUS.gen/rust/tri/test/report.rs: regenerated witht27c gen-rust(not hand-edited)..trinity/seals/test_TriTestReport.json: resealed.cli/tri/src/main.rs: glue only.report_summaryappends, vacuous: <names>to the one greppable line. 3 lines changed, 3 deleted: 0 net hand-written Rust added.cmd_testitself needed no change: the generatedverdict/passes/whycarry the new verdicts through, and the report body it already prints holds theVACUOUSlines.Measured results
./target/release/t27c test-report specs/tri/test/report.t27:Success criteria:
tri test specs/claw/model_route.t27tests: 6, pass: 6, fail: 0,vacuous passes 0 of 6tri teston a copy ofmodel_route.t27whose testan_unknown_role_is_a_cheap_sub_taskhas its two asserts replaced byvar unused : u32 = 1;0 an_unknown_role_is_a_cheap_sub_task VACUOUS,vacuous passes 1 of 6,tests: 6, pass: 6, fail: 0, vacuous: an_unknown_role_is_a_cheap_sub_task, thenError: ... a test passed vacuously: it executed 0 runtime asserts, so its pass certifies nothing (T730); the VACUOUS lines name itt27c test-report specs/tri/test/report.t27Also:
tri test specs/tri/test/report.t27exits 0 (22/22). A 3-test probe with two reached-no-assert tests exits 1 and printsvacuous: vacuous_one, vacuous_two.Seal:
t27c seal specs/tri/test/report.t27 --verify-> spec_hash, gen_hash_zig, gen_hash_verilog, gen_hash_c, gen_hash_rust all MATCH.Negative controls with
tri mutate plantonreport.t27itself (each KILLED by exactly the expected tests, spec sha256 unchanged after the run):if (n > 0) { return V_VACUOUS; }withn > 9: killed bya_vacuous_pass_is_refused_and_named,every_vacuous_test_is_named,only_the_vacuous_lines_refuse_a_run.count(text, LINE_VACUOUS_UNKNOWN) > 0with> 9: killed byan_uncounted_report_is_refused.count(text, LINE_VACUOUS_NAME) > 0with> 9(cut-short report): killed byonly_the_vacuous_lines_refuse_a_run.cargo test -p tri: 875 passed, 11 failed, all 11 infpga::tests::m2l_scratch_*,piddir::tests::*andmutate::tests::*and caused by the agent sandbox (no process-table access:Operation not permitted,reaped child still reads as running; 6 mutate tests also failed on a~/.cache/zigPermissionDenied and pass onceZIG_GLOBAL_CACHE_DIRis writable).the_summary_line_names_what_the_report_namespasses. CI should be the judge of the 5 process-table ones.Not done, on purpose
vacuous passes unknownis refused (V_UNCOUNTED) rather than passed: the instrument failed, so the claim is unproved. Of 8 specs sampled (plant,gft_relu,test_report_exit,receipt,hot,lanes,ledger_union,own_language) none printedunknown.Possible CI note: the diff edits an existing hand-written Rust file (
cli/tri/src/main.rs), within the 40/80 budget and net 0. Since 2026-10-18 that no longer needsowner-approved-foreign; if a gate asks for the label anyway, it is the owner's to apply.🤖 Generated with Claude Code