product

Graphene Lore → Novel Studio — session handoff

Date: 2026-07-10 · Status: shipped to main (14 PRs), not yet live in prod (migrations pending — see §1).

This is the operational state of one continuous push: Graphene lore on the homepage → admin management → stream/VR → the SJ Anderson novel pre-order → an in-house lore-podcast generator → The Studio (novel-writing cockpit) + Demo Studio (hands-free narrated demos) → the llm.ts Anthropic tool-calling unlock → canon-health in the cockpit. The vision doc is NOVEL_STUDIO_PLAN.md; this is the "what's live, what's yours, what's next".


1. ⚠️ Deploy checklist (YOUR actions — everything below degrades silently until done)

Apply these migrations to PROD (Supabase MCP ≠ prod, so I can't):

MigrationTablePowers
464_graphene_lore_podcasts.sqlgraphene_lore_podcaststhe Graphene — Lore shelf + hero + stream cards
465_novel_preorder_signups.sqlnovel_preorder_signupsthe JaJa Island pre-order capture + admin view
466_graphene_lore_generated_audio.sql(alters 464)in-house generated lore episodes (Lore Studio)
467_studio_demos.sqlstudio_demosthe Demo Studio library

Until applied: the lore shelf is empty, pre-order signup 500s, Lore Studio generate 500s, Demo Studio is empty. All fail silently (no user-facing errors) — so you won't notice breakage, you'll just see nothing.

Env vars (optional / when ready):

  • STUDIO_HOUSE_VOICE_ID — the Demo Studio narration voice. Defaults to a stock ElevenLabs narrator (Matilda). Set the real house voice; re-playing any demo regenerates its clips automatically.
  • ELEVENLABS_API_KEY — already set (the audio pipeline uses it); Lore Studio + Demo narration need it.

Content to drop in when you have it (apps/frontend/src/lib/novel-preorder.ts, the JAJA_ISLAND entry):

  • coverUrl → replaces the typographic placeholder cover everywhere.
  • kindleUrl / audibleUrl → the pre-order panels auto-flip from the notify-me form to real "Pre-order on Kindle/Audible" buttons (Amazon gets the hivejournal-20 affiliate tag automatically).

2. What shipped (by area, with where to find it)

Graphene Lore

  • Homepage shelf (/graphene) — inline Spotify episode embeds, first sibling shelf; a super-admin + card adds episodes; a ☆/★ toggle elevates one into the top-of-page hero. Components: GrapheneLoreRow.tsx; lib graphene-lore.ts; backend routes/graphene.ts (/lore-podcasts CRUD + /featured).
  • In the stream — 2D /dashboard/stream Graphene slot rotates season poster / lore / novel-preorder; immersive WebXR river floats lore + preorder cards (streamExtras.ts, StreamXRScene.tsx).
  • In-house generator (Lore Studio)/dashboard/admin/lore-studio: paste sources → Claude writes a two-host dialogue → ElevenLabs dual-voice → one MP3 → shelf. Decided AGAINST NotebookLM integration (no clean consumer API; Enterprise API can't fetch the audio; Gemini native-audio is preview). Service graphene-lore-generate.ts reuses podcast-discussion.ts.

Novel pre-order — "Graphene: Escape from JaJa Island" (SJ Anderson)

  • "Notify me at launch" email capture, forward-compatible to real buy buttons. Surfaces: dedicated page /graphene/jaja-island (clean URL graphene.fm/jaja-island), homepage panel, /sj-anderson panel, stream card. Admin waitlist view + Copy-CSV at /dashboard/admin/novel-preorder. Table novel_preorder_signups; routes/novel-preorder.ts.

The Studio — novel-writing cockpit (Novel Studio Phases 0–1)

  • /dashboard/admin/studio/dashboard/admin/studio/[seasonId]: five-mode cockpit (Draft / Listen / Adapt / Produce / Publish). Draft renders the real editor inline (ProseEditorModal gained an embedded prop); other modes launch into existing per-season admin surfaces. Canon dock "Check continuity" runs a deterministic bible-vs-prose audit (GET /api/story-seasons/:id/canon-health, no LLM). JQ via jq:open-canon.

Demo Studio — hands-free, house-voice, re-generatable demos

  • /dashboard/admin/demo-studio: a library of self-driving demos. GuidedDemo runner auto-advances a surface + plays house-voice narration (screen-record it). Narration is content-hash cached → editing a script or swapping the voice regenerates only changed lines. Seeded studio-cockpit-tour. Table studio_demos; routes/studio-demos.ts; services/studio-narrate.ts.

Infra

  • llm.ts Anthropic tool-calling — the shim now translates OpenAI-shaped tools/messages ↔ Anthropic (golden-tested llm-tools.test.ts), so a JQ-style agent loop runs on Sonnet/Haiku and tool calls fall back across providers. Additive (nothing used Anthropic+tools before).
  • Footer — "Point Seven Studio" credit opens in a new tab across all properties.

3. Decisions made this session

  • Featured lore → top-of-page hero (not a lore-shelf slot) — you chose it.
  • Pre-order = notify-me capture (not live external links / native Stripe) — you chose it; lives on all four surfaces.
  • NotebookLM: build our own generator, don't integrate — the Enterprise API can't return the audio file programmatically; Gemini native-audio is preview. We reuse our ElevenLabs pipeline instead.
  • The Studio = unify, don't rebuild — the editor/bible/JQ/production/distribution stack already exists; the cockpit assembles it.

4. Open decisions (need YOU)

  1. Naming / surface reconciliation — "The Studio" cockpit (/dashboard/admin/studio) overlaps the existing /studio/write creator editor. Plan recommends evolving /studio/write in place and folding the admin cockpit into it. Your call before this goes beyond super-admins.
  2. External-creator GTM — most cockpit/production routes are requireSuperAdmin. Opening to creators needs an RLS/ownership pass (season-access.ts is the seam). Deliberately not attempted blind — it's an auth-surface change that must be verified end-to-end.

  1. Apply migrations 464–467 + smoke-test each surface (you; ~15 min) — unblocks everything. Verify: lore shelf renders, pre-order signup works, Lore Studio generates an episode, a demo plays.
  2. Move JQ's canon agent to Sonnet + a proactive nudge (me; medium risk) — the tool-calling unlock now allows it. Flip chat/canon-mode off gpt-4o; add a proactive canon-health surface. Needs runtime verification of the tool loop (best done once migrations are live so I can be pointed at a real story).
  3. Phase-1 polish (me; low risk) — theme the embedded editor into the violet cockpit + dock a native JQ rail. Invasive on a shared component (ProseEditorModal), so behind a flag/prop.
  4. External-creator RLS pass (me + you; higher risk) — needs the naming decision (§4.1) first, then a careful auth pass with verification.
  5. Set the house voice + author more demos (you set env; me author) — a Demo Studio walkthrough, a "hear it in your own voice" Listen spotlight.

Tracked in product_tasks under "Novel Studio" (visible at /dashboard/admin/tasks).


NOVEL STUDIO HANDOFF — Docs | HiveJournal