Repository navigation
cmux NEXT: an agent-opened session workspace records its lineage parent - #24136
Conversation
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/41006843682 at 346179f failed: cmux-next checks (god files, concurrency, crash safety, l10n). |
|
Bead |
|
Found 9 test failures on Blacksmith runners: Failures
|
|
Review (codex xhigh, correctness first): SHIP at e41dd19 Findings: None. Non-blocking: Tests do not directly exercise Verification: dependency-list, concurrency, and diff checks passed. Swift compilation/tests were unavailable because no Swift toolchain was installed; no macOS app build was run. (Verbatim reply of the Codex xhigh reviewer session huge-blue/sv2-review-24136, relayed by the PR owner because GitHub was rate-limited for the reviewer. Its earlier BLOCK at 934d513 — a daemon parent no workspace shows did not win over the recorded parent — is fixed in e41dd19 with test |
|
|
|
|
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
Review (codex xhigh, correctness first): SHIP at 1a61756 Non-blocking: tests still do not exercise the actual (Verbatim reply of the Codex xhigh reviewer session cosmic-gray/sv2-review4-24136, which had no tool or GitHub access and reviewed the inlined diff; relayed by the PR owner. Its BLOCKs at f99d9cd (cycles among recorded parents) and f19894d (a recorded parent looping with daemon lineage) are fixed in f19894d and 1a61756 with tests |
|
|
|
|
|
|
|
|
|
Orphaned: no activity for 13 h, and no lane holds a lease on it. Adopted by the orphan sweep: merged |
|
|
|
|
|
Owned by an agent session · session |
Review P2 at cc78a79: opening an unopened remote child checks its lineage under the daemon's registry host (AgentTabStore.registryHost(of:)), but the wire noted links under the tab's record.host. A chat made on that Mac keeps an install:<id> host, so its children were noted under install: and looked up under registry:, and the open was refused. The tab's remote host now carries the daemon's registry host (linksHost), and the wire notes each reply's links under both. The tree and the pane keep reading record.host. anInstallTabsChildrenAreNotedUnderTheDaemonsStoreHostToo covers it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-5b0be570f0b96d2d4c7b
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
… host:) and the RemoteAgentSessionLinks import Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-5b0be570f0b96d2d4c7b
# Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextApp/Handlers/AgentSessionWorkspace.swift
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
…ck legacy links - A host-qualified wire notes even an empty child list, so a daemon with no lineage gets its own map and never reads another daemon's hostless links. - The wire records a tab's install: host and the daemon's registry: host as aliases; the sidebar's owner, daemon-link and recorded-parent lookups try the daemon's other keys, so a child nests under a parent keyed by the other. - holds and chat.offer.open on a remote route with no hostID read the hostless map that route's wire noted, instead of refusing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-5b0be570f0b96d2d4c7b
A restored remote tab whose wire has not reported yet had no host map, so its lookups fell back to the hostless map and could borrow another daemon's link for a reused session id. Host-qualified lookups (offer open, side chat, the sidebar's tree) now read only that host's map; the hostless map serves only a route with no host. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-5b0be570f0b96d2d4c7b
# Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextApp/Handlers/AgentSessionWorkspace.swift
Comments only: every app wire notes under its tab's host, so the hostless map holds only a hostless route's links; a remote child open with no store id yet is refused because its tab could not be filed under that store. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-5b0be570f0b96d2d4c7b
|
Review (codex gpt-6.1-sol high fast, review-router): SHIP at 67c53ff |
|
Shipped in:
|
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Status: done. Codex xhigh SHIP at 1a61756; fleet compile-check --app passed at 1a61756; fleet suites AgentSessionLineageTests (8 tests), SidebarSessionTreeTests and RemoteChildSessionsTests all pass (run on 1a61756 on top of base 7d50820, because base's SidebarNowLineTests.swift has conflict markers that stop every CmuxNext test build).
Leo: "LIKE E.G. AGENT SESSION CREATION LINEAGES... CLAUDE CODE MOSTLY JUST HAS ONE LAYER... WHAT IF WE DID MORE? OR DIFFERENT?"
Leo-ask: ask-19882abbc3
Session lineage, PR 2 of the plan (app: an agent-opened session workspace records its parent).
What changes
agent.openSessionWorkspace(cmux agent open,acpmux new --group, the MCP open tools) passes the invocation'scallerAgentSessionthrough toopen(...). Once the chat tab opens, it records that caller as the opened session's lineage parent in a newAgentSessionParentsstore (child session -> parent session, kept in UserDefaults undercmux.next.agentSession.lineageParents, capped at 4096, oldest dropped). A person's open (no caller), a blank caller, or a session naming itself records nothing.SidebarSessionTreeFeed.passreads the recorded parents as a fallback, applied last and never where it would close a loop: a workspace gets its recorded parent only when neither the remote daemon'sstartedBy/spawnedBy(RemoteAgentSessionLinks) nor this Mac's lanespawnedBynames one. Daemon lineage always wins.parentto match the acpmux lineage summary field (parent/root/depth) another lane is adding; this PR does not depend on it.No default changes. The tree itself stays behind
sidebar.sessionTree(off by default). No sidebar layout or fold changes (#21836 owns those; this touches onlypass(...)'s parents map, not theagentStateslines #21836 adds there).Tests (test-first)
CmuxNextAppTests.AgentSessionLineageTests:spawnedBy, remotestartedBy) wins over the recorded parent;No capture: records data only; the nested view stays behind sidebar.sessionTree until the nesting PR
🤖 Generated with Claude Code
Agent session: cosmic-gray