Repository navigation
docs(pm-dispatch): scope the three triage-only grading lines to multi-lane repos (single-lane leftovers of the hotcrm ruling A) - #24691
Conversation
…-lane repos The single-lane rule (cross-repo-coordination.md lines 9-10) gives a single-lane repo:* seat its own type and first-touch grading. Three lines still read as reserving them for central triage with no repo-class scope: - lanes/hotcrm.md:51 regains the subject it lost when it was split off line 50: on platform-repo cards domain:* and type stay triage's; on the seat's own cards type follows the mechanical three tasks. - cross-repo-coordination.md:37 (rule 4) is scoped to multi-lane repos, both clauses under the topic. - filing-gate.md:26 names the single-lane first-touch actor beside triage. Line-neutral in every file; every changed line within 120 bytes. Claude-Session: https://claude.ai/code/session_01HEdP5tPhqQfzwRmKDxwn85 Co-authored-by: Claude <noreply@anthropic.com>
Contract review — PR #24691 (card #24686), isolated reviewer · 2026-10-20T00:00ZServed-tier: Inputs read: card #24686 (body and both comments), PR #24691 (body, file list, net diff against
① Derived judgments
② Semver levelRight. ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Claude-Session: https://claude.ai/code/session_01HEdP5tPhqQfzwRmKDxwn85 Co-authored-by: Claude <noreply@anthropic.com>
…hat is none of the four categories Ruling B on the reach-less finding question: the first-touch close for missing items applies only to a card outside all four filing-gate categories. The clause on a finding without reach: leaves the line; such a finding keeps the triage-duties p3 fold, which this ruling leaves as written. Line-neutral at the file's ceiling (64/64). Claude-Session: https://claude.ai/code/session_01HEdP5tPhqQfzwRmKDxwn85 Co-authored-by: Claude <noreply@anthropic.com>
Contract review — PR #24691 (card #24686; folded decision card #24610), isolated reviewer, re-rendered on the moved head · 2026-10-20T00:24ZServed-tier: Inputs read: card #24686 (body and all four comments), card #24610 (body and all three comments, the ruling record Rulings and governing text judged against:
① Derived judgments
② Semver levelRight. ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读(终稿)· PR #24691 ·
|
Fixes #24686
Fixes #24610
Clause-②: no
Filing gate ③: the remainder of the maintainer's ruling on objectstack-ai/hotcrm#2178 → 「A」. The single-lane
repo:hotcrmseat grades its own cards at first touch. The seat recorded the ruling in comment6265194393, matching the director's delta6264888052; the director's ledger comment6265393657carries it as batch 371, item 3. The at-tier contract review of PR #24521, comment6279602320, section ③ items 7 and 8, raised these three lines as leftovers. A fourth line,filing-gate.md:27, is folded in from decision card #24610 (ruling B, below), in its own commit.What changed: four lines in three files, no net lines
Opened on base
92ce3af40;origin/mainwas merged once (96ead27a0, merge base now5018fc303, nothing under.claude/**orscripts/pm/**came in). Headdc6cadff3: commit90efe550acarries the three single-lane lines, commitdc6cadff3carries line 27. Byte counts leave out the newline. The cap isMAX_LINE_BYTES = 120. Every file keeps its line count at its ceiling:lanes/hotcrm.md53 → 53 (ceiling 53),cross-repo-coordination.md51 → 51 (51),filing-gate.md64 → 64 (64).references/lanes/hotcrm.md:51domain:*与 type 留给分诊;催办不代裁。」domain:*与 type 归分诊;本仓卡 type 随机械三务自打;催办不代裁。」references/cross-repo-coordination.md:37(rule 4)duplicate_of;执行席永不定级或路由裸卡。」duplicate_of;执行席永不定级或路由裸卡。」references/filing-gate.md:26repo:*席)首触补齐卡与一次检索可推三件,写进定级评论并定级。」references/filing-gate.md:27(ruling B on [Decision] A finding filed without reach:, at first touch — close it not_planned (ruling B on the filing-gate completion card) or grade it p3 and fold it into a collector card (the 2026-09-25 「同意」 behind triage-duties line 50)? #24610, commitdc6cadff3)finding无reach:)者才因缺件首触即关 not_planned,一行点名所缺。」Why each wording
:51: the line gets back its subject. Commitcdc7eff78registered the lane, and there the text was one sentence: 「- 平台缺口卡是本席最常见的联动产出 —— 立卡在平台仓、无 assignee、普通卡待分诊,domain:*/type 留给分诊;催办不代裁。」 (quoted here as one line; the original wraps it across two). The rules-only rewriteabe980c5csplit that sentence into lines 50 and 51, and line 51 lost its subject: the cards the seat files on the platform repo. On those cards central triage is still the only producer ofdomain:*and type (cross-repo-coordination.md:7, multi-lane repos). So the new line names both cases. Platform-repo cards keepdomain:*and type with triage. The seat's own repo cards take type through 机械三务 (line 8 of the same file defers tocross-repo-coordination.md:9-10).typefollows 机械三务 (the seat applies it);domain:*stays triage's". Taken alone and placed right after line 50, that wording would tell the seat to apply type itself to the platform card it just filed, which contradictscross-repo-coordination.md:7.domain:*留给分诊,type随机械三务自打;催办不代裁。」 (73 bytes).:37: 「多车道仓:」 is a topic placed in front of the whole line. That scopes both clauses to multi-lane repos: triage being the only producer, and the ban on execution seats. The single-lanerepo:*seat is itself an execution seat (lanes/hotcrm.md:7) and it grades at first touch, so an unscoped second clause would keep the contradiction. Two cuts pay the bytes: 「座位」 is dropped, so the line says 分诊 as line 7 does, and so is the colon after 唯一生产. 「永不」 stays word for word. 114 → 120 bytes.:26: the single-lane first-touch actor is named beside triage, as 「由分诊(单车道仓repo:*席)首触」. One cut pays the bytes: 「能从卡与一次检索推导的三件」 becomes 「卡与一次检索可推三件」, which keeps the same bound (the card plus one search). The tail 「写进定级评论并定级」 is unchanged. 102 → 120 bytes.filing-gate.md:27: the clause 「或finding无reach:」 leaves the line, exactly as ruling B item 2 orders (next section). Nothing else on the line moves;triage-duties.mdline 50 is untouched because ruling B item 1 keeps it.Folded member: ruling B on decision card #24610
The card body of #24686 pre-declared the fold (「if #24610 is ruled first, fold its one line into the same PR」). The maintainer ruled 「24610 B」 (2026-10-19T23:47Z), recorded by the director seat in comment
6279873026; the card body carries theRuled:line, and the seat's claim6280072316names this branch. Items 1 and 2 of that record, verbatim:triage-duties.mdL50 stands as written: a non-exceptionfindingwith noreach:is gradedpriority:p3and folded into its collector or sweep card, ⛔ not dispatched alone, ⛔ not closed for that reason.」filing-gate.mdL27 narrows to 「四类皆非」: the first-touch close for missing items applies only to a card that is none of the four categories; the clause 「或finding无reach:」 leaves the line. Line-neutral at the file's ceiling (64/64).」This re-rules the earlier 「B」 on #24589 to exactly that extent (the record's item 3); #24589 itself is not reopened by this PR. A sweep of
.claude/andAGENTS.mdfor 首触即关 and 无reach:finds no other line that closes a reach-less finding at first touch:triage-duties.md:61and:63close cards with no definition item and report-only instrument cards, a different population.Family sweep
git grep -n "留给分诊\|唯一生产\|由分诊首触" origin/main -- .claude/skills/pm-dispatch/at92ce3af40gives 5 hits:cross-repo-coordination.md:7is already scoped to multi-lane repos. Untouched.cross-repo-coordination.md:37,filing-gate.md:26andlanes/hotcrm.md:51are the three lines in this PR.lanes/ui.md:8(「⛔ 不产domain:*、type 与定级,中央分诊唯一生产;…」) is a hit the dispatch did not expect. It is not the same family. Thedomain:uiseat works in objectui, a multi-lane repo (cross-repo-coordination.md:7), where central triage is the only producer, so the line is correct as written. Untouched.A wider sweep found no other line that reserves single-lane
typeor first-touch grading for triage. It searched for 首触, 分诊首触, 首触定级 and type 留 across.claude/skills/pm-dispatch/,.claude/agents/andAGENTS.md. See Acceptance notes.Card acceptance
grep -n "type 留给分诊" .claude/skills/pm-dispatch/references/lanes/hotcrm.mdprints nothing and exits 1. The control,grep -c "机械三务"on the same file, answers 2 (lines 8 and 51) and exits 0..claude/**publishes nothing;skip-changesetis set when this PR is created.grep -cof 「或finding无reach:」 onfiling-gate.mdanswers 0; 「补不齐(四类皆非)者」 answers 1; the file stays 64/64.Verification at head dc6cadf
These are the 17 families that
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives for this change set (the same 17 before and after the fold). Each ran locally on headdc6cadff3, and each exit code was captured before any pipe:node scripts/check-closing-keyword-parity.mjs: exit 0node scripts/check-closing-keyword-parity.mjs --self-test: exit 0node scripts/check-comment-mask-corpus.mjs: exit 0node scripts/pm/check-harness-current.mjs --self-test: exit 0pnpm --filter @objectstack/lint run check:doc-formula-expressions: exit 0, afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lintunder the verify lock (on the first head the gate answered exit 3, PREREQUISITE NOT MET, until that build ran).pnpm check:agent-test-spelling: exit 0pnpm check:cross-package-test-inputs: exit 0pnpm check:doc-authoring: exit 0pnpm check:driver-memory-census: exit 0pnpm check:gitlink-declared: exit 0pnpm check:nul-bytes: exit 0pnpm check:pm-governed-merges: exit 0pnpm check:pm-skill-id-lint: exit 0. Its verdict line: 「87 file(s) clean」.pnpm check:pm-skill-ratchet: exit 0. It reports all three files at their ceilings with headroom 0,filing-gate.mdat 64 of 64.pnpm check:refd-timer-probe: exit 0pnpm check:skill-frame-sync: exit 0pnpm check:watch-hint-literal: exit 0One more gate ran:
pnpm check:pm-settings-deny-roster, exit 0. The derivation flagged its roster because it lives under.claude.dispatch-gates --rananswers: 「17 derived famil(ies) accounted for — 17 run, 0 NOT-MEASURED (a DERIVED zero — all 17 recorded an exit code and none of them is 3)」.Left to CI and not run locally:
test:repo, the type-check lanes and the artifact-roster families.check:skill-frame-freshnessandcheck:dev-prereqsdid not run, because the diff touches neitherpackages/specnor the decision frame inSKILL.md. There is no ablation: this is a text change to governed protocol files and changes no tested behaviour.Acceptance notes
SKILL.md:113(tooling) andSKILL.md:118(area:*) say 「分诊首触打」 without scoping it to a repo class. Neither label is one of 机械三务, whichcross-repo-coordination.md:10defines as sweep,typeandfindingfirst-touch grading. So these lines do not contradict the single-lane ruling, and this PR leaves them alone. 承接者:无.lanes/hotcrm.md:51differs from the card's literal 〈What to change〉, for the reasons above. The seat's review decides.维护者速读(草稿)
改了什么:PM 协议的三份参考文件共改四行,行数不增:hotcrm 车道说明第 51 行、多仓协调第 37 行(规则 4)、立卡门第 26 行,这三行原来都把 type、定级或首触写成「只归分诊」,没有区分多车道仓和单车道仓;另把立卡门第 27 行的「或
finding无reach:」删掉,首触即关只剩「四类皆非」的卡。为什么改:您在 hotcrm#2178 裁了 A:单车道仓(hotcrm 等)的卡由本仓席位自己首触定级、自己打 type。上一张 PR 只改了 hotcrm 说明的第 8 和第 33 行。复核记录指出,还有这三行与裁决相反,读者只看其中一行会拿到裁决前的旧规则。第 27 行来自您对 #24610 的「B」:缺 reach 的 finding 照旧定 p3 并入收口卡(triage-duties 第 50 行不动),首触即关只用于四类都不是的卡;这一裁决把您早先在 #24589 的「B」收窄到这个范围(裁决记录评论 6279873026)。
风险与代价(含回滚):只改文字,不涉及代码和发布;三份文件的行数和上限都不变,每行不超过 120 字节。第 51 行比卡上的写法多一层限定:hotcrm 席在平台仓(objectstack、objectui)立的卡,domain 和 type 仍归中央分诊,只有 hotcrm 仓自己的卡由本席自己打 type。这是该行最初版本的本意,免得被读成「hotcrm 席去给平台卡打 type」。回滚就是 revert 本 PR;两件事各占一个 commit,也可单独回滚第 27 行。
席位意见:
你要做的:不需要操作。席位达档复核通过后,由席位落地。如果您希望第 51 行按卡上原文写、不带平台仓限定,请在复核前说一声。
Generated by Claude Code