# Harness:先从一次诊断请求开始
这不是 Harness 的完整说明,而是一页入门导读。
第一次阅读时,不需要记组件名,不需要看状态枚举,也不需要理解所有边界。先回答一个问题:**为什么 Diagnosis Agent 外面还需要一层 Harness?**
## 1. 如果只有 Agent,会发生什么
假设用户问:
> 为什么支付服务在 10:00 到 10:10 大量超时?
Diagnosis Agent 会自己决定查什么、调用哪些 Tool、什么时候停止,并根据返回结果写出结论。这里有四个不能只靠 Prompt 解决的问题:
- 它可能查询过多,耗尽时间和 Token;
- Tool 原始结果可能包含敏感或超大内容,不能直接交给模型;
- 它引用了某条日志,不代表这条日志真的来自本次查询;
- 它写出了一个看似合理的根因,不代表证据足以支持这个根因。
这些都不是“诊断能力”问题,而是**执行是否受控、结果是否可信**的问题。Harness 就是为此存在的。
## 2. Harness 在一次请求中做了什么
```mermaid
flowchart LR
Q["用户提出诊断问题"] --> R["给本次执行建立 Run
限制时间和资源"]
R --> A["Agent 分析问题
选择 Tool"]
A --> T["Harness 执行 Tool
保存事实,只给 Agent 安全视图"]
T --> A
A --> D["Agent 写出诊断草稿"]
D --> G["Harness 检查
引用是否真实、证据是否支持结论"]
G --> P["发布报告
或安全地说明证据不足"]
```
顺着这条线看,Harness 只做三类事情:
1. **执行前设边界**:为本次请求建立身份、deadline、预算和取消能力。
2. **执行中管事实**:所有 Tool 经过统一入口,完整事实由系统保管,模型只看到安全、有限的内容。
3. **发布前做验证**:先验证引用,再判断证据是否支持结论;不满足条件就发布 Fallback,而不是让未经验证的结论出去。
Agent 仍然负责“问题的根因是什么”。Harness 不替 Agent 推理,它负责的是:**让这次推理有边界、有证据、能停止。**
## 3. 先建立这个最小心智模型
```mermaid
flowchart TB
A["Diagnosis Agent
负责业务推理"]
H["Harness
负责确定性控制"]
U["用户最终看到的结果"]
A -->|"提出 Tool 请求和诊断草稿"| H
H -->|"返回受控的 Tool 观察"| A
H -->|"验证通过后发布,失败则 Fallback"| U
```
到这里,第一次阅读就可以停下。只要能说清下面这句话,就已经抓住了主干:
> Agent 决定如何诊断,Harness 决定这次诊断可以消耗什么、可以看到什么、何时必须停止,以及什么结果允许发布。
## 4. 需要时再往下读
不要按目录顺序阅读。遇到具体问题时,只进入对应文档:
| 当你想知道 | 再阅读 |
|---|---|
| 准备面试,想用一张图快速复习完整设计 | [Harness 面试速查](Harness面试速查-一张图讲清设计.md) |
| 想看 Harness 如何处理一次真实支付超时诊断 | [支付超时诊断案例](案例-从一次支付超时诊断看Harness如何控制Agent.md) |
| 想知道这套设计如何从多 Agent 和 StateGraph 演进而来 | [Harness 设计演进](Harness设计演进-从多Agent编排到确定性控制边界.md) |
| 想知道异常、停止、降级和最终状态如何对应 | [Harness 失败图谱](Harness失败图谱-异常-停止-降级与终态.md) |
| 想分清 ReactAgent loop 内外异常怎么走、和状态如何对应 | [Loop 内外异常处理](Harness异常处理-Loop内外与状态流.md) |
| 想逐步认识 Harness 的各组组件 | [组件渐进式导读](components/README.md) |
| 为什么选这种控制边界,而不是工作流编排 | [Harness 主设计](Harness设计-非确定性Agent的确定性控制边界.md) |
| 一次请求从开始到结束经历什么 | [生命周期与状态](Harness生命周期与状态.md) |
| Tool 为什么要保存一份事实、给模型另一份视图 | [Tool 双视图](Harness-Tool双视图-从原始结果到可验证证据.md) |
| 如何阻止“引用是真的,但结论是错的” | [证据安全链](Harness证据安全链-从引用真实到结论可发布.md) |
| Agent 为什么不会无限查询 | [信息增益停止](Harness信息增益停止-让无证据诊断正常收敛.md) |
| 某个类属于哪里、负责什么 | [组件全景](Harness组件全景-职责-设计原因与边界.md) |
| 某个名词或状态是什么意思 | [Context 词典](CONTEXT.md) |
如果准备系统学习,建议先读组件渐进式导读的四篇文章。每次只读一篇,读到“先记住这些”就可以停止。
“组件全景”和“Context”都是参考手册,不需要从头读,也不需要背。