jdx/mise · error

the packslip lists and as musl fallbacks for , and mise…

Error message

the packslip lists {a} and {b} as musl fallbacks for {}, and mise will not guess between them

What it means

When the selected gnu artifact declares a minimum glibc version higher than the host's, mise falls back to a static musl build. If two musl artifacts match the host equally as fallbacks, mise refuses to guess and raises this error naming both artifacts and the gnu artifact that needed the fallback.

Solutions

  1. Set the `variant` tool option to pick one of the musl artifacts explicitly.
  2. Pin an older tool version whose glibc requirement fits the host or whose musl fallback is unambiguous.
  3. Upgrade the host glibc (or use a newer distro/container) so the gnu artifact's requirement is met and no fallback is needed.
  4. Ask the vendor to disambiguate the duplicate musl artifacts in the packslip.

Example fix

// before
[tools]
"packslip:foo" = "latest"

// after
[tools]
"packslip:foo" = { version = "latest", variant = "tar-gz" }
Defensive patterns

Strategy: fallback

Validate before calling

// Check glibc version against the artifact requirement before install.
const glibc = await getGlibcVersion();
if (artifact.requires?.glibc_min && compareGlibc(glibc, artifact.requires.glibc_min) < 0) {
  console.warn('host glibc below minimum; a musl fallback artifact will be selected');
}

Try / catch

try {
  await miseInstall(tool);
} catch (e) {
  if (String(e).includes('as musl fallbacks')) {
    await miseInstall(tool, { variant: 'tar-gz' }); // explicit disambiguation
  } else throw e;
}

Prevention

When it happens

Trigger: Installing a packslip tool on a glibc host whose glibc is older than the artifact's requires.glibc_min, while the packslip lists two musl artifacts for the same os/arch with equal format preference.

Common situations: Running on an older enterprise Linux (old glibc) with a tool whose latest release requires newer glibc; the vendor publishes two musl builds (e.g. two archive formats) without variants.

Related errors


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

Appendix: source

Thrown at src/backend/packslip.rs:457

    min: &str,
) -> Result<&'a Artifact> {
    if crate::packslip_requirements::meets_minimum(actual, min) != Some(false) {
        return Ok(artifact);
    }

    let musl = Host {
        libc: Some("musl"),
        ..host.as_host()
    };
    match packslip::select_artifact(artifacts, &musl, variant, &FORMAT_PREFERENCE) {
        Ok(fallback) => {
            debug!(
                "{} requires glibc>={min}, but this host has {actual}; taking the static musl build {}",
                artifact.name, fallback.name
            );
            Ok(fallback)
        }
        Err(Selection::Ambiguous(a, b)) => bail!(
            "the packslip lists {a} and {b} as musl fallbacks for {}, and mise will not guess between them",
            artifact.name
        ),
        Err(Selection::NoMatch) => Ok(artifact),
    }
}

/// The artifact installed from a stored statement, for scoping resources to it
/// later. New installs record it explicitly; old installs fall back to host
/// selection. `None` means only unscoped resources apply.
pub(crate) fn selected_artifact(
    statement: &Statement,
    install_path: &Path,
    variant: Option<&str>,
) -> Option<Artifact> {
    if let Ok(name) = std::fs::read_to_string(install_path.join(SELECTED_ARTIFACT_FILE))
        && let Some(artifact) = statement
            .predicate

View on GitHub (pinned to 533346cc37)