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)
- Speech slots
- 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
- Proof window
- Persona setlist proposal panel
(
- Song cue matrix panel (
aria-label="Song cue matrix"): kicker "Cue matrix", count<N> songs, ordered list ofsongCueBindingswith song number / track ID / motion preset (Sparklesicon) / Niagara cue (Lightbulbicon) - Release grid (2 panels):
- Release gates panel (
aria-label="Release gates"): gate count<N>/<M> clear, gate list withdata-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)
- Release gates panel (
LilithProvenanceInspector— surface IDconcert-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 blocked —
editorState.canPublish === false; Publish button disabled - Ready to publish —
canPublish === true - Published —
publishReceipt.statusset; status strip showsBadgeCheckand provenance bundle ID - Offline — pure client editor over imported tenant logic; works offline (the import is bundled)
Interactions#
Header#
- "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
- Function:
- 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
- Function:
- 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#
- Studio shell:
lilith-studio.md - Music queue:
lilith-studio-music.md - Sibling editors:
lilith-studio-asana.md,lilith-studio-avatar-costume.md,lilith-studio-personas.md,lilith-studio-scenes.md,lilith-studio-provenance.md - Tenant package source:
libs/tenant/saraswati/stage/src/...(verify exact path inside the lib) - Component source:
apps/oshun/web/src/app/lilith-studio/concerts/SaraswatiConcertAuthoringPipeline.tsx
Open questions / known gaps#
- Confirm whether the Sequencer publish writes to a back-end queue or stays
in client state (the imported
publishSaraswatiConcertSequencermay 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