Skip to content

cmux NEXT sidebar: agent-started sessions nest under their parent by default - #24287

Closed
teamleaderleo wants to merge 11 commits into
feat-cmux-nextfrom
cmux/lineage-nesting-default
Closed

teamleaderleo wants to merge 11 commits into
feat-cmux-nextfrom
cmux/lineage-nesting-default

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator

Leo's words (ask-18a79e54a3):

"ALSO NEED YALL TO HELP ORGANIZE THIS MF SIDEBAR AND ALSO THINK ABOUT WAYS YOU'D IMPROVE THE WHOLE SITUATION WHAT MORE YOU'D WNAT EXPOSED WHAT MORE CAPABILITIES YUO'D WANT... ESP BY AUTO... A LOT OF THESE SESSIONS ID IMAGINE DIDNT NECESSSARILY NEED TO SHOW UP ON THE SIDE BY DEFAULT, THO IK THESE WEREN'T SUBAGENTS BUT STILL.."

Leo-ask: ask-18a79e54a3

PR 3 of the session-lineage brief (leo-workspace briefs/2026-10-20-gui-push/session-lineage.md). It builds on #21836's deep tree (folds, roll-ups) and #23633's Done fold, and doesn't duplicate either.

What changes

  • Nesting is on by default. Before, it only ran behind sidebar.sessionTree, which is off. Now a workspace whose agent was started by another workspace's agent (acpmux spawnedBy, plus remote daemons' parents, the same data cmux NEXT sidebar: the session tree at real depth, with folds and roll-ups #21836 reads) lists under that workspace at any depth. Only workspaces a person started stay top level.
  • Collapsed below depth 1. A top-level parent shows its direct children. A parent at depth 1 or deeper starts folded, so a coordinator shows its lanes and each lane's sub-sessions and reviewers stay in the lane's fold. A folded parent shows a disclosure chevron and a count chip with how many sessions it hides (new, idle ones included). The existing per-state roll-up chips sit next to it.
  • Fold state persists per parent. The existing sidebar.sessionTree.collapsed list is joined by a sidebar.sessionTree.opened list for deep parents the user opened. Both are pruned to live parents. Selecting a hidden session (Cmd-K, a notification, Cmd-number) opens the folds above it, as reveal already did.
  • Debug toggle: Debug Settings → Sidebar → "Nest agent-started sessions" (sidebar.lineageNesting), on by default. Off, every workspace is top level again, even with sidebar.sessionTree on.
  • sidebar.sessionTree keeps its other parts. Keycaps, chat history (Pinned/Earlier) and the tree's pull-request reads are unchanged and still opt-in. Nesting on its own makes no GitHub calls.
  • Done fold and row limit with nesting. They used to switch off whenever the tree was on. Now they work on whole subtrees: a Done top-level row takes its subtree into "Done (N)", and a Done child stays under its parent. "Show N more" counts a subtree as one row.
  • Group members nest and fold the same way. A group whose members nest is laid out in full instead of spliced.

Not in this PR: the subtree roll-up wording ("N running · M need you · K merged") and Parked are PRs 4 and 5 of the brief. Lineage beyond spawnedBy comes from #24150 and #24136, which are still open; this PR doesn't depend on them.

Tests

SidebarLineageNestingTests (new) covers:

  • coordinator → lane → sub → reviewer at depths 0–3
  • the default fold below depth 1, and the count and state roll-up
  • opening one level at a time
  • group members
  • a filter opening deep folds
  • the Done fold moving whole runs
  • toggle persistence, and reveal opening deep ancestors
  • the Debug toggle's default and its off path (flat list, no GitHub reads)

The existing SidebarDeepTreeTests and SidebarSessionTreeTests keep passing as written.

Exact-head verification and captures

Head: 17c0923e1f0e4525aeaf5fd6bd97c4481e8bdc0f. Independent Astra review: SHIP. Native fleet step 7f255fcd841cb3f22f52a001 passed all four focused suites: SidebarLineageNestingTests, SidebarDeepTreeTests, SidebarSessionTreeTests, and SidebarNeedsYouTests. Static pre-push and Objective-C selector checks passed.

The real app captures below use the existing needsYou parent-child fixture with sidebar.sessionTree=false on both commits. Before (4c12180f1237a344e69f73d743c5f4f3c3969f60), all sessions are flat. After, Settings pass and Release notes nest under Release week, and their children Shrink large files and Changelog start folded behind count chips. This demonstrates the new default; it is fixture-seeded evidence, not a live agent spawn recording. Reference: Claude's linked-session nesting (apps/claude/live/sidebar-linked-session-nesting.png); private reference media is not reproduced here.

Before After
Before, light After, light
Before, dark After, dark

Remaining checks: the independent reviewer published its exact-head SHIP, and the defaults guard passed. After #25861 merged, one retry of the failed broad Swift job failed again: no test-run summary, 926 tests unfinished, plus failures in SidebarPriorityMotionTests.aRowRetargetedWhileItOpensClipsUntilWhole (line 223) and FileExplorerEditTests.newFileAndNewFolderMakeUntitledItemsAndSelectThem (lines 74–75). This incomplete run is not excused as a base red. The frozen head does not include #25861's run-loop guard; incorporating that recovery requires a new head and review. The focused four-suite success above remains separate evidence. Both the Swift dependency hold (#26809) and the outstanding exact-head validation hold remain; no further rerun or source change has been made.

Risk: nesting changes default sidebar organization and the handling of deep folds; explicit/manual folds, selected-workspace reveal, same-list ancestry, and PR-read gating are covered by the focused tests.

Changelog

Changed: Sessions an agent starts now nest under the session that started them in the sidebar, with deeper levels folded. Debug Settings can turn this off.

🤖 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

Makes agent-started sessions nest under the workspace whose agent started them, by default. Previously nesting only ran behind the opt-in sidebar.sessionTree setting; now every workspace an agent started lists under its parent at any depth, and only person-started sessions stay at the top level. A parent below the top level starts folded behind a count chip and its state roll-up; open/fold state persists per parent.

New Features

  • Nesting follows the row's own list: a workspace listed twice nests per list, and a chain or cycle never crosses lists.
  • Debug Settings toggle sidebar.lineageNesting (on by default) turns nesting off; nesting alone makes no GitHub calls and draws no keycaps or chat history, which stay sidebar.sessionTree's.
  • The Done fold and row limit now treat a subtree as one row, and group members nest the same way; an idle-only roll-up is no longer empty.
  • Selecting a hidden session opens the folds above it; lineage arriving after the selection reveals it too, and dragging or regrouping the selection into a deep list opens its new folds. A fold the user makes later stays.

Written for commit d11e0bd. Summary will update on new commits.

View guided diff Turn on auto-fix

Agent session: agent session

@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

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

Review d11e0bd: 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=pr24287 -f ref=cmux/lineage-nesting-default -f platform=macos -f backend_mode=local

red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on e4fc509 to compare; do not merge until green; see lane-rules

@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 22, 2026
@blacksmith-sh

blacksmith-sh Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Found 7 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmp2x3ke0o1/summary-missing.json (live):/summary-missing.json (live): View Logs
/tmp/tmprs9xh5i7/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

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

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex xhigh): BLOCK at d41b76f

Findings

  • Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Model/SidebarAgentState.swift:64: SidebarTreeRollUp.isEmpty still checks only the four state counters and ignores the new total count. A roll-up containing only idle descendants (SidebarTreeRollUp(total: 2)) is now rendered with a count chip, but isEmpty reports true. Update the property to include total == 0 (and add an idle-only assertion).

  • Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/SidebarDeepTreeTests.swift:83 is now a failing exact-head test. The implementation increments SidebarTreeRollUp.total for every descendant, so the folded a subtree has total == 4; the unchanged expectation constructs a value with the default total == 0. Update the expected value to include total: 4 (and keep the test asserting that idle descendants are excluded only from state buckets).

  • Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Views/SidebarListView+Layout.swift:72-75 introduces another exact-head test failure. SidebarSessionTreeTests.rowsDrawTheLineTheBadgeAndTheKeycaps sets SidebarSessionTree.shared.state but leaves DesignSettings.sidebarSections.sessionTree false, then requires parent.keycap.number at Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/SidebarSessionTreeTests.swift:148. The new opt-in gate correctly leaves keycaps unset when only lineage nesting is active, so that test now fails. Update the fixture to enable sidebar.sessionTree when it is testing keycaps (and retain a separate assertion that lineage-only mode has no keycaps).

Non-blocking

  • The new lineage-only path deliberately makes the shared tree state non-nil, so existing callers that use drawn as a proxy for the full sidebar.sessionTree feature should be audited for the same opt-in distinction; the list layout itself now gates keycaps and chat history, as intended.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex xhigh): BLOCK at a18f826

Findings

  • Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Model/SidebarSessionTree.swift:149-159 and :216-219: hidesInFold and selection reveal infer every ancestor's depth from the global parents map, without the current section/group's workspace set. That contradicts SidebarLayout.treeOrder, which deliberately treats a parent absent from the current list as a root and treats cycles as roots. With foldsDeep enabled, a child c in one list with parents[c] = p, where p is in another list and itself has a parent, is drawn at depth 0, but hidesInFold(c) returns true because it evaluates p at inferred depth 1. Selecting visible c then runs SidebarView+Observation.swift:114, reveal(c) inserts p into opened and persists it, unexpectedly expanding the unrelated list containing p. A cycle such as a -> b -> a has the same false hidden result and can persist an irrelevant opened entry. Make reveal/hidden checks use the scoped tree/order for the displayed list (or pass the visible IDs/actual depths), and add cross-list and cycle tests.

Non-blocking

  • The supplied fix addresses the prior isEmpty, roll-up expectation, and keycap-fixture findings. The remaining Cmd-number, visible-row, render-state, and opt-in readers intentionally consume the drawn nesting state as described.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex xhigh): BLOCK at 2b7e5de

Findings

  • Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Model/SidebarModel.swift:463-469 plus Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Model/SidebarSessionTree.swift:153-165: sharesList is an existential pairwise relation, but drawnAncestors needs one common list for the entire ancestor chain. The sidebar explicitly permits duplicate listings of one workspace. For example, let A be listed in lists L1 and L2, B only in L1, and C only in L2, with parents[A] = B and parents[C] = A. treeOrder draws L2 as A at depth 0 and C at depth 1; B is absent, so A is not a deep folded parent in L2. The new walk nevertheless returns [A, B] because sharesList(C, A) is true through L2 and sharesList(A, B) is true through L1. hidesInFold(C) then evaluates A at depth 1 and falsely reports the visible L2 copy hidden; selection reveal(C) also removes/persists folds for the unrelated L1 chain. Carry a concrete list identity/visible-ID set through the ancestor walk (or require one shared list token for every edge), and add a duplicate-listing non-transitivity test.

Non-blocking

  • The supplied fix correctly handles unique-list cross-parent cases and cycles, and addresses the prior isEmpty, roll-up expectation, and keycap-fixture findings.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex xhigh): SHIP at 12a19aa

Findings: none.

The merge resolution in Packages/macOS/CmuxNext/Sources/CmuxNextAgentLanes/SidebarSessionTreeFeed.swift:52-65 preserves the feat-cmux-next per-session lanes.links(session) collection and the PR’s reads || nests gate. :73-79 preserves the PR’s shaped(...) behavior: lineage parents are cleared when the Debug toggle is off, while pull-request reads remain controlled independently by reads.

The full diff was reviewed against the new base, including the deep tree ordering/folding and roll-up paths (SidebarLayout+SessionTree.swift:12-112, SidebarSessionTree.swift:142-237), list-specific reveal/hide handling (SidebarModel.swift:465-477), and the nesting-only presentation path (SidebarListView+Layout.swift:64-75). No additional regression or merge-resolution loss was found.

Verification was read-only at exact head 12a19aa5d8254ab97b374874b8e821fa4e39dea6: inspected merge-resolution.diff, pr24287.diff, and the checked-out source with git show; git diff --check passed for the changed sidebar paths. Builds and tests were not run per the review instructions.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / nightly-guards / workflow-guard-tests / release-notary is red on 13 of 17 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 (codex xhigh): BLOCK at d4c5c0e

Finding 1 — Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Views/SidebarView+Observation.swift:114: a selected workspace can remain hidden when the session-tree feed arrives after the first render. The initial render treats the selection as changed, but SidebarSessionTree.shared.reveal returns while state is still nil (SidebarSessionTree.swift:227). When the feed later publishes the lineage state, lastState?.tree != state.tree makes rowsChanged true, while selectionChanged is false, so this line does not retry the reveal; the new foldsDeep default then hides a selected depth-2+ workspace behind its parent. This is reachable on launch because ChatsFeed.started starts the tree feed after restored windows are created. Re-run reveal for the current selection when the tree state changes (or queue the selection until state is available), keeping the existing list-scoping argument.

The post-SHIP comparison is otherwise unchanged: /tmp/lineage-nesting-default/review3/since-ship.diff is empty, and the exact-head diff shows no changes in the PR-touched source files after 12a19aa. No builds or tests were run per the read-only review request.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / tooling-tests is red on 17 of 17 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

Orphaned: no activity for 15 h, and no lane holds a lease on it. Adopted by the orphan sweep: merged feat-cmux-next in at 1cb88c3. A later pass queues it for the merge hub if it is reviewed, small and red only on base reds.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › Checks job structure is red on 9 of 11 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

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › No new SwiftUI (macOS UI is AppKit) is red on 9 of 11 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

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › Script tests (pin-cmux-tui, embed-cef, ensure-cef store) is red on 8 of 13 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

teamleaderleo commented Oct 26, 2026 •

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · session

@teamleaderleo
teamleaderleo force-pushed the cmux/lineage-nesting-default branch from 1cb88c3 to e907619 Compare October 26, 2026 21:51
@cursor

cursor Bot commented Oct 26, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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.

@cursor

cursor Bot commented Oct 26, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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.

@github-actions

github-actions Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Default changes

This pull request changes 5 defaults at d11e0bdd0555 (what everyone gets without configuring anything):

  • tunable-source.CmuxNextSidebar/Logic/SidebarLayout+SessionTree.swift:treeOrder: "4f8b3bbae3d7dcfaa49e887b5a57a8352abb3c063672791fad43ae044f28a83a" -> "455a442c3dfd74fe6abb642b88cf2d0e25defe05fa040be4a33f9fefb02321b7"
  • tunable-source.CmuxNextSidebar/Logic/SidebarLayout.swift:make: "556b3d0ac5172178389cf745ec58c0fb8911acc7da721b62e5524b2ccf5c51be" -> "b9a025a8e157d7892af124414cd66cad6c51b27d49a551d71df7bcaab2fb3036"
  • tunable-source.CmuxNextSidebar/Logic/SidebarTunables.swift:all: "b16f57d0361c21e6292a1784873f85f934f6c964bf5c3e565f691abfa069ef0a" -> "ff88d49e6cdefb61d36ea11cc5349c35bf058abac7969108acd48e54fbec998d"
  • tunable-source.CmuxNextSidebar/Logic/SidebarTunables.swift:lineageNesting: (none) -> "5c13d502a1e4479873eaf73635b82a2e119850427c8983e8307dce69f0f08ece"
  • tunable.sidebar.lineageNesting: (none) -> true

Needs a review. It passes with an independent review receipt on this commit: a comment or review whose first line is Review (<reviewer>): SHIP at d11e0bdd055568970feea4c7fc4f1d7fcf363245, from a member, not a self-review (the newest verdict naming the head decides; a later BLOCK beats an earlier SHIP), or with an approving review on this commit from @lawrencecchen or @austinywang (the call owners in .github/defaults-call-owners.json, never the author). A receipt posted as a review re-runs this check; after a plain comment, re-run it. The needs a call label alone does not pass, and a new push needs a new receipt.

Regenerate the snapshot with python3 scripts/ci/defaults_guard.py snapshot.

teamleaderleo and others added 10 commits October 28, 2026 22:15
Agent-started workspaces nest under the workspace whose agent started them,
at any depth, with only person-started sessions at the top level. A parent
below depth 1 starts folded behind a count chip and its state roll-up; the
user's open/fold persists per parent. Debug Settings sidebar.lineageNesting
(on by default) turns nesting off. sidebar.sessionTree keeps its keycaps,
chat history and pull request reads. The Done fold and row limit move whole
subtrees with their top-level row.

Leo-ask: ask-18a79e54a3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-3eb9-7ce3-a6c8-07fec063b18a&host=cosmic-gray

Sidebar-Look: no visual change
….sessionTree on

Review findings at d41b76f: SidebarTreeRollUp.isEmpty counts total; the deep
tree roll-up expectation includes total; the keycap row test enables
sidebar.sessionTree, and a new test pins that nesting alone draws no keycaps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-3eb9-7ce3-a6c8-07fec063b18a&host=cosmic-gray
Sidebar-Look: no visual change
Review finding at a18f826: hidesInFold and reveal walked the global parents
map, so a row whose parent sits in another list (drawn as a root there) read
as hidden and its selection opened folds in the other list; a cycle did too.
Both now walk only the ancestors the layout nests it under (same list, no
cycle), through SidebarModel.sharesList.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-3eb9-7ce3-a6c8-07fec063b18a&host=cosmic-gray

Sidebar-Look: no visual change
Review finding at 2b7e5de: a pairwise same-list test let a chain hop lists
through a workspace listed twice. hidesInFold and reveal now take one
membership test per list holding the row (SidebarModel.listsHolding, O(1)
through the row index) and walk each list on its own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-3eb9-7ce3-a6c8-07fec063b18a&host=cosmic-gray

Sidebar-Look: no visual change
Review finding at d4c5c0e: the tree feed starts after restored windows, so
the first render's reveal ran with no lineage and a later tree change did not
retry it; a depth-2 selection stayed in its parent's fold. A change of parents
now re-reveals the selection (a fold the person makes keeps).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16162-3eb9-7ce3-a6c8-07fec063b18a&host=cosmic-gray

Sidebar-Look: no visual change
Keep the roll-up total meaning explicit in French and avoid new identical-English localization debt. The existing validate_localization check rejects the old value and accepts the new value.

Sidebar-Look: no visual change
Track selected rows drawn ancestor paths after applying grouping preferences. Moving a selected session under a deep parent opens its new folds, while manual folds and unrelated structural changes keep their state. Add a regression covering the move, explicit fold, and unrelated row insertion.

Sidebar-Look: no visual change
@teamleaderleo
teamleaderleo force-pushed the cmux/lineage-nesting-default branch from 5f443c6 to 17c0923 Compare October 28, 2026 22:35
@cursor

cursor Bot commented Oct 28, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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.

@teamleaderleo teamleaderleo left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review (independent gpt-6-astra high): SHIP at 17c0923

I am the independent reviewer session that performed this review, publishing my own completed verdict. This is a read-only static review of the complete 22-file diff against base 4c12180 and its affected callers and integration paths. The PR head was checked before publication and still matches the reviewed head.

No remaining concrete correctness blockers were found.

The earlier selected-workspace/list-membership finding is repaired in this head. Rendering applies list preferences and grouping before SidebarSelectionTreeReveal computes each selected workspace's per-list ancestor paths. Moving the same selected workspace into a deep lineage list opens its new ancestors; unchanged ancestry preserves explicit manual folds and unrelated structural updates. I inspected the regression covering that move and fold preservation, and the raw model-list indexing used by the ancestry walk. Group by Status remains a separate flat layout path.

The whole-diff review also covered default-on lineage nesting, late lineage arrival after restored selection, list-relative ancestor walks, cycle and foreign-list handling, deep fold persistence and toggle behavior, Done folding and row limits over whole tree runs, roll-up totals including idle descendants, accessibility/localization changes, needs-you reveal wiring, and the preserved base label frame(forAlignmentRect:) behavior.

GitHub PR reads remain gated by the existing session-tree, Priority-view, or enabled row-badge settings. Lineage nesting alone publishes tree state using empty PR answers and stops the PR recheck store; it does not enable those reads. Keycaps and chat history retain the session-tree setting gate.

Validation performed by this reviewer: static source/diff/caller inspection and git diff --check, which was clean. I ran no builds, test suites, CI reruns, or native UI validation, and this verdict inherits no CI result. The owner's fleet verification and landing checks remain separate evidence.

Reviewed head: 17c0923

Agent session: agent session

@teamleaderleo teamleaderleo removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 29, 2026
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 29, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, next-review): BLOCK at d11e0bd

  • P2 — Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Logic/SidebarLayout+DoneFold.swift:74: The row-limit exemption checks only already-visible descendants. With three roots and rowLimit = 1, a later root containing a folded lane whose child needs attention disappears behind “Show more,” including its attention roll-up. Previously, flat mode preserved that child and tree mode bypassed limiting. Check the full subtree or its roll-up before hiding the run.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Closing: superseded by #28103, a carry of this PR's commits with the fold-filtering P1/P2 fixes and current feat-cmux-next merged in. Its owner session is gone (stuck, counted gone), and there's been no activity since 2026-10-29 22:28Z.

This branch was previously deployed

1 inactive deployment
ci-routing-agent — d11e0bdd Deployed Oct 29, 2026 by teamleaderleo via wait for same-key tree publisher #78620
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant