jdx/mise · error
backend min_version requires version_order = "semver"
Error message
backend min_version requires version_order = "semver"
What it means
Registry tools can specify `version_order = "source"` (default) or `"semver"`. Backend-level `min_version` constraints rely on semver comparisons, so mise requires that any backend with a `min_version` be defined on a tool whose version_order is "semver". Using min_version under source ordering would silently do nothing sensible, so it is rejected at parse time.
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 afd2eddd3a)
Solutions
- Add `version_order = "semver"` to the tool's TOML table if its versions are semver-compatible.
- Otherwise remove the backend's `min_version` field, since source-ordered tools cannot use it.
- If the tool mixes version schemes, keep min_version only on backends whose tool is semver-ordered.
Example fix
// before [deno] [[backends]] type = "github" source = "denoland/deno" min_version = "1.40.0" // after [deno] version_order = "semver" [[backends]] type = "github" source = "denoland/deno" min_version = "1.40.0"
Defensive patterns
Strategy: validation
Validate before calling
// pre-check: min_version only allowed with semver ordering
let order = table.get("version_order").and_then(toml::Value::as_str).unwrap_or("source");
if order != "semver" && backends.iter().any(|b| b.min_version.is_some()) {
return Err("set version_order = \"semver\" or drop min_version".into());
} Prevention
- Only add `min_version` to tools that declare (or should declare) version_order = "semver".
- Remember version_order defaults to "source"; state it explicitly when using semver features.
- Check version scheme (date-based/named vs semver) before copying backend blocks between tools.
When it happens
Trigger: parse_registry_tool finding a backend entry with a `min_version` field while the tool's `version_order` is unset or "source".
Common situations: A registry contributor copies a backend block (with min_version) from a semver-ordered tool into a source-ordered tool (e.g. tools with date-based or named versions), or adds min_version without realizing version_order defaults to "source".
Related errors
- version_order must be "source" or "semver"
- backends must not be empty
- unknown idiomatic file field: {key}
- failed to parse registry option {k} as a TOML value: {e}
- unrecognized install {s:?} in lockfile
AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09).
Data as JSON: /api/errors/2019d4f3969aada2.
Report an issue: GitHub.