Voice dictation always fails in daemon-hosted (background/agent) sessions — recorder runs in a launchd-reparented process that can't hold a TCC microphone grant

Status Open
Reported on v2.1.229
Maintainer reply None cached
Activity 0 comments · opened Aug 12, 2026

Version: 2.1.229 · macOS 15 (Darwin 25.4.0), Apple Silicon · Terminal.app · npm global install

Summary

Dictation works in a foreground session and fails 100% of the time from the claude agents dispatch line, with No audio detected from microphone. The cause is not the input device, permission, or hold duration — the capture stream opens, runs for seconds, and is handed silence, because the process that opens the microphone is reparented to launchd and macOS cannot resolve a responsible process for it.

Evidence

Capture genuinely runs (so this is not the hold-warmup path) — log show, com.apple.coreaudio:

16:10:08.748 claude.exe[93191] setPlayState Started Input {BuiltInMicrophoneDevice}
16:10:13.889 claude.exe[93191] setPlayState Stopped Input {BuiltInMicrophoneDevice}   5.1s
16:14:30.400 claude.exe[70706] Started … 16:14:38.000 Stopped                         7.6s

Streams of 2.9s / 3.9s / 5.1s / 7.6s on the correct default device, all returning hadAudioSignal: false.

The mic-opening processes sit under launchd-reparented hosts, while the UI does not:

10849  ppid=7190     claude agents             <- UI, Terminal-parented, grantable
93191  ppid=93171    claude.exe --resume       <- opens the microphone
93171  ppid=1        claude.exe --bg-pty-host  <- launchd-reparented, NOT grantable

Both TCC outcomes appear in the same log window:

AUTHREQ_ATTRIBUTION: responsible={com.apple.Terminal, pid=5706},
                     accessing={com.anthropic.claude-code, pid=5706}
responsible process has com.apple.private.tcc.allow-prompting entitlement   <- works

Failed to fetch responsible file descriptor: [2: No such file or directory]
ERROR: failed to construct a process for the responsible audit token for PID[6331]

There is no user-side remedy. The binary is correctly signed and entitled (Identifier=com.anthropic.claude-code, TeamIdentifier=Q6L2SF6YDW, com.apple.security.device.audio-input), but the macOS Microphone privacy pane has no add button, and it holds no record to reset:

$ tccutil reset Microphone com.anthropic.claude-code
tccutil: Failed to reset Microphone approval status for com.anthropic.claude-code

Repro

  1. macOS, Claude Code in Terminal.app, Terminal granted microphone access.
  2. /voice, dictate in the foreground session — works.
  3. claude agents, focus the dispatch line, hold push-to-talk and speak for 5+ seconds.
  4. No audio detected from microphone, every time.

Expected

Dictation from the agents dispatch line should record through a process that can hold a microphone grant — or fail with an accurate message. The current text names the input device and microphone access; neither is the problem, which sends users down a dead end.

Note

One inference: the PID[6331] attribution failure is from an exited process I could not map back to a specific session. The two confirmed microphone-opening PIDs are definitively in the launchd tree, and both attribution outcomes are in the same log window, but that last link is circumstantial.

Possibly the same root cause as #38054 (works in some sessions, not others — no mechanism identified there). Distinct from #80366 (Bluetooth device change).

View original on GitHub ↗