TacidOS
DevelopersGitHub

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

Status
Accepted
Date
2026-09-03

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.