This issue has been resolved. config.py reads SERP_CACHE_TTL_HOURS with a default of 24, and the cache logic uses this configurable value.
This issue has been resolved. types.py already has patent_id typed as str.
This issue has been resolved. build.yaml runs both ruff check and tsc --noEmit in the test job, gating the build.
This issue has been resolved. analyzer.py now auto-downloads patent PDFs when not on disk, using cached metadata links, and raises a descriptive FileNotFoundError when neither the file nor a…
This issue has been resolved. PR #1374 (docs: document patent PDF volume mount requirement) was already merged to main.
This issue has been resolved. frontend/package-lock.json exists and CI uses npm ci for reproducible builds.
This issue has been resolved. Both Batch.tsx and Analytics.tsx have skeleton loaders (animate-pulse) and error states with retry buttons implemented.
This issue has been resolved. The startup check in auth.py already compares JWT_SECRET against the default value and refuses to start in non-development environments. Verified in the current codebase.