Repository navigation
Commit 00d0668
pm-dispatch(execution): an idle lane seat does four pre-triage chores on its own cards, never grades, and rings the triage mailbox instead of waiting (#28935)
<!-- claude-projects-attribution: {"github_login":"huangyiirene"} -->
_Requested by **Irene** · [project
thread](https://claude.ai/code/project/chan_01TJXtQ1tVD26ecLDZxFS67x?thread=cmsg_01TJXtQ1tVD26ecLDZxFS67xU6mnoYVwMRrBwm9jHY2WnL)_
Fixes #28899
Clause-②: no
Metadata-protocol: none
## 维护者速读
- 改了什么:车道席没有卡可认领、或在等分诊时,改做四件分诊前杂务(交付收尾、旧卡复读、给新卡写一行建议级别、补 finding
复现),永不自己定级;等分诊必须先敲分诊信箱,报告里引那条评论。分诊定级时读这行建议级别。
- 为什么改:维护者常听到车道说「在等分诊」;这四件不需要定级权,车道闲着就能做,分诊接到的卡也已带好读数。
- 风险与回滚:只改两份规则文本,无代码、无门禁、无新标签、上限未动;为守行数上限删了 7 行在别处已有原文的复述(出处见下表)。回滚 =
revert 本 PR。
- 先看:① `references/execution-duties.md` 〈候选与批次〉末尾新增 6 行;②
`references/triage-duties.md` 新增 1 行;③ 下方 7 行删除的出处表。
- 两分钟验证:`pnpm check:pm-skill-ratchet && pnpm check:pm-skill-id-lint`
全绿,`wc -l` 两文件仍为 188 / 102。
- 需要你做的:无,席位落地(Tier S `.claude/**`,席位达档复核 PASS 后入队)。
## What changes
Text only, two files under `.claude/skills/pm-dispatch/references/`,
inside the claim's file surface.
**The shared block** — six lines at the end of `execution-duties.md`
〈候选与批次〉. `SKILL.md`'s phase index names this file as read by every
execution seat on every fire, so every lane seat reads the block without
a per-lane copy:
- Scope: a lane seat with no claimable card, or one waiting on triage,
works its own lane's cards only; it never grades (the lane self-triage
exception stands as written).
- ① Delivery hygiene: a delivered card gets a closure record; a release
or shift end never removes a `pm:*` label without setting the next state
in the same write; a card whose `Blocked-by:` targets have all closed is
put to triage for unblocking.
- ② Stale-card re-read: the oldest open cards are re-read against
`origin/main` (premise still true, already fixed) with the evidence
posted; a fixed card goes to triage or the maintainer to close, never
closed by the lane.
- ③ Pre-read: on a new card, a reproduction reading, the dedupe query
with its hit count, and one `Suggested-grade: pN · REASON` line; no
`priority:*` label is written.
- ④ Finding repro: the lane's `finding` cards get the missing `reach:`
or reproduction, or a stated reason they miss the three classes.
- Never waiting on triage in silence: ring the matching mailbox key
(`project-forms.md`); a report that says "waiting on triage" cites the
mailbox comment id it rang, and one that cannot has not asked.
**The triage pointer** — one line in `triage-duties.md` beside the
self-triage review line: the grading pass reads lanes'
`Suggested-grade:` lines as input, not a grade, and confirms or changes
them, giving a reason when it does not adopt one. The 「车道席自分诊」 exception
lines are byte-identical.
**Paying the ratchet** — no ceiling moved. Both files stay at their
ceilings (`execution-duties.md` 188/188, `triage-duties.md` 102/102),
every added line is at most 120 bytes, and no line was re-wrapped to buy
room. Seven lines left, each restating a rule that still lives
elsewhere:
| Deleted line | Where the rule still lives |
|:--|:--|
| execution-duties 〈候选与批次〉「无分诊审计评论即非候选;例外:sub-issue 承父卡首触,main-red 锚卡见
`landing-operations.md`」 | `SKILL.md` 〈域车道〉 (read every fire):
「`domain:*`、队列与级别只由分诊落笔;两例外:sub-issue 承父卡域、main-red 锚卡,免审计评论」 and
「无分诊审计评论 ⛔ 不得认领」; main-red handling in `landing-operations.md` 约定③ |
| execution-duties 〈候选与批次〉「解锁那一刻 PM 自己的判断最不可信:裁决收窄或关掉了那张卡是假设不是前提」 | same
section: 「派发前做前提过时检查,裁决同罪」, 「引用读到的现状,⛔ 不引用裁决写作时的描述」 and the
「阻塞解除后延后单重定价」 pair |
| execution-duties 〈派发〉「条款②判据即 triage 机械边界测试与 `references/lanes/spec.md`
席内分派判据,⛔ 不另抄」 | the test itself: execution-duties
〈认领〉「判据:本卡放宽接受集或扩大公开面吗」 and triage-duties 「机械边界测试(条款②判据)」; its
boundaries stay in the lines below it |
| execution-duties 〈派发〉「无条件条款只住角色文件,冲突时它胜、错了修那里,⛔ 不靠派发词临时覆盖」 |
`.claude/agents/os-dev.md`
〈标准条款住在这里〉「派发词与本文件冲突时以本文件为准:无条件条款住这里,错了也在这里改」, and execution-duties
「标准非协商条款 ⛔ 不抄进派发词」 |
| execution-duties 〈收集〉「停摆永不自愈:携带任务中途状态的完成通知本身就是停摆信号」 | the next two
lines: 「报告末句是意图不是结果 = 停摆非完成:当刻 SendMessage 续派」 and 「停摆 ⇒ 立刻 SendMessage
…⛔ 不等任何静默阈值」 |
| execution-duties 〈复核〉「报告在草稿 PR 时点到达,CI 收敛读数只属于复核侧:gate `in_progress`
是诚实读数」 | `os-dev.md` DoD 「报告在本地验证走完时交付,CI 收敛等待归 PM 不归你」 and
「门禁状态如实记录,`in_progress` 是诚实值」; `review-checklist.md` 「收敛期转红走补丁轮续派原 dev,⛔
不作 REWORK 的理由」 |
| triage-duties 「轮次报告设呈裁清单专节(卡、推荐、所引权威),⛔ 无代裁清单、无追认表」 |
`seat-lifecycle.md` 〈轮次报告与节奏〉 (every seat, every fire) 「报告加升级项、呈裁清单…」
and `SKILL.md` 红线 「⛔ 无代裁通道」; the column hint (card, recommendation,
authority) is the one detail not restated elsewhere |
No issue number in the skill text (`check:pm-skill-id-lint` green). No
package publishes from this diff, so `skip-changeset`.
## Tests
No code changes; the gates are the tests. Derived with `node
scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` (merge base on `origin/main`, 2 paths,
+7/−7) and run one by one with the exit code captured before any pipe,
on head `ec896289`:
<details><summary>19 derived commands, all exit 0; --ran reconciliation
19/19, 0 NOT-MEASURED</summary>
```
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
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-half-states :: exit 0
pnpm check:pm-label-write :: exit 0
pnpm check:pm-skill-id-lint :: exit 0
pnpm check:pm-skill-ratchet :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:skill-frame-sync :: exit 0
pnpm check:watch-hint-literal :: exit 0
```
`dispatch-gates --ran`: 19 derived families accounted for, 19 run, 0
NOT-MEASURED (a derived zero: all 19 recorded an exit code and none is
3). Also run, outside the derived list: `pnpm
check:pm-settings-deny-roster` (its roster sits under `.claude`), `pnpm
check:pm-governed-prose`, `node
scripts/check-published-list-mirrors.mjs`, each exit 0.
</details>
## Acceptance notes
- **Premise, half held.** No lane file lists idle-lane chores today
(holds). But `execution-duties.md` has no empty-queue step: the per-card
empty-queue table and the standby list live in `seat-lifecycle.md`
〈停止条件与待命〉, outside the claim's file surface. The block sits at the end
of 〈候选与批次〉, which that table's blocker vocabulary already points at
(「候选定义反面(`execution-duties.md`)」). A one-line pointer in
`seat-lifecycle.md`'s standby list would be the direct link; not made
here (surface). Carrier: the seat.
- **No per-lane pointer lines** (the dispatch's optional route). Every
lane seat already reads `execution-duties.md` on every fire, so six
pointers would add lines with no reader the block lacks; `lanes/ui.md`,
`lanes/server.md` and `lanes/hotcrm.md` sit at headroom 0, so each would
cost another deletion. It also leaves the lane files to the sibling card
that adds a pointer line there. The card's acceptance allows the shared
section in place of per-lane copies.
- **Unblock signal.** The card text says `Notify: unblocked` to triage,
but in the closed mailbox vocabulary
(`scripts/pm/record-recognisers.mjs`) `Notify: unblocked` runs from the
seat that queued the card to the lane, for p0/p1 only. A lane asking
triage to unblock uses `Request: triage` (`project-forms.md`:
「问卡去留、路由或定级」). The chore says 「请解锁」 and the bell line routes it through
the existing keys; no key was added.
- `lanes/skills.md` 常设承诺 「首触定级每轮」 reads as the skills lane grading at
first touch, next to two lines that hand finding grading to triage.
Against the ruling that grading stays with triage it may be stale.
Outside this card's wording, not touched. Carrier: the seat.
## Verification
Head `ec896289` (main merged once before opening). Line budget after the
edit: `execution-duties.md` 188/188, `triage-duties.md` 102/102; longest
added line 120 bytes. The `os-dev-report` comment on the card carries
the same readings.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01J8VVAoanyVrJxtZ2gGqdZw)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent f9e7ffc commit 00d0668
2 files changed
Lines changed: 7 additions & 7 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
12 | 11 | | |
13 | 12 | | |
14 | 13 | | |
| |||
55 | 54 | | |
56 | 55 | | |
57 | 56 | | |
58 | | - | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
59 | 63 | | |
60 | 64 | | |
61 | 65 | | |
| |||
101 | 105 | | |
102 | 106 | | |
103 | 107 | | |
104 | | - | |
105 | 108 | | |
106 | 109 | | |
107 | 110 | | |
| |||
125 | 128 | | |
126 | 129 | | |
127 | 130 | | |
128 | | - | |
129 | 131 | | |
130 | 132 | | |
131 | 133 | | |
| |||
163 | 165 | | |
164 | 166 | | |
165 | 167 | | |
166 | | - | |
167 | 168 | | |
168 | 169 | | |
169 | 170 | | |
| |||
177 | 178 | | |
178 | 179 | | |
179 | 180 | | |
180 | | - | |
181 | 181 | | |
182 | 182 | | |
183 | 183 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
| 35 | + | |
35 | 36 | | |
36 | 37 | | |
37 | 38 | | |
| |||
95 | 96 | | |
96 | 97 | | |
97 | 98 | | |
98 | | - | |
99 | 99 | | |
100 | 100 | | |
101 | 101 | | |
| |||
0 commit comments