跳转至

变异分类学(冻结)

FND-060 冻结五类变异。每一类都有独立的检测机制与每类 ≥3 例的变异 fixture;fixture 与预期是产品侧维护的测试语料(provenance product-fixture,见下方 fixture 信封),不复用生成器自测预期表,不读取 oracle 判据(该输入隔离由 independence.md 的机械证明强制)。它们证明产品侧输入隔离和兼容性,不证明作者、模型或认知独立;外部最终接受由仓外独立复审承担。分类集合是闭合的:新增类别属于审计分类学变更,必须走新的裁决并更新本文件与 runner/lib/paths.mjsMUTATION_CLASSES

类别 枚举值 检测机制 消费接口 审计码
结构 structure 严格方言下的 schema 校验拒绝 validateDocument(strict, 2020-12) AUD-M1-STRUCT
语义 semantics 结构合法但违反冻结语义(协议登记、操作词表、params 契约、错误码成员资格) findProtocolcheckOperationisRegisteredErrorCode 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 执行:逐类禁用检测器,断言每次破坏都使运行失败。