V1 Web PWA · Surface walkthrough

Nisaba · daily passage

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

walked
8sections3 minread

On this page

Context. surface customer · domain nisaba · route /nisaba/daily · auth signed-in · source apps/oshun/web/src/app/nisaba/daily/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#

The small morning page: a single passage, a word study from the lexicon, a Tara companion paired by the assistant, and one reflection prompt. Hosted in a desktop frame around a phone shell so the specimen reads "375 × 812" on the desktop web preview.

Entry points#

  • Nisaba sub-nav — verify whether the desk's sub-nav exposes "daily"
  • Push / email — morning passage push deep-links here
  • Direct URL / bookmark — yes

Layout regions#

page.tsx is a server component that:

  1. Awaits getNisabaDaily()
  2. Wraps the page in LWebShell top={<LCustomerNav active="library" />}
  3. Renders a LMasthead with specimen labels:
    • left: "Specimen · Nisaba mobile"
    • right: "375 × 812"
    • kicker: "The small morning page"
    • title: "The daily passage."
  4. Renders a <LEyebrow>How this reads</LEyebrow> explainer paragraph
  5. Centers a <PhoneFrame label="Nisaba · daily" caption="Aurelius IV.viii on the morning page."> containing <NisabaDaily data={data} />

Inside NisabaDaily (nisaba.tsx, line 2301), an LPhoneShell composition:

  • Status barLStatusBar
  • Top eyebrow row — "Nisaba · daily passage" / "day "
  • Citation blockLCode for citation, italic dateLine
  • Passage card — vertical accent rule + serif passage with lead / emphasized / rest, followed by an italic passage reference
  • The word card — lexicon excerpt with "↗ lexicon" affordance
  • Companion / reflection prompt cards — verify in nisaba.tsx (Tara companion + reflection prompt are part of the daily flow)

States#

  • LoadedgetNisabaDaily() resolves before render
  • Day numberdata.dayNumber reflects the running day count
  • Citation / passage — render from data.passage.lead, data.passage.emphasized, data.passage.rest
  • Word study present — "The word" card with link to the lexicon
  • Tara companion present — verify the assistant-paired Tara card
  • Reflection prompt present — verify the single reflection prompt
  • Standalone PWA — this is the marketing-style specimen frame, not a true mobile-only route; relies on the parent shell

Interactions#

Specimen frame#

  • Masthead labels and PhoneFrame caption — non-interactive copy

Inside the phone shell#

  • Citation LCode — non-interactive eyebrow
  • Passage card — verify if "Save the line" / "Carry it to the notebook" actions are wired (the explainer copy promises this)
  • The word card · "↗ lexicon"LCode styled as a link; opens /nisaba/lexicon (verify)
  • Tara companion card — opens the assistant-paired Tara ritual (verify cross-domain route)
  • Reflection prompt — opens reflection capture (verify route)

Data & contracts#

  • Reads: getNisabaDaily() from @/lib/lilith-data/nisaba-depth — returns NisabaDailyData (verify shape: dayNumber, citation, dateLine, passage{lead, emphasized, rest}, passageRef, word study, companion, reflection prompt)
  • Writes: None observed in this view.
  • Realtime: None.
  • Caching: server fetch
  • Auth/role check: shell middleware

Cross-references#

Open questions / known gaps#

  • Confirm whether /nisaba/daily is the live mobile route or only a desktop specimen (the page nests NisabaDaily inside a PhoneFrame with explicit 375 × 812 labels)
  • Document the "Save the line / Carry it to the notebook" affordances promised in the explainer copy — verify they exist in NisabaDaily
  • Confirm the Tara companion pairing source — assistant runtime or pre-computed pairing
  • Verify the reflection prompt capture destination (notebook? Arete?)