cmux NEXT sidebar: harness icons with stable colours on agent rows, no routine status words
Leo (2026-10-29): "all of these icons that are literally all the same icon, that is terrible ... one of these is Codex, one of these is Claude ... randomize the colors."
Applies the merged sidebar design spec (leo-workspace #1513): every agent or session row shows a harness icon with a stable per-item colour fallback, no type label repeated on child rows, no routine status words in row text, and hover controls held while their menu is open.
Root cause
Remote chats and Chief subagents passed the raw acpmux harness id as the row's brand id. A harness id is not a brand id: codex maps to the OpenAI mark only through AgentBrandCatalog.brand(for:). So Codex sessions resolved to no mark and drew the generic glyph. SidebarItemInfo.agentBrand(forHarness:) now maps the id at each source (remote chats, Chief subagents, Priority).
What changes
- Harness marks. Priority rows now draw their session's mark (
SidebarPriorityEntry.brand, filled in byAgentPriorityRanking). Codex, Claude and other catalog harnesses draw their own marks. When a harness has no registered mark, the row falls back to a person glyph. - Stable fallback colours. When a harness has no registered brand mark, the glyph is tinted with
SidebarItemInfo.stableAgentColor(for: id). That isGroupColor.unset, an FNV hash, so a session keeps one colour across launches and machines. This covers Priority rows, Chief subagent rows, remote machine chats, and harness workspaces' agent marks. Registered marks keep their current tint. - No status words. Priority rows used to show a chip with "Needs you", "Done", "Failed" and the like. Now they show only a working duration, and the indicator dot carries the state. The words stay in the accessibility label.
- Untitled Chief children. A subagent with no task title used to read "Subagent" on every row under the Chief header. Now its title is empty, it is identified by its icon, and "Subagent" stays in its accessibility label (and in the pane's More menu).
- Workspace marks. A harness workspace with no registered icon or brand now draws its kind's symbol in its stable colour, where before it drew no mark.
- Hover-menu hold. A workspace item's more and close controls stay revealed while the menu opened by its hover more button is open (
showsMenu). The right-click context menu is left as it is: the spec rule covers a menu opened by the hover-revealed control, and holding the pill on right-click would be a new look nobody asked for.
Geometry
Row heights, insets and the trailing column are unchanged. The Priority row's new mark uses the sidebar's shared columns (SidebarStyle.iconColumnCenterX / leadingTextX, the same columns Home, pinned and workspace rows use). It adds no local inset. Its title and preview start on that text column.
Overlap
pr-overlap was read through REST PR file lists, because the broker refuses GraphQL. None of these PRs makes the same fix; they touch the same files:
- #27561 (trailing slots):
SidebarItemRowView.swift,WorkspaceRowView+Rendering.swift. Merges clean. - #27530 (tab hierarchy):
WorkspaceRowView.swift,WorkspaceRowView+Rendering.swift. Textual conflict inWorkspaceRowView.configure: #27530 moves the mark image intoSelf.agentMarkImage. Whichever lands second carries the fallback-colour lines into it. - #25231 (Priority drag):
AgentPriorityRanking.swift,SidebarPriorityPanel.swift,SidebarPriorityRowView.swift. Merges clean. - #26786 (machine link state):
RemoteMachinesSidebar.swift. Merges clean.
Chief precautions: no changed path is in the rulebook's Chief list. SidebarTransientItem+Chief.swift and ChiefPaneTools.swift live in CmuxNextAgentLanes.
Tests
SidebarAgentIdentityTests(new): Codex and Claude sessions resolve to their own marks (Priority and Chief rows); stable, differing fallback colours; the Priority mark and title on the shared columns; no visible status word, with the words kept in accessibility; the hover controls held while the menu is open.ChiefSidebarItemTests: untitled children have an empty title.HomeDockTabRowToolsTests: the subagents menu keeps "Subagent" for an untitled child, while its sidebar row stays icon-led.
Observed / Not run
- Observed:
scripts/cmux-next/prepush-gate.pyreports no new violations. - Observed: independent Codex reviews (gpt-6-astra, high, fast). The first three returned FIX, and each finding is fixed in this branch: a cross-file
privateread; the menu-title test; a fallbackNSColorresolved outside the theme scope; raw harness ids used as brand ids. The verdict at the final head follows in a comment. - Not run from this lane: this is a broker-only lane VM with no fleet client, so
cmux-cihere runs onlytest. Swift compile and tests run in this PR's CI (fleet test-compile). The before/after capture is requested from the coordinator:cmux-ci capture e5a2e56a4feb5758276275a4c652336e4552a2de --state scripts/cmux-next/media/states/sidebar-icon-column.json --pr 27586(before) and the same at the head (after). - Not covered by a capture fixture: the Priority view needs live agent chats. The unit tests above cover its mark and columns.
Capture
The earlier sidebar-icon-column.json capture showed no agent rows, so it can't show this change. Capture-only commits add a DEBUG fixture, debug.sidebar_agent_fixture plus scripts/cmux-next/media/states/sidebar-agent-identity.json. It seeds Codex, Claude and an unregistered acme-agent harness across every Priority state, and adds two untitled Chief subagents and one titled one. The commits sit on their own branches and are not part of this PR's head:
- before =
e5a2e56a+ fixture:cmux-ci capture da54380d547db72fea2e1ac12ee4156e9d26a32c --state scripts/cmux-next/media/states/sidebar-agent-identity.json --pr 27586(lane/sidebar-agent-fixture-before) - after =
4c2b948e+ fixture:cmux-ci capture 58926031dfe8be62e03f7c39657247d551410d2e --state scripts/cmux-next/media/states/sidebar-agent-identity.json --pr 27586(lane/sidebar-agent-fixture-after)
The printed Markdown for both goes here once a capture host runs them. This lane VM has no fleet client.
Capture at the head
cmux-ci capture 6a1cf77759209812215bea418f36b51f8c6f9ca2 --state scripts/cmux-next/media/states/sidebar-icon-column.json --pr 27586 (the showcase sidebar with the Debug row badge preview rows; it has no agent rows, so it shows the unchanged geometry, not the new marks):
Capture steps-fce8c13efa at 6a1cf7775920 (fleet build, capture mini, text checked for private data)
| Light | Dark |
|---|---|
![]() | ![]() |
Changelog
- Changed: Sidebar agent rows show each session's harness icon, with a stable colour when the harness has no icon; Priority rows no longer repeat status words.
risk: normal
Agent session: agent session
š¤ Generated with Claude Code

