Pydantic was coercing V2 StrengthToProtect dicts to the partial
ReportStrengthResponse type, dropping fields like `percentage` and
`top_quotes`. Changed to list[Any] to pass through raw data.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Extended SynthesisResponse model to support both legacy (v1) and
new 6-section (v2) report formats
- V2 format includes executive_summary, risk_scorecard, critical_issues,
action_matrix, and tracking_kpis sections
- Frontend type guards use report_version and executive_summary fields
to detect format and render appropriate components
- Backwards compatible: legacy v1 responses still work unchanged
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Stage5Synthesizer class that generates AI narratives and action plans
- Add generate() method to LLMClient for synthesis generation
- Integrate Stage 5 into pipeline runner after route stage
- Add synthesis JSONB column to pipeline.executions table
- Update reviewiq_analytics API to return synthesis data
- Synthesis includes: executive narrative, sentiment/category/timeline insights,
action plan, marketing angles, and priority recommendations
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>