Repository navigation
docs(pm-dispatch): triage-duties — a measured fleet-velocity cost is a third tooling entry door; the p2/p3 not_planned rule takes only a card with none of the three - #23482
Conversation
…a third tooling entry door; the p2/p3 close takes only a card with none of the three The tooling entry bar gains a third door beside Unblocks and a named published surface: a measured cost to the fleet's development speed (false red / false green on correct sources, repeated re-runs, review rounds lost to one cause), with the instance named on the card. The first-touch close carries the three doors, and the lane-P0/P1 close takes only a tooling card that has none of them. Paid by deleting the since-window restatement line, so the file stays at its ceiling. Claude-Session: https://claude.ai/code/session_013zGKMG1cRedVzWtqGGGZW9 Co-authored-by: Claude <noreply@anthropic.com>
…tooling card with none of the three entry doors
The execution seat's candidate query named the two doors the triage
entry bar had ("two lines"), so a card admitted through the third door
(a measured fleet-velocity cost) would reach pm:queue and still be
dropped from every seat's candidates. The query now names the same
three doors. In place, 12 B for 12 B; the file stays 183 lines.
Claude-Session: https://claude.ai/code/session_013zGKMG1cRedVzWtqGGGZW9
Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Reviewed in seat by the dispatching skills seat (served tier read from ① Derived judgments
② Semver levelNone owed: ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
席位核对 · PR #23482 at
|
Fixes #23478
Clause-②: no
The
toolingentry bar in.claude/skills/pm-dispatch/references/triage-duties.mdgains the third door the maintainer asked for: a measured cost to the fleet's development speed (a false red or a false green on correct sources, repeated re-runs, review rounds lost to one cause), with the instance named on the card. The lane-P0/P1not_plannedrule now takes only atoolingcard that has none of the three doors. The execution seats' candidate query inreferences/execution-duties.md:10names the same three doors, so a card admitted through the new door is one a seat can pick up (the seat's ruling A on the dev's open question, comment6168685565on the card, which amended the claim's file surface). Two files, text only;triage-duties.mdstill 120/120 lines,execution-duties.mdstill 183/183.Authority
Filing gate ③, the maintainer's direct order in the triage seat's session, 2026-10-14, verbatim and in order:
The rule is recorded on #6015 (comment
6167942500) and triage already applies it: #23470 was reopened at p2 (comment6167908930) and #23156 at p2 (comment6167924044). Both are the rule's live instances; this PR does not touch them. It puts the rule in the text every seat reads.Every touched line, before and after
Line numbers are
mainat1baf976cf9→ this head. The file is the same blob (4c7bbc5657) at the dispatch's reading9063727487, so the card's:33/:34/:61hold. Bytes areLC_ALL=C awk '{print length($0)}'.:11deleted (78 B), the payment, see below:「- 从不更新的卡不入窗;老化欠账归半状态巡查不归小时轮。」
:34→:33amended (106 → 117 B)tooling入pm:queue仅当首行带Unblocks: #N(open 产品卡)或点名所护的已发布面。」tooling入pm:queue仅凭三门之一:首行带Unblocks: #N(open 产品卡)或点名所护的已发布面;」:34added (113 B), the third door:「- 或实测拖慢车队开发:正确源上假红/假绿、反复重跑、同因丢复核轮;卡须具名实例。」
:60amended (112 → 109 B):61amended (113 → 110 B)tooling卡同样关。」tooling卡同样关。」Why each:
:33: 「仅当」 becomes 「仅凭三门之一:」, which names the count so:60and:61can say 「三门」. Its full stop becomes;so the sentence runs on into the new line, as:41→:42and:91→:92already do. Doors one and two are unchanged byte for byte, and 「首行带」 still governs both.:34: the third door. 「实测」 plus 「卡须具名实例」 is "measured, not asserted: the card names the instance", as tooling: check:type-check-debt's --re-measure runs a full workspace turbo build outside the shared verify lock, rewriting dist/ under a locked test run in the same tree (a false red) #23470 names its three re-runs. 「假红/假绿」 is the corpus's own spelling (reading-discipline.md:20,filing-gate.md:46-47,os-dev.md). No version number and no card number in it.:60was not among the three lines the card named. It is amended because it would read false otherwise: 「入队两条件」 are the two doors. The ruling that wrote the line calls them "the two reopen conditions from item 1": theUnblocks:line and the named surface. Left alone, it would hand everynot_plannedcard two ways back in while the bar has three. Same file, same mechanism.:61: 「无解锁对象的」 (noUnblocks:target) becomes 「三门皆无的」, so a card admitted through any door is not taken by it. Visible effect: it also stops taking a p2/p3 card admitted through door two (a named published surface) with noUnblocks:line, which the old wording did take. The card asks for exactly this: the rule applies "only [to] the cards that have none of the three doors". Shorter than before by 3 B.:32(「⛔ 工具/门禁修复不由此进」) is unchanged and still true. A tooling fix enterspm:queueonly through a door, never through the defect definition.The second commit:
execution-duties.md:10, in place:10amended (119 → 119 B; 「两行皆无」 → 「三门皆无」, 12 B for 12 B)needs-user-decision、无pm:retriage;⛔ 排除两行皆无的tooling卡。」needs-user-decision、无pm:retriage;⛔ 排除三门皆无的tooling卡。」Why: the query named the two doors the entry bar had, so a card admitted through the third door would reach
pm:queueand still be dropped from every seat's candidates.SKILL.md:113names this query as one of the label's three readers (候选查询排除). The seat ruled that the consumer line is this card's (comment6168685565: a rule that admits a card no seat can pick up does not do what the maintainer said) and amended the claim's file surface to this one line. No other line of the file moves; theCEILINGSrow is unchanged. This section and the line-budget row below were written by the seat: the dev's session ended on an API error after pushing commit89cd6cb98eand before it could patch this body or post its report.The payment:
:11restates:8:8reads 「两级盘点:小时轮以since窗口读增量,锚 = 座位贴上一份收班简报的时间戳。」 Asinceread returns only cards whoseupdated_atfalls inside the window. So a never-updated card is outside it (:11's first clause), and old debt is not the hourly round's (:11's second clause). Two lines already say where old debt does land::10, in this file (「每日一 fire 跑全仓全量对账」), anddispatch-runbook.md:17(「机械年龄告警在半状态巡查脚本」).dispatch-runbook.md:70-71spells thesinceread itself.Two other candidates were measured and not used:
:59(「清单项三态定级(…)与定级判据见references/filing-gate.md。」): its parenthetical restatesfiling-gate.md:43-45. But it is this file's only pointer to that file's 〈定级判据〉 section::40names only the 〈立卡门〉 contents, andreading-discipline.md:13names 〈读数判据〉. Deleting it would orphan the grading reader, so it is not a pure restatement.:56(thetypeno-backfill rule) is stated nowhere else.SKILL.md:118's 「⛔ 不回填存量」 is thearea:*row's, nottype's.No script anchors on
:11. Agit grepof its two clauses over the repo hits only this file. The scripts that nametriage-dutiesanchor elsewhere:label-write.mjspinsRECLAIM_AFTER_HOURS = 12(:83), andcheck-half-states.mjsquotes:10in prose. Both self-tests are green below.Line budget
triage-duties.md: 120 → 120 lines. Ceiling 120, headroom 0; theCEILINGSrow is unchanged.execution-duties.md: 183 → 183 lines, one line amended in place (119 → 119 B). Ceiling 183, headroom 0; theCEILINGSrow is unchanged.:33-:34and:60-:61; the deleted:11refunds 79 B.What does not change, and the text does not read otherwise
pm:queue(「仅凭」, as 「仅当」 was), never sufficient. A fix that adds a gate rule or axis still needs the maintainer's word (instrument-discipline.md:8).dispatch-gates.mjsfreeze (instrument-discipline.md:10).not_plannedat:62(ruling 208) is unconditional, and no door exempts a card from it.check-changeset-no-major.mjshas no LEVEL axis, so aClause-②: yesPR with apatchchangeset passes objectui CI #23239, finding(pm):dispatch-gates.mjsderives gates only for its own tree, so objectui-lane dispatches hand-derive their gate list, and this shift's list missed the CIType Checkpre-tsc battery #23240 or finding(pm):lanes/ui.mdlets the ui seat claim aSpec Main Shape Gatered onmainas a stop-bleed, while objectui's workflow header makes that reddomain:devx's main-red, so the two texts name different owners #23241; they stay as triage left them. pm-dispatch filing-gate: codify the maintainer's protocol-first grading rule — every metadata-protocol change, and every REST/data door narrowing, is p1 + target:v18 in every lane #23431 (the sibling grading rule infiling-gate.md) is not touched either.SKILL.md:113is untouched and still true. The row names the label's three readers (候选查询排除、首触即关、普查半态行), not the entry bar.Acceptance notes
execution-duties.md:10was raised by the dev's report as an open question (A: this PR, B: a separate card, C: leave it) and ruled A by the seat (comment6168685565); it is the second commit above, no longer an open item.scripts/pm/ensure-pm-labels.sh:278-297: two texts still describe two doors. One is thetoolinglabel's description, "enters pm:queue only with Unblocks: or a named surface", at the 100-character label cap. The other is the comment naming the half-state reader: "a tooling card open in pm:queue with neither line is a half-state".scripts/**is outside this surface.Gates
On the head
89cd6cb98ethe evidence is the farm's: the check-runs read by the seat at landing (Lint & Repo Gates, which runscheck:pm-skill-ratchetover both files,Lint · PM dispatch-gates,TypeScript Type CheckandGoverned Surface Queue Guardamong them). The local battery below ran at0c808f946e(the first commit); the second commit changed one line in place in a file the same ratchet and id-lint cover, and no local run was made on it — the dev's session ended before it could.Local, at
0c808f946eThe list comes from
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 19 commands. Each exit code was captured before any pipe.node scripts/check-closing-keyword-parity.mjs: exit 0node scripts/check-closing-keyword-parity.mjs --self-test: exit 0node scripts/check-comment-mask-corpus.mjs: exit 0node scripts/pm/check-harness-current.mjs --self-test: exit 0pnpm --filter @objectstack/lint run check:doc-formula-expressions: the first run exited 3 (PREREQUISITE NOT MET:@objectstack/formulaand@objectstack/lintwere not built, so nothing was measured). Both were built underos-verify-lock.sh(VERDICT command-exit 0), and the re-run exited 0.pnpm check:agent-test-spelling: exit 0pnpm check:cross-package-test-inputs: exit 0pnpm check:doc-authoring: exit 0pnpm check:driver-memory-census: exit 0pnpm check:gitlink-declared: exit 0pnpm check:nul-bytes: exit 0pnpm check:pm-governed-merges: exit 0pnpm check:pm-half-states: exit 0 (4916 self-test cases)pnpm check:pm-label-write: exit 0 (134 cases; theRECLAIM_AFTER_HOURStext pin holds)pnpm check:pm-skill-id-lint: exit 0 (87 files clean)pnpm check:pm-skill-ratchet: exit 0. It reportstriage-duties.md is 120 lines (ceiling 120; headroom 0).pnpm check:refd-timer-probe: exit 0pnpm check:skill-frame-sync: exit 0pnpm check:watch-hint-literal: exit 0The acceptance-named gates were also run individually:
pnpm -s check:pm-skill-ratchet: exit 0node scripts/pm/check-skill-line-ratchet.mjs --self-test: exit 0 (157 cases)pnpm check:pm-skill-id-lint: exit 0pnpm check:pm-governed-prose: exit 0Reconciliation:
dispatch-gates.mjs --ranreports "19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN" (exit 0). The control-byte self-scan of the file found no match.There was no ablation: the diff is prose, and no tested behaviour changed. The CI check-runs are for the seat to read on this head.
维护者速读(草稿)
改了什么:分诊规则里,工具卡(门禁、脚本、技能、席位协议)进开发队列,原来只有两扇门:写明它解锁哪张产品卡,或点名它保护哪个已发布面。现在加第三扇门:实测拖慢了车队开发,即正确的代码上误报红或误报绿、反复重跑、同一原因丢掉复核轮。卡上必须写出具体实例,不凭一句断言。另一条规则是「车道里有未派发的 P0/P1 时,p2/p3 工具卡一律关」,现在改为只关三扇门都没有的卡。
为什么改:您说「影响车队开发速度的问题也是问题」。按旧文本,23470 第一次分诊就被关了,23156 也一样。23470 是类型检查门禁在锁外重建,导致测试误报红;23156 是构建过文档的检出上,四个测试误报红。分诊席已按您的话把这两张重开;这次是把规则写进每个席位都读的文本。
风险与代价(含回滚):文件仍守 120 行上限,靠删一行重复表述付账。那行讲的是「since 窗口读不到从不更新的卡」,第 8 行与 dispatch-runbook 里已经说过。风险是进队的工具卡会多一些,所以第三扇门要求具名的实测实例。「新增门禁默认否」、dispatch-gates 冻结、只报告的仪器首触即关,三条都不变。执行席的候选查询(execution-duties.md 第 10 行)原来写「两行皆无的工具卡排除」,第三扇门进来的卡会被漏掉;席位裁定在同一 PR 里同步改为「三门皆无」(卡上评论 6168685565),第二个提交就是这一处。回滚:revert 这两个提交。
席位意见:
你要做的:不用动手。本 PR 只改
.claude/**两个文件,由席位达档复核后落地。Generated by Claude Code