vectordotdev/vector · error

invalid fragment contents for

Error message

invalid fragment contents for '{filename}': the scaffolder placeholder '{TODO_HANDLE}' must be replaced with a real GitHub handle.

What it means

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.

Solutions

  1. Replace the placeholder token with your real GitHub handle on the authors line.
  2. Grep your fragment for the placeholder string before committing.
  3. Re-run `vdev check changelog-fragments` to confirm.

Example fix

// before
authors: your-github-handle
// after
authors: jdoe
Defensive patterns

Strategy: validation

Validate before calling

const TODO_HANDLE: &str = "your-github-handle";
let names = last.strip_prefix("authors: ").unwrap_or("").trim();
assert!(!names.split_whitespace().any(|n| n == TODO_HANDLE), "replace placeholder handle");

Prevention

When it happens

Trigger: Running `vdev check changelog-fragments` on a scaffolded fragment whose authors line still contains the scaffolder placeholder token (e.g. `authors: your-github-handle`).

Common situations: Committing a freshly scaffolded fragment without editing the authors line; forgetting the authors line while filling in the body.

Related errors


AI-assisted analysis of vectordotdev/vector@bdb87aeaa4 (2026-09-16). Data as JSON: /api/errors/82ccb10b2cbed3cd. Report an issue: GitHub.

Appendix: source

Thrown at vdev/src/commands/check/changelog_fragments.rs:220

            "invalid fragment contents for '{filename}': last line must be 'authors: <name> [<name> ...]' (no trailing blank lines)."
        );
    };
    let names = names.trim();
    if names.is_empty() {
        bail!("invalid fragment contents for '{filename}': authors line has no names.");
    }
    if names.contains('@') {
        bail!(
            "invalid fragment contents for '{filename}': author names should not be prefixed with '@'."
        );
    }
    if names.contains(',') {
        bail!(
            "invalid fragment contents for '{filename}': authors should be space delimited, not comma delimited."
        );
    }
    if names.split_whitespace().any(|n| n == TODO_HANDLE) {
        bail!(
            "invalid fragment contents for '{filename}': the scaffolder placeholder '{TODO_HANDLE}' must be replaced with a real GitHub handle."
        );
    }

    // Reject any scaffolded body placeholder that the author forgot to fill in.
    // All templates start their placeholder lines with a literal `TODO ` at column 0,
    // which is rare in real fragment text.
    if let Some(bad) = content.lines().find(|l| l.starts_with("TODO ")) {
        bail!(
            "invalid fragment contents for '{filename}': scaffolder placeholder line still present ({bad:?}). Replace it with real content."
        );
    }

    if fragment_type.breaking {
        validate_breaking_fragment(&content, filename)?;
    }

    Ok(())

View on GitHub (pinned to bdb87aeaa4)