ci(web): webview tests run in 8 shards (about -10 min on every webview PR's gate)
Leo (2026-10-31): "IF YOU DONT MERGE STUFF LIKE THAT WITHIN THE DAY THERE'D BETTER BE AN EXTREMELY GOOD REASON ... WITHIN 3 HOURS IF NEEDS CHANGES / WITHIN THE HOUR IF STRAIGHTFORWARD".
Why
Today's webview PRs spent most of their ask-to-merge time waiting on web / react-apps-check (N). The webview verdict gate (react-apps-base-check) can't run until every head shard finishes. On 16 vCPU (#29033), each shard's "Test webviews" step runs its ~100 Vite dev-server files 4 at a time. That took 18-26 min per shard. For #29614 (removing the PR chip row), it was 29 of the 51 minutes from Leo's ask to the merge.
What
react-apps-check-shardruns as 8 shards instead of 4, still on Blacksmith 16 vCPU, with the same 32 vCPU overflow.react-apps-base-checkuses the same 8 shards, one per head shard's results artifact.- Nothing else changes:
- merge-guard reads the declared base-check matrix from this file.
webviews-test-durationsand thereact-apps-checkverdict glob or aggregate whatever shards exist.- The LPT split in
webviews_test_shards.pytakes any count.
- The gate itself is unchanged: the same per-test verdict, now split across 8 shards.
Performance
| metric | before | after | delta | harness or run link |
|---|---|---|---|---|
| slowest react-apps-check shard | p50 24.4 min (11 PR heads since #29033, max 33.1) | 15.6 min (8 shards, 5.5 to 15.6) | -8.8 min | GraphQL check-run timings; after: run 41240581813 |
| web-subarea-scope start to last react-apps-base-check | about 27 min (#29614: 19:54:50 to 20:21:54) | 18.4 min (20:53:39 to 21:12:01) | about -8.6 min | runs 41236343549 / 41240581813 |
web-subarea-scope start to web / react-apps-check verdict | p50 26.4 min | 22.4 min (includes a 4 min queue for the 4 vCPU aggregator job, 1 s on #29614) | -4 min measured, about -8 min without that queue | same |
| Blacksmith 16 vCPU head-shard minutes per webview run | about 4 x 23 = 92 | 92.5 (8 shards summed) | about 0 | run 41240581813 |
The head shards cost about the same in total, because dev-server files dominate and the per-shard setup is small. The base replay adds 4 short jobs (about 1.5 to 2 min each).
Warm sources: unchanged. Each shard restores the bun and Playwright caches, and the shard split reads the shared durations manifest.
Changelog
none
Observed / Not run
- Ran: actionlint on ci-web.yml (clean).
- Ran: checked that every consumer of the shard set globs or reads the matrix (merge-guard
webview_expected_shards, the durations merge, the verdict aggregator). - Not run locally: the CI Python tests (heavy work isn't allowed on this host). This PR's CI runs them.
risk: CI-only (workflow matrix).
Agent session: agent session
š¤ Generated with Claude Code