V1 Web PWA · Surface walkthrough

Claim Tracker · Veritas

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

walked
9sections6 minread

On this page

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/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#

  • 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 is statistical.
  • 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=pwa restores to /domains/veritas/claims and matches standalone display-mode.
  • Reduced motion — tracker has no component-level animation to reduce; the route passes the current serious axe gate.

Interactions#

  • Close (icon button) — accessible name "Close Claim Tracker"; keyboard Enter calls onClose()router.back().
  • Nav tablist (per navItems):
    • claimsFileText icon, label "All Claims"
    • submitPlus icon, label "Submit Claim"
    • trendingTrendingUp icon, label "Trending"
    • compareArrowLeftRight icon, label "Compare"

Claims view — filters#

  • Search input (with Search icon) — text filter applies to claim text.
  • Status filter (statusFilter) — ClaimStatus enum or all.
  • Domain filter (domainFilter) — ClaimDomain enum or all.
  • 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 expandedClaim to 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, default politics).
  • Type selector (submitType, default statistical).
  • Tags input — comma-separated local text input.
  • Submit button — disabled until claim text is present; click enters submitting state and returns to the claims view post-submit.
  • 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_COMPARISON slots.
  • Comparison display — responsive side-by-side/stacked analysis with metrics, differences, and commonalities.

Current E2E evidence#

  • apps/oshun/web/e2e/veritas-claim-tracker.spec.tsopens 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.tsrenders 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.tssubmits 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.tsrenders 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.tskeeps 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#

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)