Repository navigation
pm-dispatch: retire the fleet one-tooling-slot rule; a lane’s open P0/P1 is an undispatched one - #20967
Conversation
… undispatched The take-order alone sequences tooling cards. A lane's open P0/P1 that holds its p2/p3 tooling cards back is one still in the queue, undispatched; an in-flight P0/P1 holds nothing back. The Unblocks inheritance keeps its other homes (NORTH-STAR priority rule 3, execution-duties chain clause). Claude-Session: https://claude.ai/code/session_01KTZmMfzVzjNvyaLyQ8mHvg Co-authored-by: Claude <noreply@anthropic.com>
…list The label's provenance comment mirrored the SKILL.md tooling row's four named readers; the fleet-wide one-tooling-card-in-flight count is retired, so the comment names the three that remain. Claude-Session: https://claude.ai/code/session_01KTZmMfzVzjNvyaLyQ8mHvg Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Inputs read: card #20957 (body; comments 5921125191 claim, 5921492175 os-dev-report), PR #20967 (body, 4-file list, API diff — byte-equal to the seat's Check-runs on the head (35 at 23:35:37Z): 22 success · 11 skipped · 1 in_progress · 1 failure.
① Derived judgmentsThe diff edits governed Tier S rule text: three files under (a) (b) The new (c) (d) Message 2 in full — 「只要优先派高优先级的卡片就可以」. At the head the only sequencing of (e) (f) Mechanical pins, read at the head. Line counts (g) Census re-run at the head over ② Semver levelNone. The diff touches ③ Boundary flagsEvery deviation the report (5921492175) declares is answered:
Open for the seat (not blocking this verdict): the 普查半态行 reader of ①(c)/(e), and the optional queue-state tightening of ①(b). Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #20957
Clause-②: no
What
Retires the fleet one-
tooling-slot rule from the pm-dispatch skill and states, in the two lines that gate a lane's p2/p3toolingcards on its open P0/P1, that "open" means undispatched. The take-order (execution-duties.md取卡全序 / 标签序) is now the only sequencing of tooling cards; a P0/P1 already in development holds no card back.Maintainer ruling — three messages to the
domain:skillsseat on 2026-09-30, verbatim (the card body carries them too):Console Pin Gatefirst runs in the merge queue for a spec change that moves what the console bundles, and it is not required, so a red there merges (PR #20695:mainred for about 2 h) #20765 占着, 车道p0p1 是应该优先,但p0p1已经在开发中时,不应该卡住其他卡的派发,这个应该立卡优化」Edits — three skill files at net 0 lines each, plus one comment in
scripts/pm.claude/skills/pm-dispatch/references/execution-duties.md:22deleted whole: 「舰队至多一张tooling卡带pm:dispatched,第二张等;带Unblocks:者继承产品级不计数。」 Its inheritance half already has two other homes (item 3 below), so nothing of it is kept.:45unchanged; the freed line is spent directly under it: 「开放 = 未派发(无pm:dispatched、无 assignee);在飞的 P0/P1 不挡任何候选,只余取卡全序。」 — a reading of NORTH-STAR rule 3's 开放, not a change to it; the 取卡全序 / 标签序 lines that follow are the only sequencing left.check:pm-skill-ratchetalso budgets every non-table line at 120 bytes (MAX_LINE_BYTES), and:45is already 111 bytes; the new line is 113..claude/skills/pm-dispatch/references/triage-duties.md:64— 「所入车道队列 P0/P1 开着时,无解锁对象的 p2/p3tooling卡同样关。」 becomes 「所入车道队列 P0/P1 开着(= 未派发,在飞不算)时,无解锁对象的 p2/p3tooling卡同样关。」 (87 → 113 bytes)..claude/skills/pm-dispatch/SKILL.md:112— thetoolinglabel row: 「四具名读者 = 候选查询排除、首触即关、舰队一张在飞、普查半态行」 becomes 「三具名读者 = 候选查询排除、首触即关、普查半态行」 (row 227 → 206 bytes; pin 342). The four-axis frame block (:240-:260) is untouched;check:skill-frame-syncis green.scripts/pm/ensure-pm-labels.sh:282-289— thetoolinglabel's provenance comment mirrored the SKILL.md row ("Four named consumers … the fleet-wide one-tooling-card-in-flight count"); it now names the three that remain and says why there is no fleet count. Comment only: the label description (theUnblocks:/ named-surface ENTRY condition) is unchanged. This file is outside the claim comment's named surface and inside the dispatch order's census clause ("whatever item 2's census finds insidescripts/pm/**"); declared here and in the report.Census (dispatch item 2)
Trees:
.claude/**,AGENTS.md,scripts/pm/**,scripts/*.mjs, read at3693a1b50(my base:013f97df9plus the merges since, none of which touched these files —git log 013f97df9..3693a1b50over the five files is empty).Named queries (
grep -rnE):一张在飞1 ·舰队至多1 ·第二张等1 ·tooling slot0 · onetooling0 ·at most one .tooling0 — the hits areSKILL.md:112andexecution-duties.md:22(matched twice), both retired here.Widened spellings:
one-tooling1 ·in-flight count1 ·dispatched fleet-wide1 ·fleet-wide22 (2 neartooling) ·名额0 ·第二张3 (2 unrelated:dispatch-runbook.md:160,spec-property-retirement/SKILL.md:189).scripts/pm/ensure-pm-labels.sh:286— retired (above).scripts/pm/check-skill-line-ratchet.mjs:346-347— "at most one tooling card is dispatched fleet-wide; andtoolingbecomes a first-touch label with four named readers": the provenance comment of a past ruled ceiling raise, recording what that raise paid for. History, not an operative rule; left as is.AGENTS.md: 0 hits on every query; not edited.Item 3 — where the
Unblocks:priority inheritance livesdocs/NORTH-STAR.md:114, 优先级 rule 3: 「…解锁产品 P0/P1 的仪器卡沿链继承其优先级。」execution-duties.md:44: 「阻塞项在飞 ⇒ 等:pm:blocking在其车道排最前、等待者写该卡;p0/p1 优先级沿链传递。」references/dispatch-runbook.md:162「父卡 p0/p1 ⇒ 阻塞卡同笔升同级,沿链重复。」)Both named homes carry it, so
:22went whole.NORTH-STAR (item 8)
Rule 3 reads 「本车道队列还有开放的 P0/P1 时,该车道不派 p2/p3 的工具卡、契约卫生卡」. The skill lines now say 开放 = 未派发 and 在飞不算 — an execution of 开放 (a card in development is no longer open in the queue), not a contradiction of it.
docs/NORTH-STAR.mdis not edited (Tier H).Line readings (item 6)
.claude/skills/pm-dispatch/SKILL.md.claude/skills/pm-dispatch/references/execution-duties.md.claude/skills/pm-dispatch/references/triage-duties.mdNet 0 per file; no untouched line re-wrapped; no ceiling row moved —
check-skill-line-ratchet.mjsjudges at-most ("over the ceiling ⇒ red") and only prints a hint on headroom, and every file still sits at headroom 0, so there is nothing to lower. The changed non-table lines are 113 and 113 bytes against the 120-byte per-line budget.Gates (local, at
2f2869206)Derived with
node scripts/pm/dispatch-gates.mjs --commands(no paths; the change set from the merge base): 36 families — the dispatch's 21 at013f97df9plus 15scripts/**families pulled in byensure-pm-labels.sh. All 36 run, all exit 0, exit codes recorded per line; reconciled with--ran:✓ dispatch-gates --ran: 36 derived famil(ies) accounted for — 36 run, 0 NOT-MEASURED (a DERIVED zero — all 36 recorded an exit code and none of them is 3).Verdict lines of the load-bearing ones:
✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/execution-duties.md is 183 lines (ceiling 183; headroom 0).·…/triage-duties.md is 120 lines (ceiling 120; headroom 0).·…/SKILL.md is 319 lines (ceiling 319; headroom 0).·…/SKILL.md: widest table row is 342 bytes (pin 342; headroom 0).✓ check-skill-frame-sync: the one declared copy of the decision frame is internally coherent (.claude/skills/pm-dispatch/SKILL.md; …)✓ check-skill-id-lint: 34 file(s) clean (pattern /#[0-9]{3,}/g).✓ check-governed-prose: 2 instruction surface(s) name all 6 registered governed surfaces (…) and claim no others.✓ check-half-states self-test: 4912 cases pass.✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 458 files / 1382 TS blocks judged clean by @objectstack/formula.— afterpnpm --filter '@objectstack/lint...' buildunderos-verify-lock.sh(VERDICT command-exit 0 · held the lock 93s · waited 0s).pnpm check:nul-bytesexit 0.CI-measured only:
check-governed-queue-guard(reads the workflow event payload).Acceptance notes
SKILL.md:112names 普查半态行 as a reader oftooling;grep -n tooling scripts/pm/check-half-states.mjsfinds nothing (exit 1): none of its rows reads thetoolinglabel, andUnblocksappears in that file only inside test fixture text. The row keeps 普查半态行 among the three named readers, as the order says; whether a half-state row for atoolingcard open inpm:queuewith neither line should exist, or the reader should leave the row, is a second question for the seat. carrier: the seat reviewing this PR; noted, not filed.ensure-pm-labels.sh:287-288makes the same claim ("the census / half-state patrol, for which a tooling card open in pm:queue with neither line is a half-state"); left as is for the same reason.Changeset
.claude/**ships in no package'sfiles[];scripts/pm/**is repo tooling and publishes nothing. No changeset; the seat appliesskip-changeset.维护者速读(草稿)
改了什么:撤掉「全舰队同时只派一张
tooling卡」的规矩;把「车道有开放 P0/P1 时不派 p2/p3 工具卡」里的「开放」写明为「还没派出去」,已在开发中的 P0/P1 不再挡住任何卡的派发。剩下的排序只有取卡全序:高优先级的候选先取。为什么改:你 9 月 30 日的三条指示(原话见上)。这条规矩没有脚本强制,舰队实际也没守(同一时刻 7 张
tooling卡在飞),却在本车道挡住了 p1 卡,直到你破例。风险与代价(含回滚):三个技能文件各净零行,不碰四轴决策框、不碰 NORTH-STAR。风险是工具卡可能并发更多、抢验证锁;锁自身已有深度等待兜底。回滚 = revert 本 PR 的两个 commit。
席位意见:(留空,席位定稿)
你要做的:无需操作;Tier S,席位达档复核后落地。
Generated by Claude Code