{"record":{"id":"8d78e09c6ce91d98","repo":"astrid-runtime/astrid","slug":"distro-version-is-not-valid-semver","errorCode":null,"errorMessage":"distro.version '{}' is not valid semver","messagePattern":"distro\\.version '(.+?)' is not valid semver","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-cli/src/commands/distro/validate.rs","lineNumber":96,"sourceCode":"    // Schema version.\n    if manifest.schema_version != SCHEMA_VERSION {\n        anyhow::bail!(\n            \"unsupported schema-version {} (expected {SCHEMA_VERSION})\",\n            manifest.schema_version,\n        );\n    }\n\n    // Distro ID format.\n    if !is_valid_id(&manifest.distro.id) {\n        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\",","sourceCodeStart":78,"sourceCodeEnd":114,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-cli/src/commands/distro/validate.rs#L78-L114","documentation":"validate_manifest parses distro.version with the semver crate and rejects values that are not valid semantic versions. Downstream tooling (comparison, lock files, update checks) depends on strict semver.","triggerScenarios":"Distro.toml with a version like \"1.0\", \"v1.2.3\", \"1.2.3-beta\" missing a valid prerelease form, or any free-form string.","commonSituations":"Omitting the patch segment; prefixing with 'v'; using dates or build strings as versions; typos like \"1..2\".","solutions":["Rewrite distro.version as a full semver string (MAJOR.MINOR.PATCH, optional -prerelease)","Remove a leading 'v' or other non-numeric prefixes","Validate locally with any semver checker before re-parsing"],"exampleFix":"// before\n// [distro]\n// version = \"v1.0\"\n// after\n// [distro]\n// version = \"1.0.0\"","handlingStrategy":"validation","validationCode":"if semver::Version::parse(&manifest.distro.version).is_err() {\n    return Err(anyhow!(\"distro.version is not valid semver\"));\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always use full MAJOR.MINOR.PATCH versions","Strip 'v' prefixes and other decorations from version fields","Validate versions with a semver linter in CI"],"tags":["validation","semver","manifest","version"],"backgroundTag":"invalid-argument-format","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"}