Context. surface customer · domain veritas · route /domains/veritas/claims · auth signed-in · source apps/oshun/web/src/app/domains/veritas/claims/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. 2026-06-27 Codex Claim Tracker addendum — signed-in claims desk, search, status/domain filters, sort order, keyboard row expansion, close/back, submit idle/submitting return, trending, compare, standalone PWA relaunch, offline mobile use, no-horizontal-overflow checks, and serious axe scan are covered by the E2E evidence below. 2026-06-30 Codex addendum — added and covered Claim Tracker entry links from /domains/veritas shell tools and the /veritas broadsheet subnav.
Purpose#
The Veritas Claim Tracker — a full-screen overlay that lists ongoing public
claims with filtering, sorting, and expansion, lets a user submit a new claim
for fact-checking, surfaces trending claims, and provides a cross-claim compare
view. Distinct from the per-claim [claimId] detail workspace.
Entry points#
/domains/veritasshell surface — More verification tools exposes a "Claim Tracker" link (data-veritas-secondary-tool-link="claims") to/domains/veritas/claims/veritasbroadsheet subnav — "Claim tracker" (data-lilith-subnav-item-id="claims") links to/domains/veritas/claims- Direct URL / bookmark — yes (auth required)
Layout regions#
page.tsx is a 'use client' component that renders an sr-only <h1>
("Claim Tracker · Veritas · OSHUN") then mounts
<VeritasClaimTracker onClose={() => router.back()} />. The tracker is a fixed
full-screen overlay.
- Header: title, 44px-minimum accessible Close button, and responsive wrap behavior on narrow viewports.
- Nav tablist:
claims | submit | trending | compare; each tab exposesrole="tab",aria-selected, and stabledata-veritas-claim-tracker-tabhooks for automation. - Body: focusable scrollable region labelled "Claim tracker workspace".
- Claims view (
view === 'claims'):- Search + filter bar: text search input, status filter
(
ClaimStatus | 'all'), domain filter (ClaimDomain | 'all'), sort selector (date | importance | checkworthiness) - Claim list with keyboardable per-claim expansion via
expandedClaimstate; expanded rows expose status timeline, status history, community votes, tags, and evidence counts.
- Search + filter bar: text search input, status filter
(
- Submit view (
view === 'submit'): form to submit a claim — fields includesubmitDomain(politics by default) andsubmitType(statistical by default) plus claim text and comma-separated tags. - Trending view (
view === 'trending'): trending claims surface - Compare view (
view === 'compare'): responsive comparison grid with claim slots, similarity/verdict/shared-evidence metrics, differences, and commonalities.
- Claims view (
- The
detailview exists in the type (TrackerView) but is not surfaced as a top-level nav tab (onlyclaims | submit | trending | compareare rendered in the nav pernavItems) and has no renderer in this component.
States#
- Loading — overlay renders synchronously; no async skeleton or spinner.
- Claims view, populated — fixture data renders with result-count hooks.
- Claims view, no results after filter — empty state renders "No claims match your filters."
- Submit view, idle — empty form disables submit; default domain is
politics, default type isstatistical. - Submit view, submitting — click shows "Submitting..." and disables the action before returning to the claims view.
- Trending view — all fixture trending rows render with trend direction and 24h mention count.
- Compare view — fixture claim pair, similarity metric, differences, and commonalities render on desktop and mobile without horizontal overflow.
- Detail view (
TrackerView === 'detail') — verified as not a user journey here: the type member exists, but no nav item or renderer is present. - Offline — client-only claim search/expand/compare remains usable after
context.setOffline(true); app-level offline banner no longer blocks tab controls. - Standalone PWA —
/?surface=pwarestores to/domains/veritas/claimsand matches standalone display-mode. - Reduced motion — tracker has no component-level animation to reduce; the route passes the current serious axe gate.
Interactions#
Header#
- Close (icon button) — accessible name "Close Claim Tracker"; keyboard
Enter calls
onClose()→router.back(). - Nav tablist (per
navItems):claims—FileTexticon, label "All Claims"submit—Plusicon, label "Submit Claim"trending—TrendingUpicon, label "Trending"compare—ArrowLeftRighticon, label "Compare"
Claims view — filters#
- Search input (with
Searchicon) — text filter applies to claim text. - Status filter (
statusFilter) — ClaimStatus enum orall. - Domain filter (
domainFilter) — ClaimDomain enum orall. - Sort selector (
sortBy) —date | importance | checkworthiness; E2E verifies importance order against fixture scores.
Claims view — claim row#
- Expand toggle (per row) — click/Enter/Space sets
expandedClaimto the row id.- Function: shows extended evidence + verification details inline
- Inline status badge — colour-coded per ClaimStatus.
- Open in detail workspace — absent in this component; there is no "view
full detail" affordance linking to
/domains/veritas/claims/[claimId].
Submit view#
- Claim text input — required for enabling submit.
- Domain selector (
submitDomain, defaultpolitics). - Type selector (
submitType, defaultstatistical). - Tags input — comma-separated local text input.
- Submit button — disabled until claim text is present; click enters
submitting state and returns to the
claimsview post-submit.
Trending view#
- Trending claim row — fixture content, rank, trend direction, growth, 24h mentions, source count, and status badge render. No row click action is present.
Compare view#
- Per-claim selector — no picker is present; compare uses
SAMPLE_CLAIM_COMPARISONslots. - Comparison display — responsive side-by-side/stacked analysis with metrics, differences, and commonalities.
Current E2E evidence#
apps/oshun/web/e2e/veritas-claim-tracker.spec.ts—opens from Veritas shell tools and the broadsheet subnavcovers opening the route from/domains/veritasvia More verification tools, Close/browser history return to/domains/veritas, and opening the same tracker from the/veritasbroadsheet subnav.apps/oshun/web/e2e/veritas-claim-tracker.spec.ts—renders the claims desk, filters and sorts fixture claims, expands a row, and closes by keyboardcovers signed-in navigation from/library, initial populated claims view, close target size/name, empty search, text search, domain filter, status filter, importance sort, keyboard expansion, timeline/votes disclosure, and keyboard close/back behavior.apps/oshun/web/e2e/veritas-claim-tracker.spec.ts—submits a local claim through the idle and submitting statescovers the submit tab, default selectors, disabled/enabled action state, text/domain/type and tags entry, submitting label, disabled submitting button, and return to claims.apps/oshun/web/e2e/veritas-claim-tracker.spec.ts—renders trending and comparison views with canonical claim metricscovers tab state, fixture trending count/direction/mentions, compare claim text, similarity, differences, and commonalities.apps/oshun/web/e2e/veritas-claim-tracker.spec.ts—keeps the client-only tracker usable offline and restores standalone without mobile overflowcovers standalone PWA launch restoration, offline search, row expansion, compare navigation while offline, mobile no-horizontal-overflow checks, and the route-level serious axe scan.apps/oshun/web/src/components/__tests__/OfflineBanner.test.tsxcovers the app-level offline banner pointer-event behavior that keeps underlying route controls tappable while preserving the retry button.
Data & contracts#
- Reads:
TRACKED_CLAIMS,TRENDING_CLAIMS, andSAMPLE_CLAIM_COMPARISONimported from@/lib/veritas/veritas-simulation-data(there is noSAMPLE_CLAIMSimport) - Writes: none externally; local state mutations only. Submission is fixture-only and clears local text/tags after the short submitting state.
- Realtime: none
- Caching: not applicable
- Auth/role check: shell middleware (verify)
- Telemetry: no
track*imports in this file - Page metadata: not set (client component); sr-only
<h1>reads "Claim Tracker · Veritas · OSHUN"
Cross-references#
- Component:
apps/oshun/web/src/components/domains/veritas/VeritasClaimTracker.tsx - Type:
TrackerView(line 48) — five-option enum includingdetail navItemsdeclaration — four-tab visible nav- Route E2E:
apps/oshun/web/e2e/veritas-claim-tracker.spec.ts - Offline banner unit coverage:
apps/oshun/web/src/components/__tests__/OfflineBanner.test.tsx - Per-claim detail workspace:
domains-veritas-claims-claimId.md - Sibling tools:
domains-veritas-fact-check.md— different surface for verification flowdomains-veritas-articles.md,domains-veritas-headlines.md
- Customer-facing Veritas claim views:
veritas-claim.md,veritas-counterclaims.md - Feature spec:
V1/features.md
Open questions / known gaps#
-
TrackerView === 'detail'exists in the type union but is not surfaced innavItemsand has no renderer — decide whether to remove it or wire a dedicated relationship to/domains/veritas/claims/[claimId] - Submit flow is client-only with fixture data; verify whether V1 wires this to a real submission endpoint
- No telemetry on tab switches or submit
- Claim detail expansion vs dedicated detail route — confirm the intended
relationship (the dedicated
[claimId]route uses a different component,VeritasClaimDetailWorkspace)