jdx/mise · error

no matching interrupted operation; `mise dot history…

Error message

no matching interrupted operation; `mise dot history --pending` lists them

What it means

`mise dot recover` filters pending (interrupted) operation records by the optional operation selector; if no pending record matches, it bails and points the user at `mise dot history --pending` to list available identifiers.

Solutions

  1. Run `mise dot history --pending` to list actual interrupted operations and their identifiers
  2. Copy the exact operation id/uuid from that listing into `mise dot recover <id>`
  3. If there are no pending operations, nothing needs recovery — the command correctly reports none
  4. Ensure the operation wasn't already recovered or discarded

Example fix

# before
mise dot recover abc123  # typo'd uuid
# after
mise dot history --pending
mise dot recover 3f2a...  # exact uuid from listing
Defensive patterns

Strategy: validation

Validate before calling

pending=$(mise dot history --pending)
echo "$pending"  # pick the exact id before recovering

Try / catch

if ! mise dot recover "$OP_ID" 2>/dev/null; then
  mise dot history --pending
fi

Prevention

When it happens

Trigger: Running `mise dot recover [operation]` when the `selected` list is empty: no interrupted operations exist at all, or the supplied id/uuid does not match any pending record (typo, operation already recovered/discarded).

Common situations: Recovering after all pending operations were already handled; stale script referencing an old checkpoint uuid; running recover on a machine with no interrupted operations; UUID typo.

Understand the failure class

Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/b383062ba1eda123. Report an issue: GitHub.

Appendix: source

Thrown at src/cli/dotfiles/recover.rs:58

    fn recover(self, tracked: &TrackedSet) -> Result<()> {
        let store = Store::open()?;
        let _lock = scope::recovery_lock(&store)?;
        let pending = store::list_pending_in(store.state_dir())?;
        if pending.is_empty() {
            info!("dotfiles: no interrupted operations");
            return Ok(());
        }
        let selected = pending
            .iter()
            .filter(|(_, record)| {
                self.operation.as_ref().is_none_or(|selector| {
                    matches_operation(selector, record.id, &record.checkpoint.uuid)
                })
            })
            .collect::<Vec<_>>();
        if selected.is_empty() {
            bail!("no matching interrupted operation; `mise dot history --pending` lists them");
        }
        for (_, record) in &selected {
            miseprintln!("Interrupted operation {}", record.checkpoint.uuid);
            if let Some(operation) = &record.checkpoint.operation {
                let paths = operation
                    .journal
                    .iter()
                    .filter_map(|entry| match entry {
                        JournalEntry::PathChanged { path, .. } => Some(path),
                        _ => None,
                    })
                    .collect::<BTreeSet<_>>();
                for path in paths {
                    miseprintln!("  {}", crate::file::display_path(path));
                }
            }
        }
        if selected.len() > 1 && (self.keep_current || self.operation.is_some()) {

View on GitHub (pinned to 533346cc37)