# 30 验证与测试 平面:控制 governed_by:D-029、D-035、D-037、D-038、D-055 用途:用与生产者无关的手段判断"做对了没有",并把判断结果表达成不可折算的三态。 ## 1. 最小职责与接口 - **它必须做到的** - 从本次改动集派生验证计划,为每类改动给出可观察终点。 - 分层执行,每层输出三态并声明本层的覆盖范围与盲区。 - 进入实施前取得并冻结验证基线,之后只对新增失败下结论。 - 在独立于生产者的上下文或模型中验证,并记录生产者与验证者身份。 - 把判分器、验证脚本与检查器本身当作被验证对象维护。 - 输出与执行者无关的结构化裁定,不输出自由文本。 - **从别的部件拿什么**:从[10 意图与验收](10-意图与验收.md)拿冻结的条目 ID 集合与它们的可观察结果(冻结与写入权归属在该章);从[20 状态工件](20-状态工件.md)拿改动集、精确版本与工作区身份;从[24 工具与执行环境](24-工具与执行环境.md)拿回读能力与由环境直接观察到的执行事实;从[33 评估与演进](33-评估与演进.md)拿判分器的效度证据与自我验证类指令的代际判决。 - **给别的部件什么**:给[31 守卫与权限边界](31-守卫与权限边界.md)三态裁定作为通过条件的输入;给[32 证据与追踪](32-证据与追踪.md)逐层三态、盲区、验证基线与双方身份;给[33 评估与演进](33-评估与演进.md)失败 Case 与判分器一致性数据;给[40 人的检查点与授权](40-人的检查点与授权.md)机器判不动的剩余风险。 - **它自己维护什么**:验证层级清单与各层覆盖范围声明、验证基线快照、判分器与验证脚本的已知答案回归集、验证者身份记录。 - **未决**:验证层级的最低必备集合尚无跨来源一致口径,暂留作项目参数。(含未定层时是否允许"带风险接受的放行"已由 P1 裁决:允许,条件是该未定的成立条件被人实际消费并记入[40 人的检查点与授权](40-人的检查点与授权.md) §2 P7 的风险接受记录。) ## 2. 原则 - **P1 每层输出三态,未定不得折算。** 三态是通过 / 失败 / 未定(UNDETERMINED);未定至少含未执行、无法核验、结果未知、生成者与验证者同一四种子原因,须显式写出。**任何一态都不是一个标量,而是"结论 + 其成立条件"的一对。**成立条件至少含:该结论覆盖了什么、没覆盖什么(盲区,见 P2),以及它由什么产生(直接观察、重建、抽样、人工改写)。**缺成立条件即记未定;下游不得只消费结论标签**——成立条件不满足时结论不成立,成立条件不被下游消费时该次消费判未定。统计性与抽样结论按此表达:写出覆盖了什么比例、以什么方式抽取,**不折算为对全体的通过**;追溯登记的主张与条目同样按此表达:写出哪些字段不可得因而成立而受限,不因缺字段整体不成立。抽样与人工重建不是第四种结论,是同一结论的不同成立条件。含未定层的完成判定为未定,必须停止并报告;聚合分数不得把未定折算为部分通过,也不得产生数值分。|防的失败:门禁全部未跑而指标满足;采集失败与真实无覆盖混显 |删除条件:写不出(责任结构型:三态与成立条件约束的是"谁有权宣告通过",[08](08-规范效力元治理.md) §4 空集合条款在单层粒度的推论;能力再强也不能把没跑过的检查算成跑过) - **P2 每层只证明自己的覆盖范围,并声明盲区。** 端到端一层也不能宣称完全覆盖视觉、真实依赖或数据分布。盲区随裁定一起交出,不由下游猜测;多个审查者的盲区应彼此独立,否则并列审查只是重复同一次判断。**"独立""互不可见"是有痕迹的主张,不是一句自陈**;无可核痕迹时按 P1 记未定,不得折算为"独立"。|防的失败:局部结论被扩大为全局;"都测过了"掩盖未覆盖部分;"独立""互不可见"只有自陈就被写成既成事实 |删除条件:写不出(责任结构型:宣称覆盖范围是一次主张,主张的范围由做出它的一方负责,盲区不能留给下游去猜) - **P3 可被无断言刷满的指标不得单独作门禁输入。** 这类指标须配一个能证明断言有效的独立信号并列报告;单独使用时只作提醒。|防的失败:测试全绿却杀不死变异体;为过检查而写空断言 |删除条件:指标本身能区分"执行到"与"断言住"时可单独使用 - **P4 验证计划从改动集派生出可观察终点。** 每个改动项要回答"怎么看到它生效";派生不出可观察终点的改动类型直接判未定,而不是默认通过。|防的失败:报"功能正常"但验证路径没经过改动点 |删除条件:运行类型限定——"从改动集派生"以存在一个改动集为前提,只对交付型运行成立,事实型运行不适用(见[00 总览 §3](00-总览.md#default-scope));作用域内"派生不出可观察终点即判未定"写不出(责任结构型:判不出就不许默认通过) - **P5 验证者独立于生产者是结构要求,不随模型能力消解。** 验证在独立上下文或独立模型中进行,只挂载产出物与验收标准,不读生产者的推理与自述;结果记录双方身份,相同即判未定;交付证据里的执行事实由独立于生产者的环境重新取得,生产者自报只作候选。客观可机械判定的项无需独立审查者,但验收标准本身须有独立来源。"要求模型自我验证"的指令与本条不是一回事:分离是结构,自查指令是能力补偿类,登记删除条件并进入代际对照,结构性分离不因模型变强而取消。|防的失败:自评偏高;验证者沿用生成者的错误假设;假测试报成功;把结构要求当补偿规则一起删掉 |删除条件:结构性分离写不出(责任结构型:评价者不能是被评价者本人,这是三类不到期内容之一,不随模型能力消解);自查指令一侧的删除条件由代际对照给出(审计流程见[33 评估与演进](33-评估与演进.md)) - **P6 阻断结论只对新增失败成立。** 进入实施前在隔离工作副本上记录**变更前的可比对集合**并绑定其版本与工作区身份,这是验证基线——形态随对象而定,代码侧是失败集合,数据侧是现值集合;判定对象是变更后集合减去基线集合。存量失败显式登记并可见,但不得掩盖新增失败,也不得被用来把新增失败说成历史问题。|防的失败:主线已红时无法区分谁引入了什么 |删除条件:运行类型限定——只对有变更集的运行成立,无变更集的事实型运行不适用(见[00 总览 §3](00-总览.md#default-scope));此外主线长期保持零已知失败时基线恒空,本条退化为普通判定 - **P7 判分器、验证脚本与检查器自身是被验证对象。** 其结构假设与被检对象不一致时判为检查器故障并上报,不得降级为警告或"已有问题";确定性判分器须有已知答案回归集,变更后重跑历史样本;模型判分器须报告与人工判定的一致性;评审类执行者的效果指标锚定下游真实行为(被指出的问题是否真的被修复),不得只统计标记数。|防的失败:同一产物得到相反分数;错误的评测信号比没有信号更危险 |删除条件:检查器能从当前结构自动推导其假设、不再含硬编码结构假设 - **P8 "确定"与"可复现"是有来源的主张,不是形容词。** 下这类结论须绑定保证来源类型:是运行时观察、是构造的回归 Case、还是推断;诊断输出区分已确认 / 推断 / 未验证。每次根因修复用原失败路径加至少一条正常路径双向验证,只复现失败不构成修好。|防的失败:把推断当事实写进规则;修复引入误阻断;局部优化无声打破全局不变量 |删除条件:写不出(责任结构型:把推断说成"确定"是一次证据等级的升格,升格的责任在做出该主张的一方) ## 3. 从 L0 到 L3 | 档 | 形态 | |---|---| | L0 一人一工具 | 从验收条目派生几条真能跑的检查;关键结论换一个干净会话复核一次;跑不了的写"未定",不留空。 | | L1 一人多会话 | 验证固定为独立会话,只挂产出物与标准;动手前记录一次基线;每层写清这层看不到什么。 | | L2 团队 | 验证层级与各层盲区成文;双方身份进证据;判分器带已知答案回归集并定期报告与人工判定的一致性。 | | L3 无人值守 | 三态由程序产生,未定不可折算也不可自动重试掉;每次根因修复自动跑失败路径与正常路径;自查类指令随模型代际提交消融候选。 | ## 4. 追溯 本章的写作期内容——它解决什么问题、源章节与主题综合的映射、每条原则的证据强度——在[追溯账本](追溯账本.md#ch-30),效力为零。