feat(smoke): launch celilo's provisioned browser, and keep the artifacts #62
No reviewers
Labels
No labels
area/auth
area/backend
area/ci
area/deploy
area/e2e
area/frontend
area/shared
blocked
good-first-issue
needs-info
priority/high
priority/low
priority/medium
type/bug
type/chore
type/docs
type/feature
type/tech-debt
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
celilo/lunacycle!62
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "adopt-managed-browser"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The second half of the managed-browser-runtime adoption, following #60 (the
launch()guard). Unblocked by@celilo/capabilities@2.1.0, published today — verified by pulling the tarball and checking the export is really in it, not by the release run going green.executablePath, at both launch sitesplaywright-coreresolves its browser through a cache directory keyed by a revision that is a property of our client version:playwright-corechromium-1193chromium-1223So bumping the client here silently changed which binary ran — the defect this whole thread started from. Both sites now resolve through
resolveBrowser()and passexecutablePathexplicitly, which bypasses that resolution entirely. It is the only arrangement under which a client bump cannot move the browser out from under us.The severity split, honoured at both sites
This is the part that is load-bearing rather than decorative. celilo installs the browser only on request (
install_browser, default false), sonot_provisionedis the normal state of a host:warn, and the run continuesSPA smoke SKIPPED, and the job still succeedsReporting it as a failure would take lunacycle from VERIFIED to permanently INSTALLED on any host that never opted in — this hook throws on any failing item, and celilo maps any fail → unhealthy → verification withheld. That is a fleet-wide outage caused by a flag nobody set.
unusable— a browser that was installed and no longer works — fails. So does a launch error after a successful resolve, whatever error type playwright raises: a browser celilo approved that will not start has stopped working, and is not reclassified.Artifacts leave
/tmp/tmp/lunacycle-smokedid not survive a reboot, and was named in an alert the operator reads from a different machine. The hook now writes toHookContext.screenshotDir; the subscriber has no hook context, so it derives the same per-run layout viamoduleArtifactDir()— the whole reason that function exists rather than being a context field.Fixed filenames stay. They are safe now: the framework namespaces per run, collects the entire directory, and prunes by age. The instinct behind them ("the interesting artifact is the most recent failure") was right; only the destination was wrong.
One thing worth reviewing
resolveBrowseris injectable, mirroring the existingloadChromiumseam. Without it every test would resolve against the real/var/lib/celilo/browsers, getnot_provisionedon any developer machine, and silently downgrade the launch-failure test to awarn— a test that proves nothing while staying green. That failure mode is quiet enough to be worth naming.New tests: the two severities asserted separately (a missing browser must not throw; an unusable one must), and that the provisioned
executablePathis what actually reacheslaunch().Gates
bun test celilo/scripts/→ 69 pass ·tsc -p celilo/scriptsexit 0 ·bun run lintexit 0 (exit codes read, not inferred from output shape).celilo/scripts/package.jsonmoves^2.0.0→^2.1.0with the lockfile updated — the range already allowed it, but the lock pinned 2.0.0 and CI runs--frozen-lockfile.What still has to happen for this to do anything
An operator sets
install_browser: trueoncelilo-mgmtand redeploys it. Until then/var/lib/celilo/browsersdoes not exist and this reportsnot_provisioned— non-fatal, degrading to the samewarnthe old path produced when playwright-core was missing. That is the design working, not a gap.🤖 Generated with Claude Code
/tmp/lunacycle-smoke, which the hook jail turns into a lying diagnostic — move them tostate/#64