{"record":{"id":"6821112ce4ac82d5","repo":"vectordotdev/vector","slug":"invalid-fragment-filename-filename-expected-unique-name","errorCode":null,"errorMessage":"invalid fragment filename '{filename}': expected '<unique_name>.<fragment_type>.md'","messagePattern":"invalid fragment filename '(.+?)': expected '<unique_name>\\.<fragment_type>\\.md'","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"vdev/src/commands/check/changelog_fragments.rs","lineNumber":169,"sourceCode":"    let out = git::run_and_check_output(&[\n        \"diff\",\n        \"--name-only\",\n        &filter_arg,\n        \"--merge-base\",\n        merge_base,\n        CHANGELOG_DIR,\n    ])?;\n    Ok(out\n        .lines()\n        .filter(|l| !l.trim().is_empty())\n        .map(PathBuf::from)\n        .collect())\n}\n\nfn validate_filename(filename: &str) -> Result<&'static FragmentType> {\n    let parts: Vec<&str> = filename.split('.').collect();\n    if parts.len() != 3 {\n        bail!(\n            \"invalid fragment filename '{filename}': expected '<unique_name>.<fragment_type>.md'\"\n        );\n    }\n    let fragment_type = parts[1];\n    let Some(known) = FRAGMENT_TYPES.iter().find(|t| t.name == fragment_type) else {\n        bail!(\n            \"invalid fragment filename '{filename}': fragment type must be one of ({}).\",\n            FRAGMENT_TYPES\n                .iter()\n                .map(|t| t.name)\n                .collect::<Vec<_>>()\n                .join(\"|\")\n        );\n    };\n    if parts[2] != \"md\" {\n        bail!(\"invalid fragment filename '{filename}': extension must be markdown (.md).\");\n    }\n    Ok(known)","sourceCodeStart":151,"sourceCodeEnd":187,"githubUrl":"https://github.com/vectordotdev/vector/blob/bdb87aeaa4c4ff27c0ba643c1c77b21bf2ef4013/vdev/src/commands/check/changelog_fragments.rs#L151-L187","documentation":"A file in the changelog fragments directory does not follow the required naming pattern `<unique_name>.<fragment_type>.md` (exactly three dot-separated parts). The checker cannot infer the fragment type from the filename, so validation aborts.","triggerScenarios":"Running `vdev check changelog-fragments` when a file in changelog.d/ has a name that doesn't split into exactly three dot-separated segments, e.g. `my-change.md`, `my.change.md.bak`, or `feature.new-feature.md.txt`.","commonSituations":"Manually creating a fragment without using the scaffolder; renaming a fragment with a text editor that appends `.txt` or `.bak`; editors leaving swap files in changelog.d/.","solutions":["Rename the file to `your_name.fragment_type.md`, e.g. `jdoe.new-feature.md`.","Remove any editor backup/swap files from the changelog.d directory.","Use the scaffolder command to generate a correctly named fragment."],"exampleFix":"// before\nchangelog.d/my-change.md\n// after\nchangelog.d/jdoe.new-feature.md","handlingStrategy":"validation","validationCode":"const FRAGMENT_TYPES: [&str; 5] = [\"new-feature\", \"enhancement\", \"bugfix\", \"breaking\", \"deprecation\"];\nfor f in std::fs::read_dir(\"changelog.d\")? {\n    let name = f?.file_name().to_string_lossy().into_owned();\n    let parts: Vec<&str> = name.split('.').collect();\n    assert_eq!(parts.len(), 3, \"bad fragment filename: {name}\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always use the scaffolder command to create fragments.","Never rename fragments by hand; keep the three-part `<name>.<type>.md` shape.","Configure editors to keep backup/swap files out of changelog.d/."],"tags":["rust","changelog","naming","ci"],"backgroundTag":"invalid-argument-format","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"}