Uh oh!
There was an error while loading. Please reload this page.
docs(pm-dispatch): rule how clause ② is graded — provisional claim, mechanical floor, judged conformance - #14696
Merged
Merged
Conversation
…echanical floor, judged conformance The clause-② criterion carried no grading rule, so seats produced three materially different kinds of "yes" in a day and two conservative declarations were overturned at tier. This lands the ruling's answer in `references/contract-review.md`: - the claim-time `Clause-②: yes|no` declaration is PROVISIONAL by design — it fixes the conservative dispatch tier, and the real gate is the at-tier review at PR/report time, where the evidence and the cost live; a declaration overturned there is the mechanism working, not a seat fault; - the mechanical floor: any NEW exported symbol, or any NEW key on an already-published payload, is always `yes` — checkable in the tree at claim time, no judgement — and it locks the contract-review tier; - the conformance class is deliberately NOT mechanized (populating an already-declared field, re-selecting an input class between two published codes): it needs at-tier judgement, and a claim that cannot tell dispatches as `yes` — a false `yes` self-corrects, a false `no` ships. The full taxonomy and the claim-time decision procedure are both declined under the startup-scope lens, and that refusal is itself ruled content. Paid into the line ratchet first, in real deleted bytes and never a re-wrap: the 放行 bullet's restated FAIL / 卡在决策 triple (single source is SKILL.md's 条款②入队闸门, which this file's header already points at) and the 三样不变 clause (self-declared 「单源见主文件」, its governed-surface limb surviving in-file in 落地前检三条) went, taking that bullet from 6 lines to 4. The residual +5 is the ruled addition at its reasoned floor; the ceiling moves 60 → 65 on the ruling's own authorization, quoted verbatim beside the row. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
os-zhuang
approved these changes
Sep 2, 2026
os-zhuang
marked this pull request as ready for review
September 2, 2026 22:52
os-zhuang
enabled auto-merge
September 2, 2026 22:52
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Sep 2, 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 freeto 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#14047
Lands the ruling's answer to the clause-② grading question in the ONE file the ruling names
as its 落点, and pays the line ratchet it crosses.
The ruling, verbatim and untranslated
Maintainer, 2026-09-01, comment 5494466874 (项目总监席 batch, maintainer's reply 逐字:「同意」):
What landed — per item, 落点 | before | after
All three land as bullets in
.claude/skills/pm-dispatch/references/contract-review.md,in section 「载体纪律(挂与清)」, immediately after the 适用性 bullet — the file's existing
home for "what falls under clause ② and how it is graded". No new section: the ruling adds
grading rules to an applicability section that already exists.
Clause-②was as a place forward-looking facts liveClause-②: yes|no只定派发档位的保守方向,⛔ 非终审;真闸门在 PR/报告时的档位复核 —— 证据与成本在那里。声明被档位推翻 = 机制按设计工作,⛔ 不作席位过失。」dispatch-gates.mjs --tieroutput, never in the review referenceyes,直接锁契约复审档」, marked claim 时可查树、无需判断yesRuling item 5 is the 落点 itself. Not done, deliberately: the four specimen PRs were not
reopened, and no file other than the reference (plus the ratchet's own CEILINGS row) is touched.
Provenance follows the file's own convention — 「维护者 2026-09-01「同意」」, by date and
quoted words. The file's header forbids issue ids (「⛔ 不引 issue 编号」) and
check:pm-skill-id-lintscans it against/#[0-9]{3,}/, so no card number appears in thereference. The ruling's own authorizing sentence, which does carry an id, is quoted in the
CEILINGS map comment in
scripts/pm/check-skill-line-ratchet.mjs— outside that gate'sSCAN_ROOT, which is.claude/skills/pm-dispatchonly.Line arithmetic
Payment came FIRST and it is real deleted bytes — not a re-wrap. 313 bytes went, and the
放行 bullet fell from 6 lines to 4.
Per-line 落点 of each deletion
FAIL ⇒ 补丁轮;卡在决策 ⇒ 只进决策箱,⛔ 永不自裁 —— 真正设计分叉照旧升级维护者;(118 B)— restates SKILL.md 「条款②入队闸门」 almost phrase for phrase: 「FAIL ⇒ 补丁轮;⛔ 免复核不放行;
真正设计分叉照旧进决策箱,席内复核 ⛔ 不替代维护者裁定」. Surviving anchor: SKILL.md, which
this file's own header line 3 already points at — 「出处:主文件条款②闸门(原则/双肢与档位单源在彼)」.
No rule is lost; the rule keeps its single source.
**三样不变**:受管面照旧 draft-only + 终局两条(人工直合或授权批准钉 head 入队,单源见主文件)、⛔ 席位永不代批;FAIL / REWORK 原样;降档保险丝原样。(195 B)— a self-declared restatement: it says 「单源见主文件」 in its own text. Surviving anchors, two:
SKILL.md's ACCEPT 终局四件套 for the governed-surface limb, and — inside this same file —
落地前检三条's 「受管面不适用,draft-only 终局不变」. Its remaining half (「FAIL / REWORK 原样;
降档保险丝原样」) is a "nothing changed" statement carrying no rule, written when the in-seat
rework landed; 降档保险丝 is the section directly below it.
Restatements measured and REJECTED as payment
A LINE ratchet cannot bank a deletion that does not cross a 120-byte boundary. These three are
real restatements, and deleting them buys nothing, so they were left alone rather than touched
for a number that would not move:
Why the residual +5 could not be paid
The ruled addition is 773 bytes of content. At the gate's own 120-byte cap that is 7 lines
minimum (6 × 120 = 720 bytes, less than 773), so no six-line spelling exists that keeps the
ruled substance — and the last thing that would have to go is 「不是出货缺陷」, which is the
ruling's own stated justification for declining the taxonomy. Every landed line was checked
against the cap; the only over-120-byte lines in the file are the two legacy quotation-exempt
ruling quotes that were already there (122 B and 125 B), left exactly as their author broke them.
The raise is authorized by the ruling itself, verbatim and untranslated, from comment 5494466874:
That sentence and its comment id are also quoted beside the row in the CEILINGS map, per the
map's standing convention. Ceiling set to the exact landed count, headroom 0.
Gates
Every one run through
scripts/pm/os-verify-lock.sh, exit code captured by redirect BEFORE anypipe, on committed head f999175 (working tree clean at the time of the run).
check:pm-skill-ratchet✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/contract-review.md is 65 lines (ceiling 65; headroom 0).check:pm-skill-ratchet --self-test✓ check-skill-line-ratchet self-test: 111 cases pass.check:pm-skill-id-lint✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 filescheck:skill-frame-freshness✓ check-skill-frame-freshness: the decision frame in this tree is current with origin/main (fetched just now).check:pm-dispatch-gates✓ dispatch-gates self-test: 1240 cases pass.check:pm-governed-merges✓ check-governed-merges --self-test: 241 assertions (…)check:nul-bytescheck-nul-bytes: OK (scanned 8004 text file(s) -- 8004 tracked, 0 untracked-not-ignored; skipped 7 binary; no raw ASCII control bytes).Full union, re-derived AFTER the last edit
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, no hand-fedpaths, re-run on head f999175 and byte-identical to the pre-commit derivation. It resolved the
change set from git itself — 2 paths, committed 2 / working tree 0 — and named 20 commands.
15 of 20 measured, all exit 0: the 8 above plus
check:agent-test-spelling,check:bash32-floor,check:cli-command-ids,check:cross-package-test-inputs,check:entry-guard,check:parse-guard,check:pnpm-filter-targets,check:watch-hint-literal,scripts/check-cross-package-test-inputs.mjs,scripts/pm/bare-root-worklist.mjs --self-test.5 of 20 NOT MEASURED — never green, never a flake. Each exited 3 with its own PREREQUISITE
text (「Nothing was measured: this gate exited before running a single check」): the fresh
worktree has no
node_modules, which these five need. They arescripts/check-ci-filter-parity.mjs,scripts/check-shard-attestation.mjs,scripts/check-test-completeness.mjs,pnpm --filter @objectstack/lint run check:doc-formula-expressions,and
pnpm check:doc-authoring. This is a declared narrowing:the diff touches one
.claude/**markdown file and onescripts/pm/gate script, so none of thefive has an input in this change set, and CI runs the farm exactly once regardless.
Beyond the derived families: the diff edits a gate script, so that script's own suite was run
separately —
check-skill-line-ratchet.mjs --self-test(111 cases, above). The repo carries no*.test.tsnaming it; the two other scripts that mention it(
check-skills-token-ratchet.mjs,check-published-list-mirrors.mjs) reference it only in proseand were run anyway, both exit 0.
No changeset: this releases nothing.
scripts/check-empty-changeset.mjsenumerates the class inits own words — 「It releases nothing (.github/, .claude/, skills/, docs/, content/, examples/,
tests-only, and the like)」 — and its guidance for that class is exactly this PR's shape: apply
the
skip-changesetlabel instead. Governed surface (.claude/**), so this PR stays draft.Follow-up, recorded not fixed
SKILL.md is deliberately untouched. One line in it reads in tension with 「provisional」 and is
worth the maintainer's eye — in 「条款②入队闸门」: 「错误的
no是记录在案、可审计的假申报」.Calling a wrong
noa 假申报 frames the seat, while the ruling says a declaration overturned attier 「不是席位过失,是机制按设计工作」. The two are reconcilable — the ruling's 「不是席位过失」
is about being overturned at tier, and 假申报 is about the one direction that ships — but the
wording is the kind that gets read alone. Not edited here: the ruling names one 落点, and this
is not it.
premise_false
first said the card carried no claim comment with this session's URL. It does: comment
5514292041, 2026-09-02,
session_01LraLgQVGq8egUwfYZpbYt1, branchclaude/issue-14047-clause2-classes, declaringClause-②: no. The false reading was a READartifact, not a fact about the card — the issue page's SSR payload preloads only the first 15
timeline items and the claim comment sits past that page, so "absent from the payload" was
taken for "absent". A direct comment read settles it. The brief's premise held; the assignee
(
os-litant) andpm:dispatched/domain:skills/priority:p2were correct as stated.skills/**diffs. It does notapply: this diff touches
.claude/skills/**, and the ratchet's own header states the publishedskills/catalog is deliberately OUTSIDE the ceiling — a different surface.(
GitHub access is not enabled for this session), authenticated and not, andghis absent.Card reads went through the zero-quota public-repo payload channel; writes through MCP.
🤖 Generated with Claude Code
https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
Generated by Claude Code