Codex、Claude Code 等开发系统的质量把控体系
建立一套独立于模型能力的工程控制系统,让 AI 可以高效生成代码,但无法绕过需求、测试、安全、审核和发布门禁。
整体思路
从需求到线上运行建立完整、独立、可追溯的质量链路。
Codex、Claude Code 等智能编码工具的质量控制,不能只依赖提示词,也不能只依赖模型的自我检查。真正有效的方式,是建立一套独立于模型的工程体系。
但不能直接提交到主分支,也不能绕过 Pull Request。
但不能仅凭自己编写的测试证明实现正确。
以测试报告、扫描报告、构建结果和运行指标为准。
AI 不得降低覆盖率、关闭检查或修改审批规则。
需求门禁:先让任务可验证
质量控制的起点不是代码,而是清晰、可执行的验收标准。
不要直接向 AI 下达模糊任务,例如“做一个用户登录系统”。应使用结构化任务单:
# 任务目标
实现邮箱和密码登录。
# 不在本次范围
- 手机号登录
- 第三方 OAuth
- 找回密码
# 验收标准
1. 正确账号密码可以登录
2. 错误密码返回统一错误信息
3. 连续失败 5 次后限制登录
4. 密码不得写入日志
5. 登录接口 P95 响应时间低于 500ms
# 允许修改范围
- src/auth/**
- tests/auth/**
# 禁止修改范围
- 数据库公共配置
- CI 配置
- 权限中间件
- 生产环境变量
# 必须执行
- 单元测试
- 接口集成测试
- 类型检查
- 安全扫描
每个任务至少应包含
- 任务目标与业务价值
- 明确的不在范围内容
- 可执行的验收条件
- 允许和禁止修改的目录
- 风险等级与审批人
- 测试、部署和回滚要求
规则门禁:统一 AI 开发规范
让不同编码代理遵循一致的项目约束和交付格式。
建议在项目根目录同时维护以下规则文件:
AGENTS.md
CLAUDE.md
# 开发流程
1. 修改代码前先输出实施计划。
2. 未明确验收标准时,不得开始实现。
3. 每次任务只解决一个问题。
4. 禁止直接修改 main 分支。
5. 禁止使用 --force、reset --hard 和跳过检查参数。
6. 禁止读取或输出 .env、密钥和生产凭据。
7. 不得删除现有测试来让 CI 通过。
8. 不得降低覆盖率阈值。
9. 新增生产依赖必须说明原因。
10. 修改完成后必须执行:
- lint
- typecheck
- unit test
- integration test
- build
# 输出要求
完成任务后必须提供:
- 修改文件列表
- 实现内容
- 测试命令和结果
- 未解决风险
- 回滚方式
权限门禁:限制 AI 能做什么
使用最小权限、临时凭据和隔离环境控制 AI 的操作边界。
| 操作 | 默认权限 | 控制建议 |
|---|---|---|
| 读取项目代码 | 允许 | 排除密钥、生产配置和敏感数据目录 |
| 修改当前任务目录 | 允许 | 通过路径白名单控制 |
| 修改其他目录 | 需要审批 | 触发 Hook 或 CI 阻断 |
| 安装生产依赖 | 人工审批 | 记录原因、许可证和漏洞信息 |
| 读取 .env | 禁止 | 使用临时测试凭据 |
| 修改 CI / CODEOWNERS | 禁止 | 指定专门负责人审核 |
| 直接修改主分支 | 禁止 | 强制通过分支和 PR |
| 发布生产环境 | 禁止 | 使用独立部署身份和人工批准 |
需要拦截的危险命令
rm -rf
git push --force
git reset --hard
DROP DATABASE
TRUNCATE TABLE
kubectl delete
terraform destroy
chmod 777
curl ... | bash
AI 只获得短期、低权限、可撤销的测试凭据。
开发、测试、预发布、生产使用独立账户和资源。
每个任务使用独立分支或 Git worktree。
仅开放包管理、代码托管和必要文档域名。
自动化门禁:CI 才是最终裁判
把质量规则转化为不可绕过的自动检查和状态门禁。
基础质量检查
格式检查、Lint、类型检查、未使用代码、循环依赖。
完整构建、依赖锁文件一致性、制品可复现。
单元、集成、契约、端到端、迁移和回归测试。
密钥、依赖漏洞、SAST、容器、IaC 和许可证扫描。
变更约束检查
- 是否修改禁止目录。
- 是否删除或弱化已有测试。
- 覆盖率是否下降。
- 是否新增生产依赖。
- 是否改变公共 API。
- 是否包含破坏性数据库迁移。
- 是否修改认证、权限或密钥逻辑。
quality-gates:
- format
- lint
- typecheck
- unit-test
- integration-test
- build
- secret-scan
- dependency-scan
- sast
- migration-check
- acceptance-test
.github/workflows/**、quality/**、CODEOWNERS、覆盖率阈值和安全扫描配置。
独立复核门禁:生成者不能兼任唯一审核者
使用独立上下文、不同角色和人类审核形成制衡。
独立 AI 审核要求
- 使用新的会话和上下文。
- 不读取开发代理的推理过程。
- 只读取原始需求、Git diff 和验证报告。
- 最好使用另一个模型或不同配置。
- 审核代理只报告问题,不直接修改代码。
你是独立代码审核员。
只根据以下内容进行审核:
1. 原始需求
2. 验收标准
3. Git diff
4. 测试报告
重点检查:
- 是否完整实现验收标准
- 是否修改了范围外文件
- 是否存在逻辑漏洞
- 是否遗漏边界条件
- 是否存在并发、权限或数据一致性问题
- 测试是否真正覆盖实现
- 是否通过修改测试掩盖问题
- 是否新增安全风险
- 是否具备回滚能力
不要修改代码。
按以下格式输出:
- 阻断问题
- 高风险问题
- 一般问题
- 测试缺口
- 是否建议合并
风险分级门禁
根据代码影响范围决定测试、审核和发布强度。
| 等级 | 典型修改 | 最低要求 |
|---|---|---|
| L1 低风险 | 文档、样式、文案 | 自动检查 + 普通审核 |
| L2 一般风险 | 页面功能、普通业务逻辑 | 单元测试 + 集成测试 + 人工审核 |
| L3 高风险 | 公共 API、数据库结构、文件处理 | CODEOWNER + 完整回归 + 预发布验证 |
| L4 极高风险 | 登录、权限、支付、密钥、基础设施 | 双人审核 + 安全审核 + 灰度 + 人工发布 |
risk_rules:
critical:
paths:
- src/auth/**
- src/payment/**
- infrastructure/**
- migrations/**
required:
- 2_human_approvals
- security_review
- staging_deployment
- rollback_validation
发布与线上质量门禁
测试通过不代表可以直接全量上线,仍需灰度、观察和回滚能力。
至少监控的指标
- HTTP 5xx 错误率和异常日志数量。
- 接口 P95 / P99 延迟。
- CPU、内存、数据库连接和消息积压。
- 登录、支付等核心业务成功率。
- 新版本与旧版本的指标差异。
- 回滚次数、用户投诉和异常工单。
rollback:
error_rate: "> 2%"
p95_latency_increase: "> 30%"
core_business_success_drop: "> 5%"
critical_alerts: ">= 1"
推荐的项目目录
将需求、规则、质量脚本、工作流和测试分层管理。
project/
├── AGENTS.md
├── CLAUDE.md
├── docs/
│ ├── architecture/
│ ├── decisions/
│ └── specs/
│ └── TASK-001.md
├── quality/
│ ├── policy.yaml
│ ├── risk-rules.yaml
│ ├── acceptance/
│ ├── regression/
│ └── scripts/
│ ├── check-scope.sh
│ ├── check-test-deletion.sh
│ └── check-coverage.sh
├── .github/
│ ├── CODEOWNERS
│ ├── pull_request_template.md
│ └── workflows/
│ ├── quality.yml
│ ├── security.yml
│ └── deploy.yml
└── tests/
├── unit/
├── integration/
├── contract/
└── e2e/
PR 必须提交的质量证据
用可验证结果替代“已经完成”“应该正常”等主观描述。
## 需求编号
TASK-001
## 风险等级
L2
## 修改范围
- src/auth/login.ts
- tests/auth/login.test.ts
## 验收标准
- [x] 正确账号可以登录
- [x] 错误密码返回统一错误
- [x] 连续失败触发限制
- [x] 密码不写入日志
## 验证证据
- Lint:通过
- Typecheck:通过
- Unit test:128/128
- Integration test:24/24
- Build:通过
- Secret scan:通过
- SAST:无高危问题
## 风险
登录限制状态依赖 Redis。
## 回滚方案
回滚当前提交,不涉及数据库结构变化。
质量指标体系
用缺陷、返工和线上表现衡量质量,而不是仅统计代码产量。
| 指标 | 含义 |
|---|---|
| AI PR 首次通过率 | AI 一次提交通过所有质量门禁的比例 |
| 平均返工轮数 | 一个任务从首次提交到合并所需修改次数 |
| 审核缺陷密度 | 每千行变更发现的问题数量 |
| 线上逃逸缺陷率 | 进入生产后才被发现的缺陷比例 |
| 变更失败率 | 引起回滚、故障或事故的发布比例 |
| 覆盖率变化 | 新增代码是否获得足够测试覆盖 |
| 越权修改次数 | AI 修改任务范围外代码的次数 |
| 测试删除率 | 通过删除测试规避失败的风险信号 |
| 回滚成功率 | 出现问题时是否能够快速恢复 |
最小可用实施方案
先建立不可绕过的基础门禁,再逐步增加审核、灰度和数据看板。
第一批必须落实的八项措施
- 主分支禁止直接推送。
- 所有 AI 修改必须通过独立分支和 Pull Request。
- 建立 AGENTS.md 和 CLAUDE.md。
- 每个任务必须具备可执行的验收标准。
- CI 强制执行 Lint、类型检查、测试和构建。
- 禁止 AI 修改 CI、质量阈值和 CODEOWNERS。
- 每个 PR 至少进行一次独立审核。
- 高风险模块必须人工审批后发布。
分阶段建设路线
规则文件、CI、分支保护、PR 模板。
风险分级、CODEOWNERS、安全扫描。
独立 AI 审核、质量数据看板。
灰度发布、自动回滚、事故复盘。
