Skip to content

Commit 80ef826

Browse files
claude[bot]claude
andauthored
skills(pm-dispatch): arm the patrol wake-up once at seating as a self-bound Routine; the round-end one-shot is an accelerator (#17855)
Fixes #17728 A chain of round-end one-shots has no memory: one skipped re-arm is silence until a human notices (the card's provenance is the maintainer's own question, quoted on the card verbatim and untranslated). This PR makes the seating-time self-bound Routine the DEFAULT wake-up and demotes the round-end `send_later` to an optional accelerator, in `SKILL.md` and its `core-rules.md` subset in the same PR (SKILL.md 〈优先级〉: 「一条规则在本文与核心条款一处改动,另一处同 PR 同改。」), and makes sign-off delete that Routine explicitly. Base `9c577c18a` (origin/main at dispatch) → head `9f2bfbfd2` (two commits: the rewrite at `049609264`, then the rework below). Three files, +8/−8, every file at its ratchet ceiling before and after: `SKILL.md` 812 → 812, `references/core-rules.md` 151 → 151, `references/seat-post-protocol.md` 91 → 91. No changeset: `.claude/**` only, nothing published moves (dispatch-gates: 14 changeset families apply only once a changeset exists; none written ⇒ `skip-changeset`). **Rework (second commit)**: the first head also carried a pointer line beside the release prohibition (SKILL.md :34) to the release-window 「已上膛」 criterion, paid by joining :66–:67 into one line. The seat's review refused that funding — a fold buys a line for new content, which the ratchet rule forbids (`.claude/agents/os-dev.md` 「付行数棘轮的唯一合法货币是删内容:⛔ 不拿 re-wrap(折行合并)当筹行,新增以删减付账。」) — so the second commit restores :66–:67 to their `origin/main` spelling byte-for-byte and drops the pointer line. That rider is not in this PR; it rides a later SKILL.md PR that carries a genuine deletion (the seat re-records it on the seat post). Everything else is as on the first head. ## What changed, per file (before → after; untranslated) ### `.claude/skills/pm-dispatch/SKILL.md` (812 → 812) **A. 〈入口与角色〉 :71–:72 → :71–:72** (two lines become two lines carrying the new content) - before :71 「- 自设定时器只定下一次唤醒,⛔ 不定本轮长度。」 - before :72 「- 定时器默认在轮末挂、延时 ≤55 分钟;维护者明示可改。」 - after :71 「- 入座即建唯一自绑 cron Routine(`create_trigger`,`own_followup`)作默认唤醒;id 记座位贴说明段。」 (115 B) - after :72 「- 轮末 `send_later` 是可选加速器:在飞 ≤55 分钟,⛔ 不作唯一唤醒;只定下次唤醒,不定轮长。」 (118 B) The fired text's discipline is not restated: 〈平台读数纪律〉 :167–:168 already binds every self-set timer (「自设定时器的文本以先重读状态开头,只写关键判据」). The self-bound spelling (自绑) is deliberate — it is what distinguishes this Routine from the fresh-session `create_trigger` Routine that `seat-post-protocol.md` 〈座位 Routine 创建〉 forbids (no GitHub tools), per `platform-readings.md` 「自绑唤醒的是已存在的会话、工具已加载」. **B. 〈收集〉 :570 → :570** (same count) - before 「- ① 定时器重挂是每次巡检的第一动作,先挂后查,链条对中断免疫。」 - after 「- ① 巡检首动作 `list_triggers` 确认 Routine 启用,在飞重挂加速器;唤醒归 Routine,漏挂不断链。」 (118 B) **Cadence-change clause moved, not dropped** — the 「维护者明示可改」 half of old :72 now sits on the cadence line it governs, 〈收集〉 :571: - before 「- ② 在飞期间主巡检间隔 ≤45 分钟,待命期 60–70。」 - after 「- ② 在飞期间主巡检间隔 ≤45 分钟,待命期 60–70;节奏维护者明示可改。」 (95 B) The two A lines could not also hold it under 120 B (the tightest one-line fold of A measured 136 B, so A stays two lines and this clause moves to the line that states the cadence). Cadence values are unchanged. No other SKILL.md line differs from `origin/main`. ### `.claude/skills/pm-dispatch/references/core-rules.md` (151 → 151) — mirrors of A and B - :17 before 「- 自设定时器只定下次唤醒、不定轮长;新 fire 到时上一轮未清空即接续,⛔ 不重开不重排。」 - :17 after 「- 入座自绑 cron Routine 作默认唤醒、只定下次唤醒;fire 到时未清空即接续,⛔ 不重开不重排。」 (120 B) - :18 before 「- 分诊席跑普通直连会话、默认判断档,裁决归总监席;自排下次唤醒不超过 55 分钟。」 - :18 after 「- 分诊席跑普通直连会话、默认判断档,裁决归总监席;`send_later` 只是 ≤55 分钟加速器。」 (114 B) - :117 before 「- 收集先扫 GitHub 且报告缺席 ⛔ 永不读作成功;探活每轮先重挂定时器。」 - :117 after 「- 收集先扫 GitHub 且报告缺席 ⛔ 永不读作成功;探活先确认 Routine 启用,在飞再重挂加速器。」 (119 B) Byte budget forced two elisions in the subset, both still stated in SKILL.md (core-rules :3 「细节参数……仍以 SKILL.md……为准」): 「不定轮长」 is implied by 「只定下次唤醒」 on :17, and 「⛔ 不作唯一唤醒」 is implied by 「只是……加速器」 on :18. ### `.claude/skills/pm-dispatch/references/seat-post-protocol.md` (91 → 91) - :47 before 「6. `list_triggers` 清点本会话全部自设定时器,逐个清理或随移交物转交。」 - :47 after 「6. `list_triggers` 清点本会话定时器:删入座 Routine,一次性的逐个清理或随移交物转交。」 (110 B) Untouched by design: `platform-readings.md` (its :440 orphan rule 「绑定会话一死:先删旧 Routine、再从新会话重建,⛔ 永不留孤儿。」 already covers the dead-session case), `dispatch-runbook.md`, `os-dev.md`, AGENTS.md. No patrol row or check script (Routines are account-scoped; the guard is the Routine itself). No card number of three or more digits enters the skill corpus. ## Acceptance criteria (from the card) 1. *SKILL.md states the seating-time self-bound Routine as the default wake-up and the round-end one-shot as optional; the sign-off list deletes it; frame-sync, ratchet and id-lint green.* — :71 「作默认唤醒」, :72 「是可选加速器 … ⛔ 不作唯一唤醒」, seat-post-protocol :47 「删入座 Routine」; `check:skill-frame-sync` exit 0, `check:pm-skill-ratchet` exit 0, `check:pm-skill-id-lint` exit 0 (below). 2. *A seat following the text and skipping one round-end re-arm still wakes within one Routine period.* — the wake-up is the cron Routine armed at seating (:71); the one-shot is 「⛔ 不作唯一唤醒」 (:72); the patrol's first action confirms the Routine is still enabled rather than re-arming a link (:570 「漏挂不断链」). A skipped `send_later` therefore removes only the accelerator; the next fire is the Routine's. ## Gates (all on head `9f2bfbfd2`, exit codes captured before any pipe) `node scripts/pm/dispatch-gates.mjs --commands` derived 16 commands from the three-path change set (merge base `9c577c18a`; the list is identical to the first head's); all 16 run on this head, `--ran` reconciles 16/16 with recorded exit codes, 0 NOT-MEASURED, 0 UNRUN. | command | exit | |---|---| | `pnpm check:pm-skill-ratchet` | 0 — SKILL.md 812/812, core-rules 151/151, seat-post-protocol 91/91 | | `pnpm check:skill-frame-sync` | 0 — one declared frame copy, coherent; 74 files scanned for undeclared copies | | `pnpm check:pm-skill-id-lint` | 0 — 27 files clean | | `pnpm check:nul-bytes` | 0 | | `pnpm check:pm-governed-prose` | 0 | | `pnpm check:pm-governed-merges` | 0 | | `pnpm check:agent-test-spelling` | 0 | | `pnpm check:doc-authoring` | 0 | | `pnpm check:driver-memory-census` | 0 | | `pnpm check:refd-timer-probe` | 0 | | `pnpm check:watch-hint-literal` | 0 | | `pnpm --filter @objectstack/lint run check:doc-formula-expressions` | 0 (needs `@objectstack/formula` + `@objectstack/lint` built; built under the verify lock, `VERDICT command-exit 0`) | | `node scripts/check-closing-keyword-parity.mjs` and `--self-test` | 0 / 0 | | `node scripts/check-comment-mask-corpus.mjs` | 0 — 6654 files, 0 disagree | | `node scripts/pm/check-governed-queue-guard.mjs --self-test` | 0 | Byte widths: every edited line ≤120 B (`LC_ALL=C awk`); the only line over 120 B in the three files is SKILL.md :811 (172 B), pre-existing on `origin/main`. Control-character scan of the three files: zero hits. ## Acceptance notes - noted, not filed: `seat-post-protocol.md` :13 registers 「会话 ID 或 Routine ID」 for the seat's 当前 PM triple — that is the maintainer-created seat Routine, a different object from the self-bound wake-up Routine this PR records in the 说明段. Not a conflict; recorded so the next reader does not merge the two. 承接者:无. - Governed surface (`.claude/**`): this PR stays a draft at the human terminal; never flipped ready, never queued, no reviewers requested by this session. ## 维护者速读(草稿) **改了什么**:PM 座位的唤醒机制换了默认形态。以前每轮结束时挂一个「下一次」的一次性定时器,漏挂一次就整个停摆;现在入座时就建一个自绑到本会话的周期 Routine 作为默认唤醒,轮末的一次性定时器降为可选加速器,巡检第一动作改为确认 Routine 仍在,收班清单明确删掉这个 Routine。核心条款子集同 PR 同改。 **为什么改**:维护者本人的提问就是出处 —— 一个座位因最后一轮漏挂定时器空转了约 7 小时,GitHub 上什么都看不出来。一次性定时器链条没有记忆;周期 Routine 有。 **风险与代价(含回滚)**:纯协议文本,三个文件都钉在行数上限、每行 ≤120 字节,没有脚本或门禁变化。代价是 core-rules 子集里两处措辞因字节预算略简(「不定轮长」「不作唯一唤醒」在 SKILL.md 里仍是原话)。座位死亡时 Routine 会成孤儿,已有 platform-readings 的「先删旧、再重建」规则兜底。回滚 = revert 这两个提交。 **席位意见**:(留空,由席位定稿) **你要做的**:受管面,人工合并;看一眼三个文件的 8 行 diff 是否同意「Routine 是默认唤醒、一次性定时器只是加速器」这个方向即可。 --- _Generated by [Claude Code](https://claude.ai/code/session_01MCLBsUgfykL74aU716rzVK)_ --- _Generated by [Claude Code](https://claude.ai/code)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 2f1fec6 commit 80ef826

3 files changed

Lines changed: 8 additions & 8 deletions

File tree

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
6868
- fire = 一次唤醒;fire 到达时上一轮未清空的接续处理,⛔ 不重开、不重排。
6969
- 批 = 一个上下文里读完的 ≤5 张同族卡,是质量单位,⛔ 不是预算。
7070
- 班 = 一个会话的任期,只以交接或惰性回收结束。
71-
- 自设定时器只定下一次唤醒,⛔ 不定本轮长度。
72-
- 定时器默认在轮末挂、延时 ≤55 分钟;维护者明示可改。
71+
- 入座即建唯一自绑 cron Routine(`create_trigger`,`own_followup`)作默认唤醒;id 记座位贴说明段。
72+
- 轮末 `send_later` 是可选加速器:在飞 ≤55 分钟,⛔ 不作唯一唤醒;只定下次唤醒,不定轮长。
7373
- 探针先行:fire 的第一动作是一次最便宜的车道盘点查询,⛔ 在它之前不读任何长文本。
7474
- 队列空 + 无在飞 + 无待复核 + 决策箱无新答复 ⇒ 自退。
7575
- 分诊席跑普通直连会话、默认判断档;裁决不在本席,归维护者召唤的总监席。
@@ -567,8 +567,8 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
567567
- 标记两种拼写等效:HTML 注释形与首行纯文本 `os-dev-report`。
568568
- ⛔ 仅凭 HTML 注释形式缺失永不读作报告未达;⛔ 永不把没收到失败通知读作还在跑。
569569
- 探活是每轮巡检的固定动作;完成通知不可靠,缺席什么都不证明。
570-
- ① 定时器重挂是每次巡检的第一动作,先挂后查,链条对中断免疫。
571-
- ② 在飞期间主巡检间隔 ≤45 分钟,待命期 60–70。
570+
- ① 巡检首动作 `list_triggers` 确认 Routine 启用,在飞重挂加速器;唤醒归 Routine,漏挂不断链。
571+
- ② 在飞期间主巡检间隔 ≤45 分钟,待命期 60–70;节奏维护者明示可改。
572572
- ③ 已派发未回报的 dev 逐个发状态询问;派发后 ~45 分钟无远程产出即到门槛。
573573
- 已有远程分支/PR 不豁免探针。
574574
- ④ 活着 ⇒ 进度与阻塞点;回 no active task; resumed from transcript ⇒ 生前已死,询问即复活。

‎.claude/skills/pm-dispatch/references/core-rules.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
- 开轮第一个动作是一次最便宜的车道盘点查询,⛔ 在它之前不读任何长文本。
1515
- 队列空、无在飞、无待复核、决策箱无新答复,本轮即自退。
1616
- 一轮自 fire 唤醒起,到队列清空或用量窗口耗尽止;轮次报告是轮末汇报 ⛔ 不是停止信号。
17-
- 自设定时器只定下次唤醒、不定轮长;新 fire 到时上一轮未清空即接续,⛔ 不重开不重排。
18-
- 分诊席跑普通直连会话、默认判断档,裁决归总监席;自排下次唤醒不超过 55 分钟。
17+
- 入座自绑 cron Routine 作默认唤醒、只定下次唤醒;fire 到时未清空即接续,⛔ 不重开不重排。
18+
- 分诊席跑普通直连会话、默认判断档,裁决归总监席;`send_later` 只是 ≤55 分钟加速器。
1919
- 开轮互斥读四个读数:收班简报、开轮标记、本车道最新他会话认领、最新关闭卡的认领。
2020
- 未收班活动任一未满一轮即自退,总监席除外;有简报即坐席,坐席后核章程再写开轮标记。
2121
## 全体座位的不变量
@@ -114,7 +114,7 @@
114114
- 派发词分三区:裁决不可重裁、机制假设须实测、建议路线可换,⛔ 不把假设写成裁决。
115115
- 标准非协商条款 ⛔ 不抄进派发词,清单、路径与行号在派发那一刻从树上取。
116116
- 危害断言必须有读数,测不了写成问题 ⛔ 不写成栅栏;技能包卡必带净增行数预算。
117-
- 收集先扫 GitHub 且报告缺席 ⛔ 永不读作成功;探活每轮先重挂定时器。
117+
- 收集先扫 GitHub 且报告缺席 ⛔ 永不读作成功;探活先确认 Routine 启用,在飞再重挂加速器。
118118
- 45 分钟是发探针的门槛而非判死门槛,判死只认探针回包、宿主信号或超实测基线。
119119
- 停摆永不自愈,按梯度复位、三次即判不可靠重派;报告丢失时按草稿 PR 直接验收。
120120
- 复核对 GitHub 核验 ⛔ 不对自述核验,逐项过清单并亲核形态、范围与整包价值密度。

‎.claude/skills/pm-dispatch/references/seat-post-protocol.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
3. 全量枚举本车道队列、决策箱与 findings,形成接任台账。
4545
4. 贴正文改 `⏳ vacant` + 台账:前任会话 ID、注销时间、队列快照、串行队、跨车道备忘。
4646
5. 收班简报与审计评论存档;接任指引 = `/pm-dispatch 接手` + 先读座位贴。
47-
6. `list_triggers` 清点本会话全部自设定时器,逐个清理或随移交物转交。
47+
6. `list_triggers` 清点本会话定时器:删入座 Routine,一次性的逐个清理或随移交物转交。
4848
7. 移交中 PR 的定时器随 PR 走;留守保留的定时器只触点名项。
4949
8. 本座位派出的 dev 会话由离任 PM 自己逐个 `archive_session`,归档义务 ⛔ 不可移交。
5050
9. 在飞 dev 卡与留跑会话在贴里点名(卡号 + 派发会话 ID);跟完与归档 ⛔ 不随交接转移。

0 commit comments

Comments
 (0)