[Repo Manager] Already resolved. frontend/src/pages/Compare.tsx implements side-by-side comparison view.
Closing as already implemented in the codebase.
[Repo Manager] Already resolved. /export endpoints for CSV and PDF (with ReportLab) exist in api.py.
Closing as already implemented in the codebase.
[Repo Manager] Already resolved. .gitea/workflows/test.yaml runs ruff check and tsc --noEmit.
Closing as already implemented in the codebase.
[Repo Manager] Already resolved. .gitea/workflows/test.yaml runs pytest as a CI step.
Closing as already implemented in the codebase.
[Repo Manager] Already resolved. frontend/package-lock.json exists in the repository.
Closing as already implemented in the codebase.
[Repo Manager] Already resolved. Both Batch.tsx and Analytics.tsx have skeleton loaders and error states with AlertCircle icons.
Closing as already implemented in the codebase.
[Repo Manager] Already resolved. Patent.patent_id typed as str in types.py.
Closing as already implemented in the codebase.
[Repo Manager] Already resolved. analyze_single_patent downloads PDF from cached link if not on disk. Raises FileNotFoundError if no link cached.
Closing as already implemented in the codebase.
[Repo Manager] Already resolved. docker-compose.yml has patents volume mount. .env.example documents STORAGE_BACKEND with S3 option.
Closing as already implemented in the codebase.
[Repo Manager] Already resolved. SERP_CACHE_TTL_HOURS env var in config.py, used in analyzer.py SERP cache logic.
Closing as already implemented in the codebase.