V1 Web PWA · Walk result

Journey result: Atelier image to library

A dated evidence record for V1 Web PWA: observed behavior, current source reconciliation, automation evidence, and explicit proof limits.

verdict: partial· 2026-05-29
8sections5 minread1table

On this page
  • 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.

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#

Cross-references#

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?