用途:审计非确定性行为和易失败执行,适用于相同初始状态与输入却产生不同结果、测试间歇性失败的情形。先明确必须可重复的契约,再暴露首次分歧,并区分已验证原因与线索。
主要能力与使用方式:
- 检查项目并定义契约:识别引擎或运行时、构建与测试命令、模拟循环、RNG归属、并发模型、持久化、网络与回放格式;确定是仅审计还是包含改码授权。测试前界定边界:构建与版本、初始状态与种子、有序输入与模拟tick、同机/同平台/跨平台要求、是否需回放、lockstep或跨版本兼容。涉及回放、lockstep或跨平台时阅读determinism-contracts.md。
- 刻画变异:先回放已知失败种子、输入轨迹、测试顺序或调度;否则重复最小失败用例以暴露触发条件并估计失败率。记录机器与平台、帧率或tick率、负载、测试顺序、外部响应及契约未固定的隐藏输入。若仍无法复现,加日志或状态快照并把原因标为未验证;经授权加固已独立确认的不安全构造是可以的,但不算对该失败的已验证修复。
- 定位首次分歧:检查随机性(不受控种子、共享调用顺序耦合、随机洗牌)、时间(帧计数、可变步长、墙钟读取、计时精度)、异步与外部事件(就绪竞争、网络或存储响应)、线程与作业(共享写入、无序归约)、状态泄漏(全局、单例、缓存)、迭代顺序(无序集合上的顺序敏感工作)、数值行为(累积漂移、平台数学差异)。在关键tick比较状态快照或校验和,首次不同的tick比最终错误结果更有用。
- 确认原因:受控条件下改变一个变异源并重复。只有干预可重复地改变或消除分歧时才算确认;与单个种子或一次平静运行相关只是线索而非证据。
- 报告或修复:审计报告契约、复现率、首次分歧、已确认原因、未验证线索与建议修复,不改代码。授权修改时按来源对应修复方向:模拟RNG用显式状态与专用确定性流;时间用固定模拟tick与有界追赶;异步用就绪门与确定性事件排序;线程定义数据归属与交接点;状态泄漏显式初始化与清理;无序迭代用稳定键与排序;数值漂移用容差、量化或定点。锁不能定义结果顺序,epsilon比较不能让模拟确定。避免固定sleep、通过即绿重试和禁用测试。
- 验证:回放所有已知失败产物,再对暴露失败的条件做压力测试;报告前后计数、样本条件与确定性边界。零失败只表示该样本未观察到失败。
限制:逐玩家多样性可与确定性兼容,但需在声明边界内相同构建、初始状态、种子、有序输入和模拟条件可复现。未确认来源应报告为线索而非结论。