Problem
The v0.6.1 perf work made the FindingsTable responsive on 20k findings. The next ceiling is the API itself: GET /api/v1/scans/{id}/findings returns ALL findings in one JSON response. At 100k findings that's roughly 70 MB of JSON parsed by both the server and the browser.
Acceptance criteria
Suggested approach
DB: add a composite index (scan_id, severity_rank, fingerprint) for stable cursor pagination.
API: cursor = base64(last_seen_fingerprint).
Frontend: react-virtuoso or @tanstack/react-virtual for windowed rendering.
Difficulty
~2 days. Real architectural work; touches DB, API, frontend.
Problem
The v0.6.1 perf work made the FindingsTable responsive on 20k findings. The next ceiling is the API itself:
GET /api/v1/scans/{id}/findingsreturns ALL findings in one JSON response. At 100k findings that's roughly 70 MB of JSON parsed by both the server and the browser.Acceptance criteria
GET /api/v1/scans/{id}/findings?cursor=&limit=&severity=&status=&scanner=&q=.Suggested approach
DB: add a composite index
(scan_id, severity_rank, fingerprint)for stable cursor pagination.API: cursor = base64(last_seen_fingerprint).
Frontend: react-virtuoso or @tanstack/react-virtual for windowed rendering.
Difficulty
~2 days. Real architectural work; touches DB, API, frontend.