跳至内容
为什么 AI Coding 越改越乱?从需求描述到规格驱动开发

为什么 AI Coding 越改越乱?从需求描述到规格驱动开发

你让 AI Coding Agent 做一个并不复杂的需求:

给订单列表增加“导出 CSV”功能。

Agent 很快加上按钮和接口。你试了一下,又补充:

导出的应该是筛选后的订单,而且中文不能乱码。

它继续修改。产品同事看到后说:

还要支持导出全部数据,超过一万条时不能把浏览器卡死。

Agent 又引入后台任务、轮询和下载中心。测试时才发现:普通员工也能导出其他部门的订单;导出期间切换筛选条件会得到错误数据;新加的依赖与项目规范冲突;原本只改一个列表页,最后却改了十几个文件。

每一轮对话单独看都很合理,代码却越来越乱。

这通常不是 Agent “突然变笨了”,而是任务一直没有一个稳定的事实来源。每次补充都像在移动终点,Agent 只能根据当前对话重新猜测:哪些旧决定还有效、这次修改影响哪些范围、做到什么程度才算完成。

Prompt 反复追加如何造成范围漂移和返工

解决办法不是把第一条 Prompt 写得无限长,而是先把需求整理成一份可以讨论、可以版本化、可以验收的规格(Specification,简称 Spec),再让计划、任务、代码和测试从这份规格向下展开。

这就是规格驱动开发(Spec-Driven Development,SDD)要解决的问题。

一、先说人话:Spec 是团队和 Agent 共同使用的“任务合同”

日常需求描述通常是在表达愿望:

增加 CSV 导出,体验要好一点,数据多的时候也要能用。

这句话足够让人开始讨论,却不够让 Agent 安全地修改代码。因为它至少留下了这些问题:

  • 谁可以导出?
  • 导出当前页、全部结果,还是当前筛选结果?
  • “数据多”具体是多少?
  • 同步下载还是异步任务?
  • CSV 使用什么编码、时区和字段顺序?
  • 导出失败后用户看到什么?
  • 是否包含隐藏字段和敏感信息?
  • 什么证据可以证明需求已经完成?

Spec 的作用,就是把“大家脑中可能不同的理解”变成一份显式约定。

一份实用的 Spec 不一定很长,但至少应该让三种角色得到相同答案:

角色读完后应该知道什么
产品与业务解决谁的问题,包含和不包含什么
开发者与 Agent必须实现哪些行为,受哪些约束
测试与 Review用哪些场景和证据判断完成

可以把它理解成:

需求描述:我大概想要什么
Spec:系统必须表现成什么样,以及怎样证明它做到了
Plan:准备怎样实现
Tasks:按什么顺序修改哪些部分
Code & Tests:实现与验证证据

Spec 不是为了取代沟通,而是把沟通结果固定下来,避免同一个问题在实现阶段被反复重新解释。

二、Prompt 驱动为什么容易失控

Prompt 本身没有问题。小而明确的任务,一条 Prompt 完全够用。真正危险的是把不断增长的复杂需求只保存在聊天记录里。

1. 对话是时间顺序,需求是结构关系

聊天记录通常长这样:

先加导出按钮
→ 改成导出筛选结果
→ 再支持全部数据
→ 大数据量异步处理
→ 普通员工只能导出本部门
→ 字段顺序又调整了

但真正需要实现的是一组同时成立的规则:权限规则、范围规则、性能规则、字段规则、异常规则。它们不是“最后一句覆盖前一句”这么简单。

当约束散落在几十轮对话中,Agent 很容易:

  • 只执行最新补充,忘记早期约束;
  • 把讨论中的建议误当成最终决定;
  • 修复一个场景时破坏另一个场景;
  • 无法判断哪些代码变化属于需求,哪些只是顺手重构。

2. 模糊词会被自动补全

“快速”“友好”“大量”“兼容”“尽量”“适当”都不是可直接验收的要求。

人类同事通常会凭项目经验补全这些词。Agent 也会补全,但它补的是最可能的答案,不一定是你们项目的答案。

例如“导出不能太慢”可能被理解为:

  • 点击后 2 秒内开始下载;
  • 10,000 条数据在 30 秒内生成;
  • 请求不能超过网关 60 秒超时;
  • 页面主线程不能冻结超过 100 毫秒。

四种解释都合理,却会产生完全不同的设计。

3. 没有非目标,Agent 会把“做得更完整”当成正确

如果只写“支持导出”,Agent 可能顺便加入:

  • 导出历史;
  • 定时导出;
  • Excel 格式;
  • 自定义字段;
  • 邮件发送;
  • 一套新的任务队列。

这些功能不是坏功能,但不属于当前任务。规格中的“非目标”是在明确告诉 Agent:这里先不要做。

4. 没有验收标准,“完成”只能靠感觉

Agent 说“已完成”,可能只代表代码已经写入文件。你说“不是我想要的”,通常代表双方从未约定可观察的完成条件。

如果没有验收标准,Review 会退化成:

我看起来觉得不对,你再改改。

每次“再改改”都会开启新一轮猜测。

三、规格驱动不等于瀑布,也不等于先写一百页文档

听到“先写规格”,很多人会担心:是不是要回到需求冻结、长文档审批和几个月后才写代码?

不是。

规格驱动强调的是先消除高成本歧义,再进入实现,而不是要求一次性预测所有未来变化。

做法核心特点
大 Prompt把很多要求堆在一次对话里,结构和版本边界较弱
PRD解释业务目标、用户价值和产品范围
技术设计解释架构、数据、接口和实现取舍
Spec定义系统必须满足的行为、边界和验收条件
规格驱动开发让 Plan、Tasks、实现和验证都能追溯到 Spec

Spec 可以迭代,也应该随着真实决定变化。区别在于:变化先进入规格,重新检查影响,再进入代码,而不是直接在代码上打一层又一层补丁。

GitHub 的 Spec Kit 把这条链路概括为 Spec → Plan → Tasks → Implement。其官方说明强调,每个阶段产生的 Markdown 产物会成为下一阶段的结构化上下文,而不是继续依赖临时 Prompt。

四、一份可执行 Spec 应该包含什么

不同团队可以使用不同模板,但下面七部分非常通用。

1. 背景与问题

先解释为什么要做,而不是马上指定按钮颜色和接口路径。

## 背景

运营人员目前只能逐页复制订单数据,每周整理报表约需 2 小时,
且手工复制容易遗漏筛选条件。需要提供受权限控制的 CSV 导出能力。

“为什么”会帮助 Agent 在细节冲突时做出更合理的判断。例如,如果目标是减少手工报表时间,那么“保留当前筛选条件”比“只导出当前页”更符合目标。

2. 用户与使用场景

不要只写“用户可以导出”,要指出谁在什么情况下使用。

## 用户

- 运营专员:导出自己所属部门的筛选结果。
- 运营管理员:可以导出所有有权查看的部门数据。
- 无订单查看权限的用户:不能看到导出入口,也不能调用导出接口。

3. 范围与非目标

范围回答“本次要做什么”,非目标回答“哪些看起来相关的事情本次明确不做”。

## 范围

- 在订单列表提供 CSV 导出。
- 导出条件与发起时的筛选条件一致。
- 小数据量直接下载,大数据量创建异步任务。

## 非目标

- 不支持 Excel、PDF 格式。
- 不支持用户自定义导出字段。
- 不增加定时导出和邮件发送。
- 不重构现有订单查询模块。

非目标不是永远不做,而是保护当前交付边界。

4. 功能需求

每条需求使用稳定编号,描述可观察行为。

## 功能需求

- FR-001:拥有订单查看权限的用户 MUST 能在订单列表发起 CSV 导出。
- FR-002:导出 MUST 固化用户点击时的筛选条件,不受之后页面操作影响。
- FR-003:导出结果 MUST 只包含用户有权查看的订单。
- FR-004:不超过 10,000 条时 SHOULD 直接下载。
- FR-005:超过 10,000 条时 MUST 创建异步任务并展示进度。
- FR-006:失败任务 MUST 显示可理解的原因,并允许用户重试。

这里借用了 IETF RFC 2119 的需求级别:MUST 表示绝对要求,SHOULD 表示通常应满足、偏离时必须理解和权衡后果,MAY 表示真正可选。业务 Spec 不必照搬标准全文,但统一这些词的含义能减少“最好支持”和“必须支持”之间的争论。

5. 约束与质量属性

功能正确不代表可以上线。权限、性能、兼容性、可观测性和数据安全也要进入规格。

## 约束

- SEC-001:后端 MUST 根据当前用户重新校验数据范围,不能信任前端传入的部门 ID。
- PERF-001:直接导出 10,000 条订单时,服务端处理时间 p95 MUST 小于 8 秒。
- UX-001:异步任务创建后 1 秒内 MUST 显示“正在生成”状态。
- DATA-001:CSV MUST 使用 UTF-8 with BOM,日期统一输出为 `Asia/Shanghai` 时区。
- OBS-001:导出任务 MUST 记录操作者、筛选摘要、结果数量和失败原因。

数字不是越多越好。只有真正影响设计或验收的指标才值得写;无法测量、也没人关心的伪精确数字只会制造噪声。

6. 验收场景

需求条目说明规则,验收场景用具体例子消除歧义。

Cucumber 的 Gherkin 参考把示例组织为 Given / When / Then:已知初始状态、发生一个动作、得到可观察结果。官方文档也提醒,Then 应关注界面、消息或报告等外部可观察结果,而不是内部数据库实现。

场景:运营专员导出本部门的筛选结果
  假如 用户属于华东运营部,并拥有订单查看权限
  而且 列表筛选条件为“已支付、2026-07-01 至 2026-07-31”
  当 用户点击“导出 CSV”
  那么 下载文件只包含华东运营部中符合筛选条件的订单
  而且 文件使用 UTF-8 with BOM 编码
  而且 操作日志记录本次导出

场景:用户尝试绕过前端导出其他部门数据
  假如 用户只拥有华东运营部的数据权限
  当 用户直接请求导出接口并传入华南运营部 ID
  那么 接口返回 403
  而且 不创建导出文件
  而且 安全日志记录被拒绝的请求

不是所有团队都要安装 Cucumber。即使只把 Given/When/Then 当作人工验收模板,它也能迫使我们写清前置条件、动作和结果。

7. 未决问题与决策

不要让 Agent 悄悄替团队决定仍有争议的事项。

## 未决问题

- Q-001:异步导出文件保留 24 小时还是 7 天?负责人:产品,截止:8 月 5 日。
- Q-002:是否需要对公式注入字符做转义?负责人:安全,截止:8 月 5 日。

## 已确认决策

- D-001:本期复用现有任务中心,不新建下载中心。
- D-002:字段集合固定,不开放用户自定义。

未决问题应该阻止相关任务进入实现,而不是用一句“按常见做法处理”带过。

五、如何把自然语言写得更精确:借用 EARS 的句式

需求不一定要变成形式化数学语言。一个轻量办法是给自然语言加上稳定结构。

Rolls-Royce 研究人员在 IEEE Requirements Engineering 会议提出的 EARS(Easy Approach to Requirements Syntax) 使用少量句式约束自然语言需求,针对歧义、复杂和含糊等常见问题。它的价值不在于背术语,而在于强迫作者补齐“何时、在什么状态、系统做什么”。

常用句式可以简化为:

类型句式导出示例
普遍要求系统必须……系统必须对所有导出重新校验用户权限
事件触发当……时,系统必须……当用户点击导出时,系统必须固化当前筛选条件
状态驱动在……期间,系统必须……在任务生成期间,系统必须展示可查询的进度状态
异常处理如果……,系统必须……如果文件生成失败,系统必须记录原因并允许重试
可选特性如果启用……,系统必须……如果启用敏感字段脱敏,系统必须按字段策略替换内容

对比下面两句话:

差:导出失败时要友好处理。

好:如果异步导出任务失败,系统必须在任务列表显示失败状态和可理解的原因,
    并允许用户在筛选条件仍有效时重新创建任务。

第二句仍然是自然语言,但已经能派生界面状态、错误模型、重试逻辑和测试场景。

六、从 Spec 到代码,中间不能跳过 Plan 和 Tasks

有了 Spec 就立刻让 Agent 写代码,仍然可能出问题。因为“系统应该怎样表现”和“在当前仓库里怎样实现”是两类问题。

规格如何驱动计划、任务、实现和验证

Spec:定义 What 与 Why

Spec 应尽量不绑定具体实现:

超过 10,000 条时必须创建异步任务。

Plan:解释 How

Plan 结合真实代码库做技术决策:

- 复用现有 `JobService`,新增 `ORDER_EXPORT` 任务类型。
- 查询复用 `OrderQueryService`,服务端根据当前用户注入数据范围。
- 生成文件写入现有对象存储,生命周期设为 24 小时。
- 前端复用 `TaskProgress` 组件,不新增轮询框架。
- 风险:订单查询当前未提供流式读取,需要验证 10,000 条的内存峰值。

Tasks:把计划拆成可验证增量

任务不是“实现导出功能”这样的大包,而应该能单独完成和验证:

- [ ] T001 [FR-003] 为订单导出查询增加服务端数据范围测试
- [ ] T002 [FR-002] 定义不可变的 ExportFilter 快照
- [ ] T003 [FR-004] 实现小数据量 CSV 生成与编码测试
- [ ] T004 [FR-005] 接入 JobService 异步任务
- [ ] T005 [UX-001] 在列表页展示任务创建与进度状态
- [ ] T006 [OBS-001] 增加导出审计日志
- [ ] T007 [AC-01~AC-05] 运行端到端验收场景

Implement:按任务执行,不在过程中重新发明需求

实现时可以发现 Spec 有问题,但不应在代码里静默修正。正确做法是:

发现歧义
→ 回到 Spec 澄清
→ 更新受影响的 Plan
→ 重新生成或调整 Tasks
→ 实现
→ 根据验收场景验证

规格驱动不是单向流水线,而是一个有明确回退位置的反馈循环。

七、完整实战:把一句话需求改写成可执行规格

下面从最初的需求开始:

给订单列表增加 CSV 导出。

第一步:先让 Agent 提问,不要让它马上写代码

暂时不要修改代码。请先阅读订单列表、权限模型、现有任务中心和测试结构。

针对“给订单列表增加 CSV 导出”这个需求:
1. 列出会影响实现的歧义;
2. 区分业务问题与技术问题;
3. 对能从仓库确认的事实提供文件证据;
4. 对不能确认的事项列为问题,不要自行假设;
5. 最后给出一份 Spec 草案,不生成实现计划。

这一步的关键是把“探索”和“修改”分开。Agent 可以通过代码确认现有权限、组件和任务基础设施,但不能从代码猜出业务保留期或产品范围。

第二步:审查 Spec,而不是审查文笔

重点检查:

  • 每个角色是否清楚?
  • 每个模糊词是否被数字或场景替代?
  • 正常、空数据、无权限、失败和大数据量是否覆盖?
  • 非目标能否阻止范围膨胀?
  • 约束是否来自真实系统?
  • 每条验收标准是否能观察或测量?
  • 是否仍有 Agent 私自做出的产品决定?

可以让另一个会话只做反例审查:

只审查这份 Spec,不写代码。

请从产品、开发、测试、安全和运维五个视角找出:
- 歧义与相互冲突的要求;
- 缺失的边界条件;
- 无法验证的验收标准;
- 被错误写成需求的实现细节;
- 可能导致越权、数据泄露或不可恢复操作的场景。

每个问题引用对应的需求编号,并给出最小修改建议。

第三步:建立追踪关系

从需求编号到任务、代码、测试和交付证据的追踪链

不需要购买复杂的需求管理平台。中小项目用 Markdown 编号就能建立基本追踪:

需求计划决策实现任务验证证据
FR-002 筛选快照使用不可变 ExportFilterT002单元测试 + 并发操作 E2E
FR-003 权限范围服务端注入数据权限T001越权接口测试
FR-005 异步任务复用 JobServiceT004、T005任务状态集成测试
DATA-001 CSV 编码UTF-8 with BOMT003中文 Excel 打开验证

追踪关系能回答两个非常实际的问题:

  1. 这个改动是为了满足哪条需求?
  2. 这条需求用什么证据证明已经满足?

如果一项任务找不到需求来源,它可能是范围漂移;如果一条需求找不到测试或验证证据,它可能还没有真正完成。

八、用 GitHub Spec Kit 跑一遍标准流程

GitHub Spec Kit 是一个开源的规格驱动开发工具包。它不是新的编程语言,也不会替你决定产品需求;它提供的是模板、命令和产物目录,让 Agent 按稳定流程工作。

官方当前的核心流程是:

constitution
→ specify
→ clarify
→ plan
→ checklist
→ tasks
→ analyze
→ implement
→ converge

不同 Agent 的命令形式可能是 /speckit.*、$speckit-* 或其他集成形式,应以 Spec Kit 官方集成说明为准。

1. 安装和初始化

按照官方 README,可使用 uv 安装 specify-cli:

uv tool install specify-cli
specify init . --integration codex

如果你使用其他 Agent,把 codex 换成官方支持的集成名称。不要在不了解初始化会写入哪些文件时直接对重要仓库使用 --force。

2. Constitution:先确定项目不可随任务改变的原则

/speckit.constitution
项目必须复用现有组件;生成代码不得手工修改;
所有数据读取必须执行服务端权限检查;
功能变更必须包含自动化测试和可复现的验证证据。

Constitution 解决“这个项目长期怎样工作”;Spec 解决“这次功能必须怎样表现”。不要把两者混成一份无限增长的文档。

3. Specify:先写 What 与 Why

/speckit.specify
为订单列表增加 CSV 导出。运营人员需要导出当前筛选结果用于周报;
导出必须遵守订单数据权限,中文可直接用 Excel 打开;
本期不支持自定义字段、定时导出和邮件发送。

Spec Kit 官方建议在这一阶段聚焦“做什么、为什么”,把技术栈和架构选择留给 Plan。

4. Clarify 与 Checklist:在设计变贵之前消除歧义

/speckit.clarify
重点检查权限范围、大数据量阈值、失败重试和文件保留时间。

/speckit.checklist
为安全、性能与可验收性生成规格质量清单。

官方把 Checklist 类比为“需求的单元测试”:它检查的不是代码,而是规格是否完整、清晰、一致。

5. Plan:结合真实仓库选择实现方式

/speckit.plan
复用仓库现有 JobService、对象存储和 TaskProgress 组件;
后端使用现有 OrderQueryService 并注入当前用户的数据权限;
测试沿用项目已有的 Vitest 与 Playwright 结构。

Spec Kit 的 Plan 模板会显式记录技术上下文、依赖、测试方式、目标平台、性能目标、约束、规模和项目结构。这些信息如果仍是 NEEDS CLARIFICATION,就不应该假装已经可以实现。

6. Tasks 与 Analyze:检查每项工作有没有来源

/speckit.tasks
/speckit.analyze

根据 Agentic SDD 官方参考,analyze 会只读检查 spec.md、plan.md 和 tasks.md 之间的冲突、遗漏和歧义。例如:某个任务没有对应需求,或 Plan 的选择与 Spec 冲突。

7. Implement 与 Converge:分段实现并回到规格验收

/speckit.implement 只实现权限检查与筛选快照,验证后停止。
/speckit.implement 实现同步 CSV 下载,验证后停止。
/speckit.implement 实现异步任务与前端进度。
/speckit.converge

复杂功能不要一次让 Agent 执行所有任务。Spec Kit 的复杂功能指南也指出,长时间实现过程中 Agent 可能逐渐忽略计划或任务;官方建议缩小每次实现范围,必要时再拆成独立子规格。

Spec Kit 是流程脚手架,不是正确性证明。生成的 Spec、Plan 和 Tasks 仍然需要业务、技术和安全负责人审查。

九、规格应该写多细

规格不是越长越好。粒度应该与歧义、风险和修改成本匹配。

任务类型推荐规格示例
极小、低风险、现有模式明确目标 + 范围 + 3~5 条验收项修改文案、增加已存在样式的按钮
中等功能、跨前后端完整轻量 Spec + Plan + 分步任务CSV 导出、批量操作、权限控制
高风险或跨系统完整 Spec + 数据/接口契约 + 风险与回滚 + 分阶段验收支付、权限、数据迁移、生产集成
超大功能先写路线级 Spec,再拆成独立子规格新工作台、消息系统、多租户改造

判断是否需要更详细,可以问四个问题:

  1. 不同人会不会对这句话产生不同理解?
  2. 做错后是改一个按钮,还是会泄露数据、损坏状态?
  3. 是否跨越多个模块、团队或外部系统?
  4. 是否需要几天后或换一个 Agent 继续工作?

“是”越多,越值得先写规格。

十、需求变化时,先改哪里

规格驱动开发不阻止变化,而是让变化可追踪。

假设产品后来要求:异步文件从保留 24 小时改为 7 天。

错误方式:

直接告诉 Agent:“顺便把保留时间改成 7 天。”

正确顺序:

  1. 更新 Spec 中的保留策略与原因;
  2. 检查隐私、存储成本和下载权限是否受影响;
  3. 更新 Plan 中的对象存储生命周期;
  4. 更新对应任务和测试;
  5. 只修改受影响的代码;
  6. 用新旧验收场景做回归。

这样下一个接手的人能知道“为什么是 7 天”,而不是只在某个配置文件里看到一个神秘数字。

十一、常见失败方式

1. 把 Spec 写成解决方案清单

一上来就写“新增 Redis 队列、创建三张表、使用某某库”,会过早锁死设计。

先写系统行为和约束,再让 Plan 根据仓库现状选择技术方案。

2. Spec 由 Agent 生成后没人确认

Agent 能整理语言、发现缺项,不能替业务负责人决定权限、范围和合规要求。

生成不是确认。任何影响产品行为的假设都必须显式审查。

3. 验收标准仍然是形容词

差:页面响应迅速,失败提示友好。
好:点击导出后 1 秒内出现任务状态;失败时显示原因和重试入口。

4. 所有要求都标成 MUST

如果没有优先级,就没有真正的优先级。使用 MUST、SHOULD、MAY 时要统一含义,并允许团队讨论成本与取舍。

5. Spec、Plan、Tasks 写完后各自漂移

文档多不等于可追踪。需求编号、任务引用和测试证据必须连起来;否则只是把混乱从聊天窗口搬进多个 Markdown 文件。

6. 把实现日志塞回 Spec

Spec 记录稳定意图和已确认行为,Plan 记录技术决策,Tasks 记录执行,PR 或交付报告记录实际修改。职责混在一起,文档很快会再次失去可信度。

7. 小任务也套完整重流程

改一个错别字不需要 Constitution、十页 Spec 和十二个命令。流程成本应该与风险匹配。

十二、可直接复制的轻量 Spec 模板

# Feature: <功能名称>

## 背景与目标
- 当前问题:
- 目标用户:
- 期望结果:

## 范围
-

## 非目标
-

## 功能需求
- FR-001:
- FR-002:

## 约束与质量要求
- SEC-001:
- PERF-001:
- DATA-001:

## 验收场景
### AC-001:<场景名称>
- Given:
- When:
- Then:

## 边界与异常
- 空数据:
- 无权限:
- 重复操作:
- 并发变化:
- 外部依赖失败:

## 未决问题
- Q-001:<问题>;负责人:<角色>;截止:<日期>

## 已确认决策
- D-001:

配合 Agent 使用时,可以这样要求:

请基于仓库事实,把下面需求整理成轻量 Spec。

要求:
1. 先探索相关代码、规则和测试,不修改文件;
2. 区分目标、范围、非目标、功能需求、质量约束和验收场景;
3. 每条需求使用稳定编号;
4. 无法从仓库确认的业务事项列入“未决问题”,不要猜;
5. 验收标准必须是可观察或可测量结果;
6. Spec 经我确认前,不生成 Plan,不写代码。

原始需求:<粘贴需求>

十三、今天就能开始的最小实践

不安装任何工具,也可以从下一次中等复杂度需求开始:

  1. 用 15 分钟写目标、范围和非目标;
  2. 给功能需求编号;
  3. 写一个正常场景和三个失败/边界场景;
  4. 让 Agent 只找歧义,不写代码;
  5. 确认后再生成 Plan;
  6. 把 Plan 拆成每步可验证的 Tasks;
  7. 要求交付报告逐条对应需求与证据。

你会发现,规格最大的价值不是“让 Agent 一次写对所有代码”,而是让错误更早暴露:

  • 需求问题在 Spec 阶段暴露;
  • 设计问题在 Plan 阶段暴露;
  • 依赖和顺序问题在 Tasks 阶段暴露;
  • 实现问题在测试和 Review 阶段暴露。

越早发现,修复成本越低。

总结

AI Coding 越改越乱,往往不是因为生成速度不够,而是因为缺少稳定边界:需求散落在对话里,模糊词被自动补全,非目标没有声明,完成条件无法验证。

规格驱动开发建立的是一条可追踪链路:

意图 → Spec → Plan → Tasks → Code → Tests → Evidence

记住四个原则:

  1. 先澄清行为,再选择实现。
  2. 把非目标和验收标准写进规格。
  3. 让每项任务和测试都能追溯到需求。
  4. 需求变化先更新事实来源,再更新代码。

当 Spec 成为团队与 Agent 共同读取的任务合同,Prompt 就不再承担“记住一切”的压力。Agent 也不需要在每轮对话里重新猜终点,而可以沿着清晰、可验证的路径完成交付。

参考资料

最后更新于