Bash tool strips dollar amounts from message content ($200 → empty, $1,000 → ,000)

Status Open
Maintainer reply None cached
Activity 0 comments · opened Aug 27, 2026

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

  1. Run an agent using claude-agent-acp harness (Claude Code as the underlying agent framework)
  2. Have the agent generate a response containing dollar amounts like $200–$600 per filling
  3. Agent sends via Bash tool: buzz messages send --channel <uuid> --content "...$200–$600..."
  4. 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 $1 portion 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 $N positional substitution bug in the Skill tool's args parameter, 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])).

View original on GitHub ↗