V1 Web PWA · Surface walkthrough

Lilith Studio · Asana sequence editor

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

walked
8sections4 minread

On this page

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-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 AsanaOptions from LILITH_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
    • 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 / faileddata-sophia-grounding-state updates; UI text and color reflect
  • Preview not-run / previeweddata-preview-state updates; previewRoundTripId set when previewed
  • Timing not simulated / simulateddata-timing-preview-state
  • Publish blockeddata-publish-ready="false"; Publish button disabled
  • Publish readydata-publish-ready="true"
  • Publisheddata-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#

  • "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#

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>)