Skip to content

acpmux: the sidebar Priority view's ranking and lane windows with row diffs (A6, PR 1) - #31839

Open
lawrencecchen wants to merge 12 commits into
feat-cmux-nextfrom
rust-migration/agent-activity
Open

lawrencecchen wants to merge 12 commits into
feat-cmux-nextfrom
rust-migration/agent-activity

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Summary

The Mac app copies every acpmux lane into AgentLaneStore and ranks all of them for the sidebar's Priority view on the main thread (AgentPriorityRanking.swift). It does this at each lane change, and lanes change many times a second while agents work. Layer ownership (plans/cmux-next/layer-ownership.md, rule 1 and L7) says acpmux must own this list and send a client only its visible window as row diffs.

This PR is the Rust half (rust-migration A6, PR 1 of 2). It changes acpmux only. The app does not use it yet.

  • hub/priority.rs: the lane model read from a session summary's lane, and the ranking. The rules are the same as the Swift code: needs-you, then unseen result, then failed or lost, then Red CI, then working, then idle. Inside a tier: pinned first, then the newest change, then the id. A dragged chat stays at its place. Snoozed and archived chats are left out. Idle chats past the 24 h horizon are left out unless pinned or placed. A read or snooze mark holds only for the lane state it was made on. The stamp text is the same as the app's (state@<ms>). Also here: Go to Next Agent Needing Input's order and its wrap-around.
  • hub/priority_marks.rs: the person's marks (pinned, read, snoozed, archived, dragged place, folded). acpmux owns one copy for every window of every connection, kept in $ACPMUX_HOME/priority-marks.json. A client hands the app's saved copy over one time (importMarks, the app's JSONEncoder shape), and acpmux takes it only while it has no marks of its own. So a client sends importMarks with its first open. The ownership table in layer-ownership.md has the new row.
  • hub/priority_window.rs: a window over the lanes with row diffs and a revision, in the _acpmux/chats_window pattern. It has two kinds:
    • priority: the Priority view. The client sends the ids with failing checks, the ids open in a tab, whether the view is shown, how rows name machines (localMachine, peerNames), and the lanes it reads from other owners (the Chief home's acpmux, other machines' trees, with archivable when the client has the owner's socket). Each message also carries needingInput, attentionCount and nextChangeMs.
    • links: the session tree's per-session links and state. A new step of an agent sends nothing.
  • server/priority_windows.rs: _acpmux/priority_window, _acpmux/priority_window_close, _acpmux/priority_mark and _acpmux/priority_next, on the local unix socket only.
    • There is one task per connection. Each lane-changing record updates the connection's lane set in place, and the task reads only the summary of the session that changed.
    • A lagged channel, a lagged peer link or a peer state change reads every lane again.
    • A marks change from any connection, an open, a mark or the clock (a snooze ends, an idle chat ages out) recomputes the windows.
    • The task ends with the connection or with its last window.
  • Registered in the protocol IR (spec/acpmux-protocol.json, the generated web method list) and advertised as capability priority-window-v1.

PR 2 (Swift reads the window, deletes AgentPriorityRanking, the UserDefaults marks store and the whole-store reads) waits for rm-sidebar-mapping and shortcut-latency SL-5, as the lead decided. For PR 2: the archive mark only hides the chat. The app still sends _acpmux/archive to the owner and unarchives when that fails, as today. The Agent Activity page half of A6 is deferred (A6a: its data owner is cmux-cua, not acpmux).

No app FFI change, so there is no pin step.

Known differences from the Swift rule (accepted by the lead)

  • When acpmux removes its own lane and a peer has a row with the same id, the peer row shows only at the next full read of the lanes. A full read happens on a channel lag, a peer link state change, or a window open on a new connection. Until then the person sees no row for that chat. This needs a peer and a local session with the same id, which is rare.
  • An empty sessionId, name or peer string in a summary is dropped. Swift kept it.
  • The marks file is read one time per daemon, on first use, with a blocking read of a small file.

Testing

The Swift tests of the rule (AgentPriorityRankingTests, AgentLanesTests) are ported as hub/priority_tests.rs, with the same lanes, marks, clock and expected orders. The window, the marks store and the event classification have unit tests (hub/priority_window_tests.rs, hub/priority_marks.rs, server/priority_windows.rs). tests/priority_window.rs runs the windows over served connections with a stand-in agent.

All steps run scripts/ci/cmux-tui-rust-check.sh on Linux.

Step Ref Filter Result
Red, rule not moved b6bb0607cc3 priority 91a2f7a280372d027bcf0f7d: 13 of 20 priority tests failed, as planned
Green, rule moved 9360dbbb5fe priority f4a02dc5a747686d29044d84: 40 run, 40 passed
Green d9cb27046d2 priority 6d239bed93415f76b67c1f20: passed
Green 790308af0f0 priority 12288c440f3e2560d5a42132: passed
Red, a mark lost in another window 1f8d5493864 a_mark_shows_in_another_window d991b11b5feedce52a207724: failed as planned. It ran exactly 1 test (1 test run: 0 passed, 1 failed), which timed out at tests/priority_window.rs:59: the mark never reached the second window
Red, archive of another machine's chat dcf36ba201e archive_is_refused 55045f843324743cf1a261ff: failed as planned at hub/priority_window_tests.rs:353 (another machine's chat was archived)
Green, both fixes 127885c3ba2 priority 0fdef5232d4438855d105cd5: passed (done 06:19:56Z)
Green, integration tests 127885c3ba2 a_mark_shows 16e6b6170da62332ae7c5e9c: cancelled by me at 06:20Z, because the merge of feat-cmux-next (head 5875cbc0368) replaced that head (fleet rule 5)
Clippy, merge head 5875cbc0368 clippy 9c018fb38d749bc7567a9175: failed only on a new base red from #31770 (3 errors in cmux-tui-core/src/mux/agent_chat_notices.rs, fixed by #31907); nothing in acpmux
Clippy, scratch proof ref (never merge) 7b0399ef2bd = 5875cbc0368 + #31907's e7ecb66ba00 clippy ff6fa7fd4d1663977d53947a: passed. cargo clippy --workspace --all-targets -- -D warnings linted acpmux (its build line is in the log) and reported 0 errors, exit 0. Branch rust-migration/scratch-agent-activity-clippy is listed as never-merge; #31907's commit is not in this PR
Green, merge head 5875cbc0368 priority 603a0a8027cde404b9cf36ff: passed (49 run, 49 passed; done 06:34:25Z)
Green x5, window unit tests, merge head 5875cbc0368 priority_window e8ecda1f98c8abf8e63e4647, 4aa19f83460771b28584bf78, 7a12b9d5133620e835319759, 7b411dd810d3cd01e636f9ce, 8eaa1c46e2a5f6a9a0567854: 5 of 5 passed (15 run, 15 passed each). This filter matches test names, not the test binary, so it does not select the two timed integration tests
Green x5, timed integration tests, merge head 5875cbc0368 a_mark_shows (selects the 2 timed tests) run 1 ec8a7197cbd5db368496a56c: no verdict, infra (Blacksmith run 41401447028 stopped in a git fetch before cargo ran; no test ran); rerun once as 85fab18d74bc2074d69a9be8 (--tag infra-rerun, fleet rule 14): PENDING. Run 2 caf85298b1866ad8113383f9: 2 tests run, 2 passed. Run 3 ced610a222e4b7eab076322d: PENDING. Run 4 49a6761f911b42acd9eae7f6: PENDING. Run 5 ee2a4f283e9b6c4e14bdff37: PENDING. The lead's rule: 5 real passes of the 2 timed tests

Clippy at d9cb27046d2 (3e456ce82e287751163697e5), 790308af0f0 (bccb0d8b6cb5073c5bef02d3) and 127885c3ba2 (983f4338f463c5d38e289818) failed only at crates/cmux-tui/src/plugin_manager.rs:233 (suspicious_open_options). That is a base red, which #31697 on feat-cmux-next fixes. Head 5875cbc0368 merges feat-cmux-next (with #31697) by a merge commit. This PR's own diff against feat-cmux-next is the same before and after that merge, and the protocol codegen check passes.

Observed / Not run

  • Observed: the fleet steps above. On this VM: rustfmt --check on every changed Rust file, prepush-gate.py (no new violations), scripts/web-lint.sh (passed), acpmux-protocol:codegen regenerated, and the god-file check on the new files (clean).
  • Not run: the full acpmux suite (CI runs it). No perf A/B: nothing in the app calls this yet (PR 2 runs it).

Changelog

none

Proof

No capture: daemon only; no UI reads the window yet.

… not moved yet)

The Mac app ranks every acpmux lane it mirrors (AgentPriorityRanking.swift) on the main
thread at each lane change. This commit adds the acpmux side of the move: the lane model,
the person's marks, the window over the lanes (_acpmux/priority_window, row diffs with a
revision) and its server task, with the Swift tests of the rule ported as Rust tests
(AgentPriorityRankingTests, AgentLanesTests).

Red on purpose: Ranking::entries returns the lanes unranked and next_change returns None,
so the ported ranking tests fail. The next commit moves the rule.
…om AgentPriorityRanking.swift)

Ranking::entries orders the lanes as the app did: needs-you, unseen result, failed or
lost, Red CI, working, idle; pinned first in a tier, then the newest change, then the id;
a dragged chat at its place; snoozed and archived chats out, idle ones past the horizon
out unless pinned or placed. next_change says when a snooze ends or an idle chat ages out.
@lawrencecchen lawrencecchen added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Nov 2, 2026
@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 61d9fab: 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=pr31839 -f ref=rust-migration/agent-activity -f platform=macos -f backend_mode=local

Probably yours: agent-pane-scrollbar-edge.test.ts, session-info-layout-still.test.ts fails here but not on main's latest full suite. Seen on other PRs too (likely flaky): agent-pane-scrollbar-edge.test.ts, agent-pane-scrollbar-edge.test.ts, page-commands-palette.test.ts and 3 more.

CI failed on 028f41444f (run 41431955946 attempt 1): 1 code, 1 unknown.

Job Verdict Why
web / react-apps-base-check (1) code a web test failed
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Failures:

  • seen on other PRs agent-pane-scrollbar-edge.test.ts 560px, header quick tools true: scrollbar stays at pane edge: failed (job)
  • seen on other PRs agent-pane-scrollbar-edge.test.ts 560px, header quick tools false: scrollbar stays at pane edge: failed (job)
  • new in this PR agent-pane-scrollbar-edge.test.ts 900px, header quick tools true: scrollbar stays at pane edge: failed (job)
  • seen on other PRs page-commands-palette.test.ts Session Info's Subagents and Background tasks are offered while they have rows, and open there: failed (job)
  • seen on other PRs session-info-layout-still.test.ts chromium: in a 560px pane, opening, folding and closing Session Info moves nothing else: failed (job)
  • seen on other PRs session-info-layout-still.test.ts chromium: in a 900px pane, opening, folding and closing Session Info moves nothing else: failed (job)
  • seen on other PRs session-info-layout-still.test.ts chromium: in a 1200px pane, opening, folding and closing Session Info moves nothing else: failed (job)
  • new in this PR session-info-layout-still.test.ts chromium: in a 1600px pane, opening, folding and closing Session Info moves nothing else: failed (job)
Matched log lines
web / react-apps-base-check (1): (fail) 560px, header quick tools true: scrollbar stays at pane edge [31169.42ms]

Not re-run automatically: web / react-apps-base-check (1), web / react-apps-check are not machine failures.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on 18de50c to compare; do not merge until green; see lane-rules
red: web / Web status; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules
red: web / react-apps-base-check (1); it named no new red test (setup or base replay failed; see its log); do not merge until green; see lane-rules
red: web / react-apps-check; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules

Gallery before/after for 028f414: 16 states rendered, 0 images differ, 2973 more touched states not rendered. Images are in the run's artifact, not on this public PR; the independent review of this head reads them on its own, so the PR needs no hand-made screenshots of these states.

gh run download 41431955290 -R manaflow-ai/cmux -n gallery-advisory-31839-028f41444f20c6be67eef1079b69669a80d0d751 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.live-chat-watch/choice-alone Apple System Colors Light unchanged 0% imports methods.ts (1 hops)
agent-pane.live-chat-watch/choice-alone Apple System Colors unchanged 0% imports methods.ts (1 hops)
agent-pane.live-chat-watch/view-only Apple System Colors Light unchanged 0% imports methods.ts (1 hops)
agent-pane.live-chat-watch/view-only Apple System Colors unchanged 0% imports methods.ts (1 hops)
agent-pane.live-chat-watch/take-over-refused Apple System Colors Light unchanged 0% imports methods.ts (1 hops)
agent-pane.live-chat-watch/take-over-refused Apple System Colors unchanged 0% imports methods.ts (1 hops)
agent-pane.approval-edits/single Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.approval-edits/single Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.approval-edits/grouped Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.approval-edits/grouped Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.approval-edits/single-multiedit Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.approval-edits/single-multiedit Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.approval-edits/grouped-multiedit Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.approval-edits/grouped-multiedit Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.approval-edits/single-long Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.approval-edits/single-long Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.approval-edits/grouped-long Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.approval-edits/grouped-long Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.auth-health/signed-in Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.auth-health/signed-in Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.auth-health/signed-out Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.auth-health/signed-out Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.auth-health/expired Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.auth-health/expired Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.auth-health/unknown Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.auth-health/unknown Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.chat-width/standard Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.chat-width/standard Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.chat-width/wide Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.chat-width/wide Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.chat-width/wide-blocks Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.chat-width/wide-blocks Apple System Colors unchanged 0% imports methods.ts (2 hops)

Pick other states with a Gallery: entry.id, entry.id/variant line in the PR body.

@blacksmith-sh

blacksmith-sh Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Found 18 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmp01cdxc51/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmpdyd64b6r/summary-missing.json (live):/summary-missing.json (live): View Logs
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows/
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows
View Logs
[new_workspaces] the window draws no frames/[new_workspaces] the window draws no frames View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs
test/page-commands-palette.test.ts/page-commands-palette.test View Logs
test/page-commands-palette.test.ts/page-commands-palette.test View Logs
test/session-info-layout-still.test.ts/session-info-layout-still.test View Logs
test/session-info-layout-still.test.ts/session-info-layout-still.test View Logs

...and 8 more test failures. View all on Blacksmith

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

… a mark at once

An end-to-end test over a served connection: a new chat and its turn reach an open window
with no new request, only the rows whose value changed are sent, a pin and a drag change
the rows at once, Go to Next Agent Needing Input stops only at a chat that asks, a mark on
an unknown chat is refused and an older spec of the window is stale.
…ght, and the daemon owns the marks

Review of #31839 (NOT SHIP at d9cb270):
- The task woke at nextChangeMs only by chance: open and mark now wake it, so it reads the
  window's next wake time after its first message. Test: a snooze of 400 ms ends with no
  other change, in two windows.
- A peer link lag (summary null) removed that peer's lanes: it now reads every lane again.
  A peer's question changes no lane.
- A peer's purge wrote the removed row's lane back: a purge now removes the lane, peer or not.
- A peer's row never replaces or removes this daemon's lane of the same id; this daemon's
  lane is read by its exact id, not a prefix.
- The marks were the client's, sent again with each spec (two writers): they are now the
  daemon's, one copy for every window of every connection (hub/priority_marks.rs), kept in
  $ACPMUX_HOME/priority-marks.json. A spec's importMarks hands over the app's saved copy (its
  JSONEncoder shape: a snooze's Date as seconds since 2001) only while acpmux has none.
- Rows name their machine as the app did: localMachine and peerNames in the spec.
- Archive needs a chat the window lists, as the app's did; refreshes skip when no lane changed.
- The stamp test uses fixed values; the ownership table names the new owner.
@cursor

cursor Bot commented Nov 2, 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.

…le lane-neutral records arrive (red)

Review of #31839 at 790308a, finding 1: a record that changes no lane, drained in the
same turn as a marks change, made refresh return before it recomputed the windows, so the
mark never showed in another connection's window while the daemon was busy. Four
connections write tags back to back while a fifth pins and unpins a chat twenty times; each
mark must reach the second window. The snooze test's snooze is 3 s, so a slow runner still
sees it before it ends.
…e Priority windows

refresh returned before it recomputed the windows when the lane records it was given changed
no lane, even when a marks change, an open or the clock had woken it in the same turn: the
mark was lost until a later lane change. It now returns early only when lane records alone
woke it. Also: the marks module says its file is read once at first use, and that a client
sends importMarks with its first open.
@lawrencecchen

Copy link
Copy Markdown
Contributor Author

Review (claude-reviewer): SHIP at 3fef388

Checked by reading only (no cargo or swift on this machine), over three rounds (d9cb270, 790308a, 3fef388):

  • The Rust ranking is the same as AgentPriorityRanking.swift: tiers, pin order, the order by since (missing last), the id tiebreak, dragged rows, read and snooze stamps (the same text as the app's Date round trip), the idle horizon, next_change, needing_input and next_after. The Swift tests are ported with the same expected values.
  • Server task: the clock wake, the marks watch, the open, close and mark notify, the peer lag rebuild, the peer purge, the exact id lookup, a peer row that never replaces a local lane, and the local socket only. No std lock is held across an await.
  • 3fef388: refresh now recomputes whenever the marks, a spec or the clock woke it, and returns early only for lane records that changed no lane. The clock wake stays bounded: next_change keeps only times after now, and an unchanged view still moves the wake time. The red test (1f8d549) uses _acpmux/tag records, which reach lane_after but change no lane. Without the fix, a marks change that arrives in the same turn as one of them is lost. With four writers, 20 rounds and a broadcast buffer of 8192, I expect the test to fail on the base almost every run, and to pass with the fix.
  • The registry, the spec JSON, the capability list (now with priority_lagged) and the generated methods.ts agree.
  • Known differences, to name in the PR body: archive of a chat that only the client reports; a peer row that comes back only at the next rebuild after a local lane goes; empty-string fields.

The app refused Archive for a chat no acpmux socket of its own listed (another machine's chat
tab) and kept it for this daemon's and the Chief home's (AgentPriorityChats.archive). The
window accepted it for any chat it listed. Lead decision on #31839: a move keeps behavior.
… app did

A reported lane carries archivable when the client has its owning acpmux's socket (the Chief
home's); this daemon's own lanes are always archivable. Another machine's chat tab is not:
the app had no acpmux to archive it (AgentPriorityChats.archive).
@cursor

cursor Bot commented Nov 2, 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.

@lawrencecchen

Copy link
Copy Markdown
Contributor Author

Review (claude-reviewer): SHIP at 127885c

I read the code changed since my SHIP at 3fef388 (dcf36ba red test, 127885c fix). I did not compile or run tests on this machine.

  • Archive now gives the same result as AgentPriorityChats.archive. Swift archives when the first store that lists the id has a socket. Rust allows the archive when this daemon's lane set has the id, or when the client's lane says archivable. This daemon's lane set holds the peer rows it mirrors, so a peer chat can be archived here as it could from AgentLaneStore.shared in Swift. When both list the id, this daemon's lane wins, as the first store did in Swift. Another machine's chat, sent with no archivable, is refused.
  • The mark is still only the hide. The client must still send _acpmux/archive to the owning acpmux and unarchive if that fails, as Swift did. That is PR 2's work.
  • No regressions found. Lane is built only in Lane::of and in the test helper, and both set the new field. Pin, read and snooze are the same as before.
  • Nit: the doc line at hub/priority_window.rs:17 is 161 characters. rustfmt does not wrap comments, so no check fails.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Review (next-review patch-id; carried): SHIP at 5875cbc

The independent SHIP at 127885c carries to this head: the PR's own change (git diff $(git merge-base feat-cmux-next HEAD) HEAD) has the same git patch-id --verbatim (fa5ecef1cfd3528c) at both heads, and no merge between them was resolved by hand. Nothing new to review. A newer BLOCK, or any change to the PR's own diff, ends the carry.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Review (next-review patch-id; carried): SHIP at 61d9fab

The independent SHIP at 127885c carries to this head: the PR's own change (git diff $(git merge-base feat-cmux-next HEAD) HEAD) has the same git patch-id --verbatim (fa5ecef1cfd3528c) at both heads, and no merge between them was resolved by hand. Nothing new to review. A newer BLOCK, or any change to the PR's own diff, ends the carry.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Review (next-review patch-id; carried): SHIP at 9967317

The independent SHIP at 127885c carries to this head: the PR's own change (git diff $(git merge-base feat-cmux-next HEAD) HEAD) has the same git patch-id --verbatim (fa5ecef1cfd3528c) at both heads, and no merge between them was resolved by hand. Nothing new to review. A newer BLOCK, or any change to the PR's own diff, ends the carry.

@cursor

cursor Bot commented Nov 2, 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

Copy link
Copy Markdown
Collaborator

Review (codex gpt-6.1-sol xhigh, next-review): BLOCK at 028f414

BLOCK at 028f414
Visual verdict: unchanged by this diff

  1. [P1] [blocking] priority_window.rs:322: Pruning uses only the requesting window’s lanes but deletes daemon-wide marks. If connection A reports and pins an external chat, connection B can permanently erase its marks by pruning without that lane, even while A still lists it. Scope pruning to authoritative ownership information.

  2. [P1] [blocking] priority_marks.rs:136: An interrupted write can leave priority-marks.json.importing. The atomic writer refuses an existing temporary path, and this store never recovers it. Every subsequent save then fails while mark requests report success, losing those changes on restart. Recover orphaned temporary files or use fresh temporary paths.

  3. [P2] [follow-up] priority_window.rs:417: Include marks.collapsed in the window-wide state. Currently neither initial messages nor later diffs carry it, and changing collapse leaves the view equal, suppressing notifications to other windows.

Rust tests could not run because Cargo is unavailable.

Follow-ups:

This branch was previously deployed

3 inactive deployments
artifacts — 028f4144 Deployed Nov 2, 2026 by cmux-bot[bot] via publish tree-addressed cmux-tui #100772
sentry-dsyms — 028f4144 Deployed Nov 2, 2026 by cmux-bot[bot] via upload cmux-tui dSYMs to Sentry #100772
ci-routing-agent — 028f4144 Deployed Nov 2, 2026 by cmux-bot[bot] via cmux-tui tree preflight #100772
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.

2 participants