cmux-tui: the owner's Native dial carries a Cloud chat's folder copy; outdated only when older
Leo's first Cloud chat on NIGHTLY 036f8aa5 failed at "Clone repository" with "cloud-chats-3 runs an older cmux that can't take this chat yet. Update the machine to move it." (Leo: "4+ situations end to end", "where's all our ergo").
Cause (read on the machine): cloud-chats-3 runs b24aac2c, the app's own bundled cmux-tui. Since cmux-platform#824 the app's Cloud link is a signed Native owner dial, and identify on that carrier lists only the agent carrier's 36 capabilities (native_owner.rs CAPABILITIES), so cmux link start-chat copy read fs-v1 as missing and answered machine_outdated. The app's automatic update then found nothing older (not_older) and the copy failed again. The entry also refused the fs.* frames themselves on that dial.
Fix:
native_owner: identify on the owner's carrier also listsfs-v1(symlink, deflate, no-follow),git-seed-v1,git-seed-export-v1andblob-fetch-v2, while the host serves them (the carrier filters identify's own advertised set).fs_wire/remote_entry: on a Native dial only the owner's (vm_kindowner) may send a file, seed, blob orcloud.repo.*frame, as a line and as a byte-stream dial (native_dial_admits). A team or unverified Native dial is refused them (remote_denied). Classic dials keep the entry gate's answer as before.link/machine_gate:machine_outdated("update the machine") only when the machine'sbuild_timeis older than this client's, asmachine update --if-olderorders them. Otherwisemachine_capability_missing, whose message names the capability. Used by sync, seed push/pull, access and agent move.
Tests: native_data_frames_reach_only_the_owner (owner admitted; team and unverified Native dials refused every data frame; classic dials unchanged; the carrier lists the capabilities), only_an_older_machine_is_outdated.
Scope decision (coordinator, for Leo's ask): the owner principal only, never shared or team guests.
Agent session: agent session
🤖 Generated with Claude Code
![Autofix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark-3x.png)
Open in [code]smith · Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Fixes Cloud chat folder copies failing on the app's own build, and makes "update the machine" errors only apply to actually older machines.
Previously, cmux link start-chat copy on a Native owner dial read fs-v1 as missing because the owner's carrier identify didn't list file capabilities, so it answered machine_outdated even when the machine was current. Now the owner's carrier lists file, seed, and blob capabilities, and only the owner's Native dial may send those frames. Separately, machine_outdated is now only reported when the machine's build is older than the client's; otherwise the error is machine_capability_missing and names the capability.
- Adds an
olderflag to the outdated check, comparingbuild_timeagainst this client's likemachine update --if-olderdoes. - Adds
machine_capability_missingfor current machines that still lack a capability. - Updates sync, seed push/pull, access, and agent move paths to use the new distinction.
- Adds tests for owner-only native data frames and the older-machine rule.