Repository navigation
Commit 6862ef6
docs(pm-dispatch): the seat that sees a main-red files and dispatches it; triage first-touch follows (#26210)
Fixes #26143
Clause-②: no
Metadata-protocol: none
## What changed
Skill text only, four files under `.claude/skills/pm-dispatch/**` (Tier
S), every file line-neutral against its `check-skill-line-ratchet`
ceiling, every touched line at or under 120 bytes, no issue numbers in
operative text.
**`references/landing-operations.md` §B — the main-red convention gains
its actor.** 约定① now reads: the seat that sees a full-battery red on
`main` or a merge-queue build looks for the anchor card first; finding
none, it files the p0 anchor card (filing-gate class ①) with the failing
surface's lane domain, claims it, and dispatches the stanch — in the
words the card asks for, `⛔ 不等分诊首触、不等维护者`. The first stanch is the
revert of the commit that introduced the red, found on `main` between
the last green and the first red; root cause goes on its own card.
Triage first-touch follows after the fact and may change the domain,
never the action. The two existing conventions stay: p0 fix-forward
jumps the queue (mechanical, root cause verified) and the maintainer may
hand-merge a one-line fix — compressed from two lines to one; 约定② (one
failing check anchors one card, first filer wins, later seers comment on
the anchor) is byte-unchanged. The fourth existing convention, no lane
PR arms the queue meanwhile, lives in `AGENTS.md`'s Two-speeds paragraph
and was never in this file.
**`references/execution-duties.md` — the candidate rule gains main-red
as its second exception**, in the same shape as the sub-issue clause:
line 10 names both exceptions and points at `landing-operations.md`;
line 40 (dispatched past triage, sweep audits after) now covers both
instead of being duplicated.
**`references/triage-duties.md` — one line beside the urgent-triage
rule** tells the triage seat that a main-red anchor the seat already
filed and dispatched still gets its first touch, as a recorded grade:
domain may change, action never, and the card's in-flight state is no
reason to skip it. The blanket "in-flight cards are not touched" line
(70) names that first touch as an exception so the two lines cannot be
read against each other.
**`SKILL.md` lines 170–171, edited in place** (no line added):
`domain:*` production and the queue/level/claim-eligibility line now say
两例外 (sub-issue, main-red anchor) instead of 例外一. Without this the new
rule would contradict SKILL.md's own "only triage produces `domain:*`"
and "no triage audit, no claim" lines, and SKILL.md's stricter-rule
tie-break would have sent the seat back to waiting for triage. The lane
charter `references/lanes/skills.md` line 「本车道 finding 同走分诊席首触,⛔ 不自分诊」
is untouched: it is about lane findings, and main-red is now the named
exception.
Not touched, by the card's own scope: `AGENTS.md`'s main-red sentence
("triage files it") is Tier H prose and is the seat's to raise with the
maintainer; machine-filed anchor cards (option B) were not chosen.
## Line budget
| file | before | after | ceiling |
|:--|--:|--:|--:|
| `references/landing-operations.md` | 101 | 101 | 101 |
| `references/execution-duties.md` | 188 | 188 | 188 |
| `references/triage-duties.md` | 103 | 103 | 103 |
| `SKILL.md` | 319 | 319 | 319 |
New and edited lines, measured in bytes: landing-operations 118 / 109 /
92 / 116; execution-duties 114 / 116; triage-duties 109 / 116; SKILL.md
118 / 118. Nothing re-wrapped; no ceiling moved.
## Rules retired (every deleted clause and where it now lives)
- `landing-operations.md` old line 61 (受管路径全在 `.claude/**` 者 Tier
S:席内达档复核过落地前检两条即转正式入队) → `SKILL.md` 路径分叉 line 204 (受管面两层:Tier S =
`.claude/**` 全树 … S 经达档复核 PASS 后 ready → 入队) and
`references/contract-review.md` line 37 (落地前检两条,过则 Tier S 入队、Tier H
等人批), which this file's line 59 already points at.
- `landing-operations.md` old line 62 (Tier H(其余受管面)者:四件套留 draft 等人批,⛔
不翻正式不入队;获授权批准后认领席落地) → `SKILL.md` 路径分叉 lines 186–189 and 197,
`references/lanes/skills.md` line 17 (Tier H 受管 PR 恒 draft 等维护者的字),
`references/contract-review.md` line 37. Line 60 of this file keeps the
operational step (`check-governed-merges.mjs --pr N`:受管面照两层) and line 63
keeps ⛔ 两层不由席位批准.
- `landing-operations.md` old lines 82–83 (p0 fix-forward 允许跳队 … / 也可按既有
governed 例外由维护者人工直合一行修复;仅限 main-red 修复) → compressed into the new line 4
of the block; "仅限 main-red" is carried by the block's position between
约定① and 约定②.
- `execution-duties.md` line 10, clause 预贴 `pm:queue` 视同无 → `SKILL.md`
line 171 (预贴标签只是建议,队列与级别只由分诊落笔). Clause 例外一的 sub-issue 承父卡首触 is kept,
now beside the second exception.
- `execution-duties.md` line 40, clause 带父卡域与优先级 → generalised to 各带域与级;
the sub-issue's inheritance is stated at line 39 (优先级继承) and `SKILL.md`
line 170 (承父卡域).
- `triage-duties.md` old line 78 (裁决恒归维护者人工:分诊只分析、推荐、入箱;⛔ 无代裁车道、置信门与
`auto-adjudicated`) → `SKILL.md` 红线 line 30 (⛔ 永不代维护者答产品或架构问题,⛔
无代裁通道:席位只分析与推荐,裁决恒出自人工), `SKILL.md` line 276 (⛔ 无代裁无自裁无子代理), this file's
line 5 tail (⛔ 无代裁通道) and `references/lanes/director.md` line 22 (⛔
无裁决线程、代裁、置信门). A true duplicate of a 红线, which the rules-only rewrite
convention already names as the class to retire.
- `triage-duties.md` line 70, clause 敲门在先 → lines 71–72 of the same
file, whose sequence (敲门一次 → 敲门后 … 无答复 ⇒ 释放) is that rule.
## Tests and gates
Docs-only diff: no package is touched, so there is no ① closure build
and no ② package test; no ablation (the diff pins no tested behaviour).
Local readings are on the final head `46774c37` (the merge of
`origin/main` `7111e14a` into the change commit `6fb2d7eb`); the full
derived union was run after that merge.
Local derived subset — `node scripts/pm/dispatch-gates.mjs --commands
--repo objectstack-ai/objectstack` with no paths (change set derived
from git: 4 paths vs merge base `7111e14a`), 22 families, every exit
code captured by redirect before any pipe, then reconciled: `✓
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)`.
| command | exit |
|:--|--:|
| `node scripts/check-closing-keyword-parity.mjs` | 0 |
| `node scripts/check-closing-keyword-parity.mjs --self-test` | 0 |
| `node scripts/check-comment-mask-corpus.mjs` | 0 |
| `node scripts/pm/check-governed-queue-guard.mjs --self-test` | 0 |
| `node scripts/pm/check-harness-current.mjs --self-test` | 0 |
| `pnpm --filter @objectstack/lint run check:doc-formula-expressions` |
3 on the unbuilt tree (PREREQUISITE NOT MET: `@objectstack/formula` and
`@objectstack/lint` not built — "Nothing was measured"), then 0 after
`pnpm exec turbo run build --filter=@objectstack/formula
--filter=@objectstack/lint` under the verify lock (`VERDICT command-exit
0 · held the lock 114s`) |
| `pnpm check:agent-test-spelling` | 0 |
| `pnpm check:cross-package-test-inputs` | 0 |
| `pnpm check:doc-authoring` | 0 |
| `pnpm check:driver-memory-census` | 0 |
| `pnpm check:gitlink-declared` | 0 |
| `pnpm check:nul-bytes` | 0 |
| `pnpm check:pm-expected-skips` | 0 |
| `pnpm check:pm-governed-merges` | 0 |
| `pnpm check:pm-governed-prose` | 0 |
| `pnpm check:pm-half-states` | 0 |
| `pnpm check:pm-label-write` | 0 |
| `pnpm check:pm-skill-id-lint` | 0 — `✓ check-skill-id-lint: 104
file(s) clean (pattern /#[0-9]{3,}/g)` |
| `pnpm check:pm-skill-ratchet` | 0 — `SKILL.md is 319 lines (ceiling
319; headroom 0)` · `landing-operations.md is 101 lines (ceiling 101;
headroom 0)` · `triage-duties.md is 103 lines (ceiling 103; headroom 0)`
· `execution-duties.md is 188 lines (ceiling 188; headroom 0)`; no
line-length offender |
| `pnpm check:refd-timer-probe` | 0 |
| `pnpm check:skill-frame-sync` | 0 — `✓ check-skill-frame-sync: the one
declared copy of the decision frame is internally coherent
(.claude/skills/pm-dispatch/SKILL.md …)` |
| `pnpm check:watch-hint-literal` | 0 |
Local-only family, not derived but owed because `SKILL.md` holds the
four-axis frame: `pnpm check:skill-frame-freshness` exit 0 — `✓
check-skill-frame-freshness: the decision frame in this tree is current
with origin/main (fetched just now)`. Reading stays local, as the role
file says.
Every family CI runs on this PR: its check-runs had not started when
this body was written (the PR is created by this write), so they are
`in_progress` here, the honest value; the seat reads the PR's
check-runs. Not waited for. Dogfood battery: n/a — no `!` in the title
and no `(narrowing)` arm.
## Acceptance notes
- Cross-lane claiming of the anchor: the ruling says the seat that sees
the red claims it, and the failing surface's lane may not be that seat's
lane. The text states the ruling as given; the existing cross-lane
channel it rides is `SKILL.md` line 175 「接手无主阻塞项」 together with
`execution-duties.md` line 45 (阻塞项无主 ⇒ 被挡席认领做掉) — a main-red blocks
every lane's landing. The 红线 line 34 (执行席只在本车道认领) is not edited; the
maintainer's ruling outranks it by `SKILL.md`'s own 优先序. Named for the
seat's review, not resolved here.
- The after-the-fact clause (首触事后补,可改域、⛔ 不改动作) appears twice on purpose:
once in landing-operations §B from the acting seat's side, once in
triage-duties from the triage seat's side, where the in-flight exemption
also has to be said.
- Carrier: the seat raises `AGENTS.md`'s "triage files it" sentence with
the maintainer (Tier H, the maintainer's hand only); noted, not filed.
## 维护者速读(草稿)
### 改了什么
pm-dispatch 技能里的 main-red 约定补上了「谁来做」:看见主干或合并队列全量红的席位先找锚卡,没有就自己立 p0
锚卡(域按出红的面所属车道)、认领、派止血;首道止血是回退引入红的那个提交,根因另立卡;⛔
不等分诊首触、不等维护者。分诊首触事后补,可以改域、不改动作。既有约定(一个签名一张卡、p0 fix-forward
跳队、维护者可直合一行修复、止血期间车道 PR 不挂队列)全部保留。执行席的候选规则把 main-red 锚卡列为 sub-issue
之外的第二个免分诊例外;分诊席职责加一行:在飞的 main-red 锚卡照样补首触,只作记录级。四个文件行数一行不增,全部按 120
字节/行写。
### 为什么改
你 2026-10-26 在席位线程的原话:「主干 Test Core 超时红这种应该立刻立卡啊,skills 没有约定吗?」「所以
main红这一类卡应该是 devx
立卡并立刻处理吗」「按照目前的规则,等分诊太慢了」,决策卡上选的是「席位直接立卡派发,分诊后补」。当天实测的延迟全在「看见红 →
立卡」这一段(两个半小时),立卡之后 47 分钟就修好了。
### 风险与代价(含回滚)
- 风险一:主干红时可能出现两张锚卡。约定②(一个签名一张卡、先立者赢、后见者评论到锚卡)原样保留,sweep 事后查重,重复的关
duplicate。
-
风险二:看见红的席位可能跨车道认领。规则文本照裁决写「认领并派止血」,走的是既有「接手无主阻塞项」越界通道;红线「执行席只在本车道认领」没有动,按技能自己的优先序由裁决压过。席位复核时请留意这一点。
- 代价:为保持行数不增,从 landing-operations 退了两行 Tier S/Tier H 说明(SKILL.md 路径分叉与
contract-review.md 已有同样的规则),从 triage-duties 退了一行「裁决归人工」(SKILL.md 红线第 30
行原文)。所有退掉的内容在 PR 正文「Rules retired」逐条列了去处。
- 回滚:revert 这一个提交即可,无数据、无发布面、无门禁常量改动。
### 席位意见
(留空,席位定稿)
### 你要做的
一个动作:AGENTS.md「Two speeds」段里的「triage files it」一句是你亲手的 Tier H 文字,本 PR
没碰;要不要把它改成「the seat that sees it files it」,由你定。
---
_Generated by [Claude
Code](https://claude.ai/code/session_01LqKsGyMNFwwnbF5FTAqyPn)_
---------
Co-authored-by: os-warren <warren@objectstack.ai>
Co-authored-by: Claude <noreply@anthropic.com>1 parent 326a559 commit 6862ef6
4 files changed
Lines changed: 11 additions & 11 deletions
File tree
- .claude/skills/pm-dispatch
- references
| 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 | | |
175 | | - | |
| 175 | + | |
176 | 176 | | |
177 | 177 | | |
178 | 178 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
| 10 | + | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| |||
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
40 | | - | |
| 40 | + | |
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
58 | 58 | | |
59 | 59 | | |
60 | 60 | | |
61 | | - | |
62 | | - | |
63 | 61 | | |
64 | 62 | | |
65 | 63 | | |
| |||
79 | 77 | | |
80 | 78 | | |
81 | 79 | | |
82 | | - | |
83 | | - | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
84 | 84 | | |
85 | 85 | | |
86 | 86 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| 25 | + | |
25 | 26 | | |
26 | 27 | | |
27 | 28 | | |
| |||
67 | 68 | | |
68 | 69 | | |
69 | 70 | | |
70 | | - | |
| 71 | + | |
71 | 72 | | |
72 | 73 | | |
73 | 74 | | |
74 | 75 | | |
75 | 76 | | |
76 | 77 | | |
77 | 78 | | |
78 | | - | |
79 | 79 | | |
80 | 80 | | |
81 | 81 | | |
| |||
0 commit comments