jdx/mise · error

local files were saved after enrollment planning; retry pull

Error message

local files were saved after enrollment planning; retry pull

What it means

During a setup-adoption pull (enrollment into sharing), mise verifies that the live local tree is exactly the tree that was planned at enrollment time. If composing the planned restore onto the current output tree differs from the actual local tree, files were modified after enrollment planning, so the pull refuses rather than adopting a tree built from stale assumptions.

Solutions

  1. Re-run `mise dot pull` to regenerate enrollment planning against the current files (as the message says, retry).
  2. If retries keep failing, re-run the enrollment/setup step so planning matches the live tree.
  3. Avoid editing tracked files between enrollment and the first successful pull.

Example fix

before: edit ~/.bashrc after enrollment planning, then mise dot pull (fails) | after: run mise dot pull so the plan is regenerated against current files
Defensive patterns

Strategy: retry

Validate before calling

mise dot status  # ensure no edits land between enrollment and the first pull

Try / catch

mise dot pull || mise dot pull  # bounded retry when the enrollment race is transient

Prevention

When it happens

Trigger: First `mise dot pull` after enrollment (restore steps pending) where any tracked file's content or mode changed between enrollment planning and the pull — detected by `repo.compose(output_tree_of(current), restore_planned) != output_tree_of(local)`.

Common situations: Editing dotfiles after enrollment but before the first pull; a package manager rewrote a tracked config in between; another tool touched enrolled files.

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/bb346950a4d2a806. Report an issue: GitHub.

Appendix: source

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

                .as_deref()
                .ok_or_else(|| eyre::eyre!("local history disappeared"))?;
            // The operation's own protective commit may save the unsaved
            // versions that an explicit --take-remote decision will replace.
            // Permit only changes at those preflighted paths; any other saved
            // change requires a fresh complete plan.
            let restore_planned = ready
                .iter()
                .map(|step| {
                    Ok(crate::system::history::shadow::Overlay {
                        path: step.pending.branch_path.clone(),
                        object: repo.object_at(local, &step.pending.branch_path)?,
                    })
                })
                .collect::<Result<Vec<_>>>()?;
            if repo.compose(&repo.output_tree_of(current)?, &restore_planned)?
                != repo.output_tree_of(local)?
            {
                bail!("local files were saved after enrollment planning; retry pull");
            }
            // Do not let a divergent text merge or a stale resolution differ
            // from the complete tree that will be adopted.
            for step in &ready {
                if repo.restored_object_at(tree, &step.pending.branch_path)? != step.pending.object
                {
                    bail!(
                        "{} changed in the complete repository merge; reconcile again",
                        display_path(&step.path)
                    );
                }
            }
            let candidate = heads
                .candidate(repo, tree)?
                .ok_or_else(|| eyre::eyre!("setup branch disappeared"))?;
            audit_incoming_history(repo, &candidate.commit)?;
        }
        // Validate the complete batch again after acquiring the operation

View on GitHub (pinned to 533346cc37)