Skip to content

skills(pm-dispatch): a zero-hit control must be scoped to the claim's own subject or the zero is void - #17837

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-17569-control-scoped-to-the-claim
Sep 12, 2026
Merged

skills(pm-dispatch): a zero-hit control must be scoped to the claim's own subject or the zero is void#17837
os-zhuang merged 1 commit into
mainfrom
claude/issue-17569-control-scoped-to-the-claim

Conversation

@claude

@claude claude Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

The zero-hit rule bound the control to HIT, not to be SCOPED to the claim: a control can prove the instrument works while pointed at a different corpus, path shape, module/package boundary or quoting, and the zero then comes back as a reassuring negative that survives review (three misses in one hotcrm shift, two more measured by the triage seat). The rule now says the control shares the claim's own subject and the target's failure mode (a phrase that wraps across lines needs a control that wraps the same way), or the zero is VOID rather than negative. Landed in all three carriers of the discipline in one PR, per SKILL.md 「一条规则在本文与核心条款一处改动,另一处同 PR 同改」: pm-dispatch/SKILL.md :161-:162, references/core-rules.md :45, and the dev-side reading in .claude/agents/os-dev.md :54. Every file stays at its ratchet ceiling; the payment is density inside the same section, itemised below. Not a new gate.

Part of #17569

Acceptance notes

Premises (re-taken on origin/main 0cd841a16 at 2026-09-12T10:03Z, after git fetch origin main):

  1. SKILL.md :161 read 「- 零命中必须用确定存在的邻近词反查,否则零命中不成立。」 (78 bytes); file 812 lines, CEILINGS row 812, MAX_LINE_BYTES = 120 — holds. The ratchet script lives at scripts/pm/check-skill-line-ratchet.mjs (the dispatch word spelled it without the pm/ segment; same script).
  2. core-rules.md :45 read 「- 零命中必须用确定存在的邻近词反查才成立;仓不可达时 ⛔ 不得当成查过且干净。」 (110 bytes); 151 lines at ceiling 151 — holds; it IS the rule's core-rules mirror and is edited here.
  3. os-dev.md :54 read 「 - 空结果要同会话一个已知必中的控制词答了命中才算读数。」 (83 bytes); 403 lines at ceiling 403 — holds.
  4. SKILL.md :175 and core-rules.md :51 are the dedupe-control siblings — left byte-identical (the new clause is general; no cross-reference needed).
  5. Open-PR scan re-taken at 2026-09-12T10:07Z over all 24 open PRs' file lists (REST pulls/{n}/files): zero hits on the three files. Control, same corpus and same regex family: 5 of those PRs touch .claude/ paths (docs(pm): platform-readings.md undraft rows name the ccr REST route beside MCP #17828 and fix(devx): pin Governed Surface Queue Guard as the seventh REQUIRED_CONTEXTS row #17803 on platform-readings.md, docs(pm): rest-channel.md rows 1–2 name the ccr REST routes for the draft flip and auto-merge #17823 rest-channel.md, docs(agents): wait only on a PID you recorded — the WAIT side of the shared process table #17809 a hook, feat(pm): mechanise the prior-ruling search for decision cards #17515 decision-analysis.md) — the zero is scoped. origin/main moved 3 commits (to 51b024a16) during the run; none touched the three files.
  6. Sibling clause from PR docs(skills): bind three evidence controls onto the retirement playbook's liveness step #17566 (spec-property-retirement SKILL.md :59) read: 「零编写实例普查要并跑一个同族已知存活的键作对照,两读数都报;同得零即没测出。」 — the new wording keeps that vocabulary (a control shares the claim's family/subject; a control that measures nothing voids the reading) rather than introducing a second idiom.
  7. The card quotes a dispatch-template sentence 「pair every zero with a control word that must hit」 as a second carrier inside SKILL.md. On origin/main no such sentence exists (grep for must hit, pair every zero, control word over .claude/** and scripts/pm/** returns zero; control: 零命中 hits :161, :542, :724) — the template left in the rules-only rewrite. No second carrier to edit.

Edited lines and byte counts (each ≤ 120):

file line bytes text
SKILL.md :161 113 「- 零命中须用确定存在的邻近词反查;控制词须与主张同主体,否则该零作废,不是阴性。」
SKILL.md :162 (new) 114 「- 同主体 = 同语料、同路径形、同包界、同引法、同失效形态:跨行短语配跨行控制词。」
SKILL.md :165 (merged) 105 「- 时间戳形如 YYYY-MM-DDThh:mmZ,树读数另带 ref 或 tip;无时间戳的读数按未取处理。」
core-rules.md :44 112 「- 核验 main 用 fetch 后的 origin/main,⛔ 不用共享检出树;仓不可达 ⛔ 不当查过且干净。」
core-rules.md :45 113 「- 零命中须用必中词反查,且与主张同语料/路径形/包界/引法/失效形态,否则该零作废。」
os-dev.md :54 113 「 - 空结果要同会话已知必中、与主张同主体同失效形态的控制词答了命中才算读数。」

How density was paid (all inside the 平台读数纪律 section of each file):

  • SKILL.md 812/812: the clause takes two lines (:161-:162, +1); the two timestamp lines (:164 「时间戳形如 …,树读数另带 ref 或 tip。」 and :165 「无时间戳的读数是格式错误不是现值,读者按未取处理。」) merged into one (−1). Dropped words: 「是格式错误不是现值,读者」 — the operative half 「按未取处理」 survives, matching core-rules' own wording of that rule.
  • core-rules.md 151/151: no two neighbouring lines in the section merge under 120 bytes, so the clause is one line (:45) with the five sames inline; the 仓不可达 half of the old :45 moved onto the origin/main line (:44). Dropped words: 「确定存在的邻近」 → 「必中」, 「时」, 「不得当成」 → 「不当」, 「的工作树」 → 「树」, 「先」. The wrapped-phrase example is carried by SKILL.md only (terser register).
  • os-dev.md 403/403: one line, byte-for-byte replacement of :54 (83 → 113 bytes); the 范围 list is otherwise untouched.

Frame block pin: sed -n '734,755p' .claude/skills/pm-dispatch/SKILL.md | md5sum = 3327d02c56f8a0eca88569dad2270f32 before and after (net line count above it is 0, so the block did not move).

Gates (derived with node scripts/pm/dispatch-gates.mjs --commands in the worktree, 18 commands; reconciliation via --ran: 「18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN」): all 18 exit 0 at head 9e15e315f. pnpm check:pm-skill-ratchet verdict lines: 「SKILL.md is 812 lines (ceiling 812; headroom 0)」 · 「core-rules.md is 151 lines (ceiling 151; headroom 0)」 · 「os-dev.md is 403 lines (ceiling 403; headroom 0)」. pnpm check:skill-frame-sync: 「the one declared copy of the decision frame is internally coherent … 4 axes」. pnpm check:nul-bytes: 「OK (scanned 8465 text file(s) …; no raw ASCII control bytes)」. check:doc-formula-expressions first answered exit 3 PREREQUISITE NOT MET (@objectstack/formula and @objectstack/lint unbuilt) — not a measurement; built both under the verify lock (VERDICT command-exit 0, 169 s) and re-ran: exit 0.

Changeset: .claude/** publishes nothing from any released package (node scripts/check-changeset-fixed.mjs exit 0; no files[] of any package covers .claude/) — skip-changeset applied by additive POST and read back.

Deferred rider (⛔ not in this PR): the card's two references/platform-readings.md rows (git grep -- 'a/**/*.ext' skips files directly under a/; grep -c $'\x00' is not a NUL probe) wait on that file's serial behind PR #17828 and PR #17803. #17569 stays open for the rider PR; hence Part of, not a closing keyword.

Governed surface: .claude/** — this PR stays a draft at the human terminal; nothing here flips it ready or arms auto-merge.

维护者速读(草稿)

改了什么: 「零命中必须配控制词反查」这条规则,在三处载体(pm-dispatch SKILL.md、核心条款 core-rules.md、os-dev 开发 agent 定义)各加一句:控制词必须与主张同主体 —— 同语料、同路径形、同包界、同引法、同失效形态 —— 否则这个零作废,不算阴性读数。三个文件行数不变,各自仍顶着 ratchet 上限。

为什么改: 一个班次里三次「控制词命中了、零仍是假的」:控制词证明工具能用,却没证明工具对准了主张。旧文只要求控制词「命中」,不要求它「与主张同一件事」,于是错误读数反而带着安心感回来、过了复核。

风险与代价(含回滚): 纯文本规则,不加门禁、不加脚本;付费方式是同节内合并两行时间戳规则(SKILL.md)与把「仓不可达」半句挪到 origin/main 那一行(core-rules)。回滚 = revert 这一个 commit,无生成物、无依赖。

席位意见: (留空,席位定稿成评论)

你要做的: 读三处新句是否表达了你要的判据;确认后人工合并(governed surface)。rider 半张(platform-readings 两行)另开 PR,本 PR 不关卡。


Generated by Claude Code

… own subject or the zero is void

The zero-hit rule bound the control to HIT, not to be SCOPED to the claim:
a control that proves the instrument works while pointed at a different
corpus, path shape, module/package boundary or quoting returns a reassuring
answer that survives review. The rule now says the control shares the
claim's subject and its failure mode (a wrapped phrase needs a wrapped
control), or the zero is void rather than negative.

SKILL.md :161 gains the clause across two lines, paid by merging the two
timestamp lines (:164-:165) into one inside the same section (812/812).
core-rules.md :45 carries the same clause in one line; its unreachable-repo
half moved onto the origin/main line (:44) to keep 151/151. os-dev.md :54
gains the same scoping in one clause (403/403).

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MCLBsUgfykL74aU716rzVK
@claude

claude Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

维护者速读

改了什么 — 「零命中必须配控制词反查」这条读数纪律,在三处载体各加一句:控制词必须与主张同主体——同语料、同路径形、同包界、同引法、同失效形态(跨行短语要配跨行控制词)——否则这个零作废,不算阴性读数。载体:pm-dispatch SKILL.md :161–:162、核心条款 core-rules.md :45、os-dev 定义 :54。三个文件行数不变,各自仍顶着棘轮上限;SKILL.md 的两行靠合并两条时间戳规则付清,core-rules 靠把「仓不可达」半句挪到 origin/main 那一行。

为什么改 — hotcrm 席一个班次里三次「控制词命中了、零仍是假的」,分诊席又测到两次:控制词证明工具能用,却没证明工具对准了主张,错误读数带着安心感过了复核。旧文只要求控制词「命中」,不要求它「与主张同一件事」;规则被遵守却仍漏,是文本的缺口。

风险与代价(含回滚) — 纯规则文本,不加门禁不加脚本;回滚即 revert 一个 commit。唯一代价:SKILL.md 「无时间戳的读数是格式错误不是现值」这半句被压缩成「按未取处理」——操作性的一半保留,与 core-rules 同一措辞。

席位意见 — 接受(ACCEPT 5645289940,契约档复核,fable 档构建)。本卡还欠后半张:两条 platform-readings.md 平台事实行,等 devx 的 PR #17803 落地后另开 PR;所以本 PR 用 Part of,卡不关。

你要做的 — 受管面(.claude/**),只能人工合并:读三处新句是否是你要的判据,合并 PR #17837 即可;若你想改措辞,说一句,本席重派。


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation needs-user-decision size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants