cmux NEXT sidebar: Priority view follow-ups (palette titles, closing rows, archive check)

Merged
TE
16d ago
+565-112

Follow-ups from the independent reviews of #23527 (Priority row actions) and #23577 (reorder motion) in the cmux NEXT sidebar's Priority view.

  • Palette titles end in "…". Mark Chat as Read…, Pin/Unpin Chat in Priority… and Snooze Chat for 1 Hour… ask which chat from the palette, so they follow #23360's rule. They're now in PaletteMenuVocabularyTests' audited list. The row's own right-click menu already knows the chat, so it reads Mark as Read and Snooze for 1 Hour through ContextMenuPlacement labels, the way ObjectMenuLabels rows do. Pin or Unpin keeps its live per-chat title. The pin title's "Pin or Unpin" also broke paletteTitlesUseTheMenusWords on base, so it now reads Pin/Unpin. English and all 20 translations are updated, and the two menu labels reuse the hover buttons' translations.
  • Archive respects the Priority view setting. Archive Chat on a row's chat (agent-chat:) now has a target reason (ActionTargetReasons), so with the view off it's refused with the same reason as the other three row actions. Archive Chat on the focused chat has no row target and is unchanged.
  • A refused archive has a test. When acpmux refuses an archive, the row comes back.
  • Closing rows ignore clicks. The rows' document skips a closing row in hitTest, so right-clicking one during its ~0.4 s close no longer opens a menu for a chat that just left.
  • Clip guard. Each opening row records the animated placement that will unclip it, like the main list's opens count. If a later move retargets the row, only the end of that later move takes the clip off.
  • Motion-off frames. The motion-off path now sets frames through animator() inside Motion.withoutAnimation, as RowMotion does, so a move already in flight can't leave a stale target.

SidebarPriorityFeed.swift is left unchanged, so this merges cleanly with leo/priority-remote-chats (git merge-tree shows no conflict). The panel change is in SidebarPriorityPanelView.swift only, not SidebarPriorityRowView.swift.

No capture: the only visible change is wording in the Priority row's context menu and three palette titles ("…", "Pin/Unpin", "Mark as Read", "Snooze for 1 Hour"); the motion fixes change no frame a still shows. The strings are checked by ActionSurfaceParityTests, ContextMenuShapeTests and the catalog tests.

Changelog

  • Fixed: In the cmux NEXT sidebar's Priority view, right-clicking a row while it closes no longer opens a menu for the chat that left, and with the view off, archiving from a row is refused like its other actions.

Testing

The tests come first, in 67cb3188b937 on base code; the fixes follow. Fleet runs used Xcode 26.6 via scripts/ci/package-test-lane.sh suite Packages/macOS/CmuxNext <Suites>, and the motion suite was pinned to the display host aws-m4pro-9.

StepRefSuitesResult
pv-prio-fu-67cb3188b9-1tests on basePaletteMenuVocabularyTests, SidebarPriorityRowActionsTestsred: the three titles lack "…", paletteTitlesUseTheMenusWords fails on "Pin or Unpin", and with the view off the row archive runs
pv-prio-fu-67cb3188b9-2tests on baseSidebarPriorityMotionTestsred: aClosingRowTakesNoClicks (the click reached the closing row); the other 7 pass
pv-prio-fu-e50c471cb6-5headPaletteMenuVocabularyTests, SidebarPriorityRowActionsTests, ContextMenuShapeTestsgreen, 25 tests
pv-prio-fu-e50c471cb6-6headSidebarPriorityMotionTestsgreen, 8 tests

cmux-ci compile-check --ref e50c471cb66b --app passed. prepush-gate.py, check-motion.sh and localization_catalog.py check all passed, and the catalog check reports nothing for SidebarSectionActions.xcstrings.

Observed / Not run

  • Observed: the runs above. On base, the refused-archive test, the sidebar-switch-off case and the reorder-during-a-slide test pass; they add coverage and aren't regressions.
  • The clip-guard test (aRowRetargetedWhileItOpensClipsUntilWhole) and the motion-off-during-a-slide test (aChangeWithMotionOffDuringASlideLandsAndStays) also pass on base. On that host neither reviewer scenario reproduced, so they guard the fixes but don't prove the bugs existed.
  • Not run: no live app or capture. The visible change is copy in the palette and the row menu, so there's no media tour.

Agent session: cosmic-gray

🤖 Generated with Claude Code


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


Summary by cubic

Applies follow-up fixes to the cmux NEXT sidebar's Priority view for palette copy, the archive action's view check, and row motion, and regenerates the action exports for the new row menu.

  • Palette titles for the row actions now end in "…" (Mark Chat as Read…, Pin/Unpin Chat in Priority…, Snooze Chat for 1 Hour…) since each asks which chat; the row's own menu names the chat and uses shorter labels.
  • Archive Chat on a row is refused while the Priority view is off, like the other row actions; the focused chat's Archive still runs.
  • A row closing its slot takes no clicks, so right-clicking it during the close opens no menu.
  • A row retargeted while still opening keeps clipping until the later move ends, and motion-off changes land through the animator so a move in flight can't pull rows back.
  • The action exports and plans/cmux-next/action-surfaces.json are regenerated to match the row menu's placement and Archive Chat's now-offered context menu.