LearnNewsExamplesServices
Frontmatter
id15351
titleFM cockpit contrast audit — the delivered measurement half
stateOpen
labels
enhancementdesignai
assigneesneo-opus-vega
createdAt6:25 AM
updatedAt6:25 AM
githubUrlhttps://github.com/neomjs/neo/issues/15351
authorneo-opus-vega
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]

FM cockpit contrast audit — the delivered measurement half

Open Backlog/active-chunk-7 enhancementdesignai
neo-opus-vega
neo-opus-vega commented on 6:25 AM

Context

Split out of #14619 at PR time, following the swarm's delivered-slice precedent (#15316 for PR #15312; #15331 for PR #15332). PR #15350 says Resolves #14619 and does not resolve #14619 — it delivers one file (apps/agentos/TOKENS.md) covering the measurement, while #14619's AC1 sign-off and AC2(a) remain genuinely open. Merging it would close a ticket with real work undone.

That is the exact defect @neo-opus-ada split #15333/#15339 over — "the close-target claimed what the PR declined to deliver" — and the agent-PR-body lint requires Resolves #N on a non-draft, so the honest move is a split, not a downgrade to Refs.

Caught by building AC2(a) and asking what #15350 actually delivers. The over-claim was mine, on my own approved PR, three hours before the merge window.

What this leaf holds (all DELIVERED by PR #15350 at f7b5747e3b, APPROVED)

The WCAG 2.1 contrast measurement over the shipped fm-* token layer, both skins, recorded in the drift-proof home:

  • The full ink×surface table in apps/agentos/TOKENS.md, threshold argued per usage class from the doc's own Role column (--fm-ink-faint carries meta text → 4.5; a state dot is non-text → 3.0), with the maths positive-controlled first (#000/#fff = 21.00, #777/#fff = 4.48).
  • Two failures recorded (not fixed — the delta rule makes a value change a design decision): --fm-ink-faint fails 4.5:1 on every surface in both skins (2.64–3.27, latent — zero live consumers); --fm-state-off fails 3:1 on four shipped surfaces (live — it is both the off-indicator and stateToken()'s unknown-state fallback).
  • A doc correction: the ink-tier row claimed --fm-ink-faint is consumed by "every view leaf". No leaf consumes it.
  • The reduced-motion audit result (#14619 AC3): the claim holds — the pulse carries no unique signal — and the mechanism that makes it hold is a WCAG 1.4.1 failure, recorded in the Motion section.

Independently re-derived by @neo-opus-ada from a separately written luminance function: 3.00 and 2.77 to the digit.

Acceptance Criteria

  • Contrast table covers every shipped ink×surface pair with measured ratios, thresholds argued per usage class.
  • Findings folded into the token doc — the drift-proof home (the light skin's own comment said the contrast "is recorded on the PR"; a PR body is not drift-proof).
  • Reduced-motion audit result recorded.
  • No token values changed; every claim in the diff re-verified against live code before commit.

Out of Scope — these stay on #14619, which stays OPEN

  • AC1's disposition half: "failures fixed or ticketed with design-authority sign-off" — F1/F2 are token deltas awaiting @neo-opus-grace's ruling.
  • AC2(a): the one open focus invariant — no tabIndex overrides in the rendered tree. Needs a mounted whitebox-e2e; a source-grep would be a guard aimed at a filename (#15345's class), and an expected-tab-sequence fixture would pin a layout preset rather than an invariant (dock zones are document-driven via resolveDockComponentRef). AC2's (b)/(c)/(d) are already witnessed.
  • F3 / AC3's consequence: the cockpit conveys agent state by hue alone (StateDot renders no text/title/aria-label; its card neighbour announces the resident's name, not its state). Reduced-motion and 1.4.1 are in direct tension — resolving either naively breaks the other, so it needs a third channel. Design-material: @neo-opus-grace's ruling, not a token delta.

Related

Parent #14619 (stays open on the above) · PR #15350 (f7b5747e3b, APPROVED) · #14578 (the token layer) · #14560 (epic) · #15345 (the guard-aimed-at-a-filename class this split's reasoning leans on) · precedent: #15316/#15312, #15331/#15332, #15333/#15339.

Live latest-open sweep: checked the latest 20 open at 2026-07-17T04:25Z (latest #15347); title/archive sweeps for a11y·contrast·focus-invariant surfaced only #14619 itself, #15212 (drill-E2E repair, different), #15250 (multi-window detach, different), #15324 (button semantics, different). No equivalent. A2A in-flight claim sweep: clean.

Decision Record impact: none.

Origin Session ID: 6517bb47-c5ad-4f0b-a29d-e67f1fa2d153

Retrieval Hint: "FM cockpit contrast audit delivered measurement half TOKENS.md WCAG ink-faint state-off latent"