[Verification] All acceptance criteria met. Verified complete. Analysis request payloads accept optional model field. api.py validates against allow-list. Model is passed through to llm.py…
[Verification] All acceptance criteria met. Verified complete. SPARC/webhooks.py sends JSON POST to configured WEBHOOK_URLS on job completion and alerts. Supports Slack format. Retries up to 3…
[Verification] All acceptance criteria met. Verified complete. SPARC/scheduler.py uses APScheduler to periodically re-analyze tracked companies. run_scheduled_analysis() compares new vs. old…
[Verification] All acceptance criteria met. Verified complete. frontend/src/pages/Compare.tsx implements a side-by-side comparison view with two company inputs, loading skeletons, error states,…
[Verification] All acceptance criteria met. Verified complete. api.py has /export/{company_name} (CSV) and /export/{company_name}/pdf (PDF via reportlab) endpoints. Both are authenticated…
[Verification] All acceptance criteria met. Verified complete. The test job in build.yaml runs ruff check SPARC/ tests/ and npx tsc --noEmit. Both run before and gate the build jobs.…
[Verification] All acceptance criteria met. Verified complete. .gitea/workflows/build.yaml has a test job that runs pytest tests/ -v --tb=short -x. Both build-api and build-frontend jobs…
[Verification] All acceptance criteria met. Verified complete. frontend/package-lock.json exists and is committed. CI workflow uses npm ci (frozen lockfile install). Closing as implemented.
[Verification] All acceptance criteria met. Verified complete. tailwind.config.js has darkMode: 'class'. ThemeContext.tsx provides toggle with localStorage persistence. Layout.tsx has…
[Verification] All acceptance criteria met. Verified complete. Batch.tsx has loading skeletons for job history (lines 293-316), error states with retry buttons (lines 319-336), and empty states…