4019518edd
Two independent desktop-boot/runtime bugs found driving the app over CDP against current main, each pinned by a regression test: 1) Adapter no-op notify loop: IncrementalExternalStoreThreadRuntimeCore. __internal_setAdapter's fast path (same isRunning + same messageRepository) called _notifySubscribers() unconditionally. ChatRuntimeBoundary passes a fresh adapter literal every render, so any subscriber whose notification re-renders the boundary loops render->setAdapter->notify->render until React kills the tile with 'Maximum update depth exceeded' (reproduced live on every bot-profile switch; session tile dies behind its error boundary). Now the fast path notifies only when extras/suggestions/capabilities actually changed. 2) Dual-venv interpreter mismatch: findPythonForRoot() prefers .venv over venv, but createPythonBackend() hardcoded venvRoot=root/venv for PYTHONPATH. A checkout with BOTH venvs (dev .venv 3.12 + install venv 3.11) got a 3.12 interpreter with 3.11-compiled native wheels on PYTHONPATH and died on the first import (pydantic_core) before the gateway bound - the renderer then showed 'Gateway offline' on every profile. venvRootForPython() now maps the selected interpreter back to ITS venv; root/venv remains the fallback for system pythons only.