Live-testing on the brewpi Pi found that a connected-but-unresponsive device (e.g. the hendi sitting in its ungraceful-disconnect lockout, see docs/hendi_lockout_findings.md) crashed the whole server: activate() - called both from HeaterTask's `with device.open():` and from a client's Connect/Disconnect command - raised uncaught, escaping the gathered task and killing the entire asyncio.gather in TaskManager.start(). activate()/is_activated()/process() on both real actors now catch comm exceptions and self-heal via disconnect() (the same path a genuine unplug already takes), instead of letting the exception propagate. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YaPLuRPpyjWcwhMvCvpHCL