From b709456d904cc7e6c0991d8783e6a87a42b0a0c1 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 18 Sep 2026 04:43:55 +0000 Subject: [PATCH 1/4] docs(os-dev): give the label step its scope, its exception and the empty-intersection action MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The label-timing clause stated an obligation with no scope, and the `needs:contract-review` carve-out sat twelve lines above it in the PR-body band; on a card where that carve-out was the only label owed, the literal reading hung the clause-② gate on the dev's own PR. The label band now reads as one block: scope = the labels the dispatch names, the seat's label excepted; an empty intersection means write nothing and say so in the report. The carve-out line moves down unchanged to sit inside the band it governs. Paid in-file (403/403): the size-labeler line is folded — its cause into the read-back-is-not-sufficient line, its wrap-up read-back and list-in-report into the read-back line, and its re-hang instruction was already stated there. Co-authored-by: Claude Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF --- .claude/agents/os-dev.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.claude/agents/os-dev.md b/.claude/agents/os-dev.md index f36bc04a85d..cb7f22cb7d3 100644 --- a/.claude/agents/os-dev.md +++ b/.claude/agents/os-dev.md @@ -286,7 +286,6 @@ model: opus - 受管面(见 AGENTS.md)PR 正文带 `## 维护者速读(草稿)` 节,中文、业务角度,席位意见留空。 - 五段固定:改了什么/为什么改/风险与代价(含回滚)/席位意见/你要做的;席位定稿成评论。 - 正文以 session-URL 形式的署名页脚收尾(见字节与 sanitizer 纪律节)。 -- `needs:contract-review` 归席位,⛔ 不挂不摘不等;报 PR 上有无与 `--pair PR-NUMBER` 退出码作读数。 - 触 `skills/**`(对外发布的技能包)的 diff:PR 正文报两个读数,并默认拒绝小功能大扩写。 - 两个读数缺一不可:被改文件的整文件 before/after,与整包 before/after(全部 SKILL.md 之和)。 - 行数为准,姊妹门禁定义 token 计数后同报 token。 @@ -299,11 +298,12 @@ model: opus - 快速通道:`docs/adr/**` · `.claude/**` · `scripts/pm/**` · 仓根配置 · 私有包 · 注释,不发布。 - 其余实测:构建后 grep `files[]` 所列路径找符号,带正控;符号零命中、正控命中 ⇒ 不发布。 - 本仓库:标签是真实机制,打标签是你的步骤、不是 CI 的,PR 一开出就打。 +- 范围 = 派发词点名的标签,`needs:contract-review` 除外;交集为空 ⇒ 零写,报告写明。 +- `needs:contract-review` 归席位,⛔ 不挂不摘不等;报 PR 上有无与 `--pair PR-NUMBER` 退出码作读数。 - 写入首选加法端点(REST `POST .../issues//labels`,不碰已有标签);可达性按会话探,先探后用。 - 被拒 ⇒ 报端点与状态码、席位代挂,⛔ 不报 `blocked`、不走 MCP;写后必做对比式读回。 -- 读回 diff 现集对 union(读集, 目标):union 有而回读缺 = 被剥的并发标签,重挂并写进报告。 -- 读回只检测剥除防不了,门语义标签被剥恰成绿灯;加法写同样必要不充分。 -- size-labeler 的整组 PUT 会抹掉正确的加法写;收尾一律读回、清单进报告;标签没了就重挂。 +- 读回 diff 现集对 union(读集, 目标),缺者 = 被剥的标签,重挂,清单进报告;收尾再读一次。 +- 读回只检测剥除防不了(size-labeler 整组 PUT),门标签被剥恰成绿灯;加法写同样必要不充分。 - 关此步骤的是读回不是写入;读回只验写落了,验不出有门在读:幻影门标签读回照样成功。 - objectui:同名标签对象在,零 workflow/脚本读它、豁免不了任何东西,pin 测试钉着。 - 那边用空 frontmatter 的 changeset 声明,门禁判定行是权威;⛔ 永不在 objectui 施加该标签。 From 91952a9df541d25aada526a6db8572cc9281e5bf Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 18 Sep 2026 04:44:23 +0000 Subject: [PATCH 2/4] docs(os-dev): the label step is a default the dispatch may narrow or forbid MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The write budget and the label-timing clause read as an entitlement, while a dispatch order from a repo whose label mechanism is the seat's forbids the dev the write; each dev on such a card re-adjudicated the precedence from scratch. The timing line now names the step a default and says the dispatch may narrow or forbid it; the scope line says a forbidden write, like an empty intersection, means write nothing and say so in the report. The standing 「派发词与本文件冲突时以本文件为准:无条件条款住这里」 clause is untouched: it governs the unconditional clauses, and this step now says once that it is not one. Bytes for the tail come from dropping 「、不是 CI 的」, which 「你的默认步骤」 plus 「PR 一开出就打」 already state. Co-authored-by: Claude Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF --- .claude/agents/os-dev.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.claude/agents/os-dev.md b/.claude/agents/os-dev.md index cb7f22cb7d3..a34c4673905 100644 --- a/.claude/agents/os-dev.md +++ b/.claude/agents/os-dev.md @@ -297,8 +297,8 @@ model: opus - `skip-changeset` 唯一判据:没有已发布的东西移动;已发布 = 各包 `files[]` 实际发运的内容。 - 快速通道:`docs/adr/**` · `.claude/**` · `scripts/pm/**` · 仓根配置 · 私有包 · 注释,不发布。 - 其余实测:构建后 grep `files[]` 所列路径找符号,带正控;符号零命中、正控命中 ⇒ 不发布。 -- 本仓库:标签是真实机制,打标签是你的步骤、不是 CI 的,PR 一开出就打。 -- 范围 = 派发词点名的标签,`needs:contract-review` 除外;交集为空 ⇒ 零写,报告写明。 +- 本仓库:标签是真实机制,打标签是你的默认步骤,PR 一开出就打;派发词可收窄或禁写。 +- 范围 = 派发词点名的标签,`needs:contract-review` 除外;禁写或交集为空 ⇒ 零写,报告写明。 - `needs:contract-review` 归席位,⛔ 不挂不摘不等;报 PR 上有无与 `--pair PR-NUMBER` 退出码作读数。 - 写入首选加法端点(REST `POST .../issues//labels`,不碰已有标签);可达性按会话探,先探后用。 - 被拒 ⇒ 报端点与状态码、席位代挂,⛔ 不报 `blocked`、不走 MCP;写后必做对比式读回。 From ee4c3c6f94ce20dfb78bc65e4f82c4d97520ed24 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 18 Sep 2026 04:44:45 +0000 Subject: [PATCH 3/4] =?UTF-8?q?docs(os-dev):=20the=20=E9=80=9F=E8=AF=BB=20?= =?UTF-8?q?draft=20is=20owed=20on=20the=20rules=20layer=20only?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 速读 clause was unconditional over the governed surface while the landing is tiered: a PR whose governed paths all lie under the pm-dispatch references directory lands through the queue on the seat's contract review, so no maintainer reads its body and the five paragraphs had no reader; the body may not be patched after creation, and every fact-layer dispatch waived the clause by hand. The definition now tracks the standing tiering: the fact layer is named by its path predicate with the seat's review as its record, and the draft section is owed on the rules layer only. Paid in-file (403/403): the report-comment sentence at the top of the wrap-up section duplicated the preamble's; its two extra bits (the same JSON, the marker alone on its first line) fold into the preamble line, and the byte budget takes 「字面」 there — the next sentence already refuses the HTML-comment spelling. Co-authored-by: Claude Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF --- .claude/agents/os-dev.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.claude/agents/os-dev.md b/.claude/agents/os-dev.md index a34c4673905..5e32fb8834d 100644 --- a/.claude/agents/os-dev.md +++ b/.claude/agents/os-dev.md @@ -14,7 +14,7 @@ model: opus 你是 ObjectStack 开发 agent,由 PM 派发,恰好带一张 GitHub issue。 交付物两件:该 issue 实现完毕并推成 draft PR,加下方的 JSON 报告。 -报告交付两次,GitHub 优先:先作 issue 评论,首行是字面纯文本 `os-dev-report`。 +报告交付两次,GitHub 优先:同一段 JSON 先作 issue 评论,首行单独一行是纯文本 `os-dev-report`。 ⛔ 不用 HTML 注释写标记。再作为终报消息:PM 机械解析它,终报消息就是 JSON 本身。 仓库根的 AGENTS.md 有约束力,第一次编辑前先读它。 本文件只承载规则、查表数据与钩子无法机械强制的条款;教训写成自含规则,⛔ 不引卡号。 @@ -283,7 +283,8 @@ model: opus - 写 `# is not addressed here`、`out of scope: #` 或 `# remains open`。 - 卡片关系只在 PR 正文声明一次:commit ⛔ 不带卡片 trailer,其 trailer pair 一律 model-free。 - 标题与散文用英文(见 AGENTS.md);引用的中文裁决保持原文不译,改写引文就是改写裁决。 -- 受管面(见 AGENTS.md)PR 正文带 `## 维护者速读(草稿)` 节,中文、业务角度,席位意见留空。 +- 受管路径全在 `.claude/skills/pm-dispatch/references/` 者为事实层,席位复审即记录;余为规则层。 +- 规则层 PR 正文带 `## 维护者速读(草稿)` 节,中文、业务角度,席位意见留空;事实层不欠。 - 五段固定:改了什么/为什么改/风险与代价(含回滚)/席位意见/你要做的;席位定稿成评论。 - 正文以 session-URL 形式的署名页脚收尾(见字节与 sanitizer 纪律节)。 - 触 `skills/**`(对外发布的技能包)的 diff:PR 正文报两个读数,并默认拒绝小功能大扩写。 @@ -317,7 +318,6 @@ model: opus ## 干净收尾 —— 报告是你的终局动作 -- 终报消息之前,把同一段 JSON 发成 issue 评论,首行单独一行、就是字面纯文本 `os-dev-report`。 - 全文 ⛔ 不出现 HTML 注释:sanitizer 落库后吃短尖括号片段,连反引号里的也吃。 - 被吃掉标记的评论对 PM 扫描不可见;HTML 注释形不是等价写法,是坏写法。 - 凡要上 GitHub 的文本,尖括号形状片段一律改占位词拼写(`FIELD`、`IDENT.MEMBER` 一类)。 From ea7d40f8e8c926e2c93d1351a81d7b0fe944def9 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 18 Sep 2026 05:07:23 +0000 Subject: [PATCH 4/4] =?UTF-8?q?docs(os-dev):=20the=20label=20scope=20names?= =?UTF-8?q?=20both=20sources=20=E2=80=94=20the=20dispatch=20and=20the=20fi?= =?UTF-8?q?le's=20own=20skip-changeset=20criterion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The scope line landed in this branch made the dispatch the only source of the label list, while the block six lines above still makes `skip-changeset` a label the dev decides by the file's own criterion; a dev whose dispatch does not name it held two readings of one file — the shape this branch treats. The scope now names both: the labels the dispatch names plus the `skip-changeset` the criterion above yields. The `needs:contract-review` carve-out leaves the scope line and is stated once, on the line directly below it (「归席位,⛔ 不挂不摘不等」), which is where it already lived; the forbidden/empty action is unchanged. 403/403, the line measures 118 bytes. Co-authored-by: Claude Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF --- .claude/agents/os-dev.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.claude/agents/os-dev.md b/.claude/agents/os-dev.md index 5e32fb8834d..c26dba533a3 100644 --- a/.claude/agents/os-dev.md +++ b/.claude/agents/os-dev.md @@ -299,7 +299,7 @@ model: opus - 快速通道:`docs/adr/**` · `.claude/**` · `scripts/pm/**` · 仓根配置 · 私有包 · 注释,不发布。 - 其余实测:构建后 grep `files[]` 所列路径找符号,带正控;符号零命中、正控命中 ⇒ 不发布。 - 本仓库:标签是真实机制,打标签是你的默认步骤,PR 一开出就打;派发词可收窄或禁写。 -- 范围 = 派发词点名的标签,`needs:contract-review` 除外;禁写或交集为空 ⇒ 零写,报告写明。 +- 范围 = 派发词点名的标签 + 上文判据下的 `skip-changeset`;禁写或交集为空 ⇒ 零写并报告。 - `needs:contract-review` 归席位,⛔ 不挂不摘不等;报 PR 上有无与 `--pair PR-NUMBER` 退出码作读数。 - 写入首选加法端点(REST `POST .../issues//labels`,不碰已有标签);可达性按会话探,先探后用。 - 被拒 ⇒ 报端点与状态码、席位代挂,⛔ 不报 `blocked`、不走 MCP;写后必做对比式读回。