ci(cmux-next): a PR compiles its head on the build fleet; Release and scheme compiles leave the PR's Mac queue

Merged
TE
15d ago
+501-61

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 runs cmux-ci compile-check --ref <PR head> --app on CI_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 with full-ci or when the fleet gives no verdict. Forks, every feat-cmux-next push (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 needs full-ci on a PR. A MEMBER or OWNER dev-build PR keeps it.
  • Overflow: a Release compile no idle mini can take joins the next_macos_cascade.py placement and moves to a free Blacksmith 12 or 6 vCPU macOS slot. On a feat-cmux-next push, that happens only while the promotion pool (PROMOTE_LABEL) has no idle runner.
  • scripts/ci/merge_compile_guard.py waits 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.py
    • PullRequestCompileOnTheBuildFleet: 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 PushPreflightBehavior failures 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-fleet job, 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 Autofix with [code]smith
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 runs cmux-ci compile-check --ref <PR head> --app on CI_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) and cmux app scheme compile (Debug) now need full-ci on a PR; a MEMBER or OWNER dev-build PR keeps its scheme compile, and forks, pushes, and dispatches are unchanged.
  • A Release compile with no idle mini joins the next_macos_cascade.py placement and moves to a free Blacksmith 12 or 6 vCPU macOS slot; on a feat-cmux-next push that happens only while the promotion pool has no idle runner.
  • merge_compile_guard.py waits 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.