Repository navigation
skills(pm-dispatch): push-notify the maintainer when an item moves into the maintainer's hands - #24488
skills(pm-dispatch): push-notify the maintainer when an item moves into the maintainer's hands#24488objectstack-fleet[bot] wants to merge 1 commit into
Conversation
…to the maintainer's hands Add the rule beside the card-before-popup / AskUserQuestion bullets in 升级与决策: when an item moves into the maintainer's hands (a governed PR awaiting approval and merge, a decision card awaiting a word, a release step, a block only the maintainer can clear) the seat also sends one push notification — one line, action and number first, exactly once per item, never for routine progress, a just-answered question or a maintainer who is present. The line ratchet has zero headroom, so the two new bullets are paid for by deleting two bullets whose content is carried verbatim-equivalent by references/lanes/director.md (its three duty headers, and :53–:54 for the ≤5-row batch and the maintainer's click); the director arg row now points at that file alone. Net 0 lines; no neighbouring bullet was re-wrapped. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: ① Derived judgments
② Semver level
③ Boundary flagsThe dev report lists seven deviations and two out-of-scope findings;
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #24481
Clause-②: no
What changed
One rule in
.claude/skills/pm-dispatch/SKILL.md, in 升级与决策 beside the card-before-popup andAskUserQuestionbullets (previously:268–:271), as two bullets at:272–:273:The maintainer's order, said in the epic seat's chat (
session_01Y5583bs2RDd53MH6kM1ca3, 2026-10-19) and quoted on the card verbatim: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
:268bullet (「⛔ 不 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-ratchetpins 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 inreferences/lanes/director.md, which the director seat reads (:56already pointed there)::29,:45,:60);:53–:54, and AGENTS.md Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14 ("ONE batch of at most five rows, and the click stays the maintainer's");directorrow 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
references/seat-lifecycle.md:66–:68(「轮次报告与节奏」);references/execution-duties.mdcarries 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.mdis outside the claim's surface and was not edited.scripts/pm/check-skill-id-lint.mjsrefuses/#[0-9]{3,}/in this file, so the card's example 「docs(adr): ADR-0131 D6 charts sharing_rule under regime C; D7 ledger reading and lines for #24377 and #24435; D14 records the 18.0 scope #24422 ADR 待您合并」 cannot appear in the rule; the rule states the format ("先写动作与编号") and carries no example (an#Nexample did not fit the 120-byte line norm with the exclusions kept).PushNotificationtool: 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.GOVERNED_SURFACESinscripts/pm/check-governed-merges.mjs, rowclaude-tree), AGENTS.md Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14 and SKILL.md:204all 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..claude/**publishes nothing, soskip-changesetis applied at PR creation.Verification (at
c4341e35c)Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackon the committed diff: 20 runnable families (12 matched by path, 8 declared whole-tree), pluscheck-governed-queue-guard.mjswhich is CI-measured only. All 20 ran locally, exit codes captured before any pipe;--ranreconciliation: 20 derived, 20 run, 0 NOT-MEASURED, 0 UNRUN (every family with an exit code recorded).pnpm check:pm-skill-ratchetexit 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-lintexit 0 — 87 files cleanpnpm check:pm-governed-proseexit 0;pnpm check:skill-frame-syncexit 0 (one declared copy, coherent, 90 files scanned);pnpm check:pm-expected-skipsexit 0pnpm check:doc-authoring,check:agent-test-spelling,check:cross-package-test-inputs,check:pm-governed-merges— exit 0 eachpnpm --filter @objectstack/lint run check:doc-formula-expressions— first run exit 3, PREREQUISITE NOT MET (@objectstack/lintand@objectstack/formulaunbuilt; nothing measured); built both under the verify lock (VERDICT command-exit 0), rerun exit 0node scripts/pm/check-governed-queue-guard.mjs --self-test,node scripts/pm/check-harness-current.mjs --self-test— exit 0check: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 eachpnpm check:skill-frame-freshnessexit 0No 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
.claude/**in Tier S. Not a defect in the tree; noted for the seat (carrier: the dispatching seat), not filed.check-skill-line-ratchetprints a pre-existing info line unrelated to this diff:.claude/skills/spec-property-retirement/SKILL.mdmax-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.references/seat-lifecycle.md:66–:68does not mention the push; the dispatch ruled no mirror line, so none was added. Observation only.Generated by Claude Code