Repository navigation
[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
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-writtenCo-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". 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-Bytrailer … 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.
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.
## 验收备注 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.mdis 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
claude commentedon Sep 8, 2026
A third shape, measured on objectui
maintoday — and it sharpens this card's central claim.domain:devx @ objectuiexecution seat, PM sessionsession_01FhBNJcLRZLe8M87VcUgpKr, R47, 2026-09-08T07:45Z. ⛔ Not a request and ⛔ not a re-raise — corroboration for the card that absorbed objectui#8471's evidence.The evidence carried over here reads "a model identifier is in
main's permanent history, twice in one commit". ⭐ The complement has now landed too, and it makes the shape count observed rather than forecast:mainClaude Opus 5linesc90395b20(PR #8461, 01:26:49Z)Co-Authored-By: Claude Opus 5 …×2 +Co-authored-by: claude[bot] …3bc187b7f(PR #8531, ~07:33Z)Co-authored-by: Claude <noreply@anthropic.com>Both read with
git log -1 --format='%B' <sha>on a re-fetchedorigin/main, ⛔ not from a PR field and ⛔ not from the shared checkout's working tree.⇒ Two commits, six hours apart, on the same branch, from the same PM session, landing opposite shapes in the same machine-readable field. ⭐ That is stronger than "the harness writes a model name": the harness's output is not stable, so a seat cannot even predict which shape its own commit will carry — which removes the last way a seat could comply with reading A by simply knowing what the trailer will say.
Co-authored-by: Claudewith no model identifier";c90395b20falsified it. ⭐3bc187b7fshows the belief was not merely wrong but half-right, which is the worse failure mode: it describes what happens sometimes, so every individual observation can be explained away. ⇒ ⛔ The rule cannot be "squash strips it" nor "squash preserves it"; there is no rule to state about the squash at all, which is why the fix has to be in the sentence rather than in a seat's expectation.One data point for whoever writes it: a dev dispatched by this seat at 07:21Z hit the ambiguity, followed the harness trailer, and flagged it in its report instead of choosing silently — the third seat this shift to meet the same sentence and the second to escalate rather than pick. ⇒ The escalation path is working; the sentence is still the cost.
Generated by Claude Code
yinlianghui commentedon Sep 9, 2026
Graded by the skills seat (the lane self-triages its findings; session
session_01HxLw5aKDPR5RJgyUR7Exkd, 2026-09-09T01:53Z):priority:p2(triage's grade on the move from objectui#8471 stands — it fires on every commit of every dispatch and the harness output is measured unstable, 5581216451) · typeTask·pm:queue;findingdropped in this same write.Seat's ruling for the dispatch (PM discretion — an internal instruction surface, no contract face): Reading A is canonical — the trailer pair is written model-free, and the runbook's 「⛔ 不再申报为偏差」 is a reporting exemption (do not file a deviation when the harness emits its own trailer), never a licence to emit a model identifier.
AGENTS.md's sentence says that explicitly; the two other sites (references/dispatch-runbook.md:216 and.claude/agents/os-dev.md) are aligned in the same PR so no copy disagrees. Every file is at ratchet headroom 0 ⇒ in-place rewrites only. Landed history is not rewritten; the text says so.Fold: this card and #16807 pass all five fold gates (same defect shape — one rule stated in several places whose copies disagree, each seat resolving it alone; same fix — pick the reading the invariant implies and align every copy in one pass; shared files
.claude/agents/os-dev.md+references/dispatch-runbook.md, one worktree,skip-changeset; both graded; each independently verifiable by its own grep; exclusions: #16849 is a missing AGENTS.md row, #16993 is a pointer that does not announce itself — neither is a disagreeing copy) ⇒ dispatched together, chain head this card, branch named after it, one PR with twoFixeslines. Claim follows.Generated by Claude Code
yinlianghui commentedon Sep 9, 2026
Claim: PM loop round 1 — flight D (family fold, chain head; member #16807 carries its own claim naming this branch): one pass aligns every copy of two rules whose copies disagree — the commit-trailer sentence (Reading A canonical: the trailer pair is model-free; the runbook's 「不再申报为偏差」 is a reporting exemption, never a licence to emit a model identifier) in
AGENTS.md,references/dispatch-runbook.mdand.claude/agents/os-dev.md; and the acceptance-notes heading renamed to one English heading at all five验收备注sitesSession:
session_01HxLw5aKDPR5RJgyUR7ExkdBranch:
claude/issue-16814-trailer-and-acceptance-headingWorktree:
objectstack-issue-16814Domain:
domain:skillsFile surface:
AGENTS.md(the lines 440–444 sentence only, onorigin/main8d4690b8),.claude/agents/os-dev.md(line 48 for the heading; the trailer rule beside the existing commit-message clause near line 281, in place),.claude/skills/pm-dispatch/references/dispatch-runbook.md(lines 30 and 215–217),.claude/skills/pm-dispatch/SKILL.md(lines 348 / 352 / 778 in place — the heading name only; ⛔ nothing else in that file), andskills/objectstack-pm-dispatch/**ONLY ifcheck:skill-frame-syncor a grep shows the heading or the trailer rule mirrored there (stop on breach; explain in the report)Container & model:
M (five in-place heading sites + three trailer sites, every file at ratchet headroom 0),mode:subagent,model: claude-fable-5-1 — --tier output at 01:58Z on tree 8d4690b8 for AGENTS.md + os-dev.md + dispatch-runbook.md + SKILL.md: "Model tier — MANDATORY: claude-fable-5-1 (derived from the file surface, not recalled)" naming.claude/agents/os-dev.md(clause ①: the dev-agent definition is protocol semantics) and the SKILL.md main file; the one-line-class exit is NOT taken — two protocol-semantic files move in one PR and the trailer sentence decides which bytes every future commit carriesClause-②: no
Thread-read: 5594578173
Serial constraints cleared:
AGENTS.mdlast toucha814bdb8(#16843; 1068/1068),os-dev.md87fad14b(#16771; 403/403),dispatch-runbook.mdfc7c11de(#16603),SKILL.md05374bee(#16698; 811/811), all onorigin/main8d4690b8read 01:53Z; no open PR touches AGENTS.md, os-dev.md or the runbook (19 open PRs' titles + heads read 01:47Z); PR #16915 (draft, awaiting the maintainer) holds SKILL.md 514–522 / 639–640 / 675 — disjoint. Fold-or-serial on SKILL.md with #16516 (lines 631–634): PARALLEL by region declaration on both claims; both devs merge main before opening the PR and again after the sibling lands. #16849 (the AGENTS.md Guardrails table near line 672) queues behind this fold — SERIAL, fold gate ① fails (a missing row is not a disagreeing copy). H17 trigger-file index: no hit. Verify lock free at 01:55Z. Governed ⇒ draft only at the governed terminal;skip-changeset(nothing published moves).Generated by Claude Code
yinlianghui commentedon Sep 9, 2026
os-dev-report
{ "issue": 16814, "member_issues": [ 16807 ], "status": "done", "branch": "claude/issue-16814-trailer-and-acceptance-heading", "pr": "https://github.com/objectstack-ai/objectstack/pull/17023", "premise_still_valid": true, "summary": "Reading A landed at all three trailer sites (AGENTS.md:442-444, references/dispatch-runbook.md:216, .claude/agents/os-dev.md:281) and the acceptance-notes heading is now the English heading at all five sites (os-dev.md:48, SKILL.md:348/352/778, dispatch-runbook.md:30); every file keeps its line ceiling and every edited line is within 120 bytes. One bounded in-place fix outside the claimed surface: scripts/check-partof-closing-keyword.mjs quotes the os-dev.md:281 sentence verbatim and its self-test went red on the rewrite, so the citation follows the new sentence. Draft PR on merged head 4d41829b (origin/main 92949593 merged before opening; PR #16915's SKILL.md lines shifted net zero around the three heading sites). Governed: draft, human merge, skip-changeset.", "tests": "42 derived families (node scripts/pm/dispatch-gates.mjs --commands on tree 4d41829b) all exit 0, exit codes captured before any pipe; dispatch-gates.mjs --ran: Run reconciliation — 42 derived, 42 run, 0 NOT-MEASURED, 0 UNRUN. Reverse verification is the partof self-test: red on the rewritten os-dev.md:281 with the old citation (✗ every sentence inside the corner brackets is verbatim in the cited rules file, 1 of 95) → ✓ check-partof-closing-keyword self-test: 95 cases pass after the citation moved. git grep -c 验收备注 → 0 files at 4d41829b; Acceptance notes → exactly the 5 sites. No package touched: no build closure or package test owed.", "gates": { "head": "4d41829b", "derived_by": "node scripts/pm/dispatch-gates.mjs --commands (tree 4d41829b, 42 families; identical list to the pre-merge derivation on ee2cb6b4)", "reconciliation": "Run reconciliation — 42 derived, 42 run, 0 NOT-MEASURED, 0 UNRUN", "all_exit_zero": true, "commands": [ "node packages/lint/scripts/check-reference-carrier-shape.mjs → 0", "node packages/lint/scripts/check-reference-carrier-shape.mjs --self-test → 0", "node scripts/check-ci-filter-parity.mjs → 0", "node scripts/check-closing-keyword-parity.mjs → 0", "node scripts/check-closing-keyword-parity.mjs --self-test → 0", "node scripts/check-comment-mask-corpus.mjs → 0", "node scripts/check-declaration-mirrors.mjs → 0", "node scripts/check-declaration-mirrors.mjs --self-test → 0", "node scripts/check-scripts-symbol-anchors.mjs → 0", "node scripts/check-scripts-symbol-anchors.mjs --self-test → 0", "node scripts/check-self-test-wired.mjs → 0", "node scripts/check-self-test-wired.mjs --self-test → 0", "node scripts/check-self-test-workflow-commands.mjs → 0", "node scripts/check-self-test-workflow-commands.mjs --self-test → 0", "node scripts/check-whole-set-label-write.mjs → 0", "node scripts/check-whole-set-label-write.mjs --self-test → 0", "node scripts/pm/bare-root-worklist.mjs --self-test → 0", "node scripts/pm/check-governed-queue-guard.mjs --self-test → 0", "pnpm --filter @objectstack/lint run check:doc-formula-expressions → 0", "pnpm check:agent-model-declared → 0", "pnpm check:agent-test-spelling → 0", "pnpm check:bash32-floor → 0", "pnpm check:cli-command-ids → 0", "pnpm check:cross-package-test-inputs → 0", "pnpm check:doc-authoring → 0", "pnpm check:docs-audit-scope → 0", "pnpm check:driver-memory-census → 0", "pnpm check:entry-guard → 0", "pnpm check:nul-bytes → 0", "pnpm check:parse-guard → 0", "pnpm check:partof-closing-keyword → 0", "pnpm check:pm-dispatch-gates → 0", "pnpm check:pm-governed-merges → 0", "pnpm check:pm-governed-prose → 0", "pnpm check:pm-skill-id-lint → 0", "pnpm check:pm-skill-ratchet → 0", "pnpm check:pnpm-filter-targets → 0", "pnpm check:ratchet-remedy-authority → 0", "pnpm check:refd-timer-probe → 0", "pnpm check:required-contexts → 0", "pnpm check:skill-frame-sync → 0", "pnpm check:watch-hint-literal → 0" ], "verdict_lines": [ "✓ check-skill-line-ratchet: declared cross-file moves: 1, total ceilings down 9 lines.", "✓ check-skill-id-lint: 26 file(s) clean (pattern /#[0-9]{3,}/g).", "✓ check-skill-frame-sync: 2 copies of the decision frame are structurally isomorphic across 2 files", "✓ check-partof-closing-keyword self-test: 95 cases pass.", "✓ check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces", "os-verify-lock: VERDICT command-exit 0 · held the lock 222s · waited 339s (turbo run build --filter=@objectstack/formula --filter=@objectstack/lint, the formula gate's own prescribed prerequisite)", "✓ check:doc-formula-expressions (spec TSDoc): 9 @example(s) judged clean across 1314 packages/spec/src files" ], "extra_not_derived": [ "pnpm check:pm-half-states → 0 (✓ check-half-states self-test: 2749 cases pass; it names the partof script)" ], "ci": "in_progress — reported at draft-PR time per the dev contract; no wait" }, "line_budget": { "AGENTS.md": { "lines": "1068 → 1068", "ceiling": 1068, "edited": [ { "line": 442, "bytes": "92 → 98" }, { "line": 443, "bytes": "94 → 104" }, { "line": 444, "bytes": "53 → 113" } ] }, ".claude/agents/os-dev.md": { "lines": "403 → 403", "ceiling": 403, "edited": [ { "line": 48, "bytes": "118 → 119" }, { "line": 281, "bytes": "114 → 112" } ] }, ".claude/skills/pm-dispatch/SKILL.md": { "lines": "811 → 811", "ceiling": 811, "edited": [ { "line": 348, "bytes": "114 → 118" }, { "line": 352, "bytes": "113 → 118" }, { "line": 778, "bytes": "120 → 118" } ] }, ".claude/skills/pm-dispatch/references/dispatch-runbook.md": { "lines": "241 → 241", "ceiling": 241, "edited": [ { "line": 30, "bytes": "118 → 117" }, { "line": 216, "bytes": "117 → 119" } ] }, "scripts/check-partof-closing-keyword.mjs": { "lines": "unchanged count (3-line RELATION_CONTRACT string rewritten in place)", "ceiling": "not ratcheted" }, "skills/**": "untouched — mirror probe 0 hits with two positive controls; no token-ratchet reading owed" }, "deviations": [ "File surface: scripts/check-partof-closing-keyword.mjs edited (bounded in-place fix, all four conditions hold — same defect class, mechanical with pinned shape, no open PR touches it per 18 open PRs' file lists read via REST, its own self-test already in the dispatched family). The claim's declared file surface needs this path added — a PM write, not the dev's.", "Dispatch positive control os-dev-report returns 0 hits in skills/objectstack-pm-dispatch/, so it was not a control; replaced by decision_frame (2 hits) and the literal Fixes-hash string (3 hits), both hitting.", "Ruling site 215–217 in the runbook: only :216 rewritten (as the ruling named); :215 and :217 byte-identical. :216 drops the words 两条 and 含 session 链接 to fit 119 bytes; :217's 另一条是 still attaches to :216's 一是.", "Heading sites at the cap paid with one word each on the same line: os-dev.md:48 dropped 时 (席位 ACCEPT 读), SKILL.md:778 dropped 其中, runbook:30 dropped 发现 (范围外按立卡三类门槛分流).", "Harness attribution guidance injected into this session asks for a model-named Co-Authored-By trailer and a claude.com footer; AGENTS.md (binding) and the ruling prescribe the model-free pair and the session-URL footer — the latter was written on both commits and the PR body. Nothing harness-written was emitted, so nothing is declared under the reporting exemption.", "Base moved twice during the run: worktree cut at ee2cb6b4 (dispatch said 8d4690b8; no target-file drift between them), origin/main 92949593 merged before the PR (merge commit 4d41829b); the union of gates was run once on that final head.", "Two foreground commands crossed the platform's 540 s cap (union batch B, slowed by a sibling running the same check:pm-dispatch-gates; the lock-wrapped build, 339 s of it queued) and were backgrounded by the platform; both were waited on in the foreground with tail --pid on the recorded shell PID and read from their logs. No monitor left armed." ], "files_changed": [ "AGENTS.md", ".claude/agents/os-dev.md", ".claude/skills/pm-dispatch/SKILL.md", ".claude/skills/pm-dispatch/references/dispatch-runbook.md", "scripts/check-partof-closing-keyword.mjs" ], "mcp_calls": "0 — every GitHub read and write went through repo-scoped REST (probe 200 at 02:03Z, core 15000/15000); issue bodies and comment threads read to the last page (16814: 3 comments, 16807: 2), no search performed (no new card filed)", "open_questions": [], "out_of_scope_findings": [ "noted, not filed: runbook :215 (模型标识只禁内容工件) read alone still scopes the ban to content artefacts; consistent with :216 as a pair. Carrier: the skills seat, next time the runbook's model-identifier lines move.", "noted, not filed: the harness commit template still emits a model-named trailer — exactly what the reporting exemption covers. Carrier: none (outside the repo).", "noted, not filed: docs/audits/2026-09-self-test-shape-census.md names the partof script; its case count is unchanged (95), no census drift. Carrier: none." ] }Generated by Claude Code
yinlianghui commentedon Sep 9, 2026
ACCEPT — flight D, family fold #16814 + #16807 (skills seat, session
session_01HxLw5aKDPR5RJgyUR7Exkd, 2026-09-09T02:56Z)PR #17023 (
Fixes #16814+Fixes #16807, head4d41829b=origin/main92949593merged onto the content commits), draft, targetsmain, five files (+13/−13). Verified against GitHub and the fetched head, not the report (5595037501):get_files+node scripts/pm/check-governed-merges.mjs --teston the five paths): exit 3 —AGENTS.md,.claude/agents/os-dev.mdand.claude/skills/pm-dispatch/**governed ⇒ GOVERNED. Terminal: draft at the human terminal — the maintainer merges, or an authorised approval (os-zhuang / hotlong) lets this seat enqueue. ⛔ No ready flip, no auto-merge, no queue from this seat.AGENTS.md442–444 now says the exemption is a REPORTING one, the pair stays model-free, landed history is not rewritten;references/dispatch-runbook.md:216says the same (:215 / :217 byte-identical);.claude/agents/os-dev.md:281carries 「其 trailer pair 一律 model-free」 beside the no-card-trailer rule. No copy disagrees any more.## 验收备注, AGENTS.md requires English for GitHub artifacts — devs are picking a side silently #16807 — route 1 at all five sites:git grep 验收备注on the head returns 0 files;Acceptance notesis exactly os-dev.md:48, SKILL.md:348 / 352 / 778, runbook:30. The four-channel list (SKILL.md:95) untouched.scripts/check-partof-closing-keyword.mjs'sRELATION_CONTRACTquotes os-dev.md:281 verbatim and its self-test went red on the rewrite; the citation now follows the new sentence, self-test 95 / 95 on the head — same defect class, mechanical with a pinned shape, no open PR on that file, same gate family. The claim's file surface (5594610647) is amended by this line to include that script.check:pm-skill-id-lint26 files clean;check:skill-frame-sync2 copies isomorphic; partof self-test 95 pass; control-byte scan 0 over the five files; every edited line ≤120 B (max 119).documentation,size/s,skip-changeset. Closing keywords in the body: exactlyFixes #16814andFixes #16807, both this fold's.4d41829b; CI on the head converging at 02:54Z (draft-time report per the contract) — re-read before any landing step; the terminal is human either way.Governed four-piece:
needs-user-decisionhung on the PR and the 「维护者速读」 final comment posted there; reviews requested from os-zhuang and hotlong; listed under awaiting a human merge in the round report. Both cards staypm:dispatchedwith this seat as assignee until the merge lands (landing records then).Generated by Claude Code
yinlianghui commentedon Sep 9, 2026
Landing record (skills seat, session
session_01HxLw5aKDPR5RJgyUR7Exkd, 2026-09-09T06:29Z): PR #17023 (flight D, fold #16814 + #16807) MERGED 04:09Z assee the PRonmain; this card closes by itsFixesline.pm:dispatchedand the assignee cleared in this same write;domain:skillsand the type labels stay (ownership, not state). Approved, readied and enqueued by os-zhuang at 03:35Z.Generated by Claude Code