综合实战与资产沉淀
18

综合实战:一个真实需求的 AI Coding 最佳实践

真实需求不会按工具章节出现。它通常同时牵涉上下文、spec、TDD、debug、Skill、OpenSpec 和验证。

如果这些能力只停留在单点命令,真实需求进来时仍然很容易断链。

下面用同一个产品需求把整条链路走完:

个人效率助手每天生成今日计划时,自动纳入逾期未完成任务,并在每日容量限制下返回顺延列表。

配套代码仓库 DavidDingXu/learn-ai-coding 按一个大仓库组织,仓库根目录下有业务 module 和工具 module。这里使用业务 module:personal-productivity-app。工具 module 里的 CLI、context-pack、verification ledger 可以提供方法样例,但不能替代这一条业务链路。

端到端过程记录在:

learn-ai-coding/personal-productivity-app/dev-process/03-end-to-end-today-plan-delivery.md

这不是工具项目里的命令演示,而是一个可迁移的业务规则需求:有状态、有日期、有优先级、有容量、有测试、有 review 边界。

端到端交付证据链

第一步:把需求翻译成业务边界

原始需求可以很口语:

今日计划别漏掉昨天没做完的任务,但也别把今天排爆。

AI 如果直接改代码,容易把需求扩大成:

做一个任务系统。
做一个日历同步。
做一个提醒服务。
做一个复杂排程算法。

真实开发里,第一步不是写代码,而是限定边界。

本次做:

buildTodayPlan 领域函数。
逾期任务和当天任务候选选择。
done / blocked / future 过滤。
priority / dueDate 排序。
capacityMinutes 容量约束。
items / deferred 输出。
今日计划结果页。
容量调节后即时重算。

本次不做:

完整任务系统页面。
API。
数据库。
账号系统。
提醒系统。
日历同步。
复杂排程优化。

这一步是后续所有工具能发挥作用的前提。

第二步:把上下文交给 AI

给 AI 的上下文不是“你帮我做一下”。

最少应该包含:

README.md
package.json
test/today-plan.test.js
openspec/changes/today-plan-overdue-rollover/proposal.md
openspec/changes/today-plan-overdue-rollover/specs/today-plan/spec.md
openspec/changes/today-plan-overdue-rollover/design.md
openspec/changes/today-plan-overdue-rollover/tasks.md

这些文件分别回答:

项目是什么。
怎么跑测试。
需求为什么做。
行为合同是什么。
实现边界是什么。
任务怎么拆。

如果 AI 只读测试文件,可能知道要实现什么。

但它不知道为什么 UI 只能展示已有领域规则、为什么 blocked 不进入计划、为什么 priority 要优先于 dueDate age。

上下文不是越多越好,而是要覆盖决策所需事实。

第三步:用 OpenSpec 固定需求合同

OpenSpec 本次真实命令链是:

openspec init --tools codex .

openspec new change today-plan-overdue-rollover \
  --description "今日计划自动纳入逾期未完成任务,并在每日容量限制下给出顺延列表。" \
  --goal "让个人效率助手每天生成可执行的今日计划,避免逾期任务丢失或一天被排爆。" \
  --json

openspec instructions proposal --change today-plan-overdue-rollover --json
openspec instructions specs --change today-plan-overdue-rollover --json
openspec instructions design --change today-plan-overdue-rollover --json
openspec instructions tasks --change today-plan-overdue-rollover --json
openspec validate today-plan-overdue-rollover --strict --json --no-interactive

生成的核心文件:

proposal.md
design.md
specs/today-plan/spec.md
tasks.md

最关键的不是文件名,而是它们让需求变成可审合同。

proposal 写为什么做。

spec 写 SHALL / MUST 和 scenario。

design 写技术取舍和不做什么。

tasks 写每一步怎么完成。

第四步:先红灯再实现

测试先表达业务行为:

逾期任务进入今日计划,且排在当天任务前。
done / blocked 不进入今日计划。
容量不足时放不下的任务进入 deferred。
逾期任务按 priority 优先于 dueDate age。
非法日期、负容量、负估时被拒绝。

第一次运行:

npm test

红灯:

ERR_MODULE_NOT_FOUND: Cannot find module 'src/today-plan.js'

这个红灯把实现范围钉住了:

要新增 src/today-plan.js。
测试期望不用改。
没有理由新增数据库或外部服务。页面展示必须复用 `buildTodayPlan`,不能另写一套规则。

第五步:小 diff 实现领域规则

实现文件:

src/today-plan.js

核心函数:

export function buildTodayPlan({ date, capacityMinutes = 0, tasks = [] } = {}) {
  // 过滤、排序、容量选择、输出 items/deferred
}

核心实现边界:

不读取系统时间。
不访问网络。
不写文件。
不引入依赖。
不做持久化。
页面只展示 `buildTodayPlan` 的结果,不接后端。

这就是小 diff 的意义:只改当前需求需要的地方。

第六步:用 Superpowers 约束过程

本次 Superpowers 没有替代 OpenSpec。

它约束的是执行纪律:

test-driven-development:实现前先红灯。
systematic-debugging:测试失败时先找根因。
requesting-code-review:完成后按行为风险审查。
verification-before-completion:完成前跑新鲜验证。
receiving-code-review:处理反馈时不扩大 scope。

这里也核对了当前入口:本机 brainstorm、write-plan、execute-plan 命令文件都标了 deprecated,当前写法以 Skill 触发为准。

所以不能把旧命令当成当前推荐路径。

第七步:验证不是一句话

本次验证有四层。

OpenSpec strict validate:

openspec validate today-plan-overdue-rollover --strict --json --no-interactive

结果:

passed: 1
failed: 0

业务测试:

npm test

结果:

tests 7
pass 7
fail 0

OpenSpec apply 进度:

openspec instructions apply --change today-plan-overdue-rollover --json

结果:

total: 8
complete: 8
remaining: 0
state: all_done

这才叫完成证据。

只写“已完成,测试通过”,reviewer 不知道通过了什么,也不知道需求合同是否仍然有效。

最终页面也要验证。启动本地页面:

npm run dev

打开:

http://127.0.0.1:4173

默认 90 分钟容量下,页面应该展示:

今日执行:补齐客户发票资料、回复客户验收问题、写本周项目进展
顺延列表:整理版本发布说明
未进入计划:准备下周路线评审、提交差旅报销、等待法务反馈合同条款

把容量调到 60 分钟后,页面应该重新计算:

今日执行:补齐客户发票资料、写本周项目进展
顺延列表:回复客户验收问题、整理版本发布说明
已安排:55 分钟
剩余:5 分钟

这一步不是把样例扩成完整产品,而是确认业务规则确实落到了用户可见结果里。

今日计划最终结果页

第八步:Review 看业务风险

这次 review 应该盯这些问题:

done / blocked 是否被误收?
future 是否被误收?
overdue 是否排在 due-today 前?
priority 是否先于 dueDate age?
capacity 是否可能超限?
deferred 是否保留放不下的任务?
remainingMinutes 是否计算正确?
实现是否依赖系统时间或外部副作用?

这些问题比“代码是否优雅”更重要。

因为真实用户只关心:今天看到的计划是否可信。

第九步:复盘沉淀可迁移规则

这次需求之后,值得沉淀的不是 today-plan 这个函数名。

真正可迁移的是:

有状态、日期、优先级、容量边界的需求,先写 spec 再实现。
业务实战必须先写用户可见行为,不要用工具命令冒充业务需求。
OpenSpec 实战必须有真实 CLI 命令和 validate 输出。
Superpowers 实战必须写当前 Skill 入口和触发条件。
完成前必须重新跑验证命令,不能引用旧输出。

这些规则可以迁移到:

订单超时关闭。
工单 SLA 升级。
审批任务催办。
会员权益到期提醒。
账单分期滚动。

给 AI 的完整执行指令

真实项目里可以这样交给 AI:

需求:今日计划自动纳入逾期未完成任务,并在每日容量限制下返回顺延列表。

请先读取:
- README.md
- package.json
- openspec/changes/today-plan-overdue-rollover/proposal.md
- openspec/changes/today-plan-overdue-rollover/specs/today-plan/spec.md
- openspec/changes/today-plan-overdue-rollover/design.md
- openspec/changes/today-plan-overdue-rollover/tasks.md
- test/today-plan.test.js

执行要求:
1. 以 tasks.md 为 source of truth。
2. 实现前运行 npm test,记录红灯。
3. 先实现 src/today-plan.js;页面展示必须复用该函数,不接数据库、API 或外部依赖。
4. 如果测试失败,按 systematic-debugging 先定位第一个失败信号。
5. 完成后运行 npm test。
6. 运行 openspec validate today-plan-overdue-rollover --strict --json --no-interactive。
7. 运行 openspec instructions apply --change today-plan-overdue-rollover --json。
8. 如果改动影响页面展示,运行 npm run dev 并检查 http://127.0.0.1:4173。
9. 汇报修改文件、验证结果和残余风险。

这比“帮我实现一下”稳定得多。

配套资料

  • 端到端过程记录:learn-ai-coding/personal-productivity-app/dev-process/03-end-to-end-today-plan-delivery.md
  • OpenSpec 过程记录:learn-ai-coding/personal-productivity-app/dev-process/01-openspec-today-plan-rollover.md
  • Superpowers 过程记录:learn-ai-coding/personal-productivity-app/dev-process/02-superpowers-today-plan-workflow.md
  • OpenSpec 变更包:learn-ai-coding/personal-productivity-app/openspec/changes/today-plan-overdue-rollover/
  • 领域实现:learn-ai-coding/personal-productivity-app/src/today-plan.js
  • 结果页:learn-ai-coding/personal-productivity-app/index.html
  • 页面渲染:learn-ai-coding/personal-productivity-app/src/ui.js
  • 页面演示数据:learn-ai-coding/personal-productivity-app/src/today-plan-demo.js
  • 业务测试:learn-ai-coding/personal-productivity-app/test/today-plan.test.js
  • 页面演示测试:learn-ai-coding/personal-productivity-app/test/today-plan-demo.test.js

搜索全部 42 篇文章。

查看配图