Stephen 技术博客

AI和数据平台的工程实践

← 返回文章列表

AI 开发流程经验

superpowers + headless + 强制人工验收 · 通用实践
计划先行探针优先隔离审查实时勾选ADR

一句话:让 AI 高速产出,用"隔离验证"兜底正确性。AI 写得快、覆盖广,但对自己的盲点不可见;流程的价值不在让 AI 更聪明,而在每一步都有独立于实现者的闸门(契约、测试门禁、人工 runbook、独立 reviewer)。

1. 整体流程

三层嵌套:项目级(一次性,出整体设计文档)→ 每个 Sprint(出 2 周规划摘要,拆成多个 plan)→ 每个 Plan(④ 编写 spec/design → ⑤ DoR 就绪门 ★ → ⑥–⑨ 循环)。详细 spec/design 在进每个 plan 时产出(just-in-time),sprint 文档只给摘要。

项目级 · 一次性 ① brainstorming(整体) 意图/方案,先发散;关键技术选型 → 关键 ADR ② 整体设计文档(产出) 整体 spec + 关键 ADR(架构/租户/授权…) + Sprint 分期建议 + 时间建议 每个 Sprint ↻(2 周) ③ Sprint 规划文档(摘要) 本 sprint 2 周计划摘要 → 拆成多个 plan(有序);详细设计留各 plan 每个 Plan ↻ ④ 编写 spec/design 产 spec(需求)+ design(设计)· writing-specs;未知先探针 ⑤ DoR 就绪门 ★关键闸门 过 8 项就绪门(每项三态,无静默 TBD);未过不进 tasks ⑥ writing-plans(单个 plan) 任务级 checkbox · 每步 TDD · 必含 runbook · 争议补 ADR ⑦ execute 交互 / headless · 实时勾选 · 全绿门禁才进下一步 ⑧ 隔离审查 ★关键闸门 人跑 spec/runbook + 独立 reviewer(机器自评不算数) ⑨ 合并 CI 绿 · owner 确认 · 回标 spec/计划 checkbox C/I → 修后重验 下一个 plan plan 全完 → 下一 Sprint 每个箭头都是一道闸 — 不跳步、不假绿(证据先于断言)

2. writing-plans:把计划写成可执行、可验收、可续接

计划是后续一切的脚手架。所有计划相关的纪律都在这一节。顺序很关键:先探查、过 DoR 就绪门(产 spec/design)、再拆分、每步带测试与验收,把正确性前置到计划阶段。

writing-plans 内部流程 = 需人参与 ① 探查优先 ★写计划之前 未知外部依赖:先起真服务跑探针,把真实端点/字段/响应/坑 钉成事实文档 —— 不把猜的 API 写进计划。 ② DoR 就绪门 ★进 tasks 之前 产 spec(需求)+ design(设计);8 项就绪每项三态 (已决定/显式推迟/待探查),无静默 TBD · writing-specs ③ 任务级 checkbox 拆分 bite-sized:写测试 / 跑红 / 实现 / 跑绿 / 提交 各一步 ④ 每步 TDD 红 → 绿 → 重构;无测试不合并 ⚙ 可 headless ⑤ 必含手动验收 runbook 可照抄命令 + 期望证据;§4 由人照跑验收 ⚙ AI 生成 ⑥ 争议设计 → ADR 正文为最新版,理由 / 历史进 ADR + git ⑦ 全绿门禁 测试 / lint / 构建全绿才进下一步 实时勾选 -[x] + 任务跟踪 · 贯穿全程
🙋 需要人参与的环节(不可全交给 AI):
  1. 探查结果研判(对应 ①):探针跑完,由人确认事实文档(真实端点/字段/坑)可信、足以支撑写计划——不让 AI 拿不确信的"实测"就开写。
  2. DoR 过门研判(对应 ②):由 owner / 独立评审者判 8 项是否真就绪(无静默 TBD、外部依赖已实测、对外契约已过"第一个消费者")——机器自评不算就绪,过门才进 tasks。
  3. 争议设计拍板 → ADR(对应 ⑥):地基级 / 有争议的设计由决策并落 ADR,不让 AI 自决。
  4. 计划评审批准(进入执行前):计划成稿后人逐项对 spec/design 审——覆盖完整、拆分粒度合适、无占位符、runbook 可照抄跑;批准后才进入执行。

其余步骤——③ 拆分、④ 每步 TDD、⑤ 生成 runbook、⑦ 全绿门禁——确定性高,可由 AI / headless 无人值守完成。⑤ 的 runbook 是写计划时由 AI 生成的产物(不需人参与);它"由人照着跑验收"发生在 §4 隔离审查,不在本阶段。

  • ① 探查优先(写计划之前):不把猜的 API 写进计划。未知外部依赖先起真服务、跑通最小链路,把真实端点/字段/响应/坑记成事实文档,后续实现以实测为准。实战中探针常当场逮到外部系统的鉴权/寻址坑——等集成阶段才撞,排查成本翻倍。
  • ② DoR 就绪门 + spec/design 拆分(进 tasks 之前 · superpowers:writing-specs):写步骤前先产独立 spec.md(需求)+ design.md(设计),过一道 DoR 就绪门——8 项每项三态之一(已决定 / 显式推迟+理由 / 待探查+探针+决策规则),无静默 TBD:①范围出口 ②接口契约(对外契约冻结前过"第一个消费者":UI→低保真原型 / 程序→SDK·样例;纯内部豁免)③数据模型 ④外部依赖探查事实(实测成文)⑤行为·边界·并发·威胁 ⑥NFR(安全/隔离/性能/parity/拓扑)⑦验收与测试策略(runbook)⑧关键决策留痕(ADR)。详细设计 just-in-time 进每个 plan(sprint 文档只给摘要;事实/探针/原型在进 plan 那刻才存在,前置=瀑布+漂移)。需求(spec)与设计(design)分开,可独立把关质量。
  • ③ 任务级 checkbox 拆分:每个任务/步骤 - [ ],粒度到"可单独勾选/验证"(bite-sized:写测试 / 跑红 / 实现 / 跑绿 / 提交 各一步)。
  • ④ 每步 TDD:先写测试(红)→ 最小实现(绿)→ 重构;无测试不合并。
  • ⑤ 必含手动验收 runbook:可照抄的命令序列 + 每步期望证据,让人不读代码也能复现验收。由 AI 在写计划时生成(不需人参与);无 runbook 的计划不算完成,§4 再由人照着跑做验收。
  • ⑥ 有争议的设计 → 落 ADR:正文永远是最新版,决策理由与历史进 ADR + git。
  • ⑦ 全绿门禁:每个任务结束跑项目的测试/lint/构建全绿才进下一步;失败先系统化调试定位根因,不打补丁猜。
  • 贯穿全程 · 实时更新状态:每完成一步即勾 - [x] + 同步任务跟踪(in_progress/completed)——进度随时可见、可中断可续;不做完一批才补勾(无人值守跑完忘回填是典型反例)。
一句话:把探针、DoR(spec/design)、checkbox、TDD、runbook、ADR、全绿门禁都前置进计划,正确性在计划阶段就可检验,而不是堆到最后。

3. 执行:交互 vs headless

交互headless(无人值守)
适合有未知判断、探索性计划已审定、确定性高
中途纠偏能(实时可打断)不能(只能 kill)

headless 三个要点(踩坑换来的)

  • 订阅模式:脚本先 unset ANTHROPIC_API_KEY,否则走 API 计费报 Credit balance too low;shell 启动文件里硬编码的 key 要注释掉。
  • 流式 + 落日志:claude -p --verbose --output-format stream-json | tee log;另开 tail -fwatch git log(每任务一 commit)看进度。
  • 合并前停:headless 跑完只 push + 自评,合并留给人。

headless 的"自评 review"不算数 → 必须叠加 §4 隔离审查。

4. 核心:机器自评 ≠ 验证

一次 headless 自主跑完整批任务、自己跑了一轮 code review、单元 + 集成全绿——看起来"完成了"。但合并前的隔离审查仍逮到两个会进生产的真 bug,共同点是:都在实现者没设想到的边界路径上,应有的正确行为压根没实现

  • 一个由独立 reviewer 子代理发现:输入残缺(缺关键字段、无法判定归属)时,代码没有按"安全地拒绝"(fail-closed)处理,而是走进未定义路径、给出错误结果。
  • 一个由人手动跑 runbook发现:重复 / 冲突的操作没被识别,这条路径根本没有对应处理,行为偏离预期。

重点不在"崩没崩",而在"该发生的正确行为缺失、且没被验证"。两个都是真 bug,可自动测试 + 机器自评全没逮到,根因是:

  • 测试是实现者自己写的,只覆盖实现者想到的路径 → 天然盲于实现者的盲区;
  • 测试数据回避了边界:用随机唯一值永不触发"重复 / 冲突",用假对象不模拟"残缺 / 异常" → 出错的那条路径永远没被走到;
  • 机器审自己的代码 → 复用同一套假设,看不见自己没设想的情况。
结论:计划"完成" ≠ 通过。合并前必须两道独立于实现者的审查,它们的价值正是去走实现者没设想到的路径:
:照 runbook 手动验收 + 对照 spec 逐项核,用真实、会撞边界的数据(机器不替代)。
独立 reviewer:派非实现者的子代理审本次 diff(main..HEAD),不带实现者的假设。
这两道闸把那两个 bug 挡在合并前。

5. 决策纪律

  • 有争议的设计 → ADR:正文为最新版,理由/历史进 ADR + git。
  • 地基级改动 → 先批判后批准:动手前用架构顾问做 blast-radius 分析,确认是真需求还是偏好。实战中这一步避免了一次"中途重开已交付地基"的返工——结论是不拆地基,把新能力留作上层叠加。
  • 契约优先:对外契约是稳定面;不裸传/暴露底层系统,在其上加一层薄适配(投影 + 鉴权 + 隔离)。

6. 反模式清单

反模式正解
headless 跑完 = 完成必过人工 runbook + 独立 reviewer
机器审自己的代码当审查隔离审查(独立子代理 / 人)
把猜的外部 API 写进计划探针优先,实测钉死
测试用随机唯一名 / 假对象永不撞边界加冲突/缺字段/越权等 fail-closed 用例
地基改动直接动手先批判(blast radius)+ ADR
计划做完一批才补勾实时勾选 + 任务跟踪
裸传底层系统的 API自有契约 + 薄适配层

7. 上手清单(下个计划照做)

  • ☐ brainstorm → spec 分节确认;争议 → ADR
  • ☐ writing-plans:任务级 checkbox + 每步 TDD + 手动 runbook;不确定外部依赖 → 第一个任务设探针
  • ☐ 执行:交互(有未知)或 headless(确定);实时勾选 + 全绿门禁
  • ☐ 完成后:人跑 runbook + 独立 reviewer;修 Critical/Important
  • ☐ CI 绿 → 人确认 → 合并 → 回标 spec/计划 checkbox
本文件为通用 AI 开发实践;落地时把上述纪律写入团队约定(如 constitution / CONTRIBUTING)。