cmux NEXT sidebar: pinned workspaces are rows at the top; no pin on unpinned rows
Leo-ask: ask-76f8847101
Leo-ask: ask-9c4510da61 ("but that's not even depicted as pinned on it tho what is it how is it"): a pinned row now draws the pin glyph.
Leo, 2026-10-21, his exact words: "lawrence only wants the pin symbol on if turned on in 3 dots? i take it to mean no empty pin symbol by default... but also i think the pinned thing the existing version is WEIRD it should just be on the sidebar instead of to teh left of it..."
Lawrence's preference, as relayed: the pin symbol shows only when Pin Workspace is turned on in the workspace's ā® menu.
What changes
- No pin on an unpinned row. The expanded-density row's hover pin button is gone, so an unpinned row draws no pin at rest or on hover, at any density. Pin Workspace / Unpin Workspace stay in the ā® menu (and the palette, CLI and MCP); the pin model, the menu items and persistence are unchanged.
- A pinned row shows a pin. A pinned workspace's row draws a quiet pin glyph before its title (
WorkspaceRowContent.pinned, tertiary ink), and VoiceOver reads "Pinned". A workspace pinned inside its group gets the glyph too. - Pinned workspaces are rows in the list, not tiles. On the sidebar document, a workspace at the top level of
sec_pinnedno longer draws as a tile in the Pinned block.SidebarDocProjectionlists it inpinnedWorkspaces,SidebarDocSectionsmaps it with its own machine (so a Chief workspace keeps its realMachineIDand its title rule), andarrangelists it as a normal workspace row in a Pinned area at the top of the list, in the document's order. A closed pinned workspace lists as an item row with its stored name. On daemons without the document, the legacy Pinned section already listed rows; those rows now draw the glyph as well.
What stays in the top band
sec_top is untouched: Home, the App Store and the Chief built-in still draw there. Non-workspace items a person put in Pinned (links, tabs, apps) keep Pinned's own arrangement, and pinned groups still list as header and member rows. Only pinned workspaces stop being tiles.
Tests
SidebarPinnedWorkspaceRowsTests (new):
anUnpinnedRowDrawsNoPinAtRestOrOnHover(compact and expanded): fails on the old code, which showed a hover pin on an expanded row.aPinnedRowDrawsItsPinAtRestAndOnHover: a pinned row draws exactly one pin, sits above the list's rows, and its label says Pinned.aPinnedWorkspaceIsNoTileInPinned: Pinned's block holds no workspace item; on the old code the pinned workspace was a tile there.aPinnedWorkspaceListsAsARowAtTheTopOfTheList: the Pinned area comes before the machine list, the workspace lists once, and only pinned rows are marked. Arranging again changes nothing.theBridgeMapsAPinnedWorkspaceWithItsMachineunpinPutsTheRowBackInItsMachineListWithoutItsPin: the document'sunpin(what ā® > Unpin Workspace runs) takes the row out of Pinned and drops its glyph.
The new tests don't compile against the base (they use the new pinned field), so the red half is the old behaviour each one names above, not a recorded base run.
Observed / Not run
- Fleet at head
a73d00460038cd1997207543c63835c4b132a022(running when this PR was opened; results follow in a comment):cmux-ci compile-check --app: job99f1382ce298aa4c430ddd76.- CmuxNext suites (SidebarPinnedWorkspaceRowsTests, SidebarDocArrangeIdempotenceTests, SidebarDocPinnedGroupTests, SidebarDocPinInGroupTests, ChiefWorkspaceRowsTests, WorkspaceRowHoverMotionTests, SidebarPinnedRowWidthTests, MouseDownSelectsTests, SidebarRowNoDoneTests, SidebarIncrementalMatchesRebuildGapsTests, SidebarDocPinnedDropTests, SidebarGroupDragRailTests): step
69b25b76e89e2215b30eeb94.
- An earlier head (
24da758) failed compile-check (static member 'titled'used on an instance); fixed ina73d004. scripts/cmux-next/prepush-gate.py: no new violations.- Not run: captures and the Codex xhigh review. Both come after the hold lifts.
Overlaps
- #23933 (chief-sidebar-2, held): no shared file. chief-sidebar-2 was told about the top-band change and said pinned Chief and agent-made workspace pins becoming rows is fine.
- #23783 (dog-ear close) moves the expanded row's hover pin; whichever lands second drops
pinButton/layoutPinin the rebase. - #23800 (uniform spacing) and #24187 (row motion) touch neighbouring sidebar files, but not these lines.
Changelog
- Changed: Pinned workspaces list as rows at the top of the sidebar with a pin before their name; unpinned rows show no pin.
Agent session: cosmic-gray
š¤ Generated with Claude Code
![View with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v3-3x.png)
![Autofix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark-3x.png)
Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Pinned workspaces now render as normal rows at the top of the sidebar with a pin glyph before their title, and no row draws a pin control at rest or on hover.
Behavior changes
- The expanded row's hover pin button is gone; Pin/Unpin Workspace stays in the ā® menu, palette, CLI, and MCP.
- A pinned row draws a quiet pin glyph before its title (including a member pinned inside its group), and VoiceOver announces "Pinned".
- On the sidebar document, a top-level pinned workspace lists as a row in a Pinned area above the list in document order; a closed one lists as an item row with its stored name and pin.
- The bridge maps each pinned workspace with its own machine, so a Chief workspace keeps its real
MachineIDand title rule. - Content patches (title, status, unread) keep the pin on pinned rows and group members.
- Item actions on a pinned row resolve through the document projection; Remove from Section reads "Unpin Workspace" there and unpins a closed pinned row too.
sec_top(Home, App Store, Chief) and non-workspace items in Pinned keep their existing arrangement.