jdx/mise · error
the packslip lists {a} and {b} for this host and mise will n
Error message
the packslip lists {a} and {b} for this host and mise will not guess between them{hint} What it means
A packslip manifest lists two artifacts that both match the host, and mise deliberately refuses to pick one. `select_artifact` returns `Selection::Ambiguous(a, b)` for the strict host match and the code bails with both names plus a hint listing the `variant` option values that would disambiguate.
Source
Thrown at src/backend/packslip.rs:337
host: &HostPlatform,
variant: Option<&str>,
) -> Result<&'a Artifact> {
let strict = host.as_host();
let variants = artifacts
.iter()
.filter_map(|a| a.variant.as_deref())
.unique()
.join(", ");
let hint = match variant {
Some(v) => format!(" with variant {v:?}"),
None if !variants.is_empty() => {
format!("; set `variant` to one of {variants} if one of those is meant for you")
}
None => String::new(),
};
match packslip::select_artifact(artifacts, &strict, variant, &FORMAT_PREFERENCE) {
Ok(artifact) => return Ok(artifact),
Err(Selection::Ambiguous(a, b)) => bail!(
"the packslip lists {a} and {b} for this host and mise will not guess between them{hint}"
),
Err(Selection::NoMatch) => {}
}
if host.libc.as_deref() == Some("gnu") {
let musl = Host {
libc: Some("musl"),
..strict
};
match packslip::select_artifact(artifacts, &musl, variant, &FORMAT_PREFERENCE) {
Ok(artifact) => {
debug!(
"no gnu build fits this host; taking the musl build {}, which is static",
artifact.name
);
return Ok(artifact);
}
Err(Selection::Ambiguous(a, b)) => bail!(View on GitHub (pinned to afd2eddd3a)
Solutions
- Set the `variant` tool option to one of the artifact names listed in the hint.
- Check the release manifest and pick the artifact matching your libc (gnu vs musl).
- Report the ambiguous manifest to the upstream project if both entries are duplicates.
Example fix
// before
[tools]
"packslip:github.com/owner/tool" = "2.1"
// after
[tools]
"packslip:github.com/owner/tool" = { version = "2.1", variant = "gnu" } Defensive patterns
Strategy: validation
Validate before calling
// before install, inspect the manifest for host-matching artifacts
// and count candidates; if >1, require a variant option
if (matchingArtifacts.length > 1 && !toolOpts.variant)
throw new Error(`set variant to one of: ${matchingArtifacts.map(a => a.name).join(", ")}`); Try / catch
match result {
Err(e) if e.to_string().contains("mise will not guess between them") => {
let names = extract_two_artifact_names(&e.to_string());
bail!("set `variant` to one of {:?}", names);
}
other => other?,
} Prevention
- Always set `variant` for packslip tools that ship multiple libc/arch builds.
- Read the release manifest when adding a new packslip tool.
- Pin an exact version to avoid surprise manifest changes upstream.
When it happens
Trigger: Installing a packslip tool whose release manifest contains two artifacts equal-preference for the host (e.g. two libc or arch variants) without a `variant` tool option set.
Common situations: Projects shipping both gnu and musl (or generic and tuned) builds for the same triple; manifests updated upstream to add a new variant; users on hosts where prior versions had one artifact and now have two.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- brew-cask: completion executable '{}' is ambiguous: {}
- must not record a pin before replacement succeeds
- packslip:{tool_name} is not a project name; use github.com/o
- packslip:{project} is not on a forge mise knows, so nothing
- packslip: list_identity_prefix must be a non-empty string
AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09).
Data as JSON: /api/errors/3870c45469d7e2fd.
Report an issue: GitHub.