BackendConfigScreen missing LOCAL_WHISPER card — only 3 of 4 backends render despite source defining 4 in priorityOrder default #144

Closed
opened 2026-09-11 04:08:16 +00:00 by Mark · 1 comment
Owner

Bug

The Backend Configuration screen (Manage → Backend Configuration) is missing the LOCAL_WHISPER card from the backend priority list. Only 3 backends render: Android SpeechRecognizer, FireOS Voice Service, Cloud API. LOCAL_WHISPER does not appear.

Reproduced

  • Device: Fire HD KFTRWI (Amazon FireOS)
  • App: com.voicetranscriber v1.0 from 93b7fd1
  • After pm clear com.voicetranscriber (verified default-config state): still 3 cards, no LOCAL_WHISPER
  • AGENTS.md claims "multi-backend (ANDROID/FIREOS/LOCAL_WHISPER) shipped 2026-09-08 with LOCAL_WHISPER as primary"

Source code expectation

app/src/main/java/com/voicetranscriber/service/SpeechBackend.kt:62-67 defines the default priorityOrder as 4 entries:

data class BackendConfig(
    val priorityOrder: List<SpeechBackendType> = listOf(
        SpeechBackendType.ANDROID,
        SpeechBackendType.FIREOS,
        SpeechBackendType.CLOUD,
        SpeechBackendType.LOCAL_WHISPER
    ),

BackendConfig.load() at line 138-162 returns either the saved order or the default. After pm clear, the prefs are empty so order is empty and load() returns BackendConfig(settings = settings) — which uses the data class default of all 4. The screen should render 4 cards.

Models screen proves the type exists

The Models screen (Manage → Models) does correctly list Whisper models for download (Tiny, Tiny (English), Base) and renders an "Active model: No model installed" empty state. The LOCAL_WHISPER backend type is fully wired in code:

  • SpeechBackend.kt:20 — LOCAL_WHISPER("local_whisper") enum entry
  • TranscriptionService.kt:343 — handler
  • BackendConfigScreen.kt:546 — display name "Local Whisper"
  • BackendConfigScreen.kt:553 — description "On-device whisper.cpp model"

But none of these reach the priority list UI.

Impact

  • Users on FireOS cannot promote LOCAL_WHISPER to the top of the priority list, so the SpeechRecognizer failure on FireOS (see #143) cannot be worked around
  • The BackendConfigScreen shows only 3 backends even though the source says 4 — code/build drift or runtime filtering bug
  • The "primary" backend per AGENTS.md is unreachable through the UI

Suspected cause

Either (a) bytecode in the installed APK differs from the source tree (the source HAS 4 backends but the compiled APK has 3), or (b) the itemsIndexed(priorityOrder, key = { _, backend -> backend }) in BackendConfigScreen.kt:194 is dropping LOCAL_WHISPER at runtime, or (c) the encrypted prefs on this device had a saved order from a prior install that excluded LOCAL_WHISPER — but this was not reproducible after pm clear, so (c) is ruled out.

Suggested fix

  1. Compare the installed APK bytecode against the source tree to determine which of the 3 backends is missing and why.
  2. Add a regression test that asserts BackendConfig.default.priorityOrder.size == 4 AND that the screen renders 4 cards.
  3. After the fix, ensure that LOCAL_WHISPER is the default FIRST backend in the priority order on FireOS (since the Alexa voice service binding fails on Fire devices — see #143).

Reported by Hermes on 2026-09-10 during smoke testing of v1.0 (build from 93b7fd1) on Fire HD KFTRWI.

## Bug The Backend Configuration screen (`Manage → Backend Configuration`) is missing the LOCAL_WHISPER card from the backend priority list. Only 3 backends render: Android SpeechRecognizer, FireOS Voice Service, Cloud API. LOCAL_WHISPER does not appear. ## Reproduced - Device: Fire HD KFTRWI (Amazon FireOS) - App: `com.voicetranscriber` v1.0 from `93b7fd1` - After `pm clear com.voicetranscriber` (verified default-config state): still 3 cards, no LOCAL_WHISPER - AGENTS.md claims "multi-backend (ANDROID/FIREOS/LOCAL_WHISPER) shipped 2026-09-08 with LOCAL_WHISPER as primary" ## Source code expectation `app/src/main/java/com/voicetranscriber/service/SpeechBackend.kt:62-67` defines the default `priorityOrder` as 4 entries: ```kotlin data class BackendConfig( val priorityOrder: List<SpeechBackendType> = listOf( SpeechBackendType.ANDROID, SpeechBackendType.FIREOS, SpeechBackendType.CLOUD, SpeechBackendType.LOCAL_WHISPER ), ``` `BackendConfig.load()` at line 138-162 returns either the saved order or the default. After `pm clear`, the prefs are empty so `order` is empty and `load()` returns `BackendConfig(settings = settings)` — which uses the data class default of all 4. The screen should render 4 cards. ## Models screen proves the type exists The Models screen (`Manage → Models`) does correctly list Whisper models for download (Tiny, Tiny (English), Base) and renders an "Active model: No model installed" empty state. The LOCAL_WHISPER backend type is fully wired in code: - `SpeechBackend.kt:20` — `LOCAL_WHISPER("local_whisper")` enum entry - `TranscriptionService.kt:343` — handler - `BackendConfigScreen.kt:546` — display name "Local Whisper" - `BackendConfigScreen.kt:553` — description "On-device whisper.cpp model" But none of these reach the priority list UI. ## Impact - Users on FireOS cannot promote LOCAL_WHISPER to the top of the priority list, so the SpeechRecognizer failure on FireOS (see #143) cannot be worked around - The BackendConfigScreen shows only 3 backends even though the source says 4 — code/build drift or runtime filtering bug - The "primary" backend per AGENTS.md is unreachable through the UI ## Suspected cause Either (a) bytecode in the installed APK differs from the source tree (the source HAS 4 backends but the compiled APK has 3), or (b) the `itemsIndexed(priorityOrder, key = { _, backend -> backend })` in BackendConfigScreen.kt:194 is dropping LOCAL_WHISPER at runtime, or (c) the encrypted prefs on this device had a saved order from a prior install that excluded LOCAL_WHISPER — but this was not reproducible after `pm clear`, so (c) is ruled out. ## Suggested fix 1. Compare the installed APK bytecode against the source tree to determine which of the 3 backends is missing and why. 2. Add a regression test that asserts `BackendConfig.default.priorityOrder.size == 4` AND that the screen renders 4 cards. 3. After the fix, ensure that LOCAL_WHISPER is the default FIRST backend in the priority order on FireOS (since the Alexa voice service binding fails on Fire devices — see #143). Reported by Hermes on 2026-09-10 during smoke testing of v1.0 (build from 93b7fd1) on Fire HD KFTRWI.
Mark closed this issue 2026-09-14 17:08:11 +00:00
Author
Owner

Fix landed in f2d2ff6 (fix(service): render all 4 backend cards on BackendConfigScreen (closes #144)), merged via d34cbf3.

Push recovered by watcher after kilo-gsd exited PARTIAL (non-fast-forward against remote tip 6e8e6a4 from #143). Merge of origin/main into local carried the #144 fix forward; push completed.

Refs: #143

Fix landed in f2d2ff6 (`fix(service): render all 4 backend cards on BackendConfigScreen (closes #144)`), merged via d34cbf3. Push recovered by watcher after kilo-gsd exited PARTIAL (non-fast-forward against remote tip 6e8e6a4 from #143). Merge of origin/main into local carried the #144 fix forward; push completed. Refs: #143
Sign in to join this conversation.
No description provided.