{"record":{"id":"3f1f1cd7de25820b","repo":"vectordotdev/vector","slug":"enacted-entry-has-removed-in-that-is-not-in-a-later-minor","errorCode":null,"errorMessage":"Enacted entry '{}' has removed_in ({}) that is not in a later minor release than deprecated_since ({}); the deprecation policy requires at least one minor release between announcement and removal.","messagePattern":"Enacted entry '(.+?)' has removed_in \\((.+?)\\) that is not in a later minor release than deprecated_since \\((.+?)\\); the deprecation policy requires at least one minor release between announcement and removal\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"vdev/src/utils/deprecation.rs","lineNumber":380,"sourceCode":"///     in different releases)\npub fn validate_enacted(repo_root: &Path) -> Result<usize> {\n    let enacted = read_enacted(repo_root)?;\n    let mut seen: std::collections::HashSet<String> = std::collections::HashSet::new();\n    for e in &enacted {\n        let dep = parse_strict_release(&e.deprecated_since).with_context(|| {\n            format!(\n                \"Enacted entry '{}' has invalid deprecated_since '{}'\",\n                e.what, e.deprecated_since\n            )\n        })?;\n        let rem = parse_strict_release(&e.removed_in).with_context(|| {\n            format!(\n                \"Enacted entry '{}' has invalid removed_in '{}'\",\n                e.what, e.removed_in\n            )\n        })?;\n        if !later_minor(&rem, &dep) {\n            bail!(\n                \"Enacted entry '{}' has removed_in ({}) that is not in a later minor release than deprecated_since ({}); the deprecation policy requires at least one minor release between announcement and removal.\",\n                e.what,\n                e.removed_in,\n                e.deprecated_since\n            );\n        }\n        if !seen.insert(e.what.clone()) {\n            bail!(\n                \"Duplicate enacted entry for '{}'; the same feature cannot be recorded as removed more than once.\",\n                e.what\n            );\n        }\n    }\n    Ok(enacted.len())\n}\n\n/// True when `a` is in a later major.minor release than `b`. Equal or smaller\n/// major.minor (regardless of patch) returns false.","sourceCodeStart":362,"sourceCodeEnd":398,"githubUrl":"https://github.com/vectordotdev/vector/blob/bdb87aeaa4c4ff27c0ba643c1c77b21bf2ef4013/vdev/src/utils/deprecation.rs#L362-L398","documentation":"`validate_enacted` enforces the deprecation policy: a feature must be announced for at least one minor release before removal. If parsed `removed_in` is not a strictly later minor than `deprecated_since` (checked via `later_minor`), it bails. This keeps removals from shipping in the same or earlier minor than the announcement.","triggerScenarios":"Calling `validate_enacted` (part of deprecation checks/tests) when an enacted entry has removed_in equal to, earlier than, or in the same minor as deprecated_since — including invalid prerelease versions that fail later_minor.","commonSituations":"Writing a fragment setting removed_in to the same release as deprecated_since; back-dating removed_in below deprecated_since during a version bump; using a prerelease version string that the comparison cannot order.","solutions":["Set removed_in to at least one minor release after deprecated_since (e.g. deprecated 0.45.0 -> removed 0.46.0 or later)","If deprecated_since is wrong, fix it to the release where the deprecation was actually announced","Remove prerelease suffixes from version fields so versions parse and compare correctly","Re-run the validation check after adjusting versions"],"exampleFix":"// before\n---\nwhat: old_option\ndeprecated_since: 0.47.0\nremoved_in: 0.47.0\n---\n// after\n---\nwhat: old_option\ndeprecated_since: 0.47.0\nremoved_in: 0.48.0\n---","handlingStrategy":"validation","validationCode":"fn later_minor(removed: (u64,u64), dep: (u64,u64)) -> bool {\n    removed.0 > dep.0 || (removed.0 == dep.0 && removed.1 > dep.1)\n}\nlet dep = (0, 47); let rem = (0, 48);\nassert!(later_minor(rem, dep), \"removed_in must be a later minor than deprecated_since\");","typeGuard":null,"tryCatchPattern":"match result {\n    Err(e) if e.to_string().contains(\"not in a later minor release\") => {\n        // bump removed_in (or fix deprecated_since) and re-validate\n    }\n    other => other?,\n}","preventionTips":["When writing fragments, always set removed_in at least one minor above deprecated_since","Double-check versions after automated version bumps in fragments","Avoid prerelease suffixes in deprecated_since/removed_in fields","Run the deprecation validation test suite before pushing"],"tags":["rust","deprecation","versioning","validation"],"backgroundTag":"invalid-date-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"}