交付这件事,我做了十几年项目,真正想明白“让客户敢签字”这句话背后的分量,是在连续好几个项目被卡在验收环节之后。你代码写完了、功能上线了、测试也跑了,客户却迟迟不签字,理由翻来覆去就是“再等等”“我们内部还要确认下”。后来我复盘发现,问题根本不是功能没做完,而是客户没有“签字的依据”。他不知道该按什么标准验、怎么验、验到什么程度算过,自然不敢落笔。所以今天想认真聊聊交付的本质,再结合我最近在用的 Claude Code + Openspec + Superpowers 这套 AI 项目交付组合拳,讲讲怎么把“可交付内容”这件事做实,让 AI 也能稳定交付全栈项目。
这篇内容适合三类人看:正在带项目、天天催验收的项目经理;一个人扛全栈、被需求变更折磨到没脾气的独立开发者;还有想把 AI 编程工具从“写着玩”提升到“能交付”状态的效率型工程师。我会从交付的底层逻辑讲起,再落到三件套工具如何一步步把模糊需求变成可验收的交付物,最后附上我自己的翻车记录和排查清单。
1. 先想清楚:客户到底在为什么签字
1.1 “做完”和“可交付”之间差了三个问题
很多人把交付理解成“把功能做完”。但你去问任何一个被交付折磨过的客户,他心里的交付标准从来不是“功能跑通了”,而是三个问题:第一,这是不是我当初要的东西;第二,我拿什么证明它是;第三,如果后面出了问题,我怎么追溯、谁来负责。
这三个问题,恰好对应交付物的三个层次:功能层、证据层、契约层。功能层是代码跑通了、页面能点了;证据层是需求条目、测试报告、验收标准这些能证明“我做的确实是你说的”的文档和记录;契约层是双方对“什么算完成、什么算合格”这件事达成的一致,落到纸面上就是签字。
传统开发模式下,这三个层次靠流程和制度来保障,CMMI、敏捷、IPD,本质上都是在造证据和契约。但到了 AI 辅助开发的时代,问题被放大了。因为 AI 写代码的速度太快了,快到功能层一天能迭代好几版,但证据层和契约层几乎为零。结果就是:代码是 AI 写的,人是慌的,客户更慌。
1.2 客户不敢签字,根源是“不可验证”
我后来总结出一个概念叫“交付信心三角”,三个角分别是:需求可追溯、过程可透明、结果可验证。只有这三个角都立住了,客户才敢签字。
需求可追溯,是指每一个交付的功能都能回溯到某一条原始需求,客户问“这个按钮为什么要放这”,你能给出“因为你第N条需求里说到了某某场景”的回答,而不是“我觉得放这好看”。过程可透明,是指客户随时能看到进度、知道当前做到哪一步、剩余风险是什么,而不是黑盒里突然蹦出一个“已完成80%”。结果可验证,是最硬的一条,也就是验收标准可执行、可测试、可判定通过还是不通过,而不是“看起来差不多了”。
有了这个三角,你就会明白,客户签字本质上是信任你的“可交付内容”是真实的、完整的、经得起验的。反过来,你也会明白,为什么很多项目做完了却交付不了——需求是口头的,过程是不可见的,验证是主观的,换谁都不敢签字。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. AI 全栈项目交付难,难在哪几个具体环节
2.1 需求漂移:和 AI 聊着聊着,项目就变样了
AI 写代码最大的诱惑是“你只要描述清楚,它就能给你做出来”,但这也是最大的坑。你以为自己描述清楚了,其实没有。需求描述天然是模糊的、有歧义的、上下文依赖的。
我见过最典型的场景:用户对 Claude 说“帮我加一个用户登录功能”,Claude 咔咔生成一套登录页、后端接口、数据库表。用户说“不对,我要的是手机号验证码登录”,Claude 又改。改完之后用户又说“顺便加个记住我”,Claude 又改。三小时过去,登录功能是有了,但整个项目的结构已经被 AI 改得面目全非,原本的核心业务模块反而被挤得没法维护了。
这就是需求漂移。不是 AI 不行,而是你没有一个“需求冻结”的机制。你口述的每一句话都被当成最高指令,AI 只管当前对话里的最新需求,不管三天前你说了什么、哪些已经确认过了。于是项目越改越乱、越乱越改,永远走不到“可交付”那一步。
2.2 上下文失忆:AI 永远活在“当下”,交付需要的是“连续”
AI 编程工具在工作中最大的问题就是上下文窗口有限。哪怕 Claude Code 这类工具已经把上下文管理做得相当好了,你依然会撞到一堵墙:聊得太多,它忘了早期确定的技术方案;切换会话,它不知道你上个会话里已经踩过哪些坑。
交付恰恰是最需要“连续”的事情。验收标准在第一天就定好了,第五天做实现的时候必须还记得;数据库表结构第二个礼拜改了一次,第三个礼拜写查询接口的时候必须知道改动波及的范围;客户在第 N 次演示时提的一个小调整,很可能影响第 N+5 天的排期。
这些连续性,靠人脑记不现实,靠 AI 的记忆也不现实。唯一的解法是把关键信息外置,落到项目里可持续参考的文档和结构中,而不是依赖会话里谁记住谁。而现实中,绝大多数开发者跟 AI 协作时,是没有这一层外置结构意识的,自然也就谈不上稳定交付。
2.3 过程黑盒:AI 做了 80% 的活,你却说不出那 80% 是什么
我早期用 AI 写项目的时候,有一个特别难受的体验:AI 一顿操作猛如虎,git log 里全是 “feat: update”,但你根本不知道它改了哪些文件、每个改动是为什么、影响了什么模块。想给客户汇报进度,打开 commit 历史一看,全是废话。
这个问题的本质是过程不可审计。传统开发里,代码评审、任务拆分、模块设计,每一步都有迹可循,哪怕出了问题也能回溯。AI 开发模式下,如果没有刻意设计流程,所有这些痕迹都会消失。结果就是:项目做完了,但你拿不出任何“过程证据”来支撑“它为什么这么做、这么做经过了什么考量”这类问题。
客户的签字,是需要这些证据来支撑勇气的。
3. 用三件套给 AI 项目交付装上“契约引擎”
3.1 三件套的分工逻辑:需求、任务、执行三层解耦
既然问题出在需求不可追溯、过程不可透明、结果不可验证,那解法就清楚了:给 AI 协作过程装上契约。我目前实践下来最顺手的组合是三个工具配合使用——Openspec、Superpowers 和 Claude Code。它们三个不是替代关系,而是各管一段,配合起来刚好把“从想法到可验收交付物”的链条补完。
先说分工。Openspec 管的是“需求契约层”,它把一个项目拆成规格说明(spec)的形式,每条需求、每个功能点都可以被定义、被引用、被验收。Superpowers 管的是“任务执行层”,它提供一套结构化的技能与流程,告诉 AI 怎么拆任务、怎么按 TDD 模式写代码、怎么在实施过程中自检。Claude Code 是实际动手的执行者,负责调用模型能力,真正把代码写出来。
打个比方,Openspec 是设计图纸,Superpowers 是施工手册,Claude Code 是施工队。图纸不对,施工队越努力越糟糕;手册不清晰,施工队容易凭感觉乱来;施工队水平不行,图纸和手册再完美也落不了地。三者缺一不可。
3.2 Openspec:把“客户说的话”变成“可签字的依据”
Openspec 的思路其实很简单,就是像 OpenAPI 规范 RESTful 接口一样,给项目定义一套规格结构。它鼓励你把项目拆分成若干个规格文件(specs),每个规格文件把一个大的需求域拆成独立可讨论、可确认、可验收的单元。
一个规格文件通常包含这几类内容:背景与目标、需求描述(带优先级)、接口约束、数据模型、验收标准。其中验收标准是重中之重。比如“用户能通过手机号验证码登录”,这条需求如果只写到这里,是不可验收的。但如果你写成“用户输入有效手机号后,系统在 60 秒内下发验证码;验证码有效期 5 分钟;同一手机号 60 秒内不能重复发送;输错 5 次后锁定 10 分钟”,那不管是人还是 AI,都能根据这个标准去验证功能是否完成。
这就是 Openspec 的价值:它逼迫你在写代码之前,先把“什么叫验收通过”定义清楚。这些定义本身就是客户签字的依据。而且规格文件是独立于代码存在的,可以单独审阅、修改、确认,天然适合和客户对齐需求。
3.3 Superpowers:把“人类开发流程”翻译给 AI 听
模型本身不懂得什么叫“一个项目该有节奏地推进”,它只会根据你的指令生成内容。Superpowers 就是来解决这个问题的,它本质上是 Claude Code 的一套技能和流程扩展,让 AI 在开发过程中遵循类似人类团队的工作方式。
具体来说,Superpowers 会把一个大任务拆成小的步骤,比如先做项目规划、再写测试、再写实现、再运行测试验证、再提交更新。它强调在动手写代码之前先生成测试,用测试来约束实现行为。这个过程天然产生了“过程证据”:测试用例就是验收标准的具象化,测试通过就是可验证性的证明。
我第一次用 Superpowers 的 TDD 工作流时,一个最直观的感受是:Claude Code 不再“蒙头写代码”了,而是每写一段功能,就自己停下来跑测试、看结果、再决定下一步。这样不仅代码质量有保障,而且整个过程是可回放、可审计的。对于交付而言,这是一层非常厚的安全垫。
3.4 Claude Code:终端里的“全栈开发搭档”,但需要被规则约束
Claude Code 是 Anthropic 推出的终端内 AI 编程工具,它最大的特点是能直接在命令行里和代码库交互:能读文件、写文件、执行命令、运行测试、查看 git diff,几乎覆盖了一个开发者日常工作的全部动作。配合 Superpowers 的流程和 Openspec 的规格说明,它可以在较长的时间跨度内稳定完成复杂的全栈开发任务。
但我也要提醒一句:Claude Code 很强,但没有规矩约束的时候,它也是“跑得最快的脱缰野马”。我见过有人让它自由发挥写一个支付模块,它直接引入了一整套微服务框架,把一个简单的单体应用搞得复杂到没法维护。所以工具越强,越需要契约在前面等着它。先用 Openspec 定好边界,再用 Superpowers 定好流程,最后才放手让 Claude Code 干,这才是三件套的正确打开方式。
4. 实战:从一条模糊需求到一份敢签字的交付件
4.1 第一步:需求转规格,把“想要的感觉”翻译成“能测的指标”
我不讲空洞的原理,直接用一个实际做过的项目片段来说明。假设客户说:我想要一个博客后台,能发文章、能管理分类。这句话如果你直接给 Claude Code,它也能给你做出来,但大概率不是客户脑子里的那个东西。
用 Openspec 的做法,你要先写一份 spec 文件,把这句话翻译成结构化的规格。比如这样的结构:
yaml复制id: blog-admin
title: 博客后台内容管理
status: proposed
## 目标
支持管理员对文章和分类进行全生命周期管理。
## 需求
- REQ-001: 管理员可以创建文章(标题、正文、封面图、分类)。
- REQ-002: 管理员可以编辑文章,编辑后文章状态变更为“已修改待上线”。
- REQ-003: 管理员可以删除文章,删除需二次确认,删除后文章进入回收站可恢复。
- REQ-004: 分类至少支持两级层级。
## 验收标准
- AC-001: 创建文章时,所有必填字段为空则无法提交,并给出明确错误提示。
- AC-002: 编辑文章后,列表页出现“已修改待上线”的状态角标。
- AC-003: 删除文章后,文章列表不再展示该文章,回收站中可查看,恢复后回到草稿箱。
- AC-004: 分类管理可以创建子分类,结构在左侧树中正确展示。
这一步做完,你再看这份文档,会发现它已经可以发给客户确认了。客户如果说“不对,文章要支持 Markdown”,你就在 REQ-001 里加一项。这个过程就是需求冻结,每一轮确认后,这份 spec 就是双方共同认可的依据,后续开发和验收都拿它说话。
4.2 第二步:规格转任务,让每个 AC 都有对应的执行路径
规格有了,接下来就是用 Superpowers 把规格拆成可执行的任务。我之前习惯直接让 Claude Code 读取 spec 文件,然后用 Superpowers 的技能来规划实施步骤。它会根据验收标准生成一组任务清单,每个任务对应一个交付步骤,任务之间是有依赖关系的。
比如,AC-004 要求分类支持两级层级,那任务清单里就会有一条“设计分类数据模型,增加 parent_id 字段,并确保查询支持层级递归”。AC-003 要求删除走回收站,那任务清单里就会有一条“增加 deleted_at 软删除字段,列表查询默认过滤已删除记录,回收站接口单独提供恢复能力”。
这个拆解环节非常重要,因为它把“验收标准”和“技术实现”建立了映射。后面不管 AI 怎么改代码,只要这些 AC 对应的测试能通过,交付就是稳的。而且这个映射本身就是给客户看的过程证据,他能清楚知道“你们为了实现我的验收要求,在技术上做了哪些事”。
4.3 第三步:TDD 实施,测试即验收的执行保障
任务拆好了,Claude Code 才开始真正动手。在 Superpowers 的流程控制下,它的工作顺序一般是:先为当前任务编写测试用例,再创建实现代码让测试通过,然后运行完整测试集确保没有回归,最后整理 git 提交记录。
这个过程带来的好处是,每个验收标准都有一个对应的自动化测试在守护。AC-001 说必填字段为空不能提交,那测试里就会有一条“POST /api/articles 传空 title 时返回 400 以及对应错误信息”;AC-002 说编辑后状态变更为“已修改待上线”,那测试里就会断言编辑接口返回的状态字段是那个值。
我实测下来的感受是,用这套流程,AI 写出来的代码“自证”性很强。不是它写得多完美,而是它每写一段,都有验证来兜底。跑测试的时候看到绿油油的通过列表,那种确定感是纯让 AI 自由发挥完全给不了的。
4.4 第四步:验收与交付,用证据链换客户签字
功能做完、测试通过,这只是交付的前半步。真正让客户敢签字的,是你能拿出一条完整的证据链。
我之前一段时间的交付流程是这样的:在需求确认阶段,我会把 Openspec 的规格文件整理成一份需求确认单,每一条需求、每一条验收标准,后面留一个确认栏,客户确认一条填一条。在开发阶段,我会把 git 提交记录维护成和任务清单一一对应的格式,每个任务一个 commit,commit message 里带上任务编号,这样任何一次改动都能追溯到它的来源。在测试阶段,我会导出测试通过的报告,把每个 AC 对应的测试用例和结果截出来,作为验收的附件。
最后到了演示验收的时候,我打开的是这样一套东西:一份双方确认过的规格单,一份按任务拆解的 commit 记录,一份 AC 全覆盖的测试报告。然后当着客户的面,逐条过 AC:你看这一条,你说要求必填为空不能提交,我们有一个测试用例专门测这个场景,现在跑给你看,它通过。客户看完了,签字顺利成章。
5. 常见翻车现场与排查清单实录
5.1 上下文丢失:Claude Code 干着干着忘了 spec 里写了啥
三件套用久了,我还是会遇到一些翻车情况。最常见的就是上下文丢失。虽然我把 spec 文件放在了项目根目录,但 Claude Code 处理的文件一多,有时候还是会忽略 spec 里的某条约束,按照自己的理解把功能写偏了。
排查思路比较土但很好用:出现偏差时,第一件事不是让 AI 改,而是把对应的 spec 文件内容重新贴进当前会话,明确告诉它“请先阅读该文件,然后重新规划你刚才的实现步骤”。更稳的办法是把关键约束写进项目的 CLAUDE.md 或者约定文件里,每次启动任务时让模型先读取再动手。我现在已经把项目的技术栈、目录结构规范、关键约束都沉淀在项目说明文件里,上下文丢失的概率低了很多。
5.2 验收标准写得太抽象,AI 和人都不好执行
另一个高频翻车点是我的验收标准写得不够“硬”。比如“删除需二次确认”,什么算确认?是弹窗确认还是要求输入“delete”关键字?这两种实现复杂度和用户体验完全不一样,但如果不定义清楚,AI 会选它认为最合理的,客户看了可能不认。
这个问题的解法只有一条:写 AC 的时候问自己“可测试吗?测试怎么写?”。如果答案模棱两可,就继续细化。你不细化,后面所有的执行层都在替你填坑。这条对人不也一样吗,需求对齐的时候偷懒,交付验收的时候就要十倍还账。
5.3 过程证据和实际代码不一致,信任瞬间崩塌
这是最严重的一个翻车,我踩过一次之后长了记性。当时为了赶交付,我手动改了一部分数据库初始化脚本,但没有同步更新 spec 文档里的数据模型描述。客户验收的时候查文档,发现文档里说 status 字段默认是 draft,代码里实际默认值是 published,当场就产生了质疑。虽然解释之后客户理解了,但信任感已经打了折扣。
从那以后我基本要求自己遵循“先改文档,再改代码”的顺序。spec 是契约,契约没改之前,代码里任何跟契约冲突的行为都是违约,无论你多急着上线。如果是临时救火的改动,事后必须在一天内补回 spec,否则就等着未来某个时刻翻车。
5.4 翻车问题速查表
| 症状 | 可能原因 | 处理动作 |
|---|---|---|
| AI 实现偏离需求 | 上下文丢失、spec 未被读取 | 重贴 spec 文件内容,让其先阅读再规划,关键约束写进项目说明文件 |
| 功能做完了但客户不认 | 验收标准定义模糊、双方理解不一致 | 回到 spec 逐条拆 AC,明确“可测的指标”,重新对齐确认 |
| 测试全绿但上线出问题 | 测试覆盖不全,AC 与测试用例无映射 | 逐条 AC 检查测试是否存在对应断言,缺失的补测试 |
| 文档和代码不一致 | 先改代码后改文档 | 恢复“先改文档再改代码”的顺序,及时回补 spec |
| 提交记录没法说明进度 | commit message 太随意,无任务关联 | 规范 commit 格式,强制带上任务编号或 AC 编号 |
| 演示时不知道先讲什么 | 没有整理证据链 | 按“需求规格单 → commit 记录 → 测试报告 → 逐条演示 AC”组织验收流程 |
6. 最后再分享一个我自己沉淀的小技巧:把“验收会议”变成“对答案现场”
我调整过很多次交付演示的形式,最后发现最好用的不是放 PPT,也不是从头到尾跑一遍系统,而是把会议变成一场“对答案”的现场。我拿着规格文档,投影仪打开,一条条念 AC,然后用真实系统去验证给客户看。
这个做法的好处特别明显。第一,它不是单向的“我演示你看着”,而是双向的“我证明给你看”,客户的关注点从“你做的对不对”转向“这个标准本身是不是我要的”,一旦标准被认可,系统展示只是走过场。第二,任何有争议的地方,都能立刻定位到具体某一条 AC 上,而不是泛泛地“感觉不太好”。第三,既然验收标准是双方一起确认过的,签字的时候客户心里有底,你这边也有底。
我还习惯在项目启动时就把最终的验收 slide 模板建好,每一页对应一个 spec 文件,里面放上需求的原文、对应的 AC 列表、关联的测试结果截图、相关 commit 记录。项目推进过程中,这个文档是实时更新的。等真正开会的时候,它其实早就“写完”了,只是等着跟客户一起过一遍。
这个习惯帮我省掉了无数次“补文档”的加班。以前是项目做完了花两天补需求追溯表,现在是把追溯的意识放到每一天。AI 写代码再快,如果交付那一步是断的,前面的一切效率都等于白费。反过来说,把交付这条链子焊死了,AI 带来的效率红利才能真正落到口袋里。
