Skip to content

docs(agents): port objectstack's model-free commit-trailer rule into the multi-agent section (objectui#9441) - #10922

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-9441-model-free-trailer-rule
Sep 28, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/issue-9441-model-free-trailer-rule

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #9441

Clause-②: no — AGENTS.md is an agent-facing convention, not a published contract, accept set or public surface

What

objectui's root AGENTS.md gains objectstack's model-free commit-trailer rule, as ruled on the card (ruling A, comment 5724938982, text only, no hook). One new bullet in ### 多 agent 协作纪律(并行修改本仓库,务必遵守), placed right after the bullet that begins 「每次 commit/push 前先确认当前分支」, which is that section's commit-hygiene neighbour.

  • The two sentences of objectstack AGENTS.md's paragraph beginning **Commit message:** are quoted verbatim, with exactly one clause removed: , and the pre-push hook refuses a model identifier in that pair. objectui has no such hook and the ruling adds none (option B was declined).
  • A short warning says, per commandment 完善设计器的每一个细节 #9, that nothing in this repository enforces the rule, that it works through the harness's own precedence sentence (the ruling's words are quoted), and that squash landing keeps Co-authored-by (pointing at objectui#9666).

objectui#9666 remains open: its ruling-C sentence (the cross-repo force-push line) is a separate card, serialised after this one by the claim.

Premise checks (on origin/main 733fd5a, before editing)

  • H1, objectui carries none of the rule. git grep -n -iE 'Claude-Session|model-free|Co-authored-by' BASE -- AGENTS.md CLAUDE.md exit 1, zero lines. Control: git grep -c AGENTS BASE -- AGENTS.md answers 5, exit 0.
  • H2, the source text. objectstack origin/main df3ba164, the paragraph anchored by **Commit message:**. The port was compared mechanically: source paragraph whitespace-flattened, the one clause removed (it occurs exactly once), result byte-equal to the new quote line: MATCH.
  • H3, no hook in objectui. No .githooks/, no core.hooksPath, no husky / lefthook / simple-git-hooks key in package.json, and no file under .github, scripts or .claude names Co-authored-by or Claude-Session (git grep exit 1). Control leg: objectstack's .githooks/pre-push pipes the pushed refs into scripts/check-commit-card-trailers.mjs, whose header names "a model identifier in the trailer pair" as its second finding class.
  • H4, placement. The multi-agent discipline section exists under the heading above; the bullet sits with the other commit/push bullets.
  • The squash claim. The last 40 commits on main are all single-parent squash landings: 40 carry a Co-authored-by line, 0 carry Claude-Session, and none names a model. That count is today's reading and is deliberately NOT written into the file (commandment 完善设计器的每一个细节 #9); the file points at objectui#9666 instead.

Verification, at 4259546d

check exit verdict line
node scripts/check-control-bytes.mjs 0 check-control-bytes: OK (scanned 9180 tracked text file(s); skipped 85 binary).
node scripts/check-new-cross-file-line-citations.mjs 0 VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0
node scripts/check-shell-escape-residue.mjs 0 OK (5/5 root(s) resolved -- AGENTS.md: 1 file(s), 15 fence(s); ...)
node scripts/check-doc-links.mjs 0 Links are valid across 17 scan roots.
node scripts/check-changeset-presence.mjs 0 No source or published contract of a released package changed in this range, so no changeset is owed.
node scripts/check-governed-queue-guard.mjs --test AGENTS.md 3 GOVERNED — 1 of 1 path(s) are on a governed surface (so: draft, waiting for an authorized approval)
  • Tests that read AGENTS.md, derived from the ledger rather than recalled: markdownTestInputsAmong(['AGENTS.md']) in scripts/markdown-test-inputs.mjs names five readers (entries ./* and AGENTS.md). All five ran in one call, pnpm exec vitest run --maxWorkers=2 over check-doc-links, check-installed-spec-pin-claims, check-required-check-set, check-shell-escape-residue and dollar-dialect-alias-census (all under scripts/__tests__/): Test Files 5 passed (5), Tests 260 passed (260), verify-lock VERDICT command-exit 0.
  • Control-byte self-scan over the diff: grep -naP for C0/DEL bytes exit 1 (no hits); control leg on a constructed byte, 1 hit.
  • Not run locally, owned by CI: pnpm lint (repo-wide; this diff touches no linted source) and the full pnpm test.
  • No changeset: the gate above says none is owed, and AGENTS.md ships in no package.

Acceptance notes

  • This branch's only commit ends with the model-free pair it describes (Claude-Session + Co-authored-by: Claude). The harness's attribution reminder in this session asked for a model-named co-author line; the commit followed the rule instead. That is the precedence the ruling relies on, used once.
  • Observation, not filed: once this lands, its squash commit is a free reading for the question objectui#9666 left open (does the squash composer drop Claude-Session, or did those seats never write one?). The branch commit carries both lines. Carrier: the seat that lands this PR.

Session: https://claude.ai/code/session_01EBx9rvB7dufCz4at53x35U

维护者速读(草稿)

改了什么:在 objectui 根目录 AGENTS.md 的「多 agent 协作纪律」一节里加了一条:agent 的提交信息结尾统一用两行不带模型名的署名(会话链接 + 通用的 Claude 共同作者),PR、评论、changeset、文档和代码注释里也不写模型名。正文直接照抄 objectstack 仓已有的同一条规则,只删掉了「由 pre-push 钩子拦截」那半句,因为本仓没有、也不加这个钩子。

为什么改:objectstack 仓早已写明这条规则,objectui 的 AGENTS.md 却一个字没提,在本仓干活的 agent 就可能照着工具的默认提示写上模型名;而合并时这行署名会原样进入 main 的历史,事后不改写。您 9 月 18 日在本卡上裁定方案 A:只补文字,不加门禁。

风险与代价(含回滚):只改给 agent 读的说明文字,不影响任何代码、测试或发版。代价是本仓仍然没有机械拦截,效果取决于 agent 读到并照做;另外两个仓各存一份同文规则,以后改一边要记得同步另一边。回滚:revert 本 PR 唯一的那个 commit(5 行)即可。

席位意见:

你要做的:看一眼这 5 行 diff,同意就在本 PR 上点 Approve;之后翻 ready、入队由席位完成。


Generated by Claude Code

…the multi-agent section

objectui's AGENTS.md said nothing about the commit trailer pair, so a seat
here followed whichever voice it read last. This adds the objectstack
AGENTS.md "Commit message:" sentences verbatim, minus the pre-push-hook
clause (objectui has no such hook and the ruling adds none), and states
that nothing in this repository enforces the rule.

Claude-Session: https://claude.ai/code/session_01EBx9rvB7dufCz4at53x35U
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Sep 28, 2026
@github-actions

github-actions Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 6 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/10106-settled-schema-equal-payload.md

  • names AGENTS.md → AGENTS.md — edited by this change

    The hook refetches getObjectSchema whenever the adapter identity changes, and every consumer its doc comment instructs — ObjectGantt, ObjectCalendar, ObjectView, ObjectTimeline, ObjectGallery — keys its record fetch on the returned def, which is what AGENTS.md §5 commandment [WIP] Enhance every detail of the designer #10 tells a consumer to do (key on the payload, never on a memo identity). The producer half of that same sentence is what this fixes: a byte-identical answer arriving as a fresh object re-fired every one of those fetches, and the duplicate query carried the same $expand set as the one before it. Measured first-hand on ObjectGantt with an instrumented adapter, with a control swap in the same command; the counts, and the control that makes them a discrimination rather than a counting artefact, are asserted by packages/react/src/hooks/__tests__/useSettledSchema.equalPayload-10106.test.tsx (objectui#10106).

.changeset/5674-retire-plugin-component-input.md

  • names AGENTS.md → AGENTS.md — edited by this change

    Why now, and why a minor rather than waiting further. The deprecation window exists to warn a consumer outside this repository, unmeasurable from here, before a published export disappears. That window has already been spent — stage 1 shipped and the warning has been live. The follow-up card that was meant to gate stage 2 on "a release actually shipping the deprecation" was later closed as a duplicate into a release-batch tracking card that itself no longer exists (answers 404), so the gate had no carrier left to clear. Execution ruling 2026-09-27 (triage, carrying the maintainer's 「同意」) deletes now rather than block indefinitely on a dead gate; the sibling objectstack repository's docs/NORTH-STAR.md 〈阶段姿态〉 already makes immediate retirement (no alias, no window) the default disposition for a zero-consumer published name. Removing a published export is minor, not patch — this repo's own breaking changes never declare major (see AGENTS.md's version-alignment policy).

.changeset/6357-basechema-bind-declaration.md

  • names AGENTS.md → AGENTS.md — edited by this change

    bind was read by ten production sites and declared by no schema shape. It resolved as any through BaseSchema's index signature and rode .passthrough() on the validator, while three separate documents taught it as an authorable key of every node: this repo's own AGENTS.md §4 ("Every node in the UI tree follows this shape (@object-ui/types)"), the published agent-facing skills/objectui/rules/protocol.md ("Every UI component node MUST follow this shape"), and content/docs/fields/grid.mdx. So the agent-facing protocol told authors to write a key the published types did not know existed.

.changeset/6505-predicate-valued-gate-rules.md

  • names AGENTS.md → AGENTS.md — edited by this change

    The accept set widens to what the protocol already declares and the runtime already accepts, not beyond it. AGENTS.md §4 declares both keys as expressions, SchemaRenderer evaluates them through hasDeclaredPredicate + evaluateCondition, @objectstack/spec normalizes every authored predicate into a { dialect, source } envelope, and the objectui#3862 / objectui#3955 rulings are entirely about which expression spellings count as declared. This table was the one place in the repo that disagreed, so this restores declared = enforced rather than changing a contract.

.changeset/7122-spec-17-3-0-parity-reconciliation.md

  • names AGENTS.md → AGENTS.md — edited by this change

    Two breaking consequences for a consumer that names the type directly. (1) It no longer declares editMode; the key is now carried by the spec's ServiceObject, so ObjectSchemaMetadata still has it, but code written against the extension type ALONE loses it. (2) interface → type alias also ends declaration merging: a consumer that reopened declare module '@object-ui/types' { interface ObjectSchemaClientExtensions { … } } to add its own client-side member no longer compiles, because an alias cannot be reopened. minor rather than major per AGENTS.md's version-alignment rule — objectui's own breaking changes are graded minor with the semantics stated in the body, since any major in the fixed group would push all 39 packages off @objectstack's major.

.changeset/7714-lookup-draft-stays-client-side.md

  • names AGENTS.md → AGENTS.md — edited by this change

    minor rather than major per AGENTS.md: objectui's major tracks @objectstack's, so objectui's own breaking changes ship as minor with the breaking semantics stated.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with 29c76e573 (merge-base with origin/main): 1 file(s) changed outside .changeset/, read against 1669 pending declaration(s) that publish a body (2264 pending in total). · run

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿)

席位 domain:devx @ objectui 第 2 席(session_01EBx9rvB7dufCz4at53x35U)对照本 PR 的实际 diff(head 4259546da5)校正 dev 草稿后定稿;复核记录在 objectui#9441 评论。

改了什么:在 objectui 根目录 AGENTS.md 的「多 agent 协作纪律」一节加一条(+5 行,仅此一个文件):agent 的提交信息结尾统一用两行不带模型名的署名(会话链接 + 通用的 Co-authored-by: Claude),PR、评论、changeset、文档和代码注释里也不写模型名。正文逐字照抄 objectstack 仓 AGENTS.md 的同一条规则,只删掉「由 pre-push 钩子拦截」那半句;另加一句提醒:本仓没有任何机械拦截,靠 harness 自己「让位于 AGENTS.md」的优先级生效。

为什么改:objectstack 早已写明这条规则,objectui 的 AGENTS.md 却一字未提,在本仓干活的 agent 会照着工具的默认提示写上模型名;而 squash 合并会把这行署名原样带进 main 的历史,事后不改写。本卡 9 月 18 日经总监席呈报、您同意的是方案 A:只补文字,不加钩子、不加门禁。

风险与代价(含回滚):只改给 agent 读的说明文字,不碰代码、测试、构建或发版。代价:本仓仍无机械拦截,效果取决于 agent 读到并照做;两个仓各存一份同文规则,改一边要记得同步另一边。回滚:revert 本 PR 唯一的 commit 即可。

席位意见:建议批准。席位独立核对了引文:objectstack 原段落去掉那半句后与本 PR 的引文逐字节一致;diff 只有这 5 行,与裁决 A 的范围一致。额外那句「本仓无强制」的提醒属实,也是本仓诫条 #9 要求的写法。CI 在席位复核时(07:44Z)Lint、Type Check、Build & E2E、Changeset Declaration 已绿,8 个测试分片仍在跑;落地前席位会再确认全绿。同文件的下一张卡(objectui#9666,强制推送那句)排在本 PR 之后串行。

你要做的:在本 PR 上点 Approve(os-zhuang 或 hotlong 任一账号即可);之后翻 ready、入队由席位完成。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 28, 2026 07:49
@os-zhuang
os-zhuang enabled auto-merge September 28, 2026 07:49
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Spec Main Shape Gate is red on this head, and it is not this PR's. domain:devx seat 2 (session_01EBx9rvB7dufCz4at53x35U), read 2026-09-28T07:55Z on head 4259546da5.

  • The failure: packages/types type-check — report-chart-query-spec-parity.test.ts, TS1360 Type 'true' does not satisfy the expected type 'false', compiled against @objectstack/spec built from objectstack df3ba164. That pin is a designed tripwire: objectstack 681868ca (objectstack#20369) typed JoinedReportBlock, so IsUnknown flipped. This PR changes AGENTS.md only (+5/−0) and cannot move it.
  • Same signature on other PRs of this hour (objectui#10912, docs(core): state the ruled reference-day rule on FormulaFunctions TODAY() (objectui#10903) #10915, fix(console): an injected @objectstack/client joins the vendor-objectstack chunk group (objectui#10920) #10921), green on main at 06:50Z ⇒ one incident, anchored on objectui#10916 (claimed as a maintainer-authorised stop-the-bleed); ⛔ no second card. No fix PR exists yet, so there is nothing to port, and porting a packages/types change into this governed docs PR would duplicate the anchor's hunk.
  • No re-run: the failure is deterministic against objectstack main and already reproduced on four heads.
  • Every other check on this head is green (Lint · Type Check · Test · Build & E2E · Build Docs · Changeset Declaration · Governed Surface Queue Guard); os-zhuang approved this head and armed auto-merge. Once objectui#10916's fix is on main, this seat merges main into this branch (the ruleset requires an up-to-date branch) and follows it to MERGED.

Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queue Sep 28, 2026
Merged via the queue into main with commit af2221d Sep 28, 2026
40 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-9441-model-free-trailer-rule branch September 28, 2026 09:17
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Post-hoc: this PR merged before the contract-tier review it owed; this record is that review, taken after landing.

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 55e0f36535c6fb51cbc76598e07526943a5f31f8
Local-runs: none

Inputs read, reading taken 2026-09-28T11:10Z: card objectui#9441 (body and all six comments, the ruling 5724938982 included), PR objectui#10922 (body, its three comments, file list, net diff against main), the 40 check-runs on the head; file text at the named commits through git show; the sister paragraph from objectstack origin/main AGENTS.md. Nothing built, run or re-run.

① Derived judgments

Diff shape: one file, root AGENTS.md, +5/−0, one bullet in ### 多 agent 协作纪律(并行修改本仓库,务必遵守) placed right after the 「每次 commit/push 前先确认当前分支」 bullet. The head is a merge of main (base 29c76e573c) into the branch; its net diff equals the API diff and the squash commit af2221d45e's diffstat, and AGENTS.md at the head is byte-identical to AGENTS.md at af2221d45e on main.

  1. Ruling fidelity (5724938982, letter A): objectui AGENTS.md gains the same two sentences — the model-free pair, the pre-push refusal NOT ported, the two exemptions — in its multi-agent discipline section, text only, no hook. On the diff: both sentences present, the pre-push clause absent, both exemptions present, section as ruled, nothing but AGENTS.md in the file list, so no hook and no gate. MATCH.
  2. Quote fidelity, re-derived here rather than taken from the PR: the paragraph of objectstack origin/main AGENTS.md (tip 24b7085939; wording unchanged since the dev's df3ba164) that begins **Commit message:**, whitespace-flattened, with the clause , and the pre-push hook refuses a model identifier in that pair removed (it occurs exactly once), compares strictly equal to the blockquote line at the head: byte-equal, 474 characters. No other word changed, nothing translated.
  3. Factual claims in the added warning, each checked against the head tree or the live objects:
    • 「没有 pre-push 钩子,也没有读提交信息的门禁」 — TRUE. At the head: no .githooks/, .husky/, lefthook or simple-git-hooks file; package.json carries no husky / lefthook / simple-git-hooks / hooksPath / prepare / pre-push / pre-commit / commitlint key; .claude/hooks/ holds three PreToolUse guards (main-checkout, shared-stash, tree-enum) and their self-tests, none of which reads a commit message; no file outside AGENTS.md names Co-authored-by, Claude-Session, hooksPath or a model name; no workflow parses commit text. Control leg: the objectstack tree carries the pre-push hook and scripts/check-commit-card-trailers.mjs.
    • 「harness 的署名提醒让位于 CLAUDE.md / AGENTS.md 里关于这几行的规则」 — TRUE. The harness attribution reminder, as served to this very session, states that the user's own instructions about these lines, such as a CLAUDE.md or memory rule, take precedence over the reminder, and that no line the reminder leaves out is added — the model-free pair adds none, it changes only the co-author's name. objectui's CLAUDE.md delegates to AGENTS.md in one line, so the rule reaches the reminder through it. Demonstrated on this PR: the branch commit 4259546da5 ends with Claude-Session: plus Co-authored-by: Claude (the noreply address) and no model name, while the reminder had asked for a model-named co-author.
    • The quoted ruling sentence 「The harness's own precedence rule does the enforcing.」 is verbatim from 5724938982.
    • 「squash 入队保留 Co-authored-by……原样落进 main 的历史」 — TRUE, now measured on this PR's own landing: the squash commit af2221d45e on main carries Co-authored-by: Claude (the noreply address) verbatim from 4259546da5, plus a second Co-authored-by for the update-branch merge's author, and no model identifier. It carries no Claude-Session: line; the added text does not claim it does (see ③).
  4. Conflicts within the file: none found. Commandment #-1 allows Chinese in operational sections and §9 is one; commandment [WIP] Update documentation for project #11 is met — the bullet cites by content anchor (**Commit message:**) and by comment id, no path:line, and Line Citation Gate is success on the head; commandment 完善设计器的每一个细节 #9 is met — the warning names what does not enforce the rule instead of writing a count (the dev's 40-of-40 reading stays out of the file, as the PR body says); §0's "commit messages in English" holds, the pair is English. The file's earlier choice to keep only a pointer to a different objectstack paragraph (the body-bytes rule) was a per-rule choice; here the ruling itself ordered the two sentences copied, and the drift cost is stated in the PR's 维护者速读. The file already quotes the sibling repo verbatim elsewhere (the os-dev.md delivery sentences in the same section).

② Semver level

The diff publishes nothing: root AGENTS.md sits in no package's files list and is not src/ of any package in the fixed release group. Under the file's own §9 Housekeeping rule no changeset is owed, and Changeset Declaration and Changeset Fixed Group Check are success on the head. The PR body's Clause-②: no carries no arm — well-formed under the closed form (yes|no plus at most one of (widening) / (narrowing)), and no with no changeset is exactly what a diff that publishes nothing declares.

③ Boundary flags

Dev report 5865617148: open_questions is empty. Four deviations and one out_of_scope_findings entry, each answered:

  • D1 reader-test set taken from the markdown-test-inputs ledger rather than a grep — ACCEPTED. The ledger is the instrument that names the file's readers (commandment 完善设计器的每一个细节 #9's shape); the two grep-only hits use the string as a path or fixture, not the file's bytes; and every Test shard on the head is success, which covers them regardless.
  • D2 gates run as node scripts/NAME.mjs — ACCEPTED. Those are the commands the check:* wrappers invoke, and the CI workflow for each (Control Byte Scan, Line Citation Gate, Shell Escape Residue Scan, Internal Docs Link Check, Changeset Declaration, Governed Surface Queue Guard) is success on the head.
  • D3 the warning added beyond the two quoted sentences — ACCEPTED. It stays inside ruling A (text only, no hook; it quotes the ruling's own enforcement sentence), commandment 完善设计器的每一个细节 #9 asks for it, and every claim in it is verified TRUE in ①.3.
  • D4 the harness reminder asked for a model-named co-author and the commit used the model-free pair — ACCEPTED, not a deviation. Verified on 4259546da5; that precedence is what the ruling relies on and what the diff writes down.
  • Out-of-scope observation (carrier: the landing seat) — the reading it asked for now exists and is recorded here for objectui#9666's carrier to pick up: the squash composer KEPT Co-authored-by and DROPPED Claude-Session: (the branch commit carried both; af2221d45e carries only the former). Not this card's; this record writes nothing to objectui#9666.

Gate verdicts on the head: 40 check-runs, 37 success, 3 skipped (dependabot, Test (coverage), and the coverage-shard matrix placeholder entry — conditional jobs, not failures), 0 failure. Spec Main Shape Gate is success on this head after the objectui#10916 unlock; Governed Surface Queue Guard is success.

Post-hoc note: the landing route (an os-zhuang approval on the Tier H surface, then the owning seat through the queue) is the card's business; this record supplies only the review the PR owed and changes nothing on main.

Implemented-by: claude/issue-9441-model-free-trailer-rule
Reviewed-by: session_01EBx9rvB7dufCz4at53x35U

VERDICT: PASS


Generated by Claude Code

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

Labels

documentation Improvements or additions to documentation

Projects

None yet

3 participants