Skip to content

ci: let the pre-merge Release check compile arm64 only - #13195

Merged
teamleaderleo merged 4 commits into
mainfrom
ci-pr-release-arm64
Sep 20, 2026
Merged

teamleaderleo merged 4 commits into
mainfrom
ci-pr-release-arm64

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Sep 20, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

The pre-merge release-build job compiles the app target as one whole module per architecture. Any change to app code recompiles both slices, so the compilation cache saves little there: measured on Warp today, 27.9 min cold, 21.7 min warm with app code changed, 4 min warm with it unchanged. Of the 21.7, the x86_64 whole-module compile is about 10.5 min.

This adds an opt-in to compile arm64 only in that check:

  • scripts/ci/release-build-archs.sh resolves universal (default, also when unset) or arm64, and rejects anything else.
  • release-build reads vars.CI_RELEASE_BUILD_ARCHS, or the new release_archs dispatch input, and passes the result to ARCHS and to the slice checks. The prebuilt Ghostty helper and TUI client are still verified universal in both modes.
  • Nothing changes until a maintainer sets the variable. nightly.yml and release.yml never read it, and tests/test_ci_release_build_archs.sh fails if nightly ever does.

Trade-off for maintainers

With arm64, a compile error that only exists in the x86_64 slice passes the merge queue and is caught by the nightly build on that main revision instead. Swift code here is not architecture specific and GhosttyKit is prebuilt, so this should be rare, but it moves that one failure class from before merge to after it. To turn it on:

gh variable set CI_RELEASE_BUILD_ARCHS --repo manaflow-ai/cmux --body arm64

Testing

  • tests/test_ci_release_build_archs.sh (new, wired into workflow-guard-tests)
  • actionlint, tests/test_ci_self_hosted_guard.sh, tests/test_nightly_universal_build.sh, tests/test_ci_change_areas.py, tests/test_ci_pull_request_caches_are_read_only.py pass locally
  • A workflow_dispatch run of this branch with release_archs=arm64 measures the real job; result will be added as a comment.

Issues

🤖 Generated with Claude Code


Summary by cubic

Adds an opt-in that lets the pre-merge Release check compile arm64 only, dropping the Intel slice that dominates the job's build time. Unset or universal keeps today's universal build; with arm64, an Intel-only compile break is caught by the nightly build after merge instead of before. Slice verification now checks built binaries for exactly the resolved architectures, so a universal binary can't pass an arm64-only check.

Migration

  • Set CI_RELEASE_BUILD_ARCHS=arm64, or pass release_archs=arm64 to a workflow_dispatch run, to enable it.
  • The prebuilt helper is still verified universal in both modes.

Related to #13182.

Written for commit c04551a. Summary will update on new commits.

Review in cubic

The Release check compiles the app target as one whole module per
architecture, so any app change recompiles both slices and the compilation
cache cannot help. The Intel slice is the largest single cost in that job.

CI_RELEASE_BUILD_ARCHS=arm64 (or the release_archs dispatch input) drops
the Intel compile from this check. Unset keeps today's universal build.
Nightly never reads the option, so what ships stays universal and an
Intel-only compile break is caught there after merge.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Sep 20, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 3 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 10 included reviews currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Repository: manaflow-ai/cmux/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 31ab2d4d-dab1-4b03-837e-2bc38b5798ad

📥 Commits

Reviewing files that changed from the base of the PR and between f48ef36 and c04551a.

📒 Files selected for processing (5)
  • .github/workflows/ci.yml
  • scripts/ci/release-build-archs.sh
  • scripts/ci/verify-binary-archs.sh
  • tests/test_ci_release_build_archs.sh
  • tests/test_ci_self_hosted_guard.sh

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

@greptile-apps

greptile-apps Bot commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

The PR appears safe to merge; the prior slice-validation concern is fixed and no new actionable issue remains.

Summary

The PR adds an opt-in arm64-only mode for the pre-merge Release build while retaining universal builds by default and in nightly workflows.

  • Resolves the requested architecture through a fail-closed allowlist.
  • Passes the resolved architecture to Xcode and architecture-sensitive artifact checks.
  • Keeps downloaded helper artifacts universal.
  • Verifies exact slice sets so universal artifacts cannot accidentally satisfy arm64-only checks.
  • Adds workflow guard coverage for defaults, rejected values, exact verification, and nightly isolation.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[workflow_dispatch input or repository variable] --> B[release-build-archs.sh]
  B -->|unset, default, universal| C[arm64 and x86_64]
  B -->|arm64| D[arm64 only]
  B -->|unsupported value| E[Fail Release check]
  C --> F[Xcode Release build]
  D --> F
  F --> G[verify-binary-archs.sh]
  G --> H[Require exact app, CLI, and cmux-cua slices]
  F --> I[Keep prebuilt helper and TUI client universal]
  J[Nightly workflow] --> K[Always build universal artifact]
Loading

Reviews (3) · Last reviewed commit: "Merge main into ci-pr-release-arm64"

Comment thread .github/workflows/ci.yml Outdated
teamleaderleo and others added 3 commits September 20, 2026 03:21
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
verify_arch only proves a slice is present, so in arm64 mode a universal
binary passed and a change that brought the Intel compile back would go
unnoticed. Compare each built binary's full slice list instead, the way the
diff sidecar verifier already does.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@cursor

cursor Bot commented Sep 20, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot 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.

@teamleaderleo
teamleaderleo enabled auto-merge (squash) September 20, 2026 10:32
@teamleaderleo
teamleaderleo merged commit 7c3574a into main Sep 20, 2026
74 of 84 checks passed
rustybret pushed a commit to rustybret/bmux that referenced this pull request Sep 20, 2026
4b18fc9 ci: track package test helper inputs (manaflow-ai#13188)
b210493 Merge pull request manaflow-ai#13181 from manaflow-ai/ci-focused-app-host-tests
ced163c Merge pull request manaflow-ai#13180 from manaflow-ai/ci/remote-tmux-crash-diagnostics
9faf726 Merge pull request manaflow-ai#13178 from manaflow-ai/ci-reject-incomplete-test-runs
14c3ca1 Merge pull request manaflow-ai#13166 from manaflow-ai/ci-reuse-build-for-runtime-regressions
7c3574a ci: let the pre-merge Release check compile arm64 only (manaflow-ai#13195)
887839a ci: drop a stalled GhosttyKit download and resume it (manaflow-ai#13197)
70a244d Merge pull request manaflow-ai#13177 from manaflow-ai/ci-fast-static-preflight
fcad43f build: read Xcode projects with Foundation and drop XcodeProj and PathKit (manaflow-ai#13111)
76d80b1 ci: skip Release and its helper for test-only pull requests (manaflow-ai#13122)
fdc63e9 Merge pull request manaflow-ai#13176 from manaflow-ai/ci-reuse-queue-build-products
3162fee test: split an expression Xcode 27 cannot type-check (manaflow-ai#13126)
d10aa64 test: use consistent XCTest imports to stop compiler diagnostic flood (manaflow-ai#13163)
1b69bf9 test: stop real-Git reftable tests depending on a 2s wall clock (manaflow-ai#13186)
cad333b Merge origin/main into ci-fast-static-preflight
7522486 Merge origin/main into ci-reuse-build-for-runtime-regressions
43210e1 Bound automatic terminal titles before session persistence (manaflow-ai#13009)
674a0db ci: retire Depot macOS runners (manaflow-ai#13162)
f48ef36 Merge pull request manaflow-ai#13183 from manaflow-ai/ci-early-cli-smoke
ebbb17f ci: skip app-host teardown when setup never started (manaflow-ai#13179)
5fb6d8c Merge pull request manaflow-ai#13168 from manaflow-ai/ci-cache-r2-store
a348064 ci: skip compile admission when an earlier run compiled the same build inputs (manaflow-ai#13139)
88e102c reload: let a reused checkout keep one warm DerivedData across tags (manaflow-ai#13131)
7a049e9 Merge origin/main into ci-reuse-build-for-runtime-regressions
cd05c6e Merge origin/main into ci-fast-static-preflight
5cf41fa Merge origin/main into ci-reuse-queue-build-products
5a6322e test: guard early CLI smoke ordering
0438552 fix: pass R2 public URL through workflow environment
0716c59 test: bound app-host replay subprocesses
2e0b9b5 ci: terminate cancelled focused discovery
14bbad4 ci: keep R2 public URL configuration inside the cache actions
e342c67 ci: make focused run discovery cancellable
cf3984b test: avoid hard timeout in app-host classifier replay
251b050 ci: allow privileged crash report collection
7d9a7f2 Merge main after landing cache backend and suite policy
b6853ee ci: allow manual cache-only seeding for R2 rollout
81d3026 test: require manual cache seeding to skip app publication
6980f8e ci: harden remote tmux diagnostics collection
c24d77f ci: publish R2 cache pointers conditionally and repair failed writes
2432805 test: cover R2 pointer repair and out-of-order saves
4779d01 ci: continue past unusable build artifact candidates
9dd1579 test: reproduce corrupt candidate blocking product reuse
bfb43f5 ci: check CLI version and help before app-host fan-out
f2b0fae docs: use an existing suite in focused launcher example
2c04b6a ci: drain tar streams portably with BSD tar
c5e1d59 ci: pin focused tests to a commit and track the requested run
1a44bde ci: consume tar padding when restoring zstd caches
31d4fd9 test: cover padded R2 archives on macOS
a46567a ci: isolate R2 cache writes from release credentials
ce26a8e test: require early CLI smoke gate to propagate probe failures
18a67fb test: reproduce focused launcher revision and run attribution bugs
4dd543e test: require cache-only R2 credentials for cache saves
2c8412c ci: make product reuse attempt-safe and bound archive expansion
59fb526 ci: preserve remote tmux mirror crash diagnostics
d8107e4 test: cover artifact reruns, expansion limits and producer source checks
28a03e3 ci: reject interrupted app-host runs despite later passing summaries
302551d test: reproduce false-green app-host timeout and restart runs
bc3a63a ci: reject invalid static inputs before expensive validation
baf65d9 test: require successful static preflight before macOS admission
6cea5f0 ci: fall back when build identity cannot be established
7632c7e ci: reuse compatible compiled products in merge groups
8be0c54 ci: add an R2 bucket as a cache store every runner can read
25f50c3 test: behaviour of an R2-backed cache store script
17c2498 ci: reuse compiled app and UI products for runtime regressions
6ed96f4 test: require UI products in the shared CI build artifact
230ad52 ci: drop a timeout note about a DerivedData cache that no longer exists
b5ec5cc ci: stop restoring DerivedData in pull request jobs
a42ad38 Merge remote-tracking branch 'origin/main' into ci-cache-backend-switch
477fb0f ci: choose the cache store per dispatched run, and cover the nightly app build
03363d7 ci: let a repository variable move the seeded caches to the Warp store
f791f87 ci: pull request jobs restore caches and never save them
5b65bb1 test: pull request jobs must restore caches read-only
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant