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, the control plane in Isis Generation Control, and the provenance model in Output Gallery, Lineage, Branch, and Replay.
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.
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 returns503 provider_not_configured; with credentials it casts a real plate via the Stability SD3.5 provider (generation/image-provider-env.ts) and returns202withstate: 'cast', the specimen id, and the image reference.intentdistinguishescastfromrefine. This is the same fail-loud provider pattern documented in External Models and Execution.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 returns202with 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.tsfixtures; the plannedgetAtelier*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).
Related#
- Generation Audience Tiers and Surface Boundaries — who may cast, where, and at what depth.
- Isis Generation Control — the release gates behind "provenance shown."
- Output Gallery, Lineage, Branch, and Replay — where kept plates' lineage and replay live.
- Curated Creator Generation Surfaces — the creator-tier siblings of these rooms.
- Walkthrough evidence:
WALKTHROUGH/customer/11-atelier/.