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
- Reproduce the probe manually: ssh <host> sh -c 'uname -s; uname -m; echo none' and fix whatever makes the output deviate
- Set remote_mise or bootstrap_command to skip platform detection entirely
- 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
- Keep the remote login shell POSIX-compatible (sh/dash/bash in POSIX mode)
- When extending remote_platform_script, bump parser + script in the same commit
- Wrap auto-provisioning for new remotes in a dry-run to catch protocol mismatches early
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
- remote platform response is invalid
- automatic cross-platform provisioning is unavailable from a
- remote Linux libc family could not be identified
- remote upload to '{}' failed with {status}
- remote command on '{name}' failed with {}: {}
AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22).
Data as JSON: /api/errors/6df608fc60b2e148.
Report an issue: GitHub.