Repository navigation
ci: seed the compilation cache on the runner pull requests restore it from - #13754
Conversation
`compile-app-host-test-product.sh fingerprint` hashes `xcodebuild -version`, `$PWD` and the DerivedData path, and the script says why: "Runner pools lay the workspace out differently, and a seed built under another layout cannot hit, so it should be a cache miss and not a download." nightly.yml repeats the requirement above the seeder — "Match the admission job's runner and Xcode." Nothing enforced it. This test does, and fails on main: the seeder runs on `vars.MACOS_RUNNER_15` while pull request admission runs on `vars.MACOS_RUNNER_PR || 'blacksmith-6vcpu-macos-15'`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… from
The Xcode compilation cache that nightly seeds from main has never been
restorable by a pull request. The seeder ran on `vars.MACOS_RUNNER_15`
(`warp-macos-15-arm64-6x`) while `macos-compile-admission` picks
`vars.MACOS_RUNNER_PR || 'blacksmith-6vcpu-macos-15'` for
`pull_request`, and `MACOS_RUNNER_PR` is unset. The cache key hashes the
workspace path, which differs between runner pools, so every pull
request missed and compiled cold.
Observed on ci.yml run 35740499075, a pull request touching only five
files under cmuxTests/:
Cache not found for input keys:
xcode-compilation-test-macOS-ARM64-3f6ccf06eca67f0b54759694d11f1c77-f7132b3d5...,
xcode-compilation-test-macOS-ARM64-3f6ccf06eca67f0b54759694d11f1c77-
Both the exact key and the prefix fallback missed, and "Compile app-host
test product" then took 19.9 of the job's 29.3 minutes.
Point the seeder at the same runner the pull request path uses. This
changes no cache key, no schema and no build input; it only puts the
seed where the consumer looks.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
All contributors have signed the CLA ✍️ ✅ |
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. Warning Review limit reachedNext included review available in 14 minutes. 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 (2)
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository: manaflow-ai/cmux/.coderabbit.yaml Review profile: ASSERTIVE Plan: Advanced Run ID: 📒 Files selected for processing (2)
Included review availability: Your plan provides up to 10 included reviews per hour; 0 remain after this review. 📝 WalkthroughWalkthroughThe nightly compile-cache seeder now uses the pull-request macOS runner. A regression test verifies that the seeder and admission jobs use identical runner expressions. ChangesCompile-cache runner alignment
Priority: ⬇️ Low Estimated code review effort: 2 (Simple) | ~10 minutes Change: Bug fix Merge Risk: ⚪ Minimal · up to No actionable merge-blocking risk remains; the cache seeder now tracks the pull-request admission runner. 🚥 Pre-merge checks | ✅ 25✅ Passed checks (25 passed)
✨ Finishing Touches 💡 1🛠️ Fix failing CI checks 💡
📝 Generate docstrings
🧪 Generate unit tests (beta)
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 |
This comment has been minimized.
This comment has been minimized.
|
Reproduced both cache keys from their inputs, so the runner is provably the whole difference rather than the most likely one.
Those match the two fingerprints in the logs exactly:
The only difference between the two inputs is That rules out the alternative I was worried about. |
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. |
|
Rebased onto Worth being explicit about how this now relates to #13723, since that PR fixed the same root cause I was chasing and reached the same evidence independently — down to the same two fingerprints and the one-underscore diagnosis. #13723 landed the mechanism for a better long-term fix: build from So this stays useful as the change that makes the seed reachable now, and it has a second benefit I did not claim originally: When the canonical conversion lands, the fingerprint no longer depends on the pool, and the guard added here — asserting the seeder matches admission's runner — becomes an unnecessary constraint rather than a wrong one. It should be replaced at that point by a guard that both lanes build from the canonical root. Happy to close this instead if you would rather go straight to the conversion; the tradeoff is that every pull request keeps compiling cold until it lands. |
|
#13754 and #13797 are complementary, not duplicates — please don't close either as a dupe of the other. They touch exactly the same two files (
One makes the seed reachable; the other stops it freezing. Landing only one leaves the other bug. Verified they compose — merging Both assertions survive together, so merge order does not matter. Context: per #13742, |
* docs: tell agent sessions how not to duplicate each other Several agent sessions work this repo at once and cannot see each other. Nothing in CLAUDE.md says so, and the resulting waste is now measurable. On 2026-09-22 a shared observable -- main going red on test_ci_executes_review_fabric_contracts -- reached every session at once. Each diagnosed it independently and opened a PR: #13785, #13788, #13800, #13801 and #13802, five PRs on one test function in twenty-one minutes, two of them five seconds apart. One landed. The reviewer attention spent on the other four is the cost this section exists to avoid. Two failures showed up repeatedly and are written down here because neither is guessable: Sessions share one GitHub account, so `author` and `mergedBy` name the account and never the actor. Three separate claims about which session did what were made from those fields today, all wrong, and two were relayed to the user before being retracted. GitHub keeps serving `mergeable` and `mergeStateStatus` on closed and merged pull requests, where they are stale. Reading CONFLICTING off an already merged PR sent a session to resolve a conflict that did not exist, twice. The last paragraph guards the opposite error. #13754 and #13797 changed exactly the same two files, fixed different bugs, and both merged, so an overlap scan keyed on file paths would have proposed closing a good PR. Composing them locally and running the shared test is what distinguishes the cases. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs: give sessions a callsign to sign their work with The section above tells sessions how not to collide. It does not give them a way to say who they were, and that gap produced its own failures today: three claims about which session opened, merged or reviewed something, every one of them read off `author` or `mergedBy`, every one wrong, two relayed to the user before being retracted. Those fields name the shared push account. Nothing in the repository answers "which session did this", so sessions inferred it from timing and were wrong. A callsign in a commit trailer answers it directly. Stated as attribution and not authority, deliberately. The Stensibly product model is explicit that callsigns, names, branches and prior activity never substitute for current authority evidence, and a self-assigned name two sessions can pick independently is exactly the kind of identity that must not gate an action. It records who acted. It grants nothing. This commit signs itself, which is the whole convention. Callsign: Teakettle 🫖 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs: correct the callsign section against the live registry The previous commit invented a convention. There is already a working one, and checking it showed the invented version wrong in three ways. `teamleaderleo/stensibly` #454 is a live registrar: a `github-actions[bot]` workflow that accepts `/callsign reserve`, answers in seconds with a `callsign-receipt/v0` carrying an accepted generation and a 24h lease, and releases on request. Its worker quickstart is `docs/callsign-registry-dogfood.md` in that repo. This section now points there instead of describing a parallel scheme. I reserved through it rather than trusting the document, and each correction below is something the receipt disproved: The sigil is derived from the callsign by the registrar, not chosen by the worker. Reserving `Teakettle` returned `💾`, not the emoji the previous commit had picked for itself and put in its own trailer. Names are leased. Collision keys are compared without case or separators, so `Rook`, `rook` and `r-o_o k` are one name. The previous commit said collisions were expected and tolerable, which is true of the derived sigil and false of the name. A generation may be shown only from an accepted receipt, with `pending` or `unregistered` as the honest fallback. The previous commit had no notion of a generation at all. The sign-off format follows the registry's: `— <Callsign> g<generation> <sigil>`, not a bare name and emoji. Attribution and not authority is unchanged and now cites its owner: `teamleaderleo/quarry` #1103 tracks the defect that a callsign in comment text is marker text rather than an authenticated principal. Callsign: Teakettle g1 💾 Run: run_cmux_ci_delineation_20260922_01 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs: check local worktrees and recent remote branches --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
The Xcode compilation cache nightly seeds from main has never been restorable by a pull request. Every PR that compiles has been compiling cold.
Evidence
ci.yml run 35740499075 — a pull request touching five files, all under
cmuxTests/:The exact key and the prefix fallback both missed. Step timings for that job:
Cause
compile-app-host-test-product.sh fingerprinthashesxcodebuild -version,$PWDand the DerivedData path, and says why:The seeder runs on
vars.MACOS_RUNNER_15→warp-macos-15-arm64-6x. Confirmed on the job labels ofrefresh-test-compilation-cache.macos-compile-admissionselects, forpull_request,vars.MACOS_RUNNER_PR || 'blacksmith-6vcpu-macos-15'— andMACOS_RUNNER_PRis not set, so it lands onblacksmith-6vcpu-macos-15. Confirmed on the job labels of a real admission run.Different pools, different workspace path, different fingerprint, guaranteed miss.
nightly.ymlalready carries the requirement directly above the job — "Match the admission job's runner and Xcode. The cache key carries the toolchain and the build paths, so a mismatch is a miss, not a wrong hit." The admission job later gained a PR-specific runner and the seeder stayed where it was. Nothing enforced the pairing, and a miss is silent by design.Change
Point the seeder at the runner the pull request path uses. No cache key, schema, build input or product identity changes — this only puts the seed where the consumer looks.
The guard lands first and fails on
main:tests/test_ci_test_compilation_cache_seed.shalready pinned the shared script, the shared build paths and the shared key prefix — every ingredient of the key except the runner that determines$PWD. This adds that.What this does not claim
The first seed after this lands still has to be written by a scheduled nightly run before any PR can hit it, so the improvement appears on the next
17 */6 * * *cycle, not immediately. I have not measured the warm compile time, because no warm compile has ever happened on this path — the 19.9 min figure is the cold cost this removes the cause of, not a measured saving. Worth watching one PR compile after the first post-merge seed to confirm the hit and get the real number.Both jobs are on Blacksmith macOS, which is free on this repo, so this is pull-request latency rather than spend.
Full
ci-guards.ymlsweep locally: 109 commands, all pass excepttest_check_ghostty_zig_workflows.py(nobashlex) andtest_ghostty_zig_version_sync.sh(no ghostty submodule), both of which fail identically on a cleanorigin/maincheckout.🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.Summary by cubic
Fixes the Xcode compilation cache so pull requests can restore the nightly seed from main instead of compiling cold. The seeder ran on a different runner pool than pull request admission, and since the cache key hashes the workspace path, the seed never matched — the compile step alone took 19.9 minutes per PR.
vars.MACOS_RUNNER_PR || 'blacksmith-6vcpu-macos-15'); no cache key or build input changes.The first seed after this lands appears only after the next scheduled nightly run, so PRs benefit starting with the following cycle, and the warm compile time is still unmeasured.
Written for commit a0bb348. Summary will update on new commits.
Summary by CodeRabbit
Bug Fixes
Tests