Part of #26
The watchdog that kills a suite over memory runs only when the runner starts it, and its stop file is the runner's; on 1 November npx vitest run exited 137 because swap already stood at 4.4 GB with nothing of the work running, and the worker read three files to know whether it could go on. frontend/test-results of a red run was wiped by the next project's run before it was copied, twice (mixer-foot.spec.js:79 and :120, patch-document.spec.js:87), so a flake's only evidence is a line somebody wrote down. The line e2e/test.js:37 prints after a slow-backend failure, GROOVE_SEED=… npx playwright test --project <name> <file>:<line>, does not run as printed: --project is variadic and swallows the file. "Run the full suites once" also has to mean one at a time, and two commits went in red because a worker read a summary and not an exit status.
A run should take as little time as it can. The worker caps first written here (--maxWorkers=2, --workers=2) were for a machine with 8 GB; the machine now has 32 GB and 10 cores, so each runner keeps its own worker count. The suites still run one after another: cargo's build beside WebKit would turn timing into flakes, and a rerun costs more than the overlap saves. Each suite's time is printed, so the slowest can be worked on with numbers.
Done when scripts/suite runs cargo, Vitest and Playwright (then --project slow-backend when asked) one after another, each with its runner's own worker count; prints each suite's wall time beside its exit status; refuses to start when more than 2 GB of swap is in use or less than 20 GB of disk is free, printing both; copies frontend/test-results of a red run to a folder named for the run before anything else can wipe it; prints its own exit status last, never through a pipe; and e2e/test.js prints the replay line with the file before --project. CLAUDE.md's Commands name it as the way to run everything before a push.
Done in 2c510ee.
scripts/suite [--slow]runs everything before a push, and CLAUDE.md's Commands name it.slow-backendwith--slow, each runner with its own worker count. A red suite does not stop the ones after it. Vitest alone was green in 23 s with its default and 31 s with--maxWorkers=4, so no cap.SUITE_MAX_SWAP_MB,SUITE_MIN_FREE_GB). Swap that cannot be read refuses too.frontend/test-resultsis copied totarget/suite/<run>/<project>before the next project runs, and the line names the folder.suite: exit <status>(0, 1 red, 2 usage, 3 refused, 128 + signal). Each suite runs underscripts/time-limit.pl(SUITE_LIMIT, 3600 s), so a signal stops its whole group.e2e/replay.jsputs the file before--project; both failures below were replayed as printed.A warm run: cargo 19 s, Vitest 23 s, Playwright 1m 43s, slow-backend 2m 36s.
frontend/test/suite.test.jsandreplay.test.jswere red before the code; four mutants (the copy removed, the swap limit loosened, the replay order swapped back, a red status ignored) each went red.Both full runs were red in slow-backend only, in a piano-roll spec's move to a clip that passes alone with the same seed: filed on its own.