jdx/mise · error

remote bootstrap configuration is invalid for

Error message

remote bootstrap configuration is invalid for {} target(s):
  {}

What it means

After selecting targets, mise applies RemoteOverrides (per-host CLI overrides) to each host. If any host fails validation in apply_overrides, mise collects all errors and aborts before running anything, listing each target and its error.

Solutions

  1. Read the per-target error lines in the message to find the offending host(s)
  2. Fix the host entry under [bootstrap.remote.hosts] (validate user@host format and options)
  3. Remove or correct conflicting --override-style CLI flags for those hosts
  4. Test with a single --host to isolate the failing entry

Example fix

# before (invalid host string)
[bootstrap.remote.hosts]
web1 = "web1 example"
# after
[bootstrap.remote.hosts]
web1 = "deploy@web1.example.com"
Defensive patterns

Strategy: validation

Validate before calling

hosts.forEach(h => { if (!/^[^@\s]+@[^@\s]+$|^[[^\s]+]$/.test(h)) throw new Error(`bad host: ${h}`) })

Prevention

When it happens

Trigger: One or more selected hosts have invalid configuration after applying overrides — e.g. bad user/host strings, invalid relay or env settings merged from CLI flags onto config-defined hosts.

Common situations: Malformed entries under [bootstrap.remote.hosts]; CLI override flags incompatible with a host definition; recent config edits introducing invalid fields.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


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

Appendix: source

Thrown at src/cli/bootstrap.rs:3097

            relay,
            dry_run: self.dry_run,
            yes: self.yes,
            update: self.update,
            prompt_secrets: self.prompt_secrets,
            force_dotfiles: self.force_dotfiles,
            skip: self.skip.iter().map(bootstrap_part_name).collect(),
            only: self.only.iter().map(bootstrap_part_name).collect(),
            keep_staging: self.keep_staging,
            connect_timeout: self.connect_timeout,
        };
        let mut configuration_errors = vec![];
        for host in selected.values_mut() {
            if let Err(error) = host.apply_overrides(&overrides) {
                configuration_errors.push(format!("{}: {error:#}", host.name));
            }
        }
        if !configuration_errors.is_empty() {
            bail!(
                "remote bootstrap configuration is invalid for {} target(s):\n  {}",
                configuration_errors.len(),
                configuration_errors.join("\n  ")
            );
        }
        let mut failures = vec![];
        let repository = self
            .adopt
            .as_deref()
            .map(crate::github_relay::expand_repository)
            .transpose()?;
        if let Some(origin) = &repository {
            system::remote_repository::validate_origin(origin)?;
        }
        // a dry run fetches and transfers like a real one: the preview comes
        // from the target, which inspects itself and the repository
        let repository = if let Some(origin) = repository {
            Some(

View on GitHub (pinned to 533346cc37)