Skip to content

Chat: a file dropped into an ssh peer's chat goes to that peer (_acpmux/file_put) - #23324

Merged
teamleaderleo merged 10 commits into
feat-cmux-nextfrom
attachments-peer-put
Oct 21, 2026
Merged

teamleaderleo merged 10 commits into
feat-cmux-nextfrom
attachments-peer-put

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Some chats run their agent on an ssh peer: this Mac's acpmux mirrors them, named like huge-blue/<name>. Until now, a file dropped or pasted into such a chat that the composer couldn't attach (a binary, a zip, a large text file) got the note that the chat takes no uploads. The Cloud uploader only serves moved chats. The local uploader would save the file on this Mac, where the agent can't open it. Now the file goes to the machine that runs the chat.

How

  • acpmux: _acpmux/file_put {sessionId, fileName, data} → {path}.
    • The daemon that owns the session writes the file owner-only (folder 0700, file 0600) under <ACPMUX_HOME>/uploads/<session id>/<uuid v7>/<fileName>. Two files with the same name never overwrite each other.
    • The method is session-scoped, so for a peer's chat peer_forward.rs carries it to the peer.
    • The parameter is fileName because the forward drops name, which is a session key.
  • Checks, before anything is decoded or forwarded:
    • Names follow the app's AgentPaneUpload.isFileName rules (filePut.name).
    • Each file is at most 10 MiB (filePut.tooLarge). That is 13.4 MiB of base64, under an older peer's 16 MiB WebSocket frame limit. A bigger frame resets the whole link and every chat on it.
    • An unknown or purged chat is refused.
  • Feature detection: initialize lists filePut, and the peer handshake records whether the peer has it. A peer without it gets -32601 with reason filePut.unsupported, and no bytes are sent.
  • The app adds a third uploader, AgentPeerUploads, tried after Cloud and before local.
    • A tab gets it when its chat is on this Mac's acpmux and AgentLaneStore lists the session with a peer.
    • It calls the method through AgentPaneHostProviding.putFile, which goes over this Mac's acpmux unix socket and requires the filePut feature.
    • An older acpmux (here or on the peer) or a missing host answers unsupported, so the page shows its existing note. Size refusals answer too_large; anything else answers upload_failed.
    • The person-gesture rule is unchanged, and localPaths is false for peer chats, so their Finder drops go as bytes.
  • The page is unchanged: it already sends chat.upload and puts the returned paths in the prompt as resource_links.

Remote access analysis (remote_guard)

  • Allowed from: the unix socket, LocalApp (the app's own connection), and a peer forwarding for either. The app sends it over the unix socket after the person's gesture. A LocalApp page could also send it with no gesture; that is accepted, since the page can already prompt the agent, and each call writes at most 10 MiB owner-only into a fresh folder.
  • Refused: from a Web connection, and from a peer request marked via=web (filePut.remote).
  • What the method can do: it runs no commands and starts no processes. It writes only under acpmux's own uploads/<session>/<random>/. The caller picks neither the folder nor any path; the name is one plain file name (no /, no dot file, no control or bidi characters). The name must be one plain path component (on Windows also no :, so a drive prefix can't leave the folder). The session must be one this daemon owns or forwards.
  • Not a new local effect: the peer daemon already runs the agent with the user's own rights, and writing the person's dropped file next to it gives that agent nothing new.

Not in this PR

  • Cleanup: nothing deletes uploads yet, the same as the app's local Chat Uploads folder. A purge keeps them. Deleting them is a follow-up that should cover both folders.
  • Chat: send images and PDFs to acpmux ahead of the prompt, by reference #23047's attachment_put: that PR sends images and PDFs as prompt blocks by reference, which is a separate path from chat.upload. If both land, the two paths have no overlap to reconcile in code.

Tests

  • Rust (cargo test -p acpmux --test file_put). The cases:

    • file modes;
    • a bad name;
    • an oversize file;
    • an unknown chat;
    • a Web connection refused;
    • a purged chat refused;
    • a forward to a peer at the full cap;
    • an older peer refused with zero puts sent.

    Also run: peer_integration, remote_guard, remote_guard_refused_families, peer_origin, local_app_origin, prompt_images. Results at this head are in a comment below.

  • Swift: AgentPaneFilePutTests covers the failure mapping, the size cap before send, and the params. AgentPeerUploadsTests covers the per-file replies, the size refusal, and the unsupported mapping. CI is their first compile.

Observed / Not run

  • Rust: ran on huge-blue (Linux) at f98478b and 5afc7d1; the review fixes at 67b0e2e ran on the fleet (comment below).
  • Windows: cargo check --target x86_64-pc-windows-gnu -p acpmux passed at 5afc7d1 (run 39586149383).
  • Swift: not compiled or run outside CI.
  • Not run: a live two-machine run in the app (a drop into a real peer chat).

Changelog

Added: Files dropped into a chat that runs on an ssh peer now reach that machine, so the agent can open them.

No capture: no new UI. The only visible change is two error strings in the composer's existing upload note.

Agent session: cosmic-gray

🤖 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

Files dropped into a chat whose agent runs on an ssh peer now land on that machine, where the agent can open them. Previously the composer refused them or saved them on this Mac, where the peer's agent can't read them.

The new _acpmux/file_put method saves the bytes owner-only under <ACPMUX_HOME>/uploads/<session>/<random>/<name> on the daemon that owns the session, and AgentPeerUploads (the app's third uploader, tried after Cloud and before local) sends a peer chat's chat.upload files through this Mac's acpmux unix socket. Refusals map to the existing composer notes: an acpmux without the method answers unsupported (chat takes no uploads), oversize is refused before any bytes go, and the page is unchanged.

Checks run before anything is decoded or forwarded: plain file name, 10 MiB cap (an older peer reads 16 MiB frames), existing session, peer advertising the filePut feature. The method is allowed only from the unix socket, LocalApp, and peers forwarding for either; Web is refused. Uploads are kept on purge, like the app's local Chat Uploads; cleanup is a follow-up.

Written for commit 460daf2. Summary will update on new commits.

View guided diff Turn on auto-fix

teamleaderleo and others added 7 commits October 21, 2026 03:01
…s the chat

A file the person drops into a chat that the composer can't attach is
saved owner-only by the daemon that owns the session, under
<ACPMUX_HOME>/uploads/<session>/<random>/<name>, answered {path}. A peer's
chat is forwarded to that peer, only when its initialize lists filePut
(else Method not found, reason filePut.unsupported), and the 10 MiB cap is
checked before the link: an older peer reads at most 16 MiB frames. Web
connections are refused (filePut.remote); a purge deletes the uploads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d3d-4bad-7860-b096-c54282b4bec4&host=cosmic-gray
A chat of this Mac's acpmux whose agent runs on an ssh peer (a chat named
huge-blue/<name>) took its dropped files into this Mac's Chat Uploads,
whose paths that agent cannot open. Its chat.upload now sends each file
through this Mac's acpmux to the peer (_acpmux/file_put, AgentPeerUploads)
and answers the paths there; an acpmux without the method, here or on the
peer, answers unsupported, so the composer keeps its note. Files over
10 MiB are refused before any is sent, and Finder drops in a peer chat are
never linked as this Mac's paths.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d3d-4bad-7860-b096-c54282b4bec4&host=cosmic-gray
…ame (a session key)

The two-daemon test caught it: forwarding a peer's session strips
session, name and sessionId aliases, so the peer saw no name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d3d-4bad-7860-b096-c54282b4bec4&host=cosmic-gray
…t Uploads

Deleting them on purge was a new delete of user files; leave cleanup to a
follow-up that covers both upload folders.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d3d-4bad-7860-b096-c54282b4bec4&host=cosmic-gray
- AgentPaneFilePutFailure.init(_:) is public: CmuxNextApp calls it.
- AcpmuxChiefSessionRouter publicly imports Foundation for putFile's Data.
- A file name must be one plain path component, and on Windows has no ':',
  so a drive prefix (C:x) can't take the write out of the uploads folder.
- The size check reads the decoded length from the base64 length and
  padding, so MAX_BYTES+1 is refused before it is forwarded to a peer.
- remote_guard's note says a LocalApp page can send file_put itself.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d3d-4bad-7860-b096-c54282b4bec4&host=cosmic-gray
@teamleaderleo teamleaderleo added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 21, 2026
@teamleaderleo
teamleaderleo temporarily deployed to cmux-tui-merge-tree October 21, 2026 11:09 — with GitHub Actions Inactive
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by attachments-matrix on cosmic-gray · session

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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

…-peer-put

# Conflicts:
#	cmux-tui/crates/acpmux/src/server/requests.rs
@teamleaderleo
teamleaderleo temporarily deployed to cmux-tui-merge-tree October 21, 2026 11:13 — with GitHub Actions Inactive
@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 460daf2: 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=pr23324 -f ref=attachments-peer-put -f platform=macos -f backend_mode=local

Gallery before/after for 460daf2: 16 states rendered, 3 images differ, 1416 more touched states not rendered. Images are in the run's artifact, not on this public PR.

gh run download 39602944207 -R manaflow-ai/cmux -n gallery-advisory-23324-460daf25403692d46db81957bbb40879073654da (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.chat-width/standard Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.chat-width/standard Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.chat-width/wide Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.chat-width/wide Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.chat-width/wide-blocks Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.chat-width/wide-blocks Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.composer-floats/scrolled-to-end Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.composer-floats/scrolled-to-end Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.composer-floats/composer-grown Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.composer-floats/composer-grown Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.docked-chat/new-chat Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.docked-chat/new-chat Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.docked-chat/after-turn Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.docked-chat/after-turn Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.docked-chat/working Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.docked-chat/working Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.docked-chat/typing-in-dock Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.docked-chat/typing-in-dock Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.docked-chat/long-title Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.docked-chat/long-title Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.inspector/chat-menu Apple System Colors changed 0% imports methods.ts (2 hops)
agent-pane.inspector/chat-menu Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.inspector/wire-log Apple System Colors changed 0.0222% imports methods.ts (2 hops)
agent-pane.inspector/wire-log Apple System Colors Light changed 0.0159% imports methods.ts (2 hops)
agent-pane.orchestration-lab/local-queue Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.orchestration-lab/local-queue Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.orchestration-lab/huge-blue Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.orchestration-lab/huge-blue Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.orchestration-lab/cloud-fair-share Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.orchestration-lab/cloud-fair-share Apple System Colors unchanged 0% imports methods.ts (2 hops)
agent-pane.permission-panel/buttons-current Apple System Colors Light unchanged 0% imports methods.ts (2 hops)
agent-pane.permission-panel/buttons-current Apple System Colors unchanged 0% imports methods.ts (2 hops)

Pick other states with a Gallery: entry.id, entry.id/variant line in the PR body.

Probably yours: agent-pane-focus-content.test.ts fails here but not on main's latest full suite. Seen on other PRs too (likely flaky): chat-find.test.ts.

CI failed on 460daf2540 (run 39602944245 attempt 1): 2 code, 1 unknown.
macOS jobs did not run: compile and app tests were skipped: Fast static checks skipped.

Job Verdict Why
web / react-apps-check (3) code a web test failed
web / react-apps-check (2) code a web test failed
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Failures:

  • new in this PR agent-pane-focus-content.test.ts a click outside the composer blurs it, with the click's focusContent after the press: failed (job)
  • seen on other PRs chat-find.test.ts Find in Chat > chat.find opens the bar, counts and highlights matches, steps, and closes: failed (job)
Matched log lines
web / react-apps-check (3): (fail) a click outside the composer blurs it, with the click's focusContent after the press [3915.91ms]
web / react-apps-check (2): (fail) Find in Chat > chat.find opens the bar, counts and highlights matches, steps, and closes [1696.97ms]

Not re-run automatically: web / react-apps-check (3), web / react-apps-check (2), web / react-apps-check 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.

red: web / Web status; NEW: green on the base 1a71fc9; do not merge until green; see lane-rules
red: web / react-apps-check; no finished base run on 1a71fc9 to compare; do not merge until green; see lane-rules
red: web / react-apps-check (2); no finished base run on 1a71fc9 to compare; do not merge until green; see lane-rules
red: web / react-apps-check (3); no finished base run on 1a71fc9 to compare; do not merge until green; see lane-rules

CI fast guards failed on 460daf2540 (https://github.com/manaflow-ai/cmux/actions/runs/39602944245). 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.

Tour of 460daf2540 (run)

The path-selected recorder failed for agent-pane, core; see the run artifact and failed manifests.

Path-selected interactions

Interaction Changed paths
agent-pane Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/AcpmuxChiefSessionRouter.swift
Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/AgentPaneFilePut.swift
Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/AgentPaneHost.swift
Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/AgentPaneUpload.swift
Packages/macOS/CmuxNext/Tests/CmuxNextAgentPaneTests/AgentPaneFilePutTests.swift
webviews/src/agent\-session/acpmux/protocol/generated/methods.ts
core Packages/macOS/CmuxNext/Sources/CmuxNextApp/AgentPeerUploads.swift
Packages/macOS/CmuxNext/Sources/CmuxNextApp/Handlers/CloudHandlers\+Move.swift
Packages/macOS/CmuxNext/Sources/CmuxNextApp/Resources/Cloud.xcstrings
Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/AgentPeerUploadsTests.swift

Agent pane (before): PASS — 3 ok

tour

Video (mp4)

# Step Result Command
1 Launch ok
2 Open agent chat ok cmux agent new-chat
3 Queue a second chat ok cmux agent new-chat
Screenshots (3)

1. Launch
Launch

2. Open agent chat
Open agent chat

3. Queue a second chat
Queue a second chat

### Agent pane \(after\): PASS — 3 ok

tour

Video (mp4)

# Step Result Command
1 Launch ok
2 Open agent chat ok cmux agent new-chat
3 Queue a second chat ok cmux agent new-chat
Screenshots (3)

1. Launch
Launch

2. Open agent chat
Open agent chat

3. Queue a second chat
Queue a second chat

### Core UI \(before\): PASS — 19 ok

tour

Video (mp4)

# Step Result Command
1 Launch ok
2 New workspace ok cmux workspace new --name Tour
3 Type in the terminal ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "echo hello from the cmux-next tour\r"
4 A command reports progress: tab loading spinner ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "clear; printf '\\033]9;4;3\\007'; sleep 900\r"
5 Split right ok cmux action run splitRight
6 Split down ok cmux action run splitDown
7 New terminal tab ok cmux action run newSurface
8 Browser tab ok cmux tab new-browser --url https://example.com
9 Hide the sidebar ok cmux action run toggleSidebar
10 Show the sidebar ok cmux action run toggleSidebar
11 Notification ok cmux notify --title Tour --body "Hello from CI"
12 Notifications panel ok cmux action run showNotifications
13 Agent chat ok cmux agent new-chat
14 Agent workspace ok cmux workspace new --name Agent
15 Agent starts ok cmux workspace name:Agent screen current pane current tab current terminal current write --text "clear; printf '\\033]7501;state=working\\033\\\\'; sleep 8; printf '\\033]7501;state=done\\033\\\\'; sleep 900\r"
16 An agent works: row working spinner ok cmux workspace new --name Notes
17 The agent finishes: done mark in the spinner's place ok
18 Session tree: keycaps on the first rows ok cmux settings set sidebar.sessionTree true
19 Session tree back off for later tours ok cmux settings set sidebar.sessionTree false
Screenshots (15)

1. Launch
Launch

2. New workspace
New workspace

3. Type in the terminal
Type in the terminal

4. A command reports progress: tab loading spinner
A command reports progress: tab loading spinner

5. Split right
Split right

6. Split down
Split down

7. New terminal tab
New terminal tab

8. Browser tab
Browser tab

9. Hide the sidebar
Hide the sidebar

11. Notification
Notification

12. Notifications panel
Notifications panel

13. Agent chat
Agent chat

16. An agent works: row working spinner
An agent works: row working spinner

17. The agent finishes: done mark in the spinner's place
The agent finishes: done mark in the spinner's place

18. Session tree: keycaps on the first rows
Session tree: keycaps on the first rows

### Core UI \(after\): PASS — 19 ok

tour

Video (mp4)

# Step Result Command
1 Launch ok
2 New workspace ok cmux workspace new --name Tour
3 Type in the terminal ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "echo hello from the cmux-next tour\r"
4 A command reports progress: tab loading spinner ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "clear; printf '\\033]9;4;3\\007'; sleep 900\r"
5 Split right ok cmux action run splitRight
6 Split down ok cmux action run splitDown
7 New terminal tab ok cmux action run newSurface
8 Browser tab ok cmux tab new-browser --url https://example.com
9 Hide the sidebar ok cmux action run toggleSidebar
10 Show the sidebar ok cmux action run toggleSidebar
11 Notification ok cmux notify --title Tour --body "Hello from CI"
12 Notifications panel ok cmux action run showNotifications
13 Agent chat ok cmux agent new-chat
14 Agent workspace ok cmux workspace new --name Agent
15 Agent starts ok cmux workspace name:Agent screen current pane current tab current terminal current write --text "clear; printf '\\033]7501;state=working\\033\\\\'; sleep 8; printf '\\033]7501;state=done\\033\\\\'; sleep 900\r"
16 An agent works: row working spinner ok cmux workspace new --name Notes
17 The agent finishes: done mark in the spinner's place ok
18 Session tree: keycaps on the first rows ok cmux settings set sidebar.sessionTree true
19 Session tree back off for later tours ok cmux settings set sidebar.sessionTree false
Screenshots (15)

1. Launch
Launch

2. New workspace
New workspace

3. Type in the terminal
Type in the terminal

4. A command reports progress: tab loading spinner
A command reports progress: tab loading spinner

5. Split right
Split right

6. Split down
Split down

7. New terminal tab
New terminal tab

8. Browser tab
Browser tab

9. Hide the sidebar
Hide the sidebar

11. Notification
Notification

12. Notifications panel
Notifications panel

13. Agent chat
Agent chat

16. An agent works: row working spinner
An agent works: row working spinner

17. The agent finishes: done mark in the spinner's place
The agent finishes: done mark in the spinner's place

18. Session tree: keycaps on the first rows
Session tree: keycaps on the first rows

Tours are data in scripts/cmux-next/media/tours: add a step or a tour file to show your feature.

@blacksmith-sh

blacksmith-sh Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Found 4 test failures on Blacksmith runners:

Failures

Test View Logs
test/agent-pane-focus-content.test.ts/agent-pane-focus-content.test View Logs
test/agent-pane-focus-content.test.ts/agent-pane-focus-content.test View Logs
test/chat-find.test.ts/chat-find.test View Logs
test/chat-find.test.ts/chat-find.test View Logs

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

The @Concurrent putFile(sessionId:name:data:send:) took a non-Sendable
closure, so a main-actor test that passed one failed to compile
(SendingRisksDataRace). Every closure passed captures only actors and
values.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d3d-4bad-7860-b096-c54282b4bec4&host=cosmic-gray
@teamleaderleo
teamleaderleo temporarily deployed to cmux-tui-merge-tree October 21, 2026 12:47 — with GitHub Actions Inactive
…-peer-put

# Conflicts:
#	cmux-tui/crates/acpmux/src/hub/mod.rs
#	tests/test-execution.toml
@teamleaderleo
teamleaderleo temporarily deployed to cmux-tui-merge-tree October 21, 2026 12:51 — with GitHub Actions Inactive
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next fast gates / fast gates is red on 15 of 22 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 guards / defaults-snapshot is red on 18 of 21 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 (subagent, correctness first): SHIP at 460daf2

Reviews, all by independent subagents:

  • 5afc7d1: BLOCK. Two Swift compile errors, a Windows drive-prefix escape in the file name check, and an inexact size check. All were fixed in 67b0e2e, and a re-review there said SHIP.
  • 67b0e2e to 460daf2: the @Sendable fix plus two base merges. SHIP. The net diff is only the file_put feature, and every base addition in requests.rs and hub/mod.rs and in the generated method lists is kept.

Evidence:

  • Rust on Linux at 460daf2: all 9 file_put tests pass (cmux-tui focused file run 39613570876 and _cap_ run 39613587445, test (linux)).
    • Integration tests: a_dropped_file_is_saved_owner_only_and_named_by_its_path, a_bad_name_an_oversize_file_an_unknown_chat_and_the_web_are_refused, a_purged_chat_takes_no_more_files, a_file_for_a_peers_chat_lands_on_the_peer, a_peer_that_does_not_take_files_is_refused_before_anything_is_sent, initialize_lists_the_file_put_feature.
    • Unit tests: a_file_name_is_one_plain_file, one_byte_past_the_cap_is_refused_before_it_is_sent, the_cap_leaves_the_frame_room_on_an_old_peers_link.
  • Swift at 315c3cf (the base merges after it don't touch these files): compiled on the fleet, and AgentPaneFilePutTests (5) and AgentPeerUploadsTests (4) pass.
  • Windows: cargo check --target x86_64-pc-windows-gnu -p acpmux passed at 5afc7d1 (run 39586149383).

Non-green checks, none from this PR:

  • lint (linux): clippy in cmux-tui/tests/vm_child_sessions_journey.rs.
  • Menu guard: FileExplorerSectionView.swift.
  • Web lint: gallery-agent-pane-entries.test.ts.
  • react-apps-check: web/.
  • Companion workflows: base-autofix-repair.sh missing on base.
  • Generated files: the runner refused the job for too little disk.
  • cmux-next Swift test, Release compile and fast tier: queued for a Mac runner for over an hour.

@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

teamleaderleo added a commit that referenced this pull request Oct 21, 2026
The base merge brought +1103 more App lines from 26 commits since fee17be;
the cap is the count at the merged head, and the baseline names the largest
(#23651 +305, #23155 +285, #23527 +132, #23324 +92, #23638 +82, #23492 +57,
#23588 +53, #23109 +48).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bd2-60d2-70e1-8179-d3aa717c8828&host=cosmic-gray
teamleaderleo added a commit that referenced this pull request Oct 21, 2026
…h (app size base red) (#23540)

* cmux-next: raise the CmuxNextApp size cap to 134745, naming the growth (app size base red)

check-app-size.sh is red on every feat-cmux-next push: "CmuxNextApp is capped
at 128667 lines (now 134745, +6078)". The cap was set at 7817f10; since
then 203 first-parent commits changed the target, net +6078. None of it is
generated or dead (types checked for references across Packages/macOS); it is
feature code, +4040 of it direct pushes (Files and Find +1795) and +2038 from
PRs. The baseline comment names the largest.

Follow-ups that would pay it back (SW14): FileExplorer/ (22 files, 1647 lines)
into its own target with CmuxNextFiles.FolderWatcher instead of its own FSEvents
stream, and BrowserDownloadsPopup.swift (468) out of the App target.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bd2-60d2-70e1-8179-d3aa717c8828&host=cosmic-gray

* cmux-next: the App size cap is the count at ae0d9b7 (135848)

The base merge brought +1103 more App lines from 26 commits since fee17be;
the cap is the count at the merged head, and the baseline names the largest
(#23651 +305, #23155 +285, #23527 +132, #23324 +92, #23638 +82, #23492 +57,
#23588 +53, #23109 +48).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bd2-60d2-70e1-8179-d3aa717c8828&host=cosmic-gray

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch was previously deployed

4 inactive deployments
ci-routing-agent — 460daf25 Deployed Oct 21, 2026 by github-actions[bot]
artifacts — 460daf25 Deployed Oct 21, 2026 by teamleaderleo
sentry-dsyms — 460daf25 Deployed Oct 21, 2026 by teamleaderleo
cmux-tui-merge-tree — 460daf25 Deployed Oct 21, 2026 by teamleaderleo
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