mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-10-26 05:29:45 +00:00
045e7af651
## Why After #3093, the remaining weight of the alert history fold is evidence nothing reads. On the long-running dogfood install, a resolved snapshot averages 21 KB, and 83% of that is `evidence`: a trail of up to 64 envelopes (35 on average), across 1,895 occurrences kept for 90 days (#1803). Nothing in Pulse reads `Alert.evidence` from history. The incident panel's evidence comes from the incident timeline endpoint, the AI's alert history uses recently resolved alerts, and the attention summary and quality telemetry never touch it. ## What changed - The fold trims each decoded snapshot to its newest envelope, by `observedAt` and then position. An updated envelope keeps its slot, so the last one isn't always the newest. Merging takes the incoming snapshot's evidence, so the fold never holds a full trail. - History output applies the same rule to live overlays and the JSON fallback, so every `GET /api/alerts/history` entry carries at most one envelope. - `operationalRecord.evidenceIds` and `transitions[].evidenceIds` keep their full lists. The event log keeps every snapshot whole, and `GET /api/alerts/active` still returns an open alert's full evidence. - The api-contracts history clause, `docs/API.md` (and its shipped mirror) and the alerts contract say so. This is an intentional change to a public API response, approved by the maintainer. A client that read full evidence from history should read the active alert, the incident timeline or the event log. ## Measured On a log shaped like the dogfood install's (1,900 occurrences, 35 envelopes each), the history fold retains 2.1 MB of heap, down from 27.2 MB. ## Checks (pulse-dev) - New tests: - newest by time and tie-breaking; - the fold holds one envelope while the record keeps all 64 IDs; - the event log stays whole; - live overlay and JSON fallback; - direct output shaping, with its input untouched; - `docs/API.md` states the rule. - Negative controls: keeping full evidence in the fold, in the output, or choosing by position each fail their test. - `internal/alerts/...`, `internal/api/alerting/...` and `docsLinks.test.ts` pass. Prettier, vet, the completion, contract, docs-mirror and browser-verification guards all pass. Related to #1803