module-58/a11y-gate.mdDELIVERY STANDARD

The A11y Gate

Inclusion by construction — not by the audit that arrives with the lawsuit.

The product worked perfectly — for users with a mouse, good vision, and no assistive tech. For everyone else it was a wall, and for legal it was exposure.
Accessibility as acceptance criteria: WCAG checks in CI, keyboard and screen-reader paths tested per feature, semantic markup and contrast enforced — inclusion by construction, not by audit.

The incident

The product worked beautifully — for users with a mouse, sharp vision, and no assistive technology. For a screen-reader user, the checkout was a maze of unlabeled buttons ending at a custom dropdown that keyboard focus couldn't enter at all. The company learned this from a legal demand letter, which is the most expensive possible QA channel — and the least of it: the product had been silently turning away a real segment of paying users since launch.

Why the obvious approach fails

Treating accessibility as a pre-launch audit guarantees it becomes retrofit work — and accessibility retrofit is expensive precisely because the cheap decisions (semantic elements, focus order, color contrast, labeled controls) were made wrong months earlier, at zero cost, by default. Custom components are the classic trap: a div dressed as a dropdown looks identical and is invisible to keyboards and screen readers, and every hand-rolled widget re-solves problems the native elements solved decades ago. Automated scanners catch maybe a third of real issues; the rest need the two tests that take minutes and get skipped: can you complete the flow with only a keyboard, and does it make sense with your eyes closed and a screen reader on.

The standard

  • Semantic HTML is the default; custom interactive components must implement full keyboard and ARIA behavior or use a proven accessible primitive — a div with a click handler is not a button.
  • Automated WCAG checks (axe-class) run in CI on every merge; violations at declared severity block, not warn.
  • Every feature's acceptance criteria include the two human tests: full keyboard completion, and a screen-reader pass of the core flow.
  • Contrast, focus visibility, and touch-target sizes are design-token enforced — inaccessible values can't ship because they can't be expressed.
  • Accessibility bugs are triaged as functional bugs with the same severity scale — 'works for most users' is a partial outage, and it's treated like one.

How Cortex validates it

At plan time

UI Missions carry accessibility acceptance criteria in the validation contract from the start; custom interactive components declare their keyboard/ARIA behavior in the blueprint.

At validation

assert: ci_axe_scan.violations(blocking_severity) == 0assert: core_flows.keyboard_completable == 100%assert: interactive_elements.name_role_value == present

Assertion syntax is illustrative.

At review

the approver sees the evidence pair: the automated scan results and the recorded keyboard/screen-reader pass of the flow — inclusion proven, not presumed.

Composes with

See where your codebase stands against this standard.