Context
T1.4 design-system leaf of Epic #14560 (map v1.1) — the smallest visual primitives every fleet surface composes: the agent state dot (with the live-pulse animation), the family rail, and the health-summary swatches. Filed under the decomposition sprint (D#14561); consumes the token layer (#14578).
The Problem
The SSOT artifact defines these as raw CSS (.dot + @keyframes pulse gated behind prefers-reduced-motion, .agent::before family rail, .sw swatches). Without a component-level primitive, every view leaf re-implements them — the exact per-view accretion the epic exists to kill — and the anti-lock-in render rules (ADR 0032 §2.3) would be re-derived per consumer instead of enforced once.
The Architectural Reality
- Neo functional/component primitives under the target namespace (#14577 gate decides placement); these are leaf components/mixins consuming #14578 tokens only — zero hand-rolled colors.
- ADR 0032 bindings enforced HERE once: the family rail binds an episode attribute (data-driven, never a per-agent constant — a family switch re-renders the rail, same resident); state encodes SESSION state (working/idle/wedged/limited/benched — never identity).
prefers-reduced-motion gating is carried from the artifact (pulse is decoration, not information — the dot's color carries the signal).
The Fix
One PR, the per-view triplet: (1) the primitives (StateDot w/ optional pulse, FamilyRail binding, HealthSwatch) as reusable components/mixins; (2) unit specs (state→token mapping, episode-attribute binding, reduced-motion config path); (3) a minimal NL-verifiable render surface (the primitives mounted in the dev-server, inspectable via Neural Link).
Acceptance Criteria
Out of Scope
- The AgentCard composition (T2.7 consumes these) · the health summary BAR layout (T2.8) · token values (#14578).
Related
Epic #14560 (parent) · #14578 (consumed, blocked-by) · #14577 (namespace gate) · ADR 0032 §2.3 (render rules enforced at this layer) · D#14561.
Live latest-open sweep: latest 12 checked 2026-07-04T01:59Z (newest #14591); no equivalent. A2A sweep: clean. Structure-map gate: N/A — app-layer components.
Origin Session ID: a28f1415-37a4-4a5a-a3e4-b56adf6274ec
Retrieval Hint: "FM cockpit state dot pulse family rail health primitives reduced motion"
Context
T1.4 design-system leaf of Epic #14560 (map v1.1) — the smallest visual primitives every fleet surface composes: the agent state dot (with the live-pulse animation), the family rail, and the health-summary swatches. Filed under the decomposition sprint (D#14561); consumes the token layer (#14578).
The Problem
The SSOT artifact defines these as raw CSS (
.dot+@keyframes pulsegated behindprefers-reduced-motion,.agent::beforefamily rail,.swswatches). Without a component-level primitive, every view leaf re-implements them — the exact per-view accretion the epic exists to kill — and the anti-lock-in render rules (ADR 0032 §2.3) would be re-derived per consumer instead of enforced once.The Architectural Reality
prefers-reduced-motiongating is carried from the artifact (pulse is decoration, not information — the dot's color carries the signal).The Fix
One PR, the per-view triplet: (1) the primitives (StateDot w/ optional pulse, FamilyRail binding, HealthSwatch) as reusable components/mixins; (2) unit specs (state→token mapping, episode-attribute binding, reduced-motion config path); (3) a minimal NL-verifiable render surface (the primitives mounted in the dev-server, inspectable via Neural Link).
Acceptance Criteria
prefers-reduced-motionhonored via the artifact's gating).npx playwright test).Out of Scope
Related
Epic #14560 (parent) · #14578 (consumed, blocked-by) · #14577 (namespace gate) · ADR 0032 §2.3 (render rules enforced at this layer) · D#14561.
Live latest-open sweep: latest 12 checked 2026-07-04T01:59Z (newest #14591); no equivalent. A2A sweep: clean. Structure-map gate: N/A — app-layer components.
Origin Session ID: a28f1415-37a4-4a5a-a3e4-b56adf6274ec Retrieval Hint: "FM cockpit state dot pulse family rail health primitives reduced motion"