The exit-notify wrap reported every receive-loop exception at ERROR with a traceback, including the ConnectionClosedOK that follows our own CLOSE frame in disconnect(). Gate on the adapter's _running flag (published through the WS thread-local next to on_link_up): a live link's death stays ERROR, an intentional shutdown logs at DEBUG. Live pass side-effect #4 on #113662.