perf(citation-verification): cache view + parallelize backend retrieval
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 4s
Lint — undefined names / undefined-names (pull_request) Successful in 10s

The "אימות פסיקה" tab reloaded its data on every tab revisit and the first
load took 1.5–3s. Two independent causes, two fixes:

Frontend (web-ui/src/lib/api/citation-verification.ts):
- staleTime 10s → 5min and refetchOnMount: false. Radix Tabs unmounts inactive
  TabsContent, so switching back used to trigger a full rebuild once the 10s
  window elapsed. Verify mutations still invalidate the query, so edits pull
  fresh data.

Backend (mcp-server/.../case_citation_verification.py):
- The per-argument loop ran a Voyage embed + vector search + batched authority
  query sequentially (N args × ~300ms waterfall). Extracted to _fetch() and
  fanned out with asyncio.gather — order preserved, n_verified counter and
  per-argument seen-sets unchanged. First load ~5× faster on multi-argument cases.

Pure read/assembly — no new parallel path (G2), no silent error swallowing
(search/radar still log warnings). Invariants: INV-DIG1/INV-AH unaffected
(still read-only, never cites).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-30 17:35:52 +00:00
parent b2d673fdb0
commit 88ca96bf19
2 changed files with 27 additions and 8 deletions

View File

@@ -84,7 +84,13 @@ export function useCitationVerification(caseNumber: string | undefined) {
{ signal },
),
enabled: Boolean(caseNumber),
staleTime: 10_000,
// The view is an expensive synthesized build (per-argument Voyage embed +
// vector search on the backend). Keep it fresh for 5 min and do NOT refetch
// on remount — Radix Tabs unmounts inactive TabsContent, so every tab switch
// back used to trigger a full rebuild. Verify mutations invalidate the query,
// so edits still pull fresh data.
staleTime: 5 * 60_000,
refetchOnMount: false,
});
}