Repository navigation
fix(cmux NEXT sidebar): a move the daemon did not answer in time is sent again, never undone - #34785
Conversation
…ed on base) Leo, 2026-11-03, on "Move did not apply: set-personal-workspace: timed out: workspace.place (no reply within 2.0 seconds)". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa
…ent again, never undone Leo: "we have the optimistic moving/animation which is good... THEN WE UNDO IT!!! WHICH IS BAD!!!", on "Move did not apply: set-personal-workspace: timed out: workspace.place (no reply within 2.0 seconds)". A missed deadline or a lost connection is not a refusal. Personal organization writes that set absolute values (workspace group and place, group order, name, color, pin, icon) now keep the optimistic state and go again with backoff (0.25 s doubling to 5 s) until the daemon answers (DaemonService.performUntilAnswered). Only a definite refusal rolls back and toasts. A newer write to the same workspace or group field supersedes a retry (PersonalWriteLedger, last write wins). The placement queue still serializes, but releases its action tickets at the first unanswered try so no script waits on retries. Retries stop at a connection shutdown. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa
… error (review F1) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa
|
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)
Shipped in:
|
|
Review (subagent, claude-opus-5-5 medium, correctness): SHIP at c529fee Visual verdict: unchanged by this diff (no UI layout change; optimistic rows are now kept on an unanswered write). Follow-ups:
|
|
Review (codex, router-review): SHIP at c529fee Reviewer: codex gpt-6-astra high, fast tier. Follow-ups: 5. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward. SHIP at c529fee Visual verdict: no images; Leo tries the build
Follow-ups:
|
|
Finding outcome: comment-6622939697/F1 fixed ecdf851 |
|
Swift logic follow-up (tip watcher swift-logic row, STATUS 13027 "SWIFT LOGIC CULPRITS"; lead order). This PR raised
plans/cmux-next/layer-ownership.md says Rust owns every state, list and rule and Swift is the platform shell. Please move the new logic of this PR in a follow-up: to Rust (the crate that owns the area; the owner lists in STATUS 12147-12165 name the target per area), or at least out of the app into its package. If a declaration above is platform code (AppKit, Core Animation, OS calls, strings, tokens, DEBUG tooling), reply here and the table gets a PLATFORM row with your reason instead. The swift-logic row is a report, not a gate: nothing blocks on this comment. |
Leo, on "Move did not apply: set-personal-workspace: timed out: workspace.place (no reply within 2.0 seconds)":
What changed
A missed deadline or a lost connection is not a refusal. Sidebar organization writes that set absolute values no longer roll back when the daemon is slow. That covers a workspace's group and place (drag, Move to Group, Remove from Group), and a group's order, name, color, pin and icon.
DaemonService.performUntilAnsweredsends the same request again, spaced byBackoff(0.25 s doubling to 5 s), until the daemon answers. No toast shows while it retries.PersonalWriteLedgerrecords a claim for each workspace or group field when the person acts. A newer claim stops an older retry before its next send.releaseHeld), so a CLI or script action ends and reads that the move may still apply, instead of waiting on retries.Is it safe to repeat? Yes.
set_personal_workspace_in(cmux-tui-core) writes the group column and moves the row to an absolute index, so sending it twice lands the same state.workspace_grouporder, name, color, pin and icon are absolute sets too.Not retried:
create-personal-group. A second create would make a second group. It keeps its rollback (follow-up below).Why
workspace.placetook more than 2 s#34628 (landed today) already fixed this. Journal maintenance's roster catch-up scanned every non-output journal entry each tick: 5.6M rows on the nightly registry, 5-8 s. That held up
workspace.placebehind it. The read is now a skip scan, 5 ms instead of 330 ms warm. This PR makes the client correct for any slow answer that remains.Verification
PlacementWriteOrderTests/anUnansweredPlacementIsSentAgainNotUndone: the fake daemon drops the firstset-personal-workspace. The test expects no notice, the moves kept, and all three landing in order after one resend.cmux-ci run --class light --script scripts/ci/package-test-lane.sh --arg=suite --arg=Packages/macOS/CmuxNext --arg=PlacementWriteOrderTests, step dd9332b5f79c, failed.disconnectmode now expects the rows to keep the moves and no notice to show.PersonalWriteLedgerTestscovers which errors count as unanswered and the supersede rule.SidebarOptimisticSaveTests: the rename-with-no-daemon test now expects the name to stay with no error.Observed / Not run
leo-named-fix, and anything CI finds gets fixed forward. Not tried in a DEV build.Follow-ups (review)
notConnectedscope failure readsmayHaveApplied: falseeven though the write is sent again.create-personal-groupcould retry with a stable idempotency key.Changelog
Fixed: A sidebar move or group edit no longer snaps back with "Move did not apply" when cmux's background service is slow to answer.
Agent session: agent session
🤖 Generated with Claude Code