LearnNewsExamplesServices
Frontmatter
id14681
titleLight + dark theme system: first-class dual-mode tokens for the agentos module and demos
stateClosed
labels
enhancementdeveloper-experienceaineeds-re-triage
assigneesneo-opus-ada
createdAtJul 4, 2026, 6:05 AM
updatedAt1:48 AM
githubUrlhttps://github.com/neomjs/neo/issues/14681
authorneo-fable-clio
commentsCount4
parentIssue14560
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAt1:48 AM
milestonev13.2

Light + dark theme system: first-class dual-mode tokens for the agentos module and demos

Closed Backlog/active-chunk-3 enhancementdeveloper-experienceaineeds-re-triage
neo-fable-clio
neo-fable-clio commented on Jul 4, 2026, 6:05 AM

Context

Operator audit gap (2026-07-04): "beautiful design (light and dark mode)" — the token floor (#14578, relocating into apps/agentos per the veto) and the cockpit SSOT are dark-only; no ticket anywhere makes light+dark a system-level contract. The only theme ticket in the tracker is #8165 (2024-era drag-item inheritance — not a system).

The Problem

Dark-only ships half a product: the public demos (#14589/#14590) get recorded in whichever mode exists, the FM module hardcodes dark assumptions leaf-by-leaf, and retrofitting light mode later means re-auditing every view — the accretion pattern the operator just vetoed an app over.

The Architectural Reality

The token layer is the ONE right place: mode = a token-set swap (prefers-color-scheme + explicit toggle), components consume semantic tokens only (never raw values — lintable), and the design SSOTs carry dual comps from birth (#14638 and the bird's-eye SSOT get this as a review criterion; the cockpit SSOT gains a light pass). Neo's theme substrate (existing theme architecture in src/) is the engine seam — this leaf binds the agentos module tokens to it, not a parallel system.

The Fix

One PR: the dual-mode token definition on the #14578 floor (semantic token → per-mode value maps) + the mode toggle + prefers-color-scheme default + a no-raw-values lint check scoped to the module + dual-mode smoke render of the first shipped view.

Acceptance Criteria

Scope reconciliation (post-implementation, per cycle-2 review): the deliverable of THIS ticket is the dual-mode --fm-* token system + mechanical guard (PR #15102). The two demo/SSOT criteria below reference OTHER artifacts and are delivered on their own lanes — they do not gate this ticket's close.

  • Every #14578 token resolves in both modes; toggle + system-preference default (toggle/default shipped in #13024; PR #15102 completes the --fm-* cockpit half, light-native, WCAG-verified).
  • Lint rejects raw color values in module views — the mechanical check-agentos-theme.mjs guard (skin-parity, token-only consumption over the full CSS color surface incl. named colors, consumer-derived completeness, and the closed contracted-token vocabulary).
  • The demo recording profile (#14589 F7 line) gains a mode parameter → rides #14589 (the recording profile does not exist in-repo yet; PR #15102 delivers the light tokens it will select). Not a #14681 close-gate.
  • Design SSOTs' review checklists gain the dual-comp criterion → rides #14680 (weekly-digest-plan.html is not on dev yet). Not a #14681 close-gate.
  • Cross-family review — in progress (GPT lane: Euclid + Emmy cycle-2).

Out of Scope

Re-theming portal/docs surfaces (separate initiative) · per-view light-mode polish (rides each view leaf once tokens exist).

Related

#14578 (the floor this extends — Vega first-refusal as its owner) · #14638 + the bird's-eye SSOT (dual-comp consumers) · #14589/#14590 (recording modes) · #8165 (ancient, superseded-in-scope). Sweeps: theme search at 04:02Z — no equivalent system ticket. Origin Session ID: fa2a6fd5-7488-4af6-a0d2-3855c86003e4 Retrieval Hint: "light dark theme system dual mode tokens agentos module"

tobiu referenced in commit 64ecde4 - "feat(agentos): light-native FM cockpit --fm-* tokens + dual-mode theme guard (#14681) (#15102) on 1:48 AM
tobiu closed this issue on 1:48 AM