2026年6月26日/ AI Application Notes

我的 AI 编程工作流:SPEC、任务拆分、验证和交接

这篇整理一套轻量但可持续的 AI 辅助开发流程:先把需求写成 SPEC,再拆小任务、让 Agent 执行、跑验证,最后把状态落到 HANDOFF。

AI-assisted DevWorkflowSPECAgentEngineering Practice

我现在更愿意把 AI 编程理解成一种协作流程,而不是一个“让模型直接帮我把功能做完”的按钮。

AI 很适合读代码、铺开重复改动、补测试、跑构建、整理 diff。人更适合决定目标、边界、取舍和验收标准。问题是,如果没有一个稳定流程,这两部分很容易混在一起:模型越改越多,人越看越累,最后只能靠感觉判断“应该差不多了”。

所以我会给 AI 辅助开发加一个很轻的闭环:

接管上下文 -> 写清 SPEC -> 拆小任务 -> 实现 -> 验证 -> 提交 -> 交接

这不是为了显得正式,而是为了让每次改动都能继续、能回看、能停下来。

第一步:先接管上下文

已有项目里,我不会让 Agent 上来就改代码。先让它读项目状态。

最小接管清单通常是:

  • README.md:项目是什么,怎么运行。
  • SPEC.md:当前目标、功能边界、验收标准。
  • AGENTS.md / 项目规则:代码风格、验证方式、安全红线。
  • HANDOFF.md:上一轮做到哪里,下一步是什么。
  • git status:工作区有没有别人或上一轮留下的改动。
  • 最近几条提交:当前分支最近发生了什么。

这个步骤看起来慢,但能避免很多低级事故。尤其是工作区已经有未提交改动时,Agent 必须先知道哪些是已有改动,哪些是这轮任务要碰的文件。

我希望接管后能回答这几个问题:

当前目标是什么?
当前阶段是什么?
已经完成什么?
还没完成什么?
工作区有没有未提交改动?
下一步只做什么?

只要这几句说清楚,后面改代码就不容易漂。

第二步:把需求写成 SPEC

很多 AI 失控不是因为模型差,而是因为需求还没变成可执行边界。

比如一句“帮我做一个工具页”,听起来清楚,实际里面有很多没说完的东西:目标用户是谁,首屏放什么,哪些功能必须有,哪些不做,移动端怎么验收,是否需要后端,是否要保存数据,是否会碰隐私。

SPEC 不需要写得很长,但至少要包含这些内容:

目标:这次到底要解决什么问题。
用户:谁会用,什么时候用。
范围:这次做什么,不做什么。
数据:需要哪些输入、输出和状态。
接口:有没有 API、路由、文件格式或外部依赖。
验收:怎样才算做完。
风险:哪些文件或逻辑不能随便碰。

对新功能,我会先写 SPEC;对小 bug,我可以不写完整 SPEC,但至少会写清楚复现、预期和修复范围。

SPEC 的价值不在文档本身,而在它迫使人先做判断。AI 可以帮忙补问题,但最后哪些要做、哪些不要做,仍然要人决定。

第三步:任务拆到 15-30 分钟

AI 很擅长连续执行,但长任务越长,越容易上下文膨胀、目标漂移、验证遗漏。

我更喜欢把任务拆成小块:

  • 有明确输入。
  • 有明确输出。
  • 有明确验收。
  • 改动文件范围可预期。
  • 做完可以单独验证或提交。

一个好任务长这样:

任务:把博客文章列表里的草稿过滤掉。
输入:现有 content collection 和博客列表页。
输出:公开页面不展示 draft: true 的文章。
验收:pnpm build 通过;/blog 不出现草稿;草稿详情页不生成公开路由。

一个不好的任务长这样:

任务:优化博客。

后者太宽,模型会自然地补很多自己的理解:改 UI、改文案、改路由、加组件、顺手重构。不是它坏,是任务边界给得太松。

第四步:一次只执行一个阶段

执行阶段我通常让 Agent 按这个顺序走:

读相关文件 -> 说明改动范围 -> 编辑 -> 自查 diff -> 运行验证 -> 汇报结果

这里最重要的是“改之前说明范围”。如果它准备动的文件比预期多,或者想引入新依赖、改构建配置、碰数据库迁移、碰权限逻辑,就应该先停下来确认。

我对 AI 写代码的期待不是一次完美,而是每一步都能收住:

  • 不顺手重构无关文件。
  • 不把多个无关目标塞进一个提交。
  • 不为了通过类型检查改掉业务含义。
  • 不把本地密钥、截图、临时文件误提交。
  • 不在不确定时假装确定。

这几条听起来像常识,但对 Agent 很关键。Agent 的默认倾向是“继续解决问题”,而工程上有时更需要“知道什么时候停”。

第五步:验证不是可选项

AI 辅助开发里,验证要尽量变成习惯动作。

不同任务验证方式不一样:

任务类型 优先验证
文档 / 文章 检查 frontmatter、链接、路径、格式
前端页面 build、关键页面预览、移动端文字溢出
逻辑函数 单元测试、边界用例
API / 数据处理 集成测试、错误输入、空数据
重构 现有测试、typecheck、构建、关键路径手动检查
高风险功能 回归测试、代码审查、分支隔离

如果项目有 linttesttypecheckbuild,改完就尽量跑。如果缺依赖、命令太慢或环境跑不起来,也要明确写出来,不能假装验证过。

验证的目标不是证明 AI 很可靠,而是让每轮改动有一个可检查的落点。

第六步:提交要小而完整

我更喜欢一个任务一个提交。提交前先看 git status,确认只包含这轮相关文件。

AI 很容易误用“全量暂存”。这在干净仓库里没事,但真实项目经常有截图、临时日志、实验文件、别人改了一半的代码。最稳的方式是只暂存目标文件:

只提交本任务相关文件。
未跟踪截图、临时目录、本地配置不要碰。
提交信息写清楚类型和结果。

提交粒度不需要机械,但要能回答一个问题:如果这次改动出问题,我能不能单独回看或回滚?

第七步:长任务必须交接

AI 工具之间不共享聊天记忆。Claude、Codex、IDE、终端窗口,真正共享的是文件系统和 git 状态。

所以长任务结束时,我会更新 HANDOFF.md 或任务文档,至少记录:

当前目标:
已完成:
正在做:
下一步:
已修改文件:
已验证:
未验证:
风险和注意事项:

交接不是给别人看的形式主义,也是给未来的自己看的缓存。尤其是连续做几天之后,最危险的不是不会写代码,而是忘了前面为什么这么取舍。

哪些地方可以简化

这套流程不是每次都要完整跑一遍。

这些情况可以直接做:

  • 明确错别字。
  • 一行链接修复。
  • 小范围样式问题。
  • 已经有复现路径的简单 bug。

这些情况要把流程拉起来:

  • 新功能。
  • 多文件重构。
  • 不熟悉的旧项目。
  • 需求有争议或容易漂移。
  • 涉及权限、支付、数据、生产配置。
  • 用户已经连续纠正方向。

我的判断标准是:改动越不可逆、影响面越大,越需要 SPEC、任务拆分、验证和交接。

一套可复制的最小模板

如果只想先落地,不需要复杂系统,可以从这四个文件开始:

README.md   项目介绍和运行方式
SPEC.md     当前目标、范围、不做什么、验收标准
AGENTS.md   AI 工作规则、命令、安全红线
HANDOFF.md  当前状态、下一步、验证记录

每次让 AI 接手时,开场可以很简单:

先读 README.md、SPEC.md、AGENTS.md、HANDOFF.md、git status 和最近 5 条 git log。
然后输出当前目标、阶段、已完成、未完成、工作区状态和下一步。
这轮只做某一个任务,改完跑验证并提交。

这段话不神奇,但它把 AI 从“聊天助手”拉回了“项目协作者”的位置。

最后

AI 编程真正有用的地方,不是把工程判断交出去,而是把执行速度提上来。

人负责方向、边界、品味和验收;AI 负责阅读、生成、修改、验证和整理。中间靠 SPEC、任务拆分、测试、提交和交接把状态固定住。

这套流程可能没有“一句话生成应用”听起来刺激,但它更适合长期项目。项目不是一次性生成出来的,而是一轮一轮被维护出来的。AI 要真正融进开发流程,也得经得起这种日常节奏。

Brief

AI-assisted development works best when the human keeps ownership of scope, taste and acceptance criteria, while the agent handles reading, editing and verification loops.

My default workflow is simple: read the project, write or update a SPEC, split work into small tasks, execute one task at a time, verify, commit and leave a handoff note.

The goal is not ceremony. The goal is to make AI work recoverable, reviewable and easy to continue across windows or tools.