Skip to content

link: cmux link seed pull brings a seeded Cloud folder's changes back as a diff - #30923

Merged
teamleaderleo merged 5 commits into
feat-cmux-nextfrom
seed-pull
Nov 1, 2026
Merged

teamleaderleo merged 5 commits into
feat-cmux-nextfrom
seed-pull

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator

Leo's words:

Your project folder is copied up.
we'll want to deal with the edge cases for this too

This is piece 6 of the Cloud project seed, rule 6 of "Getting the project onto the machine" in the Cloud design spec: the folder's changes come back to the Mac as a diff, not as a copy of the folder. It is the Mac side of git.seed.export (#30633, merged) and reads its base from the seed record that cmux link seed push keeps (#30634, merged).

What it does

cmux link seed pull --socket PATH LOCAL REMOTE [--base-head SHA --base-index SHA --base-work SHA]

  1. Base. Read from this Mac's seed record for LOCAL and REMOTE. The three --base-* flags, given all together or not at all, override it. It answers seed.no_previous in these cases:
    • there is no record;
    • the record is for another machine;
    • the last push was a copy, which cmux link sync pull brings back instead;
    • the record is incomplete.
  2. Export. Ask the machine for git.seed.export since that base, wait for the job, and download the bundle over fs-v1. The machine must serve both fs-v1 and git-seed-export-v1; otherwise the answer is machine_outdated.
  3. Fetch. Fetch the bundle into a quarantine repo. It borrows this repo's objects, checks every object with transfer.fsckObjects, and checks that the bundle builds on the base.
  4. Merge three ways against the base:
    • The branch fast-forwards only when this Mac's HEAD is still the seed's. A switched branch, rewritten history, or both sides moving is a .git/HEAD conflict.
    • The machine's staged tree is staged here only when this Mac's staged tree is unchanged.
    • Each working-tree file takes whichever side changed. If both sides changed it differently, it is a conflict.
  5. On conflict nothing changes. The answer is {"ok":false,"error_code":"sync_conflict","conflicts":[...]}.
  6. Otherwise apply. Files move through place.rs's transaction. The branch then moves by compare-and-swap and the index follows. Any failure puts back what changed.
  7. Never brought back: a .git path, a hook (including core.hooksPath), a nested repo, a symlink or submodule the machine changed, an ignored file, or an untracked secret.
  8. The answer's base is saved as the new record, so the next pull and the next cmux link seed push --since-last build on it. A machine with no changes answers unchanged and nothing is downloaded.

The answer is {ok, unchanged, written, deleted, bytes, bundle_bytes, fast_forwarded, staged, head, base{head,index,work}, left_out}.

Layout

  • The CLI lives in link/seed_cli/pull.rs, next to push and clone, and handles the record.
  • The engine lives in link/sync_cli/seed_pull.rs, because it uses the sync internals: Remote, git_back's quarantine, and place.
  • link/seed/plan.rs gains current(), shared by the seed and the pull, and leaves out a secret by its raw (non-UTF-8) name.

Size

About 1,400 lines, of which about 360 are the journey test. The engine is one state machine (export, receive, the three-way plan, the transaction) with its tests. Splitting it would land a part that can't be run on its own.

Tests

  • tests/seed_pull_journey.rs runs real Mac and VM daemons on Linux, with the VM cloning from file:// through the CMUX_TEST_GIT_SEED_GITHUB seam:
    • It seeds with cmux link seed push, then pulls from the record. Covered: commits, edits, adds, deletes and staged changes come back; ignored files and secrets stay on the VM; a second pull is unchanged; the next push --since-last builds on the pulled base.
    • Both sides edit different files and both edits are kept. A same-file conflict changes nothing, and a rewritten VM history is a .git/HEAD conflict.
    • Hooks, a hook-folder file and a nested repo never come back.
  • Unit tests cover parsing, picking the base from the record, and the plan's non-UTF-8 secret.
  • On cmux-ci: link::seed 24 passed, seed_pull_journey 3 passed, link_seed 6 passed, cargo fmt clean. Clippy flags only files already flagged on base (start_chat_cli.rs, environments.rs).

Risk: new CLI only. Nothing calls seed pull yet, and the push side is unchanged.

Agent session: agent session

🤖 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

Adds cmux link seed pull, the Mac side of the Cloud project seed: after a push copies a folder to the machine, pull brings its changes back as a diff merged against the seed, never as a folder copy. Nothing calls it yet and the push side is unchanged.

New Features

  • Merges three ways against the seed's HEAD, INDEX, and WORK: the branch fast-forwards only while this Mac's HEAD is still the seed's, the machine's staged tree stages here when this Mac's staged tree is unchanged, and each working-tree file keeps whichever side changed; conflicts change nothing and answer sync_conflict.
  • The base comes from this Mac's seed record, overridable by the three --base-* flags given all together, and every pull keeps the machine's state as the next pull's and push --since-last's base.
  • Hooks, nested repositories, symlinks or submodules the machine changed, ignored files, and untracked secrets never come back.

Bug Fixes

  • A file saved during a pull (or one git assumes unchanged) is now a conflict, not an overwrite: the transaction checks bytes against the planned blob, and the index is replaced under git's own index.lock.
  • Seed plans now leave untracked secrets out by their raw name, so a secret whose name is not UTF-8 no longer reaches the machine.

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

View guided diff Turn on auto-fix

teamleaderleo and others added 4 commits November 1, 2026 04:35
…diff

Piece 6, Mac side, of the Cloud project seed (design/cloud.md, rule 6).
Calls git.seed.export, streams the bundle down over fs-v1, fetches it into
the git_back quarantine (alternates, fsckObjects), then merges three ways
against the seed: HEAD fast-forward of the same branch only, the machine's
index when ours is unchanged, the working tree per file between the seed's
WORK, the machine's WORK and this Mac's. Conflicts change nothing and
answer sync_conflict; otherwise files move through place.rs's transaction
and the branch and index move last by compare-and-swap. The answer's base
is the next pull's and delta push's base. Base shas come as flags until
piece 4's record lands.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-3bab30503f0b9a7059e5
The same review finding as the machine's export, on the way up: an
untracked secret whose name is not UTF-8 was removed from WORK by a lossy
spelling that matched nothing, so its contents went to the machine.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-3bab30503f0b9a7059e5
…as overrides; under seed_cli beside push

The pull's CLI moves to link/seed_cli/pull.rs (beside push and clone); its
engine stays in sync_cli/seed_pull.rs. The base comes from piece 4's record
of the folder unless all three --base-* flags are given, and every pull
keeps the machine's HEAD, INDEX and WORK as the new record, so the next pull
and the next push --since-last build on it. The journey seeds with cmux link
seed push and uses base's CMUX_TEST_GIT_SEED_GITHUB seam.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-3bab30503f0b9a7059e5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-3bab30503f0b9a7059e5
@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 9139a54: 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=pr30923 -f ref=seed-pull -f platform=macos -f backend_mode=local

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

Shipped in:

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · session

@github-actions github-actions Bot added the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 1, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, router-review): BLOCK at 9139a54

BLOCK at 9139a54

Visual verdict: no images; Leo tries the build

  1. [P1] [blocking] Local edits can be overwritten without a conflict. seed_pull.rs:286 discards the planned blob identity and computes Expected from a later disk read. An editor save after current() becomes the content the transaction permits replacing or deleting; successful cleanup destroys that edit. An assume-unchanged file reproduces the mismatch without concurrency. Validate the disk contents against the snapshot used for merging before authorizing replacement.

  2. [P1] [blocking] The index guard can approve overwriting newly staged work. seed_pull.rs:194 captures here_git separately, after current() captured the index used for merge decisions. If someone stages changes between those reads, the decision uses the old index while move_git validates the newer one, then replaces it with the machine’s tree. Staged-only content disappears. Use one coherent snapshot and protect index validation through replacement.

  3. [P2] [follow-up] Directory-to-file replacements always fail. seed_pull.rs:309 sorts deletions first, but Transaction::delete leaves directories until finish(). Replacing d/c with file d therefore encounters the remaining directory and rolls back. Empty-directory removal needs to participate in the transaction before writes.

Isolated Git probes confirmed the snapshot mismatches behind findings 1–2. Rust tests could not run because Cargo and rustc are unavailable.

Follow-ups:

  • Finding 3: support directory-to-file replacements transactionally.

@teamleaderleo teamleaderleo removed the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 1, 2026

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

5 issues found across 10 files

You’re at about 94% of the monthly reviewed-line limit. You may want to disable incremental reviews to conserve quota. Reviews will continue until that limit is exceeded. If you need help avoiding interruptions, please contact contact@cubic.dev.

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="cmux-tui/crates/cmux-tui/src/link/seed_cli.rs">

<violation number="1" location="cmux-tui/crates/cmux-tui/src/link/seed_cli.rs:251">
P3: This new pull route accepts `//` or `///` as a remote path but normalizes them to an empty string. Reject an empty normalized path so malformed input gets the documented bad-usage response instead of entering the pull flow.</violation>
</file>

<file name="cmux-tui/crates/cmux-tui/tests/seed_pull_journey.rs">

<violation number="1" location="cmux-tui/crates/cmux-tui/tests/seed_pull_journey.rs:107">
P2: This seed-plan subprocess inherits the developer's real HOME and global Git configuration, so URL rewrites and other user settings can change the test result. Run it through the machine's isolated command environment and disable global/system Git configuration, as the other Git test setup does.</violation>
</file>

<file name="cmux-tui/crates/cmux-tui/src/link/sync_cli/seed_pull.rs">

<violation number="1" location="cmux-tui/crates/cmux-tui/src/link/sync_cli/seed_pull.rs:318">
P2: A local type change during the pull can make `Transaction::delete` do nothing, but this call still counts the deletion and advances the base. Treat a non-regular or missing target that no longer matches the planned file as `Changed` so the pull reports a conflict instead of silently losing the remote deletion.</violation>

<violation number="2" location="cmux-tui/crates/cmux-tui/src/link/sync_cli/seed_pull.rs:606">
P1: The staging failure path ignores branch-rollback errors. If that rollback fails, `seed_pull` restores files but returns with the branch moved; propagate and surface the rollback failure instead of discarding it.</violation>
</file>

<file name="cmux-tui/crates/cmux-tui/src/link/seed/plan.rs">

<violation number="1" location="cmux-tui/crates/cmux-tui/src/link/seed/plan.rs:442">
P2: `current` unnecessarily requires the local repository to retain a GitHub remote, so a seeded folder whose remote was removed or changed cannot be pulled back. Build the current HEAD/index/work commits through a local-only repository opener instead of `Repo::open`.</violation>
</file>

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

&& let Err(error) = checked(local(folder).arg("read-tree").arg(tree))
{
if let Some(head) = head {
let _ = move_ref(&old, head);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1: The staging failure path ignores branch-rollback errors. If that rollback fails, seed_pull restores files but returns with the branch moved; propagate and surface the rollback failure instead of discarding it.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At cmux-tui/crates/cmux-tui/src/link/sync_cli/seed_pull.rs, line 606:

<comment>The staging failure path ignores branch-rollback errors. If that rollback fails, `seed_pull` restores files but returns with the branch moved; propagate and surface the rollback failure instead of discarding it.</comment>

<file context>
@@ -0,0 +1,695 @@
+        && let Err(error) = checked(local(folder).arg("read-tree").arg(tree))
+    {
+        if let Some(head) = head {
+            let _ = move_ref(&old, head);
+        }
+        return Err(error.context("cannot stage the machine's changes"));
</file context>

fn seed(&self, repo: &Path, name: &str) -> Base {
let bundle = self.root.join(format!("{name}.bundle"));
let (ok, plan) = run_json(
Command::new(bin())

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: This seed-plan subprocess inherits the developer's real HOME and global Git configuration, so URL rewrites and other user settings can change the test result. Run it through the machine's isolated command environment and disable global/system Git configuration, as the other Git test setup does.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At cmux-tui/crates/cmux-tui/tests/seed_pull_journey.rs, line 107:

<comment>This seed-plan subprocess inherits the developer's real HOME and global Git configuration, so URL rewrites and other user settings can change the test result. Run it through the machine's isolated command environment and disable global/system Git configuration, as the other Git test setup does.</comment>

<file context>
@@ -0,0 +1,361 @@
+    fn seed(&self, repo: &Path, name: &str) -> Base {
+        let bundle = self.root.join(format!("{name}.bundle"));
+        let (ok, plan) = run_json(
+            Command::new(bin())
+                .args(["link", "seed", "plan", "--local"])
+                .arg(repo)
</file context>

transaction.write(relative, staged, expected.as_ref()).map(|()| written += 1)
}
Step::Delete { relative, expected } => {
transaction.delete(relative, expected).map(|()| deleted += 1)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: A local type change during the pull can make Transaction::delete do nothing, but this call still counts the deletion and advances the base. Treat a non-regular or missing target that no longer matches the planned file as Changed so the pull reports a conflict instead of silently losing the remote deletion.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At cmux-tui/crates/cmux-tui/src/link/sync_cli/seed_pull.rs, line 318:

<comment>A local type change during the pull can make `Transaction::delete` do nothing, but this call still counts the deletion and advances the base. Treat a non-regular or missing target that no longer matches the planned file as `Changed` so the pull reports a conflict instead of silently losing the remote deletion.</comment>

<file context>
@@ -0,0 +1,695 @@
+                transaction.write(relative, staged, expected.as_ref()).map(|()| written += 1)
+            }
+            Step::Delete { relative, expected } => {
+                transaction.delete(relative, expected).map(|()| deleted += 1)
+            }
+        };
</file context>

}

pub(crate) fn current(folder: &Path) -> Result<Current, Fallback> {
let repo = Repo::open(folder)?;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: current unnecessarily requires the local repository to retain a GitHub remote, so a seeded folder whose remote was removed or changed cannot be pulled back. Build the current HEAD/index/work commits through a local-only repository opener instead of Repo::open.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At cmux-tui/crates/cmux-tui/src/link/seed/plan.rs, line 442:

<comment>`current` unnecessarily requires the local repository to retain a GitHub remote, so a seeded folder whose remote was removed or changed cannot be pulled back. Build the current HEAD/index/work commits through a local-only repository opener instead of `Repo::open`.</comment>

<file context>
@@ -421,6 +426,33 @@ const SEED_NAME: &str = "cmux seed";
+}
+
+pub(crate) fn current(folder: &Path) -> Result<Current, Fallback> {
+    let repo = Repo::open(folder)?;
+    let scratch = Scratch::new()?;
+    let made = commits(&repo, &scratch)?;
</file context>

("pull", [local, remote]) if plain && !since_last => Some(Command::Pull {
socket: socket?,
local: PathBuf::from(local),
remote: absolute(remote)?,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P3: This new pull route accepts // or /// as a remote path but normalizes them to an empty string. Reject an empty normalized path so malformed input gets the documented bad-usage response instead of entering the pull flow.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At cmux-tui/crates/cmux-tui/src/link/seed_cli.rs, line 251:

<comment>This new pull route accepts `//` or `///` as a remote path but normalizes them to an empty string. Reject an empty normalized path so malformed input gets the documented bad-usage response instead of entering the pull flow.</comment>

<file context>
@@ -220,8 +234,25 @@ fn parse(args: &[String]) -> Option<Command> {
+        ("pull", [local, remote]) if plain && !since_last => Some(Command::Pull {
+            socket: socket?,
+            local: PathBuf::from(local),
+            remote: absolute(remote)?,
+            base,
+        }),
</file context>

@github-actions github-actions Bot added the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 1, 2026
…om; hold the index from its check to its replacement

Review (gpt-6-astra) at 9139a54: a file saved after the snapshot (or one
git assumes unchanged) could be overwritten, since what the transaction
expected was read later from disk; and the staged changes were read apart
from the snapshot and could be replaced after a newer git add.

Now the bytes the transaction expects are the bytes checked against the
planned blob (git hash-object --path, through the path's filters), the
branch and index are read on both sides of the snapshot, and the index is
replaced under git's own index.lock from its check on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-3bab30503f0b9a7059e5
@blacksmith-sh

blacksmith-sh Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Found 6 test failures on Blacksmith runners:

Failures

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

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

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

1 issue found across 2 files (changes from recent commits).

You’re at about 94% of the monthly reviewed-line limit. You may want to disable incremental reviews to conserve quota. Reviews will continue until that limit is exceeded. If you need help avoiding interruptions, please contact contact@cubic.dev.

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="cmux-tui/crates/cmux-tui/src/link/sync_cli/seed_pull.rs">

<violation number="1" location="cmux-tui/crates/cmux-tui/src/link/sync_cli/seed_pull.rs:198">
P2: This digest comparison is not an atomic snapshot of `plan::current`. If the index changes away and back while `current` runs, a machine index matching the transient snapshot is treated as already applied; the pull succeeds, records that index as the new base, and never installs it locally. Hold the index snapshot stable across the merge decision, or use a snapshot mechanism that cannot pass this ABA change.</violation>
</file>

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

let here_git = git_back::base_of(&folder)?;
let here = super::super::seed::plan::current(&folder)
.map_err(|fallback| anyhow::anyhow!("cannot read this folder: {}", fallback.why))?;
if git_back::base_of(&folder)? != here_git {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: This digest comparison is not an atomic snapshot of plan::current. If the index changes away and back while current runs, a machine index matching the transient snapshot is treated as already applied; the pull succeeds, records that index as the new base, and never installs it locally. Hold the index snapshot stable across the merge decision, or use a snapshot mechanism that cannot pass this ABA change.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At cmux-tui/crates/cmux-tui/src/link/sync_cli/seed_pull.rs, line 198:

<comment>This digest comparison is not an atomic snapshot of `plan::current`. If the index changes away and back while `current` runs, a machine index matching the transient snapshot is treated as already applied; the pull succeeds, records that index as the new base, and never installs it locally. Hold the index snapshot stable across the merge decision, or use a snapshot mechanism that cannot pass this ABA change.</comment>

<file context>
@@ -189,9 +189,17 @@ pub(crate) fn seed_pull(
     let here = super::super::seed::plan::current(&folder)
         .map_err(|fallback| anyhow::anyhow!("cannot read this folder: {}", fallback.why))?;
-    let here_git = git_back::base_of(&folder)?;
+    if git_back::base_of(&folder)? != here_git {
+        bail!(
+            "this Mac's branch or staged changes changed during the pull; nothing was brought back"
</file context>

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex, router-review): SHIP at ee086f4

Reviewer: codex gpt-6-astra high, fast tier.

Follow-ups: 1. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward.

SHIP at ee086f4

Visual verdict: no images; Leo tries the build.

  1. [P1][follow-up] A conflict cannot be retried after an earlier successful pull. seed_pull invokes export before planning the merge (seed_pull.rs:174); the export overwrites the machine’s only refs/cmux-back/* record. If the pull then returns sync_conflict, the Mac keeps its older base, but a retry with that base is rejected as seed.since_mismatch because the old base is no longer in refs/cmux-back and was never recorded in refs/cmux-seed. Preserve historical bases or make export recording transactional with a successful merge.

@teamleaderleo teamleaderleo removed the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 1, 2026
@teamleaderleo
teamleaderleo merged commit b91b9c7 into feat-cmux-next Nov 1, 2026
225 of 233 checks passed
@teamleaderleo
teamleaderleo deleted the seed-pull branch November 1, 2026 14:18
@github-actions github-actions Bot added the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 1, 2026
@lawrencecchen

Copy link
Copy Markdown
Contributor

This PR added clippy::indexing_slicing hits to cmux-tui production code, and with the other culprit (#30921 / #30923) they took the panic ratchet on feat-cmux-next red (cmux-tui: clippy::indexing_slicing 855 > baseline 831). The fix is in #31097: each new index read now uses a checked form (Value::get, JsonSet::set, buffer.get(..read)), with no behavior change and no baseline raise.

lawrencecchen added a commit that referenced this pull request Nov 1, 2026
…d forms (#31097)

#30921 (af670df, cmux mcp video_frames/video_info) and #30923
(b91b9c7, cmux link seed pull) added clippy::indexing_slicing hits in
cmux-tui production code, a deny lint of the panic ratchet: cmux-tui went
from 831 to 855. Each read now uses a checked form; valid input behaves the
same, and a missing or non-object field reads as it did through serde_json's
Index (null):

- video_tools: the app's answer and error fields through Value::get; the
  params writes through cmux_json::JsonSet::set (the params are always an
  object, as before).
- seed_pull export: the job and status fields through Value::get; the
  bundle copy's chunk through buffer.get(..read), an error if a read ever
  claims more than its buffer.
- seed_cli pull keep: summary.base.{head,index,work} through Value::get.

No allow attributes, no baseline change.

Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>
cmux-bot Bot pushed a commit that referenced this pull request Nov 4, 2026
… APFS (macOS base red) (#35889)

a_secret_with_a_non_utf8_name_is_left_out (#30923) and a_secret_with_a_non_utf8_name_never_goes
(#30633) create a file named b".env-\xff". APFS refuses a name that is not UTF-8 (EILSEQ,
'Illegal byte sequence'), so both panicked at setup on every macOS run since they landed; no
folder on macOS can hold such a secret, so the product path they check cannot meet one there.
They now accept EILSEQ on macOS only, as git_seed/secrets.rs does since #32091; on Linux
(ext4 takes raw bytes) the assertions run unchanged.

This branch was previously deployed

3 inactive deployments
artifacts — ee086f44 Deployed Nov 1, 2026 by teamleaderleo via add the Windows daemon to the tree #96267
sentry-dsyms — ee086f44 Deployed Nov 1, 2026 by teamleaderleo via upload cmux-tui dSYMs to Sentry #96267
ci-routing-agent — ee086f44 Deployed Nov 1, 2026 by teamleaderleo via cmux-tui tree preflight #96267
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants