Problem
The "Run frontend tests" step of the Frontend CI job has grown steadily over the last ~9 days, measured directly from workflow run history (ci.yml, job "Frontend", step "Run frontend tests"):
| Date |
Run |
Duration |
| 2026-07-03 |
#660 (fdeff06) |
131s |
| 2026-07-04 |
#689 (0cfb6f5) |
137s |
| 2026-07-09 |
#715 (ed5bb2f) |
160s |
| 2026-07-12 |
#742 (03e830e, current HEAD) |
213s |
That's a ~63% increase in under two weeks, with no corresponding change to CI parallelism. web/playwright.config.ts sets no workers/shard option, and the Frontend job in ci.yml runs the whole suite serially in a single runner — there is no --shard matrix like Playwright supports.
Root cause
Six new full end-to-end Playwright spec files were added in the same window (git log --diff-filter=A --since=2026-07-03 -- web/tests):
edge-pick.spec.ts, auto-shell.spec.ts, crane-hook-example.spec.ts, multibody-materials.spec.ts, multibody-solve.spec.ts, new-analysis.spec.ts.
The largest single contributor is the mixed shell/solid case added in #392: web/tests/example-load.spec.ts sets test.setTimeout(180_000) and drives a real in-browser RBE3-coupled CG solve (thousands of iterations per the commit message) against a newly committed 2.06 MB crane-hook-shell.vtu fixture. web/tests/edge-pick.spec.ts (90s timeout, real viewport-click flow) is a secondary contributor.
This isn't a bug in any one PR — it's the natural result of the project's validation strategy (one full-browser-plus-WASM spec per new physics capability) with no CI-side scaling to match. At the current growth rate, the frontend job will keep costing more per PR indefinitely as more example/physics coverage is added (see the roadmap of pending shell/multibody capabilities: #354, #355, #357, #359, #388, #389).
Suggested fix
- Shard the Playwright run across parallel CI jobs (
npx playwright test --shard=1/N style matrix), mirroring the pattern CI already uses to run rust / clang-tidy / wasm as separate parallel jobs.
- Alternatively/additionally, split "fast" unit-style specs from "slow" full-solve example specs so the fast set can gate quickly and the slow set runs with more parallelism.
- Track this going forward — e.g. fail CI (or at least warn) if the frontend test step exceeds some threshold, so future growth is caught before it silently becomes the new normal.
Related
Distinct from #365 (no unit tests in the Rust bridge crates — a coverage gap, not a runtime one).
Problem
The "Run frontend tests" step of the
FrontendCI job has grown steadily over the last ~9 days, measured directly from workflow run history (ci.yml, job "Frontend", step "Run frontend tests"):That's a ~63% increase in under two weeks, with no corresponding change to CI parallelism.
web/playwright.config.tssets noworkers/shardoption, and theFrontendjob inci.ymlruns the whole suite serially in a single runner — there is no--shardmatrix like Playwright supports.Root cause
Six new full end-to-end Playwright spec files were added in the same window (
git log --diff-filter=A --since=2026-07-03 -- web/tests):edge-pick.spec.ts,auto-shell.spec.ts,crane-hook-example.spec.ts,multibody-materials.spec.ts,multibody-solve.spec.ts,new-analysis.spec.ts.The largest single contributor is the mixed shell/solid case added in #392:
web/tests/example-load.spec.tssetstest.setTimeout(180_000)and drives a real in-browser RBE3-coupled CG solve (thousands of iterations per the commit message) against a newly committed 2.06 MBcrane-hook-shell.vtufixture.web/tests/edge-pick.spec.ts(90s timeout, real viewport-click flow) is a secondary contributor.This isn't a bug in any one PR — it's the natural result of the project's validation strategy (one full-browser-plus-WASM spec per new physics capability) with no CI-side scaling to match. At the current growth rate, the frontend job will keep costing more per PR indefinitely as more example/physics coverage is added (see the roadmap of pending shell/multibody capabilities: #354, #355, #357, #359, #388, #389).
Suggested fix
npx playwright test --shard=1/Nstyle matrix), mirroring the pattern CI already uses to runrust/clang-tidy/wasmas separate parallel jobs.Related
Distinct from #365 (no unit tests in the Rust bridge crates — a coverage gap, not a runtime one).