I3215 — The ui audit refuses a control a thumb cannot hit at the floor width
Declare the minimum touch target once in share/design/tokens.yaml and feed it to axe's target-size check, which the ui audit already runs through the wcag22aa tag, so one measurement judges every control of every discovered page at the floor width; report its violations as component.target-size, and admit today's findings through a committed baseline that only shrinks.
READY wave 0 · p2 · implementation profile · parallel safe
Ready. Every dependency is done, so majordomus plan start I3215 will be accepted.
Objective
Declare the minimum touch target once in share/design/tokens.yaml and feed it to axe's target-size check, which the ui audit already runs through the wcag22aa tag, so one measurement judges every control of every discovered page at the floor width; report its violations as component.target-size, and admit today's findings through a committed baseline that only shrinks.
Why
A 2026-10-08 mobile review proposed about 44 px targets; the figure is a proposal for the owner or the design declaration to fix, not a fact. ADR 0022 sweeps widths but sizes nothing beyond axe's 24 px. Proposed in ADR 0215 (A phone is the baseline width of every first-party surface, and the primary flow is accepted there before a surface grows) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c197#1.
Current state
Verified on master 707a04c7ce8: scripts/lib/ui-audit.mjs runs axe with runOnly tags that include wcag22aa, which runs axe's target-size check at 24 px (WCAG 2.5.8); share/design/tokens.yaml has viewports and no touch target; nothing in scripts/ui or scripts/lib/ui-*.mjs admits a known finding, so the ui-audit gate fails on any.
Desired state
tokens.yaml declares the target; the audit passes it to axe as the minimum size, reports each undersized control with route, width and selector once, and .ai/repo/ui-target-size-baseline.txt holds the trunk's findings so the rule is a ratchet.
Scope
- share/design/tokens.yaml
- scripts/lib/ui-audit.mjs
- docs/UI.md
- .ai/repo/project/issues/I1016.yaml
Out of scope
- Fixing every finding in the same PR
Dependencies
None. This issue is a root of the graph.
Acceptance criteria
- A planted 16 px link on a fixture page is reported as component.target-size at the floor width
- The target is read from tokens.yaml; changing it changes the audit without another edit
- I1016.yaml records, in the PR that lands the rule, that I3215 delivered its touch-target criterion; I1016 keeps its other criteria
Validation
- scripts/ui audit --json
- scripts/ui viewports
- scripts/ui test
Evidence required
- case_a_small_target_is_refused
Evidence
None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.
Timeline
- started
- —
- verified
- —
- completed
- —
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I3215.yaml. Read it back with majordomus plan show I3215.