---
path: /lilith-studio/concerts
surface: customer
domain: lilith
auth: signed-in + role:v1_editorial_producer (default)
source: apps/oshun/web/src/app/lilith-studio/concerts/page.tsx
status: walked
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'
---

# Lilith Studio · Saraswati concert pipeline

## 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 blocked** — `editorState.canPublish === false`; Publish button
      disabled
- [ ] **Ready to publish** — `canPublish === true`
- [ ] **Published** — `publishReceipt.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

### 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`
- [ ] **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

- Studio shell: [`lilith-studio.md`](./lilith-studio.md)
- Music queue: [`lilith-studio-music.md`](./lilith-studio-music.md)
- Sibling editors: [`lilith-studio-asana.md`](./lilith-studio-asana.md),
  [`lilith-studio-avatar-costume.md`](./lilith-studio-avatar-costume.md),
  [`lilith-studio-personas.md`](./lilith-studio-personas.md),
  [`lilith-studio-scenes.md`](./lilith-studio-scenes.md),
  [`lilith-studio-provenance.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 `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
