Skip to content

Migrate macOS CI/CD runners to Blacksmith - #4902

Merged
lawrencecchen merged 5 commits into
mainfrom
feat-blacksmith-macos-runners
May 28, 2026
Merged

lawrencecchen merged 5 commits into
mainfrom
feat-blacksmith-macos-runners

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented May 27, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Switches every macOS CI job from WarpBuild (warp-macos-*-arm64-6x) and Depot (depot-macos-latest) to Blacksmith (blacksmith-6vcpu-macos-{15,26,latest}).

Workflows touched

  • ci.yml — tests, tests-build-and-lag, release-build, ui-regressions
  • build-ghosttykit.yml
  • ci-macos-compat.yml (matrix os values)
  • nightly.yml (build-sign-notarize-nightly)
  • release.yml (build-sign-notarize)
  • test-depot.yml
  • perf-activation.yml (default + choice options)
  • tmux-corpus.yml (terminal-nightly; also drops the self-hosted label)
  • test-e2e.yml (default blacksmith-6vcpu-macos-latest, keeps depot-macos-{latest,14} as fallback options on the workflow_dispatch input)

tests/test_ci_self_hosted_guard.sh updated to assert Blacksmith runners on the paid jobs from #385.

Size mapping is 1:1: every 6x WarpBuild job becomes a 6vcpu Blacksmith job. macOS 15 vs 26 preserved per job.

Test plan

  • Re-run tests/test_ci_self_hosted_guard.sh (passes locally)
  • Manually trigger ci-macos-compat.yml to confirm both Blacksmith images boot
  • Trigger nightly.yml with force=true and confirm sign+notarize completes
  • Trigger test-e2e.yml with the new default runner
  • Verify a release.yml dry run (or next real release) on blacksmith-6vcpu-macos-26

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


Note

Medium Risk
Touches signing/notarization, release, and nightly pipelines plus GUI perf benchmarks; misconfigured runners or the Aqua-session workaround could break macOS CI or artifact publishing until validated on Blacksmith.

Overview
Moves macOS CI/CD off WarpBuild (warp-macos-*-arm64-6x) and Depot defaults onto Blacksmith labels (blacksmith-6vcpu-macos-15, -26, -latest) across build, test, release, nightly, perf, e2e, and corpus workflows, with a 1:1 mapping from former 6x Warp jobs to 6vcpu Blacksmith jobs.

Adds .github/actionlint.yaml so actionlint accepts the new self-hosted runner labels. tests/test_ci_self_hosted_guard.sh now requires Blacksmith runners on the paid macOS jobs from issue #385 (including matrix os in compat).

perf-activation.yml changes defaults and workflow_dispatch runner choices to Blacksmith, scopes SwiftPM cache keys by runner, and runs the Cmd-Tab visibility bench inside the console user’s Aqua session via launchctl asuser so CGWindowList sees on-screen windows. test-e2e.yml defaults to Blacksmith while keeping Depot as optional dispatch choices; SPM cache keys follow the selected runner. tmux-corpus.yml terminal-nightly drops the self-hosted + Warp label pair in favor of a single Blacksmith runner.

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

Summary by CodeRabbit

  • Chores

    • Standardized macOS runners to Blacksmith across CI/CD, nightly, release, build, perf, and E2E workflows.
    • Updated activation/performance and E2E workflow runner defaults and expanded available runner choices.
    • Adjusted Swift package caching and activation benchmark invocation to work with the new runner setup.
    • Added ActionLint config to recognize Blacksmith runner labels.
  • Tests

    • Updated CI guard to enforce Blacksmith macOS runners for relevant workflows.

Review Change Stack

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@vercel

vercel Bot commented May 27, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment May 28, 2026 1:18am
cmux-staging Building Building Preview, Comment May 28, 2026 1:18am

@coderabbitai

coderabbitai Bot commented May 27, 2026 •

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 59bdcc57-db95-4458-afec-5820f8a727fe

📥 Commits

Reviewing files that changed from the base of the PR and between 7405c27 and a61c666.

📒 Files selected for processing (1)
  • tests/test_ci_self_hosted_guard.sh

📝 Walkthrough

Walkthrough

This PR migrates GitHub Actions workflows, the ActionLint config, and the CI guard from WarpBuild/Depot runner labels to Blacksmith macOS runner labels and changes the perf-activation benchmark to run under the console user's Aqua session.

Changes

Blacksmith runner migration

Layer / File(s) Summary
Core CI workflow jobs
ci.yml
The tests, tests-build-and-lag, release-build, and ui-regressions jobs updated to use blacksmith-6vcpu-macos-15 or blacksmith-6vcpu-macos-26 runners instead of corresponding warp-macos-* runners.
Single-runner workflow updates
.github/workflows/build-ghosttykit.yml, .github/workflows/nightly.yml, .github/workflows/release.yml, .github/workflows/test-depot.yml, .github/workflows/tmux-corpus.yml
Each workflow's runs-on label changed to the appropriate blacksmith-6vcpu-macos-* runner; no other job logic altered.
Parameterized, matrix, and perf benchmark changes
.github/workflows/perf-activation.yml, .github/workflows/test-e2e.yml, .github/workflows/ci-macos-compat.yml
perf-activation and test-e2e default/choice inputs.runner and cache keys updated to Blacksmith; ci-macos-compat matrix includes Blacksmith entries; perf benchmark now re-enters the console user's Aqua session before running.
ActionLint configuration
.github/actionlint.yaml
Adds ActionLint config that declares allowed self-hosted-runner labels for Blacksmith macOS runners.
Runner validation guard test updates
tests/test_ci_self_hosted_guard.sh
Replaces check_warp_runner with check_blacksmith_runner that scans workflow runs-on/os fields for blacksmith-[0-9]+vcpu-macos- and validates multiple jobs.

🎯 3 (Moderate) | ⏱️ ~20 minutes

"🐰 From WarpBuild’s hills to Blacksmith’s forge so bright,
I hopped through YAML, changing runners by night,
Benchmarks now run where the console user sings,
I chased down paths and launched with sudo wings,
A carrot cheer for CI that now takes flight!"


Caution

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

  • Ignore

❌ Failed checks (1 error, 2 warnings)

Check name Status Explanation Resolution
Cmux Swift Blocking Runtime ❌ Error Production Swift code introduces 40+ Task.sleep calls in 8 files violating swift-blocking-runtime.md which forbids Task.sleep in shipped code. Replace Task.sleep with proper async signals: cancellation-aware timers, callbacks, or state transitions instead of timing-based synchronization.
Description check ⚠️ Warning The description covers the summary section well but lacks testing section and demo video section required by the template. The Testing section and Demo Video section are missing or incomplete. Add a completed Testing section documenting actual test results and add or explicitly note N/A for Demo Video section to fully comply with the template structure.
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 (15 passed)
Check name Status Explanation
Title check ✅ Passed The title directly and specifically summarizes the main change: migrating macOS CI/CD runners from WarpBuild/Depot to Blacksmith across multiple workflows.
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 makes no Swift source code changes—only CI/CD workflow YAML and Bash test files. Custom check is for production Swift changes; not applicable here.
Cmux No Hacky Sleeps ✅ Passed PR adds only test/CI infrastructure code with properly bounded polling (deadlines, attempt limits, completion conditions). Workflow YAML sleeps are intentionally out of scope per review rules.
Cmux Algorithmic Complexity ✅ Passed PR modifies only GitHub workflow YAML files and test scaffolding—no production code changes. Test script performs acceptable O(n) linear file scans. No algorithmic complexity violations.
Cmux Swift Concurrency ✅ Passed PR only modifies CI/CD workflows, actionlint config, and bash scripts—no Swift code files are changed or added, so no legacy async patterns can be introduced in cmux Swift code.
Cmux Swift @Concurrent ✅ Passed PR makes no material Swift source code changes; all changes are to CI workflow files, bash scripts, and configuration. No @concurrent annotation violations present.
Cmux Swift File And Package Boundaries ✅ Passed PR contains no production Swift code modifications - only CI/CD infrastructure changes (workflow runners, ActionLint config, bash test script). Check applies to "production Swift changes" only.
Cmux Swift Logging ✅ Passed No Swift source files were modified in this PR. Changes are limited to GitHub Actions workflows (.yml) and a bash test script. Check does not apply to non-Swift code.
Cmux User-Facing Error Privacy ✅ Passed All user-facing error messages in changed files use generic terms without exposing vendor names (Blacksmith, Depot, WarpBuild) or sensitive details per user-facing-errors.md rule.
Cmux Full Internationalization ✅ Passed PR modifies only CI/workflow, test scripts, and ActionLint config. No user-facing text, string catalogs, web messages, or Info.plist changes. Exempt per i18n rules.
Cmux Swiftui State Layout ✅ Passed PR is about CI/CD runner migration; contains no SwiftUI code changes. Check is not applicable to this pull request.
Cmux Architecture Rethink ✅ Passed PR contains zero Swift file modifications; all changes are CI/CD runner configuration in YAML and test scripts. Swift-architectural-rethink.md review rules do not apply to non-Swift code changes.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed All new window classes are either properly registered with cmux.* identifiers, test-only fixtures, main workspace windows, or use dynamic workspace identifiers.
✨ 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-blacksmith-macos-runners

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 and usage tips.

@greptile-apps

greptile-apps Bot commented May 27, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR migrates all macOS CI/CD jobs from WarpBuild (warp-macos-*-arm64-6x) and Depot (depot-macos-latest) runners to Blacksmith (blacksmith-6vcpu-macos-{15,26,latest}), with a 1:1 size mapping (6x → 6vcpu) and preserved macOS version splits. No application code is changed.

  • 9 workflow files updated with new runner labels; actionlint.yaml added to register Blacksmith labels for linting.
  • perf-activation.yml adds a launchctl asuser wrapper so the Cmd-Tab visibility benchmark runs inside the console user's Aqua session (required because Blacksmith's runner process lives in the system bootstrap, outside Aqua, making CGWindowListCopyWindowInfo miss on-screen windows).
  • SPM cache keys in perf-activation.yml and test-e2e.yml now include the runner name to prevent cross-contamination between macOS 15 and 26 caches; the test-guard shell script's awk job-scope detector is tightened to avoid false exits on 2-space-indented YAML comments.

Confidence Score: 5/5

Safe to merge — only CI runner labels change; no application code is touched.

Every changed file is a GitHub Actions workflow or a test script that validates those workflows. The runner label swap is 1:1 in size and macOS version. The most complex addition — the launchctl asuser double-sudo pattern in perf-activation.yml — is a well-known workaround for running GUI benchmarks from a non-Aqua CI process, and is correctly structured. SPM cache keys are properly namespaced per runner to prevent cross-contamination. No application logic, signing configuration, or secrets handling is altered.

No files require special attention. The perf-activation.yml Aqua session wrapper and the test_ci_self_hosted_guard.sh awk update are the most non-trivial changes but both are correctly implemented.

Important Files Changed

Filename Overview
.github/workflows/perf-activation.yml Runner switched to blacksmith-6vcpu-macos-15; SPM cache key namespaced by runner; Cmd-Tab benchmark wrapped in launchctl asuser to re-enter the Aqua session — correct pattern for non-Aqua Blacksmith runners.
.github/workflows/test-e2e.yml Default runner and fallback changed to blacksmith-6vcpu-macos-15; Depot options kept as manual dispatch fallbacks; SPM cache key namespaced by runner name.
tests/test_ci_self_hosted_guard.sh Renamed check function and updated awk patterns to match Blacksmith runner labels; end-of-job detector tightened to avoid premature scope exit on YAML comments at 2-space indent.
.github/workflows/ci.yml Four jobs (tests, tests-build-and-lag, release-build, ui-regressions) migrated from warp-macos-* to blacksmith-6vcpu-macos-{15,26} with matching macOS version assignments.
.github/workflows/nightly.yml build-sign-notarize-nightly migrated from warp-macos-26-arm64-6x to blacksmith-6vcpu-macos-26; no other changes.
.github/workflows/release.yml build-sign-notarize migrated from warp-macos-26-arm64-6x to blacksmith-6vcpu-macos-26; signing/notarization path unchanged.
.github/actionlint.yaml New file registering three Blacksmith runner labels as known self-hosted labels so actionlint does not flag them as unknown runners.
.github/workflows/tmux-corpus.yml terminal-nightly runner changed from [self-hosted, warp-macos-15-arm64-6x] to blacksmith-6vcpu-macos-15, dropping the self-hosted routing label.
.github/workflows/ci-macos-compat.yml Matrix os values updated from warp-macos-{15,26}-arm64-6x to blacksmith-6vcpu-macos-{15,26}; virtual_display and other matrix attributes unchanged.
.github/workflows/build-ghosttykit.yml Single runner label change: warp-macos-15-arm64-6x to blacksmith-6vcpu-macos-15.
.github/workflows/test-depot.yml Runner changed from warp-macos-15-arm64-6x to blacksmith-6vcpu-macos-15; filename still references depot but this is a pre-existing naming artifact.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    subgraph Before["Before (WarpBuild / Depot)"]
        W1[warp-macos-15-arm64-6x]
        W2[warp-macos-26-arm64-6x]
        D1[depot-macos-latest]
    end

    subgraph After["After (Blacksmith)"]
        B1[blacksmith-6vcpu-macos-15]
        B2[blacksmith-6vcpu-macos-26]
        B3[blacksmith-6vcpu-macos-latest]
    end

    W1 -->|"tests, tests-build-and-lag,\nui-regressions, build-ghosttykit,\ncompat-15, terminal-nightly,\ntest-depot, perf-activation"| B1
    W2 -->|"release-build, build-sign-notarize,\nbuild-sign-notarize-nightly, compat-26"| B2
    D1 -->|"test-e2e default"| B1

    B1 -.->|dispatch option| B2
    B1 -.->|dispatch option| B3

    subgraph Special["perf-activation Aqua fix"]
        AQ["launchctl asuser CONSOLE_UID\n→ sudo -u CONSOLE_USER\n→ bench-window-visibility.swift\n(CGWindowListCopyWindowInfo\nnow sees on-screen windows)"]
    end

    B1 --> AQ
Loading

Reviews (5): Last reviewed commit: "Harden macOS runner guard diagnostics" | Re-trigger Greptile

Comment on lines 20 to 38
default: true
type: boolean
runner:
description: "Runner OS (Depot runners for GUI activation support)"
description: "Runner OS"
required: false
default: "depot-macos-latest"
default: "blacksmith-6vcpu-macos-latest"
type: choice
options:
- blacksmith-6vcpu-macos-latest
- blacksmith-6vcpu-macos-26
- blacksmith-6vcpu-macos-15
- depot-macos-latest
- depot-macos-14

jobs:
e2e:
runs-on: ${{ inputs.runner || 'depot-macos-latest' }}
runs-on: ${{ inputs.runner || 'blacksmith-6vcpu-macos-latest' }}
timeout-minutes: 20
env:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 GUI activation capability assumption

The old description explicitly flagged that Depot runners were required for GUI activation support. The new default (blacksmith-6vcpu-macos-latest) silently drops that note, but E2E tests that depend on virtual display or GUI activation will silently regress if Blacksmith's latest image doesn't provide the same capability. The ci-macos-compat.yml matrix sets virtual_display: false for macOS 26, so if latest resolves to 26, any E2E step requiring a virtual display will break without a clear failure signal at the runner-selection level.

terminal-nightly:
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
runs-on: [self-hosted, warp-macos-15-arm64-6x]
runs-on: blacksmith-6vcpu-macos-15

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 self-hosted label silently removed

The original runner spec was [self-hosted, warp-macos-15-arm64-6x], meaning the job required a self-hosted runner. Switching to blacksmith-6vcpu-macos-15 (a managed cloud label) drops the self-hosted routing constraint entirely. If any network policy, secret scope, or tool availability was tied to the self-hosted runner context for terminal-nightly, the job may silently acquire a different environment without failing fast.

coderabbitai[bot]
coderabbitai Bot previously requested changes May 27, 2026

@coderabbitai coderabbitai 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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/ci.yml:
- Line 161: Actionlint flags the new custom runner labels like "runs-on:
blacksmith-6vcpu-macos-15" as unknown; update your actionlint configuration to
allow them by adding the specific labels (e.g., blacksmith-6vcpu-macos-15) or a
matching pattern (e.g., /^blacksmith-.*$/) to the allowed self-hosted labels in
actionlint.yaml, or alternatively change the workflow runner selection to a
standard set of labels; look for the "runs-on: blacksmith-6vcpu-macos-15"
occurrences in the CI workflow and the allowed_labels/self-hosted list in
actionlint.yaml (or the equivalent key) and add the labels/pattern so actionlint
stops reporting unknown runner labels.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: df91a6eb-59f4-4359-a1c1-6316cf4b853a

📥 Commits

Reviewing files that changed from the base of the PR and between 105e4d2 and a44ecb9.

📒 Files selected for processing (10)
  • .github/workflows/build-ghosttykit.yml
  • .github/workflows/ci-macos-compat.yml
  • .github/workflows/ci.yml
  • .github/workflows/nightly.yml
  • .github/workflows/perf-activation.yml
  • .github/workflows/release.yml
  • .github/workflows/test-depot.yml
  • .github/workflows/test-e2e.yml
  • .github/workflows/tmux-corpus.yml
  • tests/test_ci_self_hosted_guard.sh

Comment thread .github/workflows/ci.yml
coderabbitai[bot]
coderabbitai Bot previously requested changes May 27, 2026

@coderabbitai coderabbitai 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.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/perf-activation.yml (1)

85-90: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Include runner identifier in SPM cache keys to prevent cross-version cache collisions.

The cache key omits the runner identifier, but the workflow allows selecting between blacksmith-6vcpu-macos-15, -26, and -latest via workflow_dispatch. Different macOS versions use different Xcode/Swift SDKs and may produce incompatible compiled Swift packages. A cache entry populated on macOS 15 could be incorrectly restored on macOS 26, causing build failures or SDK mismatches. Context snippet 4 shows that test-e2e.yml correctly includes the runner in its SPM cache key pattern.

🔧 Align cache keys with test-e2e.yml pattern
       - name: Cache Swift packages
         uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
         with:
           path: .ci-source-packages
-          key: spm-${{ hashFiles('cmux.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved') }}
-          restore-keys: spm-
+          key: spm-${{ inputs.runner || 'blacksmith-6vcpu-macos-15' }}-${{ hashFiles('cmux.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved') }}
+          restore-keys: spm-${{ inputs.runner || 'blacksmith-6vcpu-macos-15' }}-
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/perf-activation.yml around lines 85 - 90, The SPM cache
key (key: spm-${{
hashFiles('cmux.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved')
}}) can collide across different runner images; update the actions/cache key to
include the runner identifier (e.g., prepend or interpolate matrix.runs-on or
github.runner) so it becomes spm-${{ matrix.runs-on }}-${{ hashFiles(...) }}
(and adjust restore-keys similarly), keeping the same hashFiles expression and
leaving actions/cache usage intact.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/perf-activation.yml:
- Around line 133-152: The screencapture probe in the "Diagnose GUI session"
step writes /tmp/probe.png but never removes it; add cleanup by removing the
probe file after the probe command (e.g., run rm -f /tmp/probe.png or set a trap
to remove /tmp/probe.png on exit) so the workflow doesn't leave stray files;
locate the screencapture invocation (screencapture -x /tmp/probe.png ...) and
add the cleanup command or trap immediately after it.

---

Outside diff comments:
In @.github/workflows/perf-activation.yml:
- Around line 85-90: The SPM cache key (key: spm-${{
hashFiles('cmux.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved')
}}) can collide across different runner images; update the actions/cache key to
include the runner identifier (e.g., prepend or interpolate matrix.runs-on or
github.runner) so it becomes spm-${{ matrix.runs-on }}-${{ hashFiles(...) }}
(and adjust restore-keys similarly), keeping the same hashFiles expression and
leaving actions/cache usage intact.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 09659382-28b5-4352-8a77-2b249a9c463b

📥 Commits

Reviewing files that changed from the base of the PR and between a44ecb9 and 7738133.

📒 Files selected for processing (1)
  • .github/workflows/perf-activation.yml

Comment thread .github/workflows/perf-activation.yml Outdated
Switch all macOS jobs to blacksmith-6vcpu-macos-{15,26,latest}:
- ci.yml (tests, tests-build-and-lag, release-build, ui-regressions)
- build-ghosttykit, nightly, release, test-depot, perf-activation,
  tmux-corpus, ci-macos-compat
- test-e2e default → blacksmith-6vcpu-macos-latest; existing
  workflow_dispatch input keeps depot-macos-* as fallback options

Update tests/test_ci_self_hosted_guard.sh to assert Blacksmith runners
on the paid jobs from issue #385.
Cmd-Tab activation bench times out waiting for a visible CGWindow on Blacksmith macOS runners. perf-activation-session.py works because it talks to the debug socket, so the app process launches fine, but the Cmd-Tab bench uses CGWindowListCopyWindowInfo([.optionOnScreenOnly,...]) which only returns windows the WindowServer is rendering. Print enough runner state to decide whether to launchctl asuser the bench step or move it back to a Warp/Depot GUI-enabled runner.
On Blacksmith macOS runners (and likely any future GitHub-image-based hosted runner), the runner job runs in launchd's system bootstrap even though it is uid 501. Apps launched via NSWorkspace.openApplication still attach to the WindowServer, but CGWindowListCopyWindowInfo([.optionOnScreenOnly,...]) from a system-bootstrap process does not see those windows in the console user's Aqua session, so the Cmd-Tab benchmark times out waiting for an initial visible window. Re-enter the console user's launchd domain with launchctl asuser before invoking the swift bench so visibility polling sees the real on-screen windows. perf-activation-session.py was unaffected because it talks to the debug socket and does not need WindowServer visibility.
@lawrencecchen
lawrencecchen force-pushed the feat-blacksmith-macos-runners branch from 699370c to 7405c27 Compare May 28, 2026 01:04
coderabbitai[bot]
coderabbitai Bot previously requested changes May 28, 2026

@coderabbitai coderabbitai 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.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tests/test_ci_self_hosted_guard.sh`:
- Around line 22-25: The output strings in the test (the echo lines that
currently say "FAIL: $job in $(basename "$file") must use a Blacksmith macOS
runner" and "PASS: $job Blacksmith runner is present") leak an internal provider
name; update those messages to use a generic, user-facing phrase instead (e.g.,
"macOS runner" or "expected macOS runner") so both the FAIL and PASS echoes
reference $job and $(basename "$file") but no longer include "Blacksmith".
- Around line 15-20: The AWK job-boundary test (the in_job && /^  [^[:space:]]/
branch) is too broad and treats any two-space line (including comments) as a job
end; update the boundary detection in the AWK snippet that uses the job variable
and in_job flag so it only treats a new top-level YAML key as the end of the job
(i.e., require the two-space prefix followed by non-space characters and a
trailing colon) instead of any two-space line, so comments or blank lines inside
the job do not prematurely clear in_job.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 267b18cd-e368-43dc-a5c0-f40ebf28d968

📥 Commits

Reviewing files that changed from the base of the PR and between 699370c and 7405c27.

📒 Files selected for processing (11)
  • .github/actionlint.yaml
  • .github/workflows/build-ghosttykit.yml
  • .github/workflows/ci-macos-compat.yml
  • .github/workflows/ci.yml
  • .github/workflows/nightly.yml
  • .github/workflows/perf-activation.yml
  • .github/workflows/release.yml
  • .github/workflows/test-depot.yml
  • .github/workflows/test-e2e.yml
  • .github/workflows/tmux-corpus.yml
  • tests/test_ci_self_hosted_guard.sh

Comment thread tests/test_ci_self_hosted_guard.sh
Comment thread tests/test_ci_self_hosted_guard.sh Outdated
@lawrencecchen

Copy link
Copy Markdown
Contributor Author

@coderabbitai resume

@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 28, 2026

Copy link
Copy Markdown

@lawrencecchen: Resuming reviews and starting a review of this PR now.

✅ Actions performed

Reviews resumed.


Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@lawrencecchen
lawrencecchen dismissed stale reviews from coderabbitai[bot], coderabbitai[bot], and coderabbitai[bot] May 28, 2026 01:36

Stale CodeRabbit review. Addressed in a61c666; fresh CodeRabbit status check completed successfully.

@lawrencecchen
lawrencecchen merged commit 370c412 into main May 28, 2026
19 checks passed
@lawrencecchen
lawrencecchen deleted the feat-blacksmith-macos-runners branch May 28, 2026 01:36
lawrencecchen added a commit that referenced this pull request May 28, 2026
This reverts commit 370c412.

Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
lawrencecchen added a commit that referenced this pull request May 29, 2026
Re-applies the WarpBuild/Depot -> Blacksmith migration that landed as
#4902 and was reverted by
#4926. The revert was purely a
Blacksmith macOS capacity problem (every SKU queued 8m+/65m+ while
GitHub-hosted picked up in <10s), not a defect. A push-triggered probe on
this branch confirmed all three Blacksmith macOS SKUs (15/26/latest) now
pick up jobs in ~16s, so the migration is safe to re-attempt.

Switches every macOS job to blacksmith-6vcpu-macos-{15,26,latest}:
- ci.yml (tests, tests-build-and-lag, release-build, ui-regressions)
- build-ghosttykit, nightly, release, test-depot, perf-activation,
  tmux-corpus (drops the self-hosted label), ci-macos-compat
- test-e2e default -> blacksmith-6vcpu-macos-15; keeps depot-macos-* as
  fallback dispatch options and the Depot identity guard (now correctly
  skipped on the Blacksmith default)
- re-adds .github/actionlint.yaml allowlist for the Blacksmith labels
- re-adds the launchctl asuser Aqua-session wrapper for the Cmd-Tab perf
  bench (Blacksmith runners run in launchd's system bootstrap)
- tests/test_ci_self_hosted_guard.sh asserts Blacksmith macOS runners

Removes the temporary capacity probe used to gate this re-attempt.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
lawrencecchen added a commit that referenced this pull request May 29, 2026
Re-applies the WarpBuild/Depot -> Blacksmith migration (originally #4902, reverted by #4926 for Blacksmith macOS capacity, now recovered). Every paid macOS job routes through the MACOS_RUNNER_15/MACOS_RUNNER_26 repo variables with a Warp literal fallback, so the provider can be flipped via a repo-variable change with no PR. Manual perf/e2e default to 'auto' and follow the variable too, with Warp selectable. See docs/macos-ci-runners.md.

This branch was successfully deployed

1 active deployment
Preview – cmux — a61c666a Deployed May 28, 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.

1 participant