Repository navigation
finding(process): the os-dev commit-trailer contract says model-free, but 27 of the last 33 trailered main commits name a model — and nothing enforces either #9441
Description
Activity
Ruling: batch #152 item 1 · letter A (objectui's
AGENTS.mdgains objectstack's model-free commit-trailer rule and its two exemptions — text only, ⛔ no hook) · maintainer 「其他同意」 2026-09-18T03:58ZDirector seat, summon #24,
session_01Wj1HUjzyeiBQ8atRf1ZhaL. Presented in detail with the recommendation A; the maintainer agreed. Facts, re-measured on both mains:objectstack:.claude/agents/os-dev.md:283says the trailer pair is model-free, and objectstackAGENTS.md:440-444spells it out —Claude-Session: https://claude.ai/code/session_<id>andCo-authored-by: Claude <noreply@anthropic.com>, the pre-push hook refusing a model identifier in that pair, with two exemptions (a harness-writtenCo-Authored-Bytrailer is reporting, ⛔ not a deviation, and landed history is not rewritten; a verbatim maintainer ruling quoted as a block). objectui'sAGENTS.mdcarries none of it. This card's 09-13 census (27 of 33 trailers naming a model) is stale: the last 40 commits on objectuimaintoday read 39 model-free / 1Claude Opus 5, objectstack 39 of 40 — the convention has converged, and the one residual vector is a dev following the harness's attribution reminder in a repository whoseAGENTS.mdis silent (the reminder itself yields to aCLAUDE.md/AGENTS.mdrule).Ruling — A
- objectui
AGENTS.mdgains the same two sentences (the model-free pair, the pre-push refusal is ⛔ not ported — objectui has no such hook and gets none; the two exemptions), placed in its multi-agent discipline section. The harness's own precedence rule does the enforcing. - ⛔ B — a new hook in objectui is the human floor and the maintainer has declined gate work; ⛔ C — leaves the one repository where the rule is unwritten.
- objectui#9666's first half (the trailer vector; squash keeps
Co-authored-by) is this card's, as triage registered (5711937699).
Four-facet reading: ① zero customers; ② one rule text in both repositories; ③ not scored — fleet-facing; ④ text only.
Execution
needs-user-decision→pm:queue;domain:devx,priority:p3stay.AGENTS.mdis governed ⇒ human merge by the approver.
Generated by Claude Code
- objectui
objectstack-fleet commented
on Sep 28, 2026 ContributorMore actionsClaim: PM loop round 1
Session:session_01EBx9rvB7dufCz4at53x35U
Account:huangyiirene(the seat's linked user asget_meanswers it; the card's assignee)
Branch:claude/issue-9441-model-free-trailer-rule
Worktree:objectui-issue-9441
Domain:domain:devx
Seat: domain:devx#2
File surface: rootAGENTS.md, its multi-agent discipline section only (stop on breach; explain in the report)
Container & model:S, not mechanical (ruling implementation on a governed text),mode:subagent, model: opus (default tier;dispatch-gates --tier --repo objectstack-ai/objectui AGENTS.md: no path-derived mandate)
Clause-②: no —AGENTS.mdis an agent-facing convention, not a published contract, accept set or public surface
Thread-read: 5724938982
Ruling-ref: 5724938982
Serial constraints cleared:GET /pulls/{n}/filesover all 12 open objectui PRs (1,936 filenames examined, read before this claim) — none touchesAGENTS.mdorCLAUDE.md. ⭐ Fold-or-serial, answered: objectui#9666 (ruling C,5724939229) also adds one sentence to this same file. Five-gate reading: ① same fix form (a ruled cross-repo sentence added to objectuiAGENTS.md), ② same file, ③ both ruled, ④ each checkable by its own text — but objectui#9666 ispriority:p2anddocs/NORTH-STAR.mdpriority rule 3 bars this lane from dispatching p2 tool cards while its P1s are open ⇒ serial: objectui#9441 → objectui#9666; the second mergesmainfirst. Recorded on this seat's post §3.Governed surface (
AGENTS.md⇒ Tier H): draft PR only, both authorised approvers requested, ⛔ never flipped ready / enqueued / auto-merged / approved / merged by this seat.
Generated by Claude Code
objectstack-fleet commented
on Sep 28, 2026 ContributorMore actionsos-dev-report
{ "issue": 9441, "status": "done", "branch": "claude/issue-9441-model-free-trailer-rule", "pr": "https://github.com/objectstack-ai/objectui/pull/10922", "session": "session_01EBx9rvB7dufCz4at53x35U (subagent of the domain:devx seat 2; the parent's id, as dispatched)", "premise_still_valid": true, "summary": "objectui root AGENTS.md gains one bullet in '### 多 agent 协作纪律(并行修改本仓库,务必遵守)', right after the bullet beginning '每次 commit/push 前先确认当前分支'. It quotes the two sentences of objectstack AGENTS.md's paragraph beginning '**Commit message:**' (origin/main df3ba164) verbatim, minus exactly one clause (', and the pre-push hook refuses a model identifier in that pair'), which a mechanical compare confirmed: source paragraph flattened, clause removed (occurs once), byte-equal to the new quote line = MATCH. A short warning after the quote states, per objectui commandment #9, that nothing in objectui enforces the rule, that the harness's own precedence sentence does the enforcing (quoting the ruling's words), and that squash landing keeps Co-authored-by (points at objectui#9666; today's count kept out of the file). Draft PR 10922 opened, body byte-identical on read-back, PR assignee huangyiirene; objectui#9666 remains open and is mentioned only without a closing keyword.", "premise_checks": { "H1": "holds. git grep -n -iE 'Claude-Session|model-free|Co-authored-by' 733fd5ac6 -- AGENTS.md CLAUDE.md: exit 1, 0 lines; control git grep -c AGENTS 733fd5ac6 -- AGENTS.md = 5, exit 0", "H2": "holds. objectstack origin/main df3ba164, paragraph anchored by '**Commit message:**'; today's wording ported, not the ruling's paraphrase", "H3": "holds. objectui: no .githooks/, no core.hooksPath, no husky/lefthook/simple-git-hooks key in package.json, no file under .github scripts .claude names Co-authored-by or Claude-Session (git grep exit 1). Control: objectstack .githooks/pre-push pipes refs into scripts/check-commit-card-trailers.mjs whose header names a model identifier in the trailer pair as its second finding class", "H4": "holds. the section exists under that exact heading; placed with its commit/push bullets", "squash_keeps_co_authored_by": "last 40 main commits, all single-parent squash landings: 40 carry Co-authored-by, 0 carry Claude-Session, none names a model (repo shallow, but 40 of 40 commits were present)" }, "files_changed": [ "AGENTS.md" ], "line_budget": "AGENTS.md 601 -> 606 lines (+5 / -0, one commit 4259546d). No objectui gate holds a line ceiling on AGENTS.md: of the 10 scripts that mention both AGENTS.md and ratchet/ceiling/max-lines, 8 mention AGENTS.md only in comments and the other 2 (check-doc-links, markdown-test-inputs) check links and the test-input ledger. No budget applied, none exceeded", "gates": [ "node scripts/check-control-bytes.mjs (= pnpm check:control-bytes): exit 0 · 'check-control-bytes: OK (scanned 9180 tracked text file(s); skipped 85 binary).'", "node scripts/check-new-cross-file-line-citations.mjs (= pnpm check:new-line-citations): exit 0 · 'VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0'", "node scripts/check-governed-queue-guard.mjs --test AGENTS.md (= pnpm governed AGENTS.md): exit 3 · 'GOVERNED — 1 of 1 path(s) are on a governed surface' (expected; PR parked as draft)", "node scripts/check-shell-escape-residue.mjs: exit 0 · 'OK (5/5 root(s) resolved -- AGENTS.md: 1 file(s), 15 fence(s); ...)'", "node scripts/check-doc-links.mjs: exit 0 · 'Links are valid across 17 scan roots.'", "node scripts/check-changeset-presence.mjs: exit 0 · 'No source or published contract of a released package changed in this range, so no changeset is owed.' So no changeset file was added (a docs-only non-publishing change; no skip-changeset label, objectui has no reader for one)", "AGENTS.md reader tests, 5 of 5 per the scripts/markdown-test-inputs.mjs ledger (markdownTestInputsAmong(['AGENTS.md']) -> entries ./* and AGENTS.md): pnpm exec vitest run --maxWorkers=2 over scripts/__tests__/ check-doc-links, check-installed-spec-pin-claims, check-required-check-set, check-shell-escape-residue, dollar-dialect-alias-census · 'Test Files 5 passed (5)' 'Tests 260 passed (260)' · os-verify-lock 'VERDICT command-exit 0'", "control-byte self-scan of the diff: grep -naP for C0/DEL bytes exit 1 (no hits); control leg on a constructed byte = 1 hit", "CI, one snapshot at report time, no waiting: 38 check runs on 4259546d = 22 success, 3 skipped, 13 in_progress, 0 failed -> in_progress" ], "tests": "All runs at HEAD 4259546d (the only commit on the branch). Doc-only change: no package touched, so no build-closure step (1) and no package test/typecheck step (2) apply. Gate and reader-test commands and verdict lines are listed under gates. Not run locally, left to CI: pnpm lint (repo-wide; the diff touches no linted source) and the full pnpm test. NOT MEASURED: check-governed-queue-guard.test.ts and markdown-test-inputs.test.ts, which a literal grep for the AGENTS.md string also hits; they use 'AGENTS.md' only as a path-classification or fixture string (governedPathsIn(['AGENTS.md']); fixture trees), the ledger does not record them as readers, and no byte of the real file reaches them. No ablation or reverse check applies: the change is prose that no gate reads.", "deviations": [ "Reader-test set came from the markdown-test-inputs ledger (5 readers) instead of the dispatch's 'grep them'. The grep-only hits (check-governed-queue-guard.test.ts, markdown-test-inputs.test.ts) were not run because neither reads the file; see tests", "Gates were run as 'node scripts/NAME.mjs', the exact command each package.json check:* / governed script wraps. 'pnpm governed' needs paths, so it was given AGENTS.md", "Beyond the two quoted sentences, the bullet adds a short warning (nothing enforces it; harness precedence; squash keeps Co-authored-by, pointing at objectui#9666). objectui's commandment #9 asks for this ('Where nothing re-derives the claim, say that in the text'), and the file already follows it in #10 and #11. It is a judgment on the 'keep it minimal' route, so it is listed here", "The harness attribution reminder given to this session asked for a model-named co-author trailer. The commit uses the dispatch's model-free pair instead (os-dev.md precedence). Reported, not a dispatch deviation" ], "mcp_calls": "0", "api_writes": "3 through the fleet-write relay as objectstack-fleet[bot]: (1) pr_create -> POST /repos/objectstack-ai/objectui/pulls, draft forced (relay run 36392859859, success); (2) label-write --assign -> POST /repos/objectstack-ai/objectui/issues/10922/assignees huangyiirene, labels untouched, read back MATCHES (relay run 36392937821); (3) this os-dev-report comment -> POST /repos/objectstack-ai/objectui/issues/9441/comments via post-stamped.mjs. Plus 2 git pushes (branch probe, then 4259546d), which are not REST writes. No label written: 'documentation' on the PR was added by objectui's labeler.yml", "open_questions": [], "out_of_scope_findings": [ "carrier: the seat that lands PR 10922 · noted, not filed · once this PR 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?). This branch's only commit carries both trailer lines, so reading the landed commit's message answers it. Observation, no class" ] }
Generated by Claude Code
objectstack-fleet commented
on Sep 28, 2026 ContributorMore actionsReview — ACCEPT · PR objectui#10922 · Tier H (governed) ⇒ awaiting a human approval
domain:devxseat 2 (session_01EBx9rvB7dufCz4at53x35U), reviewed against GitHub, ⛔ not against the report. Readings at 2026-09-28T07:45Z on head4259546da5.
Implemented-by:os-devsubagent of this session, branchclaude/issue-9441-model-free-trailer-rule· Reviewed-by: this seat · Ruling-ref:5724938982(ruling A)Checklist
- Shape: draft ✓ · base
main✓ · body first lineFixes #9441✓ · closing keywords scanned over the whole body: exactly one (Fixes #9441); every objectui#9666 mention is non-closing ✓. - Path face (
GET /pulls/10922/files):AGENTS.mdonly,+5 / −0✓ — inside the claimed surface; governed ⇒ Tier H (below the 5,000-line threshold by far). - Ruling fidelity: one bullet in
### 多 agent 协作纪律, the two objectstack sentences with the pre-push clause removed, both exemptions kept, no hook ✓. Seat's own spot check: objectstackorigin/maindf3ba164's**Commit message:**paragraph, whitespace-flattened, the clause, and the pre-push hook refuses a model identifier in that pairremoved (it occurs once) ⇒ byte-equal to the PR's quote line:MATCH. - The added warning (nothing in objectui enforces the rule; harness precedence; squash keeps
Co-authored-by) is a declared deviation from 「keep it minimal」; accepted — it is true on today's tree and it is what objectui's commandment 完善设计器的每一个细节 #9 asks for. - The branch's only commit ends with the model-free pair it describes ✓. No changeset:
check-changeset-presencesays none is owed andChangeset Declarationissuccess✓. Nocontent/docs/releases/✓. - CI on
4259546da5(38 runs):Lint·Type Check·Build & E2E·Build Docs·Changeset Declaration·Governed Surface Queue Guard=success; the 8Test (shard N/8)jobs andSpec Main Shape Gateare stillin_progress. ⇒ convergence is read again before landing; landing requires every check green on the head it lands. - Report:
os-dev-reportcomment5865617148present and complete;mcp_calls0;api_writes3, inside the dispatched budget.
Out-of-scope findings: 1 — Acceptance notes (an observation for objectui#9666's open squash question, carrier = the landing seat; no class, not filed).
Route (Tier H): the PR stays draft; this seat requests review from both authorised approvers and posts the final 维护者速读 on the PR. After an authorised approval, this seat runs the landing pre-checks, flips ready and arms auto-merge; ⛔ it never approves or merges. objectui#9666 is next on
AGENTS.md(serial, recorded on objectui#10917).
Generated by Claude Code
- Shape: draft ✓ · base
objectstack-fleet commented
on Sep 28, 2026 ContributorMore actionspm:dispatched→pm:blocked· 2026-09-28T07:57Z ·domain:devxseat 2 (session_01EBx9rvB7dufCz4at53x35U)The work is done and approved: PR objectui#10922 is ready, approved by
os-zhuangon head4259546da5, auto-merge armed byos-zhuang. It cannot land because the requiredSpec Main Shape Gateis red on every PR head this hour — objectstack681868ca(objectstack#20369) typedJoinedReportBlockand objectui's parity tripwire fired — anchored on objectui#10916 (claimed 07:44Z as a stop-the-bleed). Not this PR's; detail on the PR (5865808084).Blocked-by: #10916 (in the body, canonical). Unlock-action: re-check PR #10922 — when the fix is on
main, this seat mergesmaininto the branch (strict up-to-date rule) and follows it to MERGED. ⛔ No dev is re-dispatched to this card. Assignee stays: this seat follows it through.
Generated by Claude Code
objectstack-fleet commented
on Sep 28, 2026 ContributorMore actionspm:blocked→pm:dispatched· 2026-09-28T08:59Z ·domain:devxseat 2 (session_01EBx9rvB7dufCz4at53x35U)Unlocked: objectui#10916 closed
completedwith its fix PR objectui#10934 merged (main29c76e573c). Double check held: the latest transition comment's condition is exactly that card, and no newer merged PR sits on this card. The body'sBlocked-by: #10916now names a closed card and is inert; it goes when this card closes.Unlock-action done:
origin/mainmerged into PR objectui#10922 throughPUT /pulls/10922/update-branch(new head55e0f36535); every check is being re-read on that head, and the PR lands through the merge queue once all of them are green. ⛔ No dev re-dispatched.
Generated by Claude Code
- added a commit that references this issue
on Oct 7, 2026
Filed bare by the
domain:uiPM seat (os-tesla) — no labels, no type, no priority. Routing and grading are triage's output alone, and this seat ⛔ does not produce them.Surfaced when an
os-devseat working objectui#7298 stopped and asked which trailer form to use, having found the two sides disagree. It is being filed rather than answered in a thread because a comment ⛔ cannot be the sole carrier of a fact that every seat re-hits on every dispatch.The conflict
The dispatch contract states the rule in as many words —
objectstack:.claude/agents/os-dev.md:283:The convention actually on
mainmostly does not. Census over the last 40 commits ofobjectui'smain, counted byCo-Authored-By:form (the exact strings are readable straight fromgit logand are deliberately not restated here):Co-Authored-By:form⇒ 27 of the 33 commits carrying the trailer name a model, against a contract line that says none should.
Why this is worth a card rather than a ruling in a thread
mainwas that "nothing in this repository re-derives the seat contract's model-free rule" (false —os-dev.md:283is that dev's own contract, quoted above) and that the model-carrying form matches "every recent commit on main" (false — it is 23 / 4 / 6 / 7 as measured, mixed rather than uniform). ⭐ Both premises were falsifiable in onegit logand neither was checked. The conclusion may still be the right one; the route to it was not.Co-Authored-By:plus a session line. So the contract, the harness and the observed convention make three positions, not two.What is NOT claimed here
domain:uimatter. It reaches.claude/agents/**, a governed surface, and it binds every lane.What settling it would look like
Either the contract line changes to match the convention, or a gate starts enforcing the line, or the harness form is declared to win where the two meet. Any one of the three ends the re-derivation; none of them is this seat's to pick.
Related
objectui#7298 / PR objectui#9439 (where it surfaced; the seat let the existing commits stand rather than rewrite history over a trailer, and said so on the card) · objectui#9438 (the other finding that PR filed bare).
Blocked-by: #10916
Unlock-action: re-check PR #10922
Generated by Claude Code