{"record":{"id":"7d5d05186c91b959","repo":"vectordotdev/vector","slug":"invalid-fragment-contents-for-filename-scaffolder","errorCode":null,"errorMessage":"invalid fragment contents for '{filename}': scaffolder placeholder line still present ({bad:?}). Replace it with real content.","messagePattern":"invalid fragment contents for '(.+?)': scaffolder placeholder line still present \\((.+?)\\)\\. Replace it with real content\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"vdev/src/commands/check/changelog_fragments.rs","lineNumber":229,"sourceCode":"            \"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.\n    // All templates start their placeholder lines with a literal `TODO ` at column 0,\n    // which is rare in real fragment text.\n    if let Some(bad) = content.lines().find(|l| l.starts_with(\"TODO \")) {\n        bail!(\n            \"invalid fragment contents for '{filename}': scaffolder placeholder line still present ({bad:?}). Replace it with real content.\"\n        );\n    }\n\n    if fragment_type.breaking {\n        validate_breaking_fragment(&content, filename)?;\n    }\n\n    Ok(())\n}\n\n/// Schema for `*.breaking.md`:\n///\n/// ```text\n/// # <Title> [{#optional-anchor}]\n///\n/// ## Summary\n///","sourceCodeStart":211,"sourceCodeEnd":247,"githubUrl":"https://github.com/vectordotdev/vector/blob/bdb87aeaa4c4ff27c0ba643c1c77b21bf2ef4013/vdev/src/commands/check/changelog_fragments.rs#L211-L247","documentation":"A line in the fragment body still starts with the literal `TODO ` at column 0, indicating an unfilled scaffolder placeholder. Templates deliberately mark template lines this way so the checker can reject incomplete fragments.","triggerScenarios":"Running `vdev check changelog-fragments` when any line of the fragment content begins with `TODO ` (the checker's heuristic for unfilled scaffold text).","commonSituations":"Committing a scaffolded fragment after filling only some sections; leaving a 'TODO describe the migration path' style line in a breaking fragment; writing genuine notes as a TODO line.","solutions":["Find the line starting with `TODO ` and replace it with real content.","Rephrase legitimate notes so they don't begin with `TODO ` at column 0 (e.g. indent or reword).","Use the error's reported line ({bad:?}) to locate the exact offending text."],"exampleFix":"// before\nTODO describe the breaking change.\n// after\nRemoved the `foo` option; migrate to `bar` before upgrading.","handlingStrategy":"validation","validationCode":"let content = std::fs::read_to_string(path)?;\nif let Some(bad) = content.lines().find(|l| l.starts_with(\"TODO \")) {\n    panic!(\"unfilled scaffold placeholder: {bad:?}\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Search your fragment for lines starting with `TODO ` before committing.","Complete every scaffolded section, or delete template lines you don't need.","Avoid starting genuine notes with `TODO ` at column 0 since it triggers the checker."],"tags":["rust","changelog","validation","ci"],"backgroundTag":"placeholder-not-replaced","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"}