三个月之墙


你用 vibe coding 构建一个 SaaS。一开始很快。“做个登录”——30秒。“加上支付”——2分钟。三周内 MVP 就上线了。

三个月后,奇怪的事情开始发生。AI “整理"了支付逻辑,悄悄改变了折扣计算。添加一个新端点,破坏了现有的认证。一次重构请求改变了公开 API 的字段名,所有客户端全部失效。

这就是所谓的 logic drift——AI 无意中修改了现有的业务逻辑。传统开发中也存在回归 bug。但 logic drift 不同。开发者从未打算做出的更改,在整个代码库中悄无声息地发生。每次 prompt 都在一个全新的 context window 中开始。


用数据说话

这不是主观感受。有数据为证。

速度的代价是复杂性。 卡内基梅隆大学的研究团队比较了 807 个 GitHub 仓库在采用 Cursor 前后的变化(MSR 2026)。第一个月代码增量提升了 3-5 倍。两个月后,速度优势消失了。留下的是:静态分析警告增加 30%,代码复杂度增加 41%——永久性的。

并没有变快——反而变慢了。 非营利 AI 研究机构 METR 对 16 名有经验的开源开发者进行了随机对照试验(2025)。在他们已经熟悉的项目上,使用 AI 工具的小组完成任务的时间多了 19%。然而开发者自己认为加速了 20%。感知与现实之间存在 39 个百分点的差距。新项目上的结果可能不同,但"AI = 总是更快"的假设已经被打破。

规模化后,稳定性崩溃。 根据 Google DORA Report(2025),AI 采用率每增加 25%,软件交付稳定性就下降 7.2%。

确实崩溃了。 Amazon 在 2025 年全公司强制推行 AI 编码工具,部署了 21,000 个 AI agent。同一时期,约 30,000 名员工被裁,审查能力急剧下降。AI 快速生成代码与审查人员减少的叠加效应,导致 90 天内发生了 4 起 Sev-1 事故。2026 年 3 月 5 日,一次 6 小时的宕机造成了约 630 万笔订单损失。内部文件写道:“GenAI 的快速代码生成正在无意中暴露漏洞,现有的安全措施完全不够。”


“做 TDD"不是答案

针对 vibe coding drift 的常见建议是"写测试”。方向是对的,但怎样提供测试决定了结果。

TDAD 研究(arxiv 2026)精确地测试了这一点。Qwen3-Coder 30B 在 SWE-bench Verified 的 100 个实例上进行了测试。

条件回归率
基线(无测试指令)6.08%
过程式"做 TDD"指令9.94%(更差)
将受影响的测试文件提供在 context 中1.82%(降低 70%)

告诉 agent “做 TDD"反而更糟。Agent 在试图遵循过程式指令时偏离了原始任务。但将"这些测试文件必须通过"作为具体 context 提供,回归减少了 70%。

区别很明确。不是"如何测试"的指令,而是"什么必须通过"的契约。


Hurl:Plain Text 中的契约

Hurl 是一个以 plain text 声明 HTTP 请求和预期响应的测试工具。由 Orange(法国电信)维护,是一个零运行时依赖的 Rust 二进制文件,GitHub 18.7k 星。速度足以在 CI 中的每次 commit 上运行。

# Login succeeds
POST http://localhost:8080/api/auth/login
{
  "email": "test@example.com",
  "password": "secret123"
}
HTTP 200
[Asserts]
jsonpath "$.token" exists
jsonpath "$.user.email" == "test@example.com"

# Unauthenticated access returns 401
GET http://localhost:8080/api/pages
HTTP 401

两个契约。登录必须返回 200 和 token。未认证的访问必须返回 401。

当这个文件被提交到 git 并在 CI 的每次 commit 中运行时——AI “整理"认证逻辑使 401 变成 200 的那一刻,commit 就会被拒绝。Drift 在到达生产环境之前就被捕获了。


为什么是 Hurl

单元测试也能捕获 drift——如果你不给 AI 修改测试文件的权限的话。但单元测试验证的是内部函数,使它们在结构上与实现耦合。函数名变了,测试就坏了。每次重构都需要更新测试。

Hurl 位于 HTTP 边界。它只声明请求和响应。它对代码内部一无所知。无论 AI 如何修改代码,如果外部可观察行为不变,测试通过;如果不同,测试失败。它天然独立于实现

单元测试Hurl
验证对象函数内部HTTP 契约
AI 重构时一起修改不变
Drift 检测有条件的(需锁定)天然的
代码结构依赖
人类可读性代码级Plain text
LLM 生成需要理解代码结构只需 HTTP

Hurl 验证的不是代码,而是行为。代码可以被 AI 自由修改。行为不能改变。这个区别就是捕获 drift 的关键。


Ratchet 锁定

当 Hurl 测试通过后,锁定它们。这就是 ratchet。

1. Write Hurl tests for current API (or auto-extract)
2. Run on every commit in CI
3. Passing tests cannot be deleted or modified
4. New features require new Hurl tests
5. All existing + all new tests must pass to merge

告诉 agent “重构这段代码”,它可以自由修改代码。但如果 Hurl 测试失败,commit 会被拒绝。Agent 必须在重构时保留所有现有行为。Hurl 未覆盖的边界情况仍可能发生 drift,但对于已覆盖的行为,drift 在结构上被抑制了。

这与 TDAD 研究的发现完全一致。不是过程式的"写测试"指令,而是具体的"这些 Hurl 文件必须通过"契约。Agent 可以选择方法,但不能违反契约。


遗留系统也适用

已经在生产环境中运行 vibe coding 的软件?不需要从头来过。

第一步:用 Hurl 捕获当前行为。

如果有 API 文档,直接翻译成 Hurl。如果没有,让 agent 读取现有代码并编写 Hurl 测试。目标是为每个端点用 plain text 声明"它目前是这样工作的”。

第二步:接入 CI。

验证所有 Hurl 测试通过,并将其设为合并条件。

第三步:你安全了。

无论 AI 重构还是添加功能,Hurl 都保护着现有行为。如果发生 drift,CI 立即捕获。

不是打地基——是抗震加固。不用关门停业就能加固建筑。


不是 Vibe Coding 的终结——而是进化

创造"vibe coding"一词的 Andrej Karpathy 在整整一年后的 2026 年 2 月宣布"vibe coding 的时代结束了”。新范式是 agentic engineering——人类不写代码,而是编排能够自主规划、实现和测试的 agent。

Thoughtworks Technology Radar(2025)将 Spec-Driven Development 放在了"Assess"级别。Martin Fowler 的团队发表了 SDD 工具分析。行业正在朝同一方向收敛。

Hurl 测试是这一转型的最小单元。你不需要 10 个规范。你不需要学 OpenAPI。一个 Hurl 文件就是一个契约。 而这个契约在不限制 agent 自由的前提下,从结构上防止了 drift。

不要换模型。加一个契约。


相关文章


References