oh-my-muse/design-docs/专题-08-自动化测试方案.md
zizi 8f04dc3f0c docs(设计): 蒸馏测试倒逼剩余缺口G2/G3/G8/G9/G10
- G8 安全时长钉死:handoff token 15min(架构-04 §10.1)/下载凭证 5min(§12.2)/高危安全操作冷却 24h(§3.2)
- G9 风险/冲突分级三级枚举 none/soft/hard,hard 禁静默一键确认(产品-02 §10.4)
- G3 改写洗白判据:外部 lineage 限制不可经改写解除,原创确认非洗白通道(产品-02 §6.4)
- G10 灰度通过/回退/证据不足准则,照对照实验范式(流程-02A §5.1)
- G2 计费分阶段:本阶段以额度调整 ledger 为可测合同,完整四态列后续阶段(产品-02 §10.8)
- 同步 专题-08 §7.3 与缺口跟踪文档:10 项缺口已全部拍死,G5/G6/G7 留回放基线(待执行)
2026-07-31 00:26:40 +08:00

158 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 专题-08自动化测试方案
- 目标读者:创作者 / 产品 / 架构 / 前端 / 后端 / 测试 / Agent 实现者
- 阅读时间25-40 分钟
- 边界说明本文件是贯穿四仓muse-cloud / muse-admin / muse-studio / muse-design-docs的**测试可判定性**横切 SoTowns 三个概念——测试金字塔分层、确定性/语义分界判据、语义评测方法论。它**不重定义**任何状态机、Schema、API 或质量维度:那些的单一归属仍在各自分册(见各节引用),本册只规定"它们必须满足什么条件才算可测、以及用什么手段验证"。
## 1. 定位与非目标
### 1.1 定位
Muse 的可测性呈两极:
- **约 95% 的系统是确定性机器**——状态机、双轨写路径、事务、幂等、鉴权、协议外壳、不丢稿。其对错**不看正文含义、只比对结构与数值**即可判定,用经典自动化测试钉死,是自动化率 > 90% 的主体。
- **决定"这段 AI 写得能不能用"的语义内核**——正文质量、一致性判定、知识效用——本质上必须靠多模态大模型评判,不能用"通过/失败"硬断言,只能用对照实验与盲评量表。
本册给出:四层测试金字塔、一条确定性/语义分界判据、三套语义评测机制,以及每个功能"要可测必须提供什么"的可判定性合同。
### 1.2 非目标
- 不定义具体业务状态机、表结构、端点、错误码、质量维度——归属见各节引用的 owner 分册。
- 不替代 `docs/mvp/` 的进度总账与覆盖 JSON本册定义"测什么、怎么验",覆盖 JSON 是"哪些已登记可机械核对"的执行台账。
- 不记录调试经过、某次测试结果或开发状态。
## 2. 测试金字塔(四层)
越往下越贵、越往上越该多。每一层的用例都从现有 SoT 合同反推。
| 层 | 验证对象 | 规模/成本 | 手段 | 合同 owner本册只引用 |
|---|---|---|---|---|
| **L1 数据不变式 / 状态机** | 双轨写路径、状态迁移合法性、唯一约束、快照不可变 | 多而密、最廉价 | 后端单测 + 真 PG 集成测试 + ArchUnit | [架构-02](架构-02-核心数据结构与双轨模型.md)(双轨不变式)、[架构-04](架构-04-状态机与约束清单.md)(状态机)、[后端-04](后端-04-统一数据库Schema-v1.md)(约束) |
| **L2 接口契约 / 事务 / 幂等** | 错误码、乐观锁、鉴权边界、事务回滚、SSE 框架、版本头 | 多、廉价 | 契约测试 + 集成测试 + 故障注入 | [后端-05](后端-05-统一API契约-v1.md)API 契约)、[后端-03](后端-03-关键流程实现与接口契约.md)(事务/事件) |
| **L3 前端交互 / 不丢稿** | 编辑器保存、影子层冲突、建议接受、动态表单、SSE 重连 | 中 | Playwright E2E + 前端单测 | [前端-02](前端-02-编辑器与影子层交互.md)、[前端-03](前端-03-元引擎与动态表单.md)、[专题-01](专题-01-正文建议接受(Accept%20Suggestion)实现规范.md) |
| **L4 AI 语义质量** | 正文质量、一致性判定、知识效用 | 少而精、最贵 | LLM 评委 + 对照实验 + 回放评测 | [专题-04](专题-04-生成质量门控与创作健康度设计方案.md)(质量维度/量表)、[专题-07](专题-07-知识消费契约与质量闭环.md)(知识效用/回放) |
**分层纪律**L1L3 必须占自动化用例的绝大多数L4 数量少、慢、贵,但测的是产品命根子,绝不用 L1L3 的"通过/失败"思路去做(见 §5
## 3. 确定性 / 语义分界判据
唯一判据:
> **这件事的对错,能不能不看正文含义、只比对结构和数值就知道?能 → 确定性(机械断言);不能 → 语义(大模型评判)。**
### 3.1 分界总表
| 测什么 | 类别 | 验证手段 |
|---|---|---|
| 状态迁移、枚举值域 | 确定性 | 状态图遍历 + 断言 |
| 双轨写路径隔离AI 不直写正文事实层) | 确定性 | 写路径审计测试 |
| 事务原子 / 乐观锁 / 幂等 | 确定性 | 集成测试 + 故障注入 |
| 鉴权 / admin·app 入口隔离 | 确定性 | 矩阵化权限测试 |
| 协议外壳 / 哈希绑定 / fail-closed | 确定性 | 契约测试 |
| 不丢稿 / 冲突不静默覆盖 | 确定性 | Playwright 杀进程重载 |
| 一致性"两段设不设定冲突" | 混合 | 定位/绑定部分断言 + 判定部分 LLM 评委 |
| 正文质量五维打分 | 混合 | 确定性流程 + 盲评大模型打分 |
| 知识回放对照 | 混合 | 确定性框架 + 对照评分 |
| 风格 / 节奏 / 可行动性 | 纯语义 | LLM 评委 / 对照实验,不下硬结论 |
### 3.2 混合体的处理纪律
混合体(外壳确定 + 打分语义)是最易做错的一类:**外壳必须单测,内核必须大模型**,二者不可互相替代。
- **一致性检测**owner [专题-03](专题-03-AI编排上下文与质量评测实现规范.md)):引用能否唯一定位、哈希是否绑定、`unknown` 是否带 gapReason——确定性断言"claims/事实冲突 verdict"——LLM 判定。
- **正文离线实验**owner [专题-04 §10](专题-04-生成质量门控与创作健康度设计方案.md)):双盲双评流程、"单维差 >0.5 加第三评""取稳定配对中位数""样本 <5 判证据不足"——确定性规则五维打分——盲评大模型
- **知识回放**owner [专题-07 §4](专题-07-知识消费契约与质量闭环.md)冻结第 N 按契约组装对照第 N+1 ——确定性框架"台阶命中/设定一致/错误检出"——对照评分
## 4. 确定性合同主干(高 ROI优先铺
以下六类全部可从现有 SoT 直接生成用例是回归主干最先落地
1. **错误码枚举稳定**业务错误码取自 [后端-05 §5](后端-05-统一API契约-v1.md) 枚举特定失败不得压缩为泛化码如来源阻断必须返 `SOURCE_BLOCKED` 而非 `STATE_CONFLICT`)。
2. **乐观锁**Block 写入必带 `expectedRevision`冲突必拒且 revision 单调递增owner [架构-04 §4.6](架构-04-状态机与约束清单.md))。
3. **Accept 事务原子**候选接受 8 校验 revision归因归档审计/outbox任一步失败整体无副作用outbox/投影异步失败不回滚已提交正文owner [后端-03 §4](后端-03-关键流程实现与接口契约.md))。
4. **幂等** `commandId` 重提返回首次结果不重复写/确认/绑定/导出同键不同语义必报 `IDEMPOTENCY_CONFLICT`owner [后端-05 §2.5](后端-05-统一API契约-v1.md))。
5. **鉴权矩阵 / 入口隔离**`/admin-api/**` 改不了用户正文`/app-api/**` 碰不到系统配置系统内部调用不得复用用户 token越权 `FORBIDDEN`无身份 `UNAUTHENTICATED`owner [后端-02 §4.3](后端-02-工程结构与模块职责.md)ArchUnit 包级隔离)。
6. **双轨写路径审计**AI 任务/候选/智能体绝不能直写正文事实层来源传播只能限制/标记/作废不得改写已确认正文owner [架构-02 §1.1](架构-02-核心数据结构与双轨模型.md)[架构-04 §11](架构-04-状态机与约束清单.md))。
补充确定性主干同优先级状态机迁移图遍历通用版本/任务/候选/来源)、唯一约束与快照不可变SSE 框架合同与重连续传`X-API-Version` 废弃期/410 行为不丢稿不变式崩溃后 `max(本地缓存, 服务端)` 可恢复零丢失)。
## 5. 语义评测方法论
语义部分最大的坑是"测了个寂寞"跑一次看着行就过)。三套机制铁律先行**n=1 不下结论两臂必须对等控住混淆变量。**
### 5.1 LLM 评委(双盲双评)——给单条产出打分
- 两个评委独立打分互不知结果分差超阈值[专题-04 §10.1](专题-04-生成质量门控与创作健康度设计方案.md) 0.5自动引入第三评
- 评委 fresh 进程隔离匿名样本不告知"AI 写还是人写"。
### 5.2 对照实验A/B 两臂对等)——回答"新策略是否真的更好"
- 两臂对等同一批章节同一模型同一预算只改变被测变量
- 样本不足不下结论[专题-04 §10.1](专题-04-生成质量门控与创作健康度设计方案.md) Gate A——样本 <5 或五场景不全 `insufficient_evidence`"证据不足"**不是**"通过")。
- **通过线必须是硬数字**。全仓范本 = [专题-04 §10.1](专题-04-生成质量门控与创作健康度设计方案.md) Gate B试验臂相对对照臂文风或张力**不退化**且设定保真均值 **0.25**、 **60%** 样本为正 `passed`这是"语义质量落成确定性判定"的唯一现成范本所有新语义门补标准时照此范式
### 5.3 回放评测——回答"知识/上下文策略有没有用"
拿参考书当标准答案冻结到第 N 按消费契约组装上下文去生成第 N+1 对照真实第 N+1 owner [专题-07 §4](专题-07-知识消费契约与质量闭环.md))。铁律**没跑过回放不许声称有改善。**
## 6. 测试可判定性合同(倒逼 owner 分册)
**每个功能要进入自动化验收,必须向测试提供下列之一;提供不出来的,视为需求未闭合,不得声称"已完成"。**
| 功能类型 | 必须提供 | 提供不出来的后果 |
|---|---|---|
| 状态机 / 流程 | 完整合法+非法迁移图终态 | 无法写迁移断言 |
| 端点 / 命令 | 稳定错误码前置条件幂等键来源 | 无法写契约/并发测试 |
| 数值门槛TTL/置信度/配额 | **具体数值**或明确的"基线产生时点+校准责任人" | 过期/拒绝/超限路径不可断言 |
| 语义质量门 | 量表 + 通过线 + 评委规则 §5.2 Gate B 范式或书面承认"只展示不阻断" | 既想阻断又无判据 = 黑洞,测试拒绝背书 |
| 失败路径 | 四问为什么 / 哪些事实没变 / 下一步 / 返回哪里 | 失败恢复不可验收 |
本条是测试对需求的硬约束凡声称"质量达标""风险可控""自动入库"而无上表对应判据者测试侧记为**不可判定**回退 owner 分册补标准当前已知的不可判定点集中登记在 `docs/plans/2026-07-30-测试倒逼需求缺口跟踪.md`拍死后蒸馏回各分册即删
## 7. 已拍决策的测试合同
以下三项已由人类拍死2026-07-30本册登记其**测试合同**对应 owner 分册的措辞修订见缺口跟踪文档的蒸馏清单
### 7.1 收紧自动确认G1
**决策**知识草稿仅在四条件**全满足**时自动入库——① 自有正文产生 无外部来源 lineage 无冲突 置信度达标任一不满足 进待确认队列用户确认才入正文事实层
**测试合同(确定性)**
- 四条件逐一置假断言草稿进入待确认队列、****写正文事实层
- 四条件全真且置信度达标断言 `confirm_mode=auto` 且可撤回
- 带外部 lineage 的草稿即便改写断言****洗白来源、****走自动确认
**已蒸馏**`产品-02 §6.4` 入口清单已纳入"知识草稿达标自动确认四条件"`§9.1` "唯一入口"措辞已对齐 `流程-02B §7` 矛盾消除
### 7.2 叙事质量门补硬标准并阻断G4
**决策**运行时叙事三维设定一致 / 角色声音 / 场景结构 §5.2 Gate B 范式补硬标准——每维一个量表 + 双盲评委 + 通过线不达标阻断或触发有限重写重写上限默认 2owner [专题-04 §5](专题-04-生成质量门控与创作健康度设计方案.md))。
**测试合同(混合)**
- 确定性外壳量表步长双盲流程、"分差 >0.5 加第三评"、重写上限、`qualityState` 转移——机械断言;
- 语义内核:三维打分由盲评大模型给;
- 阻断断言:构造低于通过线的样本,断言候选**不**进 `shadow_ready`、**不**可接受。
**已蒸馏**`专题-04 §4.2.1` 已补运行时叙事门量表0-10/0.5 步长)、三维通过线(设定 ≥7.0、角色/场景 ≥6.0)与四步裁决顺序,盲评机制引用 §10.1。
### 7.3 阈值分类处理
**决策**
- **安全类阈值现在拍死**——凭证有效期handoff token / 下载凭证)、风险与冲突分级。一旦数值确定,其过期/拒绝/禁静默确认路径即为确定性断言。
- **语义类阈值留回放首轮基线**——知识质量三性门槛、回放通过线、自动确认置信度。必须同时写明"基线产生时点 + 校准责任人",否则视同悬置。
**测试合同**
- 安全类:数值落 SoT 后,过期/重复使用/actor 不匹配/越级确认 → 断言拒绝 + 写审计;
- 语义类:基线未定时,测试只断言"指标可计算、留痕、门禁要求附运行标识"**不**断言 pass/fail基线定后补硬断言。
**已蒸馏(安全类)**handoff token 15 分钟(`架构-04 §10.1`)、下载凭证 5 分钟(`架构-04 §12.2`)、高危安全操作冷却窗口 24 小时(`架构-04 §3.2`);风险/冲突分级三级枚举 `none/soft/hard``产品-02 §10.4`
**留基线(语义类)**:知识质量门槛、回放通过线、自动确认置信度留回放首轮基线,校准责任人=质量策略 owner、时点=回放首轮完成时;基线未定前测试只断言"指标可计算、留痕、门禁附运行标识"。
## 8. 验收与 CI 门禁
- **覆盖登记**:每条确定性合同登记进覆盖 JSON接口门机械源可机械核对未登记者不计入自动化率。
- **防假绿**:遵循 [`.agents/rules/verification-and-anti-false-green.md`](../.agents/rules/verification-and-anti-false-green.md)——测试必须真驱动被测流程并观察行为,禁止只跑 typecheck/空断言冒充通过。
- **阻断规则**CI 中 L1L3 测试失败阻断合入L4 语义评测以"证据不足/退化"为失败信号,不以单次分数为失败信号。
- **语义门上线门禁**:任何语义质量门,要么持有 §5.2 范式的硬通过线,要么书面标注"只展示不阻断";二者皆无 → 测试侧拒绝背书,需求视为未闭合。