ci(runner pools): tests resolve RUNNER_POOLS reads to the declared pool members

Merged
TE
4d ago
+251-2

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.json gets a copy of main's pools declaration. tests/test_ci_runner_pools_copy.py keeps 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.py now parses fromJSON(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.md gets a Runner pools section.

Observed / Not run

  • Ran python3 tests/X.py for 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

metricbeforeafterdeltaharness
Blacksmith minutes per dayunchangedunchanged0tests and docs only; no runs-on changes here

Changelog

none

Agent session: agent session

šŸ¤– Generated with Claude Code


View with [code]smith Autofix with [code]smith
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 pools declaration 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.