vectordotdev/vector · error

Mismatched enacted entry for

Error message

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.

What it means

After confirming removed_in matches, `append_enacted` also compares `deprecated_since` and `description` between the existing enacted entry and the fragment. Any mismatch means the fragment was edited after enactment, and it bails, instructing the developer to either revert the edit or hand-edit the enacted JSON.

Solutions

  1. Revert the fragment edit so it matches the enacted JSON (git checkout the file)
  2. Or deliberately update the deprecated_since/description in the enacted JSON to the new values
  3. Keep descriptions stable after enactment; add corrections in a separate change
  4. Re-run the deprecation sync to confirm consistency

Example fix

// before (fragment edited post-enactment)
description: "The `data_dir` option is deprecated"
// after
description: "original enacted description text"  # or update the JSON by hand
Defensive patterns

Strategy: validation

Validate before calling

if let Some(existing) = json.deprecations_enacted.iter().find(|e| e.what == fragment.what) {
    assert_eq!(existing.deprecated_since, fragment.deprecated_since);
    assert_eq!(existing.description, fragment.description);
}

Try / catch

match result {
    Err(e) if e.to_string().contains("Mismatched enacted entry") => {
        // revert fragment edit or update enacted JSON by hand, then retry
    }
    other => other?,
}

Prevention

When it happens

Trigger: Calling `append_enacted` when an entry with the same `what` exists and its deprecated_since or description differs from the fragment's frontmatter values.

Common situations: Rephrasing a fragment's description after the deprecation was already recorded; changing the version a feature was deprecated since; merge conflicts resolved inconsistently between fragment and JSON.

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/e8947114578a8c3b. Report an issue: GitHub.

Appendix: source

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

    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
        // recover, but don't push the entry again.
    } else {
        data.deprecations_enacted.push(entry);
    }
    sort_enacted(&mut data.deprecations_enacted);
    data.deprecations_pending = pending_excluding_enacted(&pending, &data.deprecations_enacted);
    write_json(repo_root, &data)
}

/// Sort enacted deprecations so generated output has a stable order.

View on GitHub (pinned to bdb87aeaa4)