<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Harness Engineering on 鬼哥的空间</title><link>https://guige.ai/tags/harness-engineering/</link><description>Recent content in Harness Engineering on 鬼哥的空间</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 27 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://guige.ai/tags/harness-engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>harness 不再纸上谈兵：开源 harness-project-template，附完整工作流实战</title><link>https://guige.ai/p/harness-template-launch/</link><pubDate>Mon, 27 Apr 2026 00:00:00 +0000</pubDate><guid>https://guige.ai/p/harness-template-launch/</guid><description>&lt;img src="https://guige.ai/" alt="Featured image of post harness 不再纸上谈兵：开源 harness-project-template，附完整工作流实战" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;模型已经够强了。&lt;strong&gt;接下来卡你的不是模型，是工作流。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;Codex-5.5、Claude Opus 4.7、Gemini 3、Grok 4 这一代模型出来之后，&amp;ldquo;AI 写代码&amp;quot;的天花板被肉眼可见地抬高了一格。一句模糊的需求扔进去，500 行能跑的代码就出来了。&lt;/p&gt;
&lt;p&gt;但稍微跑过几个真项目你就会发现：模型再强，也只能解决&amp;quot;写代码&amp;quot;这一段；从需求到上线之间的所有事情——怎么拆需求、怎么管上下文、怎么验证、什么时候让人接管——需要一套系统化的运行规范。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这就是 harness 要解决的问题。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最近半年，&lt;a class="link" href="https://luoli523.github.io/p/harness-engineering/" target="_blank" rel="noopener"
 &gt;Anthropic、OpenAI、Google DeepMind、Stripe 一波接一波地讲 Harness Engineering&lt;/a&gt;；&lt;a class="link" href="https://luoli523.github.io/p/agent-skills-analysis/" target="_blank" rel="noopener"
 &gt;Addy Osmani 把 Google 14 年工程文化压缩成 19 个 agent skill 开源放出来&lt;/a&gt;；社区里&amp;quot;工作流第一、模型第二&amp;quot;几乎成了共识。&lt;strong&gt;理论分析和最佳实践讨论已经够多了。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;但你打开 GitHub 想找一个能 clone 就用的脚手架，会发现极少。要么是 SaaS 公司的工作流截图（看不到代码），要么是某个 README 里散落的 &lt;code&gt;CLAUDE.md&lt;/code&gt;（缺工具链衔接），要么是单个 skill 文件（没串成完整流水线）。&lt;strong&gt;理论已经足够，缺的是开箱即用的脚手架。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;于是鬼哥我做了两件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;整理出一个 GitHub Template：&lt;a class="link" href="https://github.com/luoli523/harness-project-template" target="_blank" rel="noopener"
 &gt;&lt;strong&gt;&lt;code&gt;luoli523/harness-project-template&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; —— Python + FastAPI 起步，clone 即用，30 秒装好。&lt;/li&gt;
&lt;li&gt;用它从 0 跑了一个真实 v1 示例项目（多币种财务账本），&lt;strong&gt;39 个 atomic commit、253 个测试、93.79% 覆盖&lt;/strong&gt;，从 SPEC 到 SHIP 一步没跳。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面分两部分：先看模板长什么样、怎么用；再看那个 v1 项目是怎么从一句需求一步一步落到 39 个 commit 的，全程截图。&lt;/p&gt;
&lt;p&gt;&lt;img alt="封面" class="gallery-image" data-flex-basis="360px" data-flex-grow="150" height="1024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/harness-template-launch/cover.webp" srcset="https://guige.ai/p/harness-template-launch/cover_hu_292a04e4679d26c1.webp 800w, https://guige.ai/p/harness-template-launch/cover.webp 1536w" width="1536"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一template长什么样怎么用"&gt;一、template：长什么样、怎么用
&lt;/h2&gt;&lt;h3 id="目录结构"&gt;目录结构
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;harness-project-template/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .agent/prompts/ # 工具无关的 prompt 模板
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .agents/skills/ # 6 个核心 skill（Claude Code + Codex 自动发现）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .claude/ # Claude Code 专属：slash commands + permissions
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .github/workflows/ # CI 跑同一组门禁（ruff + mypy + pytest）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── AGENTS.md # 项目规约（所有 agent 必读）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── CLAUDE.md # 指向 AGENTS.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── src/&amp;lt;your_pkg&amp;gt;/ # FastAPI 脚手架（一个 /health 端点 + async 测试）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── tests/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── scripts/init-template.sh # 一键改名 + sync + 装 hooks
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;事实来源在 &lt;code&gt;AGENTS.md&lt;/code&gt; + &lt;code&gt;.agents/skills/&lt;/code&gt;，工具特定入口（slash command）只是包装。&lt;strong&gt;换 IDE 不用重新教 agent&lt;/strong&gt;，这是设计上的关键。&lt;/p&gt;
&lt;h3 id="6-个核心-skill"&gt;6 个核心 skill
&lt;/h3&gt;&lt;p&gt;这 6 个 skill 不是我自己造的——它们摘选自 Google 资深工程师 &lt;a class="link" href="https://addyosmani.com/" target="_blank" rel="noopener"
 &gt;Addy Osmani&lt;/a&gt; 开源的 &lt;a class="link" href="https://github.com/addyosmani/agent-skills" target="_blank" rel="noopener"
 &gt;&lt;strong&gt;&lt;code&gt;addyosmani/agent-skills&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; 项目（详细解读见 &lt;a class="link" href="https://luoli523.github.io/p/agent-skills-analysis/" target="_blank" rel="noopener"
 &gt;Agent Skills：当 Google 工程文化遇上 AI 编程代理&lt;/a&gt;）。Addy 把 Google 14 年工程文化压缩成 19 个 agent-executable skill，每个都是一份带&amp;quot;反合理化表&amp;quot;的 markdown 工作流。我没把 19 个全塞进模板，只放每个项目里&lt;strong&gt;最小化能把项目跑起来&lt;/strong&gt;的 6 个：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Skill&lt;/th&gt;
 &lt;th&gt;何时调用&lt;/th&gt;
 &lt;th&gt;核心约束&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;spec-driven-development&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;新功能起步&lt;/td&gt;
 &lt;td&gt;先列假设清单 → 用户确认 → 写 spec&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;planning-and-task-breakdown&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;spec 通过后&lt;/td&gt;
 &lt;td&gt;拆成 ≤100 LOC 任务，每任务 2-5 条二元验收&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;incremental-implementation&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;单任务实现&lt;/td&gt;
 &lt;td&gt;RED → GREEN → REFACTOR → atomic commit&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;test-driven-development&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;任何业务逻辑&lt;/td&gt;
 &lt;td&gt;先写失败测试，看红，再写实现&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;code-review-and-quality&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;自审时&lt;/td&gt;
 &lt;td&gt;五轴顺序：correctness → readability → architecture → security → performance&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;git-workflow-and-versioning&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;提交时&lt;/td&gt;
 &lt;td&gt;一任务一 commit，message 引用 spec&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;剩下 13 个（staged rollout、deprecation migration、incident response 等）按需加，不在最小集合里。&lt;/p&gt;
&lt;h3 id="三步起步"&gt;三步起步
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 拉模板（GitHub UI 用 &amp;#34;Use this template&amp;#34; 也行）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh repo create my-service --template luoli523/harness-project-template --private --clone
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; my-service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 一键改名 + sync + 装 hooks + 跑门禁&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./scripts/init-template.sh my_service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 启动开发服务器，验证脚手架已绿&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv run uvicorn my_service.main:app --reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="标准使用顺序"&gt;标准使用顺序
&lt;/h3&gt;&lt;p&gt;之后任何新功能都走这个流程：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/spec &amp;lt;feature&amp;gt; # → 假设清单 → 你确认 → spec/&amp;lt;feature&amp;gt;.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/plan spec/&amp;lt;feature&amp;gt;.md # → 拆成 ≤100 LOC 任务清单
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/build spec/&amp;lt;feature&amp;gt;.md T1 # 一次一个任务，TDD + atomic commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/build spec/&amp;lt;feature&amp;gt;.md T2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;... (重复直到 T_n)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/review # 五轴自审，找 bug 修 bug
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;每个 slash command 包装一个 skill，跨工具一致。换到 Codex CLI 用 &lt;code&gt;$spec-driven-development&lt;/code&gt;、换到 Cursor 直接打开 &lt;code&gt;.agents/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt; 让 agent 跟着读。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二实战从一句需求到-39-个-commit"&gt;二、实战：从一句需求到 39 个 commit
&lt;/h2&gt;&lt;p&gt;&lt;img alt="鬼哥的 spec → ship 工作流脚手架" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/harness-template-launch/guige_cover.webp" srcset="https://guige.ai/p/harness-template-launch/guige_cover_hu_dc556e6821efdea9.webp 800w, https://guige.ai/p/harness-template-launch/guige_cover_hu_5fc047761f6dfcac.webp 1600w, https://guige.ai/p/harness-template-launch/guige_cover_hu_b501211a6c336cdc.webp 2400w, https://guige.ai/p/harness-template-launch/guige_cover.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;p&gt;光看模板不够说服力。下面是我用它跑一个真实 v1（多币种财务账本）的完整过程，截图为证。&lt;/p&gt;
&lt;h3 id="step-1-spec--一句话需求--假设清单"&gt;Step 1: &lt;code&gt;/spec&lt;/code&gt; —— 一句话需求 → 假设清单
&lt;/h3&gt;&lt;p&gt;我扔进去的需求是这样：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;我想做一个财务记账系统，自动按月生成资产负债表、利润表、现金流量表。日常货币是 SGD，CNY 消费、USD 投资、HKD 资产。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;注意 AI 没有立即开始写 spec。skill 强制它&lt;strong&gt;先列出所有它正打算做的隐含假设&lt;/strong&gt;，让我逐条确认：&lt;/p&gt;
&lt;p&gt;&lt;img alt="SPEC 阶段的假设清单" class="gallery-image" data-flex-basis="298px" data-flex-grow="124" height="857" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/harness-template-launch/step-2-assumptions.webp" srcset="https://guige.ai/p/harness-template-launch/step-2-assumptions_hu_42b6b9862e7e6516.webp 800w, https://guige.ai/p/harness-template-launch/step-2-assumptions.webp 1065w" width="1065"&gt;&lt;/p&gt;
&lt;p&gt;四大类：&lt;strong&gt;A. 范围切分（最关键，先确认）、B. 业务模型假设、C. 技术假设、D. 验收边界&lt;/strong&gt;。每条都是一个具体决定（&amp;ldquo;v1 不做权责发生制&amp;rdquo;、&amp;ldquo;HKD 折算并入而不单独成列&amp;rdquo;、&amp;ldquo;持久层用 SQLite&amp;rdquo;），等你 ✓。&lt;/p&gt;
&lt;p&gt;这一步的真实价值：&lt;strong&gt;它把需求里所有模糊的地方拽到表面&lt;/strong&gt;。你看到&amp;quot;v1 不做权责发生制&amp;quot;才会反应过来&amp;quot;等下，那利息预提怎么算？&amp;quot;——这才是真正要决定的事。&lt;/p&gt;
&lt;p&gt;我逐条回 OK 之后，AI 才动手写 &lt;code&gt;spec/&amp;lt;feature&amp;gt;.md&lt;/code&gt;。spec 写完，AI 主动停下：&lt;/p&gt;
&lt;p&gt;&lt;img alt="spec 写完后停在 plan 闸门前" class="gallery-image" data-flex-basis="1726px" data-flex-grow="719" height="135" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/harness-template-launch/step-3-spec-gate.webp" srcset="https://guige.ai/p/harness-template-launch/step-3-spec-gate_hu_f36d8f4b6f5fb0f0.webp 800w, https://guige.ai/p/harness-template-launch/step-3-spec-gate.webp 971w" width="971"&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&amp;ldquo;按规则停在这里，&lt;strong&gt;不进入 plan 阶段&lt;/strong&gt;。请做以下两件事之一：1. 签字通过——回 approved 或 /plan，或 2. 打回修改&amp;hellip;&amp;rdquo;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;这就是 gated workflow 的实物体现&lt;/strong&gt;：闸门写在 skill 里，AI 自己执行。它不会越权，也不会替你决定 spec 通过没。&lt;/p&gt;
&lt;h3 id="step-2-plan--切成-27-个任务卡"&gt;Step 2: &lt;code&gt;/plan&lt;/code&gt; —— 切成 27 个任务卡
&lt;/h3&gt;&lt;p&gt;spec 签字之后，&lt;code&gt;/plan&lt;/code&gt; 命令把它拆成任务清单：&lt;/p&gt;
&lt;p&gt;&lt;img alt="plan 输出 27 个任务卡" class="gallery-image" data-flex-basis="338px" data-flex-grow="141" height="756" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/harness-template-launch/step-4-plan-output.webp" srcset="https://guige.ai/p/harness-template-launch/step-4-plan-output_hu_9a75703b819bd9b0.webp 800w, https://guige.ai/p/harness-template-launch/step-4-plan-output.webp 1067w" width="1067"&gt;&lt;/p&gt;
&lt;p&gt;每个任务：≤100 LOC 估算、2-5 条二元验收清单、列出 blocker、依赖图无环。底部 AI 还会标注它&lt;strong&gt;自己拿不准的拆分点&lt;/strong&gt;，建议我&amp;quot;扫一眼&amp;rdquo;——这种&amp;quot;主动暴露不确定性&amp;quot;也是 skill 引导出来的。&lt;/p&gt;
&lt;p&gt;最终这个项目切成 27 个任务，覆盖基础设施 → 数据模型 → 纯函数业务逻辑 → 仓储 → 报表引擎 → HTTP 路由 → 横切错误处理 → E2E + 收尾。&lt;/p&gt;
&lt;h3 id="step-3-build-t1-t2--t27--每任务一个-tdd-红绿循环"&gt;Step 3: &lt;code&gt;/build T1, T2, ... T27&lt;/code&gt; —— 每任务一个 TDD 红绿循环
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/build T1&lt;/code&gt; 开始第一个任务。RED 阶段——先写失败测试，跑红：&lt;/p&gt;
&lt;p&gt;&lt;img alt="测试跑红，开始装依赖、写实现" class="gallery-image" data-flex-basis="533px" data-flex-grow="222" height="388" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/harness-template-launch/step-6-tdd-red.webp" srcset="https://guige.ai/p/harness-template-launch/step-6-tdd-red_hu_66a032b0a892c8a.webp 800w, https://guige.ai/p/harness-template-launch/step-6-tdd-red.webp 863w" width="863"&gt;&lt;/p&gt;
&lt;p&gt;GREEN 阶段——装依赖、写实现、跑测试转绿、跑全门禁：&lt;/p&gt;
&lt;p&gt;&lt;img alt="全部测试通过 + 全门禁通过" class="gallery-image" data-flex-basis="705px" data-flex-grow="293" height="240" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/harness-template-launch/step-7-gates-pass.webp" width="705"&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ruff check&lt;/code&gt; ✅、&lt;code&gt;ruff format --check&lt;/code&gt; ✅、&lt;code&gt;mypy --strict&lt;/code&gt; ✅、&lt;code&gt;pytest&lt;/code&gt; ✅ —— 四道门禁全过才算 GREEN。&lt;/p&gt;
&lt;p&gt;最后 atomic commit，pre-commit hooks 再过一遍，commit message 引用 spec + task ID：&lt;/p&gt;
&lt;p&gt;&lt;img alt="atomic commit" class="gallery-image" data-flex-basis="1118px" data-flex-grow="466" height="130" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/harness-template-launch/step-8-atomic-commit.webp" width="606"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键&lt;/strong&gt;：单任务做完，AI 自动停下，等下一个 &lt;code&gt;/build T2&lt;/code&gt; 或 &lt;code&gt;approved&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img alt="T1 完成后停下等下一个任务" class="gallery-image" data-flex-basis="1372px" data-flex-grow="571" height="121" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/harness-template-launch/step-9-stop-wait.webp" width="692"&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&amp;ldquo;T1 完成，停在这里。等你说 /build 或 approved 我再开 T2&amp;hellip;&amp;rdquo;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;不会顺手做下一个任务&lt;/strong&gt;，不会&amp;quot;图省事一次写完几个&amp;quot;。每个任务一个独立 commit、独立的 RED→GREEN→commit 循环。这种粒度对未来 git bisect 找 bug、git revert 回滚都是无可替代的。&lt;/p&gt;
&lt;p&gt;T1 → T27 重复 27 次。&lt;/p&gt;
&lt;h3 id="step-4-review--五轴自审"&gt;Step 4: &lt;code&gt;/review&lt;/code&gt; —— 五轴自审
&lt;/h3&gt;&lt;p&gt;27 个任务全做完后，&lt;code&gt;/review&lt;/code&gt; 走五轴自审（correctness → readability → architecture → security → performance），找出了 5 个真 bug + 2 个 spec 漂移。每个发现拆成独立 fix commit + 测试，又是 7 个 commit。&lt;/p&gt;
&lt;h3 id="最终交付"&gt;最终交付
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;39 个 atomic commit、253 个测试、93.79% 覆盖&lt;/strong&gt;。&lt;code&gt;ruff + ruff format + mypy --strict + pytest&lt;/code&gt; 四道门禁全程绿。&lt;/p&gt;
&lt;p&gt;从一句需求到能跑的 v1，全程留痕、可审计、可回滚。每个设计抉择有 spec 锚点；每个 commit 可独立 revert；每个 bug 修复有测试。&lt;strong&gt;短期看慢一点，长期少欠一笔技术债。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="三takeaway现在去-clone"&gt;三、Takeaway：现在去 clone
&lt;/h2&gt;&lt;p&gt;理论文章已经读够多了。这一周我把工作流物化成模板 + 用它跑通一个真实项目，证明这套不是镜中水月。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;仓库地址&lt;/strong&gt;：&lt;a class="link" href="https://github.com/luoli523/harness-project-template" target="_blank" rel="noopener"
 &gt;&lt;strong&gt;&lt;code&gt;luoli523/harness-project-template&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt; —— Python + FastAPI 起步，30 秒装好，欢迎试用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这套模板我会持续维护&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你用它跑了项目、发现 skill 该改进、想加新 skill —— 提 issue 或 PR&lt;/li&gt;
&lt;li&gt;你跑出来的项目踩了模板没覆盖的坑 —— 提 issue，我把教训沉淀回模板&lt;/li&gt;
&lt;li&gt;你想要不同技术栈的类似脚手架（Go、Rust、TypeScript）—— 留言说明诉求，我考虑分仓维护&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;模型还会变强、context window 还会变大，但&lt;strong&gt;让模型按工作流出活&lt;/strong&gt;这个能力不会自动到来。希望这个仓库帮你省掉前两天的摸索成本。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="参考链接"&gt;参考链接
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;上篇 1：&lt;a class="link" href="https://luoli523.github.io/p/harness-engineering/" target="_blank" rel="noopener"
 &gt;Harness Engineering：当模型够强，系统设计成为胜负手&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;上篇 2：&lt;a class="link" href="https://luoli523.github.io/p/agent-skills-analysis/" target="_blank" rel="noopener"
 &gt;Agent Skills：当 Google 工程文化遇上 AI 编程代理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;模板仓库：&lt;a class="link" href="https://github.com/luoli523/harness-project-template" target="_blank" rel="noopener"
 &gt;&lt;code&gt;luoli523/harness-project-template&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;原始 skills 项目：&lt;a class="link" href="https://github.com/addyosmani/agent-skills" target="_blank" rel="noopener"
 &gt;&lt;code&gt;addyosmani/agent-skills&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Harness Engineering：当模型够强，系统设计成为胜负手</title><link>https://guige.ai/p/harness-engineering/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>https://guige.ai/p/harness-engineering/</guid><description>&lt;img src="https://guige.ai/" alt="Featured image of post Harness Engineering：当模型够强，系统设计成为胜负手" /&gt;&lt;p&gt;2026 年上半年，AI 工程领域出现了一个升温极快的概念：&lt;strong&gt;Harness Engineering&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如果你现在还停留在&amp;quot;怎么写一条更好的 prompt&amp;quot;这个层面去构建 Agent，那你可能正在用 2024 年的方法论解决 2026 年的问题。Anthropic、OpenAI、Google DeepMind、Stripe 这些公司几乎同时开始公开传达一个信号——&lt;strong&gt;决定 Agent 能否上线的，不是你给模型喂了什么 prompt，甚至不是你选了什么模型，而是你给模型搭了一套什么样的运行系统。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这套运行系统，就是他们说的 &lt;strong&gt;harness&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="一匹不知道往哪跑的马"&gt;一匹不知道往哪跑的马
&lt;/h2&gt;&lt;p&gt;先聊词源。Harness 的原始含义是马具——缰绳、马鞍、胸带，一整套控制马匹的装备。这个隐喻是刻意选择的：马（模型）强大且快速，但自己不知道该往哪跑；骑手（人类工程师）提供方向；而马具（harness）则是将这匹马的原始力量导向有用工作的那层工程结构。&lt;/p&gt;
&lt;p&gt;翻译成技术语言：&lt;strong&gt;Harness Engineering 不是在教模型怎么回答，而是在设计模型怎么工作。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;它处理的是模型外部的那一整层东西：任务怎么拆解、上下文怎么管理、工具怎么编排、权限怎么设定、状态怎么在会话间交接、做完了怎么验证、失败了怎么恢复、什么时候该把控制权交回给人类。这不是一条 prompt 能搞定的事情，这是一个完整的&lt;strong&gt;运行时系统设计&lt;/strong&gt;问题。&lt;/p&gt;
&lt;h2 id="三代范式从-prompt-到-harness"&gt;三代范式：从 Prompt 到 Harness
&lt;/h2&gt;&lt;p&gt;&lt;img alt="三代范式演进：Prompt ⊂ Context ⊂ Harness" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/harness-engineering/paradigm-evolution.webp" srcset="https://guige.ai/p/harness-engineering/paradigm-evolution_hu_f52a25de34dc2032.webp 800w, https://guige.ai/p/harness-engineering/paradigm-evolution_hu_cb443e06b49103a4.webp 1600w, https://guige.ai/p/harness-engineering/paradigm-evolution_hu_8d671ebac9be782c.webp 2400w, https://guige.ai/p/harness-engineering/paradigm-evolution.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;p&gt;要理解 Harness Engineering 的位置，需要把它放进一条更长的演进链里看。&lt;/p&gt;
&lt;h3 id="第一代prompt-engineering20222024"&gt;第一代：Prompt Engineering（2022–2024）
&lt;/h3&gt;&lt;p&gt;核心问题：&lt;strong&gt;怎么问？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是大语言模型进入公众视野后的第一个工程范式。工程师们发现，同一个模型面对不同措辞的提问，输出质量天差地别。于是 few-shot prompting、chain-of-thought、role-playing、self-consistency 等技巧快速涌现。&lt;/p&gt;
&lt;p&gt;Prompt Engineering 的本质是&lt;strong&gt;单轮、文本层面的优化&lt;/strong&gt;。你精心措辞一段指令，模型给你一个回复，交互结束。它在问答、文本生成、简单推理等场景下效果显著，但天花板也很明显——当任务复杂到需要多步执行、外部信息检索、跨会话状态维持时，单条 prompt 无论写得多精巧，都无能为力。&lt;/p&gt;
&lt;h3 id="第二代context-engineering2025"&gt;第二代：Context Engineering（2025）
&lt;/h3&gt;&lt;p&gt;核心问题：&lt;strong&gt;给模型看什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2025 年年中，Shopify CEO Tobi Lütke 在公开场合表示&amp;quot;context engineering 比 prompt engineering 重要得多&amp;quot;。几乎同一时期，Anthropic 工程团队提出了一个精彩的类比：&lt;strong&gt;把大语言模型看作 CPU，上下文窗口看作 RAM，那么 Context Engineering 就是操作系统层面管理工作内存的技术。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Context Engineering 涵盖了 RAG（检索增强生成）、记忆注入、工具定义、对话历史管理、动态上下文组装等一系列技术。它的核心贡献是认识到：模型的输出质量不仅取决于你怎么问，更取决于你让它&lt;strong&gt;看到了什么&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这是一个重要的认知跃迁——从优化&amp;quot;提问方式&amp;quot;到优化&amp;quot;信息供给&amp;quot;。但 Context Engineering 仍然主要关注模型的&lt;strong&gt;输入侧&lt;/strong&gt;，对模型执行过程中的行为约束、状态管理、失败恢复等问题触及有限。&lt;/p&gt;
&lt;h3 id="第三代harness-engineering2026"&gt;第三代：Harness Engineering（2026）
&lt;/h3&gt;&lt;p&gt;核心问题：&lt;strong&gt;模型在什么系统里干活，如何确保它真的把活干成？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Harness Engineering 不仅管模型看到什么，还管模型能用什么工具、拥有什么权限、怎么保持跨会话状态、必须通过什么验证、产生什么日志、失败了怎么重试、什么时候该暂停等人介入。&lt;/p&gt;
&lt;p&gt;三者之间是清晰的包含关系：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Harness Engineering ⊃ Context Engineering ⊃ Prompt Engineering
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;用一个驾驶类比来说：Prompt 是一句&amp;quot;右转&amp;quot;的语音指令；Context 是给驾驶员一张地图，让它理解右转意味着什么；而 Harness 是&lt;strong&gt;整辆车&lt;/strong&gt;——方向盘、刹车、车道边界、仪表盘、安全气囊、维护计划，以及确保车辆不会在高速公路上失控的所有工程设计。&lt;/p&gt;
&lt;p&gt;&lt;img alt="驾驶类比：Prompt 是指令，Context 是地图，Harness 是整辆车" class="gallery-image" data-flex-basis="360px" data-flex-grow="150" height="1684" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/harness-engineering/car-analogy.webp" srcset="https://guige.ai/p/harness-engineering/car-analogy_hu_a75215640050c248.webp 800w, https://guige.ai/p/harness-engineering/car-analogy_hu_838dffe3dac7ac4f.webp 1600w, https://guige.ai/p/harness-engineering/car-analogy_hu_6614a4c7b0b73bf4.webp 2400w, https://guige.ai/p/harness-engineering/car-analogy.webp 2528w" width="2528"&gt;&lt;/p&gt;
&lt;p&gt;Anthropic 在 2026 年 3 月的工程博客中直接挑明了一个判断：Prompt 和 Context 层面的优化都能显著提升效果，但都会碰到天花板。&lt;strong&gt;前沿的性能差异越来越落在 harness design 上。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="为什么偏偏是-2026-年"&gt;为什么偏偏是 2026 年？
&lt;/h2&gt;&lt;p&gt;Harness Engineering 作为一个显式概念在 2026 年初集中爆发，并非偶然，背后至少有四个结构性因素在同时发力。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一，模型能力越过了&amp;quot;够用&amp;quot;的临界点，系统设计成为主要瓶颈。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2025 年到 2026 年初，Claude Opus 4.5、GPT-5、Gemini 2.5 等模型相继发布。单论推理能力，这些模型在大多数孤立任务上已经表现优秀。但当你试图让它们完成一个需要数十步、跨多个会话、涉及外部工具调用的真实生产任务时，失败率仍然惊人。Anthropic 给出了一个具体的描述：即使是 Opus 4.5，在收到&amp;quot;构建一个完整的 Web 应用&amp;quot;这样的高层级指令时，如果不配备系统化的 harness，它要么试图一口气完成所有事情导致上下文耗尽，要么在下一个 session 中看到一部分进展就提前宣布完成而跳过验证。这类问题换一个更强的模型并不会自动消失——它们是系统层面的问题，需要系统层面的解决方案。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二，串联衰减让&amp;quot;每一步都还行&amp;quot;变成了&amp;quot;整体不可用&amp;quot;。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这里有一个被广泛引用的数学直觉：假设一个多步 Agent 流水线中每一步的成功率是 95%——听起来很高。但如果串联 20 步，端到端的任务完成率只剩下 0.95²⁰ ≈ 36%。&lt;/p&gt;
&lt;p&gt;&lt;img alt="串联衰减：单步 95% 成功率在 20 步后衰减至 36%" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/harness-engineering/serial-decay.webp" srcset="https://guige.ai/p/harness-engineering/serial-decay_hu_d9fdc18e866d327b.webp 800w, https://guige.ai/p/harness-engineering/serial-decay_hu_68d3c67af95590b3.webp 1600w, https://guige.ai/p/harness-engineering/serial-decay_hu_4435beda0f657ec3.webp 2400w, https://guige.ai/p/harness-engineering/serial-decay.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;p&gt;这就是为什么团队经常报告&amp;quot;Agent 95% 的时间都在正常工作&amp;quot;，但真实任务的失败率却接近三分之一。这个问题不是靠更聪明的模型能解决的，必须靠系统层面的验证、重试、检查点机制来应对——而这些恰恰是 harness 的核心职责。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三，模型正在商品化，harness 成为新的差异化因素。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GPT 系列、Claude 系列、Gemini 系列在核心能力上的差距正在缩小。当模型本身不再是竞争壁垒时，围绕模型的系统设计——也就是 harness——就成了新的护城河。这个趋势类似于云计算早期：当计算资源本身变成商品，AWS 之所以领先不是因为它的服务器更快，而是因为它构建了更好的编排、监控和管理系统。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四，Agent 从 demo 走向生产，工程实践倒逼方法论。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2025 年的 Agent 大多停留在演示阶段——跑一个令人印象深刻的 demo，然后在真实场景中悄悄失败。到了 2026 年初，越来越多的团队开始认真地把 Agent 推向生产环境。生产环境对可靠性、可观测性、失败恢复的要求远高于 demo，这些需求天然指向了 harness 层面的工程投入。Devin（Cognition 的自主编程 Agent）在 harness 达到生产就绪之前，经历了六个月、五次完整的架构重写——没有人是一次就做对的。&lt;/p&gt;
&lt;h2 id="关键时间线"&gt;关键时间线
&lt;/h2&gt;&lt;p&gt;这个概念的浮现并非一蹴而就，而是&lt;strong&gt;实践先行、命名随后、推广跟进&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2025 年 11 月&lt;/strong&gt;，Anthropic 发布工程博客 &lt;em&gt;Effective Harnesses for Long-Running Agents&lt;/em&gt;，将 Claude Agent SDK 定义为通用型 Agent Harness。这是&amp;quot;harness&amp;quot;一词在 Agent 工程语境中最早的正式使用之一。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026 年 2 月 5 日&lt;/strong&gt;，Anthropic 联合创始人在博客中写了一句被广泛引用的话：&amp;ldquo;每当你发现 Agent 犯了一个错误，就花时间工程化一个解决方案，让它永远不再犯同样的错。&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026 年 2 月中旬&lt;/strong&gt;，OpenAI 在官方博客发布了标题直接叫 &lt;em&gt;Harness Engineering&lt;/em&gt; 的文章，正式把这个术语推到台前。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026 年 3 月&lt;/strong&gt;，Anthropic 发布了更新的工程博客，系统阐述了 harness design 的方法论演进。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以本质上：&lt;strong&gt;Anthropic 是实践者，命名者，OpenAI 是推广者。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="头部公司怎么做的"&gt;头部公司怎么做的？
&lt;/h2&gt;&lt;p&gt;概念层面讲清楚了，接下来看最硬核的部分：这些公司到底是怎么构建 harness 的？&lt;/p&gt;
&lt;h3 id="anthropic从双-agent-到三-agent-架构"&gt;Anthropic：从双 Agent 到三 Agent 架构
&lt;/h3&gt;&lt;p&gt;&lt;img alt="Anthropic 架构演进：双 Agent → 三 Agent（Planner-Generator-Evaluator）" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/harness-engineering/anthropic-architecture.webp" srcset="https://guige.ai/p/harness-engineering/anthropic-architecture_hu_d066b424642e7397.webp 800w, https://guige.ai/p/harness-engineering/anthropic-architecture_hu_62b57af93ef3c331.webp 1600w, https://guige.ai/p/harness-engineering/anthropic-architecture_hu_54c16a9ec2d521f8.webp 2400w, https://guige.ai/p/harness-engineering/anthropic-architecture.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;p&gt;Anthropic 的实践集中体现在两篇工程博客中（2025 年 11 月和 2026 年 3 月），两篇文章之间能看到方法论的明显演进。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一版：双 Agent 架构。&lt;/strong&gt; 他们将长任务拆成两种角色——初始化 Agent 和编码 Agent。初始化 Agent 只在第一个 session 运行，负责搭建环境、创建脚手架、写入进度追踪文件，并且——这是关键——将用户的高层级指令扩展成数百条具体的、可测试的功能需求清单（JSON 格式）。编码 Agent 在后续 session 中逐个推进功能，每次启动先读取进度文件、审查功能清单、运行已有测试。&lt;/p&gt;
&lt;p&gt;这里有一个重要的设计思想：&lt;strong&gt;外部制品成为 Agent 的记忆。&lt;/strong&gt; 进度文件、Git 历史、结构化需求清单，这些都是跨 session 持久化的。每个 Agent session 在动手之前先从这些制品重建上下文。这本质上是用文件系统解决了 LLM 无状态的核心问题。&lt;/p&gt;
&lt;p&gt;一个值得注意的技术细节：Anthropic 自己透露，这两个 Agent 其实共享相同的系统提示和工具集，区别仅在于初始用户提示不同。换句话说，&lt;strong&gt;仅通过 prompt 差异就能在同一个 harness 内创造专门化行为&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二版：三 Agent 架构（Planner-Generator-Evaluator）。&lt;/strong&gt; Planner 负责需求扩展和任务规划，Generator 负责代码实现，Evaluator 负责用 Playwright 等工具做交互式验证和打分。&lt;/p&gt;
&lt;p&gt;这个演进中最关键的发现是&lt;strong&gt;评估器分离&lt;/strong&gt;。Anthropic 发现，当你让模型评估自己的工作时，它会倾向于自信地表扬自己——即使在人类看来质量明显平庸。这不是某个特定模型的问题，而是自评估的&lt;strong&gt;系统性缺陷&lt;/strong&gt;。他们的结论是：工程化一个独立的、严格的评估器 Agent，远比教会生成器 Agent 自我批评要容易得多。&lt;/p&gt;
&lt;p&gt;另一个重要发现与&lt;strong&gt;模型迭代&lt;/strong&gt;有关：早期 harness 基于 Sonnet 4.5 设计，该模型有明显的&amp;quot;上下文焦虑&amp;quot;倾向——随着上下文增长，模型行为会变得不稳定。因此 harness 设计了上下文重置机制。但换成 Opus 4.5 后，模型自行消除了这一行为，上下文重置机制反而变成了多余的复杂度。&lt;/p&gt;
&lt;p&gt;这说明一个重要原则：&lt;strong&gt;Harness 不是越复杂越好，它必须与模型当前的能力边界相匹配。模型变强了，某些 harness 模块反而应该撤掉。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="openaicodex-团队的百万行实验"&gt;OpenAI：Codex 团队的百万行实验
&lt;/h3&gt;&lt;p&gt;OpenAI 的案例更具传播力，因为他们给出了非常具体的数字。&lt;/p&gt;
&lt;p&gt;一个起初只有三人、后来扩展到七人的工程团队，用 GPT-5 驱动的 Codex Agent，在大约五个月里生成了约一百万行代码，合并了约 1500 个 PR，构建了一个有内部日活用户的生产级产品。团队人均日吞吐量约 3.5 个 PR，而且随着团队扩大，吞吐量反而上升了。&lt;/p&gt;
&lt;p&gt;他们甚至给自己加了一个极端约束：&lt;strong&gt;零手写代码。&lt;/strong&gt; 所有应用逻辑、测试、CI、文档、可观测性、内部工具全部由 Codex 生成。他们坦诚构建速度大约是手写的十分之一，但认为这是一种可接受的权衡——目的是验证 Agent 驱动开发的极限在哪里。&lt;/p&gt;
&lt;p&gt;Martin Fowler 网站上的技术分析将 OpenAI 的 harness 方法论归纳为&lt;strong&gt;三大支柱&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Context Engineering&lt;/strong&gt;：持续增强代码库中的知识文档（如 &lt;code&gt;AGENTS.md&lt;/code&gt;），加上 Agent 对可观测性数据和浏览器的动态访问。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;架构约束&lt;/strong&gt;：不靠 Agent 自觉遵守，而是用确定性的自定义 linter 和结构测试来强制执行——这是硬性规则，不依赖 LLM 的判断。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;垃圾回收&lt;/strong&gt;：定期运行后台 Agent 扫描不一致和架构违规，对抗系统的熵增。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;OpenAI 团队还发现了一个值得铭记的核心模式：&lt;strong&gt;当 Agent 遇到困难时，不要让它更努力地尝试，而是评估它缺少什么能力，把这个能力以可读、可执行的形式提供给它，然后让 Agent 自己编写修复代码。&lt;/strong&gt; 这形成了一个 harness 自我改进的闭环。&lt;/p&gt;
&lt;p&gt;不过，必须加一个诚实度提醒。OpenAI 在呈现这个案例时存在明显的利益关联——他们希望说服市场相信 AI 可以承担大规模代码维护。而且有分析者指出，这篇文章标题虽然叫 &lt;em&gt;Harness Engineering&lt;/em&gt;，但正文中 &amp;ldquo;harness&amp;rdquo; 一词只出现了一次，标题很可能是后来受到 Anthropic 概念的启发才加上去的。&lt;/p&gt;
&lt;h3 id="google-deepmind独立收敛到同一模式"&gt;Google DeepMind：独立收敛到同一模式
&lt;/h3&gt;&lt;p&gt;Google DeepMind 没有像前两家那样发布专门的 harness 方法论文章，但他们用产品说话。&lt;/p&gt;
&lt;p&gt;2026 年 2 月发布的 Elythia 是一个面向数学研究的自主 Agent，核心架构是三组件的 Agent harness：Generator 负责提出候选解法和证明策略，Verifier 用自然语言检查逻辑缺陷和幻觉，Revisor 负责修正验证器发现的错误。三个组件循环迭代，直到输出通过验证。&lt;/p&gt;
&lt;p&gt;注意这里的结构：&lt;strong&gt;Generator → Verifier → Revisor&lt;/strong&gt;，与 Anthropic 的 &lt;strong&gt;Planner → Generator → Evaluator&lt;/strong&gt; 高度对应。两家公司独立走到了同一个设计模式——这不是巧合，这说明&lt;strong&gt;生成-评估分离正在成为 Agent harness 设计的行业共识&lt;/strong&gt;。这个模式的灵感可以追溯到 GAN（生成对抗网络）的对抗训练思想，但在 Agent 系统中被重新发现并赋予了新的工程意义。&lt;/p&gt;
&lt;p&gt;Google 在工具层面也有布局：Agent Development Kit（ADK）作为开源框架，内置了 evaluation harness 做场景驱动测试。2026 年 3 月发布的 ADK Python 2.0 Alpha 还加入了基于图的工作流编排能力。&lt;/p&gt;
&lt;p&gt;另一个值得关注的技术细节：Gemini 2.5 引入了一个叫 &lt;strong&gt;thinking signatures&lt;/strong&gt; 的机制——模型在调用工具之前生成一个加密的推理状态表示，传回对话历史后可以恢复精确的推理链路。这本质上是在&lt;strong&gt;模型层面&lt;/strong&gt;解决跨步骤的状态持久性问题。Anthropic 用 harness 层面的外部制品（进度文件、Git 历史）保持记忆，Google 则尝试在模型内部解决同样的问题——两条技术路线的有效性值得持续观察。&lt;/p&gt;
&lt;h3 id="一个反直觉的案例voxel-的工具减法"&gt;一个反直觉的案例：Voxel 的&amp;quot;工具减法&amp;quot;
&lt;/h3&gt;&lt;p&gt;除了三大巨头，Voxel 提供了一个完全反直觉的经验。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Voxel 的工具减法：移除 80% 工具后效果反而全面提升" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/harness-engineering/tool-subtraction.webp" srcset="https://guige.ai/p/harness-engineering/tool-subtraction_hu_81eb6c371784f463.webp 800w, https://guige.ai/p/harness-engineering/tool-subtraction_hu_a6f4ee1987a12822.webp 1600w, https://guige.ai/p/harness-engineering/tool-subtraction_hu_acd44d2d9ff1d2fd.webp 2400w, https://guige.ai/p/harness-engineering/tool-subtraction.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;p&gt;他们最初给 Agent 配备了一个非常全面的工具库——搜索、文件操作、API 调用、代码分析，应有尽有。结果效果很差：Agent 变得困惑，进行冗余调用，执行不必要的步骤。然后 Voxel 做了一件看似倒退的事：&lt;strong&gt;移除了 80% 的工具。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;结果反而获得了全面提升——更少的步骤、更少的 token 消耗、更快的响应、更高的成功率。&lt;/p&gt;
&lt;p&gt;这个案例揭示了一个深层原则：&lt;strong&gt;约束 Agent 的解决空间反而能提升它的表现。&lt;/strong&gt; 这与传统软件工程中&amp;quot;给工程师更多工具和自由度&amp;quot;的理念完全相反。对于概率性推理系统来说，更多选择意味着更大的决策空间，而更大的决策空间意味着更高的出错概率。精心策划的工具集（curated toolset）比大而全的工具库更有效。&lt;/p&gt;
&lt;p&gt;Stripe 的实践也佐证了这一点：他们的 Agent 运行在隔离的、预热好的沙箱环境里，通过 MCP 协议访问超过 400 个内部工具——但这些工具经过了严格的权限分级和场景适配，而非全部平铺给 Agent。&lt;/p&gt;
&lt;h2 id="一个成熟-harness-的六大模块"&gt;一个成熟 Harness 的六大模块
&lt;/h2&gt;&lt;p&gt;&lt;img alt="六大核心模块全景" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/harness-engineering/six-modules.webp" srcset="https://guige.ai/p/harness-engineering/six-modules_hu_a57d7090e7baad42.webp 800w, https://guige.ai/p/harness-engineering/six-modules_hu_390b2849fb23a93a.webp 1600w, https://guige.ai/p/harness-engineering/six-modules_hu_232bff1b6b6339ed.webp 2400w, https://guige.ai/p/harness-engineering/six-modules.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;p&gt;综合以上公司的实践，一个生产级的 Agent harness 通常包含六个核心模块：&lt;/p&gt;
&lt;h3 id="1-上下文工程与知识管理"&gt;1. 上下文工程与知识管理
&lt;/h3&gt;&lt;p&gt;这是 harness 的基础层，负责确保 Agent 在每个执行步骤中都能访问到正确的信息。&lt;/p&gt;
&lt;p&gt;包括：项目指令文件（如 &lt;code&gt;CLAUDE.md&lt;/code&gt;、&lt;code&gt;AGENTS.md&lt;/code&gt;，Agent 启动时自动读取）、动态上下文注入（从日志、监控指标中获取实时信息）、上下文隔离（用子 Agent 作为&amp;quot;上下文防火墙&amp;quot;，让不同子任务在各自的上下文窗口中运行）、上下文压缩（随着窗口被填满，自动摘要或丢弃无关信息）。&lt;/p&gt;
&lt;p&gt;OpenAI 有一个精辟的观察：&lt;strong&gt;从 Agent 的视角看，它在运行时无法访问的任何东西都等同于不存在。&lt;/strong&gt; 所以越来越多的知识需要被显式地推送到代码库内部，成为版本化的、Agent 可读的制品。&lt;/p&gt;
&lt;h3 id="2-工具编排与权限设计"&gt;2. 工具编排与权限设计
&lt;/h3&gt;&lt;p&gt;Voxel 的经验已经说明，工具不是越多越好。成熟的 harness 需要精心策划工具集、移除冗余选项、设计清晰的权限边界。&lt;/p&gt;
&lt;p&gt;具体包括：MCP（Model Context Protocol）协议集成实现工具标准化、文件系统的读写权限分级、网络访问的白名单控制、沙箱隔离确保 Agent 不会意外影响生产环境。一个好的工具编排层应该让 Agent &lt;strong&gt;只看到它当前任务需要的工具&lt;/strong&gt;，而非所有可用工具。&lt;/p&gt;
&lt;h3 id="3-验证机制与约束执行"&gt;3. 验证机制与约束执行
&lt;/h3&gt;&lt;p&gt;这是 harness 区别于简单 scaffold（脚手架）的核心特征。&lt;/p&gt;
&lt;p&gt;两种约束类型需要协同工作：&lt;strong&gt;确定性约束&lt;/strong&gt;——自定义 linter、结构测试、pre-commit hooks，这些不依赖 LLM 判断，Agent 无法绕过；&lt;strong&gt;评估性约束&lt;/strong&gt;——独立的评估器 Agent，用 Playwright 等工具做交互式验证和打分。&lt;/p&gt;
&lt;p&gt;Anthropic 已经用实验证明了为什么需要这两层：确定性约束兜底确保&amp;quot;不可接受的事情绝对不会发生&amp;quot;，评估性约束则处理那些无法用硬规则覆盖的质量判断。&lt;/p&gt;
&lt;h3 id="4-状态管理与记忆持久性"&gt;4. 状态管理与记忆持久性
&lt;/h3&gt;&lt;p&gt;大语言模型是无状态的——每个新 session 从零开始。这是长任务场景中最核心的工程挑战。&lt;/p&gt;
&lt;p&gt;解决方案是&lt;strong&gt;外部化记忆&lt;/strong&gt;：进度追踪文件记录&amp;quot;做到哪了&amp;quot;、结构化功能清单定义&amp;quot;还剩什么要做&amp;quot;、增量 Git 提交提供&amp;quot;做了什么&amp;quot;的完整审计链、检查点机制支持失败后从最近的成功状态恢复。&lt;/p&gt;
&lt;p&gt;这里有一个有趣的类比：这套机制本质上就是操作系统中进程管理的变体——上下文保存与恢复、持久化存储、崩溃恢复。只不过被管理的&amp;quot;进程&amp;quot;是一个概率性的推理系统，而非确定性的程序。&lt;/p&gt;
&lt;h3 id="5-可观测性与反馈闭环"&gt;5. 可观测性与反馈闭环
&lt;/h3&gt;&lt;p&gt;包括：执行追踪（每一步做了什么、用了什么工具、消耗了多少 token）、质量分级（输出结果的自动评分）、异常检测（识别 Agent 进入循环、产生幻觉等异常模式）。&lt;/p&gt;
&lt;p&gt;最关键的是&lt;strong&gt;反馈归因&lt;/strong&gt;：把 Agent 在生产中的失败模式追溯到 harness 的具体缺陷，驱动持续改进。OpenAI 的&amp;quot;垃圾回收&amp;quot;机制（定期用后台 Agent 扫描不一致和架构违规）就是这个模块的一种实现。&lt;/p&gt;
&lt;h3 id="6-人类接管与生命周期管理"&gt;6. 人类接管与生命周期管理
&lt;/h3&gt;&lt;p&gt;在关键决策点暂停执行——要删数据库？要扣费？要发客户邮件？必须让人类确认。&lt;/p&gt;
&lt;p&gt;还包括：升级路径（Agent 无法解决时如何优雅地交还控制权）、失败重试策略、完整的生命周期钩子（启动前检查、执行中监控、完成后清理）。这个模块的设计原则是：&lt;strong&gt;Agent 的自主性应该与任务的可逆性成正比。&lt;/strong&gt; 可逆操作（如编辑代码）可以高度自主；不可逆操作（如部署到生产、发送外部通知）必须有人类审批环节。&lt;/p&gt;
&lt;h2 id="新瓶装旧酒一个诚实的定位"&gt;新瓶装旧酒？一个诚实的定位
&lt;/h2&gt;&lt;p&gt;讲到这里，可能有人想问：这不就是换了个名字的软件工程吗？&lt;/p&gt;
&lt;p&gt;坦率地说，Harness Engineering 里确实有很大一部分不是新发明。Test harness 在软件工程中已有几十年历史；CI/CD 流水线、linter、pre-commit hooks 是成熟的 DevOps 实践；任务分解与编排在分布式系统中早就被充分研究；沙箱隔离是安全工程的基础概念；可观测性在 SRE 领域已经高度成熟。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果有人说 Harness Engineering 全是新东西，那是在夸大。但如果有人说它纯粹是旧酒，那也不准确。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;它在几个维度上确实产生了新的方法论贡献：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;约束对象发生了根本变化。&lt;/strong&gt; 传统软件工程约束的是确定性代码执行——给定相同输入，程序总是产生相同输出。而 Harness Engineering 约束的是概率性推理系统——相同的 prompt 可能产生不同的输出，模型可能产生幻觉，可能在多步推理中逐渐偏离。这要求在验证、重试、恢复等方面采用根本不同的设计策略。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;约束即提升&amp;quot;的反直觉原则。&lt;/strong&gt; Voxel 的案例证明，约束 Agent 的解决空间——减少工具、限定模式、强制架构边界——反而提升了它的生产力和可靠性。传统工程思维倾向于给工程师更多工具和自由度，但对概率性推理系统，逻辑恰好相反。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码库本身成为 harness 的一部分。&lt;/strong&gt; 代码结构、命名约定、模块边界，不仅服务于人类可读性，更服务于 Agent 的&amp;quot;可推理性&amp;rdquo;。OpenAI 的 Codex 代码库甚至首先为 Agent 的可读性优化，而非人类的阅读偏好。这是一个全新的代码设计维度。&lt;/p&gt;
&lt;p&gt;我个人认为最准确的定位是：&lt;strong&gt;Harness Engineering 类似于 DevOps。&lt;/strong&gt; DevOps 也不是发明了全新的技术，而是在持续交付的压力下，将开发、测试、运维等多个成熟领域的实践重新组合，形成了统一的方法论。Harness Engineering 正在做类似的事——在 Agent 生产化的压力下，将系统设计、测试工程、可观测性等成熟实践重新组合，并补充针对概率性推理系统的新模式。&lt;strong&gt;这种重组本身就是有价值的创新。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="风险与清醒认知"&gt;风险与清醒认知
&lt;/h2&gt;&lt;p&gt;最后聊聊风险。任何新概念在上升期都容易被过度包装，Harness Engineering 也不例外。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;概念膨胀。&lt;/strong&gt; 当一个术语从一个 &lt;code&gt;agent.md&lt;/code&gt; 文件到完整的生产运维系统都能涵盖时，它的精确性就会被稀释。&amp;ldquo;Harness Engineering&amp;quot;正在变成一个什么都能往里装的筐，这对概念的长期生命力是危险的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;过度工程化。&lt;/strong&gt; Anthropic 自己的经验已经证明了这一点：Opus 4.5 自行消除了 Sonnet 4.5 的上下文焦虑行为，harness 中的上下文重置机制随之变成了多余的复杂度。随着模型快速进步，今天精心设计的 harness 模块明天可能就成了不必要的包袱。OpenAI 也强调 harness 必须是&amp;quot;可撕裂的&amp;rdquo;（tearable）——能够随时移除不再需要的模块。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;证据基础偏弱。&lt;/strong&gt; 这是我认为最需要警惕的问题。目前支持 Harness Engineering 价值的大多数证据来自 AI 工具厂商自身——OpenAI 报告 Codex 有多厉害、Anthropic 报告 Claude Agent SDK 改进了多少。这些来源都存在利益冲突。独立的、定量的、可复现的 benchmark 验证目前仍然缺乏。Anthropic 自己都在文章中承认，他们的案例缺少&amp;quot;显著的定量成功指标&amp;quot;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;可复现性存疑。&lt;/strong&gt; OpenAI 的百万行代码案例是在极其特定的条件下完成的：从空仓库开始、用自家的 Codex 工具、团队本身就是 AI 系统专家。这个经验对普通工程团队的可复现性完全没有被验证过。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Harness 也是风险放大器。&lt;/strong&gt; Anthropic 在 biosafety 评测中发现了一个令人警醒的数据：单 Agent 配置下非预期解法的发生率是 0.24%，多 Agent 配置下上升到 0.87%。更强的 harness 并不一定改变模型想走捷径的倾向，但因为更高的 token 使用量和更多并行搜索路径，反而提高了意外行为的概率。&lt;strong&gt;Harness 不只是性能放大器，也可能是风险放大器。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="给-agent-开发者的行动路径"&gt;给 Agent 开发者的行动路径
&lt;/h2&gt;&lt;p&gt;与其纠结于概念定义，不如从务实的角度看看现在能做什么。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;立即能做：&lt;/strong&gt; 在项目根目录创建一个 &lt;code&gt;AGENTS.md&lt;/code&gt;（或 &lt;code&gt;CLAUDE.md&lt;/code&gt;），把 Agent 的工作约束写进去。每次 Agent 犯重复性错误，就在文件中加一条规则。这是最小化的 harness，成本几乎为零，效果立竿见影。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;中期投入：&lt;/strong&gt; 构建确定性验证层。自定义 linter 检查 Agent 输出的代码结构、pre-commit hooks 拦截明显的质量问题、结构测试验证架构约束没有被破坏。再加上基本的可观测性——至少记录每次 Agent 执行的步骤数、token 消耗和成功/失败状态。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;长期方向：&lt;/strong&gt; 设计模块化的、可替换的 harness 架构。每个模块应该能独立启用或禁用，支持模型升级时平滑迁移。记住 Anthropic 的教训：今天为弱模型设计的补偿机制，明天可能因为模型变强而需要拆除。&lt;/p&gt;
&lt;p&gt;引用 OpenAI Codex 团队工程师的一句话来结尾：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Agent 不难，harness 才难。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;当模型能力不再是瓶颈，你为模型搭建的运行系统，就是你真正的竞争力。&lt;/p&gt;</description></item></channel></rss>