Clear the Sud Load-rejection Error so it doesn't get replayed as stale
WsServerMultiUser.global_state persists every message ever broadcast
and replays the full accumulated state to any client that subscribes
- by design, so a client connecting fresh or reconnecting mid-run
always gets the same complete picture (see README's new "State replay
on connect" section). That mechanism has no concept of "transient":
the {'Sud': {'Error': ...}} added for Load-rejection got treated as
durable state just like everything else, so any client connecting
after the fact - even one that never touched Load - got the stale
error replayed on connect. Confirmed live before this fix.
tasks/sud.py: send {'Sud': {'Error': None}} immediately after the
error itself, clearing it back to neutral in global_state.
client/brewpi_gui.py: on_sud_changed() treats a falsy Error as a
no-op instead of popping an empty dialog.
README.md: documents the underlying principle (client state replay
on connect, and the corollary that one-shot events need explicit
clearing) under a new Architecture subsection, and refreshes the Sud
channel/forecast sections to match this session's other changes
(Elapsed-based dynamic forecast anchoring instead of wall-clock time
times the nominal warp factor, Load's Error reply).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LhiQe64F74uHV8jzuoSa5K
This commit is contained in:
@@ -202,7 +202,17 @@ class SudTask(ATask):
|
||||
# silently dropping the request. The client has no
|
||||
# business pre-emptively guessing this itself from its
|
||||
# own (replicated, laggy) view of the state.
|
||||
#
|
||||
# Immediately cleared back to None - unlike every other
|
||||
# field here, this is a one-shot event, not state. The
|
||||
# dispatcher has no concept of "don't persist this into
|
||||
# global_state" (see ws/user.py's update()), so without
|
||||
# clearing it, any client connecting later - even one
|
||||
# that never touched Load - would get this stale error
|
||||
# replayed on connect, with nothing it just did to
|
||||
# explain why.
|
||||
await self.send({'Error': 'Cannot load a new schedule while a run is in progress - stop it first.'})
|
||||
await self.send({'Error': None})
|
||||
|
||||
async def send(self, data):
|
||||
await self.msg_handler.send(data)
|
||||
|
||||
Reference in New Issue
Block a user