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
- Decide which removed_in version is correct and update the fragment to match the enacted JSON
- Or correct the enacted JSON by hand to the right version if the recorded one was wrong
- Revert the fragment edit (`git checkout changelog.d/<file>`) if it was unintentional
- 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
- Do not edit a fragment after it has been enacted; version corrections belong in the JSON
- Keep fragment and enacted JSON changes in the same PR to avoid divergence
- When in conflict, prefer the enacted JSON's recorded history unless deliberately rewriting it
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
- Mismatched 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/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 canView on GitHub (pinned to bdb87aeaa4)