hub: F2 — alert on host already degraded/stale at (re)start (seed only healthy) v0.21.0
Constructors seed only healthy hosts; an already-degraded/stale host is left unseeded so the first Check() emits once (cooldown dedups on hub restart). Born-degraded red-proof + staleness test updated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pg8ANF97SEeKYSN5Jxw3qJ
This commit is contained in:
@@ -105,3 +105,28 @@ func TestHostCapabilityChecker_OldAgentNoCaps(t *testing.T) {
|
||||
t.Fatalf("old agent (no caps) state = %s, want ok", cc.GetState("h1"))
|
||||
}
|
||||
}
|
||||
|
||||
// F2 RED-PROOF: a host already DEGRADED at hub (re)start is left UNSEEDED by the constructor and the
|
||||
// FIRST Check emits once — so a box that was already broken when the hub restarted alerts (vs the
|
||||
// pre-fix path which seeded it silently and never alerted). Companion: pre-fix the constructor seeded
|
||||
// "degraded" and Check saw oldState==newState → no event.
|
||||
func TestHostCapabilityChecker_F2_BornDegradedAlerts(t *testing.T) {
|
||||
st := newCapStore(t)
|
||||
st.SaveHostReport("h1", "c1", reportWith(capCritDegraded), store.HostReportDenorm{})
|
||||
var events []string
|
||||
cc := NewHostCapabilityChecker(st, func(_, et, _, _, _, _ string) { events = append(events, et) }, log.New(io.Discard, "", 0))
|
||||
if len(events) != 0 {
|
||||
t.Fatalf("construction must not emit, got %v", events)
|
||||
}
|
||||
if cc.GetState("h1") != "unknown" {
|
||||
t.Fatalf("born-degraded must be left unseeded, GetState = %s want unknown", cc.GetState("h1"))
|
||||
}
|
||||
cc.Check()
|
||||
if len(events) != 1 || events[0] != "agent_capability_degraded" {
|
||||
t.Fatalf("born-degraded first Check → one agent_capability_degraded, got %v", events)
|
||||
}
|
||||
cc.Check() // steady degraded → no duplicate
|
||||
if len(events) != 1 {
|
||||
t.Fatalf("steady degraded must not re-emit, got %v", events)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user