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
- Re-run `mise dot pull` (retry) so adoption is re-verified against the current files.
- Identify what rewrote the path and stop it before retrying (temporarily disable reloaders/autosave).
- 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
- Quiesce daemons/agents that touch dotfiles during initial enrollment pulls.
- Complete setup adoption in a quiet session with no open editors on tracked paths.
- If the interim edit should win, `mise dot save <path>` before retrying.
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
- local files were saved after enrollment planning; retry pull
- changed before application; nothing was written
- changed in the complete repository merge; reconcile again
- changed while the changes were being applied; nothing more…
- cannot synchronize
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 = headsView on GitHub (pinned to 533346cc37)