法不净空,觉无性也。

第五章:验收体系——质量门禁设计

2026.07.26

代码能跑通,不代表它是安全的。能正常工作,不代表它没有埋下隐患。

你的项目上线运行了三个月,一切正常。

直到有一天,一个用户发现了一个"小问题":他在搜索框输入了一个特殊字符,页面崩溃了。你查了日志,发现是 AI 在生成代码时,没有对用户输入做转义处理。

你开始担心:这会不会只是一个孤立的疏忽?你检查了更多代码。结果让你后背发凉——AI 写的 API 没有做请求频率限制、数据库查询没有用参数化处理、用户上传的文件类型没有校验、错误信息直接暴露了数据库连接字符串。

这些代码全都"能跑通"。它们工作正常——直到某个边界条件触发了隐藏的漏洞。

你不是不小心。你是没有建立验收体系。

5.1 为什么需要独立的验收

在传统的 AI 编码实践中,"验收"往往只是开发者看一眼代码,觉得"差不多"就通过了。

但问题在于:AI 生成的代码从语法上看几乎总是正确的,真正的问题藏在逻辑和架构层面。 一眼看不出来,跑一下也可能正常——直到某个边界条件触发 bug。

这就是为什么需要一套独立的、结构化的验收体系。

5.2 三条防线的设计逻辑

验收体系的核心是"三条防线"的设计。为什么是三条?因为 AI 编码的错误有三个层次,你需要三个层次的检测方法。

第一层:功能防线——检测"代码是否跑通了"

这是最直观的检查。代码能不能跑通?功能对不对?你写测试用例,跑测试,看结果。如果你让 AI 实现"用户注册",它写了代码,你跑测试——注册成功,密码存入了数据库,登录成功。功能防线通过。

但功能防线有一个盲区:它只检查"代码是否按预期运行",不检查"代码是否按正确的方式运行"。你的注册功能跑通了,但密码是明文存储的——功能测试发现不了这个问题。因为功能测试的输入是"用户名+密码",输出是"注册成功",测试用例不会去检查数据库里存的是什么。

第二层:架构防线——检测"代码是否遵守了蓝图"

这是 AI 编码中特有的防线。AI 很容易在实现功能时"顺手"改了不该改的东西——比如为了修复一个 Bug,它直接修改了数据库表结构。功能测试看不出来,因为功能还是对的,但架构已经偏移了。

架构防线的检查方法很简单:对比蓝图文件(CONTEXT.md)和实际代码。蓝图规定"密码必须用 bcrypt 加密",架构防线就检查实际代码中是否调用了 bcrypt。蓝图规定"错误必须抛统一 AppException",架构防线就检查实际代码中是否用了 AppException。

第三层:安全防线——检测"代码有没有引入安全隐患"

这是最容易被忽视的防线。AI 生成的代码往往"功能正确但安全脆弱"。原因很直接:AI 的训练数据中包含了大量"能用但不安全"的代码。它学会了"写功能",但没学会"写安全的代码"。

来看一个三层防线如何协作的例子。假设同一个 Bug——登录接口在密码错误时返回 500 错误:

  • 功能防线看到的是:返回状态码错误,需要修
  • 架构防线看到的是:错误处理逻辑不在统一的异常处理层,需要重构
  • 安全防线看到的是:错误信息直接暴露了数据库连接信息,需要修复

同一个 Bug,三层防线看到的是三个不同层面的问题。只修了第一层,第二层和第三层的问题依然存在。这就是为什么需要三层防线——每一层覆盖上一层覆盖不到的盲区。

新手验收通常只关注第一层。有经验的开发者三层都检查。

5.3 如何设计验收标准

验收标准不是测试用例。测试用例验证"代码是否按预期运行",验收标准验证"代码是否按约束完成"。两者有本质区别。

一个设计良好的验收标准应该包含三类检查:

第一类:功能检查——核心流程是否跑通?边界条件是否处理?错误路径是否覆盖?这些是测试用例可以覆盖的。

第二类:约束检查——是否遵守了技术栈约定?是否遵守了命名规范?是否遵守了架构原则?这些是蓝图中的"硬约束",AI 容易在不经意间违反。

第三类:质量检查——代码行数是否在合理范围?是否有重复代码?是否有不安全的 API 调用?这些是"软约束",没有明确的通过/不通过,但需要人工判断。

来看一个"好验收标准"和"差验收标准"的对比:

差的验收标准(太模糊,无法判断是否完成):

"登录功能完成。"

好的验收标准(精确,可量化,可验证):

"登录功能完成,验收标准:

  1. 密码用 bcrypt 比对
  2. JWT 包含 user_id,有效期 2 小时
  3. 错误返回统一格式的 401 AppError
  4. 连续 5 次失败锁定账号 30 分钟"

差的验收标准说了等于没说。好的验收标准让 AI 和开发者都能精确判断"是否完成"。

5.4 验收清单

以下是一份完整的验收清单,你可以根据项目实际情况调整:

功能验收

  • 所有需求点都已实现
  • 主流程能正常运行
  • 边界情况有处理(空数据、异常值、极限情况)
  • UI 交互符合预期(加载状态、错误提示、空状态)

代码验收

  • 代码风格与项目一致(缩进、命名、注释)
  • 没有明显的代码质量问题(重复代码、过长函数、不合理命名)
  • 没有死代码(未被调用的函数、未使用的变量)
  • 错误处理合理(不吞异常、不暴露敏感信息)

架构验收

  • 没有修改不应修改的核心代码
  • 没有引入不必要的依赖或抽象
  • 单个文件没有过度膨胀(建议上限 300 行)
  • 新增代码与项目的目录结构一致
  • API 设计遵循项目的约定

安全验收

  • 用户输入经过验证或转义
  • 敏感接口有权限控制
  • 没有硬编码的密钥或凭证
  • 数据库查询使用参数化查询或 ORM
  • 不返回不应暴露的数据字段

5.5 验收报告

验收完成后,应该输出结构化的验收报告。以下是报告模板:

## 验收报告:里程碑 X

### 结论:PASS / NEEDS_FIX / REBUILD

### 功能验收
- [x] 需求全部实现
- [x] 主流程正常
- [ ] 边界情况:未处理搜索关键词为空的情况

### 代码验收
- [x] 代码风格一致
- [x] 无重复代码
- [x] 错误处理合理

### 架构验收
- [x] 未篡改核心代码
- [x] 未引入不必要的依赖
- [x] 目录结构合规

### 安全验收
- [x] 输入验证完整
- [x] 权限控制到位
- [x] 无硬编码凭证

### 修复建议(仅 NEEDS_FIX 时)
1. 在搜索函数中添加空字符串判断
2. 当搜索关键词为空时,返回完整列表

5.6 验收中的架构偏移检测

架构偏移是 AI 编码中最隐蔽也最具破坏性的问题。AI 在实现一个功能时,可能会"顺手"修改了不该改的地方。

三大信号详解

信号一:篡改地基

AI 修改了以下类型的代码,应该立即 REBUILD:

  • 数据库连接配置
  • 认证和授权逻辑
  • 全局中间件
  • 核心工具函数
  • 共享的数据模型定义

为什么会发生: AI 发现当前功能的实现"需要"修改地基代码。但通常这不是真的需要,而是 AI 走了捷径。

信号二:过度设计

AI 引入了以下不必要的复杂性:

  • 为简单场景添加了抽象层(接口、工厂、策略模式)
  • 引入了项目不需要的第三方库
  • 添加了当前功能不需要的配置选项

为什么会发生: AI 倾向于"以防万一"的设计,而不是"刚刚好"的设计。

信号三:体积失控

AI 在单个文件中堆积了过多代码:

  • 一个组件文件超过 300 行
  • 一个工具函数文件包含多个不相关的功能
  • 一个 API 路由处理了多个不相关的请求

为什么会发生: AI 在"追加代码"时不会主动重构。它会直接在现有文件上添加新功能,导致文件膨胀。

检测方法

如何检测架构偏移?

1. 用 git diff 查看变更文件列表
   意外出现的文件修改 → 可能是篡改地基

2. 检查新增文件的长度
   新文件超过 300 行 → 可能是体积失控

3. 检查新增的依赖
   package.json 中出现了未预期的依赖 → 可能是过度设计

4. 对比蓝图的目录结构
   代码放在了蓝图未约定的位置 → 可能是架构偏移

5.7 验收中的安全审查

安全审查不是可选项。AI 生成的代码存在一些常见的"安全盲区"。

常见安全问题

  1. 信息泄露:API 返回了数据库中的敏感字段(密码哈希、内部 ID)

    // ❌ 不安全:返回了整个 user 对象
    return Response.json(user)
    
    // ✅ 安全:只返回需要的字段
    return Response.json({ id: user.id, name: user.name })
    
  2. 权限缺失:敏感接口没有权限检查

    // ❌ 不安全:任何人都能删除用户
    DELETE /api/users/:id
    
    // ✅ 安全:只有管理员能删除用户
    DELETE /api/users/:id  // 需要 admin 角色
    
  3. 输入验证不足:用户输入直接用于数据库查询或页面渲染

    // ❌ 不安全:直接拼接用户输入
    db.query(`SELECT * FROM users WHERE name = '${input}'`)
    
    // ✅ 安全:使用参数化查询
    db.query('SELECT * FROM users WHERE name = ?', [input])
    

安全验收方法

一个有效的做法是让 AI 做安全自检:

请对以下代码进行安全审查,检查:
1. 是否存在 SQL 注入风险
2. 是否存在 XSS 风险
3. 权限检查是否完整
4. 是否暴露了不应暴露的数据
5. 是否有硬编码的密钥或凭证

5.8 验收的自动化

对于成熟的项目,验收可以部分自动化:

  1. 单元测试:自动运行,确保核心逻辑正确
  2. Lint 检查:自动检查代码风格和常见问题
  3. 类型检查:TypeScript 项目自动检查类型
  4. 安全扫描:自动扫描已知的安全漏洞

但自动化不能替代人工验收。自动化检查只能发现"代码层面的问题",无法发现"设计层面的问题"——后者需要人基于蓝图的判断。


本章小结

验收体系是 AI 编码中不可省略的环节。三条防线——功能、架构、安全——覆盖了 AI 编码的三个错误层次,每层覆盖上一层覆盖不到的盲区。验收标准的核心是"可验证":精确到让 AI 和开发者都能判断"是否完成"。架构偏移的三大信号(篡改地基、过度设计、体积失控)是验收中最需要警惕的问题。记住:代码能跑通不等于它是对的,能正常工作不等于它没有隐患。下一章,我们将学习项目编排——当项目有多个功能时,如何管理它们的开发顺序和质量门禁。