V1 Web PWA · Surface walkthrough

Lilith Studio · Saraswati concert pipeline

A per-surface walkthrough of the V1 Web PWA customer surface: layout, states, interactions, data, and cross-references.

walked
8sections3 minread

On this page

Context. surface customer · domain lilith · route /lilith-studio/concerts · auth signed-in + role:v1_editorial_producer (default) · source apps/oshun/web/src/app/lilith-studio/concerts/page.tsx

Last walked. 2026-05-29 automated runtime walk (Playwright headless) — render, /v1 data (2xx), console/page-errors, expected content, screenshot verified; live screen-reader, touch, offline, and telemetry-delivery checks pending a manual AT pass. Evidence: WALKTHROUGH/results/runtime-sweep-2026-05-29.md; content re-verified 2026-06-03 against current source

Purpose#

Author Saraswati Sequencer assets — setlist proposal, per-track generation review queue, motion / lighting / Niagara / speech / audience cue bindings, dress rehearsal signoff, GA cadence proof, and full Isis provenance signoff. Backed by @oshun/tenant-saraswati-stage's createSaraswatiConcertAuthoringEditorState and publishSaraswatiConcertSequencer. The page (apps/oshun/web/src/app/lilith-studio/concerts/page.tsx) returns <SaraswatiConcertAuthoringPipeline /> directly; the <ShellLayout active="studio"> wrapper and the editorial scope gate are supplied by the route's apps/oshun/web/src/app/lilith-studio/layout.tsx.

Entry points#

  • Lilith Studio shell (/lilith-studio) — "Concert authoring" surface tab → "Open Concert authoring" link
  • Direct URL / bookmark — yes (signed-in)
  • From music queue/lilith-studio/music

Layout regions#

SaraswatiConcertAuthoringPipeline (apps/oshun/web/src/app/lilith-studio/concerts/SaraswatiConcertAuthoringPipeline.tsx):

  • Header: eyebrow "Lilith Studio / Concert authoring", title "Saraswati concert pipeline", lede, two header actions — "Lilith shell" → /lilith-studio, "Music queue" → /lilith-studio/music
  • Summary band: four KPI metrics — Proposal (<N>d), Debut catalog (SARASWATI_CONCERT_AUTHORING_DEBUT_TRACK_COUNT), Setlist (SARASWATI_CONCERT_AUTHORING_SETLIST_SONG_COUNT), GA cadence (SARASWATI_CONCERT_AUTHORING_MONTHLY_GA_CONCERT_COUNT/mo)
  • Editor grid (3 panels):
    • Persona setlist proposal panel (aria-label="Persona setlist proposal"): meta rows for Concert, Proposal, Owner; status strip with "Proposal ready" / "Proposal blocked"
    • Speech and rehearsal controls panel:
      • Speech slots <select> (data-saraswati-concert-speech-slots, options 7/8/10/12)
      • Alternates per slot <select> (data-saraswati-concert-speech- alternates, options 2/3/4/5)
      • Dress rehearsals <select> (data-saraswati-concert-dress- rehearsals, options 1/2/3)
    • GA cadence panel:
      • Proof window <select> (data-saraswati-concert-cadence-proof, options "60-day GA proof" ga-60-day, "30-day partial proof" partial-30-day)
      • Meta list: Artists, Concerts / month, Signed off
  • Song cue matrix panel (aria-label="Song cue matrix"): kicker "Cue matrix", count <N> songs, ordered list of songCueBindings with song number / track ID / motion preset (Sparkles icon) / Niagara cue (Lightbulb icon)
  • Release grid (2 panels):
    • Release gates panel (aria-label="Release gates"): gate count <N>/<M> clear, gate list with data-passed + evidence chips
    • Sequencer publish panel (aria-label="Sequencer publish"): sequencer asset ID, "Publish Sequencer" release button (data-saraswati-concert-publish), publish status (data-status=<status> — Sequencer status + Isis provenance bundle ID), manifest textarea (read-only, data-saraswati-concert-authoring-manifest)
  • LilithProvenanceInspector — surface ID concert-authoring

States#

  • Loading — client component; data-hydrated="false" until mount
  • Default config — DEFAULT_PIPELINE_INPUT: proposal 2 days, debut catalog 6 weeks, motion 12 days, lighting/niagara 12 days, sequencer assembly 2 days, speech slots 10, alternates 4, dress rehearsals 2, cadence 60 days
  • Speech / dress / cadence changed — resets publish receipt
  • Editor blockededitorState.canPublish === false; Publish button disabled
  • Ready to publishcanPublish === true
  • PublishedpublishReceipt.status set; status strip shows BadgeCheck and provenance bundle ID
  • Offline — pure client editor over imported tenant logic; works offline (the import is bundled)

Interactions#

  • "Lilith shell" link — href /lilith-studio
  • "Music queue" link — href /lilith-studio/music

Speech and rehearsal selects#

  • Speech slots select (options 7, 8, 10, 12)
    • Function: setSpeechSlotCount + resetPublish
  • Alternates per slot select (options 2, 3, 4, 5)
  • Dress rehearsals select (options 1, 2, 3)

GA cadence#

  • Proof window select — options "60-day GA proof" + "30-day partial proof"

Cue matrix#

  • Each song row (read-only) — song number, track ID, motion preset, Niagara cue

Release gates#

  • Gate list rows (data-passed) — read-only

Sequencer publish#

  • "Publish Sequencer" button (release button, data-saraswati-concert-publish)
    • Function: publishSaraswatiConcertSequencer(pipelineInput)setPublishReceipt
    • Disabled when editorState.canPublish === false
  • Manifest textarea (read-only, aria-label="Concert authoring provenance manifest")

Provenance inspector#

  • LilithProvenanceInspector — read its own walkthrough

Data & contracts#

  • Reads / writes: in-process via @oshun/tenant-saraswati-stage (createSaraswatiConcertAuthoringEditorState, publishSaraswatiConcertSequencer)
  • Realtime: none
  • Caching: client bundle
  • Auth/role check: middleware enforces signed-in

Cross-references#

Open questions / known gaps#

  • Confirm whether the Sequencer publish writes to a back-end queue or stays in client state (the imported publishSaraswatiConcertSequencer may be pure)
  • Document the exact gate set in editorState.gateStatuses (label + evidence per gate)
  • Verify the role gate — concert authoring is a high-stakes editorial action, but the route uses the same <ShellLayout> as other Lilith Studio sub-routes