fix(alerts): reset rule state + close open event on rule edit/delete
invalidate() only dropped the rule cache, not the per-(unit,rule) state machine — so editing a rule's metric/threshold left a stale 'active' phase that mis-evaluated against the new config (spurious clear, or suppressed onset), and deleting an in-alarm rule left an open AlertEvent that kept the client portal stuck "in alarm" forever. update/delete now call _reset_rule_runtime: forget_rule() drops the state machine and any open event for that rule is closed. Verified: existing evaluator tests + cooldown scenario still pass; compiles. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -175,6 +175,12 @@ class AlertEvaluator:
|
||||
else:
|
||||
self._rule_cache.pop(unit_id, None)
|
||||
|
||||
def forget_rule(self, unit_id: str, rule_id: int) -> None:
|
||||
"""Drop a rule's per-(unit, rule) state machine after the rule is edited or
|
||||
deleted, so a stale 'active' phase / open event_id from the old config
|
||||
doesn't bleed into the new one (mis-firing a clear or suppressing an onset)."""
|
||||
self._states.pop((unit_id, rule_id), None)
|
||||
|
||||
# -- scheduling ----------------------------------------------------------
|
||||
|
||||
def _in_schedule(self, rule) -> bool:
|
||||
|
||||
Reference in New Issue
Block a user