ci(web): webview tests run in 8 shards (about -10 min on every webview PR's gate)

Merged
TE
5d ago
+32-7

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-shard runs as 8 shards instead of 4, still on Blacksmith 16 vCPU, with the same 32 vCPU overflow.
  • react-apps-base-check uses 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-durations and the react-apps-check verdict glob or aggregate whatever shards exist.
    • The LPT split in webviews_test_shards.py takes any count.
  • The gate itself is unchanged: the same per-test verdict, now split across 8 shards.

Performance

metricbeforeafterdeltaharness or run link
slowest react-apps-check shardp50 24.4 min (11 PR heads since #29033, max 33.1)15.6 min (8 shards, 5.5 to 15.6)-8.8 minGraphQL check-run timings; after: run 41240581813
web-subarea-scope start to last react-apps-base-checkabout 27 min (#29614: 19:54:50 to 20:21:54)18.4 min (20:53:39 to 21:12:01)about -8.6 minruns 41236343549 / 41240581813
web-subarea-scope start to web / react-apps-check verdictp50 26.4 min22.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 queuesame
Blacksmith 16 vCPU head-shard minutes per webview runabout 4 x 23 = 9292.5 (8 shards summed)about 0run 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