Skip to content

fix(buzz-acp): post a channel notice on cancel+merge steer fallback (WO #301) - #8

Merged
Theremoteaidoc merged 1 commit into
mainfrom
agent/cursor/wo301-cancel-merge-visible
Aug 18, 2026
Merged

fix(buzz-acp): post a channel notice on cancel+merge steer fallback (WO #301)#8
Theremoteaidoc merged 1 commit into
mainfrom
agent/cursor/wo301-cancel-merge-visible

Conversation

@Theremoteaidoc

Copy link
Copy Markdown
Owner

Closes block#301
Closes Theremoteaidoc/remote-aid-medical#301

When an adapter lacks _session/steering and has no goose active_run_id,
buzz-acp already fell back to cancel+merge. That path was silent: only a
debug log (agent_returned (cancelled)). A follow-up mention looked like a
model failure.

This PR posts one channel-visible kind:9 line when that fallback fires, and
pins that the cancelled prompt is merged into the next FlushBatch and
rendered into the agent prompt.

Channel line (example for seat Cursor):

Cursor's in-flight turn was cancelled by an incoming message.

Re-delivery: already implemented via queue.requeue_as_cancelled +
flush_next merge. Verified end-to-end (withhold → release → requeue →
flush → format_prompt). No production gap found; new tests pin it.

Native Success path (Ok(SteerAck::Success)) is unchanged: drop withheld,
no fallback, no notice.

Follow-ups (not in this PR)

  • Implement _session/steering in cursor_acp.py, opencode_acp.py,
    pi_acp.py (non-cancelling steer).
  • Convert the harness from cancel-then-merge to queue-instead-of-cancel.

files-touched:

  • crates/buzz-acp/src/lib.rs
  • crates/buzz-acp/src/queue.rs

Evidence

$ cargo test -p buzz-acp steer
     Running unittests src/lib.rs (target/debug/deps/buzz_acp-cffac62f1d39cfb8)

running 28 tests
test acp::tests::acp_steer_failed_outcome_acks_outcome_rejected ... ok
test acp::tests::acp_steer_injected_does_not_renew_hard_deadline ... ok
test acp::tests::acp_steer_missing_outcome_acks_outcome_rejected_and_never_drops_event ... ok
test acp::tests::acp_steer_request_omits_expected_run_id_and_carries_session_and_prompt ... ok
test acp::tests::acp_steer_started_new_turn_acks_success_without_renewing_hard_deadline ... ok
test acp::tests::initialize_leaves_steering_unsupported_when_explicitly_false ... ok
test acp::tests::initialize_leaves_steering_unsupported_when_meta_absent ... ok
test acp::tests::initialize_records_steering_supported_when_advertised ... ok
test acp::tests::native_steer_with_active_run_id_routes_response_to_ack ... ok
test acp::tests::native_steer_with_no_active_run_id_acks_expected_run_id_missing ... ok
test acp::tests::steer_success_does_not_renew_hard_deadline_and_hard_timeout_fires ... ok
test acp::tests::steer_writes_nothing_when_no_run_id_and_capability_absent ... ok
test author_gate_tests::test_owner_only_admits_owner_and_sibling_to_steer ... ok
test author_gate_tests::test_owner_only_rejects_stranger_so_no_steer ... ok
test cancel_merge_fallback_notice_tests::steer_ack_success_disposition_is_unchanged ... ok
test config::tests::test_multiple_event_handling_default_is_steer ... ok
test config::tests::test_validate_steer_requires_queue_dedup ... ok
test pool::tests::test_send_prompt_result_clears_steer_rx_on_early_return ... ok
test pool::tests::test_send_prompt_result_is_noop_when_steer_rx_already_consumed ... ok
test queue::tests::test_format_prompt_no_reason_defaults_to_steer_framing ... ok
test queue::tests::test_format_prompt_steer_framing ... ok
test queue::tests::test_format_prompt_steer_framing_multi_event ... ok
test queue::tests::test_native_steer_bulk_release_preserves_fifo ... ok
test queue::tests::test_native_steer_earlier_events_flush_during_ack_window ... ok
test queue::tests::test_native_steer_expiry_recovers_withheld ... ok
test queue::tests::test_native_steer_withhold_only_channel_not_flushable ... ok
test queue::tests::test_steer_cross_thread_reply_targets_steering_message ... ok
test queue::tests::test_steer_end_to_end_queue_to_rendered_prompt ... ok

test result: ok. 28 passed; 0 failed; 0 ignored; 0 measured; 682 filtered out; finished in 9.36s

$ cargo test -p buzz-acp error_outcome_emission_tests
     Running unittests src/lib.rs (target/debug/deps/buzz_acp-cffac62f1d39cfb8)

running 22 tests
test error_outcome_emission_tests::agent_exited_emits_exactly_one_feed_event ... ok
test error_outcome_emission_tests::application_error_emits_exactly_one_feed_event ... ok
test error_outcome_emission_tests::auth_error_dead_letters_immediately_without_requeueing ... ok
test error_outcome_emission_tests::cancel_drain_timeout_dropped_stop_batch_none_same_neutral_payload ... ok
test error_outcome_emission_tests::cancel_drain_timeout_emits_exactly_one_feed_event ... ok
test error_outcome_emission_tests::cancel_drain_timeout_requeues_batch_and_does_not_return_agent ... ok
test error_outcome_emission_tests::cancelled_prompt_redelivers_original_event_to_agent_prompt ... ok
test error_outcome_emission_tests::hard_timeout_emits_exactly_one_feed_event ... ok
test error_outcome_emission_tests::hard_timeout_not_requeued_idle_timeout_is_requeued ... ok
test error_outcome_emission_tests::hard_timeout_recently_active_budget_exhausted_reports_dead_lettered ... ok
test error_outcome_emission_tests::hard_timeout_recently_active_requeue_success_reports_requeued_for_retry ... ok
test error_outcome_emission_tests::hard_timeout_recently_active_requeues_batch ... ok
test error_outcome_emission_tests::idle_timeout_emits_exactly_one_feed_event ... ok
test error_outcome_emission_tests::is_auth_error_matches_401_message ... ok
test error_outcome_emission_tests::is_auth_error_matches_reauthenticate_message ... ok
test error_outcome_emission_tests::is_auth_error_rejects_other_agent_error_message ... ok
test error_outcome_emission_tests::is_auth_error_rejects_transport_errors ... ok
test error_outcome_emission_tests::non_auth_application_error_is_requeued ... ok
test error_outcome_emission_tests::normalizes_agent_name_from_initialize_result ... ok
test error_outcome_emission_tests::panic_event_retains_task_turn_id ... ok
test error_outcome_emission_tests::timeout_outcome_labels_differ ... ok
test error_outcome_emission_tests::transport_error_emits_exactly_one_feed_event ... ok

test result: ok. 22 passed; 0 failed; 0 ignored; 0 measured; 688 filtered out; finished in 0.03s

$ cargo test -p buzz-acp cancel
     Running unittests src/lib.rs (target/debug/deps/buzz_acp-cffac62f1d39cfb8)

running 26 tests
test acp::tests::cancel_with_cleanup_grace_maps_expiry_to_cancel_drain_timeout ... ok
test acp::tests::permission_cancelled_response_preserves_id_type ... ok
test acp::tests::permission_request_with_no_options_is_cancelled ... ok
test acp::tests::permission_request_without_reject_once_is_cancelled ... ok
test acp::tests::permission_response_cancelled_format ... ok
test acp::tests::session_cancel_notification_has_session_id_in_params ... ok
test cancel_merge_fallback_notice_tests::cancel_merge_fallback_notice_names_seat_and_incoming_cancel ... ok
test cancel_merge_fallback_notice_tests::cancel_merge_fallback_posts_exactly_one_channel_notice_per_fallback_event ... ok
test cancel_merge_fallback_notice_tests::steer_ack_success_disposition_is_unchanged ... ok
test error_outcome_emission_tests::cancel_drain_timeout_dropped_stop_batch_none_same_neutral_payload ... ok
test error_outcome_emission_tests::cancel_drain_timeout_emits_exactly_one_feed_event ... ok
test error_outcome_emission_tests::cancel_drain_timeout_requeues_batch_and_does_not_return_agent ... ok
test error_outcome_emission_tests::cancelled_prompt_redelivers_original_event_to_agent_prompt ... ok
test pool::tests::test_cancel_after_natural_completion_preserves_channel_state ... ok
test pool::tests::test_classify_control_cancel_failure_crosses_error_outcome_and_batch_fate ... ok
test pool::tests::test_publish_agent_turn_metric_cancelled_stop_reason ... ok
test pool::tests::test_requeue_cancelled_batch_maps_control_signal_to_cancel_reason ... ok
test pool_lifecycle::tests::cancelled_wake_enters_failed_and_can_retry ... ok
test queue::tests::test_cancel_merge_fallback_withhold_release_redelivers_to_prompt ... ok
test queue::tests::test_double_cancel_latest_reason_wins ... ok
test queue::tests::test_double_cancel_preserves_all_events ... ok
test queue::tests::test_drain_channel_clears_cancelled_batches ... ok
test queue::tests::test_has_flushable_work_with_cancelled_only ... ok
test queue::tests::test_requeue_as_cancelled_merges_in_flush_next ... ok
test queue::tests::test_requeue_as_cancelled_no_new_events_fallback ... ok
test queue::tests::test_requeue_as_cancelled_propagates_reason ... ok

test result: ok. 26 passed; 0 failed; 0 ignored; 0 measured; 684 filtered out; finished in 3.38s

block#301)

Adapters without _session/steering cancelled in-flight turns silently.
Post one channel-visible line when that fallback fires, and pin
re-delivery of the cancelled prompt through flush_next + format_prompt.

Co-authored-by: Cursor <cursoragent@cursor.com>
@Theremoteaidoc
Theremoteaidoc marked this pull request as ready for review August 18, 2026 21:14
@Theremoteaidoc
Theremoteaidoc merged commit 943f91f into main Aug 18, 2026
16 of 23 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant