vectordotdev/vector · error

removed_in ( ) must be in a later minor release than…

Error message

removed_in ({version}) must be in a later minor release than deprecated_since ({}); the deprecation policy requires at least one minor release between the announcement and removal. Check --version or the fragment's `deprecated_since` field.

What it means

Thrown by `cargo vdev deprecation enact` when the removal version (removed_in, from --version or the computed next release) is not a later minor release than the fragment's `deprecated_since`. Policy requires at least one full minor release between the deprecation announcement and its removal.

Solutions

  1. Pass a --version at least one minor greater than deprecated_since (e.g. deprecated_since 0.49 -> --version 0.50.0 or later).
  2. Fix the fragment's `deprecated_since` field if it was recorded incorrectly (it cannot be later than the removal).
  3. Omit --version so the tool defaults to next minor release and only proceed if that satisfies the policy.
  4. Wait for the required release cycle before enacting the deprecation.

Example fix

// before (deprecated_since = 0.49.0)
cargo vdev deprecation enact my-feature --version 0.49.0
// after
cargo vdev deprecation enact my-feature --version 0.50.0
Defensive patterns

Strategy: validation

Validate before calling

let removed: Version = version_str.parse()?;
let since: Version = fragment.deprecated_since.parse()?;
if !deprecation::later_minor(&removed, &since) { eprintln!("removed_in must be >= one minor after deprecated_since ({since})"); return; }

Type guard

fn removal_is_valid(removed: &Version, since: &Version) -> bool { deprecation::later_minor(removed, since) }

Try / catch

match result { Err(e) if e.to_string().contains("must be in a later minor release") => { eprintln!("Bump --version to at least the next minor after deprecated_since"); } Err(e) => return Err(e), Ok(v) => v }

Prevention

When it happens

Trigger: Calling enact where later_minor(&version, &entry.deprecated_since.0) is false — e.g. enacting for the same minor the fragment was announced in, or an earlier one.

Common situations: Occurs when a maintainer tries to remove a feature too soon after announcing it, or when --version is set to the current release rather than the next minor.

Understand the failure class

Background: "value must be between 0 and 1" / "out of range" / "must not be negative" errors: fixing range-validation failures across open-source libraries — this error's family across 42 libraries.

Related errors


AI-assisted analysis of vectordotdev/vector@bdb87aeaa4 (2026-09-16). Data as JSON: /api/errors/c921b58c114db929. Report an issue: GitHub.

Appendix: source

Thrown at vdev/src/commands/deprecation/enact.rs:64

            .find(|e| e.filename == filename)
            .ok_or_else(|| anyhow::anyhow!("Could not parse {filename}"))?;

        let version = if let Some(v) = self.version {
            // Reject `--version 0.58.0-alpha` and friends: only release-shaped
            // semver is valid here.
            if !v.pre.is_empty() || !v.build.is_empty() {
                bail!(
                    "--version {v} has prerelease or build metadata; only plain X.Y.Z is allowed"
                );
            }
            v
        } else {
            let latest = git::latest_release_version()?;
            Version::new(latest.major, latest.minor + 1, 0)
        };

        if !deprecation::later_minor(&version, &entry.deprecated_since.0) {
            bail!(
                "removed_in ({version}) must be in a later minor release than deprecated_since ({}); \
                 the deprecation policy requires at least one minor release between \
                 the announcement and removal. \
                 Check --version or the fragment's `deprecated_since` field.",
                entry.deprecated_since
            );
        }

        let enacted = deprecation::EnactedEntry {
            what: entry.what.clone(),
            deprecated_since: entry.deprecated_since.to_string(),
            removed_in: version.to_string(),
            description: entry.description.clone(),
        };

        // Append to enacted JSON.
        deprecation::append_enacted(&repo_root, enacted)?;
        println!("Recorded enacted entry for: {}", entry.what);

View on GitHub (pinned to bdb87aeaa4)