存活检查

本条目是「Loop Engineering」的第 13 部分,对应学习清单条目 6.3.3。

前置依赖:爆炸半径、断路器 为以下铺垫:Closed Loop脚本、看门狗熔断


一、核心观点

存活检查(heartbeat) = 让 Loop 定时「报平安」:每次运行往状态文件写个带时间戳的心跳,长时间没更新 = 它已经死了(或卡死),该重启或告警。

就像ICU 的监护仪——没波浪线了,不是「病人很乖」,是「病人没气了」。


二、定义与原理

存活检查(heartbeat) 是检测 Loop 是否还「活着」的机制。它和断路器互补:断路器管「是不是在兜圈子」,存活检查管「是不是还动得了」。

  • 写心跳:每步/每轮向状态文件写 {timestamp, status},证明「我还活着」。
  • 检心跳:外部 watchdog 定期检查,超过 timeout 没更新 → 判定已死。
  • 恢复:重启 Loop,或通知人工介入。
graph TD
    Loop["Loop 运行中"] --> W["写心跳 heartbeat.json<br/>带时间戳"]
    Watch["外部 Watchdog 定时检"] --> C{"距上次心跳<br/>> timeout?"}
    C -->|否| OK["✅ 还活着"]
    C -->|是| Dead["💀 判定已死<br/>重启 / 告警"]

为什么必须「外部」检查:心跳由 Loop 自己写,但判死应由 Loop 之外的进程做——否则 Loop 卡死时,连心跳都不会写了,自己查自己永远「活着」(呼应 预算护栏 的「进程外强制」原则)。


三、实践与示例

心跳读写骨架(概念极简):

def write_heartbeat(path="heartbeat.json"):
    json.dump({"ts": datetime.now().isoformat(), "status": "alive"},
              open(path, "w"))
 
def is_alive(path="heartbeat.json", timeout=300):
    if not os.path.exists(path): return False
    last = datetime.fromisoformat(json.load(open(path))["ts"])
    return (datetime.now() - last).seconds <= timeout

实战经验:长程 Agent「跑了一夜到早上变敷衍」是 Context Rot 的典型表现(claudelab 田野笔记:历史跨过 ~150K token 后,违反顶部约束的回复明显变多,claudelab.net)——存活检查 + 上下文压缩要配合用。


四、优势与局限

  • 静默失败可见:Loop 卡死但不报错时,心跳是唯一会说话的哨兵。
  • 可自治恢复:配合看门狗(见 15)可自动重启。
  • 假活:Loop 可能「还在写心跳但已无进展」——心跳只证明在动,不证明在前进,需与无进展检测叠加。
  • timeout 难定:太短误判、太长发现太晚。

五、最新研究与企业数据(2024–2026)

  • 长程 Agent 的「清晨变傻」:claudelab (2026) 田野笔记记录,Agent 跑通宵后 commit message 变敷衍、忽略前半段指令,根因是上下文稀释而非模型变差,需靠 compaction + 心跳式健康检查(claudelab.net)。
  • $47K 事故的对照:那系统「无 loop detection、无成本异常告警」——若有存活 / 循环检测,11 天里早该有人 / 有狗来拔插头(supervaize.com)。
  • 关于「心跳超时阈值与误判率」的量化基准,缺少一手数据——(来源待核实:若有长程 Agent 健康检查阈值实验,此处应引用)

六、学习资源

  • claudelab (2026)《When a Long-Running Agent’s Context Quietly Decays》:claudelab.net
  • Supervaize (2025-10) $47K 复盘
  • 进阶看门狗熔断(带熔断的 watchdog)· 断路器

核心要点

  • 一句话:存活检查 = 让 Loop 定时报平安,静默 = 已死,该重启 / 告警。
  • 分工:断路器管「兜圈子」,存活检查管「还动不动」。
  • 铁律:判死要在 Loop 进程外做,否则卡死时连心跳都不写。
  • :假活——还在写心跳但已无进展,需叠无进展检测。

参考来源(一手链接 · 可溯源深挖)

速记卡(面试闪卡)

Q1:一句话讲清「存活检查」到底是什么? A:存活检查 = 让 Loop 定时报平安,长时间没心跳就判定已死,该重启或告警。

Q2:一、核心观点 —— 怎么理解? A:像 ICU 监护仪:没波浪线不是病人乖,是没气了。心跳由 Loop 自己写,但判死必须由 Loop 之外的进程做——否则卡死时连心跳都不写,自己查自己永远”活着”。

Q3:二、定义与原理 —— 怎么理解? A:存活检查是检测 Loop 是否还”活着”的机制,和断路器互补:断路器管”是不是在兜圈子”,存活检查管”是不是还动得了”。三动作:写心跳、外部 watchdog 检心跳、恢复。

Q4:三、实践与示例 —— 怎么理解? A:心跳就是写/读带时间戳的 json:write_heartbeat 写 ts+status,is_alive 比当前时间与上次差是否 ≤ timeout。像外卖员每步打卡,超时不打卡平台就派别人。

Q5:四、优势与局限 —— 怎么理解? A:优势:静默失败可见、可自治恢复;局限:假活(还在写心跳但已无进展,需叠无进展检测)、timeout 难定(太短误判、太长发现太晚)。像打卡机只能证明人到,不能证明在干活。

Q6:核心速记主线有哪些?

  • 定时报平安:写带时间戳心跳
  • 判死必须外部进程,防自欺
  • 与断路器互补:兜圈 vs 不动
  • 假活陷阱;timeout 需权衡

口诀 A:Loop 定时报平安,心跳记时间; 判死靠外部,自查总谎言。 卡死无声息,哨兵先发现; 假活须叠加,超时细细辨。

相关链接