ci(web): react-apps-check shards run on Blacksmith 16 vCPU (-1.36M vCPU-min/day), failing over to 32

Merged
TE
6d ago
+14-7

The webview test shards (react-apps-check (1..4) and their base replay react-apps-base-check) move from Blacksmith 32 vCPU to Blacksmith 16 vCPU. The overflow failover still goes to the other size (now 32). No other job changes. (Fork PRs resolve to Blacksmith on this job, as they did before this PR; the review follow-up is filed separately.)

Leo, 2026-10-30:

i assume blacksmith prob cut us off cuz we were using like $10k a day so

y'know, we'll have to be more self-reliant and size the stuff better

and later:

i mean the linux things cant our minis just run them

This PR only resizes jobs. The shards install Playwright Chromium with apt (--with-deps), so they count as Linux-only and the mini fallback does not apply here. The table below marks which of the other top jobs could run on owned minis; that work belongs in follow-ups.

Why these jobs

They cost the most on Blacksmith. Over 2026-10-29/30 (the fleet's daily GitHub job export), the shards used about 99k wall minutes a day at 32 vCPU, roughly 3.2M vCPU-minutes. The same days also had 303 shard runs that the overflow failover had already sent to 16 vCPU, which gives a same-suite comparison:

shard runs, 2026-10-28..30np50p90max
32 vCPU, pull_request, success6830972 s1377 s2251 s
16 vCPU, pull_request, success2571107 s1681 s2139 s
32 vCPU, push, success1088886 s1274 s1865 s
16 vCPU, push, success461016 s1499 s1812 s

On 16 vCPU the shards take 14% longer at p50 and cost half as much per minute. No 16 vCPU run hit the 40 min timeout or ran out of memory. The 4 vCPU OOM in run 37666132324 is why test_webviews_tests_run_on_a_runner_with_room_for_the_suite still forbids 4 vCPU.

Performance

metricbeforeafterdeltaharness or run link
shard Blacksmith vCPU-minutes / day~3.17M (99k min Ɨ 32)~1.81M (113k min Ɨ 16)-1.36M (-43%)gh-jobs export 2026-10-29/30; the after value scales the measured 16 vCPU p50 ratio (1.14)
shard Blacksmith wall minutes / day~99k~113k+14ksame
est. Blacksmith $ / day (list $0.004/min per 2 vCPU)~$6.3k~$3.6k-$2.7ksame
shard p50 wall (PR)972 s1107 s+135 s6830 vs 257 runs above
shard p90 wall (PR)1377 s1681 s+304 ssame

Top 10 cmux jobs by Blacksmith use (2026-10-29/30, per day)

#job (workflow)wall min/dayvCPU-min/daymeasuredrunner todaysmallest fit / owned optionLinux-only?
1web / react-apps-check (1-4) (ci-web via ci.yml and cmux-next web)~99k~3.17Mp50 972 s PR, Test webviews step 765-898 s32 vCPU16 vCPU (this PR)yes (Playwright apt deps)
2gallery health / health (4 shards)44.3k716kmean 619 s, render 448 s16 vCPU8 vCPU to measure; fewer shards on a PR that touches few entriesyes (Playwright apt deps)
3cmux-tui artifacts / build aarch64-apple-darwin11.0k349kmean 610 s32 vCPUowned Mac builds it nativelyno (darwin target; a mini builds it natively)
4cmux-tui artifacts / build x86_64-apple-darwin10.7k339kmean 594 s32 vCPUowned Macno
5cmux-next fast tier (cargo)9.9k282kmean 217 s; cargo step 92 s at 32, 194 s at 1632 vCPUstays 32 (CPU-bound) or an owned Macno (cargo)
6cmux-next checks16.4k264kmean 346 s, mostly Python script tests16 vCPU4 vCPU or any owned minino
7cmux-tui artifacts / build aarch64-unknown-linux-musl7.7k240kmean 417 s32 vCPU16 vCPUyes (musl)
8cmux-tui artifacts / build x86_64-unknown-linux-musl7.4k231kmean 403 s32 vCPU16 vCPUyes (musl)
9cmux-next guards / CI guard group12.4k221k145 s at 32, 277 s at 432 / 4 vCPU4 vCPU or any owned minino (Python guards)
10Fast / checks (fast-checks.yml, dispatch on main)6.2k199kmean 188 s32 vCPU16 vCPUmixed

Not in the vCPU top 10 but high in wall minutes:

  • cmux-tui artifacts / build-windows (20.2k on 4 vCPU Windows).
  • nightly-guards / workflow-guard-tests / release-notary (18.3k on 4 vCPU; Python, so not Linux-only and could move to a mini).
  • generated catch-up / catch up (9.5k on 2 vCPU, 279 s of it in checkout).

Risk

  • Slower webview verdict. A PR's verdict comes about 2 min later at p50 and 5 min later at p90. The webview verdict gates landing (rulebook), so this is wall time on the landing path.
  • Timeout tail. The slowest 16 vCPU run took 2139 s against the 2400 s timeout-minutes: 40. The 1920 s retry deadline still stops retries before the uploads. If timeouts appear, the fix is a fifth shard, not going back to 32.
  • Memory. No 16 vCPU shard was SIGKILLed in 303 runs. run-webviews-tests.sh sizes its file and dev-server pools from nproc, so it runs fewer at once on its own.
  • Failover. While CI_CLOUD_OVERFLOW_SAVED is set, the shards go to 32 vCPU, the switch's pairing for 16 (test_ci_blacksmith_linux_failover).

Tests

  • tests/test_web_validation.py now expects 16 vCPU with the 32 failover. Run locally: 14 OK.
  • tests/test_runs_on_labels.py: OK.
  • tests/test_ci_blacksmith_linux_failover.py: 1 failure, app-platform.yml:45. It fails the same way on base cecaf56b, so it is a base red and not from this change.
  • pr-overlap: no open PR on feat-cmux-next overlaps this change. Prior art was read: #24927 set 32 vCPU when the base replay was split out, and #26439 added the failover. Neither had a cost reason for 32.

šŸ¤– Generated with Claude Code

Agent session: agent session