diff --git a/.claude/agents/os-dev.md b/.claude/agents/os-dev.md index 6e47e34064..86f49ead1f 100644 --- a/.claude/agents/os-dev.md +++ b/.claude/agents/os-dev.md @@ -35,7 +35,7 @@ model: opus - 你的身份位是认领评论里的分支;仓 CLAUDE.md 的 claim-first 已由 PM 的认领满足。 - 你恒不写 assignee;到手时它为空照常开工,报进 `summary`。 - 发现与他人在途工作重复,停下报 `blocked`。 - - PR 上不是你设置的状态属于另一个 actor:去问,⛔ 永不去纠正。 + - PR 上不是你设置的状态属于另一个 actor:⛔ 永不去纠正;疑问进报告,挡住报 blocked。 - 共享身份让所有人的写入都像你写的;被改写的 body 只是关于 body 的证据,不证明别的。 - 回退他人的操作(尤其 ready 翻转)永不轮到你;把意外写进 `summary`。 3. **范围 = 这张 issue,别无其它。** 顺路撞见的无关缺陷立成新的无 assignee issue。 @@ -276,19 +276,19 @@ model: opus - 关键词是 `fix/fixes/fixed/close/closes/closed` 与 `resolve/resolves/resolved`;让它们远离其它卡号。 - 写 `# is not addressed here`、`out of scope: #` 或 `# remains open`。 - PR 正文与 commit message 分开解析:卡片关系只在正文声明一次,commit ⛔ 不带卡片 trailer。 -- squash 会把全部 commit message 连成一条落地,逐条诚实拼成的一条自相矛盾。 - 标题与散文用英文(见 AGENTS.md);引用的中文裁决保持原文不译,改写引文就是改写裁决。 - 受管面(见 AGENTS.md)PR 正文带 `## 维护者速读(草稿)` 节,中文、业务角度,席位意见留空。 - 五段固定:改了什么/为什么改/风险与代价(含回滚)/席位意见/你要做的;席位定稿成评论。 - 正文以 session-URL 形式的署名页脚收尾(见字节与 sanitizer 纪律节)。 +- 认领写 `Clause-②: yes` ⇒ 开 PR 同笔挂 `needs:contract-review`,报告附 `--pair N` 退出码。 - 触 `skills/**`(对外发布的技能包)的 diff:PR 正文报两个读数,并默认拒绝小功能大扩写。 - 两个读数缺一不可:被改文件的整文件 before/after,与整包 before/after(全部 SKILL.md 之和)。 - 行数为准,姊妹门禁定义 token 计数后同报 token。 - 净增预算装不下 ⇒ 按 `blocked` 报缺口;⛔ 不自行扩写或抬预算:预算归 PM,抬它归维护者。 -- 付行数棘轮的唯一合法货币是删内容:⛔ 不拿 re-wrap(折行合并)当筹行。 -- 棘轮治理的是内容体量,行数只是机读代理,新增以删减付账;密度优化只随净减内容的 PR。 -- 分界只问折行有没有为新增内容买行,门禁分不出两种 net-0。 +- 付行数棘轮的唯一合法货币是删内容:⛔ 不拿 re-wrap(折行合并)当筹行,新增以删减付账。 +- 密度优化只随净减内容的 PR;分界只问折行有没有为新增内容买行。 - ⛔ 不把不买内容的密度修复当筹行拒掉;删不出等量内容 ⇒ 报 `blocked`,⛔ 不抬 ceiling。 +- 例外:派发令点名测量优先的零余量受管账本 ⇒ 落行、不动上限行、红着报实测行数。 - `skip-changeset` 标签按仓库分流,先认清目标仓有没有这个机制;判据:不从任何包发布东西。 - 例:`docs/adr/**` · `.claude/**` · `scripts/pm/**` · 仓根工具配置 · 私有 workspace · 注释。 - 本仓库:标签是真实机制,打标签是你的步骤、不是 CI 的,PR 一开出就打。 diff --git a/.claude/skills/checklist-test/SKILL.md b/.claude/skills/checklist-test/SKILL.md index af42edace8..9f4b73d391 100644 --- a/.claude/skills/checklist-test/SKILL.md +++ b/.claude/skills/checklist-test/SKILL.md @@ -225,10 +225,10 @@ QA-source: #运行记录号 · area.item · 条款 - **不伪造覆盖。** 缺 fixture → `blocked(fixture)` 带理由;console 没构建 → 构建它 或记 `blocked(environment)`;证到一半的项是 `partial`,不是 `pass`。带证据的 blocked 判定是一次成功运行;伪造的 pass 不是。 -- **认证 / 授权漏洞的复现,永不发布到 GitHub 的任何地方** —— 不进运行 issue,不进跟 - 踪卡,不进评论。记下项 id、条款与 `detail withheld pending maintainer`,复现留在会 - 话里,停下等维护者。⚠ 这与 RUNNER 规则 2 是**同一条规则写在两处**,⛔ 两边都不是 - 对另一边的优先级主张;完整论证与它的维护者裁定在 RUNNER。 +- **认证 / 授权漏洞的复现,永不发布到 GitHub 的任何地方** —— 不进运行 issue,不进跟踪 + 卡,不进评论。记下项 id、条款与 `detail withheld pending maintainer`,复现留在会话里,本轮以该报 + 告终局,⛔ 不等维护者。⚠ 这与 RUNNER 规则 2 是**同一条规则写在两处**,⛔ 两边都不是对 + 另一边的优先级主张;完整论证与它的维护者裁定在 RUNNER。 - **不把 blocked 项当可运行的跑** —— 解析器隐藏它们正为此。 - **一个选择器、一次运行、一张 issue。** release sweep 把 `since:vN` 与 `priority:P0` 作为分开的两轮跑 → 两张 issue,不要糊在一起。 diff --git a/.claude/skills/pm-dispatch/references/dispatch-runbook.md b/.claude/skills/pm-dispatch/references/dispatch-runbook.md index f8d8d730bc..40f82b5e4e 100644 --- a/.claude/skills/pm-dispatch/references/dispatch-runbook.md +++ b/.claude/skills/pm-dispatch/references/dispatch-runbook.md @@ -209,7 +209,7 @@ - 派发那刻现取,把该副本的 commit 与 md5 记进派发词。 - ⛔ 仓内任何文件不得另立第三份,`check:skill-frame-sync` 全树扫;os-dev 定义没带就停下索取。 - 文件面两句原文照抄:预期落点是 X。 -- 若实测表明真正的生产者在别包,报备后按生产者侧修,落点与理由写进报告和 PR 正文。 +- 若实测表明真正的生产者在别包,直接按生产者侧修,落点与理由写进报告和 PR 正文。 - ⛔ 不在消费者侧打补丁;只写一个路径名,是要求 dev 在守约与修对之间二选一。 - 跨包常等于跨车道,PM 事后补跨座位声明。 - 模型标识只禁内容工件:PR 标题与正文、代码注释、文档、changeset、评论。 diff --git a/docs/qa/platform-checklist/RUNNER.md b/docs/qa/platform-checklist/RUNNER.md index 28900287c2..ba9804a8b4 100644 --- a/docs/qa/platform-checklist/RUNNER.md +++ b/docs/qa/platform-checklist/RUNNER.md @@ -67,13 +67,14 @@ test-run output the clause's `evidence` field names. the run issue, not a tracking or extracted card, not a comment. Relocating it is not a mitigation — a tracking card is a public issue in a public repo just the same. Such a `fail` **is a completed verdict** when it records the item id, the clause, and `detail - withheld pending maintainer`; the reproduction stays in the runner session, and the - runner stops there and waits for the maintainer. Existence published, recipe withheld, - is a complete and actionable report — getting a defect fixed never requires handing - anyone a working exploit. (Maintainer disclosure ruling, 2026-08-18, recorded on - #9387; the `checklist-test` skill states the same guardrail in the same terms — one - rule written in both places, not a precedence claim by either.) **No other failure - class is softened by this**: everything else owes its reproduction rule in full. + withheld pending maintainer`; the reproduction stays in the runner session, and the run + ends there with that report — a one-shot runner has no channel to wait on. Existence + published, recipe withheld, is a complete and actionable report — getting a defect + fixed never requires handing anyone a working exploit. (Maintainer disclosure ruling, + 2026-08-18, recorded on #9387; the `checklist-test` skill states the same guardrail in + the same terms — one rule written in both places, not a precedence claim by either.) + **No other failure class is softened by this**: everything else owes its reproduction + rule in full. 3. **Classify blockers honestly.** Missing seed/persona/fixture → `blocked(fixture)`, and *record the gap on the item* (`fixtures.knownGaps` or `blocked`) so the next sweep doesn't rediscover it. A defect in the fixture itself (seed silently failing, diff --git a/scripts/pm/check-skill-line-ratchet.mjs b/scripts/pm/check-skill-line-ratchet.mjs index fbeb9bfb93..9f9592a224 100644 --- a/scripts/pm/check-skill-line-ratchet.mjs +++ b/scripts/pm/check-skill-line-ratchet.mjs @@ -1049,7 +1049,7 @@ export const MAX_TABLE_ROW_BYTES = new Map([ ['.claude/skills/checklist-test/SKILL.md', 221], ['.claude/skills/checklist-author/SKILL.md', 0], ['.claude/skills/dogfood-verification/SKILL.md', 0], - ['.claude/skills/spec-property-retirement/SKILL.md', 328], + ['.claude/skills/spec-property-retirement/SKILL.md', 326], // Lowered 1081 → 768 by the rules-only rewrite: the translations row lost its // in-cell narrative; the widest survivor is that same row. Landed width, headroom 0. ['AGENTS.md', 768],