Repository navigation
cmux NEXT sidebar: harness icons with stable colours on agent rows, no routine status words - #27586
teamleaderleo wants to merge 7 commits into
Conversation
…atus words Priority rows draw their harness mark on the sidebar's shared icon and text columns; a harness with no registered mark tints its glyph with a stable per-session color. Untitled Chief children drop the repeated "Subagent" label (kept in accessibility), Priority rows show only a working duration (status words move to the accessibility label), and a workspace item's hover controls stay revealed while its menu is open. Sidebar-Look: 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" Agent-Session: https://cmux.com/deeplink/agent?id=aid-435b44433b52d27a4338 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r-think-tank # Conflicts: # plans/cmux-next/sidebar-owner.md
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. |
|
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)
|
|
Found 22 test failures on Blacksmith runners: Failures
...and 12 more test failures. View all on Blacksmith
|
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. |
…tension; menu-title test agentMarkFallbackColor was private to WorkspaceRowView.swift but read in WorkspaceRowView+Rendering.swift (a compile error). The Chief subagent menu keeps "Subagent" for an untitled child while its sidebar row stays icon-led, so HomeDockTabRowToolsTests checks that split. Sidebar-Look: no visual change Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-70a6853e5c9cdac5cc9f
edb54bc to
4b63191
Compare
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. |
…heme scope The row cached a resolved NSColor at configure time, so an unknown harness's mark kept a stale light/dark variant. It keeps the GroupColor and resolves it in updateLayer's performWithTheme. Sidebar-Look: no visual change Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-70a6853e5c9cdac5cc9f
Remote chats, Chief subagents and Priority rows passed the raw harness id
("codex") as the brand id, so Codex sessions resolved to no mark and drew
the generic glyph. SidebarItemInfo.agentBrand(forHarness:) maps it through
AgentBrandCatalog.brand(for:) at each source, and SidebarPriorityEntry
carries the brand.
Sidebar-Look: 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"
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-70a6853e5c9cdac5cc9f
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. |
|
Review (codex gpt-6-astra, high, fast; independent of the authoring Claude lane): SHIP at 4c2b948 The reviewer checked the full diff against |
Sidebar icon column: before and afterBoth captures use the state Before: e5a2e56Capture
After: 4c2b948Capture
Agent session: agent session |
…r-think-tank # Conflicts: # plans/cmux-next/sidebar-owner.md
|
Owned by an agent session · session |
Resolves the WorkspaceRowView.configure conflict with #27530: the harness fallback glyph moves into Self.agentMarkImage (so the offscreen title column matches the drawn mark), and the stable fallback colour comes from Self.agentMarkFallbackColor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-8ac862c5f65d08f98445
|
Review (codex gpt-6.1-sol high, next-review): SHIP at 6a1cf77 No blocking findings. |
|
Ownership moved to the agent session that took the claim above: the previous owner's host is unreachable. The new owner carries these commits onto its own branch with a base merge (it keeps #27912's identical |
|
Orphaned: no activity for 24 h, and no lane holds a lease on it. The orphan sweep could not merge |
…arries #27586) (#28327) * Sidebar: harness marks and stable colors on agent rows, no routine status words Priority rows draw their harness mark on the sidebar's shared icon and text columns; a harness with no registered mark tints its glyph with a stable per-session color. Untitled Chief children drop the repeated "Subagent" label (kept in accessibility), Priority rows show only a working duration (status words move to the accessibility label), and a workspace item's hover controls stay revealed while its menu is open. Sidebar-Look: 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" Agent-Session: https://cmux.com/deeplink/agent?id=aid-435b44433b52d27a4338 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sidebar: workspace mark fallback color readable from its rendering extension; menu-title test agentMarkFallbackColor was private to WorkspaceRowView.swift but read in WorkspaceRowView+Rendering.swift (a compile error). The Chief subagent menu keeps "Subagent" for an untitled child while its sidebar row stays icon-led, so HomeDockTabRowToolsTests checks that split. Sidebar-Look: no visual change Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-70a6853e5c9cdac5cc9f * Sidebar: resolve a workspace mark's fallback color inside the row's theme scope The row cached a resolved NSColor at configure time, so an unknown harness's mark kept a stale light/dark variant. It keeps the GroupColor and resolves it in updateLayer's performWithTheme. Sidebar-Look: no visual change Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-70a6853e5c9cdac5cc9f * Sidebar: map a session's harness id to its brand before drawing its mark Remote chats, Chief subagents and Priority rows passed the raw harness id ("codex") as the brand id, so Codex sessions resolved to no mark and drew the generic glyph. SidebarItemInfo.agentBrand(forHarness:) maps it through AgentBrandCatalog.brand(for:) at each source, and SidebarPriorityEntry carries the brand. Sidebar-Look: 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" Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-70a6853e5c9cdac5cc9f * fix(sidebar): a harness kind change re-anchors an offscreen workspace's tabs The carried fallback mark makes a harness workspace with no registered mark draw its kind's symbol beside the title, so the kind is a title-column input: SidebarRowIndex re-lays out the unchanged child tabs when it changes, and the offscreen-parent test covers it. Sidebar-Look: no visual change Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-f8805b2d0f3b1303441e --------- 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)




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:
codexmaps to the OpenAI mark only throughAgentBrandCatalog.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
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.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.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-overlapwas read through REST PR file lists, because the broker refuses GraphQL. None of these PRs makes the same fix; they touch the same files:SidebarItemRowView.swift,WorkspaceRowView+Rendering.swift. Merges clean.WorkspaceRowView.swift,WorkspaceRowView+Rendering.swift. Textual conflict inWorkspaceRowView.configure: fix(cmux-next): clarify disclosed workspace tab hierarchy (carries #27128) #27530 moves the mark image intoSelf.agentMarkImage. Whichever lands second carries the fallback-colour lines into it.AgentPriorityRanking.swift,SidebarPriorityPanel.swift,SidebarPriorityRowView.swift. Merges clean.RemoteMachinesSidebar.swift. Merges clean.Chief precautions: no changed path is in the rulebook's Chief list.
SidebarTransientItem+Chief.swiftandChiefPaneTools.swiftlive inCmuxNextAgentLanes.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
scripts/cmux-next/prepush-gate.pyreports no new violations.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.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).Capture
The earlier
sidebar-icon-column.jsoncapture showed no agent rows, so it can't show this change. Capture-only commits add a DEBUG fixture,debug.sidebar_agent_fixtureplusscripts/cmux-next/media/states/sidebar-agent-identity.json. It seeds Codex, Claude and an unregisteredacme-agentharness 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:e5a2e56a+ fixture:cmux-ci capture da54380d547db72fea2e1ac12ee4156e9d26a32c --state scripts/cmux-next/media/states/sidebar-agent-identity.json --pr 27586(lane/sidebar-agent-fixture-before)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-fce8c13efaat6a1cf7775920(fleet build, capture mini, text checked for private data)Changelog
risk: normal
Agent session: agent session
🤖 Generated with Claude Code