---
path: /lilith-studio/asana
surface: customer
domain: lilith
auth: signed-in + role:v1_editorial_producer (default)
source: apps/oshun/web/src/app/lilith-studio/asana/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 · Asana sequence editor

## Purpose

Build instructor-led asana sequences with breathwork, meditation script, Sophia
grounding evidence, preview, timing simulator, and a V1 release edition
manifest. The page (`apps/oshun/web/src/app/lilith-studio/asana/page.tsx`)
returns `<LilithAsanaEditor />` 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`) — "Asana authoring" surface tab →
  "Open Asana authoring" link
- **Direct URL / bookmark** — yes (signed-in)
- **From V1 workflow** — surface link to `/lilith-studio` shell available in
  header

## Layout regions

`LilithAsanaEditor`
(`apps/oshun/web/src/app/lilith-studio/asana/LilithAsanaEditor.tsx`):

- **Header**: eyebrow "Lilith Studio / Asana authoring", title "Asana sequence
  editor", lede, two header actions — "Lilith shell" → `/lilith-studio`, "V1
  workflow" → `/studio/review-approval-workflows`
- **Three-panel grid** (`styles.grid`):
  - **Sequence build panel** (`aria-label="Sequence build"`):
    - Library list — five `AsanaOption`s from `LILITH_ASANA_LIBRARY`: Mountain
      pose, Sun salutation A, Warrior II, Tree pose, Savasana — each with an
      "Add <pose>" icon button (`data-lilith-asana-add`), disabled when already
      in the sequence
    - Sequence list — `<ol>` of added steps; per-step up/down/remove icon
      buttons; "More than 4 steps required for grounding" hint
  - **Breathwork + script panel**:
    - Breathwork controls — `<select data-lilith-breathwork-select>` (from
      `LILITH_BREATHWORK_BLOCKS`: coherent-breath, box-breath, alternate-
      nostril), duration `<input data-lilith-breathwork-duration>` (2–12), "Add
      block" primary button (`data-lilith-breathwork-add`)
    - Breathwork list — each block with remove icon button
    - Meditation script — `<select data-lilith-script-template>` (from
      `LILITH_MEDITATION_SCRIPT_TEMPLATES`: grounded-arrival, steady- focus,
      closing-integration), "Apply script" button (`data-lilith-script-apply`),
      textarea (`aria-label="Meditation script"`, `data-lilith-script-textarea`)
  - **Sophia grounding + publish panel**
    (`aria-label="Sophia grounding and publish"`):
    - **Readiness list** (6 items): Sequence build, Breathwork block, Meditation
      script, Sophia grounding, Preview round-trip, Timing simulator
    - **Sophia status block** (`data-lilith-sophia-grounding-status`,
      `data-state`) — "Sophia grounding pending / passed / needs revision" +
      evidence ID
    - **Preview status block** (`data-lilith-asana-preview-status`)
    - **Timing simulator** (`data-lilith-asana-timing-simulator`, `data-state`):
      - Avatar stage (head/torso/arms/legs sprites posed by
        `activeTimingCue.avatarPose`)
      - Timing readout — current cue label + range + total minutes + progress
        bar (`data-lilith-asana-timing-progress`)
      - Cue navigation: Previous (`aria-label="Previous timing cue"`,
        `data-lilith-asana-timing-previous`) and Next
        (`aria-label="Next timing cue"`, `data-lilith-asana-timing-next`)
      - Cue list (`data-lilith-asana-timing-cues`)
    - **Actions**: "Run Sophia grounding check"
      (`data-lilith-sophia-grounding-check`), "Preview sequence"
      (`data-lilith-asana-preview`), "Preview timing"
      (`data-lilith-asana-timing-preview`), "Publish sequence"
      (`data-lilith-asana-publish`, release button)
    - **Publish status** (`data-lilith-asana-publish-status`) — "Draft held at
      editorial candidate" / "Published to V1 release edition"
- **Release manifest panel** (`aria-label="Asana sequence release evidence"`) —
  readonly textarea with JSON manifest (`data-lilith-asana-publish-manifest`)
- **`LilithProvenanceInspector`** — surface ID `asana-editor`

## States

- [ ] **Loading** — client component; `hydrated` flag flips on mount
      (`data-hydrated`)
- [ ] **Empty sequence** — no steps; "Sequence build" readiness false
- [ ] **Populated sequence** — at least 4 steps added; readiness flips
- [ ] **Library item already in sequence** — Add button disabled
- [ ] **Breathwork block added** — block list updates
- [ ] **Script template applied** — textarea body replaced with template `body`
- [ ] **Sophia grounding not-run / passed / failed** —
      `data-sophia-grounding-state` updates; UI text and color reflect
- [ ] **Preview not-run / previewed** — `data-preview-state` updates;
      `previewRoundTripId` set when previewed
- [ ] **Timing not simulated / simulated** — `data-timing-preview-state`
- [ ] **Publish blocked** — `data-publish-ready="false"`; Publish button
      disabled
- [ ] **Publish ready** — `data-publish-ready="true"`
- [ ] **Published** — `data-publish-state="published"`; release sequence ID
      `release:seq:tara-foundations:v3`
- [ ] **Offline** — view is client-only; works offline (writes do not escape the
      page)

## Interactions

### Header

- [ ] **"Lilith shell" link** — href `/lilith-studio`
- [ ] **"V1 workflow" link** — href `/studio/review-approval-workflows`

### Sequence build

- [ ] **Each asana "Add" button** (5 — Mountain, Sun salutation A, Warrior II,
      Tree, Savasana)
  - `data-lilith-asana-add=<asanaId>`, `aria-label="Add <label>"`, disabled when
    selected
  - Function: appends step with default minutes; resets editorial gate
- [ ] **Move up button** per step (`aria-label="Move <label> up"`, disabled at
      first)
- [ ] **Move down button** per step (disabled at last)
- [ ] **Remove button** per step (`aria-label="Remove <label>"`)

### Breathwork

- [ ] **Breathwork select** (`data-lilith-breathwork-select`)
- [ ] **Duration input** (number, min 2 max 12)
      (`data-lilith-breathwork-duration`)
- [ ] **"Add block" button** (`data-lilith-breathwork-add`)
- [ ] **Remove block button** per block (`aria-label="Remove <label>"`)

### Script

- [ ] **Script template select** (`data-lilith-script-template`)
- [ ] **"Apply script" button** (`data-lilith-script-apply`)
  - Function: sets meditation script to `getScriptTemplate(id).body`; resets
    gate
- [ ] **Meditation script textarea** (`data-lilith-script-textarea`,
      `aria-label="Meditation script"`)
  - Function: free-text edit; resets gate on each keystroke

### Sophia / publish

- [ ] **"Run Sophia grounding check" button**
      (`data-lilith-sophia-grounding-check`)
- [ ] **"Preview sequence" button** (`data-lilith-asana-preview`)
- [ ] **"Preview timing" button** (`data-lilith-asana-timing-preview`)
- [ ] **Timing previous / next cue buttons**
- [ ] **"Publish sequence" button** (release button,
      `data-lilith-asana-publish`)
  - Function: sets `publishState='published'`

### Manifest

- [ ] **Manifest textarea** (read-only,
      `aria-label="Asana sequence publish manifest"`)

### Provenance inspector

- [ ] **`LilithProvenanceInspector`** — read its own walkthrough

## Data & contracts

- **Reads**: in-file constants `LILITH_ASANA_LIBRARY`,
  `LILITH_BREATHWORK_BLOCKS`, `LILITH_MEDITATION_SCRIPT_TEMPLATES`,
  `LILITH_ASANA_PROVENANCE_ASSETS`
- **Writes**: client state only; no network
- **Realtime**: none
- **Caching**: client bundle
- **Auth/role check**: middleware enforces signed-in

## Cross-references

- Studio shell: [`lilith-studio.md`](./lilith-studio.md)
- Sibling editors:
  [`lilith-studio-avatar-costume.md`](./lilith-studio-avatar-costume.md),
  [`lilith-studio-concerts.md`](./lilith-studio-concerts.md),
  [`lilith-studio-music.md`](./lilith-studio-music.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)
- Component source:
  `apps/oshun/web/src/app/lilith-studio/asana/LilithAsanaEditor.tsx`

## Open questions / known gaps

- [ ] Confirm whether manifest persistence to V1 release edition is wired to a
      real BFF or held in client state only (current `setPublishState` is
      in-memory)
- [ ] Document Sophia grounding evaluation criteria (`evaluateSophiaGrounding`)
- [ ] Verify keyboard behaviour on the timing cue list (`tabIndex={0}` on the
      `<ol>`)
