阶段 ⑥ 验证与质量门(Validation & Quality Gates)
定义:用最小且与最终改动相关的检查验证结果:每个改动映射到覆盖其行为/不变量/风险的检查并实际执行;失败必须可复现、可定位、有因果诊断;修复后同一检查复验。验证在真实交付边界之外只算"局部证据"。
输入:⑤ 的实现产物(diff + 自测结果)+ ① 的验收标准(AC 映射)。
输出:验证记录(检查身份 + argv/cwd + 结果 + 覆盖的不变量)、审查结论。
进入下一阶段(⑦ 交付与发布):全部质量门通过、审查无阻塞项。
1. 要求(Requirements)
1.1 进入条件
- 实现已满足 ⑤ 的 DoD(自测全绿、变更矩阵已同步)。
1.2 完成条件(DoD)
2. 规则(Rules)
2.1 验证选择
| 编号 |
规则 |
| R-6.1 |
相关验证:最终改动必须被最小且直接覆盖其行为的检查验证;跑一个无关的大套件或陈旧结果不算(旧结果、全量套件、agent 一句"done"都不是验证证据)。 |
| R-6.2 |
分层选择:按"快/慢、便宜/昂贵"分层(lint/typecheck/单测 → 契约/集成 → E2E → 打包冒烟),agent 能按改动选择正确层;慢 e2e 本身不坏,坏的是它成为唯一反馈。 |
| R-6.3 |
失败的顺序链:failure → reproduction → diagnosis → bounded repair,缺一不可;一条重试就过了但没有诊断的修复,不构成修复证据。 |
| R-6.4 |
修复后复验:同一检查(或证明覆盖同一行为与范围的等价检查)在修复后的最终状态重跑;无失败无修复则记 N/A 并附相关验证结果。 |
| R-6.5 |
验证是机器事实:命令身份(argv/cwd)、fixture、修订号、结果、覆盖的不变量都要保留;CI 身份与本地等价性记录在案。 |
2.2 质量门(Quality Gates)
| 编号 |
规则 |
| R-6.6 |
机制强制优先于文档:架构/安全/schema/迁移/生成物漂移等规则用测试与静态检查强制(architecture test、契约 diff、迁移 lint、生成物 drift check),只写进文档不算门禁。 |
| R-6.7 |
门禁与修订绑定:必须过的检查(lint/typecheck/单测/关键 E2E/构建)在合并前对最终修订全绿;绕过门禁必须有记录的理由。 |
| R-6.8 |
测试断言真实行为:测试断言行为与不变量,不只是冒烟(跑通≠通过);live/真实设备用例必须有 skip 守卫,禁止依赖本机路径/凭据。 |
| R-6.9 |
UI 验证裁判独立:驱动与观察分离;同一模型驱动又目测自己的截图不算 pass(详见 04-ui-spec.md §4)。 |
2.3 评审
| 编号 |
规则 |
| R-6.10 |
评审顺序:正确性(边界/错误处理/并发/资源泄漏)→ 一致性(风格/命名/契约同步)→ 安全(注入面/密钥落日志)→ 测试(新行为有测试锁定)。 |
| R-6.11 |
只报有证据的问题,按严重度分组(阻塞/建议/可选),每条带 文件:行号 与可执行建议;没有问题的维度明确说"未发现问题"。 |
3. 输出规范
3.1 验证记录模板
3.2 验证分层建议(本仓)
| 层 |
内容 |
触发 |
| L0 静态 |
typecheck(npm run typecheck:tsc --noEmit + 双 tsconfig) |
每次提交 |
| L1 单测 |
组件/工具/逻辑(vitest,colocated *.test.ts,npm test) |
每次提交 |
| L2 契约/守卫 |
跨进程契约对齐(src/main/ipc-alignment.test.ts)、迁移守卫(migrations.test.ts)、架构守卫(architecture-guardrails.test.ts)、docs 基线 |
触碰共享层/迁移 |
| L3 集成 |
主进程+渲染、宿主装配 |
主链路 |
| L4 E2E |
npm run test:e2e(playwright,需先构建) |
关键用户流/发布前 |
| L5 打包冒烟 |
build/ci-local.ps1(Windows)/ build/ci-local.sh(macOS/Linux):干净安装+全量门禁+安装包+启动冒烟 |
发布前 |
本仓测试体系单一事实源:docs/architecture/testing-architecture.md;E2E 执行线见 docs/e2e/e2e-architecture-and-automation.md。验证要求按此落地,发现矩阵缺口在阶段 ⑧ 反馈。
3.3 交付物清单
- 验证记录(含失败→修复→复验链)
- 审查结论(dk-review 输出,阻塞项清零)
- 测试覆盖增量说明(新增测试对应的 AC/BR/E)
4. 反模式
- 陈旧/无关验证:拿旧结果或全量套件当"这次改动"的证据。
- 只重试不诊断:失败重跑过了就提交,没有定位因果。
- 修完不复验:修复可见,但最终修订上没有任何同一检查的重跑。
- 把本地测试当交付证据:真实接受边界(CI/合并/发布)未被打开时,用
Unobserved 而非编造缺失的 PR/部署。
- 裁判即选手:模型目测自己生成/操作的 UI。
5. 轻量路径(小改动)
- 一行修复:对应单测 + 全量 typecheck + 该模块相关测试,记录即可。
- 任何改动都不得跳过 R-6.3/R-6.4(诊断与复验)与 R-6.7(门禁)。
6. 相关文档