Skip to content

[finding] AGENTS.md's commit-trailer sentence is self-ambiguous: it prescribes the "model-free trailer pair" and in the same breath exempts "the harness-written Co-Authored-By trailer" — which carries a model name, so two seats read it two ways and objectui main now holds both shapes #16814

Description

@os-zhuang

Moved from objectstack-ai/objectui#8471 by the triage seat (claude-opus-5). That card was filed in objectui, but ⛔ no objectui file is proposed for change by it and the governing text lives entirely here — so under the file-at-destination rule it is rebuilt here and the source is closed as moved. All measurements below are the objectui seats'; the sharper diagnosis in "What the original card did not have" is the triage seat's and is flagged as such.

The instruction, verbatim from AGENTS.md (origin/main 094b8fd9, ~:440-444)

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
body, a comment, a changeset, a doc or a code comment — the harness-written Co-Authored-By
trailer (with its session link) is the one exemption.

And in .claude/skills/pm-dispatch/references/dispatch-runbook.md:215-217:

  • 模型标识只禁内容工件:PR 标题与正文、代码注释、文档、changeset、评论。
  • 两条豁免同属规则,⛔ 不再申报为偏差:一是 commit 的 Co-Authored-By 尾注(含 session 链接)。
  • 另一条是 .claude/agents/* frontmatter 的 model:,check:agent-model-declared 要求。

⭐ What the original card did not have — the collision is INSIDE one sentence

objectui#8471 framed this as harness template vs. the os-dev dispatch ban — two external sources with different owners, hence "no wording satisfies both". ⚠️ Reading the governing text in full, that framing understates it. AGENTS.md's own sentence gives two readings:

  • Reading A — the prescription. It names the required form and calls it the model-free trailer pair, spelling it out as Co-authored-by: Claude <noreply@anthropic.com>. ⇒ write it model-free.
  • Reading B — the exemption clause. "the harness-written Co-Authored-By trailer … is the one exemption" — the harness's trailer is exempt, and the harness's trailer carries a model name. ⇒ keep what the harness emitted.

Both readings are of the same sentence, and they prescribe different bytes. ⇒ This is not two owners disagreeing; it is one governed sentence that does not decide. That is why it cannot be resolved by a seat picking the "stricter" source — there is no second source to defer to.

The runbook line is the tie-breaker, and it points at Reading A. :216 says the exemption means ⛔ 不再申报为偏差 — no longer declared as a deviation. That is a reporting exemption (don't file a deviation when the harness emits its own trailer), ⛔ not a licence to emit a model identifier. Under that reading the two texts agree and the answer is determinate. ⇒ The repair is to make AGENTS.md say that explicitly, not to choose a winner between owners.

Measured — it is at main now, not hypothetical (objectui seat, session_01FhBNJcLRZLe8M87VcUgpKr, 2026-09-08T01:50Z)

objectui PR #8461 merged 01:26:49Z as c90395b20; its squashed message ends:

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
---------
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

⇒ A model identifier is in permanent history, twice in one commit, in a machine-readable trailer field.

And the divergence is observed, not forecast. Two os-dev seats dispatched by the same PM session an hour apart resolved it two ways: #8461's seat followed the harness template (above); #8467's seat wrote the model-free form and filed the card rather than choosing silently. objectui main therefore carries both shapes.

⚠️ A correction the objectui seat recorded against itself, quoted because it explains why this ran unchecked: that seat had asserted all shift that "squash normalises trailers to plain Co-authored-by: Claude <noreply@anthropic.com> … so the dispatch fence and the mandated trailer never collide at main." The commit above falsifies it. The belief was carried forward without being re-taken. ⇒ The ⛔ ban in the dispatch briefs was not redundant; it was the only thing between the two readings, and it held in exactly one seat of two.

Why it is worth a card

  • ⚠️ It fires on every commit of every dispatch — the highest possible frequency, and each seat resolves it independently.
  • ⚠️ The result is inconsistent bytes in a machine-readable field; anything that groups commits by co-author gets more than one shape for one author.
  • ⭐ The failure is silent in the dangerous direction: a seat that follows the harness template gets no error at all.
  • ⚠️ History is not rewritable, so no repair cleans up what has already landed. Any option that leaves both shapes in place should say so rather than imply a uniform field.

Scope of the repair, ⛔ stated as sites rather than as prescribed wording

Whichever reading is made canonical, it must land in every place that states the rule, or the collision is recreated:

  • AGENTS.md — the sentence above (the ambiguity itself);
  • .claude/skills/pm-dispatch/references/dispatch-runbook.md:216 — the deviation-reporting exemption;
  • .claude/agents/os-dev.md — the dispatch contract the dev actually reads.

⚠️ Same class as #16807 (the ## 验收备注 heading collision): a rule stated in more than one place, where the copies do not agree and each seat resolves it alone. Worth handling by the same person, in the same pass.

Not answered here

  • Whether the intended answer is Reading A or Reading B. ⛔ The triage seat reads the runbook as settling it for A, but ⛔ does not rule it — AGENTS.md is governed surface.
  • Whether the sibling repositories' seats hit the same pair. Not measured.

Refs: objectstack-ai/objectui#8471 (source, closed as moved) · objectui PR #8461 (c90395b20, the landed evidence) · objectui PR #8467 (the seat that wrote the model-free form) · #16807 (same class, this repo).

Activity

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

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions