docs(pm-dispatch): add the witness-grep leg to the in-flight overlap interception - #17956
docs(pm-dispatch): add the witness-grep leg to the in-flight overlap interception#17956claude[bot] wants to merge 1 commit into
Conversation
…interception The in-flight overlap check asked one question — do the file faces intersect — so a PR whose assertion NAMES a symbol another in-flight PR deletes or renames passes both seats' checks and goes red only once both land on one tree. Add a second leg: grep this round's deleted/renamed identifiers against every in-flight PR's diff, not its file list, and never skip it because the file faces are disjoint. Paid at 241/241 by deleting one line in the same section whose rule survives in SKILL.md (「⛔ 不在消费者侧打补丁」) and whose remainder was a rationale tail for the copy-both-sentences rule stated one line above. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewHead: ① derived judgments: the diff is one file, +1/−1 against merge-base Implemented-by: claude/issue-17935-inflight-overlap-witness-grep (mode:subagent) Verdict: PASS. Governed surface ( Generated by Claude Code |
维护者速读(终稿)改了什么 —— 只动 为什么改 —— 你今早点名的第三张卡(#17935):两个 PR 各自全绿、合到一棵树才红,因为一个 PR 的断言点名了另一个 PR 删掉的那一行;现行规则只问文件面,答不到这种耦合。ledger、豁免表、drift 表这类「在缩小的表」都会再撞到。 风险与代价(含回滚) —— 每轮派发多一次 grep;无新工具、无新门禁。买单的是同节 :213 那行:它的禁令(不在消费者侧打补丁)原文仍在 席位意见 —— 收。本席在 head 你要做的(一个动作) —— 受管面( Generated by Claude Code |
Fixes #17935
The in-flight overlap interception asked exactly one question — do the file faces intersect — and
the card measures a coupling that question cannot reach: two PRs, each green on its own, red only
once both sit on one tree, because one PR's assertion NAMES a row the other deletes. This lands the
second leg the card's one-line criterion asks for.
The rule as landed
.claude/skills/pm-dispatch/references/dispatch-runbook.md, section 〈派发词构造细则〉, the new linesitting directly under the file-face leg it extends:
Measured against the card's criterion (quoted verbatim, untranslated):
the card suggests, and it needs no new tool;
the next line, so the two legs converge on one action;
refused where a seat reads it, not only in the card that filed it.
Line budget — 241 / 241, net 0
check:pm-skill-ratchet)The payment is a deletion inside the same section, not a re-wrap: the diff is exactly one removed
line and one added line, and no other line was re-flowed. The line deleted is
and both of its clauses survive without it:
SKILL.mdline 549 —「文件面写两句:预期落点;生产者在别包时修生产者侧并报落点,⛔ 不在消费者侧打补丁。」 — and again in
AGENTS.md Prime Directive 12 ("never add a lenient alias or
??fallback in a consumer").lines above it (「文件面两句原文照抄」), which already requires both sentences to be copied.
Those are the two categories this file's own ceiling comment names as removable, quoted from
scripts/pm/check-skill-line-ratchet.mjsat thedispatch-runbook.mdentry: "provenancenarratives, incident post-mortems and rationale tails leave the corpus; one rule per ≤120-byte
line, no rule already stated in SKILL.md".
Acceptance greps — both directions
Run in the worktree at this branch's head against
origin/main:不因文件面不相交跳过in the runbook在飞重叠in the runbookgit diff --stat origin/main -- .claude/skills/pm-dispatch/SKILL.mdwc -lon the runbookLC_ALL=C awk 'length($0)>120'over the runbookSKILL.md is deliberately untouched: it is serial with another in-flight card this wave, and a
pointer there, if it is ever wanted, rides that file's next PR.
The new rule, applied to this PR
The leg this PR adds is cheap enough to run on the PR that adds it. This diff deletes exactly one
line; its distinctive identifiers were grepped against the diff — not the file list — of all 26
open PRs in this repository:
只写一个路径名二选一不在消费者侧打补丁⛔(CJK rule text, same corpus, same grep)The control is what makes the three zeros a reading rather than a broken grep. Same pass re-checked
the serial constraint the claim comment declared: no open PR touches
dispatch-runbook.md.The second shape — recorded, NOT built
The card offers a stronger shape that this PR deliberately does not implement:
It is recorded here as an option, not a deliverable. It costs a standing classification (which
tables count as shrinking tables) that the grep leg does not need, and the grep leg already covers
the measured instance. If the grep leg proves to be run inconsistently, this is the escalation.
Adjacent rules that do NOT already cover this
SKILL.mdline 479 — 「本卡 pin 断言兄弟卡在改的行为 ⇒ 派发令注明」 — is the mirror direction (thiscard asserts on a sibling's behaviour) and fires only when triage already knows the pair. Line 450
— 「文件面不相交只保证文本可合并;跨文件语义耦合由队列 CI 逮住,⛔ 不读作不可能冲突」 — names the
coupling but routes it to queue CI, which is precisely the expensive half the card measured: the
queue does catch it, on the second PR, as a red. Neither is a mechanical pre-check, so this is not a
duplicate rule.
Gates
Derived from the tree with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths passed; derived at commitda4eee77), all run, reconciledwith
--ran: 14 derived, 14 run, 0 NOT-MEASURED, 0 UNRUN — a derived zero, every familycarrying a recorded exit code.
check:doc-formula-expressionsfirst returned exit 3 — PREREQUISITE NOT MET, the gate's own"nothing was measured" code, because
@objectstack/formulaand@objectstack/lintwere unbuilt ina fresh worktree. Built through the shared verify lock
(
scripts/pm/os-verify-lock.sh, slotissue-17935, command exit 0) and re-run to a real exit 0.The repo-wide sweep (
pnpm lintand the whole gate farm) belongs to CI, not to this worktree.No changeset:
.claude/**ships nothing — the path is not inside any package's publishedfiles[]— so this carries the
skip-changesetlabel.维护者速读(草稿)
改了什么 —— PM 派发手册里「在飞重叠」的拦截从一问变成两问:除了文件面求交,还要把本轮 diff 删除或
改名的标识符,拿去 grep 每一个在飞 PR 的 diff(不是它的文件清单),命中与相交同样发那四句警告,并且
⛔ 不许以「文件面互不相交」为由跳过这一问。全文只动这一个文件的两行(加一行、删一行)。
为什么改 —— 实测到一次两个 PR 各自全绿、合到一棵树才红:一个 PR 的测试点名断言某一行存在,另一个 PR
正好把那一行删了。两个席位都按现行规则查了文件面,结论都对 —— 规则问的问题本身答不到这个耦合。这个形状
不罕见:凡 ledger、豁免表、drift 表这类「在缩小的表」,它们的对照必须点名成员,否则对照没有意义。
风险与代价(含回滚) —— 代价是每轮派发多一次 grep,没有新工具、没有新门禁、没有新脚本。规则面净增
零行:新增那一行由同节内一行的删除买单,被删那行的禁令原文仍在
SKILL.md第 549 行与 AGENTS.md 第 12 条里,余下半句是上两行已有规则的理由尾巴。回滚 = 还原这一个文件的两行,不牵动任何代码、门禁或产物。
席位意见 ——
你要做的 —— 只需判断两件事:① 这一问是否值得每轮都问(代价是一次 grep);② 那条被删的行,它的禁令
落在
SKILL.md与 AGENTS.md 上是否够。若都同意,人工合入即可 —— 这是受管面(.claude/**),按Prime Directive 14 由维护者手工确认合并,本 PR 全程保持 draft,席位不翻 ready、不排队、不开自动合并。
Generated by Claude Code