| """Report generator (KM-644). | |
| A button-triggered *service* — not a chat skill, not a slow-path agent. It turns a | |
| session's persisted `AnalysisRecord`s + Problem Statement into a versioned, | |
| business-readable `AnalysisReport`. Architecturally it mirrors the Assembler: one | |
| constrained LLM call (the executive summary) wrapped in deterministic assembly that | |
| copies every other field verbatim from the records (INV-4). Reports are immutable | |
| per version and persisted to the `analysis_reports` table. | |
| """ | |