开场:一个需求,两条命
先讲一个几乎所有团队都遇到过的故事。需求很小:给内部后台的列表页加一个"导出 Excel"按钮。
版本 A:直接让 AI 写
你把这句话丢给 Agent:"给列表页加个导出 Excel。"
它立刻动手。改前端、加接口、写 SQL,一气呵成。十分钟后 PR(合并请求)打开了,Review 的时候问题一堆:
- 导出列和列表页显示的列对不上;
- 大数据量没做分页,导出十万行直接把服务卡死;
- 没有权限校验,谁都能导;
- 测试只覆盖了小数据量、一切顺利的理想路径;
- 下个迭代有人来改导出逻辑,没人知道当时为什么这么设计。
代码能编译,测试是绿的,Agent 也宣布"已完成"。三件事都是真的,交付仍然是失败的。
版本 B:先对齐,再动手
同一个需求,换一种走法:
- 先确认:导出哪些列?大数据量怎么办?谁有权限?
- 把结论写成一份 Spec:目标、方案、用户故事、实现决策、测试决策、明确不做什么。
- 把需求拆成能独立验收的切片:小数据量基础导出、大数据量异步导出加下载链接、权限校验。
- 按切片实现,测试先行,小步快跑。
- 让独立的 Review 对照原始需求检查一遍,"权限校验缺失"就是这一步被抓出来的。
- 留一份交接文档:设计决策在哪、还剩什么优化点。
第一次交付确实慢一些。但后续维护、Review、换人接手,每一步都更稳。
差距不在模型
两个版本用的是同一个模型。差距在于:版本 A 里,需求没对齐的地方、设计没落地的边界、没人拆分的任务、没人独立验证的结论,全被 AI 顺手补成了默认答案。AI 很擅长"看起来写对了":能运行不代表对,有测试不代表测到了关键路径,自称完成不代表没留隐患。
这类故障很少靠"换一个更强的模型"解决。项目状态、已确认的事实、任务边界和通过条件,不能只存在于模型的上下文里,它们需要被写下来,并在合适的时点接受检查。一句话说:
Agent = Model + Harness。模型提供智能,模型之外负责工具、上下文、权限、状态和执行约束的那层工程环境(Harness),决定这份智能能不能被可靠地用起来。
本文做的事情,就是把版本 B 拆开讲清楚。一个开发任务可以分成六个阶段:
可以把它们看成六个检查点,不必按固定流水线执行。任务在哪个检查点容易失控,就先补哪一段。接下来,我们会拿一个真实感更强的需求,完整走完这条线——每个阶段,先看它通常怎么翻车,再看用什么方法、什么工具把它救回来。
贯穿全文的案例:某直播平台贵族体系升级
导出 Excel 的故事够典型,但太单薄。要展示六个阶段各自的风险,需要一个会穿过多个系统的需求。我们手上正好有一个:某直播平台的一套贵族体系升级。我自己就是做这个需求的工程师,后面的规则、数据和坑,大多来自它的开发过程。
先看这个需求是怎么来的,它本身就是一个"为什么要做"的答案:
- 付费高度集中:一小部分高等级贵族用户,贡献了大部分金币消耗;
- 转化空间很大:最肯花钱的那批活跃用户里,买过贵族的并不多;
- 结构头轻脚重:绝大多数开通用户挤在低档位,升级动力不足。
同时,用户反馈攒了一摞:有人填了推荐人却没成功(怀疑是输入 ID 后忘了点确定);高等级贵族用户抱怨个人主页飘太久不更新;主播反馈 PC 上发不了贵族表情包,排查后发现 PC 根本没兼容贵族和 VIP 表情包;还有主播嫌礼物墙管理特权不够——很久之前收到的礼物一直挂着,"不利于近期卖惨人设"。
最后这条反馈,催生了本次升级里最有故事性的功能:礼物墙可见范围设置。
- 进入直播间时显示贵族身份标识;
- 进入直播间时,播放专属进场动效;
- 送礼时,房间播放专属横幅效果;
- 贵族可以在设置里隐藏礼物墙等级,并分别设置收礼、送礼礼物墙对外可见的范围:全部展示、仅近 1 年、仅近半年、仅近 3 个月、不展示;
- 不同贵族等级拥有不同权益数量,低等级用户操作设置项时会被引导开通。
进场动效:用户进入直播间时,为其播放的专属动态效果。
礼物墙:集中展示用户收到或送出过哪些礼物的收藏页,出现在礼物墙页、个人主页和直播间资料卡三个地方。
产品描述只有几行,改动却会穿过不少系统。
改动会穿过哪些系统
先是多个终端:APP、H5(运行在 App 或浏览器里的网页)和 PC 使用不同动画格式、页面结构和发布节奏,APP 能播的资源 PC 未必能用,PC 需要的新字段也不能影响 APP 的播放。再是多个业务域:身份信息来自账号或权益系统,进场状态属于直播间玩法,礼物效果在礼物链路里,展示权限还涉及用户关系和会员等级,单个模块拼不出完整体验。连接它们的是多种契约:页面走 HTTP,服务之间走 RPC,跨系统事件走消息,APP 与服务端遵守 Proto/IDL 约定的数据结构。字段能传过去,只证明链路通了;语义对不对,是另一回事。
最危险的问题往往不会报错
下面几种错误都可能正常编译,局部测试甚至也是绿的:
- 进场动效逻辑写进某种特殊玩法的条件分支,普通直播间永远不生效;
- PC 动画资源覆盖 APP 原有资源,另一个终端展示异常;
- 他人查看礼物墙时拿到本应隐藏的数据,比如用户设置了"仅展示近半年",接口却把一年前的礼物也返回了,只是前端没渲染;
- 领域服务开始猜"谁在看",身份判断散落到不同层次。
这类问题在真实业务里反复出现:前面提到的"PC 发不了贵族表情包",就是主播反馈后排查才发现的:功能在 APP 上一直正常,PC 端从未兼容,没有任何报错。
这里的难点不在 Java、TypeScript 或协议语法。结果取决于需求有没有问清,责任放在哪一层,任务如何拆开,以及谁用什么证据判断它已经完成。这正是六个阶段各自要管的事。
先说清楚:Vibe Coding 没有错,但它有适用边界
别误会版本 A 的教训。一次性脚本、临时数据转换、低风险页面调整,直接把目标告诉 AI 往往最省事。十分钟的任务如果先写 PRD、设计文档、任务树和交接记录,流程成本会高过任务本身。
该升级的信号也很具体:
- 改动跨多个模块或仓库;
- 一个会话很难稳定做完;
- 涉及权限、资金、隐私、迁移或兼容;
- 需求里有需要人承担后果的取舍;
- 要多人接力或长期维护;
- 同类问题在 Review 里反复出现;
- 代码能跑,却很难判断需求是否做完整。
任务越短、风险越低,越适合直接对话;
任务越长、影响越大,越需要显式阶段和持久化材料。
工作流不必覆盖所有任务。返工代价较高时,再把容易被忽略的工程步骤放回流程。这个直播需求跨终端、跨业务域、涉及隐私规则、要分批发布,几乎踩中了上面每一条,所以它是本文的主角。
先认个脸熟:本文常用名词、六套工作流和一组小 Skill
正式进入六站之前,先把两类名字认个脸熟:一类是全文反复使用的通用名词,一类是六站里会反复提到的开源项目。
通用名词
| 名词 | 在本文中的意思 |
|---|---|
| Agent | 能读取项目、调用工具并连续执行多步任务的 AI,不只是聊天框里的问答模型 |
| Harness | 模型之外的那层工程环境:工具、上下文、权限、状态和执行约束。Agent = Model + Harness |
| Skill | 一份可复用的行为说明,告诉 Agent 遇到某类任务时该怎么做、不能怎么做 |
| Artifact | 不会随聊天消失的项目材料:Spec、设计文档、任务清单、验证记录等 |
| Gate | 进入下一阶段前必须满足的条件,不满足就停下来 |
| Spec | 对目标、规则、边界和验收方式的明确说明,有些团队叫它 PRD |
| ADR | 对重要且难回退的架构决策留下的记录 |
| 垂直切片 | 一次切穿所有技术层、能独立演示验证的小任务,对应的是按技术层"横切" |
| Context Rot | 输入越长,模型表现越不稳定、早期约束被稀释的现象(Chroma 2025 年报告提出的叫法) |
| sub-agent | 由主 Agent 派出的独立干活的 Agent,带着自己的干净上下文 |
读的时候记不住也没关系,遇到再回来查。
六套工作流和一组小 Skill
六站里会反复提到六套开源工作流,外加 Matt Pocock 的一组 stage skill——每站"一个最小 Skill"小节的源码就出自后者。先把名字认个脸熟,具体怎么做,到各站和文章末尾再细看。
| 名字 | 一句话定位 | 关键词 | GitHub |
|---|---|---|---|
| Matt Pocock Skills | 小而可组合的 stage skill,本文六个"最小 Skill"的出处 | grilling / to-spec / handoff | mattpocock/skills |
| OpenSpec | spec-first:把变更先写成可审查的合同 | Proposal、Spec、Tasks | Fission-AI/OpenSpec |
| Superpowers | skill-first:给 Agent 立工程纪律 | HARD-GATE、TDD | obra/superpowers |
| Trellis | structure-first:把任务和项目记忆存进仓库 | .trellis/、Journal | mindfold-ai/Trellis |
| Get Shit Done(GSD) | phase-first:给长任务分段、防上下文腐烂 | .planning/、wave | gsd-build/get-shit-done |
| BMAD | agile-first:把 AI 协作组织成角色化敏捷团队 | PRD、Story、Retro | bmad-code-org/BMAD-METHOD |
| OMC | orchestration-first:多 Agent 编排与运行时治理 | loop authority、hooks | Yeachan-Heo/oh-my-claudecode |
别急着比较谁强谁弱。先跟完一个需求的六站旅程,最后再回头看怎么选。
把六阶段看成一张风险地图
Brainstorm、Design、Plan、Execute、Verify、Ship 看上去是直线,开发时却常有往返:小 Bug 可能只需确认原因、修复并验证;大功能在 Design 发现关键假设无法确认时,可能先做 Prototype 再回到需求讨论;跨会话任务在 Execute 中途就会写 Handoff,不必等到发布前。所以别把它当流水线,把它当风险地图:每个阶段管一类失控方式。
flowchart LR B["🧠 Brainstorm
需求澄清"] --> D["📐 Design
方案设计"] D --> P["🧩 Plan
任务规划"] P --> E["⚙️ Execute
实现执行"] E --> V["🔍 Verify
验证审查"] V --> S["🚢 Ship
交付沉淀"] D -. "假设无法确认
先 Prototype" .-> B E -. "架构撑不住
退回重看边界" .-> D V -. "需求遗漏" .-> P E -. "跨会话
随时 Handoff" .-> S
| 阶段 | 要回答的问题 | 主要 Artifact | 通过 Gate |
|---|---|---|---|
| Brainstorm | 我们理解的是同一个问题吗? | 目标、范围、决策记录 | 关键取舍已确认 |
| Design | 需求怎样进入现有系统? | Spec、设计、必要的 ADR | 边界和测试入口已确认 |
| Plan | 怎样拆成可独立验证的工作? | 任务、依赖、验收标准 | 每项任务都能说明完成条件 |
| Execute | 怎样在短反馈里安全实现? | 小步 Diff、测试和运行记录 | 当前切片获得新鲜证据 |
| Verify | 有什么证据证明做对了? | 测试输出、Spec/Standards Review | 阻塞问题已处理 |
| Ship | 怎样发布并让后续工作接得上? | PR、发布计划、Handoff、经验回流 | 发布和接续路径闭环 |
- Skill 规定 Agent 怎样行动;
- Artifact 保存已经确认的事实;
- Gate 决定什么时候可以继续。
例如,"一次只问一个决策"是一种 Skill 行为;确认后的需求与范围是 Artifact;关键取舍没确认就不写实现,是 Gate。
接下来六章,每章的讲法都一样:先看这个阶段最典型的翻车现场,再看方法和工具,最后回到直播间案例,看这段旅程怎么继续往前走。
第一站 Brainstorm:先确认问题,再允许 AI 动手
核心问题:我们理解的是同一个问题吗?
这是六段旅程的起点,也是版本 A 翻车的地方。你说一句需求,AI 就开始写代码;双方对"给谁用、什么格式、和现有功能什么关系"根本没对齐,于是它越写越偏。它不是在偷懒,是在替你补全。收到"给贵族体系增加权益展示"以后,Agent 很可能顺手做出几项假设:
- 所有终端展示相同内容;
- 本人和他人看到的礼物墙相同;
- 没有配置时使用默认展示;
- 新字段只需新增,不用考虑旧版本;
- "隐藏"只代表前端不渲染。
这些猜测每一项单看都不算离谱,但每一项都会改变产品行为或系统风险。等 PR 打开,你才发现它回答的根本不是你问的那个问题。
Brainstorm 要做的就是把这些默认答案摊开,而不是收集点子。分工很清楚:能从仓库里查到的事实(受影响模块、已有约定、需求歧义)由 AI 先查,不把检索工作推给人;会产生业务后果的取舍(业务目标、风险、兼容成本、不做什么)必须找到具体的人拍板。AI 可以整理选项,不能替团队默认。
贵族体系升级至少要确认:进场动效是否在所有直播间玩法里生效;礼物墙是否区分本人和他人;收礼与送礼是否分别设置可见范围;可见范围的时间档怎么定;低等级用户有没有设置入口;APP 与 PC 是否各用自己的动画资源;旧版本终端遇到新配置怎么办;哪些终端必须同批上线。
澄清前只有一句话:
"为贵族增加礼物墙隐藏功能。"
澄清后应当能写成可检查的业务规则。下面这组规则就是从我的 PRD 里浓缩出来的(细节已合并简化):
澄清后的五条业务规则1. 收礼、送礼礼物墙的可见范围分别设置,档位为:全部展示(默认)、 仅近 1 年、仅近半年、仅近 3 个月、不展示。 2. 本人查看自己的礼物墙时始终看到完整数据,被隐藏的部分用分界线 和锁头标记出来;他人视角任何情况下都不出现锁头。 3. 他人查看时只能获得可见范围内的礼物;范围外数据不进入接口响应。 注意:数量和冠名按累计值展示,不受时间范围过滤影响。 4. 该设置是付费权益,不满足等级的用户没有设置入口,操作时引导开通。 5. 旧版本终端无法隐藏等级行时,降级展示:等级图标换成缺省图, 名称固定显示"礼物墙",点亮数量显示"未点亮"。
第 3 条里"数量和冠名按累计展示"是个特别容易漏的细节:用户设置了"仅展示近半年",过滤的是礼物列表,但礼物的累计数量和冠名人仍然按全部历史计算。这种规则不写下来,实现的人大概率按直觉做成"全部按半年算"。这组规则还没有涉及技术方案。它把一句有多种解释的需求,变成产品、开发和测试能共同确认的内容。Brainstorm 留下的 Artifact,就是这份共同理解;它的 Gate 也很直白:关键决策没落定,就先别进入实现。
一个最小 Skill:grilling
Matt Pocock 的 grilling 把整个 Brainstorm 阶段压到了 12 行。下面按逻辑段给出原文和译文,逐段看它为什么长这样。
frontmatter
原文--- name: grilling description: Grill the user relentlessly about a plan or design. Use when the user wants to stress-test a plan before building, or uses any 'grill' trigger phrases. ---
名称 grilling(穷追猛问)。description:毫不留情地盘问用户关于计划或设计的方方面面。当用户想在动手前压测一个计划,或使用任何"grill"触发词时使用。
description 写给谁看?写给 Skill 路由器。它声明了触发条件——用户想压测计划时调用——这决定了这个 Skill 会在正确的时机被捡起,而不是在用户随口聊天时插嘴。
第一段:访谈怎么走
原文Interview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.
围绕这份计划的每个方面持续访谈我,直到我们形成共同理解。沿着设计树的每个分支走,按依赖顺序逐个解决决策。每问一个问题,都给出你的推荐答案。
两个设计点。"Walk down each branch of the design tree" 规定访谈沿着决策树走,不是漫聊——防的是聊了一小时、关键分支没碰到的"伪对齐";"provide your recommended answer" 要求 AI 带建议提问,人只需确认或否决,认知负担小得多。放在直播案例里,就是"可见范围给哪几档?我建议全部/近 1 年/近半年/近 3 个月/不展示,理由是覆盖主播隐藏历史礼物的诉求"这种问法,而不是一句空泛的"你有什么想法"。
第二段:一次一问
原文Ask the questions one at a time, waiting for feedback on each question before continuing. Asking multiple questions at once is bewildering.
一次只问一个问题,等到回答后再继续。一次问多个会让人无所适从。
一次抛五个问题,人往往只答最后两个,前面三个就被默认过去了——开场版本 A 里那些假设,正是这样被悄悄补全的。这条把"没回答"变成一个显式状态:没等到答案,流程就停在原地。
第三段:事实与决策的分工
原文If a *fact* can be found by exploring the codebase, look it up rather than asking me. The *decisions*, though, are mine — put each one to me and wait for my answer.
如果某个事实(fact)能通过翻代码库找到,就自己去查,不要问我。但决策(decisions)是我的——逐个提交给我,等我的答案。
fact 和 decisions 用斜体标出,是这份源码里唯一的强调。事实先查代码再问人,仓库里有的答案不占用人的注意力;决策归人,AI 可以推荐,不能拍板。这条划的是责任线,不是能力线:旧版本终端遇到新配置怎么办,代码里查不到,必须有人拍板;而"现有礼物墙接口返回哪些字段",AI 应该自己去仓库里翻。
第四段:Gate
原文Do not enact the plan until I confirm we have reached a shared understanding.
在我确认我们已形成共同理解之前,不要执行计划。
一句话挡住"聊完顺手就开写"。这是 Brainstorm 阶段的 Gate 落到一句指令上的样子:关键取舍没落定,实现就不开始。更强的同阶段做法会把这条从"口头约定"升级成"硬门禁",比如 Superpowers 的 brainstorming 明确规定,用户批准设计之前不准调用任何实现 Skill、不准写代码;含义相同,约束力不同。
十二行,四个动作:沿决策树问、一次一问、事实自查、确认前不动手。它们共同把"需求对齐"从一种良好愿望,变成一段可以被检查的行为。
六套工作流怎样覆盖这一阶段
| 工作流 | Brainstorm 中的代表做法 |
|---|---|
| OpenSpec | 用 Explore 模式讨论问题、边界和方案,探索期间不创建正式变更 |
| Superpowers | 先看项目上下文,逐个提问并比较少量方案,设计获批后继续 |
| Trellis | 在 Planning 中确认需求,把结论持续写入任务 Artifact |
| Get Shit Done | 通过 New Project、Spec Phase 等入口识别目标和阶段歧义 |
| BMAD | 由 Analyst、PM 等角色完成需求发现和范围澄清 |
| OMC | 使用 Deep Interview 消除高影响歧义,再选择执行模式 |
两个代表值得展开看。OpenSpec 的 /opsx:explore 把"探索期"做成了明确状态:在创建任何文档、写任何代码之前,先聊透范围、边界和验收标准,期间不产生正式变更档案,原则是"没聊清楚前,不动工"。它适合那些想保留轻量对话、但希望"聊"和"做"之间有明确分界线的团队;等聊透了,才用 /opsx:propose 把结论落成合同(下一站会看到)。
OMC 的 /deep-interview 则是另一个取向:苏格拉底式的一次一问,专门暴露需求里的假设,同样不生成 Artifact、不写代码;等你说"make it a plan",它把访谈结论 handoff 给 /plan,进入 PRD 和测试规格的生成。它适合任务边界模糊、又打算后续用 OMC 的多 Agent 执行能力的场景。访谈不是终点,是给后续编排选模式、攒输入。
需求对齐了,但别急着写代码。"要什么"清楚了,"放进系统的哪个位置"还没定。下一站要处理的,正是这个更隐蔽的坑。
第二站 Design:把"要什么"变成"怎样进入系统"
核心问题:需求怎样进入现有系统?
需求达成一致以后,还要决定责任放在哪里。只盯着当前文件,很容易做出局部能跑、全局难维护的方案。这类翻车更安静:设计只存在于聊天记录里,边界判断随着实现散落在各层,过两个月没人说得清"为什么这么设计",新会话接手的人只能从头考古。
"他人查看礼物墙"涉及两个身份:礼物墙属于谁,当前查看者又是谁。如果每一层都接收两个用户 ID,再各自判断是不是本人,短期很灵活,过一阵就会变成这样:
- HTTP 层判断一次;
- 领域服务再判断一次;
- APP 和 H5 接口各有一套判断;
- 某条消息链路没有查看者身份,只好猜;
- 隐私规则分散,没人说得清哪处才是准的。
代码可能都能运行,系统边界却已经松了。注意这个因果:上一站需求里"他人不能获得隐藏数据"这条规则,如果在这里不落到一个确定的位置,后面每个环节都会用自己的方式重新解释它。
第一个设计问题:浏览者与目标用户的关系由谁判断?两种做法的差别很明显:
| 判断放在哪 | 结果 | |
|---|---|---|
| 错误做法 | APP / H5 / PC 各自传入两个用户 ID,HTTP 层比一次,领域服务再比一次,不同接口各自决定要不要隐藏 | 规则逐渐漂移,某条链路迟早漏掉过滤 |
| 更好做法 | 拥有完整登录信息的请求入口统一判断"本人 / 他人",下游只接收 SELF / OTHER 的明确语义,由一处可见性策略执行过滤 | 规则只有一个出处,改一处就全改对 |
请求入口拥有完整身份信息,因此由它判断关系;下游只接收明确的业务含义,不再反复猜"谁在看"。我最后的实现也是这个形状:各端在请求入口判断"查看者是不是墙主",再把结论传给下游礼物服务,真正的过滤只发生在那一处。
第二个问题是 APP 与 PC 的动画资源。两端使用不同格式时,不要为了复用字段而互相覆盖。APP 保持原字段语义,PC 使用专门字段或数据结构。多几个字段,通常比跨端语义污染便宜。真实 PRD 里这个决策的样子很具体:进场动效要在 PC 展示,但 PC 只支持 webp,于是后台物品管理里新增一个"PC 端动画资源"字段:填了就直接读取,没填则由服务端自动从 pag/svga 转出 webp。新字段、默认值、填不上时的兜底转换,三件事一次写清,存量资源的处理方案另列待确认项,不混进主流程。实现的时候,我把它做成了一个独立的定时 Job:离线扫描存量装扮资源,转成 webp 写回 PC 端字段。表情包权限也没有写成散落的 if-else,而是收进一个独立的权限管理器,锁态和提示文案都走配置。
第三个问题最容易被忽略:新旧版本兼容。旧版本 APP 的个人主页无法做到"隐藏等级整行不展示",真实 PRD 的决策是降级而不是硬撑:等级图标换成缺省图、名称固定显示"礼物墙"、点亮数量显示"未点亮";PC 表情包的版本处理也类似:低于某个版本的客户端保留"可以查看、无法发送",新版本才能发送。这类决策如果不写进设计材料,下游每个端都会按自己的理解猜:有的端选择不展示,有的端选择展示旧数据,同一个用户在不同设备上看到两种结果。隐私功能最怕的就是这种漂移。
在我写的代码里,这些决策都留下了痕迹:协议新字段一律判空,旧版服务不下发时就按原逻辑走;兼容逻辑从来不会自动正确,它只是把设计阶段的降级决策逐条兑现。
设计材料不求长:方案边界和数据流、接口变化、兼容与降级策略、从哪个入口观察结果(测试接缝)、明确不做什么,能让后续拆任务的人知道边界和观察点就够了。
一个最小 Skill:to-spec
Matt Pocock 的 to-spec(原名 to-prd)负责把已经讨论清楚的内容落成一份 Spec。这次给出完整原文,分段对照。
frontmatter
原文--- name: to-spec description: Turn the current conversation into a spec and publish it to the project issue tracker — no interview, just synthesis of what you've already discussed. disable-model-invocation: true ---
把当前对话变成一份 spec 并发布到项目的 issue tracker——不做访谈,只综合已经讨论过的内容。
disable-model-invocation: true:禁止模型自动触发。
disable-model-invocation: true 这一行值得停一下。grilling 没有它,因为访谈应该由模型在需要时主动拉起;而 to-spec 是一个"落锤"动作——把讨论结果固化成文档——必须由人显式下令,不允许模型觉得"聊得差不多了"就自己把 Spec 写了。落锤权在人手里,这和 Design 阶段的 Gate 是同一件事的两面。
开头:只综合,不访谈
原文This skill takes the current conversation context and codebase understanding and produces a spec (you may know this document as a PRD). Do NOT interview the user — just synthesize what you already know.
这个 skill 利用当前对话上下文和对代码库的理解,产出一份 spec(你可能更熟悉 PRD 这个叫法)。不要访谈用户,只综合你已经知道的内容。
它和 grilling 是分工关系:访谈已经做完了,这里只综合,不重新打扰人。防的是每个环节都重新问一遍,把人问烦以后开始敷衍确认。
Process 第 1 步:先读仓库和 ADR
原文1. Explore the repo to understand the current state of the codebase, if you haven't already. Use the project's domain glossary vocabulary throughout the spec, and respect any ADRs in the area you're touching.
如果还没做过,先探索仓库,了解代码库现状。整份 spec 使用项目领域词汇表(domain glossary)的术语,并尊重你改动区域的 ADR。
两个具体要求。"domain glossary" 保证 Spec 里的词和代码里的词是同一套——直播案例里就是统一说"礼物墙""进场动效",而不是 Spec 一套词、代码一套词;"respect any ADRs" 要求写方案前先读已有架构决策,新设计和旧 ADR 冲突时,要么改方案,要么显式推翻旧决策,不能假装它不存在。
Process 第 2 步:先定测试接缝
原文2. Sketch out the seams at which you're going to test the feature. Existing seams should be preferred to new ones. Use the highest seam possible. If new seams are needed, propose them at the highest point you can. The fewer seams across the codebase, the better - the ideal number is one. Check with the user that these seams match their expectations.
勾出你打算在哪些接缝(seams)上测试这个功能。优先复用现有接缝,而不是造新的。尽可能用最高层的接缝。如果确实需要新接缝,也要在尽量高的位置提出。整个代码库的接缝越少越好,理想数量是一个。
写之前先和用户确认这些接缝符合预期。
seams 是"从哪里看结果"的观察点:公开接口、消息输出、用户可见行为都算。这一步把"怎样验证"前置到设计阶段——测试接缝不是写完代码补的,是设计的一部分。直播案例里,"他人查看礼物墙"的接缝选在接口响应而不是页面渲染,第五站会看到,这个选择直接决定了 Spec Review 能不能抓住"前端不渲染但数据照返"的错误。
Process 第 3 步:按模板写并发布
原文3. Write the spec using the template below, then publish it to the project issue tracker. Apply the `ready-for-agent` triage label - no need for additional triage. <spec-template> ## Problem Statement ## Solution ## User Stories ## Implementation Decisions ## Testing Decisions ## Out of Scope ## Further Notes </spec-template>
按下面的模板写 spec,然后发布到项目的 issue tracker,打上
ready-for-agent 的分诊标签,不需要再走额外分诊。模板七节:Problem Statement(问题陈述)、Solution(方案)、User Stories(用户故事)、Implementation Decisions(实现决策)、Testing Decisions(测试决策)、Out of Scope(明确不做的事)、Further Notes(补充说明)。
发布到 issue tracker 并打 ready-for-agent 标签,是一个容易被忽略的闭环设计:Spec 的终点不是一份文档,而是任务系统里一张"可以被 Agent 直接领走"的工单——它把 Design 的产物直接接到 Plan/Execute 的入口上,不需要人再转述一遍。模板里 Testing Decisions 和 Out of Scope 独立成节也有讲究:这两项恰是大多数团队最容易漏的,漏了前者,Execute 没有观察点;漏了后者,Agent 会把顺手能做的都塞进范围。
这份 Skill 的 Gate 也清楚了:没有成型的 Spec,就不进入拆任务。下一站的 to-tickets,吃的正是这里的输出。
六套工作流怎样覆盖这一阶段
| 工作流 | Design 中的代表做法 |
|---|---|
| OpenSpec | 生成 Proposal、能力 Spec 和必要的 Design,用场景规则描述变更 |
| Superpowers | 保存已批准设计,在计划与实现前设置用户批准 Gate |
| Trellis | 用 prd.md 保存需求,复杂任务用 design.md 记录边界和契约 |
| Get Shit Done | 用阶段 Spec、Context、Research 等材料建立设计依据 |
| BMAD | 从 PRD 推进到 Architecture,保持产品与系统设计连续 |
| OMC | 通过 PRD、测试规格和计划审查绑定需求覆盖与验证方式 |
展开看两个。OpenSpec 的 /opsx:propose 把设计落成仓库里的变更档案:openspec/changes/<change-name>/ 下放 proposal.md、specs/<capability>/spec.md、复杂变更再加 design.md 和 tasks.md。Spec 有硬性格式:每条需求用 SHALL/MUST 表述,且至少配一个 Scenario——"他人查看时范围外数据不进入接口响应"这种规则,在这里必须写成可检查的场景,而不是形容词。它适合需要编码前评审、变更历史可追溯的团队;代价是这些合同要人持续写、持续审,没有 Review 习惯的团队会跳过它。
BMAD 走角色化路线:PM 角色用 bmad-prd 产出 planning_artifacts/prd.md(需求条目带稳定的 FR 编号),随后 Architecture 阶段产出 ARCHITECTURE-SPINE.md,写明不变量、模块边界、依赖、数据归属和状态管理。它有一道 PRD Reviewer Gate:按 rubric 逐项走查、reviewer 审查、遗留问题分诊,走完才能 finalize。适合产品型大项目从需求到架构一步不缺地推进;小团队全套走下来会嫌重,可以只借 PRD + Architecture 两份 Artifact 的格式。
设计落到了纸面上,SELF/OTHER 的判断有了归属。但一份好设计不等于一份能执行的任务清单。方案清楚,不代表适合一次性塞给 Agent。下一站的翻车,恰恰发生在"上下文装不下"这件事上。
第三站 Plan:把大需求拆成可独立验证的工作
核心问题:怎样拆成可独立验证的工作?
Plan 阶段的典型死法有两种。第一种是把"实现 XX 功能"整个当成一个任务丢给 Agent,做到一半上下文崩了,或者它悄悄忘了两小时前确认的边界。第二种是按技术层横切,拆出一堆各自"完成"却拼不起来的任务。
先看第一种。假设任务只有一行:
"完成贵族体系的多端改造。"
Agent 要同时记住协议、账号、礼物、房间、H5、PC、APP、隐私规则、资源格式、版本依赖,以及几个系统接起来联调的顺序。上下文窗口(AI 一次能记住的内容量)装得下这些文字,不等于模型会始终同等重视它们。近期错误和局部实现会逐渐占据注意力,早期确认的边界则容易被冲淡。Chroma 的研究观测了 18 个前沿模型,发现输入 token 增加时性能非均匀下降,并把这种长上下文中的退化称为 Context Rot。这正是上一站埋下的隐患:设计边界写得很清楚,但如果不拆小,它会在长会话里被稀释掉。
再看第二种死法。常见拆法按技术层分任务:
❌ 水平拆分(按技术层)任务 1:修改协议 任务 2:修改后端 任务 3:修改 H5 任务 4:修改 PC 任务 5:补测试
在最后一项完成前,没有一个任务形成用户可验证行为。协议和后端各自完成,联调时才发现语义不一致,这种情况并不少见。
✅ 垂直切片(按可演示行为)切片 1:普通直播间的进场动效,从协议到 PC webp 展示完整跑通 切片 2:本人查看礼物墙时,完整数据加分界线、锁头正常展示 切片 3:他人查看设置"仅展示近半年"的礼物墙时,只获得范围内礼物 切片 4:旧版本终端查看隐藏等级的资料卡时,按降级规则展示
每个切片穿过必要的技术层,但范围窄,可以独立演示,也容易放进干净的新会话。
任务标题还不够。以"他人查看礼物墙"为例,至少要给出可执行的验收标准。我的 PRD 里有个现成的情景:某用户累计收到 10 个 A 礼物(其中半年内 2 个,冠名人是一年前的送礼者)和 5 个 B 礼物(半年内 0 个),他把收礼可见范围设为"仅展示近半年"。这时验收标准应该是:另一个人来看他的收礼礼物墙,只能看到 A 礼物,而且 A 的数量和冠名仍按累计值展示;用户自己看,则能看到全部礼物,以及"以下礼物他人不可见"的分界线。写成验收语言就是一句"给定……当……那么……":
给定墙上同时存在半年内和更早的礼物,当他人查看这面墙,那么响应里只有范围内礼物,本人查看则不受影响。
注意"数量和冠名按累计值展示"这一笔,就是 Brainstorm 阶段记下的那条容易漏的规则,在这里变成了可检查的断言。开发知道实现目标,测试知道观察入口,下一会话也不用重新解释什么叫"正确过滤"。一份能执行的计划,说到底就是让每个任务都能独立回答"怎样算完成"。
一个最小 Skill:to-tickets
Matt Pocock 的 to-tickets(原名 to-issues)把"怎么拆"直接写成了规则。完整原文分段对照如下。
frontmatter 与开头:拆成 tracer bullet
原文--- name: to-tickets description: Break a plan, spec, or the current conversation into a set of tracer-bullet tickets, each declaring its blocking edges, published to the configured tracker — edges as text in a local file, or native blocking links on a real tracker. disable-model-invocation: true --- # To Tickets Break a plan, spec, or conversation into a set of **tickets** — tracer-bullet vertical slices, each declaring the tickets that **block** it.
把计划、spec 或当前对话拆成一组 tickets——曳光弹式(tracer-bullet)垂直切片,每个都声明阻塞它的其他 tickets;发布到配置好的 tracker,没有 tracker 就在本地文件里用文字写明依赖边。同样禁止模型自动触发。
tracer bullet 是个精准的比喻:曳光弹不追求一击致命,它追求"打出去能看见弹道"。每个 ticket 存在的意义是让进展可见、可验证,而不是把工程量均分。
核心规则:vertical-slice-rules
原文<vertical-slice-rules> - Each slice cuts a narrow but COMPLETE path through every layer (schema, API, UI, tests) — vertical, NOT a horizontal slice of one layer - A completed slice is demoable or verifiable on its own - Each slice is sized to fit in a single fresh context window - Any prefactoring should be done first </vertical-slice-rules> Give each ticket its **blocking edges** — the other tickets that must complete before it can start.
每个切片切得窄,但必须完整穿过每一层(schema、API、UI、测试)——垂直的,不是某一层的水平切片;完成的切片能独立演示或验证;大小以能放进一个全新上下文窗口为准;需要预重构(prefactoring)的话先做。然后给每个 ticket 声明 blocking edges——必须先完成它才能开工的其他 tickets。
四条规则各防一种死法。"narrow but COMPLETE path" 防的就是前面按技术层横切的拆法:"改协议""改后端"各自完成却拼不起来。"demoable or verifiable on its own" 给了 Plan 一个客观判据:说不清"做完能演示什么"的切片,就是还没拆到位。"sized to fit in a single fresh context window" 直接回应 Context Rot——任务大小的上限不是模型读不读得下,而是在一个全新会话里能不能稳定做完。"blocking edges" 显式声明谁挡谁;没有依赖边,并行执行就是赌博,发布顺序靠记性。注意第四条 prefactoring:容易被跳过的一条——直播案例里"先把进场动效组装逻辑移出特殊玩法分支"正是典型的 prefactoring,不先做它,后面每个切片都要绕着这坨旧结构走。
收尾一步:让用户拷问拆分
原文### 4. Quiz the user Present the proposed breakdown as a numbered list. For each ticket, show: - **Title**: short descriptive name - **Blocked by**: which other tickets (if any) must complete first - **What it delivers**: the end-to-end behaviour this ticket makes work Ask the user: - Does the granularity feel right? (too coarse / too fine) - Are the blocking edges correct — does each ticket only depend on tickets that genuinely gate it? - Should any tickets be merged or split further? Iterate until the user approves the breakdown.
把建议的拆分用编号列表展示,每个 ticket 给出标题、Blocked by(哪些 ticket 必须先完成)、What it delivers(它跑通的端到端行为)。然后问用户:粒度合适吗,太粗还是太细?blocking edges 真实吗——每个依赖是不是真正的 Gate?有没有要合并或继续拆的?迭代到用户批准拆分为止。
这一步容易被当成文书工作省掉,其实它是 Plan 阶段的 Gate:拆分是设计决策,不是誊写。"What it delivers" 要求写出端到端行为而不是任务动作——写不出行为的 ticket,当场就暴露了它切得不对。对应到直播间案例,就是"他人查看设置'仅展示近半年'的礼物墙时只获得范围内礼物"这句可演示的话,而不是"修改礼物墙接口"。
到这一步,Plan 的 Gate 就立起来了:拆分经人批准、每个 ticket 自带验收行为,才轮到 Execute 开工。
六套工作流怎样覆盖这一阶段
| 工作流 | Plan 中的代表做法 |
|---|---|
| OpenSpec | 用 Tasks 把变更合同转成可追踪清单,在 Apply 时逐项推进 |
| Superpowers | 把文件、测试、命令和预期输出写进步骤,分开失败测试、实现和验证 |
| Trellis | 在任务目录维护 implement.md 及按需读取的上下文清单 |
| Get Shit Done | 用 Phase Plan、Roadmap 和 State 管理范围、依赖与进度 |
| BMAD | 把 PRD 和架构继续拆成 Epic、Story 与 Sprint 状态 |
| OMC | 让计划、Acceptance Criteria、测试规格和执行模式形成合同 |
展开看两个代表。Get Shit Done 的 /gsd:plan-phase 把计划当成要过审的 Artifact:gsd-phase-researcher 先写 NN-RESEARCH.md(事实结论必须带来源,第三方包标 ASSUMED/VERIFIED),gsd-planner 再写 NN-PLAN.md,每个任务带 <files>、<action>、<verify>、<done>,明确禁止"v1 先做个基础版"这种隐性砍范围;最后 gsd-plan-checker 做对抗性审查,默认计划有缺陷,最多打回三轮。另有专项门禁:计划必须含安全威胁模型,每个任务的 verify 必须是自动化命令。适合长周期多阶段项目;小任务可以走它的 /gsd:quick 快通道。
Trellis 的做法轻一些但更贴日常:每个任务是一个目录 .trellis/tasks/MM-DD-<name>/,计划写在 implement.md(有序检查清单、验证命令、回滚点——出问题能退回的位置),另有两份上下文清单 implement.jsonl 和 check.jsonl,逐条声明"实现时要读哪个文件、为什么"。这份清单直接决定执行 Agent 的上下文里装什么,把"该读什么"从临场判断变成计划的一部分。两者一个重审一个重接续,共同点是:计划落到文件里,下一会话不用从聊天记录里猜进度。
任务拆好了,每个切片都有验收标准。现在 Agent 终于可以写代码了。但"怎么写"里还藏着一种翻车:一次改太多,错误很晚才暴露。这是下一站的戏。
第四站 Execute:在短反馈循环里实现
核心问题:怎样在短反馈里安全实现?
Execute 的主要动作当然是写代码。可靠性来自另一件事:反馈要足够快,修改范围也要足够小。这一站最常见的失败是:AI 看到 PRD 就开始全量改文件,一次改十几个文件,最后才跑完整测试。测试失败后,很难判断是哪一步破坏了系统;上下文里同时堆着补丁、日志和猜测,排查质量也会下降。改错模块、删了不该删的、测试挂了一片——都是这个节奏的产物。
更稳妥的节奏是:
短反馈循环读取当前切片 → 建立可运行的验证入口 → 做最小修改 → 立即验证 → 通过后进入下一片
反馈命令要让 Agent 能自己运行,失败信息明确,速度足够快,并且直接覆盖当前切片。它可以是单元测试、契约测试、模块编译,也可以是可重复的最小集成场景。
TDD(测试先行,先写会失败的测试,再写实现让它通过)在 Agent 场景里更重要,原因很具体:如果测试最后补,Agent 很容易照着刚完成的代码写断言,验证的只是"实现按自己的逻辑运行"。先看到测试因缺少行为而失败,再做最小修改让它变绿,才能减少这种自证偏差。协议、跨端资源和复杂 UI 未必适合严格单元测试,可以改用契约检查、编译验证或人工联调,但观察点要在实现前定好,这正是 Design 阶段写测试接缝的原因。
案例里有一种典型错误:进场动效的组装逻辑位于特殊玩法分支内。代码能编译,特殊玩法也正常,普通直播间却永远拿不到进场动效资源。
如果验收标准写的是:
"普通直播间中,用户进入且拥有有效进场动效资源时,PC 能获得展示数据。"
测试就不会只覆盖特殊玩法。把它放进一次短反馈循环,过程应该看得见:
RED → CHANGE → GREENRED 运行"普通直播间返回进场动效"的场景测试 → 失败:响应中没有进场动效资源 CHANGE 把进场动效数据组装移出特殊玩法专属分支 → 保留特殊玩法原有行为 GREEN 重新运行普通直播间与特殊玩法两组场景 → 两组都通过
RED 证明测试能捕获缺失行为;GREEN 证明当前修改解决了它。只说"代码已改完",没有失败到通过的证据,反馈循环就还没闭合。这一站的通过条件也只有一条:当前切片要有新鲜、可重复的验证结果,没有证据就不推进下一项;而如果失败反复出现、指向的是方案本身,就退回 Design 重看边界,别在执行层硬修。
一个最小 Skill:implement
Matt Pocock 的 implement 全文只有 15 行,是六个 Skill 里最短的一个。短是设计的一部分:执行阶段不该给 Agent 留自由发挥的空间。逐行对照看。
frontmatter 与第一句:输入是什么
原文--- name: implement description: "Implement a piece of work based on a spec or set of tickets." disable-model-invocation: true --- Implement the work described by the user in the spec or tickets.
根据 spec 或一组 tickets 实现一项工作。禁止模型自动触发。实现用户在 spec 或 tickets 里描述的工作。
"based on a spec or set of tickets" 是这份 Skill 的地基:实现的输入是上一站的产物,不是脑子里的印象。没有 ticket 就没有开工依据——这一句把 Execute 焊死在 Plan 的输出上。
TDD 与接缝
原文Use /tdd where possible, at pre-agreed seams.
在预先约定的接缝(pre-agreed seams)上,尽可能使用 /tdd。
两个限定词都有出处。"where possible" 承认协议、跨端资源和复杂 UI 不适合严格单元测试;"pre-agreed seams" 把观察点的来源钉死——seams 是 Design 阶段 to-spec 第 2 步定下的,执行阶段不临场发明观察点。直播案例里"普通直播间返回进场动效"的场景测试之所以存在,就是因为接缝早已写进 Spec。
验证节奏
原文Run typechecking regularly, single test files regularly, and the full test suite once at the end.
定期跑类型检查,定期跑单个测试文件,完整测试套件在最后跑一次。
注意 regularly 和 once 的对比。单测和类型检查频繁跑,问题在分钟级暴露;完整套件最后跑一次兜底。全量测试留到最后才跑,就是前面说的"一把梭"的出处——这一行是"短反馈循环"落到命令层面的样子。
完成后做什么
原文Once done, use /code-review to review the work. Commit your work to the current branch.
完成后,用 /code-review 审查本次工作。把工作提交到当前分支。
最后两行划出 Execute 的边界:实现完不直接宣布完成,先过独立 Review——"done" 这个词在这份 Skill 里不等于"完成",只等于"可以送审";提交到当前分支而不是开新分支或推远端,一个切片的改动就是一个可回滚单元。Gate 也随之明确:切片拿到新鲜验证结果、过了 Review,才轮到下一个。
十五行,没有一句讲怎么写代码,全是关于输入、验证节奏和收尾边界。执行纪律的意义正在于此:写代码的能力模型自己有,工作流要管的是它什么时候写、拿什么验证、什么时候停。
六套工作流怎样覆盖这一阶段
| 工作流 | Execute 中的代表做法 |
|---|---|
| OpenSpec | Apply 时读取变更 Artifact,按任务清单实施并更新状态 |
| Superpowers | 使用 TDD 和单任务执行 Agent,小步实现后进行任务级 Review |
| Trellis | 只注入当前任务相关的 Spec 与研究,可在主会话或实现 Agent 中执行 |
| Get Shit Done | 按阶段和 Wave 执行,让长计划分批进入新上下文 |
| BMAD | Developer 围绕已批准 Story 实现,并更新 Story/Sprint 状态 |
| OMC | 选择一个主循环,按任务使用持久、团队或并行执行模式 |
Superpowers 的 subagent-driven-development 是"每任务一个干净上下文"的严格执行版:先用 using-git-worktrees 隔离工作区并验证基线测试,然后每个 task 派一个全新的 implementer subagent,不带主会话历史,只靠任务文件干活;实现完派独立的 task reviewer 审 spec 符合度和代码质量,不过就派 fix subagent 修完再审;全部完成还有一轮全分支 final review。进度记进 .superpowers/sdd/progress.md 账本,防止上下文被压缩后重复执行。约束同样硬:不允许跳过 review、不允许并行派多个 implementer、执行中不中途问人。它适合边界清楚、值得为每个任务付两次上下文成本的改动;小任务这么跑显然过重。
Get Shit Done 的 /gsd:execute-phase 解决另一个问题:长计划的并行与隔离。原则是"orchestrator 协调、不亲自执行"——分析依赖后把任务分组成 wave,每个 wave 派 gsd-executor subagent 并行跑;同 wave 改同一文件的任务强制串行,用 git worktree(给每个任务开一个独立目录)隔离;每个 wave 合并后跑构建和测试,绿了才进下一个。前提是环境支持 subagent 和 worktree,缺一这套并行就要降级。
代码写完了,切片测试全绿。可以宣布完成了吗?还不行。测试只回答测试里写过的问题。下一站要处理的,是"AI 自己证明自己正确"这件事。
第五站 Verify:不要让 AI 自己证明自己正确
核心问题:有什么证据证明做对了?
Agent 说"我已经验证过了"。你一问,它跑的是自己写的那条顺利路径,边界情况、错误处理、权限路径都没测。这不是撒谎,是自证闭环:同一个 Agent 理解需求、设计、写代码、补测试,然后宣布完成,效率很高,也容易把同一项误解带到每一步。如果需求一开始就读错了,代码和测试可能一起证明这套误解内部自洽。
所以 Verify 至少要分开检查两个问题:
- Standards:代码是否符合项目规范和工程质量要求?
- Spec:实现是否满足原始需求?
优雅的代码可能做错需求;功能表面正确,也可能破坏边界、泄漏数据或留下维护负担。
贵族体系案例里的这些错误都可能通过编译:
- 范围外礼物仍在响应里,只是前端没渲染;
- 数量按"近半年"过滤了,但 Spec 要求数量和冠名按累计值展示;
- 锁头 icon 在他人视角也显示了(Spec 写明锁头只出现在本人视角);
- 本人与他人的权限判断写反;
- 普通直播间进不了特殊玩法分支;
- 旧版本终端没走降级规则,直接不展示等级行,和 Design 定的"缺省图+礼物墙+未点亮"不一致。
它们需要对照 Spec、数据流和用户行为审查,编译器看不出来。尤其前两条:它们完全反直觉,只有在需求阶段被写下来、在验收标准里变成断言,Review 时才有据可查。
测试通过,Spec Review 仍然失败
假设实现者选择了最容易观察的页面结果:前端不渲染隐藏礼物卡片,并补了一条页面测试。最后可能出现三份互相不一致的证据:
| 证据通道 | 检查内容 | 结果 |
|---|---|---|
| 页面自动化测试 | 隐藏礼物卡片没有渲染 | PASS |
| Standards Review | 组件结构、命名和依赖方向符合项目规范 | PASS |
| Spec Review | 接口响应仍然包含隐藏礼物,只是前端没有展示 | FAIL |
前两个 PASS 证明页面表现和代码结构没有明显问题。但回忆第一站定下的规则,"他人查看时只能获得可见范围内的礼物,范围外数据不进入接口响应",所以最后一个 FAIL 仍应阻塞发布。Execute 检查当前反馈,Verify 还要追问:我们选的反馈足以证明原始需求吗?到这里你能看到整条因果链:Brainstorm 写下的那句规则,Design 定下的过滤位置,在这一刻变成了裁决发布的依据。
这一站的分工与门槛:AI 负责扫 Diff(改动对比)、追调用链、跑测试、查异常分支;风险能否接受、需求解释是否正确、哪些问题阻塞发布,由负责人判断。通过条件不变:没有新鲜验证输出,不声称完成;存在未处理的 Blocker(阻塞发布的问题),不进入发布。
一个最小 Skill:code-review
Matt Pocock 的 code-review 让两个独立上下文分别检查 Standards 和 Spec,再并排展示结果。完整原文分段对照。
frontmatter 与开头:审什么
原文--- name: code-review description: Review the changes since a fixed point (commit, branch, tag, or merge-base) along two axes — Standards (does the code follow this repo's documented coding standards?) and Spec (does the code match what the originating issue/PRD asked for?). Runs both reviews in parallel sub-agents and reports them side by side. Use when the user wants to review a branch, a PR, work-in-progress changes, or asks to "review since X". --- Two-axis review of the diff between `HEAD` and a fixed point the user supplies: - **Standards** — does the code conform to this repo's documented coding standards? - **Spec** — does it faithfully implement the originating issue / PRD / spec? Both axes run as **parallel sub-agents** so they don't pollute each other's context, then this skill aggregates their findings.
对用户指定的固定参考点(commit、branch、tag 或 merge-base)以来的改动做双轴审查——Standards 轴:代码是否符合仓库记录的编码规范?Spec 轴:代码是否忠实实现了原始 issue / PRD / spec?两个轴作为并行 sub-agent 运行,互不污染上下文,然后由这个 skill 汇总结果。
三个设计点一次说清。"a fixed point the user supplies" 先把比较点钉死,审的是一段确定的 Diff——不钉死,AI 很容易挑一段对自己最有利的改动来夸。两个轴一个问"代码合不合规范",一个问"是不是需求要的东西",前面三份证据的例子已经说明,这两个问题的答案可以完全相反。"parallel sub-agents so they don't pollute each other's context" 是防自证闭环的直接手段:同一个人既写又审容易自我说服,让两个独立上下文分别审,误解才有机会被暴露。
Process 五步
原文## Process ### 1. Pin the fixed point ### 2. Identify the spec source ### 3. Identify the standards sources ### 4. Spawn both sub-agents in parallel ### 5. Aggregate
流程五步:钉住固定参考点;找到 Spec 来源(原始 issue、PRD 或 spec);找到规范来源(项目规范、架构约定);并行派出两个 sub-agent;汇总。
第 2、3 步容易被忽略,但它们解释了这份 Skill 为什么依赖前五个阶段:Spec 来源是 Brainstorm 和 Design 写下的规则,规范来源是项目长期沉淀的标准。没有这两份输入,双轴审查就成了空转——Reviewer 拿不出来对照的东西,只能凭感觉说"看着还行"。直播案例里,Spec 轴对照的就是"范围外数据不进入接口响应"和"数量冠名按累计值展示"这两条早已写下的断言。
Aggregate:报告不许合并
原文Present the two reports under `## Standards` and `## Spec` headings, verbatim or lightly cleaned. Do **not** merge or rerank findings — the two axes are deliberately separate.
把两份报告分别放在
## Standards 和 ## Spec 标题下呈现,原样或只做轻微清理。不要合并或重排发现项——两个轴是刻意分开的。
"Do not merge or rerank findings" 防的是一种隐蔽的稀释:一旦合并,"代码写得好"和"需求做得对"就容易被混成同一项,FAIL 被 PASS 平均掉。即便只用一个 Reviewer,也可以照这个思路分两轮检查。与双轴配套的另一条纪律是 Superpowers 的 verification-before-completion:任何"完成/通过"的说法之前,必须先运行验证命令并读取输出,"应该能过"不算证据。双轴管"审什么",那条管"凭什么下结论"。
这份 Skill 就是 Verify 阶段 Gate 的实体化:报告分开、证据新鲜、Blocker 不处理就不放行。
六套工作流怎样覆盖这一阶段
| 工作流 | Verify 中的代表做法 |
|---|---|
| OpenSpec | 对照变更 Artifact 检查完整性、一致性和任务状态 |
| Superpowers | 组合 TDD、任务级 Review、最终 Review 与新鲜证据 Gate |
| Trellis | 按任务及相关 Spec 执行 Check,同时检查需求和项目规范 |
| Get Shit Done | 使用专门的验证、审查和用户验收材料检查阶段结果 |
| BMAD | 通过 QA、对抗式 Review、验收标准和 Story 状态检查质量 |
| OMC | 编排 Verifier、Reviewer、安全检查和测试规格,循环处理未通过项 |
BMAD 的 bmad-code-review 把对抗性做到了角色级:并行派出一组审查 subagent:Blind Hunter 找视野外的问题,Edge Case Hunter 找边界,Verification Gap Reviewer 查"声称验证了但没证据"的缺口,Acceptance Auditor 逐条对验收标准。发现项按 high/medium/low 路由到处置:现场拍板、打补丁、延期(写入 deferred-work.md)或驳回;story 不过 review 就不能置为 done。官方也承认对抗式审查有误报,需要人过滤——所以它的结论是分诊清单,不是自动判决。
OMC 的 team-verify 则把 Verify 编成流水线的一级:多 Agent 执行走 team-exec → team-verify → team-fix 循环,verifier 必跑,按风险加 test-engineer、security-reviewer、code-reviewer;改动超 20 个文件或涉及架构变更时,后两者是必须项;不通过就生成 fix 任务回到执行,最多循环 max_fix_loops 次。适合已经在用 OMC 编排多 Agent、需要把"审不过就修"自动化的场景;代价是要治理这套状态机本身。
Blocker 清零,发布获准。很多人以为故事到这就结束了,其实最容易被低估的一段才刚开始:代码合并了,交付还没完成。
第六站 Ship:完成代码,不等于完成交付
核心问题:怎样发布并让后续工作接得上?
这一站的翻车有两种样子。第一种很直接:发布这件事只存在于当前对话里。顺序、回滚路径、开关位置都没写下来,靠口头记忆——于是某个仓库先上线、依赖还没准备好;回滚只做了一半,契约状态不一致;灰度开关在哪,只有当时在场的人知道。第二种很安静:功能合并了,但没人记得为什么这样设计。下一个需求、下一个会话、下一个同事接手时,从头再来。接手者不知道哪些已经完成、哪些仍待联调;任务材料和代码提交对不上;同类错误没有进入规范,下次继续出现。
先说发布计划。跨仓库、跨终端的需求有依赖顺序:协议先发布,服务端才能升级依赖;服务端兼容上线后,客户端才开始消费新字段。这些顺序、回滚路径和开关位置,要写成一页发布计划,而不是留在对话里。这个需求我自己做下来,跨了 11 个仓库、数百个文件。协议先合并、下游再升级依赖,顺序是写在任务材料里的,不靠记性。这也是 Design 阶段"资源字段隔离"那个决定,在发布时的兑现。
同样不能留在对话里的还有 Handoff。它不需要重放整段会话,只要说清当前目标、完成情况、关键决策位置、相关 Spec 与 Diff、验证状态、剩余风险和下一步。引用已有 Artifact 比复制内容可靠,因为复制会制造第二份很快过期的事实源。一个最小 Handoff 示例:
最小 Handoff 示例目标:完成"他人查看礼物墙时过滤隐藏数据"切片。 已完成:后端过滤、本人/他人契约测试、相关终端联调。 依据:需求规则见 Spec;边界决策见 Design;改动链接见任务记录。 验证:契约测试和相关回归已通过,输出链接见任务记录。 剩余风险:旧版本终端的降级展示只验证了主流版本,长尾版本待观察。 下一步:上线后跟踪礼物墙相关客诉与数据复盘;异常时关闭新规则开关并回滚服务版本。
接手者应当能沿着这些引用找到事实、证据和下一动作,无需重新阅读聊天记录。
最后是经验回流。适合进入长期规范的,是会反复影响工程判断的内容:可见范围过滤要在服务端完成;普通直播间能力不能塞进特殊玩法分支;身份关系由拥有完整上下文的边界层判断;旧版本兼容用降级展示而不是硬撑新逻辑。某次需求的临时字段、具体日期和一次性排期没有长期价值。规范库如果什么都收,最后也会成为上下文垃圾场。
真实 PRD 本身也是个好榜样:它的末尾留了两个固定位置:"本次迭代遗留问题"(因排期、技术原因没做完的事留档,避免漏掉)和"数据复盘"。比如本次的 PRD 登记了三件没做完的事:特权详情图待更新、规则页待过审、各等级权益需逐项核对。交付不是代码合并那一刻结束的,是这些尾巴都被书面接住之后才结束的。
一个最小 Skill:handoff
Matt Pocock 的 handoff 把"引用而非复制"写成了硬性条款。完整原文分段对照。
frontmatter 与第一句:写给谁看
原文--- name: handoff description: Compact the current conversation into a handoff document for another agent to pick up. argument-hint: "What will the next session be used for?" disable-model-invocation: true --- Write a handoff document summarising the current conversation so a fresh agent can continue the work. Save to the temporary directory of the user's OS - not the current workspace.
把当前对话压缩成一份供另一个 agent 接手的交接文档。参数提示:"下一会话要用来做什么?"禁止模型自动触发。写一份交接文档总结当前对话,让一个全新的 agent 能接着干活。保存到用户操作系统的临时目录——不要存进当前工作区。
两个细节。"argument-hint" 要求调用时说清下一会话的用途,交接内容围绕这个用途裁剪,而不是泛泛总结全部历史。"保存到临时目录,不是工作区"是个容易看漏的决定:工作区是项目的共享事实源,放一份带个人观点和中间态的交接文档进去,它就会被后来的 Agent 当成项目材料读进去——交接是临时的,仓库是长期的,两者不能混。
建议调用的 skills
原文Include a "suggested skills" section in the document, which suggests skills that the agent should invoke.
文档里要包含一个"建议调用的 skills"小节,指出接手的 agent 应该调用哪些 skill。
交接不只交接状态,还交接"接下来该调用什么工具"。下一位不是从零猜流程,而是直接被接回工作流——比如接着做实现就提示调 /implement,准备收尾就提示调 /code-review。
引用而非复制
原文Do not duplicate content already captured in other artifacts (specs, plans, ADRs, issues, commits, diffs). Reference them by path or URL instead.
不要重复已经在其他 artifact(specs、plans、ADRs、issues、commits、diffs)里存在的内容,用路径或 URL 引用它们。
这条对应前面 Handoff 示例里"依据:需求规则见 Spec;边界决策见 Design"的写法。复制会制造第二份事实源,而第二份总是先过期——下一位沿着引用读到的是最新版本,沿着复制读到的是快照。
脱敏与参数
原文Redact any sensitive information, such as API keys, passwords, or personally identifiable information. If the user passed arguments, treat them as a description of what the next session will focus on and tailor the doc accordingly.
隐去所有敏感信息,比如 API key、密码或个人身份信息。如果用户传了参数,把它当作下一会话的重点,并据此裁剪文档。
交接文档会被更多人看到,密钥和个人信息要在这一步拦下。最后一句和 frontmatter 的 argument-hint 呼应:交接不是压缩比越高越好,是让下一位能立刻开工。
这份 Skill 把 Ship 阶段的 Gate 落到了纸面:交接存在、引用有效、敏感信息清零,这趟旅程才算真正走完。
六套工作流怎样覆盖这一阶段
| 工作流 | Ship 中的代表做法 |
|---|---|
| OpenSpec | 归档完成的 Change,把稳定能力规范折回长期事实源 |
| Superpowers | 重新验证分支后,选择合并、创建 PR、保留或放弃改动 |
| Trellis | 先提交业务改动,再更新稳定 Spec、归档任务并写 Journal |
| Get Shit Done | 完成阶段发布、状态收尾和 Learnings 提取 |
| BMAD | 关闭 Story/Sprint,结合 QA、发布和 Retro 完成团队闭环 |
| OMC | 用持久状态、完成 Gate、Handoff 和会话摘要保留执行结果 |
Trellis 的 /trellis:finish-work 把 Ship 做成固定收尾动作:先检查有没有进行中的任务、有没有游离在任务之外的未提交业务改动(有就拒绝执行);然后提交业务改动、把新规范写回 .trellis/spec/、归档任务目录,最后写一条 Workspace Journal,记下做了什么、改了哪些文件、提交哈希、下一步。Journal 进 Git。换会话、换工具之后,从 Journal 就能接回上下文。它维护的是"过程记忆",适合长期项目、多人多工具接力。
OpenSpec 的 openspec archive 维护的是另一种记忆:"规范记忆"。变更完成后,它把 Change 里的增量合并回 openspec/specs/ 长期规范,再把档案移到 openspec/changes/archive/ 按日期留存。specs/ 永远是"当前真相",archive 是"变更历史"。新需求来了,AI 读的是最新事实源,而不是一摞过期方案。前者回答"上次做到哪了",后者回答"系统现在约定成什么样了",两者解决的是 Ship 的不同半边。
直播间这趟旅程走完了。回头看,六个阶段不像六级台阶,更像一条链:任何一环松动,问题都会顺着链往下游传,并且在更贵的地方爆掉。
六站连起来:一张处理不确定性的地图
回顾整条旅程,每个阶段掐住的都是一种不确定性:
六阶段 × 六类不确定性Brainstorm 控制目标不确定性 Design 控制系统边界不确定性 Plan 控制任务规模和依赖不确定性 Execute 控制实现过程不确定性 Verify 控制正确性不确定性 Ship 控制交付与接续不确定性
Artifact 和 Gate 应该放在不确定性可能失控的位置,而非平均铺满整条流程。阶段之间也不是单行线:Brainstorm 发现技术假设,先做 Prototype 再回 Design;Design 发现需求矛盾,退回 Brainstorm;Execute 发现架构撑不住方案,退回 Design;Verify 发现需求遗漏,回到 Plan;长任务在任意阶段都可能需要 Handoff。回退是正常动作。发现证据与原假设冲突以后仍然向前,才会把小问题拖成大返工。版本 A 的导出按钮,就是这么一路滑到 PR 评审的。
理解阶段之后,再看六套工作流
走完旅程再回头看工具,思路会清楚很多。比较 OpenSpec、Superpowers、Trellis、Get Shit Done、BMAD 和 OMC 时,可以只问三件事:它强化哪些阶段,靠什么机制,以及团队要长期维护什么。
下面的机制来自各项目官方仓库和本知识库的源码证据卡;阶段强弱与适用场景是本文为了讲解所做的映射,不是项目官方评级。采用前仍需核对当前版本文档。
| 工作流 | 更突出的阶段 | 控制方式 | 典型任务规模 | 跨会话能力 | 人工介入 | 维护成本 | 更适合解决 |
|---|---|---|---|---|---|---|---|
| OpenSpec | Design / Plan | Proposal、Spec、Design、Tasks 等变更 Artifact | 中型到大型变更 | 中 | 审查变更合同 | 中 | 需求容易跑偏,需要先审后做 |
| Superpowers | Brainstorm / Execute / Verify | 自动触发 Skill、硬 Gate、TDD、分层 Review | 小型到中大型 | 中 | 明确批准设计和计划 | 中高 | Agent 执行随意,验证纪律不足 |
| Trellis | Plan / Execute / Verify / Ship | Spec、Task、Workflow State、Journal | 中型到长期项目 | 强 | 维护任务和稳定规范 | 中高 | 多仓、跨工具、跨会话接续困难 |
| Get Shit Done(GSD) | Plan / Execute / Ship | .planning/ Artifact、Phase 状态、专职 Agent | 中大型长任务 | 强 | 在阶段检查点介入 | 中高 | 长任务 Context Rot 和状态丢失 |
| BMAD | Brainstorm 到 Ship | 角色、PRD、架构、Story、Sprint、Retro | 大型产品或复杂新项目 | 强 | 多角色、多轮审查 | 高 | 需要完整产品和敏捷协作流程 |
| oh-my-claudecode(OMC) | Execute / Verify | 模式、Hooks、状态、循环权限、多 Agent 编排 | 中大型复杂执行 | 强 | 选择主循环并处理例外 | 高 | 并行执行、持久循环和运行时治理 |
"维护成本"指长期保持 Artifact、状态和 Gate 有效所需的投入,与安装步骤多少无关。对单会话小任务来说,重型状态系统很可能拖慢交付。
六套工作流在每个阶段的具体机制(命令、Artifact、Gate)已经在六站里逐站展开过,这里不再重复。一句话总结它们的分工:OpenSpec 管规范和变更合同,Superpowers 管 Agent 的行为门禁,Trellis 管项目级状态和记忆,GSD 管长任务分段,BMAD 管角色和完整研发流程,OMC 管执行编排与运行时;Matt Pocock Skills 则把工程纪律做成小型可组合 Skill。
先别急着比较功能多少。更值得问的是:团队现在最常失去控制的,究竟是哪一段。
落地:先诊断,再挑工具
先看失败发生在哪里,再挑工具:
| 你常看到的现象 | 先补哪一站 | 可以看什么 |
|---|---|---|
| AI 一上来就写偏 | Brainstorm / Design | 轻量访谈 Skill;要设计门禁看 Superpowers,要规范审查看 OpenSpec |
| 设计清楚,任务做一半失控 | Plan + 跨会话状态 | 垂直切片加验收标准;长任务看 GSD,要项目级任务与 Journal 看 Trellis |
| 写得快,Review 总发现遗漏 | Execute / Verify | 测试接缝、缩短反馈命令、Spec/Standards 双轴 Review;Superpowers 管纪律,OMC 编排多 Agent 验证 |
| 接手的人总要翻聊天记录 | Ship | 可引用的 Spec、验证结果和 Handoff;长期跨会话维护再上 Trellis 一类项目闭环 |
| 复杂新产品从零开始 | 全流程 | BMAD 的角色与 Artifact 体系;已有敏捷流程的团队可只借用其中几份产物 |
按任务规模选择
决策路径短、低风险、一次性任务 → 直接 Vibe Coding 边界明确,需要基本工程纪律 → 组合几个轻量 Stage Skills 复杂变更,需要规范先行 → OpenSpec 需要严格执行和验证 Gate → Superpowers 长期项目,需要任务状态和项目记忆 → Trellis / Get Shit Done 复杂产品,需要完整角色化流程 → BMAD 需要多 Agent 并行和运行时控制 → OMC
工具可以组合,例如用 OpenSpec 管变更合同,用 Superpowers 约束执行,用 Trellis 保存状态。也可以一个框架都不装,只把经常出问题的阶段写成自己的 Skill 和 Checklist。组合前先确认机制没有重复,否则只会增加维护面。
收尾:回到那个导出按钮
故事绕回开头。同一个"给列表页加个导出 Excel",这次会怎样不同?
需求进来,先有人问:导出哪些列?大数据量怎么办?谁有权限?关键取舍没落定,就不动手。结论写成一页 Spec,测试决策和 Out of Scope 都在里面。工作被拆成三个能独立验收的切片,每个切片都装得进一个干净的会话。实现时小步推进,先看到测试红,再让它绿。完成后,一个没参与实现的 Reviewer 对照 Spec 检查,权限校验的缺口在这一步被抓住,而不是在用户手里。最后,发布顺序、回滚路径和一页 Handoff 留在仓库里,下一个接手的人不用考古聊天记录。
慢吗?第一次确实慢,我自己走下来也有感觉。但那些省掉的提问、拆分和审查,从来不会真正消失,只会推迟到更贵的地方出现:PR 评审、线上事故、下一个人的第一周。
模型越能写,团队越需要清楚哪些决定不能交给它默认补全。需求、边界、任务规模、验证可信度和发布接续,不会随着模型升级自动消失;生成速度提高以后,这些问题反而扩散得更快。六个阶段各自只提一个问题:
| 阶段 | 那一个问题 |
|---|---|
| Brainstorm | 我们理解的是同一个问题吗? |
| Design | 这项责任应该放在哪里? |
| Plan | 怎样拆成能够独立验收的工作? |
| Execute | 当前修改有没有短反馈? |
| Verify | 有什么证据证明做对了? |
| Ship | 系统和下一位接手者准备好了吗? |
小任务不用走满六段,团队也不必统一使用某套框架。先找到最常失控的阶段,补一个合适的 Skill、Artifact 或 Gate,连续用两周并记录返工和 Review 遗漏。没有改善,就删掉或调整;有效,再考虑引入更完整的工作流。