cfbf950173
overrideOutputAudioPort(.speaker) alone can't beat a connected BT headset (BT is higher priority), so 'Speaker' snapped back to BT. Now setSpeaker(true) sets category options [.defaultToSpeaker] (no allowBluetooth) so BT isn't an eligible output and the speaker wins; setSpeaker(false) restores [.allowBluetooth,.allowBluetoothA2DP] and uses the default port (routes to the headset). Observer re-holds speaker if a BT connect steals it. Adds a TEMP web probe (nroute/sptap) to verify from telemetry. plugin v1.1.1, web batch149. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>