# 1.0.32-dev1 — Single-action Bluetooth HID

- Removed D-pad hold-repeat generation.
- Removed long-OK hold behavior; OK now dispatches once on press like other buttons.
- Latches each Bluetooth HID button until its release report, suppressing duplicate non-zero reports during the same physical press.
- Added press/release diagnostic logging to help isolate any remaining transport latency.
- Voice/ATVV behavior is unchanged.

# 1.0.31-dev1
- Suppresses duplicate non-zero HID reports for a button that is already held on the same ATT handle.
- Preserves immediate first press and the existing 420 ms / 160 ms controlled D-pad hold-repeat behavior.
- Applies the fix to both the full ATVV/HID loop and HID-only fallback loop.
- Adds diagnostic `HID duplicate held report suppressed` logging.
- No Bluetooth timing, pairing, ATVV, STT, bridge, or YAML/config changes.

# 1.0.30-dev1
- Netflix remote button toggles the focused movie/TV show in the authenticated Trakt watchlist.
- Reads membership before updating; only confirms successful Trakt changes; suppresses rapid repeat presses.
- Requires a valid focused TMDb ID; skips ambiguous selections without false success.
- No YAML changes.

# VoiceHelper 1.0.29

- Adds an explicit `native_htt_active` latch for the physical hold interval.
- `Listening…` is authoritative for the full native HTT hold and cannot be replaced by asynchronous STT availability/final/error events.
- Ignores late legacy `START_SEARCH` packets while native HTT/audio is already active, preventing a second `MIC_OPEN` and preventing `Starting voice…` from overwriting the Listening state.
- Clears the HTT latch only on native `AUDIO_STOP reason=0x02`, safety timeout, abort, or completed transaction.
- Keeps the 1.0.27 native ATVV HTT transport and instant release behavior unchanged.

# VoiceHelper 1.0.28

- Fixes native HTT overlay state ordering introduced by the faster 1.0.27 mic path.
- STT `availability=true` is now treated as transport health only and cannot force the UI back to `idle` while a voice transaction is active.
- `Listening…` now remains visible for the full physical button hold.
- `Processing…` still takes over immediately on native HTT `AUDIO_STOP reason=0x02`.
- No Bluetooth, ATVV negotiation, STT protocol, command parsing, or timeout behavior changes.

# VoiceHelper 1.0.27

- Negotiates Google ATVV v1.0 capabilities asynchronously with `GET_CAPS` and advertises interaction models `0x03` (Hold-to-Talk + Press-to-Talk + On-request).
- Does not synchronously wait for `CAPS_RESP`; the persistent ATT/HID loop remains responsive.
- Parses/logs `CAPS_RESP` and detects native HTT selection (`interaction_model=0x03`).
- Native HTT can start directly from `AUDIO_START reason=0x03`; STT startup no longer depends on `START_SEARCH` or HID Assist events.
- `AUDIO_STOP reason=0x02` is the authoritative native HTT physical button-release boundary and immediately finalizes STT.
- Keeps the legacy `START_SEARCH -> MIC_OPEN` On-request path as fallback if the remote does not negotiate HTT.
- `AUDIO_STOP reason=0x08` is treated as the remote's safety Audio Transfer Timeout, not button release.
- Removes the 1.0.26 dependency on HID VOICE release while preserving normal HID remote behavior.
- No speech-duration cutoff; native HTT remains active for as long as the physical button is held, subject only to the remote's protocol safety timeout.

# VoiceHelper 1.0.26

- Tracks the VOICE button through the existing HID held-button state.
- Xiaomi HID all-zero release report is now the authoritative physical VOICE button-up signal.
- On HID VOICE release: sends `MIC_CLOSE_RELEASE`, switches UI to Processing, and queues STT END immediately (or defers END until STT READY).
- ATVV `CTL 00 00` is retained as diagnostic/session-state only and no longer terminates speech.
- Preserves unlimited hold-to-talk duration introduced in 1.0.25.
- Preserves existing D-pad repeat, OK long-press, Bluetooth persistence, STT isolation, and operator locking behavior.

# VoiceHelper 1.0.25

- Removes the 4.75-second speech-duration cutoff entirely.
- The physical ATVV VOICE button-up notification `CTL 0x009a: 00 00` is now the sole normal end-of-utterance signal.
- Voice capture continues for as long as the microphone button is physically held.
- Bluetooth/ATT/session failure handling remains independent of speech duration.
- Preserves 1.0.24 immediate MIC_CLOSE/STT END behavior on button release.
- Preserves 1.0.22 operator locking and 1.0.21 on-demand STT/idle behavior.

# VoiceHelper 1.0.24

- Makes ATVV control notification `0x009a: 00 00` the authoritative physical VOICE button-up/end-of-utterance signal.
- Sends `MIC_CLOSE` immediately on button release instead of waiting for the 4.75-second audio cutoff.
- Queues STT `end` immediately on release when STT is ready.
- If release occurs before the asynchronous STT READY handshake completes, preserves the release and queues STT `end` immediately after buffered PCM is flushed on READY.
- Drops any trailing ATVV audio packets arriving after the physical release boundary.
- Retains the existing audio deadline as a failsafe when a release notification is not received.
- Removes the temporary 1.0.23 release-probe logging.
- Preserves 1.0.22 operator locking and 1.0.21 on-demand STT/idle behavior.

# VoiceHelper 1.0.23

## Debug release probe

- Adds timestamped raw ATT/HID logging during an active voice transaction.
- Arms the probe at ATVV START_SEARCH.
- Logs control notifications and every non-audio ATT notification, including all-zero release candidates.
- Does not alter mic timing, MIC_OPEN/MIC_CLOSE, HID dispatch, STT behavior, reconnect behavior, command parsing, or UI behavior.
- Intended only to determine whether the Xiaomi RC emits a physical button-release report after voice capture begins.

# KodiFlix VoiceHelper Release Notes

## 1.0.22 - Locked spoken operator dispatch
- Makes the literal spoken operator authoritative at the final VoiceHelper -> Bridge seam.
- `find me ...` always dispatches `command=search`.
- `show me ...` always dispatches `command=info`.
- `play ...` always dispatches `command=play`.
- Prevents STT command classification from turning descriptive FIND ME requests into SHOW ME/browse requests.
- Adds `VOICE OPERATOR OVERRIDE` logging when the STT payload disagrees with the locked operator.
- Preserves 1.0.21 on-demand STT/idle quieting and Bluetooth/HID behavior.
- No Bridge, resolver, CDN, AIOStreams, YAML/compose, or secrets changes.

# VoiceHelper 1.0.21-dev

- Removed the 5-second idle STT `voice_ready` probe cycle.
- Removed automatic idle STT connect/reconnect attempts.
- STT connect/auth now happens on demand when the microphone is requested.
- A healthy authenticated socket may remain open; idle heartbeat reduced to 30 seconds.
- If the idle socket fails, it is retired and remains quiet until the next microphone request.
- Preserved the existing Bluetooth/HID isolation boundary and 1.0.20 early MIC_OPEN/pre-STT PCM behavior.
- No remote mappings, settings, overlay UI, STT server configuration, Bridge, CDN, or YAML changes.

