Already resolved. PR #352 (merged commit 595516e) added loading skeletons, error states, and empty states to the Batch page. The Analytics page also has loading/error handling. Closing.
Already resolved. types.py line 7: patent_id: str. The type annotation is correctly str, not int. Closing.
Already resolved. analyzer.py::analyze_single_patent (lines 109-149) checks if PDF exists on disk, attempts auto-download from cached DB link, and raises descriptive FileNotFoundError if…
Already resolved. config.py line 46: serp_cache_ttl_hours = int(os.getenv("SERP_CACHE_TTL_HOURS", "24")). Used in analyzer.py line 73: ttl_hours=config.serp_cache_ttl_hours. Documented in…
Already resolved. config.py line 43: model = os.getenv("MODEL", "anthropic/claude-3.5-sonnet"). llm.py reads self.model = config.model. Documented in .env.example. Closing.
Already resolved. All three modules use logging.getLogger(__name__): analyzer.py (line 14), serp_api.py (line 15), llm.py (line 11). No print() calls remain. config.py configures log…
Already resolved. Comprehensive JWT auth tests exist in tests/test_auth.py covering: registration (first user admin, duplicate email), login (valid/invalid creds), protected route access…
Already resolved. slowapi is integrated in api.py. Login has @limiter.limit("10/minute") (line 274), register has @limiter.limit("5/minute") (line 241). 429 handler returns Retry-After…
Already resolved. The jobs table exists in database.py schema (line 176-188). Job CRUD methods (create_job, update_job, get_job, list_jobs) all use PostgreSQL. The _jobs in-memory…
Already resolved. auth.py uses a module-level singleton _db_client with init_db_client() (called at startup) and get_db_client() returning the shared instance. DatabaseClient uses…