Parent
#6
What to build
The app already persists every successfully fetched CVE into the local store, but search and CVE detail fail outright when the upstream CIRCL API is down. Add graceful degradation: when an upstream call fails (timeout, 5xx, network error), the vulnerability API layer falls back to the local CVE store. Fallback responses carry a source marker (cache vs live) and the stored-at timestamp, and the search results and CVE detail surfaces render a visible cached-data indicator from that marker so analysts never mistake stale data for live data. Upstream 404s for unknown CVE identifiers are not masked by cache fallback — a genuinely unknown CVE still reads as not found.
Acceptance criteria
Blocked by
None - can start immediately
Parent
#6
What to build
The app already persists every successfully fetched CVE into the local store, but search and CVE detail fail outright when the upstream CIRCL API is down. Add graceful degradation: when an upstream call fails (timeout, 5xx, network error), the vulnerability API layer falls back to the local CVE store. Fallback responses carry a source marker (cache vs live) and the stored-at timestamp, and the search results and CVE detail surfaces render a visible cached-data indicator from that marker so analysts never mistake stale data for live data. Upstream 404s for unknown CVE identifiers are not masked by cache fallback — a genuinely unknown CVE still reads as not found.
Acceptance criteria
globalThis.fetchswapped to simulate outages and a temporary database via DATABASE_FILE;npm testgreenBlocked by
None - can start immediately