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
- Revert the fragment edit so it matches the enacted JSON (git checkout the file)
- Or deliberately update the deprecated_since/description in the enacted JSON to the new values
- Keep descriptions stable after enactment; add corrections in a separate change
- 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
- Treat enacted fragments as immutable; fix descriptions via a separate follow-up change
- Bump versions wholesale via scripts so fragment and JSON stay in lockstep
- Review merge resolutions touching both changelog.d and the enacted JSON together
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
- Conflicting enacted entry for
- Enacted entry ' ' has removed_in ( ) that is not in a later…
- Could not find version
- Deprecation fragment
- Deprecation fragment
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)