Repository navigation
Commit 3dfcee2
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
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
387 | 387 | | |
388 | 388 | | |
389 | 389 | | |
390 | | - | |
391 | | - | |
| 390 | + | |
| 391 | + | |
392 | 392 | | |
393 | 393 | | |
394 | 394 | | |
| |||
400 | 400 | | |
401 | 401 | | |
402 | 402 | | |
403 | | - | |
404 | | - | |
| 403 | + | |
| 404 | + | |
405 | 405 | | |
406 | 406 | | |
407 | 407 | | |
| |||
709 | 709 | | |
710 | 710 | | |
711 | 711 | | |
712 | | - | |
| 712 | + | |
713 | 713 | | |
714 | 714 | | |
715 | 715 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
92 | 92 | | |
93 | 93 | | |
94 | 94 | | |
95 | | - | |
96 | | - | |
| 95 | + | |
| 96 | + | |
97 | 97 | | |
98 | 98 | | |
99 | 99 | | |
| |||
134 | 134 | | |
135 | 135 | | |
136 | 136 | | |
137 | | - | |
| 137 | + | |
138 | 138 | | |
139 | 139 | | |
140 | 140 | | |
| |||
0 commit comments