---
path: /studio/aja/per-stage-configuration
surface: studio
domain: aja
auth: signed-in + studio entitlement
source: apps/oshun/web/src/app/studio/aja/per-stage-configuration/page.tsx
status: walked + e2e-covered
last_walked:
  '2026-07-02 pipeline-control lane addendum — Playwright real-dev-infra
  coverage now proves signed-in render, route-map contract, quick-action href
  order, ready stage-config form, 44 px submit target, malformed-JSON client
  guard with no POST, forward-dependency issue rendering, valid config result,
  fail-closed loading/unauthorized/catalog-error states, mobile no-overflow,
  and direct BFF 401/403/400/200 gates for catalog and validate. Spec:
  apps/oshun/web/e2e/studio-aja-pipeline-control-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 · Per-Stage Configuration

## Purpose

Leaf lane console that wires the real motion-pipeline stage-config validator.
The operator submits a single stage configuration and the lane validates it —
known stage, positive timeout, sane retry policy, and dependencies that resolve
to earlier stages in canonical execution order — returning the stage, a
valid/invalid verdict, and any field-level issues.

## Entry points

- **Direct URL / bookmark** — `/studio/aja/per-stage-configuration`.
- **Studio nav** — Domain-bridge studios section of `/studio`.
- **Embedded** — appears as the Per-Stage Configuration Lane inside
  `/studio/aja/svc-motion-pipeline`.
- **Sibling quick-action** — "Open Aja Pipeline Stages workspace"
  (`/studio/aja/pipeline-stages`).

## Layout regions

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

- **Workspace** `<StudioAjaPerStageConfigurationWorkspace />`:
  - `<h1>` "Aja Per-Stage Configuration Workspace" + summary
    (`data-aja-per-stage-configuration-summary`).
  - Stage Config Validation Lane (heading `data-aja-psc-lane-heading`) — the
    form; includes `data-aja-psc-engine-summary` (catalog `summary`) and
    `data-aja-psc-stages` (canonical stage chain).
- **Route Map panel** (`data-aja-per-stage-configuration-route-map`, `<h2>`
  "Route Map"): 5 `STUDIO_AJA_PER_STAGE_CONFIGURATION_ROUTE_MAP` entries —
  primary, scenes, exports, revisions, governance.
- **Quick-action lane**: two `Link.quickAction` anchors. No breadcrumb panel.

## States

The lane fetches `GET /v1/admin/aja/per-stage-configuration` on mount.

- [x] **Loading** — `data-aja-psc-loading` "Loading stage-config validator…".
- [x] **Unauthorized** — `data-aja-psc-unauthorized` (401/403; default "Aja
      workspace scope required to validate stage configs.").
- [x] **Error** — `data-aja-psc-error`.
- [x] **Ready (form)** — `data-aja-psc-form`.
- [x] **Result** — `data-aja-psc-result` with `data-aja-psc-headline` (stage +
      valid/issue count) and `data-aja-psc-issues-list` (rows
      `data-aja-psc-issue-row`).
- [x] **Validation error** — `data-aja-psc-validate-error` (e.g. "Config must be
      valid JSON.").

## Interactions

### Validate form (`data-aja-psc-form`)

- [x] **Stage config (JSON)** — textarea `data-aja-psc-config` (default
      `retargeting` stage config).
- [x] **Validate stage config** — submit `data-aja-psc-submit`; fires
      `POST /v1/admin/aja/per-stage-configuration/validate` with `{ config }`.

### Route Map

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

### Quick-action lane

- [x] **"Open Aja Pipeline Stages workspace"** → `/studio/aja/pipeline-stages`
- [x] **"Back to Studio workspace index"** → `/studio`

## E2E coverage

- [`apps/oshun/web/e2e/studio-aja-pipeline-control-lane-consoles.spec.ts`](../../../../apps/oshun/web/e2e/studio-aja-pipeline-control-lane-consoles.spec.ts)
  covers signed-in shell render, ready stage-config form, malformed-JSON client
  guard with no `POST`, real BFF forward-dependency issue rendering
  (`dependencies` / `forward-reference` for `preprocessing` depending on
  `retargeting`), valid `retargeting` config output, 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/per-stage-configuration` (catalog: `summary`,
  `canonicalStages`, `qualityPresets`, `retryBounds`).
- **Writes**: `POST /v1/admin/aja/per-stage-configuration/validate` →
  `{ stage, valid, issues }`.
- **Realtime**: none.
- **Caching**: client fetch on mount (`cache: 'no-store'`); SSR shell.
- **Auth/role check**: BFF endpoint admin-scoped + fail-closed; route gated
  signed-in + studio via proxy.

## Cross-references

- Parent: [`../../studio-overview.md`](../../studio-overview.md)
- Aggregator that embeds this lane:
  [`./studio-aja-svc-motion-pipeline.md`](./studio-aja-svc-motion-pipeline.md)
- Sibling (quick-action): `/studio/aja/pipeline-stages`
- Component sources:
  - `apps/oshun/web/src/components/studio/StudioAjaPerStageConfigurationWorkspace.tsx`
  - `apps/oshun/web/src/components/studio/StudioAjaPerStageConfigurationRouteMap.ts`

## Known downstream boundaries

- Route Map lists `scenes`/`exports`/`revisions`/`governance` child routes as
  descriptive contracts; implementation status of those child pages is tracked
  separately from this leaf console.
