Bash tool strips dollar amounts from message content ($200 → empty, $1,000 → ,000)
Describe the bug
Agent messages containing dollar amounts (e.g., $200, $1,000) have those values silently stripped when sent via buzz messages send --content "...". The stored message shows patterns like $200–$600 reduced to just –, and $1,000 reduced to ,000.
Steps to reproduce
- Run an agent using
claude-agent-acpharness (Claude Code as the underlying agent framework) - Have the agent generate a response containing dollar amounts like
$200–$600 per filling - Agent sends via Bash tool:
buzz messages send --channel <uuid> --content "...$200–$600..." - Observe the stored message — dollar amounts are stripped
Expected behavior
Dollar amounts should be preserved verbatim in the message content.
Actual behavior
Patterns matching $ followed by digits are stripped:
$200–$600→–(both amounts gone, only the en-dash remains)$1,000→,000(the$1portion stripped)$5,000→,000
This is consistent with shell variable interpolation in a double-quoted string, where $200 is interpreted as an undefined variable (expands to empty), or with regex backreference substitution where $1, $2, etc. are replaced.
Version and platform
- Buzz version: 0.5.14
- claude-agent-acp (via @agentclientprotocol/claude-agent-acp)
- Claude Code (underlying agent framework)
- OS: macOS 26.5.2 (Apple Silicon)
Logs / additional context
Raw database query confirms corruption at storage time — the relay received and stored the corrupted content:
SELECT content FROM events_p_future WHERE content LIKE 'Short answer: probably not worth%';
Returns:
- USA: – per filling → your ,000 quote for 3 is actually on the lower end
- Costa Rica: – per filling → 3 fillings would run –
The agent's follow-up message (where it apologized and re-sent with numbers) was NOT corrupted, suggesting the corruption path is inconsistent — possibly dependent on how the Bash tool constructs or quotes the command.
Related issues
- #79859 documents a similar
$Npositional substitution bug in the Skill tool'sargsparameter, but that affects skill markdown content, not Bash tool output.
Workaround
Use stdin for message content instead of inline --content:
printf '%s' "$MESSAGE" | buzz messages send --channel <uuid> --content -
Or ensure the agent uses single quotes around the content argument (though this may not be controllable from the agent's perspective).
Root cause hypothesis
The Bash tool execution path likely passes the command through a shell with double-quoted interpolation, causing $N patterns to be interpreted as variable references and expanded to empty strings. The fix would be to ensure content is passed through without shell interpretation — either by using single quotes, escaping dollar signs, or bypassing shell entirely (e.g., execFile with array args rather than spawn('bash', ['-c', cmd])).