拆开 OpenSpec:我理想中的 AI 开发流程

把需求、拆分、开发、归档拆成可替换的 SKILL,去掉没人看的历史归档

Posted by ni on November 1, 2026
本文共3220 字 | 大约需要10.73 分钟阅读

前言

  • 目前项目里统一使用 OpenSpec 管理 AI 开发流程。用了几个月,它确实解决了一些问题,但也暴露了几个越来越明显的痛点。
  • 这篇文章整理一下我对开发流程 SKILL 的判断:OpenSpec 做对了什么、哪里不合适,以及我希望换成什么样的流程。

OpenSpec 做了什么

  • OpenSpec 是一套”规格驱动开发”的工具,核心流程是:提案 → 实现 → 归档。
    • 提案(propose):为每次改动创建一个变更目录,生成提案(proposal)、设计(design)、需求规格(specs)和任务清单(tasks)。
    • 实现(apply):按任务清单逐项开发。
    • 归档(archive):开发完成后,把这次变更的规格合并进主规格,变更目录移到归档目录。
  • 对我来说,它主要提供了四个能力:
    1. 需求拆分:把需求拆成可执行的任务清单。
    2. 测试用例:规格里写明场景,可以对照验证。
    3. 归档:开发完的规格合并进主规格。
    4. 变更记录:每次改动都留下一个完整的变更目录。

遇到的问题

1. 小改动也会产生一整套变更记录

  • 不管改动大小,每次都是一整套流程:提案、设计、规格、任务四份文档,加上归档。
  • 迭代频繁的时候,归档目录增长得很快,每个变更目录下都是成套的文档。
  • 很多变更其实是同一个功能的小迭代:比如同一份配置,先做后台管理,再做业务读取,就拆成了两个完整的变更目录。
  • 对小改动来说,写文档的成本已经接近甚至超过写代码本身。

2. 开发中途改需求,文档就不同步了

  • 实际开发中,需求在开发过程中调整是常态:发现边界没考虑到、策划改了规则、实现时发现原方案走不通。
  • 这时代码改了,但变更目录里的提案、设计、规格、任务不一定会跟着改。AI 默认的行为是直接改代码。
  • 要保证同步,只能在 Agent 的规则里强制要求”改需求必须先改变更文档”,而且每次都要盯着它执行,否则最后归档进主规格的就是一份过时的内容。

3. 历史归档基本没人看

  • 归档目录越来越大,但回头看,AI 和人基本上都不会去翻它。
  • 想知道某个功能现在是什么规则,看的是代码和当前的功能文档;想知道某次改了什么,看的是 git 提交和 PR。
  • 归档成了只写不读的数据,却还在持续增加每次开发的成本。

4. 各个环节绑在一起,不好替换

  • OpenSpec 的提案、实现、归档是一个整体,文档格式和目录结构也是固定的。
  • 想换掉其中某一环(比如换一个更适合项目的需求澄清方式),或者跳过某一环(比如小改动不归档),都比较别扭。

我希望的流程

把 OpenSpec 拆成五个独立的环节,每个环节由一个 SKILL 负责:

① 澄清需求          grill-me + 当前功能文档
        │  产出:完整的需求对话上下文
        ▼
② 生成需求文档      创建需求文档的 SKILL
        │  产出:本次需求文档
        ▼
③ 拆分需求与测试    需求拆分的 SKILL
        │  产出:拆分后的任务文档 + 测试用例
        ▼
④ 按文档开发        逐个任务实现,可中断、可换窗口继续
        │
        ▼
⑤ 测试完成后归档    更新该功能模块的文档,不保留历史

1. 先澄清需求

  • 用 grill-me 结合当前功能文档确认需求、补全规则。
  • AI 会按依赖顺序逐轮追问,每个问题附带推荐答案,把边界条件、异常情况、和已有功能的交互在开发前一次问清楚。
  • 这一步的目的是让后面的文档建立在已经确认过的规则上,而不是 AI 的假设上。

2. 生成需求文档

  • 把第 1 步的对话结果作为上下文,调用一个专门创建需求文档的 SKILL。
  • 文档格式由这个 SKILL 决定,可以按项目习惯定制,不必套用固定模板。

3. 拆分需求,生成测试

  • 再调用需求拆分的 SKILL,生成一份拆分后的任务文档,每个任务附带对应的测试。
  • 这一步最主要的作用是让开发可以中断:
    • 每个任务都是独立、可验证的一小块,做完一块就有明确的完成标准。
    • 上下文快满时,可以直接开一个新窗口,读取拆分文档继续做下一个任务,不用把整段历史对话带过去。
    • 这样可以避免长时间开发导致上下文爆炸、AI 开始遗忘前面的约定。

4. 按文档开发

  • 按拆分后的任务逐个实现,每完成一个任务跑对应的测试。
  • 如果开发中途需求变了,回到第 1、2 步更新需求文档,再调整拆分文档。因为这份文档只服务于本次开发,改起来没有负担。

5. 测试完成后归档

  • 归档时不产生任何历史文档,只维护一份该功能模块的文档。
  • 这份文档描述的是功能当前的样子:核心规则、数据结构、关键流程,以及一些容易踩坑的特殊规则。
  • 项目里其实已经有类似的机制:每个功能模块都维护了一份说明文档,以 SKILL 的形式提供给 AI。归档这一步只需要把本次改动更新进对应模块的文档。
  • 本次的需求文档和拆分文档在归档后就可以删掉。改动历史交给 git 提交和 PR,不再单独存一份。

两种方式对比

  OpenSpec 拆分后的流程
需求澄清 提案阶段由 AI 生成 先用 grill-me 逐轮确认
文档格式 固定的提案/设计/规格/任务 每个环节的 SKILL 自定义
小改动 也要走完整流程 可以跳过不需要的环节
需求中途变更 需要强制 Agent 同步变更目录 只改本次的需求文档和拆分文档
中断后继续 依赖任务清单 拆分文档本身就是为中断设计的
归档结果 主规格 + 不断增长的历史变更 只有一份模块文档
改动历史 归档目录 git 提交和 PR

这样做的好处

  • 环节拆开,每个 SKILL 都可替换、可自定义:需求澄清、文档生成、需求拆分、归档各是一个独立的 SKILL,哪一环不合适就单独换掉或改掉,让整个流程更适配项目,而不是让项目去适配工具。
  • 去掉了历史归档:不再为一份没人看的历史持续付出成本,文档数量不会随着迭代次数增长。
  • 文档始终反映当前状态:模块文档只描述功能现在的样子,AI 和人读到的都是最新规则,不用在多份历史版本里判断哪份才是对的。
  • 小改动更轻:不需要的环节可以直接跳过,比如一个小 bug 修复,可能只需要第 4、5 步。

需要注意的地方

  • 模块文档要真的被更新:去掉历史归档后,模块文档就是唯一的规则来源。如果归档这一步被跳过,文档就会过时,所以第 5 步最好作为开发完成的必要条件。
  • 改动原因要写进提交和 PR:不再保留变更目录后,”为什么这样改”只能从 git 记录里找,提交信息和 PR 描述要写清楚。
  • 团队要有统一约定:每个环节用哪个 SKILL、文档放在哪里、什么规模的改动可以跳过哪些环节,需要提前约定好,否则拆开之后容易各用各的。

总结

  • OpenSpec 证明了”先写规格再开发”对 AI 开发是有效的,但它把所有环节绑成一个整体,对小迭代太重,对中途改需求不友好,还会积累一份没人读的历史。
  • 我更想要的是把它拆开:用 grill-me 澄清需求,用独立的 SKILL 生成和拆分文档,开发完只维护一份模块文档。
  • 每个环节都是一个可以随时替换的 SKILL,流程跟着项目走,而不是项目跟着工具走。