Skip to content

source-control:commit: Co-Authored-By trailer default drifts three ways and the ladder never names the harness #1581

Description

@kyle-sexton

Problem

/source-control:commit mandates a trailer template with a required context clause:

Co-Authored-By: Claude <model> (<context>) <noreply@anthropic.com>

Three authorities disagree, and the skill's resolution ladder names only two of them.

1. Observed practice does not follow the mandate

Census over this repo's history (exact distinct trailer lines, tallied):

Window Trailers With a context clause Without
last 150 commits 137 57 (41.6%) 80
last 40 commits 33 4 (12.1%) 29

Compliance is not merely low, it is collapsing — 41.6% → 12.1% as the window narrows. The
context-free form is actively winning.

(The originating audit reported "62 of 74". That exact pair does not reproduce on any window of this
branch — at the window where the total is 74, the non-compliant count is 49. The figures are wrong;
the direction is right and the trend is worse than claimed.)

2. The harness injects a third form the ladder never accounts for

The Claude Code harness injects its own commit guidance into sessions, specifying a context-free
trailer. It is neither a config layer nor a project convention, so the skill's ladder
(trailer_policy → project conventions → skill default) has no rung for it and no stated tiebreak.
A session receiving both simply follows whichever it saw last.

Worse — and this is the part that matters most: the injected guidance carries a hardcoded model
name
. Observed first-hand this session: guidance naming Claude Fable 5 injected into a session
actually running Opus 5. Copying it verbatim writes a false provenance claim into durable git
history — exactly the harm the skill's own text says the template exists to prevent ("the trailer
becomes a git-history claim about which model / context authored the change").

3. Nothing overrides the default here

This repo's .claude/source-control.md declares no trailer_policy, so the skill's default is
nominally in force and silently ignored.

Fix

  • Make the context clause optional in the default template, matching the harness-injected shape
    and observed practice. A mandate nobody follows is worse than no mandate.
  • Add the harness-injected guidance as an explicit rung 3 in the trailer ladder, with the rule:
    adopt its shape, never its literal text — always fill <model> from actual session knowledge.
  • State the false-provenance hazard explicitly, since it is the concrete reason for that rule.

Deferred, deliberately

A second, unreported drift axis surfaced in the census: 134 of 137 trailers use
Co-authored-by:
(lowercase), against only 3 using the skill's Co-Authored-By:. Git preserves a
trailer key's case verbatim (git interpret-trailers does not normalize it, and no trailer.*
config here changes that), so both spellings persist as written.

Whether to standardize on the dominant lowercase spelling is not settled here: it would need a
verified claim about how the forge's co-author attribution parses the key, which this work did not
establish. Recorded as an open question rather than answered by assumption. The skill continues to
emit Co-Authored-By and does not rewrite an existing repository's spelling; a consumer wanting the
other form can express it as a trailer_policy template today.

Not a problem — verified

trailer_policy is already a fully documented key (reference/config-resolution.md), and
/source-control:setup already interviews for it and writes it. The audit's suggestion to "have
setup write an explicit trailer_policy" is already implemented; no change needed there.

Also confirmed as a deliberate prior decision not to disturb: guardrails'
block-noncanonical-commit.sh explicitly declines to gate on --trailer ("the trailer is POLICY,
not mechanic"). The remediation space is this skill's own ladder, not a new hook gate.

Activity

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

    needs-triageNot yet classified. Floor until a type and one priority tier are set.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions