Wire the native integration harnesses into CI
sigil test globs test-*.sgl, so it finds the 28 unit tests and none of the four native WebSocket integration harnesses. Until now nothing ran them in CI: the pipeline was deps install -> build -> sigil test. A gate that never runs cannot fail, which is indistinguishable from a gate that always passes -- so the regression added earlier in this branch had no protective value on the pipeline at all.
Scoped to wiring: one step appended, nothing else in the pipeline touched (4 insertions, 0 deletions). The glob deliberately matches test-native-websocket-*.sh only and excludes the wasm harness, which has different prerequisites (binaryen, a wasm runtime).
The runner script keeps two outcomes apart that must never be confused:
- SETUP-FAILED when node is absent, saying in as many words that the tests did not execute and this is not a pass. No estate ci.sgv invokes node today, so whether the CI image has it is UNVERIFIED -- if it does not, this step must say why rather than emit a confusing red.
- A floor as well as a cap: a glob that matches nothing exits 0 and reads exactly like a clean run, so the script refuses to report success unless it actually ran at least four harnesses.
Verified in four states by running the exact command the CI step runs, because a CI change nobody has seen fail is the thing this branch spent its day proving worthless:
clean source -> exit 0, "integration harnesses run: 4, status: 0"
guard sabotaged -> exit 1, names the harness AND the reason ("went deaf")
node removed -> exit 1, SETUP-FAILED, distinct from a red test
one harness gone -> exit 1, "matched 3 ... expected at least 4"Not verified: an actual CI run. That needs a push, which I do not have approval for. What is verified is the step's command in the four states above.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AbXvyDXoTUyqV1tb1fkeFa
.kiln/ci.sgv | 4 ++++
scripts/run-integration-tests.sh | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 54 insertions(+).kiln/ci.sgvmodified
(shell name: deps "sigil deps install") (shell name: build "sigil build") (shell name: test "sigil test") ;; `sigil test` globs test-*.sgl and finds only the unit tests, so the ;; native WebSocket integration harnesses ran nowhere until this step ;; existed. The script reports SETUP-FAILED distinctly from a red test. (shell name: integration "scripts/run-integration-tests.sh") ]))scripts/run-integration-tests.shadded
#!/usr/bin/env bash## Run the native WebSocket integration harnesses.## These are NOT discovered by `sigil test`, which globs test-*.sgl and so finds# only the unit tests. Until this script was wired into .kiln/ci.sgv the# integration suite never ran in CI at all -- and a gate that never runs cannot# fail, which is indistinguishable from a gate that always passes.## Deliberately globs test-native-websocket-*.sh only. The wasm harness has# different prerequisites (binaryen, a wasm runtime) and is not wired here.set -ucd "$(dirname "$0")/.." || exit 1# SETUP-FAILED is a distinct outcome from a red test, and must not be reported# as one. These harnesses drive their servers from Node; if it is absent the# tests did not fail, they never ran, and saying so is the difference between# "the code is broken" and "this runner cannot answer the question".if ! command -v node > /dev/null 2>&1; then echo "SETUP-FAILED: node is not on PATH, so the integration harnesses cannot run." echo " These tests did NOT fail -- they did not execute. Do not read this as a pass." exit 1fiecho "node: $(node --version)"status=0ran=0for t in test/integration/test-native-websocket-*.sh; do [ -f "$t" ] || continue ran=$((ran + 1)) echo "== $t" if sh "$t"; then echo " ok" else echo " FAILED: $t" status=1 fidone# A floor as well as a cap: a glob that matches nothing exits 0 and reads# exactly like a clean run. Four harnesses exist; expect to have run them.if [ "$ran" -lt 4 ]; then echo "SETUP-FAILED: matched $ran integration harnesses, expected at least 4." echo " An empty or partial glob passes for free; refusing to report success." exit 1fiecho "integration harnesses run: $ran, status: $status"exit "$status"