skills(pm-dispatch): clause-② is directional; false-rejection and error-code-face boundaries - #16501
Merged
Merged
Conversation
…or-code-face boundaries - SKILL.md: the criterion and the claim 判据 read 放宽接受集或扩大公开面; a narrowing lands at its ordinary tier; the false-rejection boundary (a `no` cites the published contract text; a deliberate refusal is never a false rejection); the error-code published face is the ledger/enum; the compensating control until the mechanical widening-tell gate lands. Four additions paid by four folds of restated lines (811 held). - contract-review.md: the `Contract-text:` claim-comment spelling beside the declaration line, paid by one restated line (60 held). - lanes/spec.md, lanes/engine.md: the lane restatements of the criterion take the same direction qualifier (line-neutral). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
os-zhuang
approved these changes
Sep 7, 2026
os-zhuang
marked this pull request as ready for review
September 7, 2026 07:21
os-zhuang
enabled auto-merge
September 7, 2026 07:21
This was referenced Sep 7, 2026
This was referenced Sep 7, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #16229
Fixes #16404
Fixes #16349
Three director rulings on the Clause-② criterion, each answered by the maintainer with 「同意」, folded into one governed PR. Rules only, one rule per line, every file held at its pinned line count (SKILL.md 811 · contract-review.md 60 · lanes/spec.md 43 · lanes/engine.md 32), every new line under the 120-byte cap, no issue numbers in the corpus. This PR's own declaration is a
noin prose: it changes protocol text, not a contract door; no rejection is removed, so noContract-text:citation is owed by it.维护者速读(草稿)
no, #15963 landsyes, and they are the same class #16404 选项 D、[Decision] Clause-② — is it directional? Two seats read the same sentence oppositely, and the enqueue gate hangs on the answer #16349 读法 A)写进 pm-dispatch 的条款②判据:只有放宽接受集或扩大公开面才触发;删误拒是no但必须引已发布契约文本;错误码的已发布面是 ledger。Ruling A — #16349, reading A (directional), decision batch #62
Old (SKILL.md, 派发 section):
- 强制条款②:凡改变契约接受/拒绝行为或扩大公开面的卡一律契约复审档。New (line-neutral rewrite):
- 强制条款②:凡放宽接受集或扩大公开面的卡一律契约复审档;拉回已声明契约按常规档。Old (SKILL.md, claim-shape section, two lines):
- \Clause-②: yes | no` 是条款②内容肢的强制申报,恒英文机器判据,恰这两种拼写。- Clause-② 判据:本卡改变契约接受/拒绝行为或扩大公开面吗;`yes` 绑定入队闸门。New (one line — this is the fold):- `Clause-②: yes | no` 恰这两种拼写,恒英文机器判据;判据:本卡放宽接受集或扩大公开面吗。The two clauses dropped are restated where the gate is defined: 「声明肢 = 认领评论声明Clause-②: yes」 and 「双肢命中任一…⛔ 禁止入队」 / 「Clause-②: yes` 认领同笔在卡上挂标」 in 入队与落地.Added, paid by that fold — the compensating control the ruling conditions A on (no card number in the corpus; the mechanical widening-tell gate is queued as #16448, not this PR):
- 机械放宽判别门禁落地前,入队前的席内契约复核是方向自述的补偿控制。The mechanical boundary test the skill already states — 「机械边界测试:改动扩大接受集或公开面 ⇒ 人工;拉回已声明契约 ⇒ 代裁车道」 — is untouched; the criterion sentence now says the same thing, which is what the ruling asked for. The maintainer's ruling line 「条款②只指已发布契约面」 stays verbatim.
Ruling C — #16229, option C (false rejection), decision batch #55
Added to SKILL.md, directly under 「条款②只指已发布契约面」:
- 删已发布契约文本本就否定的误拒本身是 \no`;该 `no` 须引那段文本,缺引即读作缺申报。- 引文不符 ⇒ 降为 `yes`;裁决守卫、安全拒绝、失败关闭是刻意拒绝非误拒,删之 `yes`。`Paid by two folds in the same file:
Serial constraints cleared:line verbatim.Added to references/contract-review.md, beside its
Clause-②: yes | noline — the claim-comment spelling:- 删误拒的 \Clause-②: no` 附 `Contract-text:` 引已发布契约文本,双载体同载;缺引即缺申报。`Paid by deleting 「未达档席 ⛔ 不凭自述复核,恒走本路径;子代理裁决按转录核验采信。」 — restated by the 降档保险丝 section (「⛔ 自述档位不是读数…」, 「改走转录核验的复核子代理…」, 「转录档位核验…」).
Ruling D — #16404, option D (the ledger is the published face), decision batch #62
Added to SKILL.md, in the same block:
- 错误码已发布面 = \ERROR_CODE_LEDGER`/`StandardErrorCode`:新码恒 `yes`,无门亦然,漏登即缺口。Paid by deleting 「档位以 dispatch-gates 常量CONTRACT_REVIEW_TIER为准,模型升级只改一行一个文件。」 in 入队与落地 — restates 「档位值单源在 dispatch-gates 常量」 in 派发;CONTRACT_REVIEW_TIER` is still named there.The ruling's execution line pointed at contract-review.md; the sentence landed in SKILL.md because that is where the criterion lives (contract-review.md line 3 defers to SKILL.md for it and carries carrier discipline only) — one rule, one home. The ruling's third sentence (an unregistered code in dist is a protocol gap, not a per-card tier question) is compressed to 「漏登即缺口」 by the byte cap; the spec seat's ledger card carries the registration work.
The pair checker is left alone — and why
scripts/pm/check-clause2-carriers.mjsdoes read the declaration limb (readClause2Line/cardDeclaration, fixed spelling). The ruled one-liner — aClause-②: noon a rejection-removing diff must carryContract-text:— needs the predicate "this diff removes a rejection", and the checker has no honest way to measure it: its reader roster islistOpenPulls · readCard · readCardComments · readCarrierEvents · readHeadCommitDate(no files, no patch), and its docblock draws the path/diff limb as a deliberate boundary. A hunk-text heuristic (a deleted throw, a widened schema arm) misreads in both directions — a moved throw reads as a removal, a widened condition never reads at all — and inferring it from prose is the relaxation the file bans by name. The diff-measured predicate is exactly what the queued widening-tell gate builds; theContract-text:co-read belongs beside it (noted below for the seat, not filed).Two lane restatements of the criterion — bounded in-place fix, declared
A repo-wide grep for the directionless phrase (改变…接受/拒绝行为) outside SKILL.md hits exactly two operative lines, both lane restatements of the criterion — and SKILL.md's 「条款②判据即…
references/lanes/spec.md席内分派判据」 names one of them as a criterion source, so leaving it directionless would keep the ruled conflict alive in the very file the criterion points at:Both are line-neutral rewrites outside the claim's declared file surface; the four conditions of the bounded fix hold: same defect class (the criterion sentence), mechanical form pinned by the ruling, no other claim holds either file (docs(pm-dispatch): the batch #62 skill folds — file-surface batch independence, priority in the selection order, the readings-ledger ceiling exception, the suite-event head re-read, the director carve-out #16486 and docs(pm-dispatch): read the verify-lock queue depth before each dispatch and hold at depth ≥ 2 (#14944 Q1 B) #16271 touch neither), and
dispatch-gates.mjs --commandsderives byte-identical gate families for the two-file and four-file lists. The claim's file surface is amended in the report comment. If the seat prefers them out, they revert in one commit without touching the SKILL.md fold accounting.Serial constraints
93907021e7) holds SKILL.md; its hunks are at 75–76, 84, 391–392, 434–478 (edits at 434–436, 444, 446, 454, 456, 478), 523–526, 551, 656, 659 — none inside 472–476 or 507–516 where this PR edits. Proof on this head:git merge-tree --write-tree HEAD 93907021e7⇒ exit 0, tree69a6cddae079e9d05170823e3b7f92a7f32fd281;git -c merge.os-regen.driver=false merge-tree --write-tree HEAD 93907021e7⇒ exit 0, same tree. docs(pm-dispatch): the batch #62 skill folds — file-surface batch independence, priority in the selection order, the readings-ledger ceiling exception, the suite-event head re-read, the director carve-out #16486 had not merged at the last fetch (origin/main=222a5283eb, which touches none of these four files;git merge-tree --write-tree HEAD origin/main⇒ exit 0).4d3194ba74) is dirty against plainorigin/mainalready (git merge-tree --write-tree origin/main origin/pr-16271⇒ exit 1) and owes its own re-fold; none of this PR's lines sit in its hunks (434–437, 444, 446–448, 519–521, 703–704 at its own base). No proof is claimed against it.Verification (final commit
34a0a45135; every exit captured before any pipe)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths; derived from git: 4 committed paths vs merge base4500bc5d7) ⇒ 16 families; all 16 run;--ranverdict: 「✓ dispatch-gates --ran: 16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED.」node scripts/pm/check-skill-line-ratchet.mjs --self-test⇒ 「✓ check-skill-line-ratchet self-test: 157 cases pass.」; live run ⇒ 「.claude/skills/pm-dispatch/SKILL.md is 811 lines (ceiling 811; headroom 0)」, 「references/contract-review.md is 60 lines (ceiling 60; headroom 0)」, lanes/spec.md 43/43, lanes/engine.md 32/32;pnpm check:pm-skill-ratchetexit 0.pnpm check:pm-skill-id-lint⇒ 「14 cases pass」 + 「26 file(s) clean」;pnpm check:skill-frame-sync⇒ 「2 copies of the decision frame are structurally isomorphic across 2 files」;node scripts/pm/check-clause2-carriers.mjs --self-test⇒ 「190 cases pass」;pnpm check:nul-bytes⇒ 「OK (scanned 8088 text file(s)…)」.node scripts/pm/check-governed-merges.mjs --teston the four files ⇒ exit 3: 「governed-surface predicate: 4 of 4 path(s) hit the register … ⛔ GOVERNED — a human merge is the review record for this PR」.check:doc-formula-expressionsfirst returned exit 3 (PREREQUISITE NOT MET — formula/lint not built; nothing measured), was re-run afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lintthrough the verify lock ⇒ exit 0.pnpm lintthroughbash scripts/pm/os-verify-lock.sh(slotissue-16229, one acquisition) ⇒ 「VERDICT command-exit 0 · held the lock 105s · waited 96s」, no eslint findings.skip-changesetapplied via the additive labels endpoint with a comparison read-back).验收备注 (noted, not filed — below the finding admission threshold)
Contract-text:co-read for the pair checker belongs with the widening-tell gate (pm gates: a "widening tell" check — a diff that ADDS a key / arm / branch to a schema or registration while its claim saysClause-②: nois refused at enqueue (mechanical control for the directional Clause-② ruling on #16349) #16448 remains open; it is the one gate that will read the diff) — a one-line sub-item there, not a second diff reader here.Contract-text:line: the template carries unconditional lines; the conditional spelling lives in contract-review.md and the checker tolerates the extra line.Generated by Claude Code
Generated by Claude Code