Repository navigation
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
Conversation
… blocks its own in-flight work, in triage's format; triage reviews it each round triage-duties.md (102 -> 102): four new lines beside the main-red block — the trigger and both conditions, the evidence and record form, the Ruling-ref line with the three prohibitions, and triage's per-round review — paid by four deletions whose content has a home elsewhere (the fire-continuation line, the unowned-p0 stop-bleed line, the producer-first line, and the per-card-exemption line merged into the run-to-empty line). SKILL.md (319 -> 319): the two 域车道 lines that said only triage writes queue and level now name the lane self-triage exception and point at triage-duties.md; the 红线 at L34 is unchanged. Claude-Session: https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg Co-authored-by: Claude <noreply@anthropic.com>
|
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg Contract-review-claim: session_01QSeKYmhU5KEj1nukYhp1Tg · head f192e7d · 2026-10-28T16:55Z |
|
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg Contract reviewServed-tier: Claim line 6475239129 on this head (2026-10-28T16:58Z); no earlier record or claim on it. Read at 2026-10-28T16:58Z by the ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Implemented-by: VERDICT: PASS |
|
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg 维护者速读 — 席位终稿 · PR #27320 · head
|
Fixes #27061
Clause-②: no
Metadata-protocol: none
维护者速读
Ruling-ref:引你的原话,然后请分诊复审;分诊每轮逐条确认或改判,复审前席位的定级有效。SKILL.md里「队列与级别只由分诊落笔」的两行改为指向这个例外。.claude/skills/pm-dispatch/**),无代码、无门禁、无发布面;回滚 = revert 本 PR。付行的四条删行各有具名的家(下表),误删与否在那张表上可核。references/triage-duties.mdL30–33(新例外四行)与 L24(合并行);SKILL.mdL170–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。.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).SKILL.mdL68 「fire = 一次唤醒;fire 到达时上一轮未清空的接续处理,⛔ 不重开、不重排。」 and L93 「状态只经 GitHub 标签、assignee、正文行与pm:seat座位贴读写;循环须能从全新会话恢复。」landing-operations.md约定③)。」SKILL.mdL35 (红线, read in full by every seat) 「唯一例外:无主 p0 锚卡一轮即轮报、再一轮分诊只代派止血:每轮一张,复核非分诊。」 andlanding-operations.mdL82–84 (约定③, including 「分诊贴标准认领行」). All three landed together in commit 3af6022; this file's copy was the verbatim duplicate.lanes/server.mdL35 andlanes/hotcrm.mdL30 both state 「先问生产者在哪」 on the lane side;SKILL.mdL314Responsibility:first answerRuling-ref:引本例外裁决原话;⛔ 不改domain:*、不定 p0(归 main-red)、不碰人工地板。」Ruling-ref:line (the line-initial keydispatch-runbook.mdL78/L153 already defines), ⛔domain:*, ⛔ p0 (main-red, two lines up andSKILL.mdL35), ⛔ human floor (L79–85 of this file); "not blocking" and "outside the lane" are the contrapositive of L30's 本车道卡…方可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.domain:*只由分诊产出,两例外:sub-issue 承父卡域、main-red 锚卡;无标签的卡 ⛔ 不得认领。」domain:*、队列与级别只由分诊落笔;两例外:sub-issue 承父卡域、main-red 锚卡,免审计评论。」SKILL.mdL105 (open + 队列标签 + 无 assignee = 可派发),execution-duties.mdL7 (candidates are read withlabels: [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)triage-duties.md。」triage-duties.mdL22 (析取 ⑤ treatspm:queue/priority:*applied in the card's creation minute as untriaged, ⛔ 不凭 actor), L52 (type立单者可预填、分诊校正), and 「只由分诊落笔」 itselfTests
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
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 fromgit log -Son L32.lanes/skills.mdL22 「本车道 finding 同走分诊席首触,⛔ 不自分诊」,lanes/spec.mdL29 「findings 首触定级归分诊席,本席只供证据」,lanes/ui.mdL8 「⛔ 不产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.mdL11 「无分诊审计评论即非候选」 reads unchanged on purpose: a self-triage record in triage's format is that audit comment, which is also whySKILL.mdL171 keeps 「无分诊审计评论 ⛔ 不得认领」 beside the new exception.pnpm --filter @objectstack/lint run check:doc-formula-expressionsfirst answered PREREQUISITE NOT MET (exit 3:@objectstack/formulaand@objectstack/lintnot 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.origin/mainref moved during this run (a sibling's fetch); the derivation reads the merge base (d4427aedc) and the diff against the recorded BASEd4427aedis exactly the two files above.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:derived families — 22/22 run, every exit 0 (doc-formula after its prerequisite build)
pnpm check:pm-skill-ratchettriage-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-lint104 file(s) clean (pattern /#[0-9]{3,}/g)pnpm check:pm-governed-prose2 instruction surface(s) name all 13 registered governed surfacespnpm check:skill-frame-syncthe one declared copy of the decision frame is internally coherentpnpm check:pm-half-statesself-test: 5034 cases passpnpm check:nul-bytesscanned 22097 text file(s) … no raw ASCII control bytespnpm check:pm-governed-merges537 assertions … live: the real generator declared 9 output(s) and certified this treepnpm check:pm-expected-skips206 cases passpnpm check:pm-label-write136 cases pass across 11 batteriespnpm check:doc-authoring69 published skill files clean·19738 customer-facing string(s) … cleanpnpm check:cross-package-test-inputs31 package(s) read outside themselves, all declaredpnpm check:agent-test-spelling--self-test)pnpm check:gitlink-declared22199 index entries -- 0 gitlink(s)pnpm check:driver-memory-censusevery declaration is ledgered, every ledger entry is livepnpm check:refd-timer-probe18806 source file(s) sweptpnpm check:watch-hint-literal74 declaration(s) across 4 rostered name(s)pnpm --filter @objectstack/lint run check:doc-formula-expressionsPREREQUISITE NOT MET — @objectstack/formula is not built(nothing measured); after the lock-held build: exit 0node scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-test40 assertions, 5 mutations … driven to rednode scripts/check-comment-mask-corpus.mjs18816 files, 0 disagree, 0 unparseablenode scripts/pm/check-governed-queue-guard.mjs --self-test401 cases passnode scripts/pm/check-harness-current.mjs --self-testall 26 cases passed--ranreconciliation: 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-freshnessexit 0 (local-only family:HEAD is 1 commit(s) behind, but the frame itself is unchanged);pnpm check:pm-record-recognisersexit 0 (297 cases+check-owed-reviews 49 cases);pnpm check:pm-dispatch-gatesdetached undernohupas its header requires, verdict line✓ dispatch-gates self-test (fast tier): 1935 cases pass; 7 slow section(s) deferredwith noELIFECYCLEline 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 Gateson this PR; the seat reads those check-runs, they are not re-run here.Generated by Claude Code