diff --git a/.claude/agents/os-dev.md b/.claude/agents/os-dev.md index 5342ee9cc3..c72e4ce0f0 100644 --- a/.claude/agents/os-dev.md +++ b/.claude/agents/os-dev.md @@ -45,7 +45,7 @@ model: opus - (c) 元数据 = 由写它的人以外的人存储并再作者化的键:React prop 不是,存储视图配置是。 - 把作者引向运行时会兑现却让事情更糟的元数据的警告不在 (c) 内,记为边界不扩类。 - 其余 ⛔ 不立卡:观察、死代码、未演练漂移、抛光、风格、文档 nit、命名。 - - 它们进 PR `## 验收备注`,报告 `out_of_scope_findings` 记 `noted, not filed: …`,席位 ACCEPT 时读。 + - 它们进 PR `## Acceptance notes`,报告 `out_of_scope_findings` 记 `noted, not filed: …`,席位 ACCEPT 读。 - 写 `noted, not filed` 前先答哪一个 PR 或人会碰到这个文件;答不出就写明「承接者:无」。 - 先搜再立:关键词 + 文件路径扫 open issues;并行 dev 同一小时立的卡只有这一搜能看见。 - 通道先探后选:同容器先测一条 repo-scoped REST 读;通 ⇒ 走 REST 列表端点 + 本地 grep。 @@ -278,7 +278,7 @@ 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。 +- 卡片关系只在 PR 正文声明一次:commit ⛔ 不带卡片 trailer,其 trailer pair 一律 model-free。 - 标题与散文用英文(见 AGENTS.md);引用的中文裁决保持原文不译,改写引文就是改写裁决。 - 受管面(见 AGENTS.md)PR 正文带 `## 维护者速读(草稿)` 节,中文、业务角度,席位意见留空。 - 五段固定:改了什么/为什么改/风险与代价(含回滚)/席位意见/你要做的;席位定稿成评论。 diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index b714550e98..d17a62d90b 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -345,11 +345,11 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 决策卡落卡必带四棱卡面块与其上的「维护者速读」,⛔ 不留待有人接手再补。 - 决策卡的速读同题,用业务语言先讲事情与选项,末句只问一字:A/B/C 或是否。 - `finding` = 三类内待定级:(a) 可复现缺陷(复现或失败探针);(b) 违背已声明契约(引契约文); -- (c) AI 写元数据会被运行时拒收或静默丢弃的陷阱;其余进 PR `## 验收备注`,⛔ 不立卡。 +- (c) AI 写元数据会被运行时拒收或静默丢弃的陷阱;其余进 PR `## Acceptance notes`,⛔ 不立卡。 - (a) 的分界是不完整 vs 错误,不是文档 vs 代码:示例照抄即失败是 (a),漏列成员不是。 - (c) 元数据 = 由写它的人以外的人存储并再作者化的键:React prop 不是,存储的视图配置是。 - 把作者引向运行时会兑现却让事情更糟的元数据的警告不在 (c) 内;记为边界,⛔ 不扩类。 -- 判「进验收备注」前先问:哪一个 PR 会碰到这个文件?说得出具体 PR 或人 ⇒ 写进去。 +- 判「进 Acceptance notes」前先问:哪一个 PR 会碰到这个文件?说得出具体 PR 或人 ⇒ 写进去。 - ⛔ 说不出(`.changeset/*`、无人在改的文档页、生成物、已扫完的批次)⇒ 兜底不成立。 - 仍然关,但关闭理由必须写明「承接者:无」。 - 先修复:正文被 sanitizer 截断的卡不可派发,评论修复指令后跳过。 @@ -775,7 +775,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - `premise_still_valid: false` + `pr: null` 是合法终报,当再分诊输入复核,永不当失败派发。 - `status: needs_decision` 时 `open_questions` 必须非空。 - `out_of_scope_findings` 只列三类立卡与 `noted, not filed`;立卡查重先行、归挂、立在修复仓。 -- 席位在 ACCEPT 读 PR `## 验收备注`,其中实属三类的由席位补立;三类外已立的卡关 not planned。 +- 席位在 ACCEPT 读 PR `## Acceptance notes`,实属三类的由席位补立;三类外已立的卡关 not planned。 - PM 核验它们存在,并把同轮并行报告互相对读:两个 dev 同一小时审相邻代码会立出孪生卡。 ## 机械守卫索引 diff --git a/.claude/skills/pm-dispatch/references/dispatch-runbook.md b/.claude/skills/pm-dispatch/references/dispatch-runbook.md index 893ad06333..10203a8409 100644 --- a/.claude/skills/pm-dispatch/references/dispatch-runbook.md +++ b/.claude/skills/pm-dispatch/references/dispatch-runbook.md @@ -27,7 +27,7 @@ - 每批约定:≤5 张同族卡、同上下文逐张读;常设授权,⛔ 不逐次请示。 - sweep 打包晋级五条:同类才打包(全部命中同一判据)。 - 逐项清单(落点、before、after)是 PR 正文必备件。 -- N 项之外零改动且 PR 自证;范围外发现按立卡三类门槛分流,三类外进验收备注、不单开。 +- N 项之外零改动且 PR 自证;范围外按立卡三类门槛分流,三类外进 Acceptance notes、不单开。 - sweep 卡是认领对象,成员单保持标签但不再是可派发候选。 - 积压告警:连续 COMPLETED 清空 fire 后裸卡仍 >15 ⇒ 入流大于吞吐,报维护者。 - 阈值落地一周后随机抽 20 条 `noted, not filed`,由席位逐条重判,量出误记率并记档。 @@ -213,7 +213,7 @@ - ⛔ 不在消费者侧打补丁;只写一个路径名,是要求 dev 在守约与修对之间二选一。 - 跨包常等于跨车道,PM 事后补跨座位声明。 - 模型标识只禁内容工件:PR 标题与正文、代码注释、文档、changeset、评论。 -- 两条豁免同属规则,⛔ 不再申报为偏差:一是 commit 的 `Co-Authored-By` 尾注(含 session 链接)。 +- 豁免不再申报为偏差:一是 harness 的 `Co-Authored-By` 尾注,免的是申报,trailer pair 仍 model-free。 - 另一条是 `.claude/agents/*` frontmatter 的 `model:`,`check:agent-model-declared` 要求。 - same-day churn 行:派发时 `git log origin/main --oneline -20 -- ` 见当天合并即加一行。 - 该行原文:基于合并后的代码工作,issue 引用的片段可能已变,先核对当前 main。 diff --git a/AGENTS.md b/AGENTS.md index caf2ac7379..b73ca8efc0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -439,9 +439,9 @@ verbatim and a bare one lands under it, leaving two. ⛔ A tail bare footer on a platform's, not your form downgraded. Which layer does this is unknown; don't go establishing it. **Commit message:** an agent commit ends with the model-free trailer pair `Claude-Session: https://claude.ai/code/session_` and -`Co-authored-by: Claude `; no model identifier lands in a PR title or -body, a comment, a changeset, a doc or a code comment — the harness-written `Co-Authored-By` -trailer (with its session link) is the one exemption. +`Co-authored-by: Claude `; no model identifier lands in a PR title or body, +a comment, a changeset, a doc or a code comment. The one exemption is a REPORTING one: a harness-written +`Co-Authored-By` trailer is not declared a deviation; the pair stays model-free; landed history is not rewritten. **GitHub mutates body BYTES — spell poison-shaped tokens out in words, never literally.** Regex literals and script-tag-shaped tokens go in fenced code with the dangerous character diff --git a/scripts/check-partof-closing-keyword.mjs b/scripts/check-partof-closing-keyword.mjs index fb822185aa..950cef304b 100644 --- a/scripts/check-partof-closing-keyword.mjs +++ b/scripts/check-partof-closing-keyword.mjs @@ -504,9 +504,9 @@ export const COMMITS_FILE_ENV = 'PR_COMMITS_FILE'; */ const RELATION_CONTRACT = 'The contract is written down in the agent rules at .claude/agents/os-dev.md — ' - + '「PR 正文与 commit message 分开解析:卡片关系只在正文声明一次,commit ⛔ 不带卡片 trailer。」 ' - + '(The PR body and the commit messages are parsed separately: the card relation is declared ONCE, ' - + 'in the body, and a commit carries no card trailer.)'; + + '「卡片关系只在 PR 正文声明一次:commit ⛔ 不带卡片 trailer,其 trailer pair 一律 model-free。」 ' + + '(The card relation is declared ONCE, in the PR body; a commit carries no card trailer, ' + + 'and its trailer pair is model-free.)'; /** * Every sentence inside the corner brackets of a citation, in order.