Skip to content

Commit c1f4093

Browse files
skills(pm-dispatch): push-notify the maintainer when an item moves into the maintainer's hands (#24488)
Fixes #24481 Clause-②: no ## What changed One rule in `.claude/skills/pm-dispatch/SKILL.md`, in 升级与决策 beside the card-before-popup and `AskUserQuestion` bullets (previously `:268`–`:271`), as two bullets at `:272`–`:273`: ```text - 推送维护者:受管 PR 待批合、决策卡待字、发版、仅其可解之阻 ⇒ 另发 `PushNotification`。 - 一行 ≤200 字,先写动作与编号;每项恰一次,例行进展、刚问刚答与在场即见的不推。 ``` The maintainer's order, said in the epic seat's chat (`session_01Y5583bs2RDd53MH6kM1ca3`, 2026-10-19) and quoted on the card verbatim: > 「24422 等我合并,你改过之后没给我推送消息,是skills的问题吗」 > > 「长期固定下来,立一张skills卡片」 The rule keeps the card's content: the four triggers (a governed PR awaiting approval and merge, a decision card awaiting a word, a release step, a block only the maintainer can clear), the push sent in addition to chat and the GitHub record (另发), one line, ≤200 characters, the action and the number first, exactly once per item, and no push for routine progress, a question just answered, or a maintainer who is present. The card's "⛔ 不以 GitHub assign 代推送(同上条)" is already the existing `:268` bullet (「⛔ 不 assign 推送」), two lines above, so it is not restated. ## Line budget: net 0, paid by deleting duplicated content, not by re-wrapping `pnpm check:pm-skill-ratchet` pins SKILL.md at 319 lines with headroom 0 and the widest table row at 342 bytes. The two new bullets are paid for by deleting two bullets whose content lives verbatim-equivalent in `references/lanes/director.md`, which the director seat reads (`:56` already pointed there): - deleted 「三职 = 契约复核记录事后审计、决裁勤务、维护者动作台账。」 — director.md's three 职责 headers (`:29`, `:45`, `:60`); - deleted 「每场召唤把带席内 ACCEPT 的受管草稿呈为一批 ≤5 行决裁;批准与合并仍是维护者的点击。」 — director.md `:53`–`:54`, and AGENTS.md Prime Directive #14 ("ONE batch of at most five rows, and the click stays the maintainer's"); - the `director` row of the args table (`:56`) now reads 「三职与章程见 `references/lanes/director.md`」 instead of pointing at this section for the three duties. No neighbouring bullet was folded or re-wrapped: the dev role file names re-wrap as not a legal currency for the line ratchet (「⛔ 不拿 re-wrap(折行合并)当筹行,新增以删减付账」), and every prose bullet in this file is ≤120 bytes, which a two-bullet fold cannot keep. The dispatch's fallback (stop and report candidate folds) was therefore not needed; the alternative folds are listed in the report comment on the card for the record. Result: 319 → 319 lines; 3 insertions, 3 deletions; every changed line ≤120 bytes (56: 117, 272: 118, 273: 112). ## The dispatch's measurement points - Mirror line: none added. The round-report duty lives in `references/seat-lifecycle.md:66`–`:68` (「轮次报告与节奏」); `references/execution-duties.md` carries no round-report duty (its only 轮报 mention, `:54`, is a triage-gap line); seat Routine prompts live in each session's scheduled task, not in the tree. `seat-lifecycle.md` is outside the claim's surface and was not edited. - Issue-id lint: `scripts/pm/check-skill-id-lint.mjs` refuses `/#[0-9]{3,}/` in this file, so the card's example 「#24422 ADR 待您合并」 cannot appear in the rule; the rule states the format ("先写动作与编号") and carries no example (an `#N` example did not fit the 120-byte line norm with the exclusions kept). - The `PushNotification` tool: the name is the card's. No reference to it exists in the tracked tree, in `.claude/settings.json`, in `.claude/hooks/`, or in this container's tool list (a ToolSearch for "push notification" returned no such tool), so the card's 「工具回 not sent 即视为在场,不重发」 clause is unsourced here and was not written; 「每项恰一次」 and 「在场即见的不推」 carry the once-only intent without a claim about the tool's return value. - Tier: the card and the dispatch call this PR Tier H. The register (`GOVERNED_SURFACES` in `scripts/pm/check-governed-merges.mjs`, row `claude-tree`), AGENTS.md Prime Directive #14 and SKILL.md `:204` all place `.claude/**` in Tier S. The posture here is the same either way: the PR is opened as draft and stays draft; this agent never readies, queues or arms it; landing waits for the tier's record. - Acceptance item 2 (the next item moving into the maintainer's hands gets exactly one push, recorded in a round report) is the seat's post-landing reading, not part of this PR. - Changeset: `.claude/**` publishes nothing, so `skip-changeset` is applied at PR creation. ## Verification (at `c4341e35c`) Derived with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` on the committed diff: 20 runnable families (12 matched by path, 8 declared whole-tree), plus `check-governed-queue-guard.mjs` which is CI-measured only. All 20 ran locally, exit codes captured before any pipe; `--ran` reconciliation: 20 derived, 20 run, 0 NOT-MEASURED, 0 UNRUN (every family with an exit code recorded). - `pnpm check:pm-skill-ratchet` exit 0 — 「.claude/skills/pm-dispatch/SKILL.md is 319 lines (ceiling 319; headroom 0)」, 「widest table row is 342 bytes (pin 342; headroom 0)」 - `pnpm check:pm-skill-id-lint` exit 0 — 87 files clean - `pnpm check:pm-governed-prose` exit 0; `pnpm check:skill-frame-sync` exit 0 (one declared copy, coherent, 90 files scanned); `pnpm check:pm-expected-skips` exit 0 - `pnpm check:doc-authoring`, `check:agent-test-spelling`, `check:cross-package-test-inputs`, `check:pm-governed-merges` — exit 0 each - `pnpm --filter @objectstack/lint run check:doc-formula-expressions` — first run exit 3, PREREQUISITE NOT MET (`@objectstack/lint` and `@objectstack/formula` unbuilt; nothing measured); built both under the verify lock (`VERDICT command-exit 0`), rerun exit 0 - `node scripts/pm/check-governed-queue-guard.mjs --self-test`, `node scripts/pm/check-harness-current.mjs --self-test` — exit 0 - whole-tree: `check:driver-memory-census`, `check:gitlink-declared`, `check:nul-bytes`, `check:refd-timer-probe`, `check:watch-hint-literal`, `check-closing-keyword-parity.mjs` (self-test and run), `check-comment-mask-corpus.mjs` — exit 0 each - local-only (reading reported, not a CI family): `pnpm check:skill-frame-freshness` exit 0 No package build, test or typecheck is owed: the diff touches no package. The full farm is CI's; the PR's check-runs are the record for every family CI runs. ## 维护者速读(草稿) **改了什么**:在 pm-dispatch 技能的〈升级与决策〉里加了一条规则:事项转入您手上时(受管 PR 等您批准合并、决策卡等您回字、发版步骤、只有您能解的阻塞),席位除了聊天和 GitHub 记录之外,再给您发一条推送通知;一行、先写要做的动作和编号;每项只推一次;例行进展、刚问刚答、您在场看得见的不推。为了不超过文件的行数上限,删掉了两条总监席的细则(三职清单、每场呈批 ≤5 行),它们在 `references/lanes/director.md` 里原样都有;参数表里 `director` 一行改为只指向该文件。 **为什么改**:2026-10-19 PR 24422 已经通过评审、等您合并,席位只在聊天里说了一句,没有推送,您不在那个会话就不知道。您的原话:「24422 等我合并,你改过之后没给我推送消息,是skills的问题吗」「长期固定下来,立一张skills卡片」。 **风险与代价(含回滚)**:只改一个技能文件的文字,不加门禁、不发布任何包。风险一:席位推送过多——规则用「四类触发」「每项恰一次」和三条不推情形来限;风险二:`PushNotification` 这个工具名来自卡片,本容器里查不到它,席位会话里是否存在未实测,若不存在,席位应在轮次报告里说明。回滚 = revert 本 PR 一个提交,文件回到 319 行原样。 **席位意见**:(留空,由席位填写) **你要做的**:一个动作——审阅后批准并合并本 PR(受管面,席位不代合)。 ## Acceptance notes - The card and the dispatch call this PR Tier H; the register and AGENTS.md Prime Directive #14 place `.claude/**` in Tier S. Not a defect in the tree; noted for the seat (carrier: the dispatching seat), not filed. - `check-skill-line-ratchet` prints a pre-existing info line unrelated to this diff: `.claude/skills/spec-property-retirement/SKILL.md` max-table-row-bytes headroom is 2 (pin 326, measured 324), which the gate invites a future PR to lower. Observation only; carrier: none; not filed. - The round-report duty in `references/seat-lifecycle.md:66`–`:68` does not mention the push; the dispatch ruled no mirror line, so none was added. Observation only. --- _Generated by [Claude Code](https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent f8ef144 commit c1f4093

1 file changed

Lines changed: 3 additions & 3 deletions

File tree

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
5353
| `triage` | 以分诊座位身份运行(只扫/分类/路由,永不认领) | — |
5454
| `<domain>`(如 `spec`、`skills`) | 以该 `domain:*` 车道的执行座位身份运行 | — |
5555
| `epic:#<n>` | 以父单 #n 的 epic PM 身份运行(见 `references/seat-lifecycle.md` 〈Epic 子树车道〉) | — |
56-
| `director` | 以项目总监席身份运行(人工召唤;三职见 升级与决策 节与 `references/lanes/director.md`) | — |
56+
| `director` | 以项目总监席身份运行(人工召唤;三职与章程见 `references/lanes/director.md`) | — |
5757
| `label:<name>` | backlog 过滤标签;`label:all` = 全部 open 未认领 | `pm:queue` |
5858
| `repo:<owner/name>` | 扫哪个仓的 backlog(单 issue 的落地仓看它自己的 `repo:*` 标签) | `objectstack-ai/objectstack` |
5959
| `batch:<n>` | 席位同时在飞的子代理总上限,按 `Agent` 调用与 `create_session` 计:dev、复核、普查皆计,⛔ 只读不豁免 | 默认 `3`;`n` 的维护者天花板 `5` |
@@ -269,9 +269,9 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
269269
- 决策卡带选项、推荐、证据、四棱块与工作量列;受阻执行卡同笔挂 `pm:blocked`+`Blocked-by:`。
270270
- `AskUserQuestion` 只是在场加速器:仅当维护者在本会话 ~30 分钟内有过人类输入才可发。
271271
- 每问必带推荐项,被 Skip 或长挂即转卡通道,⛔ 不重弹。
272+
- 推送维护者:受管 PR 待批合、决策卡待字、发版、仅其可解之阻 ⇒ 另发 `PushNotification`。
273+
- 一行 ≤200 字,先写动作与编号;每项恰一次,例行进展、刚问刚答与在场即见的不推。
272274
- 项目总监席:维护者在所在仓召唤 `/pm-dispatch director`;⛔ 无 Routine/cron;未回字 = 不在 = 停。
273-
- 三职 = 契约复核记录事后审计、决裁勤务、维护者动作台账。
274-
- 每场召唤把带席内 ACCEPT 的受管草稿呈为一批 ≤5 行决裁;批准与合并仍是维护者的点击。
275275
- 总监席档位由维护者按项目人工定,每场记入摘要台账;⛔ 无档位硬门、无免档整理态。
276276
- 总监席是唯一裁决者:决策箱、代裁与一类自裁只出自本席,⛔ 无子代理无自述。
277277

0 commit comments

Comments
 (0)