ci(cmux-next): run the Mac Release fallback when the fast gate dies before a verdict

Merged
TE
14d ago
+63-10

Unblocks cmux NEXT nightlies (Leo, 2026-10-24: "why arent nightlies up yet"). This builds on #24831 (the fast check no longer carries the gate name, and release-compile-fast-admission does).

Problem. The fast fleet check can be refused at "Set up runner" by glaeda-cmux-runner-hook (the side pool under its 30 GiB disk floor: cmux9s 19 GiB, cmux11s 29, cmux8s 21, cmux17 27โ€“32). Then it fails with no verdict. Since #24831, admission goes red under the gate name and the Mac Release fallback stays skipped (it runs only on a skipped fast check or verdict=unavailable). So a push whose code is fine has a red gate and can't be promoted. Before #24831 the same refusal skipped both jobs (runs 40069112418, 40069406866, 40069440543, 40069632489).

Fix.

  • release-compile (Mac fallback) also runs when the fast job's result is failure with an empty verdict.
  • That fallback is routed to blacksmith-12vcpu-macos-26, the last-resort tier in the routing order, instead of the macos-placement mini, which is in the same full pool (attempt 2 of run 40069430211 was refused on cmux8s). An unavailable verdict still uses the placement mini. Both runs-on and CMUX_NEXT_RUNNER are changed.
  • The fast compile step is continue-on-error. A fleet compile failure keeps the step red but the job green with verdict=fail, which admission turns red. The fast job fails only when it never reached a verdict. So the route never depends on whether GitHub passes a failed job's outputs downstream.
  • release-compile-fast-admission skips in exactly that case, so one job carries the gate name per push. That answers the earlier Codex review: push attribution (cmux_next_push_attribution.py) and nightly_next_feed_watch.py read the first job with that name, and a red admission next to a green fallback would mislead them.
fast checkadmissionMac fallback
passgreenskipped
verdict fail (compile error)redskipped
verdict unavailableskippedplacement mini
refused before a verdictskippedBlacksmith macOS
no verdict, job succeeded (step died before writing one)skippedplacement mini
skippedskippedas before

Tests.

  • test_a_fast_gate_that_died_before_a_verdict_falls_back_to_the_mac_compile covers the fallback condition and both routes.
  • test_exactly_one_job_carries_the_gate_name_for_each_fast_check_outcome fails if admission doesn't yield.
  • #24831's admission table now expects a skip for ("", failure).
  • tests.test_cmux_next_checks_workflow on a sparse worktree has the same failure set as base (58 pre-existing errors from missing sparse paths).

Risk. Low, CI only. A refused fast check now costs one Blacksmith macOS Release compile instead of a red gate. The disk floor itself is a separate problem for the fleet owner.

๐Ÿค– Generated with Claude Code

Agent session: huge-blue