---
path: /nisaba/scholar
surface: customer
domain: nisaba
auth: signed-in
source: apps/oshun/web/src/app/nisaba/scholar/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'
---

# Nisaba · scholar mode

## Purpose

The text in full apparatus — variants, witnesses, marginalia, and
cross-references. Fixture is Marcus Aurelius, Τὰ εἰς ἑαυτόν, IV.viii–xii, with 4
witnesses · 6 editions · 11 translations.

## Entry points

- **Nisaba sub-nav** — `LSubNav` entry "Scholar mode" on
  [`nisaba.md`](./nisaba.md)
- **Compare view** — link from [`nisaba-compare.md`](./nisaba-compare.md)
  "Apparatus · on"
- **Direct URL / bookmark** — yes

## Layout regions

`page.tsx` is a thin server component: `await getNisabaScholar()` →
`<NisabaScholar data={data} />`.

Inside `NisabaScholar` (`nisaba.tsx`, line 177):

- **Web shell top** — `LCustomerNav active="library"`
- **Header strip** — eyebrow row "Nisaba · the desk · scholar mode" / "Marcus
  Aurelius, Τὰ εἰς ἑαυτόν · IV.viii–xii" / "4 witnesses · 6 editions · 11
  translations"; `LDisplay` (size 64) headline "The text, in full apparatus."
- **Toolbar (right of headline)** — three actions:
  - `Reader mode` (ghost) — switch back to the reading-desk view
  - `Edition: Farquharson 1944 ▾` (ghost) — edition picker
  - `Cite` (primary) — opens citation generator
- **Three-column body** (`gridTemplateColumns: '220px 1fr 320px'`):
  - **Left — Marginalia · your hand** — `data.marginalia.map(m => (...))` rows
    with `L · <line>` accent label and italic body; "Highlights" chip cloud
    below (`power`, `quietness`, `impermanence`, `present moment`, `self`,
    `reason`)
  - **Centre — Text + apparatus** — full apparatus rendering (verify exact
    layout in `nisaba.tsx` past line 280)
  - **Right column** — witnesses / editions / translations rail (verify in
    source)

## Automation anchors

- Root/header: `data-nisaba-scholar-page` with marginalia/witness/
  cross-reference/concept counts; `data-nisaba-scholar-masthead-*`,
  `data-nisaba-scholar-heading`, and `data-nisaba-scholar-toolbar`
- Toolbar: wrappers for `reader-mode`, `edition-picker`, and `cite`
  (`data-nisaba-scholar-toolbar-action`)
- Marginalia and highlights: `data-nisaba-scholar-marginalia` with per-row line
  and note cells; `data-nisaba-scholar-highlights` with per-chip label
- Text + apparatus: `data-nisaba-scholar-reading-column`, per
  `data-nisaba-scholar-line-block`, `data-nisaba-scholar-crux`, and
  `data-nisaba-scholar-apparatus` with per-entry line/lemma/variant cells
- Witnesses/crossrefs/concepts: `data-nisaba-scholar-witness={siglum}`,
  `data-nisaba-scholar-crossrefs` with group/item cells, and
  `data-nisaba-scholar-concepts` with per-concept index

## States

- [x] **Loaded** — `getNisabaScholar()` resolves before render
- [ ] **Edition active** — fixture: Farquharson 1944; verify whether the
      dropdown is interactive in V1
- [ ] **Reader mode toggle** — `Reader mode` button verifies whether it
      navigates back to `/nisaba`
- [ ] **Cite dialog** — verify the Cite action target
- [x] **Marginalia present / empty** — `data.marginalia` may be empty; verify
      in-rail empty state
- [ ] **Apparatus expanded** — verify apparatus expansion controls

## Interactions

### Header strip

- [ ] **`LDisplay`** — non-interactive

### Toolbar

- [x] **Reader mode** (`LBtn kind="ghost"`)
  - Function: render-only V1 affordance; the journey verifies desk return via
    browser history
- [x] **Edition picker** (`LBtn kind="ghost"`)
  - Function: render-only V1 affordance; exact options/dropdown remain unwired
- [x] **Cite** (`LBtn kind="primary"`)
  - Function: render-only V1 affordance; citation generator remains unwired

### Marginalia rail

- [x] **Marginalia row** — non-interactive specimen entry; verify whether the
      user can add new marginalia in V1
- [x] **Highlights chip cloud** — visible chip cloud; chips are not wired to
      filter text/apparatus in this route

### Text + apparatus column

- [x] **Line / apparatus content** — line blocks and apparatus entries render
      with stable line/lemma anchors
- [ ] **Apparatus entry navigation** — opens the witness in the manuscript view
      (`/nisaba/manuscript`) or compare view
- [ ] **Cross-reference link** — opens the linked passage

### Right column

- [x] **Witness / cross-reference / concept rows** — visible rows are asserted
      cell-by-cell
- [ ] **Witness / edition / translation row navigation** — opens the
      corresponding source

## Data & contracts

- **Reads**: `getNisabaScholar()` from `@/lib/lilith-data/nisaba-depth` —
  returns `NisabaScholarData` (`marginalia: { ln, n }[]`, plus witnesses,
  editions, translations, apparatus — verify exact shape)
- **Writes**: verify whether marginalia editing is wired in V1
- **Realtime**: _None._
- **Caching**: server fetch
- **Auth/role check**: shell middleware

## Cross-references

- Sibling Nisaba routes:
  - [`nisaba.md`](./nisaba.md), [`nisaba-compare.md`](./nisaba-compare.md),
    [`nisaba-daily.md`](./nisaba-daily.md),
    [`nisaba-graph.md`](./nisaba-graph.md),
    [`nisaba-lexicon.md`](./nisaba-lexicon.md),
    [`nisaba-manuscript.md`](./nisaba-manuscript.md),
    [`nisaba-notebook.md`](./nisaba-notebook.md),
    [`nisaba-plan.md`](./nisaba-plan.md)
- Component sources:
  - `apps/oshun/web/src/components/lilith/nisaba.tsx` (`NisabaScholar` line 177)
- Feature spec: [`V1/features.md#nisaba`](../../../V1/features.md#nisaba)

## Open questions / known gaps

- [ ] Confirm whether the Cite primary action exports BibTeX, formatted
      citation, or both
- [ ] Document the edition picker's options and the BFF backing them
- [ ] Confirm whether marginalia editing is in scope for V1 (the rail says "your
      hand" but the rendering is specimen-only)
- [x] Verify the "Reader mode" button destination — current route exposes a
      render-only button; the journey uses browser-back from `/nisaba/scholar`
      to return to the desk
