feat(data): Data screen per-row tabs, Results nodes, the Indicators move and Reprocess#1470

merged8
main
data/1150-tabs-results
openedSep 15, 2026byMMatt Donovan
View on GitHubTwo-way sync enabledPR last imported 9d ago

Closes #1150

Summary

The Data screen's per-row strip gains Extracted Text (the .txt sidecar, highlighted live from the selected Keyword Hit), Headers & TLS (from Capture.headers and tlsCertChain, labelled corroboration-only) and Manifest Ledger (the entries naming the Exhibit), each absent rather than empty when the row's kind has no data, and the Results nodes get their content: Keyword Hits with one child per Selector that filters the table to matched Exhibits with no snippet (X39), Integrity Exceptions with the three X37 buckets over Exhibits and Derived Files plus a sequential Verify all with progress, and the Manifest Ledger view with every entry typed, the chain verdict and the signer fingerprints read from manifest:snapshot and never computed in the renderer (X36, X25). Indicators keeps the IOC browser with Reprocess in its header (Q12). The MHTML Parts tab is omitted by maintainer decision on 2026-09-14; #991 owns it. Stacked on #1468 (#1149); the verification block below scores the whole stack against main.

Changes

  • src/renderer/components/data/ledgerModel.ts: rows, naming, verdict and signer wording as pure functions of the snapshot
  • src/renderer/components/data/ExtractedTextTab.tsx, HeadersTlsTab.tsx, ManifestLedger.tsx, IntegrityStrip.tsx: the tabs, the ledger view, the buckets strip
  • src/renderer/components/data/dataTreeModel.ts, dataTableModel.ts: Keyword Hits children, keyword filtering, bucketForRow and integrityCounts over persisted and session verify results
  • src/renderer/components/dashboard/cases/DataExplorer.tsx: tabs per kind, Results views, Verify all wiring
  • src/renderer/lib/api/exhibits.ts, selectors.ts: useVerifyAll, selectorMatchingCapturesQueryOptions
  • src/shared/types.ts: ExhibitVerification.derived and DerivedFileVerification, byte-identical to #1469 so the stack merges clean
  • tests/components/DataExplorerResults.test.tsx (new), tests/renderer/components/ledgerModel.test.ts (new), model and screen test updates
  • docs/agents/architecture.md: component list

Evidence-affecting

Yes

Evidence impact

  • Evidentiary result or interpretation that could change: the screen now renders verification buckets, the chain verdict, signer fingerprints and per-entry hashes. An Exhibit's bucket comes from this session's exhibits:verify result when there is one and from the Capture's persisted state otherwise; a Derived File's comes only from its own outcome in the parent's session result, which the main process computed against the derivation entry, and without one it is unverified, with nothing inferred from the parent in the renderer (X36). A verify that throws is recorded as not completed and the row reads unverified for the session rather than its stale persisted state. legacy and verifier-too-old are filed as unverified, never as exceptions. "Chain intact through seq N" is shown only when the verdict says so, and a row's Manifest Ledger tab exists only when an entry this build can read names it.
  • What verification proves and does not prove after this change: nothing about verification itself changes; Verify all is exhibits:verify per Exhibit in sequence. Session results for non-Capture Exhibits are not persisted and read as unverified on the next open. The derived list this screen reads is produced by #1469; on this branch alone every verify result has none and Derived Files read unverified.
  • Backward verification preserved (existing evidence packages still verify): yes; no main-process code changes.
  • Known-answer test added or extended, or why none applies: ledgerModel.test.ts pins the target wording of all nine entry types plus an unreadable line, the naming rule, the four verdict outcomes including too-old, and the signer wording; dataTableModel.test.ts pins the bucket rules including no inference for a Derived File; DataExplorerResults.test.tsx pins tab absence per kind (zero-byte text, unreadable-only ledger), the keyword filter with no snippet, that the second verify is not requested until the first resolves and the progress counter reads 0 / 2 while it waits, that a verify which throws re-buckets as unverified, and the too-old verdict rendered as its own outcome.

Verification

pnpm preflight at 0a239446a0e6ce061f316efbf0588cd4b9234e23 on Node v20.20.2; diff scored against origin/main (merge base c1ab6fb16). Result: pass.

  • pnpm lint - pass (exit 0)
  • pnpm lint:boundaries - pass (exit 0)
  • pnpm lint:agents-md - pass (exit 0) - CLAUDE.md and AGENTS.md match
  • pnpm typecheck - pass (exit 0)
  • pnpm build - pass (exit 0)
  • pnpm build:extension - skipped - no extension/ changes
  • pnpm test:coverage - pass (exit 0) - 4173 passed, 10 skipped (4183), thresholds met
  • pnpm coverage:diff - pass (exit 0) - 98.35% of 486 changed lines covered (floor 90%); 1 changed source file not instrumented

Pull request description generated by Claude Code

Checks

12 successful · 2 skipped
All checks passed
54a60bc

Added 5 commits

  • docs(plans): working notes for the four open Data screen tickets02228f8
  • test(data): cover node titles, toggles, search clear, staging actions0486f8d
  • fix(diagnostics): admit the exhibits and manifest query domains483ed3e
  • feat(data): rebuild the Data screen shell over the exhibit inventoryd721167
  • feat(data): per-row tabs, Results nodes and verify-all on Data screend97c436
Synced from GitHub

Warning

Review limit reached

Next included review available in 14 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. You're only billed for reviews past your plan's rate limits ($0.25/file).

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Free

Run ID: 78484648-973b-424f-bcda-3795fa5b8409

📥 Commits

Reviewing files that changed from the base of the PR and between c595ef76db1b31a78a0dc81867fbfef0c571a340 and 54a60bcca2fa01501433158d160296c3bdb03d4d.

📒 Files selected for processing (17)
  • docs/agents/architecture.md
  • src/renderer/components/dashboard/cases/DataExplorer.tsx
  • src/renderer/components/data/ExtractedTextTab.tsx
  • src/renderer/components/data/HeadersTlsTab.tsx
  • src/renderer/components/data/IntegrityStrip.tsx
  • src/renderer/components/data/ManifestLedger.tsx
  • src/renderer/components/data/dataTableModel.ts
  • src/renderer/components/data/dataTreeModel.ts
  • src/renderer/components/data/ledgerModel.ts
  • src/renderer/lib/api/exhibits.ts
  • src/renderer/lib/api/selectors.ts
  • src/shared/types.ts
  • tests/components/DataExplorer.test.tsx
  • tests/components/DataExplorerResults.test.tsx
  • tests/renderer/components/dataTableModel.test.ts
  • tests/renderer/components/dataTreeModel.test.ts
  • tests/renderer/components/ledgerModel.test.ts

Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Essentials by visiting https://app.coderabbit.ai/settings/billing.

Comment @coderabbitai help to get the list of available commands.

Added 3 commits

  • fix(data): anchored-only Views counts, no derived-file inferencef5ac387
  • Merge branch 'data/1149-shell' into data/1150-tabs-results0a23944
  • Merge branch 'main' into data/1150-tabs-results54a60bc

Reviewer pre-pass (54a60bcc): request changes

#severityfile:linefinding
1blockingPR body, Evidence impact (KAT bullet)Claims DataExplorerResults.test.tsx pins that "the progress counter advances between" verifies, but tests/components/DataExplorerResults.test.tsx:271-275 asserts only 0 / 2 before the first verify resolves and never reads the counter after it.
2advisorysrc/renderer/components/dashboard/cases/DataExplorer.tsx:269The per-row Manifest Ledger tab's hint reads ${snapshot.entries.length} entries (the whole ledger) while the tab lists only the entries naming the row (rowsNaming at :263), so an operator reads "12 entries" over a three-row tab.
3advisorysrc/renderer/components/data/ledgerModel.ts:104entryNames returns false for export, archive-export and import, so a selection-scoped export whose captureIds lists the Exhibit is absent from its tab although the body calls the tab "the entries naming the Exhibit".
4advisoryPR body, VerificationThe block is from 0a239446 over the pre-#1468 main (486 lines, 98.35%); at 54a60bcc against c595ef76 this PR's own diff is 179 lines at 96.65% (pnpm coverage:diff, exit 0), still above the 90% floor.
5advisorysrc/shared/types.ts:1191-1212Advisory-tier hit: ExhibitVerification.derived and DerivedFileVerification are types only (no main-process producer on this branch; identical to the #1469 branch) and the two collapsed unions are Prettier's output for main's file; no evidence behaviour reached.

Full report: /tmp/bb-review-1470-out/report.md

Body fixed on the same head: the Evidence impact KAT sentence now says the progress counter reads 0 / 2 while the first verify is pending, which is what tests/components/DataExplorerResults.test.tsx:271 asserts. Re-derived against the source in this session; no executable change, so the code verdict at 54a60bcc carries forward (ADR-0025).