Skip to content

acpmux: review boxes get no inbox notice and no other agent's steer - #28369

Merged
teamleaderleo merged 11 commits into
feat-cmux-nextfrom
lane/review-box-inbox
Oct 30, 2026
Merged

teamleaderleo merged 11 commits into
feat-cmux-nextfrom
lane/review-box-inbox

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Review boxes started by lane-place new --review (harness codex-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 live review. tag). acpmux ls (cli/ls_table.rs) now uses it too, so the two can't drift apart.
  • hub/inbox.rs inbox_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's session/prompt, so no sender is left waiting. A steer-only send gets an error with reviewBox: true. The person's own steer and Send now still go in.
  • hub/inbox.rs inbox_review / notice_held: no inbox notice steers into a review box's turn. Messages its inbox took before it became one (a review. tag set later) wait for the turn's end, as an idle chat's do. notice_held is also checked as the steer is written (steer_end.rs).
  • hub/inbox_digest.rs: session inbox --digest refuses a review box (inbox_digest.review_box), so each agent message stays its own prompt.
  • A queued message the person sends with Send now still goes into the turn. That's the person's explicit action, like the person's own steer. The rule is that no other agent's message steers in.
  • Queued entries start with steer: false, and only the person's Send now changes that. So the queued path never steers into the running turn.
  • The module docs at the top of inbox.rs say 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 gets end_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-box session 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.
  • Unit test 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_digest and cargo clippy -p acpmux --all-targets -- -D warnings).

Observed / Not run

  • Observed: rustfmt is clean on the changed files. At 1db550a, clippy -D warnings passed and all 7 agent_inbox tests passed, the new one included (fast-checks runs 41071111850 and 41071584201). The results at the final head are posted as a PR comment.
  • Not run: the red run at the test-only commits. cmux-ci on a lane VM runs only at the PR's head, so the base failure is from reading the code, not from a run.

Changelog

Fixed: acpmux review boxes no longer get other agents' messages steered into their review.

Agent session: agent session

🤖 Generated with Claude Code

teamleaderleo and others added 2 commits October 30, 2026 14:20
…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
@teamleaderleo teamleaderleo added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 30, 2026
@blacksmith-sh

blacksmith-sh Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Found 6 test failures on Blacksmith runners:

Failures

Test View Logs
main.DeveloperIdAppTests.test_download_prints_the_active_profile_only/
test_download_prints_the_active_profile_only
View Logs
stubs: /System/Library/Frameworks/Security.framework/Versions/A/Security has no stub/
Security has no stub
View Logs
stubs: CoreFoundation.tbd: install-name /System/Library/Frameworks/
CoreFoundation.framework/Versions/A/CoreFoundation, missing 1: ['_CFRetain']/
CoreFoundation, missing 1: ['_CFRetain']
View Logs
stubs: CoreFoundation.tbd: install-name /System/Library/Frameworks/
CoreFoundation.framework/Versions/A/CoreFoundation, missing 1: ['_log2']/
CoreFoundation, missing 1: ['_log2']
View Logs
test_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)/
test_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)
View Logs
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)/
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)
View Logs

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

… 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
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · session

teamleaderleo and others added 2 commits October 30, 2026 14:40
…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
@cursor

cursor Bot commented Oct 30, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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
@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review 848bee8: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr28369 -f ref=lane/review-box-inbox -f platform=macos -f backend_mode=local

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
@cursor

cursor Bot commented Oct 30, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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.

teamleaderleo and others added 2 commits October 30, 2026 14:58
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
@cursor

cursor Bot commented Oct 30, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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
@teamleaderleo
teamleaderleo merged commit 364c30d into feat-cmux-next Oct 30, 2026
187 of 190 checks passed
@teamleaderleo
teamleaderleo deleted the lane/review-box-inbox branch October 30, 2026 15:59
teamleaderleo added a commit that referenced this pull request Oct 30, 2026
teamleaderleo added a commit that referenced this pull request Oct 30, 2026
…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>
@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

teamleaderleo added a commit that referenced this pull request Oct 31, 2026
… 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>

This branch was previously deployed

3 inactive deployments
artifacts — 848bee87 Deployed Oct 30, 2026 by teamleaderleo via add the Windows daemon to the tree #83841
sentry-dsyms — 848bee87 Deployed Oct 30, 2026 by teamleaderleo via upload cmux-tui dSYMs to Sentry #83841
ci-routing-agent — 848bee87 Deployed Oct 30, 2026 by teamleaderleo via cmux-tui tree preflight #83841
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant