Index: crates/codegen/xai-grok-voice/src/lib.rs
--- crates/codegen/xai-grok-voice/src/lib.rs.orig
+++ crates/codegen/xai-grok-voice/src/lib.rs
@@ -1,9 +1,11 @@
-//! Voice input for Grok Build CLI: an xAI streaming STT client and the [`run_voice_pipeline`] task that emits [`VoiceEvent`]s for the pager.
+//! Voice input for Grok Build CLI: an xAI streaming STT client and the
+//! [`run_voice_pipeline`] task that emits [`VoiceEvent`]s for the pager.
 //!
-//! Voice is dictation only: the mic streams to STT and the transcript lands in the prompt box.
+//! Voice is dictation only: mic → streaming STT → transcript into the prompt box.
 //!
-//! On macOS and Linux the mic is opened in a short-lived subprocess, so the long-lived TUI never pays the audio stack's permanent memory cost.
-//! See [`audio`] and [`maybe_run_capture_subprocess`].
+//! On macOS, Linux, and OpenBSD the microphone is opened in a short-lived
+//! subprocess so the long-lived TUI never pays the platform audio stack's
+//! permanent memory cost (see [`audio`] and [`maybe_run_capture_subprocess`]).
 
 #![deny(clippy::indexing_slicing)]
 
@@ -34,25 +36,39 @@ pub use probe::{
     run_streaming_probe,
 };
 
-/// Linux shells out to a system recorder (`pw-record`/`parec`/`arecord`) so the static-musl binary links no audio
-/// library. On Linux a `true` value means capture is *compiled in*; whether a recorder is actually installed is reported
-/// when a session starts. Consumers gate voice on this so a no-audio build never advertises a mic it can't open.
+/// Whether this build can capture microphone audio (the `audio` feature).
+/// Production CLI builds enable it on every OS: macOS/Windows link `cpal`
+/// (coreaudio/wasapi); Linux shells out to a system recorder
+/// (`pw-record`/`parec`/`arecord`); OpenBSD shells out to `aucat` (sndio).
+/// Linux/OpenBSD link no audio library into the binary. Bazel builds drop
+/// `audio` (no capture in the test sandbox).
+///
+/// On Linux/OpenBSD a `true` value means capture is *compiled in*; whether a
+/// recorder is actually available is reported when a session starts. Consumers
+/// gate voice on this so a no-audio build never advertises a mic it can't open.
 pub const AUDIO_SUPPORTED: bool = cfg!(feature = "audio");
 
-/// Hidden subcommand consumers re-exec themselves with to capture microphone audio in a short-lived helper process on macOS.
-/// See [`audio::capture_subprocess`](audio) for why capture is out of process.
-/// Intercepted via [`maybe_run_capture_subprocess`] at the very top of `main`, before any TUI/agent/tokio init, so the child stays minimal.
+/// Hidden subcommand consumers re-exec themselves with to capture microphone
+/// audio in a short-lived helper process (macOS; see
+/// [`audio::capture_subprocess`](audio) for why capture is out of process).
+/// Intercepted via [`maybe_run_capture_subprocess`] at the very top of `main`,
+/// before any TUI/agent/tokio init, so the child stays minimal.
 pub const MIC_CAPTURE_SUBCOMMAND: &str = "__mic-capture";
 
-/// If this process was re-exec'd as the hidden mic-capture helper, run it and return `Some(exit_code)`; otherwise `None` (a normal invocation).
-/// Call at the very top of `main` in every binary that links this crate with `audio` (the pager composition root and `voice-probe`).
-/// This mirrors the pager's mermaid render child intercept.
+/// If this process was re-exec'd as the hidden mic-capture helper, run it and
+/// return `Some(exit_code)`; otherwise `None` (a normal invocation). Call at
+/// the very top of `main` in every binary that links this crate with `audio`
+/// (the pager composition root and `voice-probe`), mirroring the pager's
+/// mermaid render child intercept.
 pub fn maybe_run_capture_subprocess() -> Option<i32> {
     let argv: Vec<std::ffi::OsString> = std::env::args_os().collect();
     if !is_capture_subcommand(&argv) {
         return None;
     }
-    #[cfg(all(feature = "audio", not(target_os = "linux")))]
+    #[cfg(all(
+        feature = "audio",
+        not(any(target_os = "linux", target_os = "openbsd"))
+    ))]
     {
         // Skip argv[0] (binary) and argv[1] (subcommand); the rest are flags.
         let args: Vec<String> = argv
@@ -62,11 +78,14 @@ pub fn maybe_run_capture_subprocess() -> Option<i32> {
             .collect();
         Some(audio::run_capture_child_cli(args))
     }
-    #[cfg(not(all(feature = "audio", not(target_os = "linux"))))]
+    #[cfg(not(all(
+        feature = "audio",
+        not(any(target_os = "linux", target_os = "openbsd"))
+    )))]
     {
-        // This build's own parent backend never spawns the helper (Linux uses system recorders; no-audio builds have no capture)
-        // Only a hand-typed invocation reaches here
-        // `write!` instead of `println!` so a closed pipe never panics
+        // Never spawned by this build's own parent backend (Linux/OpenBSD use
+        // system recorders; no-audio builds have no capture). Reachable only
+        // by hand. `write!` not `println!`: never panic on a closed pipe.
         use std::io::Write;
         let _ = writeln!(
             std::io::stdout(),
@@ -76,8 +95,9 @@ pub fn maybe_run_capture_subprocess() -> Option<i32> {
     }
 }
 
-/// Whether `argv` (the full process argv, including argv[0]) invokes the hidden mic-capture helper, i.e. argv[1] is [`MIC_CAPTURE_SUBCOMMAND`].
-/// Pure so the dispatch decision is unit-testable without mutating the process's real args.
+/// Whether `argv` (the full process argv, incl. argv[0]) invokes the hidden
+/// mic-capture helper — i.e. argv[1] is [`MIC_CAPTURE_SUBCOMMAND`]. Pure so the
+/// dispatch decision is unit-testable without mutating the process's real args.
 fn is_capture_subcommand(argv: &[std::ffi::OsString]) -> bool {
     argv.get(1).and_then(|a| a.to_str()) == Some(MIC_CAPTURE_SUBCOMMAND)
 }
