Repository navigation
acpmux: review boxes get no inbox notice and no other agent's steer - #28369
Conversation
…ring its review Red on base: another agent's message to a review box's running turn goes to its inbox and its notice steers into the review. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3db671e49c5e0014c84a
A review box (harness *-review-box, or a review. tag) takes another agent's message the pre-inbox way: queued behind the running review, a turn of its own after it, which answers the sender. No inbox item, no notice steered into the review, no agent steer and no digest steer. A steer-only send is refused with reviewBox. One predicate (review_box.rs) is shared with acpmux ls. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3db671e49c5e0014c84a
|
Found 6 test failures on Blacksmith runners: Failures
|
… as its task lane-place sends a review box its task as another agent (acpmux new --prompt-file); on base it landed in the inbox and the box got a notice in its place. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3db671e49c5e0014c84a
|
Owned by an agent session · session |
…ers into the review Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3db671e49c5e0014c84a
Review finding at 1db550a: notice delivery had no review-box check, so messages a chat's inbox took before a review. tag was set could still be noticed into its review turn. inbox_review and notice_held (also checked as the steer is written) now hold notices while a review box's turn runs; they go in after it ends, as an idle chat's do. A queued message the person sends with Send now still goes in: documented as the person's choice. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3db671e49c5e0014c84a
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
Review finding at 5bc9922: session inbox --digest bundled a review box's queued agent prompts into one digest turn. It now refuses a review box (inbox_digest.review_box), so each waits as its own prompt behind the review. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3db671e49c5e0014c84a
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
|
Review finding at 74a882f: an agent message sent with interrupt (and a family message delivered with interrupt) still cancelled the running review turn. Both now queue behind it; the test checks the review ends end_turn. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3db671e49c5e0014c84a
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3db671e49c5e0014c84a
Review finding at efc662a: take_joined coalesced queued agent prompts, so a review box's messages ran as one digest turn after the review. They now run each as its own prompt, as the inbox_digest refusal says; the test asserts three turns again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3db671e49c5e0014c84a
…e review Review finding at 2afd067: the test's FYI only armed the 10-minute flush, so base sent no notice and the test passed there. Now the message comes while the person's prompt waits behind a turn, so its notice is held for the next turn's start (base steers it into the review); the tag lands before that turn. Events, not sleeps: the review's answer, then the sender's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3db671e49c5e0014c84a
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
…rrupt Review findings at e57bc34: - an agent interrupt that saw no running turn kept its interrupt and could stop a review that started meanwhile: the guard no longer needs a turn; - a review. tag set while an agent steer or a family interrupt was on its way was not seen: the steer is checked again under the input handoff (a held one falls back to a turn of its own), and the family interrupt checks again before it cancels; - the pre-tag test could drop the answers it waits for: it reads all three together and waits on the FIFOs, not on an update. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3db671e49c5e0014c84a
…ratchet) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-d9e7e9f7fb2b87a57d5f
…ing_slice 97 > 94): rewrite the new hits without panics (#28386) * acpmux: inbox, send and outbox status JSON writes without indexing Part of the acpmux panic ratchet base red that came back after #28134 (indexing_slicing 703 > 693, string_slice 97 > 94). These writes go through JsonSet::set instead of IndexMut. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-d9e7e9f7fb2b87a57d5f * acpmux: ls globs, dotted fields, inbox threads and match counts without indexing (10 hits from #28012, #27686, #27791, #27970) - cli/select.rs (911f25f, #28012): field() cuts the dotted path with str::get; glob() compares and tails with slice get. Every index was in bounds, so the output is unchanged. - hub/inbox.rs (cbe8e60, #27686): first_pr reads the number after the marker with str::get. inbox_unsend matches on (index, noticed, notice is none), with the same three outcomes in the same order. - hub/mod.rs (fe3152a, #27791): local_match_counts bumps its slot with get_mut. - hub/queue.rs (46ed428, #27970): the transfer id is read with get. Tests add multibyte names, keys and PR markers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-d9e7e9f7fb2b87a57d5f * acpmux: ACP session/list paging without indexing (5 indexing_slicing hits from #28161) #28161 (4543835) landed while this PR was in review: - hub/session_pages.rs: byte_page's sort key reads each key with get. Every index comes from enumerate, so the order is unchanged. - server/list_reply.rs: sessions and updatedAt are read with get (a missing value is Null, as before), and nextCursor is written via JsonSet::set. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-d9e7e9f7fb2b87a57d5f * panic ratchet: lower acpmux to the measured counts (indexing_slicing 731 -> 686, string_slice 97 -> 94, unwrap_used 144 -> 143) #28169 raised the acpmux baseline to the counts base had then, so the hits fixed here could come back unnoticed. Measured at fdb6218 (fast-checks run 41080915558). PR CI now runs the ratchet too (#28169), so a PR that adds a hit is caught before it lands. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-d9e7e9f7fb2b87a57d5f * acpmux: read ls row tags with get (the hit #28369 added to the panic ratchet) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-d9e7e9f7fb2b87a57d5f --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
Shipped in:
|
… changes (#28699) cmux-tui-spec.yml's clippy job judges a PR's Rust against the rust-panic-baseline.json rows at its own merge. A row lowered on the base after that left the green standing, so #28182 (6 acpmux indexing hits) and #28369 (1) landed over rows lowered since their checks ran. The baseline is already a check path, so a merger dispatches the fast gates for such a PR. On a dispatch, prepare now writes ratchet=true when the tip lowered a deny-lint row of a crate the PR changes (any row, for a workspace-wide Rust input) since the merge base. The new panic-ratchet job then lints those packages at the tip and on the merge (cmux-tui-clippy-changed.py --compare-base) and the ratchet (--base-clippy-json) fails only on counts over the tip's row that the tip does not already reach, so a base ratchet red never reads as the PR's. post fails the status unless that job passed or was skipped. Agent-Session: https://cmux.com/deeplink/agent?id=aid-7e68dca28911d1051663 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Summary
Review boxes started by
lane-place new --review(harnesscodex-review-box) were getting the inbox notice from #27686 ("[inbox] New messages from other agents in N thread...") steered into their review turn. A coordinator found: "The reviewer then reads the thread instead of reviewing and ends with no SHIP/BLOCK verdict."With this change a review box has no inbox, and no other agent's message steers into its turn:
review_box.rs: one predicate for "is a review box" (harness ends with-review-box, or a livereview.tag).acpmux ls(cli/ls_table.rs) now uses it too, so the two can't drift apart.hub/inbox.rsinbox_route: a review box takes no inbox item. A message to it goes the way it did before acpmux: every chat's inbox; another agent's plain send is never a turn of its own (A1) #27686.hub/turns.rs: another agent's message to a review box's running turn never steers in, even though agent sends steer by default. It queues behind the review and runs as a turn of its own after the review ends. That turn's answer goes back to the sender'ssession/prompt, so no sender is left waiting. A steer-only send gets an error withreviewBox: true. The person's own steer and Send now still go in.hub/inbox.rsinbox_review/notice_held: no inbox notice steers into a review box's turn. Messages its inbox took before it became one (areview.tag set later) wait for the turn's end, as an idle chat's do.notice_heldis also checked as the steer is written (steer_end.rs).hub/inbox_digest.rs:session inbox --digestrefuses a review box (inbox_digest.review_box), so each agent message stays its own prompt.steer: false, and only the person's Send now changes that. So the queued path never steers into the running turn.inbox.rssay review boxes are left out, and why.Follows #27686.
Testing
Regression tests in
tests/hub_integration/agent_inbox.rs, each committed before its fix:a_review_box_takes_no_inbox_message_and_no_steer_during_its_review: an agent message to a review box during its turn makes no inbox item, no notice and no steer. It runs as its own turn and the sender getsend_turn. A steer-only send and a digest are refused. The same message to an ordinary chat still goes to that chat's inbox.a_review_box_runs_its_first_prompt_from_another_agent_as_its_task: the task lane-place sends a*-review-boxsession as another agent runs as that prompt, with no notice in its place.an_inbox_message_from_before_the_review_tag_never_steers_into_the_review.a_review_box_harness_or_a_review_tag_marks_one.Command:
cmux-ci test -- cargo test -p acpmux --test hub_integration agent_inbox(plus--lib review_box,--lib inbox,--lib ls_table,inbox_digestandcargo clippy -p acpmux --all-targets -- -D warnings).Observed / Not run
-D warningspassed and all 7agent_inboxtests passed, the new one included (fast-checks runs 41071111850 and 41071584201). The results at the final head are posted as a PR comment.Changelog
Fixed: acpmux review boxes no longer get other agents' messages steered into their review.
Agent session: agent session
🤖 Generated with Claude Code