jdx/mise · error · eyre::Report

automatic cross-platform provisioning is unavailable from a

Error message

automatic cross-platform provisioning is unavailable from a debug mise build; set mise_bin, remote_mise, or bootstrap_command

What it means

Thrown by RemoteArtifactResolver::ensure_official_local when mise needs to provision a remote host whose platform differs from the local one and none of mise_bin, remote_mise, or bootstrap_command is configured. Automatic provisioning works by downloading the official signed release artifact for the remote platform, and before doing that it verifies the running local binary against the minisign-verified SHASUMS256.txt manifest. A debug build (cfg!(debug_assertions), e.g. target/debug/mise from cargo run) can never match an official release checksum, so the check refuses up front instead of downloading the manifest and failing later.

Source

Thrown at src/system/remote.rs:1028

            return Err(error).wrap_err_with(|| {
                format!("official mise release artifact {asset} failed verification")
            });
        }
        progress.finish();
        info!(
            "using signed official mise {} artifact {asset}",
            env!("CARGO_PKG_VERSION")
        );
        self.artifacts.insert(asset, path.clone());
        Ok(path)
    }

    async fn ensure_official_local(&mut self, local: &Path) -> Result<()> {
        if self.official_local_verified {
            return Ok(());
        }
        if cfg!(debug_assertions) {
            bail!(
                "automatic cross-platform provisioning is unavailable from a debug mise build; set mise_bin, remote_mise, or bootstrap_command"
            );
        }
        let local_os = normalize_os(std::env::consts::OS);
        let local_arch = normalize_arch(std::env::consts::ARCH);
        let candidates = official_release_assets(&local_os, &local_arch)?;
        let actual = crate::hash::file_hash_sha256(local, None)?;
        let manifest = self.manifest().await?;
        let official = candidates.iter().any(|asset| {
            manifest
                .checksum(asset)
                .is_ok_and(|expected| expected.eq_ignore_ascii_case(&actual))
        });
        if !official {
            bail!(
                "automatic cross-platform provisioning refuses to replace a custom mise build with an official binary because {} does not match the signed mise {} release checksums; set mise_bin, remote_mise, or bootstrap_command",
                local.display(),
                env!("CARGO_PKG_VERSION")

View on GitHub (pinned to 6f52dcdf99)

Solutions

  1. Set one of mise_bin, remote_mise, or bootstrap_command on the host entry in [bootstrap.remote.hosts.<name>] so provisioning is explicit
  2. Install and run an official mise release build (or cargo build --release of the same version) before using automatic cross-platform provisioning
  3. If mise is already installed on the remote, set remote_mise = "mise" to skip provisioning entirely

Example fix

# before (mise.toml)
[bootstrap.remote.hosts.ci]
host = "ci@build-1"

# after
[bootstrap.remote.hosts.ci]
host = "ci@build-1"
remote_mise = "mise"  # or: bootstrap_command = "curl https://mise.run | sh", or mise_bin = "./target/release/mise"
Defensive patterns

Strategy: fallback

Validate before calling

// Before running any remote flow, require explicit provisioning in dev builds
let automatic = host.mise_bin.is_none()
    && host.remote_mise.is_none()
    && host.bootstrap_command.is_none();
if cfg!(debug_assertions) && automatic {
    eyre::bail!(
        "debug builds cannot auto-provision; set mise_bin/remote_mise/bootstrap_command for host '{}'",
        host.name
    );
}

Type guard

fn has_explicit_provisioning(host: &RemoteHost) -> bool {
    host.mise_bin.is_some() || host.remote_mise.is_some() || host.bootstrap_command.is_some()
}

Try / catch

match run_remote(&host, &opts).await {
    Err(e) if e.to_string().contains("debug mise build") => {
        // dev-only: skip or fall back to a host entry with explicit provisioning
        warn_once!("host '{}' needs mise_bin/remote_mise/bootstrap_command in dev builds", host.name);
    }
    other => other?,
}

Prevention

When it happens

Trigger: Running a debug-compiled mise (cargo run, target/debug/mise) and triggering remote/bootstrap against a host with a different OS/arch while [bootstrap.remote.hosts.<name>] sets none of mise_bin, remote_mise, or bootstrap_command.

Common situations: Contributors developing mise itself and testing the remote flow; CI pipelines that build unoptimized debug binaries; users of a locally checked-out repo running the binary from target/debug.

Related errors


AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22). Data as JSON: /api/errors/bfab2a5300793f96. Report an issue: GitHub.