{"record":{"id":"87a9bd08388944ad","repo":"jdx/mise","slug":"interrupted-file-recovery-needs-attention-tempora","errorCode":null,"errorMessage":"interrupted file recovery needs attention; temporary recovery data was retained. {}. Run `mise bootstrap dotfiles recover` to retry, or inspect the files and use `recover <operation> --keep-current` to explicitly accept their current contents","messagePattern":"interrupted file recovery needs attention; temporary recovery data was retained\\. (.+?)\\. Run `mise bootstrap dotfiles recover` to retry, or inspect the files and use `recover <operation> --keep-current` to explicitly accept their current contents","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/history/recovery.rs","lineNumber":56,"sourceCode":"            continue;\n        }\n        let after = journal.iter().rev().find_map(|entry| match entry {\n            JournalEntry::Committed {\n                seq: recorded,\n                after,\n            } if *recorded as usize == seq => Some(after),\n            _ => None,\n        });\n        if unfinished_only && after.is_some() {\n            continue;\n        }\n        if let Err(error) = recover_path(state_dir, path, prior, after) {\n            blocked.push(path);\n            failures.push(format!(\"{}: {error:#}\", crate::file::display_path(path)));\n        }\n    }\n    if !failures.is_empty() {\n        bail!(\n            \"interrupted file recovery needs attention; temporary recovery data was retained. {}. Run `mise bootstrap dotfiles recover` to retry, or inspect the files and use `recover <operation> --keep-current` to explicitly accept their current contents\",\n            failures.join(\"; \")\n        );\n    }\n    Ok(())\n}\n\nfn recover_path(\n    state_dir: &Path,\n    path: &Path,\n    prior: &PathSnapshot,\n    after: Option<&PathState>,\n) -> Result<()> {\n    validate_destination(path)?;\n    let comparison = tempfile::tempdir()?;\n    let depth = if matches!(prior, PathSnapshot::Directory { .. }) {\n        Capture::Shallow\n    } else {","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/system/history/recovery.rs#L38-L74","documentation":"recover_entries iterates the recorded paths of an interrupted operation and attempts recover_path for each. Any per-path failures are collected, and if any exist it bails with a summary listing each failing path, deliberately leaving the temporary recovery data in place so recovery can be retried or explicitly accepted.","triggerScenarios":"Calling recover or recover_unfinished when recover_path fails for one or more paths — e.g. the live file changed after the operation, completion was never recorded, or directory contents cannot be verified.","commonSituations":"Recovering after a crash mid-write while the user has since edited the affected dotfiles; missing 'after' state because the operation died before checkpointing; directories whose identity cannot be established.","solutions":["Run `mise bootstrap dotfiles recover` again — transient conditions may now pass and the retry uses retained recovery data.","Inspect each listed path; if its current contents are correct, run `recover <operation> --keep-current` to accept them explicitly.","Fix the specific per-path cause (see the path:error details in the message), then retry recovery.","Restore the affected files from backup and re-run bootstrap enrollment."],"exampleFix":"// before: retry blindly fails again\n$ mise bootstrap dotfiles recover\n// after: accept current contents for reviewed files\n$ mise bootstrap dotfiles recover <operation> --keep-current","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"match recover_entries(state_dir, plan) {\n    Err(e) if e.to_string().contains(\"interrupted file recovery needs attention\") => {\n        eprintln!(\"{e}\\nreview each path, then use --keep-current if contents are correct\");\n    }\n    other => other?,\n}","preventionTips":["Run recovery soon after an interruption, before editing affected files.","Pause editors/sync tools touching dotfiles during recovery.","Review the per-path failure details before retrying."],"tags":["recovery","dotfiles","crash","state"],"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"}