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
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"
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-schemedefault + a no-raw-values lint check scoped to the module + dual-mode smoke render of the first shipped view.Acceptance Criteria
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"