diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index b714550e98..7dd6b51ee4 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -629,7 +629,8 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - skills 席自审按契约复审档、清单不减,然后直接落地(ready → 入队),⛔ 不推维护者。 - 路径面干净的才转 ready → 入队;队列是唯一被认可的落地路径,⛔ 永不队列外合并。 - 入队资格 = PR 上每一个 check 全绿,⛔ 不是 required 子集;required 集是队列强制的地板。 -- 非必查门的红要么是真缺陷要么是坏门,两者都归 PM 入队前处置。 +- 非必查红是真缺陷或坏门,归 PM 入队前处置;第三种按设计而红,三条全立才可带红入队: +- 源码自述 pushed 分支上按设计而红、不跑 `merge_group`、PR 评论记明门与因,缺一即否。 - 本段只适用本循环派发的 dev PR;PM 自己的工具 PR 留维护者。 ### 入队与落地 diff --git a/.claude/skills/pm-dispatch/references/core-rules.md b/.claude/skills/pm-dispatch/references/core-rules.md index 154136d870..7cbeca2b65 100644 --- a/.claude/skills/pm-dispatch/references/core-rules.md +++ b/.claude/skills/pm-dispatch/references/core-rules.md @@ -123,6 +123,7 @@ - 验收后先取 PR 路径面,一条命中受管面即分叉,⛔ 不翻正式、不入队、不挂自动合并。 - 受管面 PR 留 draft 并向两个授权批准账户请审;无达档复核 PASS 的契约卡 ⛔ 禁止入队。 - 入队资格是每一个检查全绿 ⛔ 不是必查子集;碰生成物的 PR 入队前先同步再重生成。 +- 唯一例外:源码自述 pushed 上按设计而红、不跑 `merge_group`、评论记明门与因,三条全立。 - 跟到合并为止并每轮读队列成员资格与 `origin/main`;踢出按签名台账四分支处置。 - 合并即发布的仓无验证层不合并,落地判据是已发布且探测通过 ⛔ 不是 MERGED。 - 每轮打中文轮次报告,含判决表、升级项、代裁清单、等人合项、受管合并审计与五指标。 diff --git a/.claude/skills/pm-dispatch/references/review-checklist.md b/.claude/skills/pm-dispatch/references/review-checklist.md index e6bb762ac3..605ab0a3aa 100644 --- a/.claude/skills/pm-dispatch/references/review-checklist.md +++ b/.claude/skills/pm-dispatch/references/review-checklist.md @@ -40,7 +40,7 @@ - CI 收敛读数只属于复核侧:dev 的契约是草稿 PR 时点交报,gate `in_progress` 是诚实读数。 - 翻 ready、挂 auto-merge 或入队前,亲核 Lint & Repo Gates 与 TypeScript Type Check 两个 job。 - 两个 job 的 `conclusion` 都须为 `success`,门禁族跑在其内;⛔ 不因报告写了本地绿跳过。 -- 两 job 只是 required 地板,入队资格另要求全部 check 全绿;真绿跑法见 `true-green.md`。 +- 两 job 只是 required 地板,入队另要求全 check 绿(第三种情形见 SKILL.md);跑法见 `true-green.md`。 - 收敛期转红走补丁轮续派原 dev,⛔ 不作 REWORK 的理由;重量级卡可在派发令写本单等 CI。 - 每个门禁读数先钉到 PR 当前 head:比对 run `head_sha` 与 `head.sha`,不一致的双向都不入账。 - ⛔ 非当前 head 上的 `cancelled` 零动作、永不重跑:新推送自带全套 run。 diff --git a/scripts/pm/check-skill-line-ratchet.mjs b/scripts/pm/check-skill-line-ratchet.mjs index db59425314..e8bce47c1f 100644 --- a/scripts/pm/check-skill-line-ratchet.mjs +++ b/scripts/pm/check-skill-line-ratchet.mjs @@ -292,7 +292,32 @@ export const CEILINGS = new Map([ // narratives, incident post-mortems and rationale tails leave the corpus; one // rule per ≤120-byte line, 红线 first, templates last). Landed count, headroom // 0, same convention (lowering is always legitimate). - ['.claude/skills/pm-dispatch/SKILL.md', 811], + // Raised 811 → 812 by the queue-entry third-case ruling — an ORDINARY raise + // under this map's own maintainer exit, ⛔ not a cross-file move. Maintainer, + // live PM chat with the director seat, 2026-09-08, decision batch #91, under + // the standing delegation 「继续决策」, adopting option A of the skills seat's + // recommendation; the director record's own words (#16516): + // Ruled content is not growth: the ratchet's own maintainer exit exists for + // exactly this, and the precedent (`state-machine.md` 43→44) is on the map. + // Land the ready text (115 / 112 / 116 B lines) with all three conjunctive + // conditions intact. ⛔ B refused (collapsing an unrelated rule to a pointer + // is an unmeasured weakening of something else); ⛔ C refused (SKILL.md:44 + // 同 PR 同改 is not waived); ⛔ D refused by triage already. + // The content is the #16502 ruling (decision batch #73, 2026-09-07, maintainer + // 「同意」 on options C + D): a red on a NON-required check admits a PR to the + // queue only when (a) the check's own source names the red as by-design on a + // pushed branch, (b) the check does not run on `merge_group`, and (c) the PR + // comment records which check and why — three conjunctive conditions, none + // droppable. ONE line, and it could not be paid in place — measured, not + // assumed: the conditions need ≥107 B against 8 spare bytes on the 112 B rule + // line; the tightest self-contained one-line form is 137 B; and of the file's + // 601 adjacent bullet pairs ZERO merge under the 120-byte cap (smallest 121 B, + // and that one splices two rules). So the two-case premise line is compressed + // in place (88 → 115 B) to carry the case's head and the conditions land as one + // 112 B line; re-wrap funding is refused per the 2026-08-17 rule, and deleting + // a ruled clause is refused on the state-machine precedent. Landed count, + // headroom 0, same convention. + ['.claude/skills/pm-dispatch/SKILL.md', 812], // Raised 223 → 244 by the triage reading-cost card (maintainer ruling // 2026-08-20, quoted in the raising PR): three mandated conventions land in // the runbook's triage sections. Landed count, headroom 0, same convention. @@ -744,7 +769,15 @@ export const CEILINGS = new Map([ // instead of the corpus. Set at the landed line count (headroom 0, same // convention as every entry above); it is a NEW file, so this is an added row // and no other row moves. - ['.claude/skills/pm-dispatch/references/core-rules.md', 150], + // Raised 150 → 151 by the same queue-entry third-case ruling (decision batch + // #91, 2026-09-08, option A — quoted in full at the SKILL.md entry above): the + // twin line that SKILL.md:44 orders (一条规则在本文与核心条款一处改动,另一处同 + // PR 同改), one 116 B line stating the sole exception with all three conditions. + // Could not be paid in place: the rule line holds 114 B of 120, and of this + // file's 121 adjacent bullet pairs ZERO merge under the cap (smallest 156 B). + // Landing it in SKILL.md alone was option C, refused by the ruling: the twin + // obligation is not waived. Landed count, headroom 0, same convention. + ['.claude/skills/pm-dispatch/references/core-rules.md', 151], // The app-vs-platform boundary — the deciding question (could this be written // from the metadata alone, with no knowledge of this company?), the publication // test (one consumer is a use, two is a contract) and the two anti-patterns.