python/scenario/voice/adapters/_twilio_server.py enqueues every 100 ms media batch unconditionally, exactly the JS bug fixed in #990: Twilio streams frames through silence, so the drain's tail-silence turn end never fires and a callee's turn only ends on hang-up or the hard ceiling. Port TwilioSpeechGate (RMS threshold 800 / hangover 400 ms / pre-roll 300 ms, measured on a real call; see the JS PR for the numbers) into the Python adapter with the same speech_gate option and disconnect-span counters.
🤖 Generated with Claude Code
python/scenario/voice/adapters/_twilio_server.py enqueues every 100 ms media batch unconditionally, exactly the JS bug fixed in #990: Twilio streams frames through silence, so the drain's tail-silence turn end never fires and a callee's turn only ends on hang-up or the hard ceiling. Port TwilioSpeechGate (RMS threshold 800 / hangover 400 ms / pre-roll 300 ms, measured on a real call; see the JS PR for the numbers) into the Python adapter with the same speech_gate option and disconnect-span counters.
🤖 Generated with Claude Code