Skip to content

skills(pm-dispatch): a positive grep hit offered as liveness evidence must answer what prints or executes it - #19039

Merged
os-elon-musk merged 1 commit into
mainfrom
claude/issue-18958-positive-hit-reachability
Sep 19, 2026
Merged

os-elon-musk merged 1 commit into
mainfrom
claude/issue-18958-positive-hit-reachability

Conversation

@os-elon-musk

Copy link
Copy Markdown
Collaborator

Fixes #18958

Clause-②: no

What changed

One rule line lands in .claude/skills/pm-dispatch/SKILL.md 〈平台读数纪律〉, beside the zero-hit rules it mirrors: a POSITIVE grep hit offered as evidence that a defect is still alive must answer who prints or executes it; unanswered, it does not prove the defect alive; a hit in a comment, a docblock, a fixture or the remedy's own regression pin does not count. Nothing else in the file moves.

The discipline already refused a bare zero (:163 「零命中须配同主体必中词,否则该零作废」, :165 「控制通过 ≠ 问题问对」) and said nothing about a bare positive — so "grep found it ⇒ still alive" had no rule behind it, and three seats in a row re-derived the same hits on a literal that no executed or printed path carries (specimen below). The card and the triage prescribe the shape, not the wording; the wording here is the seat's.

The band, before / after (.claude/skills/pm-dispatch/SKILL.md, main 75c0dacff → this branch 97d0a55bd)

Rule added after :166 (now :167), 115 bytes:

- 正命中须答谁打印/执行它,否则不证缺陷仍活;注释/文档块/夹具/修复的回归 pin 不算。

Paid by compressing the band's two timestamp bullets (:170 106 B and :171 105 B on main) into one (now :171), 118 bytes:

before :170  - 板面/树/队列读数恒带 UTC 取数时刻;认领、派发令、复核、轮报与座位贴皆同。
before :171  - 时间戳形如 `YYYY-MM-DDThh:mmZ`,树读数另带 ref 或 tip;无时间戳的读数按未取处理。
after  :171  - 读数与认领等座位文本恒带 UTC 取数时刻 `YYYY-MM-DDThh:mmZ`;树读数另带 ref/tip,无者按未取。

What the fold deletes, named: the enumeration of reading kinds (板面/树/队列 — subsumed by 读数, which :171's own second clause already generalised: 无时间戳的读数按未取处理 applies to every reading) and the enumeration of seat texts (认领、派发令、复核、轮报与座位贴 — kept as the class 认领等座位文本). No rule leaves: the UTC stamp, its YYYY-MM-DDThh:mmZ shape, the tree reading's ref/tip and the no-stamp ⇒ not-taken verdict all survive on one line. This is compression in place, not a whitespace re-wrap: the two source lines sum to 211 bytes against the 120-byte cap, so no re-flow could have merged them — the ratchet header's own measurement (601 adjacent bullet pairs, zero merge under the cap) is why a paid line in this file is always a content compression, and the two prior commits on this band paid the same way.

Ratchet: .claude/skills/pm-dispatch/SKILL.md is 812 lines (ceiling 812; headroom 0) before and after (gate line quoted from check:pm-skill-ratchet on 97d0a55bd). references/platform-readings.md untouched (466 / 466; held by PR #18961 — no fact row is owed: the incident is a discipline gap, not a platform behaviour). references/core-rules.md untouched (151 / 151; it is a declared subset — 「⛔ 不新增规则」 — and carries no mirror of this line).

The band still reads as a pair after the edit: :163–:166 say what a ZERO owes (a lit same-subject control, a radius, a known target outside it); :167 says what a POSITIVE owes (who prints or executes it); :168–:169 (units and the counterfactual) follow unchanged; no orphaned 「同主体」 reference.

The specimen the rule is written for

Card #18376 (state: completed) claimed the C2 remedy of scripts/pm/check-clause2-carriers.mjs printed a hardcoded claim-comment id. The remedy landed as 2502b8a1 (PR #18448) on 2026-09-16T11:49:48Z — six and a half hours after the card was filed — and afterwards the triage seat re-derived the same coordinates and graded p2, and the execution seat judged the premise intact and dispatched. Three readings, all positive, none asked what prints or runs the hit.

Measured on main 75c0dacff (git grep -n 5642248126 -- scripts/pm/check-clause2-carriers.mjs): 13 lines, every one of them off the executed / printed path.

line form reachability origin
:387 docblock example ( * Clause-②-correction: …) header prose, never printed pre-remedy
:1333 docblock prose never printed added by 2502b8a1
:1359 docblock prose never printed added by 2502b8a1
:2442 docblock prose never printed added by 2502b8a1
:6315 // comment inside selfTest() never executed added by 2502b8a1
:6324 self-test assertion says(missingLine, '5642248126') === false regression pin asserting ABSENCE added by 2502b8a1
:7446 const C_CLAIM_ID = 5642248126 self-test fixture constant pre-remedy
:7914 // comment inside selfTest() never executed added by 2502b8a1
:7939 self-test assertion === false regression pin asserting ABSENCE added by 2502b8a1
:7953 self-test assertion every(… !says(row, …)) regression pin asserting ABSENCE on every rendered row added by 2502b8a1
:7959 C19_CLAIM({ id: 5642248126, … }) self-test fixture row (the foreign claim the remedy must drop) added by 2502b8a1
:7963 self-test assertion === false regression pin asserting ABSENCE in the remedy added by 2502b8a1
:7964 self-test assertion says(C19_FOREIGN, 'Comment 5642248126') regression pin asserting the DROP diagnostic names the dropped id added by 2502b8a1

Totals: 4 docblock + 2 line comments + 2 fixtures + 5 self-test assertions (4 pin absence, 1 pins the loud-drop diagnostic) = 13; 11 of the 13 were written by the remedy itself (git show 2502b8a1: 11 added lines carry the literal, 2 removed — the remedy string and the old presence pin; the pre-remedy tree 2502b8a1^ carried 4). The card's 「6 处是修复自己的回归 pin」 is this table's 5 assertions plus the fixture row that feeds them — same set, one boundary choice apart.

Cheap reachability probes, all on 75c0dacff: --help prints 19 lines, 0 hits; --template prints 40 lines, 0 hits; --pair 18958 took the input-record path (exit 2, no card derivable from that number), 24 lines, 0 hits; the C2 remedy limb itself now interpolates — :2458 reads whose FIRST line is \Clause-②-correction: ${id}``. The seat that greps this literal and finds 13 lines must now say which of them anything prints or runs before treating the defect as alive; here the answer is none, and the six pins asserting absence are the remedy's evidence of having landed.

Reader test

A seat that greps a literal and finds it must now say whether anything prints or runs it before calling the defect alive — the rule asks exactly that (须答谁打印/执行它), voids the hit otherwise (否则不证缺陷仍活), and names the four places a hit that fails the question usually lives (注释/文档块/夹具/修复的回归 pin).

Verification (all on 97d0a55bd, exit codes captured before any pipe)

Derived with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack from the change set (stderr line 1: gate list derived from the tree of 'objectstack-ai/objectstack' at commit 75c0dacff): 20 commands, every one run, COMMAND :: exit CODE:

node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/pm/check-governed-queue-guard.mjs --self-test :: exit 0
node scripts/pm/check-harness-current.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 3 (PREREQUISITE NOT MET, nothing measured) → built @objectstack/formula + @objectstack/lint under os-verify-lock (VERDICT command-exit 0, 148 s) → re-run :: exit 0
pnpm check:agent-test-spelling :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-expected-skips :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-governed-prose :: exit 0
pnpm check:pm-half-states :: exit 0  (4978 self-test cases pass)
pnpm check:pm-skill-id-lint :: exit 0  (27 files clean)
pnpm check:pm-skill-ratchet :: exit 0  (SKILL.md is 812 lines, ceiling 812, headroom 0)
pnpm check:refd-timer-probe :: exit 0
pnpm check:skill-frame-sync :: exit 0
pnpm check:watch-hint-literal :: exit 0

Named by the dispatch beyond the derivation: node scripts/pm/check-governed-merges.mjs --test .claude/skills/pm-dispatch/SKILL.md :: exit 3 (GOVERNED — expected; .claude/** ×1); pnpm check:pm-dispatch-gates :: exit 0 (cap-exceeding per its own header, so started detached and waited on in the foreground with tail --pid; dispatch-gates self-test: 1849 cases pass, 751.7 s on this box). Reconciliation dispatch-gates.mjs --ran :: exit 0 — 20 derived famil(ies) accounted for — 20 run, 0 NOT-MEASURED (the doc-formula line recorded at its post-build re-run, exit 0). The 120-byte line rule is part of check:pm-skill-ratchet (its ### Why 120 bytes section), not of check-skill-id-lint; both ran.

Acceptance notes

  • noted, not filed: references/core-rules.md :44–:45 carry the zero-hit rules in summary form and no positive-hit mirror; the file is a declared subset at 151 / 151, so a mirror there is a separate compression decision for the skills seat, not a gap in this PR. 承接者: skills seat, at the next core-rules compression.
  • noted, not filed: check-clause2-carriers.mjs --pair N reads N as a PR number, so --pair on a card number lands on the input-record path (exit 2) rather than the remedy limb; the filer's 「对本卡自身跑 --pair 出现 0 次」 was a probe of that path too. Not a defect (documented in --help); 承接者: 无.
  • No fact row for references/platform-readings.md: git grep -c counting matching lines (not occurrences) is git behaviour every seat already reads from git grep --help, not a platform reading this repo measured.
  • Skip-changeset: the diff touches .claude/** only — nothing any package's files[] ships.

维护者速读(草稿)

改了什么:PM 技能的「平台读数纪律」一节加了一条规则:座位用 grep 查到某个字符串,要拿它当「缺陷还活着」的证据,必须先答一句「是谁在打印或执行它」;答不出,这个命中就不算证据;命中落在注释、文档块、测试夹具、或者修复自己写的回归 pin 里,都不算。为了不增加文件行数(棘轮 812 / 812),同一节里两条讲时间戳的规则压成了一条,规则内容没有丢。

为什么改:现有纪律只管「查不到」的情况(查不到要配一个必定能查到的对照词),不管「查到了」的情况。结果一张卡的修复已经合进 main 六个半小时后,立卡、分诊、执行三个席位各自又 grep 了一遍,三次都命中、三次都判「缺陷还在」,还派发了一次开发——而那 13 处命中全部在注释和测试里,其中 6 处正是修复自己写的、断言「这个字面量不许出现」的 pin。这是成文纪律的缺口,不是某一席手滑。

风险与代价(含回滚):只改一段散文,不动任何代码或门禁;成本是一行读数纪律,每个席位每轮多答一句话。压缩的那两条时间戳规则丢掉的只是举例列表(板面/树/队列;认领、派发令、复核、轮报、座位贴),规则本身保留。回滚就是还原这一个文件的这两处改动。机械守卫(自动判断「这一行是不是注释」)是另一张卡,本 PR 不做。

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

你要做的:这是受管面(.claude/skills/**)的规则层改动,需要你确认并人工合并;看一眼新增的那一行措辞是否合你的意,以及压缩后的时间戳规则是否可接受。


Generated by Claude Code

… must answer what prints or executes it

The reading discipline required a lit control for a ZERO hit and nothing of a
POSITIVE hit: "grep found it, so the defect is still alive" had no rule behind
it, and three seats in a row re-derived the same 13 hits on a literal whose
every occurrence sat in a docblock, a line comment, a self-test fixture or the
fix's own regression pins (fix 2502b8a). New rule, one line beside the
zero-hit rules: a positive hit must answer who prints or executes it, otherwise
it does not prove the defect alive; comments, docblocks, fixtures and the fix's
own regression pins do not count.

Paid at 812 / 812 by compressing the two timestamp bullets of the same band
into one (the board/tree/queue and claim/dispatch/review/report/post
enumerations fold into "readings and seat texts"; no rule leaves). Changed
lines: rule 115 B, fold 118 B; the file stays 812 lines.

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

Copy link
Copy Markdown
Collaborator Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 97d0a55bdf

① Derived judgments

② Semver level

  • skip-changeset is correct (.claude/**, nothing published moves). Clause-②: no on the claim (5730004641) and in the body; --pair 19039 at 2026-09-18T13:00Z: exit 0, no widening tell.

③ Boundary flags

  • Dev flags: no open questions. Five declared deviations — the in-place compression (①, agreed); check:pm-dispatch-gates run though outside the derivation because the dispatch named it (1849 cases, 751.7 s, detached + tail --pid); the --pair probe on a card number lands on the input-record path (a reading about the filer's probe, not a defect — agreed); origin/main advanced during the run with nothing touching the derivation (not merged — a one-file prose diff; the queue rebuilds); no classifier denial. Three noted: core-rules.md :44–:45 carry the zero-hit rules with no positive mirror (a declared subset at 151 / 151 — the seat carries it to the next core-rules compression, ⛔ not a card now); --pair N reads a PR number (documented); no platform-readings row owed (hypothesis 4 confirmed) — agreed.
  • Gates: 20 derived / 20 run / 0 NOT-MEASURED at 97d0a55bd (one exit-3 prerequisite cleared by building formula + lint under the verify lock, re-run 0); check:pm-half-states 4978; check:pm-skill-ratchet ✓. 0 MCP calls; 5 REST writes / pushes as budgeted.
  • CI on this head at 2026-09-18T13:00Z: 10 success · 12 skipped · 7 in_progress — nothing red; the landing act reads it again.
  • Landing: governed ⇒ draft at the four-piece terminal (ACCEPT on [finding] 读数纪律不对称:零命中要求点亮控制,而正命中不要求任何可达性核对 —— 同一形状连续骗过立卡/分诊/执行三席(#18376 标本:13 处命中全在注释里,其中 6 处是修复自己的回归 pin) #18958, needs-user-decision on this PR, the 维护者速读 below, review requested from os-zhuang and hotlong). On an authorized APPROVED: ruling C by the seat, channel permitting — or the approver's own hand.

Implemented-by: claude/issue-18958-positive-hit-reachability
Reviewed-by: session_01BTeBejoPUvRHN8WdAJC6oF

VERDICT: PASS


Generated by Claude Code

Copy link
Copy Markdown
Collaborator Author

维护者速读(终稿)· skills 席 · 2026-09-18T13:03Z

这个 PR 做什么:补一条读数纪律。现行规则只管「grep 零命中」(要点亮控制才算数),不管「grep 命中了」—— 于是三个席位(立卡、分诊、执行)连续把 #18376 里 13 处全在注释和自测夹具里的命中当成「缺陷还活着」,其中 6 处正是修复自己的回归 pin,结果一次派发派在一张前提已死的卡上。新规则一行(SKILL.md :167):正命中要答「谁打印 / 执行它」,答不出就不证明缺陷仍活;注释、文档块、夹具、修复自己的回归 pin 不算。 行数满额,用把两条时间戳规则压成一条来付账,规则一条不少。

验收:复核记录 5730382994(PASS)、ACCEPT 5730383297;派生门禁 20 / 20 绿,行数棘轮 812 / 812;dev 在 main 上重新量了 #18376 那 13 处命中(4 处文档块、2 处行注释、2 处夹具、5 处断言,其中 4 处断言的是「必须不出现」;11 处是修复提交自己写的)。

请您做的一件事:Approve(受管文本),或直接 ready + squash 合并。没有要问的字。


Generated by Claude Code

@os-elon-musk
os-elon-musk marked this pull request as ready for review September 18, 2026 23:50
@os-elon-musk
os-elon-musk added this pull request to the merge queue Sep 18, 2026
Merged via the queue into main with commit 9150b79 Sep 19, 2026
39 checks passed
@os-elon-musk
os-elon-musk deleted the claude/issue-18958-positive-hit-reachability branch September 19, 2026 00:15
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 size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants