# The Atelier — Five Rooms of Making

The Atelier is the customer-facing **generative workshop** — "a small workshop
attached to the reading desk" — presenting five rooms of making (image, audio,
video, 3D forms, animated motion) as a single broadsheet surface in the Lilith
design register. It is governed by three house rules that apply to every
generative surface in V1: **only from a line** (every artifact begins with text
the member wrote — no single-tap generation), **provenance shown** (every plate
carries its sources, seed, and engine; synthetic voices are disclosed in the
score), and **slow by default** (twelve specimens, four takes, one kept plate —
speed exists but is never the default). The house rules are the member-facing
side of the platform's generation governance: the tier and surface boundaries
live in [Generation Audience Tiers](./generation-tiers-and-surfaces.md), the
control plane in [Isis Generation Control](./isis-generation-control.md), and
the provenance model in
[Output Gallery, Lineage, Branch, and Replay](./output-gallery-lineage.md).

This page is candid about the seam placement: the **room presentation data is
fixture-backed**, the **casting seam is a real fail-closed provider call**, and
the **member's scenes are real, owner-scoped, Postgres-backed records**. Each is
called out below.

## Where it lives

| Route                     | Room                                                              | Source                                           |
| ------------------------- | ----------------------------------------------------------------- | ------------------------------------------------ |
| `/atelier`                | Index — rooms + house rules; `?sceneId=<id>` active draft handoff | `apps/oshun/web/src/app/atelier/page.tsx`        |
| `/atelier/image`          | X · Camera Obscura (image)                                        | `apps/oshun/web/src/app/atelier/image/`          |
| `/atelier/audio`          | XI · Foundry of Voices (audio)                                    | `apps/oshun/web/src/app/atelier/audio/`          |
| `/atelier/video`          | XII · Cinematheque (video)                                        | `apps/oshun/web/src/app/atelier/video/`          |
| `/atelier/forms`          | XIII · Forms (3D)                                                 | `apps/oshun/web/src/app/atelier/forms/`          |
| `/atelier/motion`         | XIV · Stage of Motion (animated 3D)                               | `apps/oshun/web/src/app/atelier/motion/`         |
| `/atelier/new`            | New scene/composition entry                                       | `apps/oshun/web/src/app/atelier/new/`            |
| `/atelier/camera-obscura` | Camera Obscura deep view                                          | `apps/oshun/web/src/app/atelier/camera-obscura/` |

All room components live in `apps/oshun/web/src/components/lilith/atelier.tsx`
(~2,100 lines): `AtelierIndex`, `AtelierImage`, `AtelierAudio`, `AtelierVideo`,
`AtelierForms`, `AtelierMotion`, plus the shared `AtelierPlateActions` (cast /
save / refine / compare) and `AtelierStepRail` (the five-step workflow rail).
Each component takes injected `data` and defaults to the fixtures in
`apps/oshun/web/src/lib/lilith-data/atelier-depth.ts` (218 lines), whose header
names the planned per-room BFF contracts (`getAtelierIndex` ← `/atelier`,
`getAtelierImage` ← `/atelier/plates/image`, and so on) that will replace the
fixtures.

## The rooms and their data models

Each room card on the index carries a numeral, a name, its one-line credo, a
format line, and an engine tag (from `AtelierIndexData.rooms`):

| No.  | Room              | Line                                   | Format / engine                        |
| ---- | ----------------- | -------------------------------------- | -------------------------------------- |
| X    | Camera Obscura    | "A line, drawn into a plate."          | 12-up · 4:5 · cream — Plate · v2       |
| XI   | Foundry of Voices | "A reading, cast — three stems."       | voice · bell · room — Foundry · v3     |
| XII  | Cinematheque      | "Twelve panels, twelve shots."         | 24 fps · 35 mm — Cine · v1.4           |
| XIII | Forms             | "Plotted in three views, then turned." | usd · alembic · glb — Form · v0.9      |
| XIV  | Stage of Motion   | "A figure, set in motion."             | 24 joints · IK on heels — Stage · v0.6 |

Per-room fixtures model the working state a live backend will serve. **Camera
Obscura** has a provenance sources rail (public-domain reference studies)
feeding the contact sheet. **Foundry of Voices** has three stems
(voice/bell/room, each with amplitude, color, density) and a four-entry voice
cast in which synthetic candidates are explicitly attributed. **Cinematheque**
has twelve time-stamped shot titles plus a render queue with per-shot state and
ETA. **Forms** has three orthographic views (top/front/section). **Stage of
Motion** has timeline tracks (spine, head, hands, breath — keys + curve) and
take versions (archived / kept / draft).

The Camera Obscura workflow is the canonical five-step specimen model that the
house rules encode: **a line, written** → **reference, gathered** (provenance
rail) → **twelve specimens** (contact sheet; select one) → **plate kept ·
refined** (seed lock, aspect, style) → **final · saved to notebook**. Kept
plates are written to the member's library as an `atelier-plate-kept` item in
the web library store (`oshun.web.library.saved-items.v1`), joining the
save/keep model documented in
[Customer Curation, Notebooks, Collections, and Sharing](./customer-curation-notebooks.md).

## The real BFF seams

Three atelier routes exist in the BFF today
(`apps/oshun/bff/src/routes/domain-stubs.ts`):

- **`POST /v1/atelier/cast`** — the "cast twelve more" seam, a **real
  fail-closed generation call** over the live image provider. Without Stability
  credentials (`OSHUN_STABILITY_API_KEY`) it returns
  `503 provider_not_configured`; with credentials it casts a real plate via the
  Stability SD3.5 provider (`generation/image-provider-env.ts`) and returns
  `202` with `state: 'cast'`, the specimen id, and the image reference. `intent`
  distinguishes `cast` from `refine`. This is the same fail-loud provider
  pattern documented in
  [External Models and Execution](./external-models-and-execution.md).
- **`GET /v1/atelier/scenes` / `POST /v1/atelier/scenes`** — the member's
  authored scenes, **strictly their own** (owner-scoped via the guarded auth
  context) and Postgres-backed (`v1_atelier_atelier_scene`). Creation validates
  a ≥4-character working title (`422 scene_title_too_short`), is
  origin/CSRF-guarded, and returns `202` with the stored scene state. Anonymous
  callers get an honest empty list — the fabricated fixture scenes that once
  padded every response were removed because they presented invented personal
  compositions as the member's own. The `/atelier?sceneId=<id>` route state uses
  this same list to render an active draft only for a scene owned by the
  signed-in member; missing or unowned ids render an unavailable handoff instead
  of a fabricated composition.
- **`GET /v1/atelier/jobs`** — a guarded **fixture** route
  (`ATELIER_JOBS_FIXTURE`); the render-queue presentation ahead of a live job
  system.

## Honest status (V1)

- **Real:** the eight routes and their components, the specimen/keep workflow
  UI, the cast seam (fail-closed without credentials, real casting with them),
  owner-scoped scene persistence, save-to-library, and the walkthrough coverage
  in `WALKTHROUGH/customer/11-atelier/` (runtime-walked, including 390 px
  no-overflow and room-grid coverage).
- **Fixture-backed:** the room presentation data (sources rails, stems, shot
  lists, views, takes) defaults to `atelier-depth.ts` fixtures; the planned
  `getAtelier*` BFF contracts named in that file's header are the replacement
  path. The components accept injected data, so the swap is a data-source
  change, not a rewrite.
- **Not claimed:** live audio/video/3D/motion generation from the room surfaces.
  The only live generative call is image casting; the other rooms' engines are
  presentation ahead of provider wiring, gated by the same tier and
  control-plane rules as every generative surface
  ([Isis Generation Control](./isis-generation-control.md)).

## Related

- [Generation Audience Tiers and Surface Boundaries](./generation-tiers-and-surfaces.md)
  — who may cast, where, and at what depth.
- [Isis Generation Control](./isis-generation-control.md) — the release gates
  behind "provenance shown."
- [Output Gallery, Lineage, Branch, and Replay](./output-gallery-lineage.md) —
  where kept plates' lineage and replay live.
- [Curated Creator Generation Surfaces](./creator-voice-music-3d.md) — the
  creator-tier siblings of these rooms.
- Walkthrough evidence: `WALKTHROUGH/customer/11-atelier/`.
