{"record":{"id":"e4fcaa87500ec11b","repo":"astrid-runtime/astrid","slug":"distro-astrid-version-av-is-not-a-valid-semver","errorCode":null,"errorMessage":"distro.astrid-version '{av}' is not a valid semver requirement","messagePattern":"distro\\.astrid-version '(.+?)' is not a valid semver requirement","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-cli/src/commands/distro/validate.rs","lineNumber":106,"sourceCode":"        anyhow::bail!(\n            \"distro.id '{}' is invalid (must match ^[a-z][a-z0-9-]*$)\",\n            manifest.distro.id,\n        );\n    }\n\n    // Distro version is valid semver.\n    if semver::Version::parse(&manifest.distro.version).is_err() {\n        anyhow::bail!(\n            \"distro.version '{}' is not valid semver\",\n            manifest.distro.version,\n        );\n    }\n\n    // astrid-version is valid semver requirement (if set).\n    if let Some(ref av) = manifest.distro.astrid_version\n        && semver::VersionReq::parse(av).is_err()\n    {\n        anyhow::bail!(\"distro.astrid-version '{av}' is not a valid semver requirement\");\n    }\n\n    // Requires version strings are valid semver requirements.\n    for (ns, ifaces) in &manifest.distro.requires {\n        for (name, req) in ifaces {\n            if semver::VersionReq::parse(req).is_err() {\n                anyhow::bail!(\n                    \"distro.requires.{ns}.{name} '{req}' is not a valid semver requirement\",\n                );\n            }\n        }\n    }\n\n    // At least one capsule.\n    if manifest.capsules.is_empty() {\n        anyhow::bail!(\"distro must contain at least one capsule\");\n    }\n","sourceCodeStart":88,"sourceCodeEnd":124,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-cli/src/commands/distro/validate.rs#L88-L124","documentation":"validate_manifest in the astrid-cli distro validator rejects a distro manifest whose `distro.astrid-version` field is set but is not a parseable semver requirement (per `semver::VersionReq::parse`). This field pins which versions of the astrid toolchain the distro works with, so it must be a valid requirement expression like `^1.2` or `>=0.8, <2.0`. The library throws early so an invalid pin never silently fails during resolution.","triggerScenarios":"Building/validating a distro manifest where `distro.astrid-version` is a non-empty string that fails semver VersionReq parsing — e.g. `astrid-version: \"1.2.x-*\"`, `\"v1.0\"`, `\"latest\"`, `\"^1.2.3.4\"`, or stray whitespace/typo.","commonSituations":"Hand-editing a distro.toml/manifest and typing a git tag or plain version instead of a semver requirement; copying a Cargo-style requirement with unsupported operators; accidentally quoting `latest` or a branch name into the field.","solutions":["Open the manifest and fix `distro.astrid-version` to a valid semver requirement (e.g. `^1.2`, `=1.4.2`, `>=0.8, <2.0`).","If you meant a concrete version, use an exact requirement like `=1.2.3`.","Remove the field entirely if you do not need to constrain the astrid toolchain version.","Validate locally with `semver` tooling (or `cargo add`-style checks) before re-running the distro build."],"exampleFix":"# before\n[distro]\nastrid-version = \"latest\"\n\n# after\n[distro]\nastrid-version = \"^1.4\"","handlingStrategy":"validation","validationCode":"fn valid_astrid_version(av: &str) -> bool {\n    av.is_empty() || semver::VersionReq::parse(av).is_ok()\n}\nif let Some(av) = &manifest.distro.astrid_version {\n    assert!(valid_astrid_version(av), \"astrid-version '{}' is not a semver requirement\", av);\n}","typeGuard":"fn is_semver_req(s: &str) -> bool {\n    semver::VersionReq::parse(s).is_ok()\n}","tryCatchPattern":"match build_distro(&manifest) {\n    Err(e) if e.to_string().contains(\"is not a valid semver requirement\") => {\n        eprintln!(\"fix distro.astrid-version: {e}\");\n    }\n    Err(e) => return Err(e),\n    Ok(d) => d,\n}","preventionTips":["Keep astrid-version as a requirement expression (^, =, >=), never a tag or branch name","Lint manifest files with a semver-requirement check in CI","Copy requirements from Cargo-style examples known to parse"],"tags":["cli","manifest","semver","validation"],"backgroundTag":"invalid-config-value","analyzedSha":"affd8760f44190dbdfbec23403f4c4b642c33112","analyzedAt":"2026-09-09T21:28:12.402Z","contentChangedAt":"2026-09-09T21:28:12.402Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}