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
- Read the per-target failure lines to distinguish connection vs. bootstrap errors
- Verify SSH connectivity/auth: ssh [user@]host works non-interactively
- Ensure mise and required tools are installed on the failing remotes
- 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
- Preflight SSH connectivity to all targets
- Use --fail-fast while iterating, then full runs in CI
- Ensure mise is installed and on PATH on every remote
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
- bootstrap_command left multiple
- bootstrap_command left multiple unchanged mise executables…
- git clone failed with
- git command failed with
- GitHub relay socket forwarding failed
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)