V1 Web PWA · Walk result

Accessibility result: Studio and Operator surfaces

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 the then-current 483 Studio routes and 10 Operator routes; the repair record was extended with full reruns on 2026-05-30.
  • Reconciled: 2026-07-17 against the current route tree, shared axe fixture, dynamic Studio render smoke, representative Studio accessibility matrix, and focused Operator suites. This was a source reconciliation, not a rerun of the dated full sweeps.
  • Verdict: partial — the 2026 sweep remains valuable remediation evidence. Current automation renders every discoverable static Studio route, runs the serious/critical axe gate on 39 representative Studio routes, and exercises important Operator surfaces through the same gate. It does not provide a current all-route, all-impact, or manual assistive-technology sign-off for either surface.
  • Historical runner: node /tmp/walk/at-axe-parallel.mjs <studio|operator> <concurrency>, which wrote /tmp/walk/results-axe-<surface>.jsonl. These temporary paths are provenance only; the repository suites below are the portable evidence.

Result at a glance#

Evidence lane Recorded or current contract Authority limit
2026-05-29 Studio sweep 483/483 then-current routes rendered; the initial audit exposed clustered workspace-pattern debt Historical build, inventory, runner, and raw report
2026-05-30 Studio remediation Full 483-route rerun recorded zero axe violations and one h1 per route after shared-component repairs Dated result, not today's maintained matrix
2026-05-29/30 Operator sweep 10/10 then-current routes recorded zero axe violations plus one main and h1 after repairs Historical route set
Current Studio render contract App-router discovery currently finds 479 static routes; each must authenticate and expose a heading Most tests explicitly skip axe
Current Studio a11y contract 39 representative routes run the WCAG 2.1 A/AA serious/critical axe gate Not all 479 routes; moderate/minor do not fail
Current Operator contract Hub, tenant, tenants, incidents, and editorial-review behavior run through focused specs and the shared axe fixture Representative flows across a 13-route static tree
Manual assistive-technology pass Not performed by these automated records No VoiceOver, TalkBack, NVDA, switch, voice, or AT QA

Evidence map#

The dated audit and today's maintainable automation answer different questions. The current Studio suite keeps full render/auth breadth, then spends axe cost on a representative route matrix; Operator depth is organized around key workflows.

flowchart LR A[2026 full Studio and Operator sweeps] --> B[Shared-component remediation] B --> C[Dated zero-violation records] D[Current Studio route tree] --> E[479-route render and auth smoke] D --> F[39-route representative axe matrix] G[Current Operator route tree] --> H[Focused hub, tenant, incident, and review suites] F --> I[Serious and critical WCAG gate] H --> I C -. historical evidence only .-> J[Current release claim] E -. render is not axe .-> J I --> J K[Manual assistive-technology QA] -. still required .-> J

Proven observations#

Historical sweep and repair campaign#

  • The first clean Studio rerun rendered real authenticated workspace content on all 483 then-current routes. The audit found roughly 1,900 violation nodes, concentrated in reusable card, control, form-field, heading, role-list, scroll-region, and entitlement-interstitial patterns rather than 483 unique defects.
  • The repair log records elimination of nested interactive controls, undersized targets, missing names, contrast failures, invalid ARIA relationships, non-focusable scroll regions, multiple h1s, and the incomplete Isis interstitial shell. The final 2026-05-30 note reports zero axe violations and zero routes with an h1 count other than one across that dated 483-route set.
  • Operator repairs raised low-contrast status text and restored a main landmark and h1 on affected surfaces. The dated reruns recorded 10/10 routes clean.

Current durable Studio contract#

  • studio-route-render-smoke.spec.ts discovers static routes directly from src/app/studio at collection time, rejects implausibly small inventories, and currently enumerates 479 routes. Dynamic segments are excluded because they need seeded parameters and dedicated specs.
  • Every discovered route must retain authentication, settle inside the shell, and expose a visible top-level heading. Routes outside the accessibility matrix explicitly use skipAxe: true.
  • The 39-route A11Y_MATRIX samples the Studio root and named groups such as Aja, Bellona, Hathor, Isis, Neith, and Yemaya. Those tests inherit the shared WCAG 2.1 A/AA scan and fail on serious or critical findings.

Current durable Operator contract#

  • The current app tree contains 13 static Operator pages. The focused operator-surfaces suite covers the hub fan-out, stable surface targets, mobile collapse, incident severity, tenant directory, tenant console, local dialogs, and anonymous gating.
  • The editorial-review suite separately proves the /operator/studio queue, selected artifact, transcript/waveform, notes, citations, decision entry point, static-row semantics, and anonymous gating.
  • Both specs import the shared fixture, so successful tests finish with the serious/critical WCAG scan unless they explicitly opt out. They are deep workflow evidence, not an automatically enumerated 13-route audit.

Boundaries and gaps#

  • Historical full sweep is not the current durable matrix. The 483/10 route zeros belong to the 2026-05-30 build and temporary runner. Route inventories, DOM states, axe versions, and product behavior can change after that date.
  • Render coverage is not axe coverage. The current Studio suite covers authentication and heading render across 479 static routes, but only 39 representative routes receive its automatic axe scan.
  • Operator coverage is representative. Focused suites deeply exercise key Operator workflows; no current collector proves every one of the 13 static pages at every viewport and state.
  • The maintained gate is serious/critical, not zero all severities. The shared fixture scans WCAG 2.1 A/AA tags and fails on serious or critical impact by default. Moderate and minor results require separate review or a stricter failOn setting.
  • Automated axe is not manual accessibility QA. Heading and landmark presence, focus order, screen-reader announcements, zoom/reflow, switch access, voice control, cognitive load, and real task completion still need a human matrix.
  • Static discovery excludes parameterized routes. Dynamic Studio states depend on their dedicated seeded specs and cannot inherit the full-static-tree claim.

Re-run evidence#

The current portable suites can be run against the real-development- infrastructure harness with one worker:

bash
PW_BROWSER_CHANNEL=chrome pnpm exec playwright test \
  -c apps/oshun/web/playwright.config.ts \
  apps/oshun/web/e2e/studio-route-render-smoke.spec.ts \
  apps/oshun/web/e2e/operator-surfaces.spec.ts \
  apps/oshun/web/e2e/operator-studio-surface.spec.ts \
  --workers=1

That command is intentionally large because the Studio spec collects every static route. A green run means the current render matrix, representative axe matrix, and named Operator flows passed; it still must not be reported as a manual AT sign-off or a zero-all-impact full-route axe sweep.

Source trail#

Cross-references#

Open questions#

  • Should CI add a scheduled all-479-route axe sweep while retaining the 39-route matrix as the fast per-change gate?
  • Which current Operator route/state matrix is required for release sign-off, including mobile, empty, error, permission-denied, and loading states?
  • Should the release gate fail moderate and minor axe findings, or report them through a separately owned accessibility debt budget?
  • Where will manual screen-reader, keyboard-only, 200–400% zoom, switch, and voice-control results be stored with browser/AT versions and task outcomes?