fix(buzz-acp): clear steer_rx on all run_prompt_task exit paths#1391
Merged
Conversation
Any first-turn error (session-create failure, initial_message error, etc.) returns the agent via PromptResult before the read loop's take() runs, leaving steer_rx = Some. The next dispatch for the same channel reclaims the same AcpClient and install_steer_rx's is_none() assert fires, crashing the main thread far from the original error. Add AcpClient::clear_steer_rx() and a send_prompt_result() helper that clears steer_rx immediately before moving agent into PromptResult. Every exit path in run_prompt_task now goes through this helper, making the install_steer_rx invariant structurally unviolatable rather than a reachable crash. The assert is preserved as a true never-happens guard. Two unit tests pin the seam: one simulates an early-return (receiver installed, read loop never ran take()) and one simulates the happy path (receiver already consumed). Both assert steer_rx is None on the returned agent and that a subsequent install_steer_rx does not panic. Co-authored-by: Will Pfleger <pfleger.will@gmail.com> Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
…oundary The previous wording said 'every exit path in run_prompt_task goes through this function', which overstated the guarantee and risked reintroducing the panic-unwind confusion Thufir flagged in review. Tighten to the accurate boundary: only paths that return OwnedAgent via PromptResult go through this helper; panic/abort paths do not and do not need to. Co-authored-by: Will Pfleger <pfleger.will@gmail.com> Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
wpfleger96
pushed a commit
that referenced
this pull request
Jun 30, 2026
…work * origin/main: (25 commits) fix(thread): stop mid-scroll content jump in live threads (#1397) fix(ci): restore main to green — tauri fmt, personas.rs file-size split, Windows path test (#1399) fix(desktop): enable buzz-dev-mcp MCP server for Codex agents (#1394) fix(ci): restore E2E flakiness fixes for pgschema, docker-pull, and spec timing (#1396) fix(personas): persist pack-backed persona UI edits across reboot (#1392) fix(buzz-acp): clear steer_rx on all run_prompt_task exit paths (#1391) Restore channel date divider rule (#1395) Speed up profile wave action (#1379) Restore visible links for rich previews (#1378) Mobile channel list polish (#1367) style(desktop): unify corner radii to rounded-2xl (16px) (#1393) fix(desktop): skip keychain write when blob contents are unchanged (#1377) fix(desktop): stop clipping the agent-activity row under the composer (#1371) Constrain macOS overscroll to conversations (#1317) Mobile appearance foundation (#1366) chore(release): release Buzz Desktop version 0.3.38 (#1375) feat(desktop): provider-agnostic model selection + databricks discovery (#1307) release(helm): buzz chart 0.1.1 (#1374) Harden relay attack surfaces (#1369) ci(helm): publish chart to GHCR on chart-v* tags (#1372) ...
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Any first-turn error in
run_prompt_task— session-create failure,initial_messageerror, etc. — returns the agent viaPromptResultbefore the read loop'ssteer_rx.take()runs. This leavessteer_rx = Someon the returned agent. The next dispatch for the same channel reclaims the sameAcpClient,install_steer_rxhits itsis_none()assert, and the main thread panics — far from the original error.Root cause traced to
pool.rs: there are ~22 early-return paths inrun_prompt_task, all of which sendPromptResult { agent, .. }back to the pool. The onlysteer_rx.take()is atacp.rs:890inside the read loop, which none of the error paths reach.Fix
Add
AcpClient::clear_steer_rx()(idempotent, setssteer_rx = None) inacp.rs.Add a
send_prompt_result()helper inpool.rsthat callsagent.acp.clear_steer_rx()immediately before movingagentintoPromptResult. Every exit path inrun_prompt_taskis routed through this helper — making theinstall_steer_rxinvariant structurally unviolatable rather than a reachable crash. Theassert!ininstall_steer_rxis preserved as a true never-happens guard.Tests
Two new unit tests in
pool::tests:test_send_prompt_result_clears_steer_rx_on_early_return: installs a receiver, callssend_prompt_resultwithout the read loop running (early-return simulation), assertssteer_rxisNoneand a subsequentinstall_steer_rxdoes not panic.test_send_prompt_result_is_noop_when_steer_rx_already_consumed: receiver alreadyNone(happy path), assertsclear_steer_rxis idempotent andinstall_steer_rxstill does not panic.Files changed
crates/buzz-acp/src/acp.rs:clear_steer_rx()method +steer_rx_is_none()test helpercrates/buzz-acp/src/pool.rs:send_prompt_result()helper + 22 call-site replacements + 2 new tests