[Bug] Agents never respond in voice huddles: transcripts arrive but every utterance hits ExpectedRunIdMissing and cancels the in-flight run
- Dominant language
- Rust
- Stars
- 32.7k
- Forks
- 4.3k
- Avg merge
- 1d 13h
- Merged PRs (30d)
- 253
Description
## Summary
In a voice huddle, transcripts do reach the agent's ephemeral channel, but the agent never produces a reply. Every incoming huddle utterance is routed through buzz-acp's steer path, which fails with `ExpectedRunIdMissing` and falls back to `cancel+merge` — cancelling the in-flight turn. With the rapid, short utterances that voice naturally produces, no turn ever survives to completion, so the agent stays silent for the whole huddle.
This is distinct from #2478 (English-only STT). In the runs below STT worked: the events arrived.
## Environment
- Buzz Desktop `0.4.26`, macOS 26.5.2 (Apple Silicon)
- Agent runtime: `@agentclientprotocol/claude-agent-acp` 0.62.0, Claude Agent SDK 0.3.219, Claude Code 2.1.220
- Relay: `wss://remodule.communities.buzz.xyz`
- STT `parakeet-tdt-ctc-110m-en`, TTS `pocket-tts` (both fully downloaded)
## Repro
1. Start a huddle from Desktop on a channel with a managed ACP agent.
2. Speak a few short sentences (English).
3. Agent receives the transcript events but never speaks or posts.
## Evidence
Agent harness log (`~/Library/Application Support/xyz.block.buzz.app/agents/logs/__<...>.log`), huddle channel `9f7e80a4-…`:
```
04:15:57.604 INFO buzz_acp: membership notification: subscribing to new channel channel_id=9f7e80a4-…
04:17:21.949 WARN buzz_acp::acp: goose-native steer: no active_run_id at write time
(no session/update seen yet) — falling back to cancel+merge
04:17:21.949 INFO buzz_acp: non-cancelling steer ack received channel=9f7e80a4-…
event_id=eed28039… ack=Ok(Err(ExpectedRunIdMissing))
release_withheld=true drop_withheld=false signal_fallback=true
04:17:21.949 INFO buzz_acp: control signal sent to in-flight task channel=9f7e80a4-… mode=Steer
04:17:31.474 WARN buzz_acp::relay: channel 9f7e80a4-… access denied by relay:
restricted: channel access revoked — dropping subscription, keeping connection
04:17:31.511 INFO buzz_acp: membership notification: unsubscribing from channel channel_id=9f7e80a4-…
04:17:36.587 INFO buzz_acp: membership notification: subscribing to new channel channel_id=9f7e80a4-…
04:17:41.596 WARN buzz_acp::acp: goose-native steer: no active_run_id at write time — falling back to cancel+merge
04:17:41.596 INFO buzz_acp: non-cancelling steer ack received … ack=Ok(Err(ExpectedRunIdMissing))
04:17:42.633 INFO buzz_acp: membership notification: unsubscribing from channel channel_id=9f7e80a4-…
```
Pipeline status per stage:
| Stage | Result |
|---|---|
| mic → STT | works |
| transcript → ephemeral channel event | works (`event_id=eed28039…` delivered) |
| channel event → agent run | **fails** — `ExpectedRunIdMissing` → cancel+merge every time |
| agent → TTS | never reached |
| huddle membership | unstable (see second issue below) |
## Two problems
**1. Huddle transcripts are delivered as steers into a non-existent run.**
`ExpectedRunIdMissing` + `no active_run_id at write time (no session/update seen yet)` says the harness is trying to steer a run that has not started. The fallback (`cancel+merge`) then cancels whatever is in flight. Chat tolerates this because messages are spaced out; voice does not. A short back-and-forth cancels itself continuously.
Suggested direction: a huddle transcript that arrives with no active run should **start** a run rather than steer one — or the steer path should queue until the run id exists instead of falling back to cancel.
**2. Huddle membership is revoked mid-huddle.**
`restricted: channel access revoked` fires ~90s into a live huddle, the harness drops the subscription and re-subscribes 5s later. The agent is briefly deaf and, given problem 1, the churn adds more cancellations.
## Secondary observation — agent selection
Across two huddles on the same parent channel, the set of agents added differed (huddle 1 added agent `aa85ee21…`, huddle 2 added only `afc3ee54…`) with no user action distinguishing them. Not necessarily a bug, but the participant selection is not obvious from the UI. Filing here for context; happy to split it out if maintainers prefer.
## Expected
An agent in a huddle answers spoken input via TTS, and stays subscribed for the huddle's duration.
Contributor guide
Assessment
This issue has not been assessed yet.