Reading events

GET /api/bng/events                                    read_only

Synthesises the live set, reconciles it against history, and returns the current
console.

{
  "events": [
    {
      "id": "sensor:FAN2",
      "kind": "sensor_status",
      "severity": "critical",
      "sensor": "FAN2",
      "value": 0.0,
      "unit": "RPM",
      "summary": "FAN2 reported lcr",
      "detail": "ipmitool flagged FAN2 as lcr (value 0.0 RPM).",
      "ts": 1753000000.0,
      "source": "ipmi",
      "link": "/bng/health",
      "link_label": "Health",
      "condition_state": "active",
      "first_seen_ts": 1752999000.0,
      "resolved_at": null
    }
  ],
  "count": 3,
  "active_count": 2,
  "recovered_count": 1
}

condition_state is active or recovered. severity is critical,
warning, or info. Acknowledged identifiers are filtered out entirely.

Sort order is deliberate: recovered entries first, then active, each group
ordered by first_seen_ts descending. Recovered entries lead because they are the
ones requiring an operator decision — an active fault is still visible on the
health endpoint, whereas a recovered one will vanish the moment it is
acknowledged and is the item at risk of being missed.

For a recovered entry the payload is rewritten: the summary is prefixed
"RESOLVED — " and the detail is replaced with the incident window and duration,
followed by a note that acknowledgement is awaited.

Recall that this call has write side effects, and that a single collector should
own it.