They read from public/, which does not exist on a clean checkout — CI runs bun test before any build, so the four of them failed there while passing locally against stale build output. serve.ts now takes PUBLIC_DIR, and the tests serve a temporary tree they create themselves. They exercise serve.ts rather than the build, which is what they were always meant to do. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>