{"record":{"id":"cb248c0ea2a49c64","repo":"jdx/mise","slug":"no-history-checkpoint-matches-spec","errorCode":null,"errorMessage":"no history checkpoint matches {spec:?}","messagePattern":"no history checkpoint matches (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/history/store.rs","lineNumber":1018,"sourceCode":"        })?;\n        return entries\n            .iter()\n            .find(|entry| entry.id == id)\n            .map(|entry| entry.id)\n            .ok_or_else(|| eyre!(\"no history checkpoint matches {spec:?}\"));\n    } else {\n        spec\n    };\n    if prefix.is_empty() {\n        bail!(\"invalid checkpoint reference {spec:?}\");\n    }\n    let matches: Vec<&Entry> = entries\n        .iter()\n        .filter(|entry| entry.checkpoint.uuid.starts_with(prefix))\n        .collect();\n    match matches.as_slice() {\n        [one] => Ok(one.id),\n        [] => bail!(\"no history checkpoint matches {spec:?}\"),\n        _ => bail!(\"{spec:?} matches more than one checkpoint; use a longer prefix\"),\n    }\n}\n\npub(crate) fn now_rfc3339() -> String {\n    chrono::Utc::now().to_rfc3339_opts(chrono::SecondsFormat::Millis, true)\n}\n\npub(crate) fn new_uuid() -> String {\n    uuid::Uuid::now_v7().to_string()\n}\n\npub(crate) fn write_json<T: Serialize>(path: &Path, value: &T) -> Result<()> {\n    let mut text = serde_json::to_string_pretty(value)?;\n    text.push('\\n');\n    if let Some(parent) = path.parent() {\n        file::create_dir_all(parent)?;\n    }","sourceCodeStart":1000,"sourceCodeEnd":1036,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/system/history/store.rs#L1000-L1036","documentation":"Checkpoint references may be given as a UUID prefix; mise filters the stored checkpoints by `starts_with(prefix)`. If no checkpoint's UUID begins with the given prefix, nothing matches and mise reports the spec with its debug formatting so the user can see exactly what was searched. It means the requested history entry does not exist.","triggerScenarios":"Referencing a checkpoint by an id/prefix that was never created, was pruned by retention, or was created in a different history store; typo in the prefix (e.g. `0` instead of `O`).","commonSituations":"Typo'd or truncated id pasted from docs; history cleaned up between sessions; referencing a checkpoint from another machine or profile.","solutions":["List checkpoints (`mise dotfiles history list`) and copy an exact id.","Re-run with a longer or corrected prefix if you only remember part of it.","If the checkpoint was pruned by retention policy, restore from backup or accept it is gone.","Confirm you are operating on the same history store/machine where the checkpoint was made."],"exampleFix":"// before\nmise dotfiles show deadbeef\nError: no history checkpoint matches \"deadbeef\"\n\n// after\nmise dotfiles history list   # find a valid id\nmise dotfiles show <valid-id>","handlingStrategy":"validation","validationCode":"let ids = list_checkpoint_ids()?; // from `history list`\nif !ids.iter().any(|id| id.starts_with(prefix)) {\n  eprintln!(\"prefix {prefix} matches no checkpoint\");\n}","typeGuard":"fn prefix_exists(prefix: &str, entries: &[Entry]) -> bool {\n  entries.iter().any(|e| e.checkpoint.uuid.starts_with(prefix))\n}","tryCatchPattern":null,"preventionTips":["Copy ids directly from `history list` instead of typing prefixes from memory.","Account for retention pruning of old checkpoints.","Confirm you are on the machine/profile that owns the checkpoint."],"tags":["history","checkpoint","not-found","cli"],"backgroundTag":"record-not-found","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"}