---
path: /studio/aja/annotation-and-collaboration
surface: studio
domain: aja
auth: signed-in + studio entitlement
source: apps/oshun/web/src/app/studio/aja/annotation-and-collaboration/page.tsx
status: walked + e2e-covered
last_walked:
  '2026-07-02 quality-metrics-lane console addendum — Playwright real-dev-infra
  coverage now proves signed-in render, route-map contract, quick-action href
  order, ready effect-size form, 44 px submit target, one-value client guard
  with no POST, exact real BFF Cohen d 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-quality-metrics-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 · Annotation and Collaboration

## Purpose

Admin lane console for collaborative review of motion takes. It wires the real
`@aja/motion-validation` `calculateCohensD` effect-size estimator: the operator
pastes two groups of annotation / rating scores (e.g. baseline vs. candidate
motion takes) and reads back Cohen's d, its magnitude band (negligible / small /
medium / large), an approximate 95% confidence interval, and each group's mean —
the statistic reviewers use to decide whether a change is meaningful, not just
noise.

## Entry points

- **Direct URL / bookmark** — `/studio/aja/annotation-and-collaboration`;
  metadata sets `alternates.canonical`
- **Linked from `/studio`** Domain-bridge studios section (Aja sub-area)
- **Quick action** — "Open Aja Search and Discovery workspace"
  (`/studio/aja/search-and-discovery`)

## Layout regions

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

- **Workspace** `StudioAjaAnnotationAndCollaborationWorkspace` — `<h1>` "Aja
  Annotation and Collaboration Workspace" + summary
  (`data-aja-annotation-and-collaboration-summary`), then the effect-size lane
  (loading / unauthorized / error / form + result)
- **Route Map panel** (`data-aja-annotation-and-collaboration-route-map`, `<h2>`
  "Route Map") — 5 entries from
  `STUDIO_AJA_ANNOTATION_AND_COLLABORATION_ROUTE_MAP` (path + purpose)
- **Quick-action lane** — two `quickAction` links:
  `/studio/aja/search-and-discovery`, `/studio`

## States

- [x] **Loading** — `data-aja-ac-loading` "Loading effect-size engine…" while
      the mount fetch of `GET /v1/admin/aja/annotation-and-collaboration` is in
      flight
- [x] **Unauthorized (gated)** — `data-aja-ac-unauthorized` on 401/403; admin
      scope message ("Aja workspace scope required to compare annotation
      groups.")
- [x] **Error** — `data-aja-ac-error` on non-OK / malformed / network failure
- [x] **Ready (form)** — `data-aja-ac-form` once the catalog loads
- [x] **Result** — `data-aja-ac-result` (`-value`, `-means`, `-ci`) after a
      successful POST; validation error in `data-aja-ac-effect-error`
- [x] **Offline** — SSR shell renders from cache; the lane falls to the error
      state ("Network unavailable.") when `fetch` is unavailable
- [x] **Standalone PWA** — desktop layout; `quickAction` anchors wrap
- [x] **Empty** — N/A; catalog is constant

## Interactions

### Effect-size lane

- [x] **Group 1 scores** (`<input data-aja-ac-group1>`, label "group 1 scores")
      — comma-separated numbers
- [x] **Group 2 scores** (`<input data-aja-ac-group2>`, label "group 2 scores")
- [x] **"Compare groups"** (`<button data-aja-ac-submit>`) — POSTs
      `{ group1, group2 }` to
      `/v1/admin/aja/annotation-and-collaboration/effect-size`; requires ≥2
      numbers per group

### Route Map panel

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

### Quick-action lane

- [x] **"Open Aja Search and Discovery workspace"** →
      `/studio/aja/search-and-discovery`
- [x] **"Back to Studio workspace index"** → `/studio`

## E2E coverage

- [`apps/oshun/web/e2e/studio-aja-quality-metrics-lane-consoles.spec.ts`](../../../../apps/oshun/web/e2e/studio-aja-quality-metrics-lane-consoles.spec.ts)
  covers signed-in shell render, 5 route-map entries, exact quick-action hrefs,
  ready effect-size catalog/form, 44 px submit target, one-value client guard
  with no POST, exact real BFF Cohen's d result with group means and 95% CI,
  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/annotation-and-collaboration` (catalog:
  `measure`, `interpretations`) on mount, `cache: 'no-store'`,
  `buildBffAuthHeaders()`
- **Writes**: `POST /v1/admin/aja/annotation-and-collaboration/effect-size`
- **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 itself gated signed-in + studio via the proxy

## Cross-references

- Parent: [`../../studio-overview.md`](../../studio-overview.md)
- Shell:
  [`../../../shell/04-auth-session.md`](../../../shell/04-auth-session.md)
- Sibling routes:
  [`./studio-aja-search-and-discovery.md`](./studio-aja-search-and-discovery.md)
- Component sources:
  - `apps/oshun/web/src/components/studio/StudioAjaAnnotationAndCollaborationWorkspace.tsx`
  - `apps/oshun/web/src/components/studio/StudioAjaAnnotationAndCollaborationRouteMap.ts`

## Known downstream boundaries

- Route-map sub-routes (`scenes/[sceneId]`, `exports/[exportId]`,
  `revisions/[revisionId]`, `governance/[policyId]`) are advertised but have no
  `page.tsx` yet; implementation status is tracked separately from this leaf
  console.
