Commit8cf2cf88Recorded4 Sep 2026Repositorysigil-websocket

Say that the node check is the weaker, presence-only form, and why it passes here

Message

The estate's golden-image bake already asks the behavioural version of this question -- FEATURE node-global-websocket PRESENT, whose own failure message explains that a node which exists but is too old satisfies command -v and still fails the suite -- and refuses to promote an image that fails it.

command -v answers "is there a file by that name on PATH", not "can it do the job". Presence is adequate here because these four harnesses use only node: builtins and child_process.spawn, but that is a property of today's harnesses rather than of the check, so record both the weakness and the reason it is tolerable. A future harness needing more must grow a behavioural arm instead of inheriting this one's clean bill.

Comment only; all four verified states are unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AbXvyDXoTUyqV1tb1fkeFa

Changed
 scripts/run-integration-tests.sh | 13 +++++++++++++
 1 file changed, 13 insertions(+)
Diff
scripts/run-integration-tests.shmodified
@@ -17,6 +17,19 @@ cd "$(dirname "$0")/.." || exit 1
17
# as one. These harnesses drive their servers from Node; if it is absent the
18
# tests did not fail, they never ran, and saying so is the difference between
19
# "the code is broken" and "this runner cannot answer the question".
+20
#
+21
# THIS IS THE WEAKER, PRESENCE-ONLY FORM, KNOWINGLY. `command -v` answers "is
+22
# there a file by that name on PATH", not "can it do the job" -- a node that
+23
# exists but is too old passes here and fails the suite, and the red then gets
+24
# attributed to the code under test rather than to the toolchain. The estate's
+25
# golden-image bake asks the behavioural version (azoth.works
+26
# bin/build-golden-image.sh, `FEATURE node-global-websocket PRESENT`) and
+27
# refuses to promote an image that fails it.
+28
#
+29
# Presence is adequate *here* because these four harnesses use only node:
+30
# builtins and child_process.spawn -- no global WebSocket, no modern-only API.
+31
# If a harness is ever added that needs more, this check must grow a
+32
# behavioural arm rather than be trusted as-is.
33
if ! command -v node > /dev/null 2>&1; then
34
echo "SETUP-FAILED: node is not on PATH, so the integration harnesses cannot run."
35
echo " These tests did NOT fail -- they did not execute. Do not read this as a pass."