Repository navigation
Sidebar: hide scrolled rows under the traffic lights (minimal titlebar) - #24073
Conversation
With the minimal titlebar the sidebar list starts at the tab strip's height (28 in compact), above the titlebar's bottom (32), and rows that scroll up sit under the traffic lights in view. Pins the rule: at rest the top mask is unchanged; scrolled, the list's top is hidden down to Metrics.titlebarHeight and fades in below it. Red on base: the top clip does not exist yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16047-2854-7333-9aff-632422c609d7&host=cmux16
With the minimal titlebar (94f7db0) the sidebar list starts at the tab strip's height (28 in compact) so it sits level with the panes' content, while the traffic lights reach about y=22 and the titlebar row ends at Metrics.titlebarHeight (32). Scrolled, rows slid up under the lights and the 18 pt top fade left them visible there. ScrollEdgeFadeView gets a topClip: while content is hidden above, the mask is clear down to it and the top fade starts below it. At rest the top color is opaque, so the mask is unchanged. The sidebar sets each scrolling band's clip to the part above Metrics.titlebarHeight when the traffic lights are over it. The list does not move; the band's fade-in rides the existing Motion.feedback crossfade. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16047-2854-7333-9aff-632422c609d7&host=cmux16
|
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)
red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on 90e1666 to compare; do not merge until green; see lane-rules |
|
Found 6 test failures on Blacksmith runners: Failures
|
|
Bead |
|
Orphaned: no activity for 17 h, and no lane holds a lease on it. Adopted by the orphan sweep: merged |
|
|
|
Review (codex gpt-6-astra xhigh, next-review): SHIP at 8ddd55d No blocking findings. |
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
|
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
Owned by an agent session · took over from an earlier session · session |
…ebar-top-mask # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextDesign/ScrollEdgeFade.swift # Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Views/SidebarView.swift
|
Review (codex gpt-6-astra high, review-router): SHIP at 88fe218 No blocking findings at this head (base merge plus conflict resolution reviewed with the full diff). Two non-blocking P3 notes on test strength. Agent session: agent session |
The traffic-light clip commit reached its branch without a Sidebar-Look trailer. Rewriting it would need a force push, so it is reviewed and logged here, as the gate allows for such commits (dcd4316, 8b5cafb). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ab1f035a409b977caceb
|
Review (codex-review-box/gpt-6-astra high, lane-place): SHIP at e582cd8 SHIP No findings. |
|
Shipped in:
|
|
The "Sidebar look owner sweep" step of the cmux-next checks names this PR's commit on feat-cmux-next. It scans every commit since 342462c, so every PR's checks print this line (job 123695447456 on #27454): The commit has landed, so a trailer is no longer possible. The fix is an entry for 4367c16 in |
|
Why your entry is waited for: #27634 makes the "Pushed commits add no violations" step fail when the sidebar sweep finds a commit with no record. Today the step never fails, because its pipe has no pipefail. Without an entry for 4367c16 in |
4367c16 (#24073), 6c1a5ab (#24295) and eb8105b (#27561) reached feat-cmux-next as squash merges without a Sidebar-Look trailer; their branch commits are already logged in sidebar-owner.md. Sidebar-Look: no visual change Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445
…for the Sidebar-Look sweep The CI sweep from 342462c names 4367c16, 6c1a5ab and eb8105b: base's squash merges of PRs whose branch commits are already logged. Log them by their squash sha. Sidebar-Look: no visual change Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445
…bar-Look trailer (#28326) 4367c16 (#24073), 6c1a5ab (#24295) and eb8105b (#27561) reached the base branch without a Sidebar-Look: trailer, so the sidebar owner sweep in cmux-next checks fails every PR whose merge includes them. Logging their shas in sidebar-owner.md is the gate's documented path for such a commit (prepush-gate.py sidebar_owner: "reviewed once instead of failing every later sweep"). Agent-Session: https://cmux.com/deeplink/agent?id=aid-159afad10a5ab45ea16c Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…mmits stay errors (#27632) * test(prepush-gate): a pull request's sidebar sweep warns on a base commit and errors on its own Red on the base: prepush-gate.py has no --own-range ('unrecognized arguments'). On 2026-10-29 two feat-cmux-next commits without a Sidebar-Look record (#24073, #24295) put an ##[error] on every pull request's cmux-next checks, and next-autoland read it as the PR's own red (#27454 and four more PRs). * ci(cmux-next): a pull request's sidebar sweep names a base commit as a warning; its own commits stay errors The "Pushed commits add no violations" step sweeps every commit since 342462c for a Sidebar-Look record. On a pull request run it printed ::error for base commits too: 4367c16 (#24073) and 6c1a5ab (#24295) put an error on every feat-cmux-next pull request's checks, and next-autoland read that line as the PR's own red, so #27454 and four more PRs stayed held. prepush-gate.py --own-range BASE..HEAD (the sweep only): a finding on a commit inside the range is an ::error and fails the sweep as before; one on a commit outside it is a ::warning that names the commit and plans/cmux-next/sidebar- owner.md. cmux-next.yml passes --own-range HEAD^1..HEAD on pull request runs only. A push sweep of feat-cmux-next is unchanged: every commit without a record is still an error there, so the base's debt stays visible on the branch. risk_tier.py classify: normal. Test: test_cmux_next_prepush_gate's new case fails on the base and passes; the whole file passes (40 tests). * ci(cmux-next): own-range on pull_request runs only; the warning carries the whole finding (review of #27632) A workflow_dispatch run (feat-cmux-next, next-batch/*, a PR branch) checks out a branch tip, not GitHub's merge commit, so HEAD^1..HEAD there is the tip commit only: the != push test turned the branch's own debt into warnings. Now == pull_request, as the app-FFI pin step tests. The warning text is the whole finding, % and newlines escaped for the workflow command.
* test(sidebar): cover fold accessibility activation Exercise Done and Show more through AXPress, including row reuse and hidden rows. Native execution is pending the fleet route; this lane has no Swift compiler. Agent-Session: https://cmux.com/deeplink/agent?id=aid-75c97562a83401f2d167 * fix(sidebar): let VoiceOver activate Done and Show more Route AXPress through the same fold action as mouse clicks, rebind the callback when rows are reused, and reject hidden or stale fold elements. Native red/green execution is pending the fleet route. Sidebar-Look: no visual change Agent-Session: https://cmux.com/deeplink/agent?id=aid-75c97562a83401f2d167 * test(sidebar): isolate recycled fold view from live registry Sidebar-Look: no visual change Agent-Session: https://cmux.com/deeplink/agent?id=aid-75c97562a83401f2d167 * test: cover keyboard activation of sidebar disclosure rows Agent-Session: https://cmux.com/deeplink/agent?id=aid-c24cb66e0a77ead34e65 * fix: include sidebar disclosure rows in keyboard walk Agent-Session: https://cmux.com/deeplink/agent?id=aid-c24cb66e0a77ead34e65 * test: use key codes for disclosure navigation events Agent-Session: https://cmux.com/deeplink/agent?id=aid-c24cb66e0a77ead34e65 * fix: stabilize keyboard disclosure focus and tests Agent-Session: https://cmux.com/deeplink/agent?id=aid-c24cb66e0a77ead34e65 * test(sidebar): a fold reload or click elsewhere drops the old fold's focus Covers the two Sol findings on #27961: a removed disclosure that comes back must not bring back its ring, and a click on another disclosure must move keyboard focus off the ringed one so Space acts on the clicked row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445 * fix(sidebar): move fold focus to a clicked disclosure A click on Done or Show more left keyboard focus and its ring on the disclosure the keyboard had reached, so the next Space or Return toggled that one. The click now moves focus to the clicked disclosure without a ring (as a click on a group header does), and a fold row draws its ring only when the keyboard moved focus there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445 Sidebar-Look: no visual change * docs(sidebar): log the fold keyboard commits for the Sidebar-Look sweep 89e3362 and cefa3bc reached the branch without a Sidebar-Look trailer; both are behavior changes that draw only the existing keyboard focus ring on a fold row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445 * docs(sidebar): log base's squash commits of #24073, #24295 and #27561 for the Sidebar-Look sweep The CI sweep from 342462c names 4367c16, 6c1a5ab and eb8105b: base's squash merges of PRs whose branch commits are already logged. Log them by their squash sha. Sidebar-Look: no visual change Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445 * test(sidebar): a tab click must take keyboard focus off a disclosure Red test for the review finding: after the keyboard focuses Show more, a click on a tab row leaves focusedFold set, so Return or Space still toggles the old disclosure. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445 * fix(sidebar): a click on a tab or any other row takes focus off a disclosure The .tab mouse-down selected the tab but left focusedFold (and a clicked group header's focus) set, so Return or Space toggled the old disclosure and the arrows walked on from it. Every row kind but a group header or a disclosure now clears the keyboard focus on press, as workspace and item clicks already did: tab, section, empty section, empty group, folder, block and status rows. Sidebar-Look: no visual change Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445 * test(sidebar): drop the tab-row fold test; base deleted sidebar tab rows Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
With the default minimal titlebar, scrolling the left sidebar list slid rows up under the window's traffic lights, and they stayed visible there. On nightly 1.0.0-nightly.3965802926201 (3a63d6d) the "Agents" group header pill sat beside the lights.
Cause: since 94f7db0 (minimal titlebar) the sidebar's header row is
Metrics.tabStripHeighttall (28 in compact,WindowRootView.applyTokens), so the list starts level with the panes' content. The traffic lights reach about y=22 and the titlebar row ends atMetrics.titlebarHeight(32 in compact). The list's 18 pt top edge fade (ScrollEdgeFadeView) starts at the list's top, so a scrolled row from y=28 down was only partly faded, right below the lights.Decision (claude-sr2), verbatim: "Miss 6: keep the list starting level with the panes at rest. When the list is scrolled, extend the top mask so content scrolling under the traffic lights is clipped and faded below the lights (y≈titlebarHeight). Don't use max(tabStripHeight, titlebarHeight) at rest."
Change:
ScrollEdgeFadeView(CmuxNextDesign) gets atopClipin points. Its gradient's first stop moves down totopClip. While content is hidden above, the top color is clear, so the mask hides everything from the list's top down totopClipand the usual 18 pt fade starts below it. At rest the top color is opaque, so the mask is the same as before.topClipdefaults to 0, so the other users (palette, extensions menu, priority panel) don't change.SidebarViewsets each scrolling band's clip (the list, and the top item band when it shows) to the part aboveMetrics.titlebarHeight, but only when the traffic lights are over this sidebar (headerHasWindowControls; a right sidebar gets 0). With the full titlebar the list already starts attitlebarHeight, so the clip is 0.Motion.feedbackhovercrossfade on the mask colors. With animation off it applies in one frame. Changing the geometry (topClip, locations) never animates.ScrollEdgeFadeView's existing clip-view bounds/frame and document frame observers, which itsdeinitremoves. No per-row work: the clip is set inSidebarView.layout, and a scroll only changes the mask's colors, as before.Test:
SidebarTopMaskTests(CmuxNextAppTests), committed before the fix. It reads the mask's gradient the way Core Animation draws it and checks:max(bandTop, Metrics.titlebarHeight)and the band is not moved up.Changelog
Fixed: Sidebar rows no longer show under the window's traffic lights when the list is scrolled with the minimal titlebar.
Observed / Not run
python3 scripts/cmux-next/prepush-gate.py: no new violations.cmux-ci run --class light --script scripts/ci/package-test-lane.sh --arg=suite --arg=Packages/macOS/CmuxNext --arg=SidebarTopMaskTests. Red at 0ccf766 (test only) and green at the head: results pending, to be added here when the steps finish.No capture: the before/after capture follows from the next nightly (scrolled sidebar state).
Agent session: cmux16
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Fixes sidebar rows staying visible under the window's traffic lights when scrolled with the minimal titlebar.
ScrollEdgeFadeViewgains atopClipthat hides content down to the titlebar's bottom and starts the top fade below it; at rest the mask is unchanged.headerHasWindowControls); full titlebar and right sidebar behavior is unchanged.SidebarTopMaskTestscovering the mask at rest, scrolled, with no clip, and with full titlebar or no window controls.Sidebar-Looktrailer.Written for commit e582cd8. Summary will update on new commits.