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
- Add `version_order = "semver"` to the tool's table in the registry TOML
- Remove the `min_version` fields from backends if semver ordering is not appropriate for this tool
- 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
- Whenever adding min_version to a backend, add version_order = "semver" in the same change
- Only use min_version for tools with genuinely semver versioning
- Lint registry TOML for the min_version/version_order pairing
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
- backends must not be empty
- unknown idiomatic file field
- backend must be a string or table
- brew-cask: command_wrapper args and env require executable
- command wrapper for must have a non-blank command
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)