最近一直在尝试 Vibe Coding 的各种 SDD 开发方式,比如 OpenSpec、SpecKit、oh-my-openagent 的 Prometheus。
Andrej Karpathy 在 2025 年 2 月提出了 Vibe Coding 这个概念——用自然语言描述意图,让 LLM 生成代码,“Accept All” 不看 diffs,错了直接复制错误信息让 AI 修复。
但真正上手后,我发现一个致命问题:AI 老是胡乱发挥。
尤其在维护旧项目时,你给它一个需求,它能给你整出三套实现方案,每个都"看起来合理",但哪个才是你真正想要的?
什么是 Spec-Driven Development (SDD)
规约驱动开发(Spec-Driven Development,SDD),或者说"契约优先开发"(Contract-First Development),核心思想很简单:
先定义规范,再让 AI 执行。
不是传统的"先写代码,文档是脚手架",而是把规范作为唯一事实来源(Single Source of Truth)。
GitHub Spec Kit 提出了六阶段工作流:
/constitution- 定义项目级原则(质量标准、架构约束)/specify- 描述功能"是什么",不涉及"怎么做"/clarify- 消除歧义、识别边界条件/plan- 技术选型、架构决策/tasks- 分解为可执行单元/implement- 按规约编写代码
这个流程让我意识到:Vibe Coding 的终极目标不是让模型发挥多强,而是确保意图能被 100% 理解和实现。
Harness Engineering:给模型套上缰绳
Anthropic 有个经典隐喻:
|
|
Harness Engineering 就是设计、构建和运营 AI Agent 基础设施的学科——约束、引导、验证、纠正生产环境中的 AI。
这跟 Prompt Engineering 完全不同:
| 对比维度 | Prompt Engineering | Harness Engineering |
|---|---|---|
| 范围 | 发送给 Model 的指令文本 | 围绕 Model 的整个基础设施 |
| 焦点 | 让 Model 理解任务 | 系统如何约束、验证、纠正 Model |
| 可靠性提升 | 5-15% | 50-80% |
有个真实案例让我印象深刻:某金融公司的 Agent 在凌晨 3 点失控,连续 11 分钟疯狂重试一个失败的 API,累计重试 847 次,消耗了 2200 美元的 API 费用,还给同一个客户发了 14 封重复邮件。
事后复盘发现:Model 运行正常,Prompt 也精心设计了,但问题出在基础设施层面——缺少三个硬性控制:重试上限、执行超时、熔断机制。
这件事让我真正理解了 Harness 的核心价值:写在 Prompt 里的"请勿超过 10 次重试",只是建议,AI 可以忽略,可以被其他指令覆盖。但在 Harness 层强制执行的重试上限,才是真正的治理——Agent 无法绕过,必须遵守。
工程范式发生了彻底的改变
从对话交互到严格约束
过去我们:
- 不断和 AI 对话交互
- 写更好的 prompt
- 用更强的单一模型(GPT-4 → GPT-4o → Claude Opus)
现在的 Harness Engineering:
- 严格约束:哪些要做,哪些不能做
- 人类意图的理解:面试式访谈,消除歧义
- 全流程把控:从规约 → 计划 → 执行 → 验证
- 多 Agent 多模型协作(oh-my-openagent插件):Sisyphus + Prometheus + Metis + Momus
核心组件
Harness Engineering 有五大组件:
- Context Engineering - 决定 Agent 每一步看到什么信息
- Tool Orchestration - 工具选择、参数验证、执行沙箱
- Verification Loops - 每步验证输出(83% → 96% 任务完成率)
- Cost Envelope Management - Per-task 预算上限(median × 3)
- Observability - 结构化执行追踪,因果关系记录
我的 Harness Engineering 实践:DDD + gRPC 项目
第一步:定义 gRPC 输入输出规范
DDD 架构的项目,必须先人工定义 gRPC 的输入输出规范。
|
|
这个 .proto 文件就是契约——AI 不能超出这个范围胡乱发挥。
第二步:让 AI 全量探索项目
项目中有很多 repo 层的可复用资源,需要让 AI 做全局探索(只读),产出项目概要 markdown。
使用 oh-my-openagent 的 /init-deep ,并行启动多个 Agent:
- 搜索现有数据模型
- 分析 repo 层接口
- 提炼可复用组件
第三步:编写业务细节 markdown
切记:不要贪图一个文档囊括大量业务细节。
小颗粒度拆分:
|
|
原则:尽量让主 Agent 每次任务不占用过多上下文。就算压缩上下文,也是信息准确度的丢失。
第四步:调研阶段——绝不能直接写代码
这是最关键的一步:一定要告诉 AI,不要一开始就写代码。
尤其在上下文累积越长的时候,模型越容易产生幻觉,自以为是地开始执行。我们要利用单个 AI session 的上下文空间,先让 AI 进行严格的调研,提出疑问,我们一起完善我之前编写的规约规范。
模拟对话的场景:
|
|
上面的对话场景,只是我模拟举出的案例。这种迭代式澄清,比直接让 AI 写代码效果好太多。
第五步:调研结束后,使用 OpenSpec 或 Prometheus 建立 Tasks/Plans
我常用的两种方式:
OpenSpec 的 /opsx:propose:
|
|
oh-my-openagent 的 Prometheus:
|
|
当然我个人而言,我更喜欢omo插件的"访谈式",或者说是"对话式"的确认很多细节。
第六步:Plans/Tasks 创建后,新建 session 执行
当 Plans 或 Tasks 的 markdown 文件创建好后,我会新创建一个 AI session,让它专一地执行这次任务。
使用 omo 的/start-work,或者 OpenSpec的 /opsx-apply xxxxx:
- 读取已验证的计划
- 委托给专业 Agent(代码生成、测试、集成)
- 独立验证结果
- 主 Agent 协调
题外话:oh-my-openagent 的多 agent、多 category 的方式,似乎在使用 OpenSpec 的 skills 时,无法正常启用,它只会让你当前主模型去执行。
总结:实践后的真实感受
用了2个多月 Harness Engineering 的方式做 Vibe Coding,最大的感受不是数据提升了多少,而是心态变了。
以前用 AI 写代码,每一步都提心吊胆——它会不会理解错了?会不会自作主张加一堆不需要的功能?会不会把简单的事情搞复杂?
现在有了规约约束,这些问题基本消失了。不是因为我用了更强的模型,而是因为我在 AI 执行之前,先把意图"钉死"了。
几个明显的改变:
返工少了。以前一个功能平均要来回改三四次,现在大部分一次就过。不是因为 AI 突然变聪明了,是因为规范把"怎么做"提前定清楚了。
成本降了。同样的任务,Token 消耗大概省了三分之一。因为 AI 不需要反复尝试、反复修正了。
模型要求没那么高了。以前觉得必须用 Claude Opus 才能干好活,现在用 Sonnet 配合完善的规约,效果差不多。
Vibe Coding 的本质不是"让 AI 更聪明",而是"让 AI 更听话"。
听话的前提是:你先把话说清楚。
这才是 Harness Engineering 的核心——它不是让模型发挥更强的能力,而是确保你的意图被准确理解、严格执行。
搭这套基础设施确实费时间,反复探索这2个多月时间,才用顺手。但一旦搭好了,AI 编码就从"猜谜游戏"变成了"按图施工"——你可以真正享受 Vibe Coding 的乐趣,而不是每次都要盯着它有没有跑偏。
如果你对规约驱动开发感兴趣,可以看看我在 OpenCode 中尝试 OpenSpec 的体验。对于 AI agent 模型配置,可以参考我的 oh-my-opencode 配置优化历程。