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
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
- macOS, Claude Code in Terminal.app, Terminal granted microphone access.
/voice, dictate in the foreground session — works.claude agents, focus the dispatch line, hold push-to-talk and speak for 5+ seconds.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).