{"record":{"id":"295783cca7fbf10e","repo":"vectordotdev/vector","slug":"vrl-version-must-be-a-stable-semantic-version","errorCode":null,"errorMessage":"VRL version must be a stable semantic version","messagePattern":"VRL version must be a stable semantic version","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"vdev/src/commands/release/prepare.rs","lineNumber":49,"sourceCode":"}\n\nstruct Prepare {\n    new_vector_version: Version,\n    vrl_version: Version,\n    repo_root: PathBuf,\n    latest_vector_version: Version,\n    release_branch: String,\n    release_preparation_branch: String,\n    dry_run: bool,\n}\n\nimpl Cli {\n    pub fn exec(self) -> Result<()> {\n        if !self.version.pre.is_empty() || !self.version.build.is_empty() {\n            bail!(\"release version must be a stable semantic version\");\n        }\n        if !self.vrl_version.pre.is_empty() || !self.vrl_version.build.is_empty() {\n            bail!(\"VRL version must be a stable semantic version\");\n        }\n        let repo_root = paths::find_repo_root()?;\n        env::set_current_dir(&repo_root)?;\n\n        let prepare = Prepare {\n            new_vector_version: self.version.clone(),\n            vrl_version: self.vrl_version,\n            repo_root,\n            latest_vector_version: git::latest_release_version()?,\n            release_branch: format!(\"v{}.{}\", self.version.major, self.version.minor),\n            // Websites containing `website` will also generate website previews.\n            // Caveat is these branches can only contain alphanumeric chars and dashes.\n            release_preparation_branch: format!(\n                \"prepare-v-{}-{}-{}-website\",\n                self.version.major, self.version.minor, self.version.patch\n            ),\n            dry_run: self.dry_run,\n        };","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/vectordotdev/vector/blob/bdb87aeaa4c4ff27c0ba643c1c77b21bf2ef4013/vdev/src/commands/release/prepare.rs#L31-L67","documentation":"Same guard as the Vector version check, applied to the VRL version argument in `prepare::Cli::exec`: the pinned VRL version must be a stable semver release with no pre-release identifiers or build metadata.","triggerScenarios":"Running `vdev release prepare <vector-version> <vrl-version>` where the VRL version argument is a pre-release like `0.12.0-rc.1` or includes build metadata like `0.12.0+abc`.","commonSituations":"Pointing the release at a VRL RC to 'test' the pin, or copying a VRL version string from a development branch or git tag suffix.","solutions":["Pass a stable VRL release version, e.g. `vdev release prepare 0.46.0 0.12.0`.","Confirm the target VRL release exists on crates.io as a stable version before preparing.","If an RC pin is genuinely needed, do it outside the prepare command (it is rejected here by design)."],"exampleFix":"// before\n$ vdev release prepare 0.46.0 0.12.0-rc.2\nVRL version must be a stable semantic version\n// after\n$ vdev release prepare 0.46.0 0.12.0","handlingStrategy":"validation","validationCode":"// check the VRL version is a stable crates.io release\nconst stable = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$/.test(vrlVersion);\nif (!stable) throw new Error(`VRL version must be stable: ${vrlVersion}`);","typeGuard":null,"tryCatchPattern":"match prepare.exec() {\n    Err(e) if e.to_string().contains(\"VRL version must be a stable\") => {\n        eprintln!(\"use a published stable VRL release version\");\n    }\n    r => r?,\n}","preventionTips":["Confirm the VRL version exists on crates.io without pre-release tags.","Never pin RCs through the prepare command.","Keep a checklist of the two version arguments for release day."],"tags":["semver","vrl","release","cli"],"backgroundTag":"invalid-cli-argument","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"}