ci(web): web-subarea-scope reads the Linux pool, never LINUX_RUNNER alone
web / web-subarea-scope gates every webview shard. It read vars.LINUX_RUNNER || 'blacksmith-4vcpu-ubuntu-2404', which is a single Blacksmith size. On 2026-11-01 LINUX_RUNNER stayed frozen on blacksmith-32vcpu-ubuntu-2404 while that size started nothing. Job 124762739841 (run 41275619982) sat unassigned from 05:36Z to 06:25Z, and every webview-routed PR waited behind it.
Leo: "if we gotta use stuff, we use it and we maximize the absolulte f*** out of every second", and on Blacksmith: "we clearly are not able to use them. so we should have resized a long-ass time ago."
Route, before: fork branches, then vars.LINUX_RUNNER (one size), then blacksmith-4vcpu-ubuntu-2404.
Route, after: fork branches unchanged, then fromJSON(vars.RUNNER_POOLS).linux, which runner_pools.py keeps on a live member. A frozen LINUX_RUNNER can no longer strand this job. #30277 makes the same one-line change for this job and five other ci-web jobs; the two merge cleanly with each other.
Owned-mini member, dropped from this PR. An earlier head passed the PR picker's owned side label into this job. tests/test_runner_routing_table.py (Validate every macOS job names its job class) then requires a job that can run on a mini to be class portable-checks. That class must read a portable-placement job's linux_runner/mini_runner, and scripts/ci/portable_job_placement.py can only find an idle mini with the routing App token. So it needs GLAEDA_ROUTE_APP_KEY/CMUX_BOT_APP_KEY passed from ci.yml into ci-web.yml, which is a change to where secrets reach, and it lands separately.
Performance
| metric | before | after | delta | source |
|---|---|---|---|---|
| web-subarea-scope wait, stalled-size case | 49 min unassigned (job 124762739841) | the pool's live member | about -49 min when one size stalls | run 41275619982 |
| Blacksmith minutes/day for this job | about 1 min per CI run on 32 vCPU | about 1 min on the pool member (16 vCPU now) | about half the vCPU-minutes; not measured | estimate from the 5-minute timeout |
| $/day | 32 vCPU minutes | 16 vCPU minutes | down; not measured | estimate |
Changelog
none
Observed / Not run
- Red/green:
tests/test_ci_linux_single_size.pygainstest_web_subarea_scope_reads_the_linux_pool, and the ci-web.yml count drops from 6 to 5. It passes at head and fails at base. - These pass at head: test_runner_routing_table (it failed at 1e59553e on the mini member), test_ci_owned_pool_sources and test_ci_linux_single_size.
tests/test_ci_self_hosted_guard.shshows the same failures as base. actionlint 1.7.7 reports nothing, and the prepush gate finds no new violations. - The other reds in the cmux-next CI guard group at 1e59553e are base reds that name nothing here: nightly.yml anchors, nightly.yml size, upload retention, fleet rule lints, the design-spec map, the Blacksmith Linux failover and check_no_self_hosted_fleet_runners.
risk: normal
Agent session: agent session
š¤ Generated with Claude Code