- Browser: OK button sends Confirm without closing dialog; Escape blocked; dialog closes when state leaves WAIT_USER (server-driven). - PyQt: non-blocking QDialog replaces blocking QMessageBox; OK sends Confirm without closing; dialog closed by server state change or on disconnect. - ws_client.py: remove deprecated loop= params from websockets.connect() and asyncio.ensure_future() (same fix already applied to ws_server.py) so the PyQt client can actually connect with websockets >= 10. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tqxrk8uj4M3w3d3eXm3xK8