[Triage] Already implemented in main. analyzer.py (lines ~113-146) implements auto-download logic for patent PDFs when not found on disk. Closing as resolved.
[Triage] Already implemented in main. config.py line 46: serp_cache_ttl_hours = int(os.getenv('SERP_CACHE_TTL_HOURS', '24')). Closing as resolved.
[Triage] Already implemented in main. frontend/package-lock.json exists (165KB) and CI uses npm ci. Closing as resolved.
[Triage] Already implemented in main. types.py line 7: patent_id: str (already typed as str). Closing as resolved.
[Triage] Already implemented in main. database.py has a jobs table with create_job/update_job/get_job/list_jobs methods. api.py persists all job state to PostgreSQL via these methods. Closing as…
[Triage] Already implemented in main. api.py imports slowapi, configures a Limiter with get_remote_address, and has a rate_limit_handler. tests/test_rate_limit.py provides test coverage. Closing…
[Triage] Already implemented in main. auth.py (lines 24-32) has a startup check that refuses to start with the default JWT secret when APP_ENV is not 'development'. Closing as resolved.
[Triage] Already implemented in main. config.py (lines 63-70) reads CORS_ORIGINS from environment variable, defaulting to localhost origins when unset. Closing as resolved.
[Triage] Already implemented in main. docker-compose.yml uses ${POSTGRES_USER}, ${POSTGRES_PASSWORD}, ${POSTGRES_DB} env var substitution -- no plaintext credentials. Closing as resolved.
[Triage] Already implemented in main. SPARC/scheduler.py implements scheduled/recurring analysis with APScheduler. Closing as resolved.