---
status: reconciled-partial
coverage_depth: representative
last_reconciled: 2026-07-17
specs:
  - 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
source: apps/oshun/web/e2e/studio-route-render-smoke.spec.ts
---

# Accessibility result: Studio and Operator surfaces

- **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.

```mermaid
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

- [Current Studio route collector and accessibility matrix](../../apps/oshun/web/e2e/studio-route-render-smoke.spec.ts)
- [Operator hub, tenant, and incident suite](../../apps/oshun/web/e2e/operator-surfaces.spec.ts)
- [Operator editorial-review suite](../../apps/oshun/web/e2e/operator-studio-surface.spec.ts)
- [Oshun web Playwright fixture](../../apps/oshun/web/e2e/fixtures.ts)
- [Shared axe gate and severity policy](../../libs/shared/testing/src/playwright/axe.ts)
- [Shared explicit accessibility scanner](../../apps/oshun/web/e2e/support/accessibility.ts)

## Cross-references

- [Key customer-route accessibility result](./at-pass-2026-05-29.md)
- [Studio accessibility governance view](../studio/accessibility-governance.md)
- [Operator overview](../operator/operator-overview.md)
- [Operator editorial-review view](../operator/operator-studio.md)
- [Journey coverage matrix](../journeys/coverage.md)

## 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?
