50ea107d9d
With `voice.auto_tts` on and HUD mode active, a reply could be spoken twice: the HUD renderer and the hidden app window both claim `speak:<messageId>` through `hermes:ambient:claim`, and main collapsed the two claims with the same 1 s deduper it uses for the turn-end beep. The app window under the HUD is throttled by Chromium, so its transcript subscription fires well past 1 s, finds the key pruned, and is told it owns the cue. Fixes #99717. The unit was wrong, not the window: a spoken reply is minutes of audio keyed by a durable message id. `createAmbientClaimArbiter` keeps the tick-sized window for `sound:*` and holds `speak:*` claims for a 10-minute TTL. No HUD special-casing: the same race exists between any two windows showing the same chat, and the arbiter fixes them all. Diagnosis credit: #99810 (@liuhao1024) and #100289 (@shivamjg101), whose TTL framing this follows.