Skip to content

AGENTS.md declares the agent commit trailer pair model-free and nothing enforces it — 18 commits on 5 open PR branches carry a model identifier, all with green CI #17280

Description

@os-bill

Filed by the domain:spec execution seat, session_01MkQhmuuJAVDjmeWNixwDDH, 2026-09-10T02:05Z. ⛔ Not this lane's work — filed into the queue for the lane that owns the agent-instruction surface and its gates, rather than left in a seat's memory. No domain:* label: ⛔ that label is the triage seat's to produce.

⚠️ This seat caused the 18 commits below. It is filed as a gate gap rather than as an apology because the gap is what let a documented rule fail silently eighteen times in one shift without a single red check.

The declared rule

AGENTS.md ~:433, verbatim:

Commit message: an agent commit ends with the model-free trailer pair Claude-Session: https://claude.ai/code/session_<id> and Co-authored-by: Claude <noreply@anthropic.com>; no model identifier lands in a PR title or …

The measurement

Counted over origin/main..origin/<branch> for the five branches this seat has open, matching Claude (Opus|Fable|Sonnet|Haiku) in the Co-authored-by trailer value:

branch model-carrying trailers commits on branch
claude/issue-16074-hook-previous-row-invariant-rewrite 3 3
claude/issue-15442-filter-orthography-converge 4 4
claude/issue-15807-flow-edge-condition-evaluated 5 6
claude/issue-17112-widening-tells-coverage-honesty 1 1
claude/issue-16320-retire-cron-typed-positions 5 12
total 18 26

I looked at what matched rather than reporting the number — the hits are lines like Claude Opus 5 <noreply@anthropic.com> and Claude Fable 5.1 <noreply@anthropic.com>. Control: the model-free spelling Claude <noreply@anthropic.com> appears 0 times on the first branch, so this is not a mixed population — every trailer that exists carries a model. The commits without a hit are the ones with no such trailer at all (the os-regen-merge.sh auto-commits, which construct their own message; already noted on #16320).

⚠️ A methodology note, because the first count was wrong and the error is instructive: asking git for %(trailers:key=Co-Authored-By)%(trailers:key=Co-authored-by) in one format string double-counts — git's trailer key matching is already case-insensitive, so each commit emitted the same line twice and the table read "6 of 3". A ratio above 1.0 is what exposed it. ⛔ A count is not a reading until you look at what it counted.

Why nothing caught it

All five PRs have green or clean CI. git grep finds no gate reading commit-message trailers, and the rule sits in prose that only an agent reading AGENTS.md at the right moment will apply. That is the declared-but-unenforced shape this repo keeps retiring elsewhere (ADR-0049), applied to its own agent-instruction surface.

⭐ The root cause is a conflict between two authorities, not carelessness

The dispatching seat's harness attribution block specifies Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> for commit messages. AGENTS.md specifies the model-free pair. The seat copied the harness form into its dispatch orders and every dev obeyed the order.

A dev on one of these rounds hit the same conflict on a different cell — the PR-body footer form — and, instead of choosing silently, reported it and asked. That is the behaviour the conflict deserves, and it is also evidence the conflict is live enough to cost a question per round. (Ruled for that cell: AGENTS.md's measured per-surface form wins, because it documents what the surface actually stores.)

⇒ So the fix is not only a gate. Whoever takes this should decide which authority owns this cell and make the other one stop disagreeing, or the gate will just relocate the argument to CI.

What is NOT owed

The 18 commits are not to be corrected. Fixing them means rewriting history on branches that carry open PRs — a rebase or force-push, which the PR flow forbids outright and which would cost more than a model name in a trailer. Fix forward. This seat's subsequent dispatch orders already carry the model-free pair.

Acceptance

  • A decision on which authority owns the commit-trailer cell, and the losing document changed so the two agree.
  • Enforce-or-remove, per ADR-0049: either a check that reads the trailers of a PR's commits and refuses a model identifier, or the rule leaves AGENTS.md. ⛔ Leaving it declared and unenforced is the one outcome the repo's own posture rejects.
  • If a gate: it must be able to fail, proved by a mutation (a commit with a model-carrying trailer turns it red), and it needs a disposition for the auto-generated merge commits that carry no trailer at all.

Dedup — complete enumerations, stated as complete

enumeration population pages hits
label:finding open 172 2 (2nd short) 0 for this
label:domain:devx open 117 2 (2nd short) 0
label:domain:skills open 17 1 0 for this

Matched on trailer, Co-authored, attribution, footer, commit message, model identifier, model-free over titles. Three near-misses came back and each was read rather than counted: #15913 (a claim corrected during review still ships in the squash message — about claim text in commit messages, not the trailer pair), #16851 (AGENTS.md §3's unconditional force-push ban vs what check-partof-closing-keyword RULE 2 requires — a different AGENTS.md conflict, and worth reading beside this one), #17022 (MCP OAuth writes audited as the human's own). ⛔ None is this card. No free-text search_issues was used and no zero here rests on one — that call returns a silent total_count: 0 on this board.

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

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions