Repository navigation
fix(cmux-next): clarify disclosed workspace tab hierarchy (carries #27128) - #27530
Conversation
Workspace rows remain the visual root while disclosed tabs use a 16 pt child inset and quiet secondary typography. Focused, selected, and unread tabs retain primary contrast. Sidebar-Look: Aziz: "This workspace tabs disclosure is annoying, can\x27t make out workspace from non-workspace easily." Agent-Session: https://cmux.com/deeplink/agent?id=aid-b0423583d921f5ee2f35
Use throwing native fixture setup, direct workspace-column assertions, and primary/secondary ink checks across focus, unread, reconfigure, and reuse transitions. Sidebar-Look: Aziz: "This workspace tabs disclosure is annoying, can\x27t make out workspace from non-workspace easily." Agent-Session: https://cmux.com/deeplink/agent?id=aid-22454abfd16b2868c248
Keep the regression fixture compilable on the base ref by finding the production ChromeLabel and checking its actual frame, font, and theme-resolved ink across state transitions and reuse. Sidebar-Look: Aziz: "This workspace tabs disclosure is annoying, can\x27t make out workspace from non-workspace easily." Agent-Session: https://cmux.com/deeplink/agent?id=aid-22454abfd16b2868c248
Render native disclosed tab rows at 200 pt in light and dark for indentation-only, typography-only, and the combined treatment; keep the variants fixture-only and add disclosed tabs to the existing sidebar look gallery. Sidebar-Look: Aziz: "This workspace tabs disclosure is annoying, can\x27t make out workspace from non-workspace easily." Agent-Session: https://cmux.com/deeplink/agent?id=aid-22454abfd16b2868c248
Keep the throwing favicon fixture syntactically complete before GUI validation. Sidebar-Look: Aziz: "This workspace tabs disclosure is annoying, can\x27t make out workspace from non-workspace easily." Agent-Session: https://cmux.com/deeplink/agent?id=aid-22454abfd16b2868c248
Remove tab-row debug-only geometry and ink accessors now that the regression finds the production ChromeLabel directly. Sidebar-Look: Aziz: "This workspace tabs disclosure is annoying, can\x27t make out workspace from non-workspace easily." Agent-Session: https://cmux.com/deeplink/agent?id=aid-22454abfd16b2868c248
Sidebar-Look: Aziz: "This workspace tabs disclosure is annoying, can\x27t make out workspace from non-workspace easily."
Sidebar-Look: Aziz: "This workspace tabs disclosure is annoying, can\x27t make out workspace from non-workspace easily."
Sidebar-Look: keep disclosed tabs anchored after parent layout
Sidebar-Look: compare child tabs with the workspace text column
Sidebar-Look: keep hierarchy assertions independent of icon width
Sidebar-Look: keep disclosed tabs anchored after parent layout
# Conflicts: # plans/cmux-next/sidebar-owner.md
Sidebar-Look: no visual change
Use a nonoptional view sequence and stop at the first sidebar ancestor. Account for the existing agent brand in the exact title inset regression. Sidebar-Look: no visual change
Sidebar-Look: no visual change
Keep model patches targeted, resolve child geometry on reload and agent-mark settings changes, and compare native gallery treatments in equal viewports. Sidebar-Look: disclosed tabs retain their title-column anchor
…b-hierarchy # 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)
red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/40999786770 at e58eb64 failed: cmux-next checks (god files, concurrency, crash safety, l10n). |
|
Owned by an agent session · session |
…er-sidebar-tab-hierarchy # Conflicts: # plans/cmux-next/sidebar-owner.md
|
Review (codex-review-box/gpt-6-astra high, lane-place): SHIP at 326aedb SHIP No blocking findings. AppKit tests could not run in this Linux box; review was static. |
…er-sidebar-tab-hierarchy # Conflicts: # scripts/ci/display-suites.txt
|
Review (codex gpt-6-astra high, next-review): SHIP at b3bae4d No blocking findings. |
…er-sidebar-tab-hierarchy
|
Review (codex gpt-6.1-sol high, next-review): SHIP at c9c58f0 No blocking findings. |
|
Shipped in:
|
The slice head 2b2fc8e (= 43037147a0b's tree: slice + trunk sync c09bb74) merges the feat tip, 130 new commits. 58 files conflicted: - 0 reuse the previous round's resolutions: this round's base is the previous feat tip a14725a, so no hunk had all three sides equal to 5f39f9e's inputs. - Regenerated, not hand-merged: the 4 CmuxMessagesLab patches (Fixture, Layout, RowDrawing, WindowView) from the merged vendored sources against the pinned upstream reconstructed from the side whose patch was consistent (feat's for 3, perf's for WindowView; feat 65de604 edited WindowView.swift without rewriting its patch). - 54 resolved by porting feat's change into perf's shape: - Package.swift (CmuxNext: Floating tests get CmuxNextDesign with perf's Wakeups deps; CmuxMobileKit: Model gets feat's Resources with perf's CmuxSafeConcurrency). - Lineage parents #24136: SidebarSessionTreeFeed (recordedParents and per-host links on perf's ServiceObservation), RemoteAcpmuxWire (host/linksAlias notes posted on perf's mainWork; test-only inits take them too), AgentTabRemoteHost, AgentTabs+Wiring, AgentSessionWorkspace (the record is one completion task on main), tests. - Artifact sandbox #26216: perf's page-host PageArtifactFrame already serves the sandboxed endpoint; feat's navigation tests ported to PageNavigation, frame-ancestors expectation added, artifactFrameURL keeps only the page host, webviews tests on perf's URLs. - pane.commandAvailability (#25405) and chief.face (#27914) beside perf's keyToPaint and Wiring init. - State files off main #27749: AgentUnsentDrafts (perf's ObservedMap) and ScrollAnchors (blockingDecode) on AgentPaneStateFile. - AgentPaneTransport.close: perf's close reason plus feat's host-request failure and trust reset. - CloudService: perf's file, plus #27104 signedOutCreation (scope, policy, stop, signOut in +Machines) and #26740 autosize/sizePick; listIsCurrent moved to +AppServer as feat did. - debug.object_menu into perf's DebugDriverControl; Home fixture presence/faces beside perf's field. - Palette overlay window #26951 into perf's paletteBuilt. - Per-window Home #27880 in perf's dockTab helper; active team (1bb1b96) on perf's cloudAuth. - Busy refusal (a930474, 2a9b813) in perf's LineTransport split (+State, +Route, framed write). - Launch snapshot sidebar doc (dc38061): DaemonLaunchSnapshot.sidebarDoc, shown once settled (whenSettled), its connect follow a ServiceObservation; the Rust test moved to launch_snapshot_tests.rs. - Hover card corners (bc66475) with perf's interactive flag; Chief pet state (#25671) on perf's ServiceObservation and AppearanceSignals; Chief picture crop (#27933) on perf's lanes and optional store; Home presence (#25578) as a FrameObservation; sidebar tab look (#27530) via SidebarLookFollower; settleOpenings (#24374) with perf's snap; Omnibar imports. - acpmux: inbox digest senders without slicing; withdraw_queued async with from_agents_only; cmux-tui-core and platform: connection leases beside perf's modules and InlineSocket (bounded_outbound.rs takes back the `platform::transport` import perf had dropped, which feat's claim_watched_connection names). - webviews: App/NewTab/NewTabScreen (retry, slash commands, at), settings keys moved to cardRows.ts. - Feat's tests that call perf-changed inits fixed: TabConcentricCornerTests (input:), HomeChatPresenceFacesTests (deadlines:, frame delivery), RemoteChildSessionsTests (main run loop for posted notes). Generators: cargo metadata in cmux-tui, cmux-tui/fuzz, Native/DiffSidecar and optchat-chief changed no lock; gen-features.py --check, gen-chromium-host-wire.py --check and --check-ops, sync-resource-api.py --check pass. webviews: bun run check passes. schemas/settings/settings-schema.json stays perf's (generated; the autofix regenerates it): until then feat's chiefLook.test.tsx misses the home.bubbleColors rows.
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
Conflicts kept base's new behaviour (sidebar.textSize glyph step, the empty group's +, the empty section hint, #27530's tab hierarchy, pinned-only pin button) with positions read from the shared sidebar columns. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0
… padding Leading glyphs start on lead at base's size (Lawrence's titlesStartAsFarLeftAsTheRowAllows: an icon sits where text would start); only the text column after them is the grid's (36 compact, 44 comfortable). SidebarGridAlignmentTests reads base's new group edge padding (63d46f8) and leaves the tab row's lead to #27530's hierarchy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0
* Add shared layout grid tokens and validate their CSS and Swift copies Agent-Session: https://cmux.com/deeplink/agent?id=aid-2bd8d22f53cb987a8eea * test(webviews): measure gallery grid lines from runtime tokens Add warning-level surface scenes, baseline/cap-height text measurements, named optical offsets, and recoverable per-line JSON evidence. Missing mounts and unknown selector coverage fail. Browser measurements and full checks are delegated to the parent fleet run; scoped lint, formatting, browser lane discovery, gallery IDs, and TypeScript syntax checked locally. Agent-Session: https://cmux.com/deeplink/agent?id=aid-b562541d72b66523f655 * Add transcript rhythm tokens and role-based grid measurement selectors Agent-Session: https://cmux.com/deeplink/agent?id=aid-2bd8d22f53cb987a8eea * Keep selector fallback valid when the marked surface is the target itself Agent-Session: https://cmux.com/deeplink/agent?id=aid-2bd8d22f53cb987a8eea * test(webviews): align grid scenes with shared surface roles Use stable surface IDs across variants and ink-only role hints with selector fallbacks. Add existing plus, mode, project and tray scenes plus a 31-row expanded subagent fixture. Retain transcript action coverage and leave toolgroup/rhythm implementation to its owner. Scoped lint/format and gallery entry discovery passed; browser measurement remains delegated to parent fleet integration. Agent-Session: https://cmux.com/deeplink/agent?id=aid-b562541d72b66523f655 * Identify repeated grid scenes by their measured root Agent-Session: https://cmux.com/deeplink/agent?id=aid-2bd8d22f53cb987a8eea * Add shared transcript between-turn gap token Agent-Session: https://cmux.com/deeplink/agent?id=aid-2bd8d22f53cb987a8eea * Run layout grid validation in NEXT checks and scale the base unit Agent-Session: https://cmux.com/deeplink/agent?id=aid-2bd8d22f53cb987a8eea * Run layout grid drift check in the webviews warning branch Agent-Session: https://cmux.com/deeplink/agent?id=aid-2bd8d22f53cb987a8eea * Keep sidebar trailing marks fixed across densities Agent-Session: https://cmux.com/deeplink/agent?id=aid-2bd8d22f53cb987a8eea * Add canonical composer foot gap token and measure against it Agent-Session: https://cmux.com/deeplink/agent?id=aid-2bd8d22f53cb987a8eea * Measure visible placeholder ink and emit each grid scene baseline Agent-Session: https://cmux.com/deeplink/agent?id=aid-2bd8d22f53cb987a8eea * test(webviews): correct card grid fixture selectors Read card fixture JSX: command permission body is its scope line; inline summary omits popover fold and close controls; glance inspector sections have distinct body labels and only Context/Connectors supply header icons. Scope absence diagnostics by fixture/section without changing coverageFailure assertions. Scoped format/lint, gallery discovery, and diff checks passed. Browser validation remains with parent fleet run. Agent-Session: https://cmux.com/deeplink/agent?id=aid-b562541d72b66523f655 * Set composer foot gap token to four points Agent-Session: https://cmux.com/deeplink/agent?id=aid-2bd8d22f53cb987a8eea * test(sidebar): pin row columns and optical centers to the layout grid Keep row heights on sidebarRowHeight and preserve section density metrics. Exercise compact/comfortable columns, three nesting depths and one/two marks without a window. Fleet coordinator runs the red/green comparison. Agent-Session: https://cmux.com/deeplink/agent?id=aid-6422d9d11f16e2728d06 * fix(sidebar): share grid columns across native rows Use LayoutGrid through sidebar density metrics for leading, text, nesting and trailing geometry. Preserve metric row heights and existing section heights and spacing. Keep trailing marks on fixed 20-point pitches and center text by its capital baseline. Preserve the beside-name workspace caret and hover target. Sidebar-Look: Leo 2026-10-29: We need to have the fucking shit aligned on fucking grids and lines and whatever the fuck. Agent-Session: https://cmux.com/deeplink/agent?id=aid-6422d9d11f16e2728d06 * fix(sidebar): preserve iconless and group member text columns Keep text-only rows at lead instead of reserving an empty icon column. Preserve the group rail offset and existing look contracts; expand grid coverage for iconless workspace titles. Sidebar-Look: Lawrence 2026-10-23: text needs to be as left as possible (how it originally was); the header name keeps its members text column. Agent-Session: https://cmux.com/deeplink/agent?id=aid-6422d9d11f16e2728d06 * fix(sidebar): preserve base density rail geometry and hit targets Keep alignment changes in content columns. Restore comfortable row height, existing font rules, 1.5-point row edge, 20-point control targets, and base group rail/bar positions. Preserve full section/group fill heights. Pin these contracts in SidebarGridAlignmentTests. Sidebar-Look: Leo 2026-10-27: one or two pixels, 1.5. Grid review: columns only; density, control hit boxes and group rails stay as base. Agent-Session: https://cmux.com/deeplink/agent?id=aid-6422d9d11f16e2728d06 * fix(sidebar): retain session tree depth token Restore the base SidebarDensityTokens.depthIndent compatibility API used by WorkspaceRowView session-tree layout. Keep its original Metrics.space4 geometry while grid columns remain independent. Sidebar-Look: no visual change; restore the existing session-tree geometry. Agent-Session: https://cmux.com/deeplink/agent?id=aid-6422d9d11f16e2728d06 * fix(sidebar): preserve base trailing and title columns Keep base trailing inset and control sizing while adapting content columns to the shared grid. Preserve iconless title intent and group member alignment. Sidebar-Look: preserve base trailing, title and group rail contracts while aligning content columns. Agent-Session: https://cmux.com/deeplink/agent?id=aid-6422d9d11f16e2728d06 * fix(sidebar): align text-only and band columns Keep iconless titles on the lead column, align group names with member text, and preserve the base trailing edge while using the shared column source. Sidebar-Look: align text-only, group and band columns to the shared grid. Agent-Session: https://cmux.com/deeplink/agent?id=aid-6422d9d11f16e2728d06 * fix(sidebar): keep iconless lead at the row inset and band marks on the trailing line Lead sits horizontalInset inside the highlight (12 compact, 16 comfortable), so iconless titles keep Lawrence's as-far-left contract and group header names stay on their members' column. Band rows measure the shared columns from their pill, so their dots and statuses center on the same 24 pt trailing line as list rows. Pinned rows and headers keep the pin on the icon column with icon and title one column in. Row and band fills return to base's full row height. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0 * fix(sidebar): tabs one grid indent under their workspace; titleFrame reports drawn text A workspace's tab rows take depth 1 on the shared columns (+16), keeping base's inset of tabs under their workspace on the grid. The test-only titleFrame accessor returns the caption's alignment rect (the drawn text, without the label cell's 2 pt side padding) so it compares with a workspace title's marquee frame. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0 * fix(sidebar): keep base's icon box outside the row columns The footer avatar and glyph column, chips and icon-only items keep base's app-density icon box; only list rows take the grid's density icon box (20 at comfortable). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0 * fix(sidebar): glyphs keep base's icon box, centered in the grid's icon column SidebarStyle.iconBox (avatar, footer, chips, row glyphs) stays at base's size; only the icon column (SidebarColumns.iconBox: 16, comfortable 20) widens, and row glyphs, pins and color dots center in it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0 * fix(sidebar): glyphs start on lead; grid test follows base's new rail padding Leading glyphs start on lead at base's size (Lawrence's titlesStartAsFarLeftAsTheRowAllows: an icon sits where text would start); only the text column after them is the grid's (36 compact, 44 comfortable). SidebarGridAlignmentTests reads base's new group edge padding (63d46f8) and leaves the tab row's lead to #27530's hierarchy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0 * test(sidebar): the hit-box check lays out a pinned expanded row (base shows its pin button only then) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0 * fix(sidebar): a quiet tab keeps its trailing inset; the comfortable icon frame is the 20 pt column box Tabs with no trailing mark stop their text horizontalInset short of the row end again. Leading icon frames take the grid's icon column box (16 compact, 20 comfortable) and draw their glyph, emoji or well at its own size centered in it, so the text column is 8 pt after the frame at both densities. Tests for both. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0 * test(sidebar): lay out the icon view before reading its glyph frame Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0 * docs(sidebar): log #27598's pre-trailer grid commits in the sidebar owner note The prepush gate's sidebar sweep now names a PR's own commits that lack a `Sidebar-Look:` trailer (#27632). Six of this branch's commits predate the check; each is a reviewed visual change from the grid request, so the owner note logs their shas, as it does for other pre-check commits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Carries #27128 (its commits and authorship unchanged) on top of the current base. Its owner lane is unreachable, so this PR lands it in its place; #27128 gets a comment linking here.
Leo, 2026-10-29: "F***ING JUST DO IT" (the sidebar work is ordered in; the sidebar dogfood HOLD comes off, and the #26809 HOLD only ever covered #26809).
The base merge had one conflict, in
plans/cmux-next/sidebar-owner.md(notes only). Both sides were kept.Aziz reported: “This workspace tabs disclosure is annoying, can't make out workspace from non-workspace easily.”
This PR makes disclosed workspace tabs read as children at a glance while preserving disclosure, defaults, group rails, motion, selection/focus semantics, trailing columns, and all existing tab detail/status/icon behavior. The chosen hierarchy tokens are a 16 pt child title inset (
Metrics.space6viaSidebarStyle.tabChildIndent) and the existing caption scale for tab titles/details. Plain tabs use secondary ink; focused, selected, and unread tabs retain primary ink and the existing focused fill.SidebarWorkspaceTabHierarchyTestscovers ungrouped, grouped, and nested workspaces; favicon and no-favicon tabs; focused/unread state; narrow widths; every density and Minimal Mode; exact 16 pt title anchoring; parent icon changes through model patches and full reloads with the parent offscreen; agent-mark setting changes; clipped text width; late parent realization through the page viewport and reuse pool; leading agent/machine marks; trailing alignment; and row reuse. The assertion-first test was committed before the implementation and failed on the base because tab titles did not meet the child inset contract. The implementation is now at this PR head.Reference: Claude desktop’s
sidebar-linked-session-nesting.pngfor clear parent/child indentation and secondary ink, using our colours and glass. Before/after evidence shows real disclosed workspace tabs in light and dark, built on the fleet and captured on owned capture minis.AATabLinesGalleryTestssupplies the native gallery comparisons. The private Aziz screenshot remains private. The native gallery compares indentation-only, typography-only, and the chosen combined treatment at the same 280 × 360 pt viewport. The typography-only fixture restores the full available text width while keeping trailing controls fixed.The existing row patch and shared tunable watcher invalidate affected child geometry. Status-only patches leave child layout untouched; this adds no timer or observer.
Risk: contained to tab-row title geometry and ink; no layout rows, disclosure state, animation, or interaction semantics change. Existing look, tab switch patch, icon, trailing-column, and tuck tests remain in scope. Swift validation runs through
cmux-cion the fleet; no local build is used.Captures
Capture
steps-e50ee2b79batb4cc7d95c835(fleet build, capture mini, text checked for private data)Before (
188bd094cea3, earlier merge base):Changelog
Capture
steps-97bedbfd7bat3548852dbba9(fleet build, capture mini, text checked for private data)Agent session: agent session
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Fixes the disclosed workspace tab hierarchy so disclosed tabs read as children of their workspace at a glance. Carries #27128 onto the current base; its owner lane is unreachable, so this PR lands it in its place and comments on #27128.
SidebarWorkspaceTabHierarchyTestscovers ungrouped, grouped, and nested parents, every density and Minimal Mode, narrow widths, favicon and no-favicon tabs, and row reuse.Behavior is unchanged for disclosure, defaults, group rails, motion, selection/focus semantics, trailing columns, and all existing tab detail/status/icon behavior. Risk is contained to tab-row title geometry and ink.
Written for commit c9c58f0. Summary will update on new commits.