flow-access · git:20260903.9ddcf3a · 2026-09-03 · sha256 3d96a38b5145e01f

flow-access git:20260903.9ddcf3aA

Immutable. This exact content never changes and is served at /api/v1/blob/3d96a38b5145e01f.

---
name: flow-access
description: "Use when the user wants accessibility checked or repaired: focus states, keyboard paths, ARIA, form labels, target sizes, screen reader output, zoom behaviour. Also \"a11y pass\", \"is this accessible\", \"WCAG check\". One domain: the full accessibility surface, most of it Tier 1 by nature."
argument-hint: "[scope: diff|module-path|all]"
---

# flow-access

The polish pass for access. Runs under the contract in `references/polish.md`; the state rules and the little things live in `references/interaction.md`. Load both now. Most findings here are Tier 1 by nature: an interface a user cannot operate has failed them outright.

## The checks

1. **Fake elements.** `<div onClick>` doing a button's job, styled spans navigating. Native first; no ARIA beats bad ARIA.
2. **Focus.** Missing or removed `:focus-visible`, rings under 2px, rings that vanish against an adjacent colour or in forced-colors mode. Overlaps FLOW-11; cite both.
3. **Keyboard gaps.** Pointer interactions with no keyboard path, positive `tabindex`, composite widgets without roving focus.
4. **Small targets.** Under 24px square is Tier 1; under the 44px/40px preference is Tier 3. Fix via `flow-surface`'s padding rule.
5. **Unlabelled forms.** Placeholder-as-label, missing `<label for>`, missing `autocomplete`/`inputmode`, blocked paste, submit disabled before the request starts, errors not wired through `aria-invalid` and `aria-describedby`.
6. **Silent updates.** Toasts and validation with no live region, `role="alert"` on things that are not urgent, regions created at update time.
7. **Colour-only status.** Any state carried by hue alone; the second cue is this skill's finding even though the hue is `flow-colour`'s.
8. **Structure.** Heading order, one `<main>`, skip link, 200% zoom and 320px width without horizontal scroll.
9. **Motion and media.** Missing reduced-motion branches (cite FLOW-M7), autoplay without pause, alt text describing the picture instead of the purpose.

## Boundaries

- Contrast numbers come from `flow-colour`'s measured pass; this skill owns the requirement, not the measurement.
- Fixes here may touch attributes and element choice, which is behaviour-adjacent: flag anything beyond styling explicitly in the gate so the user approves it knowingly.
- Idempotent: a clean second run reports "access clean" in one line and stops.