# Osolix · WCAG 2.2 AA Conformance Template — v1

**Status:** Wave-B Foundation evidence · 2026-Q2
**Owner:** Accessibility Lead
**Audit dimension:** #15 Accessibility (WCAG 2.2 AA)
**Re-attestation:** Quarterly + on every design-system change

## 1 · Conformance target
**WCAG 2.2 Level AA** across every page in the authenticated app and every public marketing surface.

## 2 · Automated scan

* **Tool:** axe-core 4.x via `@axe-core/playwright`.
* **Wired into:** `tests/a11y/axe.spec.ts` — runs on every PR.
* **Pass criterion:** 0 `serious` or `critical` violations across the full route map.
* **Trend tracking:** `axe-trend.json` artifact published per build; flagged in the AI-Governance dashboard.

## 3 · Manual checks (quarterly walkthrough)

| Check | Method |
|---|---|
| Keyboard-only navigation | Tab through every page; every interactive element is reachable + has visible focus ring |
| Screen reader (NVDA / VoiceOver) | Headings + labels + landmarks announce correctly; live regions for toasts |
| Reduced motion | `prefers-reduced-motion` honoured by neon-glow + animations |
| 200 % zoom | No content cut off; no horizontal scroll on body |
| Contrast | Light + dark modes pass 4.5:1 on text, 3:1 on icons |
| Form errors | Programmatically associated with inputs (`aria-describedby`) |

## 4 · Per-page conformance log

| Page | Last axe-core date | Serious | Critical | Manual sign-off | Status |
|---|---|---|---|---|---|
| `/` Dashboard | TBD | TBD | TBD | TBD | 🔄 |
| `/assets` FAR | TBD | TBD | TBD | TBD | 🔄 |
| `/assets/:id` Detail | TBD | TBD | TBD | TBD | 🔄 |
| `/welcome` Landing | TBD | TBD | TBD | TBD | 🔄 |
| `/pricing` | TBD | TBD | TBD | TBD | 🔄 |
| `/admin/audit` | TBD | TBD | TBD | TBD | 🔄 |

## 5 · Standard component contract

Every Osolix component must:
* Use semantic HTML (`<button>` not `<div role="button">`) unless the role + key handlers are wired.
* Pass `aria-label` or visible label on every interactive element.
* Maintain focus order matching visual order.
* Trap focus inside modals + restore on close.
* Provide a non-colour secondary signal for state (icon + text, not just colour).

## 6 · Open items
* Run the first axe-core sweep across the route map; capture baseline.
* Add focus-visible polyfill for older Safari.
* Audit the chart library (`@/components/charts/premium`) for screen-reader equivalents.
* Audit the marketing concierge widget (already gold-only; confirm contrast on the rotating border).
