---
status: reconciled-partial
coverage_depth: representative
last_reconciled: 2026-07-17
specs:
  - apps/oshun/web/e2e/wcag-aa-signoff-v1-p2-3510.spec.ts
  - apps/oshun/web/e2e/wcag-aa-signoff-v1-p2-3511.spec.ts
  - apps/oshun/web/e2e/shell-route-accessibility.spec.ts
source: apps/oshun/web/e2e/wcag-aa-signoff-v1-p2-3510.spec.ts
---

# Accessibility result: key customer routes

- **Walked**: 2026-05-29 across 24 key routes; extended 2026-05-30 across the
  then-current 181-route customer manifest, with final token/skeleton notes
  recorded 2026-05-31.
- **Reconciled**: 2026-07-17 against the current shared axe helper, canonical
  desktop/mobile WCAG signoff suites, and shell-route accessibility suite. This
  was a source reconciliation, not a rerun of either dated sweep.
- **Verdict**: **partial** — the historical scans remain useful repair evidence,
  and current automation strongly guards 11 primary/domain surfaces at desktop
  and mobile plus six detailed shell routes and the notifications drawer. It is
  not a current all-route audit, a zero-all-severities claim, or a manual
  screen-reader sign-off.
- **Historical runner**: `node /tmp/walk/at-pass.mjs`, which wrote
  `/tmp/walk/at-results.jsonl`. Both paths are preserved as provenance only; the
  repository Playwright suites below are the durable rerun surface.

## Result at a glance

| Evidence lane                    | Recorded or current contract                                                                                                      | Authority limit                                       |
| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- |
| 2026-05-29 key-route sweep       | 24 routes; axe A/AA, one main/h1, first focus, skip link, and target-size checks; zero recorded axe violations after repairs      | Historical build and temporary raw report             |
| 2026-05-30/31 manifest sweep     | Then-current 181-route set; large contrast/heading repair campaign; final note retained 25 intentional specimen/skeleton findings | Historical inventory, not today's route tree          |
| Current desktop signoff contract | 11 shell/domain surfaces; WCAG 2.1 A/AA scan; serious/critical findings fail; one visible main is required                        | Does not fail moderate/minor findings in this suite   |
| Current mobile signoff contract  | The same 11 surfaces at 390 × 844 with reduced motion and responsive shell state                                                  | Same serious/critical threshold                       |
| Current shell-detail contract    | Home, Explore, Library, Activity, Profile notifications, Profile, and the opened notifications drawer; any axe violation fails    | Representative shell flows, not every application URL |
| Manual assistive technology      | Explicitly not performed by these automated records                                                                               | VoiceOver, TalkBack, NVDA, switch, voice, cognition   |

## Evidence map

The dated sweeps prove what was measured on their builds. Current code defines a
smaller repeatable signoff matrix, while manual assistive-technology quality
remains a separate obligation.

```mermaid
flowchart LR
    A[2026-05-29: 24 key routes] --> B[Historical zero after fixes]
    C[2026-05-30/31: 181-route manifest] --> D[Contrast and heading repair trail]
    E[Current desktop matrix: 11 surfaces] --> F[Serious and critical gate]
    G[Current mobile matrix: same 11] --> F
    H[Current shell detail: 6 routes and drawer] --> I[Any axe violation gate]
    B -. dated evidence .-> J[Current accessibility posture]
    D -. dated evidence .-> J
    F --> J
    I --> J
    K[Manual AT sessions] -. still required .-> J
```

## Proven observations

### Dated repair evidence

- The 2026-05-29 run found and repaired invalid `aria-controls`, contrast,
  link-distinction, missing-main, and heading defects before recording zero axe
  A/AA violations on its 24-route list.
- Its structural checks recorded one main landmark, one heading, skip-link-first
  keyboard focus, and axe's target-size result on each route. The raw small-link
  count was not itself treated as failure because axe applies inline/spacing
  exemptions.
- The 2026-05-30 extension used the then-current 181-route manifest. It drove a
  broad correction trail covering domain text colors, heading fallbacks, named
  selects, focusable scroll regions, dynamic detail states, and showcase heading
  levels.
- The 2026-05-31 note reduced the original 402 customer contrast findings to 25
  recorded intentional specimen or dynamic-skeleton cases, while separately
  recording clean Studio and Operator samples. Those numbers describe that
  historical build only.

### Current source-backed automation contract

- `wcag-aa-signoff-v1-p2-3510.spec.ts` defines five primary customer surfaces
  and six domain entries. Each test waits for surface-specific content, requires
  one visible main, scans the shell root with WCAG 2.1 A/AA tags, attaches JSON,
  and fails serious or critical violations.
- `wcag-aa-signoff-v1-p2-3511.spec.ts` repeats the exact 11-surface matrix at
  390 × 844 with reduced motion, covering the mobile shell state rather than
  inferring mobile conformance from desktop.
- `shell-route-accessibility.spec.ts` deeply verifies six shell routes and the
  opened notifications drawer. Its shared helper uses WCAG 2.0/2.1/2.2 A/AA tags
  by default, and this suite fails when any returned violation remains.
- The shared helper waits for included selectors, excludes only known local
  Next.js tooling chrome, retries an include race once, and formats the exact
  node selector and failure summary for diagnosis.

## Boundaries and gaps

- **Historical zero is not current universal sign-off.** The 24- and 181-route
  counts belong to the 2026-05 builds. The application route inventory has
  changed substantially, and this reconciliation did not execute those old
  temporary scripts against today's tree.
- **The canonical signoff threshold is scoped.** The desktop/mobile matrix fails
  serious and critical axe findings; it does not claim zero moderate or minor
  findings. The shell-detail suite is stricter but covers fewer routes.
- **Axe is not all of WCAG.** Automated rules cannot certify announcement
  quality, reading order as experienced, focus comprehension, touchscreen feel,
  switch/voice control, zoom usability, cognitive load, captions, or task
  completion with assistive technology.
- **Route coverage is representative.** Current durable suites cover important
  customer shell and domain entries. They do not enumerate every dynamic,
  Studio, operator, tenant, embed, public, error, loading, offline, or feature-
  state URL.
- **Historical raw output is ephemeral.** The original JSONL path was under
  `/tmp`; this Markdown record preserves conclusions but not the machine report
  needed for independent replay or trend comparison.
- **A clean static state is not every state.** Dialogs, errors, empty/loading
  variants, authenticated roles, zoom levels, locales/RTL, forced colors, and
  user-generated content require deliberate state coverage.

## Re-run evidence

The current durable accessibility matrix can be run serially with:

```bash
PW_BROWSER_CHANNEL=chrome pnpm exec playwright test \
  -c apps/oshun/web/playwright.config.ts \
  apps/oshun/web/e2e/wcag-aa-signoff-v1-p2-3510.spec.ts \
  apps/oshun/web/e2e/wcag-aa-signoff-v1-p2-3511.spec.ts \
  apps/oshun/web/e2e/shell-route-accessibility.spec.ts \
  --workers=1
```

That command requires the real-development-infrastructure web/BFF harness. A
source audit or passing Docs Center reader test is not an accessibility rerun of
the Oshun product surfaces.

## Source trail

- [Desktop WCAG signoff matrix](../../apps/oshun/web/e2e/wcag-aa-signoff-v1-p2-3510.spec.ts)
- [Mobile WCAG signoff matrix](../../apps/oshun/web/e2e/wcag-aa-signoff-v1-p2-3511.spec.ts)
- [Detailed shell accessibility suite](../../apps/oshun/web/e2e/shell-route-accessibility.spec.ts)
- [Shared axe scan helper](../../apps/oshun/web/e2e/support/accessibility.ts)
- [Authenticated Playwright fixtures](../../apps/oshun/web/e2e/fixtures.ts)
- [Historical contrast-token handoff](./customer-color-contrast-token-handoff.md)
- [Public accessibility statement](../../apps/oshun/web/src/app/legal/accessibility/page.tsx)

## Cross-references

- [Result registry and evidence conventions](./README.md)
- [Walkthrough reading guide](../README.md)
- [Customer contrast-token handoff](./customer-color-contrast-token-handoff.md)
- [Studio/operator accessibility pass](./at-pass-studio-operator-2026-05-29.md)
- [Customer shell coverage matrix](../matrix/coverage.md)

## Open questions

- Which generated route/state inventory should define a current all-surface
  accessibility matrix without turning one Playwright job into an unsafe sweep?
- Should the canonical signoff fail all axe severities, or explicitly retain the
  serious/critical release threshold with a separate zero-violation quality
  gate?
- Where should JSON axe reports live so runs are comparable instead of being
  reduced to prose and temporary files?
- What recurring manual matrix covers VoiceOver, TalkBack, NVDA, keyboard-only,
  switch/voice control, zoom/reflow, forced colors, and cognitive walkthroughs?
