Skip to content

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

@os-tesla

Filed bare by the domain:ui PM 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-dev seat 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:

卡片关系只在 PR 正文声明一次:commit ⛔ 不带卡片 trailer,其 trailer pair 一律 model-free。

The convention actually on main mostly does not. Census over the last 40 commits of objectui's main, counted by Co-Authored-By: form (the exact strings are readable straight from git log and are deliberately not restated here):

Co-Authored-By: form commits
carries one model's name 23
carries a different model's name 4
model-free 6
(no such trailer) 7

⇒ 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

  • It is not a one-off. Every dev seat writes this trailer on every commit, so each one either re-derives the conflict or silently picks a side. One did stop and ask; the cost of the rest not asking is invisible.
  • ⚠️ The reasoning that first resolved it was wrong in both premises, which is the real tell that this needs settling once. The dev's stated basis for following main was that "nothing in this repository re-derives the seat contract's model-free rule" (false — os-dev.md:283 is 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 one git log and neither was checked. The conclusion may still be the right one; the route to it was not.
  • There is a third party to the conflict, which is why a seat should not settle it alone: the agent harness independently instructs a model-carrying 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

  • ⛔ No judgement on which form should win. That is the maintainer's.
  • ⛔ No claim that any commit is defective. Nothing is broken; no gate refuses either form (which is itself part of the finding — the contract line is unenforced, so drift is free).
  • ⛔ Not a domain:ui matter. 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

Activity

  1. hotlong commented on Sep 18, 2026

    @hotlong
    Contributor

    Ruling: batch #152 item 1 · letter A (objectui's AGENTS.md gains objectstack's model-free commit-trailer rule and its two exemptions — text only, ⛔ no hook) · maintainer 「其他同意」 2026-09-18T03:58Z

    Director 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:283 says the trailer pair is model-free, and objectstack AGENTS.md:440-444 spells it out — Claude-Session: https://claude.ai/code/session_<id> and Co-authored-by: Claude <noreply@anthropic.com>, the pre-push hook refusing a model identifier in that pair, with two exemptions (a harness-written Co-Authored-By trailer is reporting, ⛔ not a deviation, and landed history is not rewritten; a verbatim maintainer ruling quoted as a block). objectui's AGENTS.md carries none of it. This card's 09-13 census (27 of 33 trailers naming a model) is stale: the last 40 commits on objectui main today read 39 model-free / 1 Claude 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 whose AGENTS.md is silent (the reminder itself yields to a CLAUDE.md / AGENTS.md rule).

    Ruling — A

    • objectui AGENTS.md gains 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:p3 stay. AGENTS.md is governed ⇒ human merge by the approver.


    Generated by Claude Code

  2. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1
    Session: session_01EBx9rvB7dufCz4at53x35U
    Account: huangyiirene (the seat's linked user as get_me answers 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: root AGENTS.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.md is 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}/files over all 12 open objectui PRs (1,936 filenames examined, read before this claim) — none touches AGENTS.md or CLAUDE.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 objectui AGENTS.md), ② same file, ③ both ruled, ④ each checkable by its own text — but objectui#9666 is priority:p2 and docs/NORTH-STAR.md priority rule 3 bars this lane from dispatching p2 tool cards while its P1s are open ⇒ serial: objectui#9441 → objectui#9666; the second merges main first. 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

  3. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    os-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

  4. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    Review — ACCEPT · PR objectui#10922 · Tier H (governed) ⇒ awaiting a human approval

    domain:devx seat 2 (session_01EBx9rvB7dufCz4at53x35U), reviewed against GitHub, ⛔ not against the report. Readings at 2026-09-28T07:45Z on head 4259546da5.
    Implemented-by: os-dev subagent of this session, branch claude/issue-9441-model-free-trailer-rule · Reviewed-by: this seat · Ruling-ref: 5724938982 (ruling A)

    Checklist

    • Shape: draft ✓ · base main ✓ · body first line Fixes #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.md only, +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: objectstack origin/main df3ba164's **Commit message:** paragraph, whitespace-flattened, the clause , and the pre-push hook refuses a model identifier in that pair removed (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-presence says none is owed and Changeset Declaration is success ✓. No content/docs/releases/ ✓.
    • CI on 4259546da5 (38 runs): Lint · Type Check · Build & E2E · Build Docs · Changeset Declaration · Governed Surface Queue Guard = success; the 8 Test (shard N/8) jobs and Spec Main Shape Gate are still in_progress. ⇒ convergence is read again before landing; landing requires every check green on the head it lands.
    • Report: os-dev-report comment 5865617148 present and complete; mcp_calls 0; api_writes 3, 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

  5. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    pm:dispatched → pm:blocked · 2026-09-28T07:57Z · domain:devx seat 2 (session_01EBx9rvB7dufCz4at53x35U)

    The work is done and approved: PR objectui#10922 is ready, approved by os-zhuang on head 4259546da5, auto-merge armed by os-zhuang. It cannot land because the required Spec Main Shape Gate is red on every PR head this hour — objectstack 681868ca (objectstack#20369) typed JoinedReportBlock and 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 merges main into 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

  6. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    pm:blocked → pm:dispatched · 2026-09-28T08:59Z · domain:devx seat 2 (session_01EBx9rvB7dufCz4at53x35U)

    Unlocked: objectui#10916 closed completed with its fix PR objectui#10934 merged (main 29c76e573c). Double check held: the latest transition comment's condition is exactly that card, and no newer merged PR sits on this card. The body's Blocked-by: #10916 now names a closed card and is inert; it goes when this card closes.

    Unlock-action done: origin/main merged into PR objectui#10922 through PUT /pulls/10922/update-branch (new head 55e0f36535); 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

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

Metadata

Metadata

Assignees

Labels

domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopriority:p1

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions