You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
t27c seal: test record holds the temp dir's pid, and a missing zig is sealed silently #7243
t27c seal --save writes two facts about the sealing machine into the seal, as if they were facts about the spec.
The test record names a temp directory with a process id.bootstrap/src/test_report.rs:441 builds the working directory as t27c-test-report-<stem>-<pid>. The first line of zig's error goes into tests.blocked as is: "blocked": "does not compile: /tmp/t27c-test-report-base64-1848105/spec.zig:17:56: error: ..."
Two reseals of the same spec with the same binary therefore write different files. Measured 2026-10-07 on the Railway lab: 58 seal files resealed twice from the same tree, with the same --save and the same build of 403b27f. All 58 differed in sealed_at, and 48 also differed in the /tmp/...-<pid>/ part of blocked. Nothing else differed. 512 seals on master (93302d1) carry such a path today.
A missing zig is sealed silently. With /opt/zig left off PATH, seal --save exited 0 on all 28 specs and wrote "blocked": "zig not on PATH" into each test record. That is a statement about the machine, not about the spec. A bulk reseal on a host without zig quietly replaces every real test result.
Expected
blocked holds the error with the working-directory prefix removed (spec.zig:17:56: error: ...). A reseal of an unchanged spec with an unchanged binary then changes only sealed_at.
seal --save refuses, or at least warns on stderr and exits non-zero, when the test record would be "zig not on PATH". --force can still allow it.
Acceptance criteria
A unit test in test_report.rs: seal_record of a blocked report whose error carries /tmp/t27c-test-report-x-123/spec.zig:1:2: error: e stores spec.zig:1:2: error: e.
Resealing the same spec twice in a row gives files that differ only in sealed_at (shown on two specs: one blocked, one passing).
PATH=/usr/bin:/bin t27c seal --save <spec> exits non-zero without --force.
The 512 existing paths go away in the next reseal of each spec; no bulk reseal is needed for this issue.
Found while resealing the first slice of #7191 (two reseals of the same tree differed in exactly these places). Foreign Rust: bootstrap/src/test_report.rs and main.rs (label owner-approved-foreign, standing owner rule).
Fix committed locally as 2271df9 on claude/seal-deterministic-7243 (base 93302d1). It goes up as a PR after #7242 and the first #7191 slice, because the Actions queue holds 200+ queued runs.
zig now runs from its work dir on bare file names, so it prints spec.zig:18:56: error: ... and the seal stores that. The strip happens where the path is made, not in seal_record, so test-report's own output is deterministic too. t27b already cut the same prefix (cli/t27b/src/blockers.rs), so its comparisons don't change.
A report blocked by a missing zig is now the verdict Unmeasured. seal --save refuses it with exit 1; --force still writes it.
Lab, 403b27f tree, each spec resealed twice in a row with one binary:
master: base64 (blocked) differs in 2 lines besides sealed_at; orphan_detection (6/6 pass) in 0.
fix: 0 and 0.
PATH=/usr/bin:/bin seal --save: master exits 0 and seals; the fix exits 1 and writes nothing.
Negative controls: build() restored as on master turns a_compile_error_names_the_file_not_the_work_dir and a_blocked_reseal_changes_only_sealed_at red. With the Unmeasured return removed, a_missing_zig_is_not_sealed_without_force and no_zig_is_refused_unless_forced go red.
The first acceptance criterion moved: the unit test checks the line build() returns (spec.zig:2:..., no t27c-test-report-) and that seal_record stores it unchanged.
Separate observation: the lab's /tmp holds 114 leaked t27c-test-report-* work dirs, all from 2026-10-06 12:42Z (a killed bulk run, not this change).
Activity
gHashTag commentedon Oct 7, 2026
Fix committed locally as 2271df9 on
claude/seal-deterministic-7243(base 93302d1). It goes up as a PR after #7242 and the first #7191 slice, because the Actions queue holds 200+ queued runs.spec.zig:18:56: error: ...and the seal stores that. The strip happens where the path is made, not inseal_record, sotest-report's own output is deterministic too. t27b already cut the same prefix (cli/t27b/src/blockers.rs), so its comparisons don't change.Unmeasured.seal --saverefuses it with exit 1;--forcestill writes it.sealed_at; orphan_detection (6/6 pass) in 0.PATH=/usr/bin:/bin seal --save: master exits 0 and seals; the fix exits 1 and writes nothing.build()restored as on master turnsa_compile_error_names_the_file_not_the_work_diranda_blocked_reseal_changes_only_sealed_atred. With theUnmeasuredreturn removed,a_missing_zig_is_not_sealed_without_forceandno_zig_is_refused_unless_forcedgo red.build()returns (spec.zig:2:..., not27c-test-report-) and thatseal_recordstores it unchanged.t27c-test-report-*work dirs, all from 2026-10-06 12:42Z (a killed bulk run, not this change).t27c seal: the test record names the spec, not zig's temp dir or a mi…
t27b: tuple locals, @sqrt, out-of-range compares, unreached &repeat a…
self-host: t27core accepts compound assignment, byte-identical to gen…
t27core: numeric literal forms and pub var, byte-identical to gen-c (C…