---
path: /domains/veritas/claims
surface: customer
domain: veritas
auth: signed-in
source: apps/oshun/web/src/app/domains/veritas/claims/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. 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.
---

# Claim Tracker · Veritas

## 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/veritas` shell surface** — More verification tools exposes a
  "Claim Tracker" link (`data-veritas-secondary-tool-link="claims"`) to
  `/domains/veritas/claims`
- **`/veritas` broadsheet 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 exposes
  `role="tab"`, `aria-selected`, and stable `data-veritas-claim-tracker-tab`
  hooks 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 `expandedClaim`
      state; expanded rows expose status timeline, status history, community
      votes, tags, and evidence counts.
  - **Submit view** (`view === 'submit'`): form to submit a claim — fields
    include `submitDomain` (politics by default) and `submitType` (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.
- The `detail` view exists in the type (`TrackerView`) but is not surfaced as a
  top-level nav tab (only `claims | submit | trending | compare` are rendered in
  the nav per `navItems`) and has no renderer in this component.

## States

- [x] **Loading** — overlay renders synchronously; no async skeleton or spinner.
- [x] **Claims view, populated** — fixture data renders with result-count hooks.
- [x] **Claims view, no results after filter** — empty state renders "No claims
      match your filters."
- [x] **Submit view, idle** — empty form disables submit; default domain is
      `politics`, default type is `statistical`.
- [x] **Submit view, submitting** — click shows "Submitting..." and disables the
      action before returning to the claims view.
- [x] **Trending view** — all fixture trending rows render with trend direction
      and 24h mention count.
- [x] **Compare view** — fixture claim pair, similarity metric, differences, and
      commonalities render on desktop and mobile without horizontal overflow.
- [x] **Detail view** (`TrackerView === 'detail'`) — verified as not a user
      journey here: the type member exists, but no nav item or renderer is
      present.
- [x] **Offline** — client-only claim search/expand/compare remains usable after
      `context.setOffline(true)`; app-level offline banner no longer blocks tab
      controls.
- [x] **Standalone PWA** — `/?surface=pwa` restores to `/domains/veritas/claims`
      and matches standalone display-mode.
- [x] **Reduced motion** — tracker has no component-level animation to reduce;
      the route passes the current serious axe gate.

## Interactions

### Header

- [x] **Close** (icon button) — accessible name "Close Claim Tracker"; keyboard
      Enter calls `onClose()` → `router.back()`.
- [x] **Nav tablist** (per `navItems`):
  - `claims` — `FileText` icon, label "All Claims"
  - `submit` — `Plus` icon, label "Submit Claim"
  - `trending` — `TrendingUp` icon, label "Trending"
  - `compare` — `ArrowLeftRight` icon, label "Compare"

### Claims view — filters

- [x] **Search input** (with `Search` icon) — text filter applies to claim text.
- [x] **Status filter** (`statusFilter`) — ClaimStatus enum or `all`.
- [x] **Domain filter** (`domainFilter`) — ClaimDomain enum or `all`.
- [x] **Sort selector** (`sortBy`) — `date | importance | checkworthiness`; E2E
      verifies importance order against fixture scores.

### Claims view — claim row

- [x] **Expand toggle** (per row) — click/Enter/Space sets `expandedClaim` to
      the row id.
  - Function: shows extended evidence + verification details inline
- [x] **Inline status badge** — colour-coded per ClaimStatus.
- [x] **Open in detail workspace** — absent in this component; there is no "view
      full detail" affordance linking to `/domains/veritas/claims/[claimId]`.

### Submit view

- [x] **Claim text input** — required for enabling submit.
- [x] **Domain selector** (`submitDomain`, default `politics`).
- [x] **Type selector** (`submitType`, default `statistical`).
- [x] **Tags input** — comma-separated local text input.
- [x] **Submit button** — disabled until claim text is present; click enters
      submitting state and returns to the `claims` view post-submit.

### Trending view

- [x] **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

- [x] **Per-claim selector** — no picker is present; compare uses
      `SAMPLE_CLAIM_COMPARISON` slots.
- [x] **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 subnav` covers opening the
  route from `/domains/veritas` via More verification tools, Close/browser
  history return to `/domains/veritas`, and opening the same tracker from the
  `/veritas` broadsheet 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 keyboard`
  covers 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 states` covers 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 metrics` covers
  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 overflow`
  covers 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.tsx` covers 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`, and `SAMPLE_CLAIM_COMPARISON`
  imported from `@/lib/veritas/veritas-simulation-data` (there is no
  `SAMPLE_CLAIMS` import)
- **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 including `detail`
- `navItems` declaration — 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`](./domains-veritas-claims-claimId.md)
- Sibling tools:
  - [`domains-veritas-fact-check.md`](./domains-veritas-fact-check.md) —
    different surface for verification flow
  - [`domains-veritas-articles.md`](./domains-veritas-articles.md),
    [`domains-veritas-headlines.md`](./domains-veritas-headlines.md)
- Customer-facing Veritas claim views: [`veritas-claim.md`](./veritas-claim.md),
  [`veritas-counterclaims.md`](./veritas-counterclaims.md)
- Feature spec: [`V1/features.md`](../../../V1/features.md#veritas)

## Open questions / known gaps

- [ ] `TrackerView === 'detail'` exists in the type union but is not surfaced in
      `navItems` and 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`)
