skills(pm-dispatch): the queue-entry rule names its third case — red BY DESIGN on a non-required check — and the two ceilings rise by one as ruled - #17021
Conversation
…BY DESIGN on a non-required check — and the two ceilings rise by one as ruled SKILL.md line 633 is compressed in place to carry the case's head and a new line states the three conjunctive conditions; core-rules.md gains the twin line; review-checklist.md's restatement points at the third case in place. The ratchet map raises SKILL.md 811 -> 812 and core-rules.md 150 -> 151 under its own maintainer exit, each row quoting the ruling. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HxLw5aKDPR5RJgyUR7Exkd
…ird-case-ceiling-raise
维护者速读 — PR #17021(#16516,skills 席终稿,2026-09-09T02:38Z)改了什么 — PM 技能的入队规则补上第三种情形:非必查门「按设计而红」—— 该门源码自述 pushed 分支上按设计而红、不跑 为什么改 — 你在 #16502 裁了 C + D:规则要点名这种情形,否则每次 trailer 类的红都要再开一次决策箱。两个文件实测装不下(余量 8 / 6 字节,三个条件至少 107 字节,722 对相邻行无一可折并),你在决裁批 #91 选了 A:已裁内容不是增长,走棘轮自己的维护者出口抬 1 行。 风险与代价(含回滚) — 入队规则从「全绿」放宽到「全绿,或三条全立的按设计红」;放宽面被三个合取条件锁死,「队列是唯一被认可的落地路径」一字未动。棘轮上限净 +2 行,余量仍为 0。回滚 = revert 本 PR(四文件同回)。设置 D 与本 PR 无关、本 PR 不依赖它;它仍是 #16502 关卡的另一半。 席位意见 — 接受。本席在拉下来的分支头上复跑:棘轮 exit 0(812/812、151/151、77/77、32/32),id-lint 26 文件干净,四轴框架两份同构,控制字节 0;改动行字节 115 / 112 / 116 / 119;「队列是唯一被认可的落地路径」在头上 grep 1 命中;上限记录形态与 state-machine 43→44 先例同形。CI 02:35Z 无红(4 项在跑)。PR #16915 在本 PR 运行中已合并并干净地合进了本分支。 你要做的 — 合并;或由 os-zhuang / hotlong 批准,本席随即入队。看两处:① 新增两行是否逐字对应 #16502 裁决的 (a)(b)(c);② 认可用棘轮的维护者出口抬这 2 行。 Generated by Claude Code |
Fixes #16516
Governed surface (
.claude/**plus the ratchet map) ⇒ draft PR, maintainer merge — not flipped ready, not queued, no auto-merge. #16502 remains open: it is blocked on this landing plus the repository setting D, and it is not addressed here.This is the skill half the card still owed after PR #16831 landed the gate half. It lands the queue-entry rule's third case exactly as ruled — option A on the ceiling question (director record 5583981065, decision batch #91, 2026-09-08): the ready text at 115 / 112 / 116 B, all three conjunctive conditions intact, the two ceilings raised by one, 「队列是唯一被认可的落地路径」 untouched.
What changed — 4 files, +39 / −4, on head
49e0fa05(mergedorigin/main92949593, #16915 included)1.
.claude/skills/pm-dispatch/SKILL.md— the 〈复核〉 queue-entry block (lines 630–634 on this head)The two-case premise line is compressed in place to carry the third case's head, and one new line states the three conditions. Bytes are
Buffer.byteLength(line, 'utf8'); the cap is 120.merge_group、PR 评论记明门与因,缺一即否。」 112 BThe three conjunctive conditions of the #16502 ruling map one-to-one: (a) the check's own source names the red as by-design on a pushed branch → 源码自述 pushed 分支上按设计而红; (b) the check does not run on
merge_group→ 不跑merge_group; (c) the PR comment records which check and why → PR 评论记明门与因. 「缺一即否」 / 「三条全立」 is triage's 「⛔ 少一个条件都不行」. Byte-identical and untouched: 「- 路径面干净的才转 ready → 入队;队列是唯一被认可的落地路径,⛔ 永不队列外合并。」 and 「- 入队资格 = PR 上每一个 check 全绿,⛔ 不是 required 子集;required 集是队列强制的地板。」.2.
.claude/skills/pm-dispatch/references/core-rules.md— the twin line (SKILL.md:44 「一条规则在本文与核心条款一处改动,另一处同 PR 同改」)One NEW line directly under 「- 入队资格是每一个检查全绿 ⛔ 不是必查子集;…」: 「- 唯一例外:源码自述 pushed 上按设计而红、不跑
merge_group、评论记明门与因,三条全立。」 116 B. Option C (SKILL.md alone) was refused by the ruling; this is the twin it requires.3.
.claude/skills/pm-dispatch/references/review-checklist.md:43— the restatement points at the third case, in placeThe previous flight noted (not filed) that this line and
true-green.md:3restate the all-green rule without the third case; this PR is the carrier the note named. Line 43 stated the rule as a rule, so it is rewritten in place — line count unchanged (77 / 77), no ceiling touched: 「- 两 job 只是 required 地板,入队资格另要求全部 check 全绿;真绿跑法见true-green.md。」 108 B → 「- 两 job 只是 required 地板,入队另要求全 check 绿(第三种情形见 SKILL.md);跑法见true-green.md。」 119 B.true-green.md:3is left as is: it is already a pointer to the SKILL.md clause (「见 SKILL.md 〈复核〉的入队资格条款…」), so a reader lands on the third case there.4.
scripts/pm/check-skill-line-ratchet.mjs— the two ceiling rows, 811 → 812 and 150 → 151Each row carries the ruling record in the map's own precedent form for an ORDINARY ruled raise under the header's maintainer exit (the
platform-readings.md324→358 / 358→397 rows; thestate-machine.md43→44 row the ruling itself names as precedent). Not aruledRaisesrecord: those exist only on aCROSS_FILE_MOVESdestination, and neither SKILL.md nor core-rules.md is one (the only declared destination isplatform-readings.md), so the map-wide move-total verdict is unaffected — it sums declared participants only. No other row moves; both rows read 「Landed count, headroom 0」 on this head.The rulings this raise rests on (the ratchet header requires them quoted in the raising PR)
Maintainer ruling on #16502 (decision batch #73, 2026-09-07, options C + D, maintainer 「同意」), as the card's director record states it: "C: a PR may enter the queue carrying a red on a non-required gate when that gate's own text says the red is expected on a pushed branch and is remedied at merge time … The existing rule's premise — 'a red on a non-required gate is either a real defect or a broken gate' — has a third case, red by design, and the rule must name it rather than leave every future instance to a decision box." The admissibility conditions as the card states them: "a red on a non-required check is admissible only when (a) the check's own source names the red as by-design on a pushed branch, (b) the check does not run on
merge_group, and (c) the PR comment records which check and why. Anything else stays a defect or a broken gate. ⛔ Keep 「队列是唯一被认可的落地路径」 untouched — option A (manual merge) was refused."Ceiling ruling, director seat record 5583981065 (decision batch #91, 2026-09-08, maintainer via the standing delegation 「继续决策」, adopting the skills seat's recommendation A), verbatim:
Why a raise and not an in-place payment — measured in the previous flight's dev report (5582599379) and re-read on this tree: the conditions need ≥107 B against 8 spare bytes on the 112 B rule line; the tightest self-contained one-line form is 137 B; of 601 adjacent bullet pairs in SKILL.md and 121 in core-rules.md, zero merge under 120 B. Re-wrap is not currency, and deleting a ruled clause was refused (B).
Verification (all on head
49e0fa05unless stated)Ratchet gate,
node scripts/pm/check-skill-line-ratchet.mjs→ exit 0, its own lines:--self-test→ exit 0, 「✓ check-skill-line-ratchet self-test: 157 cases pass.」 Every edited line is under the 120-byte cap (115 / 112 / 116 / 119 measured above; the gate's length rule is green on all four files).Reverse verification of the raise (one-off, trap-guarded, from the committed state; no test file left behind): with the two map rows reverted on disk to 811 / 150 — proven on disk by anchor counts (811-row 1, 812-row 0; 150-row 1, 151-row 0) and
git diff --stat HEAD= 2 insertions / 2 deletions — the gate reads exit 1 with exactly two ✗ lines: 「SKILL.md is 812 lines; the ratchet ceiling is 811」 and 「core-rules.md is 151 lines; the ratchet ceiling is 150」. Restore viagit checkout HEAD -- path, proven bygit diff HEADempty, porcelain empty, andgit hash-object= the HEAD blobe8bce47c1f0cb3f87c68aea4db27e8573845493a. Direction: red as expected; the raise is exactly the two lines the ruling sized.Gate union — derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackfrom the real changeset: 39 commands (the dispatch's 38 pluspnpm check:required-contexts, newly derived). All 39 run on49e0fa05with each exit captured before any pipe: 39 / 39 exit 0;node scripts/pm/dispatch-gates.mjs --ran …on49e0fa05→ exit 0, 「✓ dispatch-gates --ran: 39 derived famil(ies) accounted for — 39 run, 0 NOT-MEASURED.」 Ratchet-relevant lines: 「✓ check-skill-id-lint: 26 file(s) clean (pattern /#[0-9]{3,}/g).」 · 「✓ check-skill-frame-sync: 2 copies of the decision frame are structurally isomorphic across 2 files」 · 「✓ check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces …」 · 「check-nul-bytes: OK (scanned 8417 text file(s) … no raw ASCII control bytes).」 · 「OK check-ratchet-remedy-authority: 228 scripts swept … 15 mark the expanding remedy ⛔ MAINTAINER-ONLY …」.pnpm check:pm-dispatch-gatesruns past the 600 s foreground cap, so it was started detached and awaited in the foreground withtail --pid; exit file 0, its own line 「✓ dispatch-gates self-test: 1561 cases pass.」 (02:21–02:32Z on49e0fa05; the same line and exit on the pre-merge head2443306f).pnpm --filter @objectstack/lint run check:doc-formula-expressionsran after building the@objectstack/lintupstream closure underos-verify-lock.sh(VERDICT command-exit 0, 224 s held) — the only build in this PR, taken as that gate's prerequisite; no package is touched, so no package test or typecheck is owed.Governed test:
node scripts/pm/check-governed-merges.mjs --test …on the four paths → exit 3, the three.claude/**paths named as governed.skip-changeset: nothing published moves —.claude/**andscripts/pm/**are outside every package'sfiles[].验收备注
references/true-green.md:3keeps its wording — it is already a pointer to the SKILL.md clause, not a restatement of the rule; 承接者:无..claude/agents/os-dev.mdcarries the seat-side default 「删不出等量内容 ⇒ 报 blocked,⛔ 不抬 ceiling」; this PR's raise is the maintainer's own ruling through the ratchet's maintainer exit, which is the case that default defers to (the previous flight reported and stopped exactly as it says); no text change owed; 承接者:无.92949593) while this branch was open. Merged into this branch cleanly (its SKILL.md and core-rules.md edits are disjoint from these lines; core-rules.md:124 sits directly above the new line 126 and merged without conflict). Another actor's state, not touched.维护者速读(草稿)
改了什么:PM 技能的入队规则补上了第三种情形 —— 非必查门「按设计而红」:该门源码自述 pushed 分支上按设计而红、不跑
merge_group、PR 评论记明是哪道门与为什么,三条全立才可带红入队;核心条款孪生行同改;复核清单里那句「全部 check 全绿」改成指向第三种情形。为了装下这两行,行数棘轮的两个上限各抬 1(SKILL.md 811→812、core-rules.md 150→151),上限行旁边记着这次裁决。为什么改:#16502 的裁决(C + D,您已「同意」)要求规则点名这种情形,否则每次 trailer 类的红都要再开一次决策箱;而两个文件实测无法原地容纳(余量 8 / 6 字节,三个条件至少 107 字节,722 对相邻行无一可折并),您在决裁批 #91 选了 A:已裁内容不是增长,走棘轮自己的维护者出口抬 1 行。本 PR 只做这件事。
风险与代价(含回滚):入队规则从「全绿」放宽为「全绿,或三条全立的按设计红」,放宽面被三个合取条件锁死,「队列是唯一被认可的落地路径」一个字未动;棘轮上限净 +2 行,余量仍为 0。回滚 = revert 这一个 PR(四个文件同回)。⚠️ 设置 D(
squash_merge_commit_message→PR_BODY)与本 PR 无关、本 PR 不依赖它;它仍是 #16502 关卡的另一半。席位意见:(留空)
你要做的:人工合并本 PR(受管面);合并后 #16502 只剩设置 D 一项阻塞。
🤖 Generated with Claude Code
Generated by Claude Code
Generated by Claude Code