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

  1. Resolve each conflict explicitly: re-run pull with --take-remote <path> or --keep-local <path> for every conflicted file.
  2. Preview with --dry-run to see the full list of held conflicts before deciding.
  3. 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

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


AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09). Data as JSON: /api/errors/57aa05767c7c5aae. Report an issue: GitHub.