17Long-Running Agent

L3P0五步章 · 概念章
Why · 为什么要学
用户让 agent 重构一个 30 万行的 codebase——这个任务在一个 context window 里塞不下。怎么让它跑 3 天?Anthropic 2025-11 原话比喻:"想象一个软件项目由轮班的工程师完成,每个新人上岗时都不记得上一班发生了什么"。Long-Running Agent 是当下 harness 工程的真正前沿——把"单次 LLM 调用"扩展到"跨多天、跨多 session 的工程任务"。不懂这一节,你做不出 Claude Code / Devin / Cursor 级别的产品。
1 ·核心要点

核心问题:长任务必须跨多个 context window,而每个新 session 没有前一个的记忆。简单 compaction(把历史摘要塞回去)在超长任务下信息漂移严重——agent 会"忘记自己做过什么"。

解法:双 agent 架构

┌─────────────────────────────────────┐
│  Initializer Agent (跑一次)         │
│    · 探索 codebase                  │
│    · 生成 plan.md (任务拆解)        │
│    · 配环境(install deps、env)     │
│    · 写空 progress.md               │
└─────────────────────────────────────┘
                  ↓
┌─────────────────────────────────────┐
│  Coding Agent (反复唤起)            │
│    每次启动:                         │
│      1. 读 plan.md + progress.md    │
│      2. 推进 1~2 个 feature         │
│      3. 更新 progress.md            │
│      4. 触发 context reset          │
│      5. 下一轮从干净 context 起     │
└─────────────────────────────────────┘
        ↑ ← 共享文档作为 cross-session memory ← ↓

关键设计 1:共享文档作为唯一持久状态plan.md + progress.md 是 agent 的"班次交接表"。必须结构化:

# progress.md 标准模板
## 已完成
- [x] 重构 auth 模块为 async
- [x] 添加单元测试

## 进行中
- [ ] 迁移 DB schema(改了 3/8 张表)

## 阻塞
- payment 模块的 stripe webhook 测试需要 mock

## 下一步
1. 完成剩余 5 张表的 schema 迁移
2. 跑全量测试

关键设计 2:Initializer 和 Coding agent 用不同 system prompt。Initializer 任务是"读懂 + 拆解",Coding agent 任务是"按 progress 推进"——两个 system prompt 优化目标完全不同,共用会两边都不好。

关键设计 3:reset 策略。每次 Coding agent run 在 context 用到 60-70% 时主动触发 reset(把状态写入 progress.md → 撕掉 context → 新 session 读 progress 继续),不要等到 95% 才被动 compact。

模型代际差异(重要):Claude Sonnet 4.5 有 context anxiety(感觉 context 快满会提前结束任务)——这套架构就是为它优化的。但 Opus 4.5 已不再需要 context anxiety,可以在一个 session 跑更久(见 #27)。harness 设计要预设模型迭代。

2 ·真实系统拆解
概念章 + 架构章——用 Claude Code 长任务模式做案例

Claude Code 在 long-running 模式下的工作流(基于 Anthropic 公开博客):

Day 1, Session 1:
  User → "重构整个 auth 系统为 OAuth2"
  Initializer:
    - 扫描所有 auth 相关文件 (50 个)
    - 写 plan.md:列 12 个 milestone
    - 写 progress.md(空)
    - exit

Day 1, Session 2 (用户回来):
  Coding Agent reads:
    plan.md → 12 milestone
    progress.md → 全部未完成
  推进 milestone 1-2 (改 token 生成模块)
  Update progress.md:
    [x] milestone 1, [x] milestone 2
  触发 reset, exit

Day 2, Session 3:
  Coding Agent reads:
    plan.md(不变)
    progress.md(2 完成,10 待办)
  推进 milestone 3-4
  ...继续 N 天

对比:如果不用这个架构,把 50 个文件 + 12 个 milestone 全塞进 context,Sonnet 4.5 跑到一半就 context anxiety 退出,Opus 4.5 也会因为 attention 衰减而出错。

3 ·工程权衡

何时用 Long-Running 双 agent 架构

  1. 任务需 > 1 个 context window 才能完成——大型重构、跨多文件迁移、多日积累的研究
  2. 用户可接受异步执行——不需要立即看到结果,可以分多次回来检查
  3. 任务可以结构化拆解——能写出清晰 plan.md(milestone 化)
  4. 有持久化能力——文件系统可写,或外部 DB 存 progress