Sidebar: draw a Cloud machine's section like every other group

Merged
TE
2d ago
+265-23

Leo-ask: ask-5ab56480d2

What

Leo, 2026-10-29, on the Cloud rows at the bottom of the sidebar:

"why is there all this weird stuff at the bottom of the sidebar"
"the rendering gets borked there too :("
"a whole lot of this cloud stuff ought to get better..."

Leo, 2026-10-30, on this PR's earlier capture (each Cloud machine a header with a green dot, over a row with a cloud icon, the title "cmux" and a second line "build-vm · ~"):

"but what? why is it styled like that in the first place ?"
"what the f*** is this ? why"
"when the f*** did i say i wanted a second fing line and a green dot and a fign ICON ON THE LEFT!??!!?!?!? JUST DEPICT IT SIMILARLY TO EVERYTHING ELSE"

A Cloud machine's section now draws like every other group in the one-list sidebar:

  1. Header: each Cloud machine with workspaces keeps its header in one list (keepsHeaderInOneList), and it is the name, the chevron and the +. No status dot while connected (SectionHeaderRowView.tone, as This Mac already has). A down machine keeps its mark and words (Disconnected, #28409; Paused; Failed to start): that is information.
  2. Rows: one line, the title, with no icon before it. The machine mark stays where base #29833 put it, in the trailing status column at a status mark's size, on every Cloud row (Leo, 2026-11-01: "WHY ARE THE CLOUD ICONS LIKE THIS ON THE LEFT WHO DID THIS", "I HATE HOW SMALL THEY ARE, I HATE THAT THEY'RE ON THE LEFT, I HATE THAT THEY'RE ON THE BOTTOM"). His complaint was the mark's place and size, not having it, so this PR no longer hides it under a Cloud header (it did at 2b1ccc08). No second line (base already removed it, #28510). VoiceOver says the machine (machineLabel).
  3. Title: an unnamed Cloud workspace whose shell idles at the machine's home reads "Terminal" (SidebarMapping homeShellTitle, localized by the App), never its account's home folder ("cmux") and never the machine's name. A shell whose own title (OSC) reads like that folder keeps its title; a title that is only the folder's path still reads "Terminal". A shell in a project folder keeps that folder's name (app); a named workspace or a tab the person named keeps its name. This replaces #28045's naming (which titled such a row by the machine), so the two never disagree.
  4. Tab row: none. Base has since removed the sidebar's workspace tab rows (8a3af6be), so a Cloud row has no tab row under it, like every other row.
  5. This Mac and SSH: unchanged. An SSH header keeps its dot and an SSH row its mark (anSSHRowKeepsItsMark, aDownCloudHeaderKeepsItsState); This Mac's and an SSH shell at home keep their folder name.

A Cloud machine with no workspace (paused, connecting) lists nothing in one list, as before.

Captures

The real SidebarListView drawn offscreen at 2x on a fleet Mac (Soft Blue), the same scene before and after: this Mac's "UI think tank" group and a loose row, then four Cloud machines made from one image, each with one unnamed workspace whose shell idles at /home/cmux. The before is the head Leo answered (workspace tabs on, as it had them); the after is the head on today's base, which has no tab rows.

before (7d5deca3, the capture Leo answered)after (918be695, head; a pinned Cloud row on top)
lightcloud before lightcloud after light
darkcloud before darkcloud after dark

Measured rows (the capture's own row table, light):

beforeafter
Cloud headername, green dot, chevron, +name, chevron, +
Cloud workspace rowcloud icon on the left, "cmux", second line "build-vm · ~", 37 pt"Terminal", one line, 24 pt (as tall as "cmux NEXT coordinator"), base's trailing machine mark
its tab row"/home/cmux"none (base removed tab rows)
first Cloud header y / row y116 / 140116 / 140
four machines end aty = 494y = 338

I viewed both after images at the head: each Cloud machine reads as a header like the group above it, one "Terminal" row under it with the small trailing mark, and the pinned "deploy" row keeps the same trailing mark.

Tests

scripts/ci/package-test-lane.sh suite Packages/macOS/CmuxNext SidebarCloudRowLookTests,SidebarCloudMachineHeaderTests,SidebarMachineMarkTests,SidebarNoSecondLineTests,CloudLinkEndedHeaderTests,SidebarTabHomeTitleTests,MachineLinkStateTests,SidebarLookContractTests through cmux-ci run --class light:

  • Red at 69fc57a8 (this test on the code before the fix: the PR's 15baa6a6~1 plus the test's compile fix): SidebarCloudRowLookTests fails with 5 issues: aConnectedCloudHeaderHasNoDot (tone .success, connected and update-available), aCloudRowIsOneLineWithNoIcon (content.machine is the build-vm cloud mark), aCloudShellAtItsHomeReadsTerminal (/home/cmux and /home/cmux/). Its anSSHRowKeepsItsMark, anSSHOrLocalShellAtHomeIsUnchanged, aCloudWorkspaceWithANameKeepsIt and aDownCloudHeaderKeepsItsState pass, as do SidebarCloudMachineHeaderTests, SidebarMachineMarkTests, SidebarNoSecondLineTests, CloudLinkEndedHeaderTests, SidebarTabHomeTitleTests, MachineLinkStateTests and SidebarLookContractTests (7 of 8 suites pass).
  • Green at 7f40cdc0: all 8 suites pass. After merging feat-cmux-next (28c330e6, a clean merge): all 8 suites pass again.
  • Review fixes (Astra at 28c330e6: a pinned Cloud row lost its machine, also in VoiceOver; an OSC title like the home folder became "Terminal"), suites above plus SidebarLayoutFoldTests: red at f5b07806 (the tests alone), aPinnedCloudRowKeepsItsMark (no mark, label "deploy" without "build-vm") and aCloudShellWithItsOwnTitleIsNotTerminal fail, 8 of 9 suites pass; green at 2b1ccc08 (head), all 9 pass.
  • Base #29833 (the trailing machine mark) at 918be695: the mark hiding is gone; the rest stays. Ten suites (the ones above, SidebarLayoutFoldTests, SidebarHostGroupLayoutTests), by name against base at the merge base a85484e8: all 10 pass at the head (with SidebarMachineMarkTests, which failed at b68a26eb); on base only this PR's own SidebarCloudRowLookTests and SidebarCloudMachineHeaderTests fail.
  • Review of 918be695 (a connected Cloud header's tooltip lost "Connected"; a shell titled with its home path, /home/cmux, did not read "Terminal") fixed at 2bbc3388, test first at 9ed2b9e9. Eleven suites (the ten above plus CloudMachineCostTests): at 9ed2b9e9 only SidebarCloudRowLookTests.aCloudShellWithItsOwnTitleIsNotTerminal and CloudMachineCostTests.theCloudHeaderTooltipCarriesTheCostLine fail; at 2bbc3388 all 11 pass. Delta review: SHIP at 2bbc3388.
  • The wait for Leo to look at the after capture is dropped: screenshots never block a land, he tries the build himself (Leo, 2026-10-31: "WE DON'T NEED SCREENSHOTS JUST LET ME TRY THE STUFF OUT").
  • Codex review BLOCK at 8a39e401 (the row gap suites SidebarCloudRowGapTests and SidebarOneRowPerWorkspaceTests measured workspace rows only, so a Cloud header's section spacing read as a band; an idle Cloud shell titled zsh, -bash or ~ at its home still read "cmux") fixed: tests at e4bf3db4, fix at c1e68590. Fleet, both on #34274 (base could not build its web bundles): with the tests only, SidebarCloudRowLookTests.aCloudShellTitledWithTheShellsNameReadsTerminal fails; with the fix, 12 of 13 suites pass, and the 13th, SidebarLookContractTests.theHoverCloseIsTheRowsTrailingX (the hover close 0.5 pt past the inset), fails the same way on #34274's head alone, a base red. Codex SHIP at c1e68590.
  • Base merge at 9a14b91a: base folded the Cloud and SSH loops in SidebarBridge into one; each remote now carries its terminalTitle (Cloud: "Terminal", SSH: none).

Earlier rounds on this PR (the header itself): red at f86f58b6 / green at 88add9fc (SidebarCloudMachineHeaderTests), red at 206f2a56 / green at bf372742 (theOnlyMachineBeingCloudKeepsItsOwnHeader).

Observed / Not run

  • Observed: the fleet red/green runs and the before/after captures above.
  • Not run: a dev build with live Cloud VMs.

Risk

Normal, structural: one header row per Cloud machine with workspaces in one list; Cloud rows lose their machine mark; a Cloud home shell's title. Held (hold label and the HOLD line) until Leo has looked at the after capture, then for a dogfood build. Sidebar look note updated (plans/cmux-next/sidebar-owner.md), Sidebar-Look: trailers on the code commits.

Changelog

Changed: each Cloud machine's workspaces list under a plain machine header, as one-line rows like every other workspace; an unnamed Cloud terminal reads "Terminal".

Viewed after image: yes (light, dark, pinned).

Agent session: agent session

🤖 Generated with Claude Code