- 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.
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.tsdiscovers static routes directly fromsrc/app/studioat 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_MATRIXsamples 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-surfacessuite 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/studioqueue, 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
failOnsetting. - 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:
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#
- Current Studio route collector and accessibility matrix
- Operator hub, tenant, and incident suite
- Operator editorial-review suite
- Oshun web Playwright fixture
- Shared axe gate and severity policy
- Shared explicit accessibility scanner
Cross-references#
- Key customer-route accessibility result
- Studio accessibility governance view
- Operator overview
- Operator editorial-review view
- Journey coverage matrix
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?