
Task Harness
- 168 installs
- 431 repo stars
- Updated July 22, 2026
- kangarooking/kangarooking-skills
Orchestrate multi-step agent jobs with structured harnesses for state, retries, checkpoints, and bounded tool execution across long-running Claude Code tasks.
About
task-harness from kangarooking/kangarooking-skills provides orchestration primitives for Claude Code agents, adding structure, retries, and state management to multi-step autonomous tasks during agent-tooling build work.
- Multi-step task orchestration
- Retry and checkpointing
- Bounded agent execution
- Long-running job harness
- Stateful tool workflows
Task Harness by the numbers
- 168 all-time installs (skills.sh)
- +4 installs in the week ending Aug 2, 2026 (Skillselion tracking)
- Ranked #3,159 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/kangarooking/kangarooking-skills --skill task-harnessAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 168 |
|---|---|
| repo stars | ★ 431 |
| Last updated | July 22, 2026 |
| Repository | kangarooking/kangarooking-skills ↗ |
What it does
Orchestrate multi-step agent jobs with structured harnesses for state, retries, checkpoints, and bounded tool execution across long-running Claude Code tasks.
Files
Task Harness — 结构化任务管理系统
将任意需求拆解为结构化任务清单,为长时运行的 Agent 建立可靠的任务追踪系统。
基于 Effective harnesses for long-running agents 方法论。
何时使用
- 大型需求需要拆解为多个子任务
- 项目需要跨多个 Agent 会话持续开发
- 需要跟踪功能完成进度(已完成 / 未完成)
- 用户说"拆解任务"、"任务管理"、"项目规划"、"创建任务清单"
核心流程
Step 1: 分析代码库
探索项目结构,理解:
- 技术栈(语言、框架、构建工具)
- 目录结构和架构模式
- 现有配置(package.json、go.mod 等)
- 关键入口文件
Step 2: 设计任务列表
根据用户需求,将工作拆解为具体的功能点(features)。每个功能点需要:
- 唯一的
id(如feat-01、v2-05) category分类(foundation、layout、components 等)priority优先级(数字越小越优先)description一句话描述file主要涉及的文件路径(可为 null)steps具体操作步骤数组(每步一个字符串)passes布尔值(初始为 false)verification验证条件
Step 3: 生成 4 个 Harness 文件
在项目根目录生成以下文件:
feature_list.json — 任务清单(唯一真相来源)
{
"project": "项目名称",
"description": "项目描述",
"features": [
{
"id": "feat-01",
"category": "foundation",
"priority": 1,
"description": "一句话描述要做什么",
"file": "path/to/main/file.js",
"steps": [
"具体步骤 1",
"具体步骤 2"
],
"passes": false,
"verification": "如何验证这个功能已完成"
}
]
}完整模板见 references/templates/feature_list.json
为什么用 JSON 而不是 Markdown? 模型倾向于自由改写 Markdown 文件(改写措辞、重组结构、删除内容)。JSON 文件被模型更谨慎对待——更可能只修改特定字段。这对维护任务完整性至关重要。
progress.txt — 叙事性进度日志
记录每个会话的详细工作内容,供后续会话理解上下文。
完整模板见 references/templates/progress.txt
init.sh — 环境初始化脚本
每个新会话开始时运行,5 秒内恢复全部上下文。
完整模板见 references/templates/init.sh
task.json — 项目总览
记录里程碑、规则、文件清单等项目级信息。
完整模板见 references/templates/task.json
Step 4: 配置 AGENTS.md 规则
在项目的 AGENTS.md 文件中添加 Task Management System 章节,确保所有 Agent 会话遵循工作流。参考当前项目的 AGENTS.md 中的对应章节。
Step 5: 首次验证
运行 bash init.sh,确认:
- 脚本可正常执行
- feature_list.json 解析正确
- 进度统计准确显示
Step 6: 输出下一步指引
告诉用户:
- 已创建的文件列表
- 如何开始第一个任务
- 如何在新会话中恢复工作
Agent 工作流(每个会话)
1. bash init.sh ← 5 秒上下文恢复
2. Read progress.txt ← 理解之前做了什么、为什么
3. Read feature_list.json ← 找到优先级最高的未完成功能
4. Pick 1~2 features ← 不要贪多,增量推进是关键
5. Execute the feature's steps ← 严格按步骤执行
6. Verify ← 必须实际验证,不要假设
7. Update feature_list.json ← 只改 passes: false → true
8. git commit ← 一个功能一个 commit
9. git push ← 同步到远程
10. Append progress.txt ← 记录本次会话的工作严格规则
- 只修改 `passes` 字段:在 feature_list.json 中,只将
passes从false改为true。永远不要删除功能、编辑描述、修改优先级或重组 JSON。 - 一次一个功能:除非功能非常小(例如改一个常量),否则每个会话只做一个功能。
- 必须 commit + push:每个功能完成后必须 git commit 和 push,确保进度永不丢失且可独立回滚。
- 必须验证后再标记完成:阅读代码、运行 dev server 或检查输出。不要信任假设。
- 必须更新 progress.txt:会话结束时更新进度日志,让下一个会话有完整上下文。
- 遇到阻塞时停止:在 progress.txt 中记录阻塞原因并停止。不要默默绕过问题。
文件间关系
init.sh ──读取──→ feature_list.json (任务状态)
│
└──提示──→ progress.txt (历史上下文)
task.json ────→ 项目总览(里程碑、规则、文件清单)
AGENTS.md ────→ Agent 行为规范(引用 harness 规则)引用
- 方法论详解 — 为什么用 harness、常见问题、最佳实践
- 模板文件 — 所有 harness 文件的空白模板
Task Harness 方法论
为什么需要 Harness?
Agent 的核心限制是无状态——每次会话都从零开始,没有之前会话的记忆。没有结构的 Agent 会以可预测的方式失败:
| 失败模式 | 表现 |
|---|---|
| 贪多嚼不烂 | 试图一次做太多,代码只实现了一半 |
| 过早宣称完成 | 声称工作完成了,实际还有遗漏 |
| 破坏环境 | 留下编译错误、测试失败、依赖冲突 |
| 重复探索 | 每次会话花大量时间重新发现项目结构 |
Harness 就是解决这些问题的外部记忆系统。
为什么用 JSON 做任务清单?
这是方法论中最关键的洞察:
模型倾向于自由改写 Markdown 文件——改写措辞、重组结构、删减内容。这种"过度编辑"倾向会导致任务清单逐渐失真:步骤被简化、验证条件被弱化、优先级被悄悄调整。
JSON 文件被模型更谨慎对待。模型更可能只修改特定字段(如 passes),而保留其余结构不变。这种差异对维护任务完整性至关重要。
核心设计原则
1. 单一真相来源(Single Source of Truth)
feature_list.json 是唯一的项目状态文件。所有判断都基于它:
- 什么还没做?→
passes: false的功能 - 做了什么?→
passes: true的功能 - 总进度?→
passed / total
不要在其他文件中维护重复的任务列表。
2. 叙事性日志(Narrative Log)
progress.txt 用自然语言记录"做了什么"和"为什么"。JSON 精确但不解释原因。当 Agent 需要理解某个设计决策的背景时,叙事日志比 JSON 中的步骤列表更有用。
3. 快速上下文恢复(Fast Context Restore)
init.sh 在 5 秒内提供全部关键信息:git 状态、完成进度、剩余任务。Agent 不需要花 30 秒读文件就能知道该做什么。
4. 增量推进(Incremental Progress)
每个会话只做 1-2 个功能。这看起来慢,但实际更快:
- 更少的回滚风险
- 更可靠的验证
- 更清晰的 git 历史
- 更容易恢复中断的工作
常见问题
Q: 任务拆得太细,会不会效率低?
不会。 Agent 在大任务上的失败率远高于小任务。一个 10 步任务被中断后,很难判断哪一步完成了、哪一步是半成品。拆成 10 个独立功能后,每个都能被独立验证和提交。
Q: 为什么要强制 commit + push?
防止进度丢失。 Agent 会话可能因超时、错误、网络中断等原因终止。如果工作只在本地,就会丢失。Push 到远程后,即使本地出问题也能从远程恢复。
另外,每个功能一个 commit 使得:
- 可以用
git revert独立回滚某个功能 - 可以用
git log追踪每个功能的变化 - 多人协作时可以清楚看到每个功能的改动
Q: feature_list.json 太大了怎么办?
如果功能超过 50 个,考虑分阶段创建:
- 先创建当前阶段的 20-30 个功能
- 当前阶段完成后,再创建下一阶段的功能
这样保持文件大小可控,Agent 读取更快。
Q: Agent 不遵守规则怎么办?
在 AGENTS.md 中以明确的规则形式写好约束。AGENTS.md 会在每次会话开始时被加载到 Agent 的上下文中,比普通文件更有约束力。
关键规则要放在 AGENTS.md 的 Rules 部分,而不是 ## Notes 或 ## Tips 中。
Q: steps 数组中的步骤应该多详细?
越具体越好。 好的步骤应该能让 Agent 无需猜测就执行:
// 差:太模糊
"修改样式"
// 好:足够具体
"在 web/src/index.css 的 :root 块中添加 --semi-color-primary: #DC2626"具体的步骤还能防止 Agent "过度发挥"——在不该改的地方做改动。
最佳实践
1. 功能 ID 命名
使用有意义的 ID,一眼就能看出属于哪个版本/阶段:
v1-01, v1-02, ... # 第一版功能
v2-01, v2-02, ... # 第二版功能
fix-01, fix-02 # 修复类
infra-01 # 基础设施类2. 分类(category)
按代码层级分类,帮助 Agent 理解功能间的关系:
foundation # 基础设施(字体、颜色、配置)
layout # 布局结构(页面框架、导航)
components # 组件(按钮、卡片、表单)
pages # 具体页面
api # 后端接口
database # 数据库相关
verification # 验证和测试3. 验证条件(verification)
每个功能必须有可执行的验证条件:
// 差:主观描述
"看起来更好"
// 好:可执行的检查
"bun run build 成功无错误"
"登录页桌面端显示左右分屏,移动端只有表单区"
"表头 font-weight: 600,font-size: 12px"4. progress.txt 格式
使用统一的日志格式,让后续会话容易解析:
----------------------------------------
会话 #N - 功能ID: 功能描述
----------------------------------------
时间: YYYY-MM-DD
完成工作:
[x] 具体做了什么
- 文件: path/to/file (line XX)
- 改动: 具体变更
提交:
- commit: abc1234 feat(scope): 描述
- push: origin main
进度:
- 已完成: N/M
- 下一个: feature-id (描述)5. 处理阻塞
当 Agent 遇到无法解决的问题时:
⚠️ 阻塞: 描述遇到的问题
原因: 为什么无法继续
尝试: 已经尝试过的解决方案
建议: 可能的解决方向不要让 Agent 绕过阻塞继续做其他功能——这可能导致后续功能也失败。
参考
- Effective harnesses for long-running agents — Anthropic 官方方法论文章
- task-harness SKILL.md — 技能主入口
- templates/ — Harness 文件模板
{
"project": "{{项目名称}}",
"description": "{{项目描述,一句话概括目标和范围}}",
"features": [
{
"id": "feat-01",
"category": "foundation",
"priority": 1,
"description": "第一个功能的简要描述",
"file": "path/to/main/file.js",
"steps": [
"步骤 1:具体操作(包含文件路径和行号范围)",
"步骤 2:具体操作",
"步骤 3:具体操作"
],
"passes": false,
"verification": "如何验证这个功能已完成(具体的、可执行的检查条件)"
},
{
"id": "feat-02",
"category": "foundation",
"priority": 2,
"description": "第二个功能的简要描述",
"file": "path/to/another/file.js",
"steps": [
"步骤 1:具体操作",
"步骤 2:具体操作"
],
"passes": false,
"verification": "验证条件"
},
{
"id": "feat-03",
"category": "components",
"priority": 3,
"description": "第三个功能的简要描述",
"file": null,
"steps": [
"步骤 1:具体操作",
"步骤 2:具体操作"
],
"passes": false,
"verification": "验证条件"
}
]
}
#!/bin/bash
# ==========================================
# {{项目名称}} - Agent 环境初始化脚本
# ==========================================
# 用途:每个 Agent 会话开始时运行,快速恢复开发环境
# 用法:bash init.sh
set -e
echo "=========================================="
echo " {{项目名称}} - Agent 环境初始化"
echo "=========================================="
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$PROJECT_DIR"
echo ""
echo "[1/5] 当前目录: $PROJECT_DIR"
echo ""
echo "[2/5] Git 状态:"
git status --short || echo " (无 git 变更)"
echo ""
echo "[3/5] 最近 10 条 commit:"
git log --oneline -10 || echo " (无 commit 历史)"
echo ""
echo "[4/5] 功能完成进度:"
if [ -f "feature_list.json" ]; then
TOTAL=$(python3 -c "import json; f=open('feature_list.json'); d=json.load(f); print(len(d['features']))" 2>/dev/null || echo "?")
PASSED=$(python3 -c "import json; f=open('feature_list.json'); d=json.load(f); print(sum(1 for x in d['features'] if x['passes']))" 2>/dev/null || echo "0")
echo " 总计: $TOTAL 个功能"
echo " 已完成: $PASSED 个"
echo " 剩余: $((TOTAL - PASSED)) 个"
echo ""
echo " 未完成的功能:"
python3 -c "
import json
with open('feature_list.json') as f:
d = json.load(f)
for feat in d['features']:
if not feat['passes']:
print(f\" [{feat['id']}] P{feat['priority']}: {feat['description']}\")
" 2>/dev/null || echo " (解析失败)"
else
echo " (feature_list.json 不存在)"
fi
echo ""
echo "[5/5] 依赖检查:"
if [ -d "node_modules" ]; then
echo " node_modules 已存在"
else
echo " node_modules 不存在,需要运行依赖安装命令"
fi
echo ""
echo "=========================================="
echo " 初始化完成"
echo "=========================================="
echo ""
echo "下一步操作:"
echo " 1. 阅读 progress.txt 了解已完成的工作"
echo " 2. 阅读 feature_list.json 找到下一个未完成的功能"
echo " 3. 完成功能后更新 feature_list.json 中的 passes 字段"
echo " 4. git commit 提交更改"
echo " 5. 更新 progress.txt 记录本次会话的工作"
echo ""
========================================
{{项目名称}} 项目进度日志
基于长时运行 Agent 方法论
========================================
项目概述:
{{一句话描述项目目标和范围}}
技术栈:
{{主要技术栈信息}}
配色/设计方向(如适用):
{{设计约束和风格指南}}
----------------------------------------
会话 #0 - 项目初始化
----------------------------------------
时间: {{YYYY-MM-DD}}
完成工作:
[x] 探索项目结构,了解技术架构
[x] 制定开发计划
[x] 创建 feature_list.json(N 个功能点)
[x] 创建 progress.txt(本文件)
[x] 创建 init.sh(环境初始化脚本)
[x] 创建 task.json(项目总览)
关键发现:
- {{重要发现 1}}
- {{重要发现 2}}
- {{重要发现 3}}
下一步:
- 按优先级顺序完成 feature_list.json 中的功能
----------------------------------------
(后续会话在此追加,格式如下)
----------------------------------------
----------------------------------------
会话 #N - feature-id: 功能描述
----------------------------------------
时间: YYYY-MM-DD
完成工作:
[x] feature-id: 具体做了什么
- 文件: path/to/file (line XX)
- 改动: 具体变更描述
- 验证: 如何验证
提交:
- commit: abc1234 feat(scope): 描述
- push: origin main
进度:
- 已完成: N/M
- 下一个: feature-id (描述)
{
"project": "{{项目名称}}",
"version": "1.0",
"created": "{{YYYY-MM-DD}}",
"updated": "{{YYYY-MM-DD}}",
"methodology": "Effective harnesses for long-running agents (https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents)",
"description": "{{项目描述}}",
"status": "in_progress",
"harness": {
"initializer_done": true,
"files": {
"feature_list": "feature_list.json",
"progress_log": "progress.txt",
"init_script": "init.sh"
},
"rules": [
"每个会话只做 1-2 个功能,不要贪多",
"开始前先运行 bash init.sh 了解当前状态",
"读取 progress.txt 获取上次进度",
"读取 feature_list.json 找到下一个优先级最高的未完成功能",
"完成后更新 feature_list.json 的 passes 字段",
"每次完成功能后 git commit",
"会话结束前更新 progress.txt",
"只修改 passes 字段,不要删除或编辑其他字段"
]
},
"milestones": [
{
"name": "{{里程碑 1 名称}}",
"feature_ids": ["feat-01", "feat-02", "feat-03"],
"status": "pending",
"description": "{{里程碑描述}}"
}
],
"files_to_modify": [
"path/to/file1.js",
"path/to/file2.css"
],
"summary": {
"total_features": 3,
"categories": {
"foundation": 2,
"components": 1
},
"estimated_files_to_edit": 2
}
}