ci(backend): Linux jobs read the live runner pool, not one Blacksmith size
Every backend.yml push deploy was stuck: deploy-development, migrations-push-guard and the other secondary jobs took vars.LINUX_RUNNER || 'blacksmith-4vcpu-ubuntu-2404', one Blacksmith size with no fallback. While blacksmith-4vcpu-ubuntu-2404 stopped starting jobs (RUNNER_POOLS marks it _dead), push run 41290983173 (4607b5db06) sat queued with runner_id 0, and development never got cmux#30469.
Change:
- The 12 secondary Linux jobs read
fromJSON(vars.RUNNER_POOLS).linux, the live member runner_pools.py keeps, the same as ci.yml, ci-web.yml and app-platform.yml. Fork and non-manaflow branches are unchanged.tests/test_ci_linux_single_size.pylowers backend.yml's count from 12 to 0 so the pin can't come back. testkeeps its measured 8 vCPU size; itsCI_CLOUD_OVERFLOW_SAVEDfailover moves from the stalled 4 vCPU to 16 (.github/runners.jsonbackend.yml#test).
Rule: no pins, and every job resolves its runner from the declared live set (Leo, 2026-10-28: "I hate pins. Like, just pin the set of the stuff that isn't hilariously slow."). Risk: routing only; environments, secrets and permissions are unchanged. Merging this also pushes backend.yml, so its own run redeploys development at a commit containing b6337d8c.
Tests (local): test_ci_linux_compile_runners, test_ci_blacksmith_linux_sizes, test_ci_repo_variable_defaults, test_runner_routing_table, test_supplychain_security pass. test_ci_linux_single_size, test_ci_blacksmith_linux_failover and test_ci_fork_runner_routing each fail on base the same way, on other workflows (platform-dev-secrets.yml, cmux-next-chromium-currency.yml); none name backend.yml.
Agent session: agent session
š¤ Generated with Claude Code
Summary by cubic
Unblocks backend.yml deploy jobs that sat queued because they pinned one Blacksmith runner size, blacksmith-4vcpu-ubuntu-2404, which stopped starting jobs. The 12 secondary jobs (deploy-development, migrations-push-guard, staging and production deploys, and others) now resolve their runner from fromJSON(vars.RUNNER_POOLS).linux, the live pool that runner_pools.py keeps on a healthy member, matching ci.yml, ci-web.yml, and app-platform.yml.
The test job keeps its measured 8 vCPU size, but its overflow failover moves from the stalled 4 vCPU to 16. A regression test now exempts backend.yml from the single-size rule so the pin can't come back. Fork and non-manaflow branches are unchanged; merging also pushes backend.yml itself, so its own run redeploys development.