<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>smallnest</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://colobu.com/</id>
  <link href="https://colobu.com/" rel="alternate"/>
  <link href="https://colobu.com/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, smallnest</rights>
  <subtitle>大道至简 Simplicity is the ultimate form of sophistication</subtitle>
  <title>鸟窝</title>
  <updated>2026-07-04T08:14:49.784Z</updated>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <content>
      <![CDATA[<blockquote><p>「任何傻瓜都能写出计算机能懂的代码。好的程序员写出人能懂的代码。」——Martin Fowler</p></blockquote><p>你有没有过这种感觉：打开一个文件，还没读懂逻辑，先皱起了眉头。说不上哪儿错了，但就是觉得&quot;不对劲&quot;。</p><p>这种&quot;不对劲&quot;,有个专门的名字——<strong>代码坏味道（Code Smell）</strong>。</p><img src="/2026/07/04/ai-skill-sniffs-out-code-smells/image-20260703065726678.png" class=""><p>它不是 bug，代码跑得好好的；它也不是编译错误，测试全绿。它只是一种<strong>表面的征兆</strong>，暗示底下可能藏着更深的问题。就像厨房里飘来一丝馊味，东西还没坏透，但你知道该去冰箱里翻一翻了。</p><p>这篇文章讲三件事：这个词是怎么来的、坏味道到底有哪几类、以及——我怎么用一个 AI 技能，把一个真实开源项目的核心代码&quot;闻&quot;了个遍。</p><hr><span id="more"></span><h2 id="一、一个厨房比喻，是怎么变成行业术语的"><a href="#一、一个厨房比喻，是怎么变成行业术语的" class="headerlink" title="一、一个厨房比喻，是怎么变成行业术语的"></a>一、一个厨房比喻，是怎么变成行业术语的</h2><p>&quot;代码坏味道&quot;这个词，比很多人想的要年轻。</p><p>它的源头是 1990 年代末的 <strong>WardsWiki</strong>（c2.com，程序员圈最早的维基之一）。<strong>Kent Beck</strong>——极限编程和 JUnit 的作者——在帮 <strong>Martin Fowler</strong> 写《重构》这本书时，随口造了这个词。Fowler 自己在博客里写得很直白：</p><blockquote><p>「A code smell is a surface indication that usually corresponds to a deeper problem in the system. The term was first coined by Kent Beck while helping me with my Refactoring book.」<br>（坏味道是系统表面的一个信号，往往对应着更深层的问题。这个词是 Kent Beck 帮我写《重构》时造的。）</p></blockquote><p>有意思的是，据 c2 wiki 的记载，Beck 造这个词时的灵感，部分来自同事 Massimo Arnoldi 的&quot;鼻子&quot;——一种对烂代码的直觉嗅觉。</p><p>真正让这个词火遍全球的，是 <strong>1999 年出版的《Refactoring: Improving the Design of Existing Code》</strong>。Fowler 在书里专门用一章（和 Beck 合写）罗列了一份&quot;坏味道目录&quot;，并给每种味道配了对应的&quot;重构手法&quot;。从此，&quot;我觉得这段代码有点臭&quot;这种模糊的工程师直觉，第一次有了<strong>可以命名、可以分类、可以按方子治疗</strong>的框架。</p><img src="/2026/07/04/ai-skill-sniffs-out-code-smells/image-20260703065559107.png" class=""><p>为什么这个比喻能活到今天？因为它精准地抓住了一个工程真相：</p><ul><li><strong>坏味道 ≠ 错误。</strong> 有味道的代码照样能上线、能赚钱。</li><li><strong>坏味道是概率信号，不是判决。</strong> 闻到味道，你该去查，但查完可能发现没事。</li><li><strong>味道会累积。</strong> 单个坏味道无所谓，一屋子坏味道，就是所谓的&quot;技术债&quot;和&quot;大泥球&quot;。</li></ul><p>二十多年后的今天，<strong>这个概念比 1999 年更重要了</strong>。因为写代码的，多了一位新玩家——AI。AI 生成代码的速度是人的几十倍，坏味道的<strong>产量</strong>也跟着水涨船高。&quot;<strong>闻味道</strong>&quot;这件事，从一门手艺，正在变成一道必须自动化的工序。</p><hr><h2 id="二、坏味道的家谱：从-Fowler-的-22-种，到今天的-8-大类-50"><a href="#二、坏味道的家谱：从-Fowler-的-22-种，到今天的-8-大类-50" class="headerlink" title="二、坏味道的家谱：从 Fowler 的 22 种，到今天的 8 大类 50+"></a>二、坏味道的家谱：从 Fowler 的 22 种，到今天的 8 大类 50+</h2><p>Fowler 的原始目录里有 <strong>22 种坏味道</strong>，refactoring.guru 后来把它们整理成经典的<strong>五大类</strong>。这套分类是所有后来者的地基，先看它：</p><table><thead><tr><th>类别</th><th>坏味道</th><th>主要重构手法</th></tr></thead><tbody><tr><td><strong>臃肿类</strong>（Bloaters）</td><td>过长方法、过大的类、基本类型偏执、过长参数列表、数据泥团</td><td>Extract Method &#x2F; Extract Class &#x2F; Introduce Parameter Object</td></tr><tr><td><strong>OO 滥用类</strong></td><td>Switch 语句、临时字段、被拒绝的遗赠、异曲同工的类</td><td>Replace Conditional with Polymorphism &#x2F; Replace Inheritance with Delegation</td></tr><tr><td><strong>变更阻碍类</strong></td><td>发散式变化、霰弹式修改、平行继承体系</td><td>Extract Class &#x2F; Move Method</td></tr><tr><td><strong>冗余类</strong>（Dispensables）</td><td>注释（本该自说明）、重复代码、冗赘类、纯数据类、死代码、夸夸其谈未来性</td><td>Extract Method &#x2F; Inline Class &#x2F; 直接删除</td></tr><tr><td><strong>耦合类</strong>（Couplers）</td><td>依恋情节、狎昵关系、消息链、中间人</td><td>Move Method &#x2F; Hide Delegate &#x2F; Remove Middle Man</td></tr></tbody></table><img src="/2026/07/04/ai-skill-sniffs-out-code-smells/image-20260703071026940.png" class=""><p>这五类的核心逻辑是「<strong>症状 → 处方</strong>」：你先嗅到一个症状（比如&quot;过长方法&quot;），目录再告诉你该用哪几种手法去治。这套映射关系明确、能机械执行——<strong>而&quot;能机械执行&quot;这四个字，恰恰是 AI Agent 能接得住的地方。</strong></p><p>但 Fowler 的目录写于 2000 年，它盯的都是<strong>函数和类这个尺度</strong>的问题。今天的软件更复杂，坏味道也长出了新的分支。我用的这个 <code>smell</code> 技能，把视野往上抬了一层，也往下探了一层，整理成 <strong>8 大类、50+ 种</strong>：</p><table><thead><tr><th>类别</th><th>代表坏味道</th></tr></thead><tbody><tr><td><strong>架构</strong></td><td>大泥球、分布式单体、贫血模型、CQRS 滥用、层边界违反、过度分层、过度抽象、&quot;未来主义&quot;架构</td></tr><tr><td><strong>耦合</strong></td><td>循环依赖、内容耦合、公共耦合（全局状态）、印记耦合</td></tr><tr><td><strong>内聚</strong></td><td>上帝对象、霰弹式修改、依恋情结、数据泥团、发散式变化</td></tr><tr><td><strong>设计</strong></td><td>抽象泄露、静态粘连、服务定位器滥用、SOLID 违反、Switch 类型分支</td></tr><tr><td><strong>代码</strong></td><td>重复代码、长方法、基本类型偏执、魔数魔串、死代码、深层嵌套（箭头反模式）</td></tr><tr><td><strong>测试</strong></td><td>零测试覆盖、测试-实现耦合、不稳定测试</td></tr><tr><td><strong>命名</strong></td><td>模糊命名（Manager&#x2F;Helper&#x2F;Util 满天飞）、命名不一致</td></tr><tr><td><strong>复杂度</strong></td><td>嵌套循环 O(n²)、N+1 查询、重复线性扫描、循环内排序、渲染重复计算、数据结构选错</td></tr><tr><td>注意最后两类——<strong>「测试」和「复杂度」是 Fowler 原目录里没有的</strong>。它们为什么被加进来？因为这正是 <strong>AI 时代新暴露的坑</strong>：</td><td></td></tr></tbody></table><ul><li>AI 生成的代码，经常<strong>零测试覆盖</strong>——它写得又快又像模像样，但一行测试没有。</li><li>AI 也经常埋下 <strong>N+1 查询、循环内排序</strong>这类&quot;低速炸弹&quot;——小数据量下一切正常，一上量就爆炸，代码评审时一眼还看不出来。</li></ul><p>换句话说，坏味道的家谱一直在生长。从 Kent Beck 的一个厨房比喻，到 Fowler 的 22 种，再到今天覆盖架构与性能的 50+ 种——<strong>每一次扩张，都是软件复杂度提升后，工程界给自己补的一课。</strong></p><hr><h2 id="三、把-嗅觉-装进-Agent：-smell-技能是怎么工作的"><a href="#三、把-嗅觉-装进-Agent：-smell-技能是怎么工作的" class="headerlink" title="三、把&quot;嗅觉&quot;装进 Agent：/smell 技能是怎么工作的"></a>三、把&quot;嗅觉&quot;装进 Agent：<code>/smell</code> 技能是怎么工作的</h2><p>概念讲完了，来看工具。<code>/smell</code> 是一个可以直接在命令行 AI Agent（Claude Code &#x2F; Ducc 这类）里调用的技能，一句话概括它的定位：</p><blockquote><p><strong><code>/smell</code> 负责诊断，<code>/refactor</code> 负责治疗。一个出报告排优先级，一个照 Fowler 手法一处处动手术。</strong></p></blockquote><img src="/2026/07/04/ai-skill-sniffs-out-code-smells/image-20260703071315310.png" class=""><p>面对一个 AI 攒出来的几万行代码库，最难的往往不是&quot;怎么改&quot;，而是**&quot;先改哪&quot;**。哪个模块烂得最厉害？是架构错了，还是只有某个函数太长？<code>/smell</code> 回答的就是这个问题。</p><p>它的工作流分四步：</p><p><strong>1. 确定范围。</strong> 全项目扫、还是只扫某个模块、还是只看 <code>git diff</code> 的最近改动。大项目默认只扫改动，小项目全量扫。</p><p><strong>2. 并行取证。</strong> 派出多个 Explore 子 Agent，用 <code>find</code> &#x2F; <code>grep</code> 同时跑七类扫描：项目结构、依赖关系、模块内聚、模式识别、测试覆盖、命名清晰度、复杂度热点。技能内置了一整套<strong>检测启发式规则</strong>，比如：</p><ul><li>单文件 &gt; 500 行、公共方法 &gt; 20 个 → 疑似<strong>上帝对象</strong></li><li>循环体里出现 <code>fetch</code>&#x2F;<code>query</code>&#x2F;<code>exec</code> → 疑似 <strong>N+1 查询</strong></li><li>循环里用 <code>.includes()</code>&#x2F;<code>.indexOf()</code> 做查找 → <strong>重复线性扫描</strong>，本该用 Set&#x2F;Map</li><li>满屏的 <code>Manager</code>&#x2F;<code>Helper</code>&#x2F;<code>Util</code> → <strong>模糊命名</strong></li></ul><p><strong>3. 生成结构化报告。</strong> 不是简单列问题，而是产出一份带优先级的 Markdown：</p><ul><li>执行摘要 + 整体健康评估</li><li>检测到的架构风格，对比它&quot;本该是&quot;的样子</li><li>按 🔴 严重 &#x2F; 🟡 警告 &#x2F; 🔵 建议 三级分类的发现</li><li>依赖图分析 + 模块健康评分卡</li><li>8 大类坏味道的分布统计</li><li><strong>一份分「立即 &#x2F; 短期 &#x2F; 长期」的重构路线图</strong></li></ul><p><strong>4. 落盘 + 汇报。</strong> 报告存到 <code>tasks/smell-report-[时间戳].md</code>，同时给你一份口头摘要。</p><p>最有价值的是那份路线图。它把&quot;这代码是不是该重构了&quot;这种主观焦虑，变成了<strong>可量化的行动清单</strong>：先动哪、后动哪，一目了然。改完再跑一遍，健康评分涨了没有，前后一对比就知道这次重构有没有白干。</p><p>安装也简单：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add smallnest/goal-workflow --skill smell</span><br></pre></td></tr></table></figure><p>然后直接打 <code>/smell</code>，或者用自然语言触发：「找出代码坏味道」「检测架构反模式」「分析代码复杂度」。</p><hr><h2 id="四、实战：我用-smell-扫了-Gitlawb-zero-这个开源项目"><a href="#四、实战：我用-smell-扫了-Gitlawb-zero-这个开源项目" class="headerlink" title="四、实战：我用 /smell 扫了 Gitlawb/zero 这个开源项目"></a>四、实战：我用 <code>/smell</code> 扫了 <code>Gitlawb/zero</code> 这个开源项目</h2><p>光说不练假把式。我挑了一个真实的开源项目下手：<a href="https://github.com/Gitlawb/zero"><strong>Gitlawb&#x2F;zero</strong></a>——一个用 Go 写的终端 AI 编程 Agent（&quot;A terminal coding agent you own&quot;），支持 25+ 家模型提供商，代码量不小。它昨天刚发布，比较适合用来学习。</p><p>先上体检数据：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">项目：Gitlawb/zero</span><br><span class="line">语言：Go 1.25（toolchain 1.26）</span><br><span class="line">Go 文件总数：974</span><br><span class="line">代码总行数：~25 万行</span><br><span class="line">测试文件：500 个  |  非测试文件：474 个</span><br></pre></td></tr></table></figure><img src="/2026/07/04/ai-skill-sniffs-out-code-smells/image-20260703062722697.png" class=""><p>代码量非常的大，我先用它分析核心的agent的代码，下面是分析结果的总结：</p><h3 id="🟢-先说好的：这项目-体质-其实不错"><a href="#🟢-先说好的：这项目-体质-其实不错" class="headerlink" title="🟢 先说好的：这项目&quot;体质&quot;其实不错"></a>🟢 先说好的：这项目&quot;体质&quot;其实不错</h3><p>扫完第一个惊喜是——<strong>测试文件（500）比源码文件（474）还多</strong>。测试-代码比超过 1:1，这在开源项目里相当罕见。对照 <code>/smell</code> 的「测试」类坏味道（零测试覆盖、测试-实现耦合），zero 在这一维度上健康度很高。</p><p>第二个惊喜：<strong>全项目只有 1 处 TODO&#x2F;FIXME 注释</strong>。&quot;注释当除臭剂&quot;（用 TODO 掩盖烂代码）这个坏味道，在这里基本不存在。目录结构也清晰——<code>cmd/</code> 放入口、<code>internal/</code> 按职责分了 60+ 个子包，不是&quot;大泥球&quot;。</p><h3 id="🔴-但也闻到了明确的坏味道"><a href="#🔴-但也闻到了明确的坏味道" class="headerlink" title="🔴 但也闻到了明确的坏味道"></a>🔴 但也闻到了明确的坏味道</h3><p><strong>1. 上帝对象（God Object）—— 🔴 严重</strong></p><p>最刺鼻的一处：<code>internal/tui/model.go</code>，<strong>4657 行</strong>，单个 <code>Model</code> 结构体扛着 <strong>173 个字段</strong>、<strong>111 个方法</strong>。</p><img src="/2026/07/04/ai-skill-sniffs-out-code-smells/image-20260703071243737.png" class=""><p>对照 <code>smell</code> 技能的启发式（&gt; 500 行、&gt; 20 个公共方法即疑似上帝对象），这个文件超标了 <strong>9 倍</strong>。它是典型的 TUI &quot;全知全能对象&quot;——把整个终端界面的所有状态、所有行为都塞进了一个结构体。</p><ul><li><strong>违反原则</strong>：单一职责（SRP）</li><li><strong>处方</strong>：<code>Extract Class</code>——把 173 个字段按关注点分组（会话状态、渲染状态、输入状态、模型选择……），拆成若干个内聚的小结构体，<code>Model</code> 只做组合。</li></ul><p><strong>2. 长文件扎堆 —— 🟡 警告</strong></p><p>除了那个 4657 行的巨无霸，超过 800 行的源文件还有 <strong>23 个</strong>，重灾区集中在 <code>internal/tui/</code> 和 <code>internal/agent/</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">4657  internal/tui/model.go       ← 上帝对象</span><br><span class="line">2736  internal/agent/loop.go      ← Agent 主循环，84 个函数</span><br><span class="line">2493  internal/tui/rendering.go</span><br><span class="line">1709  internal/tui/onboarding.go</span><br><span class="line">1693  internal/tui/provider_wizard.go</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p><code>internal/agent/loop.go</code>（2736 行 &#x2F; 84 个函数）是 Agent 的核心循环，长度可以理解，但也值得警惕<strong>发散式变化</strong>——一个文件因为太多不同原因被反复修改。</p><p><strong>3. 潜在复杂度热点 —— 🔵 建议（需人工确认）</strong></p><p>启发式扫描发现：</p><ul><li><strong>307 处</strong>&quot;循环内做线性查找&quot;的疑似点（<code>for range</code> 内出现 <code>strings.Contains</code>&#x2F;<code>slices.Contains</code>&#x2F;<code>.Index()</code>）</li><li><strong>63 处</strong>&quot;循环内排序&quot;疑似点</li></ul><p>这两个数字需要辩证看——<code>/smell</code> 技能本身也强调 <strong>&quot;What NOT to Flag&quot;</strong>：如果这些循环跑在冷路径（启动、配置加载）或数据量极小（N &lt; 100），就是可读性优先的合理取舍，不值得改。但如果落在<strong>热路径</strong>（比如每次渲染、每个 token 都跑一遍），那就是实打实的性能坑，该换 Set&#x2F;Map 或把排序提到循环外。<strong>这一步机器只能标记，真正的判断得人来做。</strong></p><h3 id="📋-给-zero-的重构路线图"><a href="#📋-给-zero-的重构路线图" class="headerlink" title="📋 给 zero 的重构路线图"></a>📋 给 zero 的重构路线图</h3><p><code>/smell</code> 的收尾，是把发现整理成一份可执行的路线图：</p><ul><li><strong>立即可做</strong>：拆分 <code>tui/model.go</code> 这个 4657 行的上帝对象——收益最高、风险可控（有 500 个测试兜底）。</li><li><strong>短期（1-3 月）</strong>：审查 23 个超长文件里的 <code>tui/</code> 一组，按关注点做 Extract Class。</li><li><strong>长期</strong>：给 307 处线性扫描 + 63 处循环内排序做一次热路径分析，确认哪些真在性能关键路径上，针对性优化数据结构。</li></ul><p><strong>整体健康评估：🟡 良好偏上。</strong> 架构清晰、测试充分、几乎无死代码，这是它的底子；主要问题集中在 TUI 层的&quot;上帝对象&quot;和长文件——这也是 TUI 类项目的通病，状态多、交互密，天然容易膨胀。</p><p><code>/smell</code>技能除了生成总结外，还会生成一个详细的分析报告：</p><img src="/2026/07/04/ai-skill-sniffs-out-code-smells/image-20260703063103024.png" class=""><img src="/2026/07/04/ai-skill-sniffs-out-code-smells/image-20260703063126184.png" class=""><hr><h2 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h2><p>从 Kent Beck 1990 年代末的一个厨房比喻，到 Fowler 的 22 种坏味道目录，再到今天覆盖架构与性能的 50+ 种、并且能被 AI Agent 自动扫描的技能——<strong>&quot;闻代码&quot;这件事，走过了从直觉、到方法论、到自动化的完整二十年。</strong></p><p>AI 让写代码变快了，但也让坏味道产量暴增。这时候，一个能自动&quot;闻味道、排优先级、给路线图&quot;的工具，价值不在于它多聪明，而在于它把&quot;这代码是不是该收拾了&quot;这个含糊的焦虑，变成了一份<strong>你今天下午就能动手的清单</strong>。</p><p>代码必须变干净——而变干净的第一步，是先知道它哪儿臭了。</p><hr><p><strong>Sources &#x2F; 参考资料：</strong></p><ul><li><a href="https://martinfowler.com/bliki/CodeSmell.html">Code Smell — Martin Fowler</a></li><li><a href="https://en.wikipedia.org/wiki/Code_smell">Code smell — Wikipedia</a></li><li><a href="http://c2.com/ppr/wiki/WikiPagesAboutRefactoring/CodeSmell.html">CodeSmell — c2 WardsWiki</a></li><li>《Refactoring: Improving the Design of Existing Code》, Martin Fowler &amp; Kent Beck, 1999</li><li>refactoring.guru 坏味道与重构手法目录</li><li>《AI时代的软件工程》第 23 章「重构：AI 时代的代码进化」</li><li><code>smell</code> 技能：<a href="https://github.com/smallnest/goal-workflow">https://github.com/smallnest/goal-workflow</a></li><li>分析对象：<a href="https://github.com/Gitlawb/zero">https://github.com/Gitlawb/zero</a></li></ul>]]>
    </content>
    <id>https://colobu.com/2026/07/04/ai-skill-sniffs-out-code-smells/</id>
    <link href="https://colobu.com/2026/07/04/ai-skill-sniffs-out-code-smells/"/>
    <published>2026-07-04T08:08:14.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>「任何傻瓜都能写出计算机能懂的代码。好的程序员写出人能懂的代码。」——Martin Fowler</p>
</blockquote>
<p>你有没有过这种感觉：打开一个文件，还没读懂逻辑，先皱起了眉头。说不上哪儿错了，但就是觉得&quot;不对劲&quot;。</p>
<p>这种&quot;不对劲&quot;,有个专门的名字——<strong>代码坏味道（Code Smell）</strong>。</p>
<img src="/2026/07/04/ai-skill-sniffs-out-code-smells/image-20260703065726678.png" class="">
<p>它不是 bug，代码跑得好好的；它也不是编译错误，测试全绿。它只是一种<strong>表面的征兆</strong>，暗示底下可能藏着更深的问题。就像厨房里飘来一丝馊味，东西还没坏透，但你知道该去冰箱里翻一翻了。</p>
<p>这篇文章讲三件事：这个词是怎么来的、坏味道到底有哪几类、以及——我怎么用一个 AI 技能，把一个真实开源项目的核心代码&quot;闻&quot;了个遍。</p>
<hr>]]>
    </summary>
    <title>代码在发臭：一个能&quot;闻&quot;出坏味道的 AI 技能，我拿它扫了最新的开源代码</title>
    <updated>2026-07-04T08:14:49.784Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="网络" scheme="https://colobu.com/categories/%E7%BD%91%E7%BB%9C/"/>
    <category term="网络" scheme="https://colobu.com/tags/%E7%BD%91%E7%BB%9C/"/>
    <content>
      <![CDATA[<p>这是百度网络监控工具 nettools 开源系列的第四篇。前三篇分别介绍了 bitflip&#x2F;baize（UDP 丢包与改包检测工具和Agent）、lidar（TCP SYN 端口可达性探测），它们解决的都是「服务器之间」「点到点」的探测问题——前提是：探测机和被探测对象，至少有一端在我们手里。</p><p>但有一类设备，我们既无法在它上面装 agent，也没法在它对面的机房里放一台探测机。这就是今天的主角 evr 要解决的困境。</p><p>这也是我更深入的了解网络包的构造，把网络探测玩出花了来，对我的网络编程的功力大增的一个很好的场景。</p><blockquote><p>项目地址：<a href="https://github.com/baidu/nettools">https://github.com/baidu/nettools</a><br>文档：<a href="https://nettools.rpcx.io/">https://nettools.rpcx.io</a></p></blockquote><h2 id="一、evr-探测的困境：探测机进不去客户机房"><a href="#一、evr-探测的困境：探测机进不去客户机房" class="headerlink" title="一、evr 探测的困境：探测机进不去客户机房"></a>一、evr 探测的困境：探测机进不去客户机房</h2><p>先说一个真实的场景。</p><p>百度有大量的云客户，我们提供的 <strong>EVR（Edge Virtual Router，边缘虚拟路由器）</strong> 设备作为客户侧网络接入百度云网络的边界节点。EVR 往上连百度的骨干&#x2F;城域网络，往下连客户自己的虚拟网络（VXLAN overlay）。</p><blockquote><p>EVR - 边缘虚拟路由器，通常用于在虚拟化环境中实现路由功能。EVR 位于网络的边缘，用于连接内部网络和外部网络（如客户机房）。</p></blockquote><p>现在问题来了：我们需要监控「百度网络 → EVR」这一段链路的健康度——有没有丢包、延迟多大、有没有改包。按照前几个工具的套路，我们的方案应该是：</p><ul><li>在 EVR 设备上装个 agent？—— <strong>不行</strong>。EVR 是网络设备&#x2F;客户侧设备，我们没有权限往里塞监控程序。</li><li>在 EVR 对面（客户机房内）放一台探测机，做点到点探测？—— <strong>更不行</strong>。那是客户的机房，正常情况我们不可能在客户的物理环境里申请一台探测机常驻。</li></ul><p>lidar 那一套「发 SYN，靠对端内核 TCP 协议栈自动回 SYN-ACK&#x2F;RST」的思路，在这里也不灵——EVR 不是一台服务器，它不会帮你跑 TCP 协议栈三次握手，或者说不允许我们高频的探测。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">   百度侧                          边缘设备</span><br><span class="line">┌──────────┐                  ┌──────────────────────┐</span><br><span class="line">│  探测机   │ ───── ??? ─────► │   EVR 设备            │</span><br><span class="line">│ (我们的)  │                  │   (装不了 agent)      │</span><br><span class="line">└──────────┘                  │   对面也放不了探测机    │</span><br><span class="line">                              └──────────────────────┘</span><br></pre></td></tr></table></figure><img src="/2026/06/30/baidu-network-monitor-evr-vxlan-probe/image-20260630042946520.png" class=""><p>困境的本质是：<strong>被探测对象不可控，且它对面也无法部署探测机。</strong> 我们需要一个 <strong>「单边」</strong> 就能完成的探测方案——只在百度侧放一台机器，让 EVR 设备自己「帮我们把包送回来」。</p><p>答案藏在 EVR 设备的工作原理里：它是一个 <strong>VXLAN VTEP（VXLAN Tunnel End Point）</strong>。而 VTEP 有一个非常好用的特性——它会忠实地按照内层 IP 头转发解封后的内层帧。这就给了我们「构造一个会被反射回来的 VXLAN 包」的可能。</p><p>要理解这个技巧，得先看懂 VXLAN 的包结构。</p><span id="more"></span><h2 id="二、VXLAN：把二层帧塞进-UDP-里"><a href="#二、VXLAN：把二层帧塞进-UDP-里" class="headerlink" title="二、VXLAN：把二层帧塞进 UDP 里"></a>二、VXLAN：把二层帧塞进 UDP 里</h2><p>VXLAN（Virtual Extensible LAN，RFC 7348）是数据中心 overlay 网络的事实标准。它要解决的核心问题是：传统 VLAN 只有 12 位 VLAN ID，最多 4096 个二层网络，在大规模多租户云环境里完全不够用。</p><p>VXLAN 的做法简单粗暴又有效：<strong>把一个完整的二层以太网帧，整个塞进一个 UDP 数据报里</strong>，通过三层网络传输。这样原本受限于物理二层域的网络，可以跨越任意三层网络延展，VNI（VXLAN Network Identifier）有 24 位，支持约 1600 万个 overlay 网络。</p><img src="/2026/06/30/baidu-network-monitor-evr-vxlan-probe/image-20260630053211131.png" class=""><p>它的包结构从外到内是这样的：</p><img src="/2026/06/30/baidu-network-monitor-evr-vxlan-probe/vxlan-packet.png" class=""><p>一层层拆开看：</p><table><thead><tr><th>层</th><th>大小</th><th>关键字段</th><th>作用</th></tr></thead><tbody><tr><td>外层 Ethernet</td><td>14 B</td><td>物理 MAC</td><td>underlay 二层转发</td></tr><tr><td>外层 IP</td><td>20 B</td><td>src &#x2F; dst IP</td><td>underlay 三层路由（VTEP 之间）</td></tr><tr><td>外层 UDP</td><td>8 B</td><td><strong>dport &#x3D; 4789</strong></td><td>VXLAN 标准端口，VTEP 据此识别</td></tr><tr><td><strong>VXLAN header</strong></td><td>8 B</td><td>flags + <strong>VNI(24 位)</strong></td><td>标识 overlay 网络</td></tr><tr><td>内层 Ethernet</td><td>14 B</td><td>租户 MAC</td><td>被封装的原始二层帧开始</td></tr><tr><td>内层 IP</td><td>20 B</td><td>内层 src &#x2F; dst</td><td>overlay 里的真实通信地址</td></tr><tr><td>内层 UDP&#x2F;TCP</td><td>8 B</td><td>内层端口</td><td>租户的真实流量</td></tr><tr><td>Payload</td><td>N B</td><td>业务数据</td><td>原始负载</td></tr><tr><td>其中 8 字节的 VXLAN header 结构是：</td><td></td><td></td><td></td></tr></tbody></table><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"> 0                   1                   2                   3</span><br><span class="line"> 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1</span><br><span class="line">+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</span><br><span class="line">|R|R|R|R|I|R|R|R|            Reserved                           |</span><br><span class="line">+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</span><br><span class="line">|                VXLAN Network Identifier (VNI) |   Reserved    |</span><br><span class="line">+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</span><br></pre></td></tr></table></figure><p><code>I</code> 位（第 5 位）置 1 表示 VNI 有效，剩下的 24 位就是 VNI。</p><p><strong>VTEP 的工作模型</strong>：它从外层 UDP&#x2F;4789 收到一个 VXLAN 包，剥掉外层 Eth&#x2F;IP&#x2F;UDP 和 VXLAN header，拿到内层的原始以太网帧，然后<strong>按内层 IP 头继续转发</strong>。</p><p>注意最后这句话——「按内层 IP 头继续转发」。这就是 evr 整个设计的命门所在：<strong>如果我把内层 dst IP 填成我自己，VTEP 解封后不就把包转回给我了吗？</strong></p><h2 id="三、evr-工具：让-EVR-自己把包反射回来"><a href="#三、evr-工具：让-EVR-自己把包反射回来" class="headerlink" title="三、evr 工具：让 EVR 自己把包反射回来"></a>三、evr 工具：让 EVR 自己把包反射回来</h2><h3 id="实现原理：自环内层帧-payload-内嵌-EVR-源-IP"><a href="#实现原理：自环内层帧-payload-内嵌-EVR-源-IP" class="headerlink" title="实现原理：自环内层帧 + payload 内嵌 EVR 源 IP"></a>实现原理：自环内层帧 + payload 内嵌 EVR 源 IP</h3><p>evr 的核心是一个反直觉但极其精简的设计——「<strong>自环内层帧</strong>」。</p><img src="/2026/06/30/baidu-network-monitor-evr-vxlan-probe/image-20260630055337562.png" class=""><p>先看一个绕不开的硬约束：VTEP 是<strong>按内层 IP 头转发</strong>解封后的帧的。所以要让反射的包能回到探测机，<strong>内层 dst IP 就必须填探测机本机</strong>——填别的地址，包就被转到别处去了，根本回不来。这一点没得选。</p><p>真正有选择空间的是<strong>内层 src IP</strong>。最「自然」的想法是：把每个目标 EVR 的源 IP 填进内层 src IP，回包时靠这个 src IP 区分「是哪个目标反射回来的」。多目标时，本机收到一堆 dst&#x3D;本机、src&#x3D;各个 EVR 的回包，按 src IP 分流即可。</p><p>但 evr 偏偏没这么做——它把内层 src IP 也填成了本机（<strong>src &#x3D; dst &#x3D; 本机，自环</strong>）。这样一来，那个本可用来标识目标的内层 src IP 就被「浪费」掉了，回包里全是 <code>src=本机, dst=本机</code>，彼此长得一模一样，没法区分目标了。</p><p>那为什么要主动放弃这个天然的标识位？<strong>这里其实有一个技巧</strong>：<br>当出现故障的时候，我们要使用traceroute的功能，通过设置TTL，回获取内层的回包经过的路径。通过设置src IP为探测机的IP,我们就能够让ICMP的回包发送给探测机，这样就可以把回程的路径都探测出来了。</p><p>evr 的三招合起来是这样：</p><p><strong>第一招：内层 src IP 和 dst IP 都填探测机的本机地址。</strong></p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// agent.go：内层 src == 内层 dst == 本机 IP</span></span><br><span class="line">inner, err := codec.EncodeVxlanInner(a.conf.VNI, a.conf.SrcMAC, a.conf.DstMAC,</span><br><span class="line">    p.innerDstIP, p.innerDstIP, <span class="comment">// inner src == inner dst == local IP</span></span><br><span class="line">    newPort, a.conf.InnerDstPort, <span class="type">uint8</span>(a.conf.TOS), a.conf.TTL, payload)</span><br></pre></td></tr></table></figure><p>EVR 解封 VXLAN 后看到内层 dst &#x3D; 本机，自然就把内层帧转回本机。本机的 raw socket 直接收到回包，<strong>不需要在对端起任何 server，也不需要单独申请回包用的 IP&#x2F;端口</strong>。</p><p><strong>第二招：把「真正的目标标识」嵌进 payload。</strong></p><p>既然内层 src&#x2F;dst 都被占用成本机了，那「这个包是探测哪个 EVR 的」靠什么区分？答案是把目标 EVR 的IP 写进 payload 的第 24~28 字节：</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// codec/packet.go：EVRCHECK 协议头</span></span><br><span class="line"><span class="comment">// 偏移 0   : magic &quot;EVRCHECK&quot; (8B)，校验合法报文</span></span><br><span class="line"><span class="comment">// 偏移 8   : seq    (8B)  业务序列号，原子自增</span></span><br><span class="line"><span class="comment">// 偏移 16  : ts     (8B)  发送时间戳（纳秒）</span></span><br><span class="line"><span class="comment">// 偏移 24  : evrIP  (4B)  EVR 源 IP —— 回包据此映射回 target</span></span><br><span class="line"><span class="comment">// 偏移 28+ : salt        Salt 填充，用于 bitflip 检测</span></span><br></pre></td></tr></table></figure><img src="/2026/06/30/baidu-network-monitor-evr-vxlan-probe/image-20260630060840628.png" class=""><p>回包时解析 payload 里的这 4 字节，一步定位回目标：</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// agent.go：handlePacket 收到回包</span></span><br><span class="line">seq, ts, evrIP := codec.DecodeWithSrcIP(payload)</span><br><span class="line">p := a.peerByEVRSrc[evrIP.String()]   <span class="comment">// 直接 O(1) 定位 target</span></span><br></pre></td></tr></table></figure><p>本质上，evr 把「目标标识」从 IP 头搬到了 payload 里，让 EVR 的 VXLAN 反射动作天然变成一次「单源对多目标」的回包匹配。代价仅仅是 4 字节 payload + 解析时多读 4 字节。</p><p><strong>第三招：外层源 IP 可以 spoof。</strong></p><p>evr 用 <code>ipv4.NewRawConn</code> 包了一层（等价于开启 <code>IP_HDRINCL</code>），让内核不再自己生成外层 IP 头，而是原样发出我们手工拼好的外层 IPv4 头。这样外层 src IP 可以填成 <code>mock_src</code>——一个虚假的IP地址。当然这个功能是可选的。</p><p>这有什么好处呢？<br>为了在Evr上识别出来探测包，我们其实是在Evr中做了一些特殊的配置的，使用和客户不同的VNI,识别出『探测机』的源IP,有不同的路由策略。但这也带来的一个问题： 如果探测机有故障，需要切换探测机的时候，需要在Evr上改配置。<br>为线上的网络设备修改配置流程上很复杂，需要评审改配方案、需要等待变更窗口，需要在凌晨的时候操作等。所以不能及时的更改探测机。但是如果我们使用mockIP,那么就可以分分钟的把探测切到新的探测机上，不需要修改Evr的配置。这也是我们的一个技巧。</p><p>完整的一发一收流程：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">   发送侧                                  回程侧</span><br><span class="line">┌────────────────────────────┐       ┌────────────────────────────┐</span><br><span class="line">│ 外层 IP : mock_src → vtepIP │       │ 内层 dst = 本机             │</span><br><span class="line">│ 外层 UDP: srcPort  → 4789   │ 反射  │   ↓ 本机 raw socket 收到     │</span><br><span class="line">│  ┌ VXLAN(VNI) ───────────┐ │ ────► │ 解析 payload[24:28]         │</span><br><span class="line">│  │ 内层 ETH/IPv4/UDP      │ │      │   得到 EVR 源 IP             │</span><br><span class="line">│  │ src=本机, dst=本机      │ │      │ peerByEVRSrc[ip] → target   │</span><br><span class="line">│  │ payload: ...+EVR srcIP│ │       │   累加 stat（丢包/延迟/翻转）  │</span><br><span class="line">│  └───────────────────────┘ │       └────────────────────────────┘</span><br><span class="line">└────────────────────────────┘</span><br></pre></td></tr></table></figure><p>整个过程<strong>只在百度侧部署一台 evr</strong>，EVR 设备本身充当了反射器——困境破解。</p><h3 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h3><p>evr 由 JSON 配置驱动，每个 target 用 <code>vtep#evrSrc[#mockSrc]</code> 三段式表达：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="string">&quot;evr-probe-1&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;client_addr&quot;</span><span class="punctuation">:</span> <span class="string">&quot;203.0.113.10&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;targets&quot;</span><span class="punctuation">:</span> <span class="string">&quot;198.51.100.96#192.0.2.1#203.0.113.99,198.51.100.97#192.0.2.2#203.0.113.99&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;vni&quot;</span><span class="punctuation">:</span> <span class="number">15990000</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;tos&quot;</span><span class="punctuation">:</span> <span class="number">64</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;ttl&quot;</span><span class="punctuation">:</span> <span class="number">64</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;client_port_range&quot;</span><span class="punctuation">:</span> <span class="string">&quot;63000,63999&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;rate_in_span&quot;</span><span class="punctuation">:</span> <span class="number">2000</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;span&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1s&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;delay&quot;</span><span class="punctuation">:</span> <span class="string">&quot;5s&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;msg_len&quot;</span><span class="punctuation">:</span> <span class="number">1024</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;log_dir&quot;</span><span class="punctuation">:</span> <span class="string">&quot;./log&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;log_max_age_days&quot;</span><span class="punctuation">:</span> <span class="number">3</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>三段式的含义：</p><table><thead><tr><th>段</th><th>必填</th><th>含义</th></tr></thead><tbody><tr><td><code>vtepIP</code></td><td>是</td><td>EVR VTEP 的 IP（外层目的地址）</td></tr><tr><td><code>evrSrcIP</code></td><td>是</td><td>「目标」标识，嵌入 payload 用于回包匹配</td></tr><tr><td><code>mockSrcIP</code></td><td>否</td><td>外层源 IP；为空则用 <code>client_addr</code></td></tr><tr><td>启动：</td><td></td><td></td></tr></tbody></table><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 配置文件启动（推荐，线上用 systemd 以 root 拉起）</span></span><br><span class="line"><span class="built_in">sudo</span> ./evr -c /etc/evr/evr.json</span><br><span class="line"></span><br><span class="line"><span class="comment"># 临时排查，全用命令行参数</span></span><br><span class="line"><span class="built_in">sudo</span> ./evr \</span><br><span class="line">  --client-addr 203.0.113.10 \</span><br><span class="line">  --targets 198.51.100.96#192.0.2.1#203.0.113.99 \</span><br><span class="line">  --rate-in-span 2000 --span 1s --msg-len 1024</span><br><span class="line"></span><br><span class="line"><span class="comment"># CLI 参数会覆盖配置文件里的同名字段（pflag.Visit 模式）</span></span><br><span class="line"><span class="built_in">sudo</span> ./evr -c /etc/evr/evr.json --rate-in-span 5000 --verbose</span><br></pre></td></tr></table></figure><p>evr 需要 <code>sudo</code>（或 <code>CAP_NET_RAW</code>）来创建 raw socket、启用 <code>IP_HDRINCL</code>、设置 IP TOS 并挂载 BPF。它<strong>仅在 Linux 上有意义</strong>，macOS 只能用于编译开发。</p><h2 id="四、evr-中的技巧与高频-FAQ"><a href="#四、evr-中的技巧与高频-FAQ" class="headerlink" title="四、evr 中的技巧与高频 FAQ"></a>四、evr 中的技巧与高频 FAQ</h2><p>evr 看似简单，但藏了几个值得拿出来单独说的工程技巧。</p><h3 id="技巧-1：BPF-内核层过滤，别让无关-UDP-流量打扰"><a href="#技巧-1：BPF-内核层过滤，别让无关-UDP-流量打扰" class="headerlink" title="技巧 1：BPF 内核层过滤，别让无关 UDP 流量打扰"></a>技巧 1：BPF 内核层过滤，别让无关 UDP 流量打扰</h3><p>读 socket 用的是 <code>ip4:udp</code> raw socket，它默认会收到本机<strong>所有</strong> UDP 报文。在万兆网卡、几十万 pps 的探测机上，内核把海量无关包拷到用户态，性能直接崩。</p><p>解法是在内核层用 cBPF 过滤，只放行三个条件同时命中的包：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">(1) IPv4 协议号 = UDP (17)</span><br><span class="line">(2) IPv4 TOS    = cfg.tos</span><br><span class="line">(3) UDP 目的端口 = inner_dst_port (默认 8972)</span><br></pre></td></tr></table></figure><p>只有这三条都满足才投递到用户态，几乎零开销。而<strong>写 socket</strong> 上则反过来装一个「全丢」的 BPF——阻止内核给这个发送 socket 排队任何回包。</p><h3 id="技巧-2：源端口轮转覆盖-ECMP-多路径"><a href="#技巧-2：源端口轮转覆盖-ECMP-多路径" class="headerlink" title="技巧 2：源端口轮转覆盖 ECMP 多路径"></a>技巧 2：源端口轮转覆盖 ECMP 多路径</h3><p>和 bitflip&#x2F;lidar 一样，evr 也面临多路径覆盖问题。两个固定地址之间，五元组固定则 ECMP 哈希结果不变，永远只走一条链路。evr 通过 <code>client_port_range</code> 配置一段源端口，每发一轮就让 <code>srcPort + 1</code>，在统计意义上覆盖 ECMP 哈希全空间。</p><h3 id="技巧-3：4-种-Salt-模式抓-bitflip"><a href="#技巧-3：4-种-Salt-模式抓-bitflip" class="headerlink" title="技巧 3：4 种 Salt 模式抓 bitflip"></a>技巧 3：4 种 Salt 模式抓 bitflip</h3><p>payload 第 28 字节往后是 Salt 填充，按 <code>seq % 4</code> 在四种模式间轮换，专门用来检测链路上的位翻转：</p><ul><li><code>0xFF</code> 全 1 —— 暴露任何「1 变 0」的翻转</li><li><code>0x00</code> 全 0 —— 暴露任何「0 变 1」的翻转</li><li><code>0x5A</code> 交替位 (01011010) —— 适配 NIC 串行链路的奇偶错误</li><li>互补 <code>0xAAAA / 0x5555</code> —— 专治 <strong>1&#39;s complement 校验和漏检的「互补翻转」</strong>，这是普通 UDP&#x2F;TCP checksum 唯一无法察觉的一类 bitflip</li></ul><p>回包时如果 payload 长度等于发送长度，就和对应 Salt 比对，命中差异即记一条 <code>[client bitflip]</code> 日志。这套 Salt 实现与 baize&#x2F;kuiniu 完全共用。</p><h3 id="高频-FAQ"><a href="#高频-FAQ" class="headerlink" title="高频 FAQ"></a>高频 FAQ</h3><p><strong>Q：mock_src 是怎么生效的？内核为什么不会把它改回去？</strong><br>evr 在写端用 <code>ipv4.NewRawConn(conn)</code> 包了一层，等价于开启 <code>IP_HDRINCL</code>。开启后内核不再生成自己的 IP 头，而是原样发出我们手工拼的外层 IPv4 头，其中 src 就是 mock_src。如果不包这一层，内核会前置一份自己的 IP 头，导致双层 IP 封装且 mock_src 失效。</p><p><strong>Q：<code>rate_in_span</code> 是单 target 速率还是总速率？</strong><br>是<strong>所有 target 的总速率</strong>。比如 12 个 target、<code>rate_in_span=2000/s</code>，每个 target 平均只有约 166 pps。要提高单 target 速率，就减少 target 数量或调大 <code>rate_in_span</code>。</p><p><strong>Q：为什么内层 src 和 dst 都填本机 IP？</strong><br>这样 EVR 反射回来的内层帧 dst 就是本机，本机 raw socket 直接收得到，无需在对端起 server、无需单独申请回包 IP。这是 evr 破解「对面进不去」困境的核心招式。src IP也填写本机IP是为了定位的时候traceroute的需要。</p><p><strong>Q：为什么 evr 必须用 sudo？</strong><br>需要创建 <code>ip4:udp</code> raw socket、启用 <code>IP_HDRINCL</code>、设置 IP TOS&#x2F;DSCP 并挂载 BPF。Linux 上需要 <code>CAP_NET_RAW</code>，最简单就是 sudo 或 systemd 以 root 启动。</p><p><strong>Q：和 baize &#x2F; kuiniu 怎么选？</strong><br>普通业务网络长期监控用 <strong>baize</strong>；AI 训练的 GPU NIC 互联（RoCE）用 <strong>kuiniu</strong>；机房 VXLAN&#x2F;EVR 路径与 EVR 设备本身的探测用 <strong>evr</strong>——关键区别是 evr <strong>不需要在对端起 server</strong>，EVR 设备本身就是反射器。</p><hr><p>evr 把一个看似无解的困境——「探测机进不去客户机房，被探测设备又装不了 agent」——通过对 VXLAN VTEP 反射特性的巧妙利用，变成了一个单边即可完成的探测。这背后是同一套技术栈在不同网络场景下的复用：raw socket 构造报文、BPF 内核过滤、源端口轮转覆盖 ECMP、Salt 检测 bitflip、时间桶统计。</p><p>这只是 nettools 的冰山一角。后续还有网关设备监控、定位工具，以及巨量监控数据的处理方案。</p><p>项目地址：<a href="https://github.com/baidu/nettools">https://github.com/baidu/nettools</a></p><p>欢迎 Star、试用、提 Issue 和 PR。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/30/baidu-network-monitor-evr-vxlan-probe/</id>
    <link href="https://colobu.com/2026/06/30/baidu-network-monitor-evr-vxlan-probe/"/>
    <published>2026-06-30T15:15:45.000Z</published>
    <summary>
      <![CDATA[<p>这是百度网络监控工具 nettools 开源系列的第四篇。前三篇分别介绍了 bitflip&#x2F;baize（UDP 丢包与改包检测工具和Agent）、lidar（TCP SYN 端口可达性探测），它们解决的都是「服务器之间」「点到点」的探测问题——前提是：探测机和被探测对象，至少有一端在我们手里。</p>
<p>但有一类设备，我们既无法在它上面装 agent，也没法在它对面的机房里放一台探测机。这就是今天的主角 evr 要解决的困境。</p>
<p>这也是我更深入的了解网络包的构造，把网络探测玩出花了来，对我的网络编程的功力大增的一个很好的场景。</p>
<blockquote>
<p>项目地址：<a href="https://github.com/baidu/nettools">https://github.com/baidu/nettools</a><br>文档：<a href="https://nettools.rpcx.io/">https://nettools.rpcx.io</a></p>
</blockquote>
<h2 id="一、evr-探测的困境：探测机进不去客户机房"><a href="#一、evr-探测的困境：探测机进不去客户机房" class="headerlink" title="一、evr 探测的困境：探测机进不去客户机房"></a>一、evr 探测的困境：探测机进不去客户机房</h2><p>先说一个真实的场景。</p>
<p>百度有大量的云客户，我们提供的 <strong>EVR（Edge Virtual Router，边缘虚拟路由器）</strong> 设备作为客户侧网络接入百度云网络的边界节点。EVR 往上连百度的骨干&#x2F;城域网络，往下连客户自己的虚拟网络（VXLAN overlay）。</p>
<blockquote>
<p>EVR - 边缘虚拟路由器，通常用于在虚拟化环境中实现路由功能。EVR 位于网络的边缘，用于连接内部网络和外部网络（如客户机房）。</p>
</blockquote>
<p>现在问题来了：我们需要监控「百度网络 → EVR」这一段链路的健康度——有没有丢包、延迟多大、有没有改包。按照前几个工具的套路，我们的方案应该是：</p>
<ul>
<li>在 EVR 设备上装个 agent？—— <strong>不行</strong>。EVR 是网络设备&#x2F;客户侧设备，我们没有权限往里塞监控程序。</li>
<li>在 EVR 对面（客户机房内）放一台探测机，做点到点探测？—— <strong>更不行</strong>。那是客户的机房，正常情况我们不可能在客户的物理环境里申请一台探测机常驻。</li>
</ul>
<p>lidar 那一套「发 SYN，靠对端内核 TCP 协议栈自动回 SYN-ACK&#x2F;RST」的思路，在这里也不灵——EVR 不是一台服务器，它不会帮你跑 TCP 协议栈三次握手，或者说不允许我们高频的探测。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">   百度侧                          边缘设备</span><br><span class="line">┌──────────┐                  ┌──────────────────────┐</span><br><span class="line">│  探测机   │ ───── ??? ─────► │   EVR 设备            │</span><br><span class="line">│ (我们的)  │                  │   (装不了 agent)      │</span><br><span class="line">└──────────┘                  │   对面也放不了探测机    │</span><br><span class="line">                              └──────────────────────┘</span><br></pre></td></tr></table></figure>

<img src="/2026/06/30/baidu-network-monitor-evr-vxlan-probe/image-20260630042946520.png" class="">
<p>困境的本质是：<strong>被探测对象不可控，且它对面也无法部署探测机。</strong> 我们需要一个 <strong>「单边」</strong> 就能完成的探测方案——只在百度侧放一台机器，让 EVR 设备自己「帮我们把包送回来」。</p>
<p>答案藏在 EVR 设备的工作原理里：它是一个 <strong>VXLAN VTEP（VXLAN Tunnel End Point）</strong>。而 VTEP 有一个非常好用的特性——它会忠实地按照内层 IP 头转发解封后的内层帧。这就给了我们「构造一个会被反射回来的 VXLAN 包」的可能。</p>
<p>要理解这个技巧，得先看懂 VXLAN 的包结构。</p>]]>
    </summary>
    <title>百度网络监控工具开源第四弹：evr — 构造 VXLAN 探测</title>
    <updated>2026-06-30T15:17:57.674Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <content>
      <![CDATA[<p>我把 775 篇收藏的文章塞进一个 4MB 的向量库，然后问它：&quot;我都收藏过哪些关于 loop engineering 的资料？&quot;三秒钟，它把散在六七篇文章里的观点拼成一段答案，每条都带出处。</p><img src="/2026/06/29/chao-rag-wiki-personal-knowledge-base/image-20260629054807094.png" class=""><p>这不是什么 SaaS 产品，是我自己写的一个 skill，叫 <code>chao-rag-wiki</code>。今天聊聊它，顺便聊聊它背后那个问题：知识库越攒越大，你到底怎么&quot;读&quot;它?</p><p>得先从 Karpathy 的一个想法说起。</p><hr><span id="more"></span><h2 id="一、Karpathy-的-LLM-Wiki-：让-AI-替你维护知识库"><a href="#一、Karpathy-的-LLM-Wiki-：让-AI-替你维护知识库" class="headerlink" title="一、Karpathy 的&quot;LLM Wiki&quot;：让 AI 替你维护知识库"></a>一、Karpathy 的&quot;LLM Wiki&quot;：让 AI 替你维护知识库</h2><p>起点是 Andrej Karpathy 抛出的一句话：</p><blockquote><p>&quot;The LLM writes and maintains the wiki; the human reads and asks questions.&quot;<br>（LLM 负责写和维护 wiki，人类负责读和提问。）</p></blockquote><p>有人把这句话做成了一个 skill —— <code>karpathy-llm-wiki</code>。玩法是这样：</p><p>你有两个目录。<code>raw/</code> 放原始素材，只读、永不修改——收藏的推文、文章、论文都丢这里。<code>wiki/</code> 放编译后的知识文章，AI 全权打理。</p><p>每往 <code>raw/</code> 加一篇新素材，AI 就把它&quot;编译&quot;进 wiki：判断这篇属于哪个已有主题，跟某篇是同一个核心论点就合并进去、更新段落，全新概念就新建一篇，顺便检查跟已有内容有没有冲突、有就标出来。最后维护一个 <code>wiki/index.md</code> 全局索引，每篇一行——链接、摘要、更新日期。</p><p>你查询的时候（&quot;我知道哪些关于 X 的东西？&quot;），AI 先读 index.md 定位到相关文章，打开那几篇，再综合作答。</p><p>这个设计很优雅，本质是用 AI 把碎片素材沉淀成结构化的知识资产，而且会随时间复利增长。读起来像一本你自己的、不断长大的百科全书。</p><p>但它有个隐含前提：素材得先被&quot;编译&quot;进 wiki，才搜得到。下面这个 skill，想绕开的就是这件事。</p><hr><h2 id="二、chao-rag-wiki：不编译，直接检索"><a href="#二、chao-rag-wiki：不编译，直接检索" class="headerlink" title="二、chao-rag-wiki：不编译，直接检索"></a>二、chao-rag-wiki：不编译，直接检索</h2><p>我借了 <code>karpathy-llm-wiki</code> 的&quot;raw&#x2F; 只读&quot;哲学，但把后半段换成了 RAG（检索增强生成）。</p><p>一句话说清区别：<strong>karpathy-llm-wiki 是先把书写好再去翻书；chao-rag-wiki 是书原样不动，但给每一页都建了语义索引，随问随搜。</strong></p><img src="/2026/06/29/chao-rag-wiki-personal-knowledge-base/image-20260629054948985.png" class=""><p>技术栈是这么几块拼的：</p><p><strong>1. 向量检索用 <a href="https://github.com/RyanCodrai/turbovec">turbovec</a>。</strong> Google Research 的 TurboQuant 算法的 Rust 实现，能把向量压 16 倍还几乎不掉精度——上一篇我专门拆过。我的 775 篇切成 9089 个 chunk（去重后），整个索引才 4.8MB，常驻内存毫无压力。</p><p><strong>2. 嵌入默认使用千帆的 bge-large-zh（1024 维），但接口跟 provider 无关。</strong> 想换 OpenAI、Voyage 或本地模型都行，只改环境变量，不动代码。key 全走环境变量，绝不硬编码。</p><p><strong>3. 混合检索（Hybrid RAG），这是关键。</strong> 同时跑两路：稠密向量检索管语义，知道&quot;自我迭代&quot;和&quot;循环&quot;是一回事；BM25 关键词检索管字面，能精确命中 <code>rotate_writer.go</code> 这种代码标识符、人名、专有词。两路结果用 RRF（Reciprocal Rank Fusion，倒数排名融合）合并。语义检索擅长&quot;意思对但用词不同&quot;，关键词检索擅长&quot;就要这个词&quot;，融合之后两头都不漏。</p><img src="/2026/06/29/chao-rag-wiki-personal-knowledge-base/image-20260629055149668.png" class=""><p><strong>4. 可选的 LLM 重排（rerank）。</strong> 检索快但粗，再拉一个 LLM 当&quot;相关性裁判&quot;给候选打分重排，精度优先时加 <code>--rerank</code> 就行。</p><img src="/2026/06/29/chao-rag-wiki-personal-knowledge-base/image-20260629055320393.png" class=""><p><strong>5. 建索引时按 chunk 文本哈希去重。</strong> <code>raw/</code> 里同一段内容存了多份副本的话，只留一份进库，免得副本在结果里挤名额——我这 775 篇就压掉了 706 个重复 chunk。</p><img src="/2026/06/29/chao-rag-wiki-personal-knowledge-base/image-20260629055449657.png" class=""><h3 id="优缺点摆出来"><a href="#优缺点摆出来" class="headerlink" title="优缺点摆出来"></a>优缺点摆出来</h3><p>先说好的：</p><ul><li><p>零编译延迟。新素材丢进 <code>raw/</code>，跑一句增量索引就搜得到，不用 AI 逐篇消化。而且增量索引按内容哈希只处理新增和改动的文件，没变化就几秒退出。</p></li><li><p>召回更全。它检索的是原始全文的每个片段。哪怕某个话题你压根没想过给它单独建篇文章，只要素材里提过，就搜得到。</p></li><li><p>混合检索加重排加去重，对中英混排、专有名词、长尾问题都更稳。同一段内容在 <code>raw/</code> 里有多份副本，建索引时按 chunk 文本哈希自动合并，结果不会被副本占名额——但保留&quot;另见 N 份副本&quot;的来源信息，去重不丢信息。</p></li></ul><p>再说差的，这些恰好是 <code>karpathy-llm-wiki</code> 的强项：</p><ul><li><p>它没有知识沉淀，给你的是原文片段拼盘，不是一篇消化过、把内部矛盾理顺了的文章。<code>karpathy-llm-wiki</code> 那边的 wiki 文章是真正的二次创作，读起来成体系。</p></li><li><p>它只能精确去重。逐字相同的副本能干净合并，但&quot;同一篇、有细微编辑差异&quot;的近似重复就认不出来了——那得上 MinHash 或 SimHash，复杂得多。</p></li><li><p>它依赖在线 embedding，查询要联网(或者本地部署的大模型)、有 API 成本（BM25 那一路不用）。</p></li></ul><p>说白了，<code>karpathy-llm-wiki</code> 重&quot;沉淀&quot;，<code>chao-rag-wiki</code> 重&quot;召回&quot;。前者像精心整理的笔记本，后者像一个全文搜索引擎。</p><hr><h2 id="三、实战对比：两个查询"><a href="#三、实战对比：两个查询" class="headerlink" title="三、实战对比：两个查询"></a>三、实战对比：两个查询</h2><p>光说不练假把式。同样两个问题，两个 skill 各跑一遍。</p><p>自从 Karpathy的llm-wiki理念提出来之后，我收集资料的时候特意使用Obsidian web clipper进行收集，最近几个月也收集了700多篇资料，也在Hermes中建立了llm-wiki，这次我使用<code>chao-rag-wiki</code> 建立了RAG索引，让我们比较一下这两个skill搜索资料的效果。</p><h3 id="查询一：-loop-engineering"><a href="#查询一：-loop-engineering" class="headerlink" title="查询一：&quot;loop engineering&quot;"></a>查询一：&quot;loop engineering&quot;</h3><p><code>chao-rag-wiki</code>（hybrid + rerank）召回了散在多篇原文里的片段：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">[1] rerank=8.0  PART 2: WHAT LOOP ENGINEERING ACTUALLY IS</span><br><span class="line">    articles/...Loops What Every AI Engineer Needs to Know in 2026.md</span><br><span class="line">[2] rerank=7.0  工程化的三个层次</span><br><span class="line">    articles/...深度拆解：AI 智能体 Harness 的构造.md</span><br><span class="line">[3] rerank=7.0  Most Developers Do Not Need Agent Loops Yet</span><br><span class="line">[4] rerank=7.0  Agent Harness 拆解：AI Agent 真正的工程底座</span><br><span class="line">[5] rerank=6.0  &gt; I don&#x27;t talk to an agent anymore, I talk to a loop</span><br></pre></td></tr></table></figure><p>它直接定位到讲 loop engineering 五阶段（DISCOVER→PLAN→EXECUTE→VERIFY→ITERATE）的原文段落，连&quot;大多数开发者其实还不需要 loop&quot;这种唱反调的视角也捞了出来——因为那篇文章确实在我素材里。</p><img src="/2026/06/29/chao-rag-wiki-personal-knowledge-base/image-20260629060619850.png" class=""><p><code>karpathy-llm-wiki</code> 呢？它在 <code>wiki/index.md</code> 里一搜就命中一篇编译好的文章：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">| Loop Engineering: 从提示 Agent 到设计循环 | 2026 年 6 月爆发的 AI 编程</span><br><span class="line">  新范式：五个原语(Automations/Worktrees/Skills/Connectors/Sub-agents)</span><br><span class="line">  +状态记忆，四条件测试，最小可行 Loop，刹车配置与四种死法 | 2026-06-24 |</span><br></pre></td></tr></table></figure><p>打开是一份消化整合过的结构化笔记：核心定义、Boris Cherny 的三阶段演化、五个必需品表格、引用了 8 个来源，读起来一气呵成。</p><p>这一局 <code>karpathy-llm-wiki</code> 赢在成品质量。loop engineering 是热门话题，我早让它编译过一篇。<code>chao-rag-wiki</code> 给的是原料，它给的是成菜。</p><h3 id="查询二：-grill-skill"><a href="#查询二：-grill-skill" class="headerlink" title="查询二：&quot;grill skill&quot;"></a>查询二：&quot;grill skill&quot;</h3><p>这局反过来了。</p><p><code>chao-rag-wiki</code>（hybrid + rerank）：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[1] rerank/score  Mattpocock Skills 系统：AI Agent 的能力单元 › SKILL.md 的文件结构</span><br><span class="line">    sources/AI时代的程序员/02 Mattpocock Skills系统.md</span><br><span class="line">[2] Productivity Skills</span><br><span class="line">    sources/AI时代的程序员/《AI时代的软件工程》-图书大纲.md</span><br><span class="line">[3] skill_manage 操作分发   (+1 dup copies)</span><br><span class="line">    articles/2026-04-12 -Hermes Agent 源码解析.md</span><br><span class="line">[5] Productivity —— grill-me / caveman / handoff...</span><br><span class="line">    articles/...mattpocock skills Skills for Real Engineers.md › #1: The Agent Didn&#x27;t Do What I Want</span><br></pre></td></tr></table></figure><p>干净命中 mattpocock 技能库里 <code>grill-me</code>、<code>grill-with-docs</code> 的介绍——&quot;写代码前先让 AI 反过来拷问你&quot;。注意第 3 条后面那个 <code>(+1 dup copies)</code>：去重把那篇的副本合并成一条、留了来源标记，没让重复内容占掉好几个名额。</p><p><code>karpathy-llm-wiki</code> 呢？我去 <code>wiki/index.md</code> 里搜 &quot;grill&quot;、&quot;mattpocock&quot;、&quot;拷问&quot;……</p><p>一条都没有。</p><p>不是说我素材里没有 grill 相关内容——有，好几篇正文都提了 <code>/grill-me</code>。问题是这个话题从没被单独编译成一篇 wiki 文章，index.md 里就没它的入口。按 karpathy-wiki &quot;先读 index 再定位文章&quot;的路子，它要么直接漏掉这个查询，要么只能模糊地甩你一篇泛泛的&quot;agent skills 框架&quot;。</p><p>这一局 <code>chao-rag-wiki</code> 完胜。它检索全文，根本不在乎你立没立过条目。</p><hr><h2 id="四、所以到底用哪个？"><a href="#四、所以到底用哪个？" class="headerlink" title="四、所以到底用哪个？"></a>四、所以到底用哪个？</h2><p>两个查询跑下来，结论挺清楚：它俩不是替代关系，是互补关系。</p><table><thead><tr><th></th><th>karpathy-llm-wiki</th><th>chao-rag-wiki</th></tr></thead><tbody><tr><td>核心机制</td><td>AI 编译素材成文章</td><td>RAG 全文语义检索</td></tr><tr><td>查询方式</td><td>读 index → 定位文章</td><td>向量+BM25 混合检索+重排</td></tr><tr><td>强项</td><td>热门话题、成体系的沉淀</td><td>全量召回、长尾话题、专有名词</td></tr><tr><td>弱项</td><td>没编译过的话题会漏</td><td>给原料而非成品、只能精确去重</td></tr><tr><td>延迟</td><td>编译慢、查询快</td><td>索引快、查询需联网</td></tr><tr><td>想读一篇消化好的总结，问 <code>karpathy-llm-wiki</code>；想确认&quot;我到底收藏过啥&quot;、找长尾、找冷门词，用 <code>chao-rag-wiki</code>。</td><td></td><td></td></tr></tbody></table><p>我现在就是这么用的：<code>chao-rag-wiki</code> 当全文搜索引擎兜底召回，<code>karpathy-llm-wiki</code> 当精编笔记本沉淀热点。一个保证不漏，一个保证好读。</p><hr><h2 id="五、把它接进-Obsidian：从-看到-到-可搜"><a href="#五、把它接进-Obsidian：从-看到-到-可搜" class="headerlink" title="五、把它接进 Obsidian：从&quot;看到&quot;到&quot;可搜&quot;"></a>五、把它接进 Obsidian：从&quot;看到&quot;到&quot;可搜&quot;</h2><p>前面讲的都是 skill 本身。可知识库要真转起来，得先解决一个更前面的问题：素材怎么进来？总不能每篇手动复制粘贴。</p><p>我这套链路全自动，分三段。</p><h3 id="第一段：Web-Clipper-抓取，落到-raw"><a href="#第一段：Web-Clipper-抓取，落到-raw" class="headerlink" title="第一段：Web Clipper 抓取，落到 raw/"></a>第一段：Web Clipper 抓取，落到 <code>raw/</code></h3><p><a href="https://obsidian.md/clipper">Obsidian Web Clipper</a> 是官方的浏览器插件，Chrome、Edge、Firefox 都有。看到一篇好文章、一条推文，点一下插件图标，它就把正文提取成干净的 Markdown，存进你的 Obsidian vault。</p><p>它能配模板和保存路径，这是关键。我把模板的目标文件夹设成 vault 里的 <code>raw/articles/</code>，文件名用 <code>&#123;&#123;date&#125;&#125; -&#123;&#123;author&#125;&#125;-&#123;&#123;title&#125;&#125;</code>，再让它自动带上来源 URL、抓取日期这些 frontmatter。于是浏览中随手一点，文章就躺进了 <code>raw/</code>——正好是两个 skill 都约定&quot;只读、不改&quot;的那个源目录。我那 775 篇，基本就是这么攒的。</p><h3 id="第二段：定时任务自动索引"><a href="#第二段：定时任务自动索引" class="headerlink" title="第二段：定时任务自动索引"></a>第二段：定时任务自动索引</h3><p>素材进来了，但还没&quot;可搜&quot;。这步交给定时任务——<code>raw/</code> 每天在长，那就让索引每天自己追上：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># crontab：每天凌晨 3:07 增量索引（错峰，别卡整点）</span></span><br><span class="line">7 3 * * *  <span class="built_in">cd</span> ~/Obsidian-Vault &amp;&amp; \</span><br><span class="line">  ~/.claude/skills/chao-rag-wiki/.venv/bin/python \</span><br><span class="line">  ~/.claude/skills/chao-rag-wiki/scripts/build_rag.py --raw raw --out .rag --update</span><br></pre></td></tr></table></figure><p>前面说了，<code>--update</code> 按内容哈希只处理新增和改动的文件，没变化就几秒退出、零 API 调用，所以天天跑也不浪费。Web Clipper 当天剪的新文章，第二天一早就进了向量库。</p><p>karpathy-llm-wiki 那一路同理，挂个任务把当天 <code>raw/</code> 的新文件编译进 wiki 沉淀下来就行。两条管道并行：chao-rag 让每篇立刻可搜，karpathy-wiki 把值得沉淀的编成文章。</p><p>实际上是在我的Mac mini m2上的Hermes中配置了定时任务，每天凌晨调用这个skill进行索引处理。</p><img src="/2026/06/29/chao-rag-wiki-personal-knowledge-base/image-20260629055738407.png" class=""><h3 id="第三段：随时调用-skill-搜索"><a href="#第三段：随时调用-skill-搜索" class="headerlink" title="第三段：随时调用 skill 搜索"></a>第三段：随时调用 skill 搜索</h3><p>闭环这就成了。想找东西，直接在 Claude Code 里调：</p><ul><li><code>/chao-rag-wiki 找出关于 X 的资料</code>——全文混合检索，长尾、冷门词都捞得到；</li><li><code>/karpathy-llm-wiki 我都知道哪些关于 X 的东西</code>——读编译好的精编文章。</li></ul><p>整条链路连起来就是：浏览时点一下 Web Clipper，文章落进 <code>raw/</code>，定时任务自动索引，想搜时一句话调 skill。你只管&quot;看到好东西点一下&quot;和&quot;有问题问一句&quot;，中间的剪藏、入库、索引全自动。Karpathy 那句&quot;人类负责读和提问&quot;，落地大概就是这个样子。</p><hr><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p><code>chao-rag-wiki</code> 已经开源，一行命令装上：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add smallnest/chao-rag-wiki</span><br></pre></td></tr></table></figure><p>配好一个 embedding 的 key（默认千帆，也支持 OpenAI、Voyage 或任意 OpenAI 兼容网关），素材丢进 <code>raw/</code>，跑一句 build 就能开问。再按第五节配好 Web Clipper 模板和定时任务，整个知识库就自己转起来了。</p><blockquote><p>最后留个彩蛋：写这篇时，&quot;两个 skill 各跑两个查询、对比结果&quot;那一步，就是 chao-rag-wiki 自己检索出来的。它检索自己被讨论的素材，多少有点自产自销。RAG 的尽头，没准就是让知识库学会自我介绍。</p></blockquote>]]>
    </content>
    <id>https://colobu.com/2026/06/29/chao-rag-wiki-personal-knowledge-base/</id>
    <link href="https://colobu.com/2026/06/29/chao-rag-wiki-personal-knowledge-base/"/>
    <published>2026-06-29T14:25:37.000Z</published>
    <summary>
      <![CDATA[<p>我把 775 篇收藏的文章塞进一个 4MB 的向量库，然后问它：&quot;我都收藏过哪些关于 loop engineering 的资料？&quot;三秒钟，它把散在六七篇文章里的观点拼成一段答案，每条都带出处。</p>
<img src="/2026/06/29/chao-rag-wiki-personal-knowledge-base/image-20260629054807094.png" class="">
<p>这不是什么 SaaS 产品，是我自己写的一个 skill，叫 <code>chao-rag-wiki</code>。今天聊聊它，顺便聊聊它背后那个问题：知识库越攒越大，你到底怎么&quot;读&quot;它?</p>
<p>得先从 Karpathy 的一个想法说起。</p>
<hr>]]>
    </summary>
    <title>我把775篇收藏塞进4MB向量库：一个比Karpathy Wiki更能&quot;翻箱底&quot;的RAG skill</title>
    <updated>2026-06-29T14:29:12.537Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="Go" scheme="https://colobu.com/tags/Go/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="性能优化" scheme="https://colobu.com/tags/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/"/>
    <category term="并发编程" scheme="https://colobu.com/tags/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/"/>
    <content>
      <![CDATA[<blockquote><p>&quot;Clear is better than clever.&quot;<br>清晰胜于聪明。<br>—— Rob Pike, Go Proverbs</p></blockquote><p>第 23 章把重构讲完了。嗅坏味道、套 Fowler 手法、小步施工、每步测试，这套东西对 Java、Python、Go 一视同仁。但真到 Go 上手你会发现，Fowler 的目录够不着 Go 的好几层脾气。一段能跑的 Go 代码，可能还停在 Go 1.10 的写法，不地道；可能并发原语用错了，race detector 一开就红，不安全；也可能分配没控住，cache line 在 false sharing，不快。这些坏味道扫不出来，是 Go 二十年攒下来、只有老手才摸得到的门道。</p><p>门道都散在各处。Dave Cheney 的高性能工作坊讲一套，dgryski 的 go-perfbook 讲一套，《Go 并发编程实战》讲一套，Go 团队的 modernize 分析又讲一套，再加上无数生产事故换来的风格约定。以前你得一本书一本书读、一个 pprof 一个 pprof 啃。现在有人把这些蒸成一个 Skill，Agent 调一下就能用。</p><p>本章介绍五个 Go 专属的 Skill，正好覆盖 Go 工程的四个面：现代化（<code>/modern-go</code>）、性能（<code>chao-go-perf</code>）、并发（<code>chao-go-sync</code>）、风格（<code>go-style-guide</code>），外加一个把这几样打包、还顺带做了效果评估的全家桶（<code>cc-skills-golang</code>）。前三个是本书作者 smallnest 写的，对，写这本书的人和写这些 Skill 的人是同一个；后两个分别来自 madflojo（Benjamin Cane）和 samber。</p><span id="more"></span><h2 id="24-1-为什么-Go-需要专属技能"><a href="#24-1-为什么-Go-需要专属技能" class="headerlink" title="24.1 为什么 Go 需要专属技能"></a>24.1 为什么 Go 需要专属技能</h2><p>第 1 章立过本书的旗：从 Prompt-Driven 到 Skill-Driven。Prompt 临时，Skill 持久；Skill 等于可复用的方法论加结构化的知识加标准化的输入输出。这话对什么语言都成立，但 Go 尤其该说一遍，因为它有三样东西让通用 Agent 特别容易翻车。</p><p>一是 Go 的地道写法绑版本。同一件事，Go 1.10 和 Go 1.22 的标准答案不一样。循环找切片里有没有某个元素，1.10 要手写 for 循环，1.21 一行 <code>slices.Contains</code> 搞定；求最小值，1.20 要 if-else，1.21 有内置 <code>min</code>。Agent 训练数据里两种写法都有，随手给你写哪种全看运气。代码是能跑，可能是个十年前的化石。</p><p>二是 Go 的并发坑深，而且静默。一个 <code>map</code> 并发读写不会马上崩，要等压力上来、等到生产环境的某个深夜才 panic。一个 <code>sync.Mutex</code> 被复制了，<code>go vet</code> 查得出，Agent 不会主动跑。goroutine 泄漏更无声无息，程序能跑，内存曲线却悄悄爬坡。这些坑 Fowler 的坏味道目录里一个都没有。</p><p>三是 Go 的性能是测出来的，不是猜出来的。Dave Cheney 那句「You can&#39;t optimize what you don&#39;t measure」是 Go 性能圈的宪法。可 Agent 的默认行为恰恰是猜，看一眼代码凭直觉说「这里用 sync.Pool 优化一下」，既没 benchmark 也没 pprof。猜对的概率比你想的低。</p><p>三样合起来指向一个结论：Go 的资深经验得编码进 Skill，才能被 Agent 可靠复用。这不算锦上添花，是这门语言逼出来的刚需。下面五个 Skill，就是这件事的五个侧面。</p><p><img src="/images/image-20260627085111146.png"></p><h2 id="24-2-五个-Skill-一览"><a href="#24-2-五个-Skill-一览" class="headerlink" title="24.2 五个 Skill 一览"></a>24.2 五个 Skill 一览</h2><p>先给一张全景图，免得后面绕晕。</p><table><thead><tr><th>Skill</th><th>作者</th><th>定位</th><th>覆盖面</th><th>Stars（2026&#x2F;06）</th></tr></thead><tbody><tr><td><code>/modern-go</code></td><td>smallnest</td><td>Go 代码现代化</td><td>35 条 gofix 风格规则，Go 1.0→1.26+</td><td>goal-workflow 套件内</td></tr><tr><td><code>chao-go-perf</code></td><td>smallnest</td><td>Go 性能分析专家</td><td>CPU&#x2F;内存&#x2F;GC&#x2F;编译器&#x2F;缓存&#x2F;并发，含 PGO</td><td>~40</td></tr><tr><td><code>chao-go-sync</code></td><td>smallnest</td><td>Go 并发编程专家</td><td>全部 sync 原语 + 13+ 模式 + 分布式</td><td>~37</td></tr><tr><td><code>go-style-guide</code></td><td>madflojo (Benjamin Cane)</td><td>固执己见的 Go 工程契约</td><td>包设计&#x2F;接口&#x2F;错误&#x2F;日志&#x2F;布局&#x2F;测试</td><td>~35</td></tr><tr><td><code>cc-skills-golang</code></td><td>samber</td><td>生产级 Go Skills 全家桶</td><td>28+ 原子 Skill，跨工具，带评估</td><td>~2300</td></tr></tbody></table><p>五个 Skill 的分工可以这样理解：<code>/modern-go</code> 管「代码是不是用了新版本的写法」，<code>go-style-guide</code> 管「代码符不符合工程契约」，<code>chao-go-sync</code> 管「并发安不安全」，<code>chao-go-perf</code> 管「跑得快不快」，<code>cc-skills-golang</code> 把这四件事各做一份，外加交叉引用和效果评估。前四个是专精一件的单点 Skill，最后一个是面面俱到的体系。</p><p>顺带说一句 <code>cc-skills-golang</code> 的体量，两千多 stars，是本章里唯一算得上「大项目」的。它的特别之处不在多，在于拿数据证明了 Skill 真的有用。这个留到 24.7 节细讲。</p><p><img src="/images/image-20260627085255642.png"></p><p>下面逐一展开。</p><h2 id="24-3-modern-go：让老代码跟上新版本"><a href="#24-3-modern-go：让老代码跟上新版本" class="headerlink" title="24.3 &#x2F;modern-go：让老代码跟上新版本"></a>24.3 &#x2F;modern-go：让老代码跟上新版本</h2><p><code>/modern-go</code> 在第 8 章作为 Goal Workflow 的 Bonus Skill 露过一面，第 23 章也提过它和 <code>/refactor</code>、<code>/smell</code> 一样是「保持代码库健康」的邻居。这里展开讲它的机制。（介绍页：<a href="https://goal.rpcx.io/index_cn.html#step-modern-go">https://goal.rpcx.io/index_cn.html#step-modern-go</a> ）</p><p>我自己写它，是因为 goscapy 这种库要长期维护，go.mod 里的版本会一点点往前挪，可代码还停在五年前写它时的写法。靠人记得每条 <code>time.Since</code> 替换、记得 <code>interface{}</code> 该换成 <code>any</code>，不现实。<code>go fix</code> 官方工具又只覆盖一小部分。于是把 Go 团队 modernize 分析能找到的转换规则、加上社区常用的，凑成一份带版本门控的 Skill，让 Agent 替我盯着。它的定位很纯粹，像 <code>go fix</code> 一样，把老写法自动改成新版本的地道写法。装一行：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add smallnest/goal-workflow --skill modern-go</span><br></pre></td></tr></table></figure><p>触发可以直接打 <code>/modern-go</code>，或说「现代化」「modernize」「gofix」。</p><p><img src="/images/image-20260627085439804.png"></p><h3 id="24-3-1-35-条版本门控的转换规则"><a href="#24-3-1-35-条版本门控的转换规则" class="headerlink" title="24.3.1 35 条版本门控的转换规则"></a>24.3.1 35 条版本门控的转换规则</h3><p>Skill 内置 35 条转换规则，每条带一个版本门控，只在项目的 Go 版本够格时才启用。规则从 Go 1.0 一路排到 1.26+，挑几个有代表性的：</p><table><thead><tr><th>Go 版本</th><th>老写法</th><th>新写法</th></tr></thead><tbody><tr><td>1.0+</td><td><code>time.Now().Sub(start)</code></td><td><code>time.Since(start)</code></td></tr><tr><td>1.13+</td><td><code>err == io.EOF</code></td><td><code>errors.Is(err, io.EOF)</code></td></tr><tr><td>1.18+</td><td><code>interface{}</code></td><td><code>any</code></td></tr><tr><td>1.18+</td><td><code>strings.Index</code> + 手动切片</td><td><code>strings.Cut</code></td></tr><tr><td>1.19+</td><td><code>atomic.StoreInt32(&amp;v, 1)</code></td><td><code>var v atomic.Int32; v.Store(1)</code></td></tr><tr><td>1.20+</td><td><code>fmt.Errorf(&quot;...: %w: %w&quot;, e1, e2)</code></td><td><code>errors.Join(...)</code></td></tr><tr><td>1.21+</td><td>手写 for 循环找元素</td><td><code>slices.Contains</code></td></tr><tr><td>1.21+</td><td><code>if a&lt;b {v=a} else {v=b}</code></td><td><code>v = min(a, b)</code></td></tr><tr><td>1.21+</td><td><code>var once sync.Once; once.Do(...)</code></td><td><code>sync.OnceFunc(...)</code></td></tr><tr><td>1.22+</td><td><code>for i := 0; i &lt; n; i++</code></td><td><code>for i := range n</code></td></tr></tbody></table><p>每条规则都配 before&#x2F;after 代码对照，机械、可执行。这正是 Go 团队 modernize 分析能被 Agent 接住的地方。</p><h3 id="24-3-2-安全保护：读-go-mod，绝不越级"><a href="#24-3-2-安全保护：读-go-mod，绝不越级" class="headerlink" title="24.3.2 安全保护：读 go.mod，绝不越级"></a>24.3.2 安全保护：读 go.mod，绝不越级</h3><p>真正关键的不是这 35 条规则，是它怎么决定该用哪条。流程很死板：</p><ol><li>先读 <code>go.mod</code> 里的 <code>go</code> 指令，拿到项目声明的 Go 版本；</li><li>扫描目标范围内所有 <code>.go</code> 文件（排除 <code>vendor/</code>、<code>.git/</code>、<code>testdata/</code>）；</li><li>对每个文件，只应用版本 ≤ 项目版本的规则，从老到新依次套；</li><li>最后打印一份改了什么、跳过了什么的汇总。</li></ol><p>铁律只有一条，但很硬：绝不应用需要比项目声明版本更高的规则。项目还停在 Go 1.20，就不会给你塞 1.21 的 <code>min</code> 和 <code>slices</code>，塞了编译不过。这条把「现代化」和「改坏」之间的边界钉死了。</p><p>这条保护和第 23 章 <code>/refactor</code> 的五阶段协议是同一种思路：把人最容易手滑的地方改成 Agent 必须遵守的护栏，这里是「图新」而越级升级。人升级 Go 时常犯的错，比如把目标版本改高了却忘了改 <code>go.mod</code>，或者用了新 API 却没加 import，<code>/modern-go</code> 用版本门控和 requires importing 的提示一条条堵上。</p><h3 id="24-3-3-实演：一段老代码怎么被现代化"><a href="#24-3-3-实演：一段老代码怎么被现代化" class="headerlink" title="24.3.3 实演：一段老代码怎么被现代化"></a>24.3.3 实演：一段老代码怎么被现代化</h3><p>光看规则表没感觉，跑一段。假设 <code>go.mod</code> 写的是 <code>go 1.21</code>，项目里有这么个函数，写法停在 Go 1.13：</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">parseHeader</span><span class="params">(buf []<span class="type">byte</span>)</span></span> (key, val <span class="type">string</span>, ok <span class="type">bool</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> i := bytes.Index(buf, []<span class="type">byte</span>(<span class="string">&quot;=&quot;</span>)); i &gt;= <span class="number">0</span> &#123;</span><br><span class="line">        key = <span class="type">string</span>(buf[:i])</span><br><span class="line">        val = <span class="type">string</span>(buf[i+<span class="number">1</span>:])</span><br><span class="line">        ok = <span class="literal">true</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> cache atomic.Value</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">getConfig</span><span class="params">()</span></span> *Config &#123;</span><br><span class="line">    cache.Store(&amp;Config&#123;&#125;)</span><br><span class="line">    <span class="keyword">return</span> cache.Load().(*Config)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>/modern-go</code> 进来先读 <code>go.mod</code>，拿到 1.21 这个版本上限，然后从老到新逐条套能用的规则。对上面这段，它会动三处：</p><ul><li><code>bytes.Index</code> 加手动切片 → 1.20+ 的 <code>bytes.Cut</code>（1.21 够格）；</li><li><code>atomic.Value</code> 加类型断言 → 1.19+ 的 <code>atomic.Pointer[T]</code>；</li><li>顺手把 import 补上。</li></ul><p>出来是这样：</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">parseHeader</span><span class="params">(buf []<span class="type">byte</span>)</span></span> (key, val <span class="type">string</span>, ok <span class="type">bool</span>) &#123;</span><br><span class="line">    before, after, found := bytes.Cut(buf, []<span class="type">byte</span>(<span class="string">&quot;=&quot;</span>))</span><br><span class="line">    <span class="keyword">if</span> found &#123;</span><br><span class="line">        key, val, ok = <span class="type">string</span>(before), <span class="type">string</span>(after), <span class="literal">true</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> cache atomic.Pointer[Config]</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">getConfig</span><span class="params">()</span></span> *Config &#123;</span><br><span class="line">    cache.Store(&amp;Config&#123;&#125;)</span><br><span class="line">    <span class="keyword">return</span> cache.Load()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>注意它没碰 1.22 的 range-over-int，项目是 1.21，那条规则被门控挡掉了。这是版本门控真正干活的样子：该改的改，不该碰的一行不动。要是谁手贱把 go.mod 提到 1.22，再跑一遍，那个 for 循环才会被改成 <code>for i := range n</code>。</p><h2 id="24-4-chao-go-perf：把-Dave-Cheney-的工作坊装进-Skill"><a href="#24-4-chao-go-perf：把-Dave-Cheney-的工作坊装进-Skill" class="headerlink" title="24.4 chao-go-perf：把 Dave Cheney 的工作坊装进 Skill"></a>24.4 chao-go-perf：把 Dave Cheney 的工作坊装进 Skill</h2><p><code>/modern-go</code> 解决「写法老不老」，<code>chao-go-perf</code> 解决「跑得快不快」。我写它，是因为 rpcx、goscapy 这种库对性能敏感，可每次让 Agent 帮忙优化，它张口就是「这里加个 sync.Pool」，没 benchmark、没 pprof，纯靠猜。猜错是常态。Go 性能圈其实有现成的规矩，Dave Cheney 和 dgryski 讲过很多遍，第一条都是「先测量」。这些规矩散在讲义和书里，Agent 不会自动遵守，那就把它们蒸成一个 Skill，逼它先拿数据再说话。它把 Go 性能圈几本「圣经」装进来：</p><ul><li>Dave Cheney 的 High Performance Go Workshop（GopherCon 2019）</li><li>dgryski 的 go-perfbook（中文版）</li><li>Effective Go</li><li>Go 101 的 Optimizations 101</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add smallnest/chao-go-perf</span><br></pre></td></tr></table></figure><h3 id="24-4-1-黄金法则：先测量，再优化"><a href="#24-4-1-黄金法则：先测量，再优化" class="headerlink" title="24.4.1 黄金法则：先测量，再优化"></a>24.4.1 黄金法则：先测量，再优化</h3><p><code>chao-go-perf</code> 开篇就把 Dave Cheney 和 go-perfbook 的两句话钉在墙上：</p><blockquote><p>&quot;You can&#39;t optimize what you don&#39;t measure. Always benchmark before and after.&quot;<br>—— Dave Cheney</p><p>不要猜测性能瓶颈。用数据说话。先测量，再优化，最后验证。<br>—— go-perfbook</p></blockquote><p>由此引出五条黄金法则：先测量再优化、Benchmark 驱动、了解编译器、内存是瓶颈、优化最热路径。这五条不是建议，是 Skill 的工作前提，和第 16 章 agent-skills 的验证门禁、第 23 章 <code>/refactor</code> 的安全协议同源：Agent 得先有证据（benchmark、pprof）才能动优化。这一条直接把 Agent 最爱的毛病禁了，看一眼代码就凭直觉「优化」。</p><p><img src="/images/image-20260627085649794.png"></p><h3 id="24-4-2-三套分析框架：CPU-内存-并发"><a href="#24-4-2-三套分析框架：CPU-内存-并发" class="headerlink" title="24.4.2 三套分析框架：CPU &#x2F; 内存 &#x2F; 并发"></a>24.4.2 三套分析框架：CPU &#x2F; 内存 &#x2F; 并发</h3><p>Skill 给出三套可机械执行的分析框架，每套都是「命令 → 看什么 → 判断什么」：</p><table><thead><tr><th>维度</th><th>生成 profile</th><th>看什么</th><th>典型病因</th></tr></thead><tbody><tr><td>CPU</td><td><code>go test -bench -cpuprofile</code></td><td>火焰图最热函数</td><td>内联失败、不必要计算、算法复杂度</td></tr><tr><td>内存</td><td><code>go test -bench -memprofile</code> + <code>-gcflags=&quot;-m&quot;</code></td><td>alloc_space 热点、逃逸分析</td><td>slice 未预分配、[]byte↔string 转换、接口装箱</td></tr><tr><td>并发</td><td><code>go test -race</code> + <code>runtime/trace</code> + mutex profile</td><td>锁等待、调度</td><td>锁粒度过大、false sharing、channel vs mutex 选错</td></tr></tbody></table><p>这套框架把性能优化从「拍脑袋改代码」变成「先定位瓶颈在哪一层，再用对应工具验证」。AI 时代尤其用得上，Agent 吐的代码经常埋着 N+1 分配、循环内排序这类量小看不出、上了量才爆的坑，<code>chao-go-perf</code> 的内存框架一眼能扫出来。</p><h3 id="24-4-3-覆盖面与参考资料"><a href="#24-4-3-覆盖面与参考资料" class="headerlink" title="24.4.3 覆盖面与参考资料"></a>24.4.3 覆盖面与参考资料</h3><p>Skill 还配 8 份参考资料，按需加载：benchmarking、memory-optimization、cpu-optimization、cache-optimization、concurrency-perf、pgo、tooling、version-changes。其中两块是 Go 圈的硬骨头：PGO（Profile-Guided Optimization）的完整工作流，和 Go 1.12 到 1.27 的关键性能变更（哪个版本改了 GC、哪个版本改了调度器，升级时要留意什么）。CPU 缓存那块也讲得细，cache line 对齐、false sharing 检测、AoS 对 SoA 的数据局部性取舍，这些资深 Go 工程师才碰得到，Agent 默认不会主动想。</p><h3 id="24-4-4-实演：先看-benchmark，再谈优化"><a href="#24-4-4-实演：先看-benchmark，再谈优化" class="headerlink" title="24.4.4 实演：先看 benchmark，再谈优化"></a>24.4.4 实演：先看 benchmark，再谈优化</h3><p>按 Skill 的规矩，它不会直接给优化方案，第一句话是问数据。你喂给它一段有锁竞争的计数器：</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> Counter <span class="keyword">struct</span> &#123;</span><br><span class="line">    mu sync.Mutex</span><br><span class="line">    n  <span class="type">int</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(c *Counter)</span></span> Inc() &#123;</span><br><span class="line">    c.mu.Lock()</span><br><span class="line">    c.n++</span><br><span class="line">    c.mu.Unlock()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>说「这个 Inc 在高并发下慢，优化一下」。<code>chao-go-perf</code> 不会立刻说「换 atomic」，它会先走 Step 1 的分类和 Step 2 的框架，让你先出证据：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">问题分类：并发竞争（吞吐量不随 CPU 增加）</span><br><span class="line">诊断步骤：</span><br><span class="line">1. go test -bench=. -cpuprofile=cpu.out</span><br><span class="line">2. go tool pprof -http=:8080 cpu.out  → 看 mutex 热点</span><br><span class="line">3. go test -race  → 确认无数据竞争</span><br><span class="line">4. 看锁竞争：临界区只有一个 n++，纯计数</span><br></pre></td></tr></table></figure><p>证据到位（profile 显示锁等待占大头），它才进锁选择决策树。Skill 里那张决策图长这样：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">是否只需要保护简单整数/布尔/指针?</span><br><span class="line">  └── Yes → atomic 操作</span><br><span class="line">  └── No → 读写比例?</span><br><span class="line">            ├── 几乎全读 (&gt; 90%) → sync.RWMutex</span><br><span class="line">            ├── 读写均衡 → sync.Mutex</span><br><span class="line">            └── 偶尔写入一次 → sync.Once / sync.Map</span><br></pre></td></tr></table></figure><p><code>n</code> 是个整数，<code>Inc</code> 只做自增，正好走第一条分支，给方案：</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> Counter <span class="keyword">struct</span> &#123;</span><br><span class="line">    n atomic.Int64</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(c *Counter)</span></span> Inc() &#123;</span><br><span class="line">    c.n.Add(<span class="number">1</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>并附一串近似量级让你心里有数：atomic 约 1-2 ns&#x2F;op，无竞争 Mutex 15-30 ns&#x2F;op，channel 50-200 ns&#x2F;op。最后还不忘补一句：优化前后的 benchmark 都得跑，用 benchstat 验证。这套流程才是 Skill 想要的样子，先量、再分类、最后给方案，每一步都有数据兜着，而不是上来就 sync.Pool。</p><h2 id="24-5-chao-go-sync：并发是-Go-的灵魂，也是最容易翻车的地方"><a href="#24-5-chao-go-sync：并发是-Go-的灵魂，也是最容易翻车的地方" class="headerlink" title="24.5 chao-go-sync：并发是 Go 的灵魂，也是最容易翻车的地方"></a>24.5 chao-go-sync：并发是 Go 的灵魂，也是最容易翻车的地方</h2><p>Go 的并发是它的招牌，也是它最容易出事的地方。<code>chao-go-sync</code> 基于《Go 并发编程实战》一书，把 Go 并发的全套知识，从标准库原语到分布式同步，装进一个 Skill。这本书是我写的，写它的时候把踩过的坑、用过的第三方库、做过的分布式同步方案整理了一遍。写完发现，这些内容正好是 Agent 写并发代码最缺的那块。它知道 <code>sync.Mutex</code> 怎么用，但不知道哪里会复制、哪里会重入死锁、什么时候该上分片锁。于是把书的内容蒸成 Skill，让 Agent 调一下就能拿到一整本书的判断力。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add smallnest/chao-go-sync</span><br></pre></td></tr></table></figure><h3 id="24-5-1-覆盖面：从-stdlib-到-etcd"><a href="#24-5-1-覆盖面：从-stdlib-到-etcd" class="headerlink" title="24.5.1 覆盖面：从 stdlib 到 etcd"></a>24.5.1 覆盖面：从 stdlib 到 etcd</h3><p><code>chao-go-sync</code> 的覆盖面是五个 Skill 里最广的，横跨四个层次：</p><table><thead><tr><th>层次</th><th>内容</th></tr></thead><tbody><tr><td>标准库原语</td><td>Mutex、RWMutex、WaitGroup、Cond、Once、Pool、sync.Map、atomic、channel、context、synctest</td></tr><tr><td>官方扩展</td><td>信号量、SingleFlight、ErrGroup、限流器</td></tr><tr><td>第三方库</td><td>CyclicBarrier、断路器（sony&#x2F;gobreaker）、Worker Pool（panjf2000&#x2F;ants）、sourcegraph&#x2F;conc、各类限流库</td></tr><tr><td>分布式同步</td><td>基于 etcd 的 Leader 选举、分布式锁、分布式队列&#x2F;屏障、STM</td></tr></tbody></table><p>外加 13+ 种并发模式（半异步半同步、Reactor、Proactor、Per-CPU、活动对象……）和四个经典问题（哲学家就餐四种解法、理发师问题、水工厂、Fizz Buzz）。这个体量，基本上是把一本并发书搬进了 Skill。</p><h3 id="24-5-2-Bug-诊断框架：五个必查项"><a href="#24-5-2-Bug-诊断框架：五个必查项" class="headerlink" title="24.5.2 Bug 诊断框架：五个必查项"></a>24.5.2 Bug 诊断框架：五个必查项</h3><p>并发 Bug 最难的是定位。Skill 给了一套诊断框架，收到并发问题先过这五条：</p><ul><li>有没有数据竞争？（<code>-race</code> 输出）</li><li>锁的获取&#x2F;释放顺序对不对？（防死锁）</li><li>有没有锁重入？（Go 的 Mutex 不可重入，这是 Java 转 Go 最常踩的坑）</li><li>有没有复制 sync 原语？（<code>go vet</code> 能查，Agent 不会主动跑）</li><li>WaitGroup 计数匹不匹配？goroutine 有没有泄漏？（Go 1.26+ 运行时自动检测）</li></ul><p>这五条本身就是一份并发代码审查清单。<code>go-style-guide</code> 里也有一份并发 reference，但深度不在一个量级，<code>go-style-guide</code> 讲怎么用对，<code>chao-go-sync</code> 讲出了问题怎么查、怎么治、还有哪些更高级的替代。</p><h3 id="24-5-3-实演：两个静默-Bug，诊断框架一眼揪出"><a href="#24-5-3-实演：两个静默-Bug，诊断框架一眼揪出" class="headerlink" title="24.5.3 实演：两个静默 Bug，诊断框架一眼揪出"></a>24.5.3 实演：两个静默 Bug，诊断框架一眼揪出</h3><p>并发 Bug 最阴的地方在于不崩。喂给它两段看着没毛病的代码，让它审。</p><p>第一段，忘记 Unlock。多分支 return，有一条路径漏了 Unlock，程序不会立刻死，锁会泄漏，到某个时刻所有 goroutine 卡住：</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(f *Foo)</span></span> Bar() &#123;</span><br><span class="line">    f.mu.Lock()</span><br><span class="line">    <span class="keyword">if</span> f.count &lt; <span class="number">1000</span> &#123;</span><br><span class="line">        f.count += <span class="number">3</span></span><br><span class="line">        <span class="keyword">return</span>  <span class="comment">// 漏了 Unlock</span></span><br><span class="line">    &#125;</span><br><span class="line">    f.count++</span><br><span class="line">    f.mu.Unlock()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>第二段，锁重入死锁。从 Java 转来的人最容易写，Go 的 Mutex 不可重入，<code>Bar</code> 里再 <code>Lock</code> 直接死锁：</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(t *T)</span></span> Foo() &#123;</span><br><span class="line">    t.mu.Lock()</span><br><span class="line">    <span class="keyword">defer</span> t.mu.Unlock()</span><br><span class="line">    t.Bar()           <span class="comment">// Bar 内部又 Lock</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(t *T)</span></span> Bar() &#123;</span><br><span class="line">    t.mu.Lock()       <span class="comment">// 死锁</span></span><br><span class="line">    <span class="keyword">defer</span> t.mu.Unlock()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>chao-go-sync</code> 的诊断框架对这两段走的路径不一样。第一段它先问「锁的获取&#x2F;释放配不配对」，发现 <code>Lock</code> 后有分支提前 return 却没 <code>defer Unlock</code>，直接指出该用 <code>defer</code> 兜底；第二段它走的是「有没有锁重入」那条，点明 Go Mutex 不可重入，给的解法是重构，别让 <code>Foo</code> 持着锁调 <code>Bar</code>，要么把 <code>Bar</code> 拆成不加锁的内部方法 <code>barLocked</code>，由 <code>Foo</code> 在持锁状态下调。两个 Bug 都不是 race detector 能报的（race detector 只管数据竞争），靠的是 Skill 里那份「五必查」清单的经验。这就是它比通用 Agent 多出来的一层：知道去哪几个固定位置找问题。</p><h3 id="24-5-4-性能优化与版本迁移"><a href="#24-5-4-性能优化与版本迁移" class="headerlink" title="24.5.4 性能优化与版本迁移"></a>24.5.4 性能优化与版本迁移</h3><p>诊断之外，<code>chao-go-sync</code> 还给了一份锁选择决策：什么场景该用 RWMutex 替代 Mutex，什么场景该上分片锁、sync.Map、atomic，什么场景干脆 lock-free。它也覆盖 Go 1.20 到 1.27 的 sync 包变更，比如 <code>sync.OnceValue</code>&#x2F;<code>OnceFunc</code>（1.21）、运行时 goroutine 泄漏检测（1.26）这些新东西，旧代码该不该迁移、怎么迁移。这跟 <code>/modern-go</code> 互补，<code>/modern-go</code> 管通用 API 的现代化，<code>chao-go-sync</code> 专管并发原语。</p><h2 id="24-6-go-style-guide：一份固执己见的-Go-工程契约"><a href="#24-6-go-style-guide：一份固执己见的-Go-工程契约" class="headerlink" title="24.6 go-style-guide：一份固执己见的 Go 工程契约"></a>24.6 go-style-guide：一份固执己见的 Go 工程契约</h2><p>前三个 Skill 偏「术」，现代化、性能、并发都是具体技术。<code>go-style-guide</code> 偏「道」，管的是 Go 代码的工程契约：包怎么设计、接口怎么定、错误怎么传、日志怎么打。作者是 madflojo（Benjamin Cane）。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add -g -y madflojo/go-style-agent-skill</span><br></pre></td></tr></table></figure><p>它最显眼的标签是 README 里那句 &quot;Opinionated by design&quot;，刻意固执己见。它明确说，这不是通用、官方的 Go 风格指南，是个人偏好，要的是真实代码库里的一致性、可维护性和生产可用性。紧接着一句很关键：「如果你仓库已经有自己的约定，那些约定通常优先。」这一句把固执己见和尊重本地两边都顾上了，Skill 给默认值，但不覆盖既有规矩。</p><h3 id="24-6-1-十条-TL-DR"><a href="#24-6-1-十条-TL-DR" class="headerlink" title="24.6.1 十条 TL;DR"></a>24.6.1 十条 TL;DR</h3><p>Skill 用十条 TL;DR 浓缩了整套契约，挑几条最硬的。测试优先设计，先注入依赖、保持逻辑纯，再谈别的。Config 进、具体 struct 出，构造器吃 Config，显式校验和默认值。错误是契约，用 sentinel error 做持久分支判断，其余的用 <code>%w</code> 或 <code>errors.Join</code> 包裹。包要可复用，不藏全局变量、不藏默认日志、不搞意外副作用。标准库优先，第三方包必须靠「有意义、维护良好、被广泛采用」挣一席之地。accept interfaces, return structs，接口通常由消费者定义。覆盖率是信号不是证明，测边界和误用路径，别只测 happy path。声称性能提升前先 benchmark 热路径，并发代码跑 <code>-race</code>。</p><p>这些条款和 <code>chao-go-perf</code> 的「先测量再优化」、<code>chao-go-sync</code> 的并发安全说的是一回事，只是 <code>go-style-guide</code> 站在工程视角把它们串起来。</p><h3 id="24-6-2-执行协议：六步，先看仓库再动手"><a href="#24-6-2-执行协议：六步，先看仓库再动手" class="headerlink" title="24.6.2 执行协议：六步，先看仓库再动手"></a>24.6.2 执行协议：六步，先看仓库再动手</h3><p><code>go-style-guide</code> 不只是规则清单，它还有一份六步执行协议，规定 Skill 干活时的顺序：</p><ol><li>先看仓库：读现有包布局、构造器、测试、错误约定，再提新 API；</li><li>先定契约：包边界、Config 形状、返回类型、sentinel error、依赖缝隙、context&#x2F;关停预期，写代码前先定；</li><li>尽早写测试：表格驱动单测起步，输入密集的加 fuzz，性能敏感的加 benchmark；</li><li>最小可维护改动：沿用仓库既有布局，<code>main.go</code> 保持薄，没明确边界别引入新抽象；</li><li>跑收尾检查：<code>gofmt</code>&#x2F;<code>goimports</code>、相关 <code>go test</code>、并发跑 <code>-race</code>、声称性能就跑 benchmark；</li><li>验证面向人的契约：函数签名、Config 形状、错误行为、文档注释，和代码一样重要。</li></ol><p>这六步和第 16 章 agent-skills 的 Define→Plan→Build→Verify→Review→Simplify→Ship 是一个谱系，都是把资深工程师不会跳过的步骤固化成 Agent 必走的流程。配 10 份 reference（CONFIG、INTERFACES、ERRORS、LOGGING、DOCUMENTATION、LAYOUT、BENCHMARKS、TESTING、CONCURRENCY、REVIEW-CHECKLIST）按需加载，也就是第 2 章讲的渐进式信息披露。</p><h2 id="24-7-cc-skills-golang：拿数据说话的全家桶"><a href="#24-7-cc-skills-golang：拿数据说话的全家桶" class="headerlink" title="24.7 cc-skills-golang：拿数据说话的全家桶"></a>24.7 cc-skills-golang：拿数据说话的全家桶</h2><p>前四个 Skill 各管一面，<code>cc-skills-golang</code> 是把它们全做了一份、还做了交叉引用和效果评估的体系。作者 samber（samber&#x2F;lo 的作者，Go 圈老熟人），两千多 stars，是本章体量最大的项目。</p><p>它的态度写在 README 最显眼的地方：</p><blockquote><p>Bootstrapped with Claude Code by distilling my Go project commits. <strong>Edited, tested, reviewed and reworked by a human.</strong><br><strong>No AI slop here.</strong> AI-made skills are useless.</p></blockquote><p>先用 Claude Code 把自己 Go 项目的提交蒸馏成 Skill 草稿，再由人编辑、测试、审查、返工。最后那句「No AI slop here. AI-made skills are useless.」是整个项目的主张：AI 生成的 Skill 没人把关就是废纸，人审过的才是 Skill。这跟本书第 2 章 Matt Pocock 的「real engineering, not vibe coding」、第 12 章的 maker-checker 分离是一个调子。</p><h3 id="24-7-1-28-原子-Skill，交叉引用"><a href="#24-7-1-28-原子-Skill，交叉引用" class="headerlink" title="24.7.1 28+ 原子 Skill，交叉引用"></a>24.7.1 28+ 原子 Skill，交叉引用</h3><p><code>cc-skills-golang</code> 把 Go 工程拆成 28+ 个原子、可交叉引用的 Skill，分四大类加一批框架&#x2F;库 Skill：</p><table><thead><tr><th>大类</th><th>代表 Skill</th></tr></thead><tbody><tr><td>代码质量</td><td>code-style、naming、error-handling、safety、security、structs-interfaces、documentation、lint</td></tr><tr><td>架构与设计</td><td>concurrency、context、data-structures、database、dependency-injection、design-patterns、modernize</td></tr><tr><td>QA 与性能</td><td>testing、benchmark、performance、observability、troubleshooting</td></tr><tr><td>项目搭建</td><td>cli、continuous-integration、project-layout、popular-libraries、stay-updated、dependency-management</td></tr><tr><td>框架&#x2F;库</td><td>grpc、graphql、google-wire、uber-dig&#x2F;fx、spf13-cobra&#x2F;viper、samber-lo&#x2F;mo&#x2F;ro&#x2F;do&#x2F;hot&#x2F;slog&#x2F;oops、testify</td></tr></tbody></table><p>注意里面的 <code>modernize</code>、<code>performance</code>、<code>concurrency</code>、<code>code-style</code>，和前四个 Skill 的职责正面重叠。samber 的处理方式是让 Skill 之间互相引用。比如错误处理影响日志的规则，就放在 <code>error-handling</code> 里，由 <code>observability</code> 引用，不各写一份。README 特意提醒，只装一部分会得到片面、可能不一致的视图，最好整套一起装。这套「原子 Skill 加交叉引用」的做法，和第 2 章的「小而可组合」、第 16 章的「24 个 Skill 覆盖完整生命周期」思路一样，只是规模更大。</p><h3 id="24-7-2-用数据说话：Skill-到底有没有用"><a href="#24-7-2-用数据说话：Skill-到底有没有用" class="headerlink" title="24.7.2 用数据说话：Skill 到底有没有用"></a>24.7.2 用数据说话：Skill 到底有没有用</h3><p><code>cc-skills-golang</code> 有一点别的前四个 Skill 都没有：它给 Skill 跑了评估，拿出了量化效果。</p><p><img src="/images/image-20260627085843606.png"></p><p>samber 给每个 Skill 跑了一套评估（evals），对比「装了 Skill」和「没装 Skill」时 Agent 的通过率，并算出「错误率下降幅度」（Error rate gap）。先看总账：</p><table><thead><tr><th></th><th>装了 Skill</th><th>没装 Skill</th><th>差距</th></tr></thead><tbody><tr><td>总体</td><td>3315&#x2F;3395（98%）</td><td>1915&#x2F;3395（56%）</td><td><strong>+41 个百分点</strong></td></tr></tbody></table><p>装了 Skill，Agent 通过率从 56% 跳到 98%。本书前面一直在主张 Skill 有用，到这里才头一回有硬数。再看单项，挑几个降幅最猛的：</p><table><thead><tr><th>Skill</th><th>错误率下降</th></tr></thead><tbody><tr><td><code>golang-modernize</code></td><td>-61%</td></tr><tr><td><code>golang-continuous-integration</code></td><td>-59%</td></tr><tr><td><code>golang-safety</code></td><td>-58%</td></tr><tr><td><code>golang-dependency-management</code></td><td>-54%</td></tr><tr><td><code>golang-documentation</code></td><td>-53%</td></tr><tr><td><code>golang-benchmark</code></td><td>-50%</td></tr></tbody></table><p><code>modernize</code> 降 61%，<code>safety</code> 降 58%，正好对应本章 <code>/modern-go</code>（现代化）和并发安全这两个最容易出错的领域，说明这些地方最需要 Skill 兜底。框架&#x2F;库类里 <code>golang-samber-do</code>（依赖注入）最夸张，降 81%。这些数字替本书从第 1 章念到现在的「Skill 是 AI 软件工程的基石」补上了证据。</p><h3 id="24-7-3-token-预算：把渐进式信息披露做成了账"><a href="#24-7-3-token-预算：把渐进式信息披露做成了账" class="headerlink" title="24.7.3 token 预算：把渐进式信息披露做成了账"></a>24.7.3 token 预算：把渐进式信息披露做成了账</h3><p><code>cc-skills-golang</code> 还把第 2 章的渐进式信息披露做成了明账。每个 Skill 都标三档 token 权重：<code>description</code>（frontmatter 里的描述，常驻上下文，用于触发）、<code>SKILL.md</code>（触发后才加载的全文）、<code>Directory</code>（SKILL.md 加所有 reference）。比如 <code>golang-code-style</code> 是 115 &#x2F; 2069 &#x2F; 2685 token，<code>golang-security</code> 是 84 &#x2F; 3036 &#x2F; 21472 token。也就是说 security 这个 Skill 平时只占 84 token 趴在上下文里等触发，真用上了才把两万多 token 的全量知识加载进来。这比把所有规则一股脑塞进系统提示省得多。</p><h2 id="24-8-五个-Skill-怎么配合"><a href="#24-8-五个-Skill-怎么配合" class="headerlink" title="24.8 五个 Skill 怎么配合"></a>24.8 五个 Skill 怎么配合</h2><p>五个 Skill 有重叠，怎么选？给一张决策表：</p><table><thead><tr><th>你要解决的问题</th><th>首选 Skill</th><th>备选</th></tr></thead><tbody><tr><td>老代码升级到新 Go 写法</td><td><code>/modern-go</code></td><td>cc-skills-golang 的 <code>golang-modernize</code></td></tr><tr><td>代码慢、要优化</td><td><code>chao-go-perf</code></td><td>cc-skills-golang 的 <code>golang-performance</code>&#x2F;<code>benchmark</code></td></tr><tr><td>并发 Bug 或并发设计</td><td><code>chao-go-sync</code></td><td>cc-skills-golang 的 <code>golang-concurrency</code></td></tr><tr><td>包设计、接口、错误契约</td><td><code>go-style-guide</code></td><td>cc-skills-golang 的 <code>golang-code-style</code> 等</td></tr><tr><td>想要一站式、且要效果有数据</td><td><code>cc-skills-golang</code>（整套）</td><td>——</td></tr></tbody></table><p>一个务实的组合：日常拿 <code>cc-skills-golang</code> 当底座（覆盖全、有评估、交叉引用），遇到性能和并发这两个深水区，再挂上 <code>chao-go-perf</code> 和 <code>chao-go-sync</code>，这两个的深度 samber 的全家桶比不了，一个搬了 Dave Cheney 工作坊，一个搬了整本并发书。<code>/modern-go</code> 嵌在 Goal Workflow 里，做提交前的现代化体检。<code>go-style-guide</code> 适合团队对齐工程契约时当起点。</p><p>重叠不可怕。<code>cc-skills-golang</code> 的 <code>golang-modernize</code> 和 <code>/modern-go</code> 规则高度相似，但 <code>/modern-go</code> 多了「读 go.mod、版本门控」这层保护；<code>golang-performance</code> 和 <code>chao-go-perf</code> 都讲 pprof，但后者多了一整本 go-perfbook 的方法论。重叠的地方正好见高下，比较着选就行。</p><h2 id="24-9-与全书方法论的对接"><a href="#24-9-与全书方法论的对接" class="headerlink" title="24.9 与全书方法论的对接"></a>24.9 与全书方法论的对接</h2><ul><li>第 2 章 Skills：这五个 Skill 是「原子 Skill」在 Go 领域的展开。<code>cc-skills-golang</code> 的 28+ 原子 Skill 加交叉引用，是「小而可组合」的体系级样本；<code>go-style-guide</code> 的 10 份 reference 按需加载，是渐进式信息披露的典型实现。</li><li>第 8 章 Goal Workflow：<code>/modern-go</code> 是 Goal Workflow 套件的 Bonus Skill，和 <code>/refactor</code>、<code>/smell</code> 同属代码库健康维护工具链。</li><li>第 16 章 agent-skills：<code>chao-go-perf</code> 的「先测量再优化」、<code>go-style-guide</code> 的六步执行协议，都是 agent-skills 验证门禁和反合理化表的同类，把 Agent 最爱跳过的步骤（不 benchmark 就优化、不看仓库就动手）钉成必须走的流程。</li><li>第 20 章 Anthropic 官方插件：官方插件注入领域知识和工程工作流，这五个 Go Skill 是社区版的 Go 领域知识插件，把 Go 二十年的门道封装成任何 Agent Skills 兼容工具都能用的能力。</li><li>第 23 章 重构：<code>/modern-go</code> 和 <code>/refactor</code>、<code>/smell</code> 是邻居，<code>/smell</code> 扫病灶，<code>/refactor</code> 套 Fowler 手法治，<code>/modern-go</code> 管版本现代化，三者一起维护代码库健康。</li></ul><h2 id="24-10-本章小结"><a href="#24-10-本章小结" class="headerlink" title="24.10 本章小结"></a>24.10 本章小结</h2><p>Go 这门语言表面小，门道深。地道写法绑版本，并发坑静默，性能靠测量，通用 Agent 写出的 Go 经常是能跑但不地道、不安全、不快。本章五个 Skill 把 Go 二十年的资深经验编码成 Agent 能可靠复用的能力：<code>/modern-go</code> 管现代化（35 条版本门控规则），<code>chao-go-perf</code> 管性能（先测量再优化），<code>chao-go-sync</code> 管并发（从 stdlib 到 etcd），<code>go-style-guide</code> 管工程契约（固执己见但尊重本地），<code>cc-skills-golang</code> 把这几样各做一份还顺带做了评估。<code>cc-skills-golang</code> 那张「装了 Skill 98%、没装 56%」的评估表，是本书到现在最硬的一块证据，给「Skill 是 AI 软件工程的基石」这句话补了数。</p><p>第 22 章读懂代码，第 23 章改好代码，这一章用 Go 专属技能把 Go 代码写地道、写安全、写快。但这些 Skill 解决的都还是「写」和「改」，代码写完了，谁来证明它真的对？下一章的 autoreview 和 Crabbox 接的就是这一棒，一个做自动化代码审查，一个在远程沙箱里真跑一遍验证。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/go-language-skills-ai-era-go-toolchain/</id>
    <link href="https://colobu.com/2026/06/28/go-language-skills-ai-era-go-toolchain/"/>
    <published>2026-06-28T10:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>&quot;Clear is better than clever.&quot;<br>清晰胜于聪明。<br>—— Rob Pike, Go Proverbs</p>
</blockquote>
<p>第 23 章把重构讲完了。嗅坏味道、套 Fowler 手法、小步施工、每步测试，这套东西对 Java、Python、Go 一视同仁。但真到 Go 上手你会发现，Fowler 的目录够不着 Go 的好几层脾气。一段能跑的 Go 代码，可能还停在 Go 1.10 的写法，不地道；可能并发原语用错了，race detector 一开就红，不安全；也可能分配没控住，cache line 在 false sharing，不快。这些坏味道扫不出来，是 Go 二十年攒下来、只有老手才摸得到的门道。</p>
<p>门道都散在各处。Dave Cheney 的高性能工作坊讲一套，dgryski 的 go-perfbook 讲一套，《Go 并发编程实战》讲一套，Go 团队的 modernize 分析又讲一套，再加上无数生产事故换来的风格约定。以前你得一本书一本书读、一个 pprof 一个 pprof 啃。现在有人把这些蒸成一个 Skill，Agent 调一下就能用。</p>
<p>本章介绍五个 Go 专属的 Skill，正好覆盖 Go 工程的四个面：现代化（<code>/modern-go</code>）、性能（<code>chao-go-perf</code>）、并发（<code>chao-go-sync</code>）、风格（<code>go-style-guide</code>），外加一个把这几样打包、还顺带做了效果评估的全家桶（<code>cc-skills-golang</code>）。前三个是本书作者 smallnest 写的，对，写这本书的人和写这些 Skill 的人是同一个；后两个分别来自 madflojo（Benjamin Cane）和 samber。</p>]]>
    </summary>
    <title>Go 语言技能：AI 时代的 Go 开发工具链</title>
    <updated>2026-06-28T06:46:22.016Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="重构" scheme="https://colobu.com/tags/%E9%87%8D%E6%9E%84/"/>
    <category term="技术债" scheme="https://colobu.com/tags/%E6%8A%80%E6%9C%AF%E5%80%BA/"/>
    <content>
      <![CDATA[<blockquote><p>「Any fool can write code that a computer can understand. Good programmers write code that humans can understand.」<br>任何傻瓜都能写出计算机能看懂的代码。好程序员写的是人能看懂的代码。<br>—— Martin Fowler</p></blockquote><p>第 22 章解决了「人怎么读懂 AI 写的代码」，用 UML 把代码画成图。</p><p>读懂之后呢？你打开 AI 生成的代码，能跑，但是一团乱麻：一个方法三百行，一个类管了八件事，同样的逻辑复制了五遍。这时候怎么办？</p><p>重构。</p><p>这件事本身不新鲜，Martin Fowler 1999 年就把它写成了一本书。变的是执行者。以前是人对着那本书一处一处手动改，现在是 AI 对着同一本书的目录自动改，人退到后面审查 diff。</p><span id="more"></span><p><img src="/images/image-20260626094732641.png"></p><p>本章分两半。前半讲重构的理论根基：什么是重构、技术债是怎么回事、什么时候该重构、Fowler 编了哪些坏味道和手法。这部分主要参考 Fowler 的《重构》，以及把这本书做成在线可检索版本的 <a href="https://refactoring.guru/refactoring">refactoring.guru</a>。后半讲 goal workflow 套件里的两个 Skill：<code>/refactor</code>（介绍页：<a href="https://goal.rpcx.io/index_cn.html#step-refactor">https://goal.rpcx.io/index_cn.html#step-refactor</a> ）把 Fowler 第 2 版的整个目录封进了一个 AI Agent 能直接调用的能力里；<code>/smell</code>（介绍页：<a href="https://goal.rpcx.io/index_cn.html#step-smell">https://goal.rpcx.io/index_cn.html#step-smell</a> ）则在它前面一步，负责扫出整个代码库到底哪里有问题。一个诊断，一个治疗。</p><h2 id="23-1-什么是重构，什么是技术债"><a href="#23-1-什么是重构，什么是技术债" class="headerlink" title="23.1 什么是重构，什么是技术债"></a>23.1 什么是重构，什么是技术债</h2><p>重构（refactoring）是在不改变外部行为的前提下改善代码内部结构。说白了，把一团乱麻（dirty code）整理成清爽的代码（clean code），但程序对外的表现一字不变。</p><ul><li><strong>脏代码</strong>是经验不足，再加上 deadline、管理混乱、开发途中走捷径，几样凑一起的产物。</li><li><strong>整洁代码</strong>易读、易懂、易维护，它让开发变得可预测。你大概知道改一处要花多久，而不是每次都掉进未知的坑。</li></ul><p>代码为什么会从整洁滑向肮脏？Ward Cunningham 的<strong>技术债</strong>这个说法解释得很到位。走捷径、跳过测试，就像找银行贷款：眼下买东西是快了，但要付利息。你不光还本金，还得还利息；利息攒够了，甚至会超过你的全部收入，永远还不清。代码也一样。不写测试能暂时提速，可它每天都在拖你后腿，直到哪天你补上测试，把债还掉。</p><p><img src="/images/image-20260626095233920.png"></p><p>refactoring.guru 列了一串技术债的成因。这些在 AI 时代值得重读，因为大多被放大了：</p><ul><li><strong>业务压力</strong>：功能没做完就得上线，于是补丁和权宜之计堆上去，盖住没收尾的部分。</li><li><strong>看不到后果</strong>：管理层不知道技术债有「利息」，债越欠越多、开发越来越慢，于是舍不得给重构留时间。</li><li><strong>强耦合没人管</strong>：项目变成一块铁板而不是一堆独立模块，动一处牵全身。</li><li><strong>缺测试</strong>：没有即时反馈，人就敢用又快又险的 workaround。最坏的情况是没测试直接上线，可能给几千个客户发出一封诡异的测试邮件，也可能直接把数据库清空。</li><li><strong>缺文档、缺沟通</strong>：新人上手慢；关键的人一走，开发就停摆。</li><li><strong>长期多分支并行</strong>：隔离的改动越多，合并时积下的债越大。</li><li><strong>重构一拖再拖</strong>：需求一直变，旧代码总有显得笨重的一天；可程序员每天还在往旧代码上接新代码，所以拖得越久，将来要返工的依赖就越多。</li></ul><p>「缺测试」和「重构一拖再拖」这两条在 AI 时代尤其要命。Agent 几分钟就能吐出几千行代码，没有特征测试兜底、没有及时整理，技术债的本金和利息会以人类时代见不到的速度滚起来。第 12 章讲 GSD Core 时提过的「反合理化表」，对抗的正是「以后再重构」「先跳过测试」这类自欺。它其实就是技术债成因的制度化解药。</p><h2 id="23-2-何时重构：三次法则"><a href="#23-2-何时重构：三次法则" class="headerlink" title="23.2 何时重构：三次法则"></a>23.2 何时重构：三次法则</h2><p>Fowler 的经验法则很简洁——<strong>三次法则（Rule of Three）</strong>：</p><ol><li><strong>第一次</strong>做某件事，直接做完。</li><li><strong>第二次</strong>做类似的事，心里别扭也照旧重复一遍。</li><li><strong>第三次</strong>再碰到同类的事，开始重构。</li></ol><p>第一次重复忍着，第三次出现就动手。除此之外还有三个天然时机：</p><ul><li><strong>加功能时</strong>：重构能帮你读懂别人的代码。面对一坨脏代码，先重构再加，整洁的代码好改得多。这一改不只方便你，也方便后面接手的人。</li><li><strong>修 bug 时</strong>：bug 跟现实里的虫子一样，专挑代码最暗最脏的角落待着。把代码清干净，错误几乎会自己冒出来。</li><li><strong>代码评审时</strong>：这往往是代码公开前最后一次整理的机会。最好跟作者结对来做，简单问题当场修掉，复杂的估个时间再说。</li></ul><h2 id="23-3-如何重构：正确的姿势"><a href="#23-3-如何重构：正确的姿势" class="headerlink" title="23.3 如何重构：正确的姿势"></a>23.3 如何重构：正确的姿势</h2><p>重构是一连串小改动，每一步让代码好一点，同时让程序始终能跑。refactoring.guru 的「做对了」清单只有三条，却是整套方法论的核心：</p><ul><li><strong>代码必须变干净。</strong> 重构完还是一团乱，那这一小时就白花了。这种事多半发生在你丢掉「小步改」、把一大堆重构混进一次大改动的时候。尤其赶 deadline 的时候，很容易把自己绕晕。</li><li><strong>重构期间不写新功能。</strong> 别把重构和加特性搅在一起，至少在单个 commit 里把两件事分开。</li><li><strong>重构后所有已有测试都得过。</strong> 测试挂了只有两种可能：要么你改错了，修就是；要么你的测试太底层了，比如去测了类的私有方法，这种情况是测试的锅，该把它重写成更高层、BDD 风格的测试。</li></ul><p>记住这三条。后半 <code>/refactor</code> Skill 的安全协议，基本就是把它们逐条机械化了一遍。</p><h2 id="23-4-Fowler-的目录：坏味道与手法"><a href="#23-4-Fowler-的目录：坏味道与手法" class="headerlink" title="23.4 Fowler 的目录：坏味道与手法"></a>23.4 Fowler 的目录：坏味道与手法</h2><p>refactoring.guru 把 Fowler 书里的内容编成了两张能检索的目录：</p><ul><li>**代码坏味道（Code Smells）**是问题的征兆，好发现，但它可能只是更深层问题露出的一角。</li><li>**重构手法（Refactoring Techniques）**是具体的改法。每种手法都有得有失，所以每次重构都该有明确的动机，谨慎施用。</li></ul><p>手法分六大类：组合方法（Composing Methods）、在对象间搬移特性（Moving Features Between Objects）、组织数据（Organizing Data）、简化条件表达式（Simplifying Conditional Expressions）、简化方法调用（Simplifying Method Calls）、处理泛化关系（Dealing with Generalization）。</p><p>整个流程是「症状到处方」：你先嗅到味道，比如「过长方法」或者「Feature Envy」，目录再告诉你该用哪几种手法去治。这套映射关系明确、能机械执行，也正是 AI Agent 接得住的地方。</p><h2 id="23-5-refactor：把-Fowler-的书变成一个-Skill"><a href="#23-5-refactor：把-Fowler-的书变成一个-Skill" class="headerlink" title="23.5 &#x2F;refactor：把 Fowler 的书变成一个 Skill"></a>23.5 &#x2F;refactor：把 Fowler 的书变成一个 Skill</h2><p>理论讲完，看看 <a href="https://goal.rpcx.io/index.html">goal workflow 套件</a>里的 <code>/refactor</code> 是怎么把这本书落成一个能调用的能力的。</p><p><code>/refactor</code> 基于 Fowler《重构》第 2 版的完整目录：识别坏味道，套用验证过的手法，在不动外部行为的前提下把代码改清爽。它在 goal workflow 主闭环（第 8 章）之外，是个 Bonus 技能。安装一行就够：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add smallnest/goal-workflow --skill refactor</span><br></pre></td></tr></table></figure><p>触发可以直接打 <code>/refactor</code>，也可以用自然语言或术语：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">重构：重构 UserManager 类，它太大了</span><br><span class="line">code smell：这个函数有 Feature Envy，修复它</span><br><span class="line">extract method：把这个长方法拆分成更小的函数</span><br></pre></td></tr></table></figure><h3 id="23-5-1-22-种坏味道（五大类别）"><a href="#23-5-1-22-种坏味道（五大类别）" class="headerlink" title="23.5.1 22 种坏味道（五大类别）"></a>23.5.1 22 种坏味道（五大类别）</h3><p>Skill 内置 22 种代码坏味道，按五大类组织，每种都关联到对应的重构手法：</p><table><thead><tr><th>类别</th><th>坏味道</th><th>主要重构手法</th></tr></thead><tbody><tr><td><strong>臃肿类</strong></td><td>过长方法</td><td>Extract Method, Replace Temp with Query</td></tr><tr><td></td><td>过大的类</td><td>Extract Class, Extract Subclass</td></tr><tr><td></td><td>基本类型偏执</td><td>Replace Data Value with Object</td></tr><tr><td></td><td>过长参数列表</td><td>Introduce Parameter Object</td></tr><tr><td></td><td>数据泥团</td><td>Extract Class</td></tr><tr><td><strong>OO 滥用类</strong></td><td>Switch 语句</td><td>Replace Conditional with Polymorphism</td></tr><tr><td></td><td>临时字段</td><td>Extract Class, Introduce Null Object</td></tr><tr><td></td><td>被拒绝的遗赠</td><td>Replace Inheritance with Delegation</td></tr><tr><td></td><td>异曲同工的类</td><td>Rename Method, Extract Superclass</td></tr><tr><td><strong>变更阻碍类</strong></td><td>发散式变化</td><td>Extract Class</td></tr><tr><td></td><td>霰弹式修改</td><td>Move Method, Move Field</td></tr><tr><td></td><td>平行继承体系</td><td>Move Method, Move Field</td></tr><tr><td><strong>冗余类</strong></td><td>注释（代码本应自说明）</td><td>Extract Method, Rename Variable</td></tr><tr><td></td><td>重复代码</td><td>Extract Method, Pull Up Method</td></tr><tr><td></td><td>冗赘类</td><td>Inline Class, Collapse Hierarchy</td></tr><tr><td></td><td>纯数据类</td><td>Move Method, Encapsulate Field</td></tr><tr><td></td><td>死代码</td><td>删除（Git 历史有记录）</td></tr><tr><td></td><td>夸夸其谈未来性</td><td>Inline Class, Remove Parameter</td></tr><tr><td><strong>耦合类</strong></td><td>依恋情节</td><td>Move Method</td></tr><tr><td></td><td>狎昵关系</td><td>Move Method, Move Field</td></tr><tr><td></td><td>消息链</td><td>Hide Delegate</td></tr><tr><td></td><td>中间人</td><td>Remove Middle Man</td></tr><tr><td></td><td>不完美的库类</td><td>Introduce Foreign Method</td></tr></tbody></table><h3 id="23-5-2-40-种重构手法（六大类）"><a href="#23-5-2-40-种重构手法（六大类）" class="headerlink" title="23.5.2 40+ 种重构手法（六大类）"></a>23.5.2 40+ 种重构手法（六大类）</h3><p><img src="/images/image-20260626095835777.png"></p><p>每种手法都附带机械步骤（mechanics）和 before&#x2F;after 对比示例，这正是 refactoring.guru 那张目录的 AI 可执行版：</p><table><thead><tr><th>类别</th><th>手法数</th><th>代表性手法</th></tr></thead><tbody><tr><td>组合方法</td><td>9</td><td>Extract Method, Inline Method, Extract Variable, Replace Temp with Query, Substitute Algorithm</td></tr><tr><td>移动特性</td><td>7</td><td>Move Method, Move Field, Extract Class, Inline Class, Hide Delegate</td></tr><tr><td>组织数据</td><td>13</td><td>Replace Data Value with Object, Encapsulate Field, Replace Type Code with Subclasses, Replace Magic Number</td></tr><tr><td>简化条件</td><td>8</td><td>Decompose Conditional, Guard Clauses, Replace Conditional with Polymorphism, Introduce Null Object</td></tr><tr><td>方法调用</td><td>13</td><td>Rename Method, Separate Query from Modifier, Introduce Parameter Object, Replace Error Code with Exception</td></tr><tr><td>泛化</td><td>9</td><td>Pull Up Method, Push Down Method, Extract Interface, Form Template Method, Replace Inheritance with Delegation</td></tr></tbody></table><h3 id="23-5-3-五阶段安全协议：把「做对了」清单制度化"><a href="#23-5-3-五阶段安全协议：把「做对了」清单制度化" class="headerlink" title="23.5.3 五阶段安全协议：把「做对了」清单制度化"></a>23.5.3 五阶段安全协议：把「做对了」清单制度化</h3><p><code>/refactor</code> 真正关键的设计不是目录，而是<strong>安全协议</strong>。它把 23.3 节那三条清单变成了 Agent 必须照办的执行护栏：</p><ul><li><strong>准备阶段</strong>：写特征测试（characterization test），提交当前状态，开一个重构分支。</li><li><strong>每一步</strong>：一次只改一处，编译过，测试全过，提交。</li><li><strong>验证阶段</strong>：测试全过，手动冒烟测一遍，自己审 diff，最后提交。</li><li><strong>铁律</strong>：不动外部行为，不夹带功能改动，每一步都有测试兜底。</li></ul><p>对着 Fowler 的三条清单看，正好一一对上：「代码必须变干净」对应自审 diff，「不写新功能」对应不夹带功能改动，「测试必须全过」对应每步测试加特征测试兜底。</p><p>AI 时代的价值就在这。人在 deadline 底下，难免偷偷给自己找台阶，「这块以后再重构」「这次先跳过测试」。Agent 被钉死在协议上，没这个空子可钻。重构的纪律，从「靠人自觉」变成了「靠机器强制」。</p><h3 id="23-5-4-语言专属指南"><a href="#23-5-4-语言专属指南" class="headerlink" title="23.5.4 语言专属指南"></a>23.5.4 语言专属指南</h3><p>Skill 还针对主流语言给出特化建议：</p><table><thead><tr><th>语言</th><th>核心建议</th></tr></thead><tbody><tr><td>Java</td><td>final 局部变量、IDE 自动重构、Records、Sealed Classes</td></tr><tr><td>TypeScript</td><td>解构减少参数、const 优先、Union Types 替代类型码、<code>?.</code> 消除 null 检查</td></tr><tr><td>Python</td><td>Type Hints、dataclasses、<code>@property</code>、Context Managers</td></tr><tr><td>Go</td><td>小接口、命名返回值、表格驱动测试、early returns 消除嵌套</td></tr><tr><td>Rust</td><td>Result&#x2F;Option 替代错误码和 null、Pattern Matching、From trait、Derive macros</td></tr></tbody></table><h3 id="23-5-5-在工作流中的位置"><a href="#23-5-5-在工作流中的位置" class="headerlink" title="23.5.5 在工作流中的位置"></a>23.5.5 在工作流中的位置</h3><p><code>/refactor</code> 不单干，它跟两个邻居配合，其中最重要的是下一节要单独讲的 <code>/smell</code>；另外 <code>/modern-go</code>（35+ 条 gofix 风格规则）跟它一样，都是用来保持代码库健康的工具。还有 <code>/review-it</code>——它的审查原则里写得很清楚：「Reject noise，拒绝不切实际的边界情况、投机性风险、过度重构」。这跟 <code>/refactor</code> 安全协议里「小修复优先」是一个意思——重构不是越多越好，闻到坏味道才动手。</p><h2 id="23-6-smell：先诊断，再开刀"><a href="#23-6-smell：先诊断，再开刀" class="headerlink" title="23.6 &#x2F;smell：先诊断，再开刀"></a>23.6 &#x2F;smell：先诊断，再开刀</h2><p><code>/refactor</code> 解决的是&quot;知道哪里该改、怎么改&quot;。但更常见的困境在前一步：面对一个 AI 攒出来的几万行代码库，你不知道该从哪下手。哪个模块烂得最厉害？是架构错了，还是只有某个函数太长？先动哪块？</p><p><code>/smell</code> 回答的就是这个。它跟 <code>/refactor</code> 同级，分工是：<code>/smell</code> 诊断，扫出代码库的病灶并排优先级；<code>/refactor</code> 治疗，照 Fowler 手法一处处修。一个出报告，一个动手术。</p><p>安装：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add smallnest/goal-workflow --skill smell</span><br></pre></td></tr></table></figure><p>触发同样可以直接打 <code>/smell</code>，或用自然语言：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">代码坏味道检测：找出代码坏味道</span><br><span class="line">架构审计：检测架构反模式</span><br><span class="line">复杂度扫描：分析代码复杂度</span><br></pre></td></tr></table></figure><h3 id="23-6-1-比-Fowler-更宽的视野：8-大类-50-坏味道"><a href="#23-6-1-比-Fowler-更宽的视野：8-大类-50-坏味道" class="headerlink" title="23.6.1 比 Fowler 更宽的视野：8 大类 50+ 坏味道"></a>23.6.1 比 Fowler 更宽的视野：8 大类 50+ 坏味道</h3><p>这里要留意 <code>/smell</code> 和 <code>/refactor</code> 在覆盖面上的区别。<code>/refactor</code> 盯的是 Fowler 那 22 种坏味道，基本都在函数和类这个尺度。<code>/smell</code> 往上抬了一层，把架构和复杂度也算进来，一共 8 大类、50+ 种：</p><table><thead><tr><th>类别</th><th>示例</th></tr></thead><tbody><tr><td>架构</td><td>大泥球、分布式单体、贫血模型、CQRS 滥用、层边界违反</td></tr><tr><td>耦合</td><td>循环依赖、内容耦合、公共耦合（全局状态）、印记耦合</td></tr><tr><td>内聚</td><td>上帝对象、霰弹式修改、依恋情结、数据泥团</td></tr><tr><td>设计</td><td>抽象泄露、静态粘连、服务定位器滥用、SOLID 违反</td></tr><tr><td>代码</td><td>重复代码、长方法、基本类型偏执、魔数、死代码</td></tr><tr><td>测试</td><td>零测试覆盖、测试-实现耦合、不稳定测试</td></tr><tr><td>命名</td><td>模糊命名、命名不一致</td></tr><tr><td>复杂度</td><td>嵌套循环 (O(n²))、N+1 查询、重复线性扫描、循环内排序、渲染重复计算</td></tr></tbody></table><p>最后两类，「测试」和「复杂度」，是 Fowler 的坏味道目录里没有的，而它们在 AI 时代恰好用得上。AI 生成的代码经常零测试覆盖，也经常埋着 N+1 查询、循环内排序这类一眼看不出、上了量才爆的性能坑。这些 <code>/smell</code> 能一并扫出来。</p><h3 id="23-6-2-输出：一份带优先级的重构路线图"><a href="#23-6-2-输出：一份带优先级的重构路线图" class="headerlink" title="23.6.2 输出：一份带优先级的重构路线图"></a>23.6.2 输出：一份带优先级的重构路线图</h3><p><code>/smell</code> 不只是列问题，它产出一份结构化的 Markdown 报告：</p><ul><li>执行摘要和整体健康评估</li><li>检测到的架构风格，对比它&quot;应该是&quot;的风格</li><li>按严重级别分类的发现：严重 &#x2F; 警告 &#x2F; 建议</li><li>依赖图分析和模块健康评分卡</li><li>8 大类坏味道的分布统计</li><li>一份重构路线图，分成「立即可做 &#x2F; 短期 &#x2F; 长期」</li></ul><p>最有价值的是最后那份路线图。它直接回答了开头那个问题：该先动哪块。你可以让它只跑「仅严重」模式做快速体检，也可以把范围缩到某个模块，或者只扫最近改动的文件。</p><h3 id="23-6-3-两个-Skill-怎么配合"><a href="#23-6-3-两个-Skill-怎么配合" class="headerlink" title="23.6.3 两个 Skill 怎么配合"></a>23.6.3 两个 Skill 怎么配合</h3><p><img src="/images/image-20260626100640873.png"></p><p>把 <code>/smell</code> 和 <code>/refactor</code> 串起来，就是一条完整的&quot;健康维护&quot;链路：</p><ol><li><strong><code>/smell</code> 出报告</strong>：定位病灶，排好优先级，知道先改哪、后改哪。</li><li><strong><code>/refactor</code> 逐条施工</strong>：针对报告里的具体坏味道，套 Fowler 手法，走五阶段安全协议，每步提交。</li><li>改完再跑一遍 <code>/smell</code>，看健康评分有没有真的涨上去。</li></ol><p>这正好呼应了 23.3 节那条铁律，「代码必须变干净」。<code>/smell</code> 的健康评分让&quot;变干净&quot;这件事从主观感受变成了可量化的前后对比：重构前一个分，重构后一个分，涨了才算没白干。</p><h2 id="23-7-小结"><a href="#23-7-小结" class="headerlink" title="23.7 小结"></a>23.7 小结</h2><p>重构的方法论二十年没怎么变：嗅坏味道、对着手法目录、小步施工、每步测试、不夹带功能。AI 时代变的只有一件事，把 Fowler 那本书从「人读的参考书」变成了「Agent 执行的 Skill」，再用安全协议把人最容易偷的懒，改成机器必须遵守的护栏。goal workflow 把这件事拆成两个 Skill：<code>/smell</code> 诊断，扫出整个代码库的病灶并排好优先级；<code>/refactor</code> 治疗，照着 Fowler 手法一处处修。先体检，再开刀，改完再体检，这就是 AI 时代维护代码库健康的闭环。</p><p>第 22 章用 UML 让你读懂 AI 写的代码，这一章用重构让你改好 AI 写的代码。读懂是前提，改好是落点。两件事合起来，才是「你可以外包思考，但不能外包理解」这句话在工程上真正站住脚的样子。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/refactoring-code-evolution-in-ai-era/</id>
    <link href="https://colobu.com/2026/06/28/refactoring-code-evolution-in-ai-era/"/>
    <published>2026-06-28T09:30:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>「Any fool can write code that a computer can understand. Good programmers write code that humans can understand.」<br>任何傻瓜都能写出计算机能看懂的代码。好程序员写的是人能看懂的代码。<br>—— Martin Fowler</p>
</blockquote>
<p>第 22 章解决了「人怎么读懂 AI 写的代码」，用 UML 把代码画成图。</p>
<p>读懂之后呢？你打开 AI 生成的代码，能跑，但是一团乱麻：一个方法三百行，一个类管了八件事，同样的逻辑复制了五遍。这时候怎么办？</p>
<p>重构。</p>
<p>这件事本身不新鲜，Martin Fowler 1999 年就把它写成了一本书。变的是执行者。以前是人对着那本书一处一处手动改，现在是 AI 对着同一本书的目录自动改，人退到后面审查 diff。</p>]]>
    </summary>
    <title>重构：AI 时代的代码进化</title>
    <updated>2026-06-28T06:46:22.016Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="UML" scheme="https://colobu.com/tags/UML/"/>
    <category term="架构图" scheme="https://colobu.com/tags/%E6%9E%B6%E6%9E%84%E5%9B%BE/"/>
    <content>
      <![CDATA[<blockquote><p>「A picture is worth a thousand words. A diagram is worth ten thousand lines of code.」<br>一图胜千言。一张图胜万行代码。</p></blockquote><p>第 13 章解决了一个问题：AI 写代码容易，读代码难。Understand-Anything 用知识图谱<strong>让 AI 理解现有代码</strong>。</p><p>反过来——代码写完了，作为人类<strong>你怎么理解它</strong>？毕竟，线上出了故障你还等着你背锅呢。</p><p>我前一段看到一句箴言：&quot;𝐲𝐨𝐮 𝐜𝐚𝐧 𝐨𝐮𝐭𝐬𝐨𝐮𝐫𝐜𝐞 𝐲𝐨𝐮𝐫 𝐭𝐡𝐢𝐧𝐤𝐢𝐧𝐠, 𝐛𝐮𝐭 𝐲𝐨𝐮 𝐜𝐚𝐧𝐧𝐨𝐭 𝐨𝐮𝐭𝐬𝐨𝐮𝐫𝐜𝐞 𝐲𝐨𝐮𝐫 𝐮𝐧𝐝𝐞𝐫𝐬𝐭𝐚𝐧𝐝𝐢𝐧𝐠&quot;， 翻译过来就是&quot;你可以外包你的思考(给AI),但是你不能外包你的理解&quot;。 这句话被 Andrej Karpathy 多次引用，以至于大家认为是他说的，其实是kache说的：</p><p><img src="/images/image-20260604094614868.png"></p><p>这句话非常有哲理。Dex Horthy 在 2025 AI Engineer 大会上独立提出了：&quot;Don&#39;t outsource the thinking&quot; &#x2F; &quot;AI cannot replace thinking, it can only amplify the thinking you have done.&quot;，但是今年你看， AI已经外包了我们的思考，你只需说出的你需求，智能体就能帮助你生生成你要的程序，但是 AI 没有办法帮我们理解啊。</p><p>我最近就遇到了这样的困惑：我通过goal workflow很快的实现了一个大模型训推任务智能诊断系统，全是AI帮我生成的，但是在联调的前一个星期，我心虚了。</p><p>因为我知道，联调和上线的时候，必然有一些问题，比如当时的设计有些模糊的地方，设计上有gap, 实现上也难免有bug。如果我对生成的代码不熟悉，联调的时候出故障我都不知道啥原因咋修复，可能当时还得重新捋代码才能慢慢找根因，太影响联调的同学了。未来上线以后出现问题，想快速修复就更不可能了。</p><p>所以我专门花了两天时间，建了几个卡片，就为了学习代码理解代码。</p><p>那我是通过什么方式去理解AI生成的代码的呢？</p><p>答案藏在一个用了二十多年的老工具里：UML。区别只有一点：以前的 UML 是人画给团队的，现在是 AI 画给你的。十四种图，从类结构到部署拓扑，从序列交互到状态变迁。AI 生成代码，AI 再画图解释代码——你读图就够了。</p><p>为此，我专门创建了一个Skill，用来生成UML的十四种代码和架构图、流程图以及泳道图。此skill的介绍：<a href="https://goal.rpcx.io/index_cn.html#step-diagram%EF%BC%8C">https://goal.rpcx.io/index_cn.html#step-diagram，</a> 也集成到了goal workflow套件中了。</p><p>本章分两部分：第一部分过一遍 UML 十四种正式图形，外加三种 UML 规范没有但实际很常用的图。第二部分介绍 insight-diagram——一个在 goal.rpcx.io 上发布的 Skill，给任意代码库自动生成全套 UML 图、架构图和流程图。</p><span id="more"></span><h2 id="14-1-UML-简史：从三剑客到-OMG-标准"><a href="#14-1-UML-简史：从三剑客到-OMG-标准" class="headerlink" title="14.1 UML 简史：从三剑客到 OMG 标准"></a>14.1 UML 简史：从三剑客到 OMG 标准</h2><p>1994 年，Grady Booch 和 Jim Rumbaugh 在 Rational Software 相遇。Booch 有他的 Booch Method，Rumbaugh 有他的 OMT（Object Modeling Technique）。两种方法符号体系不同，画出来的图互不认识。</p><p>1995 年，Ivar Jacobson 加入，带来他的 OOSE（Object-Oriented Software Engineering）方法。三人被称为「三剑客」（Three Amigos），目标：统一面向对象建模的符号体系，让所有软件工程师用同一套语言画图。</p><p>1997 年，OMG（Object Management Group）采纳 UML 1.0。2005 年，UML 2.0 图形种类从 9 种扩展到 13 种。最新版本 UML 2.5.1（2017 年）定义了 14 种图，分为两大类：</p><ul><li><strong>结构性图形（Structure Diagrams）</strong>：描述系统的静态结构——有哪些组件、怎么组织的。</li><li><strong>行为性图形（Behavior Diagrams）</strong>：描述系统的动态行为——怎么运行、怎么交互。</li></ul><p>AI 时代之前，UML 的命运比较尴尬。敏捷宣言之后，很多人觉得「重文档轻代码」不靠谱，UML 跟着被冷落了。但有一个事实没变：代码由 AI 大量生成之后，人类比以往更需要可视化理解工具。UML 重新有了用武之地——角色从「先画图再写代码」的前置仪式，变成了「AI 写代码，你读图」的后置理解工具。</p><h2 id="14-2-结构性图形（Structure-Diagrams）：系统长什么样"><a href="#14-2-结构性图形（Structure-Diagrams）：系统长什么样" class="headerlink" title="14.2 结构性图形（Structure Diagrams）：系统长什么样"></a>14.2 结构性图形（Structure Diagrams）：系统长什么样</h2><p>结构性图形回答「系统由什么组成」——类、对象、组件、包、部署节点。它们是系统的静态 X 光片。</p><h3 id="14-2-1-类图（Class-Diagram）"><a href="#14-2-1-类图（Class-Diagram）" class="headerlink" title="14.2.1 类图（Class Diagram）"></a>14.2.1 类图（Class Diagram）</h3><p>最常用的 UML 图。展示系统中的类、接口、协作以及它们之间的关系。</p><p><strong>画什么：</strong></p><ul><li>类名、属性、方法——每个类一个矩形框，分成三格</li><li>关系类型：泛化（继承，空心三角箭头）、实现（虚线空心三角）、关联（实线）、聚合（空心菱形，整体-部分弱关系）、组合（实心菱形，整体-部分强关系，同生命周期）、依赖（虚线箭头）</li></ul><p><strong>什么时候用：</strong> 看项目的领域模型。agent-wrapper 项目的 <code>Agent</code>、<code>Task</code>、<code>Tool</code>、<code>Message</code> 等核心类型及其继承和组合关系。</p><p><strong>AI 时代的价值：</strong> AI 生成 50 个类之后，类图让你一眼看清谁继承了谁、谁组合了谁——不用在 50 个文件之间反复横跳。</p><h3 id="14-2-2-对象图（Object-Diagram）"><a href="#14-2-2-对象图（Object-Diagram）" class="headerlink" title="14.2.2 对象图（Object Diagram）"></a>14.2.2 对象图（Object Diagram）</h3><p>类图的运行时快照。展示特定时刻的对象实例及其属性值和链接关系。</p><p><strong>画什么：</strong></p><ul><li>对象名:类名（加下划线标注）、属性的具体值、实例间的链接</li><li>比如 <code>agent1: Agent { name=&quot;code-generator&quot;, model=&quot;claude-4&quot; }</code> 连接到 <code>task42: Task { status=&quot;running&quot; }</code></li></ul><p><strong>什么时候用：</strong> 调试时的内存快照。复杂对象图在某个时刻的状态——帮助看清递归结构、循环引用、单例模式的具体实例分布。</p><h3 id="14-2-3-组件图（Component-Diagram）"><a href="#14-2-3-组件图（Component-Diagram）" class="headerlink" title="14.2.3 组件图（Component Diagram）"></a>14.2.3 组件图（Component Diagram）</h3><p>比类图高一层——展示软件架构中可替换的模块化组件及其接口。</p><p><strong>画什么：</strong></p><ul><li>组件（矩形，带 <code>&lt;&lt;component&gt;&gt;</code> 标识）、提供的接口（棒棒糖符号）、需要的接口（插座符号）</li><li>组件间通过接口的依赖关系</li></ul><p><strong>什么时候用：</strong> 理解微服务架构或模块化系统中组件之间的契约关系。agent-wrapper 中 <code>LLM Provider</code> 组件提供 <code>chat()</code> 接口，<code>Agent Runtime</code> 组件消费这个接口。</p><h3 id="14-2-4-部署图（Deployment-Diagram）"><a href="#14-2-4-部署图（Deployment-Diagram）" class="headerlink" title="14.2.4 部署图（Deployment Diagram）"></a>14.2.4 部署图（Deployment Diagram）</h3><p>把软件映射到硬件。展示运行时处理节点及驻留在节点上的构件。</p><p><strong>画什么：</strong></p><ul><li>节点（三维立方体）：服务器、容器、设备</li><li>构件（矩形）：部署在节点上的软件模块</li><li>通信路径：节点间的网络连接，可标注协议（HTTP&#x2F;REST、gRPC、消息队列）</li></ul><p><strong>什么时候用：</strong> 理解生产环境的物理拓扑。agent-wrapper 的部署：User&#39;s Machine 节点运行 CLI，Cloud VM 节点运行 Agent Runtime，外部节点 Anthropic API。</p><h3 id="14-2-5-包图（Package-Diagram）"><a href="#14-2-5-包图（Package-Diagram）" class="headerlink" title="14.2.5 包图（Package Diagram）"></a>14.2.5 包图（Package Diagram）</h3><p>按逻辑分组组织模型元素。包可以嵌套，包之间有依赖和导入关系。</p><p><strong>画什么：</strong></p><ul><li>包（文件夹图标或带标签的矩形框）、包间的依赖箭头、包的嵌套层次</li><li>体现分层架构：<code>domain/</code> → <code>application/</code> → <code>infrastructure/</code> → <code>presentation/</code></li></ul><p><strong>什么时候用：</strong> 大项目的模块组织概览。agent-wrapper 中 <code>core/</code> 包、<code>tools/</code> 包、<code>plugins/</code> 包、<code>cli/</code> 包的依赖方向。</p><h3 id="14-2-6-复合结构图（Composite-Structure-Diagram）"><a href="#14-2-6-复合结构图（Composite-Structure-Diagram）" class="headerlink" title="14.2.6 复合结构图（Composite Structure Diagram）"></a>14.2.6 复合结构图（Composite Structure Diagram）</h3><p>深入一个类的内部。展示类的部件（Part）、端口（Port）、连接器（Connector）以及它们之间的协作。</p><p><strong>画什么：</strong></p><ul><li>部件（类内部的组件实例）、端口（小方块，部件与外界的交互点）、连接器（部件间的连线）</li><li>比类图更微观——类图展示「哪些类」，复合结构图展示「这个类内部由哪些部分构成」</li></ul><p><strong>什么时候用：</strong> 理解复杂模式（如 Observer、Visitor）的运行时内部结构。agent-wrapper 中 <code>AgentLoop</code> 类的内部：<code>Planner</code> 部件 → <code>Executor</code> 部件 → <code>Verifier</code> 部件，通过端口相互连接。</p><h3 id="14-2-7-剖面图（Profile-Diagram）"><a href="#14-2-7-剖面图（Profile-Diagram）" class="headerlink" title="14.2.7 剖面图（Profile Diagram）"></a>14.2.7 剖面图（Profile Diagram）</h3><p>UML 的扩展机制。定义特定领域或平台的方言——自定义构造型（Stereotype）、标签值（Tagged Value）、约束（Constraint）。</p><p><strong>画什么：</strong></p><ul><li><code>&lt;&lt;stereotype&gt;&gt;</code> 定义、用构造型标注的元类扩展</li><li>比如定义一个 <code>&lt;&lt;microservice&gt;&gt;</code> 构造型，标注 <code>language</code>、<code>port</code>、<code>healthCheck</code> 等标签值</li></ul><p><strong>什么时候用：</strong> 当 UML 需要说团队自己的术语时。agent-wrapper 项目可以定义 <code>&lt;&lt;skill&gt;&gt;</code>、<code>&lt;&lt;tool&gt;&gt;</code>、<code>&lt;&lt;hook&gt;&gt;</code> 等自定义构造型。</p><h2 id="14-3-行为性图形（Behavior-Diagrams）：系统怎么运行"><a href="#14-3-行为性图形（Behavior-Diagrams）：系统怎么运行" class="headerlink" title="14.3 行为性图形（Behavior Diagrams）：系统怎么运行"></a>14.3 行为性图形（Behavior Diagrams）：系统怎么运行</h2><p>行为性图形回答「系统怎么工作」——流程、交互、状态变迁。它们是系统的动态录像。</p><h3 id="14-3-1-用例图（Use-Case-Diagram）"><a href="#14-3-1-用例图（Use-Case-Diagram）" class="headerlink" title="14.3.1 用例图（Use Case Diagram）"></a>14.3.1 用例图（Use Case Diagram）</h3><p>从用户视角展示系统能做什么。外行最容易看懂的 UML 图。</p><p><strong>画什么：</strong></p><ul><li>参与者（火柴人图标）：人、外部系统、定时器</li><li>用例（椭圆）：系统提供的功能</li><li>关系：<code>&lt;&lt;include&gt;&gt;</code>（必须包含）、<code>&lt;&lt;extend&gt;&gt;</code>（可选扩展）、泛化（参与者或用例的继承）</li></ul><p><strong>什么时候用：</strong> 和产品经理对齐需求。agent-wrapper 的用例：用户 → 「创建 Agent」、用户 → 「配置 Skill」、用户 → 「启动自主循环」、外部 API → 「响应 Tool Call」。</p><h3 id="14-3-2-活动图（Activity-Diagram）"><a href="#14-3-2-活动图（Activity-Diagram）" class="headerlink" title="14.3.2 活动图（Activity Diagram）"></a>14.3.2 活动图（Activity Diagram）</h3><p>增强版流程图。展示从活动到活动的控制流，支持并发分支和合并。</p><p><strong>画什么：</strong></p><ul><li>活动节点（圆角矩形）、决策节点（菱形）、fork&#x2F;join（粗横线）、泳道（可选）</li><li>开始节点（实心圆）→ 活动序列 → 结束节点（实心圆+外圈）</li></ul><p><strong>什么时候用：</strong> 描述一个流程的多分支执行路径。agent-wrapper 中 Goal 命令的执行流程：解析 Goal → 生成 Plan → fork（并行执行 Sub-goals）→ join（汇总结果）→ 验证 → 输出。</p><h3 id="14-3-3-状态机图（State-Machine-Diagram）"><a href="#14-3-3-状态机图（State-Machine-Diagram）" class="headerlink" title="14.3.3 状态机图（State Machine Diagram）"></a>14.3.3 状态机图（State Machine Diagram）</h3><p>跟踪一个对象从生到死的完整生命周期——中间经历了哪些状态，什么事件触发了状态变迁。</p><p><strong>画什么：</strong></p><ul><li>状态（圆角矩形，可包含 entry&#x2F;do&#x2F;exit 动作）、转移（箭头上标注「事件[守卫]&#x2F;动作」）</li><li>初始伪状态（实心圆）、终止状态（实心圆+外圈）</li></ul><p><strong>什么时候用：</strong> 理解有复杂生命周期的对象。agent-wrapper 中 <code>Task</code> 对象的状态机：pending → queued → running → (completed | failed | cancelled)，每个转移上标注触发事件。</p><h3 id="14-3-4-序列图（Sequence-Diagram）"><a href="#14-3-4-序列图（Sequence-Diagram）" class="headerlink" title="14.3.4 序列图（Sequence Diagram）"></a>14.3.4 序列图（Sequence Diagram）</h3><p>最常用的交互图。按时间顺序展示对象间的消息交换——谁先调谁、传什么参数、返回什么。</p><p><strong>画什么：</strong></p><ul><li>生命线（纵向虚线，代表对象的时间线）、激活条（生命线上的矩形，代表对象正在执行）</li><li>消息（水平箭头）：同步调用（实心箭头）、异步消息（开放箭头）、返回（虚线箭头）</li></ul><p><strong>什么时候用：</strong> 理解一个具体场景的完整调用链。agent-wrapper 中「创建并运行一个 Agent」的完整交互序列：CLI → AgentFactory.create() → Agent.run() → LLMProvider.chat() → ToolRegistry.execute() → 返回结果 → CLI 输出。</p><h3 id="14-3-5-通信图（Communication-Diagram）"><a href="#14-3-5-通信图（Communication-Diagram）" class="headerlink" title="14.3.5 通信图（Communication Diagram）"></a>14.3.5 通信图（Communication Diagram）</h3><p>和序列图共享同一批信息，视角不同。序列图强调时间顺序（从上到下），通信图强调对象间的组织关系（空间布局）。</p><p><strong>画什么：</strong></p><ul><li>对象（矩形节点）、链接（对象间的连线）、消息（连线上标注序号和箭头方向）</li><li>消息编号（1, 2, 3...）表示时间顺序，嵌套用 1.1, 1.2...</li></ul><p><strong>什么时候用：</strong> 关注「在某个时刻，哪些对象在互相通信」时——对象间的链接结构成为重点，时间线退居次要。</p><h3 id="14-3-6-定时图（Timing-Diagram）"><a href="#14-3-6-定时图（Timing-Diagram）" class="headerlink" title="14.3.6 定时图（Timing Diagram）"></a>14.3.6 定时图（Timing Diagram）</h3><p>展示对象状态随时间的变化曲线，含精确的时间约束。</p><p><strong>画什么：</strong></p><ul><li>时间轴（横向，精确刻度）、状态线（折线，展示每个对象的状态变化）、持续时间约束 <code>{duration &lt; 500ms}</code></li><li>适合实时系统、嵌入式系统和性能关键路径</li></ul><p><strong>什么时候用：</strong> 性能分析和实时约束验证。agent-wrapper 中 Tool Call 的超时机制：<code>execute_tool()</code> 必须在 30s 内完成，否则触发重试——定时图展示这四个阶段的时间约束。</p><h3 id="14-3-7-交互概览图（Interaction-Overview-Diagram）"><a href="#14-3-7-交互概览图（Interaction-Overview-Diagram）" class="headerlink" title="14.3.7 交互概览图（Interaction Overview Diagram）"></a>14.3.7 交互概览图（Interaction Overview Diagram）</h3><p>活动图和序列图的混合体。用活动图的控制流框架，每个节点可以嵌入一个交互片段（序列图、通信图、定时图或其他交互概览图）。</p><p><strong>画什么：</strong></p><ul><li>框架是活动图（决策节点、fork&#x2F;join、开始&#x2F;结束）</li><li>节点内部嵌入 <code>sd</code>（序列图）等交互片段</li></ul><p><strong>什么时候用：</strong> 复杂流程的宏观概览——不展示每次函数调用的细节，而是展示「这个流程分几大阶段，每个阶段内部发生了什么交互」。agent-wrapper 完整运行流程：初始化（序列图）→ 规划（序列图）→ 执行循环（交互概览图）→ 完成（序列图）。</p><h2 id="14-4-超越-UML：三种实用的非-UML-图"><a href="#14-4-超越-UML：三种实用的非-UML-图" class="headerlink" title="14.4 超越 UML：三种实用的非 UML 图"></a>14.4 超越 UML：三种实用的非 UML 图</h2><p>上面 14 种是 UML 2.5 标准定义的。真实软件工程中，有三种图不在 UML 规范里，但使用频率比很多 UML 图更高。</p><h3 id="14-4-1-系统架构图（Architecture-Diagram）"><a href="#14-4-1-系统架构图（Architecture-Diagram）" class="headerlink" title="14.4.1 系统架构图（Architecture Diagram）"></a>14.4.1 系统架构图（Architecture Diagram）</h3><p>比组件图更自由。展示系统的顶层组件、外部依赖以及数据流方向。不遵守 UML 严格的符号约束——方块、圆圈、数据库图标、云图标都可以用，含义清晰即可。</p><p><strong>什么时候用：</strong> 任何项目的第一个图。项目经理、新成员、外部评审者——所有人都从架构图开始理解系统。</p><h3 id="14-4-2-流程图（Flowchart）"><a href="#14-4-2-流程图（Flowchart）" class="headerlink" title="14.4.2 流程图（Flowchart）"></a>14.4.2 流程图（Flowchart）</h3><p>比活动图更简单。没有 fork&#x2F;join 的并发语义，没有泳道的组织维度——只有开始、结束、处理步骤、判断分支。它就是画在白板上的那种图。</p><p><strong>什么时候用：</strong> 描述算法逻辑、业务流程或决策树。不追求 UML 的完备语义，追求最大可读性。</p><h3 id="14-4-3-泳道图（Swimlane-Diagram）"><a href="#14-4-3-泳道图（Swimlane-Diagram）" class="headerlink" title="14.4.3 泳道图（Swimlane Diagram）"></a>14.4.3 泳道图（Swimlane Diagram）</h3><p>流程图 + 角色分工。把流程步骤按「谁负责」分配到不同的泳道里，跨泳道的箭头表示交互和交接。</p><p><strong>什么时候用：</strong> 跨团队协作流程。agent-wrapper 中用户、Agent Runtime、LLM Provider、Tool Registry 四个泳道的完整交互流程。</p><h2 id="14-5-UML-在-AI-时代的三个用途"><a href="#14-5-UML-在-AI-时代的三个用途" class="headerlink" title="14.5 UML 在 AI 时代的三个用途"></a>14.5 UML 在 AI 时代的三个用途</h2><p>AI 生成代码之后，UML 的角色从「前置设计工具」变成了「后置理解工具」。三个具体用途：</p><p><strong>用途一：代码理解的可视化层。</strong> 第 13 章的 Understand-Anything 产出知识图谱——文件、函数、类的节点和边。UML 把这些节点组织成有意义的模式——类图把散落的类型组织成领域模型，序列图把函数调用链组织成交互故事。知识图谱是原材料，UML 是成品。</p><p><strong>用途二：AI 生成代码的质量验证。</strong> AI 生成了 2000 行代码。你怎么知道架构没被写烂？生成一张类图——继承链有没有循环引用一目了然。生成一张包图——依赖方向有没有违反 Clean Architecture 的箭头规则。UML 就是 AI 代码的架构 X 光。</p><p><strong>用途三：团队沟通的通用语言。</strong> 不同的人看同一段 AI 代码，脑子里画的图可能完全不一样。UML 给了一套标准化的可视化符号，所有人坐下来看同一张图，对「这段代码长什么样」的理解不会差太远。</p><h2 id="14-6-insight-diagram：一键生成全套-UML-图的-Skill"><a href="#14-6-insight-diagram：一键生成全套-UML-图的-Skill" class="headerlink" title="14.6 insight-diagram：一键生成全套 UML 图的 Skill"></a>14.6 insight-diagram：一键生成全套 UML 图的 Skill</h2><p>前面聊了 17 种图。一个中等规模的项目，手工画完，单位是天。</p><p>insight-diagram 在 <a href="https://goal.rpcx.io/index_cn.html#step-diagram">goal.rpcx.io</a> 上发布，给任意代码库自动生成全套 UML 图、架构图和流程图。不需要你懂 UML——告诉它项目在哪，它分析代码库、让你选图表类型，然后一张张生成。</p><p><img src="/images/image-20260604090531683.png"></p><h3 id="14-6-1-核心理念：代码分析-→-图表选择-→-逐个生成"><a href="#14-6-1-核心理念：代码分析-→-图表选择-→-逐个生成" class="headerlink" title="14.6.1 核心理念：代码分析 → 图表选择 → 逐个生成"></a>14.6.1 核心理念：代码分析 → 图表选择 → 逐个生成</h3><p>四个步骤：</p><p><strong>步骤 1 — 分析代码库。</strong> Skill 读取项目的 <code>CLAUDE.md</code>（项目概览）、各子目录的 <code>CLAUDE.md</code>（模块细节），用 Glob 扫描源码文件结构，用 Grep 搜索关键模式（接口定义、函数签名、依赖注入）。提炼出组件清单、依赖关系图、核心类型、业务流程和部署拓扑。</p><p><strong>步骤 2 — 选择图表。</strong> 多选菜单，17 种图表分四组展示：结构性图形（类图、对象图、组件图、部署图、包图、复合结构图、剖面图）、行为性图形（用例图、活动图、状态机图）、交互图（序列图、通信图、定时图、交互概览图）、实用非 UML（系统架构图、流程图、泳道图）。默认推荐：architecture + sequence + flowchart。</p><p><strong>步骤 3 — 逐个生成。</strong> 每个图表的生成流程：</p><ol><li><strong>先读示例。</strong> Skill 内置 13 个示例 HTML 文件，每种图表类型一个。生成前从示例中提取布局策略（节点间距、分组方式、箭头走向）、节点样式层级（核心节点高亮、普通节点实线边框、可选节点虚线边框）、标注风格（阶段标签、Legend 图例、卡片摘要）和信息密度。</li><li><strong>整理元素和关系。</strong> 根据步骤 1 的分析结果，确定元素和关系。类图：10-15 个核心类型。序列图：2-5 个核心交互场景。每个图有明确关注重点，不追求全量覆盖。</li><li><strong>调用 architecture-diagram skill 渲染。</strong> 使用 Anthropic Claude 视觉风格（暖白背景 <code>#FAF9F6</code>、terracotta&#x2F;sage&#x2F;plum&#x2F;rose 配色、Inter 字体），输出 HTML+SVG。所有元素不得遮盖——箭头在节点下方、间距充足（垂直 ≥40px，水平 ≥30px）、文字不溢出。元素过多则拆分子图或缩小元素。</li><li><strong>保存到 <code>docs/</code> 目录。</strong> 文件命名如 <code>docs/architecture.html</code>、<code>docs/class.html</code>、<code>docs/sequence.html</code>。</li></ol><p><strong>步骤 4 — 报告。</strong> 全部生成完成后输出文件列表和每张图的简要描述。</p><h3 id="14-6-2-图表生成顺序：从宏观到微观"><a href="#14-6-2-图表生成顺序：从宏观到微观" class="headerlink" title="14.6.2 图表生成顺序：从宏观到微观"></a>14.6.2 图表生成顺序：从宏观到微观</h3><p>生成顺序是固定的，不是随机的：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">architecture → component → deployment → package → composite-structure →</span><br><span class="line">profile → class → object → usecase → flowchart → activity → state-machine →</span><br><span class="line">swimlane → sequence → communication → timing → interaction-overview</span><br></pre></td></tr></table></figure><p>从架构图开始，逐步深入到组件、部署、包结构、类的内部结构，再到行为层面的用例、流程、状态、交互。每一步都踩在上一步提取的信息上——生成类图的时候，架构图和组件图已经把系统的主要模块和边界画出来了。</p><h3 id="14-6-3-关键设计决策"><a href="#14-6-3-关键设计决策" class="headerlink" title="14.6.3 关键设计决策"></a>14.6.3 关键设计决策</h3><p><strong>示例驱动，而非提示词驱动。</strong> Skill 不给 LLM 一段「画类图的提示词」——给示例 HTML 文件。LLM 从示例中提取布局模式、色彩方案、节点样式，用自己的内容替换。LLM 做「模仿已有模板然后替换内容」这件事远比做「根据纯文本描述从零生成视觉设计」靠谱。</p><p><strong>专用渲染 Skill 分离。</strong> insight-diagram 不做渲染——它调用 <code>/architecture-diagram</code>（另一个 Skill）生成 HTML+SVG。职责分离：insight-diagram 负责「分析代码、选择图表、整理元素」，architecture-diagram 负责「把元素渲染为 HTML+SVG」。这是 Skill 系统中的组合模式——一个 Skill 依赖另一个 Skill。</p><p><strong>防遮盖规则。</strong> SVG 元素不得互相遮盖。箭头绘制在节点下方（SVG 中先画箭头再画节点）。节点间最小间距 40px（垂直）、30px（水平）。文字不超出节点边界——超长截断或换行。这些规则在生成时强制检查，确保产出图表可直接用于文档和演示，跳过人工微调步骤。</p><p><strong>语言无关。</strong> 支持 Go、Python、TypeScript、Java、Rust 等主流语言。分析代码库使用 Glob + Grep + Read——不依赖语言特定解析器，对所有语言有基本覆盖。需要精确提取「所有类和它们的方法签名」的类图时，建议与 Understand-Anything（第 13 章）组合使用——Understand-Anything 提供精确的结构数据，insight-diagram 负责可视化。</p><h3 id="14-6-4-与-Understand-Anything-的配合"><a href="#14-6-4-与-Understand-Anything-的配合" class="headerlink" title="14.6.4 与 Understand-Anything 的配合"></a>14.6.4 与 Understand-Anything 的配合</h3><p>第 13 章和本章是互补关系：</p><table><thead><tr><th>维度</th><th>Understand-Anything</th><th>insight-diagram</th></tr></thead><tbody><tr><td>产出</td><td>知识图谱（JSON）</td><td>UML&#x2F;架构&#x2F;流程 图（HTML+SVG）</td></tr><tr><td>精度</td><td>确定性（Tree-sitter 解析）</td><td>LLM 推断（基于代码阅读）</td></tr><tr><td>用途</td><td>Agent 查询、影响分析、导航</td><td>人类阅读、文档、演示</td></tr><tr><td>目标读者</td><td>AI Agent</td><td>人类团队</td></tr><tr><td>更新方式</td><td>增量（commit hook 触发）</td><td>按需（手动触发重新生成）</td></tr></tbody></table><p>最佳实践：Understand-Anything 产出的知识图谱提供精确的组件清单和依赖关系，insight-diagram 把信息可视化为标准 UML 图形。确定性的结构数据 + LLM 的视觉表达——和 Understand-Anything 的 Tree-sitter + LLM 混合架构是同一设计哲学。</p><h3 id="14-6-5-在-agent-wrapper-上实战"><a href="#14-6-5-在-agent-wrapper-上实战" class="headerlink" title="14.6.5 在 agent-wrapper 上实战"></a>14.6.5 在 agent-wrapper 上实战</h3><p>实际上只生成了架构图、流程图和几个UML图就已经可以充分理解AI生成的代码了，这里我生成了所有的图片，主要是为了让你了解生成的各个图形的效果 。我更多会看架构图、流程图、类图、序列图、泳道图等。</p><p>有些生成的图形连线有些错误，图形有些重叠，你可以给智能体指出错误，让它修复，生成完美的图形。下面有些图生成的不是很完美，我也贴出来了，没有进一步优化。</p><p>agent-wrapper（<code>/Users/smallnest/ai/agent-wrapper</code>）是 Go 语言实现的 AI Agent 包装框架，核心功能包括 Agent 生命周期管理、Skill 注册与调度、Tool 调用链、LLM Provider 抽象和多轮对话状态机。项目包含 20+ 个 Go 源文件，分布在 <code>core/</code>、<code>tools/</code>、<code>plugins/</code>、<code>cli/</code> 等包中。</p><p>使用 insight-diagram 生成全套图表的过程：</p><ol><li><strong>调用 Skill。</strong> <code>/insight-diagram</code>，Skill 读取 <code>CLAUDE.md</code>、扫描源码结构、提取组件和接口。</li><li><strong>选择图表。</strong> 默认推荐三张图（architecture + sequence + flowchart），覆盖「系统怎么组织的、关键交互怎么发生、主流程怎么走」。</li><li><strong>逐个生成。</strong> Skill 依次读取对应示例、整理元素、调用 architecture-diagram 渲染、保存到 <code>docs/</code>。</li><li><strong>人工补充。</strong> 生成的图表作为基础版本，微调后补充到项目文档。</li></ol><h4 id="agent-wrapper-系统架构图（Architecture-Diagram）"><a href="#agent-wrapper-系统架构图（Architecture-Diagram）" class="headerlink" title="agent-wrapper 系统架构图（Architecture Diagram）"></a>agent-wrapper 系统架构图（Architecture Diagram）</h4><p><img src="/images/image-20260604091042656.png"></p><p>这张图把 agent-wrapper 的顶层结构摊开了。上边调用方（Go 代码或 CLI），中间是核心——Registry 管理 8 个 Provider、Orchestrator 驱动多轮对话循环、process 包管理子进程生命周期。下边 8 个 Agent CLI 进程（claude、codex、pi、opencode 等），每个独立子进程，通过 stdin&#x2F;stdout 与 wrapper 通信。</p><h4 id="agent-wrapper-类图（Class-Diagram）"><a href="#agent-wrapper-类图（Class-Diagram）" class="headerlink" title="agent-wrapper 类图（Class Diagram）"></a>agent-wrapper 类图（Class Diagram）</h4><p><img src="/images/image-20260604093527716.png"></p><p>五个核心类型。<code>Agent</code> 是顶层接口，只有 <code>Run()</code> — 接收 <code>RunInput</code>，输出 <code>&lt;-chan Event</code>。<code>Orchestrator</code> 持有 <code>Agent</code>，加 <code>ApprovalHandler</code>、<code>BudgetHandler</code>、<code>ContextCompressor</code> 三个钩子。<code>Registry</code> 用 <code>sync.RWMutex</code> 保护 map。<code>RunInput</code> 的 <code>SessionID</code>、<code>MaxTurns</code>、<code>OutputFormat</code> 决定每次调用的行为。<code>Event</code> 五种类型（TextDelta&#x2F;ToolCall&#x2F;ToolResult&#x2F;TurnEnd&#x2F;Error）覆盖 agent CLI 的所有输出。</p><h4 id="agent-wrapper-对象图（Object-Diagram）"><a href="#agent-wrapper-对象图（Object-Diagram）" class="headerlink" title="agent-wrapper 对象图（Object Diagram）"></a>agent-wrapper 对象图（Object Diagram）</h4><p><img src="/images/image-20260604094235636.png"></p><p>「用 Claude Code provider 创建并运行一个 Agent」那一瞬间的内存快照。<code>Registry</code> 里注册了 8 个 provider，<code>Get(&quot;claude-code&quot;)</code> 返回 <code>ClaudeCodeAgent</code> 实例。<code>Orchestrator</code> 持有这个 agent，默认 <code>ChainedCompressor</code>（SlidingWindow + Summary），3 次重试。<code>RunInput</code> 带着 prompt &quot;重构这个文件&quot;、<code>MaxTurns=10</code>、<code>OutputFormat=stream</code>。</p><h4 id="agent-wrapper-组件图（Component-Diagram）"><a href="#agent-wrapper-组件图（Component-Diagram）" class="headerlink" title="agent-wrapper 组件图（Component Diagram）"></a>agent-wrapper 组件图（Component Diagram）</h4><p><img src="/images/image-20260604095935699.png"></p><p>组件之间的契约关系。<code>Registry</code> 对外提供 <code>Register(name, Factory)</code> 和 <code>Get(name) Agent</code> 两个接口（棒棒糖），各 provider 包作为组件注册进来。<code>Orchestrator</code> 消费 <code>Agent</code> 接口，同时插 <code>ApprovalHandler</code> 和 <code>BudgetHandler</code> 两个插座。底层 <code>process.AgentProcess</code> 封装 <code>os/exec.Cmd</code>，提供 stdin&#x2F;stdout&#x2F;stderr 管道和优雅关闭（SIGTERM → 5s → SIGKILL）。</p><h4 id="agent-wrapper-部署图（Deployment-Diagram）"><a href="#agent-wrapper-部署图（Deployment-Diagram）" class="headerlink" title="agent-wrapper 部署图（Deployment Diagram）"></a>agent-wrapper 部署图（Deployment Diagram）</h4><p><img src="/images/image-20260604100230653.png"></p><p>代码到物理节点的映射。用户机器运行 CLI（<code>cmd/agent-wrapper</code> 二进制）， 运行 <code>Orchestrator.Run()</code>，启动 claude&#x2F;codex 等子进程。外部节点三个：Anthropic API（claude 后端）、OpenAI API（codex 后端）、Moonshot API（kimi-code 后端）。CLI → Orchestrator 是本地函数调用，Orchestrator → Agent CLI 是子进程 stdio，Agent CLI → 外部 API 是 HTTPS。</p><h4 id="agent-wrapper-包图（Package-Diagram）"><a href="#agent-wrapper-包图（Package-Diagram）" class="headerlink" title="agent-wrapper 包图（Package Diagram）"></a>agent-wrapper 包图（Package Diagram）</h4><p><img src="/images/image-20260604100303916.png"></p><p>顶层 <code>agentwrapper</code> 包入口，依赖 <code>types</code>、<code>harness</code>、<code>process</code>。<code>types/</code> 在最底层——<code>Agent</code> 接口、<code>Event</code>、<code>Message</code>、<code>RunInput</code>，所有其他包都依赖它。<code>harness/</code> 提供可插拔组件：<code>ApprovalHandler</code>、<code>BudgetHandler</code>、<code>ContextCompressor</code>。<code>process/</code> 封装子进程管理。<code>provider/</code> 是独立子树——八个包各自实现 <code>Agent</code> 接口。箭头方向符合 Clean Architecture：外层依赖内层，内层不依赖外层。</p><h4 id="agent-wrapper-复合结构图（Composite-Structure-Diagram）"><a href="#agent-wrapper-复合结构图（Composite-Structure-Diagram）" class="headerlink" title="agent-wrapper 复合结构图（Composite Structure Diagram）"></a>agent-wrapper 复合结构图（Composite Structure Diagram）</h4><p><img src="/images/image-20260604100505711.png"></p><p><code>Orchestrator</code> 的内部结构。四个 Parts：<code>Agent</code>（子进程驱动）、<code>ApprovalHandler</code>（工具审批）、<code>BudgetHandler</code>（token 预算）、<code>ContextCompressor</code>（上下文压缩重试）。<code>Run()</code> 通过 <code>runAgentWithRetry()</code> 端口调 Agent，Event Channel 经审批和预算检查后从 <code>out</code> 端口输出。关键：<code>agent.Run</code> 失败 → <code>IsContextLengthExceeded(err)</code> → <code>compressor.Compress()</code> → 重试最多 <code>maxRetries</code> 次（默认 3）。</p><h4 id="agent-wrapper-剖面图（Profile-Diagram）"><a href="#agent-wrapper-剖面图（Profile-Diagram）" class="headerlink" title="agent-wrapper 剖面图（Profile Diagram）"></a>agent-wrapper 剖面图（Profile Diagram）</h4><p><img src="/images/image-20260604101714963.png"></p><p>为 agent-wrapper 定义的三个自定义 Stereotype。<code>&lt;&lt;Provider&gt;&gt;</code>——实现 Agent 接口的子进程驱动类，含 <code>binary</code>、<code>protocol</code> 标签值。<code>&lt;&lt;Handler&gt;&gt;</code>——可插拔运行时钩子，含 <code>hook_point</code>、<code>is_async</code> 标签。<code>&lt;&lt;Event&gt;&gt;</code>——统一事件类型，含 <code>direction</code> 标签。在 <code>agent.go</code> 里写 <code>// @stereotype Provider binary=claude protocol=stream-json</code>，生成类图时自动识别特殊样式。</p><h4 id="agent-wrapper-流程图（Flowchart）"><a href="#agent-wrapper-流程图（Flowchart）" class="headerlink" title="agent-wrapper 流程图（Flowchart）"></a>agent-wrapper 流程图（Flowchart）</h4><p><img src="/images/image-20260604102024902.png"></p><p>从输入到输出的完整决策树。<code>Registry.Get(provider)</code> → 查表 → 未找到返回 <code>ErrNotRegistered</code>。找到则创建 Agent → <code>NewOrchestrator</code> 配 Approval&#x2F;Budget&#x2F;Compressor&#x2F;Retries。<code>orch.Run()</code> → 校验 prompt → <code>runAgentWithRetry()</code> 启子进程 → Scanner 解析 NDJSON → 每条事件过审批（allow&#x2F;deny&#x2F;abort）→ 过预算 → 输出。TurnEnd 检查 <code>stop_reason</code>，Context 超限触发压缩重试。</p><h4 id="agent-wrapper-用例图（Use-Case-Diagram）"><a href="#agent-wrapper-用例图（Use-Case-Diagram）" class="headerlink" title="agent-wrapper 用例图（Use Case Diagram）"></a>agent-wrapper 用例图（Use Case Diagram）</h4><p><img src="/images/image-20260604101840972.png"></p><p>这个图画的不清晰。</p><h4 id="agent-wrapper-活动图（Activity-Diagram）"><a href="#agent-wrapper-活动图（Activity-Diagram）" class="headerlink" title="agent-wrapper 活动图（Activity Diagram）"></a>agent-wrapper 活动图（Activity Diagram）</h4><p><img src="/images/image-20260604102238637.png"></p><p><code>Orchestrator.Run()</code> 的并发控制流。起始 → Fork 两条。主循环：eventCh 接收 → 分发审批&#x2F;预算&#x2F;转发 → TextDelta 直接转，ToolCall 走审批，TurnEnd 走预算。子进程监控：goroutine 监听 <code>ctx.Done()</code> → <code>terminate()</code>（SIGTERM → 5s → SIGKILL）。退出时 Join → <code>close(out)</code>。</p><h4 id="agent-wrapper-状态机图（State-Machine-Diagram）"><a href="#agent-wrapper-状态机图（State-Machine-Diagram）" class="headerlink" title="agent-wrapper 状态机图（State Machine Diagram）"></a>agent-wrapper 状态机图（State Machine Diagram）</h4><p><img src="/images/image-20260604102405183.png"></p><p><code>AgentProcess</code> 生命周期。<code>Idle</code> → <code>cmd.Start()</code> → <code>Running</code>。Running + <code>cmd.Wait()</code> → <code>Exited</code>（异常记 ExitCode）。Running + ctx 取消 → <code>Terminating</code> → SIGTERM → 5s 后 SIGKILL → <code>Killed</code>。<code>sync.Once</code> 保证 terminate 只跑一次。</p><h4 id="agent-wrapper-序列图（Sequence-Diagram）"><a href="#agent-wrapper-序列图（Sequence-Diagram）" class="headerlink" title="agent-wrapper 序列图（Sequence Diagram）"></a>agent-wrapper 序列图（Sequence Diagram）</h4><p><img src="/images/image-20260604102512785.png"></p><p><code>Orchestrator.RunSync()</code> 的时间线。<code>CLI</code> → <code>Registry.Get(&quot;claude-code&quot;)</code> → 返回 <code>ClaudeCodeAgent</code> → <code>NewOrchestrator</code> → <code>orch.RunSync()</code> → <code>agent.Run()</code> → <code>StartProcess()</code> 启动子进程 → NDJSON 到 stdout → Scanner 解析 → 首条 event 带 <code>session_id</code> → 逐条回 Orchestrator → TurnEnd → <code>RunResult{Text, Usage, SessionID}</code>。agent-wrapper 最核心调用链。</p><h4 id="agent-wrapper-通信图（Communication-Diagram）"><a href="#agent-wrapper-通信图（Communication-Diagram）" class="headerlink" title="agent-wrapper 通信图（Communication Diagram）"></a>agent-wrapper 通信图（Communication Diagram）</h4><p><img src="/images/image-20260604102722921.png"></p><p>同一批信息，视角换成「谁在跟谁通信」。<code>CLI</code>→<code>Registry</code>（1:Get）→<code>Orchestrator</code>（2:NewOrchestrator, 3:RunSync）→<code>ClaudeCodeAgent</code>（4:Run）→<code>AgentProcess</code>（5:Start）→<code>Anthropic API</code>（6:HTTPS）。反馈路径：API→Process→Scanner→Agent→Orchestrator channel→CLI。强调拓扑，不强调时间线。</p><p>图画的不好。</p><h4 id="agent-wrapper-定时图（Timing-Diagram）"><a href="#agent-wrapper-定时图（Timing-Diagram）" class="headerlink" title="agent-wrapper 定时图（Timing Diagram）"></a>agent-wrapper 定时图（Timing Diagram）</h4><p><img src="/images/image-20260604103316021.png"></p><p><code>Orchestrator.RunSync()</code> 的时间约束（ms）。0ms 开始，2ms Agent.Run，5ms Process running，10ms 流式输出，12ms API 请求，50ms TurnEnd，55ms 返回。约束：tool_call ≤ 30s、SIGTERM→SIGKILL &#x3D; 5s。检查长对话超时边界。</p><h4 id="agent-wrapper-交互概览图（Interaction-Overview-Diagram）"><a href="#agent-wrapper-交互概览图（Interaction-Overview-Diagram）" class="headerlink" title="agent-wrapper 交互概览图（Interaction Overview Diagram）"></a>agent-wrapper 交互概览图（Interaction Overview Diagram）</h4><p><img src="/images/image-20260604103110823.png"></p><p>活动图框架嵌入三个交互场景。判断「output format?」→ 三条分支：<code>stream</code>（sd OutputStream，实时输出）、<code>json</code>（sd OutputJSON，<code>Marshal(RunResult)</code> 单条）、<code>stream-json</code>（sd OutputStreamJSON，NDJSON 逐行）。汇聚到 exit。不展开细节，一眼看清分流逻辑。</p><h4 id="agent-wrapper-泳道图（Swimlane-Diagram）"><a href="#agent-wrapper-泳道图（Swimlane-Diagram）" class="headerlink" title="agent-wrapper 泳道图（Swimlane Diagram）"></a>agent-wrapper 泳道图（Swimlane Diagram）</h4><p><img src="/images/image-20260604102857112.png"></p><p>四泳道：User&#x2F;CLI、Orchestrator、Agent&#x2F;Provider、External LLM API。User：Registry.Get → RunInput → RunSync&#x2F;消费 events。Orchestrator：校验 prompt → runAgentWithRetry → processEvent（审批+预算）→ collect result。Agent：startSubprocess → parseNDJSON → emit events → wait exit。API：receive → generate → return tokens&#x2F;tool_calls。跨泳道标注协议：<code>via interface</code>、<code>via pipe</code>、<code>via HTTPS</code>。</p><h2 id="14-7-本章小结"><a href="#14-7-本章小结" class="headerlink" title="14.7 本章小结"></a>14.7 本章小结</h2><p>UML 十四种图加上三种实用扩展，覆盖软件系统的两个核心维度：结构（系统长什么样）和行为（系统怎么运行）。AI 开始生成代码之后，UML 从「前置设计工具」变成了「后置理解工具」——AI 写代码，图让人看得懂。</p><p>insight-diagram 把画图自动化了。一个 Skill，四步（分析代码 → 选择图表 → 逐图生成 → 报告），17 种图表。示例驱动的生成策略锁住了风格，防遮盖规则保证了产出直接能用。跟 Understand-Anything 配合，就是「确定性结构 + LLM 可视化」的完整链路。</p><p>本章为 agent-wrapper 预留的图表占位区，后续用 insight-diagram 生成全套图表后补充实际图片。</p><p>第 12 到 14 章连续过了三组 AI 编码辅助工具：官方插件、代码知识图谱、UML 可视化。下一章进代码重构——代码写完了，怎么让 AI 帮你把它改好。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/uml-new-use-ai-understands-generated-code/</id>
    <link href="https://colobu.com/2026/06/28/uml-new-use-ai-understands-generated-code/"/>
    <published>2026-06-28T09:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>「A picture is worth a thousand words. A diagram is worth ten thousand lines of code.」<br>一图胜千言。一张图胜万行代码。</p>
</blockquote>
<p>第 13 章解决了一个问题：AI 写代码容易，读代码难。Understand-Anything 用知识图谱<strong>让 AI 理解现有代码</strong>。</p>
<p>反过来——代码写完了，作为人类<strong>你怎么理解它</strong>？毕竟，线上出了故障你还等着你背锅呢。</p>
<p>我前一段看到一句箴言：&quot;𝐲𝐨𝐮 𝐜𝐚𝐧 𝐨𝐮𝐭𝐬𝐨𝐮𝐫𝐜𝐞 𝐲𝐨𝐮𝐫 𝐭𝐡𝐢𝐧𝐤𝐢𝐧𝐠, 𝐛𝐮𝐭 𝐲𝐨𝐮 𝐜𝐚𝐧𝐧𝐨𝐭 𝐨𝐮𝐭𝐬𝐨𝐮𝐫𝐜𝐞 𝐲𝐨𝐮𝐫 𝐮𝐧𝐝𝐞𝐫𝐬𝐭𝐚𝐧𝐝𝐢𝐧𝐠&quot;， 翻译过来就是&quot;你可以外包你的思考(给AI),但是你不能外包你的理解&quot;。 这句话被 Andrej Karpathy 多次引用，以至于大家认为是他说的，其实是kache说的：</p>
<p><img src="/images/image-20260604094614868.png"></p>
<p>这句话非常有哲理。Dex Horthy 在 2025 AI Engineer 大会上独立提出了：&quot;Don&#39;t outsource the thinking&quot; &#x2F; &quot;AI cannot replace thinking, it can only amplify the thinking you have done.&quot;，但是今年你看， AI已经外包了我们的思考，你只需说出的你需求，智能体就能帮助你生生成你要的程序，但是 AI 没有办法帮我们理解啊。</p>
<p>我最近就遇到了这样的困惑：我通过goal workflow很快的实现了一个大模型训推任务智能诊断系统，全是AI帮我生成的，但是在联调的前一个星期，我心虚了。</p>
<p>因为我知道，联调和上线的时候，必然有一些问题，比如当时的设计有些模糊的地方，设计上有gap, 实现上也难免有bug。如果我对生成的代码不熟悉，联调的时候出故障我都不知道啥原因咋修复，可能当时还得重新捋代码才能慢慢找根因，太影响联调的同学了。未来上线以后出现问题，想快速修复就更不可能了。</p>
<p>所以我专门花了两天时间，建了几个卡片，就为了学习代码理解代码。</p>
<p>那我是通过什么方式去理解AI生成的代码的呢？</p>
<p>答案藏在一个用了二十多年的老工具里：UML。区别只有一点：以前的 UML 是人画给团队的，现在是 AI 画给你的。十四种图，从类结构到部署拓扑，从序列交互到状态变迁。AI 生成代码，AI 再画图解释代码——你读图就够了。</p>
<p>为此，我专门创建了一个Skill，用来生成UML的十四种代码和架构图、流程图以及泳道图。此skill的介绍：<a href="https://goal.rpcx.io/index_cn.html#step-diagram%EF%BC%8C">https://goal.rpcx.io/index_cn.html#step-diagram，</a> 也集成到了goal workflow套件中了。</p>
<p>本章分两部分：第一部分过一遍 UML 十四种正式图形，外加三种 UML 规范没有但实际很常用的图。第二部分介绍 insight-diagram——一个在 goal.rpcx.io 上发布的 Skill，给任意代码库自动生成全套 UML 图、架构图和流程图。</p>]]>
    </summary>
    <title>UML 新用途：让 AI 理解你生成的代码</title>
    <updated>2026-06-28T06:46:22.016Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="知识图谱" scheme="https://colobu.com/tags/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1/"/>
    <category term="代码理解" scheme="https://colobu.com/tags/%E4%BB%A3%E7%A0%81%E7%90%86%E8%A7%A3/"/>
    <content>
      <![CDATA[<blockquote><p>&quot;The goal isn&#39;t a graph that wows you with how complex your codebase is — it&#39;s a graph that quietly teaches you how every piece fits together.&quot;<br>目标不是一张让你惊叹「代码库真复杂」的图——是一张默默教你每个部分如何协作的图。</p><p>——Yuxiang Lin, Understand-Anything 作者, 2026 年</p></blockquote><p>Skills 拆能力。Spec 写合约。Ralph Loop 循环到对。gstack 角色覆盖。Goal Workflow 串流水线。autoresearch 全自动闭环。官方插件注入领域知识。每一章都在回答同一件事：让 AI 写出更好的代码。</p><p>本章不教 AI 写代码——教 AI 读懂已有的代码。</p><p>Understand-Anything 是目前「代码理解」方向上最成熟的开源项目：48.4K Stars，15 个 AI Agent 平台支持，最新版本 v2.7.3。作者 Yuxiang Lin。装上之后，Agent 不再靠 grep 和逐文件阅读理解代码库——先查知识图谱。</p><p><img src="/images/image-20260601161740269.png"></p><span id="more"></span><h2 id="13-1-问题：AI-不理解你的代码"><a href="#13-1-问题：AI-不理解你的代码" class="headerlink" title="13.1 问题：AI 不理解你的代码"></a>13.1 问题：AI 不理解你的代码</h2><p>AI 写代码很快。读代码是另一回事。</p><p>当你对 Claude Code 说「在这个功能里加上暗黑模式」，Agent 需要自己找出哪些文件跟主题相关、哪些组件需要适配、CSS 变量在哪里定义、有没有已有的主题切换逻辑。它用 grep 搜关键词，用 Read 逐文件阅读——每次一个文件，每次消耗上下文窗口。五万行的代码库，靠 grep + Read 理解全貌，几十轮对话。每轮烧 token，每轮都可能漏掉关键依赖。</p><p>Agent 不记昨天读过什么。你昨天问了「这个项目的认证逻辑在哪里」，今天再问，它从头搜。Understand-Anything 提前做了这件事。Agent 再来问，直接查知识图谱。</p><h2 id="13-2-核心概念：代码-→-知识图谱"><a href="#13-2-核心概念：代码-→-知识图谱" class="headerlink" title="13.2 核心概念：代码 → 知识图谱"></a>13.2 核心概念：代码 → 知识图谱</h2><p>把代码库变成知识图谱。每个文件、每个函数、每个类是一个节点。import 关系、调用关系、继承关系是边。节点上挂 LLM 生成的摘要和标签，边上标依赖方向。</p><p>这张图有了之后：</p><ul><li><strong>快速定位。</strong> 搜索语义，不是搜索关键词。「认证逻辑在哪里？」——知识图谱返回 <code>src/auth/</code> 模块及它依赖的 <code>src/middleware/session.ts</code>。</li><li><strong>影响分析。</strong> 改了 <code>UserModel</code>，知识图谱展示哪些文件 import 了它、哪些函数调用了它的方法。</li><li><strong>新人上手。</strong> 新成员 Clone 仓库后跑一次 <code>/understand</code>，再用 <code>/understand-onboard</code> 产出按依赖顺序的阅读指南——先看 domain 层，再看 service 层，最后看 API 层。</li></ul><h2 id="13-3-Tree-sitter-LLM：确定性骨架，语义血肉"><a href="#13-3-Tree-sitter-LLM：确定性骨架，语义血肉" class="headerlink" title="13.3 Tree-sitter + LLM：确定性骨架，语义血肉"></a>13.3 Tree-sitter + LLM：确定性骨架，语义血肉</h2><p>Understand-Anything 的架构做了明确分工。</p><p><strong>Tree-sitter</strong> 负责结构解析。把源代码解析成语法树，提取确定性事实：哪些文件 export 了哪些符号、import 来自哪个模块、函数调用了哪些函数、类继承自哪个类。同一份代码，Tree-sitter 每次输出完全相同——零随机性，零幻觉。这些结构事实在扫描阶段预解析成 <code>importMap</code>，文件分析 Agent 直接从 <code>importMap</code> 读取，不重新推导。Tree-sitter 还驱动增量更新——文件内容变了，fingerprint 定位变更范围。</p><p><strong>LLM</strong> 负责语义判断。读入 Tree-sitter 产出的结构和原始源码，产出解析器做不到的事：每个节点的人类可读摘要、语义标签、架构层分类、业务域映射、引导式学习路径。Tree-sitter 确定「这文件导出了什么」，LLM 判断「这个文件是做什么的、属于哪一层、和哪些业务流程相关」。</p><p>分开的好处：结构解析不消耗 token、不膨胀、不摇摆。语义理解只在需要判断「含义」的地方才调 LLM。两侧产出可独立验证——结构结果和 import 语句逐条对账，语义结果人工抽查。</p><h2 id="13-4-安装与配置"><a href="#13-4-安装与配置" class="headerlink" title="13.4 安装与配置"></a>13.4 安装与配置</h2><h3 id="13-4-1-平台支持"><a href="#13-4-1-平台支持" class="headerlink" title="13.4.1 平台支持"></a>13.4.1 平台支持</h3><p>Understand-Anything 支持 15 个 AI Agent 平台。核心引擎是同一套 TypeScript 代码，不同平台只是斜杠命令注册方式不同。</p><table><thead><tr><th>平台</th><th>安装方式</th></tr></thead><tbody><tr><td>Claude Code</td><td>Plugin Marketplace 原生安装</td></tr><tr><td>Codex</td><td><code>install.sh codex</code></td></tr><tr><td>OpenCode</td><td><code>install.sh opencode</code></td></tr><tr><td>OpenClaw</td><td><code>install.sh openclaw</code></td></tr><tr><td>Antigravity CLI</td><td><code>install.sh antigravity</code></td></tr><tr><td>Gemini CLI</td><td><code>install.sh gemini</code></td></tr><tr><td>Pi Agent</td><td><code>install.sh pi</code></td></tr><tr><td>Vibe CLI</td><td><code>install.sh vibe</code></td></tr><tr><td>Hermes</td><td><code>install.sh hermes</code></td></tr><tr><td>Cline</td><td><code>install.sh cline</code></td></tr><tr><td>KIMI CLI</td><td><code>install.sh kimi</code></td></tr><tr><td>Trae</td><td><code>install.sh trae</code></td></tr><tr><td>Cursor</td><td>自动发现 <code>.cursor-plugin/plugin.json</code></td></tr><tr><td>VS Code + Copilot</td><td>自动发现 <code>.copilot-plugin/plugin.json</code>（v1.108+）</td></tr><tr><td>Copilot CLI</td><td><code>copilot plugin install</code></td></tr></tbody></table><h3 id="13-4-2-Claude-Code-安装（推荐）"><a href="#13-4-2-Claude-Code-安装（推荐）" class="headerlink" title="13.4.2 Claude Code 安装（推荐）"></a>13.4.2 Claude Code 安装（推荐）</h3><p>最简路径——Claude Code 内置 Plugin Marketplace：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/plugin marketplace add Lum1104/Understand-Anything</span><br><span class="line">/plugin install understand-anything</span><br></pre></td></tr></table></figure><p>第一条命令添加插件市场源，第二条安装插件。安装后 <code>/understand</code> 等命令全局可用。</p><h3 id="13-4-3-一行命令安装（其他平台）"><a href="#13-4-3-一行命令安装（其他平台）" class="headerlink" title="13.4.3 一行命令安装（其他平台）"></a>13.4.3 一行命令安装（其他平台）</h3><p>macOS&#x2F;Linux：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL https://raw.githubusercontent.com/Lum1104/Understand-Anything/main/install.sh | bash</span><br></pre></td></tr></table></figure><p>指定平台：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL https://raw.githubusercontent.com/Lum1104/Understand-Anything/main/install.sh | bash -s codex</span><br></pre></td></tr></table></figure><p>Windows（PowerShell）：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">iwr</span> <span class="literal">-useb</span> https://raw.githubusercontent.com/Lum1104/Understand<span class="literal">-Anything</span>/main/install.ps1 | <span class="built_in">iex</span></span><br></pre></td></tr></table></figure><p>安装脚本做的事：Clone 仓库到 <code>~/.understand-anything/repo</code>，创建平台特定的符号链接，注册斜杠命令。重启 AI Agent 后生效。</p><h3 id="13-4-4-更新与卸载"><a href="#13-4-4-更新与卸载" class="headerlink" title="13.4.4 更新与卸载"></a>13.4.4 更新与卸载</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">./install.sh --update          <span class="comment"># 更新到最新版本</span></span><br><span class="line">./install.sh --uninstall codex  <span class="comment"># 卸载指定平台</span></span><br></pre></td></tr></table></figure><h2 id="13-5-五到七个专门的-Agent-流水线"><a href="#13-5-五到七个专门的-Agent-流水线" class="headerlink" title="13.5 五到七个专门的 Agent 流水线"></a>13.5 五到七个专门的 Agent 流水线</h2><p>运行 <code>/understand</code>，背后是五个专门 Agent 按序执行。</p><table><thead><tr><th>Agent</th><th>角色</th><th>技术</th></tr></thead><tbody><tr><td><code>project-scanner</code></td><td>扫描项目，发现文件，检测语言和框架</td><td>Tree-sitter + 文件系统</td></tr><tr><td><code>file-analyzer</code></td><td>从每个文件提取函数、类、导入，生成图节点和边</td><td>Tree-sitter + importMap</td></tr><tr><td><code>architecture-analyzer</code></td><td>识别架构层（API、Service、Data、UI、Utility）</td><td>LLM</td></tr><tr><td><code>tour-builder</code></td><td>生成按依赖排序的学习路径</td><td>LLM</td></tr><tr><td><code>graph-reviewer</code></td><td>验证图完整性、引用完整性</td><td>默认内联（确定性检查），<code>--review</code> 切换到 LLM 全面审查</td></tr></tbody></table><p>五个是基础流水线。<code>/understand-domain</code> 追加第六个 Agent——<code>domain-analyzer</code>，从代码中提取业务域、流程、步骤。<code>/understand-knowledge</code> 追加第七个 Agent——<code>article-analyzer</code>，处理 Karpathy-pattern LLM Wiki 文章，提取实体、声明和隐含关系。</p><p>文件分析 Agent 并发运行——最多 5 个并行，每批 20-30 个文件。LLM 调用的延迟被并行掩盖，大项目的分析时间主要由最长的那批文件决定，而不是文件总数。</p><p>增量更新模式（<code>--auto-update</code> 或 commit hook）：只重新分析变更的文件。Tree-sitter 的 fingerprint 检测哪些文件变了，只跑这几个文件的 file-analyzer，其他节点和边不动。小型 commit 的图更新秒级完成。</p><h2 id="13-6-知识图谱的七种用途"><a href="#13-6-知识图谱的七种用途" class="headerlink" title="13.6 知识图谱的七种用途"></a>13.6 知识图谱的七种用途</h2><h3 id="13-6-1-交互式浏览：-understand-dashboard"><a href="#13-6-1-交互式浏览：-understand-dashboard" class="headerlink" title="13.6.1 交互式浏览：/understand-dashboard"></a>13.6.1 交互式浏览：<code>/understand-dashboard</code></h3><p>产出的知识图谱可以导入交互式 Web Dashboard。每个节点可点击——点击文件节点，展示 LLM 摘要、导出的符号、依赖来源和去向。点击类节点，展示方法列表和继承链。节点按架构层颜色编码——API 层蓝色，Service 层绿色，Data 层橙色，UI 层紫色，Utility 层灰色。Dashboard 支持角色自适应 UI——初级开发者、PM、高级用户看到不同粒度的信息。</p><h3 id="13-6-2-语义搜索：-understand-chat"><a href="#13-6-2-语义搜索：-understand-chat" class="headerlink" title="13.6.2 语义搜索：/understand-chat"></a>13.6.2 语义搜索：<code>/understand-chat</code></h3><p>搜索语义，不是关键词。「哪些模块处理用户认证？」——知识图谱中匹配到 <code>src/auth/login.ts</code>（摘要：「处理邮箱+密码登录」）、<code>src/middleware/session.ts</code>（摘要：「会话管理和 token 验证」）、<code>src/models/User.ts</code>（摘要：「用户数据模型和密码哈希」）。Agent 不仅告诉你在哪里，还能解释它们之间的协作关系。</p><h3 id="13-6-3-影响分析：-understand-diff"><a href="#13-6-3-影响分析：-understand-diff" class="headerlink" title="13.6.3 影响分析：/understand-diff"></a>13.6.3 影响分析：<code>/understand-diff</code></h3><p>改代码前先跑。告诉你在当前 diff 中，你改了哪些文件、每个被改文件影响了哪些下游依赖、哪些影响是「可能破坏」的、哪些是「需要测试」的。这是「在你把改动推出去之前，先让 AI 告诉你这一改会引发什么连锁反应」。</p><h3 id="13-6-4-新人引导：-understand-onboard"><a href="#13-6-4-新人引导：-understand-onboard" class="headerlink" title="13.6.4 新人引导：/understand-onboard"></a>13.6.4 新人引导：<code>/understand-onboard</code></h3><p>自动生成项目上手文档——按依赖顺序，而不是文件名字母顺序。最底层的模块先讲，依赖它们的模块后讲。路径上附 LLM 摘要——「这个文件提供日期格式化、字符串转义和 UUID 生成，被项目中 17 个其他文件调用」。</p><h3 id="13-6-5-业务域提取：-understand-domain"><a href="#13-6-5-业务域提取：-understand-domain" class="headerlink" title="13.6.5 业务域提取：/understand-domain"></a>13.6.5 业务域提取：<code>/understand-domain</code></h3><p>切换到业务视图。代码层的知识图谱展示技术结构——文件、函数、类。<code>/understand-domain</code> 提取业务结构——域、流程、步骤。一个电商项目，技术结构是 <code>src/orders/</code> 目录下的文件。业务结构是「下单流程：购物车验证 → 地址校验 → 库存锁定 → 支付 → 订单确认」。</p><h3 id="13-6-6-知识库分析：-understand-knowledge"><a href="#13-6-6-知识库分析：-understand-knowledge" class="headerlink" title="13.6.6 知识库分析：/understand-knowledge"></a>13.6.6 知识库分析：<code>/understand-knowledge</code></h3><p>Understand-Anything 处理的不仅是代码。它对 Karpathy-pattern LLM Wiki 有专门支持——纯 Markdown 文件 + <code>index.md</code> wikilinks 组织的个人知识库。<code>/understand-knowledge</code> 读取 Wiki 目录，确定性解析器提取 wikilinks 和分类，LLM 发现隐含关系、提取实体，生成力导向图。</p><h3 id="13-6-7-深度解释：-understand-explain"><a href="#13-6-7-深度解释：-understand-explain" class="headerlink" title="13.6.7 深度解释：/understand-explain"></a>13.6.7 深度解释：<code>/understand-explain</code></h3><p>对单个文件或函数做深度分析。「这个函数是做什么的，为什么这样设计，有什么性能考虑，有哪些调用方？」——不是给你代码注释的翻译，是给你这段代码存在的原因。</p><h2 id="13-7-知识图谱的共享与版本控制"><a href="#13-7-知识图谱的共享与版本控制" class="headerlink" title="13.7 知识图谱的共享与版本控制"></a>13.7 知识图谱的共享与版本控制</h2><p>知识图谱产出 JSON 文件——<code>.understand-anything/knowledge-graph.json</code>。因为是 JSON，可以 Git。commit 一次，团队其他人 Clone 后直接拿到图，不需要重跑分析流水线。</p><p><code>.gitignore</code> 按以下规则配置：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">.understand-anything/intermediate/    ← 中间文件，不提交</span><br><span class="line">.understand-anything/diff-overlay.json ← 本地临时文件，不提交</span><br></pre></td></tr></table></figure><p><code>.understand-anything/</code> 下其余文件全部提交。大型项目（图文件 10MB+）用 Git LFS 管理：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git lfs install</span><br><span class="line">git lfs track <span class="string">&quot;.understand-anything/*.json&quot;</span></span><br><span class="line">git add .gitattributes .understand-anything/</span><br></pre></td></tr></table></figure><p>commit 图的成本是一份 JSON 文件。收益是整个团队省掉重复的分析时间。</p><h2 id="13-8-实战：用-Understand-Anything-理解-goscapy"><a href="#13-8-实战：用-Understand-Anything-理解-goscapy" class="headerlink" title="13.8 实战：用 Understand-Anything 理解 goscapy"></a>13.8 实战：用 Understand-Anything 理解 goscapy</h2><p>goscapy 是一个纯 Go 网络协议库，12 个子包，200+ 个 <code>.go</code> 源文件。核心包包括 <code>layers</code>（以太网&#x2F;IP&#x2F;TCP&#x2F;UDP&#x2F;ARP&#x2F;ICMP&#x2F;IPv6&#x2F;ICMPv6&#x2F;NDP 等协议层实现）、<code>packet</code>（数据包序列化&#x2F;反序列化核心接口）、<code>pcap</code>（抓包）、<code>sendrecv</code>（收发）、<code>sniff</code>（嗅探）、<code>route</code>（路由表）、<code>reassembly</code>（TCP 流重组）、<code>arping</code>（ARP 发现）、<code>fields</code>（协议字段注册表）、<code>goscapy</code>（高层快捷 API）。examples&#x2F; 下有 20 个示例程序，覆盖从以太网帧构造到 TCP SYN 扫描的完整场景。</p><p>这种规模的 Go 项目，新人想理解架构，通常要从 <code>go doc</code> 开始，然后逐包读 <code>types.go</code> 找接口定义，再追踪 <code>layers/</code> 里的具体实现。一个下午至少耗掉。</p><p>用 Understand-Anything，几分钟。</p><p><strong>第一步：Claude Code 中安装并运行。</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">/plugin marketplace add Lum1104/Understand-Anything</span><br><span class="line">/plugin install understand-anything</span><br><span class="line">/understand --language zh</span><br></pre></td></tr></table></figure><p>Agent 做的事：</p><ol><li>Tree-sitter 扫描 <code>pkg/</code> 下所有 <code>.go</code> 文件，30 多个文件分析 Agent 并发提取每个包导出的函数、类型、接口；</li><li><code>architecture-analyzer</code> 识别出 goscapy 的层次结构<ol><li><code>packet/</code> 是核心接口层（<code>Layer</code>、<code>Packet</code>、<code>SerializeBuffer</code>），</li><li><code>layers/</code> 是协议实现层（依赖 <code>packet/</code> 的接口），</li><li><code>pcap/</code>、<code>sendrecv/</code>、<code>sniff/</code> 是 I&#x2F;O 层（依赖 <code>layers/</code> 和 <code>packet/</code>），</li><li><code>goscapy/</code> 是门面层（聚合所有下层能力）。</li></ol></li></ol><p><img src="/images/image-20260601150911572.png"></p><p>分析了将近一小时，分析完成，自动打开网页：</p><p><img src="/images/image-20260601155012187.png"></p><p>总之，眼花缭乱，需要你花点时间熟悉它的界面，以及你能不能从中获取帮助。</p><p><strong>第二步：查构建器链。</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/understand-chat goscapy 中一个 TCP SYN 包是怎么构建的？</span><br></pre></td></tr></table></figure><p>Agent 查知识图谱，返回链路：<code>goscapy.NewPacket()</code> → <code>packet.NewPacketInfo()</code> 创建空数据包 → <code>layers.EthernetType.Build()</code> 加 Ethernet 头 → <code>layers.IPv4Type.Build()</code> 加 IP 头 → <code>layers.TCPType.Build()</code> 加 TCP 头（SYN flag）→ <code>packet.Serialize()</code> 序列化为字节流。每个 <code>Build()</code> 调用在知识图谱中用边标注，Agent 知道接口定义在 <code>packet/layer.go:15</code> 的 <code>LayerBuilder</code> 接口，TCP 实现在 <code>layers/tcp.go:200</code> 的 <code>Build()</code> 方法。</p><p>不靠 grep 搜 <code>Build</code>（200 个文件里至少有 40 个匹配）。不靠逐文件跟踪调用链。知识图谱一条边一条边走过。</p><p><img src="/images/image-20260601155809044.png"></p><p><strong>第三步：影响分析。</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/understand-diff</span><br></pre></td></tr></table></figure><p>你改动了 <code>packet/layer.go</code> 的 <code>Layer</code> 接口定义（加了新方法）。知识图谱标记影响面：<code>layers/</code> 下所有协议层都实现了这个接口——<code>ethernet.go</code>、<code>ipv4.go</code>、<code>tcp.go</code>、<code>udp.go</code>、<code>arp.go</code>、<code>icmp.go</code>、<code>ipv6.go</code>、<code>icmpv6.go</code>、<code>ndp.go</code>、<code>vlan.go</code>、<code>gre.go</code>，加上 <code>pcap/</code>、<code>sendrecv/</code> 中引用 <code>Layer</code> 类型的函数。12 个文件受影响，需要逐文件补新方法实现。</p><p><strong>第四步：新人上手。</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/understand-onboard</span><br></pre></td></tr></table></figure><p>产出一份按依赖顺序的阅读路径：第一步读 <code>packet/layer.go</code>（核心接口：<code>Layer</code>、<code>Packet</code>、<code>LayerBuilder</code>）→ 第二步读 <code>packet/serialize.go</code>（序列化原理）→ 第三步读 <code>layers/ethernet.go</code>（最简单的协议层实现）→ 第四步读 <code>layers/ipv4.go</code>（理解 options 和 fragmentation 处理）→ 第五步读 <code>layers/tcp.go</code>（理解 flag、checksum、状态机）→ 最后读 <code>goscapy/goscapy.go</code>（高层 API 封装）。每一个节点上都标注了关键的类型定义和核心方法，附 LLM 生成的中文摘要。</p><p>四个步骤，从安装到影响分析到新人阅读路径，200 个文件的 Go 项目全貌几分钟就通了。直接对 Claude Code 说「帮我理解这个项目」，Agent 靠 grep 猜结构。有知识图谱作骨架，是两套完全不同的东西。</p><p><img src="/images/image-20260601160059128.png"></p><h2 id="13-9-支持的语言与本地化"><a href="#13-9-支持的语言与本地化" class="headerlink" title="13.9 支持的语言与本地化"></a>13.9 支持的语言与本地化</h2><p>Tree-sitter 覆盖了主流编程语言——TypeScript、JavaScript、Python、Go、Rust、Java、C、C++、Ruby、PHP、Swift、Kotlin。语言检测自动完成，不需要配置。</p><p><code>/understand --language zh</code> 将输出切换为中文——节点摘要、Dashboard UI 标签、引导式学习路径。支持 <code>en</code>（默认）、<code>zh</code>、<code>zh-TW</code>、<code>ja</code>、<code>ko</code>、<code>ru</code>。</p><p>对中文开发者团队来说，中文知识图谱不仅降低阅读门槛，也让非技术角色（PM、设计师、运营）能读懂代码库的结构。</p><h2 id="13-10-适用边界"><a href="#13-10-适用边界" class="headerlink" title="13.10 适用边界"></a>13.10 适用边界</h2><p>最适合：五人以上的团队项目（知识图谱 commit 后新人上手速度翻倍）、长期维护的代码库（架构演进时可追踪模块间依赖变化）、跨语言项目（Tree-sitter 多语言解析让跨语言依赖关系可追溯）、频繁改动的核心模块（每次 commit 后增量更新，保持知识图谱最新）。</p><p>不适合：个人小项目（&lt; 20 个文件，手动翻比生成知识图谱快）、单文件脚本、极度频繁变更的早期原型（代码结构一天三变，图的维护成本高于收益）。</p><h2 id="13-11-与前后章节的关系"><a href="#13-11-与前后章节的关系" class="headerlink" title="13.11 与前后章节的关系"></a>13.11 与前后章节的关系</h2><p>与第 2 章 Skills：Understand-Anything 本身是 Skill 包——通过 Plugin Marketplace 或 <code>install.sh</code> 安装、注册为 <code>/</code> 命令、Markdown + TypeScript 混合实现。这是 Pocock 的「一个 Markdown 文件定义一种行为」哲学在代码理解领域的体现。</p><p>与第 12 章官方插件：和 code-review、feature-dev 同类——都是通过 <code>/plugin</code> 或 <code>/plugin marketplace</code> 安装的插件。Understand-Anything 填补了官方插件未覆盖的缺口：代码理解。</p><p>与第 3 章 SDD：写增量规格需要知道哪些模块会被影响、哪些行为必须保持。知识图谱能显式回答这两个问题——让规格更有依据。</p><p>与第 5 章 gstack、第 7 章 autoresearch：多 Agent 流水线的架构共享同样的思路——不同 Agent 负责不同维度。Understand-Anything 的 Agent 是功能化分工——<code>project-scanner</code> 扫描、<code>file-analyzer</code> 提取、<code>architecture-analyzer</code> 分层。</p><p>与第 8 章 Goal Workflow：<code>/to-issues</code> 和 <code>/review-it</code> 能从知识图谱中获取代码结构信息，减少 grep + Read 的轮次。Understand-Anything 可以是 Goal Workflow 流水线的一层基础设施。</p><h2 id="13-12-本章小结"><a href="#13-12-本章小结" class="headerlink" title="13.12 本章小结"></a>13.12 本章小结</h2><p>Understand-Anything 是全书唯一聚焦「代码理解」而非「代码生成」的一章。AI 写好代码的前提是理解代码——而理解正是多数 AI 编码工具最薄弱的环节。grep + Read 能走通，但 token 成本高、遗漏概率大、缺乏记忆。</p><p>Understand-Anything 用 Tree-sitter + LLM 混合架构回答了这个问题——确定性的事归 Tree-sitter（imports、exports、调用链、继承），语义的事归 LLM（摘要、标签、架构分层、学习路径）。一次分析产出的 JSON 知识图谱可以 commit 到 Git，全团队共享。Dashboard 给人看，Chat 给 Agent 查，Diff 在改动前预警影响面。</p><p>在 goscapy 这个 200 文件 Go 项目上的实战说明了这个方案的可行性——几分钟内从安装到新人上手路径，覆盖了「这个项目怎么组织」「一个包怎么构建」「改了接口会影响多少文件」三个最常见的代码理解问题。</p><p>下一章讲 UML 在 AI 时代的新用途——当 AI 能生成 UML，当 UML 能反过来教我们理解 AI 生成的代码。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/understand-anything-code-knowledge-graph/</id>
    <link href="https://colobu.com/2026/06/28/understand-anything-code-knowledge-graph/"/>
    <published>2026-06-28T08:30:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>&quot;The goal isn&#39;t a graph that wows you with how complex your codebase is — it&#39;s a graph that quietly teaches you how every piece fits together.&quot;<br>目标不是一张让你惊叹「代码库真复杂」的图——是一张默默教你每个部分如何协作的图。</p>
<p>——Yuxiang Lin, Understand-Anything 作者, 2026 年</p>
</blockquote>
<p>Skills 拆能力。Spec 写合约。Ralph Loop 循环到对。gstack 角色覆盖。Goal Workflow 串流水线。autoresearch 全自动闭环。官方插件注入领域知识。每一章都在回答同一件事：让 AI 写出更好的代码。</p>
<p>本章不教 AI 写代码——教 AI 读懂已有的代码。</p>
<p>Understand-Anything 是目前「代码理解」方向上最成熟的开源项目：48.4K Stars，15 个 AI Agent 平台支持，最新版本 v2.7.3。作者 Yuxiang Lin。装上之后，Agent 不再靠 grep 和逐文件阅读理解代码库——先查知识图谱。</p>
<p><img src="/images/image-20260601161740269.png"></p>]]>
    </summary>
    <title>Understand-Anything：代码知识图谱</title>
    <updated>2026-06-28T06:46:22.015Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="Claude Code" scheme="https://colobu.com/tags/Claude-Code/"/>
    <category term="插件" scheme="https://colobu.com/tags/%E6%8F%92%E4%BB%B6/"/>
    <content>
      <![CDATA[<blockquote><p>&quot;The decisive result came not from the model alone, but from the harness around it.&quot;<br>决定成败的不仅是模型本身，更是其配套的外围系统。</p><p>——Anthropic Harness Engineering Team</p></blockquote><p>第 2 章讲了 Skills 系统——Matt Pocock 的工程哲学：一个 Markdown 文件定义一种行为，小而可组合。第 6 章讲了 superpowers——社区级 Skills 库，十四个 Skill 覆盖十四个场景。</p><p>Anthropic 自己为 Claude Code 开发了 13 个官方插件。截至 2026 年 5 月，全部放在 Claude Code 仓库的 <code>plugins/</code> 目录下。和社区 Skills 不同，这些插件是 Anthropic 工程师为 Claude Code 构建的第一方工具——通过 <code>/plugin</code> 安装，深度集成到 hooks、agents、skills 三层基础设施中。</p><p><strong>安装。</strong> 所有 13 个插件通过同一命令安装：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/plugin install code-review</span><br></pre></td></tr></table></figure><p><code>/plugin install &lt;name&gt;</code> 从 Anthropic 官方源拉取插件，注册斜杠命令、hooks 和 Agent。<code>/plugin marketplace add</code> 可添加第三方源。安装后插件在 <code>~/.claude/plugins/</code> 下，可手动编辑配置。</p><span id="more"></span><h2 id="12-1-为什么需要领域知识插件"><a href="#12-1-为什么需要领域知识插件" class="headerlink" title="12.1 为什么需要领域知识插件"></a>12.1 为什么需要领域知识插件</h2><p>Skill 是原子能力——&quot;做 TDD&quot;&quot;做代码审查&quot;&quot;对齐需求&quot;。Skill 告诉你 Agent 能做什么。</p><p>但 Skill 不回答另一个问题：<strong>Agent 应该知道什么。</strong></p><p>一个没有领域知识的编码 Agent 等同于一个刚入职的工程师。它会写代码，但不知道你的项目在用 JWT 还是 Cookie 做认证、SQL 用 Postgres 还是 MySQL、错误处理是抛异常还是返回 Result。它只能靠 grep 猜。</p><p>CLAUDE.md 是补这个缺口的基础设施——项目上下文在会话启动时自动注入（第 10 章的 SessionStart hook）。但 CLAUDE.md 是静态文件。它不会主动扫描你的代码库、不会对比你的编码规范、不会在 PR 合并前自动跑审查规则。</p><p>领域知识插件让 CLAUDE.md 里的规矩活起来。code-review 插件读你的 CLAUDE.md，对照每一条规范检查 PR 改动。feature-dev 插件读你的代码库架构，基于已有模式生成三个备选方案。security-guidance 插件在你编辑任何文件时静默监控 9 个安全风险大类。</p><p>十三个插件，做的都是同一件事：把静态的领域知识变成执行时的动态检查。</p><h2 id="12-2-十三个官方插件全景"><a href="#12-2-十三个官方插件全景" class="headerlink" title="12.2 十三个官方插件全景"></a>12.2 十三个官方插件全景</h2><p>Claude Code 的 <code>plugins/</code> 目录下目前有 13 个插件，通过 <code>/plugin</code> 命令管理。每个插件都由 <code>.claude-plugin/plugin.json</code> 定义元数据，由 commands（斜杠命令）、agents（专门 Agent）、skills（技能）、hooks（事件钩子）四种机制组合构成。</p><p><img src="/images/image-20260531232015980.png"></p><table><thead><tr><th>插件</th><th>命令</th><th>核心机制</th><th>定位</th></tr></thead><tbody><tr><td><strong>code-review</strong></td><td><code>/code-review</code></td><td>4 个并行 Agent + 0-100 信心评分</td><td>PR 自动审查</td></tr><tr><td><strong>feature-dev</strong></td><td><code>/feature-dev</code></td><td>7 阶段引导 + 3 个专门 Agent</td><td>功能开发全流程</td></tr><tr><td><strong>pr-review-toolkit</strong></td><td><code>/pr-review-toolkit:review-pr</code></td><td>6 个可组合审查 Agent</td><td>细粒度 PR 审查</td></tr><tr><td><strong>commit-commands</strong></td><td><code>/commit</code>, <code>/commit-push-pr</code></td><td>Git 工作流自动化</td><td>提交&#x2F;推送&#x2F;创建 PR</td></tr><tr><td><strong>hookify</strong></td><td><code>/hookify</code></td><td>对话分析 → hook 生成</td><td>行为护栏自动创建</td></tr><tr><td><strong>security-guidance</strong></td><td>PreToolUse hook（自动）</td><td>9 类安全规则实时监控</td><td>静默安全守护</td></tr><tr><td><strong>ralph-wiggum</strong></td><td><code>/ralph-loop</code></td><td>Stop hook 拦截退出</td><td>自主循环开发</td></tr><tr><td><strong>plugin-dev</strong></td><td><code>/plugin-dev:create-plugin</code></td><td>8 阶段引导 + AI 辅助</td><td>插件开发工具包</td></tr><tr><td><strong>frontend-design</strong></td><td>自动触发 Skill</td><td>设计指南注入</td><td>前端界面设计</td></tr><tr><td><strong>agent-sdk-dev</strong></td><td><code>/new-sdk-app</code></td><td>项目脚手架 + 2 验证 Agent</td><td>Agent SDK 开发</td></tr><tr><td><strong>claude-opus-4-5-migration</strong></td><td>自动触发 Skill</td><td>代码&#x2F;prompt 自动迁移</td><td>模型版本迁移</td></tr><tr><td><strong>explanatory-output-style</strong></td><td>SessionStart hook（自动）</td><td>教育性上下文注入</td><td>理解实现选择</td></tr><tr><td><strong>learning-output-style</strong></td><td>SessionStart hook（自动）</td><td>决策点互动提问</td><td>交互式学习</td></tr></tbody></table><p>插件之间可组合。feature-dev 走完七个 Phase，code-review 在合入前扫一遍 PR。security-guidance 全程静默运行——Agent 执行危险操作前才被感知。</p><h2 id="12-3-code-review：本地-diff-审查"><a href="#12-3-code-review：本地-diff-审查" class="headerlink" title="12.3 &#x2F;code-review：本地 diff 审查"></a>12.3 &#x2F;code-review：本地 diff 审查</h2><p><code>/code-review</code> 由 Boris Cherny（Claude Code 的创建者）开发。在 Claude Code 会话中直接审查当前 diff。</p><p><img src="/images/image-20260531232526789.png"></p><p>用法：</p><ul><li><code>/code-review</code> — 审查当前 diff，报告正确性 bug 和代码效率、简化机会。无需安装 GitHub App，在任何 Claude Code 会话中都能运行</li><li><code>/code-review --comment</code> — 将发现作为内联 PR 评论发布</li><li><code>/code-review --fix</code> — 审查后自动将修复应用到工作树</li><li><code>/code-review ultra --fix</code> — 云端运行 deeper ultrareview，结果返回后应用修复</li></ul><p>降低 effort level 返回更少但更高可信度的发现；<code>high</code> 到 <code>max</code> 覆盖更广，可能返回不确定的发现。不传 effort 参数时使用会话当前的 effort。可传路径或 PR 引用审查特定目标。</p><p>v2.1.147 之前命令名为 <code>/simplify</code>（默认应用修复）。v2.1.154 起 <code>/simplify</code> 改为仅做清理审查——只应用修复，不找 bug。之前用 <code>/simplify</code> 做 bug 查找的脚本应切换到 <code>/code-review --fix</code>。</p><p><strong>自定义审查行为。</strong> 两个文件控制审查器的行为。</p><p><code>CLAUDE.md</code> — 项目共享指令。审查器读它作为项目上下文，把新增违规标为 nit。双向生效：如果 PR 改了代码导致 <code>CLAUDE.md</code> 陈述过时，审查器也会标记。</p><p><code>REVIEW.md</code> — 根目录的审查专用覆盖文件，注入到审查管道中每个 Agent 的系统提示中，优先级最高。纯明文指令。典型用途：重新定义哪些问题算 Important 级别、限制 Nit 发现数量上限、跳过特定路径（生成代码、锁文件、vendored 依赖）、添加仓库特定检查（&quot;新 API 路由必须有集成测试&quot;）、设置验证门槛（行为声明需 <code>file:line</code> 源码引用）、控制重审收敛（首审后只报 Important 级发现）、调整摘要格式。</p><p>审查结果包含每条 issue 的 GitHub 永久链接——完整 SHA + <code>#L</code> 行号范围。</p><h2 id="12-4-feature-dev：7-阶段引导开发"><a href="#12-4-feature-dev：7-阶段引导开发" class="headerlink" title="12.4 feature-dev：7 阶段引导开发"></a>12.4 feature-dev：7 阶段引导开发</h2><p><code>/feature-dev</code> 把一个功能从想法带到代码合并，分成七个阶段。插件作者是 Sid Bidasaria（Anthropic 工程师）。</p><p><img src="/images/image-20260531233037492.png"></p><p><strong>Phase 1：需求澄清。</strong> 对模糊需求提问。&quot;你想解决什么问题？&quot;&quot;有什么约束？&quot;确认理解后再进入下一步。</p><p><strong>Phase 2：代码库探索。</strong> 启动 2-3 个专门 Agent（<code>code-explorer</code>）并行探索不同维度——类似功能如何实现、相关区域架构、现有模式。每个 Agent 返回入口点（精确到 <code>文件:行号</code>）、执行路径、关键组件、架构洞察和建议阅读的文件清单。Claude 阅读所有标注文件，生成全面摘要。</p><p><strong>Phase 3：澄清问题。</strong> 结合代码库发现和需求，列出不明确的部分：边界条件、错误处理、集成点、向后兼容性、性能需求。关键规则：<strong>回答全部问题之前不得进入设计阶段。</strong></p><p><strong>Phase 4：架构设计。</strong> 启动 2-3 个专门 Agent（<code>code-architect</code>），每个走不同侧重：</p><ul><li><strong>最小改动方案</strong>——最大化重用已有代码，最小化文件变更</li><li><strong>干净架构方案</strong>——关注可维护性和抽象优雅度</li><li><strong>务实平衡方案</strong>——速度和质量折中</li></ul><p>每个方案附详细取舍分析。Claude 给出推荐意见和原因，最终选哪个由你决定。</p><p><strong>Phase 5：实现。</strong> 等你明确选择方案后，才开始写代码。严格遵循项目已有的命名、风格、模块边界惯例。每一步更新 todo 列表。</p><p><strong>Phase 6：质量审查。</strong> 启动 3 个专门 Agent（<code>code-reviewer</code>）并行检查：简洁性&#x2F;DRY&#x2F;优雅度、Bug&#x2F;正确性、惯例遵守&#x2F;抽象设计。高优先级问题（信心 75-100）和中等问题（信心 50-74）分别列出，每个附精确的 <code>文件:行号</code> 引用和 CLAUDE.md 规范引用。所有测试通过后才允许进入下一步。</p><p><strong>Phase 7：总结。</strong> 文档化：构建了什么、关键决策是什么、修改了哪些文件、建议的后续步骤。</p><p>七个阶段把&quot;开发功能&quot;从&quot;一段 prompt + AI 出代码&quot;变成了结构化的工程流程。第 4 章 Ralph Loop 的核心洞察——AI 说做完了不等于真的做完了——在 feature-dev 里体现为每个可能出问题的节点都设了等待点。需求摸清之前不设计。方案选定之前不实现。审查通过之前不总结。</p><h2 id="12-5-pr-review-toolkit：六维度细粒度审查"><a href="#12-5-pr-review-toolkit：六维度细粒度审查" class="headerlink" title="12.5 pr-review-toolkit：六维度细粒度审查"></a>12.5 pr-review-toolkit：六维度细粒度审查</h2><p>pr-review-toolkit 是可组合 PR 审查工具箱。和 code-review 的&quot;给一个综合分数&quot;不同，它做的是&quot;挑出你最关心的一两个维度，深度查&quot;。</p><p><code>/pr-review-toolkit:review-pr</code> 支持七个可选开关：<code>--comments</code>（审查 comment 质量）、<code>--tests</code>（审查测试覆盖）、<code>--errors</code>（审查错误处理）、<code>--types</code>（审查类型设计）、<code>--code</code>（审查代码质量）、<code>--simplify</code>（审查简化机会）、<code>--all</code>（全维度）。</p><p>每个开关背后是一个专门 Agent——comment-analyzer、pr-test-analyzer、silent-failure-hunter（找静默失败）、type-design-analyzer、code-reviewer、code-simplifier。</p><p>和 code-review 的关系：code-review 是常规武器——每个 PR 自动跑，4 个 Agent 快速扫一遍。pr-review-toolkit 是特种工具——关键 PR 或安全敏感代码，选一两个最关心的维度深度审查。</p><h2 id="12-6-security-guidance：9-类安全规则静默守护"><a href="#12-6-security-guidance：9-类安全规则静默守护" class="headerlink" title="12.6 security-guidance：9 类安全规则静默守护"></a>12.6 security-guidance：9 类安全规则静默守护</h2><p>security-guidance 是唯一不需要手动触发的插件。安装后在 PreToolUse hook 上注册 9 条安全规则，在 Agent 编辑文件时静默检查：命令注入、XSS 注入、eval 使用、危险的 HTML 构造、pickle 反序列化、os.system 调用、SQL 注入、硬编码密钥、不安全随机数生成。</p><p>Agent 每次执行 Edit&#x2F;Write&#x2F;Bash 操作前，PreToolUse hook 比对这 9 条规则。匹配到危险模式时，hook 在 Agent 上下文中注入安全提醒——用引导而非强制。</p><p>hookify 是 security-guidance 的补充。security-guidance 的规则是 Anthropic 预定义的通用安全模式。hookify 从你自己的对话中学习特定的风险模式——conversation-analyzer Agent 扫描你和 Agent 的交互历史，自动生成对应的 hook 规则。</p><h2 id="12-7-其他插件"><a href="#12-7-其他插件" class="headerlink" title="12.7 其他插件"></a>12.7 其他插件</h2><p><strong>frontend-design。</strong> 自动触发 Skill，在前端工作时激活。引导 Agent 避开均匀间距、对称布局、标准配色的&quot;AI 风&quot;界面，注入设计约束：大胆排版、有意图的色彩、微交互、非对称布局。和第 5 章 gstack 的 <code>/plan-design-review</code> 目标一致——抵抗 AI Slop。</p><p><strong>explanatory-output-style 和 learning-output-style。</strong> 通过 SessionStart hook 注入教育性上下文。前者为每个实现选择解释原因，后者在关键决策点提问、鼓励手写 5-10 行代码。</p><p><strong>commit-commands。</strong> 三个 Git 快捷命令：<code>/commit</code>（生成 conventional commit 消息并提交）、<code>/commit-push-pr</code>（推送并创建 PR）、<code>/clean_gone</code>（清理远端已删除的本地分支）。</p><p><strong>agent-sdk-dev 和 plugin-dev。</strong> Agent 开发者工具：<code>/new-sdk-app</code> 创建 Agent SDK 项目脚手架，<code>/plugin-dev:create-plugin</code> 用 8 阶段工作流辅助插件创建。</p><p><strong>claude-opus-4-5-migration。</strong> 自动处理从旧模型迁移到 Opus 4.5 的代码和 prompt 变更。</p><h2 id="12-8-插件的共同设计模式"><a href="#12-8-插件的共同设计模式" class="headerlink" title="12.8 插件的共同设计模式"></a>12.8 插件的共同设计模式</h2><p><img src="/images/image-20260531233736843.png"></p><p>十三个插件有几条共性：</p><p><strong>专用 Agent 并行审查。</strong> code-review 用 4 个并行 Agent，feature-dev 在不同阶段启动 2-3 个探索 Agent 和 3 个审查 Agent，pr-review-toolkit 用 6 个独立审查 Agent。和第 7 章 autoresearch 的多 Agent 轮转审查逻辑一致——一个 Agent 看不到的东西，换个角度就能看到。包括Claude Code推出的Teams、dynamic workflows的理念一样，充分利用多 Agent 的特性。</p><p><strong>信心评分过滤。</strong> code-review 的 0-100 评分 + 80 阈值是降噪策略。pr-review-toolkit 的 Agent 也使用类似的信心分类（高&#x2F;中优先级）。&quot;宁愿漏掉一个真问题，不要让十个假问题淹没一个真问题&quot;——给 Agent 用的审查系统需要这个取舍，因为人对噪音的容忍度远低于 Agent。</p><p><strong>结构化阶段门控。</strong> feature-dev 的 7 个 Phase 之间设有明确等待点——Phase 3 的回答、Phase 4 的方案选择、Phase 6 的问题处理。和第 5 章 gstack 的 PreToolUse hook 强制门控本质相同。</p><p><strong>hook + Agent 双引擎。</strong> security-guidance 完全靠 PreToolUse hook 触发，explanatory-output-style 和 learning-output-style 通过 SessionStart hook 加载，hookify 从对话分析自动生成 hook 规则。第 10 章的 Harness Engineering 在这里是最直接的基层——hook 是插件行为的基础设施。</p><h2 id="12-9-与全书方法论的对接"><a href="#12-9-与全书方法论的对接" class="headerlink" title="12.9 与全书方法论的对接"></a>12.9 与全书方法论的对接</h2><table><thead><tr><th>全书方法论</th><th>在官方插件中的体现</th></tr></thead><tbody><tr><td>Skills 系统（第 2 章）</td><td>frontend-design、claude-opus-4-5-migration 是 Skill 的官方实现</td></tr><tr><td>Ralph Loop（第 4 章）</td><td>ralph-wiggum 是 Stop hook 循环的第一方实现</td></tr><tr><td>gstack（第 5 章）</td><td>feature-dev 的 7 阶段门控对应 gstack Sprint；frontend-design 的 AI Slop 检测对应 <code>/plan-design-review</code></td></tr><tr><td>Harness Engineering（第 10 章）</td><td>security-guidance 的 PreToolUse hook、hookify 的自动 hook 生成</td></tr><tr><td>Goal Workflow（第 8 章）</td><td>feature-dev + commit-commands 组合对应 Goal Workflow 的流水线</td></tr><tr><td>autoresearch（第 7 章）</td><td>code-review 的 4 Agent 并行审查 + 信心评分对应多 Agent 交叉审查</td></tr></tbody></table><h2 id="12-10-本章小结"><a href="#12-10-本章小结" class="headerlink" title="12.10 本章小结"></a>12.10 本章小结</h2><p>Anthropic 的十三个官方插件是 Claude Code 的工具级&quot;出厂配置&quot;。</p><p>从使用角度看这些插件的角色：code-review（每个 PR 该跑，4 Agent 并行 + 80 分阈值过滤噪音）、feature-dev（需求模糊时用，7 阶段引导不允许在不确定状态下写代码）、pr-review-toolkit（需要盯特定维度时用——安全性、类型设计、静默失败）、security-guidance（该装完就忘掉它——静默守护，不需要手动跑）、commit-commands（日常 git 机械操作的自动化）。</p><p>共性设计模式——专用 Agent 多视角审查、高信心阈值过滤噪音、结构化阶段门控、hook 驱动的自动触发——第 2 章的 Skills、第 4 章的 Ralph Loop、第 5 章的 gstack、第 7 章的 autoresearch、第 10 章的 Harness Engineering 都能在这些插件中找到一一对应的工程实现。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/anthropic-official-plugins-domain-knowledge-ai-agent/</id>
    <link href="https://colobu.com/2026/06/28/anthropic-official-plugins-domain-knowledge-ai-agent/"/>
    <published>2026-06-28T08:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>&quot;The decisive result came not from the model alone, but from the harness around it.&quot;<br>决定成败的不仅是模型本身，更是其配套的外围系统。</p>
<p>——Anthropic Harness Engineering Team</p>
</blockquote>
<p>第 2 章讲了 Skills 系统——Matt Pocock 的工程哲学：一个 Markdown 文件定义一种行为，小而可组合。第 6 章讲了 superpowers——社区级 Skills 库，十四个 Skill 覆盖十四个场景。</p>
<p>Anthropic 自己为 Claude Code 开发了 13 个官方插件。截至 2026 年 5 月，全部放在 Claude Code 仓库的 <code>plugins/</code> 目录下。和社区 Skills 不同，这些插件是 Anthropic 工程师为 Claude Code 构建的第一方工具——通过 <code>/plugin</code> 安装，深度集成到 hooks、agents、skills 三层基础设施中。</p>
<p><strong>安装。</strong> 所有 13 个插件通过同一命令安装：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/plugin install code-review</span><br></pre></td></tr></table></figure>

<p><code>/plugin install &lt;name&gt;</code> 从 Anthropic 官方源拉取插件，注册斜杠命令、hooks 和 Agent。<code>/plugin marketplace add</code> 可添加第三方源。安装后插件在 <code>~/.claude/plugins/</code> 下，可手动编辑配置。</p>]]>
    </summary>
    <title>Anthropic 官方插件：AI Agent 的领域知识插件</title>
    <updated>2026-06-28T06:46:22.015Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="agent-skills" scheme="https://colobu.com/tags/agent-skills/"/>
    <category term="工程纪律" scheme="https://colobu.com/tags/%E5%B7%A5%E7%A8%8B%E7%BA%AA%E5%BE%8B/"/>
    <content>
      <![CDATA[<blockquote><p>&quot;Process over prose — workflows over reference.&quot;<br>流程重于文字，工作流重于参考。</p><p>——addyosmani&#x2F;agent-skills README</p></blockquote><p>第 15 章讲 Compound Engineering 让每一轮工作沉淀知识，下一轮起点更高。第 14 章讲 improve 让强模型做审计、弱模型做执行。两章都在回答&quot;怎么让 Agent 做正确的事&quot;。</p><p>本章要回答一个更前置的问题：Agent 知道什么是正确的事吗？</p><p>回答这个问题的人叫 Addy Osmani。</p><p><img src="/images/image-20260620105908917.png"></p><p>如果你写过前端，大概率读过他的书。他在 Google Chrome 领导开发者体验工程团队近 14 年，主导了 Chrome DevTools、Lighthouse、PageSpeed Insights、Core Web Vitals 等工具和标准的建设。2026 年转任 Google Cloud AI 总监，负责 Gemini、Vertex AI 和 Agent Development Kit。著有《Learning JavaScript Design Patterns》《Leading Effective Engineering Teams》，博客名篇《The Cost of JavaScript》从 2017 年到 2023 年持续更新了七年，几乎定义了 web 性能优化的讨论框架。他在前端工程和 web 性能领域的影响力，塑造了一整代前端开发者的工程实践。</p><p>2026 年初，他的注意力从&quot;人怎么写更好的代码&quot;转向了&quot;AI 怎么写更好的代码&quot;。2 月 15 日，他开源了 agent-skills，定位一句话：<strong>&quot;Production-grade engineering skills for AI coding agents&quot;——把资深工程师的工作流、质量门禁和最佳实践，编码为 Agent 不可绕过的结构化约束。</strong> 到 6 月，近 60K star。</p><p>但这不只是又一个爆款开源项目。Osmani 在这个项目里做的事，和他过去十年做的事一模一样：把隐性的工程知识显式化。《Learning JavaScript Design Patterns》是把资深工程师脑子里的设计模式写成可学习的目录。Chrome DevTools 的文档是把调试技巧写成可操作的步骤。agent-skills 是把工程纪律写成 Agent 无法自我说服跳过的约束。</p><p>用 AI 写代码的人都会碰到一种熟悉的挫败感。Agent 接到任务，跳过规格直接敲代码。你说&quot;先写测试&quot;，它说&quot;好的&quot;，然后继续敲代码。你说&quot;这里需要安全检查&quot;，它说&quot;明白&quot;，然后加了一行 <code>// TODO: add auth</code>。你说&quot;代码能简化一下吗&quot;，它说&quot;当然&quot;，然后把三个函数合并成一个更长的函数。</p><p>Agent 不是不听话。它是真的不知道什么叫&quot;先写测试&quot;&quot;安全检查&quot;&quot;简化代码&quot;。这些是资深工程师花了好多年才内化的纪律，而 Agent 的默认行为是用最短路径把代码写出来，能跑就行。其他的都不在它的输出分布里。</p><p>agent-skills 要反转的就是这件事。它所有的设计决策，从七阶段生命周期到反合理化表到验证门禁，都指向同一个目标：让 Agent 像资深工程师一样工作。不是写代码更快，是不跳过那些让代码值得写的东西。</p><span id="more"></span><h2 id="16-1-agent-skills-是什么"><a href="#16-1-agent-skills-是什么" class="headerlink" title="16.1 agent-skills 是什么"></a>16.1 agent-skills 是什么</h2><p>agent-skills 是一套结构化 Markdown 工作流的集合。24 个 skill，7 个斜杠命令，覆盖从想法到上线的完整生命周期。</p><p>安装简单。Claude Code 插件市场直接装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/plugin marketplace add addyosmani/agent-skills</span><br><span class="line">/plugin install agent-skills@addy-agent-skills</span><br></pre></td></tr></table></figure><p>MIT 开源，纯 Markdown 格式，兼容 Claude Code、Cursor、Gemini CLI、Codex、Windsurf、OpenCode、GitHub Copilot 等几乎所有主流工具。</p><p>但它和前面章节讲的所有技能有一个根本区别。Mattpocock 的 skills 帮你做具体的事，调试、写 PRD、审查代码。improve 帮你审计代码库。Compound Engineering 帮你沉淀知识。agent-skills 不帮你做事。它规定你怎么做事。</p><p>不是&quot;帮我写测试&quot;。是&quot;你写任何代码之前必须先写测试，这是流程，不能跳过&quot;。不是&quot;帮我审查这段代码&quot;。是&quot;你提交的每段代码都必须经过五轴审查，没有例外&quot;。它不是工具箱。是纪律手册。</p><p>Osmani 自己给这个区别下了一个定义：&quot;Process over prose — workflows over reference.&quot;每个 skill 不是一个供阅读的参考文档，是一个有步骤、有检查点、有退出标准的可执行流程。Agent 读了它，不是学到了知识，是被强制遵守一个流程。</p><h2 id="16-2-核心问题：Agent-跳过工程纪律"><a href="#16-2-核心问题：Agent-跳过工程纪律" class="headerlink" title="16.2 核心问题：Agent 跳过工程纪律"></a>16.2 核心问题：Agent 跳过工程纪律</h2><p>Agent 最擅长的事也是它最危险的事：写代码。它能在几秒钟内生成几百行看起来正确的代码。问题就在&quot;看起来正确&quot;。</p><p>写代码之前想清楚需求？Agent 倾向于跳过。&quot;这个很简单，不需要规格&quot;。写完代码补测试？Agent 倾向于跳过。&quot;测试后面再补&quot;。合并前做安全审查？Agent 倾向于跳过。&quot;这个改动不涉及安全&quot;。代码能简化吗？Agent 倾向于不。它写的代码就是它认为最优的样子。</p><p>Osmani 把这些叫做合理化借口（rationalization）。Agent 不是在偷懒。它是在用统计学上最可能的路径完成任务。写代码是它的强项，写规格不是。跳过不擅长的步骤、直奔擅长的步骤，这不是恶意，是概率。</p><p>但软件工程的百年教训是：跳过的步骤会回来。没写的规格变成理解偏差。没写的测试变成生产 bug。没做的审查变成技术债。没简化的代码变成下一次改动的摩擦力。Agent 用最快路径交付的代码，往往成本最高。</p><p>agent-skills 的解法不是让 Agent 更聪明。是让 Agent 无法说服自己跳过步骤。每个 skill 都内建了一套机制，预判 Agent 会找什么借口，提前写下反驳。Agent 读到的不只是&quot;你应该做 X&quot;，还有&quot;如果你觉得可以不做 X，看看这段话&quot;。</p><h2 id="16-3-七阶段开发生命周期"><a href="#16-3-七阶段开发生命周期" class="headerlink" title="16.3 七阶段开发生命周期"></a>16.3 七阶段开发生命周期</h2><p><img src="/images/image-20260620110502804.png"></p><p>agent-skills 把软件开发的完整生命周期编码为七个阶段。每个阶段一个斜杠命令入口，背后挂载一组专项 skill。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">/spec → /plan → /build → /test → /review → /code-simplify → /ship</span><br><span class="line">  │       │        │        │         │            │            │</span><br><span class="line">  ▼       ▼        ▼        ▼         ▼            ▼            ▼</span><br><span class="line">Define   Plan    Build   Verify   Review     Simplify      Ship</span><br></pre></td></tr></table></figure><h3 id="16-3-1-spec：先搞清楚要构建什么"><a href="#16-3-1-spec：先搞清楚要构建什么" class="headerlink" title="16.3.1 &#x2F;spec：先搞清楚要构建什么"></a>16.3.1 &#x2F;spec：先搞清楚要构建什么</h3><p><code>/spec</code> 是铁律第一条：规格先行，代码在后。</p><p>背后挂了三张 skill。<code>interview-me</code> 是一次一问式访谈，Agent 一个问题一个问题地问，直到对需求有约 95% 的置信度才停。这防止了 Agent 凭一句话猜测需求然后闷头写代码。<code>idea-refine</code> 用于模糊想法的发散和收敛思维，生成多个方向、逐一评估、浓缩为一个可执行方案。<code>spec-driven-development</code> 产出结构化 PRD，包含目标、结构、代码风格、测试策略、边界条件。</p><p>一个容易被忽略的细节：<code>/spec</code> 也接受&quot;这个太简单了不需要规格&quot;的借口。它的反合理化表里写着：简单任务不需要长规格书，但仍然需要验收标准。两行也行。写下来。</p><h3 id="16-3-2-plan：拆解为小而可验证的任务"><a href="#16-3-2-plan：拆解为小而可验证的任务" class="headerlink" title="16.3.2 &#x2F;plan：拆解为小而可验证的任务"></a>16.3.2 &#x2F;plan：拆解为小而可验证的任务</h3><p><code>/plan</code> 把规格分解为原子化任务。每个任务必须有明确的验收标准，必须能在一个上下文窗口内完成。</p><p>背后的 <code>planning-and-task-breakdown</code> skill 强制了几个约束：任务之间依赖关系显式标注、每个任务独立可验证、优先排序、预估工作量。和第 13 章 GSD 的 Plan 阶段同一个思路，计划必须能装进一个上下文窗口。</p><h3 id="16-3-3-build：增量实现，一次一片"><a href="#16-3-3-build：增量实现，一次一片" class="headerlink" title="16.3.3 &#x2F;build：增量实现，一次一片"></a>16.3.3 &#x2F;build：增量实现，一次一片</h3><p><code>/build</code> 是整个体系中最重的阶段，挂载了 7 张专项 skill。</p><p><code>incremental-implementation</code> 是核心引擎。它强制的不是&quot;写什么代码&quot;，是&quot;怎么组织写代码的过程&quot;：一次只做一片薄纵向切片，每片独立测试、独立提交、独立可回滚。特性开关包裹未完成的功能。安全默认值，不破坏已有行为。约 100 行变更粒度，保持可审查。</p><p><code>test-driven-development</code> 编码了红-绿-重构循环，但不是教科书式的教条。它把测试金字塔量化为 80&#x2F;15&#x2F;5（单元 80%&#x2F;集成 15%&#x2F;端到端 5%），强调 DAMP（描述性和有意义的外语）优于 DRY（测试之间不要过度共享），以及 Beyoncé Rule——&quot;如果你喜欢它，你应该给它写测试&quot;。</p><p><code>source-driven-development</code> 是一个容易被忽视的高杠杆 skill。它要求 Agent 将决策建立在官方文档之上：验证、引用来源、标记未验证的断言。这防止了 Agent 基于训练数据里过时或错误的 API 用法写代码。</p><p><code>doubt-driven-development</code> 是整个项目最有创意的 skill。核心理念：AI 给出的&quot;自信答案&quot;不等于&quot;正确答案&quot;。长会话会悄悄把假设转化为&quot;事实&quot;，需要新鲜上下文的审查者来发现盲点。工作流是五步对抗性审查循环：CLAIM（声明决策，为什么重要）→ EXTRACT（剥离推理，只留结论）→ DOUBT（召唤全新上下文的审查者，带对抗性提示）→ RECONCILE（逐条核实每个发现）→ STOP（满足终止条件才放行，最多 3 轮）。</p><p>触发条件写得非常具体。引入分支逻辑、跨模块边界、断言类型系统无法验证的属性、正确性依赖未来读者看不到的上下文、爆炸半径不可逆——这些都是&quot;非平凡决策&quot;，触发 doubt-driven 审查。</p><p><code>/build</code> 还有一个 <code>/build auto</code> 模式。你批准计划一次，Agent 自主实现所有任务。每个任务仍然测试驱动、独立提交，遇到失败自动暂停。和第 12 章 Loop Engineering 的 <code>/goal</code> 逻辑一致，Agent 自己跑到条件满足为止。</p><h3 id="16-3-4-test：证明它能用"><a href="#16-3-4-test：证明它能用" class="headerlink" title="16.3.4 &#x2F;test：证明它能用"></a>16.3.4 &#x2F;test：证明它能用</h3><p><code>/test</code> 的核心原则一句话：测试是证明，不是感觉。&quot;看起来对&quot;永远不够。Agent 必须提供证据，测试通过、构建输出、运行时数据。</p><p>背后两张 skill。<code>browser-testing-with-devtools</code> 利用 Chrome DevTools MCP 做运行时检查，DOM、控制台、网络、性能数据，数据驱动的验证而非&quot;页面看起来对&quot;。<code>debugging-and-error-recovery</code> 编码五步调试法：复现 → 定位 → 缩小范围 → 修复 → 加护栏防止重犯。</p><h3 id="16-3-5-review：合并前的质量门禁"><a href="#16-3-5-review：合并前的质量门禁" class="headerlink" title="16.3.5 &#x2F;review：合并前的质量门禁"></a>16.3.5 &#x2F;review：合并前的质量门禁</h3><p><code>/review</code> 是质量的门神。五轴审查：正确性、安全、性能、可维护性、代码风格。约 100 行变更粒度，使用 Nit&#x2F;Optional&#x2F;FYI 三级严重度标签。</p><p>背后四张 skill 各有专攻。<code>code-review-and-quality</code> 做结构审查。<code>security-and-hardening</code> 覆盖 OWASP Top 10、认证模式、密钥管理、三级边界系统。<code>performance-optimization</code> 的原则是&quot;先测量&quot;，Core Web Vitals、性能分析、bundle 分析。<code>code-simplification</code> 应用 Chesterton&#39;s Fence（看不懂为什么存在的东西，先搞清楚原因再删）和 Rule of 500（超过 500 行的文件必须拆分）。</p><h3 id="16-3-6-code-simplify：清晰优于聪明"><a href="#16-3-6-code-simplify：清晰优于聪明" class="headerlink" title="16.3.6 &#x2F;code-simplify：清晰优于聪明"></a>16.3.6 &#x2F;code-simplify：清晰优于聪明</h3><p>这是一个独立的、跨阶段的命令。核心信条：代码是负债。每行代码都是将来要读、要改、要调试的东西。Agent 默认倾向多写，不是少写。<code>/code-simplify</code> 强制它反过来：在所有功能都能跑的前提下，让代码更少、更清晰。</p><h3 id="16-3-7-ship：安全上线"><a href="#16-3-7-ship：安全上线" class="headerlink" title="16.3.7 &#x2F;ship：安全上线"></a>16.3.7 &#x2F;ship：安全上线</h3><p><code>/ship</code> 是最后的防线。六张 skill 覆盖从代码到生产的每一步。<code>git-workflow-and-versioning</code> 强制主干开发加原子提交。<code>ci-cd-and-automation</code> 强制左移、特性开关、质量门禁管道。<code>documentation-and-adrs</code> 强制记录&quot;为什么&quot;，不只是&quot;是什么&quot;。<code>observability-and-instrumentation</code> 强制结构化日志、RED 指标、OpenTelemetry 追踪。<code>shipping-and-launch</code> 强制上线前检查清单、分阶段发布、回滚程序。<code>deprecation-and-migration</code> 强制&quot;代码即负债&quot;心态，逐步废弃旧东西。</p><h2 id="16-4-反合理化表：Agent-自欺的克星"><a href="#16-4-反合理化表：Agent-自欺的克星" class="headerlink" title="16.4 反合理化表：Agent 自欺的克星"></a>16.4 反合理化表：Agent 自欺的克星</h2><p>走完七个阶段，你可能注意到了。<code>/spec</code> 里有一句话留给&quot;这个太简单了不需要规格&quot;。<code>/build</code> 里有一句话留给&quot;测试后面再补&quot;。<code>/review</code> 里有一句话留给&quot;这个改动不需要审查&quot;。每个阶段、每张 skill，都在做同一件事：预判 Agent 会找什么借口，提前写下反驳。</p><p>这就是反合理化表（anti-rationalization table）。agent-skills 最具辨识度的设计，也是它和所有其他技能框架最根本的区别。</p><p>每个 skill 都内嵌一张&quot;借口 vs 反驳&quot;对照表。左边是 Agent 可能会说的，统计上最可能的合理化借口。右边是提前写好的反驳，为什么这个借口不成立。</p><p>几个真实例子：</p><table><thead><tr><th>Agent 可能会说</th><th>预设的反驳</th></tr></thead><tbody><tr><td>&quot;这个太简单了，不需要 spec&quot;</td><td>简单任务不需要长规格书，但仍然需要验收标准。两行也行。写下来。</td></tr><tr><td>&quot;测试后面再补&quot;</td><td>&quot;后面&quot;永远不会来。写完代码再补的测试，只是同一份代码换了个名字。</td></tr><tr><td>&quot;我在预发布环境测过了，上生产没问题&quot;</td><td>数据不同、流量不同、边缘情况不同。</td></tr><tr><td>&quot;这个很简单，不需要 feature flag&quot;</td><td>每个功能都需要一个安全开关。没有例外。</td></tr><tr><td>&quot;这个改动不需要审查&quot;</td><td>所有改动都需要审查。变更越小，审查越容易，越没理由跳过。</td></tr></tbody></table><p>这张表的设计建立在对 LLM 行为模式的深刻理解之上。LLM 擅长为自己找合理化借口，&quot;可以根据上下文推断&quot;&quot;这种简单情况不需要&quot;——这些借口在统计上是合理的，因为训练数据里充满了人类用同样的借口跳过同样的事。</p><p>反合理化表就是提前写好的反驳，针对 Agent 还没说出口的谎言。Agent 读到一个步骤，也读到了&quot;如果你觉得可以跳过这一步，看看这段话&quot;。它被制度性地阻止自我欺骗。</p><p>Osmani 的博客里有一句话总结了这张表的意义：<strong>&quot;AI 编程代理是极其能干的初级工程师，但本能地缺少那些不出现在 diff 中的工作部分。高级工程师的工作——揭示假设、控制变更规模、写规格书、留下证据、拒绝合并不经审查的代码——正是 AI 代理会跳过的东西，除非你让它无法跳过。&quot;</strong></p><h2 id="16-5-Google-工程文化的-DNA"><a href="#16-5-Google-工程文化的-DNA" class="headerlink" title="16.5 Google 工程文化的 DNA"></a>16.5 Google 工程文化的 DNA</h2><p>agent-skills 不是凭空设计的。它深度嵌入了 Google 公开工程实践中的关键原则。</p><p><img src="/images/image-20260620111040581.png"></p><p>Hyrum&#39;s Law——&quot;如果 API 有足够多的用户，你对合约的承诺不重要，所有可观测的行为都会被某人依赖&quot;——被编码进 <code>api-and-interface-design</code> skill。Beyoncé Rule——&quot;如果你喜欢它，你应该给它写测试&quot;——被编码进 <code>test-driven-development</code>。Chesterton&#39;s Fence——&quot;别拆掉你不理解为什么存在的篱笆&quot;——被编码进 <code>code-simplification</code>。主干开发、Shift Left、特性开关被编码进 <code>git-workflow-and-versioning</code> 和 <code>ci-cd-and-automation</code>。</p><p>这不是巧合。Osmani 在 Google Chrome 领导工程团队多年，这些原则是他每天都在用的东西。agent-skills 本质上是一次大规模的工程文化蒸馏。把 Google 工程文化中那些艰难获得的最佳实践从人的脑子里提取出来，固化为 Agent 的不可绕过的工作流。</p><h2 id="16-6-与全书方法论的对接"><a href="#16-6-与全书方法论的对接" class="headerlink" title="16.6 与全书方法论的对接"></a>16.6 与全书方法论的对接</h2><p>agent-skills 和其他章节的方法论有天然的亲和力。</p><p><strong>和第 2 章 Skills 是同一个理念的全面展开。</strong> Matt Pocock 定义了&quot;原子 Skill&quot;的范式，小而可组合、模型无关、可改造。agent-skills 把这个范式推到了全生命周期覆盖的顶点。24 个 Skill 不是零散的，是按阶段组织的，从前到后形成一条完整的纪律链。</p><p><strong>和第 8 章 Goal Workflow 高度同构。</strong> <code>/spec → /plan → /build → /test → /review → /ship</code> 这条链和 <code>/prd → /prd-to-spec → /goal → /review-it → /ship-it</code> 几乎一一对应。区别在于 agent-skills 管得更细。不只是&quot;你要走这些步骤&quot;，是&quot;每一步你该怎么走，有什么坑，什么借口不能信&quot;。</p><p><strong>和第 12 章 Loop Engineering 互为表里。</strong> Addy Osmani 本人是 Loop Engineering 概念的命名者和推广者，第 12 章讲的那篇定义了&quot;五个原语加一个记忆&quot;的长文就是他写的。agent-skills 可以看作 Loop 中每个阶段的操作手册。Loop 定义了循环的结构，agent-skills 定义了循环里每个动作的纪律。</p><p><strong>和第 14 章 improve 的反合理化机制殊途同归。</strong> improve 用 STOP 条件阻止弱模型即兴发挥，agent-skills 用反合理化表阻止 Agent 跳过步骤。两者的核心信念一样：Agent 需要被制度性地阻止自我欺骗。区别在于 improve 专注前置审计，agent-skills 专注全流程纪律。</p><p><strong>和第 15 章 Compound Engineering 的复利兼容。</strong> agent-skills 的渐进式知识积累（spec → plan → ADR → pulse 报告）天然为复利提供原料。每一次循环产出的规格、计划、架构决策记录，都是下一次 Agent 启动时的默认上下文。</p><h2 id="16-7-本章小结"><a href="#16-7-本章小结" class="headerlink" title="16.7 本章小结"></a>16.7 本章小结</h2><p>agent-skills 把&quot;工程纪律&quot;从人的自觉变成了 Agent 的结构化约束。7 个命令覆盖从想法到上线的全过程，24 个 skill 将 Google 工程文化的关键原则编码为不可绕过的工作流。</p><p>反合理化表加验证门禁是它最锋利的创新。Agent 被制度性地阻止&quot;跳过测试&quot;&quot;以后再重构&quot;&quot;这个太简单了不需要规格&quot;等自欺行为。每一步都以证据收尾，测试通过、构建输出、运行时数据。&quot;看起来对&quot;不算数。</p><p>Osmani 的工程哲学全部浓缩在几个词里：流程重于文字，验证重于声称，纪律重于速度。这不是贴在 README 里的口号。是写进了每一个 skill 文件、每一张反合理化表、每一步验证门禁的设计决策。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/agent-skills-production-grade-discipline-for-ai-agent/</id>
    <link href="https://colobu.com/2026/06/28/agent-skills-production-grade-discipline-for-ai-agent/"/>
    <published>2026-06-28T07:30:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>&quot;Process over prose — workflows over reference.&quot;<br>流程重于文字，工作流重于参考。</p>
<p>——addyosmani&#x2F;agent-skills README</p>
</blockquote>
<p>第 15 章讲 Compound Engineering 让每一轮工作沉淀知识，下一轮起点更高。第 14 章讲 improve 让强模型做审计、弱模型做执行。两章都在回答&quot;怎么让 Agent 做正确的事&quot;。</p>
<p>本章要回答一个更前置的问题：Agent 知道什么是正确的事吗？</p>
<p>回答这个问题的人叫 Addy Osmani。</p>
<p><img src="/images/image-20260620105908917.png"></p>
<p>如果你写过前端，大概率读过他的书。他在 Google Chrome 领导开发者体验工程团队近 14 年，主导了 Chrome DevTools、Lighthouse、PageSpeed Insights、Core Web Vitals 等工具和标准的建设。2026 年转任 Google Cloud AI 总监，负责 Gemini、Vertex AI 和 Agent Development Kit。著有《Learning JavaScript Design Patterns》《Leading Effective Engineering Teams》，博客名篇《The Cost of JavaScript》从 2017 年到 2023 年持续更新了七年，几乎定义了 web 性能优化的讨论框架。他在前端工程和 web 性能领域的影响力，塑造了一整代前端开发者的工程实践。</p>
<p>2026 年初，他的注意力从&quot;人怎么写更好的代码&quot;转向了&quot;AI 怎么写更好的代码&quot;。2 月 15 日，他开源了 agent-skills，定位一句话：<strong>&quot;Production-grade engineering skills for AI coding agents&quot;——把资深工程师的工作流、质量门禁和最佳实践，编码为 Agent 不可绕过的结构化约束。</strong> 到 6 月，近 60K star。</p>
<p>但这不只是又一个爆款开源项目。Osmani 在这个项目里做的事，和他过去十年做的事一模一样：把隐性的工程知识显式化。《Learning JavaScript Design Patterns》是把资深工程师脑子里的设计模式写成可学习的目录。Chrome DevTools 的文档是把调试技巧写成可操作的步骤。agent-skills 是把工程纪律写成 Agent 无法自我说服跳过的约束。</p>
<p>用 AI 写代码的人都会碰到一种熟悉的挫败感。Agent 接到任务，跳过规格直接敲代码。你说&quot;先写测试&quot;，它说&quot;好的&quot;，然后继续敲代码。你说&quot;这里需要安全检查&quot;，它说&quot;明白&quot;，然后加了一行 <code>// TODO: add auth</code>。你说&quot;代码能简化一下吗&quot;，它说&quot;当然&quot;，然后把三个函数合并成一个更长的函数。</p>
<p>Agent 不是不听话。它是真的不知道什么叫&quot;先写测试&quot;&quot;安全检查&quot;&quot;简化代码&quot;。这些是资深工程师花了好多年才内化的纪律，而 Agent 的默认行为是用最短路径把代码写出来，能跑就行。其他的都不在它的输出分布里。</p>
<p>agent-skills 要反转的就是这件事。它所有的设计决策，从七阶段生命周期到反合理化表到验证门禁，都指向同一个目标：让 Agent 像资深工程师一样工作。不是写代码更快，是不跳过那些让代码值得写的东西。</p>]]>
    </summary>
    <title>agent-skills：用生产级工程纪律武装 AI Agent</title>
    <updated>2026-06-28T06:46:22.014Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="复利工程" scheme="https://colobu.com/tags/%E5%A4%8D%E5%88%A9%E5%B7%A5%E7%A8%8B/"/>
    <category term="Compound Engineering" scheme="https://colobu.com/tags/Compound-Engineering/"/>
    <content>
      <![CDATA[<blockquote><p>&quot;Each unit of engineering work should make subsequent units easier — not harder.&quot;<br>每一个工程工作单元都应该让后续单元更容易，而不是更难。</p><p>——everyinc&#x2F;compound-engineering-plugin README</p></blockquote><p>第 14 章讲 improve 把计划当作产品，让强模型做判断、弱模型做执行。省了 token。但还有一个问题没回答：省下来的 token 和时间，有没有让你的下一次工作起点更高？</p><p>大部分 AI 编程工具解决的是&quot;这一次&quot;。帮你写代码，跑测试，合 PR。会话结束，上下文消失。下次开新会话，Agent 从零开始重新理解这个项目。构建命令是什么来着？那个奇怪的约定是因为什么历史事故？上次修那个 bug 踩了什么坑？全忘了。Agent 学到的东西，在你关掉终端的那一刻归零。</p><p>Compound Engineering 要反转的就是这件事。核心主张不是&quot;让 Agent 这次做得更好&quot;，是&quot;让 Agent 下次起点更高&quot;。<strong>每一轮工作结束时，把学到的东西沉淀回知识库，变成下一轮 Agent 启动时自动读到的上下文</strong>。用复利的方式做工程。</p><p>这个想法来自 Every 公司（Every.to），由 @kieranklaassen 和 @tmchow 维护。他们把这套方法论打包成 compound-engineering-plugin，MIT 开源，GitHub 18.3K+ star，随插件提供 37 个 skills 和 51 个 agents。支持的编码工具覆盖 Claude Code、Cursor、Codex、GitHub Copilot、Factory Droid、Qwen Code、OpenCode、Pi、Gemini、Kiro，几乎你能叫出名字的都在。</p><span id="more"></span><p><img src="/images/image-20260620035546988.png"></p><h2 id="15-1-什么是复利工程"><a href="#15-1-什么是复利工程" class="headerlink" title="15.1 什么是复利工程"></a>15.1 什么是复利工程</h2><p>&quot;复利工程&quot;不是比喻。Every 团队是认真的。</p><p>传统开发的加速曲线是对数曲线。项目初期进展快，随着代码量增长，复杂度累积，每次改动越来越慢。调试要翻更多文件，重构要查更多依赖，新人要读更多代码才能上手。熵在增加，摩擦力在增加。对抗它的方式，几乎全靠个人记忆和 Code Review 里零散的口头约定。</p><p>复利工程把这条曲线反过来。它在每一轮工作结束时，要求把本轮学到的东西显式写下来、存进仓库。不是&quot;我记住了&quot;，是&quot;下一轮 Agent 启动时会自动读到&quot;。下一轮的 Agent 不需要重新发现那个坑，不需要重新推导那个约定，不需要重新踩同一条弯路。每一轮都比上一轮聪明一点。</p><p>Every 团队的投入结构说明了一切：约 80% 在规划与评审，20% 在执行。这跟传统开发&quot;花 10 分钟想、花一整天写&quot;的习惯反着来。逻辑很简单：锐利的头脑风暴收紧计划范围，紧凑的计划缩小执行自由度，好的评审抓模式而非孤立的 bug。每一阶段的输出质量决定下一阶段的输入质量。在规划上省的时间，执行加倍还回来。在执行上省的时间，将来加倍还回来。</p><p>和第 14 章 improve 比一下。improve 把计划当交付物，强模型做判断、弱模型做执行。Compound Engineering 往前走了一步：不光让计划成为一等公民，还让每一轮工作的学习成果成为一等公民。improve 省了 token，复利工程让省下来的 token 产生复利。</p><h2 id="15-2-核心问题：对抗复杂度的累积"><a href="#15-2-核心问题：对抗复杂度的累积" class="headerlink" title="15.2 核心问题：对抗复杂度的累积"></a>15.2 核心问题：对抗复杂度的累积</h2><p>先看清它在跟什么作斗争。</p><p>软件工程有一个现象，叫&quot;知识散落&quot;。项目跑了一年，团队的集体知识分布在十几个人的脑子里、几百条 Slack 消息里、上千条 Git commit message 里、几十个已经过时的 Wiki 页面里。AI Agent 面对这个项目，能看到的只有源码，最多加一个 README。那些藏在人脑子里的约定、那些被某次事故逼出来的奇怪做法、那些&quot;这个函数不能动因为有个没文档化的副作用&quot;，Agent 完全不知道。</p><p>Agent 在这个信息黑洞里工作。它猜，它假设。写出来的代码技术上正确、上下文中错误，能跑，但破坏了某个没写在任何地方的约定。然后你花时间解释，它重做。下次开新会话，你又解释一遍。</p><p>传统开发已经够糟了，至少人记住了。AI Agent 的记忆在会话结束时就清零。128K 的上下文窗口，一次性的。&quot;知识散落&quot;在 AI 时代被放大了十倍。Agent 写得快，忘得也快。你获得的代码量，被丢失的知识量抵消了一部分。</p><p>复利工程的解法不是让 Agent 记住更多。是让 Agent 每次读同一个文件。STRATEGY.md、brainstorm 文档、plan 文件、compound 记录、pulse 报告，这些不是一回性的交付物，是跨会话存活的知识资产。下一次 Agent 启动时，这些文件自动进入它的上下文。它从&quot;上一次结束的地方&quot;开始，不是从零开始。</p><p>这和第 13 章 GSD Core 的 STATE.md &#x2F; CONTEXT.md 同一个思路：Agent 会忘记，仓库不会。复利工程把这个思路从项目状态管理扩展到了知识管理。不光记录做到哪了，还记录学到了什么。</p><h2 id="15-3-STRATEGY-md：上游的持久锚点"><a href="#15-3-STRATEGY-md：上游的持久锚点" class="headerlink" title="15.3 STRATEGY.md：上游的持久锚点"></a>15.3 STRATEGY.md：上游的持久锚点</h2><p>整个体系里，有一个文件坐在所有东西的上游：STRATEGY.md。</p><p>它不是规格，不是计划，不是 PRD。它是项目级的持久锚点，回答几个最基本的、但 AI Agent 自己永远猜不对的问题：</p><ul><li>这个产品到底在解决谁的什么问题？不是功能列表，是用户痛苦。</li><li>用什么方法解决？不是技术栈，是产品策略和核心假设。</li><li>目标用户画像是什么？不是 demographic 标签，是行为模式和场景。</li><li>怎么度量成功？不是&quot;用户更多&quot;，是具体的、可追踪的指标。</li><li>什么不算成功？团队决定不做什么，这和决定做什么同样重要。</li></ul><p>通过 <code>/ce-strategy</code> 创建和维护。当 STRATEGY.md 存在时，下游所有命令——<code>/ce-ideate</code>、<code>/ce-brainstorm</code>、<code>/ce-plan</code>——在启动时自动读取它作为锚定上下文。一个新 Idea 是否靠谱、一个新需求是否偏离方向、一个新计划是否符合策略，Agent 自己就能做第一轮判断，因为它读到了&quot;这个项目要什么&quot;。</p><p>没有 STRATEGY.md 的 Agent，会在每次运行中优化向随机贡献者碰巧要求的东西。有一个定时阅读的 STRATEGY.md，Agent 知道什么值得做、什么该拒绝。这和 Peter Steinberger 在 Loop Engineering 中讲的 vision.md 是同一个东西：项目的宪法。第 12 章提过，Steinberger 的策略层就是一份 Agent 每次运行都读的项目宪法。复利工程把它固化为一个独立命令和独立文件。</p><h2 id="15-4-主循环：带着更好的上下文重复"><a href="#15-4-主循环：带着更好的上下文重复" class="headerlink" title="15.4 主循环：带着更好的上下文重复"></a>15.4 主循环：带着更好的上下文重复</h2><p><img src="/images/image-20260620040106972.png"></p><p>复利工程的主循环六步。每一步和前几章的方法论有相似的形状，但最后多了一步，那一步是整个体系的灵魂。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">/ce-strategy ──────────────────────────────────────────────┐</span><br><span class="line">  (上游锚点，一次性或定期更新)                               │</span><br><span class="line">                                                           │</span><br><span class="line">/ce-ideate (可选) → /ce-brainstorm → /ce-plan → /ce-work    │</span><br><span class="line">                                           ↓               │</span><br><span class="line">                         /ce-code-review ←                  │</span><br><span class="line">                              ↓                             │</span><br><span class="line">                         /ce-compound ──────────────────────┘</span><br><span class="line">                              │</span><br><span class="line">                    学到的东西沉淀回知识库</span><br><span class="line">                    下一轮 /ce-brainstorm 自动读到</span><br></pre></td></tr></table></figure><p><strong>Ideate（可选）：创意生成与批判。</strong> <code>/ce-ideate</code> 在头脑风暴之前跑。它的工作是生成一批想法，用证据、先例和第一性原理逐一评估，筛出值得进入头脑风暴的。Every 团队在 2026 年 4 月给它加了一个&quot;surprise me&quot;模式：当团队觉得想法太保守时，Agent 可以故意跳出既有框架生成一批高风险高回报的方向。每条想法都有一个&quot;担保合约&quot;，标明它来自直接证据、外部先例、还是第一性推理。这防止了&quot;听起来不错但没人知道为什么&quot;的想法混进下游。</p><p><strong>Brainstorm：交互式问答，产出需求文档。</strong> <code>/ce-brainstorm</code> 是循环的真正入口。它是一个双向对话：Agent 问澄清问题，对模糊表述较真，确认边界条件，然后产出一份结构化的需求文档，存在 <code>docs/brainstorms/</code>。文档大小可控，不是 PRD 的重量级文档，但足够让规划者精确理解要做什么。快速功能可能三五轮对话，复杂系统可能几十轮。</p><p><strong>Plan：需求变实施计划。</strong> <code>/ce-plan</code> 读取上一阶段的需求文档和 STRATEGY.md，产出详细的实现计划。和第 13 章 GSD 的 <code>/gsd-plan-phase</code> 类似，研究、分解、验证计划装得进一个上下文窗口。输出包括任务依赖图、预估工作量、文件变更范围。</p><p><strong>Work：隔离执行。</strong> <code>/ce-work</code> 在隔离的 git worktree 里执行计划，带任务追踪。和第 11 章 kanbots 的 worktree 隔离同一个原理，每个 Agent 在自己的 checkout 里工作，互不干扰。</p><p><strong>Code Review：多 Agent 预合并审查。</strong> <code>/ce-code-review</code> 派出一组专门的审查员 Agent，最多 20 个并行跑，从不同维度审查变更：正确性、安全、性能、可维护性、代码风格、测试覆盖。置信度评分，自动去重。和第 33 章 <code>/review-it</code> 同样的使命，区别在于复利工程默认派多个 Agent 而非一个。</p><p><strong>Compound：沉淀学到的东西。</strong> 这是整个循环的灵魂。<code>/ce-compound</code> 把本轮工作中学到的、任何未来 Agent 应该知道的东西，写进仓库。发现的模式、踩过的坑、根因分析的结果、被证伪的假设、新增的约束。输出存在 <code>docs/solutions/</code> 或相关目录，成为知识库的一部分。</p><p>下一次 <code>/ce-brainstorm</code> 启动时，Agent 读到的不只是 STRATEGY.md，还有上一轮沉淀下来的 compound 记录。它知道上一次类似的需求怎么做的，上一次类似的 bug 根因是什么，上一次类似的重构为什么选了那个方向。每一轮工作都让下一轮起点更高。</p><p>和第 5 章 gstack、第 8 章 Goal Workflow 相比，复利工程的主循环在前半段几乎一样。区别在末端：别人在 Review 之后交付，复利工程在 Review 之后先 Compound 再交付。这一步把知识复用从个人习惯变成了工作流里的强制环节。</p><p>举个具体的例子。假设你让 Agent 修一个 webhook 重复创建发票的 bug：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/ce-debug &quot;the checkout webhook sometimes creates duplicate invoices&quot;</span><br></pre></td></tr></table></figure><p>Agent 复现问题，追到根因：webhook 在特定网络条件下会收到两次 delivery，而幂等键生成逻辑没有覆盖超时重试的场景。修完代码，跑完测试，过完审查。</p><p>传统的 Agent 在这里就停了。Commit，Push，开 PR，关会话。</p><p>复利工程要求多做一步：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/ce-compound</span><br></pre></td></tr></table></figure><p>Agent 把这一轮学到的写下来：webhook 幂等键逻辑的当前假设和已知边界；超时重试和 webhook delivery 之间的竞态模式；哪些相关函数使用了类似假设，可能在不同条件下出现同样问题；一个 checklist，未来任何改 webhook 相关代码的人或 Agent 都应该检查。</p><p>下一次，另一个 Agent 处理另一个 webhook 相关任务时，启动时自动读到这些记录。它不会犯同一个错误。它甚至能在自己修改代码之前，自查&quot;我有没有碰那些已知有竞态风险的函数&quot;。</p><p>不是 Agent 变聪明了。是知识变持久了。</p><h2 id="15-5-命令全景"><a href="#15-5-命令全景" class="headerlink" title="15.5 命令全景"></a>15.5 命令全景</h2><p>复利工程的命令全部以 <code>ce-</code> 前缀，保持命名空间干净。按使用频率分四组：</p><p><strong>核心循环（每次都走）：</strong></p><table><thead><tr><th>命令</th><th>做什么</th><th>位置</th></tr></thead><tbody><tr><td><code>/ce-brainstorm</code></td><td>交互式问答，产出需求文档</td><td>循环入口</td></tr><tr><td><code>/ce-plan</code></td><td>需求变实施计划</td><td>规划</td></tr><tr><td><code>/ce-work</code></td><td>worktree 隔离执行，带任务追踪</td><td>执行</td></tr><tr><td><code>/ce-code-review</code></td><td>多 Agent 预合并审查</td><td>审查</td></tr><tr><td><code>/ce-compound</code></td><td>沉淀学到的东西到知识库</td><td>复利</td></tr></tbody></table><p><strong>上游锚点（低频但关键）：</strong></p><table><thead><tr><th>命令</th><th>做什么</th></tr></thead><tbody><tr><td><code>/ce-strategy</code></td><td>创建或维护 STRATEGY.md</td></tr><tr><td><code>/ce-ideate</code></td><td>创意生成与批判（可选前置步骤）</td></tr></tbody></table><p><strong>辅助工具：</strong></p><table><thead><tr><th>命令</th><th>做什么</th></tr></thead><tbody><tr><td><code>/ce-setup</code></td><td>首次环境检查和项目 bootstrap</td></tr><tr><td><code>/ce-debug</code></td><td>系统化复现、追溯根因、修复</td></tr><tr><td><code>/ce-doc-review</code></td><td>文档审查</td></tr><tr><td><code>/ce-product-pulse</code></td><td>按时间窗生成使用&#x2F;性能&#x2F;错误报告，存入 <code>docs/pulse-reports/</code></td></tr></tbody></table><p><strong>效率工具：</strong></p><table><thead><tr><th>命令</th><th>做什么</th></tr></thead><tbody><tr><td><code>/ce-commit</code></td><td>分析变更并生成 commit</td></tr><tr><td><code>/ce-commit-push-pr</code></td><td>一键分支、提交、推送、PR</td></tr><tr><td><code>/ce-worktree</code></td><td>手动管理 worktree</td></tr></tbody></table><p>完整列表 37 个 skills 分布在核心工作流、研究与上下文、Git 工作流、审查与质量、开发框架、工具、实验七大类。51 个 agents 覆盖代码审查（20 个专业审查员）、文档审查（7 个维度）、研究（9 个深浅组合）、设计（3 个视角）、工作流编排（2 个调度器）。</p><h2 id="15-6-跨平台与-刻意的固执己见"><a href="#15-6-跨平台与-刻意的固执己见" class="headerlink" title="15.6 跨平台与&quot;刻意的固执己见&quot;"></a>15.6 跨平台与&quot;刻意的固执己见&quot;</h2><p>复利工程支持 10 种以上的 AI 编码工具。Claude Code 最简单，插件市场直接装。其他工具通过 Bun&#x2F;TypeScript 安装器适配：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Claude Code</span></span><br><span class="line">/plugin marketplace add EveryInc/compound-engineering-plugin</span><br><span class="line">/plugin install compound-engineering</span><br><span class="line"></span><br><span class="line"><span class="comment"># 其他工具</span></span><br><span class="line">bunx @every-env/compound-plugin install compound-engineering --to cursor</span><br></pre></td></tr></table></figure><p>装完跑 <code>/ce-setup</code>，Agent 自动检查环境、初始化目录结构、生成基础配置。</p><p>Every 团队在 README 里有一句话值得注意：这个项目刻意固执己见（opinionated by design）。他们欢迎 issue 和 PR 讨论，但不会接受所有贡献。不是所有建议都是好建议，不是所有定制都应该变成配置选项。这个态度在开源社区不太常见，但放在方法论工具上很合理：一个没有主张的工具比没有用还糟，因为它让你觉得你在做事。</p><p>安装器自动适配不同平台的命令命名，有的用连字符，有的用冒号，开发者不需要手动处理。</p><h2 id="15-7-与全书方法论的对接"><a href="#15-7-与全书方法论的对接" class="headerlink" title="15.7 与全书方法论的对接"></a>15.7 与全书方法论的对接</h2><p>复利工程把知识复用做成了工作流里的强制环节，这在前面的章节里只有萌芽。</p><p><strong>和第 2 章 Skills。</strong> <code>/ce-compound</code> 沉淀下来的模式、坑、约束、checklist，最终可以固化为可复用的 Skill。Matt Pocock 的小而可组合的 Skill 是复利的天然载体。复利工程给这个载体加了一个进水管：每次循环结束时，新知识自动流入。</p><p><strong>和第 8 章 Goal Workflow 高度同构。</strong> <code>/ce-brainstorm → /ce-plan → /ce-work → /ce-code-review</code> 这条链和 <code>/prd → /prd-to-spec → /goal → /review-it</code> 长得几乎一样。区别在末端：复利工程显式加了 <code>/ce-compound</code>；上游加了 <code>/ce-strategy</code> 作为持久锚点。Goal Workflow 适合单功能的一次性实现，复利工程适合持续运行的团队级工程。</p><p><strong>和第 12 章 Loop Engineering。</strong> Loop 用五个原语加状态记忆让 Agent 自主跑起来。复利工程在这个基础上加了一个机制：Loop 不只跑，还记录。每一次循环的产出不光是代码，还有&quot;这一次学到了什么&quot;。下一次循环启动时，Agent 读到的不只是进度状态，还有累积的知识。</p><p><strong>和第 13&#x2F;14 章同属&quot;规划重于执行&quot;。</strong> 三者都信规划比执行能产生更多杠杆。GSD 把重心放在上下文隔离和验证证据上，improve 把重心放在强模型审计和计划即产品上，复利工程把重心进一步前移到 80% 的规划与评审。但它的独特贡献不是更重的规划，是规划产出的知识能被下一轮复用。</p><p><strong>和第 33 章 &#x2F;review-it。</strong> <code>/ce-code-review</code> 派 20 个专业审查员并行审查，是 <code>/review-it</code> 的多 Agent 版本。置信度门控、去重、模式识别，机制上比单 Agent 审查更完善。</p><h2 id="15-8-本章小结"><a href="#15-8-本章小结" class="headerlink" title="15.8 本章小结"></a>15.8 本章小结</h2><p>Compound Engineering 把复利从一个金融概念变成了一套工程纪律。它的核心不是让 Agent 这次做得更好，是让 Agent 下次起点更高。</p><p>三根支柱。第一，STRATEGY.md 作为上游锚点，给所有下游决策提供方向，Agent 不该优化向随机贡献者碰巧要求的东西。第二，80&#x2F;20 的投入结构，把重心前移到能产生复利的环节：计划的质量决定执行的质量，执行的质量决定沉淀的质量，沉淀的质量决定下一轮计划的质量。第三，<code>/ce-compound</code> 作为强制环节，每次循环结束时把学到的东西显式写下来、存进仓库，让知识的生命周期超过一次会话。</p><p>传统开发对抗复杂度靠人的记忆和口口相传。AI 开发连这个都没有，Agent 的记忆在会话结束时归零。复利工程让知识活在文件系统里，不活在任何人的脑子里或任何 Agent 的上下文窗口里。37 个 skills、51 个 agents、10 种以上编码工具支持。这些数字背后是一个更简单的道理：你做的好工作，应该继续为你工作。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/compound-engineering-each-job-eases-the-next/</id>
    <link href="https://colobu.com/2026/06/28/compound-engineering-each-job-eases-the-next/"/>
    <published>2026-06-28T07:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>&quot;Each unit of engineering work should make subsequent units easier — not harder.&quot;<br>每一个工程工作单元都应该让后续单元更容易，而不是更难。</p>
<p>——everyinc&#x2F;compound-engineering-plugin README</p>
</blockquote>
<p>第 14 章讲 improve 把计划当作产品，让强模型做判断、弱模型做执行。省了 token。但还有一个问题没回答：省下来的 token 和时间，有没有让你的下一次工作起点更高？</p>
<p>大部分 AI 编程工具解决的是&quot;这一次&quot;。帮你写代码，跑测试，合 PR。会话结束，上下文消失。下次开新会话，Agent 从零开始重新理解这个项目。构建命令是什么来着？那个奇怪的约定是因为什么历史事故？上次修那个 bug 踩了什么坑？全忘了。Agent 学到的东西，在你关掉终端的那一刻归零。</p>
<p>Compound Engineering 要反转的就是这件事。核心主张不是&quot;让 Agent 这次做得更好&quot;，是&quot;让 Agent 下次起点更高&quot;。<strong>每一轮工作结束时，把学到的东西沉淀回知识库，变成下一轮 Agent 启动时自动读到的上下文</strong>。用复利的方式做工程。</p>
<p>这个想法来自 Every 公司（Every.to），由 @kieranklaassen 和 @tmchow 维护。他们把这套方法论打包成 compound-engineering-plugin，MIT 开源，GitHub 18.3K+ star，随插件提供 37 个 skills 和 51 个 agents。支持的编码工具覆盖 Claude Code、Cursor、Codex、GitHub Copilot、Factory Droid、Qwen Code、OpenCode、Pi、Gemini、Kiro，几乎你能叫出名字的都在。</p>]]>
    </summary>
    <title>Compound Engineering：让每一份工作都让下一份更容易</title>
    <updated>2026-06-28T06:46:22.014Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="shadcn" scheme="https://colobu.com/tags/shadcn/"/>
    <category term="成本优化" scheme="https://colobu.com/tags/%E6%88%90%E6%9C%AC%E4%BC%98%E5%8C%96/"/>
    <content>
      <![CDATA[<blockquote><p>&quot;The plan is the product.&quot;<br>计划才是产品。</p><p>——shadcn&#x2F;improve README</p></blockquote><p>shadcn 是谁，不用多介绍。他创建的 shadcn&#x2F;ui 是 GitHub 上 Star 数最高的 React 组件库之一，11 万+，几乎凭一己之力改变了前端组件库的交付范式——不是&quot;装一个 npm 包&quot;，是&quot;把源码拷进你的项目，你拥有它，你改它，你对它负责&quot;。这种对控制权和所有权的执念，是他所有作品的设计 DNA。</p><p>2026 年 6 月，他在这个 DNA 上又加了一层——开源了一个叫 improve 的 Agent Skill。一周之内，5000+ star。</p><p>improve 做的事情，说穿了就是一句话：用最贵的模型读代码库、找问题、写执行计划，用最便宜的模型照着计划敲代码。它自己不碰源码，产出只有一种东西——计划。</p><p>这个分工背后是一笔所有用 AI 写代码的人都在付、但很少认真算过的账。用 Opus 读代码库、找 bug、排优先级，值。用 Opus 敲每一行代码、跑每一个测试、写每一句 commit message，不值。但现在的 AI 编程工具不管这些——你给它们什么模型，它们就全程用什么模型。预算好的团队手动切模型——研究阶段用 Opus，实现了切 Sonnet，跑测试了再切 Haiku。切来切去，时间都花在模型下拉菜单上了。</p><p>improve 把这个手动切换内建成了自动分工：强模型只负责判断。执行扔给最便宜的、够用的模型。</p><span id="more"></span><p><img src="/images/image-20260620033121755.png"></p><p>第 13 章讲 GSD Core 用阶段循环、子智能体和持久化工件对抗上下文腐化。GSD 的回答是&quot;给每个 Agent 一份干净的上下文&quot;。本章讲同一个问题的另一个切面：不是管上下文，管成本。GSD 默认质量优先，谁干活无所谓。但真金白银的 API 账单不这么想。improve 的回答是：强模型做判断，弱模型做执行——把账单和质量一起管了。</p><h2 id="14-1-improve-是什么"><a href="#14-1-improve-是什么" class="headerlink" title="14.1 improve 是什么"></a>14.1 improve 是什么</h2><p>安装一行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add shadcn/improve</span><br></pre></td></tr></table></figure><p>MIT 开源，遵循 Agent Skills 格式（agentskills.io），Claude Code、Cursor、Codex、OpenCode 装完就能调。</p><p>但它跟前面章节讲的技能有一个根本区别。Mattpocock 的 <code>/diagnose</code> 帮你修 bug。gstack 的 <code>/review</code> 帮你查代码。Goal Workflow 的 <code>/goal</code> 帮你实现功能。improve 反着来。你让它&quot;帮我实现这个&quot;，它说不。你让它&quot;帮我修这个 bug&quot;，它说不。它只做一件事：读你的代码库，找出该做什么，写成一份计划。</p><p>README 里有两句话定义了它的全部边界。第一句：&quot;你是一个高级顾问，不是实现者。&quot;第二句：&quot;计划才是产品——它的质量决定了执行者能不能成功。&quot;理解 improve 所有设计决策的钥匙就是这两句话。它不是执行工具，是决策工具。交付物不是代码，是决策。</p><p>这带来一个权力反转。大多数 AI 编程工具把写代码当作正事，写计划是可有可无的前置步骤。improve 反过来：计划是一等公民，代码只是计划的衍生品。一份好计划应该自包含到什么程度？你把它交给一个完全不了解这个项目的人，或者 Agent，他能照着做完，不用你坐在旁边解释。需要你解释，计划没写好。</p><h2 id="14-2-核心思想：能力与成本的分离"><a href="#14-2-核心思想：能力与成本的分离" class="headerlink" title="14.2 核心思想：能力与成本的分离"></a>14.2 核心思想：能力与成本的分离</h2><p>improve 的经济账一句话：高杠杆的思考给贵模型，高重复的执行给便宜模型。</p><p><img src="/images/image-20260620033329316.png"></p><p>听起来像废话，谁不知道贵的模型好？但 improve 做的不是&quot;用贵的 &#x3D; 更好&quot;这种粗糙选择。它分了工：</p><table><thead><tr><th>工作</th><th>性质</th><th>需要的智能</th><th>交给</th></tr></thead><tbody><tr><td>读懂整个代码库</td><td>一次性、高杠杆</td><td>跨文件推理、架构判断、安全直觉</td><td>Opus&#x2F;GPT-4 级别</td></tr><tr><td>判断什么值得做</td><td>一次性、高杠杆</td><td>权衡、优先级、成本估计</td><td>Opus&#x2F;GPT-4 级别</td></tr><tr><td>写规格和计划</td><td>一次性、高杠杆</td><td>精确表达、边界定义、验证设计</td><td>Opus&#x2F;GPT-4 级别</td></tr><tr><td>照着计划写代码</td><td>重复、低杠杆</td><td>按指令执行、跑测试、报结果</td><td>Haiku&#x2F;GPT-4o-mini 级别</td></tr></tbody></table><p>这个分工和第 12 章的 maker-checker 分离、第 13 章的瘦编排者模式有同一个源头：不同性质的活交给不同的 Agent。但分工轴不同。GSD 按阶段分（研究员 vs 执行器 vs 验证者），improve 按智能密度分。读代码、做判断、写规格，这些活智能密集，强模型贵得值。敲代码、跑测试、报结果，智能稀疏，弱模型够了。</p><p>improve 的 README 用一句话概括了这个经济逻辑：昂贵的、天花板高的模型做智能会累积的那部分——理解、判断、写规格；便宜的模型做执行。翻译过来就是：让最贵的模型做它最擅长的事，然后让便宜的照着做。</p><p>这里藏着一个关键前提，也是 improve 最深的洞见：执行的质量上限是计划的质量。弱模型拿烂计划产出烂代码。拿好计划——内联了文件路径、代码摘录、验证命令、STOP 条件——产出接近强模型。弱模型的瓶颈不是不会写代码，是没有上下文。自包含的计划刚好补上。</p><p>说白了，improve 干的事就是把强模型对代码库的理解蒸馏到一份 markdown 里，这份文件变成弱模型的上下文。强模型烧一次 token，弱模型烧很多次。只要计划好，每次执行都复用那一次深度分析。总账是省的。</p><h2 id="14-3-五阶段流水线：Recon-→-Audit-→-Vet-→-Prioritize-→-Plan"><a href="#14-3-五阶段流水线：Recon-→-Audit-→-Vet-→-Prioritize-→-Plan" class="headerlink" title="14.3 五阶段流水线：Recon → Audit → Vet → Prioritize → Plan"></a>14.3 五阶段流水线：Recon → Audit → Vet → Prioritize → Plan</h2><p>improve 的工作流五步，每步明确的输入、输出和质量标准。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Recon → Audit → Vet → Prioritize → Plan</span><br><span class="line">  │        │       │         │          │</span><br><span class="line">  │        │       │         │          └── 为每个选中发现写可执行计划</span><br><span class="line">  │        │       │         └── 按杠杆率排成优先级表</span><br><span class="line">  │        │       └── 重读源码剔除误报</span><br><span class="line">  │        └── 并行子智能体扫九大类</span><br><span class="line">  └── 画仓库地图</span><br></pre></td></tr></table></figure><p><img src="/images/image-20260620033637279.png"></p><h3 id="14-3-1-Recon：画地图"><a href="#14-3-1-Recon：画地图" class="headerlink" title="14.3.1 Recon：画地图"></a>14.3.1 Recon：画地图</h3><p>Recon 不分析，只测绘。规划前回答几个最基本的问题：</p><ul><li><strong>技术栈</strong>。语言、框架、包管理器、构建系统。读 <code>package.json</code>、<code>Cargo.toml</code>、<code>go.mod</code>，不猜。</li><li><strong>目录结构</strong>。<code>src/</code> 还是 <code>app/</code>？monorepo 还是单包？测试放哪？配置放哪？</li><li><strong>构建&#x2F;测试&#x2F;Lint 命令</strong>。精确到能粘贴进终端的程度。<code>npm test</code> 还是 <code>pytest</code>？有没有覆盖率阈值？</li><li><strong>代码约定</strong>。命名风格、文件组织模式、已有的 lint 规则。</li><li><strong>意图文档</strong>。如果项目里有 <code>CONTEXT.md</code>（第 13 章）、<code>STRATEGY.md</code>（第 15 章）、ADR 目录、PRD 文件，Recon 优先吸收。别人花 token 讨论出来的决定，不要重新花 token 再讨论一遍。</li></ul><p>Recon 的输出是一份代码库地图，后续所有阶段共享。它自己不产生发现，但所有发现依赖它。一个审计员不知道项目是 monorepo，可能把&quot;每个子包有自己的 <code>tsconfig.json</code>&quot;标记为冗余。实际上是设计决定。</p><h3 id="14-3-2-Audit：九类并行扫描"><a href="#14-3-2-Audit：九类并行扫描" class="headerlink" title="14.3.2 Audit：九类并行扫描"></a>14.3.2 Audit：九类并行扫描</h3><p>整个流水线最烧 token 的阶段，也是强模型最值钱的地方。</p><p>improve 派出多个子智能体，每个扫一个维度，并行跑：</p><table><thead><tr><th>维度</th><th>关心什么</th></tr></thead><tbody><tr><td>正确性</td><td>逻辑错误、边界条件、空值处理、竞态条件</td></tr><tr><td>安全</td><td>OWASP Top 10、注入、敏感信息泄露、不安全的依赖</td></tr><tr><td>性能</td><td>不必要的分配、N+1 查询、阻塞 I&#x2F;O、内存泄漏</td></tr><tr><td>测试覆盖</td><td>缺测试、脆弱的测试、不可测的代码结构</td></tr><tr><td>技术债</td><td>重复代码、死代码、过度抽象、违反约定的模式</td></tr><tr><td>依赖与迁移</td><td>过时的依赖、未解决的迁移、版本漂移</td></tr><tr><td>开发者体验</td><td>类型安全缺失、构建慢、开发环境摩擦</td></tr><tr><td>文档</td><td>缺失或过时的文档、误导性的注释</td></tr><tr><td>方向</td><td>缺失的功能、架构演进机会、roadmap 对齐</td></tr></tbody></table><p>每个维度的子智能体独立工作，和第 13 章 GSD 的并行 mapper 同一个模式。并行跑，总时间等于最慢的那一个。</p><p>每条发现带四样东西：<code>file:line</code> 证据，不写&quot;可能有注入风险&quot;写 <code>src/auth/login.ts:42</code>；影响评估，如果不管会怎样；预估工作量，S&#x2F;M&#x2F;L&#x2F;XL；置信度。</p><p>有一个重要选择：子智能体默认过度上报。宁可多报 100 个最后被筛掉的疑似问题，不能漏一个真的。假阳性浪费的是 Vet 阶段的 token，假阴性浪费的是将来的线上事故。token 比事故便宜。</p><h3 id="14-3-3-Vet：剔除误报"><a href="#14-3-3-Vet：剔除误报" class="headerlink" title="14.3.3 Vet：剔除误报"></a>14.3.3 Vet：剔除误报</h3><p>Audit 产出发现，Vet 做质量控制。</p><p>做法很暴力：顾问角色重新读每一个被引用的源码位置，逐条核实&quot;真的有问题吗？&quot;</p><p>第 12 章说过 maker-checker 分离，写代码和查代码的不能用同一个 Agent，自己给自己打分太客气。Audit 也一样：发现者对自己的发现有确认偏差。子智能体找到一个问题的时候，已经带着&quot;这里有问题&quot;的假设读了那段代码。让它再读一遍，大概率还是觉得有问题。</p><p>Vet 用一个独立的 Agent 重新读，带着&quot;这条可能是错的&quot;的假设。被踢掉的发现记进误报清单，下次审计直接跳过。这个记仇机制很重要。没有它，每次审计都重新报同样的假阳性，你很快就学会忽略所有发现。</p><h3 id="14-3-4-Prioritize：按杠杆率排序"><a href="#14-3-4-Prioritize：按杠杆率排序" class="headerlink" title="14.3.4 Prioritize：按杠杆率排序"></a>14.3.4 Prioritize：按杠杆率排序</h3><p>Vet 之后一批确认的发现。全做不现实。Prioritize 排优先级。</p><p>基础公式：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">杠杆率 = 影响 ÷ 工作量</span><br></pre></td></tr></table></figure><p>影响和工作量都有不确定性，改进后：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">加权杠杆率 = (影响 × 影响置信度) ÷ (工作量 × 工作量置信度)</span><br></pre></td></tr></table></figure><p>一个影响极高但置信度低的发现（&quot;可能&quot;有严重安全漏洞），和一个影响中等但置信度高的发现（&quot;确定&quot;有个性能瓶颈），后者的加权杠杆率可能更高。公式把&quot;把握有多大&quot;算进去了。</p><p>输出是一张表，不是指令。Prioritize 不说&quot;你应该做前三个&quot;，那是人做的决定。但它把信息排清楚，你花最少的时间就能选。</p><h3 id="14-3-5-Plan：写执行手册"><a href="#14-3-5-Plan：写执行手册" class="headerlink" title="14.3.5 Plan：写执行手册"></a>14.3.5 Plan：写执行手册</h3><p>最后一步，对你选中的每个发现写一份可执行计划。存在 <code>plans/</code> 目录，一个发现一个文件，纯 markdown，人读得了，Agent 也读得了。</p><p>计划有索引文件，记录顺序和依赖。计划 C 依赖计划 A 完成后的文件结构，依赖图会标出来。</p><p>五步走完就是&quot;计划即产品&quot;的完整闭环：Audit 告诉你有什么值得做，Vet 确认真的值得，Prioritize 告诉你先做哪个，Plan 告诉执行者怎么干。</p><h2 id="14-4-命令全景"><a href="#14-4-命令全景" class="headerlink" title="14.4 命令全景"></a>14.4 命令全景</h2><p>improve 的命令设计有个原则：从最常用的路径出发，用标志而不是子命令表达变化。默认无参数走完整流水线，大多数时候这就是你要的。其他命令是变体。</p><p><img src="/images/image-20260620101223900.png"></p><table><thead><tr><th>命令</th><th>做什么</th><th>什么时候用</th></tr></thead><tbody><tr><td><code>/improve</code></td><td>完整流水线</td><td>日常改进</td></tr><tr><td><code>/improve quick</code></td><td>只扫热点，返回最优先的发现</td><td>快速体检</td></tr><tr><td><code>/improve deep</code></td><td>穷尽扫描每个包、每个维度</td><td>上线前、接手新项目</td></tr><tr><td><code>/improve security</code></td><td>只做安全审计</td><td>合规、安全评审前</td></tr><tr><td><code>/improve perf</code></td><td>只做性能审计</td><td>优化轮</td></tr><tr><td><code>/improve tests</code></td><td>只做测试覆盖</td><td>补测试前摸底</td></tr><tr><td><code>/improve bugs</code></td><td>只做正确性审计</td><td>Bug bash 前</td></tr><tr><td><code>/improve branch</code></td><td>只审计当前分支变更</td><td>PR 前自查</td></tr><tr><td><code>/improve next</code></td><td>功能建议、roadmap 方向</td><td>下轮规划</td></tr><tr><td><code>/improve plan &lt;描述&gt;</code></td><td>跳过审计，直接为一件事写计划</td><td>需求已明确</td></tr><tr><td><code>/improve execute &lt;计划&gt;</code></td><td>隔离 worktree 派廉价执行器，完事审查 diff</td><td>执行已批准的计划</td></tr><tr><td><code>/improve review-plan &lt;文件&gt;</code></td><td>强模型评审已有计划</td><td>计划评审</td></tr><tr><td><code>/improve reconcile</code></td><td>刷新 backlog，验证完成、解除阻塞、退役过时的</td><td>定期维护</td></tr></tbody></table><p>带 <code>--issues</code> 时，improve 同时把计划发成 GitHub Issue，每个计划一个 Issue，带标签和依赖引用。计划从 <code>plans/</code> 目录走出来，进入团队工作流，可以被 assign、comment、close。</p><h3 id="14-4-1-execute-的设计"><a href="#14-4-1-execute-的设计" class="headerlink" title="14.4.1 execute 的设计"></a>14.4.1 execute 的设计</h3><p><code>/improve execute</code> 是唯一碰代码的命令，唯一偏离&quot;improve 不碰源码&quot;的地方。但它很克制：</p><ol><li>在隔离的 git worktree 里开全新上下文。</li><li>派一个廉价执行 Agent，只给它目标和计划文件。</li><li>执行 Agent 按计划写代码、跑验证门禁、报告结果。</li><li>执行完后，improve 用强模型审查 diff，确认改动严格符合计划，没多干，没漏验证。</li></ol><p>有一个人的决策点：审查通过后 diff 摆在你面前，你决定合不合。improve 不替你 commit，不开 PR，不 merge。它把执行自动化了，接受权在你手里。和第 11 章 kanbots 的&quot;晋升永远是手动操作&quot;同一个道理：代码最终要有人对它负责。</p><h3 id="14-4-2-实战：一个开发者的一小时"><a href="#14-4-2-实战：一个开发者的一小时" class="headerlink" title="14.4.2 实战：一个开发者的一小时"></a>14.4.2 实战：一个开发者的一小时</h3><p>原理和命令都讲完了。下面走一遍真的——假设你维护一个 TypeScript monorepo，<code>packages/</code> 下十几个子包，pnpm + vitest + tsup。你想看看代码库里藏着什么债。</p><p><strong>第 1 步：装 improve。</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npx skills add shadcn/improve</span><br></pre></td></tr></table></figure><p>几秒装完。不需要配置，不需要 API key，不需要连什么外部服务。它就是一个技能文件加一组指令，装进你已有的 Agent。</p><p><strong>第 2 步：跑一次全面审计。</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ /improve</span><br></pre></td></tr></table></figure><p>Agent 开始干活了。先吐出来的是 Recon 摘要——它读了 <code>package.json</code>、<code>tsconfig.json</code>、<code>.github/workflows/ci.yml</code>、<code>pnpm-workspace.yaml</code>，把技术栈和构建命令摸清楚了。你扫一眼，没问题，等它继续。</p><p>接下来几分钟终端持续滚动。九个子智能体在并行跑，每个盯一个维度。你会看到进度提示：<code>[Audit] correctness... done.</code>、<code>[Audit] security... done.</code>、<code>[Audit] performance... running...</code>。总时间差不多等于最慢的那个维度，通常两三分钟。</p><p><strong>第 3 步：看 Vet 结果。</strong></p><p>Audit 跑完，improve 自动切到 Vet。它把 Audit 报的每一条发现重新读一遍源码，验证是不是真的。停下来的输出是这样的：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">[Vet] 32 findings → 23 confirmed, 6 rejected, 3 merged</span><br><span class="line"></span><br><span class="line">Rejected (false positives):</span><br><span class="line">  ✗ SEC-03: https_proxy in src/fetch.ts:10 flagged as SSRF</span><br><span class="line">    → By-design: standard proxy convention. Added to veto log.</span><br><span class="line">  ✗ TYPE-01: strict:false in tsconfig.json flagged as missing type safety</span><br><span class="line">    → Monorepo root config. Sub-packages each enable strict independently.</span><br></pre></td></tr></table></figure><p>被踢掉的写进了 <code>plans/.veto-log.md</code>。下次审计这两个位置直接跳过。你注意到 23 个确认发现里有些你看一眼就知道是边角料——变量命名可以更好、注释可以补一补。快速往下翻，找那些你也不知道存在的问题。</p><p><strong>第 4 步：看 Prioritize 排序表。</strong></p><p>Vet 结束，Prioritize 把 23 条发现排成了一张表。前面几行是这样的：</p><table><thead><tr><th>#</th><th>发现</th><th>分类</th><th>位置</th><th>影响</th><th>工作量</th><th>杠杆率</th></tr></thead><tbody><tr><td>1</td><td><code>migrate-icons.ts:168</code> 图标迁移循环内全量扫描，O(n²)</td><td>性能</td><td>perf-04</td><td>中</td><td>S</td><td><strong>很高</strong></td></tr><tr><td>2</td><td><code>getShadowConfig</code> 逻辑在 <code>search.ts</code> 和 <code>view.ts</code> 里分别实现，已有偏离</td><td>技术债</td><td>debt-02</td><td>中</td><td>M</td><td>高</td></tr><tr><td>3</td><td>CI 只跑 <code>packages/core</code>，<code>packages/cli</code> 零覆盖</td><td>测试</td><td>test-01</td><td>高</td><td>M</td><td>高</td></tr><tr><td>4</td><td><code>colorUtils.ts:34</code> 暴露了内部函数 <code>parseAlpha</code>，公开 API 已覆盖</td><td>技术债</td><td>debt-07</td><td>低</td><td>S</td><td>中</td></tr><tr><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td></tr></tbody></table><p>你在这张表前面花了五分钟。不是看每条发现是什么——而是判断哪条值得现在修。发现 #1 工作量 S 杠杆率很高，闭着眼勾。发现 #2 你之前隐约感觉两处代码有重复但没细查过，improve 证实了而且偏离已经在发生，勾。发现 #3 是真实问题但需要写一整组 CI 测试，今天不想干这个，标记一下以后回来。发现 #4 和后面的十几条要么影响太低、要么你现在有别的事，不勾。</p><p><strong>第 5 步：看生成的 Plan。</strong></p><p>你勾了 #1 和 #2。improve 为每条生成一个 markdown 计划文件。你打开 <code>plans/001-fix-icon-migration-o-n2.md</code>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">id: PLAN-001</span><br><span class="line">title: 修复 migrate-icons.ts 的 O(n²) 图标迁移</span><br><span class="line">category: performance</span><br><span class="line">effort: S</span><br><span class="line"><span class="section">based<span class="emphasis">_on_</span>commit: e4f8a2c</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 现状</span></span><br><span class="line"><span class="code">`packages/cli/src/migrate-icons.ts:168`</span> 对每个待迁移的图标文件</span><br><span class="line">在整个文件系统里做正则搜索，循环嵌套，文件多时 O(n²)：</span><br><span class="line"></span><br><span class="line">// migrate-icons.ts:165-175</span><br><span class="line">for (const file of iconFiles) &#123;</span><br><span class="line">  const pattern = new RegExp(escapeRegex(file.oldName), &#x27;g&#x27;)</span><br><span class="line">  for (const target of allProjectFiles) &#123;  // 内层全量扫描</span><br><span class="line"><span class="code">    ...</span></span><br><span class="line"><span class="code">  &#125;</span></span><br><span class="line"><span class="code">&#125;</span></span><br><span class="line"><span class="code"></span></span><br><span class="line"><span class="section">## 目标</span></span><br><span class="line">将内层循环替换为一次性构建的全局替换映射，单次遍历所有文件。</span><br><span class="line"></span><br><span class="line"><span class="section">## 修改范围</span></span><br><span class="line"><span class="bullet">-</span> packages/cli/src/migrate-icons.ts，约 165-200 行</span><br><span class="line"><span class="bullet">-</span> 新增 packages/cli/src/<span class="strong">__tests__</span>/migrate-icons.test.ts</span><br><span class="line"></span><br><span class="line"><span class="section">## 验证</span></span><br><span class="line"><span class="bullet">1.</span> pnpm --filter @shadcn/cli typecheck —— 零错误</span><br><span class="line"><span class="bullet">2.</span> pnpm --filter @shadcn/cli test -- --grep &quot;migrate&quot; —— 全过</span><br><span class="line"><span class="bullet">3.</span> pnpm --filter @shadcn/cli lint —— 零警告</span><br><span class="line"></span><br><span class="line"><span class="section">## STOP 条件</span></span><br><span class="line"><span class="bullet">-</span> migrate-icons.ts 在 commit e4f8a2c 之后有改动，停，报告</span><br><span class="line"><span class="bullet">-</span> 改动涉及 packages/cli/src/ 下超过 2 个文件，停，报告</span><br><span class="line"><span class="bullet">-</span> 任一验证步骤连续失败 2 次，停，报告</span><br></pre></td></tr></table></figure><p>你扫了一眼。路径对。命令对。STOP 条件合理。份量够一个人（或一个 Haiku）30 分钟内干完。你把这份文件也扔给旁边新来的同事看了一眼，他点点头——项目他完全不了解，但这份计划他看得懂要改哪里、怎么验证、什么情况该停。</p><p><strong>第 6 步：执行计划。</strong></p><p>你决定先修 #1。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ /improve execute plans/001-fix-icon-migration-o-n2.md</span><br></pre></td></tr></table></figure><p>improve 在隔离 worktree 里切出一个干净分支，派 Haiku 干活。你的终端开始滚动：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">[Execute] Worktree created at .worktrees/improve-001/</span><br><span class="line">[Execute] Executor: Haiku (cheapest available)</span><br><span class="line">[Execute] Reading plan... applying changes...</span><br><span class="line">[Verify] pnpm typecheck... PASS</span><br><span class="line">[Verify] pnpm test --grep &quot;migrate&quot;... 3 passed, 0 failed</span><br><span class="line">[Verify] pnpm lint... PASS</span><br><span class="line">[Review] Diff review by Opus... PASS</span><br><span class="line">  → Changes strictly match plan scope</span><br><span class="line">  → No unplanned modifications detected</span><br><span class="line">  → All verification gates passed</span><br><span class="line"></span><br><span class="line">Diff ready for review. Accept? [y/N]</span><br></pre></td></tr></table></figure><p><strong>第 7 步：审 diff，合入。</strong></p><p>你打开 diff 看了一眼。改了一个文件，新建了一个测试文件，改动范围刚好在 165-200 行，测试覆盖了 3 个边界情况。没有顺手改别的。你敲了 <code>y</code>。commit 落地，worktree 自动清理。</p><p>第 2 个计划 <code>plans/002-extract-shadow-config.md</code> 你决定下午再跑。一样的流程——<code>/improve execute</code>，等两分钟，审一眼 diff，合。</p><p><strong>一个小时下来你做了什么。</strong></p><p>你打了两次 <code>/improve execute</code>。看了两张表（Prioritize 排序表、diff）。在 Prioritize 表前花了五分钟想&quot;现在修哪个&quot;。其余所有事——读代码库、找问题、验证真伪、排优先级、写执行手册、切 worktree、跑验证门禁、审查产出——全是 Agent 干的。强模型干了一次性的、判断密集的活（审计、核实、排优先级、写计划、审查 diff），弱模型干了重复的、跟随指令的活（敲代码、跑测试）。你的时间是花在了只有你能做的两件事上：决定什么值得修，确认修得对不对。</p><h2 id="14-5-安全边界"><a href="#14-5-安全边界" class="headerlink" title="14.5 安全边界"></a>14.5 安全边界</h2><p>improve 有几条硬边界，写在指令里，不是建议。</p><p><strong>不修改源码。</strong> 审计和计划阶段只读。分析代码、记录位置、写计划，写操作只在 <code>plans/</code> 目录。这个边界让它能在任何代码库上安全跑，无论是个人项目还是生产环境核心服务。</p><p><strong>不改动工作树。</strong> 审计在当前 checkout 上读，计划写到 <code>plans/</code>。不切分支，不 stash，不改任何工作状态。跑完一次 improve，<code>git status</code> 唯一的变化是 <code>plans/</code> 下多了几个 untracked 文件。</p><p><strong>不复现 secret 值。</strong> 审计发现硬编码密钥（这也是安全审计的一项），只记录文件路径、行号和密钥类型，比如 <code>src/config.ts:15 — AWS_ACCESS_KEY_ID</code>，不把密钥值拷进计划。计划引用行号，执行者读源文件，密钥值不会在 markdown 里到处复制。</p><p><strong>拒绝&quot;帮我实现&quot;。</strong> 对它说&quot;帮我实现这个计划&quot;，标准回答：我不实现任何东西。要执行计划用 <code>/improve execute</code>。要改进计划，描述你的疑虑。别让我即兴写代码。</p><p>这四条的意义不只在安全。它们定义了一种信任模型：improve 能在任何代码库上放心跑，因为它能造成的最坏结果是 <code>plans/</code> 下多几个 markdown 文件。这种只读的安全性，是它和&quot;让我帮你重构整个项目&quot;那类 Agent 最根本的区别。</p><h2 id="14-6-与全书方法论的对接"><a href="#14-6-与全书方法论的对接" class="headerlink" title="14.6 与全书方法论的对接"></a>14.6 与全书方法论的对接</h2><p>improve 单看是一个技能，放进全书的方法论地图，补了几个空白。</p><p><strong>和第 3 章 SDD。</strong> improve 的&quot;计划即产品&quot;是规格驱动的极致版：规格不是开发的输入，规格就是交付物。OpenSpec 和 Spec-Kit 把规格当人和 AI 的合约，improve 把这份合约写到弱模型能照做的粒度。同根，improve 走得更远。</p><p><strong>和第 8 章 Goal Workflow 互补。</strong> <code>/improve plan</code> 类似 <code>/prd-to-spec</code>，都是模糊需求到精确方案。方向不同：Goal Workflow 从人的需求往下游走（&quot;我想要这个&quot;），improve 从已有代码往上游走（&quot;这个代码库还缺什么&quot;）。<code>/improve execute</code> 类似 <code>/goal</code>，都是规格变代码，但 improve 显式分离了计划模型和执行模型。两个流程能拼起来：improve 审计产出一批 plan，Goal Workflow 的 <code>/goal</code> 逐个实现，<code>/review-it</code> 审查，<code>/ship-it</code> 交付。</p><p><strong>和第 12 章 Loop Engineering 上下游。</strong> improve 可以当 Loop 里的&quot;审计-排序&quot;环节。Loop 定时触发 improve 做审计，产出排序后的计划，自动化层挑高杠杆率的派给执行循环。知识生产（improve）和执行调度（Loop）分开，各自用最合适的模型。</p><p><strong>和第 13 章 GSD Core 分工。</strong> GSD 管全阶段循环（Discuss → Plan → Execute → Verify → Ship），improve 只管前半段（审计和计划），执行留给别的工具。不冲突，一条链上的不同环节。GSD 管怎么做一个功能，improve 管该做哪些功能。一个负责过程可靠，一个负责方向正确。</p><p><strong>和第 15 章 Compound Engineering。</strong> improve 的 <code>plans/</code> 目录是一个在累积的知识库。每次审计的误报清单让下一次更准，已完成计划的记录让 reconcile 能自动检测漂移。Recon 阶段读取的意图文档也在持续更新，审计随项目演进变精准。这和 Compound Engineering 的核心主张一样：每次工作让下次更容易。</p><p><strong>和第 33 章 &#x2F;review-it 互补。</strong> improve 是事前主动审计，还没动手先想清楚。review-it 是事后审查，做完了回来检查。两个方向都重要，结合起来就是一个完整的质量闭环：improve 告诉你该做什么、怎么写，&#x2F;goal 实现，&#x2F;review-it 验货。</p><h2 id="14-7-本章小结"><a href="#14-7-本章小结" class="headerlink" title="14.7 本章小结"></a>14.7 本章小结</h2><p>improve 把一个简单的经济逻辑做成了一个完整的工作流：贵的模型做判断，便宜的做执行。但它真正贡献的不是省钱，是重新定义了什么东西值得用最强模型。</p><p>Recon → Audit → Vet → Prioritize → Plan，五步流水加九类并行审计加加权杠杆率排序。它是一条&quot;该做什么&quot;的生产线，输出不是代码，是决策。写得够细的决策，细到一个人或一个弱模型能照着做到底。</p><p>&quot;计划即产品&quot;背后是一整套工程纪律：自包含上下文、机器可校验的验证门禁、硬 STOP 条件、Git Commit 戳、漂移检查。这些纪律回答一个问题：你不亲自写代码，怎么确保写的人不会搞砸？答案是把判断力蒸馏进计划，不只告诉它做什么，告诉它怎么判断做得对不对。</p><p>shadcn 把这个项目开源不到一周 5000+ star。社区的热情不是因为新技术，并行子智能体、验证门禁、worktree 隔离这些前面都讲过了。热的是它的主张：AI 编程的成本不必是刚性的。你不用为了质量把 Opus 用在每一行代码上。让 Opus 做它最擅长的，理解、判断、规划，执行外包给便宜的。在 AI API 按 token 计费的现实里，这个主张比任何架构模式都更直接地改变了你的开发成本。</p><p>最后，improve 最值得记的，不是它的命令和流水线。计划不是代码的附属品。计划是独立的、可积累的、随项目演进的知识资产。写好计划，今天能执行，下周能执行，换了三个 Agent 之后还能执行。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/improve-strong-audit-weak-execute-plan-as-product/</id>
    <link href="https://colobu.com/2026/06/28/improve-strong-audit-weak-execute-plan-as-product/"/>
    <published>2026-06-28T06:30:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>&quot;The plan is the product.&quot;<br>计划才是产品。</p>
<p>——shadcn&#x2F;improve README</p>
</blockquote>
<p>shadcn 是谁，不用多介绍。他创建的 shadcn&#x2F;ui 是 GitHub 上 Star 数最高的 React 组件库之一，11 万+，几乎凭一己之力改变了前端组件库的交付范式——不是&quot;装一个 npm 包&quot;，是&quot;把源码拷进你的项目，你拥有它，你改它，你对它负责&quot;。这种对控制权和所有权的执念，是他所有作品的设计 DNA。</p>
<p>2026 年 6 月，他在这个 DNA 上又加了一层——开源了一个叫 improve 的 Agent Skill。一周之内，5000+ star。</p>
<p>improve 做的事情，说穿了就是一句话：用最贵的模型读代码库、找问题、写执行计划，用最便宜的模型照着计划敲代码。它自己不碰源码，产出只有一种东西——计划。</p>
<p>这个分工背后是一笔所有用 AI 写代码的人都在付、但很少认真算过的账。用 Opus 读代码库、找 bug、排优先级，值。用 Opus 敲每一行代码、跑每一个测试、写每一句 commit message，不值。但现在的 AI 编程工具不管这些——你给它们什么模型，它们就全程用什么模型。预算好的团队手动切模型——研究阶段用 Opus，实现了切 Sonnet，跑测试了再切 Haiku。切来切去，时间都花在模型下拉菜单上了。</p>
<p>improve 把这个手动切换内建成了自动分工：强模型只负责判断。执行扔给最便宜的、够用的模型。</p>]]>
    </summary>
    <title>improve：用强模型审计、让弱模型执行的&quot;计划即产品&quot;工作流</title>
    <updated>2026-06-28T06:46:22.014Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="GSD" scheme="https://colobu.com/tags/GSD/"/>
    <category term="上下文腐化" scheme="https://colobu.com/tags/%E4%B8%8A%E4%B8%8B%E6%96%87%E8%85%90%E5%8C%96/"/>
    <content>
      <![CDATA[<blockquote><p>&quot;Claude Code is powerful. GSD Core makes it reliable.&quot;<br>Claude Code 很强大。GSD Core 让它变得可靠。</p><p>——open-gsd&#x2F;gsd-core README</p></blockquote><p>第 12 章给了 Loop Engineering 一个很大的愿景：你不再提示 Agent，而是设计提示 Agent 的循环。但那一章停在原理层，讲的是五个原语加一个状态记忆。把这些原语落成一套能直接安装、有明确文件结构、带 67 个命令的工程系统，是另一回事。</p><p>GSD Core 就是这样一套系统。它不发明新的 Agent，也不取代 Claude Code，而是套在你已有的运行时上面，把讨论、规划、执行、验证、交付这五步，固化成每个里程碑都要重复一遍的流水线。它想回答的不是&quot;Agent 能不能写代码&quot;，这个早就不是问题了，而是一个更隐蔽的问题：为什么 Agent 在小任务上表现惊艳，一接手大项目就开始胡言乱语？</p><p>这个问题有名字，叫上下文腐化（Context Rot）。本章讲 GSD Core 怎么把对抗上下文腐化当成第一性原则，用阶段循环、子智能体、持久化工件这三样东西，把一个容易漂移的编码 Agent 变成靠得住的工程伙伴。</p><span id="more"></span><p><img src="/images/image-20260614104546667.png"></p><h2 id="13-1-GSD-是什么：Git-Ship-Done"><a href="#13-1-GSD-是什么：Git-Ship-Done" class="headerlink" title="13.1 GSD 是什么：Git. Ship. Done."></a>13.1 GSD 是什么：Git. Ship. Done.</h2><p>GSD 是三个词的首字母，Git. Ship. Done.（提交、交付、完成）。项目全称 <code>open-gsd/gsd-core</code>，由 open-gsd 组织维护，以 npm 包 <code>@opengsd/gsd-core</code> 的形式发布，MIT 协议开源。</p><p>它给自己的定位是一句话：一套轻量级的元提示（meta-prompting）、上下文工程与规格驱动开发系统。这三个定语各有所指。meta-prompting 是说它不直接干活，而是组织 Agent 怎么干活；context engineering 是说它的核心目标是管理上下文；spec-driven 是说它继承了第 3 章的规格驱动思想。</p><p>GSD Core 最要紧的特征是跨运行时。它不绑定任何一个 Agent 产品，安装时会问你跑在哪个运行时上，再把命令和 Agent 定义适配过去。官方支持的运行时有 Claude Code、OpenCode、Gemini CLI、Kimi CLI、Kilo、Codex、Copilot、Cursor、Windsurf。安装就一行命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx @opengsd/gsd-core@latest</span><br></pre></td></tr></table></figure><p>安装器会问你选哪个运行时、装到全局还是本地，并处理命名空间转换：有的运行时用连字符 <code>gsd-plan-phase</code>，有的用冒号 <code>gsd:plan-phase</code>。官方明确不建议你直接从 <code>agents/</code> 或 <code>commands/</code> 目录手动拷文件，让安装器做转换才能保证跨运行时一致。</p><p>整个系统由 67 个斜杠命令驱动。这个数字写在 <code>docs/INVENTORY.md</code> 里，还有一个测试 <code>command-count-sync.test.cjs</code> 盯着它和实际命令数对得上。换句话说，这不是一个 prompt 模板，是一个有版本、有测试、有文档的工作流引擎。</p><p>这里要澄清一个小差异。项目站点 opengsd.net 的首屏把循环的第一步写成 Research，GitHub README 写的是 Discuss。两者指同一件事，动手之前先把事情想清楚。本章统一用 README 的五步说法：Discuss → Plan → Execute → Verify → Ship。</p><h2 id="13-2-核心问题：上下文腐化"><a href="#13-2-核心问题：上下文腐化" class="headerlink" title="13.2 核心问题：上下文腐化"></a>13.2 核心问题：上下文腐化</h2><p>要理解 GSD Core 为什么长成这样，得先看清它在跟什么作斗争。</p><p>上下文腐化指的是：上下文窗口越填越满，AI 的输出质量也跟着往下走。一个 Agent 在对话开头思路清晰、引用准确；聊到第五十轮，它开始忘记早先的决定、混淆文件、把已经否决的方案又提一遍。窗口没满，但信噪比塌了。</p><p>GSD 的文档把多数 AI 编程方案在规模上的失败，归到三件事头上：</p><ul><li>上下文膨胀悄悄拉低质量。研究、规划、执行的细节全堆在同一个会话里，越堆越多，模型越来越难分辨什么重要。</li><li>会话之间没有共享记忆。今天的会话结束，明天重开一个，昨天的决定、试过的弯路、定下的约定，全没了。Agent 每次都从零开始。</li><li>没有机制验证代码真的能跑。Agent 说&quot;做完了&quot;，可&quot;做完了&quot;是声称，不是证明。这正是第 12 章反复敲的那一点。</li></ul><p>针对这三个病根，GSD 立了三根支柱：</p><table><thead><tr><th>病根</th><th>支柱</th><th>做法</th></tr></thead><tbody><tr><td>上下文膨胀</td><td>干净的执行上下文</td><td>每一步恰到好处，不膨胀、不漂移</td></tr><tr><td>无共享记忆</td><td>明确的计划与持久化状态</td><td>结构化任务图加落盘工件，可对齐、可审计</td></tr><tr><td>无验证</td><td>真实的验证</td><td>自动化检查加上人类读得懂的证据</td></tr></tbody></table><p>这三根支柱，分别对应后面三节要讲的三样东西：阶段循环、子智能体、持久化工件。</p><h2 id="13-3-五步阶段循环：Discuss-→-Plan-→-Execute-→-Verify-→-Ship"><a href="#13-3-五步阶段循环：Discuss-→-Plan-→-Execute-→-Verify-→-Ship" class="headerlink" title="13.3 五步阶段循环：Discuss → Plan → Execute → Verify → Ship"></a>13.3 五步阶段循环：Discuss → Plan → Execute → Verify → Ship</h2><p>GSD 把工作组织成里程碑（milestone），每个里程碑内部分成若干阶段（phase），每个阶段都走同一套五步循环。这里有一条铁律：每次只推进一个阶段。不许一边规划一边执行，也不许跳过验证直接交付。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">里程碑 Milestone</span><br><span class="line">  └── 阶段 Phase 01</span><br><span class="line">        Discuss → Plan → Execute → Verify → Ship</span><br><span class="line">  └── 阶段 Phase 02</span><br><span class="line">        Discuss → Plan → Execute → Verify → Ship</span><br><span class="line">  └── ...</span><br></pre></td></tr></table></figure><p>这五步各有专属命令，下面逐一拆解。</p><p><img src="/images/image-20260614104948441.png"></p><h3 id="13-3-1-Discuss——动手规划前先把实现决策定下来"><a href="#13-3-1-Discuss——动手规划前先把实现决策定下来" class="headerlink" title="13.3.1 Discuss——动手规划前先把实现决策定下来"></a>13.3.1 Discuss——动手规划前先把实现决策定下来</h3><p>命令：<code>/gsd-discuss-phase &lt;编号&gt;</code>。</p><p>这一步不是写正式规格，而是一次轻量对话，目的是在规划开始前把实现决策定下来，免得规划者带着错误假设往下走。</p><p>它有个模式值得一提，叫假设模式（Assumptions mode）。传统的&quot;讨论&quot;是面试式提问，一条条问你想怎么做。假设模式反过来：Agent 先读代码库，基于证据自己形成观点，只在真正拿不准的地方请你纠正。它扮演的是思考伙伴，不是问卷。背后是一个朴素的判断：大部分实现决策，代码本身已经给了答案，没必要再问人。</p><p>产出两个工件：<code>CONTEXT.md</code>，结构化的决策记录；<code>&lt;NN&gt;-DISCUSSION-LOG.md</code>，人能读的审计轨迹。</p><h3 id="13-3-2-Plan——研究、分解，并验证计划装得进一个全新上下文窗口"><a href="#13-3-2-Plan——研究、分解，并验证计划装得进一个全新上下文窗口" class="headerlink" title="13.3.2 Plan——研究、分解，并验证计划装得进一个全新上下文窗口"></a>13.3.2 Plan——研究、分解，并验证计划装得进一个全新上下文窗口</h3><p>命令：<code>/gsd-plan-phase &lt;编号&gt;</code>，可带 <code>--research</code>、<code>--skip-research</code>、<code>--tdd</code>、<code>--mvp</code> 等标志。</p><p>这一步是 GSD 子智能体编排最密集的地方。编排者（orchestrator）依次派出三个子智能体：研究员（researcher）拿到一个干净的 200k token 窗口，专做技术研究，产出 <code>RESEARCH.md</code>；规划者（planner）拿到研究输出和需求做任务分解，产出一个或多个 <code>PLAN.md</code>；计划检查者（plan-checker）审查计划，趁执行前把歧义抓出来。</p><p>这里有条核心约束：每个计划必须能装进一个全新的上下文窗口。这不是建议，是设计原则。如果一个计划大到一个执行器的 200k 窗口都装不下它需要的全部上下文，那它就是太大了，必须拆。这条约束直接决定了任务分解的粒度。</p><p>产出工件：<code>RESEARCH.md</code>、若干 <code>PLAN.md</code>、<code>VALIDATION.md</code>（受奈奎斯特采样思想启发的验证策略），可选的 <code>PATTERNS.md</code>（代码库类比映射，告诉执行器&quot;项目里类似的东西是怎么写的&quot;）。</p><h3 id="13-3-3-Execute——以并行波次运行，每个执行器从干净上下文起步"><a href="#13-3-3-Execute——以并行波次运行，每个执行器从干净上下文起步" class="headerlink" title="13.3.3 Execute——以并行波次运行，每个执行器从干净上下文起步"></a>13.3.3 Execute——以并行波次运行，每个执行器从干净上下文起步</h3><p>命令：<code>/gsd-execute-phase &lt;编号&gt;</code>，可带 <code>--wave N</code>、<code>--gaps-only</code>、<code>--tdd</code>。</p><p>执行阶段把计划分成波次（wave）：彼此独立的计划在同一波里并行跑，有依赖关系的排到后面的波。每个计划对应一个执行器（executor）子智能体，每个执行器都从一个干净的 200k token 上下文起步，它只拿到自己这个计划需要的工件，不被别的计划的细节污染。</p><p>这就是&quot;并行波次&quot;的意思：不是无脑并发，而是按依赖图分层并发。<code>PLAN.md</code> 的 YAML frontmatter 里就写着 <code>wave</code>、<code>dependencies</code>、<code>modified_files</code>、<code>requirements</code>、<code>must_haves</code> 这些字段，编排者据此排波。</p><p>产出：代码、原子化的 git 提交，以及每个计划的 <code>&lt;NN&gt;-&lt;PP&gt;-SUMMARY.md</code> 执行记录。</p><h3 id="13-3-4-Verify——宣告完成前先诊断并生成修复计划"><a href="#13-3-4-Verify——宣告完成前先诊断并生成修复计划" class="headerlink" title="13.3.4 Verify——宣告完成前先诊断并生成修复计划"></a>13.3.4 Verify——宣告完成前先诊断并生成修复计划</h3><p>命令：<code>/gsd-verify-work [N]</code>。</p><p>一个验证者（verifier）子智能体检查实际构建出来的东西，看它对不对得上最初的目标、决策和计划。它做两道覆盖度检查，需求覆盖和决策覆盖：你在 Discuss 阶段定下的每条决策，都被执行了吗？</p><p>发现问题，它不止报告，还会派调试子智能体去诊断根因，并生成修复计划。这是 GSD 验证步骤最有牙齿的地方：验证的产出不是一句&quot;还有 bug&quot;，而是一份能直接执行的修复方案。产出工件：<code>VERIFICATION.md</code>（验证报告）、<code>UAT.md</code>（用户验收测试结果）。</p><h3 id="13-3-5-Ship——创建-PR、归档阶段、推进下一阶段"><a href="#13-3-5-Ship——创建-PR、归档阶段、推进下一阶段" class="headerlink" title="13.3.5 Ship——创建 PR、归档阶段、推进下一阶段"></a>13.3.5 Ship——创建 PR、归档阶段、推进下一阶段</h3><p>命令：<code>/gsd-ship</code>，可带 <code>--draft</code> 创建草稿 PR。</p><p>最后一步：创建拉取请求、归档本阶段的所有工件、更新 <code>STATE.md</code> 把这个阶段标记为完成，然后对下一个阶段重复整套流程。</p><p>把五步连起来看，它和第 5 章 gstack 的 Sprint（Think → Plan → Build → Review → Test → Ship）、第 8 章 Goal Workflow 的 <code>/prd → /goal → /review-it → /ship-it</code> 是同一个谱系。GSD 的独特之处不在循环的形状，在它对每一步上下文的洁癖，这是下一节的事。</p><h2 id="13-4-子智能体如何保持上下文整洁"><a href="#13-4-子智能体如何保持上下文整洁" class="headerlink" title="13.4 子智能体如何保持上下文整洁"></a>13.4 子智能体如何保持上下文整洁</h2><p>GSD 把对抗上下文腐化的关键机制叫瘦编排者（Thin Orchestrator）模式。</p><p><img src="/images/image-20260614105150559.png"></p><p>主会话，也就是你直接对话的那个编排者，刻意保持精简。它只做四件事：加载上下文、派生专门的子智能体、收集结果、更新共享状态。它不自己做繁重研究，不自己写大段代码，不让执行细节堆进自己的窗口。</p><p>所有重活下放给子智能体，而每个子智能体都拿到一个干净的、最多 200k token 的上下文窗口，外加它这份活儿要用的工件，仅此而已。研究员只看研究要用的东西，执行器只看自己那个计划。任务和任务之间物理隔离，一个 Agent 的上下文不可能污染另一个。</p><p>这套设计的三条原则，GSD 文档总结得很干净。第一条，每个 Agent 一份新上下文（Fresh Context Per Agent），用来消除上下文腐化。第二条，瘦编排者（Thin Orchestrators），让主会话不囤积细节。第三条，文件化状态（File-Based State），让状态落盘，可持久、可检视。</p><p>回头看第 12 章会发现，这正是 12.3.5 讲的 maker-checker 分离的工业级落地：写代码的执行器和验证工作的验证者不是同一个上下文，甚至可以不是同一个模型。第 12 章把这个分离称作循环里最有用的结构性设计，GSD 把它从一个有用的设计，变成了贯穿整个工作流的强制纪律。</p><p>支撑这套编排的，是一个叫 <code>gsd-tools.cjs</code> 的 CLI 工具。它是 GSD 工作流操作的功能后端，把配置解析、模型解析、阶段查找、git 提交、摘要验证、状态管理、模板操作这些重复逻辑集中起来，替掉了散落在各个命令文件里的内联 bash。工作流文件（<code>workflows/*.md</code>）的典型套路是：用 <code>gsd-tools.cjs init &lt;workflow&gt;</code> 加载上下文，解析该用哪个模型，派生 <code>agents/*.md</code> 里定义的专门 Agent，收集结果，再用 <code>gsd-tools.cjs state update</code> 更新状态。</p><p>模型这件事 GSD 也做了精细化。它提供模型档位（model profiles），即 <code>quality</code>、<code>balanced</code>、<code>budget</code>、<code>adaptive</code>、<code>inherit</code> 五种预设策略，给不同的 Agent 分配不同的 Claude 模型。比如 <code>quality</code> 档给 <code>gsd-planner</code> 用 opus，<code>budget</code> 档给同一个 planner 用 sonnet。你还能按阶段类型（planning &#x2F; research &#x2F; execution）配模型，或者对单个 Agent 做覆盖。解析优先级是：单 Agent 覆盖大于阶段类型，阶段类型大于全局档位，全局档位大于运行时默认。这让&quot;贵模型做规划、便宜模型做执行&quot;这种成本意识的分工，变成一行配置，和第 14 章 improve 的思路殊途同归。</p><h2 id="13-5-持久化工件：STATE-md-与-CONTEXT-md"><a href="#13-5-持久化工件：STATE-md-与-CONTEXT-md" class="headerlink" title="13.5 持久化工件：STATE.md 与 CONTEXT.md"></a>13.5 持久化工件：STATE.md 与 CONTEXT.md</h2><p>第 12 章 12.3.6 那句话在这里落了地：Agent 会忘记，仓库不会。GSD 用一整套落盘的结构化工件，补上&quot;会话间无共享记忆&quot;这个病根。</p><p><img src="/images/image-20260614105344263.png"></p><p>所有工件都活在项目根目录的 <code>.planning/</code> 文件夹里，它是项目状态的唯一真相来源。目录结构大致是这样：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">.planning/</span><br><span class="line">├── STATE.md                      # 项目的活档案 / 导航层</span><br><span class="line">├── codebase/                     # 代码库地图（onboarding 时生成）</span><br><span class="line">│   ├── STACK.md</span><br><span class="line">│   ├── ARCHITECTURE.md</span><br><span class="line">│   └── CONVENTIONS.md</span><br><span class="line">├── phases/</span><br><span class="line">│   └── &lt;NN&gt;-&lt;slug&gt;/              # 每个阶段一个目录</span><br><span class="line">│       ├── CONTEXT.md            # Discuss 阶段的决策记录</span><br><span class="line">│       ├── RESEARCH.md           # Plan 阶段的研究</span><br><span class="line">│       ├── &lt;NN&gt;-&lt;PP&gt;-PLAN.md     # 可执行的工作单元</span><br><span class="line">│       ├── VERIFICATION.md       # Verify 阶段的报告</span><br><span class="line">│       └── ...</span><br><span class="line">└── quick/                        # /gsd-quick 的临时任务</span><br></pre></td></tr></table></figure><p>两个核心工件值得细看。</p><p>先是 <code>STATE.md</code>，项目的活档案、中央导航层。它记录当前里程碑、活跃阶段、已完成和待办的计划、进度指标、累积的决策，还有会话连续性笔记。所有工作流启动时先读 <code>STATE.md</code>，做完重要动作后写回。它就是第 12 章说的那根脊柱：明天早上的运行从今天停下的地方接着走，不是从零开始。<code>gsd-tools.cjs</code> 甚至提供 <code>state get &lt;section&gt;</code> 让你按小节查它。</p><p>再是 <code>CONTEXT.md</code>，Discuss 阶段捕获的实现决策。它包含阶段边界、带 <code>D-NN</code> 编号的锁定决策、规范文档引用、已有代码洞见、具体的灵感来源、推迟的想法。它被研究员、规划者、执行器共同消费，这意味着你在讨论阶段定的每条决策，会一路流到执行器手里，而且因为带着 <code>D-NN</code> 编号，验证阶段能逐条核对&quot;决策覆盖&quot;。</p><p>此外还有 <code>PLAN.md</code>（带 YAML frontmatter 的可执行工作单元）、<code>RESEARCH.md</code>、<code>VALIDATION.md</code> 等等，每种都有明确的 schema。这套工件体系的意义在于：知识不再活在某次对话的上下文窗口里，而是活在文件系统里，谁都能读，下次运行接着来。这就是&quot;文件化状态&quot;原则的全部价值。</p><h2 id="13-6-上手与既有代码库的接入"><a href="#13-6-上手与既有代码库的接入" class="headerlink" title="13.6 上手与既有代码库的接入"></a>13.6 上手与既有代码库的接入</h2><p>全新项目用 <code>/gsd-new-project</code> 启动。但更现实的场景，是把 GSD 接到一个已经存在的代码库（brownfield）上，这条路径值得单独说。</p><p>第一步，让 GSD 读懂你的代码。命令 <code>/gsd-map-codebase</code> 会派出四个并行的 mapper 子智能体（技术栈 mapper、架构 mapper 等），分析代码库，在 <code>.planning/codebase/</code> 下产出 <code>STACK.md</code>、<code>ARCHITECTURE.md</code>、<code>CONVENTIONS.md</code> 等结构化地图。</p><p>第二步，<code>/gsd-new-project</code> 聚焦于&quot;你要加什么&quot;，而不是重新发明已有的东西，它会从现有代码里抽取并验证需求。</p><p>第三步，进入正常的 Discuss → Plan 循环。此时代码库地图会喂给 <code>/gsd-discuss-phase</code> 和 <code>/gsd-plan-phase</code>，确保计划顺着既有的约定和结构走，而不是另起炉灶。</p><p>除了完整的五步循环，GSD 还留了轻量入口。<code>/gsd-quick</code> 用于小而临时的任务：它保留 GSD 的保证（原子提交、<code>STATE.md</code> 追踪），但默认跳过研究、讨论、计划检查、验证这些可选环节，只派 <code>gsd-planner</code>（quick 模式）和 <code>gsd-executor</code>。需要时可以用标志逐级把质量管线加回来，<code>--discuss</code> 加轻量讨论，<code>--validate</code> 加计划检查和验证，<code>--full</code> 开完整管线，<code>--research</code> 加聚焦研究。quick 任务存在 <code>.planning/quick/</code>，并更新 <code>STATE.md</code> 里的 &quot;Quick Tasks Completed&quot; 表。</p><p>这种&quot;完整循环加快速通道&quot;的双轨设计，对应的是真实开发里&quot;大功能走流程、小修补抄近道&quot;的常态。但就算抄近道，原子提交和状态追踪也不丢。</p><h2 id="13-7-产品矩阵：从框架到独立-Harness"><a href="#13-7-产品矩阵：从框架到独立-Harness" class="headerlink" title="13.7 产品矩阵：从框架到独立 Harness"></a>13.7 产品矩阵：从框架到独立 Harness</h2><p>GSD 不止 gsd-core 一个产品。看清整个矩阵，才能看清它在第 10 章 Harness Engineering 谱系里的位置。</p><p>gsd-core 是本章主角，套在现有运行时上的工作流引擎。它本身不是 Harness，是给别人的 Harness 加一层可靠性。</p><p>gsd-pi 是一个 terminal-native 的独立自主 Agent，带 TUI 和 Web UI、worktree 隔离的 git、多模型路由，安装 <code>npm install -g @opengsd/gsd-pi@latest</code>。这才是一个完整的、独立的 Harness，对应第 10 章。</p><p>gsd-browser 是基于 CDP（Chrome DevTools Protocol）的浏览器自动化，提供 MCP server 模式和带版本的元素引用，标准动作流是 <code>navigate → snapshot → act → assert → export</code>，支持人工接管（human takeover），安装 <code>npm install -g @opengsd/gsd-browser@latest</code>。它给 GSD 的验证步骤提供了&quot;行为级证据&quot;：不是猜代码对不对，而是真的在浏览器里跑一遍、断言、留痕。</p><p>此外还有两个规划中的产品。gsd-workbench 是桌面端的本地工作区，管计划、backlog、证据、交付交接；gsd-cloud 是托管服务，提供跨设备的项目状态和团队可见性。</p><p>这个矩阵透露了 GSD 的野心：gsd-core 让任何运行时变可靠，gsd-pi 提供一个自带可靠性的运行时，gsd-browser 给验证装上眼睛，workbench 和 cloud 把单机循环扩展到团队。</p><h2 id="13-8-与全书方法论的对接"><a href="#13-8-与全书方法论的对接" class="headerlink" title="13.8 与全书方法论的对接"></a>13.8 与全书方法论的对接</h2><p>GSD Core 几乎是前几章方法论的一次集大成，把分散的原则拧成了一套能直接安装的工程系统。</p><p>跟第 3 章 SDD 的关系最直接：GSD 本质就是规格驱动，但它把规格嵌进了阶段循环。<code>CONTEXT.md</code> 是讨论阶段的规格，<code>PLAN.md</code> 是执行阶段的规格，验证阶段逐条核对规格覆盖。规格不再是开头写一次的文档，而是贯穿循环的活合约。</p><p>跟第 5 章 gstack 同为&quot;想、划、做、审、交&quot;谱系，但 GSD 更偏执于上下文隔离。gstack 用角色覆盖来保证质量，GSD 用&quot;每个 Agent 一份新上下文&quot;来保证质量。跟第 8 章 Goal Workflow 高度同构，<code>/prd → /goal → /review-it → /ship-it</code> 几乎可以和 Discuss → Plan → Execute → Verify → Ship 对位，GSD 可以看作 Goal Workflow 加了一套强制的文件化状态和子智能体编排。</p><p>跟第 10 章 Harness Engineering，gsd-pi 是一个完整的独立 Harness，gsd-core 则是&quot;给别人的 Harness 加可靠性层&quot;的另一种工程实践。</p><p>最深的一层是跟第 12 章 Loop Engineering 的对接。GSD 是 12.3 那&quot;五个原语加状态记忆&quot;的一次工业级落地：子智能体加持久化工件加独立验证门禁，再配上 worktree 隔离和模型路由。第 12 章讲的是循环的原理，GSD 给了你一个能直接 <code>npx</code> 装上的循环。</p><p>最后是跟第 14 章 improve、第 15 章 Compound Engineering 的关系，三者都信&quot;规划重于执行&quot;。improve 把成本分工压到极致，强模型审计、弱模型执行；Compound Engineering 在末端加了知识复利；GSD 则把重心放在跨会话的上下文工程和验证证据上。</p><h2 id="13-9-本章小结"><a href="#13-9-本章小结" class="headerlink" title="13.9 本章小结"></a>13.9 本章小结</h2><p>GSD Core 把一个容易被忽视的工程真相摆到了中心：AI 编程在规模上的失败，大多不是模型不够聪明，而是上下文管理不善。它给这个真相起了名字，叫上下文腐化，再用三样东西系统性地反击它。</p><p>第一样是阶段循环（Discuss → Plan → Execute → Verify → Ship），每次只推进一个阶段，把工作切成上下文窗口装得下的块。第二样是子智能体加瘦编排者，每个 Agent 一份干净的 200k 上下文，主会话不囤积细节，maker 和 checker 物理隔离。第三样是持久化工件（<code>STATE.md</code>、<code>CONTEXT.md</code>、<code>PLAN.md</code> 等），把状态落盘到 <code>.planning/</code>，让知识跨越会话边界存续。</p><p>它最聪明的定位是：不取代你的 Agent，而是让你的 Agent 变可靠。同一个 Claude Code，套上 GSD Core，就从一个聊到第五十轮开始漂移的对话伙伴，变成一个有计划、可恢复、有验证证据的工程流水线。这也正是它那句标语的全部意思：Claude Code 很强大，GSD Core 让它变得可靠。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/gsd-core-against-context-rot-stage-loop-engine/</id>
    <link href="https://colobu.com/2026/06/28/gsd-core-against-context-rot-stage-loop-engine/"/>
    <published>2026-06-28T06:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>&quot;Claude Code is powerful. GSD Core makes it reliable.&quot;<br>Claude Code 很强大。GSD Core 让它变得可靠。</p>
<p>——open-gsd&#x2F;gsd-core README</p>
</blockquote>
<p>第 12 章给了 Loop Engineering 一个很大的愿景：你不再提示 Agent，而是设计提示 Agent 的循环。但那一章停在原理层，讲的是五个原语加一个状态记忆。把这些原语落成一套能直接安装、有明确文件结构、带 67 个命令的工程系统，是另一回事。</p>
<p>GSD Core 就是这样一套系统。它不发明新的 Agent，也不取代 Claude Code，而是套在你已有的运行时上面，把讨论、规划、执行、验证、交付这五步，固化成每个里程碑都要重复一遍的流水线。它想回答的不是&quot;Agent 能不能写代码&quot;，这个早就不是问题了，而是一个更隐蔽的问题：为什么 Agent 在小任务上表现惊艳，一接手大项目就开始胡言乱语？</p>
<p>这个问题有名字，叫上下文腐化（Context Rot）。本章讲 GSD Core 怎么把对抗上下文腐化当成第一性原则，用阶段循环、子智能体、持久化工件这三样东西，把一个容易漂移的编码 Agent 变成靠得住的工程伙伴。</p>]]>
    </summary>
    <title>GSD Core：对抗上下文腐化的阶段循环引擎</title>
    <updated>2026-06-28T06:46:22.013Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="Loop Engineering" scheme="https://colobu.com/tags/Loop-Engineering/"/>
    <category term="自主循环" scheme="https://colobu.com/tags/%E8%87%AA%E4%B8%BB%E5%BE%AA%E7%8E%AF/"/>
    <content>
      <![CDATA[<blockquote><p>&quot;You shouldn&#39;t be prompting coding agents anymore. You should be designing loops that prompt your agents.&quot;<br>你不应该再提示编码 Agent 了。你应该设计循环来提示你的 Agent。</p><p>——Peter Steinberger, 2026 年 6 月 7 日</p></blockquote><p>第 10 章搭了 Agent 的运行环境——hooks、权限、沙箱、配置继承。第 11 章用 Kanban 管多个 Agent 的并行编排。但有一个更根本的问题还没回答：<strong>每次都是你在提示 Agent。你打字，它回话，你再打字。你不在，它就不动。</strong></p><p>2026 年 6 月，两条推文把这个矛盾推到了台前。Peter Steinberger（OpenClaw 作者）的那句话在 48 小时内获得 220 万次浏览。几天后，Boris Cherny（Anthropic Claude Code 负责人）在 WorkOS 的 Acquired Unplugged 活动上说了几乎同样的话：&quot;I don&#39;t prompt Claude anymore. I have loops running that prompt Claude and figuring out what to do. My job is to write loops.&quot;</p><p><img src="/images/image-20260609032530128.png"></p><p>全网炸了。但没人说得清&quot;loop&quot;到底是什么。有人说是 Ralph Loop 的翻版，有人说是&quot;戴了顶帽子的 cron job&quot;，有人说&quot;prompt engineering 已死&quot;。一周之内，Reddit、Hacker News、X 上的讨论翻了几十页，最诚实的回答是 Matthew Berman 那句：&quot;Nobody knows but him and Boris.&quot;</p><p>Addy Osmani 随即发表了长文&quot;Loop Engineering&quot;，给了这个概念第一个完整的拆解。本章基于 Osmani 的框架，结合 Boris Cherny 的实践、Geoffrey Huntley 的 Ralph Loop 思想、以及 AlphaSignal 的四条件测试，回答三个问题：Loop Engineering 是什么？它和前十一章的方法论什么关系？你真的需要它吗？</p><span id="more"></span><h2 id="12-1-从提示-Agent-到设计循环"><a href="#12-1-从提示-Agent-到设计循环" class="headerlink" title="12.1 从提示 Agent 到设计循环"></a>12.1 从提示 Agent 到设计循环</h2><p>先把 Boris Cherny 的三阶段演化说清楚。</p><p><img src="/images/image-20260609032953539.png"></p><p>一年前，Cherny 的写代码方式和所有工程师一样：IDE + 自动补全。然后他开始同时跑五到十个 Claude 会话，手动提示每一个——这个修 bug，那个做 feature，还有一个跑测试。每一条指令都是他亲手打的。他的时间不再是写代码，而是在五个终端窗口之间切来切去，给每个窗口里的 Claude 写 prompt。</p><p>然后他停了。不是不用 Claude——而是不再自己打 prompt。他写了一组小程序，每个程序做三件事：找到该做的事、把事交给 Claude、检查做完了没有。这些程序按时间表运行——有的每分钟一次，有的每天一次，有的跑到达成某个条件才停。Cherny 把它们叫 loops。他的原话是：&quot;My job is to write loops.&quot;</p><p>结果：据 Cherny 自述，过去 30 天里他对 Claude Code 的 100% 贡献都由 Claude Code 自己写的，合并了 259 个 PR。他在 2025 年 11 月删掉了 IDE，到发稿时没再打开过。Yash Thakker 整理的补充数据：Anthropic 工程师实现每日代码产出 8 倍增长，Claude 编写了超过 80% 的已合并生产代码，开放式软件任务成功率 76%。</p><p>这就是 Loop Engineering——<strong>不再由人提示 Agent，而是设计自动提示 Agent 的系统。</strong> 你从循环里面的人，变成了循环的作者。</p><p>Cherny 不是说工程师过时了。他自己仍然决定做什么、和用户沟通、协调团队。工作没有消失。上升了一个高度——从写代码，到写那个写代码的东西。</p><h2 id="12-2-Loop-处在哪一层"><a href="#12-2-Loop-处在哪一层" class="headerlink" title="12.2 Loop 处在哪一层"></a>12.2 Loop 处在哪一层</h2><p>前十一章的方法论解决的是&quot;Agent 怎么做事&quot;。Loop Engineering 解决的是&quot;谁来提示 Agent 做事&quot;。这是一个不同的抽象层。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Loop Engineering (谁提示 Agent)</span><br><span class="line">  │</span><br><span class="line">  └── Harness Engineering (Agent 的运行环境)</span><br><span class="line">        │</span><br><span class="line">        └── 方法论层 (Agent 怎么做事)</span><br><span class="line">              │   Skills / SDD / Ralph Loop / gstack / Goal Workflow / autoresearch</span><br><span class="line">              │</span><br><span class="line">              └── 项目层 (做什么事)</span><br><span class="line">                    goscapy / Web 应用 / 微服务...</span><br></pre></td></tr></table></figure><p>Harness 管一个 Agent 的运行环境——第 10 章拆过的 hooks、权限、沙箱。Loop 坐在 Harness 上面，加了三样东西：定时器（让 Agent 不等你就在跑）、子 Agent 派生（让一个 Loop 管多个 Agent）、自我驱动（让 Loop 自己决定下一步做什么）。</p><p>用 Osmani 的话说：Harness 让一个 Agent 安全运行，Loop 让一群 Agent 自己跑起来。</p><h2 id="12-3-Loop-的五个必需品-一个记忆"><a href="#12-3-Loop-的五个必需品-一个记忆" class="headerlink" title="12.3 Loop 的五个必需品 + 一个记忆"></a>12.3 Loop 的五个必需品 + 一个记忆</h2><p>Osmani 把它拆成了五样东西，加一个存记忆的地方。</p><p><img src="/images/image-20260609034910599.png"></p><h3 id="12-3-1-Automations——循环的心跳"><a href="#12-3-1-Automations——循环的心跳" class="headerlink" title="12.3.1 Automations——循环的心跳"></a>12.3.1 Automations——循环的心跳</h3><p>Automations 是让 Loop 成为&quot;Loop&quot;而非&quot;你手动跑了一次&quot;的东西。没有它，你只是用了一次 Agent。有了它，Agent 按节奏自己跑。</p><p>Codex 的实现是 Automations tab——选项目、写 prompt、选频率、选本地还是后台 worktree。找到问题的 run 进 Triage inbox，没找到的自动归档。OpenAI 内部用它做日常 issue 分诊、CI 失败摘要、commit 简报、最近引入的 bug 猎杀。Automation 还能调用 Skill——你写 <code>$skill-name</code>，不用把一大堆指令粘到没人会再更新的时间表里。</p><p>Claude Code 走了另一条路但到同一个地方：<code>/loop</code> 按节奏重跑，<code>/goal</code> 跑到条件满足为止，hooks 在 Agent 生命周期的关键点插入逻辑，GitHub Actions 让你合上笔记本它还在跑。</p><p><code>/loop</code> 和 <code>/goal</code> 是两种不同的自主原语。<code>/loop</code> 是时间驱动的——每 N 分钟跑一次。<code>/goal</code> 是条件驱动的——跑到&quot;test&#x2F;auth 里所有测试通过、lint 干净&quot;才停。两者都重要，覆盖不同的自主模式。</p><h3 id="12-3-2-Worktrees——并行不冲突"><a href="#12-3-2-Worktrees——并行不冲突" class="headerlink" title="12.3.2 Worktrees——并行不冲突"></a>12.3.2 Worktrees——并行不冲突</h3><p>两个 Agent 同时写同一个文件，和两个工程师 commit 同一行然后谁都不跟谁说话一模一样。Git worktree 解决这个问题——一个独立的工作目录在自己的分支上共享同一个仓库历史，一个 Agent 的编辑物理上不可能碰到另一个的 checkout。</p><p>Codex 内置了 worktree 支持，多个 thread 同时打一个仓库互不碰撞。Claude Code 提供三种隔离方式：<code>git worktree</code> 手动创建、<code>--worktree</code> 标志在独立 checkout 里开会话、<code>isolation: worktree</code> 让 subagent 自动获得可自动清理的独立 checkout。</p><p>但 Addy Osmani 在另一个文章里指出了一个更深的限制：<strong>你的审查带宽才是真正的上限</strong>。Worktree 消除了机械碰撞，但你一次能审查多少个 PR 决定了你实际能跑多少个 Agent，不是工具。</p><h3 id="12-3-3-Skills——停止每次重新解释项目"><a href="#12-3-3-Skills——停止每次重新解释项目" class="headerlink" title="12.3.3 Skills——停止每次重新解释项目"></a>12.3.3 Skills——停止每次重新解释项目</h3><p>Skill 是让你停止像金鱼一样每次会话重新解释项目的东西。没有 Skills 的 Loop 每次循环从零推导整个项目——构建命令、代码风格、那个因为某次事故才有的约定。有 Skills 的 Loop 复合增长——每次循环站在前一次的肩膀上。</p><p>第 2 章讲的 Skills 系统在这里有了新的位置：它不仅是 Agent 的能力单元，更是 Loop 内可复用的知识资产。<strong>Loop 内可复用的单元是 Skill 不是 prompt。</strong> 调用清晰命名 Skill 的 Loop 复合增长；每次从头推导的 Loop 只烧钱。</p><p>Skill 和 Plugin 是两件事。Skill 是编写格式——一个 <code>SKILL.md</code> 文件加可选的脚本和引用。Plugin 是分发方式——把多个 Skill 和 Connector 打包，让队友一键安装。在 Codex 和 Claude Code 里都一样。</p><h3 id="12-3-4-Plugins-和-Connectors——Loop-触达真实工具"><a href="#12-3-4-Plugins-和-Connectors——Loop-触达真实工具" class="headerlink" title="12.3.4 Plugins 和 Connectors——Loop 触达真实工具"></a>12.3.4 Plugins 和 Connectors——Loop 触达真实工具</h3><p>一个只能看文件系统的 Loop 是一个很小的 Loop。MCP 连接器让 Agent 读 Issue 追踪、查数据库、调 staging API、发 Slack 消息。Codex 和 Claude Code 都支持 MCP，所以你为一个写的 connector 通常另一个也能用。</p><p>没有 Connectors 的 Loop 能修代码，但修完就停在那了——它不知道该开 PR，不知道该关联哪个 Linear ticket，不知道 CI 绿了该 ping 谁。有 Connectors 的 Loop 是一条流水线：修完代码 → 开 PR → 关联 ticket → CI 绿了自动通知频道。区别不是 Agent 聪明了多少，是它能动手的范围大了多少。</p><p>第 10 章的 Harness Engineering 把 MCP 作为工具系统的一部分。在 Loop 的层面，Connectors 的角色更明确——Loop 跑的时候你不在旁边，如果它不能自己把结果送到该去的地方，你就得回来收尾，这违背了 Loop 的初衷。Connectors 让 Loop 从&quot;帮你干活的工具&quot;变成&quot;自己走完流程的同事&quot;。</p><h3 id="12-3-5-Sub-agents——写的和查的不是同一个"><a href="#12-3-5-Sub-agents——写的和查的不是同一个" class="headerlink" title="12.3.5 Sub-agents——写的和查的不是同一个"></a>12.3.5 Sub-agents——写的和查的不是同一个</h3><p>这是 Loop 中最有用的结构性设计。</p><p>写代码的模型给自己打分太客气了。它天然倾向于说&quot;我做完了&quot;。第二个 Agent 带着不同的指令，有时候用不同的模型，能抓住第一个 Agent 自己说服自己的东西。</p><p>Codex 的 subagent 在你要求时才生成，并行运行后折叠结果到一个回答。你在 <code>.codex/agents/</code> 定义自己的 Agent——每个有名字、描述、指令，可选模型和推理力度。这样你的安全审查员可以用强模型高推理力度，而探索者用快而只读的轻模型。</p><p>Claude Code 同样支持：<code>.claude/agents/</code> 定义 subagent，agent teams 在它们之间传递工作。常见的分工是：一个探索，一个实现，一个对照 spec 验证。</p><p>这个分工在 Loop 内为什么特别重要？<strong>Loop 跑的时候你不在旁边看。</strong> 一个你真正信任的验证者是你能走开的唯一理由。Subagent 烧更多 token——每个都做自己的模型推理和工具调用——所以把它们花在值得第二意见的地方。</p><p><code>/goal</code> 的评判模型也是 maker-checker 分离。Claude Code 每次 turn 后把目标条件和当前上下文发给一个小的快模型（很可能是 Haiku），它只做一件事：条件满足了没有？返回 yes&#x2F;no 加一条简短理由。干活的模型和验收的模型不是同一个——这个分离是 Loop 可信赖的基础。</p><h3 id="12-3-6-State——Agent-会忘记，仓库不会"><a href="#12-3-6-State——Agent-会忘记，仓库不会" class="headerlink" title="12.3.6 State——Agent 会忘记，仓库不会"></a>12.3.6 State——Agent 会忘记，仓库不会</h3><p>第六个东西不是&quot;必需品&quot;，但少了它 Loop 就是个失忆症患者。</p><p>一个 markdown 文件，或一个 Linear board，任何存在于单次对话之外、记录&quot;做完了什么、还剩什么&quot;的东西。Agent 每次运行之间忘记一切——上下文窗口是临时的。但 state 文件在磁盘上，不属于任何一次对话。明天早上的运行从今天停下的地方继续，不是从零开始。</p><p>一个 state 文件长这样：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># CI Health Loop — State</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 2026-06-08</span></span><br><span class="line"><span class="bullet">-</span> [x] flaky: test<span class="emphasis">_auth_</span>timeout — 隔离到 @slow 标记</span><br><span class="line"><span class="bullet">-</span> [x] broken: test<span class="emphasis">_payment_</span>webhook — 修复已合入 #1847</span><br><span class="line"><span class="bullet">-</span> [ ] flaky: test<span class="emphasis">_search_</span>index — 未复现，下次重跑</span><br><span class="line"></span><br><span class="line"><span class="section">## 2026-06-07</span></span><br><span class="line"><span class="bullet">-</span> [x] broken: test<span class="emphasis">_user_</span>export — 依赖版本回退，#1843</span><br></pre></td></tr></table></figure><p>每次 Loop 启动时读这个文件，知道什么做过了、什么还没做。每次 Loop 结束时写回去。第 10 章的 CLAUDE.md 和 progress file 解决的是 Agent 内部跨会话的记忆——同一个问题，内部版本。Loop 的 state 文件是外部版本——不在 Agent 的上下文里，在文件系统或项目管理工具里，谁都能读，下次运行接着来。</p><h2 id="12-4-Dynamic-Workflows：五个原语的确定性编排"><a href="#12-4-Dynamic-Workflows：五个原语的确定性编排" class="headerlink" title="12.4 Dynamic Workflows：五个原语的确定性编排"></a>12.4 Dynamic Workflows：五个原语的确定性编排</h2><p>上面五个原语是概念层。2026 年 6 月，Claude Code 引入了 Dynamic Workflows——一种用确定性 JavaScript 脚本编排 sub-agent 的方式，把这些概念落到了代码。</p><p><img src="/images/image-20260609035911439.png"></p><p>传统 sub-agent 调用是模型自主决策——&quot;你觉得还需要什么？&quot;。Dynamic Workflow 是确定性程序——&quot;先做 A，再做 B，如果 B 失败就做 C&quot;。每个 sub-agent 有独立的隔离上下文窗口，消除了主会话中的上下文膨胀和自我偏好偏差。</p><p>六种模式覆盖了常见的编排场景：</p><table><thead><tr><th>模式</th><th>逻辑</th><th>典型场景</th></tr></thead><tbody><tr><td>Fan-out &amp; Synthesize</td><td>多个轻量 Agent 并行，一个重量 Agent 聚合</td><td>分析 50 条日记、安全审查</td></tr><tr><td>Classify &amp; Act</td><td>先分类，再按类型执行不同操作</td><td>Issue 分诊</td></tr><tr><td>Pipeline (Draft → Check)</td><td>并行起草，然后检查</td><td>10 个 Agent 挖掘纠正，1 个聚类</td></tr><tr><td>Tournament</td><td>多个 Agent 出方案，judge 评分选一个</td><td>方案对比</td></tr><tr><td>Loop Until Done</td><td>循环到完成</td><td>定时日报</td></tr><tr><td>Deep Verification</td><td>提取每个断言，逐个验证</td><td>事实核查</td></tr></tbody></table><p>一个实战例子：让 Agent &quot;go through my last 50 sessions and mine them for the corrections I keep making&quot;。结果：49 个会话分析，86 个纠正挖掘，每个引用对照实际会话验证。产生的报告显示反复出现的纠正模式——AI slop、虚构词语、错误事实。</p><p>Artem Zhutov（Dynamic Workflows 的早期实践者）有一个重要观察：不要分离工作流和技能。把工作流自包含在技能内——skill.md 文件可以包含一个 JavaScript 文件编码工作流。工作实体是技能，工作流被带入技能。</p><h2 id="12-5-Loop-的历史演进"><a href="#12-5-Loop-的历史演进" class="headerlink" title="12.5 Loop 的历史演进"></a>12.5 Loop 的历史演进</h2><p>&quot;Loop&quot;这个词在 2026 年 6 月突然爆红，但它不是凭空冒出来的。从旧到新，五个阶段。</p><h3 id="Stage-1：ReAct-循环（2022）"><a href="#Stage-1：ReAct-循环（2022）" class="headerlink" title="Stage 1：ReAct 循环（2022）"></a>Stage 1：ReAct 循环（2022）</h3><p>2022 年的 ReAct 论文形式化了最基本的模式：模型推理、调工具、读结果、重复。一个模型，一个循环，一个人看着。这是学术的 while 循环。</p><h3 id="Stage-2：AutoGPT（2023）"><a href="#Stage-2：AutoGPT（2023）" class="headerlink" title="Stage 2：AutoGPT（2023）"></a>Stage 2：AutoGPT（2023）</h3><p>给模型一个目标，让它自己提示自己。AutoGPT 变得著名是因为它无限空转、什么都不做。这个失败给整个领域打上了&quot;Agent 是玩具&quot;的标签，一烙就是两年。</p><h3 id="Stage-3：Ralph-Loop（2025）"><a href="#Stage-3：Ralph-Loop（2025）" class="headerlink" title="Stage 3：Ralph Loop（2025）"></a>Stage 3：Ralph Loop（2025）</h3><p>第 4 章讲过 Geoffrey Huntley 的 Ralph Loop。它简单得不像话——一个 bash one-liner，把同一个 prompt 文件反复喂给 Agent。真正的创新是纪律：每次迭代把上下文重置到一组锚定文件，不让对话膨胀。Huntley 用它花了大约 297 美元构建了整个编程语言。</p><p>Ralph Loop 是 Loop Engineering 的直接前身。它的核心理念——自指涉、循环到对、固定锚定文件防止漂移——在今天所有的 Loop 实现中都能找到。</p><h3 id="Stage-4：-goal-产品化（2026-春）"><a href="#Stage-4：-goal-产品化（2026-春）" class="headerlink" title="Stage 4：&#x2F;goal 产品化（2026 春）"></a>Stage 4：&#x2F;goal 产品化（2026 春）</h3><p>第 8 章讲过 &#x2F;goal 的趋同演化——Codex、Claude Code、Hermes、Antigravity 四家几乎同时推出。&#x2F;goal 把 Ralph Loop 产品化了：停止条件变成了一等公民（不是&quot;我觉得做完了&quot;，是&quot;所有测试通过&quot;），评判模型负责验收（不是自己给自己打分），预算变成了可配置参数。</p><h3 id="Stage-5：编排式-Loop（2026-现在）"><a href="#Stage-5：编排式-Loop（2026-现在）" class="headerlink" title="Stage 5：编排式 Loop（2026 现在）"></a>Stage 5：编排式 Loop（2026 现在）</h3><p>这是 Boris Cherny 和 Peter Steinberger 实际在做的，也是真正的新东西。四个变化：</p><ol><li><strong>Loop 变成了工作单元</strong>，不再是单个任务。</li><li><strong>Loop 开始监督其他 Loop</strong>，并发地、按时间表地。</li><li><strong>调度取代了人工启动</strong>——Loop 跑在基础设施时间上，不是你的注意力时间上。</li><li><strong>持久化变成显式需求</strong>——git-backed state 和 crash recovery，因为这些东西必须扛过重启。</li></ol><p>Ralph 假设你的终端一直开着。2026 年的版本假设你合上了笔记本。第 4 章的 Ralph Loop 是 Stage 3——单 Agent 的自主循环。本章的 Loop Engineering 是 Stage 5——多 Agent 的编排式循环，跑在 Harness 上面，用 Skills 知识武装，通过 Connectors 触达真实工具。</p><h2 id="12-6-一个完整-Loop-的样子"><a href="#12-6-一个完整-Loop-的样子" class="headerlink" title="12.6 一个完整 Loop 的样子"></a>12.6 一个完整 Loop 的样子</h2><p>把五个必需品加上记忆拼在一起。</p><p>每天早上，一个 automation 在你的 repo 上运行。它的 prompt 调用一个 triage skill，读取昨天的 CI 失败、open issue、最近的 commit，把发现写入一个 markdown 文件或 Linear board。对每个值得处理的发现，Loop 开一个 isolated worktree，派一个 sub-agent 起草修复。第二个 sub-agent 对照项目 skills 和已有测试审查那个草稿。Connectors 让 Loop 开 PR、更新 ticket。处理不了的进 triage inbox 给你。State file 是整个东西的脊柱——它记住尝试了什么、通过了什么、还剩什么，明天早上从今天停下的地方继续。</p><p>回头看：你设计了一次。你没有提示任何一个步骤。这就是 Steinberger 的主张变成现实的样子。而且不管你坐在 Codex 还是 Claude Code 里，Loop 的形状是一样的——因为五个原语是同样的五个原语。</p><h2 id="12-7-Boris-Cherny-的实践"><a href="#12-7-Boris-Cherny-的实践" class="headerlink" title="12.7 Boris Cherny 的实践"></a>12.7 Boris Cherny 的实践</h2><p>Cherny 在 WorkOS 的 Acquired Unplugged 活动上给出了他实际跑的几个 Loop。</p><p><strong>PR babysitter。</strong> 每隔几分钟检查所有 open PR——CI 失败、merge conflict、stale 分支——修安全的，推送更新，标记需要人工的。</p><p><strong>CI health。</strong> 监控 flaky 和 broken 测试，能复现就复现，能修就修或隔离，重跑 CI。</p><p><strong>Feedback clustering。</strong> 每 30 分钟拉新的 Twitter 反馈，按主题聚类，汇总自上次运行以来什么变了。</p><p><strong>Idea mining at scale。</strong> 几百个 Claude 同时读 Twitter、GitHub issue、Slack，找出下一步该做什么。大部分想法是烂的，但 Cherny 说大概 20% 是好的——这就是让它广撒网的意义。</p><p>最强的例子不是他自己的。他指向了 Jarred Sumner（Bun 创始人）做的 Robo Bun——一个有牙齿的生产级 Loop。有人提 GitHub issue → bot 自动触发 → 尝试复现 bug → 写 failing test → 修代码 → 开 PR。PR 必须包含一个在旧版本失败在新版本通过的测试。审查 bot 批评修复，修复 agent 回应，只有这时候人类才决定是否 merge。那不是&quot;让 Claude 修个 bug&quot;——它有证明门（proof gates）。</p><p>Cherny 把底层原语叫&quot;hill climbing&quot;（爬山）。给 Claude 一个目标和一个度量进展的方式，告诉它迭代到完成，它就去爬。Jarred 对它说&quot;make it faster than sharp&quot;，Claude 就跑 benchmark、找瓶颈、改代码、重跑、继续爬到目标。目标 + 度量 + 改变的能力 + 测量的能力 &#x3D; 自主改进循环。</p><p>他给无人值守 Agent 运行数小时或数天列了五条清单：auto mode 开权限让它别再问；dynamic workflows 让它编排成百上千个 Agent；&#x2F;goal 或 &#x2F;loop 让它持续跑；Cloud Claude Code 让你合上笔记本；<strong>最重要的是让它有端到端自我验证的方法</strong>。</p><h2 id="12-8-Peter-Steinberger-的实践"><a href="#12-8-Peter-Steinberger-的实践" class="headerlink" title="12.8 Peter Steinberger 的实践"></a>12.8 Peter Steinberger 的实践</h2><p>Steinberger 的 Loop 走了不同的路，但到同一个地方。他的方法论更简洁，一句话：<strong>每次你发现自己为 Agent 做重复的观察、判断、路由或验证，就建一个工具把那个活交给 Agent。把自己从反馈路径中移除。</strong></p><p>怎么发现这些时刻？Steinberger 的办法是：<strong>哪件事让你烦了，哪件事就该自动化。</strong> 烦躁说明你在做机器该干的活。</p><p>Steinberger 的 Loop 分两层。策略层是 <code>vision.md</code>——项目的宪法，Agent 读它来知道项目想要什么、拒绝什么、往哪推。没有这个文件，Loop 会优化向随机贡献者碰巧要求的东西。行为层是 <code>agents.md</code>，他写不变量。Agent 误解项目时，他不在 chat 里教训它——他把规则写进 instructions，让未来的会话自动继承。有个巧妙的转折：他不是自己写这些 instructions，而是让 Agent 为下一个 Agent 重写指导，然后定期问它文件里什么让人困惑，清理矛盾。Agent 改进控制未来 Agent 的指令。</p><p>他的几个 Loop 展示了范围：</p><ul><li><strong>Issue 和 PR reaper。</strong> Agent 读 vision.md，决定请求是否符合项目方向，然后评论、分组或关闭。至少每周重跑，token 充裕就每天。</li><li><strong>Maintainer report。</strong> 爬 Discord、issue、PR，关联投诉和进行中的工作，挑出人叫得最响的前五件事，对照 vision.md 筛选 Agent 能独立处理的，并行派发。</li><li><strong>Mantis，视频证明 Loop。</strong> Ping Agent 在 PR 上，它启动机器、录 bug 视频、修 bug、录修复视频。Agent 看视频验证，Steinberger 看视频按 merge。这是他整个工具箱里最干净的证明循环。</li><li><strong>Auto Review。</strong> commit 落地前，Codex 用新上下文调 Codex 跑多轮审查，修有效问题直到干净。一行 <code>agents.md</code> 指令触发。</li></ul><p>同一个模式每次重复：他是瓶颈，他烦躁了，他给 Agent 建了个工具让它自己做。</p><h2 id="12-9-Loop-无法替你做的事"><a href="#12-9-Loop-无法替你做的事" class="headerlink" title="12.9 Loop 无法替你做的事"></a>12.9 Loop 无法替你做的事</h2><p>Loop 改变了工作，它没有把你从工作中删除。三个问题随着 Loop 变好变得更尖锐，不是更轻松。</p><h3 id="验证仍然在你身上"><a href="#验证仍然在你身上" class="headerlink" title="验证仍然在你身上"></a>验证仍然在你身上</h3><p>12.3.5 讲了 maker-checker 分离，12.7 的 Robo Bun 展示了 proof gates。这些让 Loop 的&quot;做完了&quot;多少有点意义，但&quot;做完了&quot;终归是声称不是证明。Osmani 一直说同一句话：你的工作是交付你确认能用的代码。</p><h3 id="理解力衰退（Comprehension-Debt）"><a href="#理解力衰退（Comprehension-Debt）" class="headerlink" title="理解力衰退（Comprehension Debt）"></a>理解力衰退（Comprehension Debt）</h3><p>Loop 越快交付你没写的代码，仓库里存在的东西和你真正理解的东西之间差距越大。一个顺畅的 Loop 只是让这个差距长得更快，除非你读 Loop 产出的代码。</p><h3 id="认知投降（Cognitive-Surrender）"><a href="#认知投降（Cognitive-Surrender）" class="headerlink" title="认知投降（Cognitive Surrender）"></a>认知投降（Cognitive Surrender）</h3><p>Loop 自己跑着的时候，很自然地就停止形成意见，接受它返回的任何东西。Osmani 叫它 cognitive surrender。设计 Loop 用判断力是解药，用逃避思考是加速剂——同一个动作，相反结果。</p><p>两个人可以建完全相同的 Loop，得到完全相反的结果。一个用它加速自己深刻理解的工作。另一个用它避免理解工作本身。Loop 不知道区别。你知道。</p><h3 id="一个跑飞的-Loop"><a href="#一个跑飞的-Loop" class="headerlink" title="一个跑飞的 Loop"></a>一个跑飞的 Loop</h3><p>2023 年 AutoGPT 的空转是 Loop 失败最著名的例子。给它一个目标，它反复自我提示，既不报错也不推进，无限循环。GitHub 上几万颗星，但真正跑出结果的很少。这个失败给整个领域烙了将近两年的&quot;Agent 是玩具&quot;标签。</p><p>失败的原因很简单：没有 gate。AutoGPT 没有一个能自动说&quot;这条路走不通，停下来&quot;的机制。它能改代码、能读文件、能执行命令，但没有验证环节，所以它不知道自己做得对不对——于是就一直做下去。12.3.5 讲的 maker-checker 分离和 12.11 讲的 Gate，要解决的正是这个问题。没有验证的 Loop 不是自主循环，是 token 焚烧炉。</p><h2 id="12-10-你真的需要-Loop-吗？"><a href="#12-10-你真的需要-Loop-吗？" class="headerlink" title="12.10 你真的需要 Loop 吗？"></a>12.10 你真的需要 Loop 吗？</h2><p>AlphaSignal AI 在一周的 Loop 狂热后发了一篇冷静的分析。四个条件逐一检查，全部满足才值得。</p><p><img src="/images/image-20260609040705671.png"></p><p><strong>条件 1：任务重复。</strong> Loop 把设置成本分摊到多次运行。一次性的工作，好 prompt 更快更便宜。如果工作不是每周重复，你没有 Loop，你有一个跑了一次的脚本。</p><p><strong>条件 2：验证自动化。</strong> Loop 需要一个能不用你就在场就拒绝差工作的东西——测试套件、类型检查器、linter、build。没有自动检查 &#x3D; 你还是坐在那里读每个 diff，这正是 Loop 本该消除的活。</p><p><strong>条件 3：Token 预算能吸收浪费。</strong> Loop 重读上下文、重试、探索都烧 token，不管这次跑有没有交付东西。这个技术随预算缩放——对 token 几乎免费的人来说它显而易见，对按量计费的人来说它鲁莽。Uber 烧完了年度 AI 预算后对每人每工具月费设了 1500 美元上限。成本中心已经从&quot;写代码&quot;转移到了&quot;管 Agent Loop&quot;。</p><p><strong>条件 4：Agent 已有资深工程师的工具。</strong> 日志、复现环境、运行自己写的代码并看到哪里坏了。没有这些，Loop 在盲迭代。</p><p>四个都回答 yes，值得建。缺一个，你在自动化一个还没准备好被自动化的流程。</p><p>好的首个 Loop：CI 失败分诊、依赖升级 PR、lint-and-fix、flaky test 复现、有强测试代码的 issue-to-PR。坏的第一个 Loop：架构重写、认证&#x2F;支付代码、生产部署、模糊的产品工作、&quot;完成&quot;靠判断的任务。</p><p>如果你是按量计费的独立开发者，等等再说。如果你是团队有自动化测试和能吸收浪费的 token 预算，从小开始。</p><h2 id="12-11-最小可行-Loop"><a href="#12-11-最小可行-Loop" class="headerlink" title="12.11 最小可行 Loop"></a>12.11 最小可行 Loop</h2><p>如果你过了四条件测试，先建最小的那个。四个部分，不要 swarm。</p><p><strong>一个 Automation。</strong> <code>/loop</code> 在 Claude Code，或 automation 在 Codex——按节奏触发、条件停止。两个工具也都暴露了 <code>/goal</code>，它跑到声明的条件为真。</p><p><strong>一个 Skill。</strong> 一个 <code>SKILL.md</code> 存储项目上下文——Agent 不然会每次运行从零推导的东西。</p><p><strong>一个 State 文件。</strong> Markdown 文件或 Linear board，记录做完了什么和接下来做什么，让明天的运行恢复而非重启。Osmani 的规则：Agent 会忘记，仓库不会。</p><p><strong>一个 Gate。</strong> 测试、类型检查或 build，自动拒绝差的工作。这是决定 Loop 帮你还是只花钱的部分。</p><p>顺序很重要：先手动跑通一次 → 转成 Skill → 包进 Loop → 调度执行。一个长期运行的高层 spec（<code>VISION.md</code> 或 <code>AGENTS.md</code>）让 Agent 每次运行时重新读到，防止长 Loop 偏离目标。</p><p>度量每个被接受的变更的成本，不是消耗的 token 或尝试的任务数。</p><h3 id="动手：一个-CI-健康检查-Loop"><a href="#动手：一个-CI-健康检查-Loop" class="headerlink" title="动手：一个 CI 健康检查 Loop"></a>动手：一个 CI 健康检查 Loop</h3><p>用 Claude Code 建一个每 10 分钟检查 CI 的最小 Loop。</p><p><strong>第一步：写 Skill。</strong> 创建 <code>.claude/skills/ci-health.md</code>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: ci-health</span><br><span class="line"><span class="section">description: 检查 CI 状态，修复失败测试，隔离 flaky 测试</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 项目上下文</span></span><br><span class="line"><span class="bullet">-</span> 测试命令：npm test</span><br><span class="line"><span class="bullet">-</span> Lint 命令：npm run lint</span><br><span class="line"><span class="bullet">-</span> CI 配置：.github/workflows/ci.yml</span><br><span class="line"></span><br><span class="line"><span class="section">## 规则</span></span><br><span class="line"><span class="bullet">-</span> 只修复有明确错误信息的失败测试</span><br><span class="line"><span class="bullet">-</span> Flaky 测试打 @flaky 标记隔离，不删除</span><br><span class="line"><span class="bullet">-</span> 不动认证和支付相关代码</span><br><span class="line"><span class="bullet">-</span> 修复后必须跑通完整测试套件</span><br></pre></td></tr></table></figure><p><strong>第二步：写 State 文件。</strong> 创建 <code>ci-health-state.md</code>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># CI Health Loop — State</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 待处理</span></span><br><span class="line">&lt;!-- Loop 每次运行时往这里写发现 --&gt;</span><br><span class="line"></span><br><span class="line"><span class="section">## 已处理</span></span><br><span class="line">&lt;!-- 修完的移到这里，记录 PR 号 --&gt;</span><br></pre></td></tr></table></figure><p><strong>第三步：启动 Loop。</strong> 在 Claude Code 里：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">/loop</span><br><span class="line">Prompt: 用 ci-health skill 检查项目 CI 状态。读 ci-health-state.md 了解之前做过了什么。有失败测试就修，修完跑测试确认。修不了的写到 state 文件的待处理部分。每次运行结束前更新 state 文件。</span><br><span class="line">Interval: 10 minutes</span><br></pre></td></tr></table></figure><p>这就是全部。一个 Skill、一个 State 文件、一条 <code>/loop</code> 命令。跑起来之后观察几轮，确认它做对了再放手。Gate 是测试套件本身——修完必须跑通，跑不通它不会标记为完成。</p><h2 id="12-12-It-s-just-a-cron-job-with-a-hat-on"><a href="#12-12-It-s-just-a-cron-job-with-a-hat-on" class="headerlink" title="12.12 &quot;It&#39;s just a cron job with a hat on&quot;"></a>12.12 &quot;It&#39;s just a cron job with a hat on&quot;</h2><p>对 Loop 最犀利的一句质疑只有四个词：&quot;Cronjobs have funny re-branding rn.&quot;——定时任务现在有了个搞笑的新名字。</p><p>这个质疑值得正面回答，因为它对了一半。对的一半：调度层确实是 cron。Boris Cherny 的 Loop 字面意义上就跑在 cron 上。Claude Code 的 <code>/loop</code> 底下就是 cron。如果你的 Loop 定义是&quot;按时间表运行的东西&quot;，那没错，1975 年就发明了。</p><p>Cron 从来没有的部分是中间那个东西。Cron job 跑固定脚本。Loop 跑一个模型——它看当前状态，决定下一步做什么，做了，检查是否成功，决定是否继续。决策是 Agent 的，不是你的，不是硬编码的分支。堆起来，让一个 Loop 调度和监督其他 Loop，给它们持久的共享状态——你就有了一些 cron 无法表达的东西。</p><p>诚实的说法：<strong>Loop 是 cron 触发 + 一个每次触发后看情况决策的 AI</strong>。真正要花心思的工程，是确保那个 AI 不会跑下悬崖。</p><h2 id="12-13-Loop-与全书方法论的对接"><a href="#12-13-Loop-与全书方法论的对接" class="headerlink" title="12.13 Loop 与全书方法论的对接"></a>12.13 Loop 与全书方法论的对接</h2><p>Loop Engineering 不是孤立的概念。前十一章的方法论在 Loop 里各有各的位置。</p><table><thead><tr><th>方法论</th><th>在 Loop 中的角色</th></tr></thead><tbody><tr><td>第 2 章 Skills</td><td>Loop 内可复用的能力单元——没有 Skills 的 Loop 每次从零推导</td></tr><tr><td>第 3 章 SDD</td><td>Loop 的 Gate 之一——规格一致性检查</td></tr><tr><td>第 4 章 Ralph Loop</td><td>Loop Engineering 的 Stage 3 前身——自指涉、循环到对</td></tr><tr><td>第 5 章 gstack</td><td>Loop 的审查流水线——角色化门控</td></tr><tr><td>第 7 章 autoresearch</td><td>完整的 Loop 实现——多 Agent 轮转 + 双轨门禁</td></tr><tr><td>第 8 章 Goal Workflow</td><td>&#x2F;goal 是 Loop 的条件驱动原语</td></tr><tr><td>第 10 章 Harness</td><td>Loop 坐在 Harness 上一层的抽象</td></tr><tr><td>第 11 章 Kanban</td><td>Loop 运行的可视化追踪——每个卡片对应一个正在跑或等审查的 Loop 实例</td></tr></tbody></table><p>一个完整的 AI 研发体系可以这样看：Harness 提供安全运行环境，方法论提供做事的方法，Kanban 提供可视化编排，Loop 提供自主驱动力。四层拼在一起，你不在的时候 Agent 也能安全、正确、持续地工作。</p><h2 id="12-14-本章小结"><a href="#12-14-本章小结" class="headerlink" title="12.14 本章小结"></a>12.14 本章小结</h2><p>五个原语——Automations、Worktrees、Skills、Connectors、Sub-agents——加一个记忆，搭出一个可信赖的自主循环。Loop 的难度不在 Loop 本身，在于里面放一个能说&quot;不&quot;的东西。没有检查的 Loop 不是自主循环，是 token 焚烧炉。</p><p>两个人建完全相同的 Loop，可以得到完全相反的结果。差异不在工具，在于你是否理解你在自动化什么。Cherny 的观点不是工作变容易了——是杠杆的支点移动了。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/loop-engineering-from-prompting-to-designing-loops/</id>
    <link href="https://colobu.com/2026/06/28/loop-engineering-from-prompting-to-designing-loops/"/>
    <published>2026-06-28T05:30:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>&quot;You shouldn&#39;t be prompting coding agents anymore. You should be designing loops that prompt your agents.&quot;<br>你不应该再提示编码 Agent 了。你应该设计循环来提示你的 Agent。</p>
<p>——Peter Steinberger, 2026 年 6 月 7 日</p>
</blockquote>
<p>第 10 章搭了 Agent 的运行环境——hooks、权限、沙箱、配置继承。第 11 章用 Kanban 管多个 Agent 的并行编排。但有一个更根本的问题还没回答：<strong>每次都是你在提示 Agent。你打字，它回话，你再打字。你不在，它就不动。</strong></p>
<p>2026 年 6 月，两条推文把这个矛盾推到了台前。Peter Steinberger（OpenClaw 作者）的那句话在 48 小时内获得 220 万次浏览。几天后，Boris Cherny（Anthropic Claude Code 负责人）在 WorkOS 的 Acquired Unplugged 活动上说了几乎同样的话：&quot;I don&#39;t prompt Claude anymore. I have loops running that prompt Claude and figuring out what to do. My job is to write loops.&quot;</p>
<p><img src="/images/image-20260609032530128.png"></p>
<p>全网炸了。但没人说得清&quot;loop&quot;到底是什么。有人说是 Ralph Loop 的翻版，有人说是&quot;戴了顶帽子的 cron job&quot;，有人说&quot;prompt engineering 已死&quot;。一周之内，Reddit、Hacker News、X 上的讨论翻了几十页，最诚实的回答是 Matthew Berman 那句：&quot;Nobody knows but him and Boris.&quot;</p>
<p>Addy Osmani 随即发表了长文&quot;Loop Engineering&quot;，给了这个概念第一个完整的拆解。本章基于 Osmani 的框架，结合 Boris Cherny 的实践、Geoffrey Huntley 的 Ralph Loop 思想、以及 AlphaSignal 的四条件测试，回答三个问题：Loop Engineering 是什么？它和前十一章的方法论什么关系？你真的需要它吗？</p>]]>
    </summary>
    <title>Loop Engineering：从提示 Agent 到设计循环</title>
    <updated>2026-06-28T06:46:22.012Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="Kanban" scheme="https://colobu.com/tags/Kanban/"/>
    <category term="AgentOps" scheme="https://colobu.com/tags/AgentOps/"/>
    <content>
      <![CDATA[<blockquote><p>&quot;You don&#39;t write the code anymore. You move the cards.&quot;<br>你不写代码了。你移动卡片。</p><p>——leodavinci1, kanbots 作者</p></blockquote><p>Skills 封装能力。Spec 写合约。Ralph Loop 循环到对。gstack 角色覆盖。Goal Workflow 流水线串联。autoresearch 全自动闭环。这些方法论解决的都是&quot;一个 Agent 怎么做事&quot;。</p><p>真实场景从来不是一个 Agent。是多个 Agent 同时跑在不同的 worktree 里，多张卡片分布在多块板子上，你不盯就没人在盯。</p><p>Kanban 管的就是这个局面。管 Agent。</p><span id="more"></span><h2 id="11-1-为什么是-Kanban"><a href="#11-1-为什么是-Kanban" class="headerlink" title="11.1 为什么是 Kanban"></a>11.1 为什么是 Kanban</h2><p>Kanban 不是新东西。丰田 1950 年代用看板管生产线——大野耐一发明了&quot;拉动式生产&quot;：下游消耗完，上游才补，不囤货，不过载。David Anderson 2010 年把看板带入软件工程——可视化工作流、限制 WIP、管理流动。现在进入第三次迁移：从管人变成管 Agent。</p><p>为什么是现在？瓶颈变了。</p><p>传统开发者的瓶颈在写。AI 时代开发者的瓶颈在管。你面前不再是一个编辑器——是四个终端窗口，每个窗口里一个 Agent 在你没看见的地方做着决定。Karpathy 在 No Priors 播客里说过，自己编写代码的比例从 80% 降到了零，时间花在&quot;向 Agent 下达宏观指令、审查输出、决定哪些要返工&quot;上。</p><p>Kanban 的三个核心原理恰好匹配 Agent 场景：</p><ul><li><strong>可视化工作流。</strong> Agent 正在做什么、做完了什么、卡在什么上面——一张板子全看到。</li><li><strong>限制并行度。</strong> 同时跑 10 个 Agent 制造的不是加速，是文件冲突和 token 账单。WIP 限制把并行数控制在可管理的范围。</li><li><strong>拉式流动。</strong> Agent 做完一个，自己从就绪队列拉下一个。不用逐张 dispatch。</li></ul><h2 id="11-2-三个看板工具"><a href="#11-2-三个看板工具" class="headerlink" title="11.2 三个看板工具"></a>11.2 三个看板工具</h2><p>2025 到 2026 年，社区出现了几个专门为 AI Agent 设计的看板。kanbots、Vibe Kanban、kanban-code，三个产品，三种设计路线。</p><h3 id="11-2-1-kanbots：每张卡片一个-Agent"><a href="#11-2-1-kanbots：每张卡片一个-Agent" class="headerlink" title="11.2.1 kanbots：每张卡片一个 Agent"></a>11.2.1 kanbots：每张卡片一个 Agent</h3><p>GitHub 仓库：<a href="https://github.com/leodavinci1/kanbots">leodavinci1&#x2F;kanbots</a>，341 Stars，MIT 协议，最新版本 v1.2.0（2026 年 5 月）。</p><p>核心理念一句话：<strong>一张卡片 &#x3D; 一个 Agent 运行实例。</strong></p><p><strong>安装。</strong> macOS 一行命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL https://kanbots.dev/install-mac.sh | bash</span><br></pre></td></tr></table></figure><p>脚本自动下载 <code>.dmg</code>、拷贝到 <code>/Applications</code>、清除 quarantine 标记。Linux 用 <code>.AppImage</code>（<code>chmod +x</code> 后运行）或 <code>.tar.xz</code>。Windows 用 <code>.exe</code> 安装程序（SmartScreen 警告点&quot;更多信息 → 仍然运行&quot;）。源码构建需要 Node 20+、pnpm 10+、git，<code>pnpm install &amp;&amp; pnpm desktop</code>。无需账号——纯本地运行。</p><p>macOS 手动安装注意：由于未代码签名，macOS 14 及以前右键 → 打开即可，macOS 15（Tahoe）需 <code>xattr -dr com.apple.quarantine &quot;/Applications/kanbots.app&quot;</code>。</p><p><strong>前置条件。</strong> 需安装 Claude Code CLI（<code>claude</code>）或 Codex CLI（<code>codex</code>），至少一个在当前 PATH 中。<code>which claude</code> 确认可解析。如果终端能找到但应用启动后 Dispatch 失败——桌面启动器用的 PATH 和终端不同，从同一终端启动或把 CLI 路径加到 shell rc 后重新登录。</p><p><strong>首次运行。</strong> 应用打开到工作区选择器。选择任意包含 git 仓库的文件夹（必须是 <code>git clone</code> 的，不是 zip 下载的）。kanbots 检测仓库：<code>git rev-parse --show-toplevel</code> → 如果检测到 <code>origin</code> 远端自动建议 GitHub 模式，否则回退到本地模式。两种模式随时可切换。</p><p>首次打开在项目根目录下生成 <code>.kanbots/</code> 目录：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">.kanbots/</span><br><span class="line">├── db.sqlite              ← 所有数据（issues、runs、threads、providers）</span><br><span class="line">├── db.sqlite-wal          ← WAL 日志</span><br><span class="line">├── db.sqlite-shm          ← 共享内存</span><br><span class="line">├── config.json            ← 工作区模式 + 默认配置</span><br><span class="line">├── worktrees/             ← 每次 agent run 一个独立 git worktree</span><br><span class="line">├── attachments/           ← 拖入聊天或卡片的文件</span><br><span class="line">├── mcp-runtime/           ← 传给 Claude 的临时 MCP 配置</span><br><span class="line">└── promote/               ← 晋升 worktree 提交时的暂存区</span><br></pre></td></tr></table></figure><p><code>db.sqlite</code> 是除源码外的单一真值来源。<code>.kanbots/</code> 应加入 <code>.gitignore</code>——应用首次会提示。</p><p><strong>看板创建卡片。</strong> 点击右上角 <strong>+ New task</strong>。五种模板：<code>Bug fix</code>、<code>Feature</code>、<code>Refactor</code>、<code>Review</code>、<code>Spike</code>。</p><p>三种启动方式：</p><ul><li><strong>Spec first</strong>——在新 worktree 上跑 <code>/spec</code> 生成验收标准，等你 approve 再实现</li><li><strong>Create &amp; dispatch</strong>——马上派 Agent 在新 worktree 上开发</li><li><strong>Queue for later</strong>——卡片留在 Backlog，以后手动 dispatch</li></ul><p>每次 dispatch 可选 Agent CLI（默认 <code>claude (auto)</code>，可切 Codex）、模型、努力级别。本地模式卡片存为 <code>local_issues</code> 行；GitHub 模式卡片创建为真实 GitHub Issue。</p><p><strong>Agent 运行流程。</strong> 打开卡片 → 点 Dispatch → 选 Agent 身份和模型 → 确认。kanbots 在 <code>.kanbots/worktrees/issue-&lt;n&gt;-&lt;runId&gt;/</code> 下创建隔离 worktree，从默认分支切出，启动 CLI。详情面板实时流式显示每个 <code>tool_use</code> 和 <code>tool_result</code>。Agent 遇到决策点——&quot;三个方案选哪个？&quot;——弹出选项卡片，你选后 Agent 继续。</p><p>Agent 跑完：<strong>Branch preview</strong>（一键启动 worktree 的 dev server，打开浏览器看效果）、<strong>Promote commit</strong>（把 worktree 的提交 rebase 到你的分支）、<strong>Open draft PR</strong>（仅 GitHub 模式——推送并创建草稿 PR）、<strong>Discard</strong>（删除 worktree 和分支）。</p><p>每个 worktree 预装 pre-push hook，Agent 不能主动推送远程。晋升永远是手动操作。和第 10 章的 Harness Engineering 原理一致：权限边界在系统层强制执行，不在 Agent 的 prompt 里。</p><p><strong>常见故障。</strong> &quot;Dispatch failed: claude not found&quot;——桌面启动器 PATH 和终端 PATH 不同，从同一终端启动或把 <code>claude</code> 安装目录加到 <code>~/.zshrc</code>。端口 8474 被占用时设 <code>KANBOTS_DISPATCHER_PORT=&lt;port&gt;</code> 环境变量后重启。</p><p><img src="/images/image-20260531145522234.png"></p><p><strong>Autopilot 模式。</strong> kanbots 把 Dispatch 从单次点击变成循环。</p><p><code>feature-dev</code> 模式：设定人物角色列表（persona roster），最多四个并行槽位。Agent 们轮转上场，在父 Issue 范围内自主拆分子任务、分派执行。设定成本预算上限，Agent 们在这个预算内自己跑。</p><p><code>qa</code> 模式：自动运行你配置的检查命令（typecheck、test、lint、build、e2e），可选启动 dev server 监控，哪个检查挂了自动开一个修复 Agent 去修。</p><p>两种模式写入 <code>autopilot_sessions</code> 表。你能看到每轮循环历史、每个子 Agent 的运行记录，一个按钮停掉整棵树。</p><p>Autopilot 和第 4 章 Ralph Loop 机制相同：Agent 循环执行直到完成。区别是 Ralph Loop 单 Agent 串行，Autopilot 多 Agent 并行——每个 Agent 一个泳道，同时游。</p><p><strong>MCP 集成。</strong> kanbots 附带 MCP server（<code>@kanbots/mcp</code>）。Cursor、Claude Desktop 或者任何 MCP 兼容工具都能直接操作看板——读取卡片、创建卡片、触发 Dispatch。Agent 能写代码，也能管自己的看板。一层递归：Agent A 在看板上管着 Agent B、C、D 的卡片流转。</p><p><strong>本地优先。</strong> 数据存 SQLite。<code>.kanbots/</code> 目录自包含——一个文件夹搬走，整个项目状态跟着走。完全离线可用。也支持切到 GitHub Issues 模式，驱动真实 GitHub Issues，状态流转自动同步 <code>status:*</code> 标签。</p><h3 id="11-2-2-Vibe-Kanban：Agent-的工作台"><a href="#11-2-2-Vibe-Kanban：Agent-的工作台" class="headerlink" title="11.2.2 Vibe Kanban：Agent 的工作台"></a>11.2.2 Vibe Kanban：Agent 的工作台</h3><p>官网：<a href="https://www.vibekanban.com/">vibekanban.com</a>。由 BloopAI 团队开发。定位：组织并行 Agent 工作流，从零到 Pull Request。github上2.6万颗星。</p><p><img src="/images/image-20260531151524239.png"></p><p><strong>安装。</strong> 一行命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx vibe-kanban</span><br></pre></td></tr></table></figure><p>浏览器自动打开 Web UI。首次运行选择 Agent、IDE、通知偏好后可跳过登录（&quot;More options → I understand, continue without signing in&quot;）。跳过登录禁用看板、Issue 管理和团队功能，但单人 Workspace 全部可用。登录（GitHub 或 Google）自动创建个人组织和一个初始项目。</p><p><strong>核心抽象：Workspace。</strong> 和 kanbots 的&quot;一张卡片一个 Agent&quot;不同，Vibe Kanban 的核心单元是 Workspace——给编码 Agent 准备的独立工作空间。一个 Issue 可有多个 Workspace。</p><p>每个 Workspace 配置：仓库（支持多仓库）、分支、prompt、模型、努力级别、plan 模式。配置完成 Agent 立即在 Workspace 里按 prompt 开始执行。Workspace 底层创建 git worktree 隔离代码变更。也可不关联 Issue——纯当快速代码问答用。</p><p><strong>Issue 系统。</strong> Issue 代表一个 bug、功能或待完成的工作。最少需要标题和描述，可选优先级、标签、父子 Issue 链接。点击&quot;New Issue&quot;创建，右侧面板展示草稿和已选 Issue 的详情。</p><p><strong>完整流程。</strong> Plan → Run → Review → Preview → Ship：</p><ol><li><strong>Plan。</strong> 看板上创建 Issue，排优先级，分配父子依赖。</li><li><strong>Run。</strong> 为 Issue 创建 Workspace，配置 Agent、分支、prompt，Agent 在隔离 worktree 里执行开发任务。</li><li><strong>Review。</strong> 点击&quot;Open Workspace&quot;进入完整视图。Diffs 和浏览器预览通过浮动按钮切换。直接在 UI 里看 diff 并批注——批注意见直接发给 Agent，不切终端。</li><li><strong>Preview。</strong> 内置浏览器预览 Agent 的改动效果。</li><li><strong>Ship。</strong> Workspace 完成后合并：创建 GitHub PR 或本地合并 workspace 分支。</li></ol><p><strong>Agent 支持。</strong> 用户选择 Agent，Workspace 里可单独配置模型、努力级别、plan 模式。支持并行 Agent 执行——多个 Workspace 同时跑不同的 Agent。支持 10+ 种编码 Agent：Claude Code、Codex、Gemini CLI、GitHub Copilot、Amp、Cursor、OpenCode、Droid、CCR、Qwen Code。</p><p><strong>团队功能。</strong> 需要登录。支持共享项目和 Issue、多人协作 Review。由于 Vibe Kanban 是 Web 应用（有自托管 Docker 部署方案），团队数据由后端统一管理。</p><p><img src="/images/image-20260531150712726.png"></p><p><strong>和 kanbots 的关键差异：</strong></p><ul><li>kanbots 是<strong>本地单机 Electron 应用</strong>——SQLite + 本地 Agent 执行 + 无需网络。Vibe Kanban 是<strong>Web 协作平台</strong>——后端、数据库、用户体系、自托管 Docker 部署。</li><li>kanbots 的 Agent 运行是&quot;点 Dispatch 跑一个&quot;——偏 Agent 自主循环。Vibe Kanban 是&quot;在 Workspace 里持续交互&quot;——Review 内嵌在 UI 中，偏人机协同。</li><li>kanbots 数据完全在本地。Vibe Kanban 有完整的云后端和团队协作能力。</li></ul><p><strong>Sunsetting。</strong> Vibe Kanban 已宣布逐步关闭。官网上挂着公告：&quot;Vibe Kanban is sunsetting. The project will continue as open source and community maintained.&quot;，主要原因是开发者团队找不到合适的商业模式，主要用户都是免费用户。从产品角度看，做 Agent 协作工具的 SaaS 商业模式仍在摸索期——开发者倾向开源免费工具，企业市场仍在观望 Agent 成熟度。夹在中间的 SaaS 产品找不到舒适的定价锚点。</p><p>但 Vibe Kanban 的设计不会过时。它的 Workspace 抽象——&quot;给 Agent 一个独立分支、一个终端、一个可预览的 dev server、一个 review loop&quot;——是 Agent 协作工具的理念标杆。之后出现的同类工具，开源或商业，大概率沿这条路走。</p><p>我个人试用了Vibe Kanban，产品简洁。好在它开源了，靠社区维护，希望这个产品能活下去。</p><h3 id="11-2-3-kanban-code：Agent-控制面板"><a href="#11-2-3-kanban-code：Agent-控制面板" class="headerlink" title="11.2.3 kanban-code：Agent 控制面板"></a>11.2.3 kanban-code：Agent 控制面板</h3><p>GitHub 仓库：<a href="https://github.com/langwatch/kanban-code">langwatch&#x2F;kanban-code</a>，193 Stars，AGPL-3.0 协议，最新版本 v0.1.28（2026 年 5 月）。</p><p>原生 macOS（SwiftUI）和 Windows（Tauri）双端应用。定位最偏&quot;个人开发者日常驾驶舱&quot;——六列看板，每张卡片自动关联 Claude 会话、git worktree、tmux 终端和 GitHub PR。卡片基于真实活动信号自动横移——Claude 开始工作 → 入 In Progress，PR 已开 → 入 In Review，PR 合入 → 入 Done。不用手动拖。</p><p><img src="/images/image-20260531151357076.png"></p><p><strong>安装。</strong> macOS 从 <a href="https://github.com/langwatch/kanban-code/releases">GitHub Releases</a> 下载 <code>.app</code> 文件（未公证，需右键 → 打开）。首次启动运行 onboarding 向导，自动检测依赖（Claude Code CLI、tmux、gh CLI、mutagen、Amphetamine——全是可选的渐进式增强）。</p><p>源码构建：<code>git clone</code> 仓库，<code>make run-app</code>（macOS）。Windows 进入 <code>windows/</code> 目录：<code>npm install &amp;&amp; npm run tauri dev</code>（开发模式）或 <code>npm run tauri build</code>（生产 <code>.exe</code>）。</p><p>跨平台 CLI 自动安装在 <code>~/.local/bin/kanban</code>（app 首次启动或 <code>make install-cli</code>）。常用命令：<code>kanban list</code>（按列列出卡片，<code>-c</code> 过滤列，<code>--json</code> 输出）、<code>kanban status</code>（概览：卡片数、终端数、token 消耗、成本）、<code>kanban show &lt;card&gt;</code>（详情：会话、tmux、PR、transcript）、<code>kanban send &lt;card&gt; &lt;message&gt;</code>（向卡片的 tmux 会话发 prompt）、<code>kanban interrupt &lt;card&gt;</code>（发 Escape 停止助手）、<code>kanban transcript &lt;card&gt;</code>（最近对话记录）。卡片引用支持 ID、ID 前缀、名称、tmux 会话名或 session ID。全部命令支持 <code>--json</code>——为主 Agent 编排子 Agent 设计。</p><p>配置存 <code>~/.kanban-code/settings.json</code>（人工可读、可版本控制）。协调数据存 <code>~/.kanban-code/links.json</code>（关联 session、worktree、tmux、PR）。</p><p><strong>tmux 终端嵌入。</strong> 每个 Claude 任务跑在独立 tmux 会话中。kanban-code 管理 tmux 生命周期——启动 Claude 时自动创建会话，重连时自动 attach，归档时自动 kill。卡片内嵌原生终端模拟器（SwiftTerm，支持真彩色、Unicode、鼠标、滚回）。终端状态跨卡片保持——切卡片不丢终端内容。也能 <code>tmux attach</code> 到外部终端操作。</p><p><strong>Session 发现与搜索。</strong> 自动扫描 <code>~/.claude/projects/</code> 发现全部 Claude 会话——正在跑的、历史的、在终端手动启动的。BM25 全文搜索跨全部会话历史，带新近度加权。能从任意历史点 fork 出一个新会话——带上全部上下文，并行做新任务。Checkpoint 回滚到任意对话节点。</p><p><strong>Git Worktree 集成。</strong> 每张卡片自动创建 git worktree。GitHub Issue 用 <code>issue-123</code> 命名 worktree，手动任务自动生成名称。发现后台孤立的 worktree 提示清理。</p><p><strong>远程执行。</strong> 通过 SSH + Mutagen 把 Claude Code 卸载到远程机器——本地编辑，远程编译，双向文件同步。UI 显示 Mutagen 同步状态。远程机器离线自动回退到本地执行。</p><p><strong>Push 通知。</strong> 通过 Pushover 发到手机和 Apple Watch。Agent 的响应摘要直接推到手腕上。智能去重——Stop 事件合并，62 秒内同内容去重。</p><p><strong>防休眠。</strong> 集成 Amphetamine——Agent 在跑时不让 Mac 睡。Agent 都空闲时自动退出。</p><h3 id="11-2-4-三者对比"><a href="#11-2-4-三者对比" class="headerlink" title="11.2.4 三者对比"></a>11.2.4 三者对比</h3><table><thead><tr><th></th><th>kanbots</th><th>Vibe Kanban</th><th>kanban-code</th></tr></thead><tbody><tr><td><strong>定位</strong></td><td>本地 Agent 调度器</td><td>Agent 协作工作台</td><td>Agent 控制面板</td></tr><tr><td><strong>粒度</strong></td><td>卡片 &#x3D; Agent Run</td><td>Workspace &#x3D; 开发环境</td><td>卡片 &#x3D; 会话集合（session+worktree+tmux+PR）</td></tr><tr><td><strong>Agent 角色</strong></td><td>执行者 + 自我审查（Autopilot）</td><td>执行者 + 被 Review</td><td>执行者</td></tr><tr><td><strong>人的角色</strong></td><td>Dispatch + 关键决策</td><td>规划 + 逐行 Review</td><td>监控 + 随时介入</td></tr><tr><td><strong>协作模式</strong></td><td>单人本地</td><td>团队协作</td><td>单人本地 + 远程执行</td></tr><tr><td><strong>数据存储</strong></td><td>本地 SQLite</td><td>后端数据库</td><td>本地 JSON + tmux + git</td></tr><tr><td><strong>Agent 支持</strong></td><td>11 种 CLI</td><td>10+ 种</td><td>Claude Code 专属</td></tr><tr><td><strong>自动化程度</strong></td><td>Autopilot 循环</td><td>手动触发为主</td><td>会话自动发现</td></tr><tr><td><strong>平台</strong></td><td>macOS&#x2F;Linux&#x2F;Windows</td><td>Web</td><td>macOS&#x2F;Windows</td></tr><tr><td><strong>许可证</strong></td><td>MIT</td><td>商业</td><td>AGPL-3.0</td></tr><tr><td><strong>成熟度</strong></td><td>活跃开发中</td><td>宣布 sunsetting</td><td>活跃开发中</td></tr></tbody></table><p>三个工具指向同一个方向：模型能力上去了，Agent 管理层自然要跟上。Harness 管 Agent 的安全和可控性（纵向）。Kanban 管 Agent 的调度和协作（横向）。组合起来才是完整的 AgentOps。</p><p>Hermes以及一些其他的Agent最近也增加了kanban的功能，也有 kanban Skill（<a href="https://github.com/mattjoyce/kanban-skill%EF%BC%89%EF%BC%8C%E4%B8%8D%E8%BF%87%E6%B2%A1%E5%8F%91%E5%B1%95%E8%B5%B7%E6%9D%A5%E3%80%82">https://github.com/mattjoyce/kanban-skill），不过没发展起来。</a></p><h2 id="11-3-从个人工具到团队平台"><a href="#11-3-从个人工具到团队平台" class="headerlink" title="11.3 从个人工具到团队平台"></a>11.3 从个人工具到团队平台</h2><p><img src="/images/image-20260531152206976.png"></p><p>三个工具覆盖了 AI Agent 项目的三个管理阶段：</p><p><strong>第一阶段：个人提效。</strong> 你一个人，一块看板，几个 Agent。目标是让自己从瓶颈变调度中心。kanbots 和 kanban-code 都面向这个阶段——本地工具，不需要服务端，不需要协作功能。把个人 Agent 的管理问题解决了，再考虑推广到团队。</p><p><strong>第二阶段：团队协作。</strong> 共享看板，每个人分配自己的 Agent 做子任务。Review 分布式进行。需要权限管理、代码所有权、CI&#x2F;CD 集成。Vibe Kanban 瞄准这个阶段——虽然它关闭了，但需求不会消失。目前这个阶段主要由 GitHub Issues + kanbots GitHub 模式 + kanban-code PR 追踪拼凑出一套折中方案。</p><p><strong>第三阶段：人机混合团队。</strong> Agent 不只是执行者——还做规划和决策建议。人的角色从执行退到监督、从分配任务退到设定方向。这个阶段目前没有人做成熟的商业化产品，但 kanbots 的 Autopilot + MCP 集成已经展现了雏形。</p><p>绝大多数团队目前在第一步和第二步之间。先用 kanbots 或 kanban-code 个人跑起来，理解 Agent 的工作节奏，建立卡片规范和 review 习惯。模式内化之后，工具反而不那么重要了——核心心智模型永远一样：可视化工作流、限制并行度、拉式流动。</p><h2 id="11-4-本章小结"><a href="#11-4-本章小结" class="headerlink" title="11.4 本章小结"></a>11.4 本章小结</h2><p>Kanban Agent 方法论是 AI 时代软件开发的&quot;驾驶舱&quot;。前九章教开车，第 10 章看引擎盖下面，这一章讲仪表盘——你坐在哪、看什么、怎么同时指挥多辆车。</p><p>这几个AI模式下的kanban工具还是很有用的，很方便管理项目任务进度，尤其对那些先前就使用kanban的团队来说就更方便了。</p><p>三个工具代表三种设计哲学。kanbots 是本地 Agent 调度器——一张卡片一个 Agent，Autopilot 自主循环，MCP 让 Agent 管自己的看板。Vibe Kanban 是团队 Agent 工作台——Workspace 抽象，从 Plan 到 Ship 全流程覆盖，虽然关闭了但设计理念会留下来。kanban-code 是 Agent 控制面板——tmux 终端嵌入、Pushover 通知、远程执行，个人开发者日常驾驶舱。</p><p>三个工具都指向同一个趋势：当一个人的 Agent 从一台变成四台、五台、十台，单靠终端切换和记忆是管不住的——需要系统级的工作流编排。第 10 章的 Harness Engineering 管 Agent 的安全和可控性，本章的 Kanban 管 Agent 的调度和协作。一个是纵向控制，一个是横向协调。组合在一起才是完整的 AgentOps。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/kanban-orchestrate-ai-agent-projects/</id>
    <link href="https://colobu.com/2026/06/28/kanban-orchestrate-ai-agent-projects/"/>
    <published>2026-06-28T05:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>&quot;You don&#39;t write the code anymore. You move the cards.&quot;<br>你不写代码了。你移动卡片。</p>
<p>——leodavinci1, kanbots 作者</p>
</blockquote>
<p>Skills 封装能力。Spec 写合约。Ralph Loop 循环到对。gstack 角色覆盖。Goal Workflow 流水线串联。autoresearch 全自动闭环。这些方法论解决的都是&quot;一个 Agent 怎么做事&quot;。</p>
<p>真实场景从来不是一个 Agent。是多个 Agent 同时跑在不同的 worktree 里，多张卡片分布在多块板子上，你不盯就没人在盯。</p>
<p>Kanban 管的就是这个局面。管 Agent。</p>]]>
    </summary>
    <title>Kanban：用看板编排 AI Agent 项目</title>
    <updated>2026-06-28T06:46:22.011Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="Claude Code" scheme="https://colobu.com/tags/Claude-Code/"/>
    <category term="Harness" scheme="https://colobu.com/tags/Harness/"/>
    <content>
      <![CDATA[<blockquote><p>&quot;The decisive result came not from the model alone, but from the harness around it.&quot;<br>决定成败的不仅是模型本身，更是其配套的外围系统。</p><p>——Anthropic Harness Engineering Team</p></blockquote><p>Skill 封装能力。Spec 写规格。Ralph Loop 自己跑到对。gstack 用角色覆盖质量。Goal Workflow 串成七步流水线。autoresearch 全自动从 Issue 到合入。</p><p>这些方法论都在 Claude Code 之上运行。但 Claude Code 自己怎么造出来的？它调工具、读文件、写代码、执行 Bash——每一步都可能出错、可能越权、可能陷入死循环。谁在管这些？</p><p><strong>Harness Engineering</strong> 回答的就是这个问题。不是&quot;怎么用 Agent&quot;，是&quot;怎么造 Agent&quot;。本章拆开 Claude Code 的引擎盖，看它的 hooks、settings.json、权限模型、沙箱、可观测性怎么拼在一起，把一个大语言模型变成可安全交付的产品。</p><span id="more"></span><h2 id="10-1-Harness-这个词"><a href="#10-1-Harness-这个词" class="headerlink" title="10.1 Harness 这个词"></a>10.1 Harness 这个词</h2><p>Harness 的原意是马具。骑手不直接徒手控马——靠缰绳、挽具、马衔把力量引导到正确的方向。在 AI Agent 上，Harness 就是那一层控制基础设施：模型推理能力以外的、所有约束和引导它的系统代码。</p><p><img src="/images/image-20260531114244272.png"></p><p>把大语言模型直接暴露给文件系统和 Bash 的操作结果，在任何 Agent 产品中都是必须解决的安全问题。Anthropic 内部有一个专门的 Harness Engineering 团队，不写模型代码，不调 prompt——他们设计 hooks 机制、权限模型、settings.json 的继承逻辑、bash 沙箱。Claude Code 从&quot;能对话的模型&quot;变成&quot;能安全交付的产品&quot;，Harness 是那条分界线。</p><p>到 2026 年 5 月，Claude Code 的 Harness 已经演化成一套完整系统——31 个生命周期事件、5 种 hook 类型、4 层配置继承、3 种权限模式、bash 沙箱。它们搭出了一套 Agent 的操作系统。</p><p>5月19日，DeepSeek 资深研究员陈德里在小红书上发了一条招聘贴，证实内部正在组建全新的&quot;Harness&quot;（代码智能体工程）团队，目标直指 Anthropic 旗下的明星产品 Claude Code。</p><h2 id="10-2-Harness-的十二个组件"><a href="#10-2-Harness-的十二个组件" class="headerlink" title="10.2 Harness 的十二个组件"></a>10.2 Harness 的十二个组件</h2><p><img src="/images/image-20260531133749705.png"></p><p>本节给出本书对 Harness Engineering 的归纳框架——一个生产级 Agent 需要处理的十二个维度。这不是 Anthropic 或任何组织的官方分类，而是从前述各 Agent 产品的实现中抽象出的共性组件。</p><ol><li><strong>编排循环</strong> — Agent 什么时候做、什么时候停</li><li><strong>工具系统</strong> — Agent 能调什么、怎么调</li><li><strong>记忆管理</strong> — 跨会话状态存在哪</li><li><strong>上下文管理</strong> — 模型能看到什么</li><li><strong>Prompt 构造</strong> — 系统指令怎么注入</li><li><strong>输出解析</strong> — 模型的响应怎么变成行动</li><li><strong>状态管理</strong> — 会话、任务、迭代的状态</li><li><strong>错误处理</strong> — 调失败了怎么办</li><li><strong>安全护栏</strong> — 什么绝对不能做</li><li><strong>验证循环</strong> — 完成的判断标准</li><li><strong>子 Agent 编排</strong> — 多 Agent 怎么协作</li><li><strong>安全机制</strong> — 沙箱、权限、审计</li></ol><p>第 4 章 Ralph Loop 的双出口门——Agent 说&quot;做完了&quot;，还得匹配 completion promise——对应这里的编排循环和验证循环。第 5 章 gstack 的 hooks 强制门控——代码审查没过不允许 commit——对应工具系统。</p><h2 id="10-3-Claude-Code：最完整的-Harness-落地"><a href="#10-3-Claude-Code：最完整的-Harness-落地" class="headerlink" title="10.3 Claude Code：最完整的 Harness 落地"></a>10.3 Claude Code：最完整的 Harness 落地</h2><p>Claude Code 是目前 Harness Engineering 实现最完整的 Agent 产品。</p><h3 id="10-3-1-编排循环：谁告诉-Agent-什么时候停"><a href="#10-3-1-编排循环：谁告诉-Agent-什么时候停" class="headerlink" title="10.3.1 编排循环：谁告诉 Agent 什么时候停"></a>10.3.1 编排循环：谁告诉 Agent 什么时候停</h3><p>Claude Code 的编排循环通过 hooks 实现。31 个生命周期事件中，最核心的编排相关事件是 <code>Stop</code>、<code>PostToolBatch</code>、<code>PreCompact</code>。</p><p>第 4 章 Ralph Loop 的 Stop Hook 是最直观的例子：Agent 完成一轮工作后尝试退出 → <code>Stop</code> hook 触发 → 检查 completion promise 是否匹配 → 未匹配则返回 exit 2 阻止退出 → 相同的 prompt 重新注入 → Agent 继续下一轮。Stop Hook 不依赖 Agent 的自我判断——它在 Claude Code 运行时层面拦截退出行为，Agent 无法绕过。</p><p><code>PostToolBatch</code> 在 Agent 完成一组并行工具调用后触发。如果 hook 返回 exit 2，整个 agentic loop 停止——相当于在工具执行层面提供了熔断。第 4 章的 max-iterations 安全阀是编排循环的补充：hook 层解决&quot;什么时候继续&quot;，计数器层解决&quot;什么时候必须停&quot;。</p><p>对应 10.2 的<strong>编排循环</strong>和<strong>验证循环</strong>两个组件。</p><h3 id="10-3-2-工具系统：Agent-能调什么、怎么调"><a href="#10-3-2-工具系统：Agent-能调什么、怎么调" class="headerlink" title="10.3.2 工具系统：Agent 能调什么、怎么调"></a>10.3.2 工具系统：Agent 能调什么、怎么调</h3><p>Claude Code 的工具系统有两层控制。第一层是工具类型本身——Bash、Read、Write、Edit、Glob、Grep、WebFetch、WebSearch、Task 等——Claude Code 决定 Agent 能访问哪些工具。第二层是 hooks 对工具调用的拦截——<code>PreToolUse</code>、<code>PostToolUse</code>、<code>PostToolUseFailure</code> 三个事件覆盖了工具调用之前、成功之后、失败之后三个节点。</p><p><code>PreToolUse</code> 是整个工具系统中最关键的机制。它在 Agent 执行任何工具之前截住调用。匹配语法支持精确匹配和正则：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span> <span class="attr">&quot;matcher&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Bash&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;...&quot;</span> <span class="punctuation">&#125;</span>           <span class="comment">// 所有 Bash 命令</span></span><br><span class="line"><span class="punctuation">&#123;</span> <span class="attr">&quot;matcher&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Bash(git:*)&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;...&quot;</span> <span class="punctuation">&#125;</span>     <span class="comment">// 所有 git 命令</span></span><br><span class="line"><span class="punctuation">&#123;</span> <span class="attr">&quot;matcher&quot;</span><span class="punctuation">:</span> <span class="string">&quot;//Edit|Write//&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;...&quot;</span> <span class="punctuation">&#125;</span>   <span class="comment">// 所有文件修改</span></span><br></pre></td></tr></table></figure><p>Hook 脚本收到 stdin JSON（含 tool_name、tool_input、cwd、session_id）。exit 0 &#x3D; 放行。exit 2 &#x3D; 阻止。这个简单的 exit code 合约是 Harness 的控制边界——Agent 无法绕过，因为 hooks 在 Claude Code 运行时内执行，不在 Agent 的 prompt 上下文里。</p><p>第 5 章 gstack 的强制门控就是对 <code>PreToolUse</code> 的直接应用：匹配 <code>git commit</code> → 执行审查完整性检查 → 审查未通过返回 exit 2 → commit 被阻止。gstack 的三十余个 Skill 之所以能形成一条不可跳过的流水线，PreToolUse 是底层执行者。</p><p>五种 hook 实现方式覆盖不同场景：</p><table><thead><tr><th>类型</th><th>机制</th><th>典型用途</th></tr></thead><tbody><tr><td><strong>Command</strong></td><td>执行本地脚本，stdin 接收 JSON 上下文，stdout 返回决策</td><td>安全检查、门控脚本</td></tr><tr><td><strong>HTTP</strong></td><td>POST JSON 到远程服务</td><td>调用企业安全网关、审批服务</td></tr><tr><td><strong>MCP Tool</strong></td><td>调用 MCP 服务器的工具</td><td>集成已有的安全工具链</td></tr><tr><td><strong>Prompt</strong></td><td>用快速模型做单轮判断</td><td>&quot;这个命令安全吗？回答 yes&#x2F;no&quot;</td></tr><tr><td><strong>Agent</strong></td><td>启动子 Agent 做完整分析</td><td>复杂审查需要多步推理</td></tr></tbody></table><p>对应 10.2 的<strong>工具系统</strong>组件。</p><h3 id="10-3-3-安全护栏：什么绝对不能做"><a href="#10-3-3-安全护栏：什么绝对不能做" class="headerlink" title="10.3.3 安全护栏：什么绝对不能做"></a>10.3.3 安全护栏：什么绝对不能做</h3><p>Claude Code 的安全护栏由三层构成。最外层是权限模型，中间层是 Bash 沙箱，最内层是 hooks 的策略拦截。</p><p>权限模型提供三种模式：无权限控制（个人实验）、<code>defaultMode: &quot;ask&quot;</code>（日常交互，敏感操作弹窗）、精细化 Allow&#x2F;Deny（生产环境，白名单预定义）。规则语法 <code>Tool(specifier)</code>，匹配顺序 deny → ask → allow，先命中生效：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&quot;allow&quot;: [&quot;Bash(git *)&quot;, &quot;Bash(npm run *)&quot;]</span><br><span class="line">&quot;deny&quot;: [&quot;Bash(rm *)&quot;, &quot;Bash(sudo *)&quot;, &quot;Read(./.env)&quot;, &quot;Read(./secrets/**)&quot;]</span><br></pre></td></tr></table></figure><p>Bash 沙箱（v2.1+，macOS&#x2F;Linux&#x2F;WSL2）提供操作系统级隔离。<code>filesystem.denyWrite</code> 禁止写入指定路径，<code>network.allowedDomains</code> 限制出站域名，<code>network.allowLocalBinding</code> 控制本地端口绑定。沙箱可配置&quot;网络完全不可用&quot;——Agent 只能读写本地代码，不能联网。<code>failIfUnavailable: true</code> 时沙箱启动失败直接退出 Claude Code。</p><p>hooks 的策略拦截在权限模型和沙箱之上提供更灵活的控制。<code>PreToolUse</code> 匹配具体命令，通过五种方式执行任意检查逻辑，返回 exit 2 即可阻止。<code>PermissionRequest</code> hook 可以在权限弹窗出现的瞬间自动决定 allow&#x2F;deny——不需要人工点&quot;允许&quot;，对无人值守的 Agent 服务至关重要。</p><p>对应 10.2 的<strong>安全护栏</strong>和<strong>安全机制</strong>两个组件。</p><h3 id="10-3-4-上下文管理与-Prompt-构造：Agent-能看到什么"><a href="#10-3-4-上下文管理与-Prompt-构造：Agent-能看到什么" class="headerlink" title="10.3.4 上下文管理与 Prompt 构造：Agent 能看到什么"></a>10.3.4 上下文管理与 Prompt 构造：Agent 能看到什么</h3><p>Claude Code 的上下文注入通过 <code>SessionStart</code> hook 实现。会话启动时，hook 自动读取 CLAUDE.md、<code>.claude/rules/*.md</code>、项目级 settings.json 中定义的 env 变量，注入到 Agent 的系统上下文中。不需要每次手动贴项目背景。<code>InstructionsLoaded</code> hook 在每次 CLAUDE.md 或 rules 文件被加载时触发，提供可观测性。</p><p><code>PreCompact</code> hook 在上下文窗口即将满时触发。hook 可以阻止压缩（exit 2），或通过 <code>additionalContext</code> 在压缩前保存关键信息的摘要，确保压缩后 Agent 不丢失重要上下文。第 4 章 Ralph Loop 的长循环场景对此高度依赖——几十轮迭代后上下文窗口被代码变更和测试结果填满，没有 <code>PreCompact</code> 的保护，Agent 可能在压缩后忘记最初的任务目标。</p><p>对应 10.2 的<strong>上下文管理</strong>、<strong>Prompt 构造</strong>、<strong>记忆管理</strong>三个组件。</p><h3 id="10-3-5-配置管理与状态管理：四层继承"><a href="#10-3-5-配置管理与状态管理：四层继承" class="headerlink" title="10.3.5 配置管理与状态管理：四层继承"></a>10.3.5 配置管理与状态管理：四层继承</h3><p>Claude Code 的配置通过 <code>settings.json</code> 管理，四层继承（优先级从高到低）：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Managed    ← 企业 IT 强制推送（MDM plist/Windows 组策略），不可覆盖</span><br><span class="line">User       ← ~/.claude/settings.json，个人全局</span><br><span class="line">Project    ← .claude/settings.json，团队共享，提交到 Git</span><br><span class="line">Local      ← .claude/settings.local.json，本地覆盖，不提交</span><br></pre></td></tr></table></figure><p>权限规则跨层<strong>合并</strong>——逐层收紧，上层的 deny 不可被下层 override。其他设置跨层<strong>覆盖</strong>——高层优先。团队在 Project 层定义安全基线、注册 hooks、配置沙箱规则。个人在 Local 层只能追加限制。IT 在 Managed 层推送 <code>deny: [&quot;Bash(rm *)&quot;, &quot;Bash(sudo *)&quot;]</code>——所有项目、所有个人配置自动继承，无法绕过。</p><p>状态管理通过 YAML frontmatter 文件实现（如 Ralph Loop 的 <code>.claude/ralph-loop.local.md</code> 存储 iteration、max_iterations、completion_promise）和 hooks 的 <code>additionalContext</code> 机制——hook 可以将任意文本注入 Agent 的上下文，相当于&quot;跨会话的状态便签&quot;。</p><p>对应 10.2 的<strong>配置管理</strong>、<strong>状态管理</strong>两个组件。</p><h3 id="10-3-6-子-Agent-编排与错误处理"><a href="#10-3-6-子-Agent-编排与错误处理" class="headerlink" title="10.3.6 子 Agent 编排与错误处理"></a>10.3.6 子 Agent 编排与错误处理</h3><p><code>SubagentStart</code> 和 <code>SubagentStop</code> 事件让 hooks 能监控和控制子 Agent 的执行。<code>SubagentStop</code> 返回 exit 2 可以阻止子 Agent 退出——和 Stop hook 的核心逻辑一致。</p><p>错误处理通过 <code>PostToolUseFailure</code> 实现。工具调用失败后 hook 触发，可以注入上下文帮助 Agent 理解失败原因，或记录到审计日志。<code>StopFailure</code> 在 API 错误导致 turn 结束时触发——即使 Agent 什么都没做，Harness 也知道&quot;这一轮失败了&quot;。<code>Notification</code> hook 在 token 消耗等系统事件发生时发出告警。</p><p>对应 10.2 的<strong>子 Agent 编排</strong>、<strong>错误处理</strong>、<strong>输出解析</strong>三个组件。</p><h3 id="10-3-7-自动审查场景完整运转"><a href="#10-3-7-自动审查场景完整运转" class="headerlink" title="10.3.7 自动审查场景完整运转"></a>10.3.7 自动审查场景完整运转</h3><p>以上十二个组件合在一起，看一次 PR 自动审查 Agent 的完整运转：</p><p>Agent 启动 → SessionStart 加载项目 settings.json（权限白名单 + hooks 注册）→ 收到 PR 审查任务 → 调 <code>gh pr diff</code>（权限模型：<code>gh</code> 在白名单，放行）→ 调 Edit 修改代码建议（权限检查：目标路径在 <code>src/**</code> 内）→ 想执行 <code>npm test</code>（PreToolUse 判断安全，exit 0）→ 发现 SQL 注入漏洞，尝试修改 <code>.env</code> 文件修复（权限模型：<code>*.env</code> 在 deny 列表，拒绝）→ 转而生成修复建议 → 审查完成，准备 git commit → PreToolUse 匹配 git commit，跑审查完整性检查 → 所有维度都有结论 → exit 0，放行 → Agent 提交代码 → PostToolUse 记录审计日志。</p><p>十二个组件映射：编排循环（Stop&#x2F;PostToolBatch）→ 工具系统（PreToolUse + PostToolUse）→ 安全护栏 + 安全机制（权限模型 + 沙箱）→ 错误处理（PostToolUseFailure）→ 上下文管理 + Prompt 构造 + 记忆管理（SessionStart + CLAUDE.md）→ 配置管理（settings.json 四层继承）→ 状态管理（YAML frontmatter）→ 子 Agent 编排（SubagentStart&#x2F;Stop 可选）→ 验证循环（审查完整性检查脚本）。</p><p><img src="/images/image-20260531140808868.png"></p><p>一次运转，十二个组件同时工作。</p><h2 id="10-4-Codex-CLI：Rust-内核的安全优先设计"><a href="#10-4-Codex-CLI：Rust-内核的安全优先设计" class="headerlink" title="10.4 Codex CLI：Rust 内核的安全优先设计"></a>10.4 Codex CLI：Rust 内核的安全优先设计</h2><p>OpenAI 的 Codex CLI 在 Harness 设计上走了不同的路。96% Rust 代码——安全约束编译进二进制文件，而非通过外部脚本注入。</p><h3 id="10-4-1-编排循环：-goal-的生命周期管理"><a href="#10-4-1-编排循环：-goal-的生命周期管理" class="headerlink" title="10.4.1 编排循环：/goal 的生命周期管理"></a>10.4.1 编排循环：<code>/goal</code> 的生命周期管理</h3><p>Codex 的编排循环基于 Rust 运行时的自主循环控制——Agent 每轮完成工作后，由 Rust 侧判断是否继续。和 Claude Code 的 Stop Hook（运行时拦截 Agent 退出）不同，Codex 的编排逻辑在进程内闭环——不需要外部 hook 脚本判断&quot;该不该停&quot;，Rust 代码自己决定。<code>--max-turns</code> 限制单次会话的工具调用轮次上限。Codex 也支持目标恢复：会话中断后从上次状态继续，而不是从头开始。</p><p>2026 年 5 月 Codex 新增的 <code>/goal</code> 命令在这个编排循环之上加了一层&quot;声明式目标定义&quot;——本文第 8 章讨论过三个平台的 <code>/goal</code> 对比。但在 Codex 的早期版本（2025 年 4 月中就已存在）中，代码编排循环早已通过 Rust 运行时实现，<code>/goal</code> 是对已有编排循环的接口层封装。</p><p>对应 10.2：<strong>编排循环</strong> ★★（Rust 运行时循环，成熟但不可编程扩展）、<strong>验证循环</strong> ★★（Rust 侧任务完成判断 + <code>/goal</code> checkbox 对照，无外部 hook）。</p><h3 id="10-4-2-工具系统与安全护栏：三级沙箱-hooks"><a href="#10-4-2-工具系统与安全护栏：三级沙箱-hooks" class="headerlink" title="10.4.2 工具系统与安全护栏：三级沙箱 + hooks"></a>10.4.2 工具系统与安全护栏：三级沙箱 + hooks</h3><p>Codex 的沙箱通过 <code>--sandbox</code> 参数控制，支持三级模式：</p><ul><li><code>read-only</code>（默认）：Agent 可以读文件、搜索代码，不能写入或执行有副作用操作</li><li><code>workspace-write</code>：允许写入工作区</li><li><code>danger-full-access</code>：完全访问</li></ul><p>从 <code>--dangerously-bypass-approvals-and-sandbox</code> 和 <code>--dangerously-bypass-hook-trust</code> 两个标志的存在可以看出，Codex 有原生 hooks 机制和审批流程——和 Claude Code 的 PreToolUse &#x2F; PermissionRequest 是同类概念，但通过 <code>config.toml</code>（而非外部 JSON + bash 脚本）管理。沙箱和 hooks 都编译在 Rust 侧，不依赖外部脚本。</p><p>对应 10.2：<strong>工具系统</strong> ★★（编译时注册 + 原生 hooks，灵活性不如 Claude Code 的 PreToolUse + 五种 hook 类型）、<strong>安全护栏</strong> ★★★（三级沙箱 + hooks + 审批流程，默认只读，安全性最保守）、<strong>安全机制</strong> ★★（Rust 编译时保障 + 原生 hooks）。</p><p>和 Claude Code 对比：Claude Code 的权限是用户可编程的外挂策略（通过 hooks + settings.json），灵活性高但配置复杂度也高。Codex 的权限是编译进二进制文件的默认行为，修改成本高但安全性不依赖用户正确配置。</p><p>对应 10.2：<strong>工具系统</strong> ★★（编译时注册，无 PreToolUse hook）、<strong>安全护栏</strong> ★★★（默认只读沙箱，最简单且最安全）、<strong>安全机制</strong> ★★（Rust 编译时保障，无运行时沙箱配置）。</p><h3 id="10-4-3-错误处理：Rust-的类型系统作为-Harness"><a href="#10-4-3-错误处理：Rust-的类型系统作为-Harness" class="headerlink" title="10.4.3 错误处理：Rust 的类型系统作为 Harness"></a>10.4.3 错误处理：Rust 的类型系统作为 Harness</h3><p>Rust 编译而非解释执行——这是 Codex Harness 和 Claude Code Harness 最底层的差异。Claude Code 的 Harness 是 TypeScript&#x2F;Node.js 运行时 + bash hook 脚本的组合——灵活性高，但错误可能发生在 hook 脚本的 shell 层（<code>jq</code> 解析 JSON 失败、脚本找不到、PATH 没配好）。Codex 的 Harness 在编译期就排除了大量错误类别——所有权系统防止内存问题、<code>Result</code> 类型强制错误处理、没有运行时动态加载脚本的机制意味着没有&quot;hook 脚本挂了 Agent 继续跑&quot;的风险。</p><p>这个差异直接对应 10.2 的<strong>错误处理</strong>组件：Claude Code 的 hook 脚本出错时 Harness 需要处理 hook 自身的故障（脚本 crash → 非阻塞 error → Agent 继续）；Codex 没有这个层级——Rust 侧的工具调用失败直接通过 <code>Result</code> 传播，Agent 收到的失败信息是确定性的。</p><h3 id="10-4-4-十二组件对照：Codex-缺了什么"><a href="#10-4-4-十二组件对照：Codex-缺了什么" class="headerlink" title="10.4.4 十二组件对照：Codex 缺了什么"></a>10.4.4 十二组件对照：Codex 缺了什么</h3><p>对比 10.2 的十二个组件：</p><table><thead><tr><th>组件</th><th>Claude Code</th><th>Codex CLI</th><th>差异关键</th></tr></thead><tbody><tr><td>编排循环</td><td>★★★ hooks</td><td>★★ Rust 循环</td><td>可编程 vs 编译时</td></tr><tr><td>工具系统</td><td>★★★ PreToolUse</td><td>★★ 编译时注册</td><td>有 hook vs 无 hook</td></tr><tr><td>安全护栏</td><td>★★★ 权限+沙箱+hooks</td><td>★★★ 默认只读</td><td>可编程安全 vs 默认安全</td></tr><tr><td>错误恢复</td><td>★★★ PostToolUseFailure</td><td>★★★ Rust Result</td><td>脚本层 vs 类型系统</td></tr><tr><td>上下文管理</td><td>★★★ SessionStart</td><td>★★ 文件自动发现</td><td>hook 注入 vs 静态发现</td></tr><tr><td>Prompt 构造</td><td>★★★ 多层 CLAUDE.md</td><td>★ 系统 prompt 模板</td><td>可编程 vs 固定</td></tr><tr><td>输出解析</td><td>★★★ model + hook 提示</td><td>★ 模型原生</td><td>可注入提示 vs 依赖模型</td></tr><tr><td>状态管理</td><td>★★★ YAML + hooks</td><td>★★ 会话内存</td><td>文件持久化 vs 内存</td></tr><tr><td>可观测性</td><td>★★★ 审计日志</td><td>★★ Built-in</td><td>PostToolUse vs 内建统计</td></tr><tr><td>人工检查点</td><td>★★★ PermissionRequest</td><td>★★ CLI+hooks</td><td>hook 自动化 vs CLI&#x2F;hooks 混合</td></tr><tr><td>子 Agent 编排</td><td>★★★ Subagent hooks</td><td>★ 外部脚本</td><td>原生支持 vs bash 包装</td></tr><tr><td>配置管理</td><td>★★★ 四层继承</td><td>★★ CLI flags + 文件</td><td>settings.json vs CLI</td></tr></tbody></table><p>Codex 缺失的项目集中在 hooks 可编程性和多 Agent 编排上。它没有 PreToolUse hook——不能像 gstack 一样在 commit 前插审查检查。没有子 Agent hooks——多 Agent 协作靠外部脚本驱动（类似 autoresearch 的 bash 包装），而非 Harness 层原生编排。Codex 的设计哲学是：默认安全压倒可编程扩展。Claude Code 的设计哲学是：可编程的 Harness 压倒默认安全。</p><h2 id="10-5-其他-Agent-平台的-Harness"><a href="#10-5-其他-Agent-平台的-Harness" class="headerlink" title="10.5 其他 Agent 平台的 Harness"></a>10.5 其他 Agent 平台的 Harness</h2><h3 id="10-5-1-Pi-Coding-Agent：最小化终端编码-Harness"><a href="#10-5-1-Pi-Coding-Agent：最小化终端编码-Harness" class="headerlink" title="10.5.1 Pi Coding Agent：最小化终端编码 Harness"></a>10.5.1 Pi Coding Agent：最小化终端编码 Harness</h3><p>Pi（pi.dev）是一个 MIT 许可的终端编码 Agent。它对自己的定位是&quot;minimal terminal coding harness&quot;——核心刻意做小，通过 TypeScript 扩展系统增强。Pi 的包管理器 <code>pi packages</code> 可以分发和共享扩展、Skills、prompts 和主题。</p><p><strong>工具系统与扩展模型。</strong> Pi 没有 Claude Code 式的 PreToolUse hook。它的工具扩展点是 TypeScript 模块，开发者通过实现扩展接口注册新工具、slash 命令、事件处理器和自定义 TUI 组件。工具调用走 TypeScript 运行时，而非外部脚本拦截。</p><p><strong>安全护栏。</strong> Pi 的公开文档没有描述独立的权限模型或沙箱机制。安全依赖操作系统权限和容器隔离，而非 Agent 自身的 Harness 层。对比 Claude Code 的三层安全体系（权限模型 + Bash 沙箱 + hooks 策略拦截）和 Codex 的三级沙箱（read-only &#x2F; workspace-write &#x2F; danger-full-access），Pi 选择了零 Harness 安全层的路线。</p><p><strong>会话管理与状态持久化。</strong> Pi 用 JSONL 格式持久化会话文件，提供 SessionManager API 做会话管理、分支和树形导航。和 Claude Code 的 YAML frontmatter + hooks 状态管理相比更结构化（类型化 JSONL entries），但没有 hooks 的 <code>additionalContext</code> 跨会话注入机制。</p><p><strong>配置模型。</strong> 全局配置 + 项目级配置——和 Claude Code 的四层继承（Managed&#x2F;User&#x2F;Project&#x2F;Local）相比简化了两层，没有企业 IT 强制推送的 Managed 层。</p><p><strong>上下文管理。</strong> 支持上下文压缩和分支摘要——和 Claude Code 的 PreCompact hook 同类，但 Pi 的压缩逻辑是内建的，不可通过 hooks 定制。</p><p><strong>SDK 与可嵌入性。</strong> Pi 的一个独特优势是 SDK——可以嵌入 Node.js 应用，支持 stdin&#x2F;stdout JSONL 的 RPC 模式、JSON 事件流打印模式。Claude Code 有 Agent SDK 但面向多 Agent 编排；Pi 的 SDK 面向将 Agent 嵌入已有应用。</p><p><strong>十二组件对照：</strong></p><table><thead><tr><th>组件</th><th>Pi 实现</th><th>对比 Claude Code</th></tr></thead><tbody><tr><td>编排循环</td><td>交互式主循环</td><td>无 Stop Hook 机制</td></tr><tr><td>工具系统</td><td>TypeScript 扩展接口</td><td>无 PreToolUse 拦截</td></tr><tr><td>安全护栏</td><td>依赖 OS&#x2F;容器</td><td>无自有权限模型或沙箱</td></tr><tr><td>记忆管理</td><td>JSONL 会话文件</td><td>无 auto-memory 机制</td></tr><tr><td>上下文管理</td><td>内建压缩 + 分支摘要</td><td>无 PreCompact hook 定制</td></tr><tr><td>Prompt 构造</td><td>slash 命令展开 + 模板</td><td>无多层 CLAUDE.md</td></tr><tr><td>输出解析</td><td>JSONL 类型化条目</td><td>结构化但不通过 hooks</td></tr><tr><td>状态管理</td><td>SessionManager API</td><td>JSONL 类型化持久化</td></tr><tr><td>错误恢复</td><td>TypeScript 异常处理</td><td>无 PostToolUseFailure hook</td></tr><tr><td>人工检查点</td><td>CLI 确认提示</td><td>无 PermissionRequest hook</td></tr><tr><td>子 Agent 编排</td><td>Skill 按需调用</td><td>无 SubagentStart&#x2F;Stop hooks</td></tr><tr><td>配置管理</td><td>全局 + 项目两层</td><td>无 Managed 强制层</td></tr></tbody></table><p>Pi 代表了一条和 Claude Code 完全相反的设计路线：最小化核心，通过 TypeScript 扩展。对需要嵌入已有 Node.js 应用的场景、实验性项目和原型开发，Pi 的 SDK 和扩展模型有独特优势。对需要审计日志的合规场景、生产环境无人值守 Agent、多 Agent 安全编排——它的 Harness 厚度不够。</p><h3 id="10-5-2-DeepSeek-Harness-团队：追赶者的信号"><a href="#10-5-2-DeepSeek-Harness-团队：追赶者的信号" class="headerlink" title="10.5.2 DeepSeek Harness 团队：追赶者的信号"></a>10.5.2 DeepSeek Harness 团队：追赶者的信号</h3><p>2026 年 5 月 19 日，DeepSeek 资深研究员陈德里在小红书上发了一条招聘贴——内部正在组建全新的&quot;Harness&quot;（代码智能体工程）团队，目标直指 Claude Code。</p><p>DeepSeek 选择把 Harness 作为独立团队方向——和 Anthropic 的内部组织结构一致——这说明 Harness 已经从&quot;Claude Code 的附属工程&quot;变成了&quot;Agent 产品的核心基础设施&quot;。招聘要求中强调候选人需同时熟悉模型推理和系统工程。DeepSeek 目前的 Agent 产品形态尚未公开详细文档，Harness 设计方向有待观察。</p><h3 id="10-5-3-十二组件对照总表"><a href="#10-5-3-十二组件对照总表" class="headerlink" title="10.5.3 十二组件对照总表"></a>10.5.3 十二组件对照总表</h3><table><thead><tr><th>组件</th><th>Claude Code</th><th>Codex CLI</th><th>Pi (pi.dev)</th><th>DeepSeek</th><th>Cursor&#x2F;Copilot</th></tr></thead><tbody><tr><td>编排循环</td><td>★★★ hooks</td><td>★★ Rust 循环</td><td>★ 交互式</td><td>待公开</td><td>★★ 编辑器事件</td></tr><tr><td>工具系统</td><td>★★★ PreToolUse</td><td>★★ 编译+hooks</td><td>★ TS 扩展</td><td>待公开</td><td>★★ 扩展 API</td></tr><tr><td>安全护栏</td><td>★★★ 三层安全</td><td>★★★ 三级沙箱</td><td>★ 依赖 OS</td><td>待公开</td><td>★★ 默认扩展边界</td></tr><tr><td>错误恢复</td><td>★★★ PostToolUseFailure</td><td>★★★ Rust Result</td><td>★★ TS 异常</td><td>待公开</td><td>★★ 扩展崩溃恢复</td></tr><tr><td>上下文管理</td><td>★★★ SessionStart</td><td>★★ 文件发现</td><td>★★ 内建压缩</td><td>待公开</td><td>★★ 编辑器上下文</td></tr><tr><td>Prompt 构造</td><td>★★★ 多层 CLAUDE.md</td><td>★ 模板</td><td>★★ slash+模板</td><td>待公开</td><td>★★ 扩展注入</td></tr><tr><td>输出解析</td><td>★★★ model+hook</td><td>★ 模型原生</td><td>★★ JSONL 类型化</td><td>待公开</td><td>★ 扩展处理</td></tr><tr><td>状态管理</td><td>★★★ YAML+hooks</td><td>★★ 会话内存</td><td>★★ SessionManager</td><td>待公开</td><td>★★ 工作区状态</td></tr><tr><td>可观测性</td><td>★★★ 审计日志</td><td>★★ Built-in</td><td>★ 日志</td><td>待公开</td><td>★ 扩展诊断</td></tr><tr><td>人工检查点</td><td>★★★ PermissionRequest</td><td>★★ CLI+hooks</td><td>★ CLI 确认</td><td>待公开</td><td>★★ 编辑器对话框</td></tr><tr><td>子 Agent 编排</td><td>★★★ Subagent hooks</td><td>★ 外部脚本</td><td>★ Skill 调用</td><td>待公开</td><td>—</td></tr><tr><td>配置管理</td><td>★★★ 四层继承</td><td>★★ CLI+toml</td><td>★★ 全局+项目</td><td>待公开</td><td>★ 扩展设置 JSON</td></tr></tbody></table><h2 id="10-6-五个通用模式"><a href="#10-6-五个通用模式" class="headerlink" title="10.6 五个通用模式"></a>10.6 五个通用模式</h2><p>前三节逐平台拆解了 Claude Code、Codex、Pi 的 Harness 设计。虽然它们的实现路线各不相同——外挂 hooks vs 编译时约束 vs TypeScript 扩展——但反复出现的几个设计模式越来越清晰。本节把这些跨平台的共性抽象出来。</p><p><strong>阶段门模式。</strong> 在关键操作前设置检查点。Claude Code 通过 PreToolUse hook 实现——gstack 的 git commit 门控、Ralph Loop 的 Stop 门控都是实例。Codex 通过原生 hooks + Rust 侧循环检测实现类似效果。Pi 没有原生阶段门机制。</p><p><strong>审计日志模式。</strong> 所有工具调用记录：时间、操作、输入、输出。Claude Code 的 PostToolUse hook 自动生成完整审计轨迹。Codex 的 Built-in 统计功能提供简化版。企业合规场景里，审计日志就是&quot;Agent 做了什么&quot;的唯一可追溯证据。</p><p><strong>上下文注入模式。</strong> Agent 启动时自动加载项目背景。Claude Code 的 SessionStart hook + CLAUDE.md。Codex 的系统 prompt 拼接 + 文件自动发现。第 2 章的 CONTEXT.md 和第 8 章的 program.md 都依赖这个机制。</p><p><strong>熔断器模式。</strong> 连续失败 N 次 → 强制退出。第 4 章 Ralph Loop 的 max-iterations。第 7 章 autoresearch 的 MAX_CONSECUTIVE_FAILURES。熔断器不依赖 Agent 自我判断——系统层面计数器到了就停。</p><p><strong>生成器-评估器模式。</strong> 一个 Agent 生成，另一个独立评估。第 7 章 autoresearch 的三个 Agent 交叉审查是这个模式的工程实现。Claude Code 的子 Agent 机制通过 SubagentStart&#x2F;Stop hooks 原生支持。Pi 目前不支持——单 Agent 架构。</p><h2 id="10-7-可观测性：AgentOps-与-DevOps-的共生"><a href="#10-7-可观测性：AgentOps-与-DevOps-的共生" class="headerlink" title="10.7 可观测性：AgentOps 与 DevOps 的共生"></a>10.7 可观测性：AgentOps 与 DevOps 的共生</h2><p>生产环境跑 Agent，传统 DevOps 监控（CPU、内存、网络）不够。Agent 可能在十分钟内静默消耗几十万 token，调了 47 次 Bash 执行同一探测命令。服务没挂，API 账单在安静膨胀。</p><p>AgentOps 补齐的维度：工具调用频率（每分钟多少次、什么类型）、token 消耗曲线（突发还是平稳）、Skill 激活链路（哪个 Skill 被触发、触发了什么子操作）、Hook 执行耗时（PreToolUse 脚本跑了多久、有没有超时）、错误率与重试（哪些调用频繁失败、Agent 怎么应对）、会话时长与完成率（正常完成 vs 死循环）。</p><p>两套监控并排——DevOps 告诉系统状态，AgentOps 告诉 Agent 行为——才能在&quot;服务没挂但 budget 炸了&quot;时定位根因。Claude Code 通过 PostToolUse hook 和 Notification hook 已有较完整的 AgentOps 基础。其余平台目前主要靠外部工具（LangSmith、Weave 等）补充 AgentOps 能力。</p><h2 id="10-8-如何应用：构建-Agent-时的-Harness-决策清单"><a href="#10-8-如何应用：构建-Agent-时的-Harness-决策清单" class="headerlink" title="10.8 如何应用：构建 Agent 时的 Harness 决策清单"></a>10.8 如何应用：构建 Agent 时的 Harness 决策清单</h2><p>写第一行 Agent 代码之前，把 10.2 的十二个维度逐个过一遍。</p><p><strong>编排循环</strong>——Agent 跑起来之后谁告诉它停？只用 max-turns 计数器吗，还是你也要像 Ralph Loop 一样加验证循环？</p><p><strong>工具系统</strong>——Agent 能调哪些工具？有没有 PreToolUse 式的拦截点，还是硬编码在代码里？</p><p><strong>安全护栏</strong>——Agent 的默认权限有多宽？至少需要一个工具白名单，别从&quot;什么都能做&quot;开始。</p><p><strong>记忆管理</strong>——跨会话的状态存在哪？会话崩溃后 Agent 从零开始，还是从上个 checkpoint 继续？</p><p><strong>上下文管理</strong>——Agent 能看到什么？会话启动时自动注入项目背景，还是每次手动贴？</p><p><strong>Prompt 构造</strong>——系统指令怎么维护？写在代码里的魔字符串、还是像 CLAUDE.md 一样可独立编辑的配置文件？</p><p><strong>输出解析</strong>——模型返回的东西怎么变成行动？JSON 解析崩了怎么办，有没有 fallback？</p><p><strong>状态管理</strong>——迭代轮次、任务完成状态、子任务进度存在哪？内存里的字典够不够，还是需要文件持久化？</p><p><strong>错误处理</strong>——工具调用失败了 Agent 怎么应对？重试几次？连续失败 N 次后熔断？</p><p><strong>验证循环</strong>——Agent 怎么判断&quot;做完了&quot;？靠自己的判断，还是外部验证脚本？验收标准可自动化测试吗？</p><p><strong>子 Agent 编排</strong>——需要多个 Agent 协作吗？如果需要，它们之间的权限怎么隔离？</p><p><strong>安全机制</strong>——有没有沙箱？文件系统写入受控吗？网络出站有限制吗？</p><p>这十二个维度不需要都有满分答案。但每个维度你选择&quot;不做&quot;时，应该知道自己承担了什么风险。十二个组件不是目标，是决策清单。理解每个选择的安全后果之后，再决定什么时候加、什么时候先跳过。</p><h3 id="10-8-1-第一步：选编排模型"><a href="#10-8-1-第一步：选编排模型" class="headerlink" title="10.8.1 第一步：选编排模型"></a>10.8.1 第一步：选编排模型</h3><p>Agent 跑起来之后，谁告诉它什么时候停？</p><ul><li><strong>简单任务用计数器。</strong> 最大轮次上限是最原始的熔断器，但也是最可靠的。Ralph Loop 的 max-iterations 之所以能跑通，不是因为上限值设得准，是因为它不需要准——只是防止 Agent 永远跑下去。任何 Agent 都应该有一个 max-turns。</li><li><strong>复杂任务用验证循环。</strong> 如果你的 Agent 需要自主判断&quot;做完了&quot;，第一时间不要信任 Agent 的自我判断。Ralph Loop 的 completion promise 模式——&quot;Agent 声明完成 → Harness 拦截 → 验证 → 通过才放行&quot;——比&quot;Agent 说做完了就退出&quot;要安全得多。Claude Code 的 Stop Hook 是现成方案。Codex 在 <code>/goal</code> 中也有类似的 checkbox 对照。如果你在裸写 Agent 循环，至少加一层 post-completion 验证：Agent 声称完成之后，由另一个 Agent 或确定性脚本确认验收标准确实满足。</li><li><strong>长任务用中断恢复。</strong> 持续数小时的自主任务随时可能被 API 错误或网络抖动打断。autoresearch 的 <code>-c</code> 标志（从上次迭代继续）、Codex 的 <code>resume</code> 命令——状态持久化不是加分项，是必备项。每次迭代结束时保存状态（完成了哪些子任务、还剩哪些、当前迭代轮次），崩溃后可以从断点恢复而非从头开始。</li></ul><h3 id="10-8-2-第二步：定安全基线和人机检查点"><a href="#10-8-2-第二步：定安全基线和人机检查点" class="headerlink" title="10.8.2 第二步：定安全基线和人机检查点"></a>10.8.2 第二步：定安全基线和人机检查点</h3><p>Harness 安全有两条原则：默认最小权限，关键节点必须有人确认。</p><p><strong>默认最小权限。</strong> 给 Agent 它完成任务所需的最少权限，而不是&quot;所有它能做的事&quot;。Codex 的三级沙箱（read-only &#x2F; workspace-write &#x2F; danger-full-access）是这个理念的极端体现——默认只读，需要写入时显式升级。Claude Code 的 Allow&#x2F;Deny 列表是这个理念的可编程版——<code>allow: [&quot;Bash(git *)&quot;, &quot;Bash(npm run *)&quot;]</code>，其余拒绝或弹窗确认。如果你在裸写 Agent，至少实现一个工具白名单——Agent 能调哪些工具、每个工具能接受什么参数范围。别从&quot;全部允许&quot;开始，从&quot;只允许你确认过的几个&quot;开始。</p><p><strong>关键节点设人工检查点。</strong> 全自动不等于没人看。gstack 的强制门控给出的启发是：不是所有步骤都需要人确认，但以下节点几乎总是需要：</p><ul><li>执行破坏性操作前（<code>rm</code>、<code>drop table</code>、<code>DELETE FROM</code>）</li><li>向外部服务推送前（<code>git push</code>、API deploy、数据库写）</li><li>修改安全敏感文件前（<code>.env</code>、密钥文件、权限配置）</li></ul><p>Claude Code 的 PreToolUse + PermissionRequest hook 可以自动化这些检查点。Codex 的 <code>--dangerously-bypass-approvals-and-sandbox</code> 的存在本身就说明：正常情况下，这些操作应该有审批。如果你的 Agent 没有 hook 机制，至少在代码里硬编码这些检查点。</p><h3 id="10-8-3-第三步：决定可观测性策略"><a href="#10-8-3-第三步：决定可观测性策略" class="headerlink" title="10.8.3 第三步：决定可观测性策略"></a>10.8.3 第三步：决定可观测性策略</h3><p>Agent 出问题了，你怎么知道？怎么回溯？</p><p><strong>至少记录全部工具调用。</strong> Claude Code 的 PostToolUse hook 自动生成审计日志——时间、工具名、输入、输出。即使你没有 hook 系统，也应在每个工具调用之前和之后打印日志行：<code>[timestamp] AGENT_TOOL: Bash(&quot;npm test&quot;) → exit 0</code>。几行日志比事后靠回忆排查强。</p><p><strong>Token 消耗单独监控。</strong> Agent 最常见的问题不是崩溃，而是静默烧预算。一个陷入低效循环的 Agent 可能在几小时内消耗百万 token 而不触发任何错误。把每次 LLM 调用的 token 数记录到单独的指标里，设置预算告警。这不是事后优化——第一天就该有。</p><p><strong>正常行为建立基线。</strong> 生产环境跑了两周的审查 Agent，平均每次审查用 12 轮工具调用、每轮约 3000 token。某天突然变成 47 轮——不是功能坏了，是 Agent 在处理一个新类型的问题时反复探测。有了基线，你才能区分&quot;正常波动&quot;和&quot;需要看的异常&quot;。没有基线，一切都是事后猜测。</p><h3 id="10-8-4-第四步：选择平台"><a href="#10-8-4-第四步：选择平台" class="headerlink" title="10.8.4 第四步：选择平台"></a>10.8.4 第四步：选择平台</h3><p>不是所有 Agent 都需要从零搭 Harness。现有平台已经覆盖了不同场景的 80% 需求：</p><ul><li><strong>企业合规 → Claude Code。</strong> 审计日志（PostToolUse）+ 企业 IT 强制推送（Managed settings）+ 四层配置继承 + Bash 沙箱。需要合规留痕的 Agent 产品直接跑在 Claude Code 上，不用重造权限系统。</li><li><strong>安全敏感 → Codex。</strong> 默认只读沙箱 + Rust 编译时安全约束。Agent 面向外部用户、可能处理不受信的输入时，Codex 的三级沙箱比 prompt 里写&quot;请勿&quot;管用。</li><li><strong>可嵌入 SDK → Pi。</strong> 需要把 Agent 嵌进已有 Node.js 应用——Pi 的 SDK + JSONL 会话持久化 + TypeScript 扩展系统是天然适配。</li><li><strong>快速原型 → 最小化 Harness。</strong> 验证一个 Agent 想法时，不要先搭十二个组件。先用 Claude Code 或 Codex 的现有 Harness 跑通流程。确认 Agent 有价值之后，再考虑是否需要更完整的 Harness。</li></ul><p>一个常见的误区：上来就搭完整的 Harness，Agent 本身还没验证清楚。十二个组件是目标，不是起点。先跑通 Agent 的核心循环（编排 + 工具系统），再逐层加安全护栏和可观测性。</p><h2 id="10-9-与前后章节的关系"><a href="#10-9-与前后章节的关系" class="headerlink" title="10.9 与前后章节的关系"></a>10.9 与前后章节的关系</h2><p>与第 2 章 Skills：Skill 是 Harness 之上的一层抽象——加载、匹配、权限继承都依赖 Harness 的运行时。Pocock 的&quot;一个 Markdown 文件定义一种行为&quot;能被 Claude Code 执行，是 Harness 在背后做 Skill 发现和加载。</p><p>与第 4 章 Ralph Loop：自主循环是 Harness 验证循环组件的最佳范例——Stop Hook + PreToolUse hook + completion promise 匹配 &#x3D; 一个完整的控制结构。</p><p>与第 5 章 gstack：强制性阶段门控直接运行在 PreToolUse hooks 之上。没 hooks，gstack 的流程门控从&quot;系统强制&quot;降级为&quot;引导指令&quot;。gstack 和 Harness 是应用和 OS 的关系。</p><p>与第 7 章 autoresearch：多 Agent 轮转是生成器-评估器模式 + 多 Agent 编排的工程实现。外部 bash 脚本调多个 Agent 交叉审查——Harness 的 hook 机制让这可以安全地进行。</p><h2 id="10-9-本章小结"><a href="#10-9-本章小结" class="headerlink" title="10.9 本章小结"></a>10.9 本章小结</h2><p>Harness Engineering 不是通用方法论——写 Agent 产品时才需要它。但它贯穿全书——第 4 章的熔断器、第 5 章的强制门控、第 7 章的多 Agent 交叉审查——全部依赖 Harness 提供的底层机制。</p><p>不同 Agent 平台选择了不同的 Harness 设计。Claude Code 选可编程性——31 个生命周期事件、5 种 hook 类型、4 层配置继承、bash 沙箱，通过外挂 hooks 和 JSON 配置实现最大的灵活性。Codex 选安全优先——Rust 编译时安全约束、三级沙箱（read-only &#x2F; workspace-write &#x2F; danger-full-access）、原生 hooks。Pi 选最小化可嵌入路线——TypeScript 扩展系统、JSONL 会话持久化、SDK 支持嵌入 Node.js 应用。DeepSeek 正在组建专门的 Harness 团队，方向有待公开。</p><p>十二个组件对照每个平台的特点不同。编排循环靠 hooks vs 原生循环控制。工具系统靠运行时拦截 vs 编译时注册。安全护栏靠三层组合 vs 默认只读。理解每个平台的设计选择，就能预判它适合什么场景——企业合规选 Claude Code，安全敏感环境选 Codex，快速原型选 Pi。</p><p>Harness 的出发点是踩过很多坑后的一条认知：模型不可预测，所以系统必须可预测。靠 prompt 里的&quot;请勿&quot;不顶用——靠 hooks 的 exit 2 blocking error。把不可预测的组件嵌在一个可预测的框架里——这是 Harness Engineering 的全部。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/harness-engineering-ai-agent-practice/</id>
    <link href="https://colobu.com/2026/06/28/harness-engineering-ai-agent-practice/"/>
    <published>2026-06-28T04:30:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>&quot;The decisive result came not from the model alone, but from the harness around it.&quot;<br>决定成败的不仅是模型本身，更是其配套的外围系统。</p>
<p>——Anthropic Harness Engineering Team</p>
</blockquote>
<p>Skill 封装能力。Spec 写规格。Ralph Loop 自己跑到对。gstack 用角色覆盖质量。Goal Workflow 串成七步流水线。autoresearch 全自动从 Issue 到合入。</p>
<p>这些方法论都在 Claude Code 之上运行。但 Claude Code 自己怎么造出来的？它调工具、读文件、写代码、执行 Bash——每一步都可能出错、可能越权、可能陷入死循环。谁在管这些？</p>
<p><strong>Harness Engineering</strong> 回答的就是这个问题。不是&quot;怎么用 Agent&quot;，是&quot;怎么造 Agent&quot;。本章拆开 Claude Code 的引擎盖，看它的 hooks、settings.json、权限模型、沙箱、可观测性怎么拼在一起，把一个大语言模型变成可安全交付的产品。</p>]]>
    </summary>
    <title>Harness Engineering：AI Agent 的工程实践</title>
    <updated>2026-06-28T06:46:22.011Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="研发流程" scheme="https://colobu.com/tags/%E7%A0%94%E5%8F%91%E6%B5%81%E7%A8%8B/"/>
    <category term="方法论" scheme="https://colobu.com/tags/%E6%96%B9%E6%B3%95%E8%AE%BA/"/>
    <content>
      <![CDATA[<blockquote><p>&quot;小孩子才做选择题，成年人当然全都要&quot;</p><p>——网络梗</p></blockquote><p>前八章覆盖了七条路线。</p><p>Pocock Skills 拆能力。OpenSpec 写规格。Ralph Loop 自己循环到对。gstack 用角色覆盖质量。superpowers 让 Agent 替你选工具。autoresearch 一口气自动到合入。Goal Workflow 串成七步，每步等你说过。</p><p>每条路都能走通。真实项目从来不只走一条。Ralph Loop 做实现，谁来审查？gstack 走流程，需求从哪来？autoresearch 全自动跑，Issue 谁拆的？</p><p>贪吃蛇案例已经验证了这一点。第 5 章 gstack 走了七个 Sprint 阶段，手工推着走，约两小时。第 6 章 superpowers 后台监听关键词，你答了五个设计问题，约五分钟。第 7 章 autoresearch 你写了一个 Issue，约三分钟，然后等结果。第 8 章 Goal Workflow 每步确认一下，从 PRD 到上线，约八分钟。</p><p>同一个贪吃蛇，同一个产出，四种交互模式。</p><p>本章把七条路摊开，看它们怎么拼。</p><span id="more"></span><h2 id="9-1-一张表看完七种方法论"><a href="#9-1-一张表看完七种方法论" class="headerlink" title="9.1 一张表看完七种方法论"></a>9.1 一张表看完七种方法论</h2><table><thead><tr><th></th><th>Pocock Skills</th><th>OpenSpec</th><th>Ralph Loop</th><th>gstack</th><th>superpowers</th><th>autoresearch</th><th>Goal Workflow</th></tr></thead><tbody><tr><td><strong>核心机制</strong></td><td>原子 Skill</td><td>变更提案</td><td>自主循环</td><td>角色审查</td><td>自动触发</td><td>多 Agent 评审</td><td>串行流水线</td></tr><tr><td><strong>覆盖范围</strong></td><td>单任务</td><td>需求→代码</td><td>实现</td><td>需求→交付</td><td>设计→代码</td><td>Issue→合入</td><td>PRD→上线</td></tr><tr><td><strong>人类参与</strong></td><td>每次调用</td><td>提案+审核</td><td>设 prompt</td><td>每阶段确认</td><td>设设计问题</td><td>写 Issue</td><td>每步确认</td></tr><tr><td><strong>控制粒度</strong></td><td>细</td><td>中</td><td>粗</td><td>粗</td><td>细</td><td>无</td><td>中</td></tr><tr><td><strong>自动化程度</strong></td><td>低</td><td>中</td><td>高</td><td>中</td><td>中高</td><td>极高</td><td>中高</td></tr><tr><td><strong>模型依赖</strong></td><td>无</td><td>无</td><td>无</td><td>无</td><td>无</td><td>依赖多模型</td><td>无</td></tr><tr><td><strong>中文适配</strong></td><td>无</td><td>spec-kit-zh</td><td>无</td><td>无</td><td>superpowers-zh</td><td>无</td><td>iCafe 支持</td></tr><tr><td><strong>安装复杂度</strong></td><td>低</td><td>中</td><td>中</td><td>低</td><td>低</td><td>中</td><td>低</td></tr><tr><td><strong>最佳场景</strong></td><td>单点任务</td><td>有规格意识</td><td>放手式实现</td><td>从零到一</td><td>中等功能</td><td>Issue 明确</td><td>完整控制</td></tr></tbody></table><p>扫完这张表，几条规律浮现出来。往右，覆盖范围变大。往下，控制变粗。</p><p>也有反直觉的数据点。autoresearch 自动化程度最高，覆盖不如 Goal Workflow——它从 Issue 起步，不管需求和拆解。Goal Workflow 从 PRD 覆盖到上线，但每步都等人。自动化和覆盖不是正相关：覆盖看流程设计，自动化看控制权分配。</p><p>还有一个数据点。Pocock Skills 和 superpowers 都是&quot;原子 Skill&quot;，但 superpowers 自动化更高。区别不在 Skill 定义，在触发机制。Pocock Skills 等开发者主动调用——测试写完了吗？跑一下 lint 吧。superpowers 后台监听关键词，干活时自动激活。同样的东西，加个触发机制就改变了交互节奏。第 6 章里 superpowers 自动跑 lint 和 test 的那一刻，开发者甚至没意识到它在工作，直到它报错。</p><p>再看安装复杂度那一行。最低的三个——Pocock Skills、superpowers、Goal Workflow——覆盖了完全不同的三种场景：单点任务、中等功能、完整控制。安装成本和方法论的野心不成正比。</p><p>控制粒度那一行，Pocock 和 superpowers 都是&quot;细&quot;粒度，一个手动一个自动。gstack 和 Ralph Loop 都是&quot;粗&quot;粒度，一个靠角色驱动，一个靠循环收敛。细粒度让开发者捏住每一步，粗粒度让开发者只看结果。</p><h2 id="9-2-它们在回答同一个问题"><a href="#9-2-它们在回答同一个问题" class="headerlink" title="9.2 它们在回答同一个问题"></a>9.2 它们在回答同一个问题</h2><p>把七条路的设计摊在一起，你会发现它们都在回答：</p><p><strong>AI 能写代码了。人干什么？</strong></p><p>答案不是七个。是一条光谱，从左到右，人介入越来越少。</p><p><img src="/images/image-20260531043146883.png"></p><p>► Pocock Skills 在最左端。人做每一步。</p><p>每个 Skill 是一个场景的 SOP，你封装最佳实践成指令，AI 执行。要测试了，调 test skill。要提交了，调 git skill。要重构了，调 refactor skill。什么时候用什么，你判断。</p><p>第 2 章里 Pocock 在直播中演示过用 test skill 自动生成测试。代码写完，一个命令，测试就出来了。AI 不会漏边界条件。</p><hr><p>► 往右一步，人不再做每一步，只在关键节点把关。</p><p>OpenSpec 和 Goal Workflow 都在这个位置。都要求人在决策节点介入，中间的执行自动完成。</p><p>OpenSpec 让你在代码之前写规格。先定义&quot;对长什么样&quot;，再让 AI 实现。propose 阶段审核提案，apply 阶段 AI 执行，archive 阶段确认归档。三张牌 proposal.md、tasks.md、design.md 管住了一个变更的完整生命周期。第 3 章的 SDD 理念是它的理论基础：规格是人机之间的合约，合约签好了，执行可以放手。</p><p>Goal Workflow 让你在七个流水线步骤之间把关。&#x2F;prd 产出的需求你确认了，才进 &#x2F;to-issues。&#x2F;to-issues 拆出的 Issue 你审核了，才进 &#x2F;goal。&#x2F;review-it 发现的问题你决定修不修，&#x2F;ship-it 你敲了才合。第 8 章里 smallnest 从 autoresearch 转向 Goal Workflow 的原因就是这个，全自动让他不安。&quot;一觉醒来一排 merged&quot;，代码已经在主干上了，PRD 写偏了也没机会纠正。</p><p>两者信的是同一件事：在决策点介入比在执行中参与更高效。不是在 Agent 写代码时指手画脚，而是开始写之前说清楚&quot;对是什么&quot;，写完以后确认&quot;确实是对的&quot;。</p><hr><p>► 再往后一步。人不直接管执行了，转去定义角色和规则，让 Agent 互相审查。</p><p>gstack 的代表作是二十三个虚拟角色。产品经理、架构师、安全专家、性能工程师、数据库管理员，各有各的审查维度。&quot;你是一个有十五年经验的员工工程师，审查这份代码的安全问题&quot;和&quot;review this code for security&quot;的区别，第 5 章实测过。前者能发现上下文相关的逻辑漏洞，后者只能看到 SQL 注入。角色不是噱头，是审查深度。</p><p>superpowers 走另一条路。十四个 Skill 覆盖十四个场景，你不需要判断&quot;现在该用哪个工具&quot;，Agent 自己听关键词触发。但它不止于自动触发。第 6 章的 brainstorming 是它最独特的东西，Agent 反问设计问题，每次一个，逐步逼近方案。和 <code>/prd</code> 一次甩五个带选项的问题完全不同。前者适合探索，后者适合目标明确的功能开发。</p><p>gstack 和 superpowers 各有一个盲区。gstack 需要你手动驱动每个阶段，&quot;现在进入 Think 阶段&quot;&quot;现在进入 Explore 阶段&quot;。superpowers 自动触发但止步于开发分支，不管你 PR 合不合、Issue 关不关。它们覆盖了流程中不同的空缺。</p><hr><p>► 快到尽头了。人连规则都不设了，只给一句验收标准。</p><p>Ralph Loop 是这个位置的代表。核心机制简单到一句话：设一个 completion promise，Agent 自己循环实现、测试、修复，直到 promise 匹配或达到循环上限。第 4 章的 <code>test-then-commit</code>，&quot;当所有测试通过且没有 lint 错误时，提交代码&quot;。</p><p>和 <code>/goal</code> 比，Ralph Loop 更轻。不需要 Issue，不需要 checkbox 列表，一句验收标准就够。&quot;确认路径已更新，服务正常&quot;，Ralph Loop 能搞定。但复杂任务需要结构化验收时，<code>/goal</code> 的逐条 checkbox 对照更靠谱。两者互补。小任务一句话闭环，大任务逐条验收。</p><hr><p>► 光谱最右端。人只管两头，中间全自动。</p><p>autoresearch 在这个位置。写清楚 Issue 和验收条件，走人。脚本驱动五个 Agent 交替实现和审查，评分够了自动合入。第 7 章的实战数据，四个 Issue 的贪吃蛇变体在十几分钟内全部合入。</p><p>但它有一个被忽略的前提：Issue 必须写对。五个 Agent 能交叉审查代码质量、安全、性能，不质疑 Issue 本身。你写&quot;实现一个登录功能&quot;，Agent 就实现登录。但登录要不要二次验证？要不要 OAuth？要不要记住我？这些不在审查范围里。</p><p>smallnest 后来做 Goal Workflow，部分原因就是这个。他发现写 Issue 时已经需要想清楚架构了，Issue 质量决定了 autoresearch 的产出。与其把思考压缩成一份 Issue，不如把思考过程展开。PRD 管需求，SPEC 管技术，Issue 管实现，每一步可回溯。</p><hr><p>► 光谱不是好坏表。是舒服区。</p><p>没人应该永远待在一个位置。一个项目里，核心模块走 Goal Workflow 全流程，PRD → SPEC → Issue → &#x2F;goal → &#x2F;review-it → &#x2F;ship-it。辅助脚本丢给 Ralph Loop，一句&quot;测试全过就行&quot;。文档更新用 autoresearch，写完 Issue 就不用管了。日常编码靠 superpowers 在后台干活。</p><p>第 8 章 smallnest 讲过，选哪个，取决于你对自己&quot;能一次写清楚到什么程度&quot;和&quot;愿意参与多少步骤&quot;的诚实判断。不是方法论之间的选择，是你对自己工作方式的理解。</p><h2 id="9-3-它们怎么拼"><a href="#9-3-它们怎么拼" class="headerlink" title="9.3 它们怎么拼"></a>9.3 它们怎么拼</h2><h3 id="9-3-1-规格层：OpenSpec-Goal-Workflow"><a href="#9-3-1-规格层：OpenSpec-Goal-Workflow" class="headerlink" title="9.3.1 规格层：OpenSpec + Goal Workflow"></a>9.3.1 规格层：OpenSpec + Goal Workflow</h3><p>OpenSpec 管变更级，每个 PR 一个 proposal，包含改什么、为什么、怎么验证。Goal Workflow 管项目级，PRD 管需求，SPEC 管技术方案，Issue 管实现单元。一个微观，一个宏观。</p><p>拿支付模块举例。Goal Workflow 的 <code>/prd</code> 产出整体需求：用户下单、微信支付、退款、账单。<code>/prd-to-spec</code> 产出技术方案：支付接口设计、数据库 schema、错误处理策略。<code>/to-issues</code> 拆成十个 Issue。每个 Issue 内部，如果用 OpenSpec 管变更，比如 Issue #3 &quot;接入微信支付 API&quot;涉及三个文件，propose 阶段写一份 proposal.md 说清楚改什么，apply 阶段 AI 执行，archive 阶段归档。</p><p>Goal Workflow 的 SPEC 有 Issue 映射表，OpenSpec 的 proposal 有 tasks.md。两层规格首尾相接。SPEC 告诉你这个大功能有哪些小块，proposal 告诉你这个小块怎么改。</p><h3 id="9-3-2-实现层：Ralph-Loop-goal"><a href="#9-3-2-实现层：Ralph-Loop-goal" class="headerlink" title="9.3.2 实现层：Ralph Loop + &#x2F;goal"></a>9.3.2 实现层：Ralph Loop + &#x2F;goal</h3><p>Ralph Loop 适合一句话能说清的任务，设个 completion promise，Agent 自己跑到满足。<code>/goal</code> 适合 checkbox 列表的任务，逐条对照验收。</p><p>真实项目里两种都有。还是支付模块。Issue #7 &quot;写一个生成订单号的工具函数&quot;，验收标准就一条：返回 32 位不重复字符串，带时间戳前缀。丢给 Ralph Loop，completion promise 写&quot;函数通过单元测试&quot;。Agent 写好、跑测试、通过、提交。全过程你没看。</p><p>Issue #3 &quot;接入微信支付 API&quot;不一样。验收标准有七条：统一下单、支付回调验签、超时关单、退款接口、异常重试策略、日志记录、幂等处理。用 <code>/goal</code>，Agent 逐条实现，你逐条看到 checkbox 勾上。</p><h3 id="9-3-3-审查层：gstack-review-it"><a href="#9-3-3-审查层：gstack-review-it" class="headerlink" title="9.3.3 审查层：gstack + &#x2F;review-it"></a>9.3.3 审查层：gstack + &#x2F;review-it</h3><p>gstack 用二十三个角色看一个变更，看得深。<code>/review-it</code> 用四个维度看一个变更，看得快。</p><p>大版本发布前跑 gstack 全维度。支付模块上线前，安全专家的角色发现退款回调的签名验证没有防重放攻击。这个漏洞 <code>/review-it</code> 的静态检查抓不到，它不是代码质量或常见安全问题，是业务逻辑的设计缺陷。&quot;你是一个有十五年经验的支付安全专家&quot;，这个 prompt 让 Agent 想了它本来不会想的事。</p><p>日常开发用 <code>/review-it</code> 做增量。改了个配置文件，三秒扫完四个维度，没有 actionable findings，直接 <code>/ship-it</code>。为这个跑二十三角色全维度不值得。</p><p>第 5 章里 gstack 强调过：角色的价值不在数量，在视角。二十三个角色就是二十三个视角。<code>/review-it</code> 的价值在速度，一个命令覆盖四个维度，不用手动指定审查角色。</p><p>支付模块十个 Issue。Issue #1 &quot;数据库表结构&quot;、Issue #10 &quot;生成 API 文档&quot;、Issue #8 &quot;单元测试补充&quot;，独立性强，出错了也不影响核心流程，丢进 autoresearch。你写完 Issue 去开会，回来三个 PR 已经合入。</p><p>Issue #3 &quot;接入微信支付 API&quot;、Issue #4 &quot;退款流程&quot;，核心交易链路，用 <code>/goal</code> 手动逐个来。每步写完看一眼，确认支付回调的签名逻辑对了，退款的状态机没有漏洞。</p><p>这个组合能成立，是因为 <code>/to-issues</code> 产出的 Issue 格式同时兼容两条路。同一个 Issue 文件，丢给 <code>/goal</code> 就是手动单步，丢给 autoresearch 就是全自动。不是两套流程，是一套输入两个出口。</p><p>什么时候走哪个出口，判断标准也简单。这个 Issue 做错了会怎样？丢了钱、丢了数据、用户投诉——走 <code>/goal</code>。只是个工具函数、文档更新、测试补充——走 autoresearch。风险和控制的权衡，不该由方法论替你决定。</p><p>全流程控制和全自动加速不是非此即彼。是你判断哪些值得控制，哪些值得加速。</p><h3 id="9-3-4-能力单元层：Pocock-Skills-superpowers-Goal-Workflow-Bonus"><a href="#9-3-4-能力单元层：Pocock-Skills-superpowers-Goal-Workflow-Bonus" class="headerlink" title="9.3.4 能力单元层：Pocock Skills + superpowers + Goal Workflow Bonus"></a>9.3.4 能力单元层：Pocock Skills + superpowers + Goal Workflow Bonus</h3><p>三套 Skill，组织方式各不一样。</p><p>Pocock 散装，自己挑。superpowers 自动触发，Agent 判断时机。Goal Workflow Bonus 是独立工具集，<code>/refactor</code>、<code>/modern-go</code>、<code>/code-to-spec</code>，需要时才调。</p><p>日常编码靠 superpowers 自动激活测试和 lint。你改了一个函数，保存，Agent 静默跑测试。没过，报错。你修。保存，测试通过。全程没手动调 skill，superpowers 在后台干的。</p><p>但有些场景 superpowers 覆盖不到。你要把项目从 Go 1.16 升到 1.22，35+ 条 API 变更规则，superpowers 没有这个领域知识。这时候调 Goal Workflow Bonus 的 <code>/modern-go</code>，一次性批量现代化。Pocock 的精品 Skill 同理，他的 Git skill 能自动生成 conventional commits 格式的提交信息。</p><p>三套东西不冲突，但有个容易踩的坑：同一类任务装了两套 Skill。比如 superpowers 已经有自动测试了，你又装了 Pocock 的 test skill。它们不会打架，但你会在两个地方看到测试结果——一个自动弹出的，一个手动触发的。时间长了你会只信其中一个，另一个变成噪音。装之前想清楚：这个场景你是想让 Agent 自动判断，还是自己决定什么时候调。</p><h2 id="9-4-不同场景的推荐组合"><a href="#9-4-不同场景的推荐组合" class="headerlink" title="9.4 不同场景的推荐组合"></a>9.4 不同场景的推荐组合</h2><p>不同的场景和团队规模下，你可以选择一个或者多个合适的工具&#x2F;开发流程。</p><p><img src="/images/image-20260531043524131.png"></p><h3 id="9-4-1-个人开发者"><a href="#9-4-1-个人开发者" class="headerlink" title="9.4.1 个人开发者"></a>9.4.1 个人开发者</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Pocock Skills（工程基础）+ Goal Workflow（端到端流程）+ OpenSpec（规格管理）</span><br></pre></td></tr></table></figure><p>一个人开发，代码质量靠自己。Pocock Skills 给你测试、lint、Git 这些工程基础。不是每个个人开发者都会主动写测试，但装了 test skill 之后，&quot;写测试&quot;从&quot;要不要做&quot;变成了&quot;敲一下命令&quot;。心理门槛降低了。</p><p>日常用 superpowers 替代 Pocock 也行，自动触发更省心。喜欢自己控制节奏，&quot;现在该跑测试了，我自己来&quot;，就用 Pocock。区别不在效果，在体验。</p><p>Goal Workflow 是保险绳。小功能直接让 Agent 写就行，不需要 <code>/prd</code>。但一个功能要三天，涉及多个模块，同时管需求、设计、实现，<code>/prd</code> → <code>/to-issues</code> → <code>/goal</code> 帮你把复杂度拆开。不是让你做更多流程，是不用在脑子里同时记住所有事。</p><p>OpenSpec 养习惯。先写规格再写代码，没人 review 你的 proposal，但三个月后的你回来看代码，proposal.md 和 design.md 会告诉你当初怎么想的。</p><h3 id="9-4-2-创业团队（2-5-人）"><a href="#9-4-2-创业团队（2-5-人）" class="headerlink" title="9.4.2 创业团队（2-5 人）"></a>9.4.2 创业团队（2-5 人）</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Goal Workflow（流程骨架）+ gstack（质量审查）+ autoresearch（自动化加速）</span><br></pre></td></tr></table></figure><p>创业团队的核心矛盾：要快，但质量不能垮。没有 QA 团队，没有专职安全工程师。一个人写，另一个人 review，review 质量取决于第二位同事的精力。</p><p>Goal Workflow 给一份共享的骨架。PRD 不是写给自己的，是写给同事的。&quot;我以为你要做的是 X&quot;&quot;不，PRD 上写的是 Y&quot;，这种对话在创业团队里每周都在发生。PRD 让它在动手之前发生。</p><p>gstack 在三个人都忙的时候替代交叉审查。不是替代同事 review，是让 Agent 先把二十三个维度扫一遍，同事 review 时只需要看 Agent 标记的问题和自己关心的部分。</p><p>autoresearch 处理辅助模块，测试脚本、文档生成、数据迁移。三分钟写 Issue，回来代码已经合入，不用等同事有空。</p><h3 id="9-4-3-企业团队（10-人）"><a href="#9-4-3-企业团队（10-人）" class="headerlink" title="9.4.3 企业团队（10+ 人）"></a>9.4.3 企业团队（10+ 人）</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">superpowers（技能基础）+ Spec-Kit/OpenSpec（规格管理）+ gstack（审查流水线）+ Goal Workflow /ship-it（交付）</span><br></pre></td></tr></table></figure><p>企业场景的核心是合规、可追溯、跨团队协作。三个月后的审计人员不看你跑得多快，看你能不能拿出当时的 SPEC 和设计笔记。</p><p>superpowers 统一团队的 Skill 基础。十个工程师用同一套规则，输出的测试格式一致，lint 标准一致。不用问&quot;你用的是哪个版本的 test skill&quot;。</p><p>OpenSpec 管规格。每次技术决策留下记录。三个月后审计问&quot;为什么选这个方案&quot;，proposal.md 里有当时的备选方案和选择理由。</p><p>gstack 做审查流水线。二十三角色全维度跑完，产出审查报告。合规部门要的就是这份报告，不是&quot;谁 review 过了&quot;，是&quot;二十三个角色分别审查了什么，发现了什么，修复了什么&quot;。</p><p><code>/ship-it</code> 管交付，PR、CI、合并、关 Issue，全自动。企业项目里 PR 等 CI 通过、等同事 approve、等合并，每一步都是延迟和出错的机会。<code>/ship-it</code> 把机械操作自动化，人做决策，approve 或 reject。</p><p>Goal Workflow 的 PRD → SPEC → Issue → Note 链，是合规需要的&quot;从需求到代码&quot;的完整追溯线。第 8 章的 <code>/note-it</code> 在这里价值最大，不是记录代码做了什么，是记录为什么选择这样做。对三个月后的审计和半年后的新同事，这两者的价值差一个数量级。</p><h3 id="9-4-4-中文环境开发者"><a href="#9-4-4-中文环境开发者" class="headerlink" title="9.4.4 中文环境开发者"></a>9.4.4 中文环境开发者</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">superpowers-zh（中文技能）+ Goal Workflow（iCafe/Gerrit 集成）+ spec-kit-zh（中文规格）</span><br></pre></td></tr></table></figure><p>两个特殊需求。工具链，iCafe 管卡片、iCode&#x2F;Gerrit 管代码，Goal Workflow 原生支持。<code>/to-issues</code> 直接创建 iCafe 卡片，<code>/ship-it</code> 推到 Gerrit review。</p><p>文档质量。英文 Skill 生成的 PRD 翻译后丢精度。&quot;The system must validate user input&quot;翻译成&quot;系统必须验证用户输入&quot;没问题。但带技术精确度的内容，&quot;Handle race condition on concurrent refund callbacks using idempotency key&quot;，翻译后语义会变形。superpowers-zh 和 spec-kit-zh 直接中文产出，不经过翻译层。</p><h2 id="9-5-AI-研发成熟度模型"><a href="#9-5-AI-研发成熟度模型" class="headerlink" title="9.5 AI 研发成熟度模型"></a>9.5 AI 研发成熟度模型</h2><p>不是谁都需要全套。你在哪一级，决定了你该用什么。</p><p><strong>Level 1：裸奔的 Vibe Coding。</strong> 跟 Agent 聊天写代码。&quot;帮我写个登录页&quot;，看一眼，&quot;不对，蓝色&quot;，再看。快，代码质量全凭运气。三轮需求之后 Agent 开始忘第一轮说了什么。第 1 章定义过 Vibe Coding：&quot;完全用自然语言描述需求，AI 生成代码，人工验证&quot;。是起点，不是终点。</p><p><strong>Level 2：用一个 Skill。</strong> 装了测试 Skill 或 Git Skill。单个场景有保障了，比如每次提交前自动跑测试，测试不过不提交。流程还是散的，什么时候用哪个 Skill 靠自己判断。但至少有一个场景不再靠运气。第 2 章的 Pocock 和第 6 章的 superpowers 都在解决这个级别的问题。</p><p><strong>Level 3：Skill 串起来了。</strong> 有了一条完整的链路。Goal Workflow 的 PRD → Issue → &#x2F;goal 实现。或 OpenSpec 的 propose → apply → archive。像第 3 章的 SDD 和第 4 章的 Ralph Loop，不只是用一个工具，是用一条规则串起多个步骤。规格写好了自动进实现，实现完成了自动进审查。有形状了，还没全链路。</p><p><strong>Level 4：完整的 Spec-Driven 闭环。</strong> 七条路至少用了三条以上，从需求到交付全覆盖。每个阶段有输入输出和质量标准。不靠感觉，靠可验证的东西说话。</p><p>举个例子。你要做一个支付模块。<code>/prd</code> 产出一份 PRD，四个 User Story，每个带 checkbox 验收标准。<code>/prd-to-spec</code> 产出一份 SPEC，API 端点、数据库 schema、错误码表全在里面。<code>/to-issues</code> 拆成十个 Issue，标注依赖。接下来你逐个 <code>/goal</code>，Agent 对照 checkbox 逐条实现，每勾上一个你知道进度往前走了。关键的 Issue 跑完，<code>/review-it</code> 扫一遍，gstack 全维度再扫一遍。确认没问题，<code>/ship-it</code> 合入，<code>/note-it</code> 记下设计决策。三个月后审计来了，从 PRD 到 Note 一条线拉到底，每个决策都有记录。不是&quot;我记得当时好像是这样想的&quot;，是文档里有。</p><p>多数个人开发者在 Level 2-3。多数团队在 3 往 4 过渡。</p><p><strong>Level 5：多 Agent 自动协作 + 持续改进。</strong> 第 7 章的 autoresearch 是这个级别的雏形，五个 Agent 交叉审查，评分达标自动合入。但 Level 5 真正的门槛不是自动化。是你看数据了。</p><p>哪些 Issue 一次过审查？哪些反复返工？哪类 bug 多 Agent 也抓不住？第 7 章提到 autoresearch 有一个持续改进的反馈环，审查中发现的问题模式被反馈到生成和审查 prompt 里，下次同类 Issue 的首次通过率就会提高。</p><p>更进一步的场景：项目跑了三个月，积累了上百条 Issue 的审查数据。你发现&quot;并发处理&quot;类 Issue 的平均返工次数是其他类型的三倍。不是 Agent 不行，是你的并发 Issue 写得太抽象，Agent 理解偏了。下次写并发相关的 PRD，自动增加&quot;并发场景覆盖率&quot;检查项。</p><p>数据喂回去，流程自己变好。Level 5 现在还是稀罕东西，autoresearch 的&quot;一觉醒来一排 merged&quot;通常只发生在 Issue 明确的中小功能上。但方向很清楚。</p><p>你现在在哪一级？</p><p>不用一步到位。先从 Level 1 跳到 Level 2，装一个 Skill，让 Agent 帮你跑测试。习惯了再串起来，试试 <code>/prd</code>，下个功能开始前生成一份 PRD。小步往前走，每步都能验证。</p><h2 id="9-6-本章小结"><a href="#9-6-本章小结" class="headerlink" title="9.6 本章小结"></a>9.6 本章小结</h2><p>前八章讲了怎么做。这一章讲怎么选。</p><p><img src="/images/image-20260531043908188.png"></p><p>选的核心不是对比表。是两个问题。</p><p><strong>第一：你愿意在哪个环节管？</strong> autoresearch 说只在开头管，写好 Issue 放手。Goal Workflow 说每一步管，每站等人。gstack 说在关键节点管，规划、审查、交付前。没有对错，看你愿意在哪停下来。第 8 章 smallnest 做完了全自动的 autoresearch，发现自己还是想每步看一眼，于是做了 Goal Workflow。他选了自己的舒服区。你也要选你的。</p><p><strong>第二：你需要多强的追溯？</strong> 个人项目不需要三个月后解释设计决策。创业团队可能需要，投资人在问&quot;登录模块为什么选了自建而不是第三方&quot;。企业团队一定需要，合规部门等着。追溯越强，越需要结构化的 SPEC 和设计笔记。</p><p>七条路摊开之后，有意思的不是它们各有多少功能。是它们能拼。Pocock Skills 管测试。superpowers 在后台自动触发。OpenSpec 管变更规格。Goal Workflow 管项目流程。Ralph Loop 处理一句话就能说清的小任务。gstack 做全维度审查。autoresearch 把辅助模块全自动跑完。七个工具，一套积木。</p><p>下一章进入本书的第二部分。前面九章都在讲用 AI 做软件工程。Harness Engineering 回答另一个问题：如果你要开发一个 AI Agent 产品，基础设施怎么搭。沙箱、工具安全、产出验证，这些东西没人替你设计。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/methodology-comparison-and-fusion/</id>
    <link href="https://colobu.com/2026/06/28/methodology-comparison-and-fusion/"/>
    <published>2026-06-28T04:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>&quot;小孩子才做选择题，成年人当然全都要&quot;</p>
<p>——网络梗</p>
</blockquote>
<p>前八章覆盖了七条路线。</p>
<p>Pocock Skills 拆能力。OpenSpec 写规格。Ralph Loop 自己循环到对。gstack 用角色覆盖质量。superpowers 让 Agent 替你选工具。autoresearch 一口气自动到合入。Goal Workflow 串成七步，每步等你说过。</p>
<p>每条路都能走通。真实项目从来不只走一条。Ralph Loop 做实现，谁来审查？gstack 走流程，需求从哪来？autoresearch 全自动跑，Issue 谁拆的？</p>
<p>贪吃蛇案例已经验证了这一点。第 5 章 gstack 走了七个 Sprint 阶段，手工推着走，约两小时。第 6 章 superpowers 后台监听关键词，你答了五个设计问题，约五分钟。第 7 章 autoresearch 你写了一个 Issue，约三分钟，然后等结果。第 8 章 Goal Workflow 每步确认一下，从 PRD 到上线，约八分钟。</p>
<p>同一个贪吃蛇，同一个产出，四种交互模式。</p>
<p>本章把七条路摊开，看它们怎么拼。</p>]]>
    </summary>
    <title>方法论对比与融合</title>
    <updated>2026-06-28T06:46:22.010Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="Goal Workflow" scheme="https://colobu.com/tags/Goal-Workflow/"/>
    <category term="研发流程" scheme="https://colobu.com/tags/%E7%A0%94%E5%8F%91%E6%B5%81%E7%A8%8B/"/>
    <content>
      <![CDATA[<blockquote><p>&quot;你只需描述功能想法，剩下的交给工作流。&quot;</p><p>——smallnest, Goal Workflow 作者, 2026 年 5月</p></blockquote><p>三条路。gstack 覆盖从需求到交付，但你得手动驱动每个阶段。superpowers 覆盖从设计到代码，但止步于开发分支。autoresearch 覆盖从 Issue 到合入，但它假设 Issue 已经存在。每条路都只解了一段。</p><p>实际项目不是这样的。实际项目从一句&quot;我想做一个东西&quot;开始。然后你要搞清楚它是什么、设计它怎么做、拆成小块、逐块实现、审查代码、记录决策、最后合入上线。七个动作，缺一个就是断点。每个断点都是你手动接续的地方。</p><p>Goal Workflow 做的事就是把这些断点接上。不是做一个更强的 &#x2F;goal 命令。是做一条流水线——七个斜杠命令，首尾相连，从 PRD 到上线。</p><span id="more"></span><h2 id="8-1-smallnest-的两次转向"><a href="#8-1-smallnest-的两次转向" class="headerlink" title="8.1 smallnest 的两次转向"></a>8.1 smallnest 的两次转向</h2><p>smallnest 是 Go 生态里的熟面孔，rpcx 微服务框架的作者，也是本书的作者， 百度公司的网络软件架构师。2026 年上半年，他连续发布了两个 AI 研发工具——先做了 autoresearch（第 7 章），然后又做了 Goal Workflow。</p><p><img src="/images/image-20260531064324585.png"></p><p>这个顺序本身就有意思。autoresearch 追求的是全自动——你写完 Issue，脚本驱动五个 Agent 交替审查、实现、合入，十几分钟后回来看结果。他在真实项目里大量使用 autoresearch 之后，发现了全自动的问题。</p><p>不是质量问题。autoresearch 产出的代码质量不差——两到五个 Agent 交叉审查，正确性、安全性、性能都覆盖了。问题是控制。全自动意味着你在起点说了算，然后就没你的事了。PR 合入之后你才看到代码，如果 PRD 写偏了，Issue 拆错了，或者 Agent 对验收标准的理解和你不一样——你已经没有修正的机会了。</p><p>Goal Workflow 是他对这个问题的回答。既然全自动让你不安，那就把每一步的控制权还给你。但控制不等于手动——每个步骤内部仍然全自动，步骤之间留一个门，你点头了才开下一扇。</p><p>最重要的一点，autoresearch太耗token了，每一次修改都需要进行全面的review,每次review既耗时又耗token，我们不太可能像Claude Code的作者一样无限制的使用最好的LLM，我们必须考虑到成本。Goal Workflow这种单agent review 最新的变更的方式可以有效的减少token的消耗。</p><p>和前面几章不同，Goal Workflow 不跟你讲 Agent 自主性或多 Agent 轮转。它做的事更朴素：把研发流程中每一步写成一个 Skill，每个 Skill 有明确的输入、输出和质量标准。你推一步，它做完一步。推完七步，一个功能从想法变成了上线代码。</p><h2 id="8-2-安装与配置：一条-npx-命令装完全套"><a href="#8-2-安装与配置：一条-npx-命令装完全套" class="headerlink" title="8.2 安装与配置：一条 npx 命令装完全套"></a>8.2 安装与配置：一条 npx 命令装完全套</h2><p>Goal Workflow 由 smallnest 维护，代码仓库 <code>github.com/smallnest/goal-workflow</code>，官网 <a href="https://goal.rpcx.io/">goal.rpcx.io</a>。核心是一组 Markdown Skill 文件，通过 <code>npx skills</code> 分发——这是第 2 章 Skills 哲学的直接实践：用包管理工具安装 Skill，像 npm 装依赖一样。</p><h3 id="8-2-1-前提条件"><a href="#8-2-1-前提条件" class="headerlink" title="8.2.1 前提条件"></a>8.2.1 前提条件</h3><p>三条：GitHub CLI（<code>gh</code>）、Claude Code CLI（<code>claude</code>）、Node.js（提供 <code>npx</code>）。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">brew install gh &amp;&amp; gh auth login</span><br><span class="line">npm install -g @anthropic-ai/claude-code</span><br></pre></td></tr></table></figure><p><code>gh</code> 是 <code>/ship-it</code> 和 <code>/to-issues</code>（GitHub 模式）的前置，没有它 PR 创建和 Issue 操作走不了。Claude Code 是 Skill 的运行宿主。<code>npx</code> 随 Node.js 安装，是 <code>npx skills</code> 的前提。</p><h3 id="8-2-2-安装"><a href="#8-2-2-安装" class="headerlink" title="8.2.2 安装"></a>8.2.2 安装</h3><p>安装全部 Skill（七个核心 + 七个增强，共十四个）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add smallnest/goal-workflow</span><br></pre></td></tr></table></figure><p><code>npx skills</code> 做四件事：拉取仓库中的 Skill Markdown 文件、注册到 Claude Code 的 skills 目录、生成对应的 <code>/</code> 斜杠命令、写入 <code>CLAUDE.md</code> 配置。</p><p>也可以只装单个 Skill：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add smallnest/goal-workflow --skill prd</span><br></pre></td></tr></table></figure><p><code>--skill</code> 后面跟 Skill 名——<code>prd</code>、<code>prd-to-spec</code>、<code>to-issues</code>、<code>review-it</code>、<code>ship-it</code>、<code>note-it</code>、<code>humanize-it</code>、<code>listenhub-tts</code>、<code>insight-diagram</code>、<code>refactor</code>、<code>modern-go</code>、<code>code-to-spec</code>、<code>smell</code>。挑需要的装。</p><p>全局安装（所有项目共用）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add smallnest/goal-workflow -g</span><br></pre></td></tr></table></figure><p>指定 Agent（非 Claude Code，如 Codex）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add smallnest/goal-workflow -a codex</span><br></pre></td></tr></table></figure><p>Goal Workflow 的 Skill 可以在 Claude Code、Codex、OpenCode、DeepSeek TUI 四种 Agent 上运行。唯一例外是 <code>/goal</code>——它是 Claude Code 的内置命令，Skill 包里不包含它。Codex 上的等价命令是 <code>codex --goal &quot;...&quot;</code>。</p><h3 id="8-2-3-目录结构"><a href="#8-2-3-目录结构" class="headerlink" title="8.2.3 目录结构"></a>8.2.3 目录结构</h3><p>安装后，项目目录下自动生成以下结构：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">tasks/</span><br><span class="line">├── prd-[feature-name].md       ← /prd 生成的 PRD 文档</span><br><span class="line">└── spec-[feature-name].md      ← /prd-to-spec 生成的 SPEC（可选）</span><br><span class="line"></span><br><span class="line">.autoresearch/</span><br><span class="line">└── issues/                      ← /to-issues 生成的本地 Issue 文件</span><br><span class="line"></span><br><span class="line">docs/</span><br><span class="line">├── issue#XXXX.html              ← /note-it 生成的实现笔记</span><br><span class="line">├── SPEC.md                      ← /code-to-spec 生成的反向规格</span><br><span class="line">└── *.html                       ← /insight-diagram 生成的 UML 图</span><br></pre></td></tr></table></figure><p><code>tasks/</code> 放 PRD 和 SPEC，<code>.autoresearch/issues/</code> 放本地 Issue（和第 7 章的 autoresearch 共用同一套本地 Issue 系统），<code>docs/</code> 放设计文档、笔记和图。</p><h3 id="8-2-4-平台支持"><a href="#8-2-4-平台支持" class="headerlink" title="8.2.4 平台支持"></a>8.2.4 平台支持</h3><table><thead><tr><th>Agent</th><th>支持</th><th>备注</th></tr></thead><tbody><tr><td>Claude Code</td><td>全部 Skill</td><td><code>/goal</code> 内置，其余通过 Skill 包</td></tr><tr><td>Codex</td><td>全部 Skill</td><td><code>/goal</code> 内置，其余通过 Skill 包&#96;</td></tr><tr><td>OpenCode</td><td>除 <code>/goal</code> 外全部</td><td><code>/goal</code> 不适用</td></tr><tr><td>DeepSeek TUI</td><td>全部 Skill</td><td><code>/goal</code> (<code>/mubiao</code>)内置，其余通过 Skill 包</td></tr></tbody></table><p>Issue 创建支持三种平台：GitHub（<code>gh issue create</code>）、本地（<code>.md</code> 文件写入 <code>.autoresearch/issues/</code>）、百度 iCafe（<code>icafe-cli</code>）。</p><h3 id="8-2-5-升级"><a href="#8-2-5-升级" class="headerlink" title="8.2.5 升级"></a>8.2.5 升级</h3><p>重跑安装命令即可——覆盖 Skill 文件，CLAUDE.md 中的已注册命令自动更新：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add smallnest/goal-workflow</span><br></pre></td></tr></table></figure><p>版本管理和 Skill 包注册由 <code>npx skills</code> 生态维护，Goal Workflow 本身不内置升级逻辑——这和 gstack 的 <code>/gstack-upgrade</code> 不同，更接近 OpenSpec 的 <code>openspec update</code>。</p><h2 id="8-3-流水线思维"><a href="#8-3-流水线思维" class="headerlink" title="8.3 流水线思维"></a>8.3 流水线思维</h2><p>Goal Workflow 的设计哲学和前面几章都不一样。gstack 相信角色覆盖——二十三个角色审查二十三个维度。superpowers 相信工具覆盖——十四个 Skill 覆盖十四个场景。autoresearch 相信模型覆盖——五个 Agent 交叉审查，不同模型的盲区互补。</p><p>Goal Workflow 相信的是流水线。每个工序有明确的输入、输出和质量标准。工序之间首尾相接，上游的输出是下游的输入。流水线不保证每个工序都完美。它保证的是工序之间没有裂缝。</p><p>这种思维在第 1 章就有了——&quot;在 AI 时代，你的价值不再是&#39;你能写多快的代码&#39;，而是&#39;你能不能定义清楚什么算做好&#39;。&quot;Goal Workflow 把这句话拆成了七步。PRD 定义需求的标准，SPEC 定义技术的标准，Issue 定义验收的标准，&#x2F;goal 把标准变成代码，&#x2F;review-it 验证代码是否达标，&#x2F;note-it 记录为什么这样达标，&#x2F;ship-it 把达标的代码送上生产线。每一步都问：这一阶段的&quot;做好&quot;是什么？然后让 Agent 去做到。</p><p>流水线在制造业用了一百年。把它搬到 AI 软件工程上，Goal Workflow 是第一套完整方案。前面的方法论都在解决&quot;如何让 Agent 做得更好&quot;——更好的 prompt、更好的审查、更好的模型组合。Goal Workflow 在解决另一个问题：如何让人更好地组织 Agent 的工作。与其绞尽脑汁让一个 Agent 一次性做对所有事，不如把流程切成七段，每段只要求 Agent 做好一件事。</p><h2 id="8-4-goal：流水线的引擎"><a href="#8-4-goal：流水线的引擎" class="headerlink" title="8.4 &#x2F;goal：流水线的引擎"></a>8.4 &#x2F;goal：流水线的引擎</h2><p>Goal Workflow 的流水线里，<code>/goal</code> 是唯一不在 skills 目录下的命令。它不是 smallnest 写的 Skill，是 AI 编码工具的内置功能。Goal Workflow 把它放在流水线正中心，让它成为&quot;把 Issue 变成代码&quot;的那一步。</p><p><code>/goal</code> 的概念最早来自 Codex CLI。2025 年 4 月，OpenAI 发布了 Codex CLI，首次引入了 <code>/goal</code> 斜杠命令。核心思想是&quot;声明式编程&quot;——你说目标，Agent 自己拆步骤。在这之前，AI 编码工具的交互都是&quot;指令式&quot;的：你说一步，Agent 做一步。Codex 把这个范式颠倒了过来。</p><p>Codex 之后，Claude Code 也内置了 <code>/goal</code>。到了 2026 年 5 月，Google 的 Antigravity CLI 正式发布，同样带着 <code>/goal</code> 登场。</p><p>三个工具，独立设计，三种底层模型（GPT-5、Claude 4.x、Gemini 2.5），却选择了同一个词。这不是巧合。它们都在解决同一个问题：如何让人类从&quot;指挥每一步&quot;变成&quot;定义目标，然后放手&quot;。</p><p>当然，实现各有侧重。Codex 提供了完整的生命周期管理——目标可以暂停、恢复、编辑、清除。Agent 自主但不失控，用户随时介入。Claude Code 的 <code>/goal</code> 更务实——接收 Issue 编号或文件路径，读取验收标准，端到端实现，逐条验证 checkbox。Antigravity CLI 最晚入场，吸收了前两者的经验，加上 Gemini 的长上下文优势，处理多文件项目时更从容。</p><table><thead><tr><th>维度</th><th>Codex <code>/goal</code></th><th>Claude Code <code>/goal</code></th><th>Antigravity CLI <code>/goal</code></th></tr></thead><tbody><tr><td><strong>发布时间</strong></td><td>2025 年 4 月（首个）</td><td>2026 年 5 月</td><td>2026 年 5 月</td></tr><tr><td><strong>底层模型</strong></td><td>GPT-5 &#x2F; Codex 系列</td><td>Claude 4.x</td><td>Gemini 2.5</td></tr><tr><td><strong>目标管理</strong></td><td>完整生命周期（暂停&#x2F;恢复&#x2F;编辑&#x2F;清除）</td><td>设置目标，逐条验证</td><td>完整生命周期 + Issue 联动</td></tr><tr><td><strong>验收方式</strong></td><td>目标完成判断</td><td>逐条对照 Issue checkbox</td><td>目标完成 + Issue checkbox</td></tr><tr><td><strong>安全模型</strong></td><td>默认确认执行 bash 命令</td><td>权限模式（ask&#x2F;auto）</td><td>沙箱隔离</td></tr><tr><td><strong>上下文优势</strong></td><td>代码推理</td><td>深度推理、复杂重构</td><td>长上下文、多文件项目</td></tr><tr><td><strong>最佳场景</strong></td><td>放手式自主开发</td><td>需要随时干预的开发</td><td>大型多文件项目</td></tr></tbody></table><p>和 Ralph Loop（第 4 章）比，<code>/goal</code> 是它的单次迭代实例化。核心循环一样——读需求、写代码、验证。区别在判断&quot;做完&quot;的方式。Ralph Loop 靠 completion promise 匹配——Agent 声明&quot;做完了&quot;，匹配到就停。<code>/goal</code> 靠 Issue 的 checkbox 验收标准——Agent 不自己判断，逐条对照。</p><p>Goal Workflow 的流水线在三个平台上都能跑。除了 <code>/goal</code> 这一步的调用方式不同，其余六个 Skill 完全通用。Goal Workflow 做的事是让 <code>/prd</code> 和 <code>/to-issues</code> 生成的 Issue 格式正好匹配 <code>/goal</code> 期望的输入——PRD → Issue → &#x2F;goal，三者的接口是对齐的。</p><h2 id="8-5-七个步骤"><a href="#8-5-七个步骤" class="headerlink" title="8.5 七个步骤"></a>8.5 七个步骤</h2><p>Goal Workflow 的核心流水线：</p><p><img src="/images/image-20260531064429830.png"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/prd  →  /prd-to-spec (可选)  →  /to-issues  →  /goal  →  /review-it  →  /note-it (可选)  →  /ship-it</span><br></pre></td></tr></table></figure><table><thead><tr><th>步骤</th><th>命令</th><th>输入</th><th>输出</th><th>角色隐喻</th></tr></thead><tbody><tr><td>1. 规划</td><td><code>/prd</code></td><td>功能描述</td><td>PRD 文档</td><td>产品经理</td></tr><tr><td>1.5 设计</td><td><code>/prd-to-spec</code></td><td>PRD 文档</td><td>技术 SPEC</td><td>架构师</td></tr><tr><td>1.6 拆解</td><td><code>/to-issues</code></td><td>PRD &#x2F; SPEC</td><td>Issue 卡片</td><td>Tech Lead</td></tr><tr><td>2. 实现</td><td><code>/goal</code></td><td>Issue 卡片</td><td>可运行的代码</td><td>开发工程师</td></tr><tr><td>3. 审查</td><td><code>/review-it</code></td><td>代码变更</td><td>通过审查的代码</td><td>代码审查者</td></tr><tr><td>3.5 记录</td><td><code>/note-it</code></td><td>已审查的代码</td><td>实现笔记 (HTML)</td><td>开发工程师</td></tr><tr><td>4. 交付</td><td><code>/ship-it</code></td><td>已审查的代码</td><td>已合入的 PR + 已关闭的 Issue</td><td>发布工程师</td></tr></tbody></table><p>七个步骤，四个角色隐喻。gstack 有二十三个角色，Goal Workflow 少得多。区别不在数量。gstack 的角色是人格化的——&quot;你是一个有十五年经验的员工工程师&quot;。Goal Workflow 的角色是功能化的——每个角色就是一个命令要做的事。你不扮演产品经理，你调用 <code>/prd</code> 让 Agent 生成 PRD。角色隐喻帮你理解命令在流程中的位置，不是让你去扮演。</p><p>两步标了&quot;可选&quot;：<code>/prd-to-spec</code> 和 <code>/note-it</code>。小功能 PRD 的验收标准就够了，不需要完整技术方案。简单实现不需要单独记录设计决策。但复杂功能少了这两步，Issue 拆解和后续维护都会受影响。</p><p>除了核心流水线，还有四个 Bonus Skills——<code>/refactor</code>、<code>/modern-go</code>、<code>/code-to-spec</code>、<code>/insight-diagram</code>——不参与流水线，各自独立使用。</p><p>下面走一遍实战。用 Goal Workflow 开发网页版贪吃蛇——同一个案例，第七种体验。每一步我会讲清楚发生了什么，以及背后的设计逻辑。</p><h2 id="8-6-第一步：一句话生成-PRD"><a href="#8-6-第一步：一句话生成-PRD" class="headerlink" title="8.6 第一步：一句话生成 PRD"></a>8.6 第一步：一句话生成 PRD</h2><p>打开 Claude Code，输入：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/prd 做一个贪吃蛇网页游戏。纯前端单文件 HTML/CSS/JS 实现。演示 AI 编码能力。</span><br></pre></td></tr></table></figure><p>Agent 没有直接开始写文档。它先问了五个问题，每个带选项：游戏复杂度（简化&#x2F;完整&#x2F;极简）、功能范围（蛇移动&#x2F;吃食物&#x2F;碰撞死亡&#x2F;最高分持久化）、技术偏好（纯单文件无框架&#x2F;轻量框架&#x2F;React）、UI 要求（简洁&#x2F;像素风&#x2F;现代）、代码质量侧重（结构清晰&#x2F;性能优先&#x2F;可维护性）。</p><p>这是 <code>/prd</code> 和 superpowers 的 brainstorming 的关键区别。superpowers 一次一个问题，逐个推进——适合需要深度讨论的探索性任务。<code>/prd</code> 一次甩出五个带选项的问题，你快速回复&quot;1B, 2ABCD, 3A, 4A, 5A&quot;，适合目标明确、只需确认细节的功能开发。</p><p>澄清完成后，Agent 生成一份 PRD，包含问题陈述、可衡量目标、User Story（每个带 checkbox 验收标准）、功能需求（编号，用&quot;系统必须&#x2F;应当&quot;）、非目标（明确不做什么）、成功度量、待确认问题。保存到 <code>tasks/prd-snake-game.md</code>。</p><p>SDD（第 3 章）说&quot;先写规格，再写代码&quot;。<code>/prd</code> 是这句话的工程化落地——你不需要掌握方法论框架，描述想法就行，Agent 产出规格文档。SDD 是施工规范，<code>/prd</code> 是规范指导下的预制构件。</p><p>贪吃蛇这个例子够简单——单文件实现，没有后端，没有 API——所以跳过 <code>/prd-to-spec</code>。但值得说一下什么时候该走这一步。</p><p><code>/prd-to-spec</code> 做的事是把&quot;做什么&quot;翻译成&quot;怎么做&quot;。PRD 说功能，SPEC 说架构、数据模型、API 设计、错误处理、安全、性能。它的产出里有两样东西最实用：Issue 映射表（把 SPEC 每个章节映射到对应 Issue，标注优先级和依赖）和验收标准映射表（每条 PRD 验收标准对应至少一个测试用例）。规格里有、代码里就有——不是靠人记忆，是靠文档的强制关联。</p><p>复杂功能值得走这一步。原因和 gstack 的 Think 阶段一样：在设计阶段找出问题，比在代码里找出问题代价低十倍。小功能跳过就行。</p><p>SPEC 有一个尴尬：写得越详细，和代码的同步成本越高。功能迭代后代码变了，谁来更新 SPEC？Goal Workflow 的答案是 <code>/code-to-spec</code>（后面会讲）——从代码逆向生成 SPEC。正向一次，逆向一次，保持同步。</p><h2 id="8-7-为什么可以跳过-prd-to-spec"><a href="#8-7-为什么可以跳过-prd-to-spec" class="headerlink" title="8.7 为什么可以跳过 prd-to-spec"></a>8.7 为什么可以跳过 prd-to-spec</h2><p>流水线图上 <code>/prd-to-spec</code> 标了&quot;可选&quot;，这不是客气。是设计。</p><p><code>/prd</code> 产出的 PRD 本身就是一份规格文档——产品级的规格。它包含 User Story（每个带 checkbox 验收标准）、功能需求（编号，用&quot;系统必须&#x2F;应当&quot;）、非目标、技术考量。这些内容已经足够让 <code>/to-issues</code> 和 <code>/goal</code> 工作了。<code>/to-issues</code> 的 SKILL 文件里写着：如果只有 PRD 没有 SPEC，直接从 User Story 生成 Issue。</p><p>不是文档不够详细所以妥协。是故意的模块化设计。</p><p>PRD 的 User Story 格式是被刻意约束过的——每个 Story 的验收标准必须是可验证的 checkbox 列表。&quot;按钮点击后弹窗出现&quot;是可验证的。&quot;用户体验良好&quot;不行。有了这个约束，PRD 的验收标准本身就能当测试用例用，不需要 SPEC 再翻译一遍。</p><p>贪吃蛇刚好说明这一点。四个 User Story，&quot;20x20 网格渲染正确&quot;&quot;蛇初始长度 3&quot;&quot;撞墙触发 game over&quot;，全是可验证的 checkbox。<code>/goal</code> 拿到就能直接实现。中间插一个 SPEC 去描述&quot;Canvas 渲染采用 requestAnimationFrame 驱动主循环&quot;，对 Agent 帮助不大，对读者负担不小。</p><p>那什么时候该走 <code>/prd-to-spec</code>？当 PRD 的 User Story 描述不了&quot;怎么做&quot;的时候。</p><p>一个典型场景：功能涉及多个服务或模块。PRD 说&quot;用户登录后看到个性化推荐&quot;，但推荐服务怎么调、缓存怎么设计、降级策略是什么——这些 PRD 管不着，得 SPEC 来约定。</p><p>另一个：有 API 设计或数据模型变更。新增接口、改数据库 schema、破坏性变更。SPEC 的 Issue 映射表在这里价值最大——把 API 端点、数据迁移、业务逻辑拆进不同的 Issue，标注依赖。</p><p>再加一个：多人并行。前后端分离，多个 Agent 同时实现不同 Issue。SPEC 是它们之间的共享合约。</p><p>功能越简单，PRD 和 SPEC 的重叠越大。贪吃蛇这个级别，PRD 已经把能说的都说了——单文件 HTML，没有后端，没有 API，没有数据库。SPEC 能补充的东西几乎为零。</p><p>反过来，功能越复杂，PRD 和 SPEC 的分工越清晰。PRD 回答&quot;用户看到什么、能做什么&quot;。SPEC 回答&quot;系统怎么做到&quot;。两者不重复，各管各的。</p><p>这也解释了 Goal Workflow 和 SDD（第 3 章）的区别。SDD 说&quot;必须先有规格再写代码&quot;，对所有功能一样。Goal Workflow 说：规格有好几层。产品规格（PRD）对所有功能都是必须的。技术规格（SPEC）只在复杂度超过阈值时才需要。阈值在哪？你读完 PRD，不确定 <code>/goal</code> 能不能独立完成的时候。</p><h3 id="PRD、设计文档、SPEC"><a href="#PRD、设计文档、SPEC" class="headerlink" title="PRD、设计文档、SPEC"></a>PRD、设计文档、SPEC</h3><p>这三个词在中国研发体系里经常混着用。理清它们的区别，才能理解为什么 Goal Workflow 选了 SPEC 而不是&quot;设计文档&quot;。</p><p><img src="/images/image-20260531064719502.png"></p><table><thead><tr><th></th><th>PRD</th><th>设计文档</th><th>SPEC</th></tr></thead><tbody><tr><td><strong>谁写</strong></td><td>产品经理</td><td>Tech Lead &#x2F; 资深工程师</td><td>架构师 &#x2F; Agent（<code>/prd-to-spec</code>）</td></tr><tr><td><strong>回答什么</strong></td><td>做什么、为什么</td><td>怎么做（叙事）</td><td>怎么做（契约）</td></tr><tr><td><strong>形式</strong></td><td>用户故事 + 验收标准</td><td>架构图 + 模块描述 + 决策理由</td><td>API Schema + 数据模型 + 错误码表</td></tr><tr><td><strong>读者</strong></td><td>全团队</td><td>开发团队</td><td>开发团队 + AI Agent</td></tr><tr><td><strong>精确度</strong></td><td>方向级</td><td>方案级</td><td>实现级</td></tr></tbody></table><p>PRD 最简单。产品经理写，用户是谁、要什么、验收标准是什么。所有人对&quot;做成什么样&quot;的理解对齐。</p><p>设计文档是中国研发体系里最常见的中间产物。Tech Lead Tech Lead 在动手前写一份，讲架构怎么设计、模块怎么拆、为什么选这个方案。叙事型的——读起来像一篇文章，&quot;我们打算这么干，理由是这些&quot;。对人友好，对机器不够友好。Agent 拿到一份设计文档，能理解意图，但没法直接执行。&quot;API 返回用户画像数据&quot;不如&quot;GET &#x2F;api&#x2F;v1&#x2F;recommendations?user_id&#x3D;{uuid} → 200 { items: [], generated_at: ISO8601 }&quot;好执行。</p><p>SPEC 不一样。它不是解释，是约定。契约型的——API 端点精确到路径和响应 Schema，数据模型精确到字段类型和约束，错误处理精确到错误码和 HTTP 状态码。人读起来啰嗦，Agent 读起来刚好。</p><p>Goal Workflow 的 <code>/prd-to-spec</code> 产出的就是这种契约型 SPEC——十一个章节，从架构到 API Schema 到错误分类到 Issue 映射表。不是让你读的（虽然你可以读），是让 <code>/to-issues</code> 拆解和 <code>/goal</code> 实现用的。PRD 给方向，SPEC 给精确坐标。</p><p>设计文档和 SPEC，本质都是把&quot;怎么做&quot;写下来。区别是读者。只有一个你和一个 Agent 在看，PRD 的验收标准就是够好的&quot;怎么做&quot;。当三个 Agent 加一个前端团队一起看，你才需要 SPEC 那份精确度。</p><h2 id="8-8-第二步：拆成-Issue"><a href="#8-8-第二步：拆成-Issue" class="headerlink" title="8.8 第二步：拆成 Issue"></a>8.8 第二步：拆成 Issue</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/to-issues</span><br></pre></td></tr></table></figure><p>Agent 自动定位刚才生成的 PRD，把四个 User Story 拆成四个 Issue：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">#1: HTML 结构与 Canvas 渲染 (frontend, high)</span><br><span class="line">#2: 游戏循环与方向控制 (frontend, high) — depends on #1</span><br><span class="line">#3: 碰撞检测与食物系统 (frontend, high) — depends on #2</span><br><span class="line">#4: 分数系统与 UI 状态 (frontend, high) — depends on #1, #2, #3</span><br></pre></td></tr></table></figure><p>拆解规则是隐式的，但可以反推出来：一个 User Story 至少一个 Issue；验收条件超过五条的 Story 拆成两到三个；太简单的合并；每个 Issue 必须能在一个 Agent 会话中独立完成。</p><p>这些规则是从 autoresearch 的经验中提炼出来的。Issue 太大，Agent 在上下文窗口里迷路。Issue 太小，启动成本高于实现成本。<code>/to-issues</code> 的粒度瞄准的就是这个区间。</p><p>Agent 展示 Issue 列表让你审核。你可以删除、合并、新增、调整优先级。确认后选择创建平台——GitHub（<code>gh</code> CLI）、本地文件、百度 iCafe——Agent 逐个调用对应 CLI，不需要手动复制粘贴。</p><p>这里有一个刻意的设计：<code>/to-issues</code> 创建的本地 Issue 文件，格式直接兼容 autoresearch 的 <code>--issues-dir</code> 参数。Goal Workflow 和 autoresearch 同作者，这种一致性不是偶然。拆解完想全自动？丢进 autoresearch。想手动逐个来？用 <code>/goal</code>。</p><h2 id="8-9-第三步：逐个实现"><a href="#8-9-第三步：逐个实现" class="headerlink" title="8.9 第三步：逐个实现"></a>8.9 第三步：逐个实现</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/goal .autoresearch/issues/issue-001-snake-game-render.md</span><br></pre></td></tr></table></figure><p>Agent 读取 Issue #1，理解验收标准——20x20 网格、初始长度 3 的蛇、Canvas 绘制。端到端实现，产出 <code>snake-game/index.html</code> 的基础结构和 Canvas 渲染层。</p><p>然后逐个推进：Issue #2 实现游戏循环和方向控制（requestAnimationFrame + 手动计时，方向缓冲防反向），Issue #3 实现碰撞检测和食物系统（随机生成、检查不重叠蛇身），Issue #4 实现分数系统和 UI（当前分&#x2F;最高分、HTML modal 弹窗、localStorage 持久化带 try-catch、空格键重置）。</p><p>这里能看出 <code>/goal</code> 的设计哲学：&quot;单次会话完成一个功能&quot;。上下文窗口里的所有内容都和当前 Issue 相关。不会出现 Ralph Loop 中上下文膨胀的问题——Issue 太大早被 <code>/to-issues</code> 拆掉了。不会出现 autoresearch 多 Issue 间依赖混乱的问题——依赖在拆解阶段就已标注，你按顺序逐个 <code>/goal</code> 就行。</p><p>和 autoresearch 比，<code>/goal</code> 是手动版。每次实现一个 Issue，你在旁边看着。autoresearch 一口气吞下所有 Issue，你喝茶睡觉。核心实现逻辑一样——读 Issue、写代码、跑测试。区别在循环由谁驱动。你驱动，是 Goal Workflow。脚本驱动，是 autoresearch。</p><h2 id="8-10-第四步：审查"><a href="#8-10-第四步：审查" class="headerlink" title="8.10 第四步：审查"></a>8.10 第四步：审查</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/review-it</span><br></pre></td></tr></table></figure><p>Agent 检测四个 &#x2F;goal 产出的代码变更，发起审查。四个维度：代码质量（命名、结构）、功能完整性（对照每个 Issue 的验收标准逐条核实）、安全性（localStorage 的 try-catch 是否在位）、性能（requestAnimationFrame 实现是否正确）。</p><p>审查发现两个问题。第一个是 modal 弹窗出现后方向键仍能控制蛇——和第 5、6 章实战中抓到的同一个问题。第二个是空格键重置后蛇状态未完全初始化。Agent 修复，重新审查，通过。</p><p><code>/review-it</code> 的审查逻辑和第 7 章 autoresearch 的质量门禁类似，但控制权在你手里。流程是：检测变更 → 发现问题 → Agent 修复 → 重新审查 → 直到无 actionable findings。支持四个 Agent——Claude Code、Codex、OpenCode、DeepSeek TUI。</p><p>审查结论是建议，不是命令。&quot;Treat review output as advisory. Never blindly apply it.&quot;Agent 对每条发现都要验证：读代码、读依赖、拒绝不合理的边界情况、拒绝过度工程化的修改。这和 gstack 的&quot;角色审查 → 你有否决权&quot;逻辑一致。自动化不是 AI 说了算，是 AI 找了问题，你判断该不该修。</p><p>审查通过的标准不是&quot;没有发现问题&quot;，是&quot;没有需要修复的问题&quot;。审查者可能提出建议但你决定不修——只要解释清楚为什么不修，就是通过。</p><h2 id="8-11-第五步：记录设计决策"><a href="#8-11-第五步：记录设计决策" class="headerlink" title="8.11 第五步：记录设计决策"></a>8.11 第五步：记录设计决策</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/note-it</span><br></pre></td></tr></table></figure><p>Agent 回顾四个 Issue 的实现过程，记录四条设计决策：为什么用 requestAnimationFrame 而非 setInterval（帧同步精度）、为什么方向缓冲不在键盘事件中直接更新（防止一帧内多次转向）、为什么 localStorage 用 try-catch 包裹（隐私模式兼容）、为什么 modal 弹窗出现时拦截所有键盘事件（防止死蛇漂移）。</p><p>输出是一份 HTML，存在 <code>docs/issue#0001.html</code>。设计得很轻——四条彩色标签，每条对应一个类别：设计决策、偏离、权衡、待确认。空类别直接写&quot;None&quot;。</p><p>代码能告诉你&quot;怎么做&quot;，但很难告诉你&quot;为什么这样做&quot;。<code>/note-it</code> 填补这个空白。smallnest 把它放在 <code>/review-it</code> 之后、<code>/ship-it</code> 之前，位置是有意的：审查通过意味着代码质量合格，此时回头记录设计决策，既不受审查来回修改的干扰，也不会被交付后的遗忘抹掉。</p><p>还有一个容易被忽略的价值：这些记录对 AI Agent 的后续维护极其有用。Agent 下次修改相关代码时，读到 <code>docs/issue#0042.html</code> 就能理解当初的设计考量。注释在代码里，只能解释当前实现。设计笔记记录的是&quot;当初还有别的选择，为什么没选&quot;。Agent 知道什么路试过但死了，就不会再试一次。</p><h2 id="8-12-第六步：交付"><a href="#8-12-第六步：交付" class="headerlink" title="8.12 第六步：交付"></a>8.12 第六步：交付</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/ship-it</span><br></pre></td></tr></table></figure><p>Agent 执行六步机械操作：创建分支 → 暂存相关文件（不混入无关变更）→ commit message 关联 Issue 编号 → 推送 → 创建 PR → squash merge → 删除分支 → 在 Issue 上添加实现总结评论。</p><p>和第 7 章 autoresearch 的收尾逻辑一样：传统 CI 到&quot;代码能跑&quot;就停了，PR 创建、等待 CI、合并、关闭 Issue 都要人手动做。每一步都是延迟和出错的机会。<code>/ship-it</code> 把它们全部自动化。</p><p>但有一个区别：<code>/ship-it</code> 需要你明确调用。autoresearch 在第 4 轮评分达标后自动合入——你不说合，它也合了。Goal Workflow 把控制权留给你——走完 <code>/review-it</code>，确认没问题，再敲 <code>/ship-it</code>。多一步手动，少一次意外合入。</p><p>PR 合入后，Agent 在 Issue 上评论一条总结——核心变更、PR 编号、commit hash。Issue 变成了可回溯的功能档案：Issue → PR → Commit → Code → Note，完整的一条链。</p><h2 id="8-13-实战：用-Goal-Workflow-开发网页版贪吃蛇"><a href="#8-13-实战：用-Goal-Workflow-开发网页版贪吃蛇" class="headerlink" title="8.13 实战：用 Goal Workflow 开发网页版贪吃蛇"></a>8.13 实战：用 Goal Workflow 开发网页版贪吃蛇</h2><p>本书每一章都用贪吃蛇作为实战案例。这是第七种体验——不是跑一条命令，不是写一个 Issue，而是走完一条完整流水线。</p><h3 id="8-13-1-第一步：-prd-生成需求文档"><a href="#8-13-1-第一步：-prd-生成需求文档" class="headerlink" title="8.13.1 第一步：&#x2F;prd 生成需求文档"></a>8.13.1 第一步：&#x2F;prd 生成需求文档</h3><p>在 Claude Code 中输入：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/prd 做一个贪吃蛇网页游戏。方向键控制蛇移动，吃食物变长得分，</span><br><span class="line">撞墙或撞自己结束。纯前端单文件，最高分 localStorage 持久化。</span><br></pre></td></tr></table></figure><p>Agent 追问三个澄清问题：</p><blockquote><p><strong>Q1:</strong> 游戏画布多大？我建议 400×400px，20×20 网格——桌面端和移动端都够用。<br><strong>Q2:</strong> 蛇的移动速度？推荐 150ms&#x2F;步，有挑战但不至于太快。<br><strong>Q3:</strong> 游戏结束的交互？HTML modal 弹窗 + 重新开始按钮，比 alert() 好。</p></blockquote><p>用户逐一确认。Agent 产出 <code>tasks/prd-snake-game.md</code>，核心内容：四条用户故事（移动控制、食物消费、碰撞结束、最高分持久化），八条验收标准（全部 checkbox 格式），非目标明确标注（不加难度曲线、音效、排行榜）。</p><p>因为没有跨服务改动和合规需求，跳过 <code>/prd-to-spec</code>，直接进入拆解。</p><h3 id="8-13-2-第二步：-to-issues-拆解"><a href="#8-13-2-第二步：-to-issues-拆解" class="headerlink" title="8.13.2 第二步：&#x2F;to-issues 拆解"></a>8.13.2 第二步：&#x2F;to-issues 拆解</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/to-issues tasks/prd-snake-game.md</span><br></pre></td></tr></table></figure><p>Agent 将 PRD 拆成四个 Issue，每个 Issue 的验收标准相互独立：</p><table><thead><tr><th>Issue</th><th>标题</th><th>验收标准</th><th>预估</th></tr></thead><tbody><tr><td>#1</td><td>Canvas 渲染与蛇的初始状态</td><td>20×20 网格 + 绿色蛇 + 红色食物</td><td>20min</td></tr><tr><td>#2</td><td>方向键控制与 150ms 游戏循环</td><td>四方向移动 + 禁止反向 + nextDirection 缓冲</td><td>25min</td></tr><tr><td>#3</td><td>碰撞检测与食物系统</td><td>墙壁&#x2F;自身碰撞 + 食物消费 + 随机生成不重叠</td><td>25min</td></tr><tr><td>#4</td><td>分数系统与游戏状态管理</td><td>当前分&#x2F;最高分 + modal 弹窗 + localStorage 降级</td><td>20min</td></tr></tbody></table><p>用户确认拆分合理，四个 Issue 在本地 <code>.autoresearch/issues/</code> 目录下生成。</p><h3 id="8-13-3-第三步：-goal-逐个实现"><a href="#8-13-3-第三步：-goal-逐个实现" class="headerlink" title="8.13.3 第三步：&#x2F;goal 逐个实现"></a>8.13.3 第三步：&#x2F;goal 逐个实现</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/goal .autoresearch/issues/issue-001-snake-canvas.md</span><br></pre></td></tr></table></figure><p>Agent 读取 Issue #1，分析项目结构（纯前端，无框架），生成 <code>snake-game/index.html</code>，包含 Canvas 和渲染函数。跑测试，验收标准逐条验证——网格可见 ✓，蛇初始位置正确 ✓。Issue #1 完成。</p><p>依次执行 #2、#3、#4。和第 4-7 章贪吃蛇实现不同的是，Goal Workflow 的实现过程少了一类问题：Agent 在 #2 中就实现了 <code>nextDirection</code> 缓冲机制——因为 <code>/to-issues</code> 拆解时，Agent 读 PRD 中的技术要求（&quot;键盘事件写入 nextDirection 缓冲&quot;），直接写进了 Issue #2 的验收标准里。</p><p>四个 Issue 全部实现完毕，通过，约 6 分钟。</p><h3 id="8-13-4-第四步：-review-it-审查"><a href="#8-13-4-第四步：-review-it-审查" class="headerlink" title="8.13.4 第四步：&#x2F;review-it 审查"></a>8.13.4 第四步：&#x2F;review-it 审查</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/review-it</span><br></pre></td></tr></table></figure><p>Agent 检测到分支上有未合入的 commit，运行 <code>--mode branch</code>，对比 <code>origin/main...HEAD</code>。审查发现两条：</p><blockquote><p><strong>发现 #1:</strong> <code>#3</code> 中食物随机生成逻辑在蛇身长度超过 200 格时（极端情况）会退化为线性扫描全网格——O(n²)。当前 20×20 网格不会触发，但可读性差。建议改为 Fisher-Yates 洗牌 + pick first。<strong>Auto-fix。</strong></p><p><strong>发现 #2:</strong> <code>#4</code> 中 <code>loadHighScore()</code> 的 try-catch 只处理了 <code>SecurityError</code>，没有处理 <code>QuotaExceededError</code>——Firefox 隐私模式下 <code>setItem</code> 可能抛这个异常。<strong>手动确认修复。</strong></p></blockquote><p>用户确认修复 #2。Agent 修改代码，重新跑测试——全部通过。</p><h3 id="8-13-5-第五步：-ship-it-交付"><a href="#8-13-5-第五步：-ship-it-交付" class="headerlink" title="8.13.5 第五步：&#x2F;ship-it 交付"></a>8.13.5 第五步：&#x2F;ship-it 交付</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/ship-it</span><br></pre></td></tr></table></figure><p>Agent 执行：git add + commit → push → gh pr create → squash merge → comment → close Issue。约 40 秒走完。</p><p>贪吃蛇的完整功能档案留在仓库里：<code>tasks/prd-snake-game.md</code>（为什么做）→四个 Issue（每一步要验证什么）→ PR #43（代码变更）→ <code>docs/issue#43.html</code>（设计决策记录）。</p><p>跟前面六章比，Goal Workflow 的贪吃蛇开发全程约 15 分钟，比 autoresearch 的 3 分钟写 Issue + 12 分钟自动执行总共差不多。但人在每一步之间参与了四次——PRD 确认、Issue 拆分确认、审查修复确认、交付确认。每次参与花几秒钟，换来了每一跳的质量确认。</p><h2 id="8-14-七种方法的同一个案例"><a href="#8-14-七种方法的同一个案例" class="headerlink" title="8.14 七种方法的同一个案例"></a>8.14 七种方法的同一个案例</h2><p>同一个贪吃蛇，四种方法论的对比：</p><table><thead><tr><th>维度</th><th>gstack（第 5 章）</th><th>superpowers（第 6 章）</th><th>autoresearch（第 7 章）</th><th>Goal Workflow（本章）</th></tr></thead><tbody><tr><td><strong>人类参与</strong></td><td>逐个阶段运行命令，约 2 小时</td><td>回答 5 个设计问题，约 5 分钟</td><td>写一个 Issue，约 3 分钟</td><td>每个步骤确认一下，约 8 分钟</td></tr><tr><td><strong>流程驱动</strong></td><td>人驱动（手动调用每个阶段）</td><td>Agent 驱动（自动触发 Skill）</td><td>脚本驱动（全自动）</td><td>人驱动（手动调用每个命令）</td></tr><tr><td><strong>覆盖范围</strong></td><td>从想法到交付</td><td>从设计到代码</td><td>从 Issue 到合入</td><td>从想法到上线</td></tr><tr><td><strong>控制粒度</strong></td><td>粗粒度（Sprint 阶段）</td><td>细粒度（Skill 自动触发）</td><td>无控制（全自动）</td><td>中粒度（每个命令确认一下）</td></tr><tr><td><strong>产出质量</strong></td><td>高（角色全覆盖）</td><td>中高（工程维度强）</td><td>中高（依赖 Issue 质量）</td><td>高（每个步骤有明确标准）</td></tr><tr><td><strong>最佳场景</strong></td><td>从零到一的完整项目</td><td>中等复杂度的独立功能</td><td>Issue 明确、可独立验证的功能</td><td>需要完整流程但保留控制权的项目</td></tr></tbody></table><p>Goal Workflow 的参与时间比 autoresearch 长（约 8 分钟 vs 约 3 分钟），但每个参与点都有意义——PRD 生成后确认需求正确，Issue 拆解后确认拆分合理，审查通过后确认质量满意。这些确认不是流程冗余，是质量门禁。</p><p>和第 3-7 章的关系：</p><p>SDD（第 3 章）说&quot;先规格、后代码&quot;，Goal Workflow 给了你两个生成规格的命令。SDD 的规格是人机合约，Goal Workflow 的 PRD&#x2F;SPEC 不仅是人机合约，也是流水线步骤之间的合约——PRD 定义了 <code>/to-issues</code> 的输入标准，SPEC 定义了 <code>/goal</code> 的技术约束。</p><p>Ralph Loop（第 4 章）通过 completion promise 判断&quot;做没做完&quot;——Agent 自我声明。<code>/goal</code> 通过 Issue 验收标准判断——测试结果告诉你做没做完。前者适合验收标准就是一句话的简单任务，后者适合 checkbox 列表的结构化任务。</p><p>gstack（第 5 章）和 Goal Workflow 都是串行流程——七个 Sprint 阶段 vs 七个流水线步骤。核心区别在谁驱动。gstack 是角色驱动（&quot;你是一个产品经理&quot;），Goal Workflow 是命令驱动（&quot;现在生成 PRD&quot;）。前者适合不知道标准流程的开发者，后者适合知道每一步该做什么、只需要工具加速的开发者。</p><p>autoresearch（第 7 章）是同一个作者的另一种设计哲学——脚本驱动，你写 Issue，脚本跑 Agent，评分，合入。Goal Workflow 是人驱动——你调命令，Agent 执行，你确认。前者追求自动化程度，后者追求控制力。</p><h2 id="8-15-适用边界"><a href="#8-15-适用边界" class="headerlink" title="8.15 适用边界"></a>8.15 适用边界</h2><p>Goal Workflow 是为中小型项目设计的。从功能规划到上线一条龙，每个步骤有明确的质量标准，不需要自己设计流程。PRD 和 SPEC 天然适合多人协同——它们是产品和研发之间、前端和后端之间、开发和审查之间的合约。</p><p><img src="/images/image-20260531065006660.png"></p><p>如果你不信任全自动——autoresearch 的&quot;一觉醒来一排 merged&quot;让你不安——Goal Workflow 就是给你的。每个步骤结束时审核产出，通过再推进。如果你接手了一个没有文档的老项目，<code>/code-to-spec</code> 快速生成技术说明，然后走标准流水线规划改动。</p><p>但它不是万能药。</p><p>改个按钮颜色走 <code>/prd</code> → <code>/to-issues</code> → <code>/goal</code> → <code>/review-it</code> → <code>/ship-it</code>，流程成本高于实现成本。Pocock Skills 或直接让 Agent 修更合适。探索性原型——&quot;试试这个方案行不行&quot;——需要人的判断，不适合规格化流水线。紧急热修复更不行——流水线是串行的，每步都要人确认，线上故障等不了。</p><p>最常被问到的问题：Goal Workflow 和 autoresearch 怎么选？</p><p>选 Goal Workflow，如果你想要控制。每一步做完你看一眼。PRD 写偏了你马上纠正。Issue 拆大了你拆开。审查发现的问题你决定修不修。</p><p>选 autoresearch，如果你想要时间。Issue 写好后放手，十几分钟后回来看结果。信任 Agent 的判断——信任它不会在验收标准上摇摆，信任多 Agent 审查能覆盖盲区。</p><p>两者不互斥。你可以用 <code>/prd</code> + <code>/to-issues</code> 生成 Issue，丢进 autoresearch 全自动实现。也可以用 <code>/prd</code> + <code>/to-issues</code> + <code>/goal</code> 手动实现前几个关键 Issue，再 autoresearch 批量跑剩下的。流水线是模块化的——每一环都能独立使用。</p><h2 id="8-16-本章小结"><a href="#8-16-本章小结" class="headerlink" title="8.16 本章小结"></a>8.16 本章小结</h2><p>把第 4-8 章放在一起看，五条路线对应五种研发组织模式。Ralph Loop 是循环自治——Agent 反复迭代到正确。gstack 是角色治理——二十三个虚拟角色覆盖质量全维度。superpowers 是技能触发——Agent 自动激活对的工具。autoresearch 是全自动流水线——人类只定义目标。Goal Workflow 是手动流水线——人类推一下，Agent 走一步，每一步的质量都经过人的确认。</p><p>没有高下之分。它们都在回答同一个问题：在 AI 能写代码的时代，人应该做什么？</p><p>autoresearch 的回答是：人定义目标，然后放手。Goal Workflow 的回答是：人定义每个阶段的&quot;做好&quot;，然后确认。前者相信你一次能写清楚，后者相信你看了才知道对不对。</p><p>选哪个，取决于你对自己&quot;能一次写清楚到什么程度&quot;和&quot;愿意参与多少步骤&quot;的诚实判断。</p><p>下一章讲方法论对比与融合。前八章讲了八种方法论，各有优劣，互有重叠。第 9 章把八条路放在一起，帮你找到最适合自己的那条——或者把几条路拼在一起。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/goal-workflow-goal-driven-rd-loop/</id>
    <link href="https://colobu.com/2026/06/28/goal-workflow-goal-driven-rd-loop/"/>
    <published>2026-06-28T03:30:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>&quot;你只需描述功能想法，剩下的交给工作流。&quot;</p>
<p>——smallnest, Goal Workflow 作者, 2026 年 5月</p>
</blockquote>
<p>三条路。gstack 覆盖从需求到交付，但你得手动驱动每个阶段。superpowers 覆盖从设计到代码，但止步于开发分支。autoresearch 覆盖从 Issue 到合入，但它假设 Issue 已经存在。每条路都只解了一段。</p>
<p>实际项目不是这样的。实际项目从一句&quot;我想做一个东西&quot;开始。然后你要搞清楚它是什么、设计它怎么做、拆成小块、逐块实现、审查代码、记录决策、最后合入上线。七个动作，缺一个就是断点。每个断点都是你手动接续的地方。</p>
<p>Goal Workflow 做的事就是把这些断点接上。不是做一个更强的 &#x2F;goal 命令。是做一条流水线——七个斜杠命令，首尾相连，从 PRD 到上线。</p>]]>
    </summary>
    <title>Goal Workflow：目标驱动的研发闭环</title>
    <updated>2026-06-28T06:46:22.010Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="自动化开发" scheme="https://colobu.com/tags/%E8%87%AA%E5%8A%A8%E5%8C%96%E5%BC%80%E5%8F%91/"/>
    <category term="autoresearch" scheme="https://colobu.com/tags/autoresearch/"/>
    <content>
      <![CDATA[<blockquote><p>「你只需负责喝茶和睡觉。一觉醒来，Features 全自动高质量的实现了。」</p><p>——smallnest, autoresearch 作者, 2026 年</p></blockquote><p>gstack 是人驱动流程，二十三个角色在七个 Sprint 阶段中协作。superpowers 是 Agent 驱动流程，十四个 Skill 自动触发，子 Agent 分工实现。两条路，一个共同点：人类仍然在循环中。gstack 需要你在每个阶段运行命令。superpowers 需要你在设计批准时确认方案。</p><p>autoresearch 把这个共同点也推倒了。</p><p>它的目标一句话就能说清楚：从 Issue 到合入，全程不需要人。你写好 Issue，Agent 自己实现、自己审查、自己修复、自己提 PR、自己合入、自己关 Issue。你喝茶。你睡觉。醒来看到一排绿色的 merged。</p><p>Karpathy 的 autoresearch 思想在软件工程领域落地了——82K Stars 的 ML 研究自动化项目，被 smallnest 适配成了通用的全自动开发工具。</p><span id="more"></span><h2 id="7-1-起源：从-GPU-训练到软件工程"><a href="#7-1-起源：从-GPU-训练到软件工程" class="headerlink" title="7.1 起源：从 GPU 训练到软件工程"></a>7.1 起源：从 GPU 训练到软件工程</h2><p>2026 年 3 月，Andrej Karpathy 在 GitHub 上发布了一个叫 autoresearch 的项目。代码没多少——核心是一个循环控制脚本。但思路极其大胆：让 AI Agent 在循环中自主做 ML 研究实验——自己改超参数、自己跑训练、自己看结果、自己决定下一步改什么。人类设定目标后就放手。</p><p>82,649 Stars。社区炸了。</p><p>不是因为代码复杂。是因为它第一次把「自主循环」从工程执行层面推到了研究决策层面。Ralph Loop 让 AI 反复改代码直到测试通过——执行层面的自主。autoresearch 让 AI 自己决定「接下来该尝试什么方向」——决策层面的自主。</p><p>但 Karpathy 的 autoresearch 面向的是 ML 训练场景——单 GPU 上的 nanochat 训练实验。smallnest 看到了另一种可能：把这个模式搬到通用软件工程上。</p><p><img src="/images/image-20260530013613746.png"></p><p>2026 年 4 月，smallnest&#x2F;autoresearch 发布。517 Stars，远不如原版。野心却大得多——不做「让 AI 自己做 ML 实验」，做「让 AI 自己做完整个软件开发流程」。</p><p>两个关键改造。第一，把自主循环的主体从单 Agent 变成了多 Agent 轮转——Claude Code 实现，Claude Code 审查，Codex 优化，Codex 再审查，OpenCode 再优化，OpenCode 再审查，不同模型交叉实现和审核。第二，把目标载体从实验配置变成了 Issue——GitHub Issue、本地 Markdown 文件、百度 iCafe 卡片、阿里云效 Codeup，四种来源，一套流程。Issue 就是任务合约。验收标准写在 Issue 里，autoresearch 读到，自己判断做完没有。</p><p><img src="/images/image-20260531042122802.png"></p><h2 id="7-2-安装与使用：一条-clone-命令，从-Issue-开始"><a href="#7-2-安装与使用：一条-clone-命令，从-Issue-开始" class="headerlink" title="7.2 安装与使用：一条 clone 命令，从 Issue 开始"></a>7.2 安装与使用：一条 clone 命令，从 Issue 开始</h2><p>autoresearch 的安装只有一步——<code>git clone</code>。不需要 npm、不需要 pip、不需要构建。安装之后，唯一的交互就是传给它一个 Issue 编号。</p><h3 id="7-2-1-依赖与前提"><a href="#7-2-1-依赖与前提" class="headerlink" title="7.2.1 依赖与前提"></a>7.2.1 依赖与前提</h3><p>autoresearch 是胶水层——它不自己写代码，它调度其他 Agent 写代码。所以前提条件就是你至少装了一个它支持的 Agent CLI。五个 Agent 对应五条验证命令：</p><table><thead><tr><th>Agent</th><th>CLI 检查</th><th>角色</th></tr></thead><tbody><tr><td>Claude Code</td><td><code>which claude</code></td><td>默认实现 + 审查</td></tr><tr><td>OpenAI Codex</td><td><code>which codex</code></td><td>审查 + 修复 + 优化</td></tr><tr><td>OpenCode</td><td><code>which opencode</code></td><td>审查 + 修复</td></tr><tr><td>Claude-Mimo</td><td><code>which claude-mimo</code></td><td>审查 + 修复（fallback 到 claude.md）</td></tr><tr><td>DeepSeek</td><td><code>which deepseek-tui</code></td><td>审查 + 修复</td></tr></tbody></table><p>对于 GitHub 模式（默认），还需要 <code>gh auth status</code> 通过。百度 iCafe 模式需要 <code>icafe-cli whoami</code> 和 <code>icode-cli whoami</code>。阿里云效 Codeup 模式需要 <code>curl</code>。</p><p>autoresearch 本身没语言运行时要求——<code>run.sh</code> 是 bash 脚本。但你的项目必须有对应语言的构建工具（Go&#x2F;Node&#x2F;Python&#x2F;Rust&#x2F;Java），因为硬门禁要跑 build 和 test。</p><h3 id="7-2-2-安装"><a href="#7-2-2-安装" class="headerlink" title="7.2.2 安装"></a>7.2.2 安装</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> git@github.com:smallnest/autoresearch.git</span><br></pre></td></tr></table></figure><p>不需要 <code>./setup</code>、不需要 <code>./configure</code>、不需要 <code>make install</code>。<code>autoresearch/run.sh</code> 是唯一入口——从你的项目目录调用它，脚本自动寻找项目根目录、自动检测 Git 平台、自动选择对应的 Agent CLI。</p><h3 id="7-2-3-基础使用"><a href="#7-2-3-基础使用" class="headerlink" title="7.2.3 基础使用"></a>7.2.3 基础使用</h3><p>最小用法——在当前项目目录中处理一个 GitHub Issue：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">autoresearch/run.sh 10</span><br></pre></td></tr></table></figure><p>Agent 做的事：<code>gh issue view 10</code> 读取 Issue → 第一个 Agent 初始实现 → 后面 Agent 轮流审查修复 → Build&#x2F;Lint&#x2F;Test 全通过 → LLM 评分 ≥ 85 → <code>gh pr create</code> → squash merge → 评论总结 → <code>gh issue close 10</code>。</p><p>指定项目路径和最大迭代轮数：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">autoresearch/run.sh -p /path/to/project 10 16</span><br></pre></td></tr></table></figure><p>Issue #10，最多 16 轮（默认不限，但项目内置了连续失败停止阈值 <code>MAX_CONSECUTIVE_FAILURES=3</code>）。</p><h3 id="7-2-4-Agent-配置与模型选择"><a href="#7-2-4-Agent-配置与模型选择" class="headerlink" title="7.2.4 Agent 配置与模型选择"></a>7.2.4 Agent 配置与模型选择</h3><p><code>-a</code> 参数指定用哪些 Agent 和调用顺序：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">autoresearch/run.sh -a claude,codex,opencode 10</span><br></pre></td></tr></table></figure><p>第一个 Agent（claude）做初始实现，后续迭代按 <code>(iter − 1) % N</code> 轮转——Claude 实现 → Codex 审查修复 → OpenCode 审查修复 → Claude 再修复，循环下去。不指定 <code>-a</code> 时默认就是这三个。</p><p>每个 Agent 的 prompt 模板在仓库 <code>agents/*.md</code> 中，可被项目级 <code>.autoresearch/agents/*.md</code> 覆盖——不同项目可以给同一个 Agent 不同的行为指令。</p><p>模型层面也可以调。全局指定所有 Agent 用 Opus：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AGENT_MODEL=opus autoresearch/run.sh 10</span><br></pre></td></tr></table></figure><p>或者每个 Agent 不同：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AGENT_MODEL_CLAUDE=sonnet AGENT_MODEL_CODEX=gpt-5.2 autoresearch/run.sh 10</span><br></pre></td></tr></table></figure><p>Claude 跑 Sonnet 降低成本，Codex 跑 GPT-5.2 提供不同的审查视角。</p><h3 id="7-2-5-Continue-模式"><a href="#7-2-5-Continue-模式" class="headerlink" title="7.2.5 Continue 模式"></a>7.2.5 Continue 模式</h3><p>autoresearch 的状态保存在迭代日志中。API 挂了、网络断了、机器重启，回来继续：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">autoresearch/run.sh -c 42 10</span><br></pre></td></tr></table></figure><p>从 Issue #42 上次中断的迭代继续，再跑最多 10 轮。不从零开始。</p><h3 id="7-2-6-本地-Issue-模式"><a href="#7-2-6-本地-Issue-模式" class="headerlink" title="7.2.6 本地 Issue 模式"></a>7.2.6 本地 Issue 模式</h3><p>不需要 GitHub。Issue 写成本地 <code>.md</code> 文件，autoresearch 读文件、写代码到本地分支、结果追加回文件末尾：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p .autoresearch/issues</span><br><span class="line"><span class="built_in">cat</span> &gt; .autoresearch/issues/issue-008-add-login.md &lt;&lt; <span class="string">&#x27;EOF&#x27;</span></span><br><span class="line"><span class="comment"># Add login feature</span></span><br><span class="line">实现用户登录功能，支持邮箱+密码登录。</span><br><span class="line"></span><br><span class="line"><span class="comment">## 验收标准</span></span><br><span class="line">- [ ] 登录页有邮箱和密码两个输入框</span><br><span class="line">- [ ] 输入正确凭据后跳转到首页</span><br><span class="line">- [ ] 输入错误凭据后显示错误提示</span><br><span class="line">- [ ] 登录状态用 JWT 存储在 localStorage</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">autoresearch/run.sh --issues-dir=.autoresearch/issues 8</span><br></pre></td></tr></table></figure><p>命名规则：<code>issue-NNN-描述.md</code>，三位数字。<code>run.sh 8</code> 匹配 <code>issue-008-*.md</code> 或 <code>issue-8-*.md</code>。结果（评分、迭代轮数、分支名、时间戳）追加到文件末尾的 <code>---</code> 分隔线之后。适合内网项目、个人项目、不想连 GitHub API 的场景。</p><h3 id="7-2-7-多平台"><a href="#7-2-7-多平台" class="headerlink" title="7.2.7 多平台"></a>7.2.7 多平台</h3><p>autoresearch 根据 Git remote 自动检测平台，四种模式一套命令：</p><table><thead><tr><th>平台</th><th>检测条件</th><th>Issue 来源</th><th>PR&#x2F;MR</th></tr></thead><tbody><tr><td>GitHub</td><td>默认</td><td><code>gh issue view</code></td><td>PR → merge → close</td></tr><tr><td>本地</td><td>本地文件匹配</td><td><code>.md</code> 文件</td><td>仅本地分支</td></tr><tr><td>百度 iCafe</td><td>remote 含 <code>icode.baidu.com</code></td><td><code>icafe-cli</code></td><td>push CR + submit review</td></tr><tr><td>阿里云效 Codeup</td><td>指定 <code>--issue-source=codeup</code></td><td>REST API</td><td>MR → merge → close</td></tr></tbody></table><p>百度模式示例：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">autoresearch/run.sh --issue-source=baidu --space=cloud-iCafe 22210</span><br></pre></td></tr></table></figure><p>Codeup 模式需要 token 和组织信息：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> CODEUP_TOKEN=xxx CODEUP_ORG_ID=123 CODEUP_REPO_ID=456</span><br><span class="line">autoresearch/run.sh --issue-source=codeup 42</span><br></pre></td></tr></table></figure><p>四种模式共用同一套 Agent 轮转逻辑和质量门禁——变的只是 Issue 来源和 PR&#x2F;MR 创建方式。</p><h3 id="7-2-8-配置：program-md-与-autoresearch"><a href="#7-2-8-配置：program-md-与-autoresearch" class="headerlink" title="7.2.8 配置：program.md 与 .autoresearch&#x2F;"></a>7.2.8 配置：program.md 与 .autoresearch&#x2F;</h3><p>项目的规矩写在 <code>.autoresearch/</code> 目录中。完整结构：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">.autoresearch/</span><br><span class="line">├── program.md                 ← 实现规则（Agent 每轮读取）</span><br><span class="line">├── agents/                    ← 覆盖默认 Agent prompt</span><br><span class="line">│   ├── claude.md</span><br><span class="line">│   ├── codex.md</span><br><span class="line">│   ├── claude-mimo.md</span><br><span class="line">│   └── opencode.md</span><br><span class="line">├── issues/                    ← 本地 Issue 文件</span><br><span class="line">│   └── issue-008-*.md</span><br><span class="line">├── workflows/                 ← 迭代日志（自动生成）</span><br><span class="line">└── results.tsv                ← 处理结果汇总（自动生成）</span><br></pre></td></tr></table></figure><p><code>program.md</code> 是最核心的配置文件。内容四部分：权限边界（什么能改、什么不能改）、代码规范（通用 + 语言特定）、测试要求、提交规范。仓库自带一个多语言模板——Go、Python、Rust、TypeScript、Java 各一份。实际使用时按项目语言裁剪，删掉无关部分以降低 token 消耗。</p><h3 id="7-2-9-环境变量速查"><a href="#7-2-9-环境变量速查" class="headerlink" title="7.2.9 环境变量速查"></a>7.2.9 环境变量速查</h3><table><thead><tr><th>变量</th><th>默认值</th><th>作用</th></tr></thead><tbody><tr><td><code>PASSING_SCORE</code></td><td>85</td><td>LLM 评分达标线（0-100）</td></tr><tr><td><code>AGENT_MODEL</code></td><td>CLI 默认</td><td>所有 Agent 统一模型</td></tr><tr><td><code>AGENT_MODEL_CLAUDE</code></td><td>—</td><td>Claude 专属模型</td></tr><tr><td><code>AGENT_MODEL_CODEX</code></td><td>—</td><td>Codex 专属模型</td></tr><tr><td><code>AGENT_MODEL_OPENCODE</code></td><td>—</td><td>OpenCode 专属模型</td></tr><tr><td><code>MAX_CONSECUTIVE_FAILURES</code></td><td>3</td><td>连续失败 N 次后停止</td></tr><tr><td><code>MAX_RETRIES</code></td><td>5</td><td>单次 Agent 调用重试次数</td></tr></tbody></table><p>调整 <code>PASSING_SCORE</code> 是调质量门槛——90 更严格，80 更宽松。调整 <code>AGENT_MODEL</code> 是调成本——Sonnet 便宜但审查不如 Opus 深，按项目预算取舍。</p><h3 id="7-2-10-全量-Issue-批处理"><a href="#7-2-10-全量-Issue-批处理" class="headerlink" title="7.2.10 全量 Issue 批处理"></a>7.2.10 全量 Issue 批处理</h3><p>不止单个 Issue。<code>run_all.sh</code> 可以一批处理全部开放 Issue：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">autoresearch/run_all.sh --issue-source=codeup --codeup-token=xxx --codeup-org=123 --codeup-repo=456</span><br></pre></td></tr></table></figure><p>晚上把十几个 Issue 丢给 <code>run_all.sh</code>，早上看 <code>results.tsv</code>——哪些通过了、哪些还在迭代、哪些失败了。人的时间用在判断结果上，不在盯着 Agent 上。</p><h2 id="7-3-核心架构：四个机制撑起全自动"><a href="#7-3-核心架构：四个机制撑起全自动" class="headerlink" title="7.3 核心架构：四个机制撑起全自动"></a>7.3 核心架构：四个机制撑起全自动</h2><p>autoresearch 的架构不复杂。核心就是四个机制叠在一起。</p><h3 id="7-3-1-多-Agent-轮转：让不同模型互相审查"><a href="#7-3-1-多-Agent-轮转：让不同模型互相审查" class="headerlink" title="7.3.1 多 Agent 轮转：让不同模型互相审查"></a>7.3.1 多 Agent 轮转：让不同模型互相审查</h3><p>这是 autoresearch 和 Ralph Loop 最根本的差异。Ralph Loop 是单 Agent 反复迭代——同一个模型反复读自己的代码、改自己的代码、判自己的代码。问题很明显：模型的盲区是固定的。它看不出来的问题，迭代一百次还是看不出来。</p><p>autoresearch 换了一种模式。它支持五个 Agent——Claude Code、Codex、OpenCode、Claude-Mimo、DeepSeek。你通过 <code>-a</code> 参数指定用哪几个、按什么顺序。</p><p><img src="/images/image-20260531010044594.png"></p><p>轮转公式很简单：<code>(iter − 1) % N</code>。第一个 Agent 做初始实现。第二个 Agent 审查第一个的产出，发现问题就修。第三个 Agent 审查第二个修完的结果，再发现问题再修。以此类推，循环轮转。</p><p>不同模型有不同盲区。Claude 容易漏掉的东西，Codex 可能一眼就看到。Codex 的代码风格问题，OpenCode 可能立刻揪出来。三个模型交叉审核的覆盖面，远超单模型自我审查十轮。这和代码审查中多 reviewer 的效果优于单人反复 self-review 是一个道理——只不过 reviewer 从人类换成了不同的 AI 模型。</p><h3 id="7-3-2-Issue-驱动：验收标准即合约"><a href="#7-3-2-Issue-驱动：验收标准即合约" class="headerlink" title="7.3.2 Issue 驱动：验收标准即合约"></a>7.3.2 Issue 驱动：验收标准即合约</h3><p>autoresearch 的一切从 Issue 开始。GitHub Issue、本地 <code>.md</code> 文件、百度 iCafe 卡片、阿里云效 Codeup——四选一，自动检测。</p><p>Issue 是合约。验收标准写在 Issue 里（checkbox 格式），Agent 读到就知道什么叫「做完了」。这和第 3 章 SDD 的核心理念一致：先在规格上达成一致，再写代码。区别在于 SDD 是人类和 AI 之间的合约，autoresearch 把它变成了 AI 和自己之间的合约——Agent 自己读验收标准，自己判断是否满足，不满足就继续迭代。</p><p><img src="/images/image-20260531010339852.png"></p><p>单 Issue 执行流程分五个阶段：</p><ol><li><strong>解析阶段</strong>：读取 Issue，提取标题、描述、验收标准</li><li><strong>规划阶段</strong>：自动拆分子任务（如果 Issue 足够复杂）</li><li><strong>实现阶段</strong>：首个 Agent 初始实现 → 轮转审查 → 修复</li><li><strong>质量门禁</strong>：Build&#x2F;Lint&#x2F;Test 全部通过 + LLM 评分 ≥ 85</li><li><strong>收尾阶段</strong>：创建 PR → 合并 → 评论 → 关闭 Issue</li></ol><p>五个阶段全自动。人只做了一件事——写 Issue。</p><h3 id="7-3-3-双轨质量门禁：硬门禁-软门禁"><a href="#7-3-3-双轨质量门禁：硬门禁-软门禁" class="headerlink" title="7.3.3 双轨质量门禁：硬门禁 + 软门禁"></a>7.3.3 双轨质量门禁：硬门禁 + 软门禁</h3><p>autoresearch 的质量保证分两层。</p><p><strong>硬门禁</strong>：Build、Lint、Test 必须全部通过。这是确定性检查——过了就是过了，没过就是没过，没有任何模糊空间。和第 6 章 superpowers 的 <code>verification-before-completion</code> 做的事一样——代码能跑是最低门槛。</p><p><strong>软门禁</strong>：LLM 评分 ≥ 85 分。这是语义质量评估——不看代码能不能跑，看代码写得好不好。评分分五个维度，加权计算：</p><table><thead><tr><th>维度</th><th>权重</th><th>检查内容</th></tr></thead><tbody><tr><td><strong>正确性</strong></td><td>35%</td><td>功能是否符合 Issue 需求、边界和错误是否处理、有无逻辑错误和并发问题</td></tr><tr><td><strong>测试质量</strong></td><td>25%</td><td>核心逻辑是否被测试覆盖、边界和错误路径有无测试、用例命名是否清晰</td></tr><tr><td><strong>代码质量</strong></td><td>20%</td><td>命名是否清晰、结构是否合理、是否遵循项目规范、有无重复代码</td></tr><tr><td><strong>安全性</strong></td><td>10%</td><td>有无注入风险、有无敏感信息泄露、输入验证是否完备</td></tr><tr><td><strong>性能</strong></td><td>10%</td><td>有无明显性能问题、有无不必要的内存分配、并发控制是否合理</td></tr></tbody></table><p>每个维度按问题严重程度给分：无问题 100 分，有建议改进 90 分，有一般问题 70 分，有严重问题 40 分，有致命问题 10 分。加权总分 &#x3D; 各维度得分 × 权重之和。默认达标线 85 分，可通过 <code>PASSING_SCORE</code> 环境变量调整。</p><p>测试质量维度有一个豁免规则：如果项目类型不适用单元测试（Shell 脚本、配置文件等），该维度默认 100 分，审核者需注明豁免原因。</p><p>双轨设计回答了传统 CI 的一个长期缺陷：CI 只能检查「能不能跑」，不能检查「写得好不好」。一个测试全绿的代码库仍然可能是一团不可维护的浆糊。硬门禁保证下限，软门禁拉高上限。未达标就进入下一轮迭代——换一个 Agent 重新审查和修复。</p><h3 id="7-3-4-program-md：编码在文件里的规矩"><a href="#7-3-4-program-md：编码在文件里的规矩" class="headerlink" title="7.3.4 program.md：编码在文件里的规矩"></a>7.3.4 program.md：编码在文件里的规矩</h3><p>每个项目有自己的规矩——代码风格、架构约束、技术选型。autoresearch 提供了一个 <code>program.md</code> 文件，把这些规矩写下来，Agent 在实现 Issue 时自动读取。</p><p>内容包括四部分：权限边界（什么能改、什么不能改）、代码规范（通用 + 语言特定）、测试要求、提交规范。支持 Go、Python、Rust、TypeScript、Java 的多语言模板。放到项目的 <code>.autoresearch/program.md</code> 下，Agent 自己读，自己遵守。</p><p>这和第 1 章「用结构化知识驾驭非结构化 AI 能力」一脉相承。program.md 就是结构化知识——可复用、可迭代、可版本控制。Agent 每轮读取它，就相当于每次都被同样的规矩约束一次。规矩不是靠人盯着执行的，是靠文件自动注入的。</p><h2 id="7-4-工作流全景"><a href="#7-4-工作流全景" class="headerlink" title="7.4 工作流全景"></a>7.4 工作流全景</h2><h3 id="7-4-1-从-PRD-到合入的完整链路"><a href="#7-4-1-从-PRD-到合入的完整链路" class="headerlink" title="7.4.1 从 PRD 到合入的完整链路"></a>7.4.1 从 PRD 到合入的完整链路</h3><p>autoresearch 和 Goal Workflow（第 8 章）连在一起，构成完整的端到端流水线：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/prd 生成 PRD → 拆分为细粒度 Issue → autoresearch 逐个实现 → 全部合入</span><br></pre></td></tr></table></figure><p>用 <code>/prd</code> 生成交付需求文档。让 Agent 基于 PRD 拆分成细粒度 Issue——每个 Issue 小到可以在单次开发会话中完成，有明确的 checkbox 验收标准，标注依赖关系。然后 autoresearch 逐个吞下这些 Issue，自动实现、审查、合入。</p><p>smallnest 在自己的 Desktop App 项目上验证过这条链路：19 个 Issue（#22 到 #40），从 PRD 到全部实现，全自动。</p><h3 id="7-4-2-Continue-模式与容错"><a href="#7-4-2-Continue-模式与容错" class="headerlink" title="7.4.2 Continue 模式与容错"></a>7.4.2 Continue 模式与容错</h3><p>全自动系统必须能处理异常。autoresearch 有三层容错：</p><ul><li><code>-c</code> 标志：从上次中断的迭代继续执行。API 挂了、网络断了、机器重启了——回来继续，不从头开始。</li><li>连续失败停止阈值：同一个 Issue 连续失败 N 次后自动停止，不发散消耗资源。</li><li>单次 Agent 调用重试：应对 API 临时故障，不是一次调用失败就终止整个流程。</li></ul><h2 id="7-5-多平台支持"><a href="#7-5-多平台支持" class="headerlink" title="7.5 多平台支持"></a>7.5 多平台支持</h2><p>autoresearch 的跨平台适配覆盖四种研发场景，而非笼统的「支持多种 Git 平台」。</p><p><strong>GitHub 模式</strong>：默认。依赖 <code>gh</code> CLI，自动 push → 创建 PR → Squash Merge → 评论总结 → 关闭 Issue。</p><p><strong>本地 Issue 模式</strong>：不需要 GitHub，不需要网络。Issue 文件放在 <code>.autoresearch/issues/issue-NNN-描述.md</code>，Agent 读本地文件，代码提交到本地分支，结果追加到 Issue 文件末尾。适合内网项目、个人项目、不想开 GitHub Issue 的场景。</p><p><strong>百度 iCafe + iCode 模式</strong>：适配百度内部研发体系。Git remote 包含 <code>icode.baidu.com</code> 时自动切换。用 <code>icafe-cli</code> 读卡片，用 <code>icode-cli</code> 提交代码审查，评分 +2 后合入，自动关闭卡片。</p><p><strong>阿里云效 Codeup 模式</strong>：通过 REST API 操作 Issue、MR、合并、评论。适合使用阿里云效的企业团队。</p><p>四种模式，一套流程。Agent 根据 Git remote 和本地文件自动检测切换。人不需要记住「当前项目是什么模式」。</p><h2 id="7-6-实战：用-autoresearch-开发网页版贪吃蛇"><a href="#7-6-实战：用-autoresearch-开发网页版贪吃蛇" class="headerlink" title="7.6 实战：用 autoresearch 开发网页版贪吃蛇"></a>7.6 实战：用 autoresearch 开发网页版贪吃蛇</h2><p>同一个贪吃蛇。第六种体验。</p><p>不打开 Claude Code 手动交互。不回答 brainstorming 的五个问题。不确认设计方案。</p><p>写一个 Issue，然后放手。</p><h3 id="7-6-1-准备：把需求写成-Issue"><a href="#7-6-1-准备：把需求写成-Issue" class="headerlink" title="7.6.1 准备：把需求写成 Issue"></a>7.6.1 准备：把需求写成 Issue</h3><blockquote><p>因为是重点要介绍autoresearch中代码实现阶段，所以这个例子中issue是手工创建的,你也可以使用&#x2F;prd生成需求文档，拆解Issues。</p></blockquote><p>在项目仓库中创建一个本地 Issue 文件：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">.autoresearch/issues/issue-001-snake-game.md</span><br></pre></td></tr></table></figure><p>内容：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># 网页版贪吃蛇游戏</span></span><br><span class="line"></span><br><span class="line">纯前端单文件 HTML/CSS/JS 实现，不依赖任何框架。</span><br><span class="line"></span><br><span class="line"><span class="section">## 验收标准</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> [ ] 打开 index.html 后能看到 20x20 网格和一条初始长度为 3 的绿色蛇</span><br><span class="line"><span class="bullet">-</span> [ ] 方向键控制蛇移动，不能反向（向右时按左键无效）</span><br><span class="line"><span class="bullet">-</span> [ ] 随机位置出现红色食物，蛇头碰到食物后蛇身变长 1 格，食物刷新</span><br><span class="line"><span class="bullet">-</span> [ ] 撞墙或撞到自己 → 游戏结束，HTML modal 弹窗显示得分</span><br><span class="line"><span class="bullet">-</span> [ ] 按空格键重新开始，游戏重置为初始状态</span><br><span class="line"><span class="bullet">-</span> [ ] 最高分用 localStorage 持久化，刷新页面后仍在</span><br><span class="line"><span class="bullet">-</span> [ ] 隐私模式下 localStorage 不可用时优雅降级（try-catch，默认最高分 0）</span><br><span class="line"><span class="bullet">-</span> [ ] 游戏循环用 requestAnimationFrame + 手动计时（初始 150ms/步），不用 setInterval</span><br><span class="line"></span><br><span class="line"><span class="section">## 技术要求</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> 单文件 snake-game/index.html</span><br><span class="line"><span class="bullet">-</span> 状态层（gameState 对象）和渲染层（Canvas 绘制）分离</span><br><span class="line"><span class="bullet">-</span> 键盘事件写入 nextDirection 缓冲，gameLoop 在 update() 中同步到 direction</span><br><span class="line"><span class="bullet">-</span> test.html 覆盖全部验收标准</span><br></pre></td></tr></table></figure><p>然后一行命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">autoresearch/run.sh --issues-dir=.autoresearch/issues 1</span><br></pre></td></tr></table></figure><p>人做的事做完了。下面是 Agent 的事。</p><h3 id="7-6-2-执行：三个-Agent-轮转四轮"><a href="#7-6-2-执行：三个-Agent-轮转四轮" class="headerlink" title="7.6.2 执行：三个 Agent 轮转四轮"></a>7.6.2 执行：三个 Agent 轮转四轮</h3><p>配置用了三个 Agent：Claude Code、Codex、OpenCode。最大迭代 8 轮，LLM 评分达标线 85。</p><p><strong>第 1 轮（Claude Code，初始实现）</strong>：Claude 读 Issue，拆成四个子任务——HTML 结构与 Canvas 渲染、游戏循环与状态管理、碰撞检测与食物系统、分数系统与 UI 状态。依次实现，产出一个完整的 <code>snake-game/index.html</code> 和 <code>test.html</code>。跑测试——8 个用例，6 个通过，2 个失败：食物偶尔生成在蛇身上，modal 弹窗出现后方向键仍能控制蛇。Build 通过。Lint 通过。LLM 自评 72 分。不达标，进入第 2 轮。</p><p><strong>第 2 轮（Codex，审查修复）</strong>：Codex 拿到 Claude 的代码和测试结果。审查发现三个问题：食物随机生成没检查蛇身重叠、gameLoop 用了 <code>setInterval</code> 而非 <code>requestAnimationFrame</code>、游戏结束时没拦截键盘事件。Codex 逐一修复。跑测试——8&#x2F;8 通过。LLM 评分 82。不达标，但方向是对的，进入第 3 轮。</p><p><strong>第 3 轮（OpenCode，审查修复）</strong>：OpenCode 发现 Codex 修复键盘拦截时只处理了方向键，没处理空格键——游戏结束按空格也能重置，但重置后蛇立刻开始移动（因为空格键事件没被阻止冒泡）。还发现 localStorage 读写没包 try-catch，隐私模式会崩。修复后测试 8&#x2F;8 通过。LLM 评分 88。达标。</p><p><strong>第 4 轮（质量确认）</strong>：评分达标后 autoresearch 自动跑最终验证——Build、Lint、Test 全部通过。自动创建 commit（Conventional Commits 格式），推送到分支 <code>autoresearch/issue-001</code>。因为是本地 Issue 模式，结果追加到 Issue 文件末尾，分支保留在本地。</p><p>全过程约十二分钟，零人工干预。第 6 章 superpowers 实战中人类还参与了两次——回答问题、确认方案。autoresearch 实战中人类只做了一件事：写 Issue。第 4 章 Ralph Loop 实战中第 3 轮才抓到的 modal 焦点问题，autoresearch 在第 2 轮就被 Codex 抓到了。不是 Claude 比 Ralph Loop 的 Agent 聪明——多 Agent 交叉审查覆盖了单 Agent 的盲区。</p><h3 id="7-6-3-和第-5、6-章的对比"><a href="#7-6-3-和第-5、6-章的对比" class="headerlink" title="7.6.3 和第 5、6 章的对比"></a>7.6.3 和第 5、6 章的对比</h3><p>同一个贪吃蛇，三种方法论：</p><table><thead><tr><th>维度</th><th>gstack（第 5 章）</th><th>superpowers（第 6 章）</th><th>autoresearch（本章）</th></tr></thead><tbody><tr><td><strong>人类参与</strong></td><td>逐个阶段运行命令，约 2 小时</td><td>回答 5 个设计问题，约 5 分钟</td><td>写一个 Issue，约 3 分钟</td></tr><tr><td><strong>Agent 模型</strong></td><td>多角色但同一 Agent</td><td>子 Agent 分工，主 Agent 协调</td><td>多 Agent 轮转交叉审核</td></tr><tr><td><strong>审查方式</strong></td><td>4 个角色分维度审查</td><td>子 Agent 两阶段审查（规格+质量）</td><td>不同模型交叉审查 + LLM 评分</td></tr><tr><td><strong>质量门禁</strong></td><td>PreToolUse hooks</td><td>HARD-GATE 认知门控</td><td>硬门禁（Build&#x2F;Lint&#x2F;Test）+ 软门禁（评分 ≥ 85）</td></tr><tr><td><strong>交付方式</strong></td><td>手动 <code>/ship</code></td><td>手动选择合入方式</td><td>全自动 PR → 合入 → 关 Issue</td></tr><tr><td><strong>最佳场景</strong></td><td>从零到一的完整项目</td><td>中等复杂度的独立功能</td><td>Issue 明确、可独立验证的功能</td></tr></tbody></table><p>autoresearch 的时间最短（十二分钟），人类参与最少（三分钟）。但它的上限也最依赖输入质量——Issue 里验收标准写得好不好，直接决定最终产出。写得模糊，Agent 在「做没做完」这个问题上就会反复摇摆。写得精确（checkbox 格式、可验证条件），Agent 自己就能判断。</p><h2 id="7-7-与-Ralph-Loop-的对比"><a href="#7-7-与-Ralph-Loop-的对比" class="headerlink" title="7.7 与 Ralph Loop 的对比"></a>7.7 与 Ralph Loop 的对比</h2><p>autoresearch 和 Ralph Loop 都解决「让 Agent 自主完成工作」的问题，但思路完全不同。</p><table><thead><tr><th>维度</th><th>autoresearch</th><th>Ralph Loop</th></tr></thead><tbody><tr><td><strong>驱动方式</strong></td><td>Issue + checkbox 验收标准</td><td>prompt 文件（.md）</td></tr><tr><td><strong>Agent 模型</strong></td><td>多 Agent 轮转交叉审核</td><td>单 Agent 反复迭代</td></tr><tr><td><strong>质量判断</strong></td><td>硬门禁（Build&#x2F;Lint&#x2F;Test）+ 软门禁（LLM 评分 ≥ 85）</td><td>completion promise 短语匹配</td></tr><tr><td><strong>审查机制</strong></td><td>不同模型交叉审查</td><td>同一模型自我审查</td></tr><tr><td><strong>端到端</strong></td><td>Issue → PR → 合并 → 关闭（全自动闭环）</td><td>止步于代码完成</td></tr><tr><td><strong>容错</strong></td><td>continue 模式 + 连续失败停止 + 调用重试</td><td>max-iterations 安全阀</td></tr><tr><td><strong>多平台</strong></td><td>GitHub &#x2F; 本地 &#x2F; iCafe &#x2F; Codeup</td><td>依赖 Claude Code Stop Hook</td></tr></tbody></table><p>两者的关系不是替代，是递进。Ralph Loop 是「一个任务反复做到对」。autoresearch 是「一个 Issue 从头做到尾，不同模型轮流做」。后者多了两层东西：多 Agent 交叉审核覆盖盲区，端到端闭环减少人工操作。代价是配置更复杂——需要安装多个 Agent CLI，需要设置 <code>program.md</code>，需要理解轮转逻辑。</p><p>选哪个？任务简单、验收标准可以写成 completion promise——Ralph Loop 更轻。任务复杂、需要多角度审查、需要端到端自动化——autoresearch 更完整。</p><h2 id="7-8-设计哲学：三个「优于」"><a href="#7-8-设计哲学：三个「优于」" class="headerlink" title="7.8 设计哲学：三个「优于」"></a>7.8 设计哲学：三个「优于」</h2><p>autoresearch 的设计背后有三条价值判断。</p><p><strong>「交叉审核」优于「反复迭代」。</strong> 单模型反复改自己的代码，能纠正语法错误和逻辑 bug，但改不了思维惯性——它觉得「这样写没问题」的地方，迭代多少次都不会改。换一个模型来审查，同样的代码会被不同「审美」重新评估。这和人类代码审查中「多个 reviewer 审同一段代码」的效果一致——每个人（每个模型）看到的都是不同的东西。</p><p><strong>「双轨门禁」优于「单维度检查」。</strong> 传统 CI 只判断「能不能跑」。能跑不等于写得好——测试全绿的代码库可能是定时炸弹。LLM 评分检查传统 CI 覆盖不到的东西：架构是否合理、命名是否表意、错误处理是否完备、有没有反模式。硬门禁守底线，软门禁拉上限。</p><p><strong>「全自动闭环」优于「分步半自动」。</strong> 不只是生成代码。PR 创建、等待 CI、合并、关闭 Issue——这些机械操作也自动掉。每一步人工介入都是延迟和出错的机会。人应该把精力花在定义验收标准上——这个标准写得好不好，直接决定最终产出质量——而不是花在点「Merge」按钮上。</p><h2 id="7-9-适用边界"><a href="#7-9-适用边界" class="headerlink" title="7.9 适用边界"></a>7.9 适用边界</h2><p>autoresearch 有明确的适用条件。它高度依赖一个前提：Issue 写得好。</p><p><img src="/images/image-20260531010541230.png"></p><p><strong>最适合：</strong></p><ul><li><strong>验收标准可量化、可验证的功能。</strong> checkbox 里的每一项都能跑测试或 lint 验证。Agent 不需要「觉得」自己做完了——测试结果告诉它做完了。贪吃蛇就是典型：蛇能不能动、食物能不能吃、撞墙会不会死——全都能写 assert。</li><li><strong>中等粒度的独立 Issue。</strong> 一个 Issue 能在单个 Agent 的上下文窗口内完成，验收标准明确，不依赖其他 Issue 的产出。太大——Agent 迷路。太小——autoresearch 的启动成本高于实现成本。</li><li><strong>需要多轮审查的复杂逻辑。</strong> 涉及并发安全、状态机转换、边界条件多的代码——单 Agent 容易漏，多 Agent 交叉审查的收益最高。</li><li><strong>批量 Issue 的夜间自主执行。</strong> 配合 <code>run_all.sh</code>，晚上把十几个 Issue 丢进去，早上看结果。</li></ul><p><strong>不适合：</strong></p><ul><li><strong>验收标准模糊的任务。</strong> 「让这个页面更好看」「优化用户体验」——Agent 不知道什么叫「更好看」，LLM 评分也会反复摇摆。autoresearch 不能替你做设计决策。</li><li><strong>跨 Issue 的架构变更。</strong> 每个 Issue 是独立执行的，Agent 不知道其他 Issue 做了什么。跨多个 Issue 的重构、API 变更、数据模型迁移——需要人在更高的层面协调。</li><li><strong>需要人类判断的探索性工作。</strong> 「试试看这个技术方案行不行」——探索的结果需要人来解读，不能交给 LLM 评分来判定。</li></ul><p><strong>代价：</strong></p><p>适用场景说清了，但 autoresearch 有两个绕不过去的成本。</p><p>第一个是时间。一个 Issue 走完「实现 → 审查 → 修复 → 再审查 → 评分达标」的完整流程，少则十几分钟，多则几十分钟。贪吃蛇这种体量的功能跑了四轮十二分钟——这算快的。复杂 Issue 迭代五六轮甚至更多，半小时以上很常见。对比人类开发者自己写可能只要十分钟的功能，autoresearch 反而更慢。但这不是 apples-to-apples 的对比——autoresearch 省的是人的注意力，不是绝对时间。你在等它的十几分钟里可以做别的事，或者干脆不坐在电脑前。</p><p>第二个是 token。每轮迭代，Agent 要读 Issue、读代码、读 program.md、读前一轮的审查报告、读测试结果——上下文越积越厚。贪吃蛇的四轮跑下来，token 消耗轻易过几十万。如果三个 Agent 各跑两轮，就是六次完整的上下文加载。单 Agent 的 Ralph Loop 也有这个问题，但 autoresearch 的多 Agent 轮转让每个 Agent 都从头加载上下文，token 成本乘以 Agent 数量。功能全自动了，API 账单也全自动了。</p><p>这两个代价不是要否定 autoresearch。它是交易——用时间和 token 换人的注意力解放和代码质量的确定性。交易划不划算，看你更缺什么。缺时间——自己写更快。缺注意力——让 autoresearch 跑，你去睡觉。</p><p>一个实用判断：Issue 里的验收标准能写成 checkbox 格式，autoresearch 稳。写不成——先别用。</p><h2 id="7-10-与前后章节的关系"><a href="#7-10-与前后章节的关系" class="headerlink" title="7.10 与前后章节的关系"></a>7.10 与前后章节的关系</h2><p><strong>autoresearch 与 Ralph Loop（第 4 章）。</strong> autoresearch 是 Ralph Loop 的「多 Agent + 端到端」升级版。Ralph Loop 是单 Agent 反复迭代直到 promise 匹配。autoresearch 是多 Agent 轮转审查直到评分达标。Ralph Loop 止步于代码完成，autoresearch 一路走到 Issue 关闭。两者的核心循环逻辑是一样的——「没达标就继续」——autoresearch 在上面加了两层：交叉审查和自动交付。</p><p><strong>autoresearch 与 gstack（第 5 章）。</strong> gstack 的质量保证靠角色覆盖——CEO 审方向、工程经理审架构、QA 测功能、安全官审漏洞。autoresearch 的质量保证靠模型覆盖——Claude 实现、Codex 审查、OpenCode 再审查。gstack 的角色是人格化的——「你是一个有十五年经验的员工工程师」。autoresearch 的 Agent 是去人格化的——就是不同的模型，不带角色身份。两条路：gstack 在 prompt 层面模拟专家多样性，autoresearch 在模型层面实现真实多样性。</p><p><strong>autoresearch 与 superpowers（第 6 章）。</strong> superpowers 的 <code>subagent-driven-development</code> 和 autoresearch 的多 Agent 轮转都用了多 Agent 协作。但协作模式不同。superpowers 是分工式——每个子 Agent 负责一个独立任务，主 Agent 协调审查。autoresearch 是接力式——同一个任务在不同 Agent 之间传递，每个 Agent 在前一个的基础上审查和改进。superpowers 的上下文隔离更好（每个子 Agent 全新上下文），autoresearch 的审查覆盖更广（多个模型的视角叠加）。</p><p><strong>autoresearch 与 Goal Workflow（第 8 章）。</strong> 这是最紧密的一组关系。Goal Workflow 的四步闭环（PRD → Issue 拆分 → &#x2F;goal 实现 → &#x2F;ship-it 交付）把研发流程拆成了四个步骤。autoresearch 是其中 <code>/goal</code> 步骤的全自动化版本——「帮我实现这个 Issue」升级为「自动实现所有 Issue」。第 8 章会讲 Goal Workflow 如何把 autoresearch 嵌进一个更完整的研发体系。</p><h2 id="7-11-本章小结"><a href="#7-11-本章小结" class="headerlink" title="7.11 本章小结"></a>7.11 本章小结</h2><p>autoresearch 的名字来自 Karpathy 的 82K Stars 项目，但 smallnest 做的是完全不同的东西——ML 实验自动化变成了软件工程全流程自动化。</p><p>它的核心设计三条：</p><ol><li><p><strong>多 Agent 轮转替代单 Agent 迭代。</strong> 不同模型有不同的盲区。Claude 看不到的问题 Codex 能看到，Codex 改不好的地方 OpenCode 能改好。轮转公式 <code>(iter − 1) % N</code> 保证了每个 Agent 都有机会审查和修复。这和人类代码审查中多 reviewer 的效果一致——审的人越多，漏掉的越少。</p></li><li><p><strong>双轨门禁替代单维度检查。</strong> 硬门禁（Build&#x2F;Lint&#x2F;Test）保证代码能跑。软门禁（LLM 评分 ≥ 85）保证代码写得好。传统 CI 只能做到前者。autoresearch 两条都做。未达标就换 Agent 继续迭代，直到两条都通过。</p></li><li><p><strong>端到端闭环替代分步半自动。</strong> 不只是生成代码。从 Issue 解析到 PR 创建到合并到关闭 Issue——全自动。人的角色从「操作者」变成了「验收标准定义者」。这和第 1 章的核心主张一脉相承：在 AI 时代，你的价值不再是「你能写多快的代码」，而是「你能不能定义清楚什么算做好」。</p></li></ol><p>把本章和前两章放在一起看，三条路线对应三种自动化程度。gstack 是人驱动流程——你走七个阶段，Agent 辅助执行。superpowers 是 Agent 驱动流程——Agent 自己走流程，人类在关键决策点确认。autoresearch 是全自动流程——人类只定义目标，Agent 从实现到交付全包。</p><p>没有高下之分。但自动化程度越高，对输入质量的要求越高。gstack 的 <code>/office-hours</code> 能容忍模糊的想法，六个强制问题帮你逐步澄清。autoresearch 的 Issue 必须一开始就写清楚——它不会在过程中追问你「这个验收标准具体是什么意思」。选哪种路线，看你对自己「能写清楚到什么程度」的诚实判断。</p><p>本书第 8 章的 Goal Workflow 把 PRD、Issue 拆分、autoresearch 实现、交付合入串成了一条从 PRD 到上线的研发闭环。如果你觉得 autoresearch 的「全自动实现 Issue」还不够，Goal Workflow 会展开完整的项目研发流程自动化方案。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/autoresearch-fully-automated-software-development/</id>
    <link href="https://colobu.com/2026/06/28/autoresearch-fully-automated-software-development/"/>
    <published>2026-06-28T03:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>「你只需负责喝茶和睡觉。一觉醒来，Features 全自动高质量的实现了。」</p>
<p>——smallnest, autoresearch 作者, 2026 年</p>
</blockquote>
<p>gstack 是人驱动流程，二十三个角色在七个 Sprint 阶段中协作。superpowers 是 Agent 驱动流程，十四个 Skill 自动触发，子 Agent 分工实现。两条路，一个共同点：人类仍然在循环中。gstack 需要你在每个阶段运行命令。superpowers 需要你在设计批准时确认方案。</p>
<p>autoresearch 把这个共同点也推倒了。</p>
<p>它的目标一句话就能说清楚：从 Issue 到合入，全程不需要人。你写好 Issue，Agent 自己实现、自己审查、自己修复、自己提 PR、自己合入、自己关 Issue。你喝茶。你睡觉。醒来看到一排绿色的 merged。</p>
<p>Karpathy 的 autoresearch 思想在软件工程领域落地了——82K Stars 的 ML 研究自动化项目，被 smallnest 适配成了通用的全自动开发工具。</p>]]>
    </summary>
    <title>autoresearch：全自动化软件开发</title>
    <updated>2026-06-28T06:46:22.010Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="superpowers" scheme="https://colobu.com/tags/superpowers/"/>
    <category term="技能框架" scheme="https://colobu.com/tags/%E6%8A%80%E8%83%BD%E6%A1%86%E6%9E%B6/"/>
    <content>
      <![CDATA[<blockquote><p>&quot;The agent checks for relevant skills before any task. Mandatory workflows, not suggestions.&quot;<br>Agent 在执行任何任务之前，先检查自己有没有对应的技能。这些是强制工作流，不是建议。</p><p>——Jesse Vincent, Superpowers 作者, 2025 年</p></blockquote><p>gstack 用二十三个角色和七个 Sprint 阶段构建流程驱动的虚拟工程团队。CEO 审方向，工程经理锁架构，QA 测功能，安全官审漏洞——每个角色在固定阶段做固定的事。</p><p>superpowers 走相反的路。</p><p>superpowers 不定义任何角色。不强制任何 Sprint 阶段。它只做一件事：给你十四个 Skill，让 Agent 自己在合适的时机调用合适的那个。不靠流程锁住质量——靠每个 Skill 足够好用，Agent 自己愿意用它们。</p><p>201K+ Stars。当你不信任流程、只信任工具时，AI 软件工程能做多大——这个数字就是答案。</p><span id="more"></span><h2 id="6-1-一个拒绝流程的系统"><a href="#6-1-一个拒绝流程的系统" class="headerlink" title="6.1 一个拒绝流程的系统"></a>6.1 一个拒绝流程的系统</h2><p>superpowers 的作者是 Jesse Vincent，Prime Radiant 的创始人。他给这个项目起的名字——&quot;超能力&quot;。让一个普通 AI Agent 变成一个有方法论的 Agent 的十四种超能力。</p><p><img src="/images/image-20260530011124325.png"></p><p>2025 年 10 月发布，不到一年冲到 201K+ Stars。这个数字在所有 AI 编程方法论相关仓库里排第一——超过 gstack（约 5K），超过 OpenSpec（约 49K），超过 Ralph Loop 所有实现的总和。</p><p>从 README 第一段就能看出来：</p><blockquote><p>&quot;It starts from the moment you fire up your coding agent. As soon as it sees that you&#39;re building something, it <em>doesn&#39;t</em> just jump into trying to write code. Instead, it steps back and asks you what you&#39;re really trying to do.&quot;</p></blockquote><p>Agent 启动时不写代码。它退一步，先问你想做什么。这个行为是 Skill 自动触发的——Agent 检测到自己即将开始开发工作时，<code>brainstorming</code> 技能自动激活，强制走一轮需求澄清。</p><p>gstack 的流程是人类驱动的——你手动调用 <code>/office-hours</code>，然后 <code>/plan-ceo-review</code>，然后 <code>/autoplan</code>。superpowers 的流程是 Agent 驱动的——你只需要打开 Agent 开始工作，它在合适的时机自动加载合适的 Skill。你不说&quot;先做设计&quot;，Agent 自己知道要先做设计。</p><p>两条路。gstack 要的是控制——流程固定，角色明确，每个阶段的输出和输入都有明确的合约。superpowers 要的是自主——给 Agent 十四种能力，让它自己判断什么时候该用什么。</p><h2 id="6-2-核心机制：自动触发-强制门控"><a href="#6-2-核心机制：自动触发-强制门控" class="headerlink" title="6.2 核心机制：自动触发 + 强制门控"></a>6.2 核心机制：自动触发 + 强制门控</h2><p>superpowers 的十四个 Skill 并不新。brainstorming、TDD、systematic-debugging——这些概念第二章的 Pocock Skills 里都有。superpowers 的不同在两个地方。</p><h3 id="6-2-1-自动触发：Agent-自己决定用什么-Skill"><a href="#6-2-1-自动触发：Agent-自己决定用什么-Skill" class="headerlink" title="6.2.1 自动触发：Agent 自己决定用什么 Skill"></a>6.2.1 自动触发：Agent 自己决定用什么 Skill</h3><p>Pocock 的系统里，用户手动调用 <code>/tdd</code>、<code>/diagnose</code>、<code>/grill-me</code>。gstack 里，用户手动走 Sprint 阶段。</p><p>superpowers 的设计是：每个 Skill 的 <code>description</code> 字段里写了触发条件。Agent 在执行任务前检查所有已加载 Skill 的 description，匹配当前场景就自动激活。比如 Agent 准备写代码时，<code>brainstorming</code> 的 description 是&quot;你必须在任何创造性工作之前使用此技能&quot;，Agent 读到这句话，强制自己先做需求澄清。</p><p>一个文本匹配机制，Agent 会跳过吗？效果出奇地好。关键在 description 的措辞。它不说&quot;建议使用此技能&quot;，说&quot;在任何创造性工作之前必须使用此技能&quot;。不说&quot;可以考虑 TDD&quot;，说&quot;强制执行红-绿-重构：先写会失败的测试，看着它失败，写最少代码让它通过，看着它通过，提交。删除在测试之前写的任何代码。&quot;命令式的、不可协商的语言，Agent 就会遵守。</p><h3 id="6-2-2-硬门控：HARD-GATE-标签"><a href="#6-2-2-硬门控：HARD-GATE-标签" class="headerlink" title="6.2.2 硬门控：HARD-GATE 标签"></a>6.2.2 硬门控：HARD-GATE 标签</h3><p>有些 Skill 里嵌了一段特殊代码：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&lt;HARD-GATE&gt;</span><br><span class="line">Do NOT invoke any implementation skill, write any code, scaffold any project,</span><br><span class="line">or take any implementation action until you have presented a design and the</span><br><span class="line">user has approved it.</span><br><span class="line">&lt;/HARD-GATE&gt;</span><br></pre></td></tr></table></figure><p>HARD-GATE 是给 Agent 的行为约束——在进入下一个阶段之前，必须先完成当前阶段的硬性条件。<code>brainstorming</code> 有它——设计没被批准，一行代码都不准写。<code>test-driven-development</code> 有它——测试没写、没看到它失败，不准写实现代码。</p><p>gstack 用 PreToolUse hooks 在系统层面锁住 commit 按钮。superpowers 用 prompt 内嵌的指令在 Agent 认知层面锁住行动。前者是操作系统的强制，后者是心理的强制。都有效，但原理不同。hooks 在你的平台不支持时就失效了。HARD-GATE 在任何平台上都有效——它只是 prompt 里的一段文本。但它也更软——依赖 Agent 遵循指令的能力。在 Claude 4.x 上表现良好，在更弱的模型上可能被跳过。</p><h2 id="6-3-十四种超能力"><a href="#6-3-十四种超能力" class="headerlink" title="6.3 十四种超能力"></a>6.3 十四种超能力</h2><p>superpowers 把十四个 Skill 分成了五组。</p><p><img src="/images/image-20260530011432368.png"></p><h3 id="6-3-1-规划组：动手前先想清楚"><a href="#6-3-1-规划组：动手前先想清楚" class="headerlink" title="6.3.1 规划组：动手前先想清楚"></a>6.3.1 规划组：动手前先想清楚</h3><p><strong><code>brainstorming</code></strong>（头脑风暴）。这是整个系统的入口 Skill。Agent 检测到开发任务时自动激活，执行九步流程：探索项目上下文 → 询问视觉需求 → 逐个澄清问题 → 提出 2-3 个方案并推荐 → 分段展示设计 → 用户批准 → 写入设计文档 → 自审 → 用户复审 → 进入实施计划阶段。</p><p>它强制 Agent &quot;一次只问一个问题&quot;（Only one question per message）。这个约束防止了 Agent 一次性抛出十几个问题让用户不知所措——AI 常见的&quot;过度热情&quot;在这种设计下被抑制了。每一步都要等用户回答，节奏是人类控制的。</p><p>Skill 的态度很明确：每个项目都要走这个流程。todo list、一个函数、一个配置修改——全部要。简单的项目设计可以很短（几句话），但必须被呈现和批准。</p><p><strong><code>writing-plans</code></strong>（编写计划）。设计被批准后激活。把设计方案拆成 2-5 分钟能完成的小任务。每个任务包含精确的文件路径、完整的代码框架、验证步骤。粒度设计有一个清晰的标准：一个任务必须小到可以被一个子 Agent 在隔离的上下文中独立完成。</p><p><strong><code>executing-plans</code></strong>（执行计划）。按计划逐个任务执行，每个任务完成后检查点暂停等待用户确认。和下面的 <code>subagent-driven-development</code> 是互斥的两条路径——前者适合需要人在循环中的场景，后者适合自主执行的场景。</p><h3 id="6-3-2-开发组：质量的底层保障"><a href="#6-3-2-开发组：质量的底层保障" class="headerlink" title="6.3.2 开发组：质量的底层保障"></a>6.3.2 开发组：质量的底层保障</h3><p><strong><code>test-driven-development</code></strong>（测试驱动开发）。红-绿-重构的严格执行——先写会失败的测试，看着它失败，写最少代码让它通过，看着它通过，提交。最狠的规则：删除在测试之前写的任何代码。断了&quot;先写实现再补测试&quot;这条路。</p><p>红-绿-重构是 TDD 的核心循环。<strong>红</strong>——先写一个会失败的测试，确认测试确实失败了（不是假通过）。<strong>绿</strong>——写最少量的代码让测试通过，不求优雅，只求过关。<strong>重构</strong>——测试全绿后，清理代码结构，消除重复，改善命名，测试必须保持绿色。然后下一个循环。三步顺序不能乱：先有失败的测试，才有资格写实现代码。</p><p><strong><code>systematic-debugging</code></strong>（系统化调试）。四阶段根因分析：复现 → 定位 → 假设 → 修复。包含三个子技术：根因追踪（不只修症状）、纵深防御（修 bug 同时加固相关路径）、条件等待（不靠 sleep 轮询）。</p><p><strong><code>subagent-driven-development</code></strong>（子 Agent 驱动开发）。这是 superpowers 最具原创性的 Skill。核心逻辑：每个任务派一个全新的子 Agent 去实现，主 Agent 只负责协调。每个任务完成后两阶段审查：先审规格符合性（代码是不是做了该做的事），再审代码质量（代码写得好不好）。子 Agent 上下文是干净的——主 Agent 精确构造子 Agent 需要的上下文，不把整个会话历史塞进去。主 Agent 自己的上下文窗口留给协调工作。</p><p>这直接回应了第 4 章 Ralph Loop 的一个已知问题：循环膨胀。一个 Agent 在同一个会话中连续迭代十几次，上下文中的噪音（失败的尝试、被废弃的思路、旧的代码片段）越积越多，决策质量逐渐下降。子 Agent 模式通过&quot;每个任务一个新 Agent&quot;解决了这个问题——每个子 Agent 的上下文都是干净的，只包含完成当前任务所需的最小信息。</p><p><strong><code>verification-before-completion</code></strong>（完成前验证）。声称&quot;做完了&quot;之前必须跑验证——系统地检查每个验收标准是否被满足，不满足于&quot;测试跑过一次通过了&quot;。这和 Ralph Loop 的 completion promise 做的事一样：阻止 Agent 在没做完的时候说自己做完了。</p><h3 id="6-3-3-审查组：两道防线"><a href="#6-3-3-审查组：两道防线" class="headerlink" title="6.3.3 审查组：两道防线"></a>6.3.3 审查组：两道防线</h3><p><strong><code>requesting-code-review</code></strong>（请求代码审查）。任务之间自动触发。对照计划审查，按严重程度分级报告问题。关键问题阻塞进度。</p><p><strong><code>receiving-code-review</code></strong>（接收代码审查）。处理审查反馈的行为规范——如何分类反馈、如何回应、什么情况下可以拒绝修改建议。Agent 响应审查反馈的方式和质量也需要训练。</p><h3 id="6-3-4-工具组：工程基础设施"><a href="#6-3-4-工具组：工程基础设施" class="headerlink" title="6.3.4 工具组：工程基础设施"></a>6.3.4 工具组：工程基础设施</h3><p><strong><code>dispatching-parallel-agents</code></strong>（派遣并行 Agent）。多个独立任务同时启动子 Agent 并行执行。适合计划中有明显无依赖关系的任务组。</p><p><strong><code>using-git-worktrees</code></strong>（Git Worktree 使用）。设计被批准后自动激活——创建隔离的 git worktree，在新分支上工作，跑项目初始化，验证测试基线。和第 10 章的 Harness Engineering 一脉相承——用 git worktree 实现进程级隔离，而不是依赖 Agent 的自我约束。</p><p><strong><code>finishing-a-development-branch</code></strong>（完成开发分支）。所有任务完成后激活。验证所有测试通过，给出四个选项：合并到主分支、创建 PR、保留分支、丢弃分支。清理 worktree。</p><h3 id="6-3-5-元技能组：制造超能力的超能力"><a href="#6-3-5-元技能组：制造超能力的超能力" class="headerlink" title="6.3.5 元技能组：制造超能力的超能力"></a>6.3.5 元技能组：制造超能力的超能力</h3><p><strong><code>writing-skills</code></strong>（编写 Skill）。教 Agent 怎么样创建一个新 Skill。包含测试方法论——新 Skill 写完后必须通过行为验证。有了 <code>writing-skills</code>，superpowers 就成了一个可以自我扩展的系统。</p><p><strong><code>using-superpowers</code></strong>（使用 Superpowers）。介绍整个系统的新手指南。Agent 第一次加载 superpowers 时自动激活。</p><h2 id="6-4-superpowers-zh：中文生态的本地化"><a href="#6-4-superpowers-zh：中文生态的本地化" class="headerlink" title="6.4 superpowers-zh：中文生态的本地化"></a>6.4 superpowers-zh：中文生态的本地化</h2><p>superpowers-zh 由 jnMetaCode 开发，3.6K+ Stars。完整汉化，加六个中国原创 Skill。</p><p>六个原创 Skill 瞄准的是中文开发者自己的场景：</p><p><code>chinese-code-review</code> 适配了国内团队的代码审查文化——审查报告的措辞、评论的优先级标注、修改建议的表达方式，都按国内工程师习惯的交流方式重新设计，不是简单翻译英文版。<code>chinese-git-workflow</code> 支持 Gitee、CODING、极狐 GitLab、CNB 等国内代码托管平台——git worktree 的创建、PR&#x2F;MR 的提交和合并流程都做了适配。<code>chinese-documentation</code> 强制中文排版规范——中英文之间的空格、标点符号的使用、技术术语的翻译标准。<code>chinese-commit-conventions</code> 将 Conventional Commits 规范适配到中文团队的实践——中英混合的 commit message 格式、中文 Issue 引用格式。<code>mcp-builder</code> 直接教 Agent 如何构建 MCP 服务器。<code>workflow-runner</code> 提供了多角色的 YAML 编排能力——弥补了 superpowers 原生不支持流程编排的短板。</p><p>目前支持十六款 AI 编码工具，从 Claude Code 到通义灵码（Qwen Code），一键安装自动检测平台。superpowers-zh 进一步扩大了跨平台兼容性——原版不支持的中国本土工具也被加了进来。</p><h2 id="6-5-实战：用-superpowers-开发网页版贪吃蛇"><a href="#6-5-实战：用-superpowers-开发网页版贪吃蛇" class="headerlink" title="6.5 实战：用 superpowers 开发网页版贪吃蛇"></a>6.5 实战：用 superpowers 开发网页版贪吃蛇</h2><p>同一个贪吃蛇。第五种体验。</p><h3 id="6-5-1-启动：Agent-拒绝写代码"><a href="#6-5-1-启动：Agent-拒绝写代码" class="headerlink" title="6.5.1 启动：Agent 拒绝写代码"></a>6.5.1 启动：Agent 拒绝写代码</h3><p>打开 Claude Code（已安装 superpowers），输入：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">做一个贪吃蛇网页游戏。纯前端单文件。</span><br></pre></td></tr></table></figure><p>在 Pocock Skills 下，Agent 可能直接开始写代码。在 gstack 下，你会手动调用 <code>/office-hours</code>。在 superpowers 下，Agent 的行为是自动的——<code>brainstorming</code> 技能检测到&quot;creating features, building components&quot;的场景，自动激活：</p><blockquote><p><strong>Agent:</strong> 在我开始之前，我需要先了解一些关键问题。你是想做一个完整的游戏，还是更偏向一个技术演示？（一次只问一个问题）</p><p>用户：演示项目。展示 AI 编码能力。</p><p><strong>Agent:</strong> 了解了。演示项目意味着代码需要干净、可读、可展示。那么核心体验上——你希望这个游戏&quot;看起来不错&quot;更重要，还是&quot;代码结构清晰&quot;更重要？</p><p>用户：代码清晰更重要。</p><p><strong>Agent:</strong> 明白了。那验收标准上——哪些行为是必须的，哪些是可以省略的？</p><p>用户：蛇能动，能吃食物，撞墙或撞到自己会死，死了能重来。最高分用 localStorage 存。</p><p><strong>Agent:</strong> 好的。让我确认几个技术偏好：纯单文件 HTML&#x2F;CSS&#x2F;JS，不依赖任何框架？</p></blockquote><p>五个问题后，Agent 产出一份设计文档，存入 <code>docs/superpowers/specs/</code>。然后自动过渡到 <code>writing-plans</code>——把设计拆成四个任务：</p><ol><li>HTML 结构与 Canvas 渲染（20×20 网格，初始蛇 3 格，红色食物）</li><li>游戏循环与状态管理（requestAnimationFrame，150ms&#x2F;步，nextDirection 缓冲防反向）</li><li>碰撞检测与食物系统（墙壁、自身、食物随机生成且不与蛇身重叠）</li><li>分数系统与 UI 状态（当前分&#x2F;最高分、HTML modal 弹窗、localStorage、空格键重置）</li></ol><p>每个任务标注了文件路径、实现要点、验证步骤。然后 Agent 开始执行。</p><h3 id="6-5-2-子-Agent-驱动的实现过程"><a href="#6-5-2-子-Agent-驱动的实现过程" class="headerlink" title="6.5.2 子 Agent 驱动的实现过程"></a>6.5.2 子 Agent 驱动的实现过程</h3><p><code>subagent-driven-development</code> 激活。主 Agent 为每个任务派一个全新的子 Agent：</p><p><strong>任务 1</strong>——派子 Agent A，只给 HTML 结构和 Canvas 渲染的上下文。子 Agent 在干净的环境中写代码，跑验证，提交。主 Agent 派审查子 Agent 做两阶段审查（规格符合性 → 代码质量），通过。</p><p><strong>任务 2</strong>——派子 Agent B，只给任务 2 的上下文加上已完成的文件结构。子 Agent 实现了游戏循环和方向控制。审查子 Agent 发现了一个问题：方向缓冲的默认值没初始化，蛇可能在按键前就开始移动。打回修改。子 Agent B 修好，重新审查，通过。</p><p><strong>任务 3</strong>——派子 Agent C，加碰撞检测和食物系统。审查通过。</p><p><strong>任务 4</strong>——派子 Agent D，加分数系统和 modal 弹窗。审查子 Agent 提出：modal 弹窗出现时键盘事件没拦截，死了还能控制蛇。这是第 5 章 gstack 实战中 Review 阶段才发现的问题——在 superpowers 的流程里，子 Agent 审查阶段就揪出来了。子 Agent D 修复，重新审查，通过。</p><p>整个过程约十五分钟，人类参与了两次——回答 <code>brainstorming</code> 的五个问题，确认设计方案。其余全自动。</p><h3 id="6-5-3-验证和交付"><a href="#6-5-3-验证和交付" class="headerlink" title="6.5.3 验证和交付"></a>6.5.3 验证和交付</h3><p><code>verification-before-completion</code> 激活。Agent 逐条对照验收标准验证：蛇能动 ✓ 能吃食物 ✓ 撞墙死 ✓ 撞自己死 ✓ 分数更新 ✓ 最高分持久化 ✓ 空格键重置 ✓。全部通过后 Agent 报告完成。</p><p><code>finishing-a-development-branch</code> 激活。Agent 给出四个选项，用户选择创建 PR。Agent 生成 commit（Conventional Commits 格式），推送到远程，创建 PR。</p><h3 id="6-5-4-superpowers-和其他方法论的对比"><a href="#6-5-4-superpowers-和其他方法论的对比" class="headerlink" title="6.5.4 superpowers 和其他方法论的对比"></a>6.5.4 superpowers 和其他方法论的对比</h3><p>同一个贪吃蛇，五种方法论：</p><table><thead><tr><th>维度</th><th>Pocock Skills</th><th>OpenSpec</th><th>Ralph Loop</th><th>gstack</th><th>superpowers</th></tr></thead><tbody><tr><td><strong>启动方式</strong></td><td>手动调用 Skill</td><td>手动写 proposal</td><td>手动写 prompt</td><td>手动运行 <code>/office-hours</code></td><td>Agent 自动激活 brainstorming</td></tr><tr><td><strong>人类参与度</strong></td><td>全程驾驶</td><td>每步写文档</td><td>写 prompt 后放手</td><td>逐个阶段运行命令</td><td>回答设计问题后放手</td></tr><tr><td><strong>Agent 自主性</strong></td><td>低</td><td>中</td><td>高</td><td>中</td><td>高</td></tr><tr><td><strong>审查机制</strong></td><td>Skill 内建验证</td><td>Spec 验收标准</td><td>自动重试+测试</td><td>四个角色分维度审查</td><td>子 Agent 两阶段审查（规格+质量）</td></tr><tr><td><strong>上下文管理</strong></td><td>单 Agent 累积</td><td>单 Agent 累积</td><td>单 Agent 累积</td><td>多角色但同一会话</td><td>每个任务新子 Agent，上下文隔离</td></tr><tr><td><strong>流程强制力</strong></td><td>引导</td><td>柔性门</td><td>自动循环</td><td>系统 hooks</td><td>认知门控（HARD-GATE）</td></tr><tr><td><strong>最佳场景</strong></td><td>日常小任务</td><td>有规格的功能</td><td>可自动验证的任务</td><td>从零到一的完整项目</td><td>中等复杂度的独立功能</td></tr></tbody></table><p>superpowers 在贪吃蛇上只花了约十五分钟——比 gstack 的七个阶段快，比 Ralph Loop 的四轮迭代质量高（子 Agent 审查抓到了 Ralph 第 4 轮才抓到的 modal 焦点问题）。人类的参与时间约五分钟。</p><p>superpowers 没有 gstack 那种&quot;CEO 审方向 → 工程经理锁架构 → 设计师审 UI&quot;的全景角色覆盖。它依赖十四种工具覆盖足够多的场景——如果某个场景没有对应的 Skill，Agent 就没有那个维度的审查能力。gstack 的二十三个角色覆盖了产品、工程、设计、安全、运维的全部维度。superpowers 的十四个 Skill 更多地集中在工程实现环节，产品思考和安全管理相对薄弱。</p><h2 id="6-6-设计哲学：自动化的代价"><a href="#6-6-设计哲学：自动化的代价" class="headerlink" title="6.6 设计哲学：自动化的代价"></a>6.6 设计哲学：自动化的代价</h2><p>superpowers 和 gstack 是两条路。核心差异不在 Skill 数量——14 vs 35+。在谁驱动流程。</p><p>gstack 是<strong>人驱动流程</strong>。你判断什么时候进入 Think 阶段，你调用 <code>/office-hours</code>。你判断什么时候进入 Plan 阶段，你调用 <code>/autoplan</code>。流程的节奏和方向在你手上。好处是你能在每一步做出判断——CEO 审查结论否决了难度曲线功能，你知道为什么，你同意这个决定。坏处是你必须在每一步都参与——七个 Sprint 阶段走一遍，意味着你要在电脑前坐几个小时。</p><p>superpowers 是<strong>Agent 驱动流程</strong>。Agent 判断自己即将开始开发，自动激活 <code>brainstorming</code>。Agent 判断自己需要写实现计划，自动激活 <code>writing-plans</code>。流程是 Agent 自己推进的。好处是你只需要在关键决策点参与——设计批准时看一眼，方案选择时给个意见——剩下的 Agent 自己跑。坏处是 Agent 可能在你不注意的时候做出你不同意的决策。</p><p>两套系统对&quot;信任&quot;的假设相反。gstack 的假设是：你不能信任 AI 的自我判断——它会在应该先做设计时直接写代码，会在没做完时声称做完了。所以用系统级别的门控来强制执行。superpowers 的假设是：你可以部分信任 AI——给它好用的工具和清晰的行为约束（HARD-GATE），它会在大多数时候做出正确的选择。</p><p>哪种假设更接近现实？取决于你用的模型和任务的复杂度。Claude 4.x 上 superpowers 的自动触发表现良好——Agent 确实会在应该先做设计时停下来问问题。但在更弱的模型上，HARD-GATE 只是一段文本，Agent 可能直接跳过。gstack 的 hooks 门控在任何模型上都有效，但只在支持 hooks 的平台上有效。</p><p>Jesse Vincent 对这个问题的回答很务实：superpowers 不支持弱模型。项目明确要求 Claude 4.x 或同等能力的模型。如果你用的是弱模型，superpowers 不提供保障——它假设 Agent 有基本的指令遵循能力。</p><h2 id="6-7-适用边界"><a href="#6-7-适用边界" class="headerlink" title="6.7 适用边界"></a>6.7 适用边界</h2><p>superpowers 不像 gstack 那样有明确的&quot;绿野项目&quot;&quot;治理轨迹&quot;&quot;单人团队&quot;三类最佳场景。它的适用逻辑更简单——看任务类型。</p><p><img src="/images/image-20260530011922442.png"></p><p><strong>最适合：</strong></p><ul><li><strong>中等复杂度的功能开发。</strong> 一个独立的 CRUD 模块、一个 UI 组件的重构、一个数据处理的管道——任务足够复杂，值得走 brainstorming → plan → subagent 实现的完整流程；任务又足够独立，不需要跨系统的架构决策。这是 superpowers 的最佳区间。</li><li><strong>需要长时间自主执行的场景。</strong> subagent-driven-development 的核心优势是上下文隔离——每个子 Agent 带着最少的、最精确的上下文开始工作，不会被前面十几个任务的噪音干扰。这让 Agent 可以连续工作数小时而不偏离计划。</li><li><strong>跨平台使用者。</strong> superpowers 支持 Claude Code、Codex CLI、Cursor、Gemini CLI、OpenCode 等八个平台。你在一个平台上写的 Skill 可以直接在另一个平台上用。这一点 gstack 也在做（支持十款 AI 编码工具），但 superpowers 的跨平台兼容性更成熟——它的 Skill 格式更标准化，触发机制不依赖平台特有的 hooks 系统。</li></ul><p><strong>不适合：</strong></p><ul><li><strong>从零到一的绿野项目。</strong> 没有 CEO 角色审产品方向、没有设计师角色审用户体验、没有安全官角色审计漏洞——superpowers 缺乏 gstack 那种全景角色覆盖。做一个全新产品，你仍然需要自己判断&quot;该不该做&quot;和&quot;做给谁用&quot;。</li><li><strong>需要完整治理轨迹的项目。</strong> superpowers 的设计文档存在 <code>docs/superpowers/specs/</code> 下，但没有像 gstack 或 OpenSpec 那样的结构化审查记录和审计轨迹。合规性行业的需求它满足不了。</li><li><strong>小修小补。</strong> brainstorming 流程强制&quot;每个项目都要走设计流程&quot;，但改一个按钮颜色不值得九步设计流程。superpowers 的流程成本对小任务来说偏高——不像 Pocock Skills 那样可以单 Skill 快速调用。</li></ul><p>一个实用的判断：任务是&quot;写一个新功能&quot;——superpowers 值回票价。任务是&quot;做一个新产品&quot;——gstack 更完整。任务是&quot;修一个小 bug&quot;——Pocock Skills 更快。</p><h2 id="6-8-与前后章节的关系"><a href="#6-8-与前后章节的关系" class="headerlink" title="6.8 与前后章节的关系"></a>6.8 与前后章节的关系</h2><p><strong>superpowers 与 Skills（第 2 章）。</strong> superpowers 的十四个 Skill 在格式上和 Pocock 的 Skill 没什么区别——都是 SKILL.md 文件，都有 metadata + description + body。核心差异在触发机制。Pocock 的 Skill 是手动调用的——你不说 <code>/tdd</code>，Agent 不用。superpowers 的 Skill 是自动触发的——Agent 读 description 匹配当前场景，自己决定激活哪个。Pocock 把控制权留给人，superpowers 把判断权交给 Agent。</p><p><strong>superpowers 与 Ralph Loop（第 4 章）。</strong> superpowers 的 <code>subagent-driven-development</code> 和 Ralph Loop 有相似的目标——让 Agent 自主完成多轮工作。但实现方式完全不同。Ralph Loop 是同一个 Agent 在同一个会话中反复迭代——Stop Hook 拦截退出，重新注入 prompt，Agent 看到自己上一轮的产出并改进。superpowers 是新 Agent 新上下文——每个任务派一个全新的子 Agent，上下文干净，不带历史噪音。前者的优势是可以累积理解，劣势是上下文膨胀。后者的优势是上下文干净，劣势是每个子 Agent 需要被精确构造上下文，对主 Agent 的协调能力要求更高。</p><p><strong>superpowers 与 gstack（第 5 章）。</strong> gstack 是人驱动流程，superpowers 是 Agent 驱动流程。gstack 靠角色覆盖质量，superpowers 靠工具覆盖质量。gstack 用系统 hooks 做门控，superpowers 用 prompt 内嵌指令做门控。两个系统解决的是同一个问题（如何让 AI Agent 高质量产出），走了相反的设计路径。</p><p><strong>superpowers 与 autoresearch（第 7 章）。</strong> autoresearch 的多 Agent 轮转和 superpowers 的子 Agent 派遣都涉及多 Agent 协作。但协作模式不同。autoresearch 是审查式协作——Agent A 实现，Agent B 审查并修复，Agent C 再审查并修复。superpowers 是分工式协作——每个子 Agent 负责一个独立任务，主 Agent 协调和审查。第 7 章会详谈这两种协作模式的差异。</p><h2 id="6-9-小结"><a href="#6-9-小结" class="headerlink" title="6.9 小结"></a>6.9 小结</h2><p>superpowers 拿到 201K+ Stars，不是因为运气——它的设计方向确实对：不靠流程锁住质量，靠足够多的 Skill 覆盖足够多的场景，靠自动触发让 Agent 在合适的时机用对的工具。</p><p>它的核心设计三条：</p><ol><li><p><strong>自动触发替代手动调用。</strong> Skill 不是斜杠命令——你不需要记住什么时候该用什么。Agent 在读 description 时自己判断。技能的使用不再靠人类记忆，靠 Agent 自觉。</p></li><li><p><strong>子 Agent 隔离替代上下文累积。</strong> 每个任务一个全新的子 Agent，上下文只包含完成当前任务所需的最小信息。这解决了 Ralph Loop 的循环膨胀问题——上下文不会随着迭代次数线性增长，每个子 Agent 都在干净的环境中工作。</p></li><li><p><strong>认知门控替代系统门控。</strong> gstack 用 PreToolUse hooks 在系统层面锁住行为。superpowers 用 <code>&lt;HARD-GATE&gt;</code> 标签在 prompt 层面锁住行为。前者更强但依赖平台，后者更软但跨平台通用。两条路线验证了同一个结论：AI Agent 需要门控——它不能在任何时候做任何事。门控的实现在哪里（系统层还是 prompt 层），取决于你的平台能力和对 Agent 的信任程度。</p></li></ol><p>gstack 是流程集成——二十三个角色在七个 Sprint 阶段中协作，输出靠流程结构保证。superpowers 是工具覆盖——十四个 Skill 在自动触发中组合，输出靠工具质量保证。第 7 章讲 autoresearch：连子 Agent 的协调也不要人了，从 Issue 到 PR 全自动，行不行？</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/superpowers-skill-framework-agent-capability/</id>
    <link href="https://colobu.com/2026/06/28/superpowers-skill-framework-agent-capability/"/>
    <published>2026-06-28T02:30:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>&quot;The agent checks for relevant skills before any task. Mandatory workflows, not suggestions.&quot;<br>Agent 在执行任何任务之前，先检查自己有没有对应的技能。这些是强制工作流，不是建议。</p>
<p>——Jesse Vincent, Superpowers 作者, 2025 年</p>
</blockquote>
<p>gstack 用二十三个角色和七个 Sprint 阶段构建流程驱动的虚拟工程团队。CEO 审方向，工程经理锁架构，QA 测功能，安全官审漏洞——每个角色在固定阶段做固定的事。</p>
<p>superpowers 走相反的路。</p>
<p>superpowers 不定义任何角色。不强制任何 Sprint 阶段。它只做一件事：给你十四个 Skill，让 Agent 自己在合适的时机调用合适的那个。不靠流程锁住质量——靠每个 Skill 足够好用，Agent 自己愿意用它们。</p>
<p>201K+ Stars。当你不信任流程、只信任工具时，AI 软件工程能做多大——这个数字就是答案。</p>]]>
    </summary>
    <title>superpowers 技能框架：Agent 能力增强</title>
    <updated>2026-06-28T06:46:22.009Z</updated>
  </entry>
  <entry>
    <author>
      <name>smallnest</name>
    </author>
    <category term="AI" scheme="https://colobu.com/categories/AI/"/>
    <category term="AI" scheme="https://colobu.com/tags/AI/"/>
    <category term="软件工程" scheme="https://colobu.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
    <category term="Agent" scheme="https://colobu.com/tags/Agent/"/>
    <category term="gstack" scheme="https://colobu.com/tags/gstack/"/>
    <category term="虚拟团队" scheme="https://colobu.com/tags/%E8%99%9A%E6%8B%9F%E5%9B%A2%E9%98%9F/"/>
    <content>
      <![CDATA[<blockquote><p>&quot;I basically operate as an engineering manager for a fleet of temporary models.&quot;<br>我本质上是一个工程经理，管理一支临时工模型大军。</p><p>——Garry Tan, Y Combinator 总裁 &amp; CEO, 2026 年</p></blockquote><p>Skill 是能力单元——一个 Markdown 文件定义一种行为。Spec 是合约，定义&quot;做成什么样才算对&quot;。Ralph Loop 是执行引擎，&quot;做不到就继续做&quot;。三者构成闭环：Skill 提供方法，Spec 提供标准，Ralph Loop 提供执行力。</p><p>但它们都隐含了同一个假设：<strong>你只有一个 Agent。</strong></p><p>把这个假设推倒。如果你可以同时拥有二十三个 Agent，每个被赋予一个不同的专家角色——有人负责产品思考，有人负责架构设计，有人负责代码审查，有人负责质量测试，有人负责安全审计，有人负责发布部署——并且它们按照一个严格的 Sprint 流程协作。会发生什么？</p><p>gstack 回答这个问题。它是一个虚拟工程团队的操作系统。</p><span id="more"></span><h2 id="5-1-一个人就是一支军队"><a href="#5-1-一个人就是一支军队" class="headerlink" title="5.1 一个人就是一支军队"></a>5.1 一个人就是一支军队</h2><p>2026 年初，Garry Tan 在社交媒体上发了一组对比数据，让整个硅谷的技术圈安静了几秒钟。</p><p>同一个人。同样的工作强度。2013 年，他的 GitHub 年度贡献图是一张稀疏的绿色点阵——和大多数全职工程师差不多。2026 年，同一张图画满了深绿色的方块，密集到几乎看不到底色。逻辑代码行的产出是 2013 年的<strong>八百一十倍</strong>。</p><p>八百一十倍。这是数量级的跃迁。</p><p>Garry Tan 是 Y Combinator 的总裁兼 CEO。日常工作是管理全球最大的创业投资机构之一：看项目、面试创始人、做投资决策、运营一个数百人的组织。写代码不该是他的主要工作。但在运营 YC 的同时，他在六十天内交付了三个生产级服务和四十多个功能。他用的方法论，就是 gstack。</p><p>gstack 的 GitHub 描述行只有五个词——&quot;open source software factory&quot;（开源软件工厂）。这五个词指向一个概念突破：<strong>将 AI Agent 从&quot;工具&quot;升级为&quot;团队&quot;。</strong></p><p>它的核心机制很简单：把二十三个专家角色写成二十三个 Markdown 文件，每个文件定义了一种专门的&quot;认知模式&quot;——CEO 怎么想产品、工程经理怎么审架构、QA 怎么测应用、安全官怎么审计漏洞。调用 <code>/office-hours</code>，Agent 切换到&quot;YC 合伙人&quot;模式，六个强制问题盘问你的产品想法。调用 <code>/review</code>，同一个 Agent 切换到&quot;员工工程师&quot;模式，寻找能通过 CI 却在生产环境爆发的隐蔽 bug。调用 <code>/ship</code>，它变成&quot;发布工程师&quot;，同步主干、跑测试、审计覆盖率、推送代码、创建 PR。</p><p>同一个 Agent，不同角色。切换不靠每次重写 prompt——靠一个 Markdown 文件。第 2 章 Pocock 的 Skill 哲学在这里被推到了极致：当 Skill 不再零散，而是一个完整的组织架构，AI 软件工程的上限就变了。</p><p>Garry Tan 自己说过一句话，概括了 gstack 的设计理念：他本质上是一个工程经理，管理一支临时工模型大军。这句话在卷首语中也出现过——Claude Code 的创造者 Boris Cherny 说过类似的话。但 Garry Tan 比 Cherny 多走了一步：他给这支 AI 大军建立了一套组织架构——角色分工、流程阶段、质量门禁、交付流水线。一群零散的 Agent 变成了一个有结构的虚拟工程团队。</p><p><img src="/images/image-20260523135259179.png"></p><h2 id="5-2-安装与配置：30-秒建起一支虚拟军队"><a href="#5-2-安装与配置：30-秒建起一支虚拟军队" class="headerlink" title="5.2 安装与配置：30 秒建起一支虚拟军队"></a>5.2 安装与配置：30 秒建起一支虚拟军队</h2><p>gstack 是一组 Markdown 文件，代码完全开源，MIT 许可证。三十余个 Skill 文件构成它的全部——不需要数据库、不需要后端服务、不需要 API Key 之外的付费依赖。获取方式只有一种：<code>git clone</code>，然后跑一条 setup 脚本。</p><h3 id="5-2-1-依赖与前提"><a href="#5-2-1-依赖与前提" class="headerlink" title="5.2.1 依赖与前提"></a>5.2.1 依赖与前提</h3><p>gstack 跑在 Claude Code 之上——它的 PreToolUse hooks、slash commands、project-level config 都依赖 Claude Code 的 Harness 体系（详见第 10 章）。所以前提条件少：</p><ul><li><strong>Claude Code</strong> —— gstack 的宿主。Claude Code 提供 Agent 运行时、hooks 机制和 slash command 支持。</li><li><strong>Git</strong> —— Skill 文件通过 git 分发和版本管理。</li><li><strong>Bun v1.0+</strong> —— gstack 的 setup 脚本和 hooks 用 Bun 的 TypeScript 运行时，利用它的快速启动和内置工具链。</li><li><strong>Node.js</strong>（仅 Windows）——Bun 在 Windows 上尚未完整覆盖，部分脚本需要 Node.js 作为回退。</li></ul><h3 id="5-2-2-基础安装"><a href="#5-2-2-基础安装" class="headerlink" title="5.2.2 基础安装"></a>5.2.2 基础安装</h3><p>在 Claude Code 会话中粘贴这行命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> --single-branch --depth 1 https://github.com/garrytan/gstack.git ~/.claude/skills/gstack &amp;&amp; <span class="built_in">cd</span> ~/.claude/skills/gstack &amp;&amp; ./setup</span><br></pre></td></tr></table></figure><p><code>--depth 1</code> 是浅克隆，只拉最新版本——几十 KB，秒级完成。<code>./setup</code> 做了三件事：把三十余个 Skill 文件注册到 Claude Code 的 skills 目录、生成 CLAUDE.md 的 gstack 配置区块、配置 <code>/browse</code> 无头浏览器 Skill。Agent 自己执行这些步骤，不需要人手动改文件。</p><p>30 秒后，三十余个 <code>/</code> 命令全局可用——<code>/office-hours</code>、<code>/review</code>、<code>/qa</code>、<code>/ship</code>、<code>/cso</code>……任何一个 Claude Code 会话，在任何目录，都能调用。</p><h3 id="5-2-3-团队模式：共享-repo-的自动同步"><a href="#5-2-3-团队模式：共享-repo-的自动同步" class="headerlink" title="5.2.3 团队模式：共享 repo 的自动同步"></a>5.2.3 团队模式：共享 repo 的自动同步</h3><p>个人使用，全局安装就够了。但多人协作的 repo 需要团队模式——让每个 Clone 仓库的开发者自动获得 gstack，不需要手动安装。</p><p>在项目目录内运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(<span class="built_in">cd</span> ~/.claude/skills/gstack &amp;&amp; ./setup --team) &amp;&amp; ~/.claude/skills/gstack/bin/gstack-team-init required &amp;&amp; git add .claude/ CLAUDE.md &amp;&amp; git commit -m <span class="string">&quot;require gstack for AI-assisted work&quot;</span></span><br></pre></td></tr></table></figure><p>这条命令做的事：把 gstack 标记为项目的必需依赖，写入 <code>.claude/</code> 配置和 <code>CLAUDE.md</code>。之后任何人 checkout 这个 repo 开 Claude Code 会话，系统自动检测缺失的 gstack 并引导安装。版本漂移问题不复存在——每个会话启动时做一次自动更新检查（限流每小时一次，网络失败无害降级，完全静默）。</p><p><code>required</code> 可换成 <code>optional</code>——required 阻止未装 gstack 的会话进入，optional 只提示不阻止。</p><h3 id="5-2-4-多-Agent-支持"><a href="#5-2-4-多-Agent-支持" class="headerlink" title="5.2.4 多 Agent 支持"></a>5.2.4 多 Agent 支持</h3><p>gstack 的设计不锁定 Claude Code。它的 setup 脚本自动检测你机器上装了哪些 AI 编码 Agent，按需分发 Skill 文件。截至 2026 年 5 月，支持 10 种 Agent：</p><table><thead><tr><th>Agent</th><th>安装路径</th></tr></thead><tbody><tr><td>Claude Code</td><td><code>~/.claude/skills/gstack-*/</code></td></tr><tr><td>OpenAI Codex CLI</td><td><code>~/.codex/skills/gstack-*/</code></td></tr><tr><td>OpenCode</td><td><code>~/.config/opencode/skills/gstack-*/</code></td></tr><tr><td>Cursor</td><td><code>~/.cursor/skills/gstack-*/</code></td></tr><tr><td>Factory Droid</td><td><code>~/.factory/skills/gstack-*/</code></td></tr><tr><td>Slate</td><td><code>~/.slate/skills/gstack-*/</code></td></tr><tr><td>Kiro</td><td><code>~/.kiro/skills/gstack-*/</code></td></tr><tr><td>Hermes</td><td><code>~/.hermes/skills/gstack-*/</code></td></tr><tr><td>GBrain</td><td><code>~/.gbrain/skills/gstack-*/</code></td></tr></tbody></table><p>用 <code>./setup --host &lt;name&gt;</code> 指定目标 Agent。核心 Skill 逻辑同一套 Markdown 文件，Agent 特定的适配层由 setup 脚本按注入方式生成。</p><p>新增一个 Agent 宿主也简单——一个 TypeScript 配置文件，零代码改动（详见 gstack 仓库的 <code>ADDING_A_HOST.md</code> 文档）。这个设计反映了一个工程判断：Skill 的&quot;认知模式&quot;是平台无关的，只有 hooks 和门控机制依赖特定 Agent 的 Harness 能力。</p><h3 id="5-2-5-OpenClaw-深度集成"><a href="#5-2-5-OpenClaw-深度集成" class="headerlink" title="5.2.5 OpenClaw 深度集成"></a>5.2.5 OpenClaw 深度集成</h3><p>Peter Steinberger 的 OpenClaw（247K GitHub Stars）通过 ACP 协议批量管理 Claude Code 会话。gstack 对此做了原生适配：</p><ul><li>在 OpenClaw Agent 中安装 gstack 后，所有 Skill 在 OpenClaw 管理的 Claude Code 子会话中自动可用。</li><li>四个方法论 Skill（<code>/office-hours</code>、<code>/plan-ceo-review</code>、<code>/investigate</code>、<code>/retro</code>）以 OpenClaw 原生 Skill 形式发布到 ClawHub，无需 Claude Code 会话也能跑——它们是纯对话 Skill，不依赖 hooks：<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">clawhub install gstack-openclaw-office-hours gstack-openclaw-ceo-review gstack-openclaw-investigate gstack-openclaw-retro</span><br></pre></td></tr></table></figure></li></ul><p>日常使用中，你不必手动加载 gstack——对 OpenClaw Agent 说&quot;审查这个 PR 的安全性&quot;，它自知要 spawn Claude Code 会话并执行 <code>/cso</code>。说&quot;帮我规划 v2 API 重构&quot;，它跑 <code>/office-hours</code> → <code>/autoplan</code>。OpenClaw 做调度，gstack 做执行。</p><h3 id="5-2-6-升级与维护"><a href="#5-2-6-升级与维护" class="headerlink" title="5.2.6 升级与维护"></a>5.2.6 升级与维护</h3><p>gstack 的维护模型建立在&quot;文件即工具&quot;这个前提上。升级只需重新跑 setup——覆盖旧 Skill 文件，保留用户自定义配置。<code>/gstack-upgrade</code> Skill 封装了这个流程，一条命令完成：拉取最新 git commit、重新执行 setup、输出 changelog。</p><p>自动更新机制（团队模式）确保共享 repo 的开发者始终用同一版本——不是&quot;建议升级&quot;，是&quot;不升级进不去&quot;。有人觉得这太重，有人觉得多人协作下这是唯一靠谱的做法。两种意见在第 5.5 节的强制力之争中有完整展开。</p><h2 id="5-3-从工具到团队：gstack-的核心设计"><a href="#5-3-从工具到团队：gstack-的核心设计" class="headerlink" title="5.3 从工具到团队：gstack 的核心设计"></a>5.3 从工具到团队：gstack 的核心设计</h2><p>gstack 的设计围绕三件事：角色化、流程化、自动化。</p><h3 id="5-3-1-角色化：每个-Skill-是一个专家人格"><a href="#5-3-1-角色化：每个-Skill-是一个专家人格" class="headerlink" title="5.3.1 角色化：每个 Skill 是一个专家人格"></a>5.3.1 角色化：每个 Skill 是一个专家人格</h3><p>Pocock 的 Skills 系统中，一个 Skill 定义一种行为——&quot;怎么做 TDD&quot;&quot;怎么对齐需求&quot;&quot;怎么调试&quot;。行为是抽象的，不绑定人格。<code>/tdd</code> 直接给出红-绿-重构的循环规则。</p><p>gstack 每个 Skill 既定义行为，也定义<strong>人格</strong>。<code>/plan-ceo-review</code> 的开头是&quot;你是 CEO &#x2F; 创始人。你的职责是重新思考这个问题，找到&#39;十星级产品&#39;的愿景。&quot;人格设定改变了 Agent 的认知姿态——它不光知道要做什么，还知道用什么视角、什么标准、什么语气来做。</p><p>这是工程决策，不是包装。</p><p>当你对 AI 说&quot;审查这个架构&quot;，它给出的反馈取决于它认为自己是谁。如果它认为自己是一个代码审查者，会关注命名、结构、可读性。如果它认为自己是工程经理，会关注模块边界、扩展性、失败模式。如果它认为自己是 CEO，会关注这个架构在多大程度上服务于产品愿景、哪些复杂度是为未来假设买单、哪些简化会释放更多迭代速度。</p><p>gstack 把这个洞见系统化了：不让一个全能 Agent 做所有审查。让二十三个专家 Agent 各自审查自己擅长的维度。</p><p><img src="/images/image-20260530005853351.png"></p><p>以下是 gstack 七个 Sprint 阶段的核心角色：</p><table><thead><tr><th>Sprint 阶段</th><th>角色 Skill</th><th>人格设定</th><th>核心职责</th></tr></thead><tbody><tr><td>Think</td><td><code>/office-hours</code></td><td>YC 合伙人</td><td>六个强制问题盘问产品想法</td></tr><tr><td>Plan</td><td><code>/plan-ceo-review</code></td><td>CEO &#x2F; 创始人</td><td>寻找&quot;十星级产品&quot;愿景</td></tr><tr><td>Plan</td><td><code>/plan-eng-review</code></td><td>工程经理</td><td>锁定架构、数据流、边界条件</td></tr><tr><td>Plan</td><td><code>/plan-design-review</code></td><td>高级设计师</td><td>0-10 设计维度评分，AI Slop 检测</td></tr><tr><td>Plan</td><td><code>/plan-devex-review</code></td><td>开发者体验负责人</td><td>TTHW 基准对比，摩擦点追踪</td></tr><tr><td>Build</td><td><code>/design-shotgun</code></td><td>设计探索者</td><td>生成 4-6 个 AI 模型变体，对比迭代</td></tr><tr><td>Build</td><td><code>/design-html</code></td><td>设计工程师</td><td>将设计模型转化为生产级 HTML&#x2F;CSS</td></tr><tr><td>Review</td><td><code>/review</code></td><td>员工工程师</td><td>寻找 CI 通过但生产爆发的 bug</td></tr><tr><td>Review</td><td><code>/investigate</code></td><td>调试专家</td><td>系统化根因调试（铁律：不调查不修复）</td></tr><tr><td>Test</td><td><code>/qa</code></td><td>QA 负责人</td><td>真实浏览器测试，自动生成回归测试</td></tr><tr><td>Test</td><td><code>/cso</code></td><td>首席安全官</td><td>OWASP Top 10 + STRIDE 威胁建模</td></tr><tr><td>Ship</td><td><code>/ship</code></td><td>发布工程师</td><td>同步主干→跑测试→审计覆盖率→推送→开 PR</td></tr><tr><td>Ship</td><td><code>/land-and-deploy</code></td><td>发布工程师</td><td>一键从&quot;approved&quot;到&quot;verified in production&quot;</td></tr><tr><td>Ship</td><td><code>/canary</code></td><td>SRE</td><td>部署后监控：控制台错误、性能退化、页面故障</td></tr><tr><td>Reflect</td><td><code>/retro</code></td><td>工程经理</td><td>周回顾：个人细分、交付连贯性、测试健康趋势</td></tr><tr><td>Reflect</td><td><code>/benchmark</code></td><td>性能工程师</td><td>性能基准对比：页面加载、Core Web Vitals</td></tr></tbody></table><p>这十五个之外，gstack 还有一系列辅助角色——<code>/browse</code>（持久化无头浏览器，给 Agent 装上&quot;眼睛&quot;）、<code>/context-save</code> 和 <code>/context-restore</code>（跨会话状态持久化）、<code>/codex</code>（调用 OpenAI Codex 提供第二意见）、<code>/health</code>（代码质量仪表盘）、<code>/document-release</code>（发布后自动同步全部文档）——总共三十余个 Skill，覆盖从产品发现到发布监控的完整软件生命周期。</p><h3 id="5-3-2-流程化：Sprint-不是建议，是结构"><a href="#5-3-2-流程化：Sprint-不是建议，是结构" class="headerlink" title="5.3.2 流程化：Sprint 不是建议，是结构"></a>5.3.2 流程化：Sprint 不是建议，是结构</h3><p>有二十三个专家角色是第一步。第二步是让它们按正确的顺序工作。</p><p><img src="/images/image-20260530010322335.png"></p><p>gstack 定义了一个七阶段 Sprint：<strong>Think → Plan → Build → Review → Test → Ship → Reflect。</strong> 它通过 PreToolUse hooks 在 Claude Code 上实现了强制性阶段门控。未通过 <code>/review</code> 的代码无法 commit。未通过 <code>/qa</code> 的功能无法进入 <code>/ship</code>。门控是系统执行的，不依赖人的纪律。</p><p>每个阶段的产出自动成为下一阶段的输入。<code>/office-hours</code> 产出的设计文档被 <code>/plan-ceo-review</code> 和 <code>/plan-eng-review</code> 消费。<code>/plan-eng-review</code> 锁定的架构和数据流被 Build 阶段的 Agent 作为实现约束。<code>/review</code> 发现的 bug 被 <code>/qa</code> 验证修复。<code>/qa</code> 生成的回归测试变成后续所有迭代的自动化安全网。<code>/retro</code> 的周回顾基于 git 历史的客观数据——每个人的交付连贯性、测试健康趋势、增长机会——不依赖主观感受。</p><p>这个流程设计回应了第 4 章 Ralph Loop 的一个核心局限：Ralph Loop 解决&quot;一个任务内的自我纠正&quot;，解决不了&quot;谁来决定任务方向是否正确&quot;。gstack 在上面加了一层角色化流程审查——代码写出来之前，CEO 角色审产品方向、工程经理角色审架构方案、设计师角色审用户体验、安全官角色审威胁模型。Ralph Loop 保证做对了，gstack 保证在做对的事。</p><h3 id="5-3-3-自动化：当流程可以被机器强制执行"><a href="#5-3-3-自动化：当流程可以被机器强制执行" class="headerlink" title="5.3.3 自动化：当流程可以被机器强制执行"></a>5.3.3 自动化：当流程可以被机器强制执行</h3><p>gstack 最激进的创新不在角色数量，在<strong>强制力</strong>。</p><p>大多数 AI 编码工具上，流程规范本质上是引导指令——Agent 被要求&quot;先做计划再写代码&quot;，但如果它跳过了计划直接写代码，没有系统级机制阻止它。Claude Code 的 Harness 体系（第 10 章详谈）提供了 PreToolUse hooks——在 Agent 执行特定工具调用前插入检查脚本。gstack 充分利用了这个机制：<code>git commit</code> 前检查代码审查是否通过，<code>git push</code> 前检查 QA 测试是否完成，部署前检查安全审计是否执行。</p><p>这和传统 CI&#x2F;CD 流水线有一个关键区别。传统 CI&#x2F;CD 检查的是代码能不能跑（构建、测试、lint）。gstack 的 hooks 检查的是流程有没有走完——不直接判断代码好坏，而是确保该看的人都看过了。这是一种元级别的质量保证。</p><p>Garry Tan 管这叫&quot;流程即代码&quot;（Process as Code）。就像 IaC 把服务器配置变成可版本控制的文件，gstack 把工程流程变成了可版本控制的 Markdown 文件和 hooks 脚本。一个新团队成员加入项目时，不需要&quot;学习流程&quot;——流程已经编码在系统中，自动执行。</p><h2 id="5-4-Sprint-全景：七个阶段的深度拆解"><a href="#5-4-Sprint-全景：七个阶段的深度拆解" class="headerlink" title="5.4 Sprint 全景：七个阶段的深度拆解"></a>5.4 Sprint 全景：七个阶段的深度拆解</h2><p>上面是 gstack 的骨架。现在一个阶段一个阶段拆开，看肌肉怎么工作。</p><h3 id="5-4-1-Think：用六个强制问题杀死坏想法"><a href="#5-4-1-Think：用六个强制问题杀死坏想法" class="headerlink" title="5.4.1 Think：用六个强制问题杀死坏想法"></a>5.4.1 Think：用六个强制问题杀死坏想法</h3><p><code>/office-hours</code> 是 gstack Sprint 的起点。灵感来自 Y Combinator 的 Office Hours——YC 合伙人与创始人之间那种著名的、不留情面的二十分钟产品对话。</p><p>这个 Skill 的人格设定是&quot;YC 合伙人&quot;。行为不是&quot;听你说完然后给反馈&quot;——它用六个强制问题盘问你的产品想法：</p><ol><li><strong>你在解决谁的什么痛苦？</strong>——把你从&quot;我觉得这个 idea 很酷&quot;拽到&quot;有一个具体的人正在经历一种具体的痛苦&quot;。</li><li><strong>他们现在怎么解决这个问题的？</strong>——不知道现有方案，就不了解竞争格局。</li><li><strong>你的方案好在哪？</strong>——不是好在技术上，是好在用户愿意切换过来。</li><li><strong>最小可验证的第一步是什么？</strong>——答案超过两周工作量，说明你还没想清楚。</li><li><strong>为什么是你？</strong>——你有什么洞察、技能或资源让这件事只有你能做？</li><li><strong>如果这个失败了，最可能的原因是什么？</strong>——正面假设自己的产品会死，倒推最可能的死因。</li></ol><p>六个问题问完，Agent 产出一份设计文档。不是 PRD，不是 spec，是一份&quot;已经想清楚了什么、还没想清楚什么&quot;的结构化记录。这份文档成为 Plan 阶段所有审查角色的输入。</p><h3 id="5-4-2-Plan：四层审查锁定方向"><a href="#5-4-2-Plan：四层审查锁定方向" class="headerlink" title="5.4.2 Plan：四层审查锁定方向"></a>5.4.2 Plan：四层审查锁定方向</h3><p>Plan 阶段是 gstack 的防御核心。写一行代码之前，四个角色各自从专业视角审查同一个方案。</p><p><strong><code>/plan-ceo-review</code>——CEO 视角。</strong> 这个角色不问&quot;怎么实现&quot;，问&quot;该不该做&quot;。它用四种战略模式评估每个功能：扩张模式（加倍投入）、选择性模式（只做最有价值的部分）、维持模式（不做增量，只维护质量）、削减模式（砍掉）。一个功能被分配了削减模式，后续角色就不再为它消耗审查资源。</p><p><strong><code>/plan-eng-review</code>——工程经理视角。</strong> 这个角色锁定架构：ASCII 架构图、数据流图、状态机、测试矩阵。核心任务是把隐藏的假设翻到台面上——组件 A 依赖组件 B 的什么接口？并发场景的竞态条件是什么？失败模式的降级策略是什么？这些问题不在这一步澄清，到 Build 阶段再发现，返工成本是十倍起。</p><p><strong><code>/plan-design-review</code>——高级设计师视角。</strong> 这个角色有一个独特的职责：AI Slop 检测。&quot;Slop&quot;是 2025-2026 年 AI 生成内容社区涌现的一个词——指 AI 倾向于生成的那些看起来不错但缺乏真实设计意图的视觉产出。AI 做的 UI 常常是均匀的间距、对称的布局、标准的配色——视觉上不丑，但也不对。它们缺一个人类设计师做特定选择时的理由——&quot;这个按钮为什么是 48px 不是 44px？&quot;&quot;这个颜色为什么是 #1890ff 不是 #1677ff？&quot;设计师角色用 0-10 评分系统审查每个设计维度，强制 Agent 为每个设计选择提供理由。</p><p><strong><code>/plan-devex-review</code>——开发者体验视角。</strong> 这个角色做一件事：实际走一遍&quot;新开发者上车&quot;的流程。测量 TTHW（Time to Hello World）——clone 仓库到看到第一个成功运行的功能要多久——并与同类项目做基准对比。追踪摩擦点：哪些步骤需要手动配置、哪些文档缺失或过时、哪些错误信息让人困惑。开发者体验就是产品体验——你的 API 需要读三篇文档才能调用成功，用户不会怪文档，用户会怪你的产品。</p><p>四个角色可以分别手动运行，也可以通过 <code>/autoplan</code> 一次性启动全流程——CEO、设计、工程、DX 依次审查，只在有人类判断需要的决策点暂停等待输入。</p><h3 id="5-4-3-Build：从方案到代码"><a href="#5-4-3-Build：从方案到代码" class="headerlink" title="5.4.3 Build：从方案到代码"></a>5.4.3 Build：从方案到代码</h3><p>gstack 的 Build 阶段没定义全新的编码 Skill——它复用 Claude Code 原生的编码能力，加了几个设计专项增强。</p><p><strong><code>/design-shotgun</code></strong> 是其中最特别的一个。灵感来自散弹枪式的设计探索——同时生成 4-6 个不同风格的 AI 模型变体，放在对比板上逐个淘汰。背后的假设：AI 生成的第一个设计通常不是最好的，它是最平均的。强制生成多个变体并对比，更容易发现哪个选择表达了产品意图。</p><p><strong><code>/design-html</code></strong> 将设计模型转化为生产级 HTML&#x2F;CSS——零依赖、30KB 以内。这个约束本身就是质量声明：不被框架臃肿绑架的设计产出。</p><h3 id="5-4-4-Review：寻找-CI-抓不到的-bug"><a href="#5-4-4-Review：寻找-CI-抓不到的-bug" class="headerlink" title="5.4.4 Review：寻找 CI 抓不到的 bug"></a>5.4.4 Review：寻找 CI 抓不到的 bug</h3><p><code>/review</code> 是 gstack 中最重要的质量 Skill 之一。人格设定是&quot;员工工程师&quot;（Staff Engineer）——有十五年经验、见过各种生产事故的老兵。</p><p>审查逻辑分成两条通道。<strong>结构通道</strong>：检查代码结构、命名一致性、错误处理完备性、测试覆盖盲区——传统代码审查的自动化版，可以自动修复机械问题。<strong>对抗通道</strong>：假设自己是攻击者或极端场景——&quot;如果这个 API 被每秒 1000 次调用会怎样？&quot;&quot;中间件崩溃重启后状态能恢复吗？&quot;&quot;用户同时开两个 tab 操作，数据会冲突吗？&quot;这类问题传统 CI 永远抓不到，因为它们不是代码逻辑错误，是代码在真实世界的行为假设错误。</p><p><code>/codex</code> 提供第二意见机制——把同一段代码发给 OpenAI Codex CLI，用不同模型、不同训练数据、不同的&quot;审美&quot;来审查。Claude 和 Codex 同时认为有问题，那几乎可以肯定真有问题。这和第 7 章 autoresearch 的&quot;多 Agent 交叉审核&quot;逻辑一致——不同模型的盲区不同，交叉审核覆盖更多问题类型。</p><h3 id="5-4-5-Test：给-Agent-装上眼睛"><a href="#5-4-5-Test：给-Agent-装上眼睛" class="headerlink" title="5.4.5 Test：给 Agent 装上眼睛"></a>5.4.5 Test：给 Agent 装上眼睛</h3><p>gstack 的 Test 阶段是它与其他方法论最显著的差异点。大多数 AI 编码工具的测试止步于单元测试和集成测试——它们能看到代码，看不到 UI。gstack 通过 <code>/browse</code> Skill 提供了一个<strong>持久化无头 Chromium 实例</strong>，让 Agent 能在真实浏览器中点击、截图、检查 DOM、读控制台输出。</p><p><code>/browse</code> 是一个持久化守护进程——在 Agent 会话的整个生命周期中保持运行，维持浏览器状态（cookies、localStorage、登录会话），响应时间约 100-200ms。它的&quot;ref&quot;系统基于无障碍树（accessibility tree）定位元素——Agent 不说&quot;点击坐标 (200, 300)&quot;，说&quot;点击&#39;提交&#39;按钮&quot;。这让测试脚本对 UI 变化具有鲁棒性——按钮换了位置，ref 仍然有效。</p><p>在此之上，<code>/qa</code> 角色执行完整的 QA 流程：真实浏览器中测试应用、发现 bug、原子 commit 修复、重新验证、自动生成回归测试。<code>/qa-only</code> 提供纯报告模式——发现 bug 不改代码，把发现交给人类开发者处理。</p><p><code>/cso</code>（首席安全官）执行 OWASP Top 10 和 STRIDE 威胁建模。它有一个值得注意的设计——17 种误报排除规则。安全扫描工具最让开发者反感的就是误报——&quot;这里可能有 XSS 注入风险&quot;（但输入已经在上一层被清洗了）。<code>/cso</code> 不简单报告&quot;发现 XSS 风险&quot;，它会先检查输入是否已经在调用链的某处被验证或清洗——没有，才报告。</p><h3 id="5-4-6-Ship：从-approved-到-verified-in-production"><a href="#5-4-6-Ship：从-approved-到-verified-in-production" class="headerlink" title="5.4.6 Ship：从&quot;approved&quot;到&quot;verified in production&quot;"></a>5.4.6 Ship：从&quot;approved&quot;到&quot;verified in production&quot;</h3><p>Plan 阶段是防御，Ship 阶段是进攻——把审查通过的代码投入生产。</p><p><code>/ship</code> 执行的是一套完整的发布卫生流程：同步主干→运行全部测试→审计测试覆盖率→有退步就阻止→推送到远程→创建 PR→PR 描述自动填写 What&#x2F;Why&#x2F;How。</p><p><code>/land-and-deploy</code> 更远一步——一键从&quot;approved&quot;到&quot;verified in production&quot;：合并 PR、等 CI 和部署流水线完成、生产环境跑冒烟测试、验证关键路径可用。</p><p><code>/canary</code> 进入 SRE 模式：部署后持续监控控制台错误、性能退化、页面故障。它用 <code>/browse</code> 的无头浏览器实例在部署后自动遍历关键用户路径，发现异常——页面白屏、API 超时、静态资源 404——立即报警。</p><h3 id="5-4-7-Reflect：数据驱动的回顾"><a href="#5-4-7-Reflect：数据驱动的回顾" class="headerlink" title="5.4.7 Reflect：数据驱动的回顾"></a>5.4.7 Reflect：数据驱动的回顾</h3><p><code>/retro</code> 不是&quot;大家坐在一起聊聊上周做了什么&quot;的社交仪式。它分析 git 历史的客观数据：每个人的交付连续性（多少次连续合入不中断）、测试健康趋势（覆盖率在上升还是下降）、交付速度的中位数和方差。它产出的是数据。</p><p><code>/benchmark</code> 提供性能退化检测：每次 PR 合入后自动对比页面加载时间、Core Web Vitals、资源体积。合入后的指标比合入前差，PR 就被标记为需要性能审查。</p><p>两个 Skill 构成 gstack 的持续改进闭环——不只让开发更快，而且每一次 Sprint 都比上一次更好，有数据可查。</p><h2 id="5-5-gstack-的工程文化：强制力之争"><a href="#5-5-gstack-的工程文化：强制力之争" class="headerlink" title="5.5 gstack 的工程文化：强制力之争"></a>5.5 gstack 的工程文化：强制力之争</h2><p>gstack 有一个在社区中引发持续讨论的设计选择：它通过 PreToolUse hooks 实现了<strong>强制阶段门控</strong>。未通过 <code>/review</code> 的代码无法 commit。未通过 <code>/qa</code> 的功能无法进入 <code>/ship</code>。</p><p>批评者和支持者各自引用书中的一章来支撑自己。</p><p>批评者引第 2 章——Matt Pocock 明确反对接管流程的方法论。他的原话是 GSD、BMAD、Spec-Kit 这类方法在帮你接管流程的同时，夺走了你的控制权，让流程中产生的 bug 难以定位和修复。Pocock 的哲学中，Skill 是工具，用户保留对流程的全部控制权。强制门控让流程从用户的选择变成了系统的要求。</p><p>支持者引第 4 章——Ralph Loop 的核心价值就是不给 AI 交半成品的机会。AI 能绕过审查直接提交代码，它就会绕过审查直接提交代码——这个行为模式被反复验证过。强制门控的目标是 AI 的自我评估，不是人类开发者。AI 经常真心认为自己&quot;做完了&quot;，实际上漏掉了关键功能。审查和验证完成之前锁住 commit 按钮，工程上这是负责任的做法。</p><p>Garry Tan 的立场是中间偏强制：引导流程适合个人项目，强制流程适合多人协作和被审计的生产环境。gstack 支持双模式——在 Claude Code 上通过 hooks 实现强制门控，在不支持 hooks 的平台上退化为引导指令。这个设计认了一个现实：流程的强制力取决于平台的能力。有条件强制执行的时候，强制执行更好。没条件的时候，引导也比没流程强。</p><h2 id="5-6-实战：用-gstack-开发网页版贪吃蛇"><a href="#5-6-实战：用-gstack-开发网页版贪吃蛇" class="headerlink" title="5.6 实战：用 gstack 开发网页版贪吃蛇"></a>5.6 实战：用 gstack 开发网页版贪吃蛇</h2><p>前四章——Pocock Skills、OpenSpec、Spec-Kit、Ralph Loop——都用网页版贪吃蛇作为实战案例。本章同样，角度不同：前四章用一个工具开发，本章用一支虚拟团队开发。</p><blockquote><p>使用gstack开发网页版贪吃蛇游戏有点&quot;杀鸡焉用牛刀&quot;的感觉，不过为了给大家展示一个简单的示例以及和我前面章节保持一致，依然沿用这个例子。</p></blockquote><p>走的是不同流程，暴露的是不同问题。</p><p><img src="/images/image-20260531015936157.png"></p><p>初始运行的时候可能需要通过询问的方式配置gstack，按照问题正常回答即可，包括遥测、skill自动调用方式等等配置。</p><h3 id="5-6-1-Think：产品想法被盘问"><a href="#5-6-1-Think：产品想法被盘问" class="headerlink" title="5.6.1 Think：产品想法被盘问"></a>5.6.1 Think：产品想法被盘问</h3><p>启动 <code>/office-hours</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">用户: /office-hours 做一个贪吃蛇网页游戏。纯前端单文件。</span><br></pre></td></tr></table></figure><p><img src="/images/image-20260531012451905.png"></p><p>Agent 切换到 YC 合伙人模式，六个问题一个一个来（你实际运行时可能问题不同，我刚才实现了第四章的例子，它知道了，所以跳过了很多问题）：</p><blockquote><p><strong>Q1：做这个游戏的目标是什么？</strong></p><p>用户：这是一个做着玩的项目——展示 AI 编码 Agent 的能力。</p></blockquote><p>告诉它这只是自己氛围编程的学习项目。</p><blockquote><p><strong>Q2：你的用户怎么判断这个游戏&quot;做得好&quot;？</strong></p><p>用户：蛇能动，能吃食物，能死，死了能重来。最高分刷新后还在。</p></blockquote><blockquote><p><strong>Q3：最小可验证的第一步是什么？</strong></p><p>用户：一个 20×20 的网格上有一条能按方向键移动的蛇。</p></blockquote><blockquote><p><strong>Q4：你最大的技术风险是什么？</strong></p><p>Agent 自己回答：纯前端单文件项目，技术风险很低。但键盘事件处理和游戏循环同步是常见 bug 来源——快速连续按键可能导致蛇反向移动。</p></blockquote><blockquote><p><strong>Q5：你计划用多久完成？</strong></p><p>用户：一小时以内。</p></blockquote><blockquote><p><strong>Q6：如果这个项目失败了，最可能的原因是什么？</strong></p><p>Agent：过度设计。贪吃蛇很简单，但加入难度曲线、音效、排行榜、皮肤系统等&quot;看起来很棒&quot;的功能，交付时间会从一小时膨胀到一周。</p></blockquote><p>六问结束，Agent 产出一份设计文档，存入项目仓库。关键决策已明确：范围是&quot;可玩的原型&quot;，验收标准是&quot;蛇能动、能吃、能死、能重来、最高分持久化&quot;。不做的功能被显式记录——难度曲线、音效、排行榜、皮肤系统划入&quot;不在此次 Sprint 范围&quot;。</p><p><img src="/images/image-20260531013357046.png"></p><h3 id="5-6-2-Plan：四个角色审查同一个方案"><a href="#5-6-2-Plan：四个角色审查同一个方案" class="headerlink" title="5.6.2 Plan：四个角色审查同一个方案"></a>5.6.2 Plan：四个角色审查同一个方案</h3><p>运行 <code>/autoplan</code>，CEO、设计、工程、DX 四个角色依次审查。注意：<code>/autoplan</code> 只跑 Plan 阶段的四层审查——它不写任何代码。它的输出是一份被四个角色分别挑战过的方案文档，而非可运行的程序。你必须手动告诉 Agent &quot;按这份方案写代码&quot;，Build 阶段才开始。</p><p><strong>CEO 视角：</strong> &quot;这是演示项目，不是产品。扩张模式不适用。维持模式：只做核心玩法，不做任何超出演示需求的功能。&quot;</p><p><strong>设计视角：</strong> &quot;20×20 Canvas 网格合理。蛇绿色方块、食物红色方块——高对比度，可辨识。注意：游戏结束弹窗别用 <code>alert()</code>——那是 1998 年的设计。用 HTML modal，加半透明遮罩。&quot;</p><p><strong>工程视角：</strong> &quot;状态层和渲染层需要明确分离。<code>gameState</code> 对象集中管理蛇身数组、方向、分数、游戏状态。<code>gameLoop</code> 每 150ms 调 <code>update()</code>（纯逻辑）和 <code>render()</code>（纯绘制）。键盘事件写入 <code>nextDirection</code> 缓冲，<code>gameLoop</code> 在 <code>update()</code> 中同步到 <code>direction</code>——防止快速连续按键的反向 bug。&quot;</p><p><strong>DX 视角：</strong> &quot;TTHW 目标 &lt; 30 秒。零依赖——打开 <code>index.html</code> 就能玩。不需要 <code>npm install</code>、不需要构建步骤、不需要本地服务器。&quot;</p><p>工程视角的&quot;nextDirection 缓冲机制&quot;和设计视角的&quot;HTML modal 替代 alert()&quot;，是 Plan 阶段锁定的两个最关键决策。没这一步，它们会在 Build 或 Test 阶段才暴露——那时修起来多花五倍时间。</p><p><img src="/images/image-20260531013632751.png"></p><h3 id="5-6-3-Build：一次实现，两次返工"><a href="#5-6-3-Build：一次实现，两次返工" class="headerlink" title="5.6.3 Build：一次实现，两次返工"></a>5.6.3 Build：一次实现，两次返工</h3><p>gstack 的 Build 阶段有一个反直觉的设计：它没有定义编码 Skill。5.3.1 节的表格里，Build 行只列了 <code>/design-shotgun</code>（生成 4-6 个 AI 设计变体对比筛选）和 <code>/design-html</code>（将设计稿转为生产级 HTML&#x2F;CSS）——都是设计专项，不是逻辑编码。</p><p>贪吃蛇的逻辑实现不需要这两个。它直接调 Claude Code 原生编码能力，Agent 阅读 <code>/plan-eng-review</code> 锁定的架构（状态层分离、<code>nextDirection</code> 缓冲、150ms 游戏循环），把 ASCII 架构图和状态机描述翻译为代码。Plan 阶段的输出在此充当&quot;规格&quot;——不是 OpenSpec 式的精确验收标准，而是一份角色化审查过的实现约束。</p><p>这暴露了 gstack 的一个刻意取舍：Build 阶段没有像 <code>/review</code> 或 <code>/qa</code> 那样定义专门的编码角色。因为编码本身是 Claude Code 的强项——给出约束，生成代码，不需要额外的&quot;编码专家&quot;人格来增强。Garrick Toubassi（YC 的工程合伙人，gstack 的另一位核心维护者）在一个讨论帖中说过大致的意思：我们不教 Agent 怎么写代码，我们教 Agent 在写代码之前和之后该做什么。Plan 和 Review 是 AI 的弱点——需要角色化审查来弥补。编码是 AI 的强项——给它审查过的约束，放手让它写。</p><p>Plan 阶段方案清晰，Agent 按工程审查锁定的架构生成了第一版代码，四个任务：</p><ol><li><strong>HTML 结构与 Canvas 渲染</strong>：20×20 网格，绿色蛇，红色食物。</li><li><strong>状态管理与蛇的移动</strong>：<code>gameState</code> 对象，<code>nextDirection</code> 缓冲，150ms 游戏循环。</li><li><strong>碰撞检测与食物系统</strong>：墙壁碰撞、自身碰撞、食物消费、随机生成。</li><li><strong>分数系统与游戏状态管理</strong>：当前分数&#x2F;最高分、HTML modal 弹窗、重新开始按钮、localStorage 持久化。</li></ol><p>第一版跑起来就暴露了两个问题。食物随机生成偶尔会刷在蛇身上——概率不高，但蛇长了以后越来越频繁。更隐蔽的一个：游戏结束弹窗写了 HTML modal，但没处理焦点——弹窗出现后方向键仍然能控制蛇，导致&quot;死了还能动&quot;的诡异画面。Agent 自己没发现这些问题，<code>/review</code> 阶段才被揪出来。返工两次，Build 才算消停。</p><p>所以这一步在调用 <code>/autplan</code> 命令时就自动实现了。</p><h3 id="5-6-4-Review：员工工程师发现了什么"><a href="#5-6-4-Review：员工工程师发现了什么" class="headerlink" title="5.6.4 Review：员工工程师发现了什么"></a>5.6.4 Review：员工工程师发现了什么</h3><p>运行 <code>/review</code>：</p><blockquote><p>  Review</p><p>[CRITICAL] (confidence: 9&#x2F;10) ch05&#x2F;snake.html:164 — food&#x3D;null crashes draw loop when board fills up</p><p>  draw() accesses food[0] and food[1] at line 164 without null guard. When spawnFood() sets food &#x3D; null (board full), every rAF frame throws TypeError.</p><p> const fx &#x3D; food[0] * CELL + CELL&#x2F;2, fy &#x3D; food[1] * CELL + CELL&#x2F;2;</p><p>  Fix: guard food rendering.</p><p>  [CRITICAL] (confidence: 9&#x2F;10) ch05&#x2F;snake.html:193 — ctx.roundRect() unavailable on older browsers</p><p>  ctx.roundRect() requires Chrome 99+, Safari 15.4+, Firefox 112+. Older embedded WebViews throw and kill rendering. Fix: feature-detect with fallback to manual path.</p><p>  [P2] (confidence: 7&#x2F;10) ch05&#x2F;snake.html:235-239 — touchstart+click double-fires start() on desktop touch</p><p>  touchstart calls start(), then 300ms later synthetic click fires start() again. On desktop with touchscreen, this means: first touch during game-over resets AND starts in one tap<br>  (not two separate actions). Fix: track if touchstart already handled.</p></blockquote><p>不但review发现问题，它还会自动修复，直到没有问题。</p><h3 id="5-6-5-Test：QA-用真实浏览器测试"><a href="#5-6-5-Test：QA-用真实浏览器测试" class="headerlink" title="5.6.5 Test：QA 用真实浏览器测试"></a>5.6.5 Test：QA 用真实浏览器测试</h3><p>运行 <code>/qa</code>：</p><p>Agent 通过 <code>/browse</code> 的无头 Chromium 实例打开 <code>index.html</code>，执行：</p><ul><li>截图验证网格渲染正确（20×20 格子、蛇初始在中央）</li><li>模拟方向键按下，截图验证蛇的位置变化</li><li>模拟吃到食物的场景（脚本将食物坐标设为蛇头前方），验证蛇身变长、分数增加</li><li>模拟撞墙（蛇头移到边界外），验证游戏结束弹窗出现</li><li>验证最高分在 localStorage 中的持久化</li><li>验证隐私模式降级行为（清除 localStorage 后重试）</li></ul><p>全部测试通过。QA 自动生成了四个回归测试脚本，存入测试资产库。</p><p><img src="/images/image-20260531020221179.png"></p><h3 id="5-6-6-Ship：一键交付"><a href="#5-6-6-Ship：一键交付" class="headerlink" title="5.6.6 Ship：一键交付"></a>5.6.6 Ship：一键交付</h3><p>运行 <code>/ship</code>：</p><ul><li>同步主干 → 无冲突</li><li>运行全部测试 → 全部通过</li><li>审计测试覆盖率 → 关键路径 100% 覆盖</li><li>创建 commit（Conventional Commits 格式）</li><li>推送到远程</li><li>创建 PR（自动填写 What&#x2F;Why&#x2F;How）</li></ul><p>运行 <code>/land-and-deploy</code>：合并 PR → 等 CI 通过 → 确认部署成功。</p><p><img src="/images/image-20260531020522283.png"></p><h3 id="5-6-7-Reflect：基线存档"><a href="#5-6-7-Reflect：基线存档" class="headerlink" title="5.6.7 Reflect：基线存档"></a>5.6.7 Reflect：基线存档</h3><p>贪吃蛇这样一个小项目，<code>/retro</code> 的周回顾模式不太适用——它更适合多 Sprint 项目。但 <code>/benchmark</code> 还是跑了一遍：页面加载时间 180ms，首次渲染 320ms，游戏循环稳定性 ±2ms。这些数据作为基线存入项目仓库——将来有人加功能导致性能退化，对比基线立刻能发现。</p><p><img src="/images/image-20260531020845630.png"></p><h3 id="5-6-8-gstack-和其他方法论的对比"><a href="#5-6-8-gstack-和其他方法论的对比" class="headerlink" title="5.6.8 gstack 和其他方法论的对比"></a>5.6.8 gstack 和其他方法论的对比</h3><p>同一个贪吃蛇任务，四种方法论，四种体验：</p><table><thead><tr><th>维度</th><th>Pocock Skills（第 2 章）</th><th>OpenSpec（第 3 章）</th><th>Ralph Loop（第 4 章）</th><th>gstack（本章）</th></tr></thead><tbody><tr><td><strong>人类负担</strong></td><td>手动选择每个 Skill</td><td>写 proposal、跑命令</td><td>写好 prompt 就放手</td><td>逐个阶段运行命令</td></tr><tr><td><strong>流程长度</strong></td><td>7 个 Skill 手动串联</td><td>3 个命令 + 1 个归档</td><td>1 个 <code>/ralph-loop</code></td><td>7 个 Sprint 阶段</td></tr><tr><td><strong>自动化程度</strong></td><td>低（人类驱动）</td><td>中（半自动）</td><td>高（全自动循环）</td><td>中（阶段自动，入口手动）</td></tr><tr><td><strong>质量保证</strong></td><td>Skill 内建验证</td><td>Spec 验收标准</td><td>自动重试+测试</td><td>四层角色审查+QA</td></tr><tr><td><strong>发现问题的广度</strong></td><td>聚焦单个 Skill 的领域</td><td>规格符合性</td><td>测试+运行验证</td><td>CEO&#x2F;工程&#x2F;设计&#x2F;安全&#x2F;QA 全景</td></tr><tr><td><strong>最佳场景</strong></td><td>日常编码、小任务</td><td>功能开发、需求管理</td><td>无人值守长任务</td><td>从零到一的完整项目</td></tr></tbody></table><p>Pocock Skills 最快。七个斜杠命令，灵活，全程需要人驾驶。OpenSpec 最稳，规格先行不容易跑偏，代价是每步都要人写文档。Ralph Loop 最省心——写好 prompt 就能去睡觉，醒来验收，但 prompt 质量决定一切。gstack 最重。七个阶段走完确实比前三者都慢，多花的时间花在了审查记录上——CEO 为什么砍难度曲线、工程经理为什么锁定 nextDirection 缓冲、设计师为什么坚持 HTML modal 替代 alert。六个月后另一个人重构这个游戏，读到这些记录，省下的时间远不止当初审查花掉的那几十分钟。</p><p>回到第 1 章的框架：Pocock Skills 是一组工具，OpenSpec 是一份合约，Ralph Loop 是一个发动机。gstack 是一支军队。工具用在日常小任务上顺手，合约适合有规格的功能，发动机对付可以自动化验证的活，军队用在从零到一的完整项目上。</p><h2 id="5-7-Nanostack：gstack-的轻量级衍生"><a href="#5-7-Nanostack：gstack-的轻量级衍生" class="headerlink" title="5.7 Nanostack：gstack 的轻量级衍生"></a>5.7 Nanostack：gstack 的轻量级衍生</h2><p>gstack 的三十余个 Skill 和七阶段 Sprint 构成了一套完整的虚拟工程团队操作系统。但每个项目都走全流程？没必要。一个个人 side project、一个快速原型、一个只有一两个开发者的小项目——走 Think → Plan → Build → Review → Test → Ship → Reflect 全流程是杀鸡用牛刀。</p><p>Nanostack（由 garagon 开发）就是为这个场景设计的。受 gstack 启发，减掉了约三分之二的 Skill，保留了最核心的十三个。Sprint 同样是七阶段，但阶段门控可选——两种配置：Guided（更安全的默认，阶段间有门控）和 Professional（更自由的权衡，阶段间无强制门控）。</p><p>Nanostack 的十三核心 Skill 覆盖了：产品思考、工程计划、代码实现、自动审查、QA 测试、安全审计、发布交付、回顾分析。它和 gstack 的关系类似 Express 和 Rails——前者是后者核心思想的最小化实现，放弃了部分功能，换来了更低入门成本和更高灵活性。</p><p>怎么选？做需要完整治理轨迹的项目（合规性行业、多人协作、长期维护）——gstack，完整流程和强制门控的保障远大于流程成本。做快速验证（MVP、原型、个人项目）——Nanostack，保留一人多角色的核心价值，不会用流程锁住速度。</p><h2 id="5-8-gstack-的适用边界"><a href="#5-8-gstack-的适用边界" class="headerlink" title="5.8 gstack 的适用边界"></a>5.8 gstack 的适用边界</h2><p>gstack 不是万能药。有些场景它是超级武器，有些场景它是负担。</p><p><img src="/images/image-20260530010418181.png"></p><p><strong>最适合：</strong></p><ul><li><strong>从零到一的绿野项目。</strong> 没历史包袱。CEO 审查不会和已有代码冲突，工程审查不需要考虑迁移成本。gstack 在绿野项目上能满负荷运转，每一层审查都在创造价值。</li><li><strong>需要完整治理轨迹的项目。</strong> 合规性行业、ToB 产品、开源项目的核心模块——每次 PR 都需要能追溯谁在什么时间以什么理由做了这个决定。gstack 每个阶段的输出都是天然的审计轨迹。</li><li><strong>单人团队。</strong> 这是 gstack 最反直觉的适用场景。独立开发者没同事 review 代码，没 QA 测功能，没安全官审计漏洞。gstack 给了这个开发者二十三个虚拟同事——每个专精一个维度，在自己的领域内比开发者本人更专业。</li></ul><p><strong>不适合：</strong></p><ul><li><strong>小修小补。</strong> &quot;把按钮颜色从蓝色换成绿色&quot;——走完 Think → Plan → Build → Review → Test → Ship 全流程是荒谬的。gstack 的流程成本是固定的，任务越小，占比越高。</li><li><strong>存量项目中的增量变更。</strong> 给一个二十万行代码的项目加暗黑模式，不需要 CEO 重新审产品方向。gstack 没提供像 OpenSpec 那样的增量规格机制——它的设计假设是从顶层思考开始。</li><li><strong>需求模糊的探索性项目。</strong> gstack 的流程要求每个阶段做出承诺。CEO 审查后方向锁定，工程审查后架构锁定。如果项目本身还在探索&quot;到底要做什么&quot;，流程会变成形式主义——填模板而不是做决策。</li></ul><p>一个实用的判断公式：任务能写出一份清晰的 PRD，gstack 值回票价。任务还在&quot;试试看能不能 work&quot;，先用 Pocock Skills 快速探索，方向明朗了再上 gstack。</p><h2 id="5-9-与前后章节的关系"><a href="#5-9-与前后章节的关系" class="headerlink" title="5.9 与前后章节的关系"></a>5.9 与前后章节的关系</h2><p><strong>gstack 与 Skills（第 2 章）。</strong> gstack 的每个专家角色本质上是披了人格外衣的 Skill。Pocock 的 <code>/grill-me</code> 和 gstack 的 <code>/office-hours</code> 做同一件事——盘问需求——但前者是通用协议，后者是有角色身份的顾问。Skills 是原子，gstack 是分子——用角色化把原子组织成了有结构的团队。</p><p><strong>gstack 与 SDD（第 3 章）。</strong> gstack 的 Plan 阶段产出——CEO 审查结论、工程审查锁定的架构、设计审查结论——功能上等于一份多维度规格文档。但 gstack 没把规格作为独立 artifact 管理，它把规格分散在了各个角色的输出中。如果你需要可单独引用、可版本对比的规格文档，OpenSpec 或 Spec-Kit 更标准。如果你需要在多个维度上同时锁定方向，gstack 的多角色审查覆盖面更广。</p><p><strong>gstack 与 Ralph Loop（第 4 章）。</strong> Ralph Loop 解决&quot;做对了没&quot;，gstack 解决&quot;在对的方向上吗&quot;。两者互补——用 gstack 定方向（Think + Plan），用 Ralph Loop 跑执行（Build 阶段的自主循环），用 gstack 验收（Review + Test + Ship）。第 9 章&quot;方法论对比与融合&quot;会详谈这个组合模式。</p><p><strong>gstack 与 Harness Engineering（第 10 章）。</strong> gstack 的强制门控直接依赖 Claude Code 的 PreToolUse hooks——它是 Harness Engineering 最典型的上层应用。没 hooks 机制，gstack 的阶段门控就是引导指令，失去了强制力。gstack 和 Claude Code Harness 的关系，就是应用程序和操作系统的关系。</p><h2 id="5-10-本章小结"><a href="#5-10-本章小结" class="headerlink" title="5.10 本章小结"></a>5.10 本章小结</h2><p>gstack 的名字来自 Garry Tan 的一句话——他本质上是一个工程经理，管理一支临时工模型大军。它的 GitHub 描述只有五个词——&quot;open source software factory&quot;。这两句话加起来就是 gstack 的全部：不是让 AI 变聪明，是给 AI 建一个组织架构。</p><p>它的核心贡献在于把三个工业时代就有的概念用在了 AI Agent 身上：</p><ol><li><strong>专业分工。</strong> 不让一个 Agent 做好所有事。CEO 不写代码，员工工程师不思考产品方向，QA 不审计安全漏洞。二十三个角色各自审查自己擅长的维度，合起来覆盖一个人工审查者覆盖不了的面。</li><li><strong>流程门控。</strong> &quot;代码审查通过才能 commit&quot;——不靠人的自觉，靠系统强制执行。gstack 用 Claude Code 的 PreToolUse hooks 做到了。在人不完美的地方，系统不该配合人的懒惰。</li><li><strong>工件传递。</strong> 每个阶段的输出自动成为下一阶段的输入。<code>/office-hours</code> 的设计文档被 <code>/plan-eng-review</code> 读，Plan 锁定的架构被 Build 读，Build 产出的代码被 Review 读，Review 的发现被 QA 验证。一环扣一环，不靠人传话。</li></ol><p>这三个设计合在一起的效果是：一个人从代码生产者变成了工程管理者。Garry Tan 的八百一十倍产出不是因为编码变快了，是因为二十三个人同时在跑不同的线——他只需要定义目标、审查产出、做方向决策。</p><p>gstack 的适用边界也很明确。从零到一的绿野项目、需要完整治理轨迹的合规场景、单人团队——它是超级武器。小修小补、存量项目的增量变更、需求模糊的探索期——它太重了。实用的判断公式：能写出一份清晰 PRD 的任务，gstack 值回票价；还在&quot;试试看能不能 work&quot;的阶段，先用 Pocock Skills，方向明朗了再上 gstack。</p><p>如果第 2 章的 Skill 是能力单元、第 3 章的 Spec 是质量合约、第 4 章的 Ralph Loop 是执行引擎，那么 gstack 就是组织架构。它不让 AI 变得更聪明——它让一群 AI 在一个有纪律的团队里协作出一个人做不到的产出。</p><p>但 gstack 也沉重。三十余个 Skill，七阶段 Sprint，强制门控。下一章讲 superpowers，一个用 159K+ Stars 社区规模证明了相反设计方向的方法论系统：不靠流程锁住质量，靠足够多的 Skill 覆盖足够多的场景，让开发者在需要时自己选对的工具。一个讲究流程集成，一个讲究工具覆盖。两个系统的对比，会是全书方法论图谱中最有意思的一段。</p>]]>
    </content>
    <id>https://colobu.com/2026/06/28/gstack-methodology-virtual-engineering-team/</id>
    <link href="https://colobu.com/2026/06/28/gstack-methodology-virtual-engineering-team/"/>
    <published>2026-06-28T02:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>&quot;I basically operate as an engineering manager for a fleet of temporary models.&quot;<br>我本质上是一个工程经理，管理一支临时工模型大军。</p>
<p>——Garry Tan, Y Combinator 总裁 &amp; CEO, 2026 年</p>
</blockquote>
<p>Skill 是能力单元——一个 Markdown 文件定义一种行为。Spec 是合约，定义&quot;做成什么样才算对&quot;。Ralph Loop 是执行引擎，&quot;做不到就继续做&quot;。三者构成闭环：Skill 提供方法，Spec 提供标准，Ralph Loop 提供执行力。</p>
<p>但它们都隐含了同一个假设：<strong>你只有一个 Agent。</strong></p>
<p>把这个假设推倒。如果你可以同时拥有二十三个 Agent，每个被赋予一个不同的专家角色——有人负责产品思考，有人负责架构设计，有人负责代码审查，有人负责质量测试，有人负责安全审计，有人负责发布部署——并且它们按照一个严格的 Sprint 流程协作。会发生什么？</p>
<p>gstack 回答这个问题。它是一个虚拟工程团队的操作系统。</p>]]>
    </summary>
    <title>gstack 方法论：虚拟工程团队</title>
    <updated>2026-06-28T06:46:22.009Z</updated>
  </entry>
</feed>
