V1 Web PWA · Surface walkthrough

Nisaba · the study plan

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

walked
8sections2 minread

On this page

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

A seven-week study arc with a prerequisite chain — what rests on what — paced by weeks. The fixture is "On the ruling part" — week 4 of 7, 18 of 31 readings.

Entry points#

Layout regions#

page.tsx is a thin server component: await getNisabaPlan()<NisabaPlan data={data} />.

Inside NisabaPlan (nisaba.tsx, line 2048):

  • Web shell topLCustomerNav active="library"
  • Header strip — eyebrow row "Nisaba · study plan" / "'On the ruling part' · 7 weeks" / "week 4 of 7 · 18 of 31 readings"; LDisplay (size 72) headline "The arc, paced by weeks."
  • Progress row (gridTemplateColumns: '1fr auto'):
    • Progress label + bar — 6 px ruler with accent fill at (3.4 / 7) * 100% and a 14 px accent dot positioned at the current marker
    • Week labelsw. 1 … w. 7 with w. 4 · today highlighted in accent
  • Weekly arc body (verify exact layout further in nisaba.tsx) — one card per week, listing readings, prerequisites, and links to the reading desk

States#

  • LoadedgetNisabaPlan() resolves before render
  • Current week — highlighted "w. · today"; progress bar fills to (<fraction>/7) * 100%
  • Reading completed — verify per-reading completion indicator
  • Prerequisite locked — verify lock state for prerequisites that haven't been satisfied
  • Plan paused / abandoned — verify whether the surface handles a paused state
  • Reduced motion — composes static Lilith primitives

Interactions#

  • LDisplay — non-interactive headline

Progress row#

  • Progress bar — non-interactive
  • Week label (w. 1w. 7) — verify whether labels link to that week's section anchor

Weekly arc body#

  • Week card — opens the week's reading list (verify scroll-spy or route push)
  • Reading row — opens the passage in the reading desk (/nisaba/...)
  • Mark complete — verify whether the plan supports checking off readings in V1
  • Prerequisite hint — verify hover/focus tooltip on locked items

Data & contracts#

  • Reads: getNisabaPlan() from @/lib/lilith-data/nisaba-depth — returns NisabaPlanData (verify shape: weeks, readings, prerequisites, current progress)
  • Writes: verify whether the plan supports a "mark complete" write path
  • Realtime: None.
  • Caching: server fetch
  • Auth/role check: shell middleware

Cross-references#

Open questions / known gaps#

  • Confirm whether reading completion is wired to a BFF write path
  • Document the prerequisite-locked behavior (visual only? prevents navigation?)
  • Confirm whether the plan should integrate with Metis course progression or remain Nisaba-internal
  • Document how week labels behave on mobile (they sit in a horizontal row; narrow viewports may overflow)