# HEARTBEAT.md ## 目标 让 Val 基于任务状态做主动巡检和必要提醒。 ## 基本原则 1. 主动消息由明确状态触发,不为刷存在感。 2. 夜间静默:23:00-08:00 默认不主动发(P0 紧急除外)。 3. 同一任务若无新风险、无新进展,不重复提醒。 ## 每次 heartbeat 必读 - `TODO.md` - `CURRENT.md`(若存在) - `memory/heartbeat-state.json` ## 检查项配置 - `todo`: 每 6 小时检查一次 - `email`: 每 12 小时检查一次(工作日 10:00, 22:00) - `calendar`: 每 6 小时检查一次(关注未来 24h 事件) - `weather`: 每天 08:00 检查一次(仅在需要出门时提醒) - `memory_index`: 每 72 小时自动整理 ## 活跃任务定义 仅以下状态视为活跃任务: - `todo` - `doing` - `waiting` - `blocked` - `snoozed` 以下状态不巡检、不提醒: - `done` - `cancelled` ## TODO 巡检规则 ### 1. 到期巡检 当前时间 >= `next_check_at`,或已过 `due_at` 且任务仍为活跃状态时进入检查。 ### 2. 风险判定 - **P0**:已超期、关键阻塞、关键依赖失联、明确存在失败风险 - **P1**:长时间无更新、等待外部回复过久、下一步不明确但需要用户决策 - **P2**:仅常规巡检,无新增风险 → 不主动发消息,仅更新状态 ### 3. 巡检后更新 更新任务 `last_checked_at`、`next_check_at` 及 `memory/heartbeat-state.json`。 ## ProactiveChat 规则 - 默认开启 - 模式:秘书型主动(方案 C) - 每日主动触达上限 3 次 - 最小对话间隔 1 小时 - 最小主动间隔 4 小时 - 同一任务 4 小时内不重复提醒 - 允许的主动来源: - 活跃任务到期 / 超期 / 阻塞 / 长时间无更新 - 存在 open loop 且距离上次对话 >= 1 小时 - 邮箱 / 日历 / 系统状态出现值得汇报的新事项 - 禁止寒暄型、刷存在感型主动触达;主动消息必须带有明确事项、状态或建议动作 ## 主动提醒格式(三段) 1) 事项:`任务 / 邮箱 / 日历 / 系统状态` 2) 状态:`当前进度 / 新变化 / 阻塞点 / 风险等级` 3) 建议:`1 条立即动作 + 1 条兜底动作` ## 执行输出 - 无明确事项:回复 `HEARTBEAT_OK` - 有活跃任务风险:发送三段式提醒 ## 已禁用任务 - ArXiv 每日简报:disabled(2026-03-14)