Skip to content

Commit 7a95094

Browse files
pm-dispatch(triage): a lane seat may self-triage at p1/p2 a card that blocks its own in-flight work on clear evidence, in triage's format, and triage reviews it each round (#27320)
Fixes #27061 Clause-②: no Metadata-protocol: none ## 维护者速读 - 改了什么:车道席遇到一张还没分诊、却挡住自己在飞工作(认领卡、其 PR、队列落地、拆分链)的卡,可以自己先做首触、定 p1/p2 —— 前提是卡上引了具名证据(失败 check/run、复现读数或 pin 测试);记录照分诊格式贴在卡上、行首 `Ruling-ref:` 引你的原话,然后请分诊复审;分诊每轮逐条确认或改判,复审前席位的定级有效。`SKILL.md` 里「队列与级别只由分诊落笔」的两行改为指向这个例外。 - 为什么改:你的裁决「照此执行,并立卡更新 skills」—— 规则已在 server 车道生效,写进技能文本让每个车道席读到同一段话;其它卡照旧全部走分诊。 - 风险与回滚:只改两份协议文本(`.claude/skills/pm-dispatch/**`),无代码、无门禁、无发布面;回滚 = revert 本 PR。付行的四条删行各有具名的家(下表),误删与否在那张表上可核。 - 先看:`references/triage-duties.md` L30–33(新例外四行)与 L24(合并行);`SKILL.md` L170–171(指针两行;L34 红线未动)。 - 两分钟验证:`pnpm check:pm-skill-ratchet` —— 预期看到 `triage-duties.md is 102 lines (ceiling 102; headroom 0)` 与 `SKILL.md is 319 lines (ceiling 319; headroom 0)`,且每条散文行 ≤120 B。 - 需要你做的:无,席位达档复核(Tier S,`.claude/**`)后落地。 ## What changes Two files under `.claude/skills/pm-dispatch/`, both already at their line ceilings; net 0 lines in each, every prose line at or under 120 bytes, no table row added (the triage-duties widest-row pin stays at 0). The card's four Wanted items and triage's own grade (6460243271, the per-round review) map onto the text as follows. **`references/triage-duties.md` (102 → 102).** The four new lines sit directly after the main-red block (old L28–30: 紧急卡直接分诊 · main-red 锚卡由席位先立先派 · 主干全量红…首触定 p0), the file's existing "a seat acts first, triage follows" cluster, so the ⛔ p0 pointer in the third new line reads two lines up. The dispatch order suggested the 在飞/释放 block (old L75–78) and the 复审 block (L11/L16); the line the card quoted as L75 left the file before this PR, and the live analogue of the mechanism is the main-red block, so the four lines are kept contiguous there (declared as a deviation in the report). | old line | new line | bytes | text | where the deleted content lives | |:--|:--|:--|:--|:--| | L24 | L24 (edited) | 102 → 120 | 「首触定级与五析取 sweep 每 fire 跑到清空,先于旧卡重验:⛔ 无每轮预算、无逐卡豁免评论。」 | absorbs old L71: 「无逐卡豁免评论」 and 「先于旧卡重验」 carried verbatim; 「每 fire 定完全部未定级 finding」 was already this line's 「首触定级…每 fire 跑到清空」; the line gave up 「总量」 and the rhetorical 「清得动就多清」 | | L25 | — (deleted) | 69 | 「窗口耗尽未跑完的,下一 fire 从标签状态断点续跑。」 | `SKILL.md` L68 「fire = 一次唤醒;fire 到达时上一轮未清空的接续处理,⛔ 不重开、不重排。」 and L93 「状态只经 GitHub 标签、assignee、正文行与 `pm:seat` 座位贴读写;循环须能从全新会话恢复。」 | | L31 | — (deleted) | 114 | 「无主 p0 锚卡一轮即轮报,再一轮本席贴认领行只代派止血(`landing-operations.md` 约定③)。」 | `SKILL.md` L35 (红线, read in full by every seat) 「唯一例外:无主 p0 锚卡一轮即轮报、再一轮分诊只代派止血:每轮一张,复核非分诊。」 and `landing-operations.md` L82–84 (约定③, including 「分诊贴标准认领行」). All three landed together in commit 3af6022; this file's copy was the verbatim duplicate. | | L69 | — (deleted) | 103 | 「生产者在哪是常设分诊问题:declared ≠ enforced 形状的卡先问谁在写这个字段。」 | this file's 责任三问 line (now L71): 「谁的代码出险」 is "who writes this field" for that shape, and 「据答改卡范围、域与路由」 is what the answer does; `lanes/server.md` L35 and `lanes/hotcrm.md` L30 both state 「先问生产者在哪」 on the lane side; `SKILL.md` L314 `Responsibility:` first answer | | L71 | — (merged into L24) | 94 | 「⛔ 不设逐卡豁免评论;每 fire 定完全部未定级 finding,优先于旧卡重验。」 | see L24 | | — | L30 (new) | 119 | 「车道席自分诊:本车道卡挡自有在飞(认领卡/PR/落地/拆分链)且证据清楚,方可首触定 p1/p2。」 | Wanted 1 (a): the trigger, the four in-flight kinds, the lane restriction (本车道卡), p1/p2 only | | — | L31 (new) | 118 | 「证据 = 卡上引具名失败 check/run、复现读数或 pin 测试;记录照分诊格式贴卡,请分诊复审。」 | Wanted 1 (b) and 2: the three evidence kinds cited on the card, the record in triage's format (L54/L64 of this file define it), the ask | | — | L32 (new) | 119 | 「行首 `Ruling-ref:` 引本例外裁决原话;⛔ 不改 `domain:*`、不定 p0(归 main-red)、不碰人工地板。」 | Wanted 2 and 3: the `Ruling-ref:` line (the line-initial key `dispatch-runbook.md` L78/L153 already defines), ⛔ `domain:*`, ⛔ p0 (main-red, two lines up and `SKILL.md` L35), ⛔ human floor (L79–85 of this file); "not blocking" and "outside the lane" are the contrapositive of L30's 本车道卡…方可 | | — | L33 (new) | 112 | 「分诊每轮读上轮以来新贴的自分诊记录,逐条回复确认或改判;复审前席位定级有效。」 | triage's side (grade 6460243271) and Wanted 2's last sentence: the seat's grade stands until reviewed | **`SKILL.md` (319 → 319).** The two 域车道 lines that said only triage writes queue and level (old L170–171, 118 B each) are rewritten together at net 0 lines; the 红线 at L34 is untouched, as the card says. | line | before (118 B) | after | bytes | moved or dropped | |:--|:--|:--|:--|:--| | L170 | 「`domain:*` 只由分诊产出,两例外:sub-issue 承父卡域、main-red 锚卡;无标签的卡 ⛔ 不得认领。」 | 「`domain:*`、队列与级别只由分诊落笔;两例外:sub-issue 承父卡域、main-red 锚卡,免审计评论。」 | 118 | 「队列与级别只由分诊落笔」 moved up from L171; 「两例外豁免」 (L171) became 「,免审计评论」 on the two exceptions; 「无标签的卡 ⛔ 不得认领」 dropped — home: `SKILL.md` L105 (open + 队列标签 + 无 assignee = 可派发), `execution-duties.md` L7 (candidates are read with `labels: [domain:X]`, so an unlabelled card is never one) and L11 (无分诊审计评论即非候选), and the retained 「无分诊审计评论 ⛔ 不得认领」 — triage's labels and its audit comment land in one stroke (L114/L119) | | L171 | 「预贴标签只是建议,队列与级别只由分诊落笔;无分诊审计评论 ⛔ 不得认领;两例外豁免。」 | 「无分诊审计评论 ⛔ 不得认领;车道席自分诊是队列与级别的第三例外,住 `triage-duties.md`。」 | 118 | Wanted 4: the pointer; 「预贴标签只是建议」 dropped — home: `triage-duties.md` L22 (析取 ⑤ treats `pm:queue`/`priority:*` applied in the card's creation minute as untriaged, ⛔ 不凭 actor), L52 (`type` 立单者可预填、分诊校正), and 「只由分诊落笔」 itself | ## Tests No package is touched, so there is no ① build closure and no package test suite is owed; the two files are protocol text and their tests are the gate families under Verification. No tested behaviour changed, so no ablation. ## Acceptance notes - Placement: the four triage-duties lines are contiguous after the main-red block rather than split between the 在飞/释放 block and the 复审 block the order suggested (reason above); the seat may move L33 next to L11/L16 at zero cost if it prefers the 复审 block. - `Ruling-ref:` words: the skill text names the ruling without quoting it (the corpus carries no quotations or issue numbers; `check:pm-skill-id-lint`). The three maintainer lines a seat quotes on its record live verbatim on the card this PR closes, reachable from this PR and from `git log -S` on L32. - Lane charters still carry the old absolute for their own lane and are outside this card's two-file scope: `lanes/skills.md` L22 「本车道 finding 同走分诊席首触,⛔ 不自分诊」, `lanes/spec.md` L29 「findings 首触定级归分诊席,本席只供证据」, `lanes/ui.md` L8 「⛔ 不产 `domain:*`、type 与定级,分诊唯一生产」. A reader of one of those alone does not find the exception; carrier: the skills seat (its lane charters) — noted, not filed. - `execution-duties.md` L11 「无分诊审计评论即非候选」 reads unchanged on purpose: a self-triage record in triage's format is that audit comment, which is also why `SKILL.md` L171 keeps 「无分诊审计评论 ⛔ 不得认领」 beside the new exception. - `pnpm --filter @objectstack/lint run check:doc-formula-expressions` first answered PREREQUISITE NOT MET (exit 3: `@objectstack/formula` and `@objectstack/lint` not built — nothing measured); both were built under the verify lock (`os-verify-lock: VERDICT command-exit 0 · held the lock 71s`) and the gate reran at exit 0. The build changed no tracked file. - The shared `origin/main` ref moved during this run (a sibling's fetch); the derivation reads the merge base (`d4427aedc`) and the diff against the recorded BASE `d4427aed` is exactly the two files above. - The harness attribution reminder names a model in its trailer; the commit carries AGENTS.md's model-free pair instead. ## Verification Head `f192e7d5`; every run below is on that head. `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` — stderr line 1: "gate list derived from the tree of 'objectstack-ai/objectstack' at commit f192e7d"; "change set derived from git — 2 path(s) vs merge base d4427ae of 'origin/main' and HEAD". 22 commands derived, each run with its exit captured before any pipe: <details><summary>derived families — 22/22 run, every exit 0 (doc-formula after its prerequisite build)</summary> | command | exit | verdict line | |:--|:--|:--| | `pnpm check:pm-skill-ratchet` | 0 | `triage-duties.md is 102 lines (ceiling 102; headroom 0)` · `SKILL.md is 319 lines (ceiling 319; headroom 0)` · `SKILL.md: widest table row is 341 bytes (pin 341; headroom 0)` · `triage-duties.md: widest table row is 0 bytes (pin 0; headroom 0)` | | `pnpm check:pm-skill-id-lint` | 0 | `104 file(s) clean (pattern /#[0-9]{3,}/g)` | | `pnpm check:pm-governed-prose` | 0 | `2 instruction surface(s) name all 13 registered governed surfaces` | | `pnpm check:skill-frame-sync` | 0 | `the one declared copy of the decision frame is internally coherent` | | `pnpm check:pm-half-states` | 0 | `self-test: 5034 cases pass` | | `pnpm check:nul-bytes` | 0 | `scanned 22097 text file(s) … no raw ASCII control bytes` | | `pnpm check:pm-governed-merges` | 0 | `537 assertions … live: the real generator declared 9 output(s) and certified this tree` | | `pnpm check:pm-expected-skips` | 0 | `206 cases pass` | | `pnpm check:pm-label-write` | 0 | `136 cases pass across 11 batteries` | | `pnpm check:doc-authoring` | 0 | `69 published skill files clean` · `19738 customer-facing string(s) … clean` | | `pnpm check:cross-package-test-inputs` | 0 | `31 package(s) read outside themselves, all declared` | | `pnpm check:agent-test-spelling` | 0 | (sweep clean; non-vacuity by `--self-test`) | | `pnpm check:gitlink-declared` | 0 | `22199 index entries -- 0 gitlink(s)` | | `pnpm check:driver-memory-census` | 0 | `every declaration is ledgered, every ledger entry is live` | | `pnpm check:refd-timer-probe` | 0 | `18806 source file(s) swept` | | `pnpm check:watch-hint-literal` | 0 | `74 declaration(s) across 4 rostered name(s)` | | `pnpm --filter @objectstack/lint run check:doc-formula-expressions` | 3, then 0 | first run: `PREREQUISITE NOT MET — @objectstack/formula is not built` (nothing measured); after the lock-held build: exit 0 | | `node scripts/check-closing-keyword-parity.mjs` | 0 | (two oversized CHANGELOGs listed as outside the sweep's unregistered-file cutoff, as on main) | | `node scripts/check-closing-keyword-parity.mjs --self-test` | 0 | `40 assertions, 5 mutations … driven to red` | | `node scripts/check-comment-mask-corpus.mjs` | 0 | `18816 files, 0 disagree, 0 unparseable` | | `node scripts/pm/check-governed-queue-guard.mjs --self-test` | 0 | `401 cases pass` | | `node scripts/pm/check-harness-current.mjs --self-test` | 0 | `all 26 cases passed` | </details> `--ran` reconciliation: exit 0 — `✓ dispatch-gates --ran: 22 derived famil(ies) accounted for — 22 run, 0 NOT-MEASURED (a DERIVED zero — all 22 recorded an exit code and none of them is 3)`. Beyond the derived set: `pnpm check:skill-frame-freshness` exit 0 (local-only family: `HEAD is 1 commit(s) behind, but the frame itself is unchanged`); `pnpm check:pm-record-recognisers` exit 0 (`297 cases` + `check-owed-reviews 49 cases`); `pnpm check:pm-dispatch-gates` detached under `nohup` as its header requires, verdict line `✓ dispatch-gates self-test (fast tier): 1935 cases pass; 7 slow section(s) deferred` with no `ELIFECYCLE` line in its log (its exit code was not captured — detached process); control-character self-scan of both files: 0 hits. CI: every family above also runs in `Lint & Repo Gates` on this PR; the seat reads those check-runs, they are not re-run here. --- _Generated by [Claude Code](https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 10755db commit 7a95094

2 files changed

Lines changed: 7 additions & 7 deletions

File tree

‎.claude/skills/pm-dispatch/SKILL.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,8 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
167167

168168
- 表未覆盖的包首次分诊时归类并走 PR 更新本表;新增或退役 `domain:*` 必须同批改本表。
169169
- 退役 `domain:*` 只退流通,对象保留;`domain:engine`/`domain:services`/`domain:cli` 读作 `domain:server`。
170-
- `domain:*` 只由分诊产出,两例外:sub-issue 承父卡域、main-red 锚卡;无标签的卡 ⛔ 不得认领。
171-
- 预贴标签只是建议,队列与级别只由分诊落笔;无分诊审计评论 ⛔ 不得认领;两例外豁免。
170+
- `domain:*`、队列与级别只由分诊落笔;两例外:sub-issue 承父卡域、main-red 锚卡,免审计评论。
171+
- 无分诊审计评论 ⛔ 不得认领;车道席自分诊是队列与级别的第三例外,住 `triage-duties.md`。
172172
- 跨域例外路径:拆不动的跨域单 PR 由分诊席指定一个车道 PM 认领,认领评论申报文件面。
173173
- 派发前在飞检查:读 `pm:dispatched` 卡认领评论申报的文件面,本地求交、不另发查询。
174174
- 跨域例外路径的范围加上该单文件面触及各域的在飞单;相交 ⇒ 排该 PR 之后串行或让行。

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,16 @@
2121
- 排除 `tracking`、`status:parked`、全部 `pm:seat` 贴、`qa-run` 记录。
2222
- 析取 ⑤:窗内新建且 `pm:queue`/`priority:*` 与建卡同分钟,照未分诊首触;⛔ 不凭 actor。
2323
- 半状态治愈积压 ②③④ 最老优先、P0 嫌疑先行,⛔ 优先最新不适用。
24-
- 首触定级与五析取 sweep 每 fire 跑到清空:⛔ 无每轮总量预算,清得动就多清。
25-
- 窗口耗尽未跑完的,下一 fire 从标签状态断点续跑。
24+
- 首触定级与五析取 sweep 每 fire 跑到清空,先于旧卡重验:⛔ 无每轮预算、无逐卡豁免评论。
2625
- 排序:队列每轮清空时最新优先;清不空的那一刻起改最老优先。
2726
- 裸卡数 >15 ⇒ 下一 fire 整轮改域分批集中模式,每批 ≤5 张同族卡,照样跑到清空。
2827
- 紧急卡直接分诊:维护者点名或 p0 嫌疑 ⇒ 立即起默认判断档分诊子代理,不等定时轮。
2928
- main-red 锚卡由席位先立先派,首触事后补作记录级:可改域,⛔ 不改动作,在飞照补。
3029
- 主干全量红与确定性队列红首触定 p0(锚卡、根因卡、full-run 卡);flake 锚卡判确定性才升。
31-
- 无主 p0 锚卡一轮即轮报,再一轮本席贴认领行只代派止血(`landing-operations.md` 约定③)。
30+
- 车道席自分诊:本车道卡挡自有在飞(认领卡/PR/落地/拆分链)且证据清楚,方可首触定 p1/p2。
31+
- 证据 = 卡上引具名失败 check/run、复现读数或 pin 测试;记录照分诊格式贴卡,请分诊复审。
32+
- 行首 `Ruling-ref:` 引本例外裁决原话;⛔ 不改 `domain:*`、不定 p0(归 main-red)、不碰人工地板。
33+
- 分诊每轮读上轮以来新贴的自分诊记录,逐条回复确认或改判;复审前席位定级有效。
3234
- 分类动作每张三选一,外加一个修复通道;裁定写方向、给六态之一。
3335
- 方向在 ADR/本卡裁决/不可重裁规则:贴 `check-prior-rulings.mjs` 的 `Prior rulings read:` 行,或不点。
3436
- `pm:queue` = 有具名落点或复现的具体缺陷,无可问之事;⛔ 工具/门禁修复不由此进。
@@ -66,9 +68,7 @@
6668
- 同文件同机制 = 同一发现,不分车道,首触定级即并:证据搬先卡,后卡关 `duplicate_of`。
6769
- 同族发现并入收口卡,不开单点卡;在飞(assignee/open PR)永不并,`Blocked-by:` 不派;完工查过期。
6870
- 执行席 ⛔ 不并卡,疑重复挂 `pm:retriage` 写明哪两张同文件同机制;同 assignee 者自关后卡。
69-
- 生产者在哪是常设分诊问题:declared ≠ enforced 形状的卡先问谁在写这个字段。
7071
- 首触答责任三问:谁的代码出险/有正路否/谁可达且有人用否;据答改卡范围、域与路由。
71-
- ⛔ 不设逐卡豁免评论;每 fire 定完全部未定级 finding,优先于旧卡重验。
7272
- 三类外不可逆或有硬时限(发版即固化、只被消费的文件、过窗不可补)⇒ 不关,报维护者。
7373
- 三类外首触关闭只清门前存量,关 not planned(不等批准可否决重开);三类内无证据拒收。
7474
- 三类内再过时前提检查,三选一:晋级 / 关闭 not planned / hold;判级只在此轮,不在立单时。

0 commit comments

Comments
 (0)