Skip to content

ci: route all macOS runners through Blacksmith - #6650

Merged
lawrencecchen merged 3 commits into
mainfrom
feat-ci-macos-blacksmith
Jun 23, 2026
Merged

lawrencecchen merged 3 commits into
mainfrom
feat-ci-macos-blacksmith

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Jun 23, 2026 •

Copy link
Copy Markdown
Contributor

What

Completes the macOS CI migration to Blacksmith. Linux + most macOS already route through Blacksmith via repo vars; this removes the last Warp/Depot holdouts.

  • app-host-unit-tests: drop the hardcoded warp-macos-15-arm64-6x pin, route via MACOS_RUNNER_15 (already Blacksmith).
  • perf-activation: PRs no longer force depot-macos-latest; use the MACOS_RUNNER_15 var like every other macOS job.
  • Flip every workflow fallback default off Warp (warp-macos-15-arm64-6x → blacksmith-6vcpu-macos-15, warp-ubuntu-latest-x64-4x → blacksmith-4vcpu-ubuntu-2404). Warp/Depot remain as manual workflow_dispatch options for one-off overrides.
  • Flip the MACOS_RUNNER_DISPLAY fallback default to Blacksmith. The repo var flip that actually moves ui-regressions + tests-build-and-lag lands separately, once their head-to-head is green.

Validation

Ran the real cmux app-host unit suite head-to-head on warp-macos-15-arm64-6x vs blacksmith-6vcpu-macos-15 (shards 1 + 4). All green; Blacksmith executed the full suite with 0 unexpected failures and zero Failed to activate / Running Background errors, identical to Warp.

Controlled GUI probes also confirmed: CGVirtualDisplay creation works on Blacksmith (1920×1080@60Hz), and Blacksmith matches Warp on every GUI axis tested (only GitHub-hosted runners have a true foreground session, which neither Warp nor Blacksmith uses for these jobs).

Rollout

  1. Merge this PR (moves app-host + Linux/macOS fallbacks; display jobs still route to Warp via the unchanged MACOS_RUNNER_DISPLAY var).
  2. After the display-job head-to-head is green, set repo var MACOS_RUNNER_DISPLAY=blacksmith-6vcpu-macos-15 to move ui-regressions + tests-build-and-lag.

Rollback for any job is a one-line repo-var change (no revert needed).

🤖 Generated with Claude Code


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Note

Medium Risk
Touches every CI job’s runner resolution (including GUI XCTest and signing lanes); mis-routing could break required checks, but overrides stay on repo vars and manual dispatch options.

Overview
Completes the CI runner migration by making Blacksmith the fallback when repo variables (LINUX_RUNNER, MACOS_RUNNER_15, MACOS_RUNNER_DISPLAY) are unset: Linux jobs move from warp-ubuntu-latest-x64-4x to blacksmith-4vcpu-ubuntu-2404, and macOS jobs from warp-macos-15-arm64-6x to blacksmith-6vcpu-macos-15 across ci.yml, release/nightly, E2E, fuzz, and related workflows.

app-host-unit-tests no longer hardcodes Warp; it uses MACOS_RUNNER_15 like the other macOS gates. perf-activation stops forcing depot-macos-latest on pull requests—auto mode follows MACOS_RUNNER_15 (Depot remains a manual workflow_dispatch override). Display-heavy jobs (ui-regressions, tests-build-and-lag) get the same Blacksmith fallback in YAML; live routing still follows the MACOS_RUNNER_DISPLAY repo var until that is flipped separately.

Guard tests (test_ci_change_areas.py, test_ci_release_sdk_lane.sh, test_ci_self_hosted_guard.sh) are updated to expect the new default labels.

Reviewed by Cursor Bugbot for commit 2cf8aa5. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Routes all macOS CI jobs and Linux fallbacks to Blacksmith by default, removing the last Warp/Depot pins. Manual overrides remain; app-host tests and GUI activation were validated on blacksmith-6vcpu-macos-15.

  • Refactors

    • Default fallbacks: Linux warp-ubuntu-latest-x64-4x → blacksmith-4vcpu-ubuntu-2404; macOS warp-macos-15-arm64-6x → blacksmith-6vcpu-macos-15 (includes MACOS_RUNNER_DISPLAY).
    • app-host-unit-tests now routes via MACOS_RUNNER_15; perf-activation and test-e2e stop forcing Depot/Warp and follow MACOS_RUNNER_15 (auto Blacksmith). Updated help text, cache keys, and concurrency to match.
    • Guard scripts and CI tests updated to assert the new Blacksmith fallbacks, including perf-activation benchmark routing.
  • Migration

    • No action needed for most jobs; they follow repo vars.
    • After display head-to-head is green, set MACOS_RUNNER_DISPLAY=blacksmith-6vcpu-macos-15 to move ui-regressions and tests-build-and-lag.

Written for commit 2cf8aa5. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Chores

    • Updated GitHub Actions runner defaults across CI/CD workflows to use the newer Linux and macOS 15 environments (Blacksmith pools) instead of the previous Warp runner labels, while keeping existing override variables intact.
    • Aligned related runner resolution details (e.g., benchmark selection, cache identity, concurrency naming, and validation logic) with the new defaults.
  • Tests

    • Updated CI/release lane checks and self-hosted guard expectations to match the new macOS 15 default runner labels.

Validated head-to-head (warp-macos-15 vs blacksmith-6vcpu-macos-15) that the
real app-host unit suite passes on Blacksmith with 0 unexpected failures and no
'Running Background' activation errors. CGVirtualDisplay creation also works on
Blacksmith. Blacksmith macOS is functionally equivalent to Warp on every GUI
axis tested.

- app-host-unit-tests: drop the hardcoded warp-macos-15 pin, route via
  MACOS_RUNNER_15 (already Blacksmith).
- perf-activation: PRs no longer force depot-macos-latest; use MACOS_RUNNER_15.
- Flip every workflow fallback default off warp (warp-macos-15-arm64-6x ->
  blacksmith-6vcpu-macos-15, warp-ubuntu-latest-x64-4x ->
  blacksmith-4vcpu-ubuntu-2404). Warp/Depot stay as manual workflow_dispatch
  options.
- Display-job default (MACOS_RUNNER_DISPLAY fallback) flipped to Blacksmith;
  the repo var flip to actually move ui-regressions + tests-build-and-lag lands
  separately once their head-to-head is green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 23, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Canceled Canceled Jun 23, 2026 4:53am
cmux-staging Building Building Preview, Comment Jun 23, 2026 4:53am

@coderabbitai

coderabbitai Bot commented Jun 23, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

All GitHub Actions workflow files replace warp-ubuntu-latest-x64-4x and warp-macos-15-arm64-6x default runner labels with blacksmith-4vcpu-ubuntu-2404 and blacksmith-6vcpu-macos-15 respectively. Existing vars.LINUX_RUNNER and vars.MACOS_RUNNER_15 override variables are preserved. A subset of workflows additionally update Depot runner validation guards, run-name expressions, concurrency group values, and Swift package cache keys to reflect the new defaults.

Changes

Runner Migration: warp → blacksmith

Layer / File(s) Summary
Straightforward runs-on label replacements
.github/workflows/build-ghosttykit.yml, .github/workflows/ci-macos-compat.yml, .github/workflows/ci.yml, .github/workflows/claude.yml, .github/workflows/cloud-vm-migrate.yml, .github/workflows/cloud-vm-smoke.yml, .github/workflows/ios-testflight.yml, .github/workflows/nightly.yml, .github/workflows/perf-activation.yml, .github/workflows/presence.yml, .github/workflows/release.yml, .github/workflows/test-depot.yml, .github/workflows/test-e2e.yml, .github/workflows/test-ios.yml, .github/workflows/tmux-corpus.yml, .github/workflows/update-homebrew.yml
Single-line runs-on fallback values changed from warp-ubuntu-latest-x64-4x → blacksmith-4vcpu-ubuntu-2404 (Linux jobs) and warp-macos-15-arm64-6x → blacksmith-6vcpu-macos-15 (macOS jobs) across all affected workflows, with vars.* override behavior preserved.
Runner resolver expressions, Depot guards, and cache key updates
.github/workflows/ci.yml, .github/workflows/perf-activation.yml, .github/workflows/test-e2e.yml
Multi-expression runner resolution blocks (display/UI regression jobs, activation benchmark, E2E) update runs-on selectors, Depot validation step if conditions, REQUESTED_RUNNER env values, run-name/concurrency group expressions, and Swift package cache key/restore-keys to reference blacksmith-6vcpu-macos-15 as the new default.
Test assertions for runner labels
tests/test_ci_release_sdk_lane.sh, tests/test_ci_self_hosted_guard.sh, tests/test_ci_change_areas.py
Test files validate that workflows contain the expected blacksmith-6vcpu-macos-15 runner labels and self-hosted Depot guard logic by asserting on the new default runner names.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • manaflow-ai/cmux#6408: Modifies the same runs-on runner-label expressions across multiple workflows to route jobs through Blacksmith-based defaults, directly overlapping with this PR's migration.
  • manaflow-ai/cmux#4902: Part of the same macOS runner migration, modifying the same workflows to switch from warp-macos-* defaults to blacksmith-* runners.
  • manaflow-ai/cmux#6423: Updates GitHub Actions runs-on defaults away from warp-macos-15-arm64-6x to blacksmith-6vcpu-macos-15 and modifies tests/test_ci_self_hosted_guard.sh to keep runner routing validation consistent with Blacksmith labels.

Poem

🐇 Hop, hop, from warp to black!
The runners have switched their track.
No more warp-arm in the queue,
Blacksmith runners, shiny and new.
Each workflow file, neat and aligned —
A faster forge for every build signed! ✨

🚥 Pre-merge checks | ✅ 22 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (22 passed)
Check name Status Explanation
Title check ✅ Passed The title 'ci: route all macOS runners through Blacksmith' directly and clearly summarizes the main objective of the PR: migrating macOS CI jobs to use Blacksmith runners by default.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed PR contains no Swift source code changes—only GitHub Actions workflow YAML and CI test script updates. Custom check for Swift actor isolation is not applicable.
Cmux Swift Blocking Runtime ✅ Passed PR contains no Swift production code changes—only CI workflow YAML, shell scripts, and Python test infrastructure. Custom check for blocking Swift runtime patterns is not applicable.
Cmux Expensive Synchronous Load ✅ Passed PR contains only CI/workflow YAML and test script changes; zero Swift source code modifications. Check applies only to "production Swift changes"—not applicable here.
Cmux Cache Substitution Correctness ✅ Passed This PR contains only CI infrastructure changes (GitHub Actions workflows and CI test scripts) with no production Swift, TypeScript, or JavaScript code changes. The cache substitution correctness c...
Cmux No Hacky Sleeps ✅ Passed PR changes only GitHub Actions workflow YAML runner labels (out of scope per rule) and test assertions (allowed deterministic test code); introduces no new sleeps, delays, or timing logic in produc...
Cmux Algorithmic Complexity ✅ Passed PR only modifies CI workflows and test infrastructure, not production code. Algorithmic complexity rule applies to production code iterating over scalable user collections; this PR has neither.
Cmux Swift Concurrency ✅ Passed This PR contains only GitHub Actions workflow YAML files, shell scripts, and Python test utilities—no Swift source code (.swift files). The check is not applicable; it requires modifications to cmu...
Cmux Swift @Concurrent ✅ Passed This PR contains no Swift code changes—only GitHub Actions workflows, shell scripts, and Python test files. The Swift @concurrent annotation check is not applicable.
Cmux Swift File And Package Boundaries ✅ Passed This PR contains zero Swift file changes—only GitHub Actions workflows (.yml), shell scripts (.sh), and Python test scripts (.py). The custom check applies to production Swift files in Sources, CLI...
Cmux Swiftpm Lockfiles ✅ Passed PR only modifies workflow runner configuration and test assertions; contains no SwiftPM package, Xcode project, .gitignore, or dependency changes, so the SwiftPM lockfile rule is not applicable.
Cmux Swift Logging ✅ Passed PR contains only GitHub Actions workflow YAML and test infrastructure changes; no Swift source code modifications exist, so Swift logging rules do not apply.
Cmux User-Facing Error Privacy ✅ Passed PR changes CI configuration and test files; vendor names (Blacksmith, Warp, Depot) appear only in workflow_dispatch input descriptions where users explicitly select runner vendors, which is allowed...
Cmux Full Internationalization ✅ Passed PR modifies only CI workflows and test scripts—operational infrastructure not shown to end users. No user-facing text, string catalogs, or localization changes present.
Cmux Swiftui State Layout ✅ Passed PR modifies only CI workflows and test scripts; no SwiftUI code changes detected, making this check not applicable.
Cmux Architecture Rethink ✅ Passed PR modifies only CI workflow YAML and test scripts; no Swift source code changes. Rule applies to Swift architectural changes, which this PR does not contain.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR contains only CI configuration changes (YAML workflows, shell/Python test scripts) with no Swift code modifications. The auxiliary window close shortcuts rule does not apply to non-Swift changes.
Cmux Source Artifacts ✅ Passed All 19 changed files are hand-written configuration (workflow YAML) and test scripts (.sh, .py). No local tool output, generated logs, caches, build artifacts, or scratch directories present.
Cmux No Test Or Debug Seam In Production Source ✅ Passed This PR only modifies GitHub Actions workflow YAML files and CI test scripts; it makes no changes to Swift source files under Sources/ directories, so the test/debug seam check does not apply.
Description check ✅ Passed The PR description is comprehensive, providing detailed context about the migration from Warp/Depot to Blacksmith runners, validation results, and phased rollout plan.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat-ci-macos-blacksmith

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.

Comment thread .github/workflows/test-e2e.yml
@greptile-apps

greptile-apps Bot commented Jun 23, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR completes the macOS CI migration to Blacksmith by flipping all fallback default runner labels from warp-* / depot-* to blacksmith-*, removing the last hardcoded Warp/Depot pins. No production application code is touched.

  • Linux jobs across ci.yml, claude.yml, cloud-vm-*, presence.yml, nightly.yml, ios-testflight.yml, tmux-corpus.yml, update-homebrew.yml, and test-ios.yml now fall back to blacksmith-4vcpu-ubuntu-2404 instead of warp-ubuntu-latest-x64-4x.
  • macOS jobs (app-host-unit-tests, swift-package-tests, tests-build-and-lag, ui-regressions, release.yml, build-ghosttykit.yml, nightly.yml, test-depot.yml, tmux-corpus.yml) now fall back to blacksmith-6vcpu-macos-15; the MACOS_RUNNER_DISPLAY default is also flipped (the repo var itself is left unchanged for a separate step).
  • perf-activation drops the PR-forced depot-macos-latest override; auto mode follows MACOS_RUNNER_15 like all other macOS jobs. SPM cache keys in test-e2e.yml and perf-activation.yml are updated to reflect the new default runner, so existing Warp-keyed caches will be orphaned on the first run.

Confidence Score: 5/5

Safe to merge — all changes are CI runner label defaults with no impact on application code; rollback for any job is a one-line repo-var change.

Every change is a mechanical substitution of a runner fallback string. The app-host and display-job migrations were validated head-to-head before this PR. Guard tests in tests/ are updated to match. The MACOS_RUNNER_DISPLAY repo var is intentionally left unchanged so display-heavy jobs continue to route to Warp until the separate head-to-head is complete.

No files require special attention.

Important Files Changed

Filename Overview
.github/workflows/ci.yml All Linux fallbacks flipped to blacksmith-4vcpu-ubuntu-2404; app-host-unit-tests drops the hardcoded warp pin and routes via MACOS_RUNNER_15; tests-build-and-lag and ui-regressions MACOS_RUNNER_DISPLAY default updated — all changes are mechanical and consistent.
.github/workflows/perf-activation.yml Removes the PR-event forced depot-macos-latest override; activation-session-benchmark now always follows MACOS_RUNNER_15 (Blacksmith default). Cache key expression updated to match. The Depot identity validation step is correctly preserved for manual depot-* overrides.
.github/workflows/test-e2e.yml run-name, concurrency group, cache keys, and runner description updated to replace warp default with blacksmith. All six expression sites updated consistently.
tests/test_ci_change_areas.py Assertion updated from checking for depot-macos-latest to checking for vars.MACOS_RUNNER_15, correctly reflecting the perf-activation routing change.
tests/test_ci_release_sdk_lane.sh Both release.yml and ci.yml release-ghostty-cli-helper assertions updated from warp to blacksmith fallback label.
tests/test_ci_self_hosted_guard.sh E2E runner fallback string check updated from warp to blacksmith; the Depot identity validation path string is correctly updated to match.
.github/workflows/nightly.yml Both the decide (Linux) job and the nightly signing/helper build (macOS) jobs updated to new Blacksmith defaults.
.github/workflows/release.yml build-ghostty-cli-helper macOS runner default flipped to blacksmith-6vcpu-macos-15; consistent with ci.yml release-ghostty-cli-helper change.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Job Runner Selection] --> B{vars.LINUX_RUNNER set?}
    B -- Yes --> C[Use LINUX_RUNNER var]
    B -- No --> D[blacksmith-4vcpu-ubuntu-2404]

    A --> E{vars.MACOS_RUNNER_15 set?}
    E -- Yes --> F[Use MACOS_RUNNER_15 var]
    E -- No --> G[blacksmith-6vcpu-macos-15]

    A --> H{vars.MACOS_RUNNER_DISPLAY set?}
    H -- Yes --> I[Use MACOS_RUNNER_DISPLAY var]
    H -- No --> J[blacksmith-6vcpu-macos-15]

    A --> K[perf-activation benchmark]
    K --> L{inputs.runner auto/unset?}
    L -- Yes --> E
    L -- No --> M[Use inputs.runner override]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[Job Runner Selection] --> B{vars.LINUX_RUNNER set?}
    B -- Yes --> C[Use LINUX_RUNNER var]
    B -- No --> D[blacksmith-4vcpu-ubuntu-2404]

    A --> E{vars.MACOS_RUNNER_15 set?}
    E -- Yes --> F[Use MACOS_RUNNER_15 var]
    E -- No --> G[blacksmith-6vcpu-macos-15]

    A --> H{vars.MACOS_RUNNER_DISPLAY set?}
    H -- Yes --> I[Use MACOS_RUNNER_DISPLAY var]
    H -- No --> J[blacksmith-6vcpu-macos-15]

    A --> K[perf-activation benchmark]
    K --> L{inputs.runner auto/unset?}
    L -- Yes --> E
    L -- No --> M[Use inputs.runner override]
Loading

Reviews (3): Last reviewed commit: "test: perf-activation benchmark routes v..." | Re-trigger Greptile

test_ci_self_hosted_guard.sh and test_ci_release_sdk_lane.sh pinned the exact
warp-macos-15-arm64-6x fallback string; update to blacksmith-6vcpu-macos-15 to
match the flipped workflow defaults. Warp stays in the self-hosted guard's
allowed-label set and self-test fixtures.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2957d14. Configure here.

Comment thread .github/workflows/perf-activation.yml
…, on PRs

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@lawrencecchen
lawrencecchen merged commit 653d06b into main Jun 23, 2026
40 checks passed
@lawrencecchen
lawrencecchen deleted the feat-ci-macos-blacksmith branch June 23, 2026 05:25
@lawrencecchen
lawrencecchen restored the feat-ci-macos-blacksmith branch July 18, 2026 10:17

This branch was successfully deployed

1 active deployment
Preview – cmux — 2cf8aa54 Deployed Jun 23, 2026 by vercel[bot]
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.

2 participants