ci: try the nightly app compile on an owned Mac mini first, Blacksmith fallback - #14208
Conversation
Adds a dispatch-only producer (nightly-mini-build.yml) that compiles the unsigned universal nightly app on a workflow-restricted mini runner group, and a route job in nightly.yml that dispatches it with bounded queue and execution waits. build-nightly-app adopts the products only when source, tree, Xcode and architectures match; any other outcome compiles on Blacksmith as before. Signing, notarization and publication stay hosted. Dark by default: NIGHTLY_MAC_MINI unset changes nothing. build-only admits unsigned measurement runs; all also admits published nightlies, which is a trust decision left to maintainers. Slice 1 of manaflow-ai#14207. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
All contributors have signed the CLA ✍️ ✅ |
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. Note Currently processing new changes in this PR. This may take a few minutes, please wait... ⚙️ Run configurationConfiguration used: Repository: manaflow-ai/cmux/.coderabbit.yaml Review profile: ASSERTIVE Plan: Advanced Run ID: 📒 Files selected for processing (13)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Review follow-ups for the nightly owned-Mac route: - build-sign-notarize-nightly, publish-nightly and close-nightly-failure-issue gate on !cancelled() and explicit job results. Their implicit success() also checked route-nightly-mini, which is skipped whenever NIGHTLY_MAC_MINI is unset, so the default configuration would have silently stopped signing and publishing. The guard now refuses that shape. - Re-home steps continue on error, and a non-numeric budget variable falls back instead of failing the route job. - The producer rebuilds Products each run so a stale resource or dSYM from the persistent directory cannot ship, pins DEVELOPER_DIR without touching the mini's global xcode-select, and adoption also compares the macOS SDK version. - A dispatch the listing shows late is found and cancelled instead of holding a mini for its full timeout; rediscovery errors during cancellation no longer crash the route. - Docs state the fallback delay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
test_nightly_universal_build.sh matches build-nightly-app's runs-on and the helper/app/sign/publish job conditions verbatim. Update them for the owned-Mac route: the app build steps down to the standard macOS 26 machine when it adopts mini products, and the jobs after the optional route job state !cancelled() and explicit upstream results. build_only stays a conjunctive exclusion on the helper, signing and publication. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
dd7ea7c ci: let the nightly channel sign with its own Sparkle key (manaflow-ai#14215) b9d4df0 ci: reject errno read inside a Swift test assertion (manaflow-ai#14054) 4e35c3e ci: pin the Glaeda candidate that accepts cmux's current Xcode pins (manaflow-ai#14213) 1c1d27b ci: try the nightly app compile on an owned Mac mini first, Blacksmith fallback (manaflow-ai#14208) 1fc4b83 refactor: move the surface catalog's value types into a package (manaflow-ai#13135) 2ee69dd refactor: move 38 leaf mobile-host files into a CmuxMobileHost package (manaflow-ai#14093) ad5ea20 test(ssh): assert the cmux-tui open flow for TTY cmux ssh (manaflow-ai#14204) 03d3759 test: repair the app-host suites that fail only on macOS 26 (manaflow-ai#13988)
…14243) Reverts the owned-Mac nightly route (#14208, #14223, #14233). There is no separate nightly lane or fallback: nightlies build on Blacksmith until Glaeda routing (glaeda#1174) sends every job std > light > Blacksmith > GitHub-hosted. nightly.yml is back to its pre-lane Blacksmith path, keeping the later nightly Sparkle key change (#14215). Signing, notarization and publication are unchanged. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Slice 1 of #14207.
Lawrence asked on 2026-09-24 for dev builds, nightlies and CI/CD to run on the Mac minis and spill over to Blacksmith. This PR does that for the nightly's biggest job, the universal app compile. The design follows the persistent compile lane that is already merged: the mini builds, and a hosted job decides whether to use what it built.
It changes nothing until a maintainer sets
NIGHTLY_MAC_MINI. While the variable is unset, the route job does not run andbuild-nightly-appbehaves as it does today.What moves
nightly-mini-build.yml(new)permissions: {}, no secrets.git fetch(noactions/checkout), and refuses a commit that is not on the ref it was dispatched from.build-nightly-app. Its persistentbuild-universal/directory serves as the cache.cmux-nightly-mini, labels[self-hosted, macOS, ARM64, cmux-nightly-mini-build]. The label avoids the bare wordnightly, which the HQ build-fleet controller reserves as a tag.macos-26.route-nightly-miniinnightly.ymlscripts/ci/nightly_mini_route.py, which reuses the wait and cancel code inpersistent_mac_route.py.NIGHTLY_MAC_MINI_QUEUE_SECONDS(300) for a mini to pick it up and up toNIGHTLY_MAC_MINI_EXECUTION_SECONDS(2700) for the build, then copies the products into this run.build-nightly-appAdopt owned-Mac productsstep uses the products only if the source SHA, the tree, the fullxcodebuild -versionand the archs all match. Otherwise it compiles hosted.MACOS_RUNNER_26instead of the 12 vCPU machine.!cancelled(), so a failed route job changes nothing.check_nightly_mini_lane: the producer must be dispatch-only, credential-free and on the exact runner line, the sign and publish jobs must not reference it, and the adoption checks must be present.check_no_self_hosted_fleet_runnersgains one exact-line exemption, andcmux-nightly-minijoins its fleet regex, so no other file can name the group.docs/ci/mac-fleet.md, plus updates toci-runners.mdandCLAUDE.md.NIGHTLY_MAC_MINIvaluesbuild-onlybuild_onlyruns try a mini firstallA manual
build_onlydispatch can also passmac_mini: true.What does not move, and why
allis a trust decision for Leo and Manaflow, not a routing one. Setting it means Developer ID signs bits compiled on a persistent machine that keeps warm state between runs. The adoption check proves which commit and toolchain the producer reports; it does not prove the warm state was clean.build-onlyships nothing and is safe as soon as the runner exists.release.ymland the Iroh release gate are untouched.Before anything runs on a mini (org admin)
cmux-nightly-mini, restricted tomanaflow-ai/cmux/.github/workflows/nightly-mini-build.yml@refs/heads/main.CMUX_CI_XCODE_APP_MACOS_26.glaeda-mini, which is the wrong label for this group.scripts/persistent-compile upregisters the compile lane's labels, not these.gh variable set NIGHTLY_MAC_MINI -b build-only, then dispatchnightly.ymlwithbuild_only. Read the "Nightly owned-Mac route" summary.gh variable delete NIGHTLY_MAC_MINI.Validation
tests/test_ci_self_hosted_guard.shpasses. It fails when the producer's runner line drifts; I checked that by editing the label.tests/test_nightly_mini_route.pycovers eligibility, queue timeout with cancel, producer failure, overrun, missing artifact, success and an unobservable dispatch. All 11 cases pass.test_ci_change_areas,test_ci_persistent_mac_compile,test_runner_label_policy,test_ci_workflow_guards_are_wired,actionlintandscripts/verify-local.pyall pass.routing_error.🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.Summary by cubic
Runs the nightly app compile on an owned Mac mini first, with Blacksmith as automatic fallback. Dark by default: nothing changes until a maintainer sets
NIGHTLY_MAC_MINI, whose values admit only unsignedbuild_onlyruns (build-only) or also published nightlies (all).nightly-mini-build.ymlfetches public source without checkout credentials and builds the unsigned universal app, keeping warm state across runs. It rebuilds Products each run so stale resources or dSYMs cannot ship.route-nightly-minidispatches it, waits bounded queue and execution times, and cancels and reports a fallback reason on timeout, overrun, failure or missing artifact. A dispatch the listing shows late is found and cancelled rather than left holding a mini.build-nightly-appadopts the products only when source SHA, tree,xcodebuild -version, macOS SDK and archs all match; otherwise it compiles hosted exactly as before, as does any other route outcome. Re-home steps continue on error and a non-numeric budget falls back.!cancelled()and explicit results so a skipped route cannot stop them, andcheck_nightly_mini_laneplus the updated universal build contract test enforce that shape.Migration
cmux-nightly-mini, restricted tonightly-mini-build.ymlonmain, registers one M4 Pro mini withcmux-nightly-mini-build, then setsNIGHTLY_MAC_MINItobuild-only.allis a trust decision for maintainers, not addressed by this change: it means Developer ID signs bits compiled on a machine with warm state across runs. Rollback isgh variable delete NIGHTLY_MAC_MINI.Written for commit 648e754. Summary will update on new commits.
Summary by CodeRabbit