fix(sidebar): keep a group when its last workspace closes
Closing a group's last workspace now leaves its header in place. The sidebar's immediate edit keeps the group. Daemon close sync and remote-close forwarding use the existing item deletion operation, preserving the empty ancestors with the currently shipped app FFI; the existing row exit animation has no disappearing/reappearing header to animate.
Leo, 2026-11-01:
what do you feel about this placeholder situation? idk doesn't that plceholder text seem a bit wack? also closing the last workspace in a group it's like the group isn't sure if it wants to close too or not but the animation gets weird. just leave it; we don't need to close the group automatically the last workspace in it gets closed too. just don't do a weird jitter indecisive animation
Explicit Close Group, move/reorder cleanup and unpinning keep their current behavior. Sections that retain closed workspace items still retain them. Empty-group placeholder presentation is separate (#30298). Risk: ordinary closes now preserve empty groups, including nested groups. No FFI ABI or binary pin change is needed.
Validation at 7d8a27219ceaee4ebe9d04184fbd71fc5b094667:
- App compile passed (62 s; fleet step
e117285372051701212df3cc). SidebarCloseSelectionTests: all 10 tests passed.SidebarDocReshowCloseTests: all 4 connected/disconnected × keeps-closed cases passed (fleet step537fce37caa8b5ca2ed6f24e). The connected-remote case failed before the final repair in step3cdeb030dac328921022fb3a, then passed with the shipped app FFI.- Daemon workspace-placement integration tests passed, including nested-group close/restart/reopen (run 41282063025, 121 s; receipt pins the tested head above).
- Independent Claude Opus 5.5 medium review: SHIP at this exact head.
No webview suite is routed by these paths.
Design: design/sidebar.md; implementation note in plans/cmux-next/sidebar-owner.md. Nonblocking follow-ups: legacy-sidebar projection #30311 and consolidation of ordinary-close policy into the shared API #30352.
Agent session: agent session