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
guard_tree.sh: vacuous PASS — lost scratch dir → '0 checks, 0 failed', exit 0; make gate green on nothing #4108
Measured on lambda, 2026-09-23 (while running make gate for #4107, branch feat/ont-4c5-capability-cells): two make gate runs started at the same time, one on the branch worktree and one on a detached worktree of 6db770d2f. In both, scripts/guard_tree.sh lost its mktemp -d scratch directory mid-run. The log shows 22 lines like guard_tree.sh: line 280: /tmp/tmp.692dO8zpps/68.rows: No such file or directory and line 614: /tmp/tmp.692dO8zpps/plan: No such file or directory. The script then printed:
dispatch: up to 8 guard(s) at a time (GUARD_TREE_JOBS)
0 guard(s) skipped
0 checks, 0 failed
and exited 0, so make gate exited 0 (the gate-reduce receipt recorded "exit":0). The same branch run alone minutes later executed 122 checks, 6 failed, exit 2. So a run that executed nothing reported a pass. This is the vacuity shape "a gate that nothing reaches": zero executed is not green.
Not diagnosed yet: what removed the directory (a concurrent run's cleanup, or a guard that sweeps /tmp/tmp.*). That matters, but the gate must not pass whatever the cause.
Do:guard_tree.sh exits non-zero when it executed 0 checks, or fewer checks than the worklist it planned, naming both numbers. It must also fail on any lost scratch file rather than continuing.
Must-RED: a case-table row that runs guard_tree against an empty or vanished worklist (or deletes its scratch dir mid-run) and expects a non-zero exit with a named reason. The mutant that removes the new check turns the row RED.
evidence for close: #4655 / 989cb01 (on main), how checked:
scripts/guard_tree.sh counts its plan in memory (:612-640) and fails with [plan]/[vacuous] on a lost or empty plan instead of passing on "0 checks, 0 failed".
Activity
test(guard): row 33 — row 32 (plan truncated in place) gets its mutant (
fix(guard): a tracked guard missing from disk fails the run instead o…
fix(guard): the universe check runs before --dry-run answers too (#4108…
fix(guard): an unreadable tracked guard is refused too; --dry-run fai…
fix(guard): --dry-run fails on an empty plan; a short subset listing …
merge origin/main (v0.69.3 merge-back #4338) into B3 — 7 conflicts re…
noahgift commentedon Oct 12, 2026
evidence for close: #4655 / 989cb01 (on main), how checked:
scripts/guard_tree.shcounts its plan in memory (:612-640) and fails with[plan]/[vacuous]on a lost or empty plan instead of passing on "0 checks, 0 failed".scripts/tests/guard_tree_test.shrows 28-33 and 38 pass on main, including the mutants without the guard_tree.sh: vacuous PASS — lost scratch dir → '0 checks, 0 failed', exit 0; make gate green on nothing #4108 check that reproduce the incident.noahgift commentedon Oct 12, 2026
Cop batch close (FLOW-004 drain, ≤43/d): fix verified on main — merged #4655 ; ancestor of origin/main: 989cb01 . Evidence: #4108 (comment)