Skip to content

Commit ded67bf

Browse files
pm-dispatch(triage): a round reads every main and queue red since the last record, answers pm:retriage on epics, and a lane holds a head with a Contract-review-hold: line that check-owed-reviews reads (#27468)
Fixes #27370 Clause-②: no Metadata-protocol: none ## 维护者速读 - 改了什么:分诊每轮改读「上份轮次记录 fire 以来」全部 main push、schedule 与合并队列结论,窗内无锚的红当轮立锚卡、按首触定级(主干全量红与确定性队列红 p0,flake 判确定性才升;main 已转绿也照立并点名承修卡),断档逾 90 分钟在记录里写明;`pm:epic` 卡上的 `pm:retriage` 即答;车道可落一行 `Contract-review-hold:` 暂缓本 head 送审,`check-owed-reviews.mjs` 读它:活的 hold 只挡 (b)、新 head 即清、逾 24 小时列进分诊轮次记录;triage-duties.md 新 L3 写回分诊职责边界(本文加技能他处点名分诊之条即全部职责)。 - 为什么改:10-28 分诊停了约 10 小时,回来第一轮只读最新一跑,两次 main 红没有锚卡;一张 epic 上问分诊的三个问题等了约 10 小时;车道用散文说「这个 head 先别审」,分诊按 (b) 认领后又撤回。现在主干红在断档里漏不掉,epic 的提问当轮有答,「先别审」是一行脚本读得懂的字,不再靠人重读散文。 - 风险与回滚:只改两份技能文本(行数不变:60/60、102/102)与两个只报不拦的脚本;不新增门禁、check-run、workflow 步骤或半状态行。回滚 = revert 本 PR。hold 按 head 读:写错格式的行什么都不挡、也不使已有的有效 hold 失效,并以 ⚠️ 列出;全部 hold 行都读不懂时才读作 unreadable。 - 先看:① `scripts/pm/check-owed-reviews.mjs` 的 `owedReviewRow`((b) 让位于活 hold 的两行与 `listed`);② `scripts/pm/record-recognisers.mjs` 的 `readContractReviewHold` / `contractReviewHold`(四段解析、按 head 读、24 小时只是读数);③ `references/contract-review.md` L29–31 与 `references/triage-duties.md` L3、L27–28、L61。 - 两分钟验证:`node scripts/pm/record-recognisers.mjs --self-test && node scripts/pm/check-owed-reviews.mjs --self-test`,预期尾行 `320 cases pass` 与 `63 cases pass in 9 batteries`。 - 需要你做的:无,席位落地(`.claude/**` 为 Tier S:分诊契约复核 PASS 6491338629 + delta PASS 6493363887 在案后入队)。另有一项待您裁(复核 should-fix 4,本 PR 未建):活 hold 只挡 (b),车道收班即触发 (c) 让分诊接手 —— A 在 contract-review.md L30 写明 (a)(c) 照触发,B 让未满 24 小时的 hold 也挡 (c)。 ## What changes Three rules, one line each in the file that owns it, and one reader of an existing list. No new gate, check-run, workflow step or half-state row. ### `.claude/skills/pm-dispatch/references/triage-duties.md` — 102 → 102 lines - **L3 (new, rework `168cb1e8`, triage should-fix 2):** 「本文与技能他处点名分诊之条(复审、摘 `pm:retriage`、约定③ 等)即分诊座位的全部职责。」 — the scope bound restored in its true closed-world form; paid by folding old L99 「需裁事项攒批(≤5 项/批,每项一行带推荐),一句同意即全链执行。」, whose home is `lanes/director.md` 〈职责二〉 L48 / L56 under SKILL.md L276 (this file's L99 keeps 「方向性授权覆盖整条执行链」). - **Item 1, L27–28 (new):** each round reads every `main` push, schedule and merge-queue conclusion since the previous round record's fire time, ⛔ not only the newest run; an unanchored red in that window gets an anchor in the round, graded as first touch grades it (L30: main full red and deterministic queue red p0, a flake anchor raised only once deterministic — rework `168cb1e8`, triage should-fix 1) — `main` green again still files it and names the card that carries the fix; a round with no record for over 90 minutes says so in its record. - **Item 2, L61 (in place, beside 「父单永不派发」):** a `pm:epic` card's `pm:retriage` is answered at once; parents are still never dispatched. - L10 (in place, bytes only): the review step names the hold line among what `check-owed-reviews.mjs` reads. ### `.claude/skills/pm-dispatch/references/contract-review.md` — 60 → 60 lines - **Item 3, L29–31 (new), beside the claim lines L26–28:** - L29: a lane deferring review of this head posts `Contract-review-hold: SESSION · head SHA · REASON · until CONDITION` (the template, verbatim in a code span; placeholders spelled in angle brackets in the file). - L30: a new head clears it; while it names the current head, gap rule (b) does not fire; once the condition is met the holding lane hangs `needs:contract-review` or posts a hand-off line. - L31: a hold over 24 hours with its condition unmet is listed in the triage round record (`check-owed-reviews.mjs` marks it). - L60 (in place, bytes only): no check, workflow or queue guard reads the hold line either. ### `scripts/pm/record-recognisers.mjs` — the recogniser, beside its siblings - `CONTRACT_REVIEW_HOLD_KEY` / `CONTRACT_REVIEW_HOLD_TEMPLATE` / `CONTRACT_REVIEW_HOLD_LIST_HOURS = 24`, built with the file's one `keyLineRegex` convention. - `readContractReviewHold(text)`: four facts split on the doorbell's dot — the session (the claim reader's session regex, not a second spelling), `head` 7–40 hex, a non-empty reason, `until` plus a non-empty condition. A missing fact, a fifth part, a reason that is itself the `until` clause, or a session of another shape is started-and-unreadable; the template copied unedited is unreadable. - `contractReviewHold(rows, headSha, { now })` (per head since rework `168cb1e8`, triage should-fix 3): the newest READABLE hold naming the current head (prefix either way) is `live` whatever is posted after it; a newer readable hold naming an earlier head does not clear it (only a new head clears); `stale` only when readable holds exist and none names the current head; `unreadable` only when every hold line is unreadable; `absent` when none. Every reading carries `unreadable[]` (comment id, stamp, quoted line), so a malformed line voids nothing and is never silent. Age is timed from the comment's `created_at`; at 24 hours `overdue: true`, which is a reading — the hold stays `live`. No stamp gives `overdue: null` (unknown), never `false`. - Additive: new exports only, no signature change; the hand-off and claim readers are untouched (pinned below). The `self-test-reads` declaration keeps its line 77, which the dispatch-gates census pins. ### `scripts/pm/check-owed-reviews.mjs` — the reader - Each row carries `hold` (`state`, `id`, `session`, `reason`, `until`, `at`, `ageMinutes`, `overdue`, `holds`, `listed`, `gaps`, `unreadable`); the row prints `⚠️ N unreadable hold line(s) (IDS)` beside a live or stale hold. - Trigger (b) yields to a live hold; (a) and (c) still fire — the holding lane ends its hold with (a), and a lane seat that is gone is (c). - Status stays one of four. A held head is `WAIT` (the lane's own), and the row prints the hold and the (b) it holds. - `listed` = a live hold that is overdue or cannot be timed, on a `WAIT` row. The row ends `⏳ HOLD 24 h old — list it in the triage round record`, and the report adds a block under the rows naming the PR, holder, post time, age and condition. ## Tests | Self-test | before (`c5d46341`) | after (`168cb1e8`) | |:--|:--|:--| | `node scripts/pm/record-recognisers.mjs --self-test` | 297 cases, floor 16 batteries | 320 cases (+23), floor 17 — new battery `the Contract-review-hold: line …` (23) | | `node scripts/pm/check-owed-reviews.mjs --self-test` | 49 cases in 8 batteries | 63 cases in 9 batteries (+14) — new battery `the hold: …` (14) | Pinned: - The recogniser's shape (decoration, lowercasing, the 7-hex floor, every refusal), the template verbatim in `contract-review.md` beside 「24 小时」, per head (only a new head clears; a newer readable hold on an earlier head does not clear a hold on this head; an unreadable line voids nothing and is listed), and prefix matching. - The 24-hour age as a reading: 23 h 59 min reads live and not overdue; 24 h reads live and overdue. - No gate reads it: a record beside a hold still reads FOUND, and the claim and hand-off readings are unchanged. - In the reader: the same row is TAKE (b) without a hold and WAIT with one. A stale or unreadable hold holds nothing. (a) and (c) still fire under a hold. HELD and DONE are unchanged. Listing works at 24 h, an unknown age is listed rather than dropped, and nothing is listed on DONE or HELD rows. `--json` carries the hold through the live reader, and the status vocabulary is pinned at exactly four. ## Acceptance notes - **Rework `168cb1e8`** (triage record 6491338629, should-fix 1–3, seat decision 6491385759): delta PASS 6493363887 by the same reviewer. Should-fix 4 (trigger (c) under a live hold) is not built; it is the maintainer's call, put in 维护者速读. - **Out of scope, noted:** `lanes/triage.md` L7 「每 fire 最旧优先」 vs `triage-duties.md` L24 「队列每轮清空时最新优先」 disagree when the queue clears every round; AGENTS.md 〈Multi-agent working discipline〉 still says the PR's assignee mirrors the card's at `pr_create` (Tier H, the maintainer's hand). - **Tier:** the card says 「Tier H (`.claude/**`)」. By AGENTS.md Prime Directive 14 and the register `GOVERNED_SURFACES` in `scripts/pm/check-governed-merges.mjs` (row `claude-tree`, `GOVERNED_TIER_S`), `.claude/**` is **Tier S**, and `scripts/pm/**` is off the register. The seat lands this after its own contract review. - **Folded clauses (lines paid by deletion, each restated where named):** - `triage-duties.md` old L3 「分诊席每次 fire 开局读本文;本文是分诊座位的全部职责。」 and its blank separator L4. Reader and scope are SKILL.md 〈阶段细则索引〉 L86 (「分诊席每次 fire 开局」 · 「分诊座位职责」). Rework `168cb1e8` restores the bound as new L3 in a true closed-world form (this file plus every clause of the skill that names triage), paid by folding old L99 (home: `lanes/director.md` L48 / L56 under SKILL.md L276). The original 「全部」 was not true of this file alone: triage duties also live in `contract-review.md`, `state-machine.md` L40 (answering `pm:retriage`, the duty item 2 is about) and `landing-operations.md` 约定③. Four other references (`filing-gate.md`, `seat-lifecycle.md`, `cross-repo-coordination.md`, `execution-duties.md`) already open without a header sentence. - `triage-duties.md` L60 「涉 cloud 整卡归 cloud 车道」, bytes only, paying item 2's clause. Restated by SKILL.md L165 (`domain:cloud`: 「涉 cloud 即整卡归 cloud PM」) and `cross-repo-coordination.md` L44 (same words), which triage reads before routing per SKILL.md L85. 「路由是分诊的技术判断」 → 「路由属分诊技术判断」 keeps the meaning. - `contract-review.md` old L30–31 → L33, dropping 「(申报面外三面加 ④)」. Restated by the same file's L39 (「④ 设计判断欠 schema、governed 规则文本、收窄三面」) and L41 (「余面同形无 ④」). - `contract-review.md` old L43, the isolated reviewer's scratch rule. `record-recognisers.mjs --brief-template` prints it in the brief's ⛔ READ-ONLY block, and that script's self-test pins it ("…and scopes scratch to the PR-named directory, reading nothing not written this round"). L44 makes that template the brief's starting point and forbids deleting its ⛔ lines. - `contract-review.md` old L48–49 → L49, dropping 「判据机读已提交树」. Restated by the same file's L17 (「面读 PR 已提交树的文件清单」) and `triage-duties.md` L11 (「纯重生成/只动散文面例外(判已提交树)」). The reader that decides it is `record-recognisers.mjs`, battery "a pure-regeneration head move KEEPS the record, decided on the COMMITTED trees". - **Item 2's home:** the sentence 「父单是协调节点」 does not exist on `origin/main` `c5d46341` (zero hits under `.claude/` and `scripts/pm/`). The nearest are `triage-duties.md` L60 「父单永不派发」 and `filing-gate.md` L16 「④ 协调节点」, so item 2 rides L60. L75's exception list governs the stale-premise re-check of in-flight cards (L73–75), not `pm:retriage` answers, which `state-machine.md` L40 governs. - **Item 3's 24-hour clause** lives in `contract-review.md` with the rest of the hold rule, not in `triage-duties.md`. Reason: the recogniser's self-test may read only the two governed files `GOVERNED_READ_FLOOR` already declares for it (`project-forms.md`, `contract-review.md`), and it pins the template and 「24 小时」 there. - **WAIT, not a fifth `HOLD` status (measured):** `git grep check-owed-reviews` finds no in-repo consumer of `--json`. In the file, a new status would touch `STATUS_ORDER`, the header counts, the row regex and the trigger condition, and `HOLD` sits one letter from `HELD`. A held head is the lane's own wait, so it stays WAIT, with the hold printed and listed. - **The hold's age is a reading, never a lapse:** whether a free-text condition is met is no reader's to judge. An overdue hold still holds (b) and is listed, so it cannot become a silent skip. ## Verification Every reading below is from head `167b0027`; the rework head `168cb1e8` re-ran the union with the same result (40 derived, 40 run, 0 NOT-MEASURED; `check:doc-formula-expressions` again exit 3 → prerequisite build → 0; `check:pm-dispatch-gates` 1935 cases), reported in the second os-dev-report on #27370. - `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths): 4 paths against merge base `c5d46341`, 40 commands. `--ran`: **exit 0 — 「40 derived, 40 run, 0 NOT-MEASURED, 0 UNRUN」**. All 40 exited 0. - Edited-script consumers outside the derived set: `post-stamped.mjs --self-test` (735 cases), `check-governed-queue-guard.mjs --self-test` (401, loads `record-recognisers.mjs` through its real lazy import) and `mailbox-open.mjs --self-test` (45) all exit 0. - Live, read-only: `node scripts/pm/check-owed-reviews.mjs` at 2026-10-29T06:37Z read 22 open PRs (17 draft) and listed 13 owing rows. Each prints `hold absent`, since no hold line exists yet. Exit 0, no `sweep INCOMPLETE`. - Line ratchet: `triage-duties.md` 102/102 and `contract-review.md` 60/60, headroom 0, every changed line ≤120 B (below). - Two readings from the earlier head `0c9c1c53`, both resolved before the final run: - `check:pm-dispatch-gates` failed 1 of 1935 cases. The declaration census pins `scripts/pm/record-recognisers.mjs:77 self-test-reads`, and my new header roster line had moved that declaration to `:78`. `167b0027` folds the roster entry into the existing hand-off/claim roster line, and the gate is green at 1935 cases. - `pnpm --filter @objectstack/lint run check:doc-formula-expressions` exited 3, a prerequisite refusal (`@objectstack/lint` and `@objectstack/formula` not built). I built them under the verify lock (`os-verify-lock: VERDICT command-exit 0`, turbo cache hits), and it exits 0 on the final run. - Not run locally, CI-owned: the repo-wide scans (`pnpm lint`, `Test Core`). `check:dev-prereqs` and `check:skill-frame-freshness` are not owed: the diff touches neither `packages/spec` nor the four-axis frame. <details><summary>The 40 derived commands and their exit codes (the run record fed to --ran)</summary> - `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/check-declaration-mirrors.mjs` — exit 0 - `node scripts/check-declaration-mirrors.mjs --self-test` — exit 0 - `node scripts/check-self-test-wired.mjs` — exit 0 - `node scripts/check-self-test-wired.mjs --self-test` — exit 0 - `node scripts/check-self-test-workflow-commands.mjs` — exit 0 - `node scripts/check-self-test-workflow-commands.mjs --self-test` — exit 0 - `node scripts/check-whole-set-label-write.mjs` — exit 0 - `node scripts/check-whole-set-label-write.mjs --self-test` — exit 0 - `node scripts/ci/plan-test-core-shards.mjs --self-test` — exit 0 - `node scripts/pm/bare-root-worklist.mjs --self-test` — exit 0 - `node scripts/pm/check-harness-current.mjs --self-test` — exit 0 - `pnpm --filter @objectstack/lint run check:doc-formula-expressions` — exit 0 - `pnpm check:agent-test-spelling` — exit 0 - `pnpm check:bash32-floor` — exit 0 - `pnpm check:ci-filter-parity` — exit 0 - `pnpm check:cli-command-ids` — 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:entry-guard` — exit 0 - `pnpm check:gitlink-declared` — exit 0 - `pnpm check:nul-bytes` — exit 0 - `pnpm check:parse-guard` — exit 0 - `pnpm check:pm-dispatch-gates` — exit 0 - `pnpm check:pm-governed-merges` — exit 0 - `pnpm check:pm-half-states` — exit 0 - `pnpm check:pm-label-write` — exit 0 - `pnpm check:pm-record-recognisers` — exit 0 - `pnpm check:pm-skill-id-lint` — exit 0 - `pnpm check:pm-skill-ratchet` — exit 0 - `pnpm check:pnpm-filter-targets` — exit 0 - `pnpm check:pnpm-flag-spellings` — exit 0 - `pnpm check:ratchet-remedy-authority` — exit 0 - `pnpm check:refd-timer-probe` — exit 0 - `pnpm check:scripts-symbol-anchors` — exit 0 - `pnpm check:skill-frame-sync` — exit 0 - `pnpm check:watch-hint-literal` — exit 0 </details> <details><summary>Every changed governed line, with its bytes as counted in the file (the hold template spelled with placeholders here)</summary> `.claude/skills/pm-dispatch/references/contract-review.md` + 113 B - 车道暂缓本 head 送审落 `Contract-review-hold: SESSION · head SHA · REASON · until CONDITION` + 111 B - 新 head 即清;点名现 head 时 (b) 不起;条件满足由持有车道挂等复核标记或落交接行。 + 96 B - 逾 24 小时条件未满的 hold 列入分诊轮次记录(`check-owed-reviews.mjs` 标出)。 - 111 B - 同形 = `## Contract review` 题头、head sha 独占码段、①②③ 逐项(申报面外三面加 ④)、 - 29 B 独立性对、PASS/FAIL。 + 111 B - 同形 = `## Contract review` 题头、head sha 独占码段、①②③ 逐项、独立性对、PASS/FAIL。 - 118 B - 隔离复核子代理暂存全写按所审 PR 命名的 `SCRATCHPAD/pr-N/`,⛔ 不读非本轮自写的暂存。 - 104 B - 例外:纯重生成或只动上列散文面的 head 后移原记录继续管;判据机读已提交树; - 35 B PR 落 `Regen-provenance:` 行。 + 112 B - 例外:纯重生成或只动上列散文面的 head 后移原记录继续管;PR 落 `Regen-provenance:` 行。 - 113 B - ⛔ 无 check、workflow 或队列守卫读标记与认领行;入队只认同形记录,标记有无不改判。 + 119 B - ⛔ 无 check、workflow 或队列守卫读标记与认领/hold 行;入队只认同形记录,标记有无不改判。 `.claude/skills/pm-dispatch/references/triage-duties.md` - 76 B 分诊席每次 fire 开局读本文;本文是分诊座位的全部职责。 - 0 B - 115 B - 复审:每轮先跑 `check-owed-reviews.mjs`(open PR 含 draft,读交接与认领行),欠审同轮认领后接。 + 119 B - 复审:每轮先跑 `check-owed-reviews.mjs`(open PR 含 draft,读交接/认领/hold 行),欠审同轮认领后接。 + 113 B - 每轮读上份轮次记录 fire 以来全部 main push、schedule 与队列结论,⛔ 不只读最新一跑。 + 119 B - 窗内无锚红当轮立锚卡、照首触定级,转绿照立并点名承修卡;逾 90 分钟无记录记明断档。 + 118 B - 本文与技能他处点名分诊之条(复审、摘 `pm:retriage`、约定③ 等)即分诊座位的全部职责。 - 87 B - 需裁事项攒批(≤5 项/批,每项一行带推荐),一句同意即全链执行。 - 119 B - 路由是分诊的技术判断,⛔ 不升级哪个仓的问题;涉 cloud 整卡归 cloud 车道;父单永不派发。 + 118 B - 路由属分诊技术判断,⛔ 不升级哪个仓的问题;父单永不派发,`pm:epic` 卡 `pm:retriage` 即答。 </details> --- _Generated by [Claude Code](https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent f57eddc commit ded67bf

4 files changed

Lines changed: 327 additions & 23 deletions

File tree

‎.claude/skills/pm-dispatch/references/contract-review.md‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@
2626
- 车道或分诊起审前读 PR:现 head 有记录或活认领 ⇒ ⛔ 不起;否则先落认领行,一 head 一行:
2727
- `Contract-review-claim: <session> · head <full sha> · <UTC>`
2828
- 认领随 head 移动或贴后 2 小时无记录失效;同 head 双认 ⇒ 车道胜,分诊回帖撤回、弃产出。
29+
- 车道暂缓本 head 送审落 `Contract-review-hold: <session> · head <sha> · <reason> · until <condition>`
30+
- 新 head 即清;点名现 head 时 (b) 不起;条件满足由持有车道挂等复核标记或落交接行。
31+
- 逾 24 小时条件未满的 hold 列入分诊轮次记录(`check-owed-reviews.mjs` 标出)。
2932
- 复核记录 = 一条评论落 PR 或卡,席内与子代理同形;散文、dev 自评、`os-dev-report` 恒不算。
30-
- 同形 = `## Contract review` 题头、head sha 独占码段、①②③ 逐项(申报面外三面加 ④)、
31-
独立性对、PASS/FAIL。
33+
- 同形 = `## Contract review` 题头、head sha 独占码段、①②③ 逐项、独立性对、PASS/FAIL。
3234
- 同形含首行 `Served-tier:`:值写该面所定档的常量名 `CONTRACT_REVIEW_TIER` 或 `TIER_DEFAULT`;
3335
无此行不成裁决;模板 `node scripts/pm/record-recognisers.mjs --template`,申报面加 `--face declaration`。
3436
- 同形带 `Local-runs:` 行:`none` 或 `probe — REASON` 具名唯一探针;有行必校,缺行旧记录不改判。
@@ -40,13 +42,11 @@
4042
- 实质 head 各欠一轮完整复核;只落发现的 commit 由同一复核者 delta 复核;无 must-fix 即止。
4143
- 另记作者:PR `user.login` 非 `objectstack-fleet[bot]` ⇒ ③ 注点名该 login(脱中继写),落地前读。
4244
- 简报从 `record-recognisers.mjs --brief-template` 起稿:只读条款与输入集内建,⛔ 不删 ⛔ 行。
43-
- 隔离复核子代理暂存全写按所审 PR 命名的 `<scratchpad>/pr-<n>/`,⛔ 不读非本轮自写的暂存。
4445
- 独立性对:`Implemented-by:`/`Reviewed-by:` 取值同见 `--template`;子代理记采纳它的席位。
4546
- ④ 恒由起草者之外的 agent 达档跑,起草已达档不免;喂入同上,⛔ 不喂起草者的结论。
4647
- 轮次报告设复审清单专节,与呈裁清单同为强制审计。
4748
- 请审/求批与落地前检两条,过则 Tier S 入队、Tier H 等人批:① 现 head 同形达档 PASS 在案。
48-
- 例外:纯重生成或只动上列散文面的 head 后移原记录继续管;判据机读已提交树;
49-
PR 落 `Regen-provenance:` 行。
49+
- 例外:纯重生成或只动上列散文面的 head 后移原记录继续管;PR 落 `Regen-provenance:` 行。
5050
- ② PR check 全绿,⛔ 非 required 子集;例外:merge-base 同签名的红不计、按设计而红见 SKILL.md。
5151
- 签名 = 失败步 + 首错行,读 base check runs 的 API ⛔ 不凭口述;主干红止血立单不变。
5252
- 落地时仍欠复核的 PR 在落地 head 复审,车道席或分诊按 (a)(b)(c) 接;FAIL ⛔ 不修已关 PR。
@@ -57,4 +57,4 @@
5757
- 只作等复核标记,⛔ 不是闸门;单载体 = PR,卡上副本在规则外、不是要求。
5858
- 挂:ACCEPT 时条款②任一肢命中而现 head 无同形 PASS 在案 ⇒ 派发席同笔挂于 PR。
5959
- 摘:现 head 同形 PASS 在案 ⇒ 写记录的席同笔摘;PR 合并或关闭 ⇒ 派发席摘;FAIL 不摘。
60-
- ⛔ 无 check、workflow 或队列守卫读标记与认领行;入队只认同形记录,标记有无不改判。
60+
- ⛔ 无 check、workflow 或队列守卫读标记与认领/hold 行;入队只认同形记录,标记有无不改判。

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
# 分诊座位职责
22

3-
分诊席每次 fire 开局读本文;本文是分诊座位的全部职责。
4-
3+
- 本文与技能他处点名分诊之条(复审、摘 `pm:retriage`、约定③ 等)即分诊座位的全部职责。
54
- fire 开局只按名加载互斥检查所需工具,`ToolSearch` 用 `select:`;判定本轮有活才加载其余。
65
- ⛔ 分诊 fresh session 开局不做泛关键词 ToolSearch;可验判据:空转轮 ~4 万 token 以内。
76
- 两级盘点:小时轮以 `since` 窗口读增量,锚 = 座位贴上一份收班简报的时间戳。
87
- 查重缓存住席内:新会话全量拉,其后 `since` 增量;⛔ 不建分支、不共享、不依赖备份。
98
- 每日一 fire 跑两仓全量对账并归集日频职责;选层按 fire 时刻 ⛔ 不用计数器,简报写明层。
109
- 每条枚举比对返回数与 `totalCount`,不等 ⇒ 报 `sweep INCOMPLETE` 点名缺口,⛔ 永不报干净。
11-
- 复审:每轮先跑 `check-owed-reviews.mjs`(open PR 含 draft,读交接与认领行),欠审同轮认领后接。
10+
- 复审:每轮先跑 `check-owed-reviews.mjs`(open PR 含 draft,读交接/认领/hold 行),欠审同轮认领后接。
1211
- 隔离子代理达档跑同形记录、署本席;本席也被配额拒 ⇒ PR 写一次留标,⛔ 永不降档审。
1312
- 每轮比对自审记录 `Head-sha` 与现 head,越过即过期,纯重生成/只动散文面例外(判已提交树)。
1413
- 自审 FAIL 过期 ⇒ 同轮达档重审新 head,逐条复查 must-fix,delta commit 当改动审。
@@ -25,6 +24,8 @@
2524
- 排序:队列每轮清空时最新优先;清不空的那一刻起改最老优先。
2625
- 裸卡数 >15 ⇒ 下一 fire 整轮改域分批集中模式,每批 ≤5 张同族卡,照样跑到清空。
2726
- 紧急卡直接分诊:维护者点名或 p0 嫌疑 ⇒ 立即起默认判断档分诊子代理,不等定时轮。
27+
- 每轮读上份轮次记录 fire 以来全部 main push、schedule 与队列结论,⛔ 不只读最新一跑。
28+
- 窗内无锚红当轮立锚卡、照首触定级,转绿照立并点名承修卡;逾 90 分钟无记录记明断档。
2829
- main-red 锚卡由席位先立先派,首触事后补作记录级:可改域,⛔ 不改动作,在飞照补。
2930
- 主干全量红与确定性队列红首触定 p0(锚卡、根因卡、full-run 卡);flake 锚卡判确定性才升。
3031
- 车道席自分诊:本车道卡挡自有在飞(认领卡/PR/落地/拆分链)且证据清楚,方可首触定 p1/p2。
@@ -57,7 +58,7 @@
5758
- 定义项取北极星「做出来的是什么」或仪器卡的车队决定;无则关;`none` 非分诊缺口。
5859
- 「无则关」= 首触即关 not_planned,带理由与入队三门,⛔ 不定 p3、不 hold;下行同此。
5960
- 所入车道队列 P0/P1 开着(= 未派发,在飞不算)时,三门皆无的 p2/p3 `tooling` 卡同样关。
60-
- 路由是分诊的技术判断,⛔ 不升级哪个仓的问题;涉 cloud 整卡归 cloud 车道;父单永不派发。
61+
- 路由属分诊技术判断,⛔ 不升级哪个仓的问题;父单永不派发,`pm:epic` 卡 `pm:retriage` 即答。
6162
- 算涉 cloud:亦含托管面(objectos-runtime)、`Blocked-by:` cloud 卡、病因在 cloud。
6263
- 不算涉 cloud:只在 cloud 测得而修复与验收全在本仓;仅引 cloud 卡作历史。
6364
- 父单已有子结构的:父单队列标签即可,分诊逐个展开路由、补 `Blocked-by:` 排序。
@@ -96,7 +97,6 @@
9697
- 轮次报告设呈裁清单专节(卡、推荐、所引权威),⛔ 无代裁清单、无追认表。
9798
- 回翻条款:实施中发现契约终究要动 ⇒ dev 停手,卡回决策箱,⛔ 永不静默重裁。
9899
- 请示纪律:方向性授权覆盖整条执行链一并做完,⛔ 不逐项回问。
99-
- 需裁事项攒批(≤5 项/批,每项一行带推荐),一句同意即全链执行。
100100
- 中间状态与限流/重试类运维细节只进座位贴和触发器,⛔ 不弹给维护者。
101101
- 汇报只在里程碑、真阻塞、被问到时。
102102
- 人工地板项(发版、天花板、契约扩大)仍需明确字句,但攒批不逐项弹。

0 commit comments

Comments
 (0)