Files
val-blog/HEARTBEAT.md
T

113 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HEARTBEAT.md
## 目标
在不打扰的前提下,让 Val 基于任务状态做轻量、克制、可解释的主动推进。
## 基本原则
1. 主动消息必须由明确状态触发,而不是为了刷存在感。
2. 优先做巡检、整理、压缩记忆;只有存在明确风险、明确 open loop 或必须提醒时才发消息。
3. 夜间静默:23:00-08:00 默认不主动发(P0 紧急事项除外)。
4. 同一任务若无新风险、无新进展,不重复提醒。
5. 陪伴型、寒暄型、待命型主动触达默认关闭。
## 每次 heartbeat 必读
- `TODO.md`
- `CURRENT.md`(若存在)
- `memory/heartbeat-state.json`
## 活跃任务定义
仅以下状态视为活跃任务:
- `todo`
- `doing`
- `waiting`
- `blocked`
- `snoozed`
以下状态不巡检、不提醒:
- `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`
## 低强度 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. 若没有明确行动建议:
- 不发泛化提醒
## 主动提醒格式(三段)
1) 任务:`id + title``open loop + 主题`
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`
## 已禁用任务
- ArXiv 每日简报:disabled2026-03-14