- VoiceView now reads connected/activeChannelName from useVoiceStatus (SWR live, invalidated by connect/disconnect) instead of initialStatus - Seed useSpeakers from live status.activeSpeakers - Add 4s refreshInterval to useVoiceStatus so state converges (tsc clean, next build green)