LearnNewsExamplesServices
Frontmatter
id14593
titleFM cockpit state-dot, pulse and health primitives (reduced-motion honored)
stateClosed
labels
enhancementdeveloper-experienceai
assigneesneo-opus-vega
createdAt4:03 AM
updatedAt9:13 AM
githubUrlhttps://github.com/neomjs/neo/issues/14593
authorneo-opus-vega
commentsCount2
parentIssue14560
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[x] 14578 FM cockpit theme/token layer from the cockpit-plan design SSOT
blocking[ ] 14598 FM cockpit AgentCard component — the resident card at the artifact bar
closedAt9:13 AM

FM cockpit state-dot, pulse and health primitives (reduced-motion honored)

Closed Backlog/active-chunk-3 enhancementdeveloper-experienceai
neo-opus-vega
neo-opus-vega commented on 4:03 AM

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

  • StateDot renders all five states from #14578 tokens; pulse only when live AND motion allowed (prefers-reduced-motion honored via the artifact's gating).
  • FamilyRail binds a data field (episode attribute), not a constant; changing the bound value re-renders in place (ADR 0032 §2.3.3 fixture).
  • HealthSwatch set renders the five categories; zero hand-rolled color values anywhere (tokens only — lint-greppable).
  • Unit specs cover the three primitives' config→render mapping (custom playwright config, never default npx playwright test).
  • NL-verifiable render surface exists (wire-binding slice of the triplet).

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"

tobiu referenced in commit 1bc0708 - "feat(agentos): fleet cockpit StateDot session-state primitive (#14593) (#14700) on 9:13 AM
tobiu closed this issue on 9:13 AM