Verified complete: frontend/src/pages/Compare.tsx implements a side-by-side comparison view for two company patent portfolios. Closing as implemented.
Verified complete: /export/{company_name} (CSV) and /export/{company_name}/pdf (PDF) endpoints exist in api.py. Uses reportlab for PDF generation. Closing as implemented.
Verified complete: CI workflows run ruff check SPARC/ tests/ for Python linting and npx tsc --noEmit for TypeScript type checking. Closing as implemented.
Verified complete: Both test.yaml and build.yaml CI workflows include a pytest stage that runs python3 -m pytest tests/ -v --tb=short -x and gates the build jobs. Closing as implemented.
Verified complete: frontend/package-lock.json is committed to the repository for reproducible builds. CI uses npm ci. Closing as implemented.
Verified complete: tailwind.config.js has darkMode: 'class'. ThemeContext.tsx provides theme toggle. Layout.tsx and page components use dark: Tailwind variants. Closing as implemented.
Triage: Blocked (P3)
Blocked on CI pipeline (#95 -> #76). Cannot push images to registry or verify deployment until runners are available. Deferring.
Verified complete: Batch.tsx and Analytics.tsx contain loading skeleton components and error state handling. Closing as implemented.
Verified complete: Patent.patent_id in types.py is annotated as str (line 7). Closing as implemented.
Triage: Blocked (P3)
Requires physical iPhone Safari testing. Cannot be validated by agents. Deferring until deployment is operational.
Verified complete: analyze_single_patent() in analyzer.py checks if PDF exists on disk, and if not, looks up the cached PDF link from the database and downloads it automatically before…