Repository navigation
Commit 7a95094
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
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
167 | 167 | | |
168 | 168 | | |
169 | 169 | | |
170 | | - | |
171 | | - | |
| 170 | + | |
| 171 | + | |
172 | 172 | | |
173 | 173 | | |
174 | 174 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
25 | | - | |
| 24 | + | |
26 | 25 | | |
27 | 26 | | |
28 | 27 | | |
29 | 28 | | |
30 | 29 | | |
31 | | - | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
32 | 34 | | |
33 | 35 | | |
34 | 36 | | |
| |||
66 | 68 | | |
67 | 69 | | |
68 | 70 | | |
69 | | - | |
70 | 71 | | |
71 | | - | |
72 | 72 | | |
73 | 73 | | |
74 | 74 | | |
| |||
0 commit comments