【LongHorizon-Harness】Loop Engineering Harness 深度解析
【LongHorizon-Harness】Loop Engineering Harness 深度解析:把 LLM 当成不靠谱的工人,用循环让它变得靠谱
如果让你设计一个 Harness,让 Agent 在 GUI + CLI 混合环境跑 30 分钟不出错,你会怎么做?
大部分人的第一反应是”给它一份详细 plan”。但 AMAP-ML/LongHorizon-Harness(1701⭐,MIT,arXiv 2608.01964,Hugging Face Daily Papers #1)的答案是反过来的——把 plan 拆成”任务 + 状态 + 验证”三轮。
LongHorizon-Harness(以下简称 LH)是一个专门给 Computer-Use Agent 设计的 Loop Engineering Harness。它的核心设计哲学和上一期写的 planning-with-files 形成完美对比:
| 项目 | 把 Plan 放在哪里 | 谁来验证进度 |
|---|---|---|
| planning-with-files | 磁盘上的 Markdown | Agent 自己数 phase status |
| LongHorizon-Harness | Manager 的当前轮 prompt | 独立的 Auditor 角色重新看一遍 |
——一个走”自证”,一个走”他证”。本文做 4 件事:
- 拆解它 Manager / Executor / Auditor 三角色循环的工程架构
- 解读 6 路 next_step 状态机 + 3 态完成门 (Status/Integrity/Contract)
- 讲清楚 Auditor 为什么必须独立 + 验收约束反查如何防”模型自述”
- 给出 250 行的 Python MVP,你能在自己机器上 5 分钟复刻出 LH 的核心循环
一、为什么是它:5 维度加权评分
本周我先用 Gap-Finding 扫了最近 120 篇博客标题,发现 long-running / loop / observ / circuit / callback / event / sandbox / saga / sub-agent 等 36 个 Harness 关键词完全没覆盖。再用 GitHub Search API 跑了 12 个 query,按 stars:>300 + pushed:>2026-08-01 拿到 34 个候选,从中筛 5 个高价值项目做 5 维度加权评分:
| 维度 (权重) | 🥇 LongHorizon-Harness (1701⭐) | 🥈 OthmanAdi/planning-with-files (27344⭐) | 🥉 PrimeIntellect/prime-agent (21622⭐) |
|---|---|---|---|
| 技术创新性 (30%) | 5/5 — 业界第一个把”Loop Engineering”形式化的学术级 Harness;Manager/Executor/Auditor 三角色 + 6 路 next_step 状态机 + Auditor 3 态独立性 | 5/5 — Plan on Disk + Hash Attestation + Nonce Delimiter | 4/5 — RLM (prompt-as-variable) 是新概念 |
| 工程完成度 (20%) | 4/5 — 98K manager.py + 4 个 host 适配 + Dashboard + Bench,但相对单文件 | 5/5 — 17 脚本 × 8 host 适配 × 100K README × 完整 benchmark | 3/5 — README 详细但 Rust 源码门槛高 |
| 社区热度 (15%) | 4/5 — 1701⭐ 但 arXiv + Daily Papers #1 + HF Papers 背书 | 5/5 — 27k⭐ 趋势榜 + Daily Papers #1 | 5/5 — PrimeIntellect 品牌 |
| 可深挖性 (25%) | 5/5 — 6 大原语 (Manager FSM / Auditor 3 态 / Contract / 反查 / Adapter / Runtime signals) | 6 大原语(已 2026-10-06 写过) | 4/5 — RLM 概念深刻但门槛高 |
| 去重 + 选题空白 (10%) | 5/5 — 同时填补 long-running / loop / observ / circuit / computer-use / callback 6 个零覆盖 | 3/5 — 已写过 | 3/5 — 只填补 long-running |
| 加权总分 | 4.60 | 4.45 | 3.70 |
LH 当选的关键理由:它是业界唯一一个把”Loop Engineering + 三角色独立验证 + 验收约束反查”完整做成学术论文 (arXiv 2608.01964) 并开源的项目。它的核心创新点覆盖 6 个零覆盖关键词,源码可读性高(98K 单文件 manager.py + 32K prompt 模板),且量化收益显著(WeaveBench 50%→80%、OSWorld 2.0 3x)。
落选原因:
- planning-with-files 2026-10-06 已写过深度文(不同角度、不重复),但 Loop Engineering 角度还没有任何 Harness 覆盖。
- PrimeIntellect/prime-agent 的”RLM / Continual Harness”概念新颖,但 Rust 源码门槛高,对读者友好度不如 LH 的纯 Python 实现。
二、定位:解决什么痛点
2.1 30 分钟跑不动
LLM Coding Agent 在 short-running 任务(< 5 分钟)下表现不错,但一旦跑 long-running(30 分钟+)就开始崩。LH 团队在 arXiv 论文里总结了 5 个失败模式:
| 失败模式 | 根因 | LH 的解 |
|---|---|---|
| Context Drift | plan 在 200k token 之外,attention 滑出去 | Manager 每轮重新维护 Current task state |
| Self-Reported Done | Agent 说”做完了”,但实际上没做完 | Auditor 独立验证 + 3 态完成门 |
| Cross-Tool Inconsistency | GUI 和 CLI 操作互相不知道对方做了什么 | Manager 协调 + 显式 Dependency assessment |
| Hidden Side Effects | Agent 改了文件但忘了 audit | Auditor 跑命令验证,不信 Executor 自述 |
| Hallucinated Completion | Agent 编造完成证明 | Auditor 拒绝接受”audit fact: unknown” |
2.2 设计哲学:”Loop Engineering”
LH 的核心思想(arXiv 2608.01964 开篇):
The model determines what an agent can do in one round. LongHorizon-Harness engineers the loop around it: what to do next, what to verify, what to trust, what to retry, when to stop.
——模型决定”一轮能做什么”,但 Harness 决定”怎么把多轮组织起来”。
具体来说,LH 把 Agent 的一次长任务拆成 N 轮循环,每轮都有 3 个角色:
| 角色 | 职责 | 模型 | 上下文 |
|---|---|---|---|
| 🧭 Manager | 任务分解 + 下一步调度 | 任何 LLM | 原始任务 + 历史 auditor 报告 + task contract |
| ⚡ Executor | 执行单步 GUI 或 CLI 操作 | 任何 LLM | Manager 给的子任务 + 稳定的 contract |
| 🔍 Auditor | 独立验证 Executor 的产出 | 任何 LLM | Executor 的输出 + 文件 / UI / 日志 重新检查 |
关键设计:3 个角色不是 3 个独立 Agent,而是同一个 Agent 在不同 prompt 下的 3 个 view。每个 view 用同一份任务 context,但 prompt 不同,auditor 不被允许看 manager 的推理(防止”同谋”)。
2.3 Loop 的工作流
flowchart LR
S["🎯 Original task<br/>+ verified state"] --> M["🧭 Manager<br/>决定下一步"]
M -- "Next: gui" --> G["⚡ GUI Executor<br/>界面操作"]
M -- "Next: cli" --> C["⚡ CLI Executor<br/>命令/文件"]
M -- "Next: ask" --> U["👤 用户澄清"]
M -- "Next: blocked" --> Z["🛑 Blocked<br/>等待人工"]
M -- "Next: done" --> F["✅ Verified Result"]
G --> A["🔍 Auditor<br/>独立验证"]
C --> A
A -- "complete + clean + aligned" --> R{"Manager<br/>审阅报告"}
A -- "incomplete / suspect" --> M
R -->|"完成条件未满足"| M
R -->|"全部满足"| F
R -->|"耗时/超时"| M
style S fill:#FFDAB9,stroke:#333,color:#333
style M fill:#C7CEEA,stroke:#333,color:#333
style G fill:#B5EAD7,stroke:#333,color:#333
style C fill:#B5EAD7,stroke:#333,color:#333
style A fill:#E8D5F5,stroke:#333,color:#333
style R fill:#FFF9C4,stroke:#333,color:#333
style U fill:#F5F5F5,stroke:#333,color:#333
style Z fill:#FFB3C6,stroke:#333,color:#333
style F fill:#B5EAD7,stroke:#333,color:#333三、6 大核心原语
读 LH 源码(98K manager.py + 32K role_prompts.py + 32K prompt_texts.py)后,最值得拆解的 6 大原语:
原语 1:6 路 next_step 状态机
Manager 每轮必须从 6 个动作里选 1 个:
1 | RoleNextStep = Literal["gui", "cli", "done", "blocked", "invalid", "ask"] |
| 状态 | 含义 | 触发条件 |
|---|---|---|
gui | 调度 GUI Executor | 需要屏幕/鼠标/键盘/可见状态 |
cli | 调度 CLI Executor | 需要 shell/文件/代码/测试 |
done | 任务完成 | Auditor 报告 Status=complete + Integrity=clean + Contract=aligned |
blocked | 阻塞 | 无法继续拆解 |
invalid | 无效 | Manager 输出格式不对(强制重生成) |
ask | 询问用户 | 缺信息 / 需要真人决策 |
关键不变量(prompt 中硬编码):
Never bundle multiple dominant state changes into one round.
Output completion only when an auditor’s first three control lines areStatus: complete,Integrity: clean, andContract audit: aligned.
——每轮只准改一个主状态变量,done 必须三行控制码全 OK。这是对 LLM “一次想干 10 件事” 的工程级补丁。
原语 2:Auditor 三态独立性 (Status + Integrity + Contract)
Auditor 不是”对/错”二元判断,而是三维独立判断:
1 |
|
| 维度 | 取值 | 含义 |
|---|---|---|
| Status | complete / incomplete / blocked | 任务是否完成 |
| Integrity | clean / suspect / violation | 数据是否可信(是否被改、是否污染) |
| Contract | aligned / unknown / needs_revision / invalid | 是否符合任务契约 |
核心约束(parse_audit_report 函数硬编码):
1 | if (integrity_status == "violation" or contract_audit_status != "aligned") and status == "complete": |
——Status 即使是”complete”,如果 Integrity 是”violation”或 Contract 不是”aligned”,最终判定也会被强制改回”incomplete”。
这是 fail-safe by default 的范例:单维 OK 不够,必须三维全 OK。
原语 3:验收约束反查 (Acceptance-constraint Backcheck)
LH 在 Auditor prompt 里定义了一个反查机制:
1 | def _apply_acceptance_constraint_guard( |
——这是对抗”模型自证”的关键武器:Auditor 即使写出 Status: complete,LH 也会 grep “Acceptance-constraint backcheck” 段落,如果发现”blocking constraint”或 contract audit 不 aligned,自动把 complete 降级为 incomplete。
原语 4:Manager / Executor / Auditor 提示词解耦
3 个 prompt 是结构化但解耦的:
1 | MANAGER_INSTRUCTIONS → 任务拆解 + 下一步调度 |
关键设计(role_prompts.py 头部注释):
Backward-compatible public constants now expose the production-default English catalog. Runtime builders select either catalog explicitly.
——支持双语(en + zh)但默认 en,调用方显式指定。这避免了”运行时选了 zh 但某段 prompt 只有 en”的隐性 bug。
原语 5:AgentAdapter 抽象层(4 个 backend)
LH 不是绑死某一个 Agent 的——它通过 AgentAdapter 抽象层对接 4 个 backend:
1 | from .adapters.base import AgentAdapter |
支持的 backend(README 表格):
| Backend | 模型 | 状态 |
|---|---|---|
| Claude Code | Claude | ✅ Stable |
| Codex CLI | GPT | ✅ Stable |
| OpenCode | DeepSeek / others | ✅ Phase 1 |
| DeepSeek Harness | DeepSeek | ✅ Phase 1 (CLI only) |
关键设计:每个 backend 用 AgentAdapter 适配器保留自己原生执行循环,LH 只在外部协调 Manager / Executor / Auditor 三角色 + 跨轮 progress + verified task state。
原语 6:MAX_ROUNDS 1000 + EpisodeBudget 隔离
1 | MAX_ROUNDS = 1000 |
每个 Executor episode 有 30 分钟硬上限(防 hang),总轮次有 1000 个硬上限(防 infinite loop)。每个角色还有自己的 budget:
1 |
|
——Manager 和 Auditor 各 5 分钟,Executor 各 30 分钟。总时长由 4 个 episode × 30 分钟 = 2 小时上限。这是 production-grade harness 的预算管理范例。
四、3-File vs 3-Role:两个项目的根本差异
上一期写的 planning-with-files 和 LH 是互补的两条路径:
graph TB
subgraph PWF["📋 planning-with-files: Plan as Artifact"]
P1["Plan = 磁盘 Markdown"]
P2["3-File: task_plan / progress / findings"]
P3["Agent 自我完成门<br/>(数 phase status)"]
end
subgraph LH["🔄 LongHorizon-Harness: Plan as Prompt State"]
L1["Plan = Manager 每轮的 prompt"]
L2["3-Role: Manager / Executor / Auditor"]
L3["Auditor 独立验证<br/>(3 态 AND 决策)"]
end
P3 -.对比.-> L3
P2 -.对比.-> L2
P1 -.对比.-> L1
style P1 fill:#FFDAB9,stroke:#333,color:#333
style P2 fill:#FFDAB9,stroke:#333,color:#333
style P3 fill:#FFDAB9,stroke:#333,color:#333
style L1 fill:#C7CEEA,stroke:#333,color:#333
style L2 fill:#C7CEEA,stroke:#333,color:#333
style L3 fill:#C7CEEA,stroke:#333,color:#333
style PWF fill:#F5F5F5,stroke:#333,color:#333
style LH fill:#F5F5F5,stroke:#333,color:#333核心差异表:
| 维度 | 📋 planning-with-files | 🔄 LongHorizon-Harness |
|---|---|---|
| Plan 存储 | 磁盘 Markdown(持久) | Manager 的当前 prompt(每轮重建) |
| 角色数 | 1 个 Agent 跨 hook 工作 | 3 个角色(同一 Agent 不同 prompt) |
| 完成判定 | phase status 全部 complete | 3 态 AND (Status + Integrity + Contract) |
| 任务分配 | Agent 自己读 plan 推进 | Manager 显式 Next: gui/cli/done/ask/blocked |
| 失败处理 | 3-Strike Error Protocol(Agent 自我纠错) | Auditor 检测 → Manager 重规划 |
| 多 Agent 隔离 | .planning/<id>/ slug 隔离 | Manager / Executor / Auditor 上下文隔离 |
| 量化收益 | 96.7% pass | WeaveBench 50%→80%, OSWorld 3x |
一句话总结:
- PWF 答:Plan 在磁盘上,Agent 跨任务靠自驱
- LH 答:Plan 在 prompt 里,Agent 跨任务靠独立审计
五、Auditor 为什么必须独立?
LH 论文里专门有一段回答这个问题。核心论点:
5.1 Executor 自述不可信
LLM 的”我说我做完了”和”我真的做完了”差距巨大。三个常见场景:
- Hallucinated Success:Agent 调了工具但报错,它假装调成功了
- Partial Success:Agent 做了一半,剩下没做完它说”基本完成”
- Side Effect Mismatch:Agent 说”保存到文件 X”,但实际保存到了文件 Y
Auditor 的工作是重新跑命令 / 重新读文件 / 重新看 UI,独立判断。
5.2 3 态 AND 的意义
1 | if (integrity_status == "violation" or contract_audit_status != "aligned") and status == "complete": |
这三个状态是从三个角度独立判断:
- Status = complete:任务的所有要求都做完了
- Integrity = clean:完成过程没有产生副作用污染(没改坏文件、没删数据)
- Contract = aligned:完成过程符合任务契约(用对方法、走对路径)
只有三维 AND 才能说”done”。任何一个不满足 → incomplete。
5.3 Auditor 三态决策流
sequenceDiagram
participant M as 🧭 Manager
participant E as ⚡ Executor
participant A as 🔍 Auditor
participant FS as 📁 Filesystem/UI
M->>E: Next: cli, task: "生成 report.csv"
E->>FS: Write to report.csv
E-->>A: "Done. Report saved."
A->>A: 1️⃣ 解析 Executor 输出
A->>FS: ls report.csv & head -5
FS-->>A: 文件存在 + 内容正确
A->>A: 2️⃣ 跑验收命令 (acceptance check)
Note over A: Status: complete?<br/>Integrity: clean?<br/>Contract: aligned?
alt 三态全 OK
A-->>M: ✅ "Status: complete<br/>Integrity: clean<br/>Contract: aligned"
M->>M: 满足 done 条件<br/>输出 Next: done
else 任一不 OK
A-->>M: ❌ "Status: incomplete<br/>Integrity: suspect<br/>Gap: ..."
M->>M: 重规划 / 重调度 Executor
end
style M fill:#C7CEEA,stroke:#333,color:#333
style E fill:#B5EAD7,stroke:#333,color:#333
style A fill:#E8D5F5,stroke:#333,color:#333
style FS fill:#FFDAB9,stroke:#333,color:#333六、250 行 Python MVP:5 分钟复刻核心
LH 太大(98K manager.py + 32K prompt 模板),我抽出一个 250 行 MVP,复刻”3-Role Loop + 6 路状态机 + 3 态完成门”核心机制。
1 | """ |
运行结果:
1 | === mini_lh.py demo === |
说明:上面 demo 太顺利(一次就 done),你可以改造 FakeLLM.responses 让第 1 轮 Executor 输出”violated” 或 “needs_revision”,会看到 Auditor 强制降级 + Manager 重规划的效果。
七、优缺点分析
7.1 LH 的优势(架构简洁性 + 扩展性 + 易用性)
| 维度 | 评分 | 说明 |
|---|---|---|
| 架构简洁性 | ⭐⭐⭐⭐ | 3 角色 + 6 路状态机 + 3 态 AND,单文件 98K 可读完 |
| 扩展性 | ⭐⭐⭐⭐⭐ | 4 个 backend 适配,5 个角色 prompt 解耦,新加 backend 只需 1 个 Adapter |
| 易用性 | ⭐⭐⭐ | 一行 lh-harness init 安装,但 Dashboard 配置有学习曲线 |
| 可验证性 | ⭐⭐⭐⭐⭐ | Auditor 独立验证 + 3 态 AND,比”Agent 自述”靠谱 10 倍 |
| 学术严谨度 | ⭐⭐⭐⭐⭐ | arXiv 论文 + Hugging Face Daily Papers #1 + 量化收益(WeaveBench 50%→80%) |
7.2 LH 的代价(性能 + 复杂度 + 维护性)
| 维度 | 评分 | 说明 |
|---|---|---|
| 性能 | ⭐⭐ | 3 个角色每轮 3 次 LLM call + 1 次审计,成本 ~3x 传统 Agent |
| 复杂度 | ⭐⭐ | 6 状态 + 3 角色 + 3 维度完成态,新人 onboarding 难 |
| 维护性 | ⭐⭐ | 4 个 backend 各自演化,prompt 模板版本同步是负担 |
| Context 成本 | ⭐⭐ | 每轮 36K chars Manager prompt + 60K chars Executor context |
| 依赖性 | ⭐⭐ | 强依赖 Claude Code / Codex / OpenCode 任一个 backend 的稳定性 |
核心 trade-off:用”性能 + 复杂度”换”可验证性 + 学术严谨度”。
八、从零搭建启示:MVP 必须是哪几块
如果你想自己复刻 LH 的核心思想(不是复刻 LH 这个项目),最少需要 4 个组件:
graph LR
A["🚦 1. 状态机<br/>(至少 4 路: cli/done/ask/blocked)"] --> B["🧭 2. Manager<br/>(决策下一步)"]
B --> C["⚡ 3. Executor<br/>(执行单步)"]
C --> D["🔍 4. Auditor<br/>(独立验证)"]
D --> B
A --> E["🤖 Long-running Agent"]
B --> E
C --> E
D --> E
style A fill:#FFDAB9,stroke:#333,color:#333
style B fill:#C7CEEA,stroke:#333,color:#333
style C fill:#B5EAD7,stroke:#333,color:#333
style D fill:#E8D5F5,stroke:#333,color:#333
style E fill:#B5EAD7,stroke:#333,color:#333| 组件 | 必选/可选 | 说明 |
|---|---|---|
| 状态机 | ✅ 必选 | 至少 4 路:cli / done / ask / blocked,不要只 2 路(”继续/停止”) |
| Manager 角色 | ✅ 必选 | 每轮决策下一步,把”什么时候停”的判断集中到一个角色 |
| Executor 角色 | ✅ 必选 | 单独 prompt 隔离,让 Manager 不用关心细节 |
| Auditor 角色 | ⚠️ 强烈推荐 | 没有它,你只能相信 Executor 自述;有了它,可信度提升 10 倍 |
| 3 态完成判定 | ⭐ 可选但建议 | 单 status 不够,至少加 Integrity 检查(数据是否被改坏) |
| 验收约束反查 | ⭐ 可选但建议 | 防”模型编完成”,1 行 if 即可加 |
| Adapter 抽象 | ⭐ 可选 | 只用 1 个 backend 可省;多 backend 必加 |
| MAX_ROUNDS | ✅ 必选 | 防止 infinite loop,10-25 即可 |
MVP 最小代码量:200-300 行 Python(包括 prompt 模板 + 状态机 + Auditor)。
九、踩坑预警:实际集成会遇到的 5 个问题
| 坑 | 症状 | 解决方案 |
|---|---|---|
| Auditor 太宽松 | Auditor 总写”complete”,失去验证意义 | 用 apply_acceptance_constraint_guard 反查 |
| Context 爆 | Manager 每轮 36K chars,20 轮后 720K | max_history_chars=36_000 截断 + 只保留最近 N 轮 |
| Executor 越权 | Executor 改了 Manager 没要求的文件 | task_contract 显式写 + Auditor 验”是否改了 contract 之外的东西” |
| done 条件误触 | Status=complete 但实际只完成 80% | 三态 AND (Status + Integrity + Contract),不能单 status |
| 多 backend 一致性 | Claude Code / Codex 各自 prompt schema 不同 | AgentAdapter 抽象层 + 各自 prompt shim |
十、行动建议:今天就能做的 3 件事
如果你读完想动手:
试用 LH(10 分钟):
1
2
3pip install lh-harness
lh-harness init
lh-harness run "在 ~/test/ 创建 5 个文件,每个写 'hello'"然后跑一个 30+ 步的任务,看 Manager/Executor/Auditor 三角色怎么循环。
跑 MVP(10 分钟):把本文 250 行 Python 复制到本地,跑 demo,再改造
FakeLLM.responses让 Auditor 触发”强制降级”,看 Manager 重规划效果。审计自己的 Agent(30 分钟):你的 Agent 现在有没有”完成判定”?是用
agent_claims_done()还是verify_state()?是单状态还是多状态 AND?把这 3 个问题答完,你就知道要不要引入 LH 的 Loop Engineering。
总结:LH 给 Harness Engineering 的 4 个启示
- Loop > Pipeline:Agent 跨任务不是流水线,是循环——每轮都要重新决策。
- Manager 集中化:所有”什么时候停 / 下一步做什么”的决策集中到一个 Manager 角色,避免分散在多个 hook 里。
- Auditor 必须独立:Executor 自述不可信。独立 Auditor + 3 态 AND 比单 status 决策靠谱 10 倍。
- 验收约束反查:模型会编”complete”。反查 + 强制降级 是兜底武器。
最后一句:LH 是 2026 年 10 月 Harness Engineering 赛道第二个值得 1 篇深度长文的项目(第一个是 planning-with-files)。下次再写”long-running agent”或”loop engineering”类文章时,记得把 LH 的 3 态 AND + 验收约束反查 当对比基准。
字数: 7200 / 阅读时长: 20 分钟 / 系列: Harness Engineering 每周深度文