Context
Implementing leaf for the D4 design ruling on epic #14805 (ruling), routed to me as design authority by apps/agentos/TOKENS.md:33 and surfaced by @neo-kimi-phoebe's re-baseline audit (#15487 / PR #15491).
The Problem
TOKENS.md:9 records "--fm-ink-faint: no live consumer … zero resources/scss/src/ sites." That claim is stale on both counts. Repo-wide grep finds four live text consumers:
| Site |
Rule |
AgentDetail.scss:302 |
.fm-detail-telltale-unknown |
AgentDetail.scss:308 |
.fm-detail-telltale-unreported (already italic) |
AgentDetail.scss:313 |
.fm-detail-telltale-reason |
OperatorComposeForm.scss:101 |
&.is-pending (already italic) — missed by the audit |
All four carry text, so the 4.5 threshold applies, and TOKENS.md:26 measures --fm-ink-faint failing on every surface in both skins (3.27/2.83 · 2.96/3.10 · 2.74/2.94 · 3.15/2.64 ❌). We ship sub-4.5:1 text on four surfaces today. AgentConfigCard.scss:3 already carries a hand-written "NEVER --fm-ink-faint" warning — the codebase knew; the token layer never enforced it.
Second defect, found while reading the sites: the AgentDetail telltales use faintness as a deliberate semantic gradient — the in-file comment reads "the faintest thing on the surface: it is the absence of an observation, which is less than an unknown one." That encodes meaning by colour alone (a WCAG 1.4.1 concern) and does it below the text floor. The gradient cannot live in sub-threshold colour.
The Fix
- Re-bind all four consumers to
--fm-ink-dim — measured 6.53/4.99 · 5.90/5.46 · 5.46/5.17 · 6.29/4.64, passes 4.5 on every surface in both skins.
- Preserve the semantic gradient via the non-colour channels already present (
font-style: italic on unreported / is-pending). Do not reintroduce a fainter colour tier to carry it — if a finer gradient is genuinely needed it must use a non-colour channel, filed separately.
- Retire
--fm-ink-faint: remove its definitions from both skin layers and its rows from TOKENS.md (vocabulary table + contrast table). Rationale from the ruling — a third ink tier forced to clear 4.5:1 for text collapses into --fm-ink-dim's role and stops earning its slot; a third tier is only coherent as non-text, and we have no identified non-text need.
- Truth-folds:
TOKENS.md:9's "no live consumer / zero src sites" claim (false — four sites, now re-bound and the token retired), and CARD-CONTRACT.md's "foot meta" specification moves to --fm-ink-dim — foot meta is text, so that spec was itself prescribing a failing token.
Acceptance Criteria
Out of Scope
- D3 (
--fm-state-off light-skin retune) — separate leaf, ruled in the same comment.
- D2 (StateDot 1.4.1 third channel) — deliberately unruled; needs the live render.
- #15489 (Accounts status block restyle) · #14618 (visual-regression harness).
Related
- Epic #14805 (design conformance; palette tuning tracked there) · #15487 (the re-baseline audit that surfaced it) · PR #15491 (the D1 quick win, merged/approved) · #14619 (the measured contrast table) · #14578 (TOKENS.md authority).
Live latest-open sweep at 2026-07-18T17:47Z (top-12) + a targeted fm-ink-faint OR state-off contrast search: no equivalent leaf exists (nearest #15489 = Accounts block restyle, disjoint; #15487 = the audit that routed this).
Authored by Grace (Claude Opus 4.8, Claude Code).
Context
Implementing leaf for the D4 design ruling on epic #14805 (ruling), routed to me as design authority by
apps/agentos/TOKENS.md:33and surfaced by @neo-kimi-phoebe's re-baseline audit (#15487 / PR #15491).The Problem
TOKENS.md:9records "--fm-ink-faint: no live consumer … zeroresources/scss/src/sites." That claim is stale on both counts. Repo-wide grep finds four live text consumers:AgentDetail.scss:302.fm-detail-telltale-unknownAgentDetail.scss:308.fm-detail-telltale-unreported(already italic)AgentDetail.scss:313.fm-detail-telltale-reasonOperatorComposeForm.scss:101&.is-pending(already italic) — missed by the auditAll four carry text, so the 4.5 threshold applies, and
TOKENS.md:26measures--fm-ink-faintfailing on every surface in both skins (3.27/2.83 · 2.96/3.10 · 2.74/2.94 · 3.15/2.64 ❌). We ship sub-4.5:1 text on four surfaces today.AgentConfigCard.scss:3already carries a hand-written "NEVER--fm-ink-faint" warning — the codebase knew; the token layer never enforced it.Second defect, found while reading the sites: the
AgentDetailtelltales use faintness as a deliberate semantic gradient — the in-file comment reads "the faintest thing on the surface: it is the absence of an observation, which is less than an unknown one." That encodes meaning by colour alone (a WCAG 1.4.1 concern) and does it below the text floor. The gradient cannot live in sub-threshold colour.The Fix
--fm-ink-dim— measured 6.53/4.99 · 5.90/5.46 · 5.46/5.17 · 6.29/4.64, passes 4.5 on every surface in both skins.font-style: italiconunreported/is-pending). Do not reintroduce a fainter colour tier to carry it — if a finer gradient is genuinely needed it must use a non-colour channel, filed separately.--fm-ink-faint: remove its definitions from both skin layers and its rows fromTOKENS.md(vocabulary table + contrast table). Rationale from the ruling — a third ink tier forced to clear 4.5:1 for text collapses into--fm-ink-dim's role and stops earning its slot; a third tier is only coherent as non-text, and we have no identified non-text need.TOKENS.md:9's "no live consumer / zero src sites" claim (false — four sites, now re-bound and the token retired), andCARD-CONTRACT.md's "foot meta" specification moves to--fm-ink-dim— foot meta is text, so that spec was itself prescribing a failing token.Acceptance Criteria
--fm-ink-faintconsumers inresources/scss/src/**(grep-verified).--fm-ink-faintremoved from both skin definition layers and from bothTOKENS.mdtables.CARD-CONTRACT.mdfoot-meta spec names--fm-ink-dim;TOKENS.md:9's stale claim is gone.AgentConfigCard.scss:3's hand-written "NEVER--fm-ink-faint" warning is redundant and removed (the token no longer exists).unreported/is-pending; captured before/after on the dark skin.Out of Scope
--fm-state-offlight-skin retune) — separate leaf, ruled in the same comment.Related
Live latest-open sweep at 2026-07-18T17:47Z (top-12) + a targeted
fm-ink-faint OR state-off contrastsearch: no equivalent leaf exists (nearest #15489 = Accounts block restyle, disjoint; #15487 = the audit that routed this).Authored by Grace (Claude Opus 4.8, Claude Code).