Resolved. Both Batch and Analytics pages have loading skeletons (animated pulse placeholders) and error states with retry buttons. Batch page shows skeleton cards while jobs load, and a styled…
Resolved. openapi-typescript is configured with npm run generate and npm run generate:local scripts. src/api/schema.d.ts is auto-generated and committed. CI checks for schema drift.
Resolved. /jobs endpoint accepts cursor and limit query parameters with cursor-based pagination. Responses include next_cursor (null on last page). Default limit 10, max 100.
Resolved. /export/{company_name} (CSV) and /export/{company_name}/pdf (PDF via reportlab) endpoints are implemented in api.py. Both are authenticated and return downloadable files.
Resolved. CI workflow runs ruff check SPARC/ tests/ and npx tsc --noEmit in the test job. Both checks gate the build.
Resolved. .gitea/workflows/build.yaml contains a test job that runs pytest tests/ -v before the build-api job (needs: test). Tests gate the image build.
Resolved. frontend/package-lock.json is committed. CI workflow uses npm ci for reproducible installs.
Resolved. analyze_single_patent in analyzer.py checks if the PDF exists on disk, and if not, attempts to download it from a cached link. Raises a descriptive FileNotFoundError if no link…
Resolved. Patent.patent_id is annotated as str in types.py (line 7). No type mismatch remains.
Resolved. config.py reads SERP_CACHE_TTL_HOURS env var with default 24. analyzer.py passes config.serp_cache_ttl_hours to db.store_serp_query(). No hardcoded TTL in serp_api.py.