jdx/mise · error

cannot upgrade {} because not every request binding was reso

Error message

cannot upgrade {} because not every request binding was resolved

What it means

During a v0 lockfile format upgrade, `mise lock` must bind every tool request in the config to a concrete resolved entry. This error is thrown when `bind_requests` fails to bind at least one request, meaning the upgraded lockfile would be incomplete, so the upgrade is aborted instead of writing a partial lockfile.

Source

Thrown at src/cli/lock.rs:539

            let (results, resolution_errors) = self
                .process_tools(&settings, &tools, &target_platforms, &mut lockfile)
                .await?;
            let resolution_succeeded = resolution_errors.is_empty();
            all_resolution_errors.extend(resolution_errors);

            let platform_regressions =
                self.platform_regression_errors(&lockfile, &stale_versions, &results);
            if !platform_regressions.is_empty() {
                all_platform_regressions.extend(platform_regressions);
                continue;
            }

            let format_changed =
                self.upgrade && lockfile.lockfile_version() == 0 && resolution_succeeded;
            if format_changed {
                self.prepare_lockfile_format(&lockfile_path, &mut lockfile);
                if !self.bind_requests(&mut lockfile, &tools, &target_platforms) {
                    bail!(
                        "cannot upgrade {} because not every request binding was resolved",
                        display_path(&lockfile_path)
                    );
                }
            } else {
                self.bind_requests(&mut lockfile, &tools, &target_platforms);
            }

            // Prune stale versions AFTER provenance checks complete
            self.prune_stale_versions(&mut lockfile, &tools);
            if !self.upgrade {
                self.show_stale_version_prune_message(&lockfile_path, &stale_versions, false)?;
            }

            let successful = results
                .iter()
                .filter(|result| matches!(result.status, LockTaskStatus::Updated))
                .count();

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Re-run `mise lock --upgrade` after fixing any resolution warnings; transient network failures during resolution are the most common cause.
  2. Compare the [tools] selectors in mise.toml with the lockfile entries and remove/rename stale requests.
  3. Run `mise install` to ensure all requested tools resolve and install before upgrading.
  4. As a last resort, delete the v0 lockfile and regenerate it fresh with `mise lock`.

Example fix

// before: stale selector in mise.toml
[tools]
node = "lts/dubnium"  # no longer resolvable

// after
[tools]
node = "22"
Defensive patterns

Strategy: validation

Validate before calling

# ensure every configured tool resolves before upgrading
mise ls --missing || true
mise install

Prevention

When it happens

Trigger: Run `mise lock --upgrade` on a version-0 lockfile where resolution succeeded overall (`resolution_succeeded` is true) but `bind_requests` returns false — some configured tool request cannot be matched to a resolved version/platform entry in `tools` or `target_platforms`.

Common situations: Configs with platform-specific or aliased tool requests whose resolved counterparts are missing; lockfiles created by an older mise with entries that no longer match current config selectors; partial resolution after network or registry errors.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


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