jdx/mise · error · eyre::Report

remote platform response is incomplete

Error message

remote platform response is incomplete

What it means

Thrown by parse_remote_platform when the OS is not Linux and the third output line is missing (None) or is a value other than the expected literal none. The remote script always prints os, arch, then 'none' for non-Linux systems, so this arm means the output shape diverged from the protocol: a truncated response, a remote shell that mishandled the script, or a script/version skew between what ran and what the parser expects.

Source

Thrown at src/system/remote.rs:1190

        if [ -e "$loader" ]; then libc=musl; break; fi
      done
    fi
    printf '%s\n' "${libc:-unknown}"
    ;;
  *) printf '%s\n' none ;;
esac"#
}

fn parse_remote_platform(output: &str) -> Result<RemotePlatform> {
    let mut lines = output.lines();
    let os = normalize_os(lines.next().unwrap_or_default());
    let arch = normalize_arch(lines.next().unwrap_or_default());
    let libc = match (os.as_str(), lines.next()) {
        ("linux", Some("glibc")) => Some(LibcFlavor::Glibc),
        ("linux", Some("musl")) => Some(LibcFlavor::Musl),
        ("linux", _) => bail!("remote Linux libc family could not be identified"),
        (_, Some("none")) => None,
        _ => bail!("remote platform response is incomplete"),
    };
    if os.is_empty() || arch.is_empty() || lines.next().is_some() {
        bail!("remote platform response is invalid");
    }
    Ok(RemotePlatform { os, arch, libc })
}

#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
struct AbiVersion(Vec<u32>);

impl fmt::Display for AbiVersion {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_str(
            &self
                .0
                .iter()
                .map(u32::to_string)
                .collect::<Vec<_>>()

View on GitHub (pinned to 6f52dcdf99)

Solutions

  1. Reproduce the probe manually: ssh <host> sh -c 'uname -s; uname -m; echo none' and fix whatever makes the output deviate
  2. Set remote_mise or bootstrap_command to skip platform detection entirely
  3. Ensure the remote user's default shell is a POSIX sh and no shell wrappers rewrite commands

Example fix

# before (mise.toml)
[bootstrap.remote.hosts.srv]
host = "deploy@srv"

# after
[bootstrap.remote.hosts.srv]
host = "deploy@srv"
remote_mise = "/usr/local/bin/mise"
Defensive patterns

Strategy: validation

Validate before calling

# Verify the probe protocol before running mise against a new host:
ssh deploy@srv 'uname -s; uname -m; echo none'
# must print exactly 3 lines; if the third is missing/wrong, fix the remote shell
# or set remote_mise / bootstrap_command

Type guard

fn is_wellformed_platform_output(output: &str) -> bool {
    let lines: Vec<&str> = output.lines().collect();
    lines.len() == 3
        && !lines[0].trim().is_empty()
        && !lines[1].trim().is_empty()
        && (lines[0].eq_ignore_ascii_case("linux")
            || lines[2] == "none")
}

Prevention

When it happens

Trigger: Remote sh is non-POSIX or the connection truncates output so the third line never arrives; a wrapper/login environment replaces the script or injects a different third token; future script changes emit a new libc token for non-Linux OSes while the parser is old.

Common situations: Remotes with exotic default shells forced via sshd config; middleboxes mangling output; version mismatches during mise upgrades where the client and expectations drift.

Related errors


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