Skip to content

cmux NEXT sidebar: one row gap after groups, folders and pins; the pin lines up with the rows - #23800

Merged
teamleaderleo merged 17 commits into
feat-cmux-nextfrom
sidebar-uniform-spacing
Oct 26, 2026
Merged

teamleaderleo merged 17 commits into
feat-cmux-nextfrom
sidebar-uniform-spacing

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Leo, on the cmux NEXT sidebar: "ALL THIS RELATIVELY UNNECESSARY SPACING AFTER GROUPS AND AFTER PINS". Every two consecutive rows in the sidebar list are now one row spacing apart (space1, 2 pt), including under a group's last member, under a Group by Folder folder's last row, under the Pinned block's last row (or its drop zone during a drag) and under the session tree's last pinned chat. Before, each of those ends added its own gap on top of the row spacing:

After Before (compact / comfortable) Now Added by
a group's last row + groupBottomPadding 6 / 8 pt 0 #15513 (21da830, the first custom sidebar)
a folder's last row (Group by Folder) + groupBottomPadding 6 / 8 pt 0 #18132 (3a01a38)
the Pinned block (pinned workspaces, pinned groups' block) region bottom padding 4 pt + list topPadding 4 / 6 pt, instead of the row spacing the row spacing b4da846 (sidebar-v2 client "band spacing", Lawrence, 2026-10-14)
an emptied block's drop zone (or the drop's gap there), titled or not + topPadding 4 / 6 pt, or + sectionSpacing 8 / 12 pt for an untitled one 0 b4da846
Group by Status under the Pinned block + sectionSpacing 8 / 12 pt the row spacing Group by Status
the session tree's pinned chats + sectionSpacing 8 / 12 pt 0 #22323 (efe95ba)

groupBottomPadding is gone from SidebarLayoutMetrics and SidebarDensityTokens (no other reader). A list block now has no bottom padding: the list puts its row spacing (or the next block's own top edge, unchanged) under the block's last item. SidebarLayout.make carries what follows a document section (afterBlock): the row spacing under a bare block, nothing under its drop zone or drop gap (that row already ends with it), a section gap under its groups; Group by Status takes the same (statusRows(spacing:)). Gaps between sections that have headers, and between two top blocks, are unchanged. The fold splice (SidebarLayout.folding) and the double-click-in-empty-space target follow the same rule, so a fold still splices to exactly what make lays out.

Pinned row: its pin was drawn in a 12 pt square at the rows' content inset, and the pin glyph's ink sits about 3 pt inside that square, so the pin read as indented from the other rows' text and icons. The pin is now placed by its measured ink (SidebarGlyphInk, already used for icon-only items): the ink starts exactly where an unpinned row's icon or title starts and centers on the row the way that row's content does. The pinned row's icon and title move with the pin (same gap after it as before). Vertical centering was already right; it is now asserted.

Risk: low-to-normal (risk:normal). Spacing constants and one glyph offset in the cmux NEXT sidebar; no row model, data or layout-engine change, and no setting. What could go wrong: a row or the drag's drop gap a few points off in a section/block combination the tests do not cover (the drag hit test reads the drawn rows and gapShift, which keep their meaning). Undo is a revert; nightly carries the fix forward.

Adopted from its closed owner lane (cosmic-gray/sidebar-rows); brought onto feat-cmux-next at 0c1814b. The one conflict (SidebarListView+Drag.swift) was a comment edit inside group-reorder code base has since removed; base's side taken. Checked against the open sidebar PRs: #24513 (merged, group line chrome) and #24371 (pinned workspaces as list rows, hold) do not change these gaps.

Tests

SidebarUniformRowSpacingTests (CmuxNextAppTests), each committed before its fix:

  • pure layout, at both densities: the gap under a group's last row, under a folded group, under a folder, under the Pinned block and under the pinned chats equals rowSpacing; a fold splice equals make; a drop's gap alone under the Pinned block moves the rows below by exactly gapShift.
  • the Pinned drop zone (and the drop's gap in its place), with a 24 pt block and with an untitled 0 pt one: the next row follows by rowSpacing. Group by Status under a bare Pinned block and under its drop zone: the first status header follows by rowSpacing.
  • the drawn sidebar (a real SidebarView with a Pinned block of two workspace rows, a group and loose rows), at both densities: the measured gaps between the last pinned row and the next row, and between the group's last row and the next row, equal the row spacing; the pin's ink starts at an unpinned row's content x and centers on its row as that row's content does.

SidebarStatusGroupingTests.aStatusSectionsLastRowAndTheNextHeaderKeepTheRowSpacing: a status section's end adds no padding.

Observed / Not run

  • Red, on the fleet at b4ea25b (the first test commit, base code): cmux-ci run --class light --script scripts/ci/run-swift-testing-suites.sh --arg Packages/macOS/CmuxNext (step 4730433c). SidebarUniformRowSpacingTests failed with 15 issues, each the old gap or the pin offset.
  • Red, on the fleet at 47a426a (drop-zone test, before its fix): step 8f3c5004, theRowUnderThePinnedDropZoneKeepsTheRowSpacing 8 pt over the row spacing (gap and zone). Red at e0f6eab (untitled drop zone and Group by Status tests, before their fix): step 4e0a235b, 8 pt (0 pt block, zone and gap) and 6 / 8 pt (status header under the block / its drop zone).
  • Green at 06251dd (head code): step d86954a1, SidebarUniformRowSpacingTests passes (all cases). The package run itself exits 1 on other suites (ActionRun, BrowserTabMirror, ScreenReplace and others): see the base comparison comment.
  • scripts/cmux-next/prepush-gate.py at the head: no new violations (the Sidebar-Look owner check passes: the commits are logged in plans/cmux-next/sidebar-owner.md, which gains a "Row gaps" target).
  • Review: Codex gpt-6-astra at xhigh, four rounds; rounds 1 and 2 found the drop zone and Group by Status cases above (fixed with tests first).
  • Not run locally: no Swift builds on this host.

Capture

Steps file (fleet build, capture mini): Home pinned, a workspace "Pinned one", a loose row, a new group with two members, then a loose row. Before is base 0c1814b668e, after is d9c103d22e79 (the later commits change only drag/drop-zone and Group by Status spacing, which this scene does not show). Under the pinned Home row the row pitch drops from 32 to 26 pt (compact, the extra 6 pt gone), the group's members and the row after the group sit one row spacing apart, and the pin moves left to the rows' text start.

After steps-192f41d575 at d9c103d22e79 (fleet build, capture mini, text checked for private data)

Light Dark
light dark

Before at base 0c1814b668e1

Light Dark
light dark

Changelog

Changed: The cmux NEXT sidebar keeps one even gap between rows, with no extra space after groups, folders or pinned rows, and the pin on a pinned row lines up with the other rows.

🤖 Generated with Claude Code

Agent session: agent session

teamleaderleo and others added 2 commits October 21, 2026 22:21
… the pin lines up

Red: under a group's last row, a folder, the Pinned block and the pinned
chats the layout adds its own padding to the row spacing, and a pinned
row's pin ink starts inside the rows' content inset.

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
…s; pin lines up

Rows keep one gap, the list row spacing, under a group, a Group by Folder
folder, the Pinned block and the pinned chats: groupBottomPadding is gone,
a list block has no bottom padding (the list puts the row spacing under
it), and the pinned chats add no section gap. The pinned row's pin is
placed by its measured ink, so it starts where an unpinned row's content
starts and centers on its row.

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
@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review 06251dd: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr23800 -f ref=sidebar-uniform-spacing -f platform=macos -f backend_mode=local

Not verified: macOS jobs did not run: compile and app tests were skipped on 06251dd594; ci-status is green without them.

CI passes on 06251dd594 (run 40405019881 attempt 1).
macOS jobs did not run: compile and app tests were skipped: Fast static checks skipped (the macos job needs both to succeed). Re-run CI once they pass, before merging.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

web and size checks: green

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Bead cx-o51la created for this PR by the cmux coordinator.

@teamleaderleo

teamleaderleo commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · session

@teamleaderleo teamleaderleo added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 21, 2026
@blacksmith-sh

blacksmith-sh Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Found 15 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmp6a8_boy2/summary-missing.json (live):/summary-missing.json (live): View Logs
/tmp/tmpr16f78qf/summary-fail.json (live):/summary-fail.json (live): View Logs
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows/
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows
View Logs
[new_workspaces] the window draws no frames/[new_workspaces] the window draws no frames View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs
main.DeveloperIdAppTests.test_download_prints_the_active_profile_only/
test_download_prints_the_active_profile_only
View Logs
convention violations found (ERROR lines above)./
convention violations found (ERROR lines above).
View Logs
stubs: /System/Library/Frameworks/Security.framework/Versions/A/Security has no stub/
Security has no stub
View Logs
stubs: CoreFoundation.tbd: install-name /System/Library/Frameworks/
CoreFoundation.framework/Versions/A/CoreFoundation, missing 1: ['_CFRetain']/
CoreFoundation, missing 1: ['_CFRetain']
View Logs

...and 5 more test failures. View all on Blacksmith: run 39786657921, run 39786657551

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

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (claude-subagent): SHIP at 5ca9bed

Correctness first. I read the code with git at the head and did not build anything.

What I checked

  • groupBottomPadding, blockJoins and joinsBelow have no readers left anywhere in the repo at the head, Tests and other packages included. SidebarLayoutMetrics(...) is called in one place only (LayoutMetrics+Tokens.swift).
  • SidebarLayout.make: under a block, rowsUnderBlock agrees with the rows that actually get emitted in each path I walked: groups, a collapsed doc section (nodes = []), the empty drop zone (emptyDropZone && emptyDocSections), filtering (continue before any block), and a first-section block. When one block follows another, the layout and the view still agree: the second block's top keeps sectionGap plus the separator, and the first block's bottom was already 0 there before this PR.
  • Fold splice: blockEnd drops the padding for both the open and the folded case, so the splice still equals make. The new test checks this at the open/folded boundary.
  • emptyAreaTarget now uses maxY + rowSpacing, which matches the layout.
  • Drag geometry (SidebarDocDrag.geometry, blockBases, baseY, blockSlotFrame, PinDrop) reads block heights from the region layout, which now has bottom padding 0 everywhere, so it stays consistent. DropResolver and the group band and line code read no padding.
  • Pin: the row view is flipped, so the top-left ink box from SidebarGlyphInk maps directly into the frame. The class is @MainActor and the call is made from layout(). The cache key is the glyph plus image.size.width. If there is no image or no ink, it falls back to the old square. lead becomes pinFrame.maxX + space2, which is the old gap shifted left by ink.minX.
  • Tests: the test commit b4ea25b ran red on the fleet with 15 issues. That count matches exactly the gap and pin-x assertions across 3 densities, so the file compiles against these APIs. The fix commit does not touch the test file. I also checked every symbol and initializer the tests use against the head, and computed by hand that every assertion holds after the fix:
    • block end: 0 bottom padding plus rowSpacing
    • group end and folder end: rowSpacing
    • pinned chats: pinnedHeight already includes the trailing rowSpacing
    • pin x: off by at most 0.25 pt from pixel snapping
  • Existing tests that touch these gaps are inequalities, and they still hold: ChiefGroupLayoutTests:68, SidebarChatHistoryTests:105-107, ChiefGroupFoldShiftTests.

Nits (not blocking)

  1. SidebarLayout.swift:260-262: gapHere counts toward rowsUnderBlock, and that also clears previousWasBlock. Take a list gap that is the only thing under a block, for example while dragging the only group of a doc section (both layouts leave the group out). The no-gap base layout puts the next section at block + rowSpacing. The drawn layout puts it at block + rowSpacing + gap + sectionSpacing. So rows below move by gapShift + sectionSpacing, not by gapShift, while baseY and edgeY map back using gapShift. The old code moved them by exactly gapShift. A group drag re-measures the shift from the drawn blocks (SidebarListView+Drag.swift:177-181), so in practice this mostly corrects itself. Suggested fix: compute previousWasBlock without gapHere, so the drawn layout gets rowSpacing after the gap and the shift is gapShift again.
  2. SidebarListView+Blocks.swift:137-151: listsNoRows still ignores the empty drop zone and a gap, so during a drag a block can be styled as joined to the block above with a drop-zone row between them. This was already true before; the change adds a rowSpacing there.
  3. SidebarListView+Drag.swift:179: the comment "6 pt more than gapShift" probably described the removed group padding. Please re-check the wording; the code measures the shift, so its behavior does not change.
  4. SidebarUniformRowSpacingTests.swift:200: compares pinned.titleFrame (row coordinates) with pin.maxX (list coordinates). It works because the block's item rows sit at x 0, but it mixes coordinate spaces.
  5. Scope: every list block now has bottom padding 0 (the top section's Home and App Store, grid and inline arrangements), not only Pinned. A grid of tiles now sits 2 pt above the next row; tiles arrangements keep their own sectionGap. This matches the description; I'm noting it so the design call is a conscious one.
  6. pinGlyphFrame uses a backing scale of 2 while window is nil, the same as the existing alignedGlyphFrame. Fine.

…by gapShift

Review follow-up on #23800: a drop gap that is the only thing under a list
block counted as rows under it, so the rows below moved a section gap more
than the drag's hit test assumes. The gap now opens right under the block.
Also fixes a stale drag comment and compares the pinned title in list
coordinates in the test.

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

Copy link
Copy Markdown
Collaborator Author

cmux-next crash-class rules / cmux-next crash-class rules is red on 10 of 10 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (claude-subagent): SHIP at cbbada1

This reviews the diff 5ca9bed..cbbada1 (read only, no builds). I checked the new rowsUnderBlock against each path, using B for the block's maxY, rs for rowSpacing, ss for sectionSpacing and gh for the gap height:

  • Gap in a section that has rows (groups): unchanged. The base and drawn layouts list the same nodes, because the dragged group is left out of both. The gap opens among the rows, so the rows below move by gapShift.
  • Gap alone under a block (no nodes, not an empty-zone section): fixed. rowsUnderBlock is false in both layouts, so the gap opens at B, then gh + rs, and the next section gets rs from previousWasBlock. The base layout has the next row at B + rs, so the rows below move by exactly gh + rs, which is gapShift. A gap that openGapIfNeeded does not open (another group or index) now adds nothing, which is also correct.
  • No gap: unchanged from 5ca9bed.
  • New test aGapUnderThePinnedBlockMovesTheRowsBelowByItsShift: compiles and holds. DropPosition(section:group:index:), SectionID.custom (a custom section's id is .custom(id), not .pinned), and gapY/gapShift are all public. By hand: gapY = 52 = block.maxY, and the group header moves from 52 + rs to 52 + gh + 2rs. That difference is gapShift.
  • Title assertion: it now converts titleFrame (an NSRect) into list coordinates. Correct.
  • Drag comment: the rewrite is accurate.

Nit (not blocking, a one-token fix recommended): a gap on a section's empty drop zone

  • Where: SidebarLayout.swift:261-262, the !gapHere && term. It applies when the gap takes the place of the empty drop zone: a section whose block still draws something (a titled custom section) while every one of its items is being dragged, and the pointer comes back over its own zone.
  • Before this commit (and on the base branch), both layouts had the same structure: the zone or the gap, then ss. The rows below did not move.
  • Now, the zone at rest gives B + rs + zone + rs + ss. With the gap on it you get B + gap + rs + rs. The rows below jump up by ss (8/12 pt) when the gap appears. The gap itself also sits 2 pt higher than the zone did.
  • Hit testing: the gap maps back to base y = B. That point falls on the block's header slot, which has the same section target as the zone, so the drop target stays stable and there is no flicker. But the rows-below mapping is now off by gapShift + ss instead of gapShift (that gapShift error was already there before).
  • Fix: drop !gapHere &&, giving !nodes.isEmpty || (emptyDropZone && emptyDocSections.contains(docID)). The gap then sits where the zone was (B + rs), the rows below stay put, and the gap-alone case above still moves rows by exactly gapShift.

Nits 2, 5 and 6 from my last review are fine to leave as they are.

… rows below still

Review follow-up on #23800: with every item of a titled section dragged
out, the drop's gap in its empty zone's place now opens where the zone
was (one row spacing under the block), as on base, instead of moving the
rows below up by a section gap.

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

Copy link
Copy Markdown
Collaborator Author

Review (claude-subagent): SHIP at cce18bc

This reviews the diff cbbada1..cce18bc (read only, no builds). It changes only SidebarLayout.swift:259-263, and the change is the suggested condition word for word: rowsUnderBlock = blockHeight > 0 && (!nodes.isEmpty || (emptyDropZone && emptyDocSections.contains(docID))), with an accurate comment.

I checked each case again, using B for the block's maxY, rs for rowSpacing, ss for sectionSpacing and gh for the gap height:

  • Gap among a section's groups: rowsUnderBlock is true in both the base and the drawn layout, which list the same nodes. The gap opens among the rows, so the rows below move by gapShift.
  • Gap alone under a block (no nodes, not an empty-zone section): rowsUnderBlock is false in both layouts. The gap opens at B, then gh + rs, then rs. The base layout has the next row at B + rs, so the rows below move by exactly gapShift.
  • Gap on the empty drop zone: rowsUnderBlock is true in both layouts. The gap sits at B + rs, where the zone was. Gap and zone are both row-tall, so the rows below stay put, as on the base branch. The pointer over the gap maps back to the zone's own slot.
  • No gap: unchanged.
  • aGapUnderThePinnedBlockMovesTheRowsBelowByItsShift still holds: its Pinned section has no nodes, showEmptyPinned is false (so emptyDropZone is false), and emptyDocSections is empty. So rowsUnderBlock is false, gapY = 52 = block.maxY, and the header moves by gh + rs = gapShift. The test file is unchanged in this commit.

The verdicts from my earlier reviews at 5ca9bed and cbbada1 stand. Nits 2, 5 and 6 are fine to leave as they are.

@cursor

cursor Bot commented Oct 22, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex xhigh, correctness first): SHIP at c027960

  • Reviewer: Codex (gpt-6.1-sol, xhigh) through acpmux, read-only, with the full PR diff against base, the PR's title and body, and a checkout at this head. It traced the changed metrics through the layout (groups open and folded, folders, the Pinned block, empty sections), the fold path, drag and drop, the empty-area hit test, chat history placement, the density tokens and the leading pin's placement. No blocker or should-fix finding.
  • Base merge: the PR's diff against base at c027960 is the same as at the reviewed cce18bc (only hunk offsets moved), and it still merges cleanly with the current feat-cmux-next.
  • Fleet compile: cmux-ci compile-check --ref c027960c8d7d3300c37cb8f91dad3e577f12cf25 --app passed (job 7c6b6f78c41ad2ac1337e4f1).
  • CI reds at this head are base reds, none from this PR: crash-class rules (CEFFileDragRelay super.draggingEnded, not touched here), release-notary and Guard status, cmux-next checks (red check "Checks job structure": the web-bundles submodule test; namespace-type findings are warn-only and in files not touched here), and cmux-next generated files (action-surfaces.json stale from settings sources this PR does not touch; the job's own warning says the base is stale too).

teamleaderleo and others added 2 commits October 22, 2026 02:04
…o (base #20905 used the removed groupBottomPadding)

Merging feat-cmux-next brought #20905's status layout, which still added
SidebarLayoutMetrics.groupBottomPadding after each status section; this PR
removes that padding, so the app no longer compiled. A status section now
ends like a group: the next header follows the last row by the row spacing.

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
@cursor

cursor Bot commented Oct 22, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / tooling-tests is red on 17 of 17 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@cursor

cursor Bot commented Oct 22, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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.

@teamleaderleo teamleaderleo added the hold cmux-next batch queue: keep this PR out of the batch (docs/ci/cmux-next-batch.md) label Oct 22, 2026
teamleaderleo and others added 2 commits October 26, 2026 19:45
…form-spacing

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Views/SidebarListView+Drag.swift
The target look gains a Row gaps row and the log names the three earlier
commits of this branch that changed the sidebar views without a trailer.

Sidebar-Look: ALL THIS RELATIVELY UNNECESSARY SPACING AFTER GROUPS AND AFTER PINS

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-b6dd9baa949f76f9d9ab
teamleaderleo and others added 2 commits October 26, 2026 19:56
… row spacing

A drag that empties the Pinned block shows its drop zone (or the drop's
gap in its place); the next row adds a section gap on top of the zone's
row spacing (10 / 14 pt instead of 2). Fails on the parent commit. The
view tests also restore the motion override they set instead of setting
it for the whole suite.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-b6dd9baa949f76f9d9ab
The drop zone (or the drop's gap in its place) under an emptied block
already ends with the row spacing; the next section added a section gap
on top of it. The layout now carries what follows a block: the row
spacing under a bare block, nothing under its drop zone, a section gap
under its groups.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-b6dd9baa949f76f9d9ab
teamleaderleo and others added 2 commits October 26, 2026 20:04
… by Status keep the row spacing

An emptied section without a title has a 0 pt block and its drop zone
alone; Group by Status puts a section gap under the Pinned block or its
drop zone. Both add a section gap where the row spacing belongs. Fails on
the parent commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-b6dd9baa949f76f9d9ab
…bove Group by Status

A document section that ends in its drop zone (or the drop's gap) adds
nothing more under it, with or without a block above the zone, and Group
by Status takes the same spacing as any section under a block: the row
spacing under a bare block, none under a drop zone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-b6dd9baa949f76f9d9ab
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra xhigh): SHIP at 06251dd

With compact metrics, section spacing is 8 pt, row spacing 2 pt, and top padding 4 pt.

  • Pinned block + empty machine: base leaves an 8 pt gap; head leaves 2 pt. Head improves this by 6 pt.
  • Empty machine before a custom block: both base and head start the block 4 pt below y=0 because both clear firstSection.

The empty-status/firstSection behavior remains a follow-up, but is not a head regression.

Run: codex exec --sandbox read-only -m gpt-6-astra -c model_reasoning_effort=xhigh through review-router, fourth round. Rounds 1-3 (at 18d0424, d9c103d, 06251dd) were FIX FIRST: the drop zone, untitled drop zone and Group by Status spacing (fixed, tests first), then the empty-machine Group by Status case, which this round compares with base: not a regression (base 8 pt, head 2 pt), left as a follow-up.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next swift test red at 06251dd is not this PR's:

  • red on base 0c1814b too (fleet run of the same package suite at the base, key adopt-23800-base-0c1814b6): theSectionsComeFromThePriorityClassifier, aKeyedBatchCutShortByItsDeadlineAnswersARetry, aPaneMovedToAReplacingScreenStaysInTheWindow, newTabMenuListsTheKindsFirst, noTwoRowsOfOneMenuShareAnIcon.
  • deadline timeouts on the CI host that pass at this head on the fleet (step d86954a1) and on base: aCreatedTabThatNeverShowsStillAnswersRanBeforeTheDeadline, the BrowserTabMirrorTests mirror tests.
    SidebarUniformRowSpacingTests passes at this head. The fast-gates and review-link reds were GitHub installation rate limits (the gates themselves passed); rerun green.
    Hold removed: a small sidebar spacing fix (Leo, 2026-10-23: small sidebar behavior fixes land through the normal path); risk named in the body.

@teamleaderleo teamleaderleo removed the hold cmux-next batch queue: keep this PR out of the batch (docs/ci/cmux-next-batch.md) label Oct 26, 2026
@teamleaderleo
teamleaderleo merged commit 43ba57a into feat-cmux-next Oct 26, 2026
164 of 167 checks passed
@teamleaderleo
teamleaderleo deleted the sidebar-uniform-spacing branch October 26, 2026 21:31
@github-actions

github-actions Bot commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

This branch was previously deployed

3 inactive (2 outdated) deployments
ci-routing-agent — 06251dd5 Deployed Oct 26, 2026 by teamleaderleo via namespace autofix #3542
artifacts — 5ca9bed6 Deployed Oct 21, 2026 by teamleaderleo
sentry-dsyms — 5ca9bed6 Deployed Oct 21, 2026 by teamleaderleo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant