ad55375f89
iOS WKWebView's in-flight audio.play() rejects with AbortError after audio.src is reset during a stop+restart cycle. That rejection leaks through one of the .catch chains into TTSController.error(), which unconditionally flipped state to 'stopped' — desyncing the state machine so subsequent rate changes fell into the no-op else branch and #speak's auto-forward gate stopped firing at paragraph end. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>