{"record":{"id":"0212b5e30f606d6a","repo":"dbt-labs/dbt-core","slug":"unsupported-pre-release-lane-lane-str-in-semv","errorCode":null,"errorMessage":"unsupported pre-release lane {lane_str:?} in {semver:?}; accepted: alpha, beta, rc, preview, dev","messagePattern":"unsupported pre-release lane (.+?) in (.+?); accepted: alpha, beta, rc, preview, dev","errorType":"validation","errorClass":"anyhow","httpStatus":null,"severity":"error","filePath":"crates/dbt-ci/src/release_version.rs","lineNumber":71,"sourceCode":"    let parts: Vec<&str> = base.split('.').collect();\n    let well_formed = parts.len() == 3\n        && parts\n            .iter()\n            .all(|p| !p.is_empty() && p.chars().all(|c| c.is_ascii_digit()));\n    if !well_formed {\n        bail!(\"expected X.Y.Z, got {base:?} in {semver:?}\");\n    }\n    let Some(pre) = pre else {\n        return Ok(ParsedReleaseVersion {\n            base,\n            prerelease: None,\n        });\n    };\n    let (lane_str, number) = pre\n        .split_once('.')\n        .ok_or_else(|| anyhow!(\"expected `<lane>.N` after `-`, got {pre:?} in {semver:?}\"))?;\n    let lane = PreReleaseLane::parse(lane_str).ok_or_else(|| {\n        anyhow!(\n            \"unsupported pre-release lane {lane_str:?} in {semver:?}; \\\n             accepted: alpha, beta, rc, preview, dev\"\n        )\n    })?;\n    if number.is_empty() || !number.chars().all(|c| c.is_ascii_digit()) {\n        bail!(\"expected integer after `{lane_str}.`, got {number:?} in {semver:?}\");\n    }\n    Ok(ParsedReleaseVersion {\n        base,\n        prerelease: Some((lane, number)),\n    })\n}\n\npub(crate) fn validate_release_version(semver: &str) -> Result<()> {\n    parse_release_version(semver).map(|_| ())\n}\n\npub(crate) fn semver_to_pep440(semver: &str) -> Result<String> {","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/dbt-labs/dbt-core/blob/0267ce9170576975b76b64ce856b2e5848e96617/crates/dbt-ci/src/release_version.rs#L53-L89","documentation":"parse_release_version only accepts pre-release lanes alpha, beta, rc, preview, dev. When the text before the dot in the pre-release suffix matches none of these lanes, this error is thrown listing the accepted values. It exists to keep the semver-to-PEP 440 mapping deterministic for PyPI.","triggerScenarios":"Calling parse_release_version / semver_to_pep440 / validate_release_version with an unknown lane such as `1.2.3-nightly.1`, `1.2.3-canary.3`, or `1.2.3-snapshot.0`.","commonSituations":"Teams using CI tools that emit `nightly` or `snapshot` pre-releases; porting conventions from npm (`next`, `canary`) into Python release tooling; typos like `alph.1`.","solutions":["Rename the pre-release lane to one of: alpha, beta, rc, preview, dev.","Map custom lanes (e.g. nightly → dev) before passing the version in.","If new lanes are genuinely needed, extend PreReleaseLane::parse rather than passing an unsupported lane."],"exampleFix":"// before\nlet v = parse_release_version(\"1.2.3-nightly.7\")?;\n\n// after\nlet v = parse_release_version(\"1.2.3-dev.7\")?;","handlingStrategy":"validation","validationCode":"ALLOWED_LANES = {\"alpha\", \"beta\", \"rc\", \"preview\", \"dev\"}\npre = version.split(\"-\", 1)[-1].split(\".\", 1)[0]\nassert pre in ALLOWED_LANES, f\"lane {pre!r} not in {sorted(ALLOWED_LANES)}\"","typeGuard":"def has_supported_lane(v: str) -> bool:\n    return v.split(\"-\", 1)[-1].split(\".\", 1)[0] in {\"alpha\", \"beta\", \"rc\", \"preview\", \"dev\"}","tryCatchPattern":"match parse_release_version(&version) {\n    Err(e) if e.to_string().contains(\"unsupported pre-release lane\") => map_custom_lane(&version),\n    other => other,\n}","preventionTips":["Translate tool-specific lanes (nightly/snapshot) to dev/alpha before releasing","Add a pre-commit or CI check on version strings","Keep a single VERSION source of truth with lane validation"],"tags":["versioning","semver","validation","release"],"backgroundTag":"unsupported-enum-value","analyzedSha":"0267ce9170576975b76b64ce856b2e5848e96617","analyzedAt":"2026-09-07T21:53:39.732Z","contentChangedAt":"2026-09-07T21:53:39.732Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}