Skip to content

Commit 5d0904c

Browse files
feat(pm): pm:awaiting-merge — a PR awaiting the maintainer's review and merge no longer shares needs-user-decision with decision cards (#30445)
Fixes #29745 Clause-②: no Metadata-protocol: none ## 维护者速读 - **改了什么**:新增 PR 专用标签 `pm:awaiting-merge`(等您审核并合并的 PR 挂它,永不挂 issue);`needs-user-decision` 只留给决策卡(issue)。SKILL.md 复核 ② 与状态表改读法;总监呈批、分诊轮次记录、轮次报告健康指标、车队总表都把「决策卡 N」与「待您审合 PR M」分开计。巡查 H48 与交接检查 `acceptedPullWait` 改读新标签。 - **为什么改**:您的裁决「同意 pm:awaiting-merge」(A):一个标签两种意思,决策箱计数把等您回一个字的卡和等您点合并的 PR 混在一起,呈批分不开。 - **风险与回滚**:不新增门禁、不改六态互斥。风险只在过渡期:本 PR 落地后,巡查 H48 会把仍挂旧标签的受管 PR(现有一张,见 Acceptance notes)报为「缺 `pm:awaiting-merge`」,席位换标即清。回滚 = revert 本 PR;GitHub 上的标签对象留着无害。 - **先看**:① `scripts/pm/check-half-states.mjs`:新常量 `GOVERNED_PR_AWAITING_MERGE_LABEL` 与 `DECISION_INBOX_LABEL`,及 H48 读标签的 hunk(唯一改行为的 hunk);② `.claude/skills/pm-dispatch/SKILL.md`:复核 ② 行与状态表 `needs-user-decision` 行;③ `scripts/pm/ensure-pm-labels.sh`:新标签行与改写的 `needs-user-decision` 描述。 - **两分钟验证**:`node scripts/pm/fleet-roster.mjs --self-test`,预期末行 `✓ fleet-roster self-test: 115 cases in 9 batteries pass.`;再 `pnpm check:pm-skill-ratchet`,预期 SKILL.md 仍 319 行、五个 references 行数不变。 - **需要你做的**:无,席位落地(落地时席位跑 `bash scripts/pm/ensure-pm-labels.sh --reconcile` 建标签,并给仍挂旧标签的 PR 换标)。 ## What changes The maintainer's ruling on the card (verbatim: 「同意 pm:awaiting-merge」, option A). One label, two inboxes: a PR that waits on the maintainer's own review and merge used to carry `needs-user-decision`, the same label as a decision card, so the decision count mixed "a letter owed" with "a review and a click owed". 1. **The label** — `scripts/pm/ensure-pm-labels.sh` gains `pm:awaiting-merge` ("PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue", in the per-repo loop, 100-char cap respected) with its named readers in the comment. `needs-user-decision`'s description now says "decision cards only, never on a PR". Kept as is: `pm:awaiting-maintainer` (an issue, a human act outside GitHub). No new gate. 2. **SKILL.md** (net 0 lines, every edited line ≤120 bytes): 复核 ② now says 「同笔挂 `pm:awaiting-merge`」; the next clause says it is PR-only and outside the six states; the state-table row says `needs-user-decision` = decision cards (issues) only, never a PR; the preamble names the maintainer's three entry points. 3. **Readers** list the two inboxes apart — 「决策卡 N」 and 「待您审合 PR M」: - `references/lanes/director.md` (the director's batch and daily digest), `references/triage-duties.md` (triage round records; `needs-user-decision` = issues only), `references/seat-lifecycle.md` (the round report's health metric), `references/state-machine.md` (the six states are all issue states). Each reference that grew a line paid for it inside the same file by deleting a duplicated line (details under Acceptance notes); the others were rewritten in place. - `scripts/pm/check-half-states.mjs`: H48 (a governed PR with an ACCEPT verdict must carry the label) now reads `GOVERNED_PR_AWAITING_MERGE_LABEL` = `pm:awaiting-merge`. The card readers that had been reusing the PR constant (H52, H62, H73, the ④ dependents index and its renderer) read `DECISION_INBOX_LABEL` = `needs-user-decision`. Pinned: the old shape (`needs-user-decision` on a PR) no longer satisfies H48's label half; the new label is not one of `PM_EXCLUSIVE_STATE_LABELS`. - `scripts/pm/check-handover.mjs`: `acceptedPullWait` reads the new label on the stay-behind pull; pinned that the old shape is no longer a wait. - `scripts/pm/fleet-roster.mjs`: a new "awaiting merge" column (pulls carrying the label that close an in-flight card of the seat, attributed like "awaiting landing"; no new read — labels ride on the open-pulls listing) and an inbox line under the table: 「决策卡 N · 待您审合 PR M」, counted apart and never summed. `--json` carries the same `inboxes` totals. Fixture: pull 25427 carries the label. - The 终局四件套 prose in `dispatch-gates.mjs`, `check-governed-merges.mjs` and `check-governed-queue-guard.mjs` names the new label on the PR. 4. **The open PRs in the old shape** — ruling item 4 named PR #29698, which merged on 2026-11-03 (moot). The search `org:objectstack-ai is:pr is:open label:needs-user-decision` at dispatch time returned four: objectstack#30263 (the ADR-0148 docs PR) and three outside the label loop (duly#157, duly#142, www.objectos.ai#327). Relabelling is a label write and belongs to the landing seat, not to this PR's write budget. ## Tests Self-tests of every touched script, run on the final head (readings under Verification): - `node scripts/pm/fleet-roster.mjs --self-test` — 115 cases in 9 batteries pass (110 on `origin/main`; 5 new: the column, the retired shape counts nowhere, `inboxTotals`, the inbox line, no inbox line without totals; the import pin now also asserts no second spelling of the label). - `node scripts/pm/check-handover.mjs --self-test` — 67 cases pass (66 on `origin/main`; 1 new: the retired shape is no longer a wait). - `pnpm check:pm-half-states` (`check-half-states.mjs --self-test`) — 5224 cases pass (2 new: the old shape no longer satisfies H48's label half; the PR constant is `pm:awaiting-merge` and not one of the six card states), with H48's existing cases re-pinned on the new label. - `pnpm check:pm-label-desc-cap` — 45 descriptions ≤100 chars (longest 100, the pre-existing `tooling`). - `pnpm check:pm-skill-ratchet` — SKILL.md 319/319, state-machine 41/41, triage-duties 100/100, seat-lifecycle 98/98, director 86/86; no edited line over 120 bytes. - `pnpm check:pm-skill-id-lint`, `pnpm check:skill-frame-sync` — green. No ablation: the behaviour change is label-name plumbing pinned by the self-tests above; nothing under `packages/*` moved. ## Acceptance notes - **Paying the line ratchets** (every ceilinged file at headroom 0; the currency is deleted content, never a re-wrap): - `lanes/director.md`: +1 line (待您审合箱 and the two-count rule) paid by deleting 「本席任何形态都纯召唤制,⛔ 无任何 routine;分诊席默认同项目召唤,职责见 `triage.md`」 — its first half repeats line 7 (「授权面 = 人工召唤 … 直连 ⛔ 无 Routine/cron」), its second half repeats `lanes/triage.md` line 4 (「由维护者一句召唤到任一项目,默认同总监席项目」). - `triage-duties.md`: +1 line (round records split the two counts) paid by deleting 「Backlog sweep 是常设职责,每 fire 扫任一析取命中的卡」, which line 19 (「首触定级与五析取 sweep 每 fire 跑到清空 …」) subsumes. - `seat-lifecycle.md`, `state-machine.md`, `SKILL.md`: rewritten in place, net 0. - **The GitHub label object is not created by this PR**: no relay op creates labels, so creation stays a landing step — `bash scripts/pm/ensure-pm-labels.sh --reconcile` on the loop's repos, which also rewrites `needs-user-decision`'s live description (the create-only default would leave the old text). `pm:awaiting-merge` answered 404 on this repo at dispatch time. - **Carrier: the landing seat** — relabel objectstack#30263 (`needs-user-decision` → `pm:awaiting-merge`); the three PRs in `duly` and `www.objectos.ai` sit in repos outside `ensure-pm-labels.sh`'s loop, so their shape is a seat decision, noted and not filed. - **Boundary, not filed** (ruling: no new gate): nothing patrols `pm:awaiting-merge` on an ISSUE, and `label-write.mjs` cannot tell an issue from a PR without a read; the rule lives in SKILL.md and the label's description. - **Untouched on purpose**: `board-snapshot.mjs`, `references/landing-operations.md`, `references/contract-review.md` (named as clues) do not read the label; `fleet-roster.mjs`'s "awaiting ruling" already excluded pulls; the six-state mutex and `PM_EXCLUSIVE_STATE_LABELS` are unchanged. - **skip-changeset**: `.claude/**` and `scripts/pm/**` publish nothing from any released package. ## Verification Final head `0cf500af` (every reading below was taken on this tree; base `fdd06415` on `origin/main`). No package is touched, so no ① dependency-closure build and no ② package test is owed; `test:repo` and the farm-wide scans are CI's. **Derived families.** `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 63 commands from the 13 changed files. Every one ran in the worktree with its exit code captured before any pipe (`bash -c CMD >> log 2>&1; EXIT=$?`). Reconciliation, `dispatch-gates --ran` over the recorded `command :: exit code` lines: 「63 derived famil(ies) accounted for — 63 run, 0 NOT-MEASURED (a DERIVED zero — all 63 recorded an exit code and none of them is 3)」. - One command, `pnpm --filter @objectstack/lint run check:doc-formula-expressions`, first exited 3 — PREREQUISITE NOT MET (`@objectstack/formula` and `@objectstack/lint` unbuilt; by the gate's own text「Nothing was measured … NOT a finding」). After `pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint` under `os-verify-lock.sh` (VERDICT command-exit 0 · held the lock 2s · waited 0s) it exits 0; the reconciliation above is the post-rerun one. - Local-only families (`check:dev-prereqs`, `check:skill-frame-freshness`) are not named by the derivation: neither `packages/spec` nor the four-axis frame files moved. - CI: the same families run in `Lint & Repo Gates`; the report comment cites the PR's check-runs by name once they exist, not a local re-run. <details><summary>63 commands, all exit 0 at head 0cf500a (summary line of each, where the gate prints one)</summary> ```text exit 0 node scripts/check-closing-keyword-parity.mjs exit 0 node scripts/check-closing-keyword-parity.mjs --self-test 40 assertions, 5 mutations each driven to red exit 0 node scripts/check-comment-mask-corpus.mjs 20780 files, 0 disagree, 0 unparseable exit 0 node scripts/check-declaration-mirrors.mjs exit 0 node scripts/check-declaration-mirrors.mjs --self-test 29 cases exit 0 node scripts/check-issue-citations.mjs exit 0 node scripts/check-platform-checklist-watchdog.mjs exit 0 node scripts/check-platform-checklist-watchdog.mjs --self-test exit 0 node scripts/check-release-section-coverage.mjs exit 0 node scripts/check-release-section-coverage.mjs --strict exit 0 node scripts/check-self-test-wired.mjs 249 scripts CI runs, every self-test wired 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-skills-token-ratchet.mjs 57 authored bundle files within ceilings exit 0 node scripts/check-skills-token-ratchet.mjs --self-test 97 cases exit 0 node scripts/check-whole-set-label-write.mjs exit 0 node scripts/check-whole-set-label-write.mjs --self-test 24 fixture trees + 5 refusals + 1 hatch exit 0 node scripts/ci/plan-test-core-shards.mjs --self-test 23 cases exit 0 node scripts/ci/scheduled-full-run.mjs --self-test exit 0 node scripts/pm/bare-root-worklist.mjs --self-test exit 0 node scripts/pm/board-snapshot.mjs --self-test 200 cases across 14 batteries exit 0 node scripts/pm/check-governed-queue-guard.mjs --self-test 403 cases exit 0 node scripts/pm/check-harness-current.mjs --self-test 26 cases exit 0 node scripts/pm/sweep-closed-cards.mjs --self-test 87 cases across 9 batteries exit 0 node scripts/render-release-coverage-anchor.mjs --self-test 17 assertions exit 0 pnpm --filter @objectstack/lint run check:doc-formula-expressions (exit 3 PREREQUISITE before the build, 0 after) exit 0 pnpm check:agent-test-spelling 0 violations, 661 files exit 0 pnpm check:bash32-floor 31 shell files exit 0 pnpm check:ci-filter-parity 139 assertions exit 0 pnpm check:cli-command-ids 89 modules exit 0 pnpm check:closing-target-claim 121 cases exit 0 pnpm check:commit-card-trailers 81 cases exit 0 pnpm check:cross-package-test-inputs 261 cases exit 0 pnpm check:declared-population-live 251 of 312 families reach the tree exit 0 pnpm check:doc-authoring baseline held, 125895 strings read exit 0 pnpm check:driver-memory-census exit 0 pnpm check:entry-guard 294 scripts files exit 0 pnpm check:gitlink-declared 36 assertions exit 0 pnpm check:issue-citations exit 0 pnpm check:nul-bytes 75 assertions exit 0 pnpm check:parse-guard 293 scripts files exit 0 pnpm check:partof-closing-keyword 45 cases exit 0 pnpm check:platform-checklist 265 assertions exit 0 pnpm check:pm-dispatch-gates 1945 cases (fast tier), 7 slow sections deferred exit 0 pnpm check:pm-expected-skips 206 cases exit 0 pnpm check:pm-governed-merges 537 assertions exit 0 pnpm check:pm-governed-prose 2 surfaces name all 13 governed surfaces exit 0 pnpm check:pm-half-states 5224 cases exit 0 pnpm check:pm-label-desc-cap 45 descriptions, all ≤100 (longest 100, tooling) exit 0 pnpm check:pm-label-write 136 cases across 11 batteries exit 0 pnpm check:pm-post-stamped 753 cases across 26 batteries exit 0 pnpm check:pm-record-recognisers (also runs fleet-roster: 115 cases in 9 batteries) exit 0 pnpm check:pm-skill-id-lint 110 files clean exit 0 pnpm check:pm-skill-ratchet every ceiling held; cross-file moves: 3 exit 0 pnpm check:pnpm-filter-targets 212/284 filter occurrences resolve exit 0 pnpm check:pnpm-flag-spellings 645 files exit 0 pnpm check:ratchet-remedy-authority exit 0 pnpm check:refd-timer-probe 11 cases exit 0 pnpm check:scripts-symbol-anchors exit 0 pnpm check:single-claim-paths 93 cases exit 0 pnpm check:skill-frame-sync the one declared frame copy is coherent exit 0 pnpm check:watch-hint-literal 76 declarations across 4 rostered names ``` </details> --- _Generated by [Claude Code](https://claude.ai/code/session_012MmDsR4AZoJZyzKQcBEESh)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent ede9e6b commit 5d0904c

13 files changed

Lines changed: 163 additions & 85 deletions

‎.claude/skills/pm-dispatch/SKILL.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ metadata:
1717

1818
你是 PM 座位。PM 永不写代码,代码全由 `os-dev` 开发 agent 完成,一单一 agent 一 worktree。
1919
PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报告 → 下一批。
20-
维护者只在两点进入循环:轮次报告,与 `needs-user-decision` 决策卡。
20+
维护者只在三点进入循环:轮次报告,`needs-user-decision` 决策卡,`pm:awaiting-merge` PR。
2121

2222
## 红线
2323

@@ -104,7 +104,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
104104
| open + 队列标签 + 无 assignee | 可派发(同卡带 `pm:retriage` 的除外);`pm:queue` 卡恒无 assignee,有即半态 |
105105
| assignee 已设 | 已认领/在飞,不是你的就永不碰;离手恒走释放 —— 三因 = 改路由(限未派发)、前提证伪、弃飞无接管,去向 = 新标签态或车道;在飞卡跟到 MERGED,⛔ 不静默摘 assignee |
106106
| `pm:dispatched` | 已派发(派发评论记轮次),恒带 assignee;与摘 `pm:queue` 同一次标签写入成对落地 |
107-
| `needs-user-decision` | 决定待做:永不派发、永不代答;维护者的收件箱,只由人工裁 |
107+
| `needs-user-decision` | 决定待做:永不派发、永不代答;维护者的决策收件箱,只挂决策卡(issue)、⛔ 永不挂 PR,只由人工裁 |
108108
| `pm:on-hold` | 决定已做且答案是暂不做:不派发不催;仅当带机器可读 `Restart-when:` 行才合法 |
109109
| `pm:blocked` + 正文行 `Blocked-by: #N` | 等上游:选择期跳过,#N 关单(PR 则合并,关而未合并不放)时由解锁扫描或 `scheduled-full-run-card.yml` 放回;工已完而被门禁卡住的同用本态;双通道行首 `Blocked-by:` 指向无 `Ruled:` 的 open `needs-user-decision` 卡 ⇒ ⛔ 不派发,直至其 `Ruled:` |
110110
| `pm:awaiting-maintainer` | 决定已做,只剩一次 GitHub 之外的人工动作:不派发不催;与其它 pm 状态标签互斥;入态恒带行首 `Maintainer-action:` 行(细则见 `references/state-machine.md`),无行即半态 |
@@ -186,12 +186,12 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
186186
- 路径面命中 Tier H ⇒ ACCEPT 换终局四件套,混合 diff ⛔ 不按比例判;要拆让 dev 单独开 PR。
187187
- 改动 >3000 行(含生成物)同换终局四件套含③请审,⛔ 无 Tier S 例外;读数=PR additions+deletions。
188188
- ① 席位记录落 PR 先于 `pr_ready`/入队且钉 head:速读六行+席位意见,其下 `## 席位核对`。
189-
- ② PR 悬着等人批,同笔挂 `needs-user-decision`;人工直合即审核记录,授权批准 ⇒ 席位落地。
189+
- ② PR 悬着等人批,同笔挂 `pm:awaiting-merge`;人工直合即审核记录,授权批准 ⇒ 席位落地。
190190
- 指针 `ACCEPT → PR #n comment <id>`;受管/spec 面欠完整复核 ①–④,席未达档起隔离达档复核。
191191
- 核对六项:形态/前提实测/门禁 check-runs/接受的偏差/范围外去向+`Skills-docs:`/落地条款。
192192
- 草稿归 dev:PR 正文带 `## 维护者速读` 六行(见 os-dev.md),中文、业务角度,不写席位意见。
193193
- 终稿 = 席位对照自己读的 diff 校正六行、加席位意见行,置顶席位记录;维护者只读评论。
194-
- PR 上的标签 = 待维护者审阅,不入六态;与请审同为等人批清单,随获批或撤回判决离开。
194+
- `pm:awaiting-merge` 只挂 PR、不入六态,与请审同为等人批清单,随获批或撤回判决离开。
195195
- 批准判定单源 = 队列守卫常量 `GOVERNED_APPROVERS`:授权账户 APPROVED 即算,⛔ 不卡 `commit_id`。
196196
- 批准后再推亦不过期;席位落地 = 过落地前检、清标、ready、auto-merge,踢出/变基同法。
197197
- ③ 请审 = 席位交棒:ACCEPT 与现 head 同形 PASS 俱在案,同轮中继 `pr_request_reviewers` 请审批人。

‎.claude/skills/pm-dispatch/references/lanes/director.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
- 改 skill、指令或治理文本归 skills 席;出裁决、清复审标、清点待人工清单归本席。
2323
- 项目内卡线程报 `needs_decision` ⇒ 席位写四维分析加推荐,并入决裁批次呈维护者人工裁。
2424
- 维护者令「必须人工决裁」撤销「有把握自己决定」;⛔ 无裁决线程、代裁、置信门。
25-
- 本席任何形态都纯召唤制,⛔ 无任何 routine;分诊席默认同项目召唤,职责见 `triage.md`。
2625
- 应用仓召唤本席复核卡的业务理由首触,三出口同分诊;没把握 ⇒ 报该应用的总监(人)裁。
2726

2827
## 基本原则
@@ -51,7 +50,8 @@
5150
- 入批前评论卡,首行 `Brief-claimed-by: session_<id> · batch #<n> · <UTC>`;只认会话 id,⛔ 不认账号。
5251
- 他会话该行未满 24h 即跳过,不呈不裁不改标;逾 24h 无 `Ruling:` 失效可再写;录裁/关卡即释。
5352
- 判据:开场标记→首批 ≤ 读五张;录裁只录维护者回字,⛔ 不自录、不自转工作态。
54-
- 决策收件箱 = 全部仓的 `needs-user-decision`,卡留立卡仓;⛔ 不复活已退役的汇总 issue。
53+
- 决策收件箱 = 全部仓的 `needs-user-decision` 卡,留立卡仓;⛔ 不复活已退役的汇总 issue。
54+
- 待您审合箱 = 全部仓 `pm:awaiting-merge` PR;呈批与摘要分写「决策卡 N」「待您审合 PR M」。
5555
- 入箱勤务:校验/补全四棱块、速读与 `Prior rulings on this card:` 行;入箱同笔现读前提。
5656
- 线程有 `Ruling:`/RULED 的卡再入箱,该行逐 id 各一句变化;缺行 ⇒ 拒入,`pm:retriage` 回立卡者。
5757
- 一次只开一批:维护者对批 N 回字(一字即可)后,新到才合成批 N+1;续批至清零才收工。

‎.claude/skills/pm-dispatch/references/seat-lifecycle.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@
7171
- 与产品提交占比:已合提交不触 `.claude/` `AGENTS.md` `scripts/pm` 门禁脚本 `.github/workflows` 者。
7272
- 产品提交占比连续多轮偏低 ⇒ 席位报维护者。
7373
- 报告含 `UNRECOGNISED` 行:对本轮门禁日志 grep `UNRECOGNISED` 逐行照录,`NOT APPLICABLE` 行也在内。
74-
- 健康指标五个:可派发库存(open `pm:queue` 未认领及趋势);决策箱(待维护者数)。
75-
- 决策箱指标还要点名带开放下游依赖的决策卡,从 `Blocked-by:` 反向索引现算。
74+
- 健康指标五个:可派发库存(open `pm:queue` 未认领及趋势);决策箱:决策卡 N·待您审合 PR M。
75+
- 两数 ⛔ 不合计;决策卡还要点名带开放下游依赖者,从 `Blocked-by:` 反向索引现算。
7676
- finding 数与中位年龄:裸标签数即未定级数,hold 已换标不在内。
7777
- 裸卡数与中位年龄:sweep 析取①,未定级数另计析取④;老化 = 首触欠账。
7878
- 发版阻塞 = 三仓 `target:<major>` 之和,归零 = 三张板都空;总 open 数刻意不在指标内。

‎.claude/skills/pm-dispatch/references/state-machine.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
## 跨状态通则
66

7-
- 六态 = `pm:{queue,dispatched,blocked,on-hold,awaiting-maintainer}` 加 `needs-user-decision`。
7+
- 六态 = `pm:{queue,dispatched,blocked,on-hold,awaiting-maintainer}` 加 `needs-user-decision`,皆 issue 态。
88
- 六态 ONE-OF 的成因恒是半写的转换;判定以 `check-half-states.mjs` 的 H29/H30 为权威。
99
- 生成物不分叉:`skills/**` 生成器产物跑 `check-governed-merges.mjs --test`,⛔ 不按路径手判。
1010
- 交接即标签:只写交接评论而不同笔挂标 = 空交接,收件箱只认标签。

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
- 每日一 fire 跑两仓全量对账并归集日频职责;选层按 fire 时刻 ⛔ 不用计数器,简报写明层。
99
- 每条枚举比对返回数与 `totalCount`,不等 ⇒ 报 `sweep INCOMPLETE` 点名缺口,⛔ 永不报干净。
1010
- 轮次记录按车道计欠审逾一轮的 head 数并点名车道(`check-owed-reviews.mjs`),只报 ⛔ 不接审。
11+
- 轮次记录分写「决策卡 N」与「待您审合 PR M」,不合计;后者 = open `pm:awaiting-merge` PR。
1112
- 分诊旧记录过期:delta 复审归车道或复审席,照 contract-review.md;⛔ 分诊不再审。
12-
- Backlog sweep 是常设职责,每 fire 扫任一析取命中的卡。
1313
- 析取 ①:全裸(无 `pm:*`、无 `needs-user-decision`、无 `domain:*`)。
1414
- 析取 ②:有 `pm:queue` 无 `domain:*`(仅多车道仓);析取 ③:有 `domain:*` 无 pm-state。
1515
- 析取 ④:有 `pm:queue`+`domain:*` 无 `priority:*`;②③④ 只取 `updated_at` 早于 ~2 分钟。
@@ -40,7 +40,7 @@
4040
- `tooling` 入 `pm:queue` 仅凭三门之一:首行带 `Unblocks: #N`(open 产品卡)或点名所护的已发布面;
4141
- 或实测拖慢车队开发:正确源上假红/假绿、反复重跑、同因丢复核轮;卡须具名实例。
4242
- `pm:queue` 也收恢复不变量的 finding、test-only pin,与实现未被裁错的说明书脱节(修文档)。
43-
- `needs-user-decision` = 设计卡、feature/契约形状提案、需要 appetite 的多周程序。
43+
- `needs-user-decision` = 设计卡、feature/契约形状提案、需要 appetite 的多周程序;只挂 issue。
4444
- 先例已定新键/值/导出名非契约形状提案;分诊审计 ⛔ 不自加门,唯语义/形状真分歧呈人。
4545
- 碰迁移形状或删已发布能力也进决策箱;说明书脱节不进:有裁定出处才是 (b),否则改文档。
4646
- 决策卡速读居四棱块之上、同题,用业务语言先讲事情与选项,末句只问一字:A/B/C 或是否。

‎scripts/pm/check-governed-merges.mjs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@
218218
*
219219
* Read as: a pull request whose changed line count exceeds 3,000 lands by the
220220
* same terminal as a Tier H governed diff (ACCEPT on the card,
221-
* `needs-user-decision` on the PR, a final 维护者速读, review requested from
221+
* `pm:awaiting-merge` on the PR, a final 维护者速读, review requested from
222222
* `GOVERNED_APPROVERS`), whatever paths it touches — on 2026-09-18 that meant
223223
* the maintainer's own merge alone; since 2026-09-27 it means the two landings
224224
* a Tier H path has (the "SIZE limb's LIFT" section below). 「比如」 made the
@@ -1943,7 +1943,7 @@ export function renderSizeLines(size) {
19431943
` as a Tier H governed diff: no seat flips it ready, enqueues it, or arms auto-merge until an account in\n` +
19441944
` GOVERNED_APPROVERS has APPROVED it, on ANY commit (${SIZE_LIFT_RULING}) — then the OWNING seat lands it\n` +
19451945
` through the queue; the maintainer's own merge is the other landing. ACCEPT on the card,\n` +
1946-
` \`needs-user-decision\` on the PR, the final 维护者速读, review requested from GOVERNED_APPROVERS.`
1946+
` \`pm:awaiting-merge\` on the PR, the final 维护者速读, review requested from GOVERNED_APPROVERS.`
19471947
);
19481948
}
19491949

‎scripts/pm/check-governed-queue-guard.mjs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@
450450
* ⭐ AN AUTHORIZED APPROVAL LIFTS THIS LIMB (maintainer ruling 2026-09-27,
451451
* #20153), exactly as it lifts a Tier H path. Until that day the landed
452452
* predicate said a human MERGE and nothing else — 「人工审核」 landed as the same
453-
* terminal a governed diff has (ACCEPT on the card, `needs-user-decision` on
453+
* terminal a governed diff has (ACCEPT on the card, `pm:awaiting-merge` on
454454
* the PR, a final 维护者速读, review requested from `GOVERNED_APPROVERS`) and
455455
* the maintainer's own click (人工直合); the 2026-08-27 ruling had said
456456
* "approval lifts" of PATHS, nothing had said it of the NUMBER, and this file
@@ -2324,7 +2324,7 @@ export function renderSizeVerdict(verdict) {
23242324
' remote that it is in neither the queue nor `origin/main` — the pull-back of AGENTS.md Prime',
23252325
' Directive #14. Out of the queue and in draft is the SAFE state.',
23262326
' 2. Then ONE of the landings — the same terminal a Tier H governed diff has: ACCEPT on the card,',
2327-
' `needs-user-decision` on the PR, a final 维护者速读, review requested from GOVERNED_APPROVERS',
2327+
' `pm:awaiting-merge` on the PR, a final 维护者速读, review requested from GOVERNED_APPROVERS',
23282328
` (${GOVERNED_APPROVERS.join(', ')}); and then EITHER`,
23292329
' (a) an APPROVED review by one of those accounts, on ANY commit (2026-09-27, objectstack#20153) —',
23302330
' the OWNING seat then lands it through the queue (席位落地): ready, auto-merge, this check',

0 commit comments

Comments
 (0)