<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>AI 全栈 on 姚玉亮的网络日志</title><link>https://yusanwen-code.github.io/tags/ai-%E5%85%A8%E6%A0%88/</link><description>Recent content in AI 全栈 on 姚玉亮的网络日志</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Thu, 27 Aug 2026 22:30:00 +0800</lastBuildDate><atom:link href="https://yusanwen-code.github.io/tags/ai-%E5%85%A8%E6%A0%88/index.xml" rel="self" type="application/rss+xml"/><item><title>Claude Code 的 Workflow 功能：6 任务分 4 波，多 Agent 并行开发三端功能</title><link>https://yusanwen-code.github.io/posts/post-73/</link><pubDate>Thu, 27 Aug 2026 22:30:00 +0800</pubDate><guid>https://yusanwen-code.github.io/posts/post-73/</guid><description>&lt;img src="https://yusanwen-code.github.io/images/post-73-cover.jpg" alt="Featured image of post Claude Code 的 Workflow 功能：6 任务分 4 波，多 Agent 并行开发三端功能" /&gt;&lt;h2 id="一个-141-行的脚本指挥一群-ai-干活"&gt;一个 141 行的脚本，指挥一群 AI 干活&#10;&lt;/h2&gt;&lt;p&gt;炼丹炉（&lt;a class="link" href="https://github.com/yusanwen-code/alchemy-furnace" target="_blank" rel="noopener"&#10; &gt;Alchemy Furnace&lt;/a&gt;，我的开源项目）最近在做一个大功能：女娲蒸馏的范围收紧 + Skill 导出。它横跨三个端（Next.js 前端、Go 网关、Python 引擎），拆出来 6 个开发任务，有依赖、有先后、还要并行。&lt;/p&gt;&#10;&lt;p&gt;我用的方案是 Claude Code 的 Workflow 功能：写一个 141 行的 mjs 脚本，把 6 个任务分成 4 个波次，每波派多个 AI Agent 并行干活。脚本开头长这样：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 1&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 2&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 3&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 4&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 5&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 6&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 7&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 8&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt; 9&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"&gt;10&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff7b72"&gt;export&lt;/span&gt; &lt;span style="color:#ff7b72"&gt;const&lt;/span&gt; meta &lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name&lt;span style="color:#ff7b72;font-weight:bold"&gt;:&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#39;nuwa-scope-skill-export&amp;#39;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; description&lt;span style="color:#ff7b72;font-weight:bold"&gt;:&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#39;按计划实现女娲炼丹范围收紧 + Skill 导出（6 Task 分波并行）&amp;#39;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; phases&lt;span style="color:#ff7b72;font-weight:bold"&gt;:&lt;/span&gt; [&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { title&lt;span style="color:#ff7b72;font-weight:bold"&gt;:&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#39;Wave A: 并行底座&amp;#39;&lt;/span&gt;, detail&lt;span style="color:#ff7b72;font-weight:bold"&gt;:&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#39;Task1 前端入口 + Task2 Python 链路 + Task3 Skill 渲染器&amp;#39;&lt;/span&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { title&lt;span style="color:#ff7b72;font-weight:bold"&gt;:&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#39;Wave B: 服务端接合&amp;#39;&lt;/span&gt;, detail&lt;span style="color:#ff7b72;font-weight:bold"&gt;:&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#39;Task2b Go/前端错误透传 + Task4 导出接口&amp;#39;&lt;/span&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { title&lt;span style="color:#ff7b72;font-weight:bold"&gt;:&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#39;Wave C: 前端导出 UI&amp;#39;&lt;/span&gt;, detail&lt;span style="color:#ff7b72;font-weight:bold"&gt;:&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#39;Task5 详情导出对话框&amp;#39;&lt;/span&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { title&lt;span style="color:#ff7b72;font-weight:bold"&gt;:&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#39;Wave D: 端到端验收&amp;#39;&lt;/span&gt;, detail&lt;span style="color:#ff7b72;font-weight:bold"&gt;:&lt;/span&gt; &lt;span style="color:#a5d6ff"&gt;&amp;#39;Task6 全量回归与修复&amp;#39;&lt;/span&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;Workflow 的编排原语就几个：&lt;code&gt;agent()&lt;/code&gt; 派一个 Agent 做一件事，&lt;code&gt;parallel()&lt;/code&gt; 并行跑一组，&lt;code&gt;pipeline()&lt;/code&gt; 流水线，&lt;code&gt;phase()&lt;/code&gt; 分阶段。流程是确定性的（脚本写死的），干活是并行的（agent 同时跑）：确定性编排 + 并行吞吐，这就是 Workflow 和&amp;quot;让 AI 自由发挥&amp;quot;最大的区别。&lt;/p&gt;&#10;&lt;h2 id="分波设计依赖关系决定顺序"&gt;分波设计：依赖关系决定顺序&#10;&lt;/h2&gt;&lt;p&gt;6 个任务不是一把梭全并行，它们之间有依赖。分波的核心原则：同一波内的任务互不依赖且文件隔离，波与波之间靠产物衔接。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Claude Code Workflow：6 Task × 4 波次并行编排" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://yusanwen-code.github.io/images/post-73-waves.svg"&gt;&lt;/p&gt;&#10;&lt;p&gt;Wave A 三个任务互不依赖：前端改入口、Python 改链路、Python 写渲染器，改动文件完全不重叠，并行跑。Wave B 接合服务端：错误透传要读 Task2 的产物（Python 结构化错误），导出接口要调 Task3 的渲染器，等 A 波完成再动。C、D 依此类推。&lt;/p&gt;&#10;&lt;h2 id="多-agent-协调的六个细节"&gt;多 Agent 协调的六个细节&#10;&lt;/h2&gt;&lt;p&gt;分波只是骨架，真正让 6 个 Agent 不打架的是这些细节：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;COMMON 纪律注入。每个 Agent 的 prompt 都是 &lt;code&gt;COMMON + TASK + 终止条件&lt;/code&gt; 三段拼起来的。COMMON 里写死硬约束：TDD 先红后绿、只改自己任务列出的文件、提交格式 &lt;code&gt;type(scope): 中文描述&lt;/code&gt;、绝不 &lt;code&gt;git add -A&lt;/code&gt;、绝不提交 docs/superpowers/ 和 specs/ 等元文档、i18n 必须中英双语、测试命令、凭据保密。纪律写进 prompt 而不是靠自觉，6 个 Agent 才不会互相污染。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;文件隔离 + 以磁盘为准。每个任务只允许碰自己的文件，但并发任务可能改到同一文件，所以约束里有一条：&amp;ldquo;编辑前先 Read 磁盘最新内容，不要基于记忆&amp;rdquo;。并行和踩脚之间的平衡，靠这条纪律兜底。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;依赖确认靠 git log。Wave B/C 的任务 prompt 里写着：&amp;ldquo;先 git log 确认依赖任务已完成，并读它的接口签名再动手&amp;rdquo;。Agent 之间不通信，通过提交记录对齐。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;终止条件。每个任务都附一段 A3：文件不存在或结构差异巨大、关键依赖无法确认、测试连续 3 次修复失败，立即停止并报告，不许硬撑。这防止 Agent 在不确定的情况下编造&amp;quot;成功&amp;quot;。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;TDD 是硬约束。每个任务第一步都是&amp;quot;写失败测试 → 跑红 → 最小实现 → 跑绿&amp;quot;。6 个 Agent 并行写代码，质量一致性靠测试框架兜底。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;进度可视化。每波完成打一条 &lt;code&gt;log()&lt;/code&gt;：&lt;code&gt;task1=ok task2=FAILED&lt;/code&gt;，失败的任务肉眼可见，可以在下一波前人工干预。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="三端是怎么被协调的"&gt;三端是怎么被协调的&#10;&lt;/h2&gt;&lt;p&gt;这个功能本身横跨三端，Workflow 的波次刚好和端的分工对齐：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;端&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;技术栈&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;对应的任务&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;前端&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Next.js&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Task1 收紧女娲入口、Task5 导出对话框&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Go 网关&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Gin + GORM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Task2b 错误透传、Task4 导出接口&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Python 引擎&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;FastAPI&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Task2 蒸馏链路、Task3 Skill 渲染器&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;有意思的是 Python 端同时有 Task2 和 Task3 两个并行 Agent：它们文件不同（链路 vs 渲染器）所以不冲突，但同端并行也要求 prompt 里把边界写得特别清楚：&amp;ldquo;不要碰 backend/go/ 与 frontend/ 的 UI 文件——那些由另一任务负责&amp;rdquo;。&lt;/p&gt;&#10;&lt;h2 id="复盘workflow-教给我的"&gt;复盘：Workflow 教给我的&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;复杂功能先拆波再并行，依赖决定顺序。先画出任务依赖图，互不依赖的并行，有依赖的排波次。比&amp;quot;一个 Agent 从头做到尾&amp;quot;快得多，比&amp;quot;全并行&amp;quot;稳得多。&lt;/li&gt;&#10;&lt;li&gt;纪律要写进 prompt，不是靠提醒。提交纪律、文件边界、TDD、终止条件，每一条都防止一种 Agent 翻车方式。&lt;/li&gt;&#10;&lt;li&gt;终止条件比任务本身重要。允许 Agent 说&amp;quot;我卡住了&amp;quot;，比让它硬编一个成功报告安全一个量级。&lt;/li&gt;&#10;&lt;li&gt;上下文隔离是并行的前提。每个 Agent 只拿自己的任务片段，看不到其他任务的 prompt：专注 + 不越界。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这个脚本不是银弹：它适合任务边界清晰、文件可隔离、有测试兜底的场景。如果任务互相纠缠，先拆任务再谈并行。项目、计划文档和完整脚本都在 &lt;a class="link" href="https://github.com/yusanwen-code/alchemy-furnace" target="_blank" rel="noopener"&#10; &gt;GitHub&lt;/a&gt; 上，Wave A 的并行底座写法可以直接抄。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;封面图：&lt;a class="link" href="https://www.flickr.com/photos/richard_clyborne/32874464137" target="_blank" rel="noopener"&#10; &gt;richard_clyborne / Flickr&lt;/a&gt; · CC BY 2.0&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item><item><title>一次聊需求，三仓同落地：我的 superpowers 全栈开发工作流</title><link>https://yusanwen-code.github.io/posts/post-71/</link><pubDate>Thu, 27 Aug 2026 09:00:00 +0800</pubDate><guid>https://yusanwen-code.github.io/posts/post-71/</guid><description>&lt;img src="https://yusanwen-code.github.io/images/post-71-cover.jpg" alt="Featured image of post 一次聊需求，三仓同落地：我的 superpowers 全栈开发工作流" /&gt;&lt;h2 id="一个跨三个仓库的需求"&gt;一个跨三个仓库的需求&#10;&lt;/h2&gt;&lt;p&gt;我最近接到一个挺典型的需求：数据集管理里，&amp;ldquo;文档核验&amp;quot;这个动作要留痕：谁核验的、什么时候核验的；核验完还要能按数据集分页翻历史记录；管理后台加一个&amp;quot;核验记录&amp;quot;入口，点击弹列表，下拉就能一直加载；上层的知识库问答服务也要同步暴露这个列表接口。&lt;/p&gt;&#10;&lt;p&gt;这个需求横跨三个仓库：数据集管理服务、数据管理后台、知识库问答服务。&lt;/p&gt;&#10;&lt;p&gt;以前这种需求在我这儿是这么过的：拉群对齐需求 → 各写各的需求文档 → 前后端各自开工 → 联调时发现字段名对不上、分页参数叫法不一样 → 返工。现在我用 Claude Code 的 superpowers 工作流走了一遍完整流程，发现整个链条可以压缩成四步：brainstorming 聊需求 → 方案对比 → 写 spec → 生成实施计划。&lt;/p&gt;&#10;&#10;&lt;pre class="mermaid"&gt;&#10;flowchart LR&#10; A[&amp;#34;brainstorming 聊需求&amp;#34;] --&amp;gt; B[&amp;#34;方案对比&amp;#34;] --&amp;gt; C[&amp;#34;写 spec 落盘&amp;#34;] --&amp;gt; D[&amp;#34;生成实施计划&amp;#34;] --&amp;gt; E[&amp;#34;add-dir 挂三仓并行落地&amp;#34;]&#10;&lt;/pre&gt;&#10;&#10;&#10;&lt;style&gt;&#10;&#9;.mermaid {&#10;&#9;&#9;background: #ffffff;&#10;&#9;&#9;border: 1px solid #e5e7eb;&#10;&#9;&#9;border-radius: 10px;&#10;&#9;&#9;padding: 1rem;&#10;&#9;&#9;text-align: center;&#10;&#9;&#9;overflow-x: auto;&#10;&#9;}&#10;&#9;.mermaid svg {&#10;&#9;&#9;max-width: 100%;&#10;&#9;&#9;height: auto;&#10;&#9;}&#10;&lt;/style&gt;&#10;&lt;script src="https://yusanwen-code.github.io/js/mermaid.min.js" defer&gt;&lt;/script&gt;&#10;&lt;script&gt;&#10;&#9;document.addEventListener("DOMContentLoaded", function () {&#10;&#9;&#9;if (window.mermaid) {&#10;&#9;&#9;&#9;mermaid.initialize({ startOnLoad: true, theme: "default", flowchart: { curve: "basis" } });&#10;&#9;&#9;}&#10;&#9;});&#10;&lt;/script&gt;&#10;&#10;&lt;h2 id="第一步先探索代码再开口问"&gt;第一步：先探索代码，再开口问&#10;&lt;/h2&gt;&lt;p&gt;superpowers 的 brainstorming 第一步不是问&amp;quot;你想要什么&amp;rdquo;，而是先看项目上下文：路由注册在哪、handler 怎么写的、DAO 用的什么 ORM、前端页面结构、有没有现成的分页组件。&lt;/p&gt;&#10;&lt;p&gt;我让 Claude 把两个仓库都翻了一遍，结论：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;数据集管理服务是 Hertz + GORM 的架构，核验逻辑在文档服务的 revise 方法里，文档表上已经有一个&amp;quot;核验状态&amp;quot;字段，核验时会把它置为&amp;quot;已核验&amp;quot;&lt;/li&gt;&#10;&lt;li&gt;管理后台是 React + antd，代码里已经有现成的 &lt;code&gt;useInfiniteScroll&lt;/code&gt; 下拉加载 hook，数据详情页结构也很清晰&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这一步的价值在于：问题基于真实代码，而不是基于想象。我不用花十分钟给 Claude 讲架构，它自己读出来的上下文，比任何人的转述都准确。比如&amp;quot;核验状态字段已经存在&amp;quot;这个事实，直接影响了后面的设计：记录表和状态字段是两回事，但很多人第一版设计会混在一起。&lt;/p&gt;&#10;&lt;h2 id="第二步一次只问一个问题"&gt;第二步：一次只问一个问题&#10;&lt;/h2&gt;&lt;p&gt;brainstorming 最反直觉的一条规则是：一次只问一个问题。&lt;/p&gt;&#10;&lt;p&gt;我一开始也觉得慢。但跑下来发现，需求是逐层展开的：先问&amp;quot;核验记录需要存哪些字段&amp;quot;，确定存核验人和核验时间；再问&amp;quot;列表按什么过滤&amp;quot;，确定按数据集 ID；再问&amp;quot;前端入口放在哪&amp;quot;，确定放数据详情页。每个答案都会修正下一个问题，一次抛十个问题，模型只能靠猜排优先级，猜错一半就得返工。&lt;/p&gt;&#10;&lt;p&gt;对话节奏大概是这样的（简化示意，实际要比这细致）：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;我：核验记录需要展示哪些字段？&#10;Claude：先确认一下，除了核验人和核验时间，要不要把核验前后的版本号也存下来？这会决定表结构。&#10;我：先只存核验人和核验时间，跑通第一版。&#10;Claude：好。那列表接口按数据集 ID 过滤、支持分页返回，这个方向对吗？&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;一次一个问题看着慢，其实最快：每个问题都建立在之前答案的基础上，方向不会歪。&lt;/p&gt;&#10;&lt;h2 id="第三步给-2-3-个方案而不是直接开写"&gt;第三步：给 2-3 个方案，而不是直接开写&#10;&lt;/h2&gt;&lt;p&gt;需求聊清楚之后，brainstorming 会要求给出 2-3 个实现方案对比。这个需求当时有两个主流方案：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;方案 A：复用现有的行为记录表。那张表是 JSON 半结构化的流水表，加一种行为类型就能记录，不用建新表。&lt;/li&gt;&#10;&lt;li&gt;方案 B：新建独立的核验记录表。字段干净，查询直接，列表接口就是一条简单的 &lt;code&gt;WHERE dataset_id = ?&lt;/code&gt; 分页查询。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;我选了 B。核验记录是高频查询的业务动作，独立表让列表接口简单直接；方案 A 虽然少建一张表，但查列表要拆 JSON，而且行为流水表的数据量会持续膨胀，不适合做业务查询的底座。&lt;/p&gt;&#10;&lt;p&gt;选完方案，设计按块确认：表结构一块、接口定义一块、前端改动一块、上层同步一块，确认完再写进 spec 文档，落盘到 &lt;code&gt;docs/superpowers/specs/&lt;/code&gt; 目录下。这份文档是后续实施计划的输入，也是代码评审时对照的依据：评审不再靠记忆，而是对着 spec 逐条核对。&lt;/p&gt;&#10;&lt;h2 id="第四步add-dir-多项目前后端同时动"&gt;第四步：add-dir 多项目，前后端同时动&#10;&lt;/h2&gt;&lt;p&gt;设计获批后进入实施阶段。Claude Code 的 add-dir 可以把多个项目目录加进同一个会话，这个需求一次挂了三个目录：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;数据集管理服务：建表、在核验接口里写记录、新增分页列表接口&lt;/li&gt;&#10;&lt;li&gt;管理后台：数据详情页加入口、列表抽屉、下拉加载&lt;/li&gt;&#10;&lt;li&gt;知识库问答服务：同步暴露列表接口&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;多目录的意义不只是&amp;quot;能改多个仓库&amp;quot;，而是 AI 同时持有两边的上下文：字段名、接口路径、分页参数天然一致，联调成本趋近于零。以前前后端联调要查半天&amp;quot;到底叫 &lt;code&gt;page&lt;/code&gt; 还是 &lt;code&gt;current&lt;/code&gt;&amp;quot;，现在在计划阶段就把契约定死了，代码照着写就行。&lt;/p&gt;&#10;&lt;h2 id="几个真实的感受"&gt;几个真实的感受&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;一次一个问题反直觉，但确实是最快的提问方式。需求是逐层展开的，一次一个才能保证每个问题都有价值。&lt;/li&gt;&#10;&lt;li&gt;探索比提问重要。让 AI 先读代码，它问出来的问题才有质量；不探索就问，问的都是网上搜得到的通用问题。&lt;/li&gt;&#10;&lt;li&gt;设计文档不是走流程。跨仓库改动里，它是唯一让所有人（包括几周后的你自己）对齐的锚点。代码评审对着 spec 审，比对着记忆审靠谱一个量级。&lt;/li&gt;&#10;&lt;li&gt;YAGNI。AI 很容易过度设计，比如顺手提一句&amp;quot;要不要顺便做个操作审计&amp;quot;。不需要，砍掉。每个设计阶段都要主动问：这个功能现在真的需要吗？&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="建议"&gt;建议&#10;&lt;/h2&gt;&lt;p&gt;如果你也在用 AI 写代码，别只停留在&amp;quot;让它写函数&amp;quot;的层面。试试把流程也交给它：从一个小需求开始，完整走一遍 brainstorming → 方案对比 → spec → 计划 → 实现。第一次会不习惯&amp;quot;一次只问一个问题&amp;quot;，但跑完一个需求你就会发现，多花在澄清上的半小时，会在联调阶段加倍省回来。&lt;/p&gt;&#10;</description></item></channel></rss>