Description
## Symptom
During an active stream, MicRelay enters an infinite busy-loop alternating between `engine restart failed after configuration change` (com.apple.coreaudio.avfaudio error 2003329396) and `tap watchdog — no audio in 2s, reinstalling`. The loop fires every ~2 seconds and fills the log indefinitely. The stream continues but microphone relay is completely non-functional.
## Log evidence
From issues #302 and #301 (nerdland, 2026-05-20):
```
22:30:43 [prev] MicRelay: engine restart failed after configuration change
22:30:45 [prev] MicRelay: tap watchdog -- no audio in 2s, reinstalling
22:30:45 [prev] MicRelay: engine restart failed after configuration change
[... repeats every 2s for entire session duration ...]
```
Error code 2003329396 = kAudioSessionIncompatibleCategory. The audio session category set for streaming is incompatible with the tap/engine config used by MicRelay when an audio route change occurs mid-stream.
## Appears in
Log dump issues: #302, #301 (bxl1-test/nerdland, node-ea866a02). Same pattern in issue #298 (mic relay filed concurrently showing 155 packets then failure).
## Impact
Microphone relay silently stops working mid-stream. Log becomes unreadable due to 1 line/second spam. No crash but no mic audio reaches the body.
## Fix direction
- Add circuit-breaker: after N consecutive engine restart failures, stop the restart loop, log a terminal error, and surface a warning in the UI
- Investigate whether the audio session category needs to be reconfigured to be compatible with MicRelay tap after a route change
- Distinct from #274 (double-start NSException crash)