---
path: /studio/aja/motion-format-conversion
surface: studio
domain: aja
auth: signed-in + studio entitlement
source: apps/oshun/web/src/app/studio/aja/motion-format-conversion/page.tsx
status: walked
last_walked:
  '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 · Motion Format Conversion

## Purpose

Admin lane console for converting motion between skeleton formats. It wires the
real `@aja/skeleton-mapping` template catalog + converter via
`/v1/admin/aja/motion-format-conversion`: list the skeleton formats (Mixamo /
MediaPipe / COCO / H36M / Unity / OpenPose / SMPL) and convert source→target via
auto joint-name matching, returning the mapped joint count, a joint-preservation
quality score, and any validation errors.

## Entry points

- **Direct URL / bookmark** — `/studio/aja/motion-format-conversion`; metadata
  sets `alternates.canonical`
- **Linked from `/studio`** Domain-bridge studios section (Aja sub-area)
- **Quick action** — "Open Aja Automated QA Pipeline workspace"
  (`/studio/aja/automated-qa-pipeline`)

## Layout regions

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

- **Workspace** `StudioAjaMotionFormatConversionWorkspace` — `<h1>` "Aja Motion
  Format Conversion Workspace" + summary
  (`data-aja-motion-format-conversion-summary`), the skeleton-formats list
  (`<h2>` "Skeleton formats (N)") and the convert form
- **Route Map panel** (`data-aja-motion-format-conversion-route-map`, `<h2>`) —
  5 entries from `STUDIO_AJA_MOTION_FORMAT_CONVERSION_ROUTE_MAP`
- **Quick-action lane** — `quickAction` links: automated-qa-pipeline, `/studio`

## States

- [ ] **Loading** — `data-aja-mfc-loading` "Loading skeleton formats…" while
      `GET /v1/admin/aja/motion-format-conversion` is in flight
- [ ] **Unauthorized (gated)** — `data-aja-mfc-unauthorized` on 401/403; admin
      scope message ("Aja workspace scope required to view motion format
      conversion.")
- [ ] **Error** — `data-aja-mfc-error` on non-OK / malformed / network failure
- [ ] **Ready (form)** — `data-aja-mfc-convert-form` once the templates load
      (each listed as `data-aja-mfc-template=<id>`)
- [ ] **Result** — `data-aja-mfc-result` (`-mapped`, `-preservation`, validation
      error count) after a successful POST; convert error in
      `data-aja-mfc-convert-error`
- [ ] **Offline** — SSR shell; lane error state when `fetch` unavailable
- [ ] **Standalone PWA** — desktop layout; `quickAction` anchors wrap
- [x] **Empty** — N/A; template catalog is constant

## Interactions

### Convert form

- [ ] **Source format** (`<select data-aja-mfc-field-source>`) — options from
      the template catalog (defaults `coco-17`)
- [ ] **Target format** (`<select data-aja-mfc-field-target>`) — options from
      the template catalog (defaults `h36m-17`)
- [ ] **"Convert"** (`<button data-aja-mfc-convert-submit>`) — POSTs
      `{ sourceTemplateId, targetTemplateId }` to
      `/v1/admin/aja/motion-format-conversion/convert`

### Route Map panel

- [ ] **5 entries** (`<article>` per `path` + `purpose`) — non-interactive

### Quick-action lane

- [ ] **"Open Aja Automated QA Pipeline workspace"** → `/studio/aja/automated-qa-pipeline`
- [ ] **"Back to Studio workspace index"** → `/studio`

## Data & contracts

- **Reads**: `GET /v1/admin/aja/motion-format-conversion` (`{ templates }`) on
  mount, `cache: 'no-store'`, `buildBffAuthHeaders()`
- **Writes**: `POST /v1/admin/aja/motion-format-conversion/convert`
- **Realtime**: none
- **Caching**: client fetch on mount (no-store); SSR shell
- **Auth/role check**: BFF endpoints admin-scoped, fail-closed (401/403 →
  unauthorized render); route gated signed-in + studio via the proxy

## Cross-references

- Parent: [`../../studio-overview.md`](../../studio-overview.md)
- Sibling routes:
  [`./studio-aja-automated-qa-pipeline.md`](./studio-aja-automated-qa-pipeline.md)
- Component sources:
  - `apps/oshun/web/src/components/studio/StudioAjaMotionFormatConversionWorkspace.tsx`
  - `apps/oshun/web/src/components/studio/StudioAjaMotionFormatConversionRouteMap.ts`

## Open questions / known gaps

- [ ] The conversion reports preservation quality against the template skeletons;
      converting an actual uploaded motion clip is not an in-page input
