cmux-tui: the owner's Native dial carries a Cloud chat's folder copy; outdated only when older

Merged
TE
2d ago
+198-32

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 lists fs-v1 (symlink, deflate, no-follow), git-seed-v1, git-seed-export-v1 and blob-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_kind owner) may send a file, seed, blob or cloud.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's build_time is older than this client's, as machine update --if-older orders them. Otherwise machine_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
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 older flag to the outdated check, comparing build_time against this client's like machine update --if-older does.
  • Adds machine_capability_missing for 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.