skills(pm-dispatch): a ruling's file/symbol/line/call-shape clause carries its reading or is marked 未验证 — the 派发令 evidentiary duty extended to 裁决 - #18679
Conversation
…rries its reading or is marked 未验证 — the dispatch-order evidentiary duty extended to rulings One line in, one line out, SKILL.md stays at 812. In: under 升级与决策, after 「卡上裁决评论是详注」 — a ruling clause that names a file, a symbol, a line or a call shape either carries the reading that produced it or marks that clause 「未验证」; clauses that only cite rules owe nothing. The same two options a dispatch order already has (派发令 lines untouched). Out: the 分诊座位职责 line 「代裁只由维护者召唤的总监席产出,⛔ 永不凭自述、 ⛔ 无子代理裁决」 — every clause of it is restated in the ruling section (「总监席是唯一裁决者:决策箱、代裁与一类自裁只出自本席,⛔ 无子代理无自述」, 「项目总监席:维护者在所在仓召唤」), so the rule keeps one spelling. Co-authored-by: Claude <[email protected]> Claude-Session: https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu
…ling-claims-evidentiary-duty
维护者速读(终稿)skills 席 改了什么 — 为什么改 — 章程已经要求派发令里关于代码的危害断言必须带读数、未亲测的要注「未验证」;但裁决没有任何举证要求,而裁决被 dev 当成已定事实原样照做。ui 席一轮六张卡实测:引规则的两条裁决都成立,断言实现事实的四条全部被测量推翻(错文件、不存在的函数、不可实现的调用形状、零挂载点)—— 方向都对,引据都错,靠 dev 重新测量才没走偏。缺口是结构性的:权威更高的工件,举证要求反而更少。 风险与代价(含回滚) — 规则层,一行;不加门禁、不要求「先测再裁」、不重判任何裁决。它只要求裁决把「读过的」和「推断的」分开标出来,让 dev 知道先去证伪哪一条;只引规则的条款豁免,正是六比六那条分界。代价落在出裁决的席位(总监席、分诊席 —— 分诊席在卡上申报了利害关系,规则对它同样机械适用)。回滚 = revert 一个提交。与 PR #18656、#18666 无行重叠。dev 提了一个开问:core-rules 要不要加孪生行;本席按 A(不加,core-rules 自称不新增规则,且 151/151 无可合并行)处理,要 B 你一句话即可。 席位意见 — 荐合。把已有的派发令纪律对称地延到裁决上,是六个实测样本直接指向的最小改动。 你要做的(一个动作) — Approve 本 PR(或直接人工合并);席位随后按裁定 C 落地。 Generated by Claude Code |
Fixes #18506
Clause-②: no
skip-changeset— the only touched path is.claude/skills/pm-dispatch/SKILL.md(governed.claude/**, internal agent tooling; it ships in no package'sfiles[]).The defect, in one paragraph
A ruling is consumed exactly like a dispatch order — quoted verbatim into the brief, ⛔ not re-litigable, treated by the dev as settled — yet the charter's evidentiary discipline binds dispatch orders only: 「派发令里关于代码的危害断言必须有读数(点名 call site / 路径 / 迁移)」, 「搬自任何工件(含己文)本轮未亲测计数/零命中/文件面:重测或注「未验证」点名来源」, 「PM 测不了的危害 ⇒ 写成给 dev 的问题,⛔ 不写成栅栏」. Nothing required a ruling's code-level assertions to carry a reading, and nothing marked them unverified when they did not. The artefact with more authority had fewer evidentiary requirements than the one that merely relays it — the asymmetry is the defect. This PR extends the same two options (carry the reading, or mark that clause 「未验证」) to 裁决, so the dev reading a ruling knows which clause to falsify first. ⛔ It is not 「measure before ruling」, adds no gate or script, and re-grades no ruling.
The evidence: six for six on one split (card comment 5701534399)
_packageIdpresence admits an affordance at 14 of 38 read sitesObjectKanban.tsx'shandleDragEnd)KanbanImpl.tsxfield.format ?? 'compact')temporalText(type, value, locale)takes nofield; noformatkey on the published type:866-870for:878) was inherited from the card bodyThe rulings that reasoned from rules held; the four that asserted implementation facts broke. The exposure is confined to the moment a ruling names a file, a symbol, a line or a call shape — the same boundary the charter already draws for dispatch orders, which is why the line below carries a rule-citing exemption rather than a measurement duty.
The change — one line in, one line out, SKILL.md 812 / 812
In —
.claude/skills/pm-dispatch/SKILL.md:731 (work tree), section 升级与决策, between 「卡上裁决评论是详注,仍是执行与复核的第一落点。」 and 「出决策箱须引同趟取回过的裁决 id …」:118 B (cap 120). Reads: a ruling clause that names a file, a symbol, a line or a call shape carries, per clause, the reading behind it or is marked 「未验证」; a clause that only cites rules owes nothing. 读数 is the corpus's defined term (:166–:167: UTC 取数时刻 + ref/tip; AGENTS.md: a count plus the tree it was taken against), and 「未验证」 is the dispatch-order rule's own mark, so the mark travels verbatim with the clause when the ruling is quoted into a 派发令.
Out — the 分诊座位职责 line at origin/main :309, 95 B:
Every clause of it is already stated in the ruling section this PR adds to: 「总监席是唯一裁决者:决策箱、代裁与一类自裁只出自本席,⛔ 无子代理无自述。」 (:769) covers 代裁 ⊂ {决策箱、代裁、一类自裁}, 只出自本席, 无自述, 无子代理; 「项目总监席:维护者在所在仓召唤 …」 (:765) covers 维护者召唤; :75 「裁决不在本席,归维护者召唤的总监席」 and the red line :30 「唯一例外是已裁的代裁通道」 still tell the triage seat the same thing in its own sections. Deleting the second spelling is the corpus discipline (one rule per line, no rule stated twice), not a weakening — a control grep for the deleted spelling returns 0 and each restating line returns its line.
Why no cheaper payment existed: measured on this tree, of SKILL.md's 598 adjacent bullet pairs ZERO merge under the 120-byte cap (smallest 124 B), and in the 升级与决策 section ZERO of 40 (smallest 158 B); re-wrap funding is refused by the ratchet rule. The whole-file diff vs
origin/mainis exactly these two hunks (1 insertion(+), 1 deletion(-)).Placement — SKILL.md, not core-rules.md, along the four axes
Measured: the neighbours do not contradict it, and the quoted lines are untouched
Neighbouring text (work tree): :715 「② 把裁决挂在具名、可证伪的前提上,派发令要求 dev 先验前提再动手。」 (a premise-bearing ruling names its premise — compatible: the new line says which clauses of any ruling are the premises); :180 「裁决明令的动作实施中测出对向事实 ⇒ 照字面执行 …」 (what happens when a measurement contradicts a ruled action — unchanged); :427–:432 (the PM's pre-dispatch staleness re-read of a ruling's 动作面/卡引用面 — about the re-read, not about what the ruling carries); :401 「① 既有裁定/在案类规则/成文纪律机械决定方向,裁决评论点名所用权威」 (the class-1 gate is rule-citing by construction — the exemption agrees with it);
references/lanes/director.md:11 (the ruling comment's fixed first line — unaffected).Byte-identity against
origin/main7f7b8557d(diff of the extracted lines, empty): the three quoted dispatch-order lines (:541–:543 there, :540–:542 here); PR #18656's :91; PR #18666's :198–:209, :536–:542 (now :535–:541), :625–:631 (now :624–:630), :642–:648 (now :641–:647). The set of over-120 B lines is unchanged (23, all table rows plus the claim-template line); widest row 342 B, pin 342. Line numbers shift by −1 between the deleted line and the inserted one; no hunk overlaps either PR's hunks.Readings
Head
cb1a949d0(origin/mainf6c2eb7c8merged — one unrelated driver-sql commit; the SKILL.md delta unchanged). Derived withnode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackfrom the worktree (change set from the merge base, no hand-fed paths): 18 commands, list identical before and after the merge. Exit codes captured redirect-then-$?, reconciled with--ran: 「18 derived, 18 run, 0 NOT-MEASURED (a DERIVED zero — all 18 recorded an exit code and none of them is 3)」.node scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-testnode scripts/check-comment-mask-corpus.mjsnode scripts/pm/check-governed-queue-guard.mjs --self-testnode scripts/pm/check-harness-current.mjs --self-testpnpm --filter @objectstack/lint run check:doc-formula-expressions@objectstack/formula/@objectstack/lint, 「Nothing was measured」); built both underos-verify-lock.sh(VERDICT command-exit 0, held 165 s, waited 0 s), then rerunpnpm check:agent-test-spellingpnpm check:doc-authoringpnpm check:driver-memory-censuspnpm check:nul-bytespnpm check:pm-governed-mergespnpm check:pm-governed-prosepnpm check:pm-half-statespnpm check:pm-skill-id-lintpnpm check:pm-skill-ratchetpnpm check:refd-timer-probepnpm check:skill-frame-syncpnpm check:watch-hint-literalpnpm check:pm-expected-skips(explicit, not derived; its self-test pins thecheck-expected-skips.mjsliteral on the enqueue-bar line, untouched)pnpm check:skill-frame-freshness(explicit, outside the derivation)node scripts/pm/check-governed-merges.mjs --test .claude/skills/pm-dispatch/SKILL.md→ exit 3, 「GOVERNED — a human merge is the review record for this PR」 — recorded as the expected answer, not a failure. CI-owned and not run locally: the 52 artifact-roster families, the 11 wide-population families andpnpm lint(the derivation names them as outside the 18; none reads this file's content). No package build is owed by the diff (no package touched); the one build above was that gate's own prerequisite.Acceptance notes
references/lanes/director.md:9 「裁决只存在于本卡:聊天原话、台账行、他卡引述 ⛔ 都不是裁决」 and SKILL.md :729 「一条裁决已记录的权威载体 = 总监席每场收工的摘要台账」 name different carriers as authoritative for a ruling. Observed only; not a defect class (a)–(c), and outside this card. 承接者:无.domain:skillsseat, at the maintainer's word.维护者速读(草稿)
改了什么 —
pm-dispatch技能文件加一行、删一行,行数不变(812 / 812):裁决里凡点名文件、符号、行号或调用形状的条款,要么带上得出它的读数,要么该条注「未验证」;只引规则的条款不欠。删掉的是分诊节里一条与总监席节完全重复的「代裁只出自总监席」拼写。为什么改 — 派发令早有这条纪律(代码危害断言必须有读数,未亲测就注「未验证」),但裁决没有。裁决被 dev 当作已定事实照抄进派发令,不可重裁。一轮六张卡实测:引规则的两条裁决全对,断言实现事实的四条全错(文件位置、调用形状、挂载拓扑、折叠方向),每次都靠 dev 自己重新测量才发现。权威更高的工件反而举证要求更低,这是结构性缺口,不是三次失误。
风险与代价(含回滚) — 零新增门禁、零脚本、零标签;只约束裁决的写法,不要求先测再裁(引规则免费,只有点名代码事实的条款才欠读数或标记)。代价是出裁决的席位多写几个字。回滚 = revert 这一个 commit,两行原样回来。
席位意见 — (留空,由席位填写)
你要做的(一个动作) — 批准这个 PR(受管面
.claude/**,需要你的 approve 或亲手合并)。Generated by Claude Code