Slice 3 of 3 from #277. Depends on the harness from #385.
What this lands
A workflow_dispatch-only GitHub Actions workflow that stands up the stack, seeds it, and runs the Playwright E2E smoke suite.
workflow_dispatch only — deliberately not automatic. The same reasoning that keeps the #243 sim harness out of CI applies here and applies harder: this needs a full app + Postgres boot plus a multi-minute seed before the first assertion runs, so a per-push job would be badly out of proportion to what it checks. The trade the owner accepted: it costs nothing until somebody clicks it, at the price of a workflow that nothing exercises on its own — so keeping it working is a human responsibility, exactly like tools/simulation/ itself (see the "KEEPING THIS HARNESS ALIVE" section of tools/simulation/README.md, and the #370 rule in AGENTS.md).
The portability constraint this slice actually has to solve
A GitHub runner is not NixOS. Locally the suite drives the system chromium via an explicit executable path, because Playwright's downloaded browsers do not launch on NixOS. On a runner the opposite is true — there is no system chromium, and npx playwright install chromium is the working path.
So the browser resolution has two live paths, and this workflow is the only thing that would ever exercise the second one. If it is never run, that path rots silently. Note that plainly in the workflow and in the harness README.
Acceptance
Tracked in epic #15, under #277.
Slice 3 of 3 from #277. Depends on the harness from #385.
What this lands
A
workflow_dispatch-only GitHub Actions workflow that stands up the stack, seeds it, and runs the Playwright E2E smoke suite.workflow_dispatchonly — deliberately not automatic. The same reasoning that keeps the #243 sim harness out of CI applies here and applies harder: this needs a full app + Postgres boot plus a multi-minute seed before the first assertion runs, so a per-push job would be badly out of proportion to what it checks. The trade the owner accepted: it costs nothing until somebody clicks it, at the price of a workflow that nothing exercises on its own — so keeping it working is a human responsibility, exactly liketools/simulation/itself (see the "KEEPING THIS HARNESS ALIVE" section oftools/simulation/README.md, and the #370 rule inAGENTS.md).The portability constraint this slice actually has to solve
A GitHub runner is not NixOS. Locally the suite drives the system chromium via an explicit executable path, because Playwright's downloaded browsers do not launch on NixOS. On a runner the opposite is true — there is no system chromium, and
npx playwright install chromiumis the working path.So the browser resolution has two live paths, and this workflow is the only thing that would ever exercise the second one. If it is never run, that path rots silently. Note that plainly in the workflow and in the harness README.
Acceptance
Tracked in epic #15, under #277.