{"record":{"id":"57aa05767c7c5aae","repo":"jdx/mise","slug":"sync-paused-resolve-all-conflict-s-before-sha","errorCode":null,"errorMessage":"sync paused: resolve all {} conflict(s) before sharing resumes","messagePattern":"sync paused: resolve all (.+?) conflict\\(s\\) before sharing resumes","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/history/sync/apply.rs","lineNumber":238,"sourceCode":"                        display_path(path),\n                        \"held: unresolved conflict\".to_string(),\n                        conflict.branch_path.clone(),\n                    ]);\n                }\n            }\n            for pending in &status.pending_applications {\n                if let Some(path) = roots.locate(&pending.branch_path).path() {\n                    table.add_row(vec![\n                        display_path(path),\n                        \"held: sharing paused for the entire setup\".to_string(),\n                        pending.branch_path.clone(),\n                    ]);\n                }\n            }\n            table.print()?;\n        }\n        if take_remote.is_empty() && keep_local.is_empty() && !req.dry_run && !req.automatic {\n            bail!(\n                \"sync paused: resolve all {} conflict(s) before sharing resumes\",\n                status.conflicts.len()\n            );\n        }\n        info!(\n            \"sync paused: {} conflict(s) remain; no files applied or published\",\n            status.conflicts.len()\n        );\n        return Ok(ApplyOutcome {\n            held: status.conflicts.len(),\n            ..Default::default()\n        });\n    }\n\n    // Only after all version-bound choices are valid may they replace Git's\n    // conflict objects in the complete tree. Use the committed ciphertext,\n    // never the decrypted comparison objects held by the resolution record.\n    if let Some(tree) = &inventory_tree {","sourceCodeStart":220,"sourceCodeEnd":256,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/system/history/sync/apply.rs#L220-L256","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"# before\nmise bootstrap dotfiles pull   # conflicts pending -> paused\n# after\nmise bootstrap dotfiles pull --take-remote ~/.zshrc\nmise bootstrap dotfiles pull","handlingStrategy":"try-catch","validationCode":"# detect pending conflicts before an interactive pull\nmise bootstrap dotfiles pull --dry-run | grep 'held: unresolved conflict' && echo 'resolve first'","typeGuard":null,"tryCatchPattern":"try {\n  await pull({});\n} catch (e) {\n  if (/sync paused: resolve all .* conflict/.test(e.message)) {\n    for (const path of await conflictedPaths()) {\n      await pull({ takeRemote: [path] }); // or keepLocal\n    }\n    await pull({});\n  } else throw e;\n}","preventionTips":["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."],"tags":["sync","conflict-resolution","blocked-operation","dotfiles"],"backgroundTag":"invalid-state-transition","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}