---
status: reconciled-partial
coverage_depth: deep
last_reconciled: 2026-07-17
specs:
  - apps/oshun/web/e2e/atelier-image-to-library.spec.ts
  - apps/oshun/web/e2e/atelier-plate-actions.spec.ts
source: WALKTHROUGH/journeys/atelier-image-to-library.md
---

# Journey result: Atelier image to library

- **Walked**: 2026-05-29 by Claude (Opus 4.8) against commit `bf12b0f7d8`;
  browser coverage was extended on 2026-06-25 through 2026-06-27.
- **Reconciled**: 2026-07-17 against the current Camera Obscura composer,
  plate-action island, Library store/read-back, cast endpoint, provider adapter,
  and focused browser suites. This review does not rerun the historical walker.
- **Verdict**: **partial** — current coverage deeply proves editable composition
  controls, specimen selection, compare, metadata-rich save, BFF and clean-
  device Library read-back, privacy-preserving telemetry, and fail-closed
  cast/refine requests. A real provider-backed image success and plate-specific
  variant resume remain outside the proven path.
- **Historical runner**:
  `/tmp/claude-oshun-lt-2-walkthrough/walk.mjs atelier-image-to-library`. The
  temporary path remains provenance only; the repository suites below are the
  portable evidence.

## Result at a glance

| Evidence lane             | Current result                                                                                                         | Authority limit                                       |
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- |
| Room composition          | Prompt, aspect, style, seed lock, specimen selection, compare panel, and five-step rail transition in the real browser | Initial specimen/source data remains fixture-backed   |
| Library save              | `atelier-plate-kept` persists as `generated-artifact`, including prompt and composition metadata                       | Saves metadata and partial provenance, not pixels     |
| BFF and clean-device read | Saved item reads back through the real BFF and hydrates in a fresh browser context                                     | Same authenticated test identity and local harness    |
| Resume action             | Library exposes `Open in Atelier` and returns to `/atelier/image`                                                      | No plate id, selected state, or variant hydration     |
| Cast and refine           | Real `/v1/atelier/cast` seam receives edited composition payloads and fails closed when Stability is unconfigured      | Successful generated image bytes are credential-gated |
| Responsive behavior       | `/atelier` and `/atelier/image` stack without horizontal overflow at 390 px                                            | Focused viewport, not the complete device matrix      |

## Evidence map

The saved Library artifact records the user's composition and source context.
Generation is a separate provider-backed branch, and the current resume link
returns to the room rather than reopening a durable plate lineage.

```mermaid
flowchart LR
    A[Camera Obscura fixture sources] --> B[Edit prompt and controls]
    B --> C[Select and compare specimen]
    C --> D[Save plate metadata]
    D --> E[Web Library store]
    E --> F[Real BFF saved-item read-back]
    F --> G[Library generated-artifact row]
    G -->|Open in Atelier| H[Generic /atelier/image]
    B --> I[Cast or refine request]
    I --> J[/v1/atelier/cast]
    J -->|no credential| K[provider_not_configured]
    J -. credential required .-> L[Generated image bytes]
    H -. plate-specific hydration absent .-> M[Variant lineage]
```

## Proven observations

### Composition and selection

- `/atelier` exposes five rooms and routes Camera Obscura to `/atelier/image`.
  Both surfaces have focused 390 px no-overflow coverage.
- The image room accepts an edited prompt and exposes aspect, style, and seed-
  lock controls. Selecting a specimen updates the plate detail, compare opens a
  kept-versus-active panel, specimen selection advances the rail to step 4, and
  explicit save advances it to step 5.
- Cast and refine requests carry the browser-entered prompt, selected specimen,
  aspect, style, and seed-lock state rather than silently reverting to the
  initial fixture.

### Saved artifact and provenance

- “Save plate to notebook” writes the stable id `atelier-plate-kept` as a
  `generated-artifact`. Its summary retains the selected specimen, aspect,
  style, seed state, and normalized prompt; its trust state is explicitly
  `partial` because provider image bytes are absent.
- The test proves browser-store persistence, authenticated real-BFF read-back,
  the filtered `/library?kind=generated-artifact` row, provenance badge and
  lineage note, and hydration in a clean second browser context.
- `atelier_plate_saved` telemetry records a prompt hash plus bounded composition
  fields. The assertion explicitly rejects the raw prompt from telemetry.

### Honest generation seam

- “Cast twelve more” and “Refine · vary slightly” POST to the real
  `/v1/atelier/cast` BFF route. In an environment without
  `OSHUN_STABILITY_API_KEY`, the route returns typed `provider_not_configured`
  and the UI surfaces that state.
- The fail-closed branch is meaningful proof that the product does not fabricate
  generation success. It is not evidence that a provider accepted the request,
  returned bytes, or preserved those bytes with the saved Library item.

## Boundaries and gaps

- **Saved metadata is not generated pixels.** The durable Library row preserves
  prompt, source names, specimen, aspect, style, and seed state with partial
  provenance. It does not contain a provider-generated image or an asset-level
  hash/receipt for those bytes.
- **Resume is route-level, not plate-specific.** `Open in Atelier` targets
  `/atelier/image`; there is no `/atelier/image?plate=<id>` hydration, restored
  selection, parent reference, or variant graph.
- **Provider failure is not provider success.** The local credential-free path
  proves an honest 503. It does not exercise Stability latency, moderation,
  quota, response parsing, image persistence, retries, cancellation, or billing.
- **Fixture inputs still shape the room.** Source names and initial plate state
  come from `getAtelierImageFixture`; the browser interactions are real, but the
  initial contact sheet is not a provider response.
- **Crisis and sharing policy are not joined here.** This record does not prove
  crisis-frame privacy defaults, a share gate, abuse review, or an AAA-tier
  handoff into Yemaya Studio.
- **A clean browser context is not an arbitrary external device.** The suite
  proves BFF rehydration inside the test harness, not cross-account or offline
  asset synchronization in production.

## Re-run evidence

The current focused browser evidence is:

```bash
PW_BROWSER_CHANNEL=chrome pnpm exec playwright test \
  -c apps/oshun/web/playwright.config.ts \
  apps/oshun/web/e2e/atelier-image-to-library.spec.ts \
  apps/oshun/web/e2e/atelier-plate-actions.spec.ts \
  --workers=1
```

Run it against the real-development-infrastructure web/BFF harness. Without a
Stability credential, the expected generation result is the typed fail-closed
state; only a separately configured success-path run may claim returned image
bytes.

## Source trail

- [Source-reconciled journey](../journeys/atelier-image-to-library.md)
- [Camera Obscura route](../../apps/oshun/web/src/app/atelier/image/page.tsx)
- [Image composer](../../apps/oshun/web/src/components/lilith/AtelierImageComposer.tsx)
- [Plate save/cast/refine island](../../apps/oshun/web/src/components/lilith/AtelierPlateActions.tsx)
- [Atelier fixture data](../../apps/oshun/web/src/lib/lilith-data/atelier-depth.ts)
- [Web Library store](../../apps/oshun/web/src/lib/library/webLibraryStore.ts)
- [BFF cast route](../../apps/oshun/bff/src/routes/domain-stubs.ts)
- [Image-provider resolution](../../apps/oshun/bff/src/generation/image-provider-env.ts)
- [Room and composition browser suite](../../apps/oshun/web/e2e/atelier-image-to-library.spec.ts)
- [Save/read-back and cast browser suite](../../apps/oshun/web/e2e/atelier-plate-actions.spec.ts)

## Cross-references

- [Journey coverage matrix](../journeys/coverage.md)
- [Atelier index view](../customer/11-atelier/atelier.md)
- [Camera Obscura view](../customer/11-atelier/atelier-image.md)
- [Library view](../customer/02-home-discovery/library.md)
- [Scene keep-and-share journey](../journeys/scene-keep-and-share.md)
- [Crisis-aware tone-policy result](./crisis-aware-tone-policy.md)

## Open questions

- What identifier and route contract will reopen an exact kept plate with its
  selected specimen, prompt, controls, parent, and variants intact?
- Where should generated image bytes, hashes, provider/model metadata, safety
  decisions, and asset receipts live so Library provenance can become complete?
- Which credentialed staging gate will exercise provider success, timeout,
  moderation, quota, cancellation, retry, and persistence behavior?
- How should crisis-frame privacy and AAA-tier “Open in Studio” transfer alter
  the save and resume affordances?
