ci(cmux-next): a PR compiles its head on the build fleet; Release and scheme compiles leave the PR's Mac queue
What
A same-repository PR into feat-cmux-next no longer queues its app compiles on the Mac minis.
- Native tier, new
cmux-next app compile (build fleet)job. It runscmux-ci compile-check --ref <PR head> --apponCI_COMPILE_CHECK_GATEWAY(about a minute).- Exit 1, a compile error, fails the job. That red belongs to the PR.
- Any other non-zero exit means no verdict: no client, the fleet is down, or a timeout. The job then posts a notice, and
cmux-next Release compile (Xcode 26)runs on a Mac as before.
cmux-next Release compile (Xcode 26)now runs on a same-repository PR only withfull-cior when the fleet gives no verdict. Forks, everyfeat-cmux-nextpush (nightly-next still gates on it),next-batch/*pushes and dispatches still run it. A Release-only break shows up on the base push, and push-attribution names the PR.cmux app scheme compile (Debug)now needsfull-cion a PR. A MEMBER or OWNERdev-buildPR keeps it.- Overflow: a Release compile no idle mini can take joins the
next_macos_cascade.pyplacement and moves to a free Blacksmith 12 or 6 vCPU macOS slot. On afeat-cmux-nextpush, that happens only while the promotion pool (PROMOTE_LABEL) has no idle runner. scripts/ci/merge_compile_guard.pywaits while the fleet job runs (the Release compile check does not exist until that job finishes) and refuses a merge when the fleet job is red.
Why
At the 2026-10-21T20:10Z baseline, 354 jobs were queued, 352 of them on Mac. 76 were Release compiles and 22 were scheme compiles.
Coordination
next_autoland.py compile_verdict in leo-workspace treats a skipped Release compile as "a person merges it". Until gate-rules' fix accepts cmux-next / cmux-next app compile (build fleet) in its place, a Swift PR lands by its owner's gh pr merge, not by autoland. Owner merges are the default path anyway, and the merge hook (merge_compile_guard.py) accepts the fleet verdict.
Testing
Tests first: the red commits come before the fix commits.
tests/test_cmux_next_checks_workflow.pyPullRequestCompileOnTheBuildFleet: when the job runs, and its step against a stub client (exit 0, 1, 3).HeavyMacCompilesBehindFullCi, plus updated release-compile routing tests.- 130 of 132 pass. The 2
PushPreflightBehaviorfailures also fail on base fa425f420f4.
tests/test_merge_compile_guard.py: 45 OK, including the fleet job as a wait and its red as a refusal.tests/test_ci_next_macos_cascade.py: 44 OK.scripts/cmux-next/prepush-gate.py: no new violations.
Observed / Not run
- Observed: the three test files above, run locally against this head.
- Not run:
- actionlint, which is not installed on this host; CI's lint covers it.
- A live PR run of the new job. The gateway step matches the existing
swift-canary-fleetjob, which runs in production.
Changelog
none
Leo-ask: ask-5d2b6a5c33
Leo-ask: ask-2bb8ff7837
Leo-ask: ask-8498e37e7a
Leo-ask: ask-4fd85c9fcf
Leo-ask: ask-8d1dcce7ff
Agent session: cmux16
š¤ Generated with Claude Code
![View with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v3-3x.png)
![Autofix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark-3x.png)
Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Tracks same-repository PRs into feat-cmux-next compiling their app head on the build fleet in about a minute, cutting the Mac queue (354 jobs queued, 352 on Mac at the baseline).
Compile routing
- New
cmux-next app compile (build fleet)job runscmux-ci compile-check --ref <PR head> --apponCI_COMPILE_CHECK_GATEWAY; a compile error fails the job (the PR's red), and any other non-zero exit posts a notice and runs the Mac Release compile instead. cmux-next Release compile (Xcode 26)andcmux app scheme compile (Debug)now needfull-cion a PR; a MEMBER or OWNERdev-buildPR keeps its scheme compile, and forks, pushes, and dispatches are unchanged.- A Release compile with no idle mini joins the
next_macos_cascade.pyplacement and moves to a free Blacksmith 12 or 6 vCPU macOS slot; on afeat-cmux-nextpush that happens only while the promotion pool has no idle runner. merge_compile_guard.pywaits for the fleet job's verdict and refuses a merge when it's red; a fleet compile cancelled with no Release compile run is no verdict, so the guard refuses the merge and asks to rerun it.