jdx/mise · error

backend min_version requires version_order = "semver"

Error message

backend min_version requires version_order = "semver"

What it means

This error enforces that per-backend `min_version` constraints are only meaningful when the tool declares `version_order = "semver"`. Because version ordering defaults to "source" (the order the backend lists versions), a min_version comparison is undefined without semver ordering, so the loader rejects the combination.

Solutions

  1. Add `version_order = "semver"` to the tool's table in the registry TOML
  2. Remove the `min_version` fields from backends if semver ordering is not appropriate for this tool
  3. If the tool's versions are genuinely non-semver, express the floor differently (e.g. via source ordering of the version list)

Example fix

// before
[tools.foo]
backends = [{ backend = "github", min_version = "1.2.0", ... }]
// after
[tools.foo]
version_order = "semver"
backends = [{ backend = "github", min_version = "1.2.0", ... }]
Defensive patterns

Strategy: validation

Validate before calling

fn validate_min_version(tool: &toml::Value) -> Result<(), String> {
    let semver_ordered = tool.get("version_order").and_then(|v| v.as_str()) == Some("semver");
    let has_min = tool.get("backends").and_then(|v| v.as_array())
        .map_or(false, |a| a.iter().any(|b| b.get("min_version").is_some()));
    if has_min && !semver_ordered {
        return Err("min_version requires version_order = \"semver\"".into());
    }
    Ok(())
}

Prevention

When it happens

Trigger: A registry tool whose backends set `min_version` while the tool's `version_order` is "semver"-less (absent, defaulting to Source) or explicitly "source".

Common situations: Adding min_version to a backend but forgetting to add `version_order = "semver"` at the tool level; tools with non-semver version schemes where a maintainer added a floor constraint; copy-pasting min_version config between tools.

Understand the failure class

Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.

Related errors


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

Appendix: source

Thrown at src/registry.rs:428

        .ok_or_else(|| eyre::eyre!("registry tool must be a TOML table"))?;
    let backends = table
        .get("backends")
        .and_then(toml::Value::as_array)
        .ok_or_else(|| eyre::eyre!("backends must be an array"))?
        .iter()
        .map(parse_registry_backend)
        .collect::<Result<Vec<_>>>()?;
    ensure!(!backends.is_empty(), "backends must not be empty");

    let missing_version_order = !table.contains_key("version_order");
    let version_order = match table.get("version_order").and_then(toml::Value::as_str) {
        Some("source") => VersionOrder::Source,
        Some("semver") => VersionOrder::Semver,
        Some(_) => bail!("version_order must be \"source\" or \"semver\""),
        None => VersionOrder::Source,
    };

    ensure!(
        version_order == VersionOrder::Semver || backends.iter().all(|b| b.min_version.is_none()),
        "backend min_version requires version_order = \"semver\""
    );
    let aliases = string_array(table.get("aliases"), "aliases")?;
    let bins = if table.contains_key("bins") {
        string_array(table.get("bins"), "bins")?
    } else {
        BAKED_REGISTRY
            .get(short)
            .map(|tool| tool.bins.to_vec())
            .unwrap_or_default()
    };
    let overrides = string_array(table.get("overrides"), "overrides")?;
    let os = string_array(table.get("os"), "os")?;
    let idiomatic_files = parse_registry_idiomatic_files(table.get("idiomatic_files"))?;
    let detect = string_array(table.get("detect"), "detect")?;
    let description = table
        .get("description")

View on GitHub (pinned to 533346cc37)