Repository navigation
cmux NEXT sidebar: workspace rows run full length; the hover close is a top-right dog-ear - #23783
Conversation
…er action is a top-right dog-ear (failing) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray
…se or menu is a top-right dog-ear Rows end at the list's inset again (rowTrailingTrim 0, taking back #22733's trim). The x and the more button no longer sit in rounded boxes at the end of the title: one dog-ear folds over the row's top-right corner (the close, or the menu on a row that cannot close), takes clicks only on its fold, follows the row's corner radius and draws translucent theme fills. The title keeps its full width on hover; the unread badge and keycap keep their slots. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray
|
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)
Not verified: macOS jobs did not run: compile and app tests were skipped on CI passes on Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on cba27b0 to compare; do not merge until green; see lane-rules Tour of The path-selected recorder failed for core-after, core-before; see the run artifact and failed manifests. Path-selected interactions
Core UI (before): FAILED — 16 ok, 3 failed, 1 unavailable
Failed steps: 5. Split right Screenshots (12)1. Launch
Failed steps: 5. Split right Screenshots (12)1. Launch Tours are data in |
|
Owned by sidebar-rows on cosmic-gray · session |
|
Owned by sidebar-rows on cosmic-gray · session |
This comment has been minimized.
This comment has been minimized.
|
Bead |
|
Review (claude-subagent): BLOCK at f8cc39c I reviewed this by reading the code only. I did not compile or run anything; Swift compile and tests were still pending in CI when I wrote this. Blocking
Non-blocking
Checked and fine
|
… badge and the dog-ear Review follow-ups: the pin's slot is taken after the badge or keycap slot and ends before the dog-ear's square, so it never covers the badge (which now stays on hover) and a click on it never lands on the fold. The dog-ear is a little larger (controlSize + space1) so its glyph reads at compact size, its tinted glyph is cached per color, and two stale doc comments are updated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray
|
|
|
|
|
Review (claude-subagent): SHIP at 1ea173e I reviewed this by reading the code only. I did not build or run anything. When I wrote this, the compile and The earlier block is fixed
The new commit and test look right
Non-blocking
|
…he row's end controls Codex review of #23783 (xhigh) found two ways the dog-ear closed a workspace the user did not mean to close: - NSButton tracked the press over the dog-ear's whole square, so a press on the fold dragged below the crease and released there still closed. The dog-ear now tracks the press itself: a release fires only on the fold after a press that began on it, and the fold unlights while the pointer is off it. - On a 24 pt row the tabs chevron, the session tree's fold or the audio button at the row's end sits partly under the dog-ear's square, and the dog-ear hit-tested first, so a click on the chevron's corner closed the workspace. The row now hit-tests the dog-ear last and draws those controls over the fold, so what shows on top is what a click presses. Tests: aPressDraggedOffTheFoldDoesNotClose, aControlUnderTheDogEarKeepsItsClicksAndDrawsOverIt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray
…robed super calls Codex re-review of #23783 at 8819d4b: a press held while the dog-ear was disabled still fired on release. The release now fires only on an enabled dog-ear, and always clears the press. The crash-class selector rule flagged super.mouseDragged and super.mouseUp on NSButton (no probe in objc-selector-table.json). The dog-ear only reaches them with no press of its own, and then NSButton's tracking loop already took the drag and the release, so it ignores them instead of calling super. Test: aPressDraggedOffTheFoldDoesNotClose covers a press disabled mid-click and the click after it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray
|
Review (codex xhigh, correctness first): SHIP at f016b52
|
|
|
…, no dog-ear fold Leo on the dog-ear: "i wanted the hoverable area to just... not have it on the top right corner. a smaller top right corner not higlighitng bc the button itself chopped off that top right." The close (or the Home row's menu) no longer draws a folded triangle. It sits in a small square on the row's top-right corner that the row's hover or selection fill leaves out, so the highlight reads as the row with its corner chopped off by the button. The x keeps its place. The fill is a shape layer under the row's content while the corner is cut (no mask on the row), and goes back to the backing layer otherwise. Debug Settings `sidebar.closeNotch` keeps the gallery's versions: snug rounded cut (default), snug square cut, a rounded cut the size of the old dog-ear, and the snug cut with a hairline. WorkspaceRowCloseNotchGalleryTests renders them all, light and dark, on the fleet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray
|
Found 8 test failures on Blacksmith runners: Failures
|
…e snug cut's size Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray
|
|
|
|
|
|
…ows a look change and a still pointer Codex review of 90fc220 (BLOCK): - The rounded cut's fillets reach past the close's square, and a click there selected the row. The close's frame now covers the whole cut (SidebarCloseNotch.cutFrame) and it takes exactly the points the row's drawn fill leaves out (cutContains), in every sidebar.closeNotch look. - sidebar.closeNotch was read only in layout, so shown rows kept the old cut. SidebarTunablesWatch observes it with the other row tunables and configure hands it to the row, which lays out again on a change. - Shown under a pointer that does not move, the close got no enter event and its x stayed dim. It reads the pointer when it unhides. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray
…awn cut; the gallery draws each look Codex review of c80b62d (BLOCK): - Only the first hit test checked the cut; NSButton's own tracking fired on a release anywhere in the frame, which reaches onto the row's fill past a rounded cut. The close tracks the press itself: it fires only on a release in the cut after a press there. - The gallery set each look and drew rows in the same turn, before the tunables watch dropped its cached values, so every look could draw the snug cut. It refreshes the watch after each set and requires each row to carry the look it is drawing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray
teamleaderleo
left a comment
There was a problem hiding this comment.
Review (codex xhigh, correctness first): SHIP at 16cd759
|
The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/39913961585 at a62351d failed: cmux-next fast tier, cmux-next perf gate. |
|
Shipped in:
|
|
The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/39922732738 at ab42b3c failed: cmux-next fast tier. |
* test(cmux-next sidebar): a workspace row runs full length and its hover action is a top-right dog-ear (failing) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray * fix(cmux-next sidebar): workspace rows run full length; the hover close or menu is a top-right dog-ear Rows end at the list's inset again (rowTrailingTrim 0, taking back #22733's trim). The x and the more button no longer sit in rounded boxes at the end of the title: one dog-ear folds over the row's top-right corner (the close, or the menu on a row that cannot close), takes clicks only on its fold, follows the row's corner radius and draws translucent theme fills. The title keeps its full width on hover; the unread badge and keycap keep their slots. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray * fix(cmux-next sidebar): an expanded row's hover pin clears the unread badge and the dog-ear Review follow-ups: the pin's slot is taken after the badge or keycap slot and ends before the dog-ear's square, so it never covers the badge (which now stays on hover) and a click on it never lands on the fold. The dog-ear is a little larger (controlSize + space1) so its glyph reads at compact size, its tinted glyph is cached per color, and two stale doc comments are updated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray * cmux NEXT sidebar: the dog-ear fires only on its fold and yields to the row's end controls Codex review of #23783 (xhigh) found two ways the dog-ear closed a workspace the user did not mean to close: - NSButton tracked the press over the dog-ear's whole square, so a press on the fold dragged below the crease and released there still closed. The dog-ear now tracks the press itself: a release fires only on the fold after a press that began on it, and the fold unlights while the pointer is off it. - On a 24 pt row the tabs chevron, the session tree's fold or the audio button at the row's end sits partly under the dog-ear's square, and the dog-ear hit-tested first, so a click on the chevron's corner closed the workspace. The row now hit-tests the dog-ear last and draws those controls over the fold, so what shows on top is what a click presses. Tests: aPressDraggedOffTheFoldDoesNotClose, aControlUnderTheDogEarKeepsItsClicksAndDrawsOverIt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray * cmux NEXT sidebar: a dog-ear disabled mid-press does not fire; no unprobed super calls Codex re-review of #23783 at 8819d4b: a press held while the dog-ear was disabled still fired on release. The release now fires only on an enabled dog-ear, and always clears the press. The crash-class selector rule flagged super.mouseDragged and super.mouseUp on NSButton (no probe in objc-selector-table.json). The dog-ear only reaches them with no press of its own, and then NSButton's tracking loop already took the drag and the release, so it ignores them instead of calling super. Test: aPressDraggedOffTheFoldDoesNotClose covers a press disabled mid-click and the click after it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray * cmux NEXT sidebar: the row's hover fill leaves the close's corner out, no dog-ear fold Leo on the dog-ear: "i wanted the hoverable area to just... not have it on the top right corner. a smaller top right corner not higlighitng bc the button itself chopped off that top right." The close (or the Home row's menu) no longer draws a folded triangle. It sits in a small square on the row's top-right corner that the row's hover or selection fill leaves out, so the highlight reads as the row with its corner chopped off by the button. The x keeps its place. The fill is a shape layer under the row's content while the corner is cut (no mask on the row), and goes back to the backing layer otherwise. Debug Settings `sidebar.closeNotch` keeps the gallery's versions: snug rounded cut (default), snug square cut, a rounded cut the size of the old dog-ear, and the snug cut with a hairline. WorkspaceRowCloseNotchGalleryTests renders them all, light and dark, on the fleet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray * cmux NEXT sidebar: the row's corner close is a VoiceOver button at the snug cut's size Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray * cmux NEXT sidebar: the corner close takes exactly the drawn cut, follows a look change and a still pointer Codex review of 90fc220 (BLOCK): - The rounded cut's fillets reach past the close's square, and a click there selected the row. The close's frame now covers the whole cut (SidebarCloseNotch.cutFrame) and it takes exactly the points the row's drawn fill leaves out (cutContains), in every sidebar.closeNotch look. - sidebar.closeNotch was read only in layout, so shown rows kept the old cut. SidebarTunablesWatch observes it with the other row tunables and configure hands it to the row, which lays out again on a change. - Shown under a pointer that does not move, the close got no enter event and its x stayed dim. It reads the pointer when it unhides. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray * cmux NEXT sidebar: the corner close fires only on a release in the drawn cut; the gallery draws each look Codex review of c80b62d (BLOCK): - Only the first hit test checked the cut; NSButton's own tracking fired on a release anywhere in the frame, which reaches onto the row's fill past a rounded cut. The close tracks the press itself: it fires only on a release in the cut after a press there. - The gallery set each look and drew rows in the same turn, before the tunables watch dropped its cached values, so every look could draw the snug cut. It refreshes the watch after each set and requires each row to carry the look it is drawing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray * docs: add ergonomic cmux-next preview workflow Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a1675a-0d00-7500-aa2e-61664f715df3&host=cosmic-gray * cmux NEXT: make close-notch preview artifacts reviewable Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a16759-6434-7f61-9180-62dc0965c7b2&host=cosmic-gray * cmux NEXT: add ergonomic preview wrapper Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a16758-4b24-7c41-b817-18aff1fb02a5&host=cosmic-gray * docs: align preview wrapper contract Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a16747-6774-7840-9abc-3147d6b51232&host=cosmic-gray * test(next): cover Home dog-ear VoiceOver label Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a166c1-b197-7073-8526-9f5eba16f64f&host=cosmic-gray * docs: clarify hosted close-notch preview command Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a16747-6774-7840-9abc-3147d6b51232&host=cosmic-gray * fix: serialize preview process startup Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a16747-6774-7840-9abc-3147d6b51232&host=cosmic-gray * fix(next): make browser previews use real checkout state Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a16746-f280-7d72-9922-f6c3c758ca81&host=cosmic-gray * fix: route gallery entries through hash links Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a16747-6774-7840-9abc-3147d6b51232&host=cosmic-gray * docs: scope native preview recipe claims Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a16747-6774-7840-9abc-3147d6b51232&host=cosmic-gray * test(next): reject galleries from another preview process Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a166c1-b197-7073-8526-9f5eba16f64f&host=cosmic-gray * fix(next): use only the managed preview gallery URL Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a166c1-b197-7073-8526-9f5eba16f64f&host=cosmic-gray * fix(next): publish gallery metadata before preview readiness Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a166c1-b197-7073-8526-9f5eba16f64f&host=cosmic-gray * test(next): run preview wrapper contract in CI Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a166c1-b197-7073-8526-9f5eba16f64f&host=cosmic-gray * test(next): reject foreign preview index readiness Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a166c1-b197-7073-8526-9f5eba16f64f&host=cosmic-gray * fix(next): authenticate preview index readiness Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a166c1-b197-7073-8526-9f5eba16f64f&host=cosmic-gray * fix(next): avoid curl pipefail on preview ownership check Agent-Session: https://cmux.com/deeplink/agent?harness=codex&session=01a166f4-abed-7bc3-922b-15af1bc7b48e&host=cosmic-gray --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… own hover x (red) Lawrence 2026-10-23: "need to revert styling back to original, for the X button, ... and text needs to be as left as possible (how it originally was)". A row with no icon must start its title at the row inset, where its group header's name starts (no empty icon slot, c779988), a depth-1 member must not be indented, and the hover close must be the row's x at the end of the title's line (before #23783's corner close). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
































![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Leo-ask: ask-c8936f0e52
Leo, on the dog-ear as it shipped in the sidebar-dogfood build:
Before that (2026-10-21) he asked for the row's length back ("so we can have more content per sidebar row"), for the hover action to sit "like dog ears on a book on the top right", and for the title not to reshape on hover.
What changed (this round)
textSecondary,textPrimaryunder the pointer): no fill, no box. The fill colors are the theme's translucent hover and selection fills, so it stays glass. No accent and no animation were added; the shaped fill shows and clears at once, like the hover fill.rowTrailingTrim0). The title keeps its full width with or without hover. The unread badge and keycap keep their slots. An expanded row's Pin stays at the end of the name's line, clear of the badge and the corner.Gallery versions
These are the real list views drawn offscreen on the fleet (
WorkspaceRowCloseNotchGalleryTests, step1ba69b92265428b3dca070a4on aws-m4pro-3). Each sheet shows a hovered row under the selected row, and the selected row hovered, in dark and light (Soft Blue / Soft Blue Light). They are kept as Debug Settings choices undersidebar.closeNotch("Row close corner"), the same pattern assidebar.allChats.design.Palette.separator) along its edge.Why snug rounded: it is the "smaller top right corner" Leo described. The cut is barely larger than the x, so it reads as the button taking its own corner rather than as a new shape. Its rounded inner corners match the row's own radius family. The square cut looks like a rendering bug next to the rounded row. The hit-box cut takes noticeably more of the row and reads as a tab or notch. The hairline adds a border, and rows are fills-only.
Native capture (fleet capture mini)
This is a hovered row in the real app at the head (the x sits in the corner its fill leaves out):
Capture
steps-318fcfd6ccat90fc220e3655(fleet build, capture mini, text checked for private data)Earlier rounds, still in this PR
SidebarStyle.rowTrailingTrimis 0. Pinned rows and list blocks read the same token, so every row still ends at one x. Takes back cmux-next sidebar: hover follows the pointer, row pills stop short of the edge, the row card stands off its row #22733: Leo asked for the row length back on 2026-10-21. Only itsrowTrailingTrimpart is taken back; its hover-follow and hover-card changes stay.cmux.sidebar.workspace.<id>.close/.more).Tests
WorkspaceRowDogEarTests, rewritten for the cut:sidebar.closeNotchlook cuts its own size, keeps the x at the same point, and draws the hairline only in the hairline look;sidebar.closeNotchrelays out a row already on screen throughSidebarTunablesWatch;WorkspaceRowHoverMotionTestsexpects the one corner button.WorkspaceRowCloseNotchGalleryTestsrenders the gallery whenCMUX_TEST_REQUIRE_GUI=1(the fleet's opt-in); it is skipped otherwise.Observed / Not run
--appat c80b62d: passed (job35ad40b6f78c49c0088d2346).WorkspaceRowDogEarTests,WorkspaceRowHoverMotionTests,SidebarRowHoverGapTestsandSidebarRowBadgeStackCapTests(it sharesSidebarTunablesWatch), all passed (step137a4a1f79fb29b72aec0851).python3 scripts/cmux-next/prepush-gate.py: no new violations.Changelog
Changed: Sidebar workspace rows use their full width again. On hover, the close sits in the row's top-right corner, which the highlight leaves out.
Agent session: cosmic-gray
Takes back #22733: Leo explicitly asked for the row length back; this PR restores full-width rows while preserving the hover-follow and hover-card changes.