{"record":{"id":"276527609a559261","repo":"vectordotdev/vector","slug":"too-many-changelog-fragments","errorCode":null,"errorMessage":"Too many changelog fragments ({} > {}).","messagePattern":"Too many changelog fragments \\((.+?) > (.+?)\\)\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"vdev/src/commands/check/changelog_fragments.rs","lineNumber":59,"sourceCode":"\n        // The gate \"did the PR add a new fragment?\" uses A (added) only — modifying an\n        // existing on-master fragment doesn't count toward the required changelog entry.\n        // Schema validation, on the other hand, must see M (modified) fragments too.\n        let is_real_fragment =\n            |p: &PathBuf| p.file_name().and_then(|s| s.to_str()) != Some(\"README.md\");\n        let added_real: Vec<PathBuf> = diff_fragments(&self.merge_base, \"A\")?\n            .into_iter()\n            .filter(is_real_fragment)\n            .collect();\n        if added_real.is_empty() {\n            bail!(\n                \"No changelog fragments detected. \\\n                 If no changes necessitate user-facing explanations, add the 'no-changelog' label. \\\n                 Otherwise, add fragments to {CHANGELOG_DIR}/ (see {CHANGELOG_DIR}/README.md).\"\n            );\n        }\n        if added_real.len() > self.max_fragments {\n            bail!(\n                \"Too many changelog fragments ({} > {}).\",\n                added_real.len(),\n                self.max_fragments\n            );\n        }\n\n        // Every touched fragment (added or modified) must pass the schema check.\n        let modified: Vec<PathBuf> = diff_fragments(&self.merge_base, \"M\")?\n            .into_iter()\n            .filter(is_real_fragment)\n            .collect();\n        let expected_parent = std::path::Path::new(CHANGELOG_DIR);\n        for path in added_real.iter().chain(modified.iter()) {\n            let Some(name) = path.file_name().and_then(|s| s.to_str()) else {\n                bail!(\"Unexpected fragment path: {}\", path.display());\n            };\n            if path.parent() != Some(expected_parent) {\n                bail!(","sourceCodeStart":41,"sourceCodeEnd":77,"githubUrl":"https://github.com/vectordotdev/vector/blob/bdb87aeaa4c4ff27c0ba643c1c77b21bf2ef4013/vdev/src/commands/check/changelog_fragments.rs#L41-L77","documentation":"To keep release notes digestible, the checker caps how many new fragments a single PR may add (configurable via max_fragments). It bails when the count of added, non-README fragments exceeds that cap.","triggerScenarios":"Running the check on a PR whose diff vs. merge base adds more than max_fragments fragment files to changelog.d/ in one branch.","commonSituations":"Bundling many unrelated features/fixes into one PR; bulk-adding fragments when squashing several branches into one; forgetting to raise max_fragments for intentional mega-PRs (e.g. dependency sweeps).","solutions":["Split the PR into smaller PRs, each with a few fragments (most likely correct fix)","If the bulk addition is intentional, increase max_fragments in the check invocation/config","Consolidate several fragments covering one change into a single fragment"],"exampleFix":"// before\nvdev check changelog-fragments  // 12 fragments > default max\n// after (intentional bulk add)\nvdev check changelog-fragments --max-fragments 20","handlingStrategy":"validation","validationCode":"const added = listAddedFragments(mergeBase);\nif (added.length > maxFragments) splitPullRequest(added);","typeGuard":null,"tryCatchPattern":"try { runCheck(); } catch (e) { const m = /Too many changelog fragments \\((\\d+) > (\\d+)\\)/.exec(e.message); if (m) bumpMaxFragmentsOrSplitPr(); else throw e; }","preventionTips":["Keep PRs small; one PR per logical change","Plan fragment counts before opening large PRs","Configure max_fragments explicitly for intentional bulk PRs"],"tags":["ci","changelog","policy"],"backgroundTag":"file-size-limit-exceeded","analyzedSha":"bdb87aeaa4c4ff27c0ba643c1c77b21bf2ef4013","analyzedAt":"2026-09-16T02:53:35.741Z","contentChangedAt":"2026-09-16T02:53:35.741Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}