1# Watchdog — Claude 对话续命看门狗
2
3## 原理
4
51. Claude 写心跳文件 `/tmp/claude_heartbeat.json`
62. Claude 写进度文件 `/tmp/claude_progress.json`(当前任务、做到哪了)
73. 看门狗每 60 秒检查心跳,按条件续命
84. Claude 被唤醒后先读进度文件,接上之前的工作
9
10## 状态机
11
12| status | 含义 | 看门狗行为 |
13|--------|------|------------|
14| working | 干活中 | 不动(除非兜底超时) |
15| waiting | 等待续命 | 按条件续命 |
16| renewed | 已续命 | 不动 |
17| paused | 暂停 | 跳过 |
18| done | 完成 | 看门狗退出 |
19
20## 唤醒条件(三层,任一满足)
21
221. **定时唤醒**:`wake_at > 0 && now >= wake_at`(我判断任务要10分钟就设10分钟后)
232. **空闲超时**:`wake_at == 0 && idle > timeout`(不确定多久,靠超时兜底)
243. **兜底上限**:`max_wake_at > 0 && now >= max_wake_at`(无论什么状态都叫醒,防止彻底卡死)
25
26## 心跳文件 `/tmp/claude_heartbeat.json`
27
28```json
29{
30 "ts": 1774808270,
31 "timeout": 300,
32 "status": "working",
33 "wake_at": 0,
34 "max_wake_at": 1774809870,
35 "tab": "OpenClaw的GUI控制机制 - Claude",
36 "renewal_msg": "watchdog续命:请继续"
37}
38```
39
40## 进度文件 `/tmp/claude_progress.json`
41
42被唤醒后先读这个文件,知道之前在做什么、做到哪了:
43
44```json
45{
46 "updated_at": 1774808270,
47 "task": "conductor开发:files/read kind修复 + 日志落盘 + T-S049",
48 "subtasks": [
49 {"id": "fix-kind", "status": "done", "note": "一行改动已提交"},
50 {"id": "log-ingest", "status": "in_progress", "note": "codex在写,预计5分钟"},
51 {"id": "T-S049", "status": "pending"}
52 ],
53 "codex_windows": ["baa-conductor — codex"],
54 "claude_windows": ["claude --dangerously-skip-permissions"],
55 "next_action": "检查codex是否完成log-ingest,完成则合并并开始T-S049"
56}
57```
58
59## 工作流
60
61```
62Claude 开始工作:
63 1. 写心跳 status=working
64 2. 写进度 task/subtasks/next_action
65 3. 分配任务给 codex/claude
66 4. 设心跳 status=waiting, wake_at=N分钟后, max_wake_at=30分钟后
67 5. 停止工具调用,等看门狗唤醒
68
69看门狗唤醒 Claude:
70 → Safari 发续命消息
71
72Claude 被唤醒:
73 1. 读进度文件,知道之前在做什么
74 2. 检查各 codex/claude 窗口状态
75 3. 继续工作
76```
77
78## 用法
79
80```bash
81# 启动
82nohup bash tools/watchdog/watchdog.sh 60 &
83
84# 发消息
85bash tools/watchdog/a11y_msg.sh "标签页全名" "消息"
86
87# 停止看门狗
88python3 -c "import json; d=json.load(open(/tmp/claude_heartbeat.json)); d[status]=done; json.dump(d,open(/tmp/claude_heartbeat.json,w))"
89```
90
91## 文件
92
93- watchdog.sh — 看门狗主循环
94- a11y_msg.sh — Safari 无障碍消息发送
95- watchdog.log — 运行日志
96- /tmp/claude_heartbeat.json — 心跳(看门狗读)
97- /tmp/claude_progress.json — 进度(Claude 读写)