Summary
When buzz-acp runs with BUZZ_ACP_SUBSCRIBE=all and no BUZZ_ACP_KINDS override, ephemeral events are delivered to the agent session. Every typing indicator (kind 20002) and presence update (kind 20001) wakes the agent and starts a turn. Two effects:
- Token cost per keystroke. Each wake-up is a model call even when the agent decides to do nothing. A human composing one message produces dozens of typing events, so the agent pays for dozens of no-op turns.
- A confusing feedback loop in Desktop. While the agent processes the wake-up, Desktop shows it as typing (the working badge in
desktop/src/features/agents/agentWorkingSignal.ts falls back to bot typing signals and active turns). The human sees "agent is typing" whenever they themselves type, before the agent has anything to say.
Reproduction
- Run buzz-acp with
BUZZ_ACP_SUBSCRIBE=all (the documented way to make an agent respond to un-mentioned channel messages) and leave BUZZ_ACP_KINDS unset.
- Open the channel in Desktop as a human member and start typing a long message.
- Watch the agent flip to "typing..." while you type, and watch the harness logs record a turn per typing event.
Expected
Ephemeral kinds (20001, 20002, and arguably 24200 observer frames) should never reach the agent subprocess, or at minimum should be excluded by default when subscribe=all resolves with no kinds override. Mentions mode already ships a curated default (resolve_channel_filters in crates/buzz-acp/src/config.rs uses KIND_STREAM_MESSAGE, KIND_WORKFLOW_APPROVAL_REQUESTED, KIND_STREAM_REMINDER); All mode passes kinds: None and subscribes to everything.
Workaround
Set an explicit allowlist, for example:
BUZZ_ACP_KINDS=9,40002,40003,5,7,1059,40100,40007,46010,46020
This keeps messages, edits, deletions, reactions, DMs, canvas updates, reminders, and workflow events while dropping the keystroke echoes. Confirmed working on a self-hosted deploy (compose stack from deploy/compose).
Suggested fix
In resolve_channel_filters, give SubscribeMode::All a default exclusion of ephemeral kinds when kinds_override is None, or introduce a small default allowlist mirroring the mentions-mode one plus reactions and canvas. Happy to send a PR if maintainers agree on the direction.
Summary
When buzz-acp runs with
BUZZ_ACP_SUBSCRIBE=alland noBUZZ_ACP_KINDSoverride, ephemeral events are delivered to the agent session. Every typing indicator (kind 20002) and presence update (kind 20001) wakes the agent and starts a turn. Two effects:desktop/src/features/agents/agentWorkingSignal.tsfalls back to bot typing signals and active turns). The human sees "agent is typing" whenever they themselves type, before the agent has anything to say.Reproduction
BUZZ_ACP_SUBSCRIBE=all(the documented way to make an agent respond to un-mentioned channel messages) and leaveBUZZ_ACP_KINDSunset.Expected
Ephemeral kinds (20001, 20002, and arguably 24200 observer frames) should never reach the agent subprocess, or at minimum should be excluded by default when
subscribe=allresolves with no kinds override. Mentions mode already ships a curated default (resolve_channel_filtersincrates/buzz-acp/src/config.rsuses KIND_STREAM_MESSAGE, KIND_WORKFLOW_APPROVAL_REQUESTED, KIND_STREAM_REMINDER); All mode passeskinds: Noneand subscribes to everything.Workaround
Set an explicit allowlist, for example:
This keeps messages, edits, deletions, reactions, DMs, canvas updates, reminders, and workflow events while dropping the keystroke echoes. Confirmed working on a self-hosted deploy (compose stack from
deploy/compose).Suggested fix
In
resolve_channel_filters, giveSubscribeMode::Alla default exclusion of ephemeral kinds whenkinds_overrideisNone, or introduce a small default allowlist mirroring the mentions-mode one plus reactions and canvas. Happy to send a PR if maintainers agree on the direction.