有 Harness 和没 Harness,AI 编码工具差距有多大
同一个模型,同一台电脑,同一个开发者——没有 Harness 和有 Harness,结果不是"差一点",是"能用和不能用的区别"。
一个场景看懂差距
你让 Claude Code 给项目加一个用户注册功能。
没有 Harness:
改了 8 个文件,能编译,注册页面出来了。合入主分支。
三天后安全团队找上门:注册接口没做速率限制,密码用的 MD5,API Key 硬编码在前端,欢迎邮件里直接拼接用户输入——XSS 漏洞。
你回去改 Prompt:"注意安全规范。"下次它换了地方犯同样的错。再改,又在新任务里忘了。每次新会话,从零开始。
有 Harness:
→ 开工前,CLAUDE.md 里写着"密码必须用 Argon2,API Key 走环境变量,用户输入必须转义"——它一开始就不会选 MD5
→ 写完代码,PostToolUse Hook 自动跑 ESLint,两个 lint 问题当场修了
→ 提交前,Stop Hook 跑类型检查和单元测试——有一个测试没过:注册接口没做速率限制。它自己补上了
→ 推到 CI,Semgrep 发现一处 SQL 注入,Trivy 发现新依赖有高危 CVE,PR 打回。它修了注入,换了安全版本的依赖
→ 最终合入的代码:类型安全、测试通过、无已知漏洞、无硬编码密钥
同一个模型,同一个任务。没有 Harness 是"能用但不敢用",有 Harness 是"放心合入"。
Harness 是什么
包裹在 AI 模型外面的一切——规则、工具、约束、反馈、安全边界。
Agent = Model + Harness
模型是大脑,Harness 是身体、神经系统、安全带。这个公式来自 HashiCorp 联合创始人 Mitchell Hashimoto,2026 年 2 月提出后被 OpenAI、LangChain、Anthropic 迅速采纳。
Harness 本意是"马具"。没有缰绳的马是野马,力气再大也拉不了车。Harness 不让马变强,但让马的力量变得有用。
没有 vs 有:核心对比
| 没有 Harness | 有 Harness | |
|---|---|---|
| 质量 | 开发者肉眼看 | 自动化测试 + 静态分析 + 类型检查 |
| 安全 | 出了事才知道 | 写入瞬间拦截密钥泄露,CI 拦截漏洞依赖 |
| 规范 | 靠 Prompt 说,AI 可能忘 | CLAUDE.md 每次自动加载,Hook 不通过就拦 |
| 修正 | 人发现 → 改 Prompt → 下次可能还犯 | Hook 自动检测 → 错误结构化反馈 → AI 当场自修 |
| 集成 | 复制粘贴到 IDE | Git 工作流 + CI/CD 自动化 |
| 评估 | "感觉还行" | 代码接受率、一次通过率可量化 |
| 心态 | "AI 写的我不敢用" | "过了关卡我放心用" |
本质区别:没有 Harness,约束是软的——靠 AI "记住"。有 Harness,约束是硬的——靠系统"强制"。
Prompt 下次会忘,CLAUDE.md 每次加载,CI 永远拦截。
犯错之后:Prompt 思维 vs Harness 思维
AI 犯了错,你怎么处理?这是有没有 Harness 的根本分歧。
"每次 AI 犯了错,不是只修这一次,而是把这个错误变成结构上不可能再发生的约束。" —— Mitchell Hashimoto
| AI 犯了什么错 | Prompt 思维 | Harness 思维 |
|---|---|---|
| 写了不安全的代码 | "注意安全" | 安全扫描接入 CI |
| 忘了处理边界 | "处理边界" | CLAUDE.md 加规则 + 单元测试覆盖 |
| 删错了文件 | "别删文件" | 权限 deny rm -rf |
| 代码风格不一致 | "遵循规范" | Hook 自动跑 Prettier |
| 注释掉了测试 | "别注释测试" | Hook 检测 .skip() 和 xit |
Prompt 思维:靠 AI 记住——下次可能忘,新会话从零开始。
Harness 思维:靠系统强制——CLAUDE.md 每次加载,CI 永远拦截,Hook 自动执行。
像棘轮,只能前进不能后退。每个错误变成一条永久规则,Harness 越来越紧,Agent 越来越可靠。
有 Harness 的 Agent 长什么样
Claude Code:简单循环 + 严格纪律
核心是单线程主循环——"笨循环",但 Harness 不简陋:
| 组件 | 作用 |
|---|---|
| CLAUDE.md | 开工前就告诉 AI 规则,不让它进入错误区域 |
| 实时转向 | 执行中随时插入新指令 |
| 上下文压缩 | 92% 时自动触发,保留关键信息 |
| 权限系统 | 高危操作 deny,安全操作 allow |
| Hooks | PostToolUse 跑 Lint,Stop Hook 跑测试 |
| 检查点 | 每次编辑前自动存档,Esc×2 秒回退 |
| 沙箱 | OS 内核级隔离 |
好的 Harness 不需要复杂,但需要纪律。
企业级 Harness:Stripe 和 Anthropic 的做法
Stripe 的做法是分层隔离——入口标准化、工具按需分发、执行在隔离沙箱、编排用状态机混合确定性节点和 Agent 节点、反馈从秒级 lint 到全量测试、安全层隔绝生产环境。核心设计:该确定的地方确定,该灵活的地方灵活。
Anthropic 的做法是让 AI 查 AI——Generator 生成,Evaluator 审查,形成对抗循环。Evaluator 配备 Playwright MCP 像人类 QA 一样操作浏览器,明确定义评分权重,惩罚"AI 风格"。核心设计:AI 无法有效自我评价,必须外部化审查。
两家形态不同,但都在做同一件事:不靠 AI 自觉,靠系统保障。
你已经在用 Harness 了
如果你在用 Claude Code,这些配置就是在搭建 Harness——只是可能没意识到它们构成一套体系:
| 你在用的功能 | Harness 角色 | 没有 vs 有 |
|---|---|---|
| CLAUDE.md | 约束前馈 | AI 摸黑干活 vs AI 开工前就知道规则 |
| Rules 文件 | 精细化约束 | 所有规则一把抓 vs 按场景精准加载 |
| 权限系统 | 质量门控 | 出了事才发现 vs 高危操作直接拦住 |
| Hooks | 反馈回路 | 人肉跑 Lint vs AI 写完自动检查当场修 |
| 沙箱 | 安全边界 | 信任 AI 不乱来 vs OS 级强制隔离 |
| 子代理 | 编排层 | 一个 Agent 扛所有 vs 任务分解并行 |
| Headless 模式 | 集成层 | 手动跑 CI vs 自动化 Pipeline |
理解了这个框架,你就能从"零散配置"升级为"系统搭建"。