jdx/mise · error

no matching interrupted operation; `mise bootstrap dotfiles

Error message

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

What it means

Thrown by the dotfiles history `recover` routine when no pending (interrupted) operation record matches the selector the user gave (or no pending records exist at all). The recovery command needs at least one matching interrupted operation to act on.

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 bootstrap dotfiles 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));
                }
            }

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. List pending operations with `mise bootstrap dotfiles history --pending` and copy the exact identifier
  2. Re-run recover with the exact operation id shown by --pending
  3. If there are genuinely no pending operations, nothing needs recovery — skip the command

Example fix

// before
mise bootstrap dotfiles history --recover op-1234  # wrong id
// after
mise bootstrap dotfiles history --pending
mise bootstrap dotfiles history --recover <id-from-pending>
Defensive patterns

Strategy: validation

Validate before calling

# only recover when a pending record exists; capture the id from --pending
PENDING=$(mise bootstrap dotfiles history --pending)
[ -n "$PENDING" ] && mise bootstrap dotfiles history --recover "$PENDING_ID"

Try / catch

if ! mise bootstrap dotfiles history --recover "$OP_ID" 2>&1 | grep -q 'no matching'; then
  echo "recovered $OP_ID"
fi

Prevention

When it happens

Trigger: Running `mise bootstrap dotfiles history --recover` (with or without an operation identifier) when store::list_pending_in returns nothing matching the selector — either no pending operations or the id/uuid is wrong.

Common situations: Typo in the operation identifier or checkpoint uuid; the operation was already recovered or cleaned up; running recover before any interrupted operation exists.

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@afd2eddd3a (2026-09-09). Data as JSON: /api/errors/5f4d50c2aa3cda35. Report an issue: GitHub.