{"record":{"id":"2b1cbde65c706574","repo":"jdx/mise","slug":"changed-in-the-complete-repository-merge-recon","errorCode":null,"errorMessage":"{} changed in the complete repository merge; reconcile again","messagePattern":"(.+?) changed in the complete repository merge; reconcile again","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/history/sync/apply.rs","lineNumber":599,"sourceCode":"                .iter()\n                .map(|step| {\n                    Ok(crate::system::history::shadow::Overlay {\n                        path: step.pending.branch_path.clone(),\n                        object: repo.object_at(local, &step.pending.branch_path)?,\n                    })\n                })\n                .collect::<Result<Vec<_>>>()?;\n            if repo.compose(&repo.output_tree_of(current)?, &restore_planned)?\n                != repo.output_tree_of(local)?\n            {\n                bail!(\"local files were saved after enrollment planning; retry pull\");\n            }\n            // Do not let a divergent text merge or a stale resolution differ\n            // from the complete tree that will be adopted.\n            for step in &ready {\n                if repo.restored_object_at(tree, &step.pending.branch_path)? != step.pending.object\n                {\n                    bail!(\n                        \"{} changed in the complete repository merge; reconcile again\",\n                        display_path(&step.path)\n                    );\n                }\n            }\n            let candidate = heads\n                .candidate(repo, tree)?\n                .ok_or_else(|| eyre::eyre!(\"setup branch disappeared\"))?;\n            audit_incoming_history(repo, &candidate.commit)?;\n        }\n        // Validate the complete batch again after acquiring the operation\n        // lock, before the first write.\n        for directory in &directories {\n            directory.validate()?;\n        }\n        for step in &ready {\n            if live_object(repo, &step.path)? != step.before\n                || live_permissions(&step.path)? != step.before_mode","sourceCodeStart":581,"sourceCodeEnd":617,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/system/history/sync/apply.rs#L581-L617","documentation":"Before adopting a complete repository merge, mise cross-checks each planned restore step's expected object against the merged tree. If a step's restored object in the composed tree no longer equals the pending object (e.g. a divergent text merge produced different content, or a previously recorded resolution is stale), the pull aborts naming the changed path.","triggerScenarios":"During `mise dot pull` with an inventory tree present: for any ready step, `repo.restored_object_at(tree, branch_path) != step.pending.object` — a text merge or stale resolution changed the path's content in the full merge.","commonSituations":"Both sides edited the same file and the three-way merge yielded different content than recorded; an old conflict resolution no longer matches the new upstream tree.","solutions":["Re-run `mise dot pull` to reconcile against the fresh merge.","Inspect the changed path and resolve the merge explicitly (`mise dot status`, --take-remote/--keep-local).","If resolutions are stale, re-save the local side (`mise dot save <path>`) and pull again."],"exampleFix":"before: mise dot pull (~/.gitconfig changed in the complete repository merge) | after: mise dot pull --take-remote ~/.gitconfig, or resolve explicitly then retry","handlingStrategy":"retry","validationCode":"mise dot status  # verify resolutions are current after upstream changes","typeGuard":null,"tryCatchPattern":"mise dot pull || mise dot pull  # re-reconcile once when the merge changed mid-plan","preventionTips":["Re-save local resolutions after upstream updates (`mise dot save <path>`).","Expect merges of divergent edits to require a second reconciling pull.","Keep conflict resolutions fresh; stale resolutions trigger this mismatch."],"tags":["sync","merge","race-condition","dotfiles"],"backgroundTag":"checksum-mismatch","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}