ci(cmux-next): the fast Release admission stays red on a fleet failure and requests promotion itself

Merged
TE
14d ago
+64-47

Leo, 2026-10-24: "why arent nightlies up yet". From the coordinator: "make the fast Release compile job fail, or show as a warning, when no compile ran. A 'no Release profile' result must never be green."

#24866 (merged at 07:46Z) landed the core of this PR: the fast check now has its own name, and release-compile-fast-admission carries cmux-next Release compile (Xcode 26) only on a fleet pass. This PR is now just the two gaps the independent Codex review found that #24866 leaves open.

1. A fleet failure leaves no gate at all

release-compile-fast-admission runs only on verdict == 'pass'. Two cases end up with no job carrying the gate name, where before #24866 there was a red one:

  • a fleet compile error (verdict=fail);
  • a fast check refused at "Set up runner" before it wrote a verdict, as glaeda did under the 30 GiB disk floor (jobs 120799474474 and 120799574773 on cmux11s).

Consumers that treat a missing or skipped compile as "not run" (merge_compile_guard.py NOT_RUN) then see nothing red.

Fix: the admission job runs whenever the fast check ran without handing off to the Mac fallback, with if: always() && !cancelled() && …. It is not cancelled or skipped, and its verdict is not unavailable. It is green only on verdict == pass && result == success, and otherwise exits 1 with an ::error. The unavailable case still goes to the Mac fallback, as before. #24822 (nightly-opus) adds the Mac fallback for the died-before-a-verdict case, and the two compose: a red admission next to a green fallback still admits, because consumers look for any green job with the gate name.

2. Promotion is requested before the gate exists

The fast check still runs request-nightly-next.sh from inside its own job. That means before release-compile-fast-admission has even started on Blacksmith, while main's promote job (admitted()) waits only 6 × 5 s for a green gate. request-nightly-next-fast also doesn't wait for the admission job.

Fix:

  • The admission job checks out the pushed commit and requests promotion itself once green, the same way the Mac gate does ("Request nightly-next promotion after this gate"). A rerun of only the gate therefore requests too, which a skipped downstream helper never would.
  • request-nightly-next-fast now needs the admission job.
  • The fast check drops its in-job request and actions: write.

Tests

  • test_fast_gate_is_the_first_compile_path…: the admission if across six result/verdict pairs, and green only on pass.
  • test_the_fast_admission_gate_requests_promotion_itself replaces the old checkout-before-request test, since the fast check no longer requests.
  • python3 tests/test_cmux_next_checks_workflow.py gives the same two pre-existing failures as base (test_the_session_lane_label_comes_after_the_fork_clause and test_bot_attempt_three_drops_stale_owned_pool_placement).
  • test_nightly_promotion_admission.py (73 cases), test_gh_merge_green.py, test_ci_linux_guard_routing.py, test_ci_owned_pool_sources.py and test_supplychain_security.py pass.

Other

  • The fast check itself is cx3-s34-ota's (the controller still serves a client without --release; #24812, hq#3744). This PR doesn't touch the compile step.
  • The Mac fallback refused for disk goes to the CI-mini hygiene reconciler: cmux11s-mac-mini (27.0–27.2 GiB free at 06:15–06:17Z, jobs 120799474474, 120799574773 and 120800155249) and one side mini at 18.6 GiB (job 120799008962).

Agent session: big-red

🤖 Generated with Claude Code