From 87cc1b13798579d37e71269c82a3328de7d9ff43 Mon Sep 17 00:00:00 2001 From: Chen Gu Date: Wed, 25 Mar 2026 23:49:11 +0800 Subject: [PATCH] Enable low-intensity proactive chat --- HEARTBEAT.md | 40 ++++++++++++++++++++++++++++--------- memory/2026-03-25.md | 14 ++++++++++++- memory/heartbeat-state.json | 12 +++++++---- 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/HEARTBEAT.md b/HEARTBEAT.md index 5ef14fa..5d12941 100644 --- a/HEARTBEAT.md +++ b/HEARTBEAT.md @@ -4,11 +4,11 @@ 在不打扰的前提下,让 Val 基于任务状态做轻量、克制、可解释的主动推进。 ## 基本原则 -1. 默认不做陪伴型主动触达。 -2. 主动消息必须由明确状态触发,而不是为了刷存在感。 -3. 优先做巡检、整理、压缩记忆;只有存在明确风险或必须提醒时才发消息。 -4. 夜间静默:23:00-08:00 默认不主动发(P0 紧急事项除外)。 -5. 同一任务若无新风险、无新进展,不重复提醒。 +1. 主动消息必须由明确状态触发,而不是为了刷存在感。 +2. 优先做巡检、整理、压缩记忆;只有存在明确风险、明确 open loop 或必须提醒时才发消息。 +3. 夜间静默:23:00-08:00 默认不主动发(P0 紧急事项除外)。 +4. 同一任务若无新风险、无新进展,不重复提醒。 +5. 陪伴型、寒暄型、待命型主动触达默认关闭。 ## 每次 heartbeat 必读 - `TODO.md` @@ -50,18 +50,40 @@ - `todoWatch.lastScanAt` - `todoWatch.nextScanAt` +## 低强度 proactiveChat 规则 +当 `proactiveChat.enabled = true` 时,只允许以下类型的主动触达: +1. 对明确 open loop 的轻量 follow-up +2. 对最近讨论过、且存在明确下一步建议的事项做一次续接 +3. 对未正式写入 TODO、但短期内明显值得继续推进的事项做一次提醒 + +### 触发条件 +需同时满足以下约束: +- 距上次对话已超过 `minHoursSinceLastConversation` +- 距上次主动触达已超过 `minHoursBetweenProactive` +- 当日主动触达次数未超过 `maxProactivePerDay` +- 当前不在 quiet hours +- 本次消息必须包含明确事项与明确建议,不能只是寒暄 + +### 禁止触发 +以下情况不允许 proactiveChat 主动发消息: +- 只是打招呼、问候、刷存在感 +- 没有具体事项、没有明确建议 +- 同一 open loop 在短时间内重复催促 +- 夜间静默期间的非 P0 事项 + ## 主动提醒节流 1. 同一任务在 **6 小时内** 默认不重复提醒,除非: - 风险等级升级 - 出现新的阻塞点 - 用户刚刚要求持续跟进 -2. 若当前处于夜间静默且非 P0: +2. proactiveChat 在 **12 小时内** 默认不重复主动触达,且每天最多 **1 次**。 +3. 若当前处于夜间静默且非 P0: - 只更新文件,不主动发消息 -3. 若没有明确行动建议: +4. 若没有明确行动建议: - 不发泛化提醒 ## 主动提醒格式(三段) -1) 任务:`id + title` +1) 任务:`id + title` 或 `open loop + 主题` 2) 状态:`当前进度 / 阻塞点 / 风险等级` 3) 建议:`1 条立即动作 + 1 条兜底动作` @@ -82,7 +104,7 @@ heartbeat 可读取它,但不要把它写成冗长日志。 ## 执行输出 -- 仅当存在明确的活跃任务风险、到期升级或必须提醒事项时,才直接发自然消息。 +- 仅当存在明确的活跃任务风险、到期升级、明确 open loop 或必须提醒事项时,才直接发自然消息。 - 不输出陪伴型问候、待命提示或泛化状态播报。 - 本轮无事项:回复 `HEARTBEAT_OK`。 diff --git a/memory/2026-03-25.md b/memory/2026-03-25.md index fea9d45..dc2f11a 100644 --- a/memory/2026-03-25.md +++ b/memory/2026-03-25.md @@ -8,5 +8,17 @@ - 升级 `TODO.md` 模板,新增 `waiting / snoozed` 等状态与 `last_progress_note / next_action / stale_after` 等字段。 - 新建 `CURRENT.md` 作为短期工作记忆层。 - 启用 `memory/heartbeat-state.json` 中的 `todoWatch` 与 `memoryHygiene`。 -- 保留:`proactiveChat.enabled = false`,避免陪伴型主动触达噪音。 +- 保留:先不做高频陪伴型主动触达,避免噪音。 - 当前推荐路径:先观察一轮实际运行效果,再决定是否引入更强的自动调度或 cron。 + +## 23:48 低强度 proactiveChat 启用 +- 谷老板选择方案 B:低强度开启 proactiveChat。 +- 已调整为: + - `enabled = true` + - `mode = low-intensity` + - 仅针对明确 open loop 做轻量 follow-up + - `minHoursSinceLastConversation = 12` + - `minHoursBetweenProactive = 12` + - `maxProactivePerDay = 1` + - 夜间静默保留 +- 原则:允许少量“续接式主动”,但禁止寒暄型、刷存在感型主动触达。 diff --git a/memory/heartbeat-state.json b/memory/heartbeat-state.json index 7b2f615..f6837bb 100644 --- a/memory/heartbeat-state.json +++ b/memory/heartbeat-state.json @@ -7,10 +7,15 @@ "memory_index": 1773116700 }, "proactiveChat": { - "enabled": false, - "lastConversationAt": "2026-03-14 11:35 GMT+8", + "enabled": true, + "mode": "low-intensity", + "lastConversationAt": "2026-03-25 23:48 GMT+8", "lastProactiveReachOutAt": "2026-03-14 14:40 GMT+8", "proactiveCountToday": 0, + "maxProactivePerDay": 1, + "minHoursSinceLastConversation": 12, + "minHoursBetweenProactive": 12, + "onlyForClearOpenLoops": true, "quietHours": { "start": "23:00", "end": "08:00" @@ -31,5 +36,4 @@ "maxMemoryIndexLines": 150, "compactionIntervalHours": 72 }, - "notes": "2026-03-25 推荐版改造:启用 todoWatch 与 memoryHygiene;保留 proactiveChat=false,避免陪伴型主动触达;后续通过任务状态驱动提醒。" -} + "notes": "2026-03-25 调整为低强度 proactiveChat:仅针对明确 open loop 做轻量 follow-up;12 小时冷却;每天最多 1 次;夜间静默;不做寒暄型主动触达。"