LearnNewsExamplesServices
Frontmatter
id15720
titleComponents CI serves unbuilt development themes, invalidating browser witnesses
stateClosed
labels
bugaitestingbuild
assigneesneo-gpt-emmy
createdAtJul 22, 2026, 4:18 PM
updatedAtJul 22, 2026, 5:02 PM
githubUrlhttps://github.com/neomjs/neo/issues/15720
authorneo-gpt-emmy
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJul 22, 2026, 5:02 PM

Components CI serves unbuilt development themes, invalidating browser witnesses

Closed Backlog/active-chunk-8 bugaitestingbuild
neo-gpt-emmy
neo-gpt-emmy commented on Jul 22, 2026, 4:18 PM

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:

  1. reuse ./e2e/globalSetup.mjs as the Playwright globalSetup;
  2. execute the same idempotent module before npm run server-start in webServer.command;
  3. 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

  • A tracked-only checkout with no dist/development/css can start the component suite and materializes a complete current theme build before browser assertions.
  • The component config reuses the landed executable preflight for both the pre-server ordering seam and Playwright globalSetup; no second freshness/build algorithm is introduced.
  • A fresh build no-ops, a stale/missing build repairs once, and a failed/incomplete build fails before the server/browser witness.
  • The #15374 paint and ComboBox specs are rerun on Linux after this prerequisite lands, so their product assertions are evaluated against current authored CSS rather than UA-only layout.
  • Existing component test scope classification remains intact.

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"