{"record":{"id":"82ccb10b2cbed3cd","repo":"vectordotdev/vector","slug":"invalid-fragment-contents-for-filename-the-scaffolder","errorCode":null,"errorMessage":"invalid fragment contents for '{filename}': the scaffolder placeholder '{TODO_HANDLE}' must be replaced with a real GitHub handle.","messagePattern":"invalid fragment contents for '(.+?)': the scaffolder placeholder '(.+?)' must be replaced with a real GitHub handle\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"vdev/src/commands/check/changelog_fragments.rs","lineNumber":220,"sourceCode":"            \"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.\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(())","sourceCodeStart":202,"sourceCodeEnd":238,"githubUrl":"https://github.com/vectordotdev/vector/blob/bdb87aeaa4c4ff27c0ba643c1c77b21bf2ef4013/vdev/src/commands/check/changelog_fragments.rs#L202-L238","documentation":"A space-delimited token on the authors line still equals TODO_HANDLE — the placeholder the fragment scaffolder inserts. Real release attribution requires a genuine GitHub handle, so the check refuses unmodified scaffolds.","triggerScenarios":"Running `vdev check changelog-fragments` on a scaffolded fragment whose authors line still contains the scaffolder placeholder token (e.g. `authors: your-github-handle`).","commonSituations":"Committing a freshly scaffolded fragment without editing the authors line; forgetting the authors line while filling in the body.","solutions":["Replace the placeholder token with your real GitHub handle on the authors line.","Grep your fragment for the placeholder string before committing.","Re-run `vdev check changelog-fragments` to confirm."],"exampleFix":"// before\nauthors: your-github-handle\n// after\nauthors: jdoe","handlingStrategy":"validation","validationCode":"const TODO_HANDLE: &str = \"your-github-handle\";\nlet names = last.strip_prefix(\"authors: \").unwrap_or(\"\").trim();\nassert!(!names.split_whitespace().any(|n| n == TODO_HANDLE), \"replace placeholder handle\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Fill in the authors line immediately when scaffolding a fragment.","Never commit a scaffolded fragment unchanged.","Add a pre-commit grep for the placeholder handle in changelog.d/."],"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"}