Decision 0024
Push-to-talk default; wake word opt-in; voice is untrusted; English first
Architecture decision record 0024: Push-to-talk default; wake word opt-in; voice is untrusted; English first
Context
Voice is a peer input to the nervous system, and anyone in the room can produce it.
The three plans
- Grok: voice as a peer input; push-to-talk default; wake word or always-on policy-gated; whisper.cpp streaming partials; interruptible TTS; a latency budget; English-only as the honest core (Q-18).
- Fable: push-to-talk on a held key; optional openWakeWord off by default with a visible mic indicator; audio never leaves the machine before the wake word.
- Codex: not detailed beyond audio as a cloud data class.
Decision
Push-to-talk by default (Super+Space held in the shell; a key in the TUI). Wake word via
openWakeWord (running through ort in the session) opt-in with a persistent MIC indicator; audio
never leaves the machine before it fires. Streaming partials; Kokoro speech; interruption by new
speech or Esc. Voice is an untrusted principal: voice-origin intents are capped at level 2
unless confirmed on a physical input. Budgets (core profile, mid-range laptop): release to first
partial ≤ 400 ms; 8 s utterance to final text ≤ 1.5 s; first model token ≤ 300 ms; first audio
≤ 400 ms. English first; STT is multilingual by nature; more voices later.
Consequences
- Voice lives in the session process with the desktop audio stack (PipeWire).
- Latency is a published metric, measured in CI where hardware allows.
Alternatives rejected
- Always-on listening by default: a microphone the owner did not ask for.