Pulse/pkg/reporting
rcourtman d4463a615c Add fleet-level AI narrative for multi-resource reports
The single-resource AI narrative landed in b2bd9d114 but multi-resource
fleet reports stayed heuristic-only. That left a gap on the exact axis
where AI helps most: a 50-resource fleet PDF is where synthesis is the
difference between useful and unread.

Introduce FleetNarrator as a separate interface from Narrator. The
input shapes are different — single-resource takes one set of metric
stats with a prior window, fleet takes a denormalised cross-resource
view with per-resource summaries plus a fleet aggregate.
HeuristicFleetNarrator owns the deterministic fallback: ranks
resources by severity (critical alerts > unhealthy disks > storage
pressure > memory > CPU > non-critical alerts), picks up to 5
outliers, derives cross-cutting patterns by counting how many of N
resources share a hot signal, and emits fleet-scoped recommendations.

internal/ai.Service implements FleetNarrator through
report_fleet_narrator.go. Distinct use-case label
(report_narrative_fleet) so fleet vs single-resource spend is
separable in the cost ledger and budget gate. The fleet payload is
denormalised through buildReportFleetPayload so prompt cost scales
linearly with fleet size. Same fail-closed invariant — nil provider,
parse failure, or context cancellation falls through to the heuristic.

Single-resource Narrator is intentionally NOT propagated through
engine.GenerateMulti: a 50-resource fleet report performs one AI call
(fleet narrator), not 51. The router resolver returns the AI service
for all three roles (Narrator, FleetNarrator, FindingsProvider).

The fleet PDF renders the FleetNarrative in the fleet summary cover
when present: executive prose, named outliers with severity-coloured
bullets, cross-cutting patterns, recommendations, optional period
comparison, and an AI provenance footer. The deterministic resource
summary table is preserved above so every named outlier is verifiable
against the table immediately below it. Legacy "Highest CPU / Most
alerts" bullets remain as the fallback when no FleetNarrative is
attached.
2026-05-10 21:23:12 +01:00
..
catalog.go Remove customer commercial analytics wrappers 2026-04-30 11:46:16 +01:00
catalog_test.go Remove customer commercial analytics wrappers 2026-04-30 11:46:16 +01:00
csv.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
csv_additional_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
engine.go Add fleet-level AI narrative for multi-resource reports 2026-05-10 21:23:12 +01:00
engine_additional2_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
engine_additional3_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
engine_additional_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
engine_integration_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
engine_narrative_test.go Replace heuristic report narrative with optional AI-generated layer 2026-05-10 19:30:54 +01:00
engine_test.go Add agentless availability targets 2026-05-06 10:35:34 +01:00
fleet_narrative.go Add fleet-level AI narrative for multi-resource reports 2026-05-10 21:23:12 +01:00
fleet_narrative_test.go Add fleet-level AI narrative for multi-resource reports 2026-05-10 21:23:12 +01:00
multi_report_visual_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
narrative.go Replace heuristic report narrative with optional AI-generated layer 2026-05-10 19:30:54 +01:00
narrative_test.go Replace heuristic report narrative with optional AI-generated layer 2026-05-10 19:30:54 +01:00
pdf.go Add fleet-level AI narrative for multi-resource reports 2026-05-10 21:23:12 +01:00
pdf_additional2_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
pdf_additional_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
pdf_insights_test.go Replace heuristic report narrative with optional AI-generated layer 2026-05-10 19:30:54 +01:00
reporting.go Add fleet-level AI narrative for multi-resource reports 2026-05-10 21:23:12 +01:00
reporting_test.go feat: add resource picker and multi-resource report generation 2026-02-04 10:24:23 +00:00
vm_inventory.go Canonicalize reporting fallback filename date style 2026-03-26 09:28:17 +00:00
vm_inventory_test.go Define VM inventory export schema contract 2026-03-25 22:09:37 +00:00