Skip to content

BTL Reference 证据方法

1. 基本原则

BTL Reference 采用“声明级证据”而不是“文件级可信度”。同一条记录可以同时存在:

  • 物理布局 Confirmed
  • 某些字段语义 Confirmed
  • 某些 bit Partial
  • 某些异常输入 Unknown
  • 写入 NoGo

因此不能用“这个 Record 已经恢复”替代逐字段状态。

2. 证据来源

2.1 Native parser / constructor

用于回答:

  • 字段是否被读取;
  • 读取宽度和 signedness;
  • section 顺序与长度;
  • 记录如何进入 runtime object。

直接 native 读链通常可以确认物理结构,但不自动确认最终玩法含义。

2.2 Native consumer

用于回答:

  • 字段进入哪个定义表、状态机或功能路径;
  • 是否参与 AI、事件、表现、战斗或其他系统;
  • bit/enum 分支的实际控制流。

如果只追到中间 setter 而未追到最终 consumer,语义通常应保持 Partial

2.3 Original corpus

当前主要 corpus 是 WC4 1.28.01358 个原版 BTL。

Corpus 可用于确认:

  • 实际值域;
  • section 组合;
  • 引用匹配;
  • 版本分布;
  • 是否存在正样本。

Corpus 不能单独证明:

  • 未出现的值一定非法;
  • 恒零字段是 padding;
  • 某个 enum 的显示名称;
  • 无效输入时原版会如何处理。

2.4 Runtime trace / controlled probe

用于闭合仅靠静态代码无法确定的:

  • 实际写集;
  • 执行顺序;
  • 异常/失败行为;
  • 模式条件;
  • 结果反馈。

动态证据必须与研究实现、构建、安装和人工行为验收分开记录。

2.5 Cross-architecture

ARM64、x86、UWP 或其他可审计实现之间的一致性可以强化函数身份和字段 consumer,但不能以相似代码替代缺失的直接证据。

2.6 Community material

社区 TXT/XLSM/工具标签只能作为检索线索和历史兼容信息。

如果社区说法与 native/corpus 冲突,Reference 应保留旧说法作为勘误项,并标记 Refuted,不能为了兼容旧工具继续把错误名称当主名称。

3. 状态判定

Confirmed

适合以下情况之一:

  • 原版 parser/consumer 存在直接读写链;
  • descriptor/native symbol 明确给出结构身份,且与实际 wire 一致;
  • 大规模 corpus 与独立实现一致地验证物理关系;
  • 动态 trace 明确闭合行为声明。

状态只覆盖被证据直接支持的那句话。

Partial

典型情况:

  • 知道字段属于 Frontier override 路径,但不知道所有非零值的精确语义;
  • 知道 packed byte 被多个分支使用,但没有闭合所有 bit;
  • 知道 protobuf 字段名和编号,但没有完整 consumer;
  • 知道 Event action 家族,但部分参数/filter 未闭合。

Unknown

证据不足时使用。不得附带一个看似确定的中文字段名来掩盖 Unknown。

UnknownNoPositiveCorpus

适用于“结构/consumer 已有证据,但当前原版 corpus 没有实际正记录”的情况。它不是 Confirmed 值域。

Refuted

已有明确更强证据否定旧说法时使用。Refuted 条目应说明被否定的是哪一个具体声明,而不是否定整个社区资料来源。

NoGo

用于执行边界:

  • 禁止根据未知语义实现自创行为;
  • 禁止未经 writer 门禁写回;
  • 禁止自动修复无法证明的引用;
  • 禁止把实验性观察升级为原版 authority。

4. 写入状态与读取状态分离

建议每个字段至少分开记录:

text
physicalStatus
semanticStatus
consumerStatus
corpusStatus
writeStatus

例如某字段可以是:

text
physicalStatus = Confirmed
semanticStatus = Partial
consumerStatus = Partial
corpusStatus = ConfirmedObserved
writeStatus = NoGo

这比单一“已知/未知”更准确。

5. 命名优先级

推荐优先级:

  1. 原版 descriptor / symbol 中可以直接审计的名称;
  2. 已闭合 consumer 能安全支持的 clean-room 名称;
  3. 保守描述性名称,例如 Header50Raw
  4. 社区旧名称,仅作为 alias/勘误;
  5. 无法命名时继续使用 offset + raw。

不得为了中文可读性创造超过证据范围的新业务名称。

6. 更新规则

每次字段研究闭合后,应同时检查:

  • 对应 records/*.mdextension/*.md
  • community/corrections.md 是否存在旧说法;
  • reports/btl_reference/reference_catalog.json 的章节/证据入口;
  • 是否存在已被新证据推翻的报告,需要进入项目 supersession 流程。

如果只是新增证据而没有改变现有结论,不应制造无意义的 supersession。