hub: HostCapabilityChecker — operator alert on agent capability-degraded (v0.19.0)

Companion to felhom-agent v0.44.0. New monitor.HostCapabilityChecker (sibling of
HostStalenessChecker) reads the capabilities snapshot from the latest host report and emits
agent_capability_degraded/recovered (operator-only, 1h cooldown) on ok<->degraded transitions
for any Critical capability. store.GetHostCapabilities (MAX(id), no migration). Goldens mirror
the new capabilities field.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EPZ4GJ8L5Jqf8UiPwbn1kt
This commit is contained in:
2026-06-29 18:50:50 +02:00
parent c6bae9515a
commit b7b165bff5
6 changed files with 363 additions and 0 deletions
+24
View File
@@ -1,5 +1,29 @@
# Felhom Hub — Changelog
## v0.19.0 — Agent capability-degraded operator alert (HostCapabilityChecker) (2026-06-29)
Companion to felhom-agent v0.44.0's privileged-capability self-probe: the agent now rides a
`capabilities` snapshot on its host report (each required `sudo -n` grant: ok/degraded), and the hub
alerts the operator when a host transitions into a degraded state — closing the loop that let five
non-root-cutover regressions go undetected until user-visible breakage.
- **`monitor.HostCapabilityChecker` (NEW):** a deliberate SIBLING of `HostStalenessChecker` — same
per-host state map (`ok`/`degraded`), seed-without-event, emit-only-on-transition shape. A host is
`degraded` iff its latest report has any **Critical** capability with `status:"degraded"`;
non-critical degradations ride the report but never alert. Runs on the existing 60s sweep next to
the staleness checkers.
- **Events:** `agent_capability_degraded` (warning) on ok→degraded, naming the degraded capabilities
+ gated features in the message and details JSON; `agent_capability_recovered` (info) on
degraded→ok. Routed through the existing `Dispatcher.ProcessEvent`**operator-only** (the type
is not a customer notification toggle, same as `host_stale`) with the standard 1 h operator
cooldown (no per-cycle re-alert).
- **`store.GetHostCapabilities` (NEW):** reads the capability snapshot from the latest host-report's
`report_json` per host (keyed on `MAX(id)` — within-second `received_at` ties would otherwise
return multiple rows). **No schema migration** — the array rides the existing report body. A
pre-v0.44.0 agent (no `capabilities`) reads as `ok`, so an old agent can't trip a false alert.
- Cross-repo `host-report.golden.json` mirrors the new `capabilities: []` field (byte-identical with
the agent copy). Version `0.18.0 → 0.19.0`.
## v0.18.0 — App-email passthrough: POST /api/v1/mail → Resend SMTP (2026-06-29)
The hub can now relay a customer box's outbound app email to Resend, re-emitting the raw MIME