You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
When the orchestrator is allowed to interrupt me #6
Constraints established by Out-of-band speech — this ticket should decide against these, not rediscover them.
The brain has no record of what it says unprompted. An injected utterance never reaches the Claude Code subprocess's history. The human will reply to something the agent does not know it uttered. That gap, not the frame plumbing, is the substantive decision here.
Writing to history races the live turn.ClaudeSDKClient.receive_messages iterates one shared receive stream with no lock and no fan-out, so a query issued from an HTTP handler while a voice turn is in flight splits the stream and breaks both. Any design that records the utterance has to serialise.
Mid-sentence behaviour is already fixed by the code. Injected frames are dropped at user turn start, and talk over the user after it. Making unprompted speech win requires the UninterruptibleFrame mixin, which inverts barge-in for that frame. That is a product call, not a technical one.
Toggle-off behaviour now waits onthe recording indicator task, because the speak-only path is only honest if the indicator stays dark.
Activity
Pierre-Mike commentedon Aug 17, 2026
Constraints established by Out-of-band speech — this ticket should decide against these, not rediscover them.
ClaudeSDKClient.receive_messagesiterates one shared receive stream with no lock and no fan-out, so a query issued from an HTTP handler while a voice turn is in flight splits the stream and breaks both. Any design that records the utterance has to serialise.UninterruptibleFramemixin, which inverts barge-in for that frame. That is a product call, not a technical one.