Repository navigation
docs(pm-dispatch): the seat that sees a main-red files and dispatches it; triage first-touch follows - #26210
Conversation
landing-operations.md §B: 约定① names the seat that sees a full-battery red on main or a merge-queue build as the actor — anchor lookup first, then a p0 anchor card (filing class ①) carrying the failing surface's lane domain, claimed and dispatched without waiting for triage first-touch or the maintainer's word; the first stanch is the revert of the commit that introduced the red, root cause on its own card; triage first-touch follows and may change the domain, never the action. The p0 fix-forward and hand-merge conventions stay, compressed to one line; 约定② is unchanged. Paid line for line by retiring the two Tier S / Tier H lines already stated in SKILL.md 路径分叉 and contract-review.md. execution-duties.md: the candidate rule names main-red as its second exception beside the sub-issue clause, and the dispatched-past-triage line now covers both. triage-duties.md: the in-flight main-red anchor still gets its first touch, as a recorded grade that may change the domain and never the action; paid by retiring the human-ruling line already stated as a SKILL.md 红线. SKILL.md: the domain-production and queue/level lines name two exceptions instead of one, edited in place. Claude-Session: https://claude.ai/code/session_01LqKsGyMNFwwnbF5FTAqyPn Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewReviewed at 2026-10-26T15:52Z Served-tier: Inputs: card #26143 body and its three comments (triage first grade 6417894401, claim 6419390894, os-dev-report 6420148592); PR #26210 object, file list and net diff against ① Derived judgmentsJudged against the order on the card — the maintainer's verbatim lines 「主干 Test Core 超时红这种应该立刻立卡啊,skills 没有约定吗?」「所以 main红这一类卡应该是 devx 立卡并立刻处理吗」「按照目前的规则,等分诊太慢了」 and the option chosen on the decision card 「席位直接立卡派发,分诊后补」 — against the triage first grade (first touch follows as a recorded grade, not a gate), and against the rest of the skill on Rules added — right against the order, except as noted under (b).
(a) Every retired line has a home or is a true duplicate — no lost rule. Each claimed home opened on
(b) The cross-lane claim — FAIL, with the exact wording gap. The card's own incident is cross-lane: the skills seat saw a (c) Surviving lines read against the new rule (the whole skill on
Ratchet and lint — read on the head tree, verdict from the check-runs. Line counts on ② Semver level
③ Boundary flagsPR body Acceptance notes:
os-dev-report PR author Implemented-by: VERDICT: FAIL |
…channel SKILL.md line 175, in place: the closed list of channels through which a seat may work across a domain gains the main-red anchor beside the cross-domain exception path, the claiming seat's follow-through surface and the unowned blocker. Without it the seeing seat files the anchor and then stops at the own-lane-only claim line, which is the gap the ruling ordered away; the contract review measured this clause as the cheapest carrier. SKILL.md stays at 319 lines, the line at 117 bytes; 红线 line 34 untouched. Claude-Session: https://claude.ai/code/session_01LqKsGyMNFwwnbF5FTAqyPn Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewReviewed at 2026-10-26T16:04Z Served-tier: Inputs: card #26143 body and its four comments (triage first grade 6417894401, claim 6419390894, os-dev-report 6420148592, patch-round os-dev-report 6420603205); PR #26210 object (body byte-unchanged since the first record), file list and net diff against ① Derived judgmentsThe patch. (b) closed. The main-red anchor is now an entry of the closed channel list (「只」 kept) that already licensed the three cross-domain channels beside 红线 (c) revised only here. (a) re-affirmed, unchanged. The patch retires no line and touches none of the homes the first record opened; old line 175 is rewritten, not retired, and keeps 只 and all three names. The rest of (a), (c) and the rules-added findings stand as written in comment 6420514256, including the AGENTS.md 「triage files it」 sentence: contradicted by design, Tier H, said and not failed on. Ratchet and lint, read on the head tree. Line counts on ② Semver levelUnchanged by the patch: ③ Boundary flagsPatch-round os-dev-report 6420603205, each flag:
PR author Implemented-by: VERDICT: PASS |
席位核对 — ACCEPT ·
|
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 itscheck-skill-line-ratchetceiling, 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 onmainor 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 onmainbetween 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 inAGENTS.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 atlanding-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.mdlines 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 producesdomain:*" 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 charterreferences/lanes/skills.mdline 「本车道 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
references/landing-operations.mdreferences/execution-duties.mdreferences/triage-duties.mdSKILL.mdNew 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.mdold line 61 (受管路径全在.claude/**者 Tier S:席内达档复核过落地前检两条即转正式入队) →SKILL.md路径分叉 line 204 (受管面两层:Tier S =.claude/**全树 … S 经达档复核 PASS 后 ready → 入队) andreferences/contract-review.mdline 37 (落地前检两条,过则 Tier S 入队、Tier H 等人批), which this file's line 59 already points at.landing-operations.mdold line 62 (Tier H(其余受管面)者:四件套留 draft 等人批,⛔ 不翻正式不入队;获授权批准后认领席落地) →SKILL.md路径分叉 lines 186–189 and 197,references/lanes/skills.mdline 17 (Tier H 受管 PR 恒 draft 等维护者的字),references/contract-review.mdline 37. Line 60 of this file keeps the operational step (check-governed-merges.mjs --pr N:受管面照两层) and line 63 keeps ⛔ 两层不由席位批准.landing-operations.mdold 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.mdline 10, clause 预贴pm:queue视同无 →SKILL.mdline 171 (预贴标签只是建议,队列与级别只由分诊落笔). Clause 例外一的 sub-issue 承父卡首触 is kept, now beside the second exception.execution-duties.mdline 40, clause 带父卡域与优先级 → generalised to 各带域与级; the sub-issue's inheritance is stated at line 39 (优先级继承) andSKILL.mdline 170 (承父卡域).triage-duties.mdold line 78 (裁决恒归维护者人工:分诊只分析、推荐、入箱;⛔ 无代裁车道、置信门与auto-adjudicated) →SKILL.md红线 line 30 (⛔ 永不代维护者答产品或架构问题,⛔ 无代裁通道:席位只分析与推荐,裁决恒出自人工),SKILL.mdline 276 (⛔ 无代裁无自裁无子代理), this file's line 5 tail (⛔ 无代裁通道) andreferences/lanes/director.mdline 22 (⛔ 无裁决线程、代裁、置信门). A true duplicate of a 红线, which the rules-only rewrite convention already names as the class to retire.triage-duties.mdline 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 oforigin/main7111e14ainto the change commit6fb2d7eb); the full derived union was run after that merge.Local derived subset —
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackwith no paths (change set derived from git: 4 paths vs merge base7111e14a), 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).node scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-testnode scripts/check-comment-mask-corpus.mjsnode scripts/pm/check-governed-queue-guard.mjs --self-testnode scripts/pm/check-harness-current.mjs --self-testpnpm --filter @objectstack/lint run check:doc-formula-expressions@objectstack/formulaand@objectstack/lintnot built — "Nothing was measured"), then 0 afterpnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lintunder the verify lock (VERDICT command-exit 0 · held the lock 114s)pnpm check:agent-test-spellingpnpm check:cross-package-test-inputspnpm check:doc-authoringpnpm check:driver-memory-censuspnpm check:gitlink-declaredpnpm check:nul-bytespnpm check:pm-expected-skipspnpm check:pm-governed-mergespnpm check:pm-governed-prosepnpm check:pm-half-statespnpm check:pm-label-writepnpm check:pm-skill-id-lint✓ check-skill-id-lint: 104 file(s) clean (pattern /#[0-9]{3,}/g)pnpm check:pm-skill-ratchetSKILL.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 offenderpnpm check:refd-timer-probepnpm check:skill-frame-sync✓ 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-literalLocal-only family, not derived but owed because
SKILL.mdholds the four-axis frame:pnpm check:skill-frame-freshnessexit 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_progresshere, 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
SKILL.mdline 175 「接手无主阻塞项」 together withexecution-duties.mdline 45 (阻塞项无主 ⇒ 被挡席认领做掉) — a main-red blocks every lane's landing. The 红线 line 34 (执行席只在本车道认领) is not edited; the maintainer's ruling outranks it bySKILL.md's own 优先序. Named for the seat's review, not resolved here.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 分钟就修好了。
风险与代价(含回滚)
席位意见
(留空,席位定稿)
你要做的
一个动作:AGENTS.md「Two speeds」段里的「triage files it」一句是你亲手的 Tier H 文字,本 PR 没碰;要不要把它改成「the seat that sees it files it」,由你定。
Generated by Claude Code