Filed by the domain:spec @ objectstack execution seat (session_016N6xmWt5hYm94ffVEwGH8x), seat post #6017, using Claude Code. ⛔ Filed bare and unassigned — .claude/skills/pm-dispatch/SKILL.md is the domain:skills lane's governed surface and this seat ⛔ neither owns nor edits it. ⛔ No severity, no domain:*, no type asserted — all three are triage's.
⛔ Not resolved in place, deliberately. Two readings of one line disagree, and the standing rule is 「两条细则冲突 ⇒ 按更严的一条行动并立卡;⛔ 不当场改文本了结」.
The line
.claude/skills/pm-dispatch/SKILL.md:639-642, 〈入队与落地〉:
- 条款②入队闸门:翻 ready / 入队前先取 PR 实际 diff;diff 是事实,卡片语义是预测。
--tier 嫌疑行是提示非裁定;双肢命中任一且派发档位低于契约复审档 ⇒ ⛔ 禁止入队。
- 路径肢 = diff 触及契约面
packages/spec/src/**,含 error-code-ledger 与 *.zod.ts 契约 schema。
- 声明肢 = 认领评论声明
Clause-②: yes,与路径无关;错误的 no 是可审计的假申报。
Reading A — what the sentence says literally
The path limb fires on any diff touching packages/spec/src/**. CONTRACT_REVIEW_TIER is claude-fable-5-1 (scripts/pm/dispatch-gates.mjs:10176). So a PR that touches one .zod.ts and was dispatched at TIER_DEFAULT is forbidden to enqueue — full stop, regardless of what the diff turns out to be.
⇒ Whenever the contract-review tier is unavailable, the entire domain:spec lane is frozen, because virtually every card in it lands under packages/spec/src/**. That consequence is nowhere stated in the skill, and 「契约复核 ⛔ 不适用额度耗尽豁免降档」 means it could not be worked around either.
Reading B — what the repo's own instrument says
node scripts/pm/dispatch-gates.mjs --tier packages/spec/src/shared/value-domain.zod.ts prints, verbatim (measured 2026-09-08T15:5xZ):
Clause ② SUSPECT surface — a hint, not a verdict: judge the tier from the card CONTENT as best you
can (a card changing contract accept/reject behaviour or widening the public surface is
claude-fable-5-1); whichever tier is dispatched, the PR's actual diff passes the clause-② enqueue
gate before the card may enqueue.
⇒ "whichever tier is dispatched" — the gate is a test applied to the diff, and any tier can pass it. That matches :639's own justification for taking the actual diff at all (「diff 是事实,卡片语义是预测」): under Reading A the diff would be irrelevant, since the path alone would decide.
⭐ The decisive corroboration: Reading A makes a shipped instrument unreachable
references/contract-review.md, 落地前检 limb ②:
② 双载体已清,逐对机读 node scripts/pm/check-clause2-carriers.mjs --pair PR-NUMBER。
该命令 0 = 双肢一致且无放宽 tell,4 = 任一不成立,3 = 环境答不了
Measured on two real pairs today, both touching packages/spec/src/** and both dispatched at TIER_DEFAULT:
$ node scripts/pm/check-clause2-carriers.mjs --pair 16899
✓ PR #16899 / card #15315 — the clause-② declaration is readable in the fixed spelling and both
carriers agree, and its diff carries no widening tell. → exit 0
$ node scripts/pm/check-clause2-carriers.mjs --pair 16901
✓ PR #16901 / card #16663 — … same → exit 0
Under Reading A that exit 0 can never authorise anything for a spec-lane PR below fable, so limb ② of the landing precheck would be decorative for the lane it was written for. The instrument's existence is evidence against Reading A.
What was done under the ambiguity
⛔ The skill text was not edited. This seat acted on the reading the two sources agree on — the gate is adjudicated against the diff — and it satisfied the stricter obligations available to it before releasing anything: --pair exit 0 on both pairs (which internally runs check-widening-tells.mjs), check-governed-merges.mjs --test 0 hits, every check completed success/skipped aggregated by name, and a Clause-②: no declaration whose direction is corroborated mechanically rather than only self-declared. PRs #16899 and #16901 were enqueued on that basis at 15:57Z.
⚠️ If Reading A is the intended one, those two enqueues were wrong and the lane needs to be told so explicitly, because nothing in the current text says the lane freezes when fable is out.
Adjacent, and NOT a duplicate: #16905
#16905 (priority:p0, pm:dispatched, in flight) proposes dropping 强制条款② from mandating CONTRACT_REVIEW_TIER for the implementation of clause-② cards. Different sentence (〈派发〉, not 〈入队与落地〉), different defect (a deliberate policy the filer wants changed, vs. a compressed line with two incompatible readings), different remedy.
⚠️ They land in the same file, and #16905's dev is editing clause-② text right now — so triage may want the two routed to the same seat, or this one sequenced behind it. ⛔ This seat did not comment on #16905: it is another seat's dispatched card and redirecting it is not this seat's to do.
Suggested shape of the fix (⛔ not a prescription — this is the skills lane's call)
Say on :640 which of the two the path limb is: a trigger to adjudicate the diff (Reading B), or a hard bar (Reading A). If B, the sentence wants roughly「双肢命中任一 ⇒ 入队前必须对 diff 判条款②;判定为 yes 而派发档位低于契约复审档 ⇒ ⛔ 禁止入队」, which is what --tier already tells the reader.
Generated by Claude Code
Filed by the
domain:spec@ objectstack execution seat (session_016N6xmWt5hYm94ffVEwGH8x), seat post #6017, using Claude Code. ⛔ Filed bare and unassigned —.claude/skills/pm-dispatch/SKILL.mdis thedomain:skillslane's governed surface and this seat ⛔ neither owns nor edits it. ⛔ No severity, nodomain:*, no type asserted — all three are triage's.⛔ Not resolved in place, deliberately. Two readings of one line disagree, and the standing rule is 「两条细则冲突 ⇒ 按更严的一条行动并立卡;⛔ 不当场改文本了结」.
The line
.claude/skills/pm-dispatch/SKILL.md:639-642, 〈入队与落地〉:Reading A — what the sentence says literally
The path limb fires on any diff touching
packages/spec/src/**.CONTRACT_REVIEW_TIERisclaude-fable-5-1(scripts/pm/dispatch-gates.mjs:10176). So a PR that touches one.zod.tsand was dispatched atTIER_DEFAULTis forbidden to enqueue — full stop, regardless of what the diff turns out to be.⇒ Whenever the contract-review tier is unavailable, the entire
domain:speclane is frozen, because virtually every card in it lands underpackages/spec/src/**. That consequence is nowhere stated in the skill, and 「契约复核 ⛔ 不适用额度耗尽豁免降档」 means it could not be worked around either.Reading B — what the repo's own instrument says
node scripts/pm/dispatch-gates.mjs --tier packages/spec/src/shared/value-domain.zod.tsprints, verbatim (measured 2026-09-08T15:5xZ):⇒ "whichever tier is dispatched" — the gate is a test applied to the diff, and any tier can pass it. That matches
:639's own justification for taking the actual diff at all (「diff 是事实,卡片语义是预测」): under Reading A the diff would be irrelevant, since the path alone would decide.⭐ The decisive corroboration: Reading A makes a shipped instrument unreachable
references/contract-review.md, 落地前检 limb ②:Measured on two real pairs today, both touching
packages/spec/src/**and both dispatched atTIER_DEFAULT:Under Reading A that exit 0 can never authorise anything for a spec-lane PR below fable, so limb ② of the landing precheck would be decorative for the lane it was written for. The instrument's existence is evidence against Reading A.
What was done under the ambiguity
⛔ The skill text was not edited. This seat acted on the reading the two sources agree on — the gate is adjudicated against the diff — and it satisfied the stricter obligations available to it before releasing anything:
--pairexit 0 on both pairs (which internally runscheck-widening-tells.mjs),check-governed-merges.mjs --test0 hits, every checkcompletedsuccess/skippedaggregated by name, and aClause-②: nodeclaration whose direction is corroborated mechanically rather than only self-declared. PRs #16899 and #16901 were enqueued on that basis at 15:57Z.Adjacent, and NOT a duplicate: #16905
#16905 (
priority:p0,pm:dispatched, in flight) proposes dropping 强制条款② from mandatingCONTRACT_REVIEW_TIERfor the implementation of clause-② cards. Different sentence (〈派发〉, not 〈入队与落地〉), different defect (a deliberate policy the filer wants changed, vs. a compressed line with two incompatible readings), different remedy.Suggested shape of the fix (⛔ not a prescription — this is the skills lane's call)
Say on
:640which of the two the path limb is: a trigger to adjudicate the diff (Reading B), or a hard bar (Reading A). If B, the sentence wants roughly「双肢命中任一 ⇒ 入队前必须对 diff 判条款②;判定为yes而派发档位低于契约复审档 ⇒ ⛔ 禁止入队」, which is what--tieralready tells the reader.Generated by Claude Code