Skip to content

cmux-next sidebar: rows draw no status words; needs you is one yellow dot, never Done - #23767

Merged
teamleaderleo merged 4 commits into
feat-cmux-nextfrom
sidebar-rows/no-done
Oct 22, 2026
Merged

teamleaderleo merged 4 commits into
feat-cmux-nextfrom
sidebar-rows/no-done

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Leo, on nightly 3a63d6d: "WHO BROUGHT BACK THE DONE AND THE TIMERS". Workspace rows showed a blue dot plus "Done" again.

Who brought it back: #23390 ("each row says when its agent needs you, finished or failed") drew the Priority view's chip word on every workspace row as the name line's trailing text, and that includes Done. (The "10m" timer and the blinking dot came from #22826. Those have their own PRs.)

Change: a row now draws only a chip that asks for the user: needs you, failed, lost, Red CI (WorkspaceRowContent.rowChip). When a chat has finished, its row shows only the quiet unread dot it already had. The Priority view keeps its own Done chip. The Debug toggle sidebar.rowStatus and its help text no longer mention done.

Needs you is one yellow dot (Leo: "why ISN'T THIS JUST A YELLOW DOT!?"): by default a row's badge used to fold every wait into Ready, the blue dot (Lawrence 2026-10-18), and #23390 put the "Needs you" word beside it. Now any wait (question, permission, auth) shows as the icon set's one yellow attention dot, in place of the blue dot, never next to it. An error or something unread is still the blue dot. Rows show no status words at all: no needs you, failed, lost, Red CI or Done. The chip is kept only in the row's accessibility label. Tests: SidebarStatusSimpleTests (now includes needsYouIsTheYellowDot) and SidebarRowNoDoneTests.aRowShowsNoStatusWords.

Ranking (review fix): SidebarLaneStatus.chip now drops a finished chat before it picks the most urgent one. Before, an unread finished chat could hide a failed chat in the same workspace. A finished chat whose checks fail still shows Red CI.

Test: SidebarRowNoDoneTests builds a row from the layout's row content (where the chip is read) with a Done chip. It fails if any label on the row, or the row's accessibility label, says Done. It also checks that needs you still shows. SidebarRowStatusTests.aFinishedChatHidesNothing covers the ranking.

Capture steps-006c458297 at 746e08c9bc89 (fleet build, capture mini, text checked for private data). The lane fixture shows two finished rows, "Add dark mode icons" and "Polish the hover cards". At the base they say Done; here they don't. Failed and Needs you still show.

Light Dark
light dark

Leo-ask: ask-c8936f0e52
Leo-ask: ask-02775c2ac1

Agent session: cosmic-gray

🤖 Generated with Claude Code

Leo 2026-10-21: "WHO BROUGHT BACK THE DONE AND THE TIMERS". #23390 drew the
Priority view's chip word on every workspace row, Done included, beside the
row's blue unread dot. A row now draws only a chip that asks for the user
(needs you, failed, lost, Red CI); a finished chat keeps only its quiet
unread dot. The Priority view itself keeps its Done chip.

Test: SidebarRowNoDoneTests renders a row through the layout's row content
with a Done chip and fails if any shown label or the accessibility label
says Done.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray
@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review 2c1275c: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr23767 -f ref=sidebar-rows/no-done -f platform=macos -f backend_mode=local

Passes: CI passes on 2c1275c33e.

CI passes on 2c1275c33e (run 39703175396 attempt 1).

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Bead cx-eajwd created for this PR by the cmux coordinator.

@teamleaderleo teamleaderleo added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 21, 2026
@blacksmith-sh

blacksmith-sh Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Found 3 test failures on Blacksmith runners:

Failures

Test View Logs
nightly cmux-tui resolve/nightly cmux-tui resolve View Logs
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)/
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)
View Logs
test_the_tree_classifies_every_macos_job (main.RoutingTableTests.test_the_tree_clas
sifies_every_macos_job)/
test_the_tree_classifies_every_macos_job (main.RoutingTableTests.test_the_tree_clas
sifies_every_macos_job)
View Logs

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

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / nightly-guards / workflow-guard-tests / release-notary is red on 12 of 16 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (claude-opus subagent, correctness first): BLOCK at 746e08c

What I checked (read-only, from git at base b2f5b94 and this head):

  • WorkspaceRowContent.rowChip compiles and covers every case. .working? matches without binding the associated value, the switch-expression implicit return of State? works, and all 7 cases plus nil are covered.
  • Call site: SidebarLayoutOptions.rowContent is the only place that sets content.chip. WorkspaceRowView.configure (the trailing text and chip) and accessibilityText both read content.chip, so no other path draws a chip on a workspace row. The Priority view (SidebarPriorityRowView) is untouched and keeps Done.
  • New test SidebarRowNoDoneTests: it uses the real APIs as they are at base (the SidebarWorkspace(id:title:lastActivity:) defaults, UnreadState.dot, the SidebarRow init as in WorkspaceRowElapsedTests, configure(_:row:badgeStyle:), ShownText from CmuxNextDesign, Strings.unreadDot with no other Strings in scope, the internal view.chip through @testable). It would fail at base because of view.chip == nil and the accessibility label.
  • Existing tests: none assert a Done chip on row content. SidebarRowStatusTests asserts "finished": .done on ws.agentChip, which this PR leaves alone, so it still passes. theChipReadsOnTheNamesLine checks only needsYou and working.

Finding (blocking, wrong behavior): the PR drops .done after the most urgent state is chosen, so a done chat hides failed, lost and Red CI instead of letting them show.

  • SidebarLaneStatus.chip (CmuxNextAgentLanes/SidebarLaneStatus.swift) keeps the min-tier state, and AgentPriorityRanking.tier ranks .done (1) above .failed/.lost (2) and .ciFailing (3). With one unread finished chat and one failed or lost chat in the same workspace, agentChip is .done, rowChip turns it into nil, and the row shows no chip. Before this PR it said Done; it should now say Failed or Lost.
  • One chat on its own is also affected: AgentPriorityRanking.state gives an unread finished chat whose PR has failing checks .done, because Red CI only outranks working and idle. The row then shows nothing until the chat is read, and only then turns into Red CI. That breaks "Red CI may still show" for the most common Red CI case: the agent finished, opened a PR, and CI is red.
  • Suggested fix: drop Done before picking the minimum, in SidebarLaneStatus.chip. Per lane, a .done state becomes .ciFailing when its checks fail and is dropped otherwise; working and idle are dropped as now; then take the min tier. rowChip can stay as a guard. SidebarRowStatusTests.rowsNameWhatTheirAgentNeedsByDefault would then expect no "finished" entry, and two tests would pin the fix: [unread finished, failed] gives .failed, and an unread finished chat with failing checks gives .ciFailing.

Nits (not blocking):

  • The row still falls back to its age or one-line status where Done used to be. showsTimestamps is off by default, so no timer comes back by default.

… (review)

Review of the previous commit: dropping Done after SidebarLaneStatus.chip
picked the most urgent chat let an unread finished chat (tier 1) hide a
failed or lost one in the same workspace, and hid a finished chat's Red CI,
which ranks only over working and idle. The chip now drops a finished chat
before the ranking and turns it into Red CI while its checks fail.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (claude-opus subagent, correctness first): SHIP at 7bf4d23

I re-reviewed the whole PR (b2f5b94..7bf4d23, 6 files) by reading it in git, with no builds.

  • The blocking finding from my first review is fixed. SidebarLaneStatus.chip now drops a finished chat before the ranking, so an unread finished chat no longer hides a failed or lost chat in the same workspace. A finished chat with failing checks now shows Red CI instead of nothing.
  • The new closure compiles: compactMap { lane -> SidebarPriorityEntry.State? in ... } has an explicit return type. The switch over the non-optional State covers every case (.done, .working, .idle without a binding, then case let state: return state), and failing ? .ciFailing : nil gets its type from the return type. Chaining .min on the next line is valid.
  • The logic matches AgentPriorityRanking.state. A read finished chat with failing checks already comes back as .ciFailing from the classifier, and an unread one now maps to .ciFailing here. Needs-you, failed and lost are unchanged, and needs-you still outranks Red CI.
  • SidebarPriorityRedCITests.theRowChipSaysCIFailing still passes. Its helper's lanes have no unread flag, so "red" idle with failing checks is .ciFailing, which goes through case let. With failing set to false, idle and working both give nil. With "asks" (input) added it gives .needsYou, which is tier 0.
  • SidebarRowStatusTests:
    • The updated expectation ["waiting": .needsYou, "failed": .failed] matches the new chip.
    • markingAChatReadClearsItsRowLikeThePriorityView, toggleOffDrawsNoChip and manualOrderStaysWhateverTheChips are unaffected.
    • The new aFinishedChatHidesNothing uses real APIs (AgentActivityLane.of(summary:) as in the Fixture, and the public AgentPriorityMarks(defaults: nil).state) and checks all three cases.
  • SidebarLaneStatus.chip has one caller, applying. No other test expects .done from it or from agentChip. SidebarLaneStatusTests and SidebarNowLineTests don't touch either.
  • Everything from my first review still holds:
    • rowChip compiles and covers every case, and it stays as a guard at the row level.
    • rowContent is the only place that sets content.chip.
    • SidebarRowNoDoneTests compiles against the base APIs and would fail if a row drew Done.
    • The Priority view keeps its Done chip.

No new findings. One nit still stands: the row shows its age or one-line status where Done used to be. Timestamps are off by default, so no timer shows by default.

@teamleaderleo teamleaderleo added the ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds label Oct 21, 2026
… words

Leo 2026-10-21, on a row with a blue dot beside yellow "Needs you": "why
ISN'T THIS JUST A YELLOW DOT!?". By default a row's badge folded every wait
into Ready, the blue dot (Lawrence 2026-10-18), and #23390 added the chip's
word beside it. Now a wait of any kind (question, permission, auth) is the
icon set's one yellow attention dot, in place of the blue dot, never beside
it; an error or something unread stays the blue dot. The row draws no status
words (needs you, failed, lost, Red CI, Done); the chip stays in the row's
accessibility label only.

Tests: SidebarStatusSimpleTests (waits are the yellow dot, also with unread
items; needsYouIsTheYellowDot), SidebarRowNoDoneTests.aRowShowsNoStatusWords.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16040-fd0b-7dd0-9487-1a3a198d9f5c&host=cosmic-gray
@teamleaderleo teamleaderleo changed the title cmux-next sidebar: a workspace row never says Done cmux-next sidebar: rows draw no status words; needs you is one yellow dot, never Done Oct 22, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next crash-class rules / cmux-next crash-class rules is red on 9 of 9 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (claude-opus subagent, correctness first): SHIP at d580586

Read the whole PR (b2f5b94..d580586) with the focus on the top commit. Nothing was built or run; this comes from reading the code at that sha.

  • Compiles: no code still uses the removed WorkspaceRowView.chip. The only .chip reads left are content.chip in SidebarLayoutMetrics.rowContent (it sets it) and in WorkspaceRowView+Accessibility (it reads it). The colour line in +Rendering and the chip = shown.chip assignment are both gone. Tests no longer mention view.chip.
  • One yellow dot: simple() now returns .waiting (kind nil) for any wait, before it checks for Ready. In codexPlan (the default icon set), .waiting with no kind is .mark(.vector(.dot)) with .attention tint and no animation. Permission and auth lose their shield in simple mode, which is what was asked for. With the default corner style and detailedStatusIcons off, configureBadges gets one item, RowBadgeView draws one .plain glyph, and badgesLead makes activity .idle and badge .none. So a waiting workspace with unread items draws exactly one yellow dot. The stack style gives the same single glyph.
  • No status words: the trailing text is now only trailingStatus (the reported one-line status, which is user or hook text and not a chip word) or trailingText (the age, which only shows when timestamps are on; they are off by default). The chip is only used in the accessibility label.
  • Tests are updated correctly: SidebarStatusSimpleTests (cases, needsYouIsTheYellowDot, rowsDrawOneBareGlyphByDefault corner and stack), SidebarRowNoDoneTests.aRowShowsNoStatusWords and SidebarRowStatusTests. I found no other test that expects .success or the "Needs you" text on a waiting row. SidebarStatusGlyphCenterTests uses the trailing style, so this change does not touch it.

Follow-up, not a blocker: needs you can still be lost. SidebarLaneStatus.merge uses StatusStack rank, where error (6) beats waiting (5). A workspace whose own activity is .error, or that has a failed or lost lane, plus a lane asking for input, ends up with activity == .error. It then draws the blue dot, while content.chip == .needsYou only reaches the accessibility label. Before this commit, the "Needs you" word still showed in that case. Possible fix: in simple mode, treat shown.chip == .needsYou as .waiting, or rank waiting over error in the row merge.

Nits, also handled by follow-ups:

  • Stale comment "While the agent works, its running time takes the age's place" above the new comment in WorkspaceRowView.configure (a stacked PR removes it).
  • The WorkspaceRowView+Accessibility comment "The chip's word takes the one-line status's place, as drawn" is no longer true (the word is not drawn). Also, when there is a chip, the label leaves out trailingStatus even though it is still drawn.
  • The doc comment on the WorkspaceRowBadges struct ("Ready ... for a question, a permission") and WorkspaceRowContent.detailedStatus ("Working or Ready only") describe the old behaviour.
  • The title and help of SidebarTunables.rowStatus ("Rows name their agent's state", "says needs you, failed or lost at the right of its name") describe the old behaviour; the toggle now only changes the accessibility label. The test name theChipReadsOnTheNamesLine is stale too.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol): BLOCK at d580586

Blocking finding:

  • [P2] Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Views/WorkspaceRowView.swift:264: removing the chip text loses the visible needs-input cue when a workspace contains both a waiting chat and a failed/lost chat. With default settings, SidebarLaneStatus.merge chooses .error over .waiting (StatusStack.stateRank: 6 versus 5), while SidebarLaneStatus.chip independently chooses .needsYou. configureBadges receives only the merged .error, so WorkspaceRowBadges.simple produces .success, the blue dot. The .needsYou chip now reaches only accessibility: the row looks Ready instead of showing the promised yellow attention dot. Before this change it still displayed “Needs you.” Preserve the waiting fact for badge selection, or use the needs-you chip to select the yellow dot. Add a rendered-row regression with both lanes; the new tests exercise waiting and failure separately.

Non-blocking finding:

  • Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Logic/SidebarTunables.swift:97-98: the Debug toggle still promises visible state words at the right of the workspace name, although it now controls accessibility text only. Update its title/help to describe its actual effect.

Checked: all 10 changed files and three commits against merge base b2f5b94; traced lane ranking, activity merging, badge rendering, completion/unread state, accessibility and test coverage. Static review only; no app build or Swift test suites run. Re-read the live PR head immediately before posting; it is unchanged.

…ys the yellow dot

A workspace with a chat asking for the user and a failed or lost chat (or its own failed
status) merged to error, which the simple badge draws as the blue Ready dot. With no
"Needs you" word on the row any more, the question vanished (codex review of #23767).
SidebarLaneStatus.merge now puts a waiting lane first, as the Priority view does.

The rowStatus tunable and the accessibility comment now say the chip only reaches the label.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (claude-opus subagent, correctness first): SHIP at 2c1275c

Scope: the new commit 2c1275c in full, plus a re-scan of the whole PR diff against merge base b2f5b94. Read-only, built from source reading (no build run).

The fix (SidebarLaneStatus.merge)

  • The order is now: waiting first, then StatusStack. A waiting lane displaces a non-waiting row ((true, false)), and a non-waiting lane never displaces a waiting row ((false, true)). Every other pair falls through to StatusStack.precedes, so a waiting lane against a waiting row still loses the tie to the row (explicit source rank 7 beats agent rank 5). The row keeps its own kind and style, so permission/question/auth on the row survives as before. Lanes can only produce .waiting(kind: nil) (indicator), so there is no ordering among waiting lanes to get wrong. The order is total and lexicographic, so the result doesn't depend on lane order. The new test covers both orders.
  • merge has one caller (applying), and it isn't used anywhere else.

Compiles (by reading)

  • CmuxNextAppTests lists CmuxNextAgentLanes. CmuxNextAgentActivity comes in through it, and about 20 existing files in this test target already import CmuxNextAgentActivity and @testable import CmuxNextAgentLanes (e.g. SidebarLaneStatusTests, SidebarRowStatusTests).
  • SidebarLaneStatus is an internal @MainActor enum and the suite is @MainActor, so @testable reaches it.
  • AgentActivityLane.of(summary: [String: Any], id:) is public, and the nested-dict literal matches the shape already used in SidebarLaneStatusTests.
  • WorkspaceRowView.rowBadge (internal let) and RowBadgeView.states (private(set) var) can both be read through @testable CmuxNextSidebar.
  • The switch and if expressions and for own: StatusIndicatorState in [...] are valid Swift 5.9+. .waiting resolves to the static waiting(kind: nil), as in the existing tests.

The test fails at d580586 and passes at 2c1275c
Trace: rowContent → WorkspaceRowContent.activity (passes .waiting and .error through unchanged) → configureBadges → WorkspaceRowBadges(detailed: shown.detailedStatus). SidebarLayoutOptions().detailedStatus defaults to false, so the badge goes through simple, and .corner takes first.

  • At d580586: [failed, input] gives error (rank 6) and the waiting lane can't displace it, so activity is .error. simple turns that into .success → [.success], and the test fails. Every one of the 4 combinations ends at .error the same way.
  • At 2c1275c: all 4 combinations (own .idle or .error, lanes [failed, input] or [input, lost]) end at .waiting → [.waiting], and the test passes.

Existing tests

  • SidebarLaneStatusTests, SidebarRowStatusTests, SidebarNowLineTests and SidebarLaneFixture all give each workspace a single lane, so their .error and .waiting expectations don't change.
  • SidebarStatusSimpleTests works below merge (WorkspaceRowBadges directly) and is unaffected.
  • No other caller or test merges a waiting lane with an error.

Behaviour notes (non-blocking)

  • With Debug sidebar.detailedStatusIcons on (off by default), a row with a failed chat and a waiting chat now shows the waiting glyph instead of the error glyph. The hover card's activity and the badge tooltip also say waiting instead of failed. This follows from the rule this commit adopts (needs you before failed, as in Priority). The failure is still named in the accessibility label only when no needs-you chip outranks it.
  • Nit: the type doc on SidebarLaneStatus (lines 20-22) still says "Precedence (StatusStack's state rank): failed, then waiting on you". The merge doc now says the opposite.

Rest of the PR diff (re-scanned)

  • The chip property and its timeLabel color override are removed from WorkspaceRowView. No references to them are left in the sources or tests.
  • rowChip filters done, working and idle, and chip()'s compactMap keeps Red CI on a finished chat.
  • simple puts waiting ahead of Ready.
  • The tunable and accessibility rewording matches what the row draws.
  • Nothing else found.

@teamleaderleo
teamleaderleo merged commit 10b4591 into feat-cmux-next Oct 22, 2026
@teamleaderleo
teamleaderleo deleted the sidebar-rows/no-done branch October 22, 2026 02:01
teamleaderleo added a commit that referenced this pull request Oct 22, 2026
Conflicts:
- SidebarLayout.swift: the loose rows keep the tree walk (treeRows) and take
  base's row limit (#23671): foldingDone gets limits:, and every negative
  entry (Done, Show N more) draws through appendFold.
- WorkspaceRowContent.swift: treeFold/rollUp beside base's chip, which is
  now only for the accessibility label (#23767).
- WorkspaceRowView.swift: base's subviews without elapsedLabel (#23812),
  plus treeFoldButton and rollUp.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d2c-88e4-7fc2-b58e-9a55abdaced8&host=cosmic-gray
@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

lawrencecchen added a commit that referenced this pull request Oct 25, 2026
…ead the app as it is; transcript steps back to the tip's

- HomeSidebarHeaderTests: the list compose is hidden by the header's layout, so the check runs after the first paint.
- SidebarStatusGroupingTests: a row carries its lane state and chip only with sidebar.laneStatus and sidebar.rowStatus
  on (8f4e8f0), and a finished chat names no state (#23767), so it rests under Idle; the test turns both on for
  its rows.
- AgentPaneTranscriptStepTests: back to the tip's version. Waiting for the events showed they never arrive (60 s, step
  c5307be82218d8c1fd44ad59): not a timing gap, left open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lawrencecchen added a commit that referenced this pull request Oct 25, 2026
…ead the app as it is; transcript steps back to the tip's

- HomeSidebarHeaderTests: the list compose is hidden by the header's layout, so the check runs after the first paint.
- SidebarStatusGroupingTests: a row carries its lane state and chip only with sidebar.laneStatus and sidebar.rowStatus
  on (8f4e8f0), and a finished chat names no state (#23767), so it rests under Idle; the test turns both on for
  its rows.
- AgentPaneTranscriptStepTests: back to the tip's version. Waiting for the events showed they never arrive (60 s, step
  c5307be82218d8c1fd44ad59): not a timing gap, left open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
cmux-bot Bot added a commit that referenced this pull request Oct 31, 2026
…status default and the bar overflow (base reds) (#28563)

* cmux NEXT tests: Group by Status reads the lanes with lane and row status on, by title

theSectionsComeFromThePriorityClassifier (#20905) put every row under Idle:
the row feed reads acpmux lanes only with sidebar.rowStatus and
sidebar.laneStatus on, both off by default since 8f4e8f0 (Lawrence
2026-10-21). The test turns them on for its run, reads each row by its title
(the fixture's workspaces have handle ids), and leaves out listed tab rows
(sidebar.showWorkspaceTabs, on by default since f32ee25). A finished
chat's row carries no Done chip (#23767: a row never says Done), so it sits
under Idle.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639

* cmux NEXT tests: the zoom toolbar harness gives the pane bar room for its buttons

aZoomedPaneShowsALitZoomButton (:145) found Zoom in the bar's "…" menu: since
#26132 a bar too narrow for a button hides it and "…" offers it, and the
harness's bar had no frame (zero width), so every button overflowed. The
harness now gives the bar a pane's 240 x TabStripView.preferredHeight frame,
so the test checks what it meant: zoomed, the lit zoom button shows and "…"
does not offer zoom a second time.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 2c1275c3 Deployed Oct 22, 2026 by teamleaderleo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant