mirror of
https://github.com/block/buzz.git
synced 2026-08-18 06:50:31 +02:00
Publishing a reply required composing a `buzz messages send ...` string inside a `shell` call. That indirection is reliable for frontier models and unreliable for the small local models shared compute exists to serve: against the real ~3.2k-token Buzz system prompt and the real dev-mcp toolset, Gemma 4 E4B delivered a reply in only 2 of 8 samples, answering in prose the rest of the time — and sometimes emitting the literal command text as assistant content. Assistant text is never published, so those replies were silently dropped while the turn reported success. Exposing the publish action as its own typed tool removes the indirection: the model selects a tool by name and fills one string field. Measured on the same prompt and toolset, delivery went 2/8 -> 8/8 on E4B and 6/6 on gemma-4-26B-A4B. The tool duplicates no process machinery — it builds an argv, quotes it, and delegates to shell::run, inheriting its timeout, output capping, cancellation and process-group kill. Channel ids are normalized (the `[Context]` block renders `general (#uuid)`, so models pass `#uuid`) and validated to bare ids, and content is single-quoted, so model output cannot reach the shell as metacharacters. Signed-off-by: Michael Neale <michael.neale@gmail.com>