Repository navigation
Commit 37ca54a
skills(pm-dispatch): a passing control certifies the instrument, not the question — a zero-hit reading names the instrument's reach and one known target outside it (#18921)
Fixes #18755
Clause-②: no
## What the rows add
The 平台读数纪律 band pairs every zero with a lit control on the same
instrument and reads two zeros on one instrument as a dead instrument
(SKILL.md :163–:164, core-rules :45). That catches a DEAD instrument. It
does not catch a LIVE instrument pointed at a question its domain cannot
see, and from inside the rule the two look identical. The card measured
it twice: a content `git grep` with a lit control (53 files) and an
absent control (0) read 1 for a test suite that exists — the suite's
name is a FILE NAME, which a content grep cannot see; and `git grep -l
NamedListView` (16 mentioning files, both controls fine) answered "which
file DECLARES it" with `views.ts` when the declaration is in
`objectql.ts` — a content grep cannot tell a declaration from a mention.
The deliverable's shape is the triage's (comment 5720454579, verbatim):
「承接席:交付物是**判别式**,⛔ 不是口号 ——
要能回答「我这个零,是仪器活着,还是问题问对了」。建议至少包含:**该工具在语料上的可达半径**(它**能**看见哪些形态),以及**一个必然落在半径之外的反例**(一个已知存在、但该问法必定看不见的目标)。」
The filer proposed no wording (「⛔ No rule text is proposed here; the gap
is the product」); the wording here is mine.
**SKILL.md, 平台读数纪律, directly under the 双零 rule** (bytes measured with
`len(line.encode())`, leading `- ` included):
- `- 控制通过 ≠ 问题问对:零命中须写仪器可达半径与一个必在半径外的已知目标。` — 107 B
- `- 半径按形态写(内容/文件名/声明/字段);所求在半径外 ⇒ 零非读数,换看得见它的仪器。` — 116 B
**core-rules, 平台读数纪律, directly under its 零命中/双零 row** (the twin,
compressed):
- `- 控制通过 ≠ 问题问对:零命中须写仪器可达半径与半径外已知目标,半径外的零非读数。` — 117 B
The discriminator is a test the seat performs, not a slogan: (1) write
the instrument's reach BY SHAPE — contents, file names, declarations,
API fields; (2) name one target known to exist that this asking cannot
see; (3) if the sought target is a shape outside that reach, the zero is
not a reading — switch to an instrument whose reach contains the shape.
The head clause is the sibling sentence the triage asked for beside
「不可验证 ≠ 被违反」; the `≠` spelling already lives on the file (`declared ≠
enforced`, :369).
## Reader test — both instances answered by the rows alone
A seat holding 「content grep, lit control fired, absent control 0,
target 0」 reads the rows:
1. **File existence by name.** Row 2 makes the seat write the reach by
shape: `git grep` sees 内容. The sought thing is a 文件名 — a shape on the
list and not the one written — so 所求在半径外 ⇒ the zero is not a reading,
and the row sends the seat to an instrument whose reach contains file
names (`git ls-tree` / `git ls-files`). Row 1's counterexample
obligation produces the same answer from the other side: a target known
to exist that a content grep cannot see is exactly "a file whose name no
file body mentions" — the very target being sought.
2. **Which file declares a symbol.** Reach by shape: a content grep sees
内容 (mentions). The sought thing is a 声明 — on the list, not the reach —
so the 16-file answer is not a reading of "declares", and the seat
switches to a declaration-shaped read (the `^(export
)?(const|type|interface) NAME` spelling already recorded in
`references/platform-readings.md`, 读数六坑 ③). The known-existing target
outside the reach: the one declaring file among the sixteen, which the
mention grep cannot single out.
Neither answer needs the card, the reference, or the triage comment —
the shape list on row 2 is what makes the question 「can this instrument
see a file name / a declaration?」 mechanical rather than a matter of the
seat's imagination.
## Line budget — both files at headroom 0, ratchet's own lines quoted
```
✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/SKILL.md is 812 lines (ceiling 812; headroom 0).
✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/core-rules.md is 151 lines (ceiling 151; headroom 0).
```
SKILL.md 812 → 812 (+2 rows, −2 rows, both retirements in-band, both
paid by deleting content that survives on a neighbour — ⛔ no re-wrap):
- **Retired :175** 「main-red 的跳队例外与事故锚卡约定见
`references/landing-operations.md` B 节。」 — a pointer, not a rule. The
two 约定 it points at are unchanged in landing-operations B; the pointer
folds into the adjacent rule it serves, :174 → 「advisory 门禁红着进 main
是共享损伤,任何车道发现都立即止血并立单,见 landing-operations B。」 (118 B).
- **Retired :178** 「立卡者不查重,只附 3–5 个查重词;分诊按词查自有列表,零命中须控制词背书。」 — three
clauses, each already stated on the file: 「零命中须控制词背书」 IS :163;
「分诊按词查自有列表」 is :315 (查重缓存住席内) and :366 (跨仓查重); the filer clause is
re-packed onto the adjacent duplicate rule, :180 → 「立卡者不查重、只附 3–5
查重词;真撞上重复,先比数值与作用域再决定关哪个。」 (107 B), and also lives at os-dev.md :50 and
core-rules :80.
core-rules 151 → 151 (+1 twin row, −1 line): the two intro PROSE lines
(:2–:3, not rules) compress into one, 「每行一条规则,按 SKILL.md 章节分组;细节以
SKILL.md 与其它 references 为准,⛔ 不新增规则。」 (114 B). Dropped words: 有约束力的 (the
file is 核心条款 by title), 供人工复核 (the title says 人读摘要), 参数、事实表与操作配方 (→ 细节),
同目录. No rule row was demoted.
Why not the in-place widening of core-rules :45 the dispatch preferred:
:45 is 117/120 B (3 B of headroom); the shortest one-row form carrying
reach + counterexample + consequence measures 115 B on its own, so it
cannot share a line with :45.
Why two SKILL.md rows and not one: a 117 B single row exists (「控制通过 ≠
问题问对:零命中须写仪器可达半径与半径外已知目标,半径外之零非读数。」) but drops the shape list and the
switch-instrument remedy, and the shape list is what answers the reader
test above mechanically; both rows are paid.
## Subset relation, held by hand
core-rules ⊆ SKILL.md is enforced by no gate. The twin row compresses
the two SKILL.md rows and states nothing they do not. Every clause of
the two retired SKILL.md rows survives on the lines named above, so
core-rules :80 (「立卡者不查重、只附查重词」) keeps its SKILL.md source (:223, the
re-packed :180, :777). The four-axis block (SKILL.md :733–:754) is
untouched; `check:skill-frame-sync` and `check:skill-frame-freshness`
are green.
## In-flight overlap
Draft PR #18903 (card #18536) is open on both files. Its hunks: SKILL.md
:512, :522, :636–:646 and the retired :672; core-rules :112. This PR's
hunks: SKILL.md :164–:166, :174–:175, :178–:180; core-rules :2–:3,
:45–:46 — disjoint. `origin/main` was merged at 625db0e (merge commit
6450bcc) and the gates below ran on that head; the four `main` commits
that landed after it touch only `scripts/pm/check-half-states.mjs`.
## Gates — derived, run, reconciled at 6450bcc
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` (no paths; the change set from the merge
base) derived 20 commands, identical before and after the `main` merge.
Every one was run with its exit code captured before any pipe;
reconciliation: `Run reconciliation — 20 derived, 20 run, 0
NOT-MEASURED, 0 UNRUN.`
All 20 exit 0. One needed its declared prerequisite first: `pnpm
--filter @objectstack/lint run check:doc-formula-expressions` exited 3
(`PREREQUISITE NOT MET` — `@objectstack/formula` and `@objectstack/lint`
not built; nothing measured), the build ran under `os-verify-lock.sh`
(`VERDICT command-exit 0 · held the lock 147s`), and the re-run exited
0. Verdict lines:
```
✓ check-skill-id-lint: 27 file(s) clean (pattern /#[0-9]{3,}/g).
✓ check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces … and claim no others.
✓ check-skill-frame-sync: the one declared copy of the decision frame is internally coherent (.claude/skills/pm-dispatch/SKILL.md; …)
check-nul-bytes: OK (scanned 8886 text file(s) … no raw ASCII control bytes).
```
Extra, named by the dispatch and not derived: `pnpm
check:skill-frame-freshness` — exit 0 (「the frame itself is unchanged —
that is fine」).
## skip-changeset
Nothing publishes: both paths are under `.claude/**`, a fast-lane
unpublished surface in no package's `files[]`.
## Acceptance notes
- noted, not filed: `references/platform-readings.md` :283 already
carries the declaration-shaped regex as the harder instrument for the
mention-vs-declaration case; the new row sends the seat to "an
instrument whose reach contains the shape" and the reference holds the
spelling — no change owed there. 承接者:无.
- noted, not filed: `check:skill-frame-freshness` is not in the derived
list for a diff on these two files while `check:skill-frame-sync` is;
run as an extra, green. 承接者:无.
## 维护者速读(草稿)
**改了什么**:PM 读数纪律里加了一条判别式,分两行写在「零命中须配控制词」「控制词双零 =
仪器坏」之后:控制词通过只证明工具是活的,不证明问题问对了;报一个零命中时,要写清这个工具在语料上能看见哪些形态(文件内容 / 文件名 / 声明
/ 接口字段),并举一个已知存在、这种问法却必定看不见的目标;所求的东西落在可达半径之外,这个零就不是读数,换一个看得见它的工具再报。核心条款同
PR 加一行压缩版。
**为什么改**:这一班量到两次同型事故——用文件内容 grep 去判「这个文件存不存在」(文件名不在内容里,读 1
个命中而文件明明存在),用「哪些文件提到这个符号」去答「哪个文件声明它」(声明和提及在内容 grep 里长得一样,把 `views.ts`
报成了 `objectql.ts` 的活),第二次已经写进认领评论、当成串行围栏用了。既有规则对这两次全部放行:控制词都点亮了、缺席控制也读
0,规则内部看不出问题问错。
**风险与代价(含回滚)**:两个文件都在行数棘轮上限(812 / 151),新增行靠删同文件里已在别处说过的内容付账:SKILL.md
退掉一行纯指针(内容折进它服务的止血规则)和一行三句皆有重复的汇总行(立卡者附查重词那句挪到相邻的查重规则上);核心条款把两行说明文字压成一行。没有规则被降级或删除,门禁全绿。回滚
= revert 这一个提交。
**席位意见**:(留空,由席位定稿)
**你要做的**:一个动作——审阅并批准这个 draft PR(受管面 `.claude/**`,需要维护者的批准后由席位落地)。
---
_Generated by [Claude
Code](https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent 7e20f05 commit 37ca54a
2 files changed
Lines changed: 6 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
162 | 162 | | |
163 | 163 | | |
164 | 164 | | |
| 165 | + | |
| 166 | + | |
165 | 167 | | |
166 | 168 | | |
167 | 169 | | |
| |||
171 | 173 | | |
172 | 174 | | |
173 | 175 | | |
174 | | - | |
175 | | - | |
| 176 | + | |
176 | 177 | | |
177 | 178 | | |
178 | | - | |
179 | 179 | | |
180 | | - | |
| 180 | + | |
181 | 181 | | |
182 | 182 | | |
183 | 183 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
3 | | - | |
| 2 | + | |
4 | 3 | | |
5 | 4 | | |
6 | 5 | | |
| |||
43 | 42 | | |
44 | 43 | | |
45 | 44 | | |
| 45 | + | |
46 | 46 | | |
47 | 47 | | |
48 | 48 | | |
| |||
0 commit comments