{"record":{"id":"e0b0de052693a804","repo":"vectordotdev/vector","slug":"version-v-has-prerelease-or-build-metadata-only-plain-x-y-z","errorCode":null,"errorMessage":"--version {v} has prerelease or build metadata; only plain X.Y.Z is allowed","messagePattern":"--version (.+?) has prerelease or build metadata; only plain X\\.Y\\.Z is allowed","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"vdev/src/commands/deprecation/enact.rs","lineNumber":53,"sourceCode":"        let filename = format!(\"{stem}.md\");\n\n        let path = dir.join(&filename);\n        if !path.exists() {\n            bail!(\"No deprecation fragment found at {}\", path.display());\n        }\n\n        // Parse the fragment to get entry data.\n        let entries = deprecation::read_deprecation_fragments(&dir)?;\n        let entry = entries\n            .into_iter()\n            .find(|e| e.filename == filename)\n            .ok_or_else(|| anyhow::anyhow!(\"Could not parse {filename}\"))?;\n\n        let version = if let Some(v) = self.version {\n            // Reject `--version 0.58.0-alpha` and friends: only release-shaped\n            // semver is valid here.\n            if !v.pre.is_empty() || !v.build.is_empty() {\n                bail!(\n                    \"--version {v} has prerelease or build metadata; only plain X.Y.Z is allowed\"\n                );\n            }\n            v\n        } else {\n            let latest = git::latest_release_version()?;\n            Version::new(latest.major, latest.minor + 1, 0)\n        };\n\n        if !deprecation::later_minor(&version, &entry.deprecated_since.0) {\n            bail!(\n                \"removed_in ({version}) must be in a later minor release than deprecated_since ({}); \\\n                 the deprecation policy requires at least one minor release between \\\n                 the announcement and removal. \\\n                 Check --version or the fragment's `deprecated_since` field.\",\n                entry.deprecated_since\n            );\n        }","sourceCodeStart":35,"sourceCodeEnd":71,"githubUrl":"https://github.com/vectordotdev/vector/blob/bdb87aeaa4c4ff27c0ba643c1c77b21bf2ef4013/vdev/src/commands/deprecation/enact.rs#L35-L71","documentation":"Thrown by `cargo vdev deprecation enact` when --version is given as a semver with prerelease (e.g. -alpha) or build metadata. Only a plain release-shaped X.Y.Z version is a valid removal target for a deprecation.","triggerScenarios":"Running enact with `--version 0.58.0-alpha`, `--version 1.2.3+build.5`, etc. — v.pre or v.build is non-empty after parsing the Version.","commonSituations":"Copy-pasting a full semver from git tags or cargo output that includes prerelease/build suffixes, or scripting enact from a version string that was not normalized.","solutions":["Pass a plain X.Y.Z version: `cargo vdev deprecation enact <slug> --version 0.58.0`.","Strip prerelease/build metadata from the version string before invoking.","Omit --version entirely to let the command compute the next release from git::latest_release_version.","Validate your version input with a semver parser that rejects pre/build parts before calling."],"exampleFix":"// before\n--version 0.58.0-alpha.1\n// after\n--version 0.58.0","handlingStrategy":"validation","validationCode":"let v: Version = version_str.parse()?;\nif !v.pre.is_empty() || !v.build.is_empty() { eprintln!(\"use plain X.Y.Z, got {version_str}\"); return; }","typeGuard":"fn is_plain_release(v: &Version) -> bool { v.pre.is_empty() && v.build.is_empty() }","tryCatchPattern":"match result { Err(e) if e.to_string().contains(\"prerelease or build metadata\") => { eprintln!(\"Strip suffixes: 0.58.0-alpha -> 0.58.0\"); } Err(e) => return Err(e), Ok(v) => v }","preventionTips":["Normalize version strings from git tags/cargo before passing them","Omit --version to auto-select the next release","Write scripts that regex-validate ^\\d+\\.\\d+\\.\\d+$ before invoking"],"tags":["cli","semver","deprecation"],"backgroundTag":"invalid-argument-format","analyzedSha":"bdb87aeaa4c4ff27c0ba643c1c77b21bf2ef4013","analyzedAt":"2026-09-16T02:53:35.741Z","contentChangedAt":"2026-09-16T02:53:35.741Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}