Repository navigation
ci(overflow): main's switch never points a signing runner variable at an owned mini - #27118
Conversation
… an owned mini The scheduled overflow switch runs from main, so the feat-cmux-next fix (#27094) cannot stop it. Port it: MACOS_RUNNER_26 leaves the owned failover, no override may move it, a stalled probe never re-applies an older record's owned value to LINUX_RUNNER or MACOS_RUNNER_26, and check_repo_variables never excuses one. Restoring still puts back the recorded value. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-7a592ef92c66f080e3cc
|
All contributors have signed the CLA ✍️ ✅ |
Walkthrough
Merge Risk:
|
There was a problem hiding this comment.
🔇 Additional comments: 1
scripts/ci/check_repo_variables.py-131-132: 1
131-132:Major · Security & Privacy · Quick win
⚠️ Unverified finding
Verification ran but could not confirm this finding. It is shown for review, not as a verified issue.Check every signing variable, not only drift findings.
If
MACOS_RUNNER_26holdswarp-macos-15-arm64-6x,drifted_runner_variablesdoes not return it: the older matcher explicitly permits that label. The newallowed_valuecheck therefore never runs, and this checker reports no problem even though the value violates the signing policy. Check the restricted variables independently before applying recorded-failover exemptions. (raw.githubusercontent.com)

Review info
-
Run configuration-
- Source mode: Auto
- Repository: manaflow-ai/cmux
- Branch: dep-fleet/overflow-signing-vars-main
- File: .coderabbit.yaml
- Commit: 7005919
- Layers: Repository YAML
- Review profile: ASSERTIVE
- Plan: Advanced
- Run ID:
6b4a571a-5c9b-4e9d-b1a9-03a33f41b277
Files selected for processing: 6-
.github/workflows/ci-repo-variables.ymldocs/ci-runners.mdscripts/ci/check_repo_variables.pyscripts/ci/cloud_overflow_switch.pyscripts/ci/signing_runner_variables.pytests/test_ci_cloud_overflow_switch.py
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 5 remain after this review.
-
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Merge receipt for
Labeled |
… would accept CodeRabbit on #27118: a label the older drift matcher permits (an old provider's) never reached the allowed_value check. Check the signing variables on their own first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-7a592ef92c66f080e3cc
|
Valid. Fixed in the follow-up (the probe-set PR from |
…ne starts (#27121) * ci(overflow): probe the 32 and 16 vCPU Linux sizes; trip only when none starts The switch probed one label (the record's, else LINUX_RUNNER, else blacksmith-4vcpu-ubuntu-2404). On 2026-10-28 that label alone stalled at 21:59Z, 22:13Z, 22:53Z and 23:30Z while the other sizes started jobs, and each stall flipped every overflow variable. The probe is now a matrix over PROBE_LABELS (32 and 16 vCPU); overflow goes off only when every probe stalls and comes back when any one starts. A Linux failover never names a stalled size (left alone when its whole chain stalled), the watch sits on Blacksmith macOS, and a run with a probe still queued force-cancels itself so it cannot hold the concurrency group. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-7a592ef92c66f080e3cc * ci(repo-variables): report a signing runner variable the drift policy would accept CodeRabbit on #27118: a label the older drift matcher permits (an old provider's) never reached the allowed_value check. Check the signing variables on their own first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-7a592ef92c66f080e3cc * ci(overflow): track probe health per label; fail over only onto a size that started Review of the probe set: a started 16 vCPU probe cleared the record while 32 vCPU (fast-checks' fallback) still stalled, and a legacy hosted-Ubuntu record migrated onto a size that had just stalled. Now: - the set decides only when every probe decided; mixed results change nothing (outcome "partial"); - a Linux failover, migration or resume names only a label whose probe started in this run, and never GitHub-hosted Ubuntu; - each deciding run writes CI_CLOUD_LABEL_HEALTH (per-label started or stalled) for the RUNNER_POOLS reconciler; the switch never reads it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-7a592ef92c66f080e3cc * ci(overflow): never restore a Linux variable onto an unprobed label; no futile Linux rescues Review at 8c80bff: - an older record's before (blacksmith-4vcpu-ubuntu-2404, from when that one label was the probe) was restored once 16 and 32 vCPU started, though 4 vCPU may still stall, and the record was then deleted. A Linux variable on a size whose probe started now stays there unless its before is a probed size that started too. - with every Linux size stalled no Linux variable moves, yet stuck Blacksmith Linux jobs were still force-cancelled and re-run onto the same label on every scheduled run. They are left alone then; macOS jobs still move to owned pools. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-7a592ef92c66f080e3cc * ci(overflow): a partial stall moves Linux off the stalled size; restore only onto started sizes Review at 437df95: - 32 vCPU stalled while 16 vCPU started changed nothing, so LINUX_RUNNER on 32 vCPU stayed queued. On a partial result a Linux variable naming a stalled probed size now moves to a started one (recorded, so it goes back once every size starts). Literal runs-on sizes are for the RUNNER_POOLS reconciler. - a legacy CI_TRUSTED_RUNNER record restored an unprobed 4 vCPU. A Linux variable now goes back only onto a size whose probe started, and a GitHub-hosted value before is never put back. - test: no code path writes a GitHub-hosted label to any variable. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-7a592ef92c66f080e3cc * ci(overflow): a partial stall changes nothing; per-size moves belong to RUNNER_POOLS Review at edbbce3: a partial result's Linux-only record made a later full stall skip the macOS failover, and literal runs-on read the record as a boolean. Drop the partial-record logic: on a partial result the switch writes only CI_CLOUD_LABEL_HEALTH, which the RUNNER_POOLS reconciler consumes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-7a592ef92c66f080e3cc * ci(overflow): a recovered legacy hosted record never leaves Linux on GitHub-hosted Ubuntu Review at cd79796: with before an unprobed 4 vCPU and after ubuntu-24.04, every probe starting skipped the restore and deleted the record, so LINUX_RUNNER stayed hosted. On recovery a Linux variable on hosted Ubuntu now moves: LINUX_RUNNER to a probed size that started, CI_TRUSTED_RUNNER unset (its readers accept no probed size and fall back to Blacksmith). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-7a592ef92c66f080e3cc --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Why
The overflow switch (
ci-cloud-overflow-probe.yml) runs on a schedule, so it runs frommain. On 2026-10-28 it failed over three times (21:59Z, 22:13Z, 22:53Z) and each time pointedMACOS_RUNNER_26at the std owned pool. Signing jobs on feat-cmux-next read that variable inruns-on(rule 7 oftests/test_ci_signing_keychain_is_deleted_before_bundle_code.py), socmux-next-guards.yml'ssigning runner variables are ephemeraljob went red on feat-cmux-next and on every pull request into it. The variables are repository-wide.#27094 fixes this in the switch, but on feat-cmux-next. The scheduled run never executes that copy, so on its own it cannot stop the re-fire. This PR ports #27094 onto
main's newer switch (Linux failover to another Blacksmith size, the hosted-Ubuntu record migration). Keep both: #27094 also adds the rule 7 test's list check, which exists only on feat-cmux-next.What
scripts/ci/signing_runner_variables.py: the one list of variables signing jobs read (LINUX_RUNNER,MACOS_RUNNER_26) and the ephemeral rule (blacksmith-*orubuntu-*). It matches ci(overflow): never point a signing runner variable at an owned mini #27094's file plus one note that main carries a copy.cloud_overflow_switch.py:MACOS_RUNNER_26is removed fromSTD_VARIABLES. While Blacksmith is down, its jobs wait for Blacksmith macOS rather than moving to a reused mini.MACOS_RUNNER_26is also removed from whatCI_CLOUD_FAILOVERmay name. On main, every value an override could give it is already refused: GitHub-hosted, a Blacksmith label for a macOS variable, or a reused machine.LINUX_RUNNERat a non-ephemeral label is refused.plan_offandplan_resumenever write a non-ephemeral label to a listed variable. That covers records written before this change, like today's, which still nameMACOS_RUNNER_26with an ownedafter.plan_onstill restores a recorded value.check_repo_variables.pynever excuses a listed variable that names a reused machine, even when a switch record names it.runs-on, never a shared overflow variable. If signing jobs later choose their runner through that picker alone, the guard can check the pick instead. That change belongs with those PRs.Not in this PR (coordination)
beforevalues and deletes the record; it did so at 23:21:20Z today, and the guard went green after that.Tests
tests/test_ci_cloud_overflow_switch.py: 46 pass. The signing-variable tests are ported from ci(overflow): never point a signing runner variable at an owned mini #27094 and adapted: on main, no override can moveMACOS_RUNNER_26, and a Blacksmith Linux override forLINUX_RUNNERis kept.tests/test_ci_check_repo_variables.pyandtests/test_ci_no_github_hosted_macos.pypass.Risk: low. CI routing only. While Blacksmith macOS is down, jobs that read
MACOS_RUNNER_26queue for it instead of moving to the owned std pool; rule 7 requires that. The other macOS variables still fail over to the owned pools as before.🤖 Generated with Claude Code
Agent session: agent session
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Stops main's scheduled overflow switch from ever pointing signing runner variables at reused machines, fixing the intermittent
signing runner variables are ephemeralguard failures on feat-cmux-next and its pull requests.The switch runs from
main, so the existing feat-cmux-next fix cannot stop it: on 2026-10-28 its failover pointedMACOS_RUNNER_26at the owned std pool three times, turning the guard red on every PR.Changes
scripts/ci/signing_runner_variables.pyas the single list of variables signing jobs read (LINUX_RUNNER,MACOS_RUNNER_26) and the ephemeral rule (blacksmith-*orubuntu-*).MACOS_RUNNER_26from the owned failover and from what overrides may name; its jobs wait while Blacksmith is down.check_repo_variables.pynever excuses a reused machine in these variables, even when a switch record names it.Risk is low: CI routing only. The other macOS variables still fail over to the owned pools, and owned-Mac signing keeps its fail-closed picker route. Keep the
signing_runner_variables.pylist in sync with the feat-cmux-next copy.Written for commit 7005919. Summary will update on new commits.
Summary by CodeRabbit