V1 Web PWA · Walk result

Accessibility result: key customer routes

A dated evidence record for V1 Web PWA: observed behavior, current source reconciliation, automation evidence, and explicit proof limits.

verdict: partial· 2026-05-29
8sections5 minread1table

On this page
  • 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.

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#

Cross-references#

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?