Close the fleet-UI remainder: severity shape, e-paper grammar, sub-bar contrast
The eight-device review left a tail of findings that needed no owner
ruling. They are landed here, each with the adversarial pass that
followed them — which caught three regressions the first attempt would
have shipped.
Severity stops being carried by color alone (design principle 9, WCAG
1.4.1). A card's mark is now inked in that card's OWN tone rather than a
hardcoded destructive red, so a caution card wears a yellow triangle
instead of a red one whose shape and tint disagree about how bad the
situation is. Transitions deliberately carry no mark at all: the only
shape the dialog component owns means "something is wrong", and the
pending-admin route raises a CAUTION progress card ("Opening admin /
starting WiFi") where a hazard triangle would be a lie. A test pins the
tone on Caution — Danger cannot catch that regression, because the
correct and the hardcoded expression agree there.
CoreInk speaks its own chassis grammar. The credential detail drops to
1-bit because a 6-tone settle blocks the loop ~1.8 s and drops the
button presses a navigable screen depends on; the tab-switch gesture is
advertised; the lock face stops naming a letter that chassis does not
print; the toast body clears the ink floor. The selected tab label lifts
a rung only when it measures inside its cell — the fit reserves headroom
because the canvas measures the regular face while the label draws bold
(1.02-1.05x wider), and where no rung fits at all the string was the
problem: fr "Mot de passe" needed 72px in a 66px cell, so it is now
"MdP", which also fixes a silent overrun on Cardputer.
Indicators that carry information clear the 3:1 non-text bar: empty PIN
slots, page dots and char-wheel positions were on kMuted at 2.16:1 —
information encoded below the floor its own pattern doc prescribed, so
the doc moved too, with the carve-out WCAG grants genuinely inactive
components. The list stops drawing a scroll rail when nothing scrolls.
Documentation that lied is corrected, most consequentially the serial
harness: TAP and HOLD were documented as accepting the same ids as
PRESS, but resolveDefer maps only A/B/C, so TAP P and HOLD K silently
did nothing — a trap for anyone scripting the CoreInk side keys.
Native 2558/2558, seven variants clean.
Claude-Session: https://claude.ai/code/session_01XBVa8G5jrkprye4gVAkQSU