Skip to content

feat(cmux-next): Group the sidebar by status (Labs) - #20851

Closed
teamleaderleo wants to merge 19 commits into
op-next-call-keys/labsfrom
leo/sidebar-status-grouping
Closed

teamleaderleo wants to merge 19 commits into
op-next-call-keys/labsfrom
leo/sidebar-status-grouping

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator

Group by Status for the Projects list, behind Labs (Help > Labs…, off by default). Chrome-style groups stay the default. Turn on Group Sidebar by Status in Settings > Labs, then pick Group Projects By > Status (or run "Group by Status").

Stacked on #20452 (the Labs registry); it merges after that one.

What changes

  • Sections. Every computer's rows sit under Needs you, Working, Done and No agent, with a count on each header. Chrome groups dissolve in this mode only; the pinned area stays as it is.
  • Live moves. Rows move between sections as their status changes. The status is the row's merged one (acpmux turn state, hooks, OSC 7501, cmux status set), so it works the same for Claude, Codex and every ACP harness.
  • Stable order. Inside a section, rows keep their list order. The row you're on keeps its section while it stays active; it moves once you switch to another row, so nothing jumps under you.
  • Folding. Working, Done and No agent fold and keep their counts; Needs you never folds.
  • Row marks (status mode only). A status glyph on every row, a trailing ⚠ on Needs you rows (attention color, danger when it errored), and a laptop, cloud or remote glyph for where the session runs. Colors are Palette tokens, so they follow dark themes and stay apart from group colors. Rows in other modes draw exactly as before.
  • Elbow children (second Labs flag, Nest Child Agent Sessions). A child agent session's row hangs off its parent row with the CLI connector ⎿, not an indent, inside the parent's section; its own status still shows on it. The link comes from each chat's acpmux session and its mux.parent tag. Sessions from an older acpmux, or a peer's sessions, get no elbow.
  • No bold anywhere in the sidebar.

The two flags are read in one place (SidebarSectionsSetting.parse): with Group Sidebar by Status off, a saved status reads as no grouping, and the elbow needs both flags.

Design panel note: the judges' panel voted Chrome default 4-0 and status grouping as Labs 4-0, and dropped the elbow 0/4. The elbow is Leo's own ask, so it ships as its own Labs sub-option, off by default. Modeled on the session list in Claude Code desktop's 10-14 release (reference captures are in the private screenshots repo only).

Evidence

Each piece's behavior test failed before its fix and passed after, on the fleet (run-swift-testing-suites.sh):

Tests Red Green
SidebarStatusGroupingTests (sections, counts, live move, held active row) e6c50f3 5214f11
SidebarStatusGroupingLabsTests, SidebarGroupByStatusActionTests (flags, Settings choice, action) a69afbf a6c674f
status marks test in SidebarStatusGroupingTests 7950ca2 ee33486
SidebarStatusElbowTests, SidebarAgentParentTests 5421acc c0fe7e9

On the head (33a4247) every suite passed. The step was marked failed only by the fleet's same-tree skip guard on two daemon suites this PR doesn't touch (AcpmuxBundleReplacedTests, AcpmuxOtherHomeDaemonTests).

Not yet established:

  • SidebarInsertWhileDisplayAsleepTests failed on two macOS 26 display hosts at earlier heads of this branch; it skips on headless hosts. This PR doesn't touch row-removal motion, and a base run on a display host is in progress to tell whether it fails on base too. I'll update here.
  • Light and dark stills and a clip are pending: capture-slot DEV builds currently die on the Debug watchdog (op-next-continuity is fixing it). They'll be added to this body before merge.

Pre-push checks pass on the head: crash ratchet, concurrency, god files (no type or file grew past its limit), system blue, generated settings sources.

Changelog

  • Added: Group by Status for the sidebar's Projects list (Labs), with optional nesting of child agent sessions.

🤖 Generated with Claude Code


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


Summary by cubic

Group the sidebar's Projects list by agent status behind labs.sidebarStatusGrouping (Labs, off by default; Chrome-style folder groups remain the default). Rows sit under Needs you, Working, Done and No agent headers with counts, stay in list order inside each section, and move between sections as their merged status changes; the active row keeps its section until another row is selected. Needs you never folds. Rows in this mode gain a status glyph, a trailing warning on needs-you rows, and a glyph for where the session runs.

Labs behavior

  • Without labs.sidebarStatusGrouping, a saved sidebar.groupBy: "status" reads as no grouping, and the Group by Status action points to the Labs toggle.
  • A second Labs flag, labs.sidebarStatusElbow (Nest Child Agent Sessions, off by default), hangs a child agent session's row off its parent row with the ⎿ connector, in the parent's section; parent links come from each chat's acpmux session and its mux.parent tag.

Written for commit 2984b44. Summary will update on new commits.

View guided diff Turn on auto-fix

teamleaderleo and others added 18 commits October 14, 2026 17:20
…idebarStatusBucket)

The status case of sidebar.groupBy and the bucket a workspace row sorts
into, from its merged status. Not wired yet; Labs only.

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

labs.sidebarStatusGrouping and labs.sidebarStatusElbow (owner leo, off,
expire 2026-10-28), regenerated with gen-settings-sources.py, and the
SidebarSectionsPreferences.statusElbow field they will drive.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The flag is read in one place, where sidebar.groupBy is parsed: without
it "status" reads as none, and statusElbow is on only with both
labs.sidebarStatusGrouping and labs.sidebarStatusElbow. Group Projects By
offers Status; sidebar.groupBy.status (Group by Status) sits next to
None and Folder and is unavailable, naming the Labs toggle, until the
flag is on. Strings in all 21 locales.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Needs you, Working, Done and No agent headers with counts; rows move as
their merged status changes, except the active row, which keeps its
bucket until another row is active. Needs you never folds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Settings schema, MDM manifest and docs from the fleet's
export-settings-artifacts.sh, action surfaces from
export-action-surfaces.sh (both at 74cb9c7), and the settings
page strings from gen-strings.mjs.

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

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

Behaviour tests for Group by Status's elbow children (Labs): the child row sits
under its parent with the CLI connector, off is the plain status list, a row
moves under a parent it gains, and the App maps a session's mux.parent tag to
the parent workspace. Inert API surface only; the fix follows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Only rows the status layout marks get the marks view: one status glyph
per bucket (the shared indicator, or a quiet glyph for Done and No agent
at rest), a trailing warning on Needs you rows in the palette's attention
or danger token, and this Mac, Cloud or another computer from the row's
section. The row's own badges leave the state to the marks. Other modes
draw their rows as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…by Status, Labs)

With SidebarGrouping.elbowsChildren on, a child agent session's row sits
directly under its parent row, in the parent's bucket, drawn with the CLI
connector in tertiary ink. The App maps each row's acpmux sessions and their
mux.parent tag from the lane store; SidebarRows resolves parentWorkspace, and
a new parent moves the row. Off, rows lay out and draw as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… its own status

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

coderabbitai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Repository: manaflow-ai/cmux/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 3a4a1594-9de2-4b18-9c3d-99d7d357f7fa

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@blacksmith-sh

blacksmith-sh Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Found 7 test failures on Blacksmith runners:

Failures

Test View Logs
GitHub-hosted runner label: .github/workflows/
intent-familiar-review.yml:21: runs-on: ubuntu-24.04
View Logs
GitHub-hosted runner label: .github/workflows/
pr-red-checks-comment.yml:16: runs-on: ubuntu-24.04
View Logs
test/chat-find.test.ts/chat-find.test View Logs
test/chat-find.test.ts/chat-find.test View Logs
test_scans_only_test_sources (main.CommandLine.test_scans_only_test_sources)/
test_scans_only_test_sources (main.CommandLine.test_scans_only_test_sources)
View Logs
test_scans_the_ui_test_sources (main.CommandLine.test_scans_the_ui_test_sources) (p
ath='ios/cmuxUITests/ProbeTests.swift')
View Logs
two failed fetches then a success did not pass/
two failed fetches then a success did not pass
View Logs

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

@github-actions

Copy link
Copy Markdown
Contributor

Probably yours: Fast static checks failed: a static check failed, FAILED localization (0.93s).

CI failed on 2984b44504 (run 38683857018 attempt 1): 2 code, 7 unknown.
macOS jobs did not run: compile and app tests were skipped: Fast static checks failure.

Job Verdict Why
Fast static checks code a static check failed
CI fast guards unknown no known signature; failed step: Run the fast guard tests
guards / workflow-guard-history unknown no known signature; failed step: Validate SwiftPM lockfile policy
guards / workflow-guard-tests / release-ios unknown no known signature; failed step: Validate iOS simulator build-once contract
guards / workflow-guard-tests / app-host-cache unknown no known signature; failed step: Validate iOS video recording failures
guards / workflow-guard-tests / preflight unknown no known signature; failed step: Validate macOS runner guards
guards / workflow-guard-tests / quality-determinism code a Python test failed
guards / workflow-guard-tests / release-tooling unknown no known signature; failed step: Validate retried Ghostty Zig package fetches
web / react-apps-check unknown no known signature; failed step: Test webviews
Matched log lines
Fast static checks: FAILED localization (0.93s)
guards / workflow-guard-tests / quality-determinism: FAIL: test_scans_only_test_sources (__main__.CommandLine.test_scans_only_test_sources)

Not re-run automatically: Fast static checks, CI fast guards, guards / workflow-guard-history, guards / workflow-guard-tests / release-ios, guards / workflow-guard-tests / app-host-cache are not machine failures.

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.

@github-actions

Copy link
Copy Markdown
Contributor

CI fast guards failed on 2984b44504 (https://github.com/manaflow-ai/cmux/actions/runs/38683857018). It does not block the merge; a red guard merged into main breaks it for every open PR.
The log named no failed step; see the run.

Agents: python3 scripts/ci/guard_attribution.py fix applies the mechanical fixes locally. This comment is updated in place on each push.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Superseded by #20905: same Group by Status work, moved off the Labs registry onto Debug settings toggles (Lawrence via Leo, 10-15: no Labs; opt-in looks are Debug toggles, off by default). #20452 is no longer a dependency.

teamleaderleo added a commit that referenced this pull request Oct 22, 2026
…ebug toggle, off) (#20905)

* test: Group by Status behind Debug toggles (sections, live moves, marks, elbow children)

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

* feat(cmux-next): group the sidebar by status behind a Debug toggle

Ports #20851 off the Labs registry (Lawrence via Leo 10-15: no Labs; opt-in
looks are Debug settings toggles, off by default). sidebar.groupByStatus
lays rows under Needs you / Working / Done / No agent with counts, live
moves and a held active row; sidebar.statusElbow nests child agent sessions
with the CLI connector. Status marks on every row in that mode. No
cmux.json key, Settings choice or action changes.

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

* test: Group by Status review cases: asking child in a folded section, elbow off links nothing, patched child keeps its elbow

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

* fix: Group by Status review: asking trees under Needs you, no lane reads with the elbow off, patches keep the elbow, toggle-off forgets holds and folds

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

* refactor(cmux-next): agent links live in CmuxNextAgentLanes so CmuxNextApp stays under its size cap

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

* chore(next): PR autofix at 9e95df5

- regenerated Packages/macOS/CmuxNext/ci-target-graph.json

Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/38714367151

* refactor(cmux-next): the row writer's link work lives in CmuxNextSidebar so CmuxNextApp does not grow

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

* test(cmux-next sidebar): Group by Status sections follow the Priority view's states (red)

Ported from #20905's SidebarStatusGroupingTests onto current feat-cmux-next: rows sit
under the Priority view's states in its tier order and words, from the state the row
already carries (agentChip, the working mark), in manual order inside each section;
off by default the list is as before; the active row waits; Needs you never folds;
turning the Debug toggle off forgets holds and folds; and one case runs acpmux lanes
through SidebarLaneStatus to show the sections come from AgentPriorityRanking.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bd1-a2ac-74f1-85e7-0322693c12bd&host=cosmic-gray

* feat(cmux-next sidebar): Group by Status behind a Debug toggle, from the Priority view's states (port of #20905)

Debug toggle sidebar.groupByStatus, off by default (off, the list lays out exactly as
before). On, every computer's rows sit under the Priority view's states in its tier
order and words: Needs you, Done, Failed (failed or lost), CI failing, Working, Idle.

No classifier of its own: SidebarStatusSection reads what the row feed already gives
each row from AgentPriorityRanking through SidebarLaneStatus, its chip
(SidebarWorkspace.agentChip) and, without one, its working mark (agentWorking).
Inside each section rows keep their manual order. The active row keeps its section
until another row is active; Needs you never folds; turning the toggle off forgets
the held row and the folds (#20905 review). Grouped lists lock drag reorder, as
Group by Folder does. Headers reuse the Priority view's localized words, so no new
strings.

Dropped from #20905 as superseded: the row status marks (#23390 row words, #23495 PR
badges) and the agent-parent elbow (the session tree, #21814 and #22778).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bd1-a2ac-74f1-85e7-0322693c12bd&host=cosmic-gray

* test(cmux-next sidebar): a workspace marked Done shows under its Priority state while grouped by status, not in the Done fold

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bd1-a2ac-74f1-85e7-0322693c12bd&host=cosmic-gray

* refactor(cmux-next sidebar): Group by Folder's buckets move to SidebarLayout+Folder so SidebarLayout.swift does not grow

The Group by Status hook added six lines to SidebarLayout.swift (over its 400-line cap);
this moves the folder bucketing out, a net shrink against base.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bd1-a2ac-74f1-85e7-0322693c12bd&host=cosmic-gray

* test(cmux-next sidebar): a status section lists every row past sidebar.groupRowLimit, with no Show more row

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bd1-a2ac-74f1-85e7-0322693c12bd&host=cosmic-gray

* test(cmux-next sidebar): Group by Status tests name CmuxNextSidebar.SidebarSection (CmuxNextDaemon has one too) and type the row keys

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bd1-a2ac-74f1-85e7-0322693c12bd&host=cosmic-gray

---------

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

This branch was previously deployed

1 inactive deployment
artifacts — 2984b445 Deployed Oct 15, 2026 by teamleaderleo via publish tree-addressed cmux-tui #16153
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant