What
.github/workflows/code-quality.yml:111 sets
playwright-test-path: "tests/e2e/spec-coverage"
so the E2E job only ever collects the 7 files under that directory. The job's own log states the scope it chose:
Found 7 Playwright test file(s) in tests/e2e/spec-coverage.
Everything at the tests/e2e/ root is outside it. That is 14 spec files containing 62 tests:
agent-detail-and-chrome dashboard-and-agents docs-screenshots flow-builder-dialect
skill-bundle skill-evals skill-learnings skill-maturity skill-multifile-install
skill-provenance skill-self-improvement sync-conversion-probe tutorial-captures
wave2-surfaces
Why this matters more than a missing-coverage ticket
They are not failing. They are unexecuted — and from outside the job, an unexecuted test is indistinguishable from a passing one. The E2E check reports green, the PR page shows a tick, and 62 assertions about the flow builder, the dashboard, the agent detail page and the whole skill surface contribute nothing to it.
This was found while verifying hermiq#175, which added two tests to flow-builder-dialect.spec.ts and got a green E2E job that never opened the file. The green was about to be read as evidence for a change it had not touched.
Not a one-line fix
Repointing the path at tests/e2e would collect all 62 immediately, and several would fail for reasons unrelated to the code under test:
flow-builder-dialect.spec.ts addresses a flow by a UUID that exists on a local dev instance; CI seeds the Hydra Triage flow instead (spec-coverage/flow-seed.spec.ts)
docs-screenshots.spec.ts and tutorial-captures.spec.ts are capture tools rather than assertions, and probably should not gate a PR at all
So the work is per-file triage into three buckets:
- make it runnable in CI — replace instance-specific fixtures with what the seed provides, then move it under
spec-coverage/
- explicitly local-only — keep it at the root, and document at the top of the file that CI never runs it, so nobody reads a green E2E as covering it
- not a test — move captures out of the
*.spec.ts collection entirely
Suggested acceptance
- Every file under
tests/e2e/ is in exactly one of the three buckets above, and each local-only file says so in its header.
- The E2E job's collected-file count is asserted, so a path that silently collects fewer files fails instead of passing quietly.
That last point is the part that keeps this from recurring: the current setup has no way to notice that it stopped looking.
What
.github/workflows/code-quality.yml:111setsso the E2E job only ever collects the 7 files under that directory. The job's own log states the scope it chose:
Everything at the
tests/e2e/root is outside it. That is 14 spec files containing 62 tests:Why this matters more than a missing-coverage ticket
They are not failing. They are unexecuted — and from outside the job, an unexecuted test is indistinguishable from a passing one. The E2E check reports green, the PR page shows a tick, and 62 assertions about the flow builder, the dashboard, the agent detail page and the whole skill surface contribute nothing to it.
This was found while verifying hermiq#175, which added two tests to
flow-builder-dialect.spec.tsand got a green E2E job that never opened the file. The green was about to be read as evidence for a change it had not touched.Not a one-line fix
Repointing the path at
tests/e2ewould collect all 62 immediately, and several would fail for reasons unrelated to the code under test:flow-builder-dialect.spec.tsaddresses a flow by a UUID that exists on a local dev instance; CI seeds the Hydra Triage flow instead (spec-coverage/flow-seed.spec.ts)docs-screenshots.spec.tsandtutorial-captures.spec.tsare capture tools rather than assertions, and probably should not gate a PR at allSo the work is per-file triage into three buckets:
spec-coverage/*.spec.tscollection entirelySuggested acceptance
tests/e2e/is in exactly one of the three buckets above, and each local-only file says so in its header.That last point is the part that keeps this from recurring: the current setup has no way to notice that it stopped looking.