Context. surface customer · domain lilith · route /lilith-studio/asana · auth signed-in + role:v1_editorial_producer (default) · source apps/oshun/web/src/app/lilith-studio/asana/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#
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-studioshell 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
AsanaOptions fromLILITH_ASANA_LIBRARY: Mountain pose, Sun salutation A, Warrior II, Tree pose, Savasana — each with an "Add" 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
- Library list — five
- Breathwork + script panel:
- Breathwork controls —
<select data-lilith-breathwork-select>(fromLILITH_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>(fromLILITH_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)
- Breathwork controls —
- 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)
- Avatar stage (head/torso/arms/legs sprites posed by
- 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"
- Sequence build panel (
- Release manifest panel (
aria-label="Asana sequence release evidence") — readonly textarea with JSON manifest (data-lilith-asana-publish-manifest) LilithProvenanceInspector— surface IDasana-editor
States#
- Loading — client component;
hydratedflag 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-stateupdates; UI text and color reflect - Preview not-run / previewed —
data-preview-stateupdates;previewRoundTripIdset 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 IDrelease: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
- Function: sets meditation script to
- 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'
- Function: sets
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 - Sibling editors:
lilith-studio-avatar-costume.md,lilith-studio-concerts.md,lilith-studio-music.md,lilith-studio-personas.md,lilith-studio-scenes.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
setPublishStateis in-memory) - Document Sophia grounding evaluation criteria (
evaluateSophiaGrounding) - Verify keyboard behaviour on the timing cue list (
tabIndex={0}on the<ol>)