From bf9afcbc84e17220c9fc40922491fe6f4aa5edb5 Mon Sep 17 00:00:00 2001 From: christian Date: Wed, 21 Oct 2026 15:18:43 -0400 Subject: [PATCH] Operator mode clears the flapping history of the links it takes out Co-Authored-By: Claude Opus 5.5 --- status_panel.py | 3 +++ tests/test_status_panel.py | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/status_panel.py b/status_panel.py index debfa30..7450d7b 100644 --- a/status_panel.py +++ b/status_panel.py @@ -1397,6 +1397,7 @@ class Engine: service_on = self.service.on(now) raw = self.evaluate(snap, now, service_on) deb = self.debounce if debounce is None else debounce + bypassed = self.bypass_names()[0] for key, (tile_id, res, chk) in raw.items(): tr = self.trackers.setdefault(key, Tracker()) was_acked = tr.acked @@ -1404,6 +1405,8 @@ class Engine: event = tr.update(res, now, 0 if chk["type"] == "network" else chk.get("debounce_seconds", 1 if chk["type"] == "midi_peer" else deb), self.flap_window) + if chk["type"] == "midi_peer" and (chk.get("peer") in bypassed or chk.get("session") in bypassed): + tr.starts.clear() # taken out by the operator key: its earlier drops are not flapping if event == "fault": self.events.append(("FAULT", "%s %s" % (self.tiles[tile_id]["label"], res.msg))) ident = self.identity_key(key) if key in self.meta else None diff --git a/tests/test_status_panel.py b/tests/test_status_panel.py index 6936155..2ef43e9 100644 --- a/tests/test_status_panel.py +++ b/tests/test_status_panel.py @@ -2555,6 +2555,12 @@ class TestSwitches(unittest.TestCase): self.assertEqual(tiles["lights"]["x"], "LIGHTS\nTAKING\nMIDI OUT") tiles = self.engine.step(self.snap, SUNDAY + 120) self.assertEqual(tiles["lights"]["x"], "LIGHTS\nOPERATOR\nMIDI OFF") + tr = next(t for k, t in self.engine.trackers.items() if self.engine.meta.get(k, (None, {}))[1] is self.midi + or (self.engine.meta.get(k, (None, {}))[1].get("peer") == self.midi["peer"] + and self.engine.meta[k][1].get("session") == self.midi["session"])) + tr.starts.extend([SUNDAY + 1, SUNDAY + 2, SUNDAY + 3]) # it had dropped three times before + self.engine.step(self.snap, SUNDAY + 121) + self.assertEqual(len(tr.starts), 0) # not called flapping once taken out self.assertIn("lights", self.new_engine().bypass) # survives a restart calls.clear() self.engine.run_fixes("lights", self.snap, comp, SUNDAY + 130) # hold again: put back