---
path: /studio/aja/noise-reduction
surface: studio
domain: aja
auth: signed-in + studio entitlement
source: apps/oshun/web/src/app/studio/aja/noise-reduction/page.tsx
status: walked + e2e-covered
last_walked:
  '2026-07-02 cleanup-lane console addendum — Playwright real-dev-infra coverage
  now proves signed-in render, route-map contract, quick-action href order,
  ready signal-analysis form, 44 px submit target, nonnumeric-signal client
  guard with no POST, real BFF signal-statistics result, fail-closed
  loading/unauthorized/malformed-catalog states, mobile no-overflow, and direct
  BFF 401/403/400/200 gates. Spec:
  apps/oshun/web/e2e/studio-aja-cleanup-lane-consoles.spec.ts.'
  '2026-05-29 automated runtime walk (Playwright headless) — render, /v1 data
  (2xx), console/page-errors, expected content, screenshot verified; live
  screen-reader, touch, offline, and telemetry-delivery checks pending a manual
  AT pass. Evidence: WALKTHROUGH/results/runtime-sweep-2026-05-29.md ; body
  re-derived 2026-06-03 from current source (lane-console architecture)'
---

# Studio Aja · Noise Reduction

## Purpose

Leaf lane console that wraps the real `@aja/motion-processing` `analyzeSignal`
DSP. The operator submits a motion signal and the lane returns the deterministic
statistics that drive noise-reduction filtering: mean, std, min/max range, the
FFT dominant frequency, and the signal-to-noise ratio (SNR).

## Entry points

- **Direct URL / bookmark** — `/studio/aja/noise-reduction`.
- **Studio nav** — Domain-bridge studios section of `/studio`.
- **Sibling quick-action** — "Open Aja Blend Shape Retargeting workspace"
  (`/studio/aja/blend-shape-retargeting`) and "Back to Studio workspace index"
  are the two quick-actions on this page.

## Layout regions

`page.tsx` renders inside `<ShellLayout active="studio">`:

- **Workspace** `<StudioAjaNoiseReductionWorkspace />`:
  - `<h1>` "Aja Noise Reduction Workspace" + summary
    (`data-aja-noise-reduction-summary`).
  - The analyze form lane (states below).
- **Route Map panel** (`data-aja-noise-reduction-route-map`, `<h2>` "Route
  Map"): 5 `STUDIO_AJA_NOISE_REDUCTION_ROUTE_MAP` entries (path + purpose) —
  primary, scenes, exports, revisions, governance.
- **Quick-action lane**: two `Link.quickAction` anchors (Blend Shape
  Retargeting, Back to Studio). No self-link. No breadcrumb panel on this route.

## States

The lane fetches `GET /v1/admin/aja/noise-reduction` on mount.

- [x] **Loading** — `data-aja-nr-loading` "Loading signal analysis…".
- [x] **Unauthorized** — `data-aja-nr-unauthorized` (rendered on a 401/403; the
      admin-scope message defaults to "Aja workspace scope required to view
      noise reduction.").
- [x] **Error** — `data-aja-nr-error` (non-2xx, malformed body, or network).
- [x] **Ready (form)** — `data-aja-nr-analyze-form` with the two inputs.
- [x] **Result** — `data-aja-nr-result` with `data-aja-nr-mean`,
      `data-aja-nr-std`, range, `data-aja-nr-dominant`, `data-aja-nr-snr`.
- [x] **Validation error** — `data-aja-nr-analyze-error` (e.g. "Signal must
      contain at least one number." or a server-reported reason).

## Interactions

### Analyze form (`data-aja-nr-analyze-form`)

- [x] **Signal (comma-separated samples)** — input `data-aja-nr-field-signal`
      (default `2, 4, 6, 8, 6, 4, 2, 0`).
- [x] **Sample rate (Hz, optional)** — input `data-aja-nr-field-rate` (default
      `30`).
- [x] **Analyze** — submit `data-aja-nr-analyze-submit`; fires
      `POST /v1/admin/aja/noise-reduction/analyze` with `{ signal, sampleRate }`
      and renders the analysis or the error block.

### Route Map

- [x] **Route entries** (5) — non-interactive listing.

### Quick-action lane

- [x] **"Open Aja Blend Shape Retargeting workspace"** →
      `/studio/aja/blend-shape-retargeting`
- [x] **"Back to Studio workspace index"** → `/studio`

## E2E coverage

- [`apps/oshun/web/e2e/studio-aja-cleanup-lane-consoles.spec.ts`](../../../../apps/oshun/web/e2e/studio-aja-cleanup-lane-consoles.spec.ts)
  covers signed-in shell render, ready signal-analysis form defaults,
  nonnumeric-signal client guard with no `POST`, real BFF signal-statistics
  output (`mean: 4`, `std: 2.449489742783178`, dominant frequency and SNR
  fields), route-map count, exact quick-action hrefs, 44 px submit target,
  loading / unauthorized / malformed-catalog fail-closed states, mobile
  no-overflow, and direct BFF auth/schema/happy-path gates.

## Data & contracts

- **Reads**: `GET /v1/admin/aja/noise-reduction` (catalog: `analysisFields`).
- **Writes**: `POST /v1/admin/aja/noise-reduction/analyze` →
  `{ sampleCount, mean, std, min, max, dominantFrequency, snr }`.
- **Realtime**: none.
- **Caching**: client fetch on mount (`cache: 'no-store'`); SSR shell.
- **Auth/role check**: BFF endpoint admin-scoped + fail-closed (401/403 →
  unauthorized render); route gated signed-in + studio via proxy.

## Cross-references

- Parent: [`../../studio-overview.md`](../../studio-overview.md)
- Sibling (quick-action): `/studio/aja/blend-shape-retargeting`
- Component sources:
  - `apps/oshun/web/src/components/studio/StudioAjaNoiseReductionWorkspace.tsx`
  - `apps/oshun/web/src/components/studio/StudioAjaNoiseReductionRouteMap.ts`

## Known downstream boundaries

- Route-map sub-routes are descriptive contracts; implementation status of those
  child pages is tracked separately from this leaf console.
