5bc542e92f
When a monitor subscriber disconnects mid-frame (the client portal closes its stream on every tab switch via the Page Visibility guard), the loop could pull a queued payload during the 1s wait and then send_json into an already-closing socket -> "Unexpected ASGI message 'websocket.send' after ... websocket.close", logged as a WARNING on every disconnect. Re-check gone.done() after the queue wait and break before sending; treat the residual send-after-close as expected (debug, not warning). No behavior change — the connection was already closing as intended; this just stops the log spam. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>