Entity Studios Parity — Design Spec

Date: 2026-06-14 Status: Approved (scope confirmed by user); pending implementation plan Scope: Bring location / object / creature(animal) studios to parity with the redesigned character studio, generalize the entity image-output handle, and surface creature voice.

Builds directly on the just-shipped character work: the generic StudioShell + StudioNavConfig, the plain-image output handle (PR #3369 + the connectivity fix in connection-validation.ts/payload-builder.ts), and the voice resource.


1. Goals (all three user-approved)

  1. Studio port + References — move location/object/creature studios off their old monolithic tabbed modals onto the shared config-driven StudioShell, and promote each one’s reference photos (today a section inside appearance-tab.tsx) to a first-class References page in a Resources group. Mirrors character’s Resources → Identity → content structure while keeping each entity’s meaningful content groups.
  2. Entity image output = first-class image producer (all 4 entities) — add a plain image output handle to location/object/creature (character already has it) and generalize the connectivity so every entity’s image output connects anywhere generate-image output can.
  3. Creature voice — surface the already-stored creature voice (migration 220) in the frontend, add a Voice page to the creature studio, and wire creature→text-to-speech auto-fill.

Non-goals

Current state (audited)


2. Architecture

Reuse frontend/src/components/editor/studio-shell/ (StudioShell<S,J> + StudioNavConfig + StudioNavContext + DEFAULT_STUDIO_ACCENT_ACTIVE) as-is — it is already entity-agnostic.

For each of location/object/creature:

Per-entity nav structure

Sheet stays via the shared reference-sheet-tab + SHEET_TAB_ADAPTERS.<entity> (location/object only — creature has no sheet, matching today).


3. Entity image output handle (all 4 entities)

Frontend node + types

Frontend connection-validation (connection-validation.ts)

Backend routing (payload-builder.ts)

Output emission

“text input” clarification (documented): generate-image output is an image producer and does NOT connect to literal text/prompt inputs (nor should an entity image handle). The image→text bridge is image-to-text (its image input is already covered). This satisfies “any image/reference/text input, just like generate-image output.”


4. Creature voice

Backend storage already exists (220 + creatures.ts Zod, “reuses the character voice plumbing verbatim”). Frontend surfacing only:


5. Testing


6. Phasing (independently shippable)

  1. Image-handle generalization (FE node handles + handle-output-types + connection-validation + payload-builder guards + tests) — small, high-value, cross-cutting; ship first.
  2. Location studio port + References page.
  3. Object studio port + References page.
  4. Creature studio port + References page + Voice (page + types + auto-wire) + gen:skills.

Each phase: tsc + targeted tests green, independently shippable to dev.