vectordotdev/vector · error

Conflicting enacted entry for

Error message

Conflicting enacted entry for '{}': already recorded as removed in {}, refusing to record as removed in {}

What it means

`append_enacted` records a deprecation as removed in the enacted JSON. If an entry with the same `what` already exists but records a different `removed_in` version, the data is contradictory, and it bails rather than silently overwriting history. The message shows both versions.

Solutions

  1. Decide which removed_in version is correct and update the fragment to match the enacted JSON
  2. Or correct the enacted JSON by hand to the right version if the recorded one was wrong
  3. Revert the fragment edit (`git checkout changelog.d/<file>`) if it was unintentional
  4. Re-run the sync once the versions agree

Example fix

// before (fragment edited)
removed_in: 0.49.0   # enacted JSON says 0.48.0
// after
removed_in: 0.48.0   # match existing enacted entry, or update JSON deliberately
Defensive patterns

Strategy: validation

Validate before calling

// before appending, confirm the fragment matches the enacted record
let existing = json.deprecations_enacted.iter().find(|e| e.what == fragment.what);
if let Some(e) = existing {
    assert_eq!(e.removed_in, fragment.removed_in, "removed_in conflict for {}", fragment.what);
}

Try / catch

match result {
    Err(e) if e.to_string().contains("Conflicting enacted entry") => {
        // reconcile fragment vs JSON, then retry
    }
    other => other?,
}

Prevention

When it happens

Trigger: Calling `append_enacted` for a fragment whose `what` matches an existing enacted entry but whose `removed_in` differs — typically after editing the fragment's removed_in after it was already enacted.

Common situations: Editing a fragment's removal version after the deprecation was enacted; merging branches that enacted the same deprecation with different versions; a typo in the fragment's version number.

Understand the failure class

Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.

Related errors


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

Appendix: source

Thrown at vdev/src/utils/deprecation.rs:292

/// Append an enacted entry and regenerate the pending section from deprecation.d/.
///
/// Idempotent only on a byte-for-byte duplicate: silently skips the append
/// so that re-running `enact` after a partial failure (e.g. the fragment
/// delete failed) can complete cleanly. Any mismatch in `removed_in`,
/// `deprecated_since`, or `description` is rejected — those signal a stale
/// or edited fragment versus the recorded entry, and silently keeping the
/// older record would lose the new data.
pub fn append_enacted(repo_root: &Path, entry: EnactedEntry) -> Result<()> {
    let dir = repo_root.join(DEPRECATION_DIR);
    let pending = read_deprecation_fragments(&dir)?;
    let mut data = read_json(repo_root)?;
    if let Some(existing) = data
        .deprecations_enacted
        .iter()
        .find(|e| e.what == entry.what)
    {
        if existing.removed_in != entry.removed_in {
            bail!(
                "Conflicting enacted entry for '{}': already recorded as removed in {}, refusing to record as removed in {}",
                entry.what,
                existing.removed_in,
                entry.removed_in
            );
        }
        if existing.deprecated_since != entry.deprecated_since
            || existing.description != entry.description
        {
            bail!(
                "Mismatched enacted entry for '{}': the existing record in {} differs from the fragment data \
                 (deprecated_since or description). \
                 Either revert the fragment edit or update the enacted JSON by hand.",
                entry.what,
                existing.removed_in,
            );
        }
        // Byte-for-byte duplicate; rewrite pending so a partial failure can

View on GitHub (pinned to bdb87aeaa4)