Skip to content

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

Part of the-ui-works-on-a-phone — Every first-party surface works on a phone, and the primary flow is accepted there.

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.

Searches the titles and descriptions of every page this site publishes.