Skip to content

bug(ci): the harness instructs sessions to add a Co-authored-by trailer the project forbids and this gate rejects #17719

Open

Description

@mrveiss

What

Four commits on main carry Co-authored-by: Claude <noreply@anthropic.com>:

1c00b680ef2eab32183fd1e3a7ef085d96172e34  fix(plugins)/docs(redis) ...
31a01bdb387f4aba774f8837761eeb90f1af1d5d
b0f3ac188c81f4462cd4df1b07d5d99a5a12b0cd
c9b412b4481c07cfaa3c0695ea24a5a44c17eee8

They blocked the v0.10.0 promotion (#17717) alongfive five unrelated identity-trailer commits, and they are not the same defect. A misconfigured user.name is an artefact claiming no attribution; Co-authored-by: Claude is a real attribution claim — the thing no-commit-trailers.yml (#13654) exists to reject. #17718 baselined the five and deliberately held these four for that reason.

The cause is a standing instruction, not a mistake

The agent harness tells each session, in its own system context, to append an attribution trailer to every commit it creates — Co-Authored-By: Claude …. The project's rules forbid commit trailers entirely (mrveiss is sole author) and this gate enforces that.

So a session that follows its harness instruction produces a commit this repository rejects, and a session that follows the project rule ignores its harness instruction. Both are "doing as told". The harness text does defer — it says a project's own instructions take precedence — but that deference is a sentence inside the same block as the instruction, and it is being missed.

This is why baselining these four would not have helped. The five identity trailers are bounded: the user.name override is gone, checked across every worktree config and the global, so no new ones are being minted. This class has no such closure — every future session is instructed to produce it. A baseline entry per instance is an unbounded list, and the file's own header forbids exactly that.

What makes it expensive

It is invisible until a release. no-commit-trailers.yml scans BASE..HEAD on pull_request, and a squash-created trailer does not exist in that range — so per-PR checks pass and only a promotion PR sees it. Nine commits accumulated before anyone noticed, across two unrelated causes, and the release was the thing that stopped.

Acceptance criteria

  • Sessions do not append the attribution trailer to commits in this repository — by whatever mechanism reaches them reliably, not by each session remembering. A rule that is deferred-to inside the same text that states the instruction has already been shown not to reach every reader
  • The four commits above are resolved by an explicit ruling — baselined as their own class with the reasoning written down, or accepted as permanently-red-at-promotion, not left implicit
  • A check that a project-level no-trailers rule and a harness-level attribution instruction cannot both be satisfied is surfaced at commit time, not at promotion. The pre-commit hook chain already runs lint-conventions; this is the same class of check
  • Whether Generated with [Claude Code] in PR bodies is in scope is decided — the gate's own comment mentions it, and PR bodies are not commits

Not claimed

I have not established whether any session is currently adding the trailer, or whether all four predate a correction. I checked the t identity source and found it closed; I did not run the equivalent check for this one, because "is any session currently instructed to do this" is not answerable from the repository.

Refs #17717
Refs #17718
Refs #13654

Activity

  1. mrveiss commented on Oct 3, 2026

    @mrveiss
    OwnerAuthor

    Screening result: live — and the instruction is also issued from inside this repo, which changes the fix

    This issue attributes the cause to the harness: "The agent harness tells each session, in its own system context, to append an attribution trailer." That is true, and it is not the whole cause. Two files in this repository instruct the same trailer, in a git commit -m template a session is meant to copy:

    • .claude/skills/bugfix/SKILL.md:192
    • autobot-backend/skills/builtin/bugfix/SKILL.md:192

    Both carry, inside a fenced bash block that begins git commit -m "fix: <concise description…:

    Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>"
    

    The closing quote is the commit message's — so the trailer is part of the template body, not an aside. A session following the bugfix skill produces a commit no-commit-trailers.yml rejects, without ever consulting its harness context.

    Why this matters for the fix, not just the diagnosis. The issue's conclusion is that baselining cannot help because "every future session is instructed to produce it" and the instruction is unreachable from here. Half of it is reachable: two Markdown files in this tree, a bounded wording change, testable by a guard that greps the skill corpus for the gate's own coauthor_re. That is a different and much cheaper fix than a harness change nobody in this repo controls.

    On the harness half, first-hand confirmation. The issue says the harness "does defer — it says a project's own instructions take precedence — but that deference is a sentence inside the same block as the instruction, and it is being missed." I can confirm the deference clause exists and is explicit: this session received it verbatim tonight, stating that the user's own instructions about these lines — a CLAUDE.md or memory rule — take precedence over the reminder. So the harness text is not in conflict with the project rule; it defers to it. The failure is that the deference is easy to read past, exactly as this issue says.

    The four named SHAs are all still on main (1c00b680ef, 31a01bdb38, b0f3ac188c, c9b412b448 — each verified with git merge-base --is-ancestor), and the exemption baseline now parses to 31 entries, up from the nine described at filing.

    Scope

    This is an addition to this issue, not a new one — same defect, a second source, which belongs in the one place the fix lives rather than in a parallel issue. I have filed nothing and changed no code; this session is research-only.

    Found while screening #17721 / #17720 / #17719 as a cluster. The magnitude finding that bears on the other two is on #17720.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions