{"record":{"id":"2019d4f3969aada2","repo":"jdx/mise","slug":"backend-min-version-requires-version-order-semv","errorCode":null,"errorMessage":"backend min_version requires version_order = \"semver\"","messagePattern":"backend min_version requires version_order = \"semver\"","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/registry.rs","lineNumber":428,"sourceCode":"        .ok_or_else(|| eyre::eyre!(\"registry tool must be a TOML table\"))?;\n    let backends = table\n        .get(\"backends\")\n        .and_then(toml::Value::as_array)\n        .ok_or_else(|| eyre::eyre!(\"backends must be an array\"))?\n        .iter()\n        .map(parse_registry_backend)\n        .collect::<Result<Vec<_>>>()?;\n    ensure!(!backends.is_empty(), \"backends must not be empty\");\n\n    let missing_version_order = !table.contains_key(\"version_order\");\n    let version_order = match table.get(\"version_order\").and_then(toml::Value::as_str) {\n        Some(\"source\") => VersionOrder::Source,\n        Some(\"semver\") => VersionOrder::Semver,\n        Some(_) => bail!(\"version_order must be \\\"source\\\" or \\\"semver\\\"\"),\n        None => VersionOrder::Source,\n    };\n\n    ensure!(\n        version_order == VersionOrder::Semver || backends.iter().all(|b| b.min_version.is_none()),\n        \"backend min_version requires version_order = \\\"semver\\\"\"\n    );\n    let aliases = string_array(table.get(\"aliases\"), \"aliases\")?;\n    let bins = if table.contains_key(\"bins\") {\n        string_array(table.get(\"bins\"), \"bins\")?\n    } else {\n        BAKED_REGISTRY\n            .get(short)\n            .map(|tool| tool.bins.to_vec())\n            .unwrap_or_default()\n    };\n    let overrides = string_array(table.get(\"overrides\"), \"overrides\")?;\n    let os = string_array(table.get(\"os\"), \"os\")?;\n    let idiomatic_files = parse_registry_idiomatic_files(table.get(\"idiomatic_files\"))?;\n    let detect = string_array(table.get(\"detect\"), \"detect\")?;\n    let description = table\n        .get(\"description\")","sourceCodeStart":410,"sourceCodeEnd":446,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/registry.rs#L410-L446","documentation":"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.","triggerScenarios":"A registry tool whose backends set `min_version` while the tool's `version_order` is \"semver\"-less (absent, defaulting to Source) or explicitly \"source\".","commonSituations":"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.","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)"],"exampleFix":"// before\n[tools.foo]\nbackends = [{ backend = \"github\", min_version = \"1.2.0\", ... }]\n// after\n[tools.foo]\nversion_order = \"semver\"\nbackends = [{ backend = \"github\", min_version = \"1.2.0\", ... }]","handlingStrategy":"validation","validationCode":"fn validate_min_version(tool: &toml::Value) -> Result<(), String> {\n    let semver_ordered = tool.get(\"version_order\").and_then(|v| v.as_str()) == Some(\"semver\");\n    let has_min = tool.get(\"backends\").and_then(|v| v.as_array())\n        .map_or(false, |a| a.iter().any(|b| b.get(\"min_version\").is_some()));\n    if has_min && !semver_ordered {\n        return Err(\"min_version requires version_order = \\\"semver\\\"\".into());\n    }\n    Ok(())\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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"],"tags":["registry","toml","validation","conflicting-options"],"backgroundTag":"conflicting-config-options","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}