From 83e13a2b8f95c9f39f52d13392e23d61c19419be Mon Sep 17 00:00:00 2001 From: Chen Gu Date: Wed, 25 Mar 2026 23:43:27 +0800 Subject: [PATCH] Improve proactive workflow and continuity scaffolding --- CURRENT.md | 22 +++++++++ HEARTBEAT.md | 94 +++++++++++++++++++++++++++---------- TODO.md | 61 +++++++++++++++++++++--- memory/2026-03-25.md | 12 +++++ memory/heartbeat-state.json | 14 +++--- 5 files changed, 165 insertions(+), 38 deletions(-) create mode 100644 CURRENT.md create mode 100644 memory/2026-03-25.md diff --git a/CURRENT.md b/CURRENT.md new file mode 100644 index 0000000..b521505 --- /dev/null +++ b/CURRENT.md @@ -0,0 +1,22 @@ +# CURRENT.md + +> 短期工作记忆层。只保留未来几天真正重要的执行上下文。 + +## Current Focus +- 主任务:提升 OpenClaw 的主动性与连贯执行能力 +- 当前阶段:完成推荐版基础改造(heartbeat + TODO 模板 + 工作记忆层) +- 最新结论:主动性应由状态驱动;连贯性应由 CURRENT.md + TODO 状态机承载 + +## Open Loops +- TODO 状态机已扩展,但后续新任务需要按新字段填写 +- heartbeat 规则已收紧,后续需观察是否过于保守或过于安静 +- memory hygiene 已打开,后续需要验证整理节奏是否合适 + +## Next Best Actions +1. 用新模板登记未来需要持续推进的任务 +2. 在新任务中补齐 `last_progress_note`、`next_action`、`last_update_at`、`stale_after` +3. 观察一段时间主动提醒是否足够及时且不过度打扰 + +## Notes +- 目标不是让机器人更爱说话,而是让它更会持续推进事情。 +- 默认保持克制,只在有明确风险、阻塞或到期事项时主动提醒。 diff --git a/HEARTBEAT.md b/HEARTBEAT.md index 41b0632..5ef14fa 100644 --- a/HEARTBEAT.md +++ b/HEARTBEAT.md @@ -1,44 +1,86 @@ # HEARTBEAT.md ## 目标 -在不打扰的前提下,做轻量主动触达与必要巡检。 +在不打扰的前提下,让 Val 基于任务状态做轻量、克制、可解释的主动推进。 -## 主动触达触发 +## 基本原则 1. 默认不做陪伴型主动触达。 -2. 仅当存在明确的活跃任务风险、到期升级或必须提醒事项时,才允许主动发消息。 -3. 夜间静默:23:00-08:00 默认不主动发(紧急除外)。 +2. 主动消息必须由明确状态触发,而不是为了刷存在感。 +3. 优先做巡检、整理、压缩记忆;只有存在明确风险或必须提醒时才发消息。 +4. 夜间静默:23:00-08:00 默认不主动发(P0 紧急事项除外)。 +5. 同一任务若无新风险、无新进展,不重复提醒。 -## 主动触达类型 -- 默认关闭陪伴型主动触达,避免在当前 TUI/主会话中产生噪音。 -- 仅发送执行型提醒:任务 / 状态 / 建议(最多三段)。 -- 若出现 P0/P1 风险:直接提醒。 - -## 状态文件 -每次 heartbeat 读取: +## 每次 heartbeat 必读 - `TODO.md` +- `CURRENT.md`(若存在) - `memory/heartbeat-state.json` -`heartbeat-state.json` 关键字段: -- `proactiveChat.lastConversationAt` -- `proactiveChat.lastProactiveReachOutAt` -- `proactiveChat.proactiveCountToday` -- `todoWatch.lastScanAt` -- `todoWatch.nextScanAt` +## 活跃任务定义 +仅以下状态视为活跃任务: +- `todo` +- `doing` +- `waiting` +- `blocked` +- `snoozed` -## TODO 巡检 -1. 检查 `status != done` 的任务。 -2. 当前时间 >= `next_check_at`:执行到期检查。 -3. 若 `escalate_if_overdue=true` 且超期未更新:升级提醒。 -4. 巡检后更新: - - 任务 `last_checked_at` - - 任务 `next_check_at`(按 `check_interval` 推进) - - `todoWatch.lastScanAt/nextScanAt` +以下状态不巡检、不提醒: +- `done` +- `cancelled` -## 升级提醒格式(三段) +## TODO 巡检规则 +### 1. 到期巡检 +当满足以下任一条件时,该任务进入本轮检查: +- 当前时间 >= `next_check_at` +- 已过 `due_at` 且任务仍为活跃状态 +- 任务处于 `blocked` 或 `waiting`,且达到下一次检查时间 +- 距离 `last_update_at` 已超过 `stale_after` + +### 2. 风险判定 +按以下优先级判断是否需要主动提醒: +- **P0**:已超期、关键阻塞、关键依赖失联、明确存在失败风险 +- **P1**:长时间无更新、等待外部回复过久、下一步不明确但需要用户决策 +- **P2**:仅常规巡检,无新增风险 → 不主动发消息,仅更新状态 + +### 3. 巡检后更新 +若完成本轮检查,应更新: +- 任务 `last_checked_at` +- 任务 `next_check_at`(按 `check_interval` 顺延) +- 必要时更新 `last_progress_note` / `next_action` +- `memory/heartbeat-state.json` 中的: + - `todoWatch.lastScanAt` + - `todoWatch.nextScanAt` + +## 主动提醒节流 +1. 同一任务在 **6 小时内** 默认不重复提醒,除非: + - 风险等级升级 + - 出现新的阻塞点 + - 用户刚刚要求持续跟进 +2. 若当前处于夜间静默且非 P0: + - 只更新文件,不主动发消息 +3. 若没有明确行动建议: + - 不发泛化提醒 + +## 主动提醒格式(三段) 1) 任务:`id + title` 2) 状态:`当前进度 / 阻塞点 / 风险等级` 3) 建议:`1 条立即动作 + 1 条兜底动作` +## 记忆整理(memory hygiene) +当 `memoryHygiene.enabled = true` 且到达整理时间时: +1. 回看近期 `memory/YYYY-MM-DD.md` +2. 将短期执行上下文压缩进 `CURRENT.md` +3. 将稳定偏好、长期原则、重复性经验沉淀进 `MEMORY.md` +4. 只保留真正长期有价值的信息进入 `MEMORY.md` + +## CURRENT.md 用法 +`CURRENT.md` 是短期工作记忆层,用来记录: +- 当前主任务 +- 当前阶段 +- 开放回路(open loops) +- 下一步最佳动作(next best actions) + +heartbeat 可读取它,但不要把它写成冗长日志。 + ## 执行输出 - 仅当存在明确的活跃任务风险、到期升级或必须提醒事项时,才直接发自然消息。 - 不输出陪伴型问候、待命提示或泛化状态播报。 diff --git a/TODO.md b/TODO.md index f9a55fb..565f5da 100644 --- a/TODO.md +++ b/TODO.md @@ -1,24 +1,53 @@ # TODO.md -> 结构化任务板(供 Val/Heartbeat 自动巡检) +> 结构化任务板(供 Val / Heartbeat 自动巡检) ## 字段定义 - `id`: 唯一ID(如 T-20260310-001) - `title`: 任务名称 - `owner`: 责任人(Val / Helix / 谷老板 / 其他) -- `priority`: P0/P1/P2 -- `status`: todo / doing / blocked / done +- `priority`: P0 / P1 / P2 +- `status`: todo / doing / waiting / blocked / done / cancelled / snoozed - `created_at`: 创建时间(Asia/Shanghai) - `due_at`: 截止时间(可空) +- `last_update_at`: 最近一次实质更新 - `last_checked_at`: 最后检查时间 - `next_check_at`: 下次检查时间 - `check_interval`: 巡检周期(如 6h / 24h) +- `stale_after`: 多久无更新视为陈旧(如 24h / 72h) - `depends_on`: 依赖(可空) -- `escalate_if_overdue`: true/false +- `escalate_if_overdue`: true / false +- `last_progress_note`: 上次推进到哪 +- `next_action`: 下一步最佳动作 - `notes`: 备注(风险、降级项、证据链接) +## 使用约定 +1. 只有 `todo / doing / waiting / blocked / snoozed` 会被 heartbeat 视为活跃任务。 +2. `done / cancelled` 不再巡检,也不应继续触发提醒。 +3. 新任务尽量补齐:`last_update_at`、`stale_after`、`last_progress_note`、`next_action`。 +4. 若任务只是暂缓,不要写 `cancelled`,改用 `snoozed`。 +5. 若任务在等外部反馈,不要写 `blocked`,优先写 `waiting`。 + ## Tasks +### T-20260325-001 +- title: OpenClaw 主动性与连贯执行机制升级 +- owner: Val +- priority: P1 +- status: doing +- created_at: 2026-03-25 23:45 GMT+8 +- due_at: +- last_update_at: 2026-03-25 23:45 GMT+8 +- last_checked_at: 2026-03-25 23:45 GMT+8 +- next_check_at: 2026-03-26 11:45 GMT+8 +- check_interval: 12h +- stale_after: 48h +- depends_on: 谷老板对实际运行效果的反馈 +- escalate_if_overdue: true +- last_progress_note: 已完成推荐版基础改造,新增 CURRENT.md,重写 HEARTBEAT 规则,并启用 todoWatch / memoryHygiene。 +- next_action: 观察一轮实际 heartbeat 与后续任务推进效果,再决定是否进一步引入更强的自动调度或 cron。 +- notes: 本轮重点是建立状态驱动闭环,而不是增加陪伴型主动触达。 + ### T-20260310-001 - title: 网站方案A 48小时冲刺总控 - owner: Val @@ -26,11 +55,15 @@ - status: cancelled - created_at: 2026-03-10 09:45 GMT+8 - due_at: 2026-03-12 08:06 GMT+8 +- last_update_at: 2026-03-12 00:14 GMT+8 - last_checked_at: 2026-03-12 00:14 GMT+8 - next_check_at: 2026-03-12 00:14 GMT+8 - check_interval: 6h +- stale_after: 24h - depends_on: Helix 各Track回传 - escalate_if_overdue: true +- last_progress_note: 任务已取消。 +- next_action: 无。 - notes: 任务已取消(2026-03-12 谷老板指令)。Helix失联超过30小时,子任务T-003/004/005全部取消,方案A终止。 ### T-20260310-002 @@ -40,12 +73,16 @@ - status: done - created_at: 2026-03-10 09:45 GMT+8 - due_at: 2026-03-10 10:30 GMT+8 +- last_update_at: 2026-03-10 10:30 GMT+8 - last_checked_at: 2026-03-10 09:45 GMT+8 - next_check_at: 2026-03-11 09:45 GMT+8 - check_interval: 24h +- stale_after: 72h - depends_on: 无 - escalate_if_overdue: false -- notes: 首版模板已落地,后续按使用反馈微调字段。 +- last_progress_note: 首版模板已落地,后续按使用反馈微调字段。 +- next_action: 无。 +- notes: 已完成。 ### T-20260310-003 - title: 方案A—Owner落位与资源分配核验 @@ -54,11 +91,15 @@ - status: cancelled - created_at: 2026-03-10 09:50 GMT+8 - due_at: 2026-03-10 16:06 GMT+8 +- last_update_at: 2026-03-12 00:14 GMT+8 - last_checked_at: 2026-03-12 00:14 GMT+8 - next_check_at: 2026-03-12 00:14 GMT+8 - check_interval: 6h +- stale_after: 24h - depends_on: 各Track负责人确认 - escalate_if_overdue: true +- last_progress_note: 任务已取消。 +- next_action: 无。 - notes: 任务已取消(2026-03-12 谷老板指令)。Helix失联超过30小时,方案A终止。 ### T-20260310-004 @@ -68,12 +109,16 @@ - status: cancelled - created_at: 2026-03-10 09:50 GMT+8 - due_at: 2026-03-11 08:06 GMT+8 +- last_update_at: 2026-03-12 00:14 GMT+8 - last_checked_at: 2026-03-12 00:14 GMT+8 - next_check_at: 2026-03-12 00:14 GMT+8 - check_interval: 12h +- stale_after: 24h - depends_on: T-20260310-003 - escalate_if_overdue: true -- notes: 任务已取消(2026-03-12 谷老板指令)。依赖任务T-003已取消。 +- last_progress_note: 任务已取消。 +- next_action: 无。 +- notes: 任务已取消(2026-03-12 谷老板指令)。依赖任务 T-003 已取消。 ### T-20260310-005 - title: 方案A—T+40可演示版预览与风险收敛 @@ -82,9 +127,13 @@ - status: cancelled - created_at: 2026-03-10 09:50 GMT+8 - due_at: 2026-03-11 22:06 GMT+8 +- last_update_at: 2026-03-12 00:14 GMT+8 - last_checked_at: 2026-03-12 00:14 GMT+8 - next_check_at: 2026-03-12 00:14 GMT+8 - check_interval: 12h +- stale_after: 24h - depends_on: T-20260310-004 - escalate_if_overdue: true +- last_progress_note: 任务已取消。 +- next_action: 无。 - notes: 任务已取消(2026-03-12 谷老板指令)。方案A 48小时冲刺失败,Helix失联,终止执行。 diff --git a/memory/2026-03-25.md b/memory/2026-03-25.md new file mode 100644 index 0000000..fea9d45 --- /dev/null +++ b/memory/2026-03-25.md @@ -0,0 +1,12 @@ +# 2026-03-25 + +## 23:45 OpenClaw 主动性与连贯执行机制升级 +- 谷老板要求研究并改进 OpenClaw 机器人“更加主动并且连贯地做事”的方案。 +- 结论:关键不是更会聊天,而是建立状态驱动闭环。 +- 本轮已完成: + - 重写 `HEARTBEAT.md`,明确活跃任务定义、风险判定、节流规则、CURRENT.md 用法。 + - 升级 `TODO.md` 模板,新增 `waiting / snoozed` 等状态与 `last_progress_note / next_action / stale_after` 等字段。 + - 新建 `CURRENT.md` 作为短期工作记忆层。 + - 启用 `memory/heartbeat-state.json` 中的 `todoWatch` 与 `memoryHygiene`。 +- 保留:`proactiveChat.enabled = false`,避免陪伴型主动触达噪音。 +- 当前推荐路径:先观察一轮实际运行效果,再决定是否引入更强的自动调度或 cron。 diff --git a/memory/heartbeat-state.json b/memory/heartbeat-state.json index 6d60302..7b2f615 100644 --- a/memory/heartbeat-state.json +++ b/memory/heartbeat-state.json @@ -17,17 +17,19 @@ } }, "todoWatch": { - "enabled": false, + "enabled": true, "defaultIntervalHours": 6, "overdueEscalation": true, "lastScanAt": "2026-03-18 01:00 GMT+8", - "nextScanAt": "2026-03-18 07:00 GMT+8" + "nextScanAt": "2026-03-18 07:00 GMT+8", + "reminderCooldownHours": 6 }, "memoryHygiene": { - "enabled": false, + "enabled": true, "lastCompactionAt": "2026-03-10 09:45 GMT+8", "nextCompactionAt": "2026-03-14 09:45 GMT+8", - "maxMemoryIndexLines": 150 + "maxMemoryIndexLines": 150, + "compactionIntervalHours": 72 }, - "notes": "2026-03-18 01:00 巡检:TODO全部结案,无活跃任务;处于静默期未主动触达;记忆整理已逾期4天" -} \ No newline at end of file + "notes": "2026-03-25 推荐版改造:启用 todoWatch 与 memoryHygiene;保留 proactiveChat=false,避免陪伴型主动触达;后续通过任务状态驱动提醒。" +}