jdx/mise · error

changed during setup adoption; retry pull

Error message

{} changed during setup adoption; retry pull

What it means

After writing the whole batch during setup adoption, mise verifies every written file once more against the adopted tree before advancing Git state. If any file's object or permissions no longer match what the setup adoption wrote, a concurrent edit landed during the write window; the command aborts rather than recording an apparently-applied setup built on a file that immediately changed.

Solutions

  1. Re-run `mise dot pull` (retry) so adoption is re-verified against the current files.
  2. Identify what rewrote the path and stop it before retrying (temporarily disable reloaders/autosave).
  3. If the new content should win, `mise dot save <path>` then pull again.

Example fix

before: mise dot pull (~/.profile changed during setup adoption) | after: stop the process rewriting ~/.profile, then mise dot pull
Defensive patterns

Strategy: retry

Validate before calling

pgrep -af 'reload|autorandr|theme'  # quiesce anything that may rewrite tracked files before adoption

Try / catch

mise dot pull || mise dot pull  # retry adoption once concurrent writers are stopped

Prevention

When it happens

Trigger: Post-write verification loop in first-time setup adoption (`mise dot pull` enrollment path): `live_object(repo, path) != step.pending.object` or `live_permissions(path) != step.desired_mode` after all writes completed.

Common situations: A daemon (shell config reloader, package manager, or editor session) rewrote a just-restored dotfile during adoption; the user edited files exactly while the initial pull wrote them.

Understand the failure class

Background: Checksum mismatch errors: "checksum verification failed", "digest mismatch", "expected vs actual checksum" — what they mean and how to fix them — this error's family across 41 libraries.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/2ef80807aee756b1. Report an issue: GitHub.

Appendix: source

Thrown at src/system/history/sync/apply.rs:665

                    replay::write_path_with_mode(repo, &step.path, mode, oid, step.desired_mode)?
                }
                None => replay::remove(&step.path)?,
            }
            journal::commit_changes(pending);
            let mut next = step.pending.next.clone();
            let oid = step.pending.object.clone();
            next.applied = oid.clone();
            next.acknowledged = oid;
            sync_state.insert(step.pending.branch_path.clone(), next);
        }
        if fresh_adoption || inventory_tree.is_some() {
            // Verify the whole written batch again before advancing Git. A
            // concurrent edit must not become an apparently applied setup.
            for step in &ready {
                if live_object(repo, &step.path)? != step.pending.object
                    || live_permissions(&step.path)? != step.desired_mode
                {
                    bail!(
                        "{} changed during setup adoption; retry pull",
                        display_path(&step.path)
                    );
                }
            }
            for directory in &directories {
                directory.verify_written()?;
            }
            let heads = super::graph::Heads::read(repo)?;
            if heads.local != application_head || heads.remote != status.upstream_commit {
                bail!("setup history changed during adoption; retry pull");
            }
            let remote = heads.remote.as_deref().unwrap();
            audit_incoming_history(repo, remote)?;
            let tree = inventory_tree
                .clone()
                .unwrap_or(repo.output_tree_of(remote)?);
            let candidate = heads

View on GitHub (pinned to 533346cc37)