mirror of
https://github.com/block/buzz.git
synced 2026-11-09 10:51:42 +00:00
🤖 ## Summary - **A partly written message can no longer corrupt the stream between Buzz and an agent.** Buzz runs each coding agent as a child process and sends it one JSON message per line over the agent's stdin pipe. Previously, if such a write was cut off mid-line — a concurrent control operation won the race, its deadline expired, the task was aborted, or the pipe failed partway — the partial line stayed in the pipe and the next message was written directly behind it, leaving a single corrupted line on the agent's input that no parser can read. Now the connection's single stdin writer is owned by the write itself: it is handed back only after the whole line, its newline, and a flush have all completed. An abandoned or failed write closes the pipe instead, so nothing can ever append to a partial line — later operations get a clean broken-pipe transport error, which the existing retry and retirement policy already handles. - Intentionally unchanged: cancelling a prompt whose message was fully written works exactly as before, and an ordinary application-level error reply from the agent (for example, a JSON-RPC "bad input" error) does not close the transport — the next prompt reuses the same connection. - **Refused mid-run steers now log why, in fixed words.** While an agent task is running, Buzz can try to steer it — hand additional instructions to the running task — and falls back to the existing cancel-and-merge behavior when that is not possible. When a steer is refused before anything is written to the agent, the log now records one fixed reason instead of an opaque dump of the whole error: `task_absent` (no running task owns the scope), `sender_absent` (the task has no steer channel installed), `mailbox_full` (the one-slot steer mailbox already holds a steer), or `mailbox_closed` (the task's steer receiver is gone). Before-write refusals are now distinguishable from failures after a steer was accepted, which keep carrying the underlying transport error. Behavior is unchanged — same fallback, request ownership, and return values; only the log field changes. ### Related issue N/A ### Testing - **19 new tests.** In `crates/buzz-acp/src/acp_frame_writer.rs` (8): interrupting the write at the body or the newline boundary, or hitting an I/O failure, must close the writer and make every later write fail; a completed write keeps the writer; a real OS-pipe test interrupts a 300 KB prompt mid-body and asserts that cleanup and later requests fail with no frame appended; another real-pipe test asserts a completed prompt still cancels normally; an application-error reply leaves the connection reusable. In `crates/buzz-acp/src/pool.rs` (7): each fixed refusal label is produced by `send_steer` for its real cause, an admitted steer reaches the read loop, the labels round-trip without drift, and post-admission failures never classify as admission refusals. In `crates/buzz-acp/src/lib.rs` (4): the real `try_native_steer` is driven through each refusal branch with a real pool, queue, and signed event, and the emitted fallback log is captured and pinned — the exact fixed reason, exact message and channel, no request or error content, and the unchanged fallback return; forcing the production reason to a wrong label or deleting it fails all four. A mutation check (removing the writer-ownership transfer) fails the frame tests. - **Full local `just ci` at `45e00ec82` — all lanes passed**, including the buzz-acp 947 unit + 9 integration tests, desktop and mobile suites, fmt, clippy, web, security, and build lanes. - **Previous head `5276ef375` added only a one-line test fix.** Windows Clippy flagged the `wait_for` test helper as dead code because its only callers are Unix-only tests; it now carries the matching `#[cfg(unix)]` guard. No production code or assertions changed. Re-verified locally at this head: `cargo fmt --check`, `cargo clippy -p buzz-acp --all-targets -- -D warnings`, and the 8 frame-writer tests pass. No full local rerun — the full matrix ran remotely at this head. - **Remote CI at `5276ef375` was green** — [run 34530106246](https://github.com/block/buzz/actions/runs/34530106246): 42 jobs passed, 20 conditionally skipped, 0 failed, including the Windows Rust lane (the guard's purpose) and the desktop core lane; Docker image, desktop release-candidate, and DCO checks pass. The automated security review over `00209076c…5276ef375` reported no findings. - **Current head `2224ec228` adds the fallback-log regression tests.** Rebased onto `main` at `44c1cc7df` and extended with a test-only commit: the four `lib.rs` tests above now pin the production fallback log. Verified locally at this head: full `cargo test -p buzz-acp` (952 unit + 9 integration, 0 failed), `cargo clippy -p buzz-acp --all-targets -- -D warnings`, and `cargo fmt --check`, all clean; the DCO check passed remotely. Fresh remote CI is running on this head. --------- Signed-off-by: Logan Johnson <loganj@squareup.com> Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz>