Context. surface customer · domain veritas · route /veritas/claim · auth signed-in · source apps/oshun/web/src/app/veritas/claim/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 "read with the seams showing" view. Every sentence in the story is
underlined by its confidence band (high / medium / low) and footnoted with a
superscript that opens the matching evidence card in the rail. The thin server
component awaits getVeritasClaim() and renders VeritasClaim.
Entry points#
- Veritas sub-nav — verify which
LSubNavitem points here (the room declareslead | topics | sources | updatesonly;/veritas/claimis likely a deep link rather than a primary tab) - Linked from
/veritas— verify whether the "Read sources" or article action surfaces this view - Linked from
/veritas/story— story timeline → claim mode for an individual entry (verify) - Direct URL / bookmark — yes (auth required)
Layout regions#
page.tsx is a thin server component: await getVeritasClaim() →
<VeritasClaim>. VeritasClaim delegates the interactive board to the
'use client' VeritasClaimInteractive component, which mounts LWebShell
with LCustomerNav active="library".
- Header: Lilith customer nav (Library tab active)
- Masthead (
VrMast): top rule labelledVeritas · the broadsheet | reading · claim mode · on | N claims · M sources, then a large display title "Read with the seams showing." and an italic lede paragraph - Article column (left, 1.5fr):
- Kicker eyebrow, headline (44px serif), byline eyebrow
- Body paragraphs where each sentence is either plain text or a focusable
claim button (underline colour + superscript footnote driven by sentence
levelandsrc) - Legend card:
How to read the lines— three coloured underlines mapping high / medium / low to copy
- Evidence column (right, 1fr):
VrHead:— · Evidence · open · What stands behind the lines. · hover, focus, or click- Selected claim card (
Selected · sup. N · "..."): the active claim text, a confidence bar with percent fill,confidence · 0.NN/M sources alignrow, and a stack of source rows withVrBandchips, date eyebrow, and italic quote VrHead:— · All N claims · Confidence at a glance.- Claims table: one row per claim with italic text, a coloured confidence
bar, and a
.NNmono number
States#
- Loading —
getVeritasClaim()awaited server-side; suspends until resolved (no client skeleton) - Populated — fixture renders one selected claim plus the rest of the claim table
- No selected claim — code path renders
data.selecteddirectly; the "no selection" branch is not present in this component - Error (recoverable) —
getVeritasClaim()rejects → falls through to the nearesterror.tsxboundary - Offline — service worker serves cached HTML/JS; claim selection is client-local and needs no network fetch once the shell has loaded
- Standalone PWA — verify the masthead and grid render at narrow breakpoints (page uses fixed 56px lateral padding)
- Empty — N/A; the fixture always returns paragraphs and a table
- Gated — none coded in this page
Interactions#
Body sentences (data-veritas-claim-inline)#
- Underlined sentence (
button) — hover, focus, and click update the right rail'sdata-veritas-selected-claimto the sentencesrc - Superscript footnote (
<sup>) — rendered inside the button; the colour matches the sentence level and the parent button carriesaria-controls="veritas-selected-claim"/aria-pressed
Legend card — "How to read the lines"#
- Three coloured swatches — non-interactive; verify accessibility name
(the swatch is a 24×0 div with
border-bottom; needs SR text oraria-label)
Selected-claim card (right rail)#
- Selected eyebrow —
Selected · sup. <sup> · "<text>"; updates as the user hovers/focuses/clicks a claim or table row - Confidence bar — visual element with
data.selected.confidencepercent width; verify SR text e.g. "confidence 0.NN, M sources align" - Source row (per source)
VrBandchip (A / B / C / D) — colour swatch + small italic descriptor ("A · primary or independent", etc.); verify SR-readable- Source name (italic serif) + date eyebrow + italic quote — each selected
source row is an anchor with
data-veritas-selected-source-row,data-veritas-source-name,data-veritas-source-band, andhref="/veritas/source"
Claims table#
- Each row — three-column button (text, bar, mono confidence); rows with
supupdate the selected-claim card on focus/click
Data & contracts#
- Reads:
getVeritasClaim()from@/lib/lilith-data/veritas-depth— returnsVeritasClaimData({ story, paragraphs[].sentences, selected, claimInspections, table }) - Writes: none
- Realtime: none
- Caching: server fetch; revalidation per fixture policy
- Auth/role check: shell middleware (verify)
- Page metadata:
title: "Veritas · claim mode", description "Read with the seams showing — every assertion underlined by its confidence and footnoted to the evidence.",alternates.canonical: /veritas/claim
Cross-references#
- Component:
apps/oshun/web/src/components/lilith/veritas.tsx—VeritasClaimwrapper - Component:
apps/oshun/web/src/components/lilith/VeritasClaimInteractive.tsx— claim-mode client board, selected rail, source links - Data:
apps/oshun/web/src/lib/lilith-data/veritas-depth.ts(getVeritasClaim) - Sibling routes:
veritas.md— domain hubveritas-mobile.md— phone variant with the same claim-peek patternveritas-counterclaims.md
- Component shared with:
VrMast,VrHead,VrPip,VrBand(defined inveritas.tsx) and matching claim-mode atoms inVeritasClaimInteractive - Feature spec:
V1/features.md
Open questions / known gaps#
- The lede promises "hover any line; the rail opens what stands behind it";
VeritasClaimInteractivenow wires hover/focus/click to the selected rail - Keyboard affordance for cycling between claims: underlined claims and claims-table rows are buttons
-
LCustomerNav active="library"puts this view under Library — consistent with the/veritashub, which also usesactive="library"(the earlier "hub uses Explore" premise is false; no inconsistency) - Confirm whether the page sets
dynamicor uses ISR/static rendering