Voice: BootHealthProbe doesn't probe wake-word DAG / SpeechAnalyzer assets / TTS engine #33

Closed
opened 2026-05-12 19:06:51 +00:00 by KofTwentyTwo · 1 comment
KofTwentyTwo commented 2026-05-12 19:06:51 +00:00 (Migrated from github.com)

Summary

VoiceBootHealthProbe doesn't probe anything voice-specific. Status .ok only requires audioGraphOwner non-nil + micStatus == .authorized + currentVariant != nil. Does NOT verify wake-word DAG is actually feeding, SpeechAnalyzer assets are downloaded, WhisperKit fallback weights exist, or TTS engine is alive.

Evidence

  • File: App/Boot/BootHealthProbes.swift:213-266
  • Live log shows voice state=ok every probe interval despite P0-3 / P0-4 being latent

Impact

P0-1 (wake-word dies on rebuild) leaves the probe reporting ok even after the wake path is dead. Reduces the value of the probe in incident triage.

Recommended fix

Add cheap watchdog assertions:

  1. Wake-word: assert wakeWordTask is still alive AND wakeWordDAG's feed Task isn't nil
  2. SpeechAnalyzer assets: probe via SFSpeechRecognizer.requestAuthorization status proxy
  3. TTS engine alive: probe via lightweight synthesize of empty string OR check AVAudioSession route status

Mark state as degraded (not ok) when any of these fail.

Test

  • Unit: probe with P0-1 simulated → state is degraded
  • Unit: probe with TTS engine torn down → state is degraded

Source

  • Audit: .planning/audit-2026-05-12/voice-audit.md (2026-05-12) — finding P1-2

Cross-references

  • Related: #28 (P0-1) — fixing this probe would have caught the wake-word death earlier
## Summary `VoiceBootHealthProbe` doesn't probe anything voice-specific. Status `.ok` only requires `audioGraphOwner` non-nil + `micStatus == .authorized` + `currentVariant != nil`. Does NOT verify wake-word DAG is actually feeding, SpeechAnalyzer assets are downloaded, WhisperKit fallback weights exist, or TTS engine is alive. ## Evidence - File: `App/Boot/BootHealthProbes.swift:213-266` - Live log shows `voice state=ok` every probe interval despite P0-3 / P0-4 being latent ## Impact P0-1 (wake-word dies on rebuild) leaves the probe reporting `ok` even after the wake path is dead. Reduces the value of the probe in incident triage. ## Recommended fix Add cheap watchdog assertions: 1. Wake-word: assert `wakeWordTask` is still alive AND `wakeWordDAG`'s feed Task isn't nil 2. SpeechAnalyzer assets: probe via `SFSpeechRecognizer.requestAuthorization` status proxy 3. TTS engine alive: probe via lightweight `synthesize` of empty string OR check `AVAudioSession` route status Mark state as `degraded` (not `ok`) when any of these fail. ## Test - Unit: probe with P0-1 simulated → state is `degraded` - Unit: probe with TTS engine torn down → state is `degraded` ## Source - Audit: `.planning/audit-2026-05-12/voice-audit.md` (2026-05-12) — finding P1-2 ## Cross-references - Related: #28 (P0-1) — fixing this probe would have caught the wake-word death earlier
KofTwentyTwo commented 2026-05-13 11:52:04 +00:00 (Migrated from github.com)

Closed by v0.1 cluster merges on 2026-05-13. Develop now at a8c7f1a0.

Closed by v0.1 cluster merges on 2026-05-13. Develop now at `a8c7f1a0`.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: KofTwentyTwo/Jarvis#33