Skills long-running-harness
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/aowind/long-running-harness" ~/.claude/skills/openclaw-skills-long-running-harness && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/aowind/long-running-harness" ~/.openclaw/skills/openclaw-skills-long-running-harness && rm -rf "$T"
manifest:
skills/aowind/long-running-harness/SKILL.mdsource content
长时程 Agent 工作流框架
基于 Anthropic 工程团队的 Effective Harnesses for Long-Running Agents 方法论,适配 OpenClaw 环境。
核心原则
- 持久化优于记忆 — 用文件系统记录状态,不依赖 Agent 上下文记忆
- 结构化优于自由文本 — 关键状态用 JSON,进度日志用 Markdown
- 验证优于声明 — 每个功能完成后必须验证,不接受未测试的 "完成"
- 增量优于大步 — 每次 Agent 会话只做一个功能点,保持可回滚
- 标准化优于临时 — 固定的启动例程和结束例程,减少混乱
项目结构
每个受管理项目遵循以下标准结构:
projects/<project-name>/ ├── PROJECT.md # 项目概述、目标、技术栈 ├── progress.md # Agent 工作日志(每次会话追加) ├── features.json # 功能列表(状态追踪,仅修改 passes 字段) ├── init.sh # 环境初始化脚本(可选) ├── src/ # 项目源码 └── tests/ # 测试代码(如有)
生命周期
阶段一:初始化(Init)
当用户要求启动新项目或初始化工作流时执行:
- 创建项目目录
projects/<project-name>/ - 编写
— 包含:PROJECT.md- 项目名称和目标
- 技术栈和依赖
- 验收标准
- 关键约束
- 编写
— 功能列表,格式如下:features.json{ "project": "项目名称", "created": "2026-03-18", "features": [ { "id": "feat-001", "name": "功能名称", "description": "功能详细描述", "category": "functional|infra|docs|perf|fix", "priority": "high|medium|low", "passes": false, "tests": [ "测试步骤 1", "测试步骤 2" ], "notes": "" } ] } - 创建
— 模板:progress.md# 项目工作日志 ## 初始化 - 日期:2026-03-18 - 初始化人:主 Agent - 功能总数:N - 初始化 git —
+ 首次提交git init - 如果适用,编写
init.sh
重要: 功能列表要尽量详尽,把大功能拆成小功能。200 个小功能 > 10 个大功能。
阶段二:增量开发(Each Session)
当用户说"继续开发"、"next feature"、"继续项目"或调度子Agent开发时:
启动例程(每个会话必须执行):
确认工作目录pwd
— 读取工作日志cat projects/<name>/progress.md
— 查看最近提交git log --oneline -10
— 读取功能列表cat projects/<name>/features.json- 选择优先级最高且
的功能passes: false - 运行
(如有)+ 基础验证测试init.sh - 确认环境正常后,开始实现
工作约束:
- 每次只做一个功能
- 实现完成后必须验证(运行测试、手动检查等)
- 验证通过后才能将
中对应功能的features.json
改为passestrue - 禁止删除或修改功能条目(只改
和passes
字段)notes
结束例程(每个会话必须执行):
- 更新
中完成状态features.json - 追加会话记录到
:progress.md## 会话 N — 日期 - **目标功能:** feat-XXX - 功能名称 - **状态:** ✅ 完成 / ⏳ 部分完成 / ❌ 失败 - **完成内容:** 具体做了什么 - **遇到的问题:** 问题描述和解决方案 - **下次继续:** 待办事项 - **Git commits:** hash - message git add . && git commit -m "feat: 完成功能描述"
阶段三:进度报告
当用户问"项目进度"、"project status"时:
- 读取
features.json - 统计完成率(passes: true / 总数)
- 按优先级列出未完成功能
- 读取
最近条目progress.md - 生成进度摘要
输出格式:
📋 项目进度:项目名称 ━━━━━━━━━━━━━━━━━━ ✅ 完成:X / Y(Z%) 🔴 待做(高优先级):... 🟡 待做(中优先级):... 🟢 待做(低优先级):... ━━━━━━━━━━━━━━━━━━ 最近会话:[简要摘要]
调度子Agent(sessions_spawn)
将单个功能委派给子Agent开发时,task 描述必须自包含:
{ "task": "## 任务:实现 feat-XXX 功能\n\n### 项目信息\n- 路径:projects/project-name/\n- 技术栈:...\n\n### 你的目标\n实现以下功能并验证:\n[功能描述]\n\n### 启动例程\n1. 读取 projects/project-name/features.json 找到 feat-XXX\n2. 读取 projects/project-name/progress.md 了解历史\n3. 运行 git log --oneline -5\n4. 运行 projects/project-name/init.sh(如有)\n5. 运行基础测试确认环境正常\n\n### 工作要求\n- 只做这一个功能\n- 完成后必须验证\n- 结束时更新 features.json 的 passes 字段\n- 结束时追加 progress.md 日志\n- 结束时 git commit", "sessionKey": "alpha", "runTimeoutSeconds": 600 }
关键: task 必须包含所有上下文。子Agent看不到主对话历史。
定时巡检(Cron Job)
对于重要项目,可设置定时 cron job 巡检进度:
schedule: kind=cron, expr="0 */4 * * *" payload: kind=agentTurn, message="读取 projects/<name>/progress.md 和 features.json,检查是否有功能卡住超过3个会话未完成。如有,输出简要报告。"
故障模式预防
| 故障模式 | 预防措施 |
|---|---|
| Agent 试图一次性做完所有功能 | 强制每次只选一个 的功能 |
| Agent 过早宣布项目完成 | 有明确的状态追踪 |
| Agent 留下的代码有 bug | 启动时运行基础测试;结束时 git commit 便于回滚 |
| Agent 花时间理解环境 | 使用 标准化启动 |
| 上下文丢失导致重复工作 | + git log 提供完整历史 |
| 功能未真正完成就标记 passes | 要求验证后才能修改 passes 字段 |
通用领域扩展
此框架不限于软件开发。对于非代码类长期任务:
- 研究项目: features.json 中的 tests 改为 research objectives,passes 表示研究是否完成
- 写作项目: features 拆分为章节/段落,passes 表示是否已写完并审校
- 数据分析: features 拆分为分析步骤,passes 表示结果是否已验证
使用不同 category 区分:
research|writing|analysis|infra|docs