语言协议:以对话语言输出——用户显式指定优先,其次跟随用户近期消息语言;均无法判定时默认英语。落盘产物以创建时对话语言为准。
外部搜索统一入口:需要联网检索(资料、库/框架文档、时效信息)时一律先用 anysearch skill(插件内嵌),不可用再降级 WebSearch/WebFetch;降级链与派发词要求见 requirement-analysis 的 references/exploration-patterns.md。
测试策略纪律
普适纪律在本文;栈特定处方按需加载 references(阅读时机见各文件头)。
三 Lane 模型(调度维度是 IO 类型,不是业务模块)
| Lane | 时机/预算 | 内容 | 判据 |
|---|---|---|---|
| fast | 保存/提交时 < 1 min | 纯内存:mock IO、mock 模型、组件+mock 网络 | 不碰任何真实 IO(含 LLM) |
| PR | 目标 < 10 min | 编译/静态先行 + fast 全量 + 集成(真实容器/库)+ 主干 E2E 3-5 条 | 每套件一容器 + 模板克隆 |
| nightly | 夜间/手动 | 全量含慢测试:并发锁、迁移演练、全 E2E、Agent 完整 eval | 概率性/长耗时永不阻塞 PR |
小团队(1-5 人)fast lane 全量跑全部模块——不建按模块的测试选择系统;选择/分片只在触发条件满足时引入(>15-20 人或 PR lane >15min,先榨干单机并行)。
外部依赖策略
准入以 ../test-driven-development/references/testing-anti-patterns.md 为单点;本节只定义选择策略,不另列竞争的禁止清单。
| 依赖 | 策略 | 验证边界 |
|---|---|---|
| 外部 API | 在声明边界注入契约完整的客户端替身,按需做真实契约集成 | 替身绿只证明本地消费者 |
| 数据库 | 优先真实测试库;纯内存替身只用于局部确定性行为 | 真实 DB 契约依 references/db-testing.md |
| 时间/随机性 | 注入可控时钟或随机源 | 不 mock 被测业务算法 |
| 文件系统 | 目的允许时用真实临时目录;需隔离时替换声明边界 | 真实文件行为按实际 IO 归 Lane |
依赖注入与操作明确的窄接口用于已有交付需求,不为测试投机新建抽象。优先操作明确的客户端方法,避免在替身中解析万能 fetcher 的条件分支。fast 只含纯内存;真实 IO 按 PR/nightly,替身通过不能作为真实集成信心。模型边界下的 fake model 骨架保留。
静态快检
计划写出项目配置中已有且适用的 typecheck/静态检查命令及其来源,在编辑批次间提供快速反馈。无适用命令写“不适用”并沿用测试命令,不新增依赖或虚构 tsc。
快检与行为测试分开记账:编译故障不是有效红,静态通过不能替代目标红绿、相关集成、最终全量或原 Lane 的必需检查;零测试和 SKIP 不记 PASS。任务完成和并发后继解锁仍以既有验证要求为准。目标行为须观察有效红;相关/集成回归按原计划验证通过,不要求人为制造红。最终全量保持原计划的收尾时机,不因本节提前成为每票完成或后继解锁条件;原计划明确要求的票内验证仍全部执行。本票目标红绿、相关/集成验证及其他既有完成条件满足后,即可完成本票并解锁依赖;此时尚未到期的收尾全量保持待执行。不要仅因计划也列了最终全量命令,就把它归入本票门槛。
集成组的验证归属
组内状态与失败恢复先读 integration-groups.md:本应通过的检查失败时阻塞归属成员或验证票及整组,失败不推进已验证基线;本节只定义验证时机,不另设状态协议。验证票失败时,验证票与组标 blocked,成员仍 awaiting_verification,validated_commit 不动,组外后继继续等待;完整字段与恢复操作只依上述单点。
普通行为票的有效红绿与原完成条件保持。获批的不可独立验证集成组,在组首记录公共行为保护基线,各票保留可运行检查与真实结果;明确延期的相关验证在组验证票统一运行通过,才能完成全组。组首保护或局部必通过检查失败不能记待验放行;编译/环境失败不作为行为红。组内记录 pending_group 与日志,不能写 tests:pass;组完成记录的 pass 指组合验证,不改写历史失败。最终全量继续在原收尾时机执行。
治理顺序铁律:flaky → 时长 → 选择
反序必翻车——一条 flaky 的必需检查会拖垮整条流水线的信任。先清 flaky,再治时长(拓扑>磁盘>并行),最后才考虑选择系统。
AI Agent 测试骨架(模型边界是唯一不可逆决策)
一根窄接口隔离模型,模型是它之外唯一的依赖;边界以下全确定性:
- L0 静态 + 工具 JSON Schema 校验(schema 漂移是工具类头号故障)
- L1 harness 单测(fast):fake model 按序弹响应;测循环控制、路由、重试、预算、护栏
- L1.5 prompt 快照(fast):快照装配后的最终 prompt(确定性),不是模型输出
- L2 工具契约(fast):工具=普通函数单测
- L3 回放(fast/PR):录制回放(脱敏),周期性重录
- L4 廉价模型冒烟(PR,仅 agent 相关变更):小模型 + 严格 schema 断言
- L5 完整 eval(nightly):真实模型、多 trial、pass^k、按维度隔离 judge
断言纪律:temperature=0 不是确定性——断言面向结构与 schema,永不面向精确文本;评结果不评路径(精确工具序列断言脆弱)。
与验收矩阵的对接(上游分工链的一环)
- requirement-analysis 写矩阵时:每行标注 Lane 归属(fast/PR/nightly)——unit/docs 行默认 fast,integration 行默认 PR,perf/eval 行默认 nightly;性能行必须带阈值数字。
- writing-plans 翻译时:任务的失败测试步骤继承该行 Lane 归属并写明运行命令所属 lane;DB/容器类测试步骤引用 references/db-testing.md 处方(模板克隆、两速隔离),不得每测试起容器。
- acceptance-qa 执行时:阶段 0 装配按 Lane 选择执行窗口;nightly 行在验收报告中标注"非阻塞"。
Red Flags
- 每测试/每文件一个容器;每测试重放迁移 → 读 db-testing.md 处方
- 用 mock 测出来的绿当集成信心 → mock 只属 fast lane,集成信心来自 PR lane 真实容器
- eval 分数波动就改断言阈值 → 先查 flaky 治理顺序,eval 属 nightly 不阻塞
- 为测试选择系统引缝 → 缝跟着真实交付边界走,1-5 人先全量