jdx/mise · error

remote bootstrap failed on

Error message

remote bootstrap failed on {} target(s):
  {}

What it means

After running bootstrap on each selected remote target (SSH execution), mise aggregates any per-target failures. If any target failed, the whole command exits with this error listing each failure, after honoring --fail-fast to stop early.

Solutions

  1. Read the per-target failure lines to distinguish connection vs. bootstrap errors
  2. Verify SSH connectivity/auth: ssh [user@]host works non-interactively
  3. Ensure mise and required tools are installed on the failing remotes
  4. Use --fail-fast to stop on the first failure while debugging, then rerun
Defensive patterns

Strategy: try-catch

Validate before calling

ssh -o BatchMode=yes -o ConnectTimeout=5 user@host 'mise --version' # preflight each target

Try / catch

try { await runRemoteBootstrap() } catch (e) { if (/remote bootstrap failed on/.test(e.message)) retryFailuresIndividually() }

Prevention

When it happens

Trigger: One or more remote hosts returned a non-zero exit or connection error during bootstrap execution; failures vector is non-empty at the end of the loop.

Common situations: Unreachable hosts (network/VPN down), SSH auth failures, or the remote bootstrap itself failing (missing mise, bad remote config, failing hooks).

Related errors


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

Appendix: source

Thrown at src/cli/bootstrap.rs:3141

        for host in selected.values() {
            if let Err(error) =
                system::remote::run(host, &options, &mut artifacts, repository.as_ref()).await
            {
                if matches!(
                    crate::exit::requested_exit_code(&error),
                    Some(129 | 130 | 143)
                ) {
                    return Err(error);
                }
                error!("remote bootstrap failed on {}: {error:#}", host.name);
                failures.push(format!("{}: {error:#}", host.name));
                if self.fail_fast {
                    break;
                }
            }
        }
        if !failures.is_empty() {
            bail!(
                "remote bootstrap failed on {} target(s):\n  {}",
                failures.len(),
                failures.join("\n  ")
            );
        }
        info!("remote bootstrap completed on {} target(s)", selected.len());
        Ok(())
    }
}

fn select_remote_inventory(
    inventory: &indexmap::IndexMap<String, system::remote::RemoteHost>,
    targets: &[String],
    all: bool,
    tags: &[String],
) -> Result<indexmap::IndexMap<String, system::remote::RemoteHost>> {
    let mut selected = indexmap::IndexMap::new();
    for target in targets {

View on GitHub (pinned to 533346cc37)