Skip to content

Commit 00d0668

Browse files
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

File tree

‎.claude/skills/pm-dispatch/references/execution-duties.md‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
- 候选 = open、未 assign、无 `needs-user-decision`、无 `pm:retriage`;⛔ 排除三门皆无的 `tooling` 卡。
99
- 席改标:卡余项实测路径整落本席包树 ⇒ 本席改 `domain:*`,审计评论列路径与新旧标同笔。
1010
- 席改标限未派发卡;带 `needs-user-decision`、open `Blocked-by:` 或 `security` 的 ⛔ 不改,仍问分诊。
11-
- 无分诊审计评论即非候选;例外:sub-issue 承父卡首触,main-red 锚卡见 `landing-operations.md`。
1211
- 每张候选读全文 + 全部评论,写派发词前做决策复读:评论读到最后一页。
1312
- 维护者裁决逐字引入派发词裁决分区作约束,无则写明无裁决。
1413
- 派发前做前提过时检查,裁决同罪,三面都查:动作面、卡引用面、工作项面。
@@ -55,7 +54,12 @@
5554
- `pm:blocking` 级内先按解锁扇出(从 `Blocked-by:` 反向索引现算,⛔ 扇出数不落标签)。
5655
- 全序每级现读/现算,零逐卡维护;同级先 `Bug` 再卡龄;无级/缺 `Path:` 轮报记分诊缺口。
5756
- 一车道多席按全序交替取卡:席 1 奇位、席 2 偶位;只为破交替才发 `split`;认领戳仲裁。
58-
- 解锁那一刻 PM 自己的判断最不可信:裁决收窄或关掉了那张卡是假设不是前提。
57+
- 空闲杂务:无卡可认领或等分诊的车道席对本车道卡做下四件;⛔ 不定级,自分诊例外照旧。
58+
- ① 交付卫生:交付卡补收尾记录;离手摘 `pm:*` 同笔设下一态;`Blocked-by:` 全关即重验回队。
59+
- ② 最老 open 卡对 `origin/main` 复读前提与修否并贴证据;已修交分诊或维护者关,⛔ 不自关。
60+
- ③ 新卡预读:复现、查重查询与命中数、一行 `Suggested-grade: p<n> · <理由>`;⛔ 不写级标签。
61+
- ④ 本车道 `finding` 卡补缺的 `reach:` 或复现,或写明为何不合三类。
62+
- ⛔ 不静默等分诊:敲信箱键(`project-forms.md`);报「等分诊」须引所敲评论 id,引不出即未问。
5963

6064
## 认领(先认领后动工)
6165

@@ -101,7 +105,6 @@
101105
- 纯机械一行 PM 酌定可至下限档;降档施工的补偿控制 = 复核席跑契约复审档。
102106
- 降档施工只经契约复审档复核到达维护者,⛔ 不新增标签不新增链。
103107
- 强制条款②:放宽接受集或扩大公开面的卡默认判断档施工;命中即 spec 车道的活。
104-
- 条款②判据即 triage 机械边界测试与 `references/lanes/spec.md` 席内分派判据,⛔ 不另抄。
105108
- 负边界:运行时权限/安全行为变更不是条款②,归人工地板安全/权限边界类。
106109
- 条款②只指已发布契约面,拉回已声明契约不触它;卡面复述仍是条款②。
107110
- 收窄已发布接受集的卡是 `Clause-②: no`,不移车道;入队前欠一次契约复审档复核。
@@ -125,7 +128,6 @@
125128
- 凡我觉得可以这样的一律降到第三区;⛔ 不把假设写成裁决。
126129
- 标准非协商条款 ⛔ 不抄进派发词:hook 已机械强制段与 os-dev.md 已载通用段砍掉。
127130
- ⛔ 不砍卡类特有约束:ADR 类 draft-only、tier 推导引用、棘轮实况、释义纪律。
128-
- 无条件条款只住角色文件,冲突时它胜、错了修那里,⛔ 不靠派发词临时覆盖。
129131
- 终报要求随派发词带一句:只收机器可核字段(gates / line_budget / deviations / files_changed)。
130132
- 派发令恒带 `Writes:` 行:PR 只经中继 `pr_create`;评论/标签/正文只经中继写工具;两数都报。
131133
- ⛔ GitHub MCP 写:`create_pull_request`、`update_pull_request`、`issue_write`、`add_issue_comment` 等。
@@ -163,7 +165,6 @@
163165
- 判死只有三类依据:探针回包表明已死;宿主明确回报 stopped;超过本车道基线且连续静默。
164166
- 基线 = 本车道实录派发 → 推分支/开 PR 的端到端耗时,三五单即可用,⛔ 非本文任何常数。
165167
- `mode:cloud` 的 ~2h 静默是本轮收集边界(记 `blocked` 移步下轮),也不是判死。
166-
- 停摆永不自愈:携带任务中途状态的完成通知本身就是停摆信号。
167168
- 报告末句是意图不是结果 = 停摆非完成:当刻 SendMessage 续派,⛔ 不读作交付、不判死。
168169
- 停摆 ⇒ 立刻 SendMessage 附前台执行姿态句,⛔ 不等任何静默阈值(阈值是给没有回答的)。
169170
- 通知重放先算身份再读内容:与已验收那份同身份 ⇒ 记重放即结束。
@@ -177,7 +178,6 @@
177178
- 逐项判据展开在 `references/review-checklist.md`,每份报告对着它过。
178179
- 报告或复核见涉 cloud ⇒ 整卡 `Release:`+`pm:retriage` 转 cloud 车道,读点留卡;⛔ 不拆半边。
179180
- 改到已有 `.changeset/*.md` 的 PR ⛔ 不打 `skip-changeset`;确认取同 head 达档 PASS 或维护者原话。
180-
- 报告在草稿 PR 时点到达,CI 收敛读数只属于复核侧:gate `in_progress` 是诚实读数。
181181
- 绿色输出≠ 该绿证明了被测风险:拒收断言、全绿方向与时序、pin 翻转、边界后收益。
182182
- 触 `skills/**` 的 PR 加问整包价值密度:从整包加载的客户 agent 座位读,⛔ 不从作者座位读。
183183
- 超派发预算或小功能大扩写 ⇒ REWORK,⛔ 不因已经写好了放行。

‎.claude/skills/pm-dispatch/references/triage-duties.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
- 证据 = 卡上引具名失败 check/run、复现读数或 pin 测试;记录照分诊格式贴卡,请分诊复审。
3333
- 行首 `Ruling-ref:` 引本例外裁决原话;⛔ 不改 `domain:*`、不定 p0(归 main-red)、不碰人工地板。
3434
- 分诊每轮读上轮以来新贴的自分诊记录,逐条回复确认或改判;复审前席位定级有效。
35+
- 分诊定级轮读车道 `Suggested-grade:` 行:是输入不是定级,确认或改判,不采纳给理由。
3536
- 分类动作每张三选一,外加一个修复通道;裁定写方向、给六态之一。
3637
- 停 `pm:blocked` 同笔在卡正文写行首 `Blocked-by: #N`(issue/PR 号;full-run 卡写评论),散文不算。
3738
- 方向在 ADR/本卡裁决/不可重裁规则:贴 `check-prior-rulings.mjs` 的 `Prior rulings read:` 行,或不点。
@@ -95,7 +96,6 @@
9596
- ①只翻 report-only,不删门不跳测;②同笔送待决策汇总入下批,附两红 run;③不同意即翻回。
9697
- 条件:席位验收评论逐条核实、去重计数(候选/落地/已有/拒收)、一事一行、不计重排。
9798
- 机械边界测试(条款②判据):改动扩大接受集或公开面 ⇒ 是;拉回已声明契约 ⇒ 否。
98-
- 轮次报告设呈裁清单专节(卡、推荐、所引权威),⛔ 无代裁清单、无追认表。
9999
- 回翻条款:实施中发现契约终究要动 ⇒ dev 停手,卡回决策箱,⛔ 永不静默重裁。
100100
- 请示纪律:方向性授权覆盖整条执行链一并做完,⛔ 不逐项回问。
101101
- 汇报只在里程碑、真阻塞、被问到时;中间状态与限流/重试类细节只进座位贴和触发器。

0 commit comments

Comments
 (0)