---
path: /mawu-studio/accessibility
surface: studio
domain: mawu
auth: signed-in + creator
source: apps/oshun/web/src/app/mawu-studio/accessibility/page.tsx
status: walked
last_walked: '2026-06-03 automated runtime probe (Playwright headless) — prod build + mock BFF; render, HTTP 200, server-rendered <h1>, 0 page errors verified. Evidence: WALKTHROUGH/results/walkthrough-runtime-probe-2026-06-03.md'
v1_scope: out-of-v1
---

# Mawu Studio — Accessibility (V7)

## Purpose

Reviews the V7 **Mawu** accessibility floor for the builder, browser, and
default-realm surfaces. The page server-runs
`runV7MawuAccessibilityEval(V7_MAWU_ACCESSIBILITY_EVAL_FIXTURE)` and passes the
report plus `V7_MAWU_ACCESSIBILITY_LINTER_RULES` to the workspace, which lints
each surface against voice/radio parity, colorblind-safe provenance diffs,
keyboard/gamepad input parity, scalable UI, and reduced motion. **Out of the V1
feature map** — a V7 surface that ships in `apps/oshun/web` (documented here for
an exhaustive route inventory).

## Entry points

- **Direct URL / bookmark** — `/mawu-studio/accessibility` (signed-in creator)
- **Studio shell nav** — `active="studio"` (shortcut `6`)
- **In-page nav links** — from the Localization workspace ("Localization" ↔ this
  page) and the studio Accessibility Governance surface

## Layout regions

- **Header**: shell header + workspace header
  (`aria-labelledby="mawu-accessibility-title"`) — eyebrow "V7 accessibility
  floor", H1 "Mawu Studio Accessibility", summary
- **Status panel** (`aria-label="Accessibility eval status"`) — four metrics:
  Eval (Passing/Blocked), Surfaces (`passedSurfaceIds.length/3`), Findings
  count, Schema (v7)
- **Controls** (`aria-label="Workspace controls"`)
  - **Surface selector** (`role="group"`) — one tab per
    `report.requiredSurfaceIds`: Builder (`mawu-studio-builder`), Browser
    (`abundantia-browser`), Default realm (`default-realm`)
  - **Preview preferences** — reduced/standard-motion toggle + text-scale range
- **Body grid** — `SurfaceDetail` (evidence grid + builder bindings) +
  `RulesPanel` (the Mawu Studio linter rule list)
- **Footer nav** (`aria-label="Mawu Studio links"`) — Back to Studio,
  Accessibility Governance, Localization

## States

- [ ] **Loading / Error / Offline** — N/A: the report is computed server-side
      from an in-bundle fixture (`@v7/contracts`); no client network read
- [ ] **Eval passing** — `data-eval-passed="true"`; status metric "Passing";
      each surface shows a "Passing" pass-pill
- [ ] **Eval blocked** — `data-eval-passed="false"`; status "Blocked" (driven by
      the fixture/report)
- [ ] **Active surface = Builder** (default = `requiredSurfaceIds[0]`) — shows
      builder action bindings (keyboard/gamepad/voice) in the detail pane
- [ ] **Active surface = Browser / Default realm** — same evidence grid; builder
      bindings list only renders when `builderActions.length > 0`
- [ ] **Reduced motion (default)** — `data-motion-mode="reduced"`; toggling
      flips to `standard`
- [ ] **Text scale** — `data-text-scale` reflects the range (100–200%, step 25,
      default 200)
- [ ] **Gated** — signed-in creator (shell); no V1 BFF policy (out-of-v1)
- [ ] **Standalone PWA** — renders within the shell

## Interactions

- [ ] **Surface tabs** (buttons, `data-mawu-a11y-surface-tab="<id>"`,
      `aria-pressed`) — set `activeSurfaceId`; the detail + rules panes
      recompute for the selected surface (active findings filtered by
      `surfaceId`)
- [ ] **Reduced-motion toggle** (button, `data-mawu-a11y-reduced-motion-toggle`,
      `aria-pressed`) — flips `motionMode` between `reduced`/`standard`; label
      tracks the mode
- [ ] **Text scale** (range input, `data-mawu-a11y-text-scale`, min 100 max 200
      step 25) — sets `textScale`; reflected in the `data-text-scale` attribute
- [ ] **Footer links** (`Link`) — Back to Studio (`/studio`), Accessibility
      Governance (`/studio/accessibility-governance`), Localization
      (`/mawu-studio/localization`)

Read-only evidence rendered per surface (no controls): voice/radio parity,
provenance diff (palette + contrast ratio + non-color cues), scalable UI (max
text scale, hit-target px, 320px reflow), reduced motion, and per-action
keyboard/gamepad/voice bindings.

## Data & contracts

- **Reads (server)**:
  `runV7MawuAccessibilityEval(V7_MAWU_ACCESSIBILITY_EVAL_FIXTURE)` →
  `V7MawuAccessibilityEvalReport`; `V7_MAWU_ACCESSIBILITY_LINTER_RULES` → linter
  rule views — both from `@v7/contracts`
- **Writes**: _None._
- **Realtime**: _None._
- **Caching**: SSR (server component computes the report); client workspace is
  interactive over the passed props
- **Auth/role check**: session (signed-in creator); no V1 BFF policy (out-of-v1)
- **Contracts**: `@v7/contracts` — `V7MawuAccessibilityEvalReport`,
  `V7MawuAccessibilityLinterRuleId`, `V7MawuAccessibilitySurfaceId`,
  `V7MawuAccessibilitySurfaceSpec`, `runV7MawuAccessibilityEval`,
  `V7_MAWU_ACCESSIBILITY_EVAL_FIXTURE`, `V7_MAWU_ACCESSIBILITY_LINTER_RULES`

## Cross-references

- Sibling V7 surface:
  [`mawu-studio-localization.md`](./mawu-studio-localization.md)
- V6 sibling future studio: [`egbe-studio.md`](./egbe-studio.md)
- Related V1 governance:
  [`../governance/studio-accessibility-governance.md`](../governance/studio-accessibility-governance.md)
- Spec: `V7/V7_features.md`, `V7/V7_ARCHITECTURE.md`
- Component source:
  `apps/oshun/web/src/components/mawu/MawuStudioAccessibilityWorkspace.tsx`

## Open questions / known gaps

- [ ] The report is computed from a fixture, not a live eval over real studio
      surfaces; confirm the V7 BFF/eval pipeline that will replace
      `V7_MAWU_ACCESSIBILITY_EVAL_FIXTURE`.
- [ ] Surface pass-pill is hard-rendered "Passing" in `SurfaceDetail`; confirm
      it should reflect the per-surface verdict once blocked surfaces exist.
