What
The Playwright e2e suite never runs on pull requests, or on pushes to main. .github/workflows/ci.yml:317:
e2e:
if: >-
(github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')) ||
github.event_name == 'schedule' ||
github.event_name == 'workflow_dispatch'
So the e2e job reports skipped on every PR and every main push, while the overall run reports success. A green check on a PR does not mean the browser suite passed — it means it never ran.
Why this is not theoretical
A batch of bug/low issues shipped today as PRs #554–#558 and #561–#562. Every one showed green CI; e2e was skipped on all of them. Two of those PRs (#556, #557) changed and added e2e specs, and those specs were never executed by CI.
Dispatching the workflow manually against main (run 30474498800, commit 8decf2b) gave the first real signal in this range:
6 failed, 568 passed (6.2m)
with the same two specs failing deterministically on all three engines (chromium, firefox, webkit):
tests/e2e/tile-open-workbench.spec.js:349 — expect(wide.height).toBeGreaterThan(before.height), expected > 208, received 208
tests/e2e/tile-open-workbench.spec.js:398 — items['t-sales']?.span expected 2, received null
That is a real, already-merged regression on main that a PR-level browser check would have caught at the PR. It is filed separately.
Local runs are not a substitute: they are also unreliable here for an unrelated reason (see the shared-port defect in the companion issue), so between the two there is currently no dependable e2e signal at PR time at all.
Suggested fix
Add a path-gated Chromium-only job that runs on pull requests when src/**, tests/e2e/**, playwright.config.js or src/styles.css change, and keep the full three-engine matrix for tags, nightly and manual dispatch. One engine on the affected paths is cheap and would have caught both failures above, since they reproduce on chromium.
Whatever the gating, the CI gate job should not report success when a job that was expected to run was skipped for a path reason — a skipped browser suite should be visible at the PR, not silently green.
Why deferred
Found while shipping unrelated bug/low issues; changing CI topology was outside every one of their scopes.
What
The Playwright e2e suite never runs on pull requests, or on pushes to
main..github/workflows/ci.yml:317:So the
e2ejob reportsskippedon every PR and everymainpush, while the overall run reports success. A green check on a PR does not mean the browser suite passed — it means it never ran.Why this is not theoretical
A batch of
bug/lowissues shipped today as PRs #554–#558 and #561–#562. Every one showed green CI;e2ewasskippedon all of them. Two of those PRs (#556, #557) changed and added e2e specs, and those specs were never executed by CI.Dispatching the workflow manually against
main(run30474498800, commit8decf2b) gave the first real signal in this range:with the same two specs failing deterministically on all three engines (chromium, firefox, webkit):
tests/e2e/tile-open-workbench.spec.js:349—expect(wide.height).toBeGreaterThan(before.height), expected> 208, received208tests/e2e/tile-open-workbench.spec.js:398—items['t-sales']?.spanexpected2, receivednullThat is a real, already-merged regression on
mainthat a PR-level browser check would have caught at the PR. It is filed separately.Local runs are not a substitute: they are also unreliable here for an unrelated reason (see the shared-port defect in the companion issue), so between the two there is currently no dependable e2e signal at PR time at all.
Suggested fix
Add a path-gated Chromium-only job that runs on pull requests when
src/**,tests/e2e/**,playwright.config.jsorsrc/styles.csschange, and keep the full three-engine matrix for tags, nightly and manual dispatch. One engine on the affected paths is cheap and would have caught both failures above, since they reproduce on chromium.Whatever the gating, the
CI gatejob should not report success when a job that was expected to run was skipped for a path reason — a skipped browser suite should be visible at the PR, not silently green.Why deferred
Found while shipping unrelated
bug/lowissues; changing CI topology was outside every one of their scopes.