jdx/mise · error
sync paused: resolve all {} conflict(s) before sharing resum
Error message
sync paused: resolve all {} conflict(s) before sharing resumes What it means
When unresolved conflicts exist, the sync apply step pauses: no incoming files are written and nothing is published. In an interactive, non-dry-run run without any resolution flags, mise throws this error stating how many conflicts must be resolved before sharing resumes. The automatic (background watcher) mode instead just counts held paths and returns without failing.
Source
Thrown at src/system/history/sync/apply.rs:238
display_path(path),
"held: unresolved conflict".to_string(),
conflict.branch_path.clone(),
]);
}
}
for pending in &status.pending_applications {
if let Some(path) = roots.locate(&pending.branch_path).path() {
table.add_row(vec![
display_path(path),
"held: sharing paused for the entire setup".to_string(),
pending.branch_path.clone(),
]);
}
}
table.print()?;
}
if take_remote.is_empty() && keep_local.is_empty() && !req.dry_run && !req.automatic {
bail!(
"sync paused: resolve all {} conflict(s) before sharing resumes",
status.conflicts.len()
);
}
info!(
"sync paused: {} conflict(s) remain; no files applied or published",
status.conflicts.len()
);
return Ok(ApplyOutcome {
held: status.conflicts.len(),
..Default::default()
});
}
// Only after all version-bound choices are valid may they replace Git's
// conflict objects in the complete tree. Use the committed ciphertext,
// never the decrypted comparison objects held by the resolution record.
if let Some(tree) = &inventory_tree {View on GitHub (pinned to afd2eddd3a)
Solutions
- Resolve each conflict explicitly: re-run pull with --take-remote <path> or --keep-local <path> for every conflicted file.
- Preview with --dry-run to see the full list of held conflicts before deciding.
- For scripted environments, use the automatic/watcher mode or pre-seed resolutions so pull is never invoked interactively with pending conflicts.
Example fix
# before mise bootstrap dotfiles pull # conflicts pending -> paused # after mise bootstrap dotfiles pull --take-remote ~/.zshrc mise bootstrap dotfiles pull
Defensive patterns
Strategy: try-catch
Validate before calling
# detect pending conflicts before an interactive pull mise bootstrap dotfiles pull --dry-run | grep 'held: unresolved conflict' && echo 'resolve first'
Try / catch
try {
await pull({});
} catch (e) {
if (/sync paused: resolve all .* conflict/.test(e.message)) {
for (const path of await conflictedPaths()) {
await pull({ takeRemote: [path] }); // or keepLocal
}
await pull({});
} else throw e;
} Prevention
- Resolve conflicts promptly instead of running plain interactive pulls while conflicts are pending.
- Use the automatic/watcher mode in scripts so holds are tolerated rather than fatal.
- Schedule a periodic --dry-run to catch lingering conflicts early.
When it happens
Trigger: Running `mise bootstrap dotfiles pull` (interactive, no --dry-run, not the watcher) while status.conflicts is non-empty and both take_remote and keep_local are empty.
Common situations: Two machines edited the same dotfile and a pull surfaced conflicts; a user habitually runs plain pull and hits the pause every time; CI/cron running interactive pull without resolution flags; stale conflicts from an earlier interrupted pull.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
- nothing can be applied until the held paths are decided
- save {} before choosing --keep-local
- repository application paused: reconcile repository conflict
- cannot synchronize: {reason}
- partial pulls are not supported: apply the complete setup wi
AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09).
Data as JSON: /api/errors/57aa05767c7c5aae.
Report an issue: GitHub.