{"record":{"id":"4bba521002abd9e0","repo":"vectordotdev/vector","slug":"invalid-fragment-contents-for-filename-authors-line-has-no","errorCode":null,"errorMessage":"invalid fragment contents for '{filename}': authors line has no names.","messagePattern":"invalid fragment contents for '(.+?)': authors line has no names\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"vdev/src/commands/check/changelog_fragments.rs","lineNumber":207,"sourceCode":"\nfn validate_contents(\n    path: &std::path::Path,\n    filename: &str,\n    fragment_type: &FragmentType,\n) -> Result<()> {\n    let content = std::fs::read_to_string(path)?;\n    // Match generate_cue.rs, which reads `lines().last()` verbatim: the authors\n    // line must be the last line, no trailing blank lines allowed.\n    let last_line = content.lines().last().unwrap_or(\"\");\n\n    let Some(names) = last_line.strip_prefix(\"authors: \") else {\n        bail!(\n            \"invalid fragment contents for '{filename}': last line must be 'authors: <name> [<name> ...]' (no trailing blank lines).\"\n        );\n    };\n    let names = names.trim();\n    if names.is_empty() {\n        bail!(\"invalid fragment contents for '{filename}': authors line has no names.\");\n    }\n    if names.contains('@') {\n        bail!(\n            \"invalid fragment contents for '{filename}': author names should not be prefixed with '@'.\"\n        );\n    }\n    if names.contains(',') {\n        bail!(\n            \"invalid fragment contents for '{filename}': authors should be space delimited, not comma delimited.\"\n        );\n    }\n    if names.split_whitespace().any(|n| n == TODO_HANDLE) {\n        bail!(\n            \"invalid fragment contents for '{filename}': the scaffolder placeholder '{TODO_HANDLE}' must be replaced with a real GitHub handle.\"\n        );\n    }\n\n    // Reject any scaffolded body placeholder that the author forgot to fill in.","sourceCodeStart":189,"sourceCodeEnd":225,"githubUrl":"https://github.com/vectordotdev/vector/blob/bdb87aeaa4c4ff27c0ba643c1c77b21bf2ef4013/vdev/src/commands/check/changelog_fragments.rs#L189-L225","documentation":"The fragment's authors line parsed successfully but contained no actual names after trimming (e.g. `authors:` followed by nothing, or only whitespace). Release attribution requires at least one author.","triggerScenarios":"Running `vdev check changelog-fragments` when the last line is exactly `authors: ` or `authors:` — the prefix stripped and the remainder trimmed to empty.","commonSituations":"Deleting the placeholder handle from the scaffold without replacing it; scaffolder TODO placeholder removed but no handle typed in; trailing whitespace after `authors:`.","solutions":["Add at least one GitHub handle after `authors:`, e.g. `authors: jdoe`.","If multiple authors, separate them with spaces: `authors: jdoe asmith`.","Replace any leftover placeholder with a real handle (also see the TODO_HANDLE check)."],"exampleFix":"// before\nauthors: \n// after\nauthors: jdoe","handlingStrategy":"validation","validationCode":"let last = std::fs::read_to_string(path)?.lines().last().unwrap_or(\"\");\nlet names = last.strip_prefix(\"authors: \").unwrap_or(\"\").trim();\nassert!(!names.is_empty(), \"authors line has no names\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always replace the scaffold's authors placeholder with a real handle immediately after scaffolding.","Never delete the authors line's value while keeping the line.","Grep for `authors:\\s*$` in changelog.d before pushing."],"tags":["rust","changelog","validation","ci"],"backgroundTag":"empty-required-field","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"}