jdx/mise · error

bootstrap_command left multiple unchanged mise executables a

Error message

bootstrap_command left multiple unchanged mise executables and the installed path is ambiguous: {}; set remote_mise or mise_bin explicitly

What it means

After a remote `bootstrap_command` runs, `select_bootstrapped_mise` must pick exactly one mise executable. If the post-bootstrap PATH contains multiple candidates that are all 'unchanged' (none are new, none changed identity, none match the running mise version, and there is more than one), the installed path is ambiguous and this error names every candidate while telling the user to set the path explicitly.

Source

Thrown at src/system/remote.rs:1414

                .and_then(|identity| identity.version.split_whitespace().next())
                .is_some_and(|version| {
                    version == env!("CARGO_PKG_VERSION")
                        || version == concat!(env!("CARGO_PKG_VERSION"), "-DEBUG")
                })
        })
        .collect::<Vec<_>>();
    if let Some(candidate) =
        select_unique_remote_mise_candidate(version_candidates, "version-matching")?
    {
        return Ok(candidate);
    }
    if let [candidate] = after {
        return Ok(candidate.clone());
    }
    if after.is_empty() {
        bail!("mise executable not found after bootstrap_command");
    }
    bail!(
        "bootstrap_command left multiple unchanged mise executables and the installed path is ambiguous: {}; set remote_mise or mise_bin explicitly",
        after.join(", ")
    )
}

fn select_unique_remote_mise_candidate(
    candidates: Vec<&String>,
    kind: &str,
) -> Result<Option<String>> {
    match candidates.as_slice() {
        [] => Ok(None),
        [candidate] => Ok(Some((*candidate).clone())),
        _ => bail!(
            "bootstrap_command left multiple {kind} mise executables and the installed path is ambiguous: {}; set remote_mise or mise_bin explicitly",
            candidates
                .iter()
                .map(|candidate| candidate.as_str())
                .collect::<Vec<_>>()

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Set `remote_mise` (or `mise_bin`) explicitly to the desired absolute path so selection is unambiguous.
  2. Remove the extra mise executables from the remote PATH, keeping only one.
  3. Adjust the bootstrap_command to install to a single fixed path (MISE_INSTALL_PATH) so only one candidate exists.
  4. Ensure the bootstrap-installed mise reports the same version as the local mise so the version-matching selector can disambiguate it.

Example fix

# before
bootstrap_command = "curl -fsSL https://mise.run | sh"
# after
remote_mise = "/usr/local/bin/mise"
bootstrap_command = "curl -fsSL https://mise.run | MISE_INSTALL_PATH=/usr/local/bin/mise sh"
Defensive patterns

Strategy: validation

Validate before calling

# shell
ls -l $(compgen -c mise | sort -u | command -v mise 2>/dev/null) 2>/dev/null; which -a mise

Prevention

When it happens

Trigger: Running remote auto-provisioning where the bootstrap leaves ≥2 mise binaries on the remote PATH, and none is uniquely identified as new/changed/version-matching — e.g. a pre-existing mise plus a freshly installed one with identical version/fingerprint resolution, or several shim/wrapper scripts named mise.

Common situations: The host already had mise installed and the bootstrap installed a second copy; a wrapper script named `mise` shadows a real binary; mise exists in both /usr/local/bin and ~/.local/bin.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


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