block / block/buzz

[Bug] Agents never respond in voice huddles: transcripts arrive but every utterance hits ExpectedRunIdMissing and cancels the in-flight run

Open
#3,071 1 comment 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.