ci(nightly): build-nightly-app and the cold seed take blacksmith-6vcpu-macos-26, not the stalled 12 vCPU label

LA
8d ago
+117-20

Stacked on #27444. The first two commits (4eed88bab78, 171e7934894) are #27444, which adds the picker's ONLY setting that this PR uses. Review c1e4add7d24 (test) and b832824b55d (fix). Merge #27444 first.

Summary

Two more nightly jobs on main can still route to blacksmith-12vcpu-macos-26, which hasn't started a job since 2026-10-28 20:32Z. In the last 100 nightly.yml runs (back to 2026-10-29 06:18Z), 0 of the 10 jobs that asked for it got a runner. Main's classic nightly run 40834485210 has waited since 07:47Z on that label for signing (#27444 fixes that path).

  • build-nightly-app takes the trusted mini first. When the mini is busy or offline, and on every later attempt, it takes pick-nightly-app-runner's cloud. The picker puts 12 vCPU first, so with both queues moving, or with no snapshot, cloud is 12 vCPU. The runs-on literal is 12 vCPU too. Now the pick sets ONLY: 6vcpu and the literal is 'blacksmith-6vcpu-macos-26'. The trusted-mini path doesn't change. The compilation cache keys on OS, arch and toolchain, not instance size. 6 vCPU built this app in 8 min today (runs 40833785678, 40834485210).
  • refresh-test-compilation-cache (the scheduled cold seed) put its first matrix pool on the 12 vCPU sibling of the 6 vCPU pull-request pool. Now that entry is the pull-request pool as is: vars.MACOS_RUNNER_PR || 'blacksmith-6vcpu-macos-15', the same expression as seed-derived-data.yml's SEED_POOL_2. test_seed_derived_data.py still holds the nightly pools to a subset of the per-push seed pools.

Side effects:

  • seed_derived_data.py scope puts the width (j<nproc>) in the key. So the nightly cold seed now writes j6 keys, not j12. A 12 vCPU admission still gets the per-push SEED_POOL_1 chain and falls back to j6. While CI_PR_POOL_OWNED=1, the schedule skips this job, and only a seed_only dispatch runs it.
  • owned_pool_rescue.retry_labels() for nightly runs at new SHAs no longer counts the 12 vCPU label.

After this PR and #27444, no runs-on or matrix in nightly.yml names the 12 vCPU label, and its pickers never produce it.

Known nit, left on purpose: the step name "Pick the trusted mini or a moving cloud macOS label" in pick-nightly-app-runner is now out of date, because the cloud label no longer moves. A rename would need another review round.

Left as is: seed-derived-data.yml's SEED_POOL_1 still seeds the 12 vCPU sibling. That pool also publishes the app-host product, and pull-request admission can still pick 12 vCPU (pr_runner_pool.py). Moving it changes which seed widths exist, so it needs its own PR.

Testing

Regression: python3 tests/test_classic_nightly_build_runner.py. The new BuildAndSeedStayOffTwelveVcpu reads pick-nightly-app-runner's real step env and runs main() over 4 snapshot states and attempts 1 and 2. It also checks build-nightly-app's fallback literal and that no nightly.yml runs-on or matrix names the 12 vCPU label. On c1e4add7d24 (test only) it fails 10 checks. On the head, all tests pass. tests/test_nightly_universal_build.sh, which pins the build's runs-on, also fails on c1e4add7d24 and passes on the head.

Observed / Not run

Observed, run locally on the head, all pass:

  • test_classic_nightly_build_runner.py and test_seed_derived_data.py.
  • test_ci_owned_pool_rescue.py and the signing keychain guard.
  • test_ci_publisher_mac_jobs_move.py, test_ci_pr_runner_pool.py and test_ci_queue_janitor.py.
  • test_runner_label_policy.py, test_ci_runs_on_values.py, test_ci_no_github_hosted_macos.py and test_ci_nightly_off_blacksmith.py.
  • test_ci_pull_request_caches_are_read_only.py, test_delivery_workflows_cancel.py, test_nightly_delivery_concurrency.py and test_ci_workflow_concurrency.py.
  • test_seed_decide.py, test_ci_canonical_build_root.py, test_reuse_app_host_products.py, test_ci_cloud_overflow_switch.py and test_ci_repo_variable_defaults.py.
  • tests/test_nightly_universal_build.sh, tests/test_ci_test_compilation_cache_seed.sh and tests/test_ci_self_hosted_guard.sh.
  • actionlint 1.7.7 (SHELLCHECK_OPTS=-S warning) on nightly.yml: clean.

test_ci_owned_pool_sources.py fails 1 check, the same way on origin/main 18f2c43e955. That check reads the feat-cmux-next tree, so this PR doesn't cause it.

Not run: a nightly or a scheduled seed with this change. A cold build on 6 vCPU was not timed; today's two 6 vCPU builds were warm. The job's timeout stays 90 min.

Changelog

none