Filed by the skills seat (session session_01MCLBsUgfykL74aU716rzVK, GitHub os-sales) at 2026-09-12T00:47Z from the maintainer's question in this seat's chat (2026-09-12T00:3xZ), which quoted a stalled PM seat's own diagnosis. Provenance, verbatim and untranslated:
项目经理:为什么停下来 —— 直接的答案
因为我在上一轮结束时漏挂了唤醒定时器。 没有别的原因:不是等你、不是被阻塞、不是限流。座位协议要求「走之前重新挂唤醒」,前面每一轮我都挂了,最后那轮没挂。没有下一次 fire,循环就停在那儿了。
现在 00:17Z,我最后一次动作在昨天约 17:00Z —— 空转约 7 小时。
这种应该怎么解决
The shape
The protocol arms the next wake-up as a ONE-SHOT at the round's end (SKILL.md 〈入口与角色〉: 「自设定时器只定下一次唤醒」, 「定时器默认在轮末挂、延时 ≤55 分钟」) and separately makes the re-arm the first action of every patrol (〈收集〉 ①: 「定时器重挂是每次巡检的第一动作,先挂后查,链条对中断免疫」). A chain of one-shots has no memory: one skipped link is silence until a human notices. The chain is immune to an interrupted round only if the arm happened BEFORE the work — the two lines point in different directions, and the seat that stalled followed the first.
Measured cost: one seat idle ~7 h (last own output ~2026-09-11T17:00Z, noticed 2026-09-12T00:17Z) with its queue and its in-flight items untouched; nothing on the board said so, because a 🟢 title and a missing timer look identical from GitHub.
Direction (seat reading; veto window in the round report)
- At seating, the seat creates ONE self-bound recurring Routine (
create_trigger with a cron, firing into the same session, initiation: own_followup) and records its id in the seat post's Notes; the fired text follows the timer-text discipline (re-read state first, key criteria only). The round-end send_later becomes an optional accelerator (≤55 min while anything is in flight), never the only wake-up.
- Sign-off checklist item 6 already says
list_triggers + clean up every timer — the recurring Routine is deleted there; the dead-session case is already ruled in platform-readings.md 〈断粮〉: a bound session that dies orphans its Routine ⇒ delete and recreate from the new session.
- Cadence is unchanged: standby already patrols every 60–70 min, and a self-bound Routine keeps the session's prompt-cache chain (the readings table records self-binding as a performance optimisation, zero-cost to delete and recreate).
- ⛔ Not a mechanical patrol row: Routines are account-scoped and the patrol runner cannot read another account's, so the guard is the Routine itself, not a check.
Landing: SKILL.md 〈入口与角色〉 (the two timer lines fold into one stating the seating-time Routine + the optional round-end one-shot) and 〈收集〉 ① (the first-action re-arm becomes «confirm the Routine is enabled; re-arm the accelerator»), the matching core-rules line; both files at their ceilings ⇒ paid by density (the fold IS the payment). Governed ⇒ human terminal; clause-① file ⇒ contract-review tier build. Hot-file: the SKILL.md chain, after #17389 → #17490 → #17497 → #17569.
Acceptance
- 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;
check:skill-frame-sync, check:pm-skill-ratchet, check:pm-skill-id-lint green.
- A seat following the text and skipping one round-end re-arm still wakes within one Routine period (the property the incident lacked).
Dedup
MCP search_issues (repo-scoped, natural-language query on the missed-re-arm / idle-seat shape) → 0; same-session control query (the narrowing-instruction shape) → 3 hits, so the channel was live and the zero is a reading. git grep -n '定时器' origin/main -- .claude/skills/pm-dispatch/SKILL.md finds the two lines quoted above and no seating-time Routine rule (lit control: Routine hits the 〈断粮〉 section).
domain:skills · pm:queue · priority:p2 · Task (self-triaged at filing under the lane's standing exception).
Generated by Claude Code
Filed by the skills seat (session
session_01MCLBsUgfykL74aU716rzVK, GitHubos-sales) at 2026-09-12T00:47Z from the maintainer's question in this seat's chat (2026-09-12T00:3xZ), which quoted a stalled PM seat's own diagnosis. Provenance, verbatim and untranslated:The shape
The protocol arms the next wake-up as a ONE-SHOT at the round's end (SKILL.md 〈入口与角色〉: 「自设定时器只定下一次唤醒」, 「定时器默认在轮末挂、延时 ≤55 分钟」) and separately makes the re-arm the first action of every patrol (〈收集〉 ①: 「定时器重挂是每次巡检的第一动作,先挂后查,链条对中断免疫」). A chain of one-shots has no memory: one skipped link is silence until a human notices. The chain is immune to an interrupted round only if the arm happened BEFORE the work — the two lines point in different directions, and the seat that stalled followed the first.
Measured cost: one seat idle ~7 h (last own output ~2026-09-11T17:00Z, noticed 2026-09-12T00:17Z) with its queue and its in-flight items untouched; nothing on the board said so, because a
🟢title and a missing timer look identical from GitHub.Direction (seat reading; veto window in the round report)
create_triggerwith a cron, firing into the same session,initiation: own_followup) and records its id in the seat post's Notes; the fired text follows the timer-text discipline (re-read state first, key criteria only). The round-endsend_laterbecomes an optional accelerator (≤55 min while anything is in flight), never the only wake-up.list_triggers+ clean up every timer — the recurring Routine is deleted there; the dead-session case is already ruled inplatform-readings.md〈断粮〉: a bound session that dies orphans its Routine ⇒ delete and recreate from the new session.Landing: SKILL.md 〈入口与角色〉 (the two timer lines fold into one stating the seating-time Routine + the optional round-end one-shot) and 〈收集〉 ① (the first-action re-arm becomes «confirm the Routine is enabled; re-arm the accelerator»), the matching core-rules line; both files at their ceilings ⇒ paid by density (the fold IS the payment). Governed ⇒ human terminal; clause-① file ⇒ contract-review tier build. Hot-file: the SKILL.md chain, after #17389 → #17490 → #17497 → #17569.
Acceptance
check:skill-frame-sync,check:pm-skill-ratchet,check:pm-skill-id-lintgreen.Dedup
MCP
search_issues(repo-scoped, natural-language query on the missed-re-arm / idle-seat shape) → 0; same-session control query (the narrowing-instruction shape) → 3 hits, so the channel was live and the zero is a reading.git grep -n '定时器' origin/main -- .claude/skills/pm-dispatch/SKILL.mdfinds the two lines quoted above and no seating-time Routine rule (lit control:Routinehits the 〈断粮〉 section).domain:skills·pm:queue·priority:p2· Task (self-triaged at filing under the lane's standing exception).Generated by Claude Code