From f4e354a9ba66dfcd2cd1431ab43ca3312aca805d Mon Sep 17 00:00:00 2001 From: Chen Gu Date: Thu, 26 Mar 2026 09:21:05 +0800 Subject: [PATCH] Tune proactive mode to secretary-active --- .learnings/ERRORS.md | 30 ++++++++++++ .learnings/LEARNINGS.md | 27 +++++++++++ CURRENT.md | 6 ++- HEARTBEAT.md | 93 +++++++++---------------------------- memory/2026-03-26.md | 19 ++++++++ memory/heartbeat-state.json | 28 ++++------- 6 files changed, 112 insertions(+), 91 deletions(-) create mode 100644 memory/2026-03-26.md diff --git a/.learnings/ERRORS.md b/.learnings/ERRORS.md index 43700c6..1e8d1cc 100644 --- a/.learnings/ERRORS.md +++ b/.learnings/ERRORS.md @@ -2,3 +2,33 @@ > Command failures, tool errors, API issues, and unexpected behavior. +## [ERR-20260326-001] memory_search + +**Logged**: 2026-03-26T09:11:25+0800 +**Priority**: medium +**Status**: pending +**Area**: config + +### Summary +memory_search 当前不可用,返回 embedding/provider 错误 + +### Error +``` +Memory search is unavailable due to an embedding/provider error. +fetch failed +``` + +### Context +- Operation attempted: 调用 memory_search 检索 prior work / decisions / preferences / todos +- Result: disabled=true, unavailable=true +- Impact: 需要回忆历史决策时无法走语义检索链路,只能退回到直接读文件 + +### Suggested Fix +检查 memory_search 依赖的 embedding/provider 配置与可用性,恢复后重新验证长期记忆检索。 + +### Metadata +- Reproducible: unknown +- Related Files: MEMORY.md, memory/*.md + +--- + diff --git a/.learnings/LEARNINGS.md b/.learnings/LEARNINGS.md index 38bee3d..a4e9570 100644 --- a/.learnings/LEARNINGS.md +++ b/.learnings/LEARNINGS.md @@ -2,3 +2,30 @@ > Corrections, knowledge gaps, and better repeatable approaches. +## [LRN-20260326-001] best_practice + +**Logged**: 2026-03-26T09:11:25+0800 +**Priority**: high +**Status**: pending +**Area**: config + +### Summary +主动机制只按风险/到期触发会显得过于安静,不符合谷老板对“秘书型主动”的预期 + +### Details +当前 heartbeat 规则过度强调减少打扰,只在 TODO 活跃任务出现到期、超期、阻塞或明确风险时才主动发消息。结果虽然降低了噪音,但也削弱了陪伴感与推进感。谷老板明确反馈“你太安静了”,并在方案选择上倾向更强主动型(方案 C)。后续默认应采用“有价值的秘书型主动”,允许围绕 open loop、邮箱、日历、系统状态做低频高价值触达,而不是仅在任务风险触发时说话。 + +### Suggested Action +将主动策略升级为秘书型主动:保留任务风险驱动,同时加入 open loop follow-up 与邮箱/日历/系统状态巡检;保持夜间静默和节流,禁止寒暄型主动。 + +### Metadata +- Source: user_feedback +- Related Files: HEARTBEAT.md, CURRENT.md, memory/heartbeat-state.json +- Tags: proactive, heartbeat, user-preference, secretary-mode +- Pattern-Key: proactive.too_quiet_due_to_overconstrained_rules +- Recurrence-Count: 1 +- First-Seen: 2026-03-26 +- Last-Seen: 2026-03-26 + +--- + diff --git a/CURRENT.md b/CURRENT.md index b521505..c304b87 100644 --- a/CURRENT.md +++ b/CURRENT.md @@ -9,13 +9,15 @@ ## Open Loops - TODO 状态机已扩展,但后续新任务需要按新字段填写 -- heartbeat 规则已收紧,后续需观察是否过于保守或过于安静 +- heartbeat 已切换到秘书型主动(方案 C),需观察主动提醒是否足够有价值且不过度打扰 - memory hygiene 已打开,后续需要验证整理节奏是否合适 +- 后续需补上邮箱 / 日历 / 系统状态的巡检闭环与节流策略 ## Next Best Actions 1. 用新模板登记未来需要持续推进的任务 2. 在新任务中补齐 `last_progress_note`、`next_action`、`last_update_at`、`stale_after` -3. 观察一段时间主动提醒是否足够及时且不过度打扰 +3. 观察一段时间秘书型主动提醒是否足够及时且不过度打扰 +4. 在 heartbeat 中逐步接入邮箱 / 日历 / 系统状态巡检 ## Notes - 目标不是让机器人更爱说话,而是让它更会持续推进事情。 diff --git a/HEARTBEAT.md b/HEARTBEAT.md index 5d12941..f1e8461 100644 --- a/HEARTBEAT.md +++ b/HEARTBEAT.md @@ -1,14 +1,12 @@ # HEARTBEAT.md ## 目标 -在不打扰的前提下,让 Val 基于任务状态做轻量、克制、可解释的主动推进。 +让 Val 基于任务状态做主动巡检和必要提醒。 ## 基本原则 -1. 主动消息必须由明确状态触发,而不是为了刷存在感。 -2. 优先做巡检、整理、压缩记忆;只有存在明确风险、明确 open loop 或必须提醒时才发消息。 -3. 夜间静默:23:00-08:00 默认不主动发(P0 紧急事项除外)。 -4. 同一任务若无新风险、无新进展,不重复提醒。 -5. 陪伴型、寒暄型、待命型主动触达默认关闭。 +1. 主动消息由明确状态触发,不为刷存在感。 +2. 夜间静默:23:00-08:00 默认不主动发(P0 紧急除外)。 +3. 同一任务若无新风险、无新进展,不重复提醒。 ## 每次 heartbeat 必读 - `TODO.md` @@ -29,84 +27,37 @@ ## TODO 巡检规则 ### 1. 到期巡检 -当满足以下任一条件时,该任务进入本轮检查: -- 当前时间 >= `next_check_at` -- 已过 `due_at` 且任务仍为活跃状态 -- 任务处于 `blocked` 或 `waiting`,且达到下一次检查时间 -- 距离 `last_update_at` 已超过 `stale_after` +当前时间 >= `next_check_at`,或已过 `due_at` 且任务仍为活跃状态时进入检查。 ### 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` +更新任务 `last_checked_at`、`next_check_at` 及 `memory/heartbeat-state.json`。 -## 低强度 proactiveChat 规则 -当 `proactiveChat.enabled = true` 时,只允许以下类型的主动触达: -1. 对明确 open loop 的轻量 follow-up -2. 对最近讨论过、且存在明确下一步建议的事项做一次续接 -3. 对未正式写入 TODO、但短期内明显值得继续推进的事项做一次提醒 - -### 触发条件 -需同时满足以下约束: -- 距上次对话已超过 `minHoursSinceLastConversation` -- 距上次主动触达已超过 `minHoursBetweenProactive` -- 当日主动触达次数未超过 `maxProactivePerDay` -- 当前不在 quiet hours -- 本次消息必须包含明确事项与明确建议,不能只是寒暄 - -### 禁止触发 -以下情况不允许 proactiveChat 主动发消息: -- 只是打招呼、问候、刷存在感 -- 没有具体事项、没有明确建议 -- 同一 open loop 在短时间内重复催促 -- 夜间静默期间的非 P0 事项 - -## 主动提醒节流 -1. 同一任务在 **6 小时内** 默认不重复提醒,除非: - - 风险等级升级 - - 出现新的阻塞点 - - 用户刚刚要求持续跟进 -2. proactiveChat 在 **12 小时内** 默认不重复主动触达,且每天最多 **1 次**。 -3. 若当前处于夜间静默且非 P0: - - 只更新文件,不主动发消息 -4. 若没有明确行动建议: - - 不发泛化提醒 +## ProactiveChat 规则 +- 默认开启 +- 模式:秘书型主动(方案 C) +- 每日主动触达上限 3 次 +- 最小对话间隔 1 小时 +- 最小主动间隔 4 小时 +- 同一任务 4 小时内不重复提醒 +- 允许的主动来源: + - 活跃任务到期 / 超期 / 阻塞 / 长时间无更新 + - 存在 open loop 且距离上次对话 >= 1 小时 + - 邮箱 / 日历 / 系统状态出现值得汇报的新事项 +- 禁止寒暄型、刷存在感型主动触达;主动消息必须带有明确事项、状态或建议动作 ## 主动提醒格式(三段) -1) 任务:`id + title` 或 `open loop + 主题` -2) 状态:`当前进度 / 阻塞点 / 风险等级` +1) 事项:`任务 / 邮箱 / 日历 / 系统状态` +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 可读取它,但不要把它写成冗长日志。 - ## 执行输出 -- 仅当存在明确的活跃任务风险、到期升级、明确 open loop 或必须提醒事项时,才直接发自然消息。 -- 不输出陪伴型问候、待命提示或泛化状态播报。 -- 本轮无事项:回复 `HEARTBEAT_OK`。 +- 无明确事项:回复 `HEARTBEAT_OK` +- 有活跃任务风险:发送三段式提醒 ## 已禁用任务 - ArXiv 每日简报:disabled(2026-03-14) diff --git a/memory/2026-03-26.md b/memory/2026-03-26.md new file mode 100644 index 0000000..92b4569 --- /dev/null +++ b/memory/2026-03-26.md @@ -0,0 +1,19 @@ +# 2026-03-26 + +## 09:20 主动策略升级为秘书型主动(方案 C) +- 谷老板对“Val 太安静、一直没触发消息”给出直接反馈。 +- 分析结论:当前 heartbeat 过度保守,主要只在任务到期/超期/阻塞/风险时主动,导致系统虽稳但过于安静。 +- 谷老板在 A/B/C 方案中明确倾向 C(更强秘书型主动)。 +- 已执行调整: + - HEARTBEAT.md 改为“秘书型主动(方案 C)” + - 将主动来源扩展为:todo / open_loop / email / calendar / system + - 将最小对话间隔调整为 1 小时,最小主动间隔调整为 4 小时 + - 保留每日最多 3 次、夜间静默、禁止寒暄型主动 +- 后续观察点: + - 主动提醒是否足够有价值 + - 是否仍需进一步接入邮箱 / 日历 / 系统状态的实际巡检流程 + +## 09:11 记忆检索链路异常 +- memory_search 返回 disabled/unavailable,提示 embedding/provider error 与 fetch failed。 +- 当前需要回忆历史决策时,只能先退回直接读 MEMORY.md / memory/*.md。 +- 后续应排查 provider 配置与可用性。 diff --git a/memory/heartbeat-state.json b/memory/heartbeat-state.json index f6837bb..ba84d83 100644 --- a/memory/heartbeat-state.json +++ b/memory/heartbeat-state.json @@ -3,19 +3,16 @@ "email": null, "calendar": null, "weather": null, - "todo": 1773355200, - "memory_index": 1773116700 + "todo": null, + "memory_index": null }, "proactiveChat": { "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, + "mode": "secretary-active", + "maxProactivePerDay": 3, + "minHoursSinceLastConversation": 1, + "minHoursBetweenProactive": 4, + "allowedSources": ["todo", "open_loop", "email", "calendar", "system"], "quietHours": { "start": "23:00", "end": "08:00" @@ -24,16 +21,11 @@ "todoWatch": { "enabled": true, "defaultIntervalHours": 6, - "overdueEscalation": true, - "lastScanAt": "2026-03-18 01:00 GMT+8", - "nextScanAt": "2026-03-18 07:00 GMT+8", - "reminderCooldownHours": 6 + "overdueEscalation": true }, "memoryHygiene": { "enabled": true, - "lastCompactionAt": "2026-03-10 09:45 GMT+8", - "nextCompactionAt": "2026-03-14 09:45 GMT+8", "maxMemoryIndexLines": 150, "compactionIntervalHours": 72 - }, - "notes": "2026-03-25 调整为低强度 proactiveChat:仅针对明确 open loop 做轻量 follow-up;12 小时冷却;每天最多 1 次;夜间静默;不做寒暄型主动触达。" + } +}