Found by @Nitjsefnie while working on #653 (see their report) — they hit it live as an 11+ minute hang.
tests/run_all_tests.sh:2073 is the last unguarded interpreter invocation in the runner:
TM_OUTPUT=$(./eigenscript ../tests/test_terminal.eigs 2>&1); TM_OUTPUT_RC=$?
Compare the guarded shape at :93:
out=$($EIGS_TMO ./eigenscript "../tests/$file" </dev/null 2>&1); rc=$?
Two things missing: $EIGS_TMO (the runaway backstop from #616) and </dev/null. test_terminal.eigs reads stdin, so in any environment where stdin is a held-open pipe — a captured or backgrounded CI-ish shell — it blocks forever. No timeout wrapper means the whole suite wedges rather than failing.
We have been treating this as folklore instead of fixing it. CLAUDE.md carries the workaround as a standing rule:
make test must run with stdin available or redirected from /dev/null — test_terminal.eigs blocks forever reading a pipe that never EOFs.
That is a bug documented as a constraint. The runner should be robust on its own rather than requiring every caller to remember an invocation discipline.
Fix
Give :2073 the same treatment as :93 — $EIGS_TMO and </dev/null. Then delete the CLAUDE.md rule, since it stops being true.
Done when
Notes
Scoped to one line plus a doc deletion; the verification above is the interesting part. @Nitjsefnie has first refusal since they found it.
Found by @Nitjsefnie while working on #653 (see their report) — they hit it live as an 11+ minute hang.
tests/run_all_tests.sh:2073is the last unguarded interpreter invocation in the runner:Compare the guarded shape at
:93:Two things missing:
$EIGS_TMO(the runaway backstop from #616) and</dev/null.test_terminal.eigsreads stdin, so in any environment where stdin is a held-open pipe — a captured or backgrounded CI-ish shell — it blocks forever. No timeout wrapper means the whole suite wedges rather than failing.We have been treating this as folklore instead of fixing it.
CLAUDE.mdcarries the workaround as a standing rule:That is a bug documented as a constraint. The runner should be robust on its own rather than requiring every caller to remember an invocation discipline.
Fix
Give
:2073the same treatment as:93—$EIGS_TMOand</dev/null. Then delete the CLAUDE.md rule, since it stops being true.Done when
:2073uses$EIGS_TMOand</dev/null[60] Terminal Builtinsstill reports 10/10 in a normal runbash -c "sleep 300 | bash run_all_tests.sh", which wedges before the fixNotes
Scoped to one line plus a doc deletion; the verification above is the interesting part. @Nitjsefnie has first refusal since they found it.