What to build
bin/setup (#82) installs bun deps and builds the dummy/web fixture, but the suite still cannot
run on a fleet box: it drives a real Chromium, and nothing installs one. Measured on the first run
after #82 landed (tsk_2d709e16…, for #80) — the gate RAN this time and went red on an unmodified
checkout (box_baseline_red):
AdapterError: browser.create failed: cannot launch Chrome — launchPersistentContext:
Chromium distribution 'chrome' is not found at /opt/google/chrome/chrome
Run "npx playwright install chrome"
at createFailure (src/adapters/browser/launch.ts:194:10)
(fail) buildSession records the app address in story.md for a web run
So bin/setup must install the browser, and it must do it the way .github/workflows/ci.yml already
learned to — that file records two hard-won facts, do not re-learn them:
- Use the repo-pinned CLI, never
bunx playwright. ci.yml:71-73: bunx playwright resolves an
unpinned version and "exit 0 in 0.7s without fetching the headless shell the pinned version
requires" (run 34583721201). The command is:
node node_modules/playwright-core/cli.js install chromium
- No apt on any path.
ci.yml:59-66: the install fetches from Playwright's CDN over HTTPS; the
system libs install-deps would add are already on the image, and the Ubuntu mirrors are what
flake. Do not add install-deps.
Mirror CI's bounded retry (timeout --kill-after=30 300, 3 attempts, backoff) so a wedged CDN fetch
cannot hang a box's setup indefinitely, and make it idempotent — skip when ~/.cache/ms-playwright
already holds the pinned chromium (CI caches on hashFiles('bun.lock') for the same reason).
Then reuse CI's "verify chromium launches" idea as the last step of bin/setup: prove the launch
surface is there, so a missing headless shell fails in setup with the error naming it, not as a
mystery inside bun test.
Acceptance criteria
AFK / HITL
AFK.
Affected paths
bin/setup
Blocked by
None — #82 is merged.
What to build
bin/setup(#82) installs bun deps and builds thedummy/webfixture, but the suite still cannotrun on a fleet box: it drives a real Chromium, and nothing installs one. Measured on the first run
after #82 landed (
tsk_2d709e16…, for #80) — the gate RAN this time and went red on an unmodifiedcheckout (
box_baseline_red):So
bin/setupmust install the browser, and it must do it the way.github/workflows/ci.ymlalreadylearned to — that file records two hard-won facts, do not re-learn them:
bunx playwright.ci.yml:71-73:bunx playwrightresolves anunpinned version and "exit 0 in 0.7s without fetching the headless shell the pinned version
requires" (run 34583721201). The command is:
ci.yml:59-66: the install fetches from Playwright's CDN over HTTPS; thesystem libs
install-depswould add are already on the image, and the Ubuntu mirrors are whatflake. Do not add
install-deps.Mirror CI's bounded retry (
timeout --kill-after=30 300, 3 attempts, backoff) so a wedged CDN fetchcannot hang a box's setup indefinitely, and make it idempotent — skip when
~/.cache/ms-playwrightalready holds the pinned chromium (CI caches on
hashFiles('bun.lock')for the same reason).Then reuse CI's "verify chromium launches" idea as the last step of
bin/setup: prove the launchsurface is there, so a missing headless shell fails in setup with the error naming it, not as a
mystery inside
bun test.Acceptance criteria
bin/setupon a clean checkout,bin/checkexits 0 (the baseline is green)node node_modules/playwright-core/cli.js install chromium, notbunx playwrightapt/install-depsanywhere inbin/setupbin/setupwith the browser already present does not re-download itbin/setupwith a message naming Chromium, beforebin/checkruns.github/workflows/ci.yml,package.json, orsrc/AFK / HITL
AFK.
Affected paths
bin/setup
Blocked by
None — #82 is merged.