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
Conversation
…the question — a zero-hit reading names the instrument's reach and one known target outside it The reading discipline caught a dead instrument (control words read zero) but not a live instrument pointed at a question its domain cannot see: a content grep with a lit control and a 0 absent control still cannot see a FILE NAME, and cannot tell a DECLARATION from a MENTION. Two rows in the 平台读数纪律 band of SKILL.md state the discriminator (reach written by shape, one known target outside the reach, an out-of-reach zero is not a reading), paid in-band by folding the landing-operations pointer into the rule it serves and by deleting the filer/dedupe summary row whose three clauses already live on neighbours; one twin row in core-rules, paid by compressing the two intro prose lines. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF
…ntrol-certifies-instrument
Contract reviewServed-tier: ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读(终稿)— PR #18921 · 席位定稿 2026-09-18T06:20Z(草稿在正文,以本评论为准)改了什么:PM 读数纪律加一条判别式,两行,紧跟「零命中须配控制词」「控制词双零 = 仪器坏」之后:控制词通过只证明工具活着,不证明问题问对;报零命中时须写清这个工具能看见哪些形态(文件内容 / 文件名 / 声明 / 字段),并举一个已知存在、这种问法必定看不见的目标;所求落在可达半径之外,这个零就不是读数,换看得见它的工具再报。核心条款同 PR 加一行压缩版。两个文件行数不变(812 / 151)。 为什么改:这一班实测两次同型事故:用内容 grep 判「文件存不存在」(文件名不在内容里),用「哪些文件提到符号」答「哪个文件声明它」(声明与提及在内容 grep 里同形,把 风险与代价(含回滚):两文件都在棘轮上限,新增行靠删本文件里已在别处说过的内容付账,席位逐行核过幸存:① SKILL.md 那行纯指针(main-red 的跳队例外与事故锚卡见 landing-operations B)折进它服务的止血规则,两个约定原文不动、触发它们的那句仍指向 B,代价只是「跳队 / 事故锚」两个词在 SKILL.md 里搜不到了;② 一行三句皆有重复的汇总行退掉,「立卡者附查重词」挪到相邻查重规则,「分诊按词查自有列表」「零命中须控制词背书」各在别处仍在;③ 核心条款两行说明文字压成一行,无规则降级。门禁全绿。与在等你批准的 PR #18903 同文件不同行段,谁后落谁先合 main。回滚 = revert 一个提交。 席位意见:建议批准。派发时我假设一行能装下,dev 实测一行装得下字节、装不下「形态清单」和「换仪器」两个动作,两行更对——形态清单正是让读者测试可机械化的部分。 你要做的:确认这条判别式该进 PM 读数纪律,是则 APPROVE( Generated by Claude Code |
|
Landing record — ruling C, on an authorized APPROVED (skills seat, os-zhuang ( Generated by Claude Code |
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 grepwith 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; andgit grep -l NamedListView(16 mentioning files, both controls fine) answered "which file DECLARES it" withviews.tswhen the declaration is inobjectql.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 Bcore-rules, 平台读数纪律, directly under its 零命中/双零 row (the twin, compressed):
- 控制通过 ≠ 问题问对:零命中须写仪器可达半径与半径外已知目标,半径外的零非读数。— 117 BThe 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:
git grepsees 内容. 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.^(export )?(const|type|interface) NAMEspelling already recorded inreferences/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
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):
references/landing-operations.mdB 节。」 — 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).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-syncandcheck:skill-frame-freshnessare 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/mainwas merged at 625db0e (merge commit 6450bcc) and the gates below ran on that head; the fourmaincommits that landed after it touch onlyscripts/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 themainmerge. 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-expressionsexited 3 (PREREQUISITE NOT MET—@objectstack/formulaand@objectstack/lintnot built; nothing measured), the build ran underos-verify-lock.sh(VERDICT command-exit 0 · held the lock 147s), and the re-run exited 0. Verdict lines: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'sfiles[].Acceptance notes
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. 承接者:无.check:skill-frame-freshnessis not in the derived list for a diff on these two files whilecheck:skill-frame-syncis; 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