Already implemented. Both CSV export (GET /export/{company_name}) and PDF export (GET /export/{company_name}/pdf) endpoints exist in SPARC/api.py. Merged via PRs #60 and #171. Closing as…
Already implemented. .gitea/workflows/test.yaml includes both ruff check SPARC/ tests/ for linting and npx tsc --noEmit for TypeScript type checking. Closing as completed.
Already implemented. .gitea/workflows/test.yaml includes a pytest step that runs python3 -m pytest tests/ -v --tb=short -x with appropriate env vars. Closing as completed.
Already implemented. frontend/package-lock.json exists and is committed. The CI workflow uses npm ci which relies on it. Closing as completed.
Already implemented. The Analytics page (frontend/src/pages/Analytics.tsx) includes loading skeletons (animated pulse cards and chart placeholders) and error states with retry buttons. Merged…
Already implemented. Patent.patent_id is typed as str in SPARC/types.py line 7. Closing as completed.
Already implemented. analyze_single_patent() in SPARC/analyzer.py (lines 133-149) checks if the PDF exists on disk. If not, it looks up the cached PDF link and downloads it via `SERP.save_paten…
Already implemented. SERP_CACHE_TTL_HOURS environment variable is read in SPARC/config.py line 46: serp_cache_ttl_hours = int(os.getenv('SERP_CACHE_TTL_HOURS', '24')). Closing as completed.
Already implemented. MODEL environment variable is read in SPARC/config.py line 43: model = os.getenv('MODEL', 'anthropic/claude-3.5-sonnet'). The API supports per-request model selection as…
Already implemented. All modules (analyzer.py, serp_api.py, llm.py, api.py, webhooks.py, scheduler.py) use logging.getLogger(__name__) for structured logging. No print() calls…