[macOS][Global Dictation] Late composer acknowledgement starts both composer and global dictation
What version of the Codex App are you using (From “About Codex” dialog)?
Codex Desktop 26.730.61639 (6234)
What subscription do you have?
ChatGPT subscription; exact tier is not relevant to this local shortcut-routing bug.
What platform is your computer?
macOS 26.5.2 (25F84), Apple Silicon (arm64)
What issue are you seeing?
The configured global dictation shortcut can intermittently start both composer dictation and the global dictation fallback from a single keypress.
When this happens, both sessions record the same speech. Stopping both sessions inserts two copies of the transcription into the composer.
The same routing problem also appears in a milder form where the first shortcut press seems to do nothing and a second press is required.
Current shortcut state:
globalDictationToggle = Command+Shift+D
composer.startDictation = unbound
globalDictationHold = unbound
Inspection of the packaged app shows this sequence:
- The global controller sends
global-dictation-in-app-startto the focused renderer. - It waits only 150 ms for
global-dictation-in-app-started. - If the acknowledgement does not arrive within that window, it starts the global fallback via
showAndStart. - A cold, busy, mounting, or focus-transitioning composer can start dictation but acknowledge slightly after the 150 ms deadline.
- The late composer start is not cancelled or reconciled with the fallback, leaving two active dictation sessions.
The relevant packaged-controller symbols are tryStartInAppSession, waitForInAppDictationStart, and the 150 ms timeout.
This is not primarily microphone startup latency. Local CoreAudio traces showed the pinned built-in microphone beginning capture in roughly 20 ms; the failure occurs in ownership/acknowledgement between the global controller and composer.
What steps can reproduce the bug?
- In Settings → Keyboard Shortcuts, bind Toggle Dictation /
globalDictationToggletoCommand+Shift+D. - Leave the app-scoped composer dictation command and global hold command unbound.
- Open or switch to a Codex task, especially a newly opened or busy task where the composer is mounting or changing focus.
- Focus the composer and press
Command+Shift+D. - Repeat across new tasks or during composer focus transitions.
Intermittent observed outcomes:
- The first press appears ineffective and the second press starts dictation.
- Both composer dictation and the global dictation UI start from one press.
- After speaking and stopping both sessions, the same transcription is inserted twice.
What is the expected behavior?
A single shortcut press must create at most one dictation session.
If the composer starts after the acknowledgement deadline, the global controller should reconcile that late success and cancel the fallback, or cancel the late composer session. More robust options would be to:
- extend or retry the in-app acknowledgement window;
- queue the request until the focused composer is ready;
- use a single ownership token/state machine for composer and fallback startup;
- guarantee mutual exclusion between composer and global recording sessions.
Additional information
Restarting Codex can temporarily reduce broadly stuck behavior by rebuilding hotkey and renderer state, but it does not eliminate this per-composer race.
A faster computer may reduce frequency but cannot guarantee correctness because the fixed deadline also races renderer lifecycle and focus eligibility.
Related issues:
- #32249 requests a native app-scoped hybrid shortcut that avoids the global-controller path.
- #23398 reported one shortcut starting dictation in both main and side-chat composers. That issue is closed and involved two composer surfaces; this report concerns the current global-controller fallback racing a late in-app composer acknowledgement.
- #27296 and #27657 cover other global dictation shortcut failures but not simultaneous global and composer sessions.