Context
Found during the PR #15327 verification chain and then verified independently of it (the finding survives the instrument failure documented on #15365): no GitHub workflow executes playwright.config.component.mjs.
The Problem
- Fresh check run on PR #15327 (a
src/button + component-test PR, head dfcf0a1fd0): job set is CodeQL / integration-unified / lint / unit / Analyze / Classify test scope / lint-pr-body — no component job.
grep -rln "playwright.config.component|component/" .github/workflows/ → zero hits.
So every mounted component witness under test/playwright/component/** (button disabled semantics, viewport specs, …) is local-only evidence. A PR whose component tests fail ships green checks — that is how PR #15327's witnesses went unexecuted by CI while its checks stayed green (the tests themselves are correct and pass locally on a correct server; see #15365's correction trail).
Compounding trap (sibling, distinct): playwright.config.component.mjs hard-codes url: http://localhost:8080 + reuseExistingServer: !process.env.CI — locally it silently reuses ANY server on :8080, including one serving a different checkout. That produced a full false-negative probe chain today (#15365). The server-reuse leaf is @neo-fable-clio's incoming tooling ticket; this ticket owns only the CI-absence half.
The Architectural Reality
.github/workflows/ runs unit / e2e / integration configs via the test-scope classifier; the component config predates or escaped that wiring. reuseExistingServer: !CI implies the config was WRITTEN expecting CI execution — the wiring just never landed.
The Fix
Wire playwright.config.component.mjs into the existing test workflow as a classified shard (same pattern as unit/e2e): run on PRs whose diff touches src/** or test/playwright/component/**. Port discipline per the e2e config precedent (NEO_E2E_PORT-style env or per-process free-port resolution) so CI runners don't collide.
Acceptance Criteria
Out of Scope
- The local
reuseExistingServer/:8080 foreign-server trap — @neo-fable-clio's tooling leaf.
- Back-filling witnesses for past PRs; #15327's own tests land with its merge.
Related
PR #15327 (the PR whose witnesses CI never ran) · #15365 (the instrument-failure trail that surfaced this; closing with correction) · #15362 (today's sibling: shard-skip signal-swallower on dev pushes).
Live latest-open sweep: checked latest open at 2026-07-17T15:49Z (latest #15364); no equivalent (CI/workflow tickets present are #15353 CodeQL-extractor and #15362 parity — different). A2A in-flight: Clio's announced tooling ticket covers the server-reuse trap, explicitly not this CI-absence gap.
Decision Record impact: none.
Origin Session ID: 2dcbf336-4338-4009-82f3-79f1b1d151f1
Retrieval Hint: "component playwright config no CI workflow shard green-by-absence mounted witnesses"
Context
Found during the PR #15327 verification chain and then verified independently of it (the finding survives the instrument failure documented on #15365): no GitHub workflow executes
playwright.config.component.mjs.The Problem
src/button+ component-test PR, headdfcf0a1fd0): job set is CodeQL / integration-unified / lint / unit / Analyze / Classify test scope / lint-pr-body — no component job.grep -rln "playwright.config.component|component/" .github/workflows/→ zero hits.So every mounted component witness under
test/playwright/component/**(button disabled semantics, viewport specs, …) is local-only evidence. A PR whose component tests fail ships green checks — that is how PR #15327's witnesses went unexecuted by CI while its checks stayed green (the tests themselves are correct and pass locally on a correct server; see #15365's correction trail).Compounding trap (sibling, distinct):
playwright.config.component.mjshard-codesurl: http://localhost:8080+reuseExistingServer: !process.env.CI— locally it silently reuses ANY server on :8080, including one serving a different checkout. That produced a full false-negative probe chain today (#15365). The server-reuse leaf is @neo-fable-clio's incoming tooling ticket; this ticket owns only the CI-absence half.The Architectural Reality
.github/workflows/runs unit / e2e / integration configs via the test-scope classifier; the component config predates or escaped that wiring.reuseExistingServer: !CIimplies the config was WRITTEN expecting CI execution — the wiring just never landed.The Fix
Wire
playwright.config.component.mjsinto the existing test workflow as a classified shard (same pattern as unit/e2e): run on PRs whose diff touchessrc/**ortest/playwright/component/**. Port discipline per the e2e config precedent (NEO_E2E_PORT-style env or per-process free-port resolution) so CI runners don't collide.Acceptance Criteria
src/button/**shows a component-shard check that actually executestest/playwright/component/**.Out of Scope
reuseExistingServer/:8080 foreign-server trap — @neo-fable-clio's tooling leaf.Related
PR #15327 (the PR whose witnesses CI never ran) · #15365 (the instrument-failure trail that surfaced this; closing with correction) · #15362 (today's sibling: shard-skip signal-swallower on dev pushes).
Live latest-open sweep: checked latest open at 2026-07-17T15:49Z (latest #15364); no equivalent (CI/workflow tickets present are #15353 CodeQL-extractor and #15362 parity — different). A2A in-flight: Clio's announced tooling ticket covers the server-reuse trap, explicitly not this CI-absence gap.
Decision Record impact:
none.Origin Session ID:
2dcbf336-4338-4009-82f3-79f1b1d151f1Retrieval Hint:
"component playwright config no CI workflow shard green-by-absence mounted witnesses"