1999 年,程序员嘲笑那些用"拖拉拽"做界面的人:"那不是真正的编程。"

大家好,我是小虎。

Image

2026 年,同样的戏码又来了一遍。

只不过这次嘲笑的方向反了——那些用 AI"随便聊几句就生成代码"的人,正在被另一批人悄悄甩开。

差距不在模型,不在工具,在于有没有一份合同。

一个美国独立开发者(Phil,Rentier Digital),凌晨两点让 Claude Code 生成了一套完整的认证系统。

代码跑起来了,逻辑清晰,甚至看起来很干净。

2400 行。

他看完才发现,他要的是 Supabase 做用户权限,Claude Code 给了他一套 Firebase——方向完全跑偏,但执行得无比认真。

他全选,Delete。

他在文章里复盘这件事,说了一句话:

"我一直以为自己在用 Claude Code 写代码,其实我在用 Claude Code 赌博。"

他找到了原因,也找到了解法。

这篇文章就是把他的解法,拆成你今天就能上手的步骤。

AI 一直在猜,没有人告诉它终点在哪

先说他找到的根本原因。

Vibe Coding 这个词,翻译过来大概是"凭感觉写代码"——你把需求随口告诉 AI,AI 帮你生成,不对就重跑,反复迭代直到"感觉差不多了"。

听起来挺高效,但 Phil 在文章里把这种方式的问题说得很直接:

你给 AI 的不是需求,是星座运势。

"让它响应式一点。""加一下错误处理。""用最佳实践。"这些不是指令,是占卜词。

AI 没法从"用最佳实践"里推导出你的技术栈、你的代码风格、你不想动的文件,以及什么叫做完了。

它只能猜,然后带着充沛的自信往前冲。

这就是那位开发者拿到 2400 行"跑得很好、但解决的是另一个问题"的代码的根本原因——不是 AI 能力不够,是提示词从一开始就没有终点。

他在文章里用了一个比喻:你不会给承包商一张餐巾纸,上面写"建房子,要好看",然后期待住进梦想之家。

你会得到一栋房子,可能也有墙,但马桶装在厨房里——因为你没说不行。

没有合同,就没有边界。解法也在这里。

Prompt Contract:四个要素,把 vibes 变成规格书

那位开发者找到的解法叫 Prompt Contract(提示词合同)。

核心思路只有一句话:与其写一段话描述你想要什么,不如用四个强制性条款告诉 AI:目标是什么、边界在哪、交出什么格式、什么叫做失败。

原文作者 Phil 把这四个要素称为:Goal(目标)、Constraints(约束)、Output Format(输出格式)、Failure Conditions(失败条件)。

第一部分:Goal——写出可验证的成功标准

不是描述你要做什么功能,是写出"完成"这件事如何被验证。

【目标】
实现邮箱+密码的用户注册和登录。
成功标准:新用户可以注册、登录、退出;
登录后访问 /dashboard 不会被重定向;
未登录访问 /dashboard 会跳转到 /login。

原文的原话是:当 AI 知道终点长什么样,它就停止在赛道上闲逛拍照了。

这里的关键不是"做什么",是写出可测试的完成判断——你能在 1 分钟内验证它有没有做完,而不是靠感觉猜。

第二部分:Constraints——用 CLAUDE.md 把约束变成永久规则

Phil 在原文里做了一件很多人没想到的事:他不是每次把约束写进对话,而是在项目根目录建了一个 CLAUDE.md 文件,把技术栈、禁止行为、代码规范全部写进去,作为这个项目永久生效的约束层。

# CLAUDE.md — 项目约束(始终生效)

## 技术栈(不可更改)
- 语言:Node.js + Express
- 数据库:PostgreSQL(禁止引入任何ORM)
- 认证:已有的 /middleware/auth.js,不允许替换

## 硬性规则
- 不允许引入新的npm依赖,需要时先问我
- /models/ 目录下的文件不允许修改
- 所有错误返回统一格式:{ success: false, message: "xxx" }
- 不允许在任何函数内部写 console.log

每次开启新会话,第一句话固定是:

Read CLAUDE.md and confirm you understand the project constraints before doing anything.

AI 会复述一遍它读到的约束,你确认没问题,再开始任务。

Phil 把这个步骤叫做"Miranda rights of your codebase"——就像执法前要读米兰达权利一样,这是每次开工前的强制确认仪式。

AI 最容易自作主张的地方就是这里:随便换库、改没被授权的文件、自创代码风格。

把这些写进 CLAUDE.md,约束就不只活在单次对话里,而是跟着项目走。

第三部分:Output Format——告诉它交什么给你

不指定 Format,AI 会自己决定代码结构。

原文的比喻是:告诉厨师"随便做",然后惊讶地收到一份装在鞋里的凯撒沙拉——它是对的,只是不是你想要的那个对。

【输出格式】
1. Convex函数写在 convex/users.ts(mutation,不是action)
2. 输入校验的Zod schema写在 convex/schemas/onboarding.ts
3. TypeScript类型从 convex/types/user.ts 导出
4. 公开函数加JSDoc注释
5. 返回格式:{ success: boolean, userId: string, error?: string }

这一步的核心不是"防止 AI 输出废话",而是防止 AI speedrun 你的代码库。

没有 Format 约束时,AI 的默认行为是优化速度,不是可维护性——它会把认证、数据库调用、邮件发送全塞进一个 800 行的函数,可以跑,也是对未来的你犯罪。

把文件路径、层级、类型要求写清楚,它才会写出你三个月后还看得懂的代码。

第四部分:Failure Conditions——告诉 AI 什么叫失败

前三部分是正向规定:目标是什么、边界在哪、交什么格式。

这一部分方向反过来——告诉 AI 什么样的输出是不可接受的。

【失败条件】
以下情况视为任务失败,必须停下来告知我,不允许继续:
- 引入了任何新的npm依赖
- 修改了 /models/User.js 以外的任何已有文件
- 输出的代码无法在现有项目结构下直接运行
- 有任何不确定的地方,没有先问我就自行假设

原文把这个要素称为"secret weapon"。

原因是:正向规定 AI 会尽力遵守,但遇到模糊地带,它的默认行为是猜一个合理方向继续往前。

失败条件是负向熔断——遇到这些情况,AI 被明确要求停下来,而不是自己判断。

就像训狗:"坐下"是正向指令,但真正保住你家沙发的,是那句"不许上沙发"。

AI 没有失败条件时,你说"开车安全",它会开过去。

有了失败条件,才是"不超时速 80、不闯红灯、早高峰别走高速"——一个是祈祷,另一个是导航系统。

合同四部分到位,才算正式生效。

实操一遍:完整示例

结构看完了,直接上一个完整的例子,你可以按格式照填。

假设你要让 AI 给一个 React 项目加一个"导出 CSV"的按钮:

(前置:新会话开头先发这一句)
Read CLAUDE.md and confirm you understand the project constraints before doing anything.

(AI确认后,再发下面的任务合同)

【目标】
在 /pages/UserList.jsx 中添加一个"导出CSV"按钮。
成功标准:点击按钮后浏览器自动下载文件,文件名格式为 users_YYYYMMDD.csv,
内容是页面当前显示的用户列表(props.users),无需后端接口。

【约束】
- 不允许引入新的npm依赖(用浏览器原生 Blob + URL.createObjectURL 实现)
- 只允许修改 /pages/UserList.jsx,不允许动其他文件
- 按钮样式沿用现有的  风格

【输出格式】
- 修改后的完整 UserList.jsx 文件
- 在改动处加注释说明新增内容的起止位置

【失败条件】
以下情况视为失败,停下来告知我,不允许继续:
- 引入了任何新的npm依赖
- 修改了 UserList.jsx 以外的任何文件
- 有任何不确定的地方,没有先问我就自行假设

AI 会照着合同执行,不会去碰你没授权的部分。

加入这一步,前后差距有多大

看到这里你可能会想:比直接让它写多了好几步,值得吗?

来算一下:

直接让 AI 写 → 结果不对 → 让它改 → 还是不对 → 重跑 → 继续改 → 三轮后出来一个勉强能用的版本。

实际花 40 分钟。

用 Prompt Contract → 对齐确认 2 分钟 → AI 一次写出可用代码。实际花 15 分钟。

原文作者事后做了统计:用 Vibe Coding 时,每次生成的代码需要大幅修改的比例大约是三分之一;用 Prompt Contract 之后,降到了十分之一左右,来回反复的轮次也从平均 3 轮压到了 1 轮出头。

这不是 AI 变聪明了。是因为它终于知道自己在做什么了。

跑一周:体感先变慢,然后快

数据看起来很好,但刚开始用的时候你不会有这种感受。

第一天:感觉在多做一步,有点不习惯,写合同花了 10 分钟。

第三天:开始感受到返工减少,整体时间没有增加。

第七天:合同写起来越来越快(因为你的需求描述能力在提高),AI 交付准确率明显上升。

原文作者说,他已经不会回到 Vibe Coding 的方式了——不是因为这套流程高级,而是因为他已经习惯了 AI"可交付"的状态,回头再用那种感觉就像没有合同就把钥匙交出去,太不踏实了。

今天就把这个模板存到备忘录里,下次开始用 AI 写代码前,先花两分钟填一遍。

一周后看看你的返工次数有没有变化。

数字不会说谎。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐