Closing: already implemented on main. types.py declares patent_id: str (line 7).
Closing: already implemented on main. analyzer.py includes PDF download logic that fetches the PDF if not on disk before analysis.
Closing: already implemented on main. docker-compose.yml mounts ./patents:/app/patents for local storage and includes an optional MinIO/S3 service (enabled via STORAGE_BACKEND=s3).…
Closing: already implemented on main. config.py reads SERP_CACHE_TTL_HOURS env var with default of 24 hours.
Closing: already implemented on main. config.py reads MODEL env var with default anthropic/claude-3.5-sonnet. Frontend includes a model picker on Analysis and Batch pages.
Closing: already implemented on main. All print() calls in analyzer.py, serp_api.py, and llm.py have been replaced with structured logging. config.py configures LOG_LEVEL with…
Closing: already implemented on main. tests/test_auth.py (302 lines) covers registration, duplicate registration, login success/failure, protected routes, token refresh, and admin-only endpoints…
Closing: already implemented on main. slowapi is integrated in api.py with rate limiting on auth endpoints. test_rate_limit.py provides test coverage.
Closing: already implemented on main. A jobs table exists in the PostgreSQL schema (created in database.py). The API persists job state transitions to the DB, and mark_stale_jobs_failed()…
Closing: already implemented on main. auth.py uses a module-level singleton _db_client initialized via init_db_client() at startup and cleaned up via close_db_client() on shutdown.…