1# tools/check-songs
2
3`buck2 run //:check-songs` plays every song fast in a silent headless tab
4on the running dev server and prints what Jev did with each one:
5
6- the path it took, section by section: the section Jev picked and every
7  part's answer;
8- **late** answers, which arrived after their section began, so it played
9  its fallbacks;
10- **fallbacks** from the rate limit, a backoff, or an unusable answer;
11- problems Jev's core reported, and the page's warnings and errors.
12
13It exits nonzero when a song fails to evaluate or the page throws.
14
15```
16buck2 run //:check-songs                               # every song, 4× speed
17buck2 run //:check-songs -- --speed 8 lightning-in-a-bottle system-one
18buck2 run //:check-songs -- --url http://localhost:4395 dial-up   # another dev server
19```
20
21Run from a worktree while the dev server serves another checkout, songs hear
22the worktree's `samples/`, and the output says so first
23(`tools/worktree-samples/`). The site's code is still that server's: to
24check a worktree's site or `jevCore` changes, run a dev server from the
25worktree on its own ports (tools/dev/CLAUDE.md) and pass `--url`, as
26`tools/measure` takes it.
27
28It needs `buck2 run //:dev` running and the devshell. Playwright and its
29browsers come from the flake (`.#playwright`, `.#playwright-browsers`), not
30npm.
31
32This complements `website/src/jev/allSongs.test.mjs` (`nix flake check`),
33which evaluates every song in Node against a stand-in Jev. This tool is the
34real thing: the browser, the scheduler, the relay and Jev itself. So it
35needs the dev server, and it spends real calls against the relay's rate
36limit.
37
38At high speed a section can be shorter than Jev's round trip. The parts
39request waits for the section's answer, so late answers at 8× are
40expected and do not happen at 1×.