31 runs were queued on igneum-build-1's one runner at 13:15 UK on 7 October 2026 and nothing had concluded since 13:03Z, so no lane could read a conclusion. - ci.yml: a `changes` job (ubuntu-latest) classifies the push with tools/ci/docs-only-check.sh (docs/, site/, *.md only = code=false; a new branch, a pull request, a force push or an API error = code=true); pow and sims need it and run only on code=true. The site job is unchanged on ubuntu-latest for every push. The classifier's self-test is in the gate. - provision.sh and runner/register.sh: `--host <ip>` registers another box, forwarding BOX_HOSTNAME, RUNNER_NAME, RUNNER_LABELS, RUNNER_CPUS and RUNNER_JOBS (plain words only); RUNNER_CPUS writes AllowedCPUs into the service drop-in beside Nice=10, so igneum-build-2's runner is bounded like a suite (32 cores). The pool label is igneum-build-1 (both boxes carry it); ci-red marks the box with the record file and the poster, the default labels carry it, and igneum-build-1 got it through the runners API today. - ci-red.yml runs on the ci-red label, so the red line always lands where the poster reads it. - CLAUDE.md: the rule reads "read the conclusion when it lands, own a red before the next push"; pushes are never held. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
43 lines
2.2 KiB
Bash
Executable file
43 lines
2.2 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Did a push touch code, or only documents? The `changes` job of .github/workflows/ci.yml feeds the changed paths on
|
|
# stdin; the answer is one line, `code=true` or `code=false`. A docs-only push (every path under docs/ or site/, or a
|
|
# *.md anywhere) skips the two compile-or-compute jobs (igneum-pow tests, the simulators), which read none of those
|
|
# paths, so the box's one runner queue carries only runs that can change their result (7 October 2026, 13:03Z to
|
|
# 14:15Z: 31 runs queued on igneum-build-1, most of them status-document pushes, and no lane could read a conclusion).
|
|
# The tree gate (site build, link check, identity grep, the unit tests) runs on ubuntu-latest for every push as before.
|
|
#
|
|
# An empty list (the compare API answered nothing, a new branch, a force push) answers code=true: when in doubt, run.
|
|
#
|
|
# printf 'docs/a.md\nsite/x.html\n' | tools/ci/docs-only-check.sh # code=false
|
|
# printf 'docs/a.md\nigneum-pow/src/lib.rs\n' | tools/ci/docs-only-check.sh # code=true
|
|
# tools/ci/docs-only-check.sh --self-test
|
|
set -euo pipefail
|
|
|
|
classify() { # stdin: paths, one per line; prints code=true|false
|
|
local p any=0 code=0
|
|
while IFS= read -r p; do
|
|
[ -n "$p" ] || continue
|
|
any=1
|
|
case "$p" in
|
|
docs/*|site/*|*.md) ;;
|
|
*) code=1 ;;
|
|
esac
|
|
done
|
|
if [ "$any" = 0 ] || [ "$code" = 1 ]; then echo code=true; else echo code=false; fi
|
|
}
|
|
|
|
if [ "${1:-}" = "--self-test" ]; then
|
|
fails=0
|
|
t() { local want="$1" got; shift; got="$(printf '%b' "$1" | classify)"; [ "$got" = "$want" ] || { echo "self-test failed: paths [$1] gave $got, expected $want"; fails=1; }; }
|
|
t code=false 'docs/plans/x.md\nsite/index.html\nREADME.md\ndocs/plans/counter-asic-3-gate/a.json\n'
|
|
t code=true 'docs/plans/x.md\nigneum-pow/src/lib.rs\n'
|
|
t code=true 'tools/ci/pre-push.sh\n'
|
|
t code=true 'site/build.mjs\n.github/workflows/ci.yml\n'
|
|
t code=true 'sim/finality_v2.py\n'
|
|
t code=true ''
|
|
t code=true 'docs.rs/x.md\nproto-cuda/host.cu\n'
|
|
t code=false 'CLAUDE.md\n'
|
|
[ "$fails" = 0 ] && echo "self-test passed: docs/, site/ and *.md alone answer code=false; any other path, or no path at all, answers code=true"
|
|
exit $fails
|
|
fi
|
|
classify
|