Skip to content

ci: route display-resolution jobs to display-capable runner - #6243

Merged
lawrencecchen merged 4 commits into
mainfrom
feat-route-display-jobs
Jun 16, 2026
Merged

lawrencecchen merged 4 commits into
mainfrom
feat-route-display-jobs

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Jun 16, 2026 •

Copy link
Copy Markdown
Contributor

Routes the 2 CGVirtualDisplay-dependent jobs (tests-build-and-lag, ui-regressions) to MACOS_RUNNER_DISPLAY (default warp-macos-15), since the headless self-hosted fleet can't create virtual displays. All other macOS jobs stay self-hosted. Single flip point to move onto the fleet later. Fixes main CI red on these 2 jobs.


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


Note

Low Risk
Workflow-only changes (runner labels and resolve retry logic); no app code, auth, or release signing paths.

Overview
tests-build-and-lag and ui-regressions now use vars.MACOS_RUNNER_DISPLAY (default warp-macos-15-arm64-6x) instead of MACOS_RUNNER_15, so jobs that create CGVirtualDisplay run on a display-capable host while other macOS jobs stay on the self-hosted fleet.

The Resolve Swift packages loops in tests, tests-build-and-lag, and ui-regressions no longer exit immediately after a successful xcodebuild -resolvePackageDependencies. They check that Sparkle and Sentry .xcframework paths exist under .ci-source-packages/artifacts; if resolve “succeeds” on a stale cache without binaries, they clear artifacts and retry within the existing 3-attempt loop.

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


Summary by cubic

Route the two display-dependent macOS CI jobs to a display-capable runner and add a self-heal for Swift package resolve to prevent missing Sparkle/Sentry artifacts. Fixes CGVirtualDisplay failures and flaky builds.

  • Bug Fixes
    • Switch tests-build-and-lag and ui-regressions to runs-on: ${{ vars.MACOS_RUNNER_DISPLAY || 'warp-macos-15-arm64-6x' }}; other macOS jobs stay on the self-hosted fleet for a single flip point later.
    • After -resolvePackageDependencies, verify Sparkle.xcframework and sentry-cocoa xcframeworks exist under SOURCE_PACKAGES_DIR/artifacts; if missing, clear artifacts/ and retry within the existing 3-attempt loop (applied to all resolve loops in .github/workflows/ci.yml).

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

Review in cubic

Summary by CodeRabbit

Release Notes

  • Chores
    • Updated CI macOS runner selection to use a configurable runner display variable (with the same fallback).
    • Improved Swift package resolution in CI by validating required binary artifacts after dependency restoration; when missing, CI clears the cached artifacts and retries to ensure consistent builds.

No user-facing changes.

tests-build-and-lag and ui-regressions create a CGVirtualDisplay (private
CoreGraphics API) to test display-resolution behavior. That requires running
inside the console user's GUI/audit login session with a real display
controller. The self-hosted Mac fleet can't provide that: headless EC2 Macs
can't allocate a virtual display at all, and the gui-bootstrapped runners on
the physical minis hit "Could not switch to audit session: Operation not
permitted". These jobs were green pre-cutover only because Warp runs them in a
full GUI VM.

Route just these two jobs to ${{ vars.MACOS_RUNNER_DISPLAY || 'warp-macos-15-arm64-6x' }}
so they land on a display-capable runner, while every other macOS job stays on
the self-hosted fleet. The var is a single flip point to move them onto the
fleet later once a runner is made to run inside a real GUI login session.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 16, 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 Jun 16, 2026 11:12am
cmux-staging Building Building Preview, Comment Jun 16, 2026 11:12am

@coderabbitai

coderabbitai Bot commented Jun 16, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The CI workflow in .github/workflows/ci.yml receives two categories of updates: the tests-build-and-lag and ui-regressions jobs switch their runs-on variable from vars.MACOS_RUNNER_15 to vars.MACOS_RUNNER_DISPLAY while preserving fallback values, and the tests, tests-build-and-lag, and ui-regressions jobs add post-resolution validation guards in their Swift package dependency retry loops to detect and handle missing Sparkle and Sentry xcframework artifacts by clearing the cache and retrying.

Changes

CI Workflow Runner and Artifact Validation

Layer / File(s) Summary
Runner variable update for display jobs
.github/workflows/ci.yml
tests-build-and-lag and ui-regressions jobs switch runs-on from vars.MACOS_RUNNER_15 to vars.MACOS_RUNNER_DISPLAY, retaining the same warp-macos-15-arm64-6x fallback.
Artifact validation in Swift package resolution retries
.github/workflows/ci.yml
The tests, tests-build-and-lag, and ui-regressions jobs add a post--resolvePackageDependencies guard that verifies Sparkle and Sentry xcframeworks exist in .ci-source-packages/artifacts. If artifacts are missing, the cache is cleared and the retry loop continues, avoiding short-circuit acceptance of incomplete cached dependencies.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • manaflow-ai/cmux#4902: Both PRs update the same macOS CI jobs (tests-build-and-lag, ui-regressions) for runner selection in .github/workflows/ci.yml, though main PR additionally adds Swift package artifact validation.
  • manaflow-ai/cmux#4984: Both PRs modify macOS runner variable selection for the same paid CI jobs (tests-build-and-lag, ui-regressions) in the same workflow file.
  • manaflow-ai/cmux#4926: Both PRs update runs-on configuration for tests-build-and-lag and ui-regressions jobs, though only main PR adds the Swift package artifact retry validation logic.

Poem

🐰 Two jobs now ride on "display," not "fifteen" anymore,
While all three check their Sparkle gifts, and Sentry by the door.
If artifacts have gone astray, the cache drops away—
Retry again, and fetch them clean. Hip-hop, hooray! 🎉


Important

Pre-merge checks failed

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

❌ Failed checks (1 error, 1 inconclusive)

Check name Status Explanation Resolution
Cmux Source Artifacts ❌ Error The commit adds .claude/scheduled_tasks.lock containing local tool output (session ID, PID, timestamp), violating the source-control-artifacts rule's prohibition on local tool output without deli... Remove .claude/scheduled_tasks.lock from the commit, or add .claude/scheduled_tasks.lock to .gitignore if lock files in that directory are expected to appear during development.
Description check ❓ Inconclusive The PR description includes a clear summary of changes and reasoning, but is missing key sections from the template like Testing, Demo Video, and Checklist. Add Testing section detailing how changes were verified, and complete the Checklist section to confirm local testing and bot review requests.
✅ Passed checks (19 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: routing display-dependent CI jobs to a display-capable runner instead of the headless self-hosted fleet.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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 only modifies .github/workflows/ci.yml CI configuration; contains no production Swift code changes subject to actor isolation review.
Cmux Swift Blocking Runtime ✅ Passed PR changes are CI workflow configuration (runner routing and artifact validation in .github/workflows/ci.yml), not production Swift code. The bash sleep calls are CI orchestration, not application...
Cmux Expensive Synchronous Load ✅ Passed PR contains only workflow configuration additions and initial codebase files; no production Swift code modifications made. The check applies only to production Swift changes, which this PR does not...
Cmux Cache Substitution Correctness ✅ Passed PR is primarily a workflow runner label change (MACOS_RUNNER_15 to MACOS_RUNNER_DISPLAY). Secondary change adds artifact validation that explicitly handles cache staleness by checking if required X...
Cmux No Hacky Sleeps ✅ Passed GitHub Actions workflow YAML sleeps are explicitly out of scope per runtime-no-hacky-sleeps.md; no TypeScript/JavaScript/shell runtime scripts were modified in this PR.
Cmux Algorithmic Complexity ✅ Passed The PR modifies .github/workflows/ci.yml (CI configuration) and adds a fixed 3-attempt retry loop with filesystem checks for binary artifacts. The algorithmic complexity rule applies to production...
Cmux Swift Concurrency ✅ Passed PR modifies only .github/workflows/ci.yml with runner selection changes and shell script artifact validation—no cmux-owned Swift code is modified, so concurrency patterns check does not apply.
Cmux Swift @Concurrent ✅ Passed PR only modifies .github/workflows/ci.yml (CI configuration), not Swift source code. The @concurrent annotation check applies to Swift code changes, not workflow files.
Cmux Swift File And Package Boundaries ✅ Passed PR modifies only .github/workflows/ci.yml (YAML workflow config), not any Swift source files; check for Swift file/package boundaries does not apply to non-Swift changes.
Cmux Swift Logging ✅ Passed PR adds only CLI tool print() statements and workflow config changes; no app/runtime logging rule violations found.
Cmux User-Facing Error Privacy ✅ Passed PR modifies only .github/workflows/ci.yml (GitHub Actions CI infrastructure), an operational runbook not shown to end users. No user-facing error messages, alerts, or recovery copy were added or mo...
Cmux Full Internationalization ✅ Passed PR modifies only CI workflow configuration (.github/workflows/ci.yml) with runner routing and artifact validation—operational code not user-facing, explicitly allowed by full-internationalization.md.
Cmux Swiftui State Layout ✅ Passed PR modifies only .github/workflows/ci.yml (CI configuration), with no Swift/SwiftUI source code changes. The SwiftUI state layout check does not apply to CI workflow files.
Cmux Architecture Rethink ✅ Passed PR is a CI/workflow-only change with no Swift code modifications; routes two jobs to display-capable runners and adds bash artifact validation logic, violating no Swift architectural rethink rules.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR modifies only CI workflow (.github/workflows/ci.yml) with no Swift code changes; custom check applies only to Swift window-related changes.
✨ 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-route-display-jobs

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 Jun 16, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

Routes the tests-build-and-lag and ui-regressions jobs from vars.MACOS_RUNNER_15 to vars.MACOS_RUNNER_DISPLAY (fallback warp-macos-15-arm64-6x) so they run on display-capable hosts that can create CGVirtualDisplay. The PR also bundles a stale-cache guard into the Swift-package-resolve retry loop across three jobs.

  • Runner routing — two runs-on expressions updated; MACOS_RUNNER_DISPLAY acts as a single flip-point to migrate these jobs back to the fleet later without touching job steps.
  • Artifact guard — after resolvePackageDependencies returns success, the loop now verifies that the Sparkle and sentry-cocoa .xcframework artifacts actually materialized; if they're absent it clears $SOURCE_PACKAGES_DIR/artifacts and retries, preventing a stale-cache-restored resolve from silently passing then failing the build.

Confidence Score: 5/5

Workflow-only change that fixes two failing CI jobs; no app code, test scripts, or secrets are touched.

Both changes are confined to .github/workflows/ci.yml. The runner-label swap is a two-line expression change with a safe fallback default. The stale-artifact guard is logically correct — it validates two known binary artifacts, clears only the artifacts subdirectory on failure, and lets the existing retry loop handle the re-download. There is no risk of production regressions.

No files require special attention.

Important Files Changed

Filename Overview
.github/workflows/ci.yml Two runner-label changes plus a stale-artifact guard added to the Swift-package-resolve retry loop in three jobs; logic is correct and scoped to CI infrastructure only.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[CI trigger] --> B{Job type?}
    B -->|tests-build-and-lag\nui-regressions| C[runs-on: MACOS_RUNNER_DISPLAY\nfallback: warp-macos-15-arm64-6x]
    B -->|All other macOS jobs| D[runs-on: MACOS_RUNNER_15\nself-hosted fleet]
    C --> E[resolvePackageDependencies]
    D --> F[resolvePackageDependencies]
    E --> G{Artifacts present?\nSparkle.xcframework\nsentry-cocoa/*.xcframework}
    G -->|Yes| H[exit 0 — proceed with build]
    G -->|No| I[rm -rf artifacts\n+ retry loop]
    I --> E
    F --> J[exit 0 — proceed with build]
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[CI trigger] --> B{Job type?}
    B -->|tests-build-and-lag\nui-regressions| C[runs-on: MACOS_RUNNER_DISPLAY\nfallback: warp-macos-15-arm64-6x]
    B -->|All other macOS jobs| D[runs-on: MACOS_RUNNER_15\nself-hosted fleet]
    C --> E[resolvePackageDependencies]
    D --> F[resolvePackageDependencies]
    E --> G{Artifacts present?\nSparkle.xcframework\nsentry-cocoa/*.xcframework}
    G -->|Yes| H[exit 0 — proceed with build]
    G -->|No| I[rm -rf artifacts\n+ retry loop]
    I --> E
    F --> J[exit 0 — proceed with build]
Loading

Reviews (4): Last reviewed commit: "ci: self-heal Swift package resolve agai..." | Re-trigger Greptile

A restored .ci-source-packages cache could make -resolvePackageDependencies
report success while the binary artifacts (Sparkle/Sentry XCFrameworks) were
absent, then fail the build with "no XCFramework found". Verify the artifacts
actually materialized after each resolve; if not, clear .ci-source-packages/
artifacts and retry within the existing 3-attempt loop so the next attempt
re-downloads them cleanly. Applied to all three resolve loops.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@lawrencecchen
lawrencecchen merged commit dec7fe0 into main Jun 16, 2026
20 of 22 checks passed
@lawrencecchen
lawrencecchen deleted the feat-route-display-jobs branch June 16, 2026 11:41
@lawrencecchen
lawrencecchen restored the feat-route-display-jobs branch July 18, 2026 10:18

This branch was successfully deployed

1 active deployment
Preview – cmux — a85f0b1a Deployed Jun 16, 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