---
status: walked + e2e-covered
coverage_depth: deep
last_walked:
  '2026-07-02 by Codex — real-dev-infra Playwright covers authenticated
  /atelier/video route anchors, all 12 storyboard panels, render queue progress,
  selected sh 06 metadata, read-only click non-mutation, disabled Cut timeline
  placeholder semantics, reduced-motion static subtree, offline-stable loaded
  markup, and 390px no-overflow layout.'
specs:
  - apps/oshun/web/e2e/atelier-video-render-queue.spec.ts
---

# Journey: Atelier · Cinematheque render queue

A signed-in customer opens Cinematheque, reviews the twelve-panel storyboard,
checks the render queue, confirms sh 06 is the selected mid-render shot, and
verifies that the Cut timeline action is not yet wired. This captures the V1
Atelier video surface as a deliberate read-only render monitor: state is visible
and internally coherent, but panel selection, reordering, live progress updates,
and timeline editing are not shipped in the consumer room yet.

## Personas

- **Contemplative customer** — primary actor; checks the video plate without
  entering a studio/editor workspace
- **Returning maker** — verifies which shot is selected and whether queued
  renders are waiting behind the active one
- **Studio-bound customer** — verifies that the consumer Cinematheque presents
  read-only progress and does not pretend to expose Cut timeline editing yet

## Pre-conditions

- Customer signed in
- `/atelier/video` is reachable behind the customer auth shell
- `getAtelierVideo()` returns the populated fixture with twelve shot titles,
  twelve shot times, and three render queue rows
- No route-local `loading.tsx` or `error.tsx` exists; those states are captured
  as inherited/absent rather than fabricated

## Steps

### 1. Open Cinematheque

- [x] Customer navigates to `/atelier/video` from the Atelier index,
      `/atelier/motion` handoff, Lilith index, or direct URL.
- [x] Page server-renders `apps/oshun/web/src/app/atelier/video/page.tsx`,
      awaits `getAtelierVideo()`, and renders `<AtelierVideo data>`.
- [x] Route root exposes `data-atelier-video-page`,
      `data-atelier-video-shot-count="12"`,
      `data-atelier-video-render-queue-count="3"`,
      `data-atelier-video-current-shot="sh 06"`, and
      `data-atelier-video-render-progress="64"`.
- [x] Plate head reads "The atelier · cinematheque" and "A short film,
      storyboarded." with chips "04 : 38 / 06 : 00", "9 of 12 shots", and
      "Rendering · take 02".
- [x] Step rail exposes all five steps with step 3 "Shot list · cameras, lenses"
      current.

### 2. Review the storyboard

- [x] Storyboard grid exposes `data-atelier-video-storyboard-count="12"`.
- [x] All twelve panels render exact labels, times, titles, state attributes,
      and selection attributes from `getAtelierVideoFixture()`.
- [x] Shots sh 01–05 are rendered; sh 06 is the only rendering/selected panel;
      sh 07–10 are queued; sh 11–12 are drafted.
- [x] sh 06 shows visible `rendering · 64%` state.
- [x] Tapping sh 10 does not change selection, update the selected shot card, or
      navigate.

### 3. Review the render queue

- [x] Render queue exposes three rows.
- [x] sh 06 row exposes rendering state, progress `64`, title "Tilt up · dust in
      beam", and ETA `02:14`.
- [x] sh 07 row exposes queued state, progress `0`, title "Reverse · the
      looker", and ETA `04:42`.
- [x] sh 08 row exposes queued state, progress `0`, title "Cut to black, two",
      and ETA `06:18`.
- [x] Clicking a queue row leaves the selected storyboard panel and selected
      shot card on sh 06.

### 4. Inspect selected shot sh 06

- [x] Shot card exposes `data-atelier-video-shot-card-shot="sh 06"` and
      `data-atelier-video-shot-card-progress="64"`.
- [x] Preview shows `T+00:48 · 24fps`.
- [x] Progress card shows Rendering 64% and ETA 02:14.
- [x] Metadata rows show camera, lens, frame rate, length, light, engine, and
      sound, including "Lilith Cine · v1.4" and "From foundry · 02:14 stem".
- [x] Clicking the preview is read-only and keeps the route at `/atelier/video`.

### 5. Check Cut timeline affordance

- [x] "Open in Cut · timeline" renders as a disabled-placeholder `LBtn` with
      `aria-disabled="true"`, `data-placeholder="true"`, and tooltip
      `No handler wired — placeholder`.
- [x] Clicking it leaves the customer on `/atelier/video`.

### 6. Edge-state checks

- [x] At 390 px width, the layout stacks rail → storyboard/queue → shot card
      without horizontal overflow.
- [x] Under reduced motion, the route subtree exposes zero animations; progress
      bars are static rendered values.
- [x] After the route has loaded, browser offline mode leaves the route root,
      storyboard, and selected shot card visible.

## Post-conditions

- Customer can see the current video render state without entering an editor.
- sh 06 is clearly the selected mid-render shot and the queue behind it is
  coherent.
- No fake selection, reorder, live subscription, or Cut timeline route is
  implied by the current consumer route.

## Failure modes

- [x] **State mismatch** — storyboard and render queue agree that only sh 06 is
      rendering; sh 07 is queued.
- [x] **False affordance** — Cut timeline button exposes disabled-placeholder
      semantics and does not navigate.
- [x] **Read-only non-mutation** — storyboard, queue, and preview clicks leave
      selection and route unchanged.
- [x] **Mobile overflow** — 390 px browser check fails if the desktop grid leaks
      horizontally.
- [x] **Offline after load** — static route markup remains visible after the
      browser context goes offline.
- [ ] **Route-local load/error** — no local `loading.tsx` or `error.tsx` exists
      yet.
- [ ] **Live render progress** — no subscription or polling exists yet; progress
      is static fixture state.

## Data & contracts

- Route: `apps/oshun/web/src/app/atelier/video/page.tsx`
- Component: `apps/oshun/web/src/components/lilith/atelier.tsx` (`AtelierVideo`)
- Data: `apps/oshun/web/src/lib/lilith-data/atelier-depth.ts`
  (`getAtelierVideoFixture()`)
- Writes: none in the current customer surface
- Realtime: none in current code

## E2E coverage

Spec: `apps/oshun/web/e2e/atelier-video-render-queue.spec.ts` (4 tests)

**Coverage depth:** deep for the shipped static/read-only route contract. The
spec runs through authenticated real dev infra, verifies all fixture-derived
storyboard and queue rows, drives the available click paths to prove
non-mutation, asserts disabled-placeholder Cut semantics, and covers mobile,
reduced-motion, and offline-stable loaded markup. Remaining gaps are product
work: route-local loading/error boundaries, live render updates, storyboard
selection/reordering, and a real Cut timeline destination.

## Per-view files touched

- [`customer/11-atelier/atelier-video.md`](../customer/11-atelier/atelier-video.md)
  — primary Cinematheque route
- [`customer/11-atelier/atelier-motion.md`](../customer/11-atelier/atelier-motion.md)
  — URL-scoped inbound handoff source
- [`customer/11-atelier/atelier.md`](../customer/11-atelier/atelier.md) — room
  index entry

## Cross-references

- Motion handoff journey:
  [`atelier-motion-to-cinematheque.md`](./atelier-motion-to-cinematheque.md)
- Coverage matrix: [`coverage.md`](./coverage.md)

## Open questions / known gaps

- [ ] Add route-local loading and error states that preserve the room's context
      and recovery action
- [ ] Replace fixture progress with an explicit polling or subscription contract
      before describing the queue as live
- [ ] Decide whether storyboard selection/reordering belongs in this consumer
      room or only in the authoring studio
- [ ] Define the Cut timeline destination; until then the disabled placeholder
      remains the truthful affordance
