ci: route focused tests to one front door, and half of them to 12 vCPU - #14067
Conversation
test-depot.yml was named for a retired provider, and agents reached for it
to run one test: 32 dispatches on 2026-09-23, each a cold 20-minute build
with none of run-e2e.sh's in-flight reuse, failed-selector refusal or
batching. Rename it test-macos-suite.yml ("Run macOS test suite"), say at
the top of the file and in its selector input that a focused test goes
through ./scripts/run-e2e.sh, and say the same in the cmux-testing skill.
run-e2e.sh now sends commits whose SHA ends in an odd hex digit to
blacksmith-12vcpu-macos-26, so both instance sizes run on real focused-run
traffic. Keyed on the commit, so every dispatch at one commit lands on one
pool and the reuse and refusal guards, which match on runner label, keep
working. Only the free 6 vCPU default is split; an explicit --runner or a
MACOS_RUNNER_TESTS naming another pool is used unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Warning Review limit reachedNext included review available in 20 seconds. View limit detailsLimit 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. Review configuration: ⚙️ Run configurationConfiguration used: Repository: manaflow-ai/cmux/.coderabbit.yaml Review profile: ASSERTIVE Plan: Advanced Run ID: 📒 Files selected for processing (11)
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 |
|
All contributors have signed the CLA ✍️ ✅ |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Independent subagent review at e5a034c: no blocking defects.
Addressed: the stale Depot note in the Accepted as-is:
|
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. |
a3b7014 ci: skip the CLI lane for project.pbxproj edits outside the CLI targets (manaflow-ai#14071) 789edd3 ci: bootstrap the app-host known-failure catalog from main's census (manaflow-ai#14074) 2c2314e ci: route focused tests to one front door, and half of them to 12 vCPU (manaflow-ai#14067) d7409fc ci(e2e): read adopted DerivedData over parallel ranges (manaflow-ai#14051) 99dc5a3 ci: derive whether a scripts/ci helper reaches a routed lane (manaflow-ai#14063) cf8b073 ci: stop routing the Claude wrapper lane on test-registry edits (manaflow-ai#14065) # Conflicts: # .github/workflows/ci.yml # .github/workflows/perf-activation.yml # .github/workflows/test-e2e.yml # .github/workflows/test-macos-suite.yml
* ci: hand focused test-macos-suite dispatches to run-e2e.sh A dispatch of test-macos-suite.yml that names unit selectors with UI tests off is a focused run, and it compiled the whole app cold for it: about 20 minutes per test, with none of test-e2e.yml's build reuse. #14067 documented the wrapper; agents still dispatched the suite workflow directly. Such a dispatch now runs a Linux `focused` job that passes the selectors to ./scripts/run-e2e.sh --wait, so it gets the reuse, in-flight attach and failed-selector refusal, and the suite run keeps the e2e run's result. The job token cannot list repository variables, so the workflow passes MACOS_RUNNER_TESTS to the wrapper in the environment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * ci: poll slowly, skip forks, and dedupe selectors in the focused suite job gh run watch polls every 3 s by default, which would spend most of the job token's hourly request budget over a 45-minute run; the workflow now asks the wrapper for a 60 s interval. The wrapper dispatches to manaflow-ai/cmux, so a fork keeps its own tests job. A repeated suite entry is dropped instead of failing the wrapper's uniqueness check. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * ci: forward focused suite dispatches without waiting on them The focused job held a Linux runner for the whole e2e run only to copy its result. It now dispatches through run-e2e.sh, links the run, and exits red so the suite run is never read as a pass. With no wait, the wrapper needs neither a poll interval nor the runner variable in its environment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * ci: pass the tests runner variable to the focused suite dispatcher The focused job's token cannot list repository variables, so default_runner() returned None there. That silenced the in-flight guard and the large-runner split for every forwarded dispatch. The job now passes vars.MACOS_RUNNER_TESTS in CMUX_MACOS_RUNNER_TESTS, and an empty value falls through to the test-e2e.yml literal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Keeps both sides of dispatch-focused-test.py: main's runner-pool overflow and 400-character concurrency-group check (#14067, #14104, #14132), and this branch's per-definition dispatch history and selector normalization. test-depot.yml is now test-macos-suite.yml (#14075); the UI filter guard followed the rename and its test reads the new file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Summary
One front door for focused tests.
test-depot.ymlwas named for a retired provider, and agents used it to run one test at a time. It had 32 dispatches on 2026-09-23. Each one was a cold build of about 20 minutes, with none of the reuse, refusal or batching thatrun-e2e.shdoes. This PR:test-macos-suite.yml("Run macOS test suite")./scripts/run-e2e.shcmux-testingskill, which is where agents read itHalf of focused runs on 12 vCPU.
run-e2e.shnow sends every commit whose SHA ends in an odd hex digit toblacksmith-12vcpu-macos-26. That runs both instance sizes on real traffic instead of a one-off benchmark. The split is keyed on the commit, not random, so every dispatch at one commit lands on the same pool. That matters because in-flight reuse, the failed-selector refusal and the app-host product contract all match on the runner label. Only the free 6 vCPU default is split. An explicit--runner, or aMACOS_RUNNER_TESTSvalue that names another pool, is used unchanged.Why
At 23:37 UTC the macOS 26 pool had 10 jobs running and 48 queued, with the oldest waiting 20 min. Most of the load was single-test dispatches paying for a full compile.
Trade-off
The runner label is part of the app-host product contract. So a product built on one size can't be reused by a run on the other. It still works within a commit, because the split is per commit. Across commits it's a real cost, but a small one: only 1 of 23 recent e2e builds I checked actually took the short path.
Open question this measures
It's not yet clear whether Blacksmith caps macOS capacity in jobs or in vCPUs. If the cap is in jobs, 12 vCPU is a free speedup. If it's in vCPUs, each large run takes two slots. Build-step durations split by pool, and queue depth, will tell us which.
Testing
tests/test_run_e2e.py: 51 pass, including 4 new tests: odd commit is routed, explicit runner is never rerouted, an admin variable is never split, a routed commit reuses its in-flight run on the large SKU. Negative control: with the routing disabled, 2 of the new tests fail.linux-guardlane: exit 0, 434 passingactionlintis clean on both workflows🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.Summary by cubic
Renames
test-depot.yml, named for a retired CI provider, totest-macos-suite.ymland steers one-off test dispatches torun-e2e.sh. The wrapper reuses an in-flight compile at the same commit and refuses a selector that already failed there, where the suite workflow pays a cold full-tree build every time.blacksmith-12vcpu-macos-26, so the two instance sizes are compared on real traffic.--runneror aMACOS_RUNNER_TESTSvalue naming another pool is used unchanged.cmux-testingskill now point focused runs at the wrapper, andtest-e2e.ymllists the 12 vCPU runner as an option.Written for commit 71f645c. Summary will update on new commits.