From #11682 audit (owner-approved; owner does live voice QA before merge). useVoiceConversation.ts registers watch(isSpeaking) (~L842) + watch(prefLanguage) (~L850) INSIDE the composable body → one watcher per call; with Panel+Overlay+ChatInterface mountable together, _resumeAutoListening() can double-fire on TTS-complete (same class as the #6823 fix). Move the two watches to module scope (registered once) or guard-flag them. Unit test for single-registration. Needs live QA of walkie-talkie/hands-free/full-duplex/realtime modes before merge. Part of #11682.
From #11682 audit (owner-approved; owner does live voice QA before merge).
useVoiceConversation.tsregisterswatch(isSpeaking)(~L842) +watch(prefLanguage)(~L850) INSIDE the composable body → one watcher per call; with Panel+Overlay+ChatInterface mountable together,_resumeAutoListening()can double-fire on TTS-complete (same class as the #6823 fix). Move the two watches to module scope (registered once) or guard-flag them. Unit test for single-registration. Needs live QA of walkie-talkie/hands-free/full-duplex/realtime modes before merge. Part of #11682.