49d9410e3a
- N122: setMediaState resolves on EC's transport ACK instead of waiting for a DeviceMute state-echo that EC may elide or skip during teardown — which previously stranded the promise forever and silently skipped the initial deafen state + first StateUpdate on join. Dropped the single-slot mediaStatePromiseResolver; onMediaState remains the authoritative sync path. - N123: focusCameraParticipant now waits for a spotlight videoTile to mount via a MutationObserver (with a 600ms hard-timeout fallback) instead of a fixed 2-frame delay that EC's React commit can exceed on slower devices. - N126: PiP position restored from localStorage is shape+finiteness validated, so corrupt data can't feed NaN into the position math (invalid 'NaNpx' CSS). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>