ci(runner pools): tests resolve RUNNER_POOLS reads to the declared pool members
Leo-ask: ask-973a915bea
Leo, 2026-10-28: "Where the f***ing are the generalized solution to all these problems that these incessant pins?"
This is step 1 of 4 on feat-cmux-next. It is groundwork and changes no workflow. 475 runs-on lines end in a literal single-size Blacksmith label, and a re-run cannot move a literal. The next PRs point each of those at its size's pool, fromJSON(vars.RUNNER_POOLS).<pool>. main declares those pools (#32393), and runner_pools.py keeps them on a live member. The last PR adds a guard test that refuses a new literal.
What this PR changes:
.github/runners.jsongets a copy of main'spoolsdeclaration.tests/test_ci_runner_pools_copy.pykeeps the copy equal to main's wherever origin/main is in the checkout. It also refuses a workflow that reads an undeclared pool, which would read '' and queue forever.tests/runs_on_labels.pynow parsesfromJSON(vars.RUNNER_POOLS).<pool>and resolves it to that pool's members (never ''). Every guard built on it keeps resolving labels after a literal becomes a pool read. Before this change, the tokenizer stopped at.<pool>.docs/ci-runners.mdgets a Runner pools section.
Observed / Not run
- Ran
python3 tests/X.pyfor every test that imports runs_on_labels, plus test_ci_runner_pools_copy, test_ci_runner_set, test_ci_repo_variable_defaults, test_ci_fork_runner_routing and test_ios_internal_builder. All pass. - Not run: the whole tooling-tests lane.
Performance
| metric | before | after | delta | harness |
|---|---|---|---|---|
| Blacksmith minutes per day | unchanged | unchanged | 0 | tests and docs only; no runs-on changes here |
Changelog
none
Agent session: agent session
š¤ Generated with Claude Code
![View with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v3-3x.png)
![Autofix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark-3x.png)
Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Makes CI tests resolve fromJSON(vars.RUNNER_POOLS).<pool> reads to the declared pool members, so label guards keep working when a literal runs-on label becomes a pool read. Workflows themselves are unchanged.
- Copies main's
poolsdeclaration into.github/runners.json; a new hand-run test keeps the copy equal to main's across the full pool set and refuses reads of an undeclared pool (which would resolve to''and queue forever). - Extends
tests/runs_on_labels.py's parser with property access (.pool) and resolves it to that pool's members. - Adds a Runner pools section to
docs/ci-runners.md.