test/e2e: correct the claim that headed Chromium cannot launch here

It can, and normally in well under a second. Two launches hung for the full
180s handshake timeout under heavy concurrent docker and test load, and I wrote
that up as "headed is impossible from an agent shell" and moved everything to
headless. That was wrong, and wrong in a way that would have quietly degraded
every future browser check.

The display is reachable: DISPLAY=:0, XAUTHORITY set to the mutter XWayland
cookie, both the Wayland socket and /tmp/.X11-unix/X0 present, xdpyinfo happy.
The README now says to check xdpyinfo and retry rather than conclude anything,
and batch10-anonpull.mjs defaults to headed again.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SeaUS5AFPX9gqCahoLRMRh
This commit is contained in:
Evan Jarrett
2026-08-25 16:34:25 -05:00
co-authored by Claude Opus 5
parent 17e25a4df2
commit 34b4516aa7
2 changed files with 10 additions and 6 deletions
+8 -6
View File
@@ -73,12 +73,14 @@ concluding anything from a 404.
text finds nothing and reports "no tags render" against a page that is
rendering them correctly.
**A headed browser will not launch from an agent shell here.** Both
`chromium.launch()` and `launchPersistentContext()` time out on the handshake
despite `DISPLAY=:0` being set; headless works. Interactive flows (the admin
login, `docker-credential-atcr login`) still need a human at a real browser —
but non-interactive page checks can run headless, and `batch10-anonpull.mjs`
does.
**Headed works; if it times out, retry before concluding otherwise.** A headed
`launchPersistentContext` normally comes up in well under a second — the
display is reachable (`DISPLAY=:0`, `XAUTHORITY` set to the mutter XWayland
cookie, both the Wayland socket and `/tmp/.X11-unix/X0` present; `xdpyinfo`
confirms it). Two launches did once hang for the full 180s handshake timeout
under heavy concurrent docker and test load, which is easy to misread as "headed
is impossible here" and switch everything to headless. It is not. Check
`xdpyinfo` and retry.
**Logged-out checks need their own profile.** `lib.mjs`'s `PROFILE` is signed
in, and clearing its cookies costs an interactive re-login for everything else.
+2
View File
@@ -18,6 +18,8 @@ import { APPVIEW } from './lib.mjs';
const HOLD = process.env.ATCR_HOLD_URL ?? 'http://127.0.0.1:8080';
const HANDLE = process.env.ATCR_E2E_HANDLE ?? 'evan.jarrett.net';
const REPO = process.env.ATCR_E2E_REPO ?? 'valtest';
// Defaults to headed, which is how these are meant to be watched.
// ATCR_E2E_HEADLESS=1 for unattended runs.
const HEADLESS = process.env.ATCR_E2E_HEADLESS === '1';
const captain = await fetch(