fix(sidebar): attach workspace hover previews to the row

Merged
TE
7d ago
+93-75

Final landing verification

Final head f3769628205cedb74e2f2131d6b974cd21c29552 corrects the stale update-card parity test: the update card retains its one-device-pixel gap, while workspace previews touch their rows. The earlier broad exit 143 is not classified as a base red; focused execution below supplies the relevant final-head proof.

Review (Sol): SHIP at f3769628205cedb74e2f2131d6b974cd21c29552, complete final diff, no findings. Primary review confirmed the test-only delta and unchanged production blobs. Syntax and prepush pass.

Matching nine-suite GUI runs completed through scripts/ci/package-test-lane.sh, with gui-session-v1 and CMUX_TEST_REQUIRE_GUI=1:

  • Head f3769628205cedb74e2f2131d6b974cd21c29552, job ea94253eccc08490180c7e0c: 47 tests executed; eight suites passed. Workspace dismissal, pinned-row, rail, geometry, update-card gap, and dwell tests passed.
  • Base 2289f95c73d846c1761d3ca83ba94da658a14203, job a5c27017b724dcc8a9821d25: 47 tests executed; seven suites passed. movingDownPastTheRowsRightEndDismissesTheCard() fails on base and passes on head.
  • Both runs fail only the same two morph assertions in SidebarOneMorphingCardTests: goingFromAWorkspaceCardToTheUpdateCardMorphsTheOneCard() and goingFromTheUpdateCardToAWorkspaceCardMorphsBackAndParksTheHighlights() record empty animated sizes. scripts/ci/test_reds.py classify reports own: false with those exact two shared failures. Both runs completed all requested suites; no crash or cut-short result is excused.
  • Exact-head compile and fast gates passed. The static job fails only the unchanged base SwiftUI findings in HomeChatColorsPanel.swift and HomeChatColorsView.swift; the sources, checker and allowlist are identical at base and head.

Summary

Workspace hover previews touch the drawn workspace row, before the sidebar resize/drag thumb. Pinned workspaces use their drawn pill. Horizontal pixel snapping goes toward the row so fractional coordinates leave no seam; top alignment, dwell and preview contents stay the same. Group/rail previews use zero gap at their existing column anchor.

Leo, 2026-10-28:

“I mean the gap between the hover preview and the, you know, the workspace sidebar element thingy.”

Folded into S2. Reference: the cmux NEXT hover-preview treatment in cmux-design-references/apps/cmux/live/sidebar-hover-preview-session-list.png; keep our colours and glass. Non-sidebar update and PR cards retain their existing one-device-pixel gap.

Testing

  • Integrated feat-cmux-next at 2289f95c73d846c1761d3ca83ba94da658a14203; then-reviewed head d3f0e0762a994eb63ff5cac70cb0d191e05775ce. The product diff has the same stable patch ID as the previously reviewed fix. The only merge conflict was independent additions to the sidebar ownership notes; both were retained.
  • Review (Sol): SHIP at d3f0e0762a994eb63ff5cac70cb0d191e05775ce, whole final diff, no findings. Base hover sweep behavior is preserved.
  • Focused command: scripts/ci/package-test-lane.sh suite Packages/macOS/CmuxNext HoverCardEscapeGeometryTests,HoverCardRowAlignmentTests,HoverCardWindowClampTests,SidebarHoverCardEscapeTests,PinnedRowHoverCardTests,SidebarRailHoverCardTests, through the fleet with gui-session-v1 and CMUX_TEST_REQUIRE_GUI=1.
  • Green: fleet job 5c46d28d158411204dc4b893 at d3f0e076 passed all six suites (exit 0).
  • Red: the same suite runner with SidebarHoverCardEscapeTests at pre-fix 0fd91e18e1f85110f6a4bde9dc9d303cd06abfcd, job de1fad7638ed726dc5a7c447, executed six tests and failed the no-gap assertions: card starts at 440.0 pt while the row ends at 438.5 pt, a 1.5 pt gap. This valid assertion receipt replaces the earlier GUI-session-loss run b4cae97fbc9fb0d2a101fa39.
  • Swift syntax (13 files), git diff --check, and the static prepush gate passed. Hosted static-check job has only the base No new SwiftUI findings in HomeChatColorsPanel.swift and HomeChatColorsView.swift; both offending files, checker and allowlist are byte-identical to the integration base. Hosted pushed-commit checks passed.

Observed / Not run

Observed: final-head native test execution and independent whole-diff review. General local verification still reports localization debt; this PR changes no catalog, checker, rule or baseline inputs. The real before/after captures below remain bound to their stated original SHAs; no new capture was generated for this base merge. Product merge is governed by the exact-head review and focused head/base receipts below.

Risk: horizontal anchor and tracked hit geometry change for workspace previews. Existing screen clamps, top alignment, dwell and non-sidebar placement remain in use.

Captures

Real fleet captures use the same focused workspace-preview fixture and passed the mini privacy scan (no private terms).

After steps-b280978dd1 at 6287fdf3b289 (fleet build b5aea4f557f42ad5dab0bff5, capture mini, privacy checked)

LightDark
lightdark

Before steps-b280978dd1 at 3a7653b054ed (fleet build 9b15699f0e22c859756839ba, capture mini, privacy checked)

LightDark
lightdark

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


Summary by cubic

Sidebar workspace and group hover previews now sit flush with the row's drawn fill instead of one device pixel outside the sidebar's edge, so each preview reads as one surface attached to the row.

  • The shared placement rule covers workspace rows, pinned workspace pills, group headers, and the compact rail; cards keep their row's top alignment.
  • Pointer escape and placement use the same drawn fill, so moving below the row dismisses the preview.
  • Non-sidebar .beside cards (update cards, pull request badges) keep their existing one-pixel breathing room.
  • The hover-card capture tour now creates and focuses the new workspace before capturing its card, so the sample shows a real workspace preview.

Agent session: agent session

2026-10-29 landing evidence

  • Exact head d3f0e0762a994eb63ff5cac70cb0d191e05775ce: fleet step 065089c9f6aca6e06b69082e passed all six focused hover-card suites (exit 0).
  • Base 2289f95c73d846c1761d3ca83ba94da658a14203: fleet step ca5a53fe4801f24192fda88b completed with only the existing SidebarHoverCardEscapeTests and SidebarRailHoverCardsTests base failures; the other four suites passed.
  • Independent Astra exact-head review is running for the final merge head; merge remains pinned to this SHA.

Agent session: agent session