Skip to content

cmux-next sidebar: a working row shows no running time - #23812

Merged
teamleaderleo merged 1 commit into
feat-cmux-nextfrom
sidebar-rows/no-timer
Oct 22, 2026
Merged

teamleaderleo merged 1 commit into
feat-cmux-nextfrom
sidebar-rows/no-timer

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Leo: "WHO BROUGHT BACK THE DONE AND THE TIMERS". Workspace rows showed "10m" beside the working mark.

Who brought it back: #22826 (2026-10-20, "agent work breathes a calm accent dot instead of a spinner on every row"). Its later commits drew how long the agent had worked ("4m", "1h 3m") beside the working mark, in place of the row's age, with a minute tick per row.

Change: rows no longer show a running time. Removed: the label, its DemandTimer tick, WorkspaceRowView+Elapsed.swift, and WorkspaceRowContent.workingSince/workingElapsed. A working row keeps its age, as it did before #22826. The hover card still shows the time to the second.

Test: SidebarRowNoDoneTests.aWorkingRowShowsNoRunningTime builds a row whose agent has worked ten minutes and fails if any label shows a running time. WorkspaceRowElapsedTests, the timer's own tests, is deleted with it.

Stacked on #23767 (Done removal). This branch contains #23767's two commits; once #23767 merges, the diff here is only the timer removal. The breathing dot's default is fixed in #23776.

Capture steps-006c458297 at 1d5b91215b60 (fleet build, capture mini, text checked for private data). The working row "Tune the CI cache" no longer shows "7m" (base: "7m" beside its mark). The current head only rebases this onto #23767's needs-you change.

Light Dark
light dark

Leo-ask: ask-c8936f0e52

Agent session: cosmic-gray

🤖 Generated with Claude Code

@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 3d289fa: 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=pr23812 -f ref=sidebar-rows/no-timer -f platform=macos -f backend_mode=local

Pending: CI is running on 3d289fa0dc (run); the result below was for 16d01e7955 and no longer applies.

Last result: Passes: CI passes on 16d01e7955.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); it is rewritten when this head's CI completes.

red: cmux-next checks (god files, concurrency, crash safety, l10n); base red: the same failure on the base 164b139; does not block

@blacksmith-sh

blacksmith-sh Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Found 12 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmp7qotfx3l/summary-missing.json (live):/summary-missing.json (live): View Logs
/tmp/tmprvg58anx/summary-fail.json (live):/summary-fail.json (live): View Logs
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows/
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows
View Logs
[new_workspaces] the window draws no frames/[new_workspaces] the window draws no frames View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs
convention violations found (ERROR lines above)./
convention violations found (ERROR lines above).
View Logs
nightly cmux-tui resolve/nightly cmux-tui resolve View Logs
test_every_submodule_free_checkout_on_an_owned_runner_resets_submodules (main.Reuse
dWorkspaceSubmodules.test_every_submodule_free_checkout_on_an_owned_runner_resets_submo
dules)/
test_every_submodule_free_checkout_on_an_owned_runner_resets_submodules (main.Reuse
dWorkspaceSubmodules.test_every_submodule_free_checkout_on_an_owned_runner_resets_submo
dules)
View Logs
test_every_submodule_free_checkout_on_an_owned_runner_resets_submodules (main.Reuse
dWorkspaceSubmodules.test_every_submodule_free_checkout_on_an_owned_runner_resets_submo
dules) (job='web-bundles')/
test_every_submodule_free_checkout_on_an_owned_runner_resets_submodules (main.Reuse
dWorkspaceSubmodules.test_every_submodule_free_checkout_on_an_owned_runner_resets_submo
dules) (job='web-bundles')
View Logs

...and 2 more test failures. View all on Blacksmith

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

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

Copy link
Copy Markdown
Collaborator Author

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

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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

Reviewed only the top commit (parent 7bf4d23, #23767). I read the code and did not build it.

  • No references are left. Across the whole repo at 1d5b912, git grep finds no workingSince, workingElapsed, layoutElapsed, stopElapsed, elapsedTicker, WorkspaceRowElapsed or sidebar.row.elapsed. The only elapsedLabel left is the unrelated private one in CmuxNextApp/Cloud/CloudMachineProgressView.swift. No test registry or gallery code names the deleted files.
  • Dropping import CmuxNextWakeups from WorkspaceRowView.swift is safe. That file used only DemandTimer from the module, and that use is gone. It uses no other symbol from it either (Backoff, assignIfChanged, Duration.inSeconds, FrameClient, ...). None of the WorkspaceRowView+*.swift extensions use the module. The target still depends on it for the other sidebar files, which import it themselves.
  • The undo matches cmux NEXT: agent work breathes a calm accent dot instead of a spinner on every row #22826 (4e68eeb) line for line, except it keeps the chip text that came after it. The badges age check goes back to timeText == nil, let time = shown.badgeTime. trailingText goes back to chip ?? shown.trailingText. The layoutElapsed call and the elapsedLabel entries come out of the subviews, color and fade lists. prepareForReuse no longer calls stopElapsed.
  • Layout is fine. var trailing in layout() is still changed many times (slot, layoutTime, layoutRowBadge, the status glyph, muted, audio, presence), so there is no never-mutated warning. With the elapsed step gone, textW comes straight from the trailing marks, as it did before cmux NEXT: agent work breathes a calm accent dot instead of a spinner on every row #22826.
  • Expanded rows: trailingText is again time ?? trailingStatus, so a working expanded row shows its age again. Compact working rows get badgeTime back.
  • The new test should compile. The SidebarWorkspace(id:title:lastActivity:agentWorking:activity:) call and ws.detail.activitySince = ... (a public var) are the same as in the deleted WorkspaceRowElapsedTests.
  • The regex is valid ICU and matches "10m", "1h 3m" and "10 min". It does not match the age "3:13 PM" / "15:13" or a French-style "15h13", because \b needs a word boundary after the unit.
  • The test would fail if the timer came back. At width 320 with "Fix the build", the old code showed "10m" in elapsedLabel, a ChromeLabel (which conforms to ShownText), visible. shownText collects it.
  • The hover card does not depend on the removed code. WorkspaceHoverCard has its own DemandTimer("sidebar.hover-card.elapsed") and gets its time from WorkspaceHoverCardContent.withElapsed(_, since: content.activitySince, ...).

@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
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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

  • Range-diff against the reviewed 1d5b912 differs only where the rebase onto cmux-next sidebar: rows draw no status words; needs you is one yellow dot, never Done #23767 (d580586) required it: the chip color line in updateLayer and the chip doc/property are gone with the base. trailingText is now shown.trailingText, which is time ?? trailingStatus, so a working row keeps its age as the commit message says. The test hunk sits next to aRowShowsNoStatusWords and no longer next to the removed needsYouStillReadsOnTheRow.
  • The colors loop is [timeLabel, metaLabel] and the fade loop no longer has elapsedLabel. WorkspaceRowView.swift drops the CmuxNextWakeups import, and no other Wakeups symbol is used in that file.
  • git grep over the whole tree at this head finds no elapsedLabel, workingSince, workingElapsed, elapsedTicker, stopElapsed, layoutElapsed, WorkspaceRowElapsed or sidebar.row.elapsed, and no conflict markers under CmuxNext. No chip is left in WorkspaceRowView*.swift, apart from the accessibility label's content.chip, which comes from the base. trailingStatus keeps its other readers (accessibility, layout metrics, WorkspacesAsTabsTests).
  • SidebarRowNoDoneTests keeps aFinishedChatsRowNeverSaysDone, onlyWhatAsksForTheUserReachesARow, aWorkingRowShowsNoRunningTime and aRowShowsNoStatusWords. Its helpers (row, shownText) and the SidebarWorkspace(agentWorking:activity:) init exist at this head. The timer regex does not match today's age format (a short clock time).
  • Nit, not blocking: the suite's doc comment still ends "What asks for the user (needs you, failed) still reads.", a line it inherits from the base. Since cmux-next sidebar: rows draw no status words; needs you is one yellow dot, never Done #23767 that is true only of the accessibility label.
  • Read-only review through local git. Nothing was built or run.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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

Replay check against the previous SHIP at 16d01e7 (on d580586):

  • git diff 2c1275c3..d9209c38 equals git diff d58058624f6f..16d01e79 line for line, context included (only index/@@ offsets differ): the same 7 files, +22/-179.
  • SidebarRowNoDoneTests.swift at d9209c3 holds both sides of the merge: cmux-next sidebar: rows draw no status words; needs you is one yellow dot, never Done #23767's updated imports (7, no duplicates) and needsYouBesideAFailureIsTheYellowDot, plus this PR's updated doc comment and aWorkingRowShowsNoRunningTime. All five tests are present and the braces balance (19/19). The new test uses view.rowBadge.states (private(set), reachable through @testable import CmuxNextSidebar), which this PR doesn't touch.
  • No dangling references at d9209c3: no matches for workingSince, workingElapsed, layoutElapsed, stopElapsed, elapsedTicker, WorkspaceRowView+Elapsed or WorkspaceRowElapsedTests anywhere in the tree. The only elapsedLabel hits are unrelated (CloudMachineProgressView, iOS ChiefCallViewController). WorkspaceRowView.swift no longer uses DemandTimer, so removing its CmuxNextWakeups import is safe.
  • SidebarWorkspaceDetail.activitySince is unchanged by this PR. SidebarLaneStatus.merge still writes row.detail.activitySince, and the hover card, SidebarMapping+Detail and the new test still read or write it.
  • How it interacts with cmux-next sidebar: rows draw no status words; needs you is one yellow dot, never Done #23767's changes: merge now ranks waiting lanes first and sets activitySince from the lane. Nothing on the row reads it anymore (only the hover card does), so the yellow-dot result is the same with this PR. The tunable and accessibility edits don't touch the removed code.

No findings.

Leo 2026-10-21: "WHO BROUGHT BACK THE DONE AND THE TIMERS". #22826
(2026-10-20) drew how long a row's agent had worked ("10m") beside its
working mark, in place of the row's age, with a minute tick per row. The
row drops the running time, its label, its tick and WorkspaceRowView+Elapsed;
a working row keeps its age as before #22826. The hover card still shows the
time to the second.

Test: SidebarRowNoDoneTests.aWorkingRowShowsNoRunningTime renders a row
whose agent has worked ten minutes and fails if any label shows a running
time. WorkspaceRowElapsedTests (the timer's own tests) goes with it.

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 (subagent, correctness first): SHIP at 3d289fa

This head is the restack onto the new base after #23767 merged. The conflicts are resolved by keeping the base's machine mark and quiet titles and dropping only the timer. A diff-of-diffs against the reviewed d9209c3 shows no differences beyond base context. No timer symbols (layoutElapsed, WorkspaceRowElapsed*, sidebar.row.elapsed, workingSince) remain in the tree. The machineMark layout still advances textX correctly. The fleet app compile-check passed at this head (job d371df82207619592805676b, 60 s).

@teamleaderleo
teamleaderleo merged commit 6df32f6 into feat-cmux-next Oct 22, 2026
@teamleaderleo
teamleaderleo deleted the sidebar-rows/no-timer branch October 22, 2026 02:17
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
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol): SHIP at 3d289fa

Blocking findings: none found.

Non-blocking findings: none found.

Checked all seven changed files against merge-base 10b4591, removed-symbol references, row reuse and layout, timestamp defaults and opt-in behavior, hover-card timing, and the replacement regression test's path through the former elapsed label. git diff --check passed. Native builds and tests were not run, as requested. Re-read the PR head immediately before posting; it is unchanged.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Post-merge review (codex xhigh, correctness first): SHIP at 6df32f6

Codex gpt-6.1-sol at xhigh, run read-only against feat-cmux-next at f76419f. It found no correctness issues. Nothing in the tree, tests included, still references the removed elapsed row state, the timer, WorkspaceRowView+Elapsed or WorkspaceRowElapsedTests. Compact and expanded rows keep their age. The only later commit to a touched file is #23989's unrelated pull request gating. I checked the diff myself and agree.

lawrencecchen added a commit that referenced this pull request Oct 22, 2026
…o Now line; one title x; no Update available on headers

Lawrence 2026-10-21: "dont show times in sidebar. remove merge indicator by default as well.
sidebar must be kept minimal by default", then "weird spacing" between rows with and without a
favicon, and "wtf is chief update available". The running time (#23812) and the pull request
badge (#23989) already left the default rows upstream; this does the rest.

- Off by default (each still a setting): the status entries and the log line
  (sidebar.workspaceRow.agentStatus / .log) and the "Now: ..." line (sidebar.nowLine). The
  default row is the name plus one state mark (spinner, unread dot) and progress; a reported
  state still reaches the mark.
- Every workspace, item and tab row keeps its leading icon slot, drawn or empty, so every title
  starts at one x (SidebarStyle.titleTextX).
- A machine header never prints Update available: it reads as connected and the tooltip says it.

Settings and tunables store only what the user set, so everyone else moves to the new defaults
with no migration; a value the user set stays.

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

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

lawrencecchen added a commit that referenced this pull request Oct 22, 2026
…o Now line; one title x; no Update available on headers

Lawrence 2026-10-21: "dont show times in sidebar. remove merge indicator by default as well.
sidebar must be kept minimal by default", then "weird spacing" between rows with and without a
favicon, and "wtf is chief update available". The running time (#23812) and the pull request
badge (#23989) already left the default rows upstream; this does the rest.

- Off by default (each still a setting): the status entries and the log line
  (sidebar.workspaceRow.agentStatus / .log) and the "Now: ..." line (sidebar.nowLine). The
  default row is the name plus one state mark (spinner, unread dot) and progress; a reported
  state still reaches the mark.
- Every workspace, item and tab row keeps its leading icon slot, drawn or empty, so every title
  starts at one x (SidebarStyle.titleTextX).
- A machine header never prints Update available: it reads as connected and the tooltip says it.

Settings and tunables store only what the user set, so everyone else moves to the new defaults
with no migration; a value the user set stays.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lawrencecchen added a commit that referenced this pull request Oct 22, 2026
…o Now line; one title x; no Update available on headers

Lawrence 2026-10-21: "dont show times in sidebar. remove merge indicator by default as well.
sidebar must be kept minimal by default", then "weird spacing" between rows with and without a
favicon, and "wtf is chief update available". The running time (#23812) and the pull request
badge (#23989) already left the default rows upstream; this does the rest.

- Off by default (each still a setting): the status entries and the log line
  (sidebar.workspaceRow.agentStatus / .log) and the "Now: ..." line (sidebar.nowLine). The
  default row is the name plus one state mark (spinner, unread dot) and progress; a reported
  state still reaches the mark.
- Every workspace, item and tab row keeps its leading icon slot, drawn or empty, so every title
  starts at one x (SidebarStyle.titleTextX).
- A machine header never prints Update available: it reads as connected and the tooltip says it.

Settings and tunables store only what the user set, so everyone else moves to the new defaults
with no migration; a value the user set stays.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lawrencecchen added a commit that referenced this pull request Oct 22, 2026
…o Now line; one title x; no Update available on headers

Lawrence 2026-10-21: "dont show times in sidebar. remove merge indicator by default as well.
sidebar must be kept minimal by default", then "weird spacing" between rows with and without a
favicon, and "wtf is chief update available". The running time (#23812) and the pull request
badge (#23989) already left the default rows upstream; this does the rest.

- Off by default (each still a setting): the status entries and the log line
  (sidebar.workspaceRow.agentStatus / .log) and the "Now: ..." line (sidebar.nowLine). The
  default row is the name plus one state mark (spinner, unread dot) and progress; a reported
  state still reaches the mark.
- Every workspace, item and tab row keeps its leading icon slot, drawn or empty, so every title
  starts at one x (SidebarStyle.titleTextX).
- A machine header never prints Update available: it reads as connected and the tooltip says it.

Settings and tunables store only what the user set, so everyone else moves to the new defaults
with no migration; a value the user set stays.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lawrencecchen added a commit that referenced this pull request Oct 22, 2026
…o Now line; one title x; no Update available on headers

Lawrence 2026-10-21: "dont show times in sidebar. remove merge indicator by default as well.
sidebar must be kept minimal by default", then "weird spacing" between rows with and without a
favicon, and "wtf is chief update available". The running time (#23812) and the pull request
badge (#23989) already left the default rows upstream; this does the rest.

- Off by default (each still a setting): the status entries and the log line
  (sidebar.workspaceRow.agentStatus / .log) and the "Now: ..." line (sidebar.nowLine). The
  default row is the name plus one state mark (spinner, unread dot) and progress; a reported
  state still reaches the mark.
- Every workspace, item and tab row keeps its leading icon slot, drawn or empty, so every title
  starts at one x (SidebarStyle.titleTextX).
- A machine header never prints Update available: it reads as connected and the tooltip says it.

Settings and tunables store only what the user set, so everyone else moves to the new defaults
with no migration; a value the user set stays.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lawrencecchen added a commit that referenced this pull request Oct 22, 2026
…o Now line; one title x; no Update available on headers

Lawrence 2026-10-21: "dont show times in sidebar. remove merge indicator by default as well.
sidebar must be kept minimal by default", then "weird spacing" between rows with and without a
favicon, and "wtf is chief update available". The running time (#23812) and the pull request
badge (#23989) already left the default rows upstream; this does the rest.

- Off by default (each still a setting): the status entries and the log line
  (sidebar.workspaceRow.agentStatus / .log) and the "Now: ..." line (sidebar.nowLine). The
  default row is the name plus one state mark (spinner, unread dot) and progress; a reported
  state still reaches the mark.
- Every workspace, item and tab row keeps its leading icon slot, drawn or empty, so every title
  starts at one x (SidebarStyle.titleTextX).
- A machine header never prints Update available: it reads as connected and the tooltip says it.

Settings and tunables store only what the user set, so everyone else moves to the new defaults
with no migration; a value the user set stays.

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

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 3d289fa0 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