Context
PR #15719 restores the two platform-sensitive component witnesses from #15374. On macOS, after a canonical development-theme rebuild, its focused component run passed 11/11. Exact-head Linux CI at 9569facea11078be35040f11c2ce85e35d1ca14e instead failed both restored witnesses in run 29927439958, job 88948169504.
The first causal signal precedes either assertion:
[dev-server] WARNING: development theme assets are missing, stale, invalid, or borrowed.
Recovery: npm run build-themes -- -n -e dev -t all
The two failures then expose unstyled/native facts: native-disabled Chromium paint differs on all three root color axes, and the left label resolves to its 137.328125px intrinsic text width rather than the configured 100px authored layout.
The Problem
dist/ is intentionally ignored. A clean GitHub runner therefore starts with no development CSS, but test/playwright/playwright.config.component.mjs launches npm run server-start directly and has no theme preflight. The merged #15666 dev-server guard correctly warns; it is intentionally fail-soft and does not materialize assets.
This makes the components shard an unreliable product oracle. CSS-sensitive witnesses can fail against UA/default layout, while other specs can report green without ever exercising the current SCSS tree.
Architectural Reality
#15449 / PR #15584 already landed the single authority:
ensureDevelopmentThemeAssets() inspects completeness/freshness, rejects borrowed symlinks, builds exactly once when required, and revalidates.
test/playwright/e2e/globalSetup.mjs is an executable, idempotent consumer.
- The E2E Playwright config invokes that same module both as
globalSetup and before the web-server command because Playwright starts webServer first.
The component suite has the same source-server/theme dependency and should reuse that exact preflight. A workflow-only npm run build-themes step or a second inspector would duplicate authority and leave local component runs divergent.
The Fix
Mirror the landed E2E ordering contract in test/playwright/playwright.config.component.mjs:
- reuse
./e2e/globalSetup.mjs as the Playwright globalSetup;
- execute the same idempotent module before
npm run server-start in webServer.command;
- add no new builder, inspector, cache, or generated tracked output.
Contract Ledger
| Surface |
Authority |
Required behavior |
Fallback / edge |
Evidence |
| Component-suite prerequisites |
ensureDevelopmentThemeAssets() from #15449 |
clean/stale checkout materializes current local themes exactly once |
build/revalidation failure stops before browser assertions |
tracked-only component launch |
| Startup ordering |
executable e2e/globalSetup.mjs precedent |
preflight completes before the component web server can serve CSS; Playwright hook revalidates/no-ops |
no foreign-server or foreign-symlink adoption |
server log + inspector state |
| Local/CI parity |
component Playwright config |
the same command path owns developer and CI runs |
no workflow-only fix |
local focused run + Linux shard |
| #15374 consumer |
PR #15719 |
restored paint/geometry witnesses see authored CSS |
assertion defects remain owned by #15374 |
exact-head Linux rerun |
Acceptance Criteria
Negative-ROI Challenge
Positive ROI. The implementation is a two-seam reuse in one existing config file, while the current gap invalidates the trust boundary of the whole browser component shard. Building in the workflow alone is rejected because it would not repair local parity.
Out of Scope
- The two #15374 witness assertions themselves.
- The dev-server warning behavior (#15666).
- Theme watch/add/rename/delete lifecycle (#15585).
- Visual golden policy, which intentionally remains fail-loud.
Related
#15374 · PR #15719 · #15449 / PR #15584 · #15666 / PR #15713 · #15585
Live duplicate/content sweep: latest 20 open issues plus all-state searches for component themes, Playwright component global setup, missing development CSS, and matching PRs at 2026-07-22T14:18:14Z; no equivalent ticket or implementation found. #15449 is the E2E precedent, and #15666 is the warning-only boundary.
Decision Record impact: none.
Origin Session ID: cb60301d-74a4-4024-b80d-2f7efdbf9cd1
Retrieval Hint: "components CI missing dist development CSS ensureDevelopmentThemeAssets globalSetup UA-only witness"
Context
PR #15719 restores the two platform-sensitive component witnesses from #15374. On macOS, after a canonical development-theme rebuild, its focused component run passed 11/11. Exact-head Linux CI at
9569facea11078be35040f11c2ce85e35d1ca14einstead failed both restored witnesses in run 29927439958, job 88948169504.The first causal signal precedes either assertion:
The two failures then expose unstyled/native facts: native-disabled Chromium paint differs on all three root color axes, and the left label resolves to its 137.328125px intrinsic text width rather than the configured 100px authored layout.
The Problem
dist/is intentionally ignored. A clean GitHub runner therefore starts with no development CSS, buttest/playwright/playwright.config.component.mjslaunchesnpm run server-startdirectly and has no theme preflight. The merged #15666 dev-server guard correctly warns; it is intentionally fail-soft and does not materialize assets.This makes the components shard an unreliable product oracle. CSS-sensitive witnesses can fail against UA/default layout, while other specs can report green without ever exercising the current SCSS tree.
Architectural Reality
#15449 / PR #15584 already landed the single authority:
ensureDevelopmentThemeAssets()inspects completeness/freshness, rejects borrowed symlinks, builds exactly once when required, and revalidates.test/playwright/e2e/globalSetup.mjsis an executable, idempotent consumer.globalSetupand before the web-server command because Playwright startswebServerfirst.The component suite has the same source-server/theme dependency and should reuse that exact preflight. A workflow-only
npm run build-themesstep or a second inspector would duplicate authority and leave local component runs divergent.The Fix
Mirror the landed E2E ordering contract in
test/playwright/playwright.config.component.mjs:./e2e/globalSetup.mjsas the PlaywrightglobalSetup;npm run server-startinwebServer.command;Contract Ledger
ensureDevelopmentThemeAssets()from #15449e2e/globalSetup.mjsprecedentAcceptance Criteria
dist/development/csscan start the component suite and materializes a complete current theme build before browser assertions.globalSetup; no second freshness/build algorithm is introduced.Negative-ROI Challenge
Positive ROI. The implementation is a two-seam reuse in one existing config file, while the current gap invalidates the trust boundary of the whole browser component shard. Building in the workflow alone is rejected because it would not repair local parity.
Out of Scope
Related
#15374 · PR #15719 · #15449 / PR #15584 · #15666 / PR #15713 · #15585
Live duplicate/content sweep: latest 20 open issues plus all-state searches for component themes, Playwright component global setup, missing development CSS, and matching PRs at 2026-07-22T14:18:14Z; no equivalent ticket or implementation found. #15449 is the E2E precedent, and #15666 is the warning-only boundary.
Decision Record impact:
none.Origin Session ID:
cb60301d-74a4-4024-b80d-2f7efdbf9cd1Retrieval Hint:
"components CI missing dist development CSS ensureDevelopmentThemeAssets globalSetup UA-only witness"