This issue has already been resolved in the current codebase.
The Analytics page has full skeleton loaders (animated pulse cards and chart placeholders) and a detailed error state with retry…
This issue has already been resolved in the current codebase.
types.py line 7 declares patent_id: str in the Patent dataclass. The type annotation matches the actual usage throughout the…
This issue has already been resolved in the current codebase.
analyzer.py analyze_single_patent() (lines 131-147) checks if the PDF exists on disk. If not, it looks up the cached PDF link via…
This issue has already been resolved in the current codebase.
config.py line 46 reads the TTL from environment: serp_cache_ttl_hours = int(os.getenv("SERP_CACHE_TTL_HOURS", "24")). The…
This issue has already been resolved in the current codebase.
config.py line 43 reads MODEL from the environment: model = os.getenv("MODEL", "anthropic/claude-3.5-sonnet"). llm.py uses…
This issue has already been resolved in the current codebase.
All three modules (analyzer.py, serp_api.py, llm.py) use logging.getLogger(__name__) with a centralized `logging.basicConfig()…
This issue has already been resolved in the current codebase.
tests/test_auth.py contains comprehensive JWT authentication tests covering registration, login, protected routes, token refresh,…
This issue has already been resolved in the current codebase.
api.py uses slowapi with @limiter.limit("5/minute") on the login endpoint and @limiter.limit("10/minute") on the register…
This issue has already been resolved in the current codebase.
database.py has a jobs table with create_job(), update_job(), get_job(), list_jobs(), and mark_stale_jobs_failed()…
This issue has already been resolved in the current codebase.
auth.py uses a module-level _db_client singleton initialized via init_db_client() at startup. get_db_client() returns the…