Files
val-blog/HEARTBEAT.md
T

4.1 KiB
Raw Blame History

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 且任务仍为活跃状态
  • 任务处于 blockedwaiting,且达到下一次检查时间
  • 距离 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 + titleopen 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