Skip to content

Commit 3dfcee2

Browse files
hotlongclaude
andauthored
docs(pm-skill): flip the gate asymmetry — adding a required gate/hook/ratchet joins the human floor; census-marked retirement becomes class-1 (ruling F) (#18481)
Fixes #18473 Maintainer ruling **F** (verbatim 「F」, 2026-09-16 ~14:4xZ) on the direct-channel question 「我们的项目是不是门禁用的太重了。有这个必要吗?」. The card body's "Why" and "Deliverable" sections are the spec; this PR is the two re-keys, line-neutral, every touched line ≤120 bytes. **Surface:** `.claude/skills/pm-dispatch/SKILL.md` (812 → 812 lines) and `.claude/skills/pm-dispatch/references/core-rules.md` (151 → 151 lines). Governed rules layer: this PR **stays draft**; no ready flip, no review request, no arming — the director does the four-piece after ACCEPT and the maintainer merges. `skip-changeset`: `.claude/**` publishes nothing (fast-track class). Serialisation: #18468's PR #18476 (`SKILL.md:92`) is still an open draft; #18434 (`SKILL.md:523`) remains queued. Neither line is touched here — both are hash-identical to `origin/main` (`285f1046…` / `557a3bc1…`). `origin/main` had not moved from the branch base `85c6d76e` at the pre-PR `os-regen-merge.sh` run (`Already up to date`), so nothing was merged under this branch yet; the merge is re-run before enqueue per the claim. ## What changed — every line, before / after, byte counts Line numbers are on `origin/main` at `85c6d76e` (the card body's `:391–392` had drifted by one; on this base the 人工地板 pair is `:390–391` and the class-1 floor line `:403` reads ③, as the dispatch says). ### 1. Adding joins the human floor (SKILL.md :390–391, re-wrapped in place) `:390` before (118 B): `- 人工地板同含:安全/权限边界;门禁削弱(降阈值、删必查项、抬 ratchet 上限、跳过测试)。` `:390` after (120 B): `- 人工地板同含:安全/权限边界;门禁削弱(降阈/删必查/抬上限/跳测);新增运行时第三方依赖;` `:391` before (100 B): `- 人工地板同含:花费/配额/舰队形态/默认模型档位;新增运行时第三方依赖。` `:391` after (119 B): `- 花费/配额/舰队形态/默认模型档位;新增必需门禁/hook/棘轮(卡具名所守契约与预期捕获)。` How the added words were paid, in place: the four weakening examples are compressed (降阈/删必查/抬上限/跳测, `、` → `/`), 「抬 ratchet 上限」 becomes 「抬上限」 (the spelling `:392` and `:785` already use), and `:391` drops its repeated 「人工地板同含:」 prefix because `:390` now ends in `;` and `:391` continues it. Every existing floor item survives verbatim (安全/权限边界 · 门禁削弱 · 花费/配额/舰队形态/默认模型档位 · 新增运行时第三方依赖). The new item is 新增必需门禁/hook/棘轮 with the card requirement (the card names the contract it guards and the catch it expects). The ⛔ "no longer lands zero-baseline on a seat's own warrant" half is carried by floor membership itself — `:389` 「代裁人工地板(恒交维护者)」 — and did not fit as separate words; stated here so the reader knows it is implied, not written. ### 1b. 具名不升级类 scoped to an EXISTING gate's internals (SKILL.md :712) `:712` before (110 B): `- 纯文档措辞更正(无契约声明改动);门禁内部参数与扫描器盲区修复(加强,非削弱)。` `:712` after (117 B): `- 纯文档措辞更正(无契约声明改动);既有门禁内部参数与盲区修复(加强,非削弱,非新增)。` 「既有」 plus the explicit 「非新增」 close the ride: a new gate cannot claim this class. Paid by dropping 「扫描器」 (the subject 门禁 carries the scanner sense). ### 2. Retiring becomes class-1 (SKILL.md :403–404, same list) `:403` before (110 B): `- ③ 四类地板零移动:安全/权限边界、已发布契约语义、产品能力取舍、门禁强度。` `:403` after (108 B): `- ③ 四类地板零移动:安全/权限边界、已发布契约语义、产品能力取舍、门禁强度;` `:404` before (77 B): `- 任一地板触碰 ⇒ 照常现场呈报;地板是排除项不是权重。` `:404` after (119 B): `- 门禁普查标 retire 的退役除外,总监/技能席引该行裁;触地板即呈报,地板是排除项非权重。` `:403` has 10 B of slack, so the carve-out could not sit inside it; per the ruling it is paid by tightening the adjacent line of the same list: `:403` now ends in `;` and ③ continues into `:404`, which opens with the carve-out (retiring a gate the gate census marks `retire` is not 门禁强度 movement; the director or the skills seat rules it citing that census row) and keeps both of its own clauses (触地板即呈报 · 地板是排除项非权重; the 「照常现场」 sense is carried by `:407` 「三类(地板)照旧现场呈报」). The census's three-part meaning of `retire` (process class, zero real catches, guards no published contract) lives in the census document and is not restated. The census file `docs/audits/gate-census-*.md` is #18472's deliverable and is not on `origin/main` yet — the rule names it as 门禁普查 (a forward reference; no gate reads that path). ### 3. core-rules.md twins, re-keyed identically (一条规则两处同改) `:95` before (111 B): `- 人工地板恒交维护者:功能新增、ADR、协议与公开契约变化、破坏性或难回滚动作。` `:95` after (119 B): `- 人工地板恒交维护者:新功能、ADR、协议/公开契约变化、破坏性/难回滚动作、门禁削弱。` `:96` before (116 B): `- 人工地板同样含安全与权限边界、门禁削弱、花费配额与模型档位、新增运行时依赖。` `:96` after (120 B): `- 地板含安全/权限边界、花费配额与模型档位、新增运行时依赖、新增必需门禁/hook/棘轮。` `:137` before (119 B): `- 记账事不升级(无产品可见行为变化):去重并卡、台账整理、纯文档措辞、门禁盲区加强。` `:137` after (119 B): `- 记账不升级(无产品可见行为变化):去重并卡、理台账、纯文档措辞、既有门禁盲区加强。` Declared deviation: core-rules' human-floor list is the two-line block `:95–96` with 4 B of slack in `:96`, and the identical re-key needs 33 B, so the block was re-wrapped across both lines exactly as the SKILL.md pair was — 门禁削弱 moved up to `:95`, 功能新增 → 新功能, 与/或 → `/`. Every item of both lines survives; `:95` is the twin of SKILL.md `:389`, which the ruling did not touch, so this is the one place the payment crossed into a neighbour line. `:137` pays 「既有」 with 记账事 → 记账 and 台账整理 → 理台账, keeping the class boundary phrase 「无产品可见行为变化」 byte-identical to SKILL.md `:711`. core-rules has no twin of the class-1 floor line (no 自裁/零移动 line exists there), so item 2 has no core-rules half. No other reference file twins any changed phrase (`grep -rn 门禁削弱|门禁强度|加强,非削弱|门禁盲区加强|四类地板` over `.claude/ docs/ AGENTS.md skills/` hits only the two files). ## Positive greps, with controls (`origin/main` = `85c6d76e`) | grep | now | control on origin/main | |---|---|---| | `grep -c '新增必需门禁/hook/棘轮' SKILL.md` | 1 | 0 | | `grep -c '新增必需门禁/hook/棘轮' core-rules.md` | 1 | 0 | | `grep -A1 '③ 四类地板零移动' SKILL.md \| grep -c '门禁普查标 retire'` | 1 | 0 | | `grep -c '既有门禁内部参数' SKILL.md` | 1 | 0 | | `grep -c '既有门禁盲区加强' core-rules.md` | 1 | 0 | | `grep -c '加强,非削弱)' SKILL.md` (old spelling, no 非新增) | 0 | 1 | | `git grep -n '新增' SKILL.md \| grep -c 人工地板` (the card's own grep) | 2 | 2 | The card's own grep is control-insensitive: `:389` (功能新增) and the runtime-dependency item already paired 新增 with 人工地板 on `origin/main`, so it reads 2 both before and after; the first five rows are the discriminating evidence. ## Gates — run on the final head `45aeee5d`, exit codes captured before any pipe `node scripts/pm/dispatch-gates.mjs --commands` (no paths; changeset from the merge-base) derived 17 families — byte-identical to the list derived from the two paths the dispatch named. `--ran` reconciliation on the exit-coded record: **17 derived, 17 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero — all 17 recorded an exit code and none is 3)**. | command | exit | |---|---| | `pnpm check:pm-skill-ratchet` — `SKILL.md is 812 lines (ceiling 812; headroom 0)` · `core-rules.md is 151 lines (ceiling 151; headroom 0)` | 0 | | `pnpm check:pm-skill-id-lint` — `27 file(s) clean` | 0 | | `pnpm check:skill-frame-sync` — `the one declared copy of the decision frame is internally coherent` | 0 | | `pnpm check:skill-frame-freshness` (outside the derived union, run because the dispatch named it) — `current with origin/main` | 0 | | `pnpm check:pm-governed-prose` — `2 instruction surface(s) name all 5 registered governed surfaces` | 0 | | `pnpm check:pm-governed-merges` | 0 | | `pnpm check:pm-half-states` | 0 | | `pnpm check:nul-bytes` — `scanned 8734 text file(s) … no raw ASCII control bytes` | 0 | | `node scripts/pm/check-governed-queue-guard.mjs --self-test` | 0 | | `node scripts/check-closing-keyword-parity.mjs` and `--self-test` | 0 / 0 | | `node scripts/check-comment-mask-corpus.mjs` | 0 | | `pnpm --filter @objectstack/lint run check:doc-formula-expressions` (first run exited 3 = declared PREREQUISITE NOT MET, formula/lint unbuilt; built both under `os-verify-lock.sh`, re-run) | 0 | | `pnpm check:agent-test-spelling` · `check:doc-authoring` · `check:driver-memory-census` · `check:refd-timer-probe` · `check:watch-hint-literal` | 0 each | Mechanism assumptions from the dispatch, measured: the ratchet and id-lint are the gates that bite (both green at headroom 0); `check:skill-frame-sync` / `-freshness` are untouched by these lines (both green, frame structure unchanged); `check-governed-prose.mjs` pins only backtick code spans in the governed-surface enumeration region, not the 人工地板 block (green, and its region does not include these lines). ## Acceptance notes - noted, not filed: the card's acceptance grep (`新增` + `人工地板` ≥ 1) cannot distinguish before from after on this base; the PR carries discriminating greps instead. 承接者: PM (this report). - noted, not filed: core-rules.md carries no digest of the class-1 self-adjudication list, so item 2 has a single copy by construction — an observation about the digest's coverage, not a defect. 承接者: skills seat (reads this PR). - noted, not filed: the rule's 门禁普查 reference points at `docs/audits/gate-census-*.md`, which lands with #18472; until then the carve-out has no row to cite. 承接者: #18472. ## 维护者速读(草稿) **改了什么。** 两处规则各改一行组,行数不变(SKILL.md 812/812,core-rules.md 151/151),每行 ≤120 字节:① 人工地板新增一项「新增必需门禁/hook/棘轮」——席位要立决策卡、写明它守的契约与预期能抓到什么,不再凭席位自授零基线落地;「门禁内部参数与盲区修复(加强)」这一免升级类改为只覆盖**既有**门禁,并写明「非新增」。② 一类自裁的「门禁强度」地板加一条例外:门禁普查标为 `retire` 的门禁(流程类、零真实捕获、不守任何已发布契约),退役不算动地板,由总监席或技能席引普查行裁定。core-rules.md 的对应行同改。 **为什么改。** 维护者裁决 「F」(2026-09-16,对「我们的项目是不是门禁用的太重了。有这个必要吗?」的回答)。现行规则把「削弱门禁」放在人工地板上,而新增门禁是免费的:182 个 `check-*.mjs`、164 个 `check:*` 脚本,上周 597 次合并里 42% 是门禁形状。这个不对称让舰队只会加门禁、拆不了门禁;本 PR 把方向翻过来:加要过维护者,拆(普查判定为 retire 的)由席位裁。 **风险与代价(含回滚)。** 纯规则文本,不碰任何脚本或门禁本身;付账方式是压缩既有措辞(削弱四例缩写、去掉重复前缀、core-rules 两行重排),没有删任何一条规则。代价是这几行的可读性略降。回滚 = revert 本 PR 一次即可(两个文件、8 行)。依赖:例外条款引用的门禁普查文件 `docs/audits/gate-census-*.md` 由 #18472 落地,落地前例外无行可引,但规则文本本身不依赖该文件存在。 **席位意见。** (留空,席位定稿成评论。) **你要做的。** 这是受管规则层(`.claude/**`):PR 保持 draft;总监席 ACCEPT 后做四件套,合并由你点击。看一眼上面「every line, before / after」八行是否合你的意;尤其 core-rules.md `:95` 为付账被重排(门禁削弱上移一行)——若你希望 core-rules 那一侧只动 `:96`,请说,改法是把 `:96` 压成更短的摘要。 --- _Generated by [Claude Code](https://claude.ai/code/session_01Wj1HUjzyeiBQ8atRf1ZhaL)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 674872a commit 3dfcee2

2 files changed

Lines changed: 8 additions & 8 deletions

File tree

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -387,8 +387,8 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
387387
- 拆分/分票时 `target:*` 随工作走,对每一半重跑二元判据,默认继承,不继承按四类写明理由。
388388
- 每张板恰好一个生产者;鲜度节奏、清板三选一、pin 前置见 `references/seat-post-protocol.md`。
389389
- 代裁人工地板(恒交维护者):功能新增;ADR;协议/公开契约变化;破坏性或难回滚动作。
390-
- 人工地板同含:安全/权限边界;门禁削弱(降阈值、删必查项、抬 ratchet 上限、跳过测试)。
391-
- 人工地板同含:花费/配额/舰队形态/默认模型档位;新增运行时第三方依赖。
390+
- 人工地板同含:安全/权限边界;门禁削弱(降阈/删必查/抬上限/跳测);新增运行时第三方依赖;
391+
- 花费/配额/舰队形态/默认模型档位;新增必需门禁/hook/棘轮(卡具名所守契约与预期捕获)。
392392
- 唯一例外:`platform-readings.md` 增量抬上限到落地行数,免决策卡,记 `ruledRaises` 引常设裁决。
393393
- 条件:席位验收评论逐条核实、去重计数(候选/落地/已有/拒收)、一事一行、不计重排。
394394
- 代裁车道只覆盖代码整理(行为不变的重构)与 bug 修复。
@@ -400,8 +400,8 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
400400
- 一类自裁门:召唤中总监席可免呈自裁一张决策卡,当且仅当三判据全立。
401401
- ① 既有裁定/在案类规则/成文纪律机械决定方向,裁决评论点名所用权威。
402402
- ② 失败方向响亮(拒绝/诊断/红门禁)且一次 revert 可回。
403-
- ③ 四类地板零移动:安全/权限边界、已发布契约语义、产品能力取舍、门禁强度。
404-
- 任一地板触碰 ⇒ 照常现场呈报;地板是排除项不是权重。
403+
- ③ 四类地板零移动:安全/权限边界、已发布契约语义、产品能力取舍、门禁强度;
404+
- 门禁普查标 retire 的退役除外,总监/技能席引该行裁;触地板即呈报,地板是排除项非权重。
405405
- 一类自裁逐卡记录:裁决评论引本通道与 ①的权威,录裁 + 转 `pm:queue`,⛔ 裁不派。
406406
- 每场召唤收尾呈摘要表(卡、权威、方向)供维护者追认;被推翻的行按新裁决执行。
407407
- 二类(带一个可报点)与三类(地板)照旧现场呈报,走常设决裁批流程。
@@ -709,7 +709,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
709709
- 或修复需破坏性/难回滚动作;其余归 PM 裁量:裁定、派发、维护者否决窗口而非许可门。
710710
- 具名不升级类(立即行动):恢复不变量;技术任务间顺序与依赖;验证策略;说明书脱节。
711711
- 四类记账事同属不升级类,恒以无产品可见行为变化为界:去重与卡片合并;台账与记账整理;
712-
- 纯文档措辞更正(无契约声明改动);门禁内部参数与扫描器盲区修复(加强,非削弱)。
712+
- 纯文档措辞更正(无契约声明改动);既有门禁内部参数与盲区修复(加强,非削弱,非新增)。
713713
- dev 的 `needs_decision` 经 PM 复核落进不升级类的,PM 直接答复不上传。
714714
- 第三档:带前提的裁决,三件套缺一不可:① 裁决(选定路线)。
715715
- ② 把裁决挂在具名、可证伪的前提上,派发令要求 dev 先验前提再动手。

‎.claude/skills/pm-dispatch/references/core-rules.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@
9292
- 发版板判据二元:不修它当前候选版能不能发 ⛔ 不做渐变,拆票时标签随工作走。
9393
- 发版阻塞四类:用户今天撞上的已发布面缺陷、契约声明未兑现、迁移形状、要道歉的。
9494
- 代裁只出自维护者召唤的总监席 ⛔ 永不凭自述;其档位由维护者按项目定,⛔ 无硬门。
95-
- 人工地板恒交维护者:功能新增、ADR、协议与公开契约变化、破坏性或难回滚动作。
96-
- 人工地板同样含安全与权限边界、门禁削弱、花费配额与模型档位、新增运行时依赖。
95+
- 人工地板恒交维护者:新功能、ADR、协议/公开契约变化、破坏性/难回滚动作、门禁削弱。
96+
- 地板含安全/权限边界、花费配额与模型档位、新增运行时依赖、新增必需门禁/hook/棘轮。
9797
- 代裁车道只覆盖行为不变的重构与缺陷修复,边界测试是接受面有没有扩大。
9898
- 置信门四条全立才可代裁:四棱同向、不在地板、不推翻既有裁决、否决窗口执行。
9999
- 代裁即换标签、贴四棱块与结论、打自动裁决标记、轮报设专节;发现契约要动则回箱。
@@ -134,7 +134,7 @@
134134
- 升级只有两条门槛:公开契约或产品语义真实分歧且规范定不了,或动作破坏性难回滚。
135135
- 其余都是 PM 的裁量,给维护者的是否决窗口而不是许可门。
136136
- 具名不升级类:恢复不变量的修复、技术任务之间的顺序与依赖、验证策略、说明书脱节。
137-
- 记账事不升级(无产品可见行为变化):去重并卡、台账整理、纯文档措辞、门禁盲区加强。
137+
- 记账不升级(无产品可见行为变化):去重并卡、理台账、纯文档措辞、既有门禁盲区加强。
138138
- 带前提的裁决三件缺一不可:选路线、挂具名可证伪前提、前提不成立必须报分叉。
139139
- 同族近似单默认并入既有拒收集;两个实现不一致时带治理的一侧胜出并删另一侧。
140140
- 落卡先刷新前提,每条前提行自带一条 re-check 命令;决策默认锚在所属 issue。

0 commit comments

Comments
 (0)