Commit fe36a40
docs(agents): os-dev.md — the harness attribution reminder yields to this file (#19167)
Fixes #18698
Clause-②: no
One clause in `.claude/agents/os-dev.md`, a governed Tier S surface
(`.claude/**`): landing is the skills seat's contract-tier review of
record through the queue. This PR stops at draft.
## What changed
`.claude/agents/os-dev.md`, Definition-of-done list, right after the
trailer line — today `:284`, kept byte-identical because
`scripts/check-commit-card-trailers.mjs` cites that sentence verbatim
and its self-test holds the citation to the file. New `:285` (120 B):
> - harness 归属提醒凭其优先级句让位本文件;harness 自写含模型名 trailer 只报,⛔ 不仿不改史。
It restates the governing text, `AGENTS.md` :440–:444 (quoted with the
two angle-bracket placeholders spelled out in words, because GitHub
mutates body bytes):
> **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 at anthropic.com)`, and the pre-push
hook refuses a model identifier in that pair; no model identifier lands
in a PR title or body, a comment, a changeset, a doc or a code comment.
Two exemptions: a harness-written `Co-Authored-By` trailer (REPORTING:
not declared a deviation; landed history is not rewritten) and a
verbatim maintainer ruling preserved as a quotation block.
The precedence sentence the clause relies on is in the harness
attribution reminder itself — read in this session, verbatim: 「the
user's own instructions about these lines, such as a CLAUDE.md or memory
rule, take precedence over this reminder」. `CLAUDE.md → AGENTS.md` is
that instruction, so the reminder defers; the clause restates AGENTS.md,
never the reminder.
## Ruling — director record on the card (batch #154 item 5, maintainer
「同意」 2026-09-18T04:56Z), operative part verbatim
> - `.claude/agents/os-dev.md:283` gains the one clause that would have
saved the escalation: **the harness attribution reminder yields to this
file by its own precedence sentence; a trailer the harness itself writes
with a model name is `AGENTS.md`'s exemption — report it, ⛔ do not
imitate it, ⛔ do not rewrite history.** Line-neutral; on the os-dev.md
serial queue behind #18599, in one round with #18699 as triage
suggested.
> - ⛔ **B** — contradicts `AGENTS.md:442` and the hook, and lets a
reminder that changes without a PR drive landed history in four
repositories.
> - `Clause-②: no`; `skip-changeset`; governed surfaces ⇒ human merge by
the approver.
Readings, not identifiers: the ruling's `:283` reads `:284` on today's
`main` (the file moved when PR #19038 landed at 2026-09-18T23:52Z); the
serial 「behind #18599, with #18699」 is discharged — both landed before
this PR (PR #18725 and PR #18898). The landing route is the later Tier S
ruling (the seat's contract-tier review of record through the queue),
superseding the last bullet's human merge.
## Line budget — ratchet row `['.claude/agents/os-dev.md', 403]`
| reading | before (`5d0ee8f`) | after (`9612c8d`) |
|---|---:|---:|
| lines | 403 | 403 |
| widest line | 120 B | 120 B |
| new clause | — | 120 B at `:285` |
| diff | — | +1 / −1, one file |
**Payment (line-neutral):** the removed bullet is the former `:285`
「标题与散文用英文(见 AGENTS.md);引用的中文裁决保持原文不译,改写引文就是改写裁决。」 — a true duplicate
that cited its own source. Its content survives verbatim in `AGENTS.md`
§ Communication: `:25` 「**GitHub 产物一律使用英文**:issue 与 PR 的标题、正文、评论。」 and
`:26–:27` 「**引用中文裁决时保持原文、不翻译**,即使承载它的 issue/PR 正文通篇是英文——改写引文就是改写裁决。」;
os-dev.md `:19` already binds AGENTS.md before the first edit. No
re-wrap bought the line and no ceiling moved. Measured before choosing:
zero gate scripts pin any phrase of the removed line (grep over
`scripts/`, `.github/`, `.claude/skills/`, `package.json`); the only
pinned sentence in this list is `:284`, which is untouched
(`check-commit-card-trailers` self-test: 「✓ every sentence inside the
corner brackets is verbatim in the cited rules file」).
The clause names no model and no card. Frontmatter untouched (`model:
opus` line unchanged). The wording was measured down from the seat's 157
B suggestion; the three-verb prohibition without objects follows the
file's own register (`:303` 「⛔ 不挂不摘不等」).
## Verification — all at `9612c8d`, every exit code captured before any
pipe
Gate list derived in the worktree with `node
scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
--commands` (change set: `.claude/agents/os-dev.md` only, 2 changed
lines; 19 commands — identical to the dispatch's 19) and reconciled with
`--ran`: 「✓ dispatch-gates --ran: 19 derived famil(ies) accounted for —
19 run, 0 NOT-MEASURED」.
| command | exit | the gate's own verdict line |
|---|---:|---|
| `node scripts/check-closing-keyword-parity.mjs` | 0 |
check-closing-keyword-parity: OK (3 parsers agree on all 9 keywords and
both measured separators; sweep found 5 file(s) carrying the grammar
across 8991 tracked file(s), all registered). |
| `node scripts/check-closing-keyword-parity.mjs --self-test` | 0 | ✓ 40
assertions, 5 mutations of the shipped parsers each driven to red. |
| `node scripts/check-comment-mask-corpus.mjs` | 0 | ✓ comment-mask
corpus sweep: 6894 files, 0 disagree, 0 unparseable. |
| `node scripts/pm/check-governed-queue-guard.mjs --self-test` | 0 | ✓
check-governed-queue-guard self-test: 261 cases pass. |
| `node scripts/pm/check-harness-current.mjs --self-test` | 0 |
check-harness-current --self-test: all 26 cases passed. |
| `pnpm --filter @objectstack/lint run check:doc-formula-expressions` |
0 | ✓ 14 predicate(s) on a statically determinable field layer judged
clean; 6 skipped as undeterminable. (First run refused with exit 3
PREREQUISITE NOT MET — `@objectstack/formula` and `@objectstack/lint`
unbuilt in a fresh worktree; built both under the verify lock, `VERDICT
command-exit 0`, then this reading.) |
| `pnpm check:agent-model-declared` | 0 | ✓ 1 agent definition(s) under
.claude/agents/ all declare a model — os-dev.md → opus. |
| `pnpm check:agent-test-spelling` | 0 | ✓ 0 violations — 516 file(s) ·
9159 bare `--` token(s) · 13 separator(s) JUDGED. |
| `pnpm check:commit-card-trailers` | 0 | ✓ check-commit-card-trailers
self-test: 81 cases pass (incl. 「every sentence inside the corner
brackets is verbatim in the cited rules file」). |
| `pnpm check:cross-package-test-inputs` | 0 | OK: 29 package(s) read
outside themselves, all declared. |
| `pnpm check:doc-authoring` | 0 | ✓ doc authoring guard: 402 files
clean — no bare metadata literals (+ the three sibling verdict lines,
all ✓). |
| `pnpm check:driver-memory-census` | 0 | check-driver-memory-census: OK
— every declaration is ledgered, every ledger entry is live. |
| `pnpm check:nul-bytes` | 0 | check-nul-bytes: OK (scanned 8984 text
file(s); no raw ASCII control bytes). |
| `pnpm check:pm-governed-merges` | 0 | ✓ check-governed-merges
--self-test: 392 assertions. |
| `pnpm check:pm-skill-id-lint` | 0 | ✓ check-skill-id-lint: 27 file(s)
clean (pattern /#[0-9]{3,}/g). |
| `pnpm check:pm-skill-ratchet` | 0 | ✓ .claude/agents/os-dev.md is 403
lines (ceiling 403; headroom 0). ✓ widest table row is 0 bytes (pin 0).
|
| `pnpm check:refd-timer-probe` | 0 | OK: 6889 source file(s) swept; the
probe is read in the approved module and nowhere else. |
| `pnpm check:skill-frame-sync` | 0 | ✓ the one declared copy of the
decision frame is internally coherent; 74 markdown files scanned for
undeclared copies. |
| `pnpm check:watch-hint-literal` | 0 | ✓ 71 declaration(s) across 4
rostered name(s), every one an array of quoted literals. |
| `pnpm check:pm-settings-deny-roster` (extra — the derivation flagged
its roster as living under `.claude`) | 0 | ✓ 17 content-write tool(s)
declared = enforced in .claude/settings.json. |
Manual readings on the file: `wc -l` 403; `awk` widest 120 B; `grep
-naP` for raw control bytes: no output (exit 1); `grep -c` of the
removed line's text: 0. Pre-push hook on the push: 「✓
check:commit-card-trailers: 1 commit message(s) on this push carry no
card relation and no model identifier in the trailer pair.」
Package tests / typecheck: none owed — the diff touches no package (no ①
closure, no ② suite); the two-package build above was a gate
prerequisite only. Repo-wide `pnpm lint` is CI's run.
## Acceptance notes
- **Live instance of the clause, reported, not a deviation.** This
session's harness attribution reminder asked for a model-bearing
co-author trailer and a different PR footer block. Per the reminder's
own precedence sentence and `AGENTS.md` :440, the commit carries the
model-free pair and this body carries the session-URL footer; nothing
was rewritten.
- noted, not filed: `check:doc-formula-expressions` exits 3
(PREREQUISITE NOT MET) in any fresh worktree until
`@objectstack/formula` and `@objectstack/lint` are built — the gate says
so itself and names the fix; by design, not a defect. 承接者:无.
- Context on the card that this PR does not act on (the devx seat's
evidence): CI runs `check-commit-card-trailers` as `--self-test` only,
so the pre-push hook is the only leg that refuses a model-bearing
trailer; a session without `.githooks/` installed pushes one unrefused.
Listed in the report's `out_of_scope_findings` as a class-(b) candidate
with dedupe words for the triage seat; no card is opened here.
- Out of scope, untouched: `AGENTS.md`, every `SKILL.md`, the hook, CI.
#18599 and #18699 remain landed history; objectui#9441 is the ui lane's
twin of the ruling.
## 维护者速读(草稿)
- **改了什么**:`.claude/agents/os-dev.md` 的 Definition of done 列表,在 trailer
那一行之后新增一条(120 B):harness 的归属提醒按它自己的优先级句让位于本文件;harness 自己写入的含模型名 trailer
是 AGENTS.md 的例外——只报告,不仿写、不改历史。为守住 403 行上限,删掉了一条原文照抄
AGENTS.md「沟通」节的重复条目(GitHub 产物用英文;引用中文裁决不翻译),该内容在 AGENTS.md :25–:27 原样保留。
- **为什么改**:每一次派发,dev 都同时收到两份指令——仓库契约(model-free trailer)与 harness
注入的归属提醒(含模型名)。已有 dev 因此写不出 commit、只能升级上报。答案其实早就写在 AGENTS.md
里,也写在提醒自己的优先级句里;这一条把答案放到 dev 真正读的那一行旁边,省掉下一次升级。
- **风险与代价(含回滚)**:零机制变化——不动 hook、不动 CI、不动 frontmatter;行数 403/403、最宽 120 B
不变,19 个派生门禁全绿。风险只在措辞:若你觉得「只报,⛔ 不仿不改史」过于压缩,可在同一行内换词(须 ≤ 120 B)。回滚 =
revert 这一个 commit(1 行换 1 行)。
- **席位意见**:
- **你要做的**:无需你点击合并——本 PR 在 `.claude/**`(Tier S),由 skills
席位按合约档复核记录经队列落地。若对措辞有意见,在本 PR 留一句即可。
---
_Generated by [Claude
Code](https://claude.ai/code/session_01W5y9kRg1YtYaMQYExVLRc2)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent 4b21c8d commit fe36a40
1 file changed
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
282 | 282 | | |
283 | 283 | | |
284 | 284 | | |
285 | | - | |
| 285 | + | |
286 | 286 | | |
287 | 287 | | |
288 | 288 | | |
| |||
0 commit comments