Skip to content

Commit 345f0b1

Browse files
docs(pm-dispatch, os-dev): the claim template and the dev definition carry the Metadata-protocol: line beside Clause-②: (#25240)
<!-- claude-projects-attribution: {"github_login":"os-bill"} --> _Requested by **Bill** · [project thread](https://claude.ai/code/project/chan_016iMXWSZDzqWRWvWzdNo8wg?thread=cmsg_016iMXWSZDzqWRWvWzdNo8wg4pchBqTn9cQG5gfEpLYo8a)_ Fixes #25115 Clause-②: no Metadata-protocol: none ## What changes The `.claude/**` half of the maintainer's ruling A on changeset levels (the level follows the metadata protocol alone): the fleet's own dispatch path now knows the `Metadata-protocol:` declaration line that PR #25114 installed beside `Clause-②:`. - `.claude/skills/pm-dispatch/SKILL.md` — the claim template carries `Metadata-protocol: added | narrowed | semantic | none` right under `Clause-②: yes | no`, with a parenthetical pointing the seat at the level table by its subject (AGENTS.md's Post-Task Checklist, step 3) and naming the two bodies the dev copies it into. - `.claude/agents/os-dev.md` — the claim-copy rule widens from one line to the pair and names both carriers: the two lines are copied verbatim at line start into the PR body, and into every changeset body, where `Check Changeset` reads them (a kind grades `minor`, `none` grades `patch`). Same 「无则零写,⛔ 不自造」 discipline. - `.claude/skills/pm-dispatch/references/execution-duties.md` — claim step ② names the third line-initial key, and the `Clause-②` spelling rule gains a sibling: the four values and the level table live in AGENTS.md's Post-Task Checklist ③. Not touched, by measurement: `references/contract-review.md` and `references/landing-operations.md` route the contract review on `Clause-②` (the review tier follows the FACE of the diff, the level follows the KIND), so neither needs to read the kind; `os-dev.md`'s dogfood trigger still reads the `(narrowing)` arm. The reader (`scripts/pm/clause2-line.mjs`), the level axis (`check-changeset-no-major.mjs`), `AGENTS.md` and `pr-automation.yml` are out of scope and unchanged. ## Line budget (`check:pm-skill-ratchet`, every file at headroom 0 on the base) | File | Base | Head | Paid with | |:--|--:|--:|:--| | `.claude/skills/pm-dispatch/SKILL.md` | 319 / 319 | 318 / 319 | +1 template line; −2: the template caption line 「认领评论(英文,固定形状;首行字面 `Claim:`):」 and its trailing blank. Its content is carried by execution-duties ② (「认领评论照抄 SKILL.md 模板」), SKILL.md 全体座位的不变量 (GitHub 上一切新内容用英文) and AGENTS.md (the identity record is the `Claim:` comment, first line beginning `Claim:`). | | `.claude/agents/os-dev.md` | 404 / 404 | 404 / 404 | +1 (the copy rule is now two lines); −1: 「正文以 session-URL 形式的署名页脚收尾(见字节与 sanitizer 纪律节)。」, an intra-file pointer to the footer block two sections down, whose own annotation already says 「session-URL:创建 PR 正文用」 (and AGENTS.md's identical block says "session-URL: use in PR BODIES"). First candidate measured and rejected: the commit-trailer rule 「卡片关系只在 PR 正文声明一次…」 is quoted verbatim by `scripts/check-commit-card-trailers.mjs`, whose self-test pins the quotation to the file, so deleting it reds `check:commit-card-trailers`. | | `.claude/skills/pm-dispatch/references/execution-duties.md` | 188 / 188 | 187 / 188 | +1 (the kind pointer); −2: the preamble line 「执行席每次 fire 读本文:候选、认领、派发、收集、复核;落地窗口另读 `landing-operations.md`。」 and its trailing blank. SKILL.md's 阶段细则索引 rows carry the same reader, moment and sections for this file and for landing-operations.md. | No line was re-wrapped; every new bullet is under the 120-byte cap (110 / 111 / 114 / 113 B); every sentence a script quotes from these files is still there verbatim (measured with a scan of `scripts/**`, `.github/**`, `.githooks/**` and `.claude/hooks/**` for each edited file's base lines). The four-axis frame is untouched (md5 of its 21 lines: `abff5f852c8fd09b79ec0623439aa4f0`, same as on the base). The two ceilings left at headroom 1 can be lowered to 318 and 187 by the seat at landing or in the next tooling PR; `scripts/**` is outside this card's surface. ## Proof the new lines read - `node scripts/pm/post-stamped.mjs --dry-run --comment=25115 --file=claim.md` on a claim written from the new template (both lines at line start): exit 0, `Stamp verdict: stamped-by-this-act`, no keyed-line refusal. - `scripts/pm/clause2-line.mjs` imported directly over a PR-body sample and a changeset-body sample carrying both lines: `readClause2Line` → `declared no` / `declared yes (widening)`; `readMetadataProtocolLine` → `declared none` / `declared added` (trailing reasoning ignored, as the reader documents). The template placeholders themselves read `malformed`, as they should — a seat that forgets to fill the line is refused, never read as `none`. - This PR body carries both lines at line start, which is the behaviour the card installs. ## Gates Local subset, run on the committed head `588f0599` in the card worktree, every exit code captured before any pipe (`cmd > log 2>&1; EXIT=$?`), reconciled with `node scripts/pm/dispatch-gates.mjs --ran` (22 derived, 22 run, 0 NOT-MEASURED, 0 UNRUN; changed lines 12, +5 / −7, 3 files): | Command | Exit | |:--|--:| | `node scripts/check-closing-keyword-parity.mjs` (+ `--self-test`) | 0 / 0 | | `node scripts/check-comment-mask-corpus.mjs` | 0 | | `node scripts/pm/check-governed-queue-guard.mjs --self-test` | 0 | | `node scripts/pm/check-harness-current.mjs --self-test` | 0 | | `pnpm --filter @objectstack/lint run check:doc-formula-expressions` (after `turbo run build --filter=@objectstack/formula --filter=@objectstack/lint` under the verify lock; a first run exited 3, prerequisite not met) | 0 | | `pnpm check:agent-model-declared` | 0 | | `pnpm check:agent-test-spelling` | 0 | | `pnpm check:commit-card-trailers` | 0 | | `pnpm check:cross-package-test-inputs` | 0 | | `pnpm check:doc-authoring` | 0 | | `pnpm check:driver-memory-census` | 0 | | `pnpm check:gitlink-declared` | 0 | | `pnpm check:nul-bytes` | 0 | | `pnpm check:pm-expected-skips` | 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` (SKILL.md 318 / 319 · os-dev.md 404 / 404 · execution-duties.md 187 / 188) | 0 | | `pnpm check:refd-timer-probe` | 0 | | `pnpm check:skill-frame-sync` | 0 | | `pnpm check:watch-hint-literal` | 0 | `check:skill-frame-freshness` (local-only family) was not run: the worktree is at `origin/main` 03de83b plus this one commit, and the frame block is untouched. The whole-tree farm, the type-check lanes and `Check Changeset` are CI's; the PR check-runs are the record for those. No package is touched, so there is no ① build closure and no ② package test to owe; no changeset is written (`.claude/**` is the fast lane, nothing is published, `skip-changeset` rides the create). One interim red worth recording: the first payment chosen for os-dev.md deleted its commit-trailer rule line, and `check:commit-card-trailers --self-test` went red because that script quotes the sentence verbatim and pins the quotation to the file. The line was restored and the footer-pointer line paid instead; the final run above is on that tree. ## 维护者速读(草稿) ### 改了什么 PM 派发技能的认领模板、os-dev 开发定义和执行席细则,补上 `Metadata-protocol: added | narrowed | semantic | none` 这一行:席位认领时申报本卡改了元数据作者能写的什么,dev 把它和 `Clause-②:` 一起原样抄进 PR 正文和每个 changeset 正文。三个文件各加一行、各删一行付棘轮账,不动任何脚本。 ### 为什么改 你 10-21 的裁决 A 定了「changeset 定级只随元数据协议」,PR #25114 把读这一行的门禁落了地,但派发路径自己还不知道这行:模板只有 `Clause-②:`,os-dev 定义还写着「无则零写、不自造」。结果每个带 changeset 的派发 PR 都会先吃一次 `not-measured-material` 红,changeset 里也没有发布说明分组要的 kind。这张卡是裁决 A 没落地的那一半。 ### 风险与代价(含回滚) 纯规则文本,`.claude/**` 受管面 Tier S,CI 门禁(棘轮、id-lint、frame-sync 等)全绿才入队。风险只在删掉的三行是否真的冗余:模板题注(内容在执行席细则与 AGENTS.md)、commit trailer 规则(pre-push 门禁 check-commit-card-trailers 机械强制,AGENTS.md 已载)、执行席细则文首导读(SKILL.md 索引行已载)。回滚 = revert 本 PR,无数据、无运行时影响。 ### 席位意见 (席位填写) ### 你要做的 无需动作:Tier S 由 skills 席位契约复核 PASS 后入队落地。 ## Acceptance notes - Out-of-scope observation, carrier: the skills seat at landing — `scripts/pm/check-skill-line-ratchet.mjs` ceilings for SKILL.md (319 → 318) and execution-duties.md (188 → 187) can be lowered; `scripts/**` is outside this card's declared surface. - Out-of-scope observation, noted, not filed — `scripts/check-commit-card-trailers.mjs` pins one os-dev.md sentence verbatim, and no index says which rule lines are script-pinned; a future ratchet payment finds out by running the gate, as this one did. - Out-of-scope observation, noted, not filed — the first line of this PR body is the harness-prescribed HTML-comment attribution marker, which os-dev.md's 干净收尾 forbids in GitHub text; the seat's #25214 review already queued a skills card for that conflict (its OOS-2), so nothing new is filed here. - Standing conflict reported, not silently resolved: the dispatch order asked the card thread to post the `Claim:` and write the assignee; the runbook that landed with #25214 (〈卡线程(mode:thread)〉) and AGENTS.md give both acts to the seat, so the thread handed the seat a dry-run-clean claim text and started after the seat posted it. --- _Generated by [Claude Code](https://claude.ai/code/session_014c2nFpk7VDtwqxvaGaHPu3)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 9340181 commit 345f0b1

3 files changed

Lines changed: 5 additions & 7 deletions

File tree

‎.claude/agents/os-dev.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,8 @@ model: opus
277277
- 全量 dogfood 只在终 head 跑一次,仅当标题带 `!` 或 `Clause-②:` 带 `(narrowing)` 臂(yes/no 皆算)。
278278
- 命令同 CI:按 ① 建闭包,锁下 `pnpm --filter @objectstack/dogfood test`;⛔ 无 `OS_TEST_SHARD`、无路径。
279279
- 红 = 本改动的后果(陈旧 fixture)同 PR 修,余照报;⛔ 永不跳过或收窄;计数记 `dogfood_battery`。
280-
- 认领带 `Clause-②:` 行才照抄进正文行首:`Check Changeset` 读正文不读卡;无则零写,⛔ 不自造。
280+
- 认领的 `Clause-②:`、`Metadata-protocol:` 两行照抄进 PR 正文行首;无则零写,⛔ 不自造。
281+
- 两行同抄进每个 changeset 正文行首,`Check Changeset` 读:有 kind 即 `minor`,`none` 即 `patch`。
281282
- ⛔ 永不 `Fixes` 一张还在决策箱的卡:合并会静默关掉它,而收件箱过滤只读 open。
282283
- ⛔ 不写否定式的关单句,它照样关掉点名的卡:解析器无视否定,只匹配关键词 + `#<n>`。
283284
- 关键词是 `fix/fixes/fixed/close/closes/closed` 与 `resolve/resolves/resolved`;让它们远离其它卡号。
@@ -287,7 +288,6 @@ model: opus
287288
- 受管路径全在 `.claude/**` 者 Tier S,达档复核 PASS 在案即由席位入队落地;余皆 Tier H 等人批。
288289
- 受管面 PR 正文带 `## 维护者速读(草稿)` 节,中文、业务角度,席位意见留空;两层同欠。
289290
- 五段固定:改了什么/为什么改/风险与代价(含回滚)/席位意见/你要做的;席位定稿成评论。
290-
- 正文以 session-URL 形式的署名页脚收尾(见字节与 sanitizer 纪律节)。
291291
- 触 `skills/**`(对外发布的技能包)的 diff:PR 正文报两个读数,并默认拒绝小功能大扩写。
292292
- 两个读数缺一不可:被改文件的整文件 before/after,与整包 before/after(全部 SKILL.md 之和)。
293293
- 行数为准,姊妹门禁定义 token 计数后同报 token。

‎.claude/skills/pm-dispatch/SKILL.md‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,8 +299,6 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
299299

300300
## 模板与表
301301

302-
认领评论(英文,固定形状;首行字面 `Claim:`):
303-
304302
```text
305303
Claim: PM loop round N
306304
Session: `session_<id>`
@@ -312,6 +310,7 @@ Seat: `domain:<x>#<n>` (the seat number this PM sits on; absent = seat 1)
312310
File surface: `<预期触碰的目录>` (stop on breach; explain in the report)
313311
Container & model: `<S 级机械卡 / M / L>`, `mode:subagent | mode:cloud | mode:thread`, `model: <档位词,引当次 --tier 输出;天花板拼 CONTRACT_REVIEW_TIER,同行引其 MANDATORY 路径行或 reason:;⛔ 不抄模型 id>`, `effort: <medium | high | xhigh | max,按卡难度定>`
314312
Clause-②: yes | no
313+
Metadata-protocol: added | narrowed | semantic | none (the kind of change to what a metadata author can write; the level table is AGENTS.md's Post-Task Checklist step 3; the dev copies it beside `Clause-②:` into the PR body and every changeset body)
315314
Responsibility: `<whose code produces the risk | the platform path that already covers it, or none | who reaches it, and whether anyone uses it today>` (defect cards only, else `n/a — not a defect card`; the dispatch prompt's ruling section repeats the three answers)
316315
Thread-read: <id of the newest comment on the card at the moment this claim is written, or none>
317316
Serial constraints cleared: `<点名同文件/同包的前驱 PR 与在飞认领,及分诊点名的任意车道在飞兄弟卡中本卡 pin 断言其行为者;无则 none>`

‎.claude/skills/pm-dispatch/references/execution-duties.md‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
# 执行座位职责
22

3-
执行席每次 fire 读本文:候选、认领、派发、收集、复核;落地窗口另读 `landing-operations.md`。
4-
53
- 半状态巡查按需跑(分诊席每日对账可调),H 行是读数不是前提;⛔ 不因锚行停派发。
64

75
## 候选与批次
@@ -63,10 +61,11 @@
6361
- 同笔 `Release:` 行点名已落项与余项去向;余项需换道/拆分加 `pm:retriage`,自队列重新认领。
6462
- 派发前按序执行原子对:① Assign @me,并把 `pm:dispatched` 与摘 `pm:queue` 放进同一次标签写入。
6563
- step ① 之后获得 assignee 的直接弃出本批。
66-
- ② 认领评论(英文)照抄 SKILL.md 模板:`Claim:` 首行,`Branch:`、`Clause-②:` 各占一行且行首。
64+
- ② 认领评论照抄 SKILL.md 模板:`Branch:`、`Clause-②:`、`Metadata-protocol:` 各占一行且行首。
6765
- 条款②入队闸门只读认领评论且只读行首键:句中提及与另发评论皆读不到,卡即不可读。
6866
- 谓词保持严格、⛔ 不放宽;session ID 不可省,`mode:subagent` 下 dev 与 PM 同 ID,身份看分支。
6967
- `Clause-②: yes | no` 恰这两种拼写,恒英文机器判据;判据:本卡放宽接受集或扩大公开面吗。
68+
- `Metadata-protocol:` 四值与定级表住 AGENTS.md「Post-Task Checklist」③:定级只随元数据协议。
7069
- 公开面 = 包构建后的入口声明所达,⛔ 不只数入口的再导出清单。
7170
- 所达 = 再导出名,加经其 props、参数与返回类型可达的每个类型。
7271
- 语言包键已发布:包导出语言包及其派生类型(`TranslationKeys = typeof en`)即发布每个键。

0 commit comments

Comments
 (0)