Repository navigation
Commit 394f65e
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
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
| 10 | + | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
12 | 11 | | |
13 | 12 | | |
14 | 13 | | |
| |||
31 | 30 | | |
32 | 31 | | |
33 | 32 | | |
34 | | - | |
| 33 | + | |
| 34 | + | |
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
60 | | - | |
61 | | - | |
| 60 | + | |
| 61 | + | |
62 | 62 | | |
63 | 63 | | |
64 | 64 | | |
| |||
0 commit comments