---
path: /studio/aja/foot-sliding-correction
surface: studio
domain: aja
auth: signed-in + studio entitlement
source: apps/oshun/web/src/app/studio/aja/foot-sliding-correction/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 ground-contact catalog, 44 px submit target, short-track client guard
  with no POST, real BFF foot-sliding 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)'
---

# Aja Foot Sliding Correction

## Purpose

Admin lane console wired to the real `@aja/motion-processing`
`measureFootSliding` analyzer via `/v1/admin/aja/foot-sliding-correction`: it
accumulates the horizontal drift a foot joint shows while planted on the ground
(below the ground-contact height threshold) — the sliding metric that drives IK
foot-locking correction. The operator supplies a per-frame (x,y,z) foot-joint
track.

## Entry points

- **Direct URL** — `/studio/aja/foot-sliding-correction` (signed-in + studio
  entitlement)
- **Sibling quick-actions from this page** — Noise Reduction, Back to Studio

## Layout regions

`page.tsx` mounts `ShellLayout` with `active="studio"` and renders three panels.

- **Workspace panel** (`data-aja-foot-sliding-correction-workspace`):
  - `<h1>` "Aja Foot Sliding Correction Workspace" (via `WorkspaceHeading`)
  - `<p data-aja-foot-sliding-correction-summary>` — "Measure the horizontal
    drift a foot joint accumulates while planted on the ground — the sliding
    metric that drives IK foot-locking correction."
  - `data-aja-fsc-model` (ground-contact threshold + unit) + the measure form
- **Route Map panel** (`data-aja-foot-sliding-correction-route-map`): `<h2>`
  "Route Map" + one `<article>` per
  `STUDIO_AJA_FOOT_SLIDING_CORRECTION_ROUTE_MAP` entry (5 entries)
- **Quick actions panel**: `.quickAction` `<Link>`s — see Interactions

## States

- [x] **Loading** — `data-aja-fsc-loading` "Loading foot-sliding model…"
- [x] **Unauthorized** — on 401/403, `data-aja-fsc-unauthorized` ("Access
      restricted." + reason, default "Aja workspace scope required to view
      foot-sliding correction.")
- [x] **Error** — non-OK / malformed / unreachable → `data-aja-fsc-error`
- [x] **Ready (form)** — catalog present: `data-aja-fsc-model` + the measure
      form
- [x] **Result** — `data-aja-fsc-result` with `data-aja-fsc-total` (total
      sliding, m) and `data-aja-fsc-contact` (contact frames / total)
- [x] **Validation error** — `data-aja-fsc-measure-error` (e.g. "Track must
      contain at least 2 frames of x,y,z." / "Frame rate must be a positive
      number.")

## Interactions

### Measure form (`data-aja-fsc-measure-form`)

- [x] **Foot joint name** — `input data-aja-fsc-field-joint`
- [x] **Foot track ("x,y,z; x,y,z; …")** — `input data-aja-fsc-field-track`
- [x] **Frame rate (Hz)** — `input data-aja-fsc-field-rate`
- [x] **Measure sliding** — `button data-aja-fsc-measure-submit`; parses the
      track into `{x,y,z}` frames, then POSTs to
      `/v1/admin/aja/foot-sliding-correction/measure` with
      `{ footJointName, track, frameRate }`

### Route Map panel (`data-aja-foot-sliding-correction-route-map`)

Non-interactive `<article>` blocks from
`STUDIO_AJA_FOOT_SLIDING_CORRECTION_ROUTE_MAP` (5 entries):
`/studio/aja/foot-sliding-correction` plus `…/scenes/[sceneId]`,
`…/exports/[exportId]`, `…/revisions/[revisionId]`, `…/governance/[policyId]`.

### Quick actions panel

- [x] **Open Aja Noise Reduction workspace** → `/studio/aja/noise-reduction`
- [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 ground-contact catalog (`0.1 m`,
  `meters`), short-track client guard with no `POST`, real BFF planted-foot
  sliding output (`total sliding: 5 m`, `contact frames: 3 / 3`), 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/foot-sliding-correction` (catalog:
  `groundContactHeight`, `measures`, `unit`) on mount via
  `buildBffAuthHeaders()`, `cache: 'no-store'`
- **Writes**: `POST …/measure` → `{ measurement }`
- **Realtime**: none
- **Caching**: client fetch on mount (no-store); SSR shell only
- **Auth**: BFF endpoints admin-scoped + fail-closed (401/403 → unauthorized
  render); the route is signed-in + studio (proxy gate)

## Cross-references

- Parent: [`../../studio-overview.md`](../../studio-overview.md)
- Component sources:
  - `apps/oshun/web/src/components/studio/StudioAjaFootSlidingCorrectionWorkspace.tsx`
  - `apps/oshun/web/src/components/studio/StudioAjaFootSlidingCorrectionRouteMap.ts`
- Sibling from quick-actions: `/studio/aja/noise-reduction`

## Known downstream boundaries

- Route-map sub-routes are descriptive contracts; implementation status of those
  child pages is tracked separately from this leaf console.
- Studio entitlement / proxy policy remains a shell-auth boundary outside this
  lane console.
