变异分类学(冻结)¶
FND-060 冻结五类变异。每一类都有独立的检测机制与每类 ≥3 例的变异 fixture;fixture 与预期是产品侧维护的测试语料(provenance product-fixture,见下方 fixture 信封),不复用生成器自测预期表,不读取 oracle 判据(该输入隔离由 independence.md 的机械证明强制)。它们证明产品侧输入隔离和兼容性,不证明作者、模型或认知独立;外部最终接受由仓外独立复审承担。分类集合是闭合的:新增类别属于审计分类学变更,必须走新的裁决并更新本文件与 runner/lib/paths.mjs 的 MUTATION_CLASSES。
| 类别 | 枚举值 | 检测机制 | 消费接口 | 审计码 |
|---|---|---|---|---|
| 结构 | structure |
严格方言下的 schema 校验拒绝 | validateDocument(strict, 2020-12) |
AUD-M1-STRUCT |
| 语义 | semantics |
结构合法但违反冻结语义(协议登记、操作词表、params 契约、错误码成员资格) | findProtocol、checkOperation、isRegisteredErrorCode |
AUD-M2-SEM |
| 摘要 | digest |
规范化 JSON 的 SHA-256 与冻结 pin 不一致 | digestDocument |
AUD-M3-DIGEST |
| 遗漏 | omission |
冻结必备部件缺失(登记、规则覆盖、错误码成员) | 基线 pin 事实清单对比 | AUD-M4-OMIT |
| 检查引擎被削弱 | engine |
引擎参数完整性对比(预算、校验策略、检查类型闭集、稳定性政策) | describeAuditSurface + 基线 pin |
AUD-M5-ENGINE |
各类别定义与判据¶
M1 结构(structure)¶
变异改变文档的形状:缺必填成员、类型漂移、未声明成员、模式违规。判据:在 2020-12 方言、strict 策略下,文档必须被拒绝,且稳定码等于 fixture 声明的 expect.observedErrorCode(本类全部为 SFC1001)。预期由产品侧对照相应 schema 的 required/pattern/additionalProperties 推导,不取自生成器自测预期表或 oracle 判据。
M2 语义(semantics)¶
变异保持 schema 合法性,但违反冻结的登记语义。三个语义检查点(fixture 用 expect.semanticCheck 声明):
protocol-registered:协议名/版本必须在登记表中,否则 SFC1011;operation-vocabulary:操作名必须在协议版本的冻结词表内(否则 SFC2002),params 必须满足该操作的冻结 params 契约(否则 SFC2003);error-code-registered:operation-result 中的错误码必须是冻结登记表成员(形状合法但未登记 → SFC1009)。
M3 摘要(digest)¶
变异保持结构与语义,仅改变规范化字节(措辞改写、同义替换)。判据:digestDocument(input) 必须不等于基线 pin 中 documentDigests[expect.pinField]。这是唯一能捕获"含义不变、字节改变"的类别。规范化规则由 Contracts 的 canonicalJson 冻结:对象键逐级字典序排序、数组保序、只接受 JSON 数据类型。
M4 遗漏(omission)¶
变异从冻结文档中删除必备部件。三个覆盖检查(fixture 用 expect.check 声明):
registry-schema-coverage:当前基线 pin 中的全部顶层对象都必须登记;rules-checktype-coverage:九个检查类型每个都必须被至少一条 mandatory 规则覆盖;error-code-coverage:冻结错误码清单一个不能少。
判据:观察到的缺失清单必须与 expect.missing 完全一致(多报、漏报都算 fixture 失败)。
M5 检查引擎被削弱(engine)¶
变异不删除部件,而是放宽引擎参数。四个完整性检查(fixture 用 expect.check 声明):
rules-budget:预算数值(firstVersionMax=20、absoluteMax=30)不得变化;validation-policies:strict 策略必须保持 coerceTypes=false、useDefaults=false、allErrors=true、validateFormats=true;tolerant 策略逐键对比;check-type-set:九个检查类型是闭集,缺一不可;error-code-stability:错误码 append-only 稳定性政策原文不得改写。
判据:观察到的被削弱字段清单必须与 expect.weakened 完全一致。
fixture 信封(冻结)¶
每个 fixture 是一个 JSON 文件:
| 字段 | 要求 |
|---|---|
schemaVersion |
常量 1 |
kind |
常量 skill-family.audit.mutation-fixture |
fixtureId |
^AUD-M[1-5]-[0-9]{2}$,第 6 位数字必须与类别一致 |
mutationClass |
五类之一,且必须与所在目录一致 |
provenance |
必须为 product-fixture(机械检查 P5) |
description |
变异意图说明 |
target |
被测对象(schema/文件/投影) |
input |
变异后的完整文档或投影 |
expect.detected |
必须为 true(变异必须被检出) |
expect.auditCode |
必须等于该类别的审计码 |
provenance 现行事实:变异 fixture 是产品侧测试语料(product-fixture),基线 pin 是产品侧兼容基线(product-compatibility-fixture,见 version-compatibility.md);它们证明产品侧输入隔离和兼容性,不证明作者、模型或认知独立。外部最终接受由仓外独立复审承担。历史纠错:fixture 与 pin 曾携带旧值 independent-r2 与独立作者叙事,该声称与本仓事实不符,已修正为上述如实词汇;纠错不改变任何 fixture 的 input/expect、digest 或 facts 字段。
数量冻结与漏报律¶
- 每类 fixture ≥ 3(当前实际:结构 4、语义 4、摘要 3、遗漏 3、引擎 4,共 18);
- 覆盖门要求每类
fixtures ≥ 3 且 detected ≥ 1,不满足产生 AUD-MISS-001 并强制 verdict fail; - 漏报律的负例验证由
runner/selftest-negative.mjs执行:逐类禁用检测器,断言每次破坏都使运行失败。