Accessibility Gate
A screen that looks right can still be unusable. Before calling UI work done, exercise it like a keyboard user and inspect the semantics a screen reader will receive.
The pass
Identify the changed surface and its interactive states.
Run the smallest real check available: axe/pa11y/Lighthouse, a focused UI test, or a manual keyboard pass when no automated check exists.
Tab through the complete flow. Confirm order, visible focus, escape/back behavior, and that no control is keyboard-trapped.
Check accessible names, roles, state announcements, contrast, touch targets, reduced motion, and error/empty/loading states.
Fix failures and repeat the check. Do not report a clean compile as a11y evidence.
End with the exact sentinel, including the checks and outcome:
ACCESSIBILITY-GATE: PASS — keyboard flow + axe scan, 0 blockers
The Stop hook blocks UI turns that do not include this evidence. It is silent on non-UI work and fails open if its own inspection cannot run.
Kill switch
touch .accessibility-gate-off
Or set ACCESSIBILITY_GATE=off for a single session.