Repository navigation
Commit 8e14ce0
docs(pm-dispatch): scope the three triage-only grading lines to multi-lane repos (single-lane leftovers of the hotcrm ruling A) (#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:hotcrm` seat
grades its own cards at first touch. The seat recorded the ruling in
comment `6265194393`, matching the director's delta `6264888052`; the
director's ledger comment `6265393657` carries it as batch 371, item 3.
The at-tier contract review of PR #24521, comment `6279602320`, 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/main` was merged once (`96ead27a0`,
merge base now `5018fc303`, nothing under `.claude/**` or
`scripts/pm/**` came in). Head `dc6cadff3`: commit `90efe550a` carries
the three single-lane lines, commit `dc6cadff3` carries line 27. Byte
counts leave out the newline. The cap is `MAX_LINE_BYTES = 120`. Every
file keeps its line count at its ceiling: `lanes/hotcrm.md` 53 → 53
(ceiling 53), `cross-repo-coordination.md` 51 → 51 (51),
`filing-gate.md` 64 → 64 (64).
- `references/lanes/hotcrm.md:51`
- before (53 bytes): 「- `domain:*` 与 type 留给分诊;催办不代裁。」
- after (103 bytes): 「- 平台仓卡的 `domain:*` 与 type 归分诊;本仓卡 type
随机械三务自打;催办不代裁。」
- `references/cross-repo-coordination.md:37` (rule 4)
- before (114 bytes): 「-
分诊座位唯一生产:定级/路由/type/查重/shadow/`duplicate_of`;执行席永不定级或路由裸卡。」
- after (120 bytes): 「-
多车道仓:分诊唯一生产定级/路由/type/查重/shadow/`duplicate_of`;执行席永不定级或路由裸卡。」
- `references/filing-gate.md:26`
- before (102 bytes): 「- 缺件卡由分诊首触补齐能从卡与一次检索推导的三件,写进定级评论并定级。」
- after (120 bytes): 「- 缺件卡由分诊(单车道仓 `repo:*`
席)首触补齐卡与一次检索可推三件,写进定级评论并定级。」
- `references/filing-gate.md:27` (ruling B on #24610, commit
`dc6cadff3`)
- before (113 bytes): 「- 补不齐(四类皆非,或 `finding` 无 `reach:`)者才因缺件首触即关
not_planned,一行点名所缺。」
- after (86 bytes): 「- 补不齐(四类皆非)者才因缺件首触即关 not_planned,一行点名所缺。」
## Why each wording
- **`:51`: the line gets back its subject.** Commit `cdc7eff78`
registered 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 rewrite `abe980c5c` split 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
of `domain:*` and type (`cross-repo-coordination.md:7`, multi-lane
repos). So the new line names both cases. Platform-repo cards keep
`domain:*` and type with triage. The seat's own repo cards take type
through 机械三务 (line 8 of the same file defers to
`cross-repo-coordination.md:9-10`).
- **This refines the card's wording on purpose.** The card's 〈What to
change〉 reads "`type` follows 机械三务 (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 contradicts `cross-repo-coordination.md:7`.
- **The literal alternative,** if the review prefers it: 「- `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-lane `repo:*` 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.md` line 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 the `Ruled:` line, and the seat's
claim `6280072316` names this branch. Items 1 and 2 of that record,
verbatim:
- Item 1: 「1. `triage-duties.md` L50 stands as written: a non-exception
`finding` with no `reach:` is graded `priority:p3` and folded into its
collector or sweep card, ⛔ not dispatched alone, ⛔ not closed for that
reason.」
- Item 2: 「2. `filing-gate.md` L27 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/` and `AGENTS.md` for 首触即关 and 无 `reach:` finds no other line
that closes a reach-less finding at first touch: `triage-duties.md:61`
and `:63` close cards with no definition item and report-only instrument
cards, a different population.
## Family sweep
`git grep -n "留给分诊\|唯一生产\|由分诊首触" origin/main --
.claude/skills/pm-dispatch/` at `92ce3af40` gives 5 hits:
- `cross-repo-coordination.md:7` is already scoped to multi-lane repos.
Untouched.
- `cross-repo-coordination.md:37`, `filing-gate.md:26` and
`lanes/hotcrm.md:51` are 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. The `domain:ui` seat
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 `type` or
first-touch grading for triage. It searched for 首触, 分诊首触, 首触定级 and type
留 across `.claude/skills/pm-dispatch/`, `.claude/agents/` and
`AGENTS.md`. See Acceptance notes.
## Card acceptance
- `grep -n "type 留给分诊"
.claude/skills/pm-dispatch/references/lanes/hotcrm.md` prints nothing
and exits 1. The control, `grep -c "机械三务"` on the same file, answers 2
(lines 8 and 51) and exits 0.
- The line ratchet and the id-lint pass (results below). There is no
changeset because `.claude/**` publishes nothing; `skip-changeset` is
set when this PR is created.
- Each of the three lines now either names the single-lane exception or
is scoped to multi-lane repos.
- For #24610: `grep -c` of 「或 `finding` 无 `reach:`」 on `filing-gate.md`
answers 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/objectstack` derives for this change
set (the same 17 before and after the fold). Each ran locally on head
`dc6cadff3`, and each exit code was captured before any pipe:
- `node scripts/check-closing-keyword-parity.mjs`: exit 0
- `node scripts/check-closing-keyword-parity.mjs --self-test`: exit 0
- `node scripts/check-comment-mask-corpus.mjs`: exit 0
- `node scripts/pm/check-harness-current.mjs --self-test`: exit 0
- `pnpm --filter @objectstack/lint run check:doc-formula-expressions`:
exit 0, after `turbo run build --filter=@objectstack/formula
--filter=@objectstack/lint` under 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 0
- `pnpm check:cross-package-test-inputs`: exit 0
- `pnpm check:doc-authoring`: exit 0
- `pnpm check:driver-memory-census`: exit 0
- `pnpm check:gitlink-declared`: exit 0
- `pnpm check:nul-bytes`: exit 0
- `pnpm check:pm-governed-merges`: exit 0
- `pnpm 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.md` at 64 of 64.
- `pnpm check:refd-timer-probe`: exit 0
- `pnpm check:skill-frame-sync`: exit 0
- `pnpm check:watch-hint-literal`: exit 0
One more gate ran: `pnpm check:pm-settings-deny-roster`, exit 0. The
derivation flagged its roster because it lives under `.claude`.
`dispatch-gates --ran` answers: 「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-freshness` and
`check:dev-prereqs` did not run, because the diff touches neither
`packages/spec` nor the decision frame in `SKILL.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`) and `SKILL.md:118` (`area:*`) say 「分诊首触打」
without scoping it to a repo class. Neither label is one of 机械三务, which
`cross-repo-coordination.md:10` defines as sweep, `type` and `finding`
first-touch grading. So these lines do not contradict the single-lane
ruling, and this PR leaves them alone. 承接者:无.
- The wording of `lanes/hotcrm.md:51` differs 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](https://claude.ai/code/session_01HEdP5tPhqQfzwRmKDxwn85)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent d11fa8c commit 8e14ce0
3 files changed
Lines changed: 4 additions & 4 deletions
File tree
- .claude/skills/pm-dispatch/references
- lanes
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
37 | | - | |
| 37 | + | |
38 | 38 | | |
39 | 39 | | |
40 | 40 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
26 | | - | |
27 | | - | |
| 26 | + | |
| 27 | + | |
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
51 | | - | |
| 51 | + | |
52 | 52 | | |
53 | 53 | | |
0 commit comments