Skip to content

Commit 394f65e

Browse files
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)
Fixes #23478 Clause-②: no The `tooling` entry bar in `.claude/skills/pm-dispatch/references/triage-duties.md` gains 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/P1 `not_planned` rule now takes only a `tooling` card that has none of the three doors. The execution seats' candidate query in `references/execution-duties.md:10` names 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, comment `6168685565` on the card, which amended the claim's file surface). Two files, text only; `triage-duties.md` still 120/120 lines, `execution-duties.md` still 183/183. ## Authority Filing gate ③, the maintainer's direct order in the triage seat's session, 2026-10-14, verbatim and in order: 1. 「23470 ,导致误报红,会耽误车队开发啊,影响车队开发速度 的问题也是问题。」 2. 「所以你的分诊规则是不是应该要立卡修改」 The rule is recorded on #6015 (comment `6167942500`) and triage already applies it: #23470 was reopened at p2 (comment `6167908930`) and #23156 at p2 (comment `6167924044`). 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 `main` at `1baf976cf9` → this head. The file is the same blob (`4c7bbc5657`) at the dispatch's reading `9063727487`, so the card's `:33`/`:34`/`:61` hold. Bytes are `LC_ALL=C awk '{print length($0)}'`. - `:11` **deleted** (78 B), the payment, see below: 「- 从不更新的卡不入窗;老化欠账归半状态巡查不归小时轮。」 - `:34` → `:33` **amended** (106 → 117 B) - before: 「- `tooling` 入 `pm:queue` 仅当首行带 `Unblocks: #N`(open 产品卡)或点名所护的已发布面。」 - after: 「- `tooling` 入 `pm:queue` 仅凭三门之一:首行带 `Unblocks: #N`(open 产品卡)或点名所护的已发布面;」 - `:34` **added** (113 B), the third door: 「- 或实测拖慢车队开发:正确源上假红/假绿、反复重跑、同因丢复核轮;卡须具名实例。」 - `:60` **amended** (112 → 109 B) - before: 「- 「无则关」= 首触即关 not_planned,带理由与入队两条件,⛔ 不定 p3、不 hold;下行同此。」 - after: 「- 「无则关」= 首触即关 not_planned,带理由与入队三门,⛔ 不定 p3、不 hold;下行同此。」 - `:61` **amended** (113 → 110 B) - before: 「- 所入车道队列 P0/P1 开着(= 未派发,在飞不算)时,无解锁对象的 p2/p3 `tooling` 卡同样关。」 - after: 「- 所入车道队列 P0/P1 开着(= 未派发,在飞不算)时,三门皆无的 p2/p3 `tooling` 卡同样关。」 Why each: - **`:33`**: 「仅当」 becomes 「仅凭三门之一:」, which names the count so `:60` and `:61` can say 「三门」. Its full stop becomes `;` so the sentence runs on into the new line, as `:41`→`:42` and `:91`→`:92` already do. Doors one and two are unchanged byte for byte, and 「首行带」 still governs both. - **New `:34`**: the third door. 「实测」 plus 「卡须具名实例」 is "measured, not asserted: the card names the instance", as #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. - **`:60`** was 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": the `Unblocks:` line and the named surface. Left alone, it would hand every `not_planned` card two ways back in while the bar has three. Same file, same mechanism. - **`:61`**: 「无解锁对象的」 (no `Unblocks:` 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 no `Unblocks:` 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 enters `pm:queue` only through a door, never through the defect definition. ## The second commit: `execution-duties.md:10`, in place - `:10` **amended** (119 → 119 B; 「两行皆无」 → 「三门皆无」, 12 B for 12 B) - before: 「- 候选 = open、未 assign、无 `needs-user-decision`、无 `pm:retriage`;⛔ 排除两行皆无的 `tooling` 卡。」 - after: 「- 候选 = open、未 assign、无 `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:queue` and still be dropped from every seat's candidates. `SKILL.md:113` names this query as one of the label's three readers (候选查询排除). The seat ruled that the consumer line is this card's (comment `6168685565`: 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; the `CEILINGS` row 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 commit `89cd6cb98e` and before it could patch this body or post its report. ## The payment: `:11` restates `:8` `:8` reads 「两级盘点:小时轮以 `since` 窗口读增量,锚 = 座位贴上一份收班简报的时间戳。」 A `since` read returns only cards whose `updated_at` falls 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 跑全仓全量对账」), and `dispatch-runbook.md:17` (「机械年龄告警在半状态巡查脚本」). `dispatch-runbook.md:70-71` spells the `since` read itself. Two other candidates were measured and not used: - `:59` (「清单项三态定级(…)与定级判据见 `references/filing-gate.md`。」): its parenthetical restates `filing-gate.md:43-45`. But it is this file's only pointer to that file's 〈定级判据〉 section: `:40` names only the 〈立卡门〉 contents, and `reading-discipline.md:13` names 〈读数判据〉. Deleting it would orphan the grading reader, so it is not a pure restatement. - `:56` (the `type` no-backfill rule) is stated nowhere else. `SKILL.md:118`'s 「⛔ 不回填存量」 is the `area:*` row's, not `type`'s. No script anchors on `:11`. A `git grep` of its two clauses over the repo hits only this file. The scripts that name `triage-duties` anchor elsewhere: `label-write.mjs` pins `RECLAIM_AFTER_HOURS = 12` (`:83`), and `check-half-states.mjs` quotes `:10` in prose. Both self-tests are green below. ## Line budget - `triage-duties.md`: 120 → 120 lines. Ceiling 120, headroom 0; the `CEILINGS` row is unchanged. - `execution-duties.md`: 183 → 183 lines, one line amended in place (119 → 119 B). Ceiling 183, headroom 0; the `CEILINGS` row is unchanged. - Bytes: 12,176 → 12,216 (+40). Every line is at most 120 B. - Section bytes: the door costs +119 B over `:33`-`:34` and `:60`-`:61`; the deleted `:11` refunds 79 B. ## What does not change, and the text does not read otherwise - 「新增门禁默认否」: a door is necessary for `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`). - The `dispatch-gates.mjs` freeze (`instrument-discipline.md:10`). - The report-only first-touch `not_planned` at `:62` (ruling 208) is unconditional, and no door exempts a card from it. - This PR does not address #23239, #23240 or #23241; they stay as triage left them. #23431 (the sibling grading rule in `filing-gate.md`) is not touched either. - `SKILL.md:113` is untouched and still true. The row names the label's three readers (候选查询排除、首触即关、普查半态行), not the entry bar. ## Acceptance notes 1. **`execution-duties.md:10`** was 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 (comment `6168685565`); it is the second commit above, no longer an open item. 2. Outside this card's surface, measured, and not touched — **`scripts/pm/ensure-pm-labels.sh:278-297`**: two texts still describe two doors. One is the `tooling` label'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 `89cd6cb98e` the evidence is the farm's: the check-runs read by the seat at landing (`Lint & Repo Gates`, which runs `check:pm-skill-ratchet` over both files, `Lint · PM dispatch-gates`, `TypeScript Type Check` and `Governed Surface Queue Guard` among them). The local battery below ran at `0c808f946e` (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 `0c808f946e` The 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 0 - `node scripts/check-closing-keyword-parity.mjs --self-test`: exit 0 - `node scripts/check-comment-mask-corpus.mjs`: exit 0 - `node scripts/pm/check-harness-current.mjs --self-test`: exit 0 - `pnpm --filter @objectstack/lint run check:doc-formula-expressions`: the first run exited 3 (`PREREQUISITE NOT MET`: `@objectstack/formula` and `@objectstack/lint` were not built, so nothing was measured). Both were built under `os-verify-lock.sh` (`VERDICT command-exit 0`), and the re-run exited 0. - `pnpm check:agent-test-spelling`: exit 0 - `pnpm check:cross-package-test-inputs`: exit 0 - `pnpm check:doc-authoring`: exit 0 - `pnpm check:driver-memory-census`: exit 0 - `pnpm check:gitlink-declared`: exit 0 - `pnpm check:nul-bytes`: exit 0 - `pnpm check:pm-governed-merges`: exit 0 - `pnpm check:pm-half-states`: exit 0 (4916 self-test cases) - `pnpm check:pm-label-write`: exit 0 (134 cases; the `RECLAIM_AFTER_HOURS` text pin holds) - `pnpm check:pm-skill-id-lint`: exit 0 (87 files clean) - `pnpm check:pm-skill-ratchet`: exit 0. It reports `triage-duties.md is 120 lines (ceiling 120; headroom 0)`. - `pnpm check:refd-timer-probe`: exit 0 - `pnpm check:skill-frame-sync`: exit 0 - `pnpm check:watch-hint-literal`: exit 0 The acceptance-named gates were also run individually: - `pnpm -s check:pm-skill-ratchet`: exit 0 - `node scripts/pm/check-skill-line-ratchet.mjs --self-test`: exit 0 (157 cases) - `pnpm check:pm-skill-id-lint`: exit 0 - `pnpm check:pm-governed-prose`: exit 0 Reconciliation: `dispatch-gates.mjs --ran` reports "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](https://claude.ai/code/session_013zGKMG1cRedVzWtqGGGZW9)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 650933e commit 394f65e

2 files changed

Lines changed: 5 additions & 5 deletions

File tree

‎.claude/skills/pm-dispatch/references/execution-duties.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
## 候选与批次
88

99
- 整车道一次读全,本地求交:`list_issues` 带 `labels: [domain:X]` + 最小字段拿回全车道 open 集。
10-
- 候选 = open、未 assign、无 `needs-user-decision`、无 `pm:retriage`;⛔ 排除两行皆无的 `tooling` 卡。
10+
- 候选 = open、未 assign、无 `needs-user-decision`、无 `pm:retriage`;⛔ 排除三门皆无的 `tooling` 卡。
1111
- 已排队父单的 open sub-issue 自动是候选,`pm:epic` 父单的子树除外。
1212
- 每张候选读全文 + 全部评论,写派发词前做决策复读:评论读到最后一页。
1313
- 维护者裁决逐字引入派发词裁决分区作约束,无则写明无裁决。

‎.claude/skills/pm-dispatch/references/triage-duties.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
- 两级盘点:小时轮以 `since` 窗口读增量,锚 = 座位贴上一份收班简报的时间戳。
99
- 查重缓存住席内:新会话全量拉,其后 `since` 增量;⛔ 不建分支、不共享、不依赖备份。
1010
- 每日一 fire 跑全仓全量对账并归集日频职责;选层按 fire 时刻 ⛔ 不用计数器,简报写明层。
11-
- 从不更新的卡不入窗;老化欠账归半状态巡查不归小时轮。
1211
- 每条枚举比对返回数与 `totalCount`,不等 ⇒ 报 `sweep INCOMPLETE` 点名缺口,⛔ 永不报干净。
1312
- Backlog sweep 是常设职责,每 fire 扫任一析取命中的卡。
1413
- 析取 ①:全裸(无 `pm:*`、无 `needs-user-decision`、无 `domain:*`)。
@@ -31,7 +30,8 @@
3130
- 裁定写方向、给六态之一。
3231
- 方向在 ADR/本卡裁决/不可重裁规则:贴 `check-prior-rulings.mjs` 的 `Prior rulings read:` 行,或不点。
3332
- `pm:queue` = 有具名落点或复现的具体缺陷,无可问之事;⛔ 工具/门禁修复不由此进。
34-
- `tooling` 入 `pm:queue` 仅当首行带 `Unblocks: #N`(open 产品卡)或点名所护的已发布面。
33+
- `tooling` 入 `pm:queue` 仅凭三门之一:首行带 `Unblocks: #N`(open 产品卡)或点名所护的已发布面;
34+
- 或实测拖慢车队开发:正确源上假红/假绿、反复重跑、同因丢复核轮;卡须具名实例。
3535
- `pm:queue` 也收恢复不变量的 finding、test-only pin,与实现未被裁错的说明书脱节(修文档)。
3636
- `needs-user-decision` = 设计卡、feature/契约形状提案、需要 appetite 的多周程序。
3737
- 碰迁移形状或删已发布能力也进决策箱;说明书脱节不进:有裁定出处才是 (b),否则改文档。
@@ -57,8 +57,8 @@
5757
- 定级按北极星「优先级」1–3 条;首行 `Path: <定义项> | <清单项 id/缺项> | P<路步> | none`。
5858
- 定义项取北极星「做出来的是什么」或仪器卡的车队决定;无则关;`none` 非分诊缺口。
5959
- 清单项三态定级(会 fail / 步骤够不到 / 无项断言)与定级判据见 `references/filing-gate.md`。
60-
- 「无则关」= 首触即关 not_planned,带理由与入队两条件,⛔ 不定 p3、不 hold;下行同此。
61-
- 所入车道队列 P0/P1 开着(= 未派发,在飞不算)时,无解锁对象的 p2/p3 `tooling` 卡同样关。
60+
- 「无则关」= 首触即关 not_planned,带理由与入队三门,⛔ 不定 p3、不 hold;下行同此。
61+
- 所入车道队列 P0/P1 开着(= 未派发,在飞不算)时,三门皆无的 p2/p3 `tooling` 卡同样关。
6262
- 只报告仪器(放宽 tell、半状态巡查)的修复卡首触即关 not_planned,引裁决 208;在途只有删除。
6363
- 路由是分诊的技术判断,⛔ 永不升级哪个仓的问题;父单是协调节点,永不派发。
6464
- 父单已有子结构的:父单队列标签即可,分诊逐个展开路由、补 `Blocked-by:` 排序。

0 commit comments

Comments
 (0)