skills(pm-dispatch): hard serial across rounds applies to the same claimed region, not the same file — SKILL.md :441 and its core-rules twin - #19317
Conversation
…aimed REGION, not the same file — SKILL.md :441 and its core-rules twin, one word each Clause-②: no The 候选与批次 section gave two opposite serial rules for every shared path but `.objectui-sha`: :437 (「共享其它路径是普通并发,后落地方解冲突」) and :441 (「同文件单跨轮硬串行」). Ruling 甲 narrows :441 to the REGION the claim declared: hard serial across rounds only where the two claims' declared file surfaces overlap; the same file in different regions is ordinary concurrency and the later lander resolves the conflict — which is what :437 already says for every non-single-writer path once :441 stops claiming the whole file. - SKILL.md :441 — 同文件 → 同区域 (107 B → 107 B); the 「延后不是搁置…」 half stays byte-verbatim; :437 untouched; `SINGLE_CLAIM_PATHS` stays the only whole-file single-writer set; 813 / 813. - references/core-rules.md :105 — 同文件硬串行 → 同区域硬串行 (119 B → 119 B), the twin SKILL.md:44 orders; 151 / 151. The ruling's own :441 sentence (「同区域(认领申报的文件面重叠)单跨轮硬串行; 同文件不同区域是普通并发,后落地方解冲突。」) measures 123 B alone and 198 B with the deferral half, against the ratchet's 120-byte line cap and a 813-line ceiling with zero headroom; measured red on the gate in both one-line and two-line forms. The one-word narrowing is the rendering that keeps the deferral half verbatim, net 0, no script, no gate — the PR body carries the measurements and the alternative (a ceiling raise under the ratchet's own maintainer exit). Claude-Session: https://claude.ai/code/session_017ETYWqMQD4qMtZzAGovWNi Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: ① Derived judgments
② Semver levelNone — ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #18891
Clause-②: no
Ruling-ref: 5727164406 — director seat, batch 157 item 2, letter 甲, maintainer 「其他同意」 2026-09-18T08:10Z
What changed — two lines, one word each, net 0 in both files
.claude/skills/pm-dispatch/SKILL.md.claude/skills/pm-dispatch/references/core-rules.mdLine counts: SKILL.md 813 / 813, core-rules.md 151 / 151.
:437is untouched;SINGLE_CLAIM_PATHSstays the only whole-file single-writer set; the 「延后不是搁置…」 half stays byte-verbatim; the core-rules twin lands in the same PR as SKILL.md:44 orders. No script, no gate, no other line of either file. The commit is5676515onclaude/issue-18891-region-level-serial, base801415a.Why this rendering and not the ruling's sentence verbatim — measured, not assumed
The ruling's :441 text 「同区域(认领申报的文件面重叠)单跨轮硬串行;同文件不同区域是普通并发,后落地方解冲突。」 is 123 bytes as a bullet line, and 198 bytes with the 「延后不是搁置…」 half the ruling keeps.
scripts/pm/check-skill-line-ratchet.mjs(pnpm check:pm-skill-ratchet, notcheck:pm-governed-proseas the dispatch assumed) caps every non-exempt line of this file atMAX_LINE_BYTES = 120and holds the file at ceiling 813 with headroom 0, so the ruling's own sentence cannot land as written under the file's own gate without a script edit that both the ruling (「⛔ no new script, no gate」) and the dispatch (net 0, no script) refuse. Readings taken on the real gate, each mutation restored to the HEAD blob (hash-verified,git diff HEADempty) before the next:check:pm-skill-ratchetverdictThe neighbours cannot absorb the 74-byte deferral half either: :436 to :452 measure 118 / 114 / 112 / 114 / 118 / 107 / 117 / 104 / 67 / 115 / 79 / 111 / 82 / 98 / 120 / 117 / 109 bytes, and the only other line that speaks of deferral (:452, 「阻塞解除后延后单重定价…」, 109 B) has 11 bytes of slack. A bigram-Jaccard scan over the file's 627 bullet lines finds no provable duplicate to retire: the top pairs (J 0.59 down to 0.35) are distinct pointer lines into
references/dispatch-runbook.mdcarrying different topics.What the one-word rendering keeps, and what it delegates to lines the ruling left standing: 「同区域…硬串行」 IS the ruling's narrowing (its facet ①: one line narrower, a special case removed). The 「同文件不同区域是普通并发,后落地方解冲突」 clause is exactly what :437 already states for every non-single-writer path (「共享其它路径是普通并发,后落地方解冲突」): once :441 no longer claims the whole file, the same file in different regions is one of those other paths by elimination, and the two lines contradict on no path. The parenthetical definition of 区域 is carried by :449 (「认领申报文件面到区域级,拿不准就串行」, the escape hatch the ruling names as staying), by :278 (「区域写不清就只能整文件串行」) and by
references/seat-post-protocol.md:20 (every serial-queue entry is 「每张卡认领的区域」).The alternative the seat may prefer at review: land the ruling's sentence as R3 (120 B, two lines) and raise the SKILL.md ceiling 813 → 814 under the ratchet's own maintainer exit (「Raising a ceiling requires a maintainer ruling quoted in the PR」). The precedent is the last landing on this file, e872ef4 (PR #19033, 2026-09-19): 812 → 813 for one ruled line, with the ratchet comment 「Ruled content is not growth」. That route is a
scripts/pm/check-skill-line-ratchet.mjsedit and a net +1, both outside this dispatch's constraints, so it is stated here and not taken.Tier and landing
node scripts/pm/check-governed-merges.mjs --testwith both paths: exit 3, GOVERNED — Tier S (席内达档复核落地),.claude/**×2; size NOT MEASURED by--test(dispatch-gates' derived count: 4 changed lines, +2 / −2, under 5000).node scripts/pm/dispatch-gates.mjs --tieron both paths: MANDATORY at CONTRACT_REVIEW_TIER (clause ①: the PM dispatch skill MAIN file).## Contract reviewrecord for head5676515(AGENTS.md Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14). Label:skip-changeset(.claude/**publishes nothing); no changeset file.Gates — derived union on head
5676515, each exit captured before any pipenode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackfrom the worktree with no paths (changeset 2 committed / 0 working tree / 0 untracked vs merge base801415a) derived 20 commands, identical to the dispatch-time lead;--ranreconciles 20 derived / 20 run / 0 UNRUN. Two extras were run because the derivation flags them:check:pm-settings-deny-roster(a roster under.claude, marked silence-is-not-evidence) andcheck:skill-frame-freshness(pins the four-axis block).@objectstack/formulaand@objectstack/lintnot built; the gate says nothing was measured); afterpnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lintunder the verify lock (4/4 cached), the rerun is exit 0: 58 self-test cases, 22 / 9 / 14 examples judged cleanThe last commit is
5676515and every command above ran after it.origin/mainmoved by one commit since the base (e3b3cdd, metadata-protocol) that touches neither edited file nor the ratchet, so no merge is owed before review.Acceptance notes
priority:p0table row 「⛔ 不豁免同文件串行、深度等待与认领协议」), its core-rules twin :36, andreferences/lanes/services.md:26 (「同文件卡跨轮硬串行」, a lane-specific stricter rule) still name the serial discipline by FILE. The ruling scoped :441 and :105 only; these are name references to the discipline, not a second definition, so they are a naming nit rather than a defect class. 承接者: the domain:skills seat's next SKILL.md card.check-closing-keyword-parityprints an informational line thatpackages/spec/api-surface-declarations/system.txt(3,568,357 bytes) exceeds its 2 MiB cutoff for unregistered files; exit 0 and pre-existing onorigin/main. 承接者: none identified.维护者速读(草稿)
改了什么
派发协议「候选与批次」一节里的一条并发规则改了一个词:原来写「同文件单跨轮硬串行」,现在写「同区域单跨轮硬串行」;核心条款摘要里的同一条规则同步改成「同区域硬串行」。两处各改一个词、各不增减行数;
:437(single-writer 路径只由SINGLE_CLAIM_PATHS枚举,其它路径普通并发)原样不动。为什么改
同一节里原有两条互相打架的规则:一条说除
.objectui-sha之外的所有共享文件都是普通并发、后落地的一方解冲突;四行之后另一条说同一文件的卡跨轮必须硬串行。SINGLE_CLAIM_PATHS只有一条,所以对仓里的每一个文件两条规则都给出相反指令;各席位各自选了一条执行,一张停在决策箱里的 PR(25 个 spec 文件)就把 spec 车道大半冻住。裁决(甲)把「硬串行」收窄到「认领申报的文件面重叠的区域」:同文件不同区域是普通并发,后落地方解冲突。改动后,同文件异区域自然落到:437的「其它路径普通并发」,两条规则在任何路径上都不再冲突。风险与代价(含回滚)
风险:裁决原句(「同区域(认领申报的文件面重叠)单跨轮硬串行;同文件不同区域是普通并发,后落地方解冲突。」)本身 123 字节,超过本文件 120 字节的行宽门禁;加上裁决要求保留的「延后不是搁置…」半句共 198 字节;文件又顶在 813 行的棘轮上限、余量为零,所以裁决原句无法原样落地(门禁实测:一行写法红,两行写法也红)。本 PR 采用最小改法(一个词),把「同文件异区域普通并发」这半句交给紧邻的
:437承担,把「区域」的定义交给:449与串行队条款承担。若席位认为裁决原句必须逐字落地,替代路线是按棘轮自己的维护者例外把上限抬到 814(先例:2026-09-19 的 e872ef4),那需要改脚本、净增一行,不在本单授权内。回滚:两个文件各回退一个词,零副作用。席位意见
(留空,席位定稿)
你要做的
无需你操作:这是 Tier S 受管面,由 skills 席位做契约档复核后经队列落地。只有一处可能需要你一句话:若你希望裁决原句逐字进入 SKILL.md(而不是本 PR 的一词改法),请回「抬上限」,席位据此改走 813 → 814 的路线。
Generated by Claude Code