Resolved in codebase. .gitea/workflows/test.yaml runs ruff check SPARC/ tests/ and npx tsc --noEmit. The build.yaml workflow also includes these checks in its test job. Closing as implemented.
Resolved in codebase. .gitea/workflows/test.yaml and build.yaml both include a pytest step that runs python3 -m pytest tests/ -v --tb=short -x with proper env vars. The test job gates the build…
Resolved in codebase. frontend/package-lock.json exists in the repository. CI uses npm ci which requires a lockfile. Closing as implemented.
Resolved in codebase. frontend/src/pages/Batch.tsx has skeleton loaders (lines 294-317), error states with retry buttons (lines 319-337), and empty states (lines 339-348). Analytics.tsx has…
Resolved in codebase. SPARC/types.py line 7: patent_id is typed as str in the Patent dataclass. Closing as implemented.
Resolved in codebase. SPARC/analyzer.py analyze_single_patent() (lines 109-164) now checks if the PDF exists on disk, and if not, looks up the PDF link from the database cache and downloads it…
Resolved in codebase. SPARC/config.py line 46: serp_cache_ttl_hours = int(os.getenv('SERP_CACHE_TTL_HOURS', '24')). Used in analyzer.py for SERP query caching. Closing as implemented.
Resolved in codebase. SPARC/config.py line 43: model = os.getenv('MODEL', 'anthropic/claude-3.5-sonnet'). Used in SPARC/llm.py and throughout the API. Closing as implemented.
Resolved in codebase. All print() calls have been replaced with logging. SPARC/config.py configures logging.basicConfig() with LOG_LEVEL env var. analyzer.py, serp_api.py, and llm.py all use…
Resolved in codebase. tests/test_auth.py contains comprehensive tests: TestRegister (3 tests), TestLogin (2 tests), TestGetMe (4 tests including expired/refresh token rejection), TestRefreshToken…