ci: guard the concurrency groups, and rebalance the runners by evidence #163
Loading…
Reference in a new issue
No description provided.
Delete branch "ci/workflow-guard"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The two things I argued myself out of doing in #161, plus a disk problem found on the way.
The guard
#161 added a concurrency group to all 15 workflows and nothing stops the sixteenth from omitting one — which reintroduces the failure for the whole repo, invisibly: the workflow still passes, it just queues forever under load.
scripts/check-workflow-concurrency.shrequires a top-levelconcurrency:block whose group varies bygithub.ref. Both conditions matter: a fixed group serialises every branch against every other, which is worse than having no group.My reason for skipping this was that a guard "would need its own CI job on the runner this change exists to unblock". Wrong on the facts — the guard runs on
linux, which is jetson-hub, not the dev Mac. It costs nothing I was trying to protect and needs no toolchain.It has a self-test, because this repo has a documented history of gates that passed while guarding nothing:
check-workflow-concurrency-selftest.shbreaks the property both ways against a scratch copy and asserts the check rejects each.That self-test started as an inline Python heredoc in a
run:block, whose body sat at column zero — making the workflow file invalid YAML. An unparseable workflow means no CI at all, i.e. the exact failure this change exists to prevent, reintroduced by the fix for it. Caught by runningyaml.safe_loadover every workflow before committing. It is a script now, which is also why it is independently runnable.The rebalance
#161 named this and left it undone. The dev Mac hosts both the
macosrunner and thelinux-arm64colima VM, so it served 13 of 21 contexts while jetson-hub sat idle — which is exactly why a PR'slinuxcontexts came back in minutes and its macOS ones could wait indefinitely.Four workspaces move to
linuxon evidence, not preference:target_os = "macos"cfgsCargo.locklinuxlinuxlinuxlinuxmacosRunning the first four on macOS asserted nothing the repo relies on.
jouledesk-rsgenuinely needs it. Thelinux-arm64placements stay as well — arm64 is the deployment target andjouleclaw-rsrequires+fp16.Labels go from 5 / 7 / 5 to 9
linux/ 7linux-arm64/ 1macos, plus the dedicatedmacOS energy backendsjob. The dev Mac drops from 13 contexts to 9; jetson-hub rises from 5 to 9. macOS is still exercised — by the workspace that depends on it, and by the energy job whose entire purpose is the platform-gated meters.If one of the four does not build on x86_64, that is a finding rather than a regression: it would mean a workspace only ever built on macOS without saying so.
⚠️ Unrelated but urgent: the dev Mac's disk was full
While doing the above, writes started failing with
ENOSPC. The data volume was at 100% — 3.5 GiB free of 3.6 TiB. That is machine-wide, and the dev Mac is themacosandlinux-arm64runner, so it would have been failing builds for every session, not only mine.Reclaimed
~/ci-cache/agent-joule(190 GB of regenerable build cache, belonging to a different repo with no job running at the time), taking the volume to 191 GiB free.~/ci-cache/ferrum(22 GB) is left in place. The nextagent-jouleCI run rebuilds from cold once.Worth flagging separately because 3.4 TiB is still in use and the headroom will go again.
🤖 Generated with Claude Code