"""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. """