vectordotdev/vector · error

invalid breaking fragment

Error message

invalid breaking fragment '{name}': {e}

What it means

Wrapper error from validate_breaking_anchor_set: while collecting anchor ids from all '*.breaking.md' fragments to detect duplicates/collisions, parsing one fragment's internal structure failed, and the underlying parse error {e} (from the section parser) is re-bailed prefixed with the fragment's name so the author knows which file is malformed.

Solutions

  1. Read the trailing {e} detail to identify the structural problem in the named fragment
  2. Fix the fragment to match the required H1/## Summary/## Migration layout
  3. Re-run vdev check changelog-fragments to confirm the anchor set is consistent
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at vdev/src/commands/check/changelog_fragments.rs:129 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at vdev/src/commands/check/changelog_fragments.rs:129

        // `<name>.<type>.md` shape first so editor backups or disabled files such as
        // `foo.breaking.md.bak` are skipped, matching release generation.
        let parts: Vec<&str> = name.split('.').collect();
        if parts.len() != 3 || parts[2] != "md" {
            continue;
        }
        let fragment_type = parts[1];
        let Some(entry) = FRAGMENT_TYPES.iter().find(|t| t.name == fragment_type) else {
            continue;
        };
        if !entry.breaking {
            continue;
        }
        let content = std::fs::read_to_string(&path)?;
        let body_before_authors = content
            .rsplit_once("\nauthors: ")
            .map_or(content.as_str(), |(before, _)| before);
        let sections = parse_breaking_sections(body_before_authors)
            .map_err(|e| anyhow::anyhow!("invalid breaking fragment '{name}': {e}"))?;
        let anchor = sections.anchor.unwrap_or_else(|| slugify(&sections.title));
        if !is_valid_anchor(&anchor) {
            bail!(
                "invalid breaking fragment '{name}': derived anchor '{anchor}' is not a valid kebab-case slug (add an explicit `{{#some-slug}}` after the title)."
            );
        }
        if let Some(other) = seen.insert(anchor.clone(), name.clone()) {
            bail!(
                "duplicate upgrade-guide anchor '#{anchor}' shared by breaking fragments '{other}' and '{name}'. Override one with an explicit `{{#unique-slug}}`."
            );
        }
    }
    Ok(())
}

/// `git diff --name-only --diff-filter=<filter> --merge-base <merge_base> changelog.d`
///
/// `filter` is a `git diff` `--diff-filter` value: `A` for added-only, `M` for

View on GitHub (pinned to bdb87aeaa4)