每日一个开源项目(第171篇):Harness Handbook - 给 AI Agent 的 Harness 代码库生成一本可导航的行为手册
引言
“2025 年是 Agent 年,2026 年是 Agent Harness 年。”
这是"每日一个开源项目"系列的第171篇文章。今天的主角是 Harness Handbook——一个把 AI Agent Harness 代码库转换成可导航行为手册的工具,配套 arXiv:2607.13285 论文(2026 年 7 月)。
先解释一个概念:Harness 是围绕基础模型的编排层——构建 Prompt、管理状态、调用工具、协调执行。Claude Code 里的 hook 系统、Open Interpreter 的 Harness 模块、各类 Agent 框架的调度层,都是 Harness。
Harness 的维护是一个持续的工程难题。需求变化时,开发者必须把"我想改变这个行为"翻译成"具体需要改动代码库的哪些地方"。但生产级 Harness 代码库规模大、模块耦合紧、行为分散在多处——一个"添加秘钥脱敏"的需求,可能需要同时改动日志捕获路径、磁盘写入前处理、冷启动回退路径三个非相邻位置。关键字搜索发现不了全部。
Harness Handbook 的方案:先自动生成一本手册,把每个行为映射到代码证据;然后给 Agent 一个从行为描述渐进定位到具体代码位置的导航算法。
你将学到什么
- 什么是 Agent Harness,为什么它难以维护
- Handbook 的三层文档结构(L1/L2/L3)和状态寄存器视图
- BGPD(行为引导渐进展开)算法的四步导航机制
- 为什么散布式代码(Scattered Sites)是 AI 改代码的最大难点
- Resync:代码变更后如何增量同步手册
- 实测数据:在 Codex(Rust,2,267 文件)和 Terminus-2 上的效果
前置知识
- 了解 AI Agent 框架的基本概念(工具调用、状态管理)
- 有维护或使用过 LLM Agent 系统的经验
- 理解代码静态分析的基本概念
项目背景
什么是 Agent Harness
用一句话定义:Harness 是基础模型的外壳,把一个 LLM 变成一个能做事的 Agent。
用户输入
↓
Harness 层
├── 构建 Prompt(插入上下文、工具描述、系统提示)
├── 管理状态(对话历史、工具结果、会话变量)
├── 工具调用(执行代码、访问文件、调用 API)
└── 协调执行(多步骤规划、错误重试、结果汇总)
↓
基础模型(GPT、Claude、Gemini…)
↓
输出
Harness 不是一个独立的组件,而是分散在整个代码库里的逻辑——Prompt 模板在这个文件,工具注册在那个模块,状态持久化在另一个目录。
维护 Harness 的核心难题
当产品需求变化时:
产品要求:"给所有工具调用结果添加用量统计"
开发者需要找到:
- 所有工具调用的执行路径(可能有 5-10 个)
- 结果返回给 LLM 之前的处理位置
- 可能的异步路径(普通调用 + 超时重试 + 流式返回)
- 统计数据的存储位置
在一个 2,000+ 文件的 Rust 代码库里找全这些位置,靠关键字搜索大概率会漏
这就是 Harness Handbook 要解决的问题:编辑定位(Edit Localization)——在行为描述和代码位置之间建立可靠的映射。
作者/团队介绍
- 作者: Ruhan Wang
- 论文: arXiv:2607.13285(2026 年 7 月 14 日)
- License: Apache-2.0
- 语言: Python,调用 OpenAI 兼容 API
项目数据
- ⭐ GitHub Stars: 252
- 🍴 Forks: 25
- 📄 License: Apache-2.0
- 📝 arXiv: 2607.13285
Handbook 的结构
三层文档树(𝒟)
Handbook 不是平铺的文档,而是三层分级结构:
L1 — 系统概述
整体架构、执行模型、主要阶段划分、全局数据流
("这个 Harness 由哪些核心部分组成,它们如何协作")
L2 — 阶段页(per-stage)
每个执行阶段的职责、输入、输出、依赖关系、局部状态
("这个阶段做什么,接受什么,产出什么,依赖谁")
L3 — 源码锚定条目(source-grounded entries)
每个行为条目链接到精确的文件/函数/代码区域定位符
("这个行为在代码库的哪个具体位置实现")
两种叶子模式:
- 函数粒度:L3 条目 = 一个函数或连续代码区域,需要预先提供骨架(
skeleton.yaml),适合小型代码库 - 文件粒度:L3 条目 = 一个文件,自动推断阶段骨架,适合大型代码库(如 Codex 的 2,267 个文件)
状态寄存器视图(𝒵)
这是 Handbook 最关键的设计之一,专门解决"散布式代码"问题。
对于每个跨阶段共享的状态变量(寄存器),视图记录:
- 所有读取这个状态的位置(跨越所有阶段)
- 所有写入这个状态的位置(跨越所有阶段)
示例:session_context 寄存器
写入位置:
- auth.rs: authenticate() 函数中初始化
- session_manager.rs: refresh_token() 中更新
读取位置:
- tool_executor.rs: execute_tool() 调用前注入
- response_formatter.rs: format_response() 中读取用户信息
- audit_logger.rs: log_event() 中记录会话 ID
顶层代码阅读发现不了这种结构性相互依赖——它们在代码库里位置不相邻,但逻辑上是耦合的。状态寄存器视图把这种隐藏依赖显式化。
BGPD:行为引导渐进展开
Handbook 生成完之后,另一个核心贡献是 BGPD(Behavior-Guided Progressive Disclosure) 算法——引导代码 Agent 从行为描述渐进定位到具体代码位置。
四步过程:
修改请求:"在所有工具执行前验证权限"
Step 1: 阶段选择
读 L1/L2 → 找到与权限验证相关的阶段
通过状态寄存器视图 → 追加通过共享状态耦合的相关阶段
(发现 tool_executor 和 auth 两个阶段都相关)
↓
Step 2: 条目选择
打开相关阶段页面 → 从 L3 条目中找出最相关的
"按需展开条目体,限制不必要的上下文"
(只展开 execute_tool、validate_permission 等相关条目)
↓
Step 3: 调用关系扩展
沿函数调用图(或文件调用图)扩展
边界节点"提供上下文但不作为编辑位置"
(发现调用链:request_handler → execute_tool → shell_runner)
↓
Step 4: 源码验证
对候选定位符在活跃代码库中验证
只保留"仍然相关"的位置作为验证证据 Ê_q
(确认三个需要修改的函数在当前代码库中存在且未变更)
这四步的关键设计:渐进展开,而不是一次性给 Agent 全部内容。L3 条目"按需展开"——在被选中之前,Agent 只看到摘要;在被选中之后,才展开完整的源码链接。这保持了 token 效率。
Resync:代码变更后的手册同步
代码在持续演化,Handbook 不能用一次就过期。Resync 模块处理代码变更后的增量同步:
代码变更(diff Δ)进入
↓
版本对齐
重新解析代码库,重建程序图
用"函数体指纹"(忽略行号)匹配函数
→ 被移动的函数被识别为"未变更"(不是新函数)
↓
范围更新
├── 阶段骨架未变 → 只刷新受影响的 L3 条目
└── 骨架失效 → 对受影响部分重跑完整算法
↓
保守处理
无法解析的定位符 → 标记为"冻结"并排除
(宁可排除,不猜测)
↓
验证和打包
新的 (ℛ′, ℋ′) 对成为下次请求的起点
Resync 中的 LLM 调用限制在四类:分类、文件归属、阶段内组织、描述修订。设计上尽量减少 LLM 调用,能用静态分析做的不用 LLM。
评测结果
在两个真实开源 Harness 上测试:
- Terminus-2:Python,6 个文件,小型 Harness
- Codex(Open Interpreter 的 Rust 版本):Rust,2,267 个文件,大型 Harness
| 指标 | Codex | Terminus-2 |
|---|---|---|
| Handbook win rate | 38.3% | 45.6% |
| 基线 win rate | 28.3% | 26.7% |
| Token 减少 | 12.7% | 8.6% |
| 最大 F1 提升(符号级) | +18.8 pts | +12.3 pts |
| 最大 Wrong 减少 | −25.9 pts | −13.3 pts |
效果在三种 Judge 模型(GPT-5.5、Opus 4.8、DeepSeek-V4-Pro)、三种请求类型、三种难度级别下全部一致。
提升最大的三类情况:
- 散布式代码(Scattered Sites):行为实现在多个非相邻位置
- 低频执行路径(Rarely Executed Paths):不常触发的代码分支
- 跨模块交互(Cross-Module Interactions):跨越多个文件/组件的能力
这三类正好是关键字搜索最容易漏的——它们不在显眼位置,散在各处,或者躲在异常处理和回退路径里。
快速开始
安装
git clone https://github.com/Ruhan-Wang/Harness_Handbook.git
cd Harness_Handbook
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
配置 LLM API(OpenAI 兼容接口):
export OPENAI_API_KEY=sk-...
export OPENAI_BASE_URL=https://api.openai.com/v1 # 或其他兼容接口
export LLM_MODEL=gpt-4o
生成 Handbook
大型代码库(无需骨架,自动推断):
cd handbook_generate_large
python run.py --repo /path/to/your/harness/
# 输出到 ./output/,包含 overview.md、各模块页、module_tree.json
小型代码库(需提供 skeleton.yaml):
cd handbook_generate_small
# 编辑 skeleton.yaml 定义阶段结构
python run.py --repo /path/to/your/harness/ --skeleton skeleton.yaml
作为 Agent 规划器
cd handbook_as_helper
python planner.py \
--handbook /path/to/generated/handbook/ \
--request "Add rate limiting to all LLM API calls"
# 输出:精确的编辑计划,包含需要修改的文件和函数
Resync
cd handbook_as_helper
python resync.py \
--handbook /path/to/handbook/ \
--repo /path/to/repo/ \
--diff changes.diff
# 增量更新 handbook,只处理变更部分
项目地址与资源
- 🌟 GitHub: Ruhan-Wang/Harness_Handbook
- 📄 论文: arXiv:2607.13285
- 🌐 项目主页: ruhan-wang.github.io/Harness-Handbook
- 📊 Hacker News 讨论: Making Agent Harnesses Understandable, Auditable and Editable
总结
Harness Handbook 解决的是一个"AI 改 AI 代码"的精度问题。
用 AI Agent 修改 Harness 代码的最大失败模式不是模型能力不够,而是定位错误——Agent 改了三个位置,漏掉了两个,系统行为部分变化,bug 在角落里潜伏。这种错误靠更大的模型或更多的 token 都解决不了,因为根本原因是信息不够:Agent 不知道"散在各处的相关位置"。
三层文档树 + 状态寄存器视图,把这种隐藏依赖显式化,给 Agent 一张它之前没有的地图。BGPD 的渐进展开让 Agent 在找到足够信息后停止,而不是把整个代码库塞进上下文。Resync 让这张地图保持活跃,不会因为代码更新就作废。
Win rate 45.6% vs 26.7%,token 减少 12.7%——质量提升的同时反而更省 token。这是一个好的信号:Handbook 让 Agent 更精准而不是更饶。
Stars(252)还少,但这个问题的重要性随着 Harness 代码库规模增长会更突出。2026 年是 Agent Harness 的年份,这类工具的需求才刚开始增长。
探索 PrimeSkills —— 精选 AI Agent 与技能的市场,每一个都经过真实企业工作流验证,去掉浮夸,留下真正有用的。
欢迎访问我的个人主页,发现更多有价值的见解和有趣的产品。
更多推荐

所有评论(0)