Repository navigation
Commit 80ef826
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
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
68 | 68 | | |
69 | 69 | | |
70 | 70 | | |
71 | | - | |
72 | | - | |
| 71 | + | |
| 72 | + | |
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
| |||
567 | 567 | | |
568 | 568 | | |
569 | 569 | | |
570 | | - | |
571 | | - | |
| 570 | + | |
| 571 | + | |
572 | 572 | | |
573 | 573 | | |
574 | 574 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
17 | | - | |
18 | | - | |
| 17 | + | |
| 18 | + | |
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| |||
114 | 114 | | |
115 | 115 | | |
116 | 116 | | |
117 | | - | |
| 117 | + | |
118 | 118 | | |
119 | 119 | | |
120 | 120 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
44 | 44 | | |
45 | 45 | | |
46 | 46 | | |
47 | | - | |
| 47 | + | |
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
| |||
0 commit comments