Repository navigation
ci(nightly): nightly-next runs stop skipping their own builds; no 32 vCPU pins; display visual gate opt-in - #28961
Conversation
…isual gate is opt-in Seventeen nightly jobs (both pickers, signer-app/notary/dmg, every publish job) named blacksmith-32vcpu-ubuntu-2404 literally. From about 03:45Z on 2026-10-31 that size waited 8-15 minutes per job while 16 vCPU started, and the nightly chains about ten of these one after another, so every nightly-next run since f8c1ccb stalled. They now take the same literal-only expression as the other Linux jobs: 16 vCPU when LINUX_RUNNER names it, else 32. Only literal Blacksmith labels result, so no secret-holding job can follow a variable to a reused machine. The visual gate (a display Mac, 37 minutes of f8c1ccb's critical path) now runs only when NIGHTLY_NEXT_VISUAL_GATE is set to a mode; unset is off. Leo, 2026-10-31: "i dont like doing display tests anymore". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-d750cf10922c785efa64
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Shipped in:
|
|
Owned by an agent session · session |
|
Review (codex, router-review): SHIP at eba48ff Follow-ups: 1. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward. SHIP at eba48ff Visual verdict: Not applicable; workflow-only change with no UI diff.
Follow-ups:
|
Every nightly-next push run from 04:28Z to 05:23Z on 2026-10-31 found the branch moved by the time it reached resolve-nightly-cmux-tui-client (promotions about every 6 minutes, 12+ minutes of Linux queue before that step) and skipped its build, so no run built. Runs are run-scoped since the shared slot went away; the rulebook has a newer tip build alongside a running one, and publish-nightly only publishes a build newer than the feed. The skip is now opt-in (NIGHTLY_NEXT_SUPERSEDE_SKIP=1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-d750cf10922c785efa64
|
Review (codex gpt-6-astra high, router-review): BLOCK at 8db2130 BLOCK at 8db2130 Visual verdict: Not applicable; CI workflow only.
|
|
Found 3 test failures on Blacksmith runners: Failures
|
…literal Blacksmith labels Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-d750cf10922c785efa64
…emeral labels passes rule 7 `vars.X == 'L' && 'L' ||` compares the variable and runs on the literal, so a variable can never route a secret-holding job to a reused machine through it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-d750cf10922c785efa64
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
Review (codex gpt-6-astra high fast, router-review): SHIP at c5a0a56 No findings. The routing, publication, concurrency, signer and security checks all passed. The four signing-guard failures reproduce on base, and the visual-gate fixture failure is in files this PR leaves alone. Follow-ups: none (an earlier follow-up from eba48ff is #28968) |
…above (#33109) Apple caps notarizations per day. On 2026-11-03 the cap (429 RATE_LIMIT) failed every nightly for hours while about ten runs signed side by side, and only the newest of them could publish. pick-nightly-sign-runner, which runs right before signing, now reads the cmux NEXT feed: when its highest build is above this run's (the rule publish-nightly applies, nightly_version.py), overtaken=true and signer-app and build-sign-notarize-nightly skip, as they do for resolve's superseded. Only a published newer build counts, never a newer push alone (#28961); an unreadable feed signs as before. Agent-Session: https://cmux.com/deeplink/agent?id=aid-f724bb1ff9295c18fee7 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Leo, 2026-10-31: "i dont like doing display tests anymore". Leo, 2026-10-31: "FOR OUR NIGHTLIES ARE THEY END TO END ON OUR FLEET? WE CAN'T BE RELYING ON BLACKSMITH THAT CUTS OUT". Rulebook: "Nightly freshness" and "No pins".
What was wrong
The NEXT nightly fell more than 100 landings behind (NOW.md, 04:35Z). Every nightly-next run after f8c1ccb (published 04:14Z) crawled. Blacksmith's 32 vCPU size waited 8 to 15 minutes per job from about 03:45Z: the overflow probe at 03:55Z had 32 vCPU start after 11 minutes and 16 vCPU after 3 s. 17 nightly jobs named
blacksmith-32vcpu-ubuntu-2404literally:pick-nightly-build-runner,pick-nightly-sign-runner)signer-app,signer-app-notaryandsigner-dmgThe run chains about ten of these one after another, so each stall added up. The display Mac visual gate (
visual-gate-nightly) also took 37 minutes of f8c1ccb's critical path.The main cause: every run skipped its own build
In resolve-nightly-cmux-tui-client, "Leave the build slot to a newer nightly-next push" sets
superseded=truewhenevernightly-nexthas moved past the run's commit. Promotions came about every 6 minutes. A run took 12 minutes or more of Linux queue to reach that step. So every push run from 04:28Z to 05:23Z found itself superseded and built nothing (runs 41170916165 and 41171540012 log "nightly-next moved from ... the newer push's run builds it"), and no run ever built. The step dates from #21917, when pushes shared one build slot. NEXT runs are run-scoped now, and the rulebook says a newer tip builds alongside a running one. publish-nightly already publishes latest-wins against the feed (publish-recheck-recovered.sh,--superseded-ok), so builds running side by side are safe. The skip is now opt-in:NIGHTLY_NEXT_SUPERSEDE_SKIP=1.What this changes
Those 17 jobs take the expression the rest of the nightly's Linux jobs already use:
vars.LINUX_RUNNER == 'blacksmith-16vcpu-ubuntu-2404' && 'blacksmith-16vcpu-ubuntu-2404' || 'blacksmith-32vcpu-ubuntu-2404'. It only ever yields one of two literal Blacksmith labels, never the variable's value. So a job that holds a secret still cannot follow a variable onto a reused machine (signing rule 7).route-visual-gate-nightlyruns only whenNIGHTLY_NEXT_VISUAL_GATEnames a mode. Unset now means off, so no nightly waits on a display Mac. Setting the variable to report, enforce or auto turns the gate back on.The signing guard (
tests/test_ci_signing_keychain_is_deleted_before_bundle_code.py, rule 7) now acceptsvars.X == 'L' && 'L' ||when L is an ephemeral label. The variable is only compared, and the job runs on the literal. A self-check covers the accepted form and the two forms it still refuses. The guard's 4 remaining failures (sign-nightly-identity-legacyandgenerate-nightly-deltasreadingCI_NIGHTLY_NEXT_BUILD_RUNNERandCI_SIDE_LANE_RUNNER) are on base since a7b6a61, in lines this PR leaves alone.tests/test_nightly_legacy_publish_linux.pyexpects the new expression.Done by hand at the same time (mitigation)
LINUX_RUNNER=blacksmith-16vcpu-ubuntu-2404(04:50Z).NIGHTLY_NEXT_VISUAL_GATE=off(05:02Z).Risk
CI routing only, no product code. If the 16 vCPU size stalls instead, setting
LINUX_RUNNERback moves every nightly Linux job together. Not in this PR, as follow-ups: fleet-first Linux routing for the nightly (no GitHub runner on our own Linux hosts exists today) and a CI test for it.🤖 Generated with Claude Code