# P2-alpha-B两类历史空态兼容方案独立审查 日期:2026-09-28。审查者:ZCode会话。独立性声明:未参与本方案编写;此前参与为P2-α-A方案与执行两轮审查(本方案三条P3附件即对该轮建议的落实)。本轮只读+hash重算+源码核查。 ## 受审hash核对 `P2AlphaNullCompatibility/design-review-hashes.json`:**1277/1277重算全部一致**(含冻结配置/源码、142锚点附件、定位与102时间线、白名单JSON、方案与提示词)。 ## 总判定 **通过。可批准B1~B4实施。** 无P1/P2;P3三条不阻塞。方案是"两条空态精确保留"与"通用框架"之间的正确最小解,且已预先吸收前轮全部三条P3与apphost教训。 ## 八项逐条 **1. 文件边界足够小且无遗漏强制消费者:是。** 4个生产文件与两处改动一一对应(Schema两Decode、DecodedSave两DTO、ChallengeManager Replace条件、Bargain Replace selections);Raw保留由既有DecodedSave复制承担(无需改);序列化侧`DoSave`对null的行为经验证不改(T3);3个测试文件复用既有工程与固定入口。无通用框架、无新DTO体系外的结构。**若不同意新增M15旗标(提示词第8问)**:替代要么把"键存在null"折叠进IsPresent(丢失缺键/null区分→违反显式空态原则)、要么在Raw层判空(Decode无状态、Apply需重读Raw——更大改动)——**维持旗标方案**。 **2. M15三态区分成立:是。** 本审查核实`DecodeChallenge`(:803–806)现状(缺键→Missing、其余严格);新合同"先原严格Json一次、仅token.Type==Null走ExplicitNull()工厂"精确且不触碰共用helper;`explicitNull&&!present`非法组合校验、对象字段仍严格、可选构造参数保留旧调用、DTO不序列化到服务器——闭合。 **3. M15 Replace与前置限制:正确。** 现状`:79 !state.IsPresent ? null : new…`扩展为"缺失或显式null→null"是最小改法;Reset先行由既有事务承担。**142锚点附件诚实**——首行即声明"近邻声明≠控制流支配证明";`InChallenge:510`"state0仍可能触发加载"、未证明场景入口(Road/场景)均保留限制未冒充安全;fresh/Reset→显式null与缺键的DTO/Raw存在性差异入测(T3)。 **4. M22最小null接受:完整。** 仅`selections`属性`token.Type==Null`接受、**属性缺失仍被IntegerList拒绝**(C# null≠JSON null的区分正确);其余14字段/PackType=3/IsPresent/错误分类原样;null不转[]、不重建、不删键;DTO/Apply/Snapshot三处null与深复制逐一定义(表四场景)。 **5. T1~T8覆盖充分。** 红测先行且仅精确改写两条期望(其余严格负例保留);**比较器适配**正确且必要——本审查核实`:117 SameList`直接取Count无法比较双null,方案仅在Bargain专用Same(:107)的selections子表达加null分支、其余14字段比较不变、并新增null/null相等与null/[]不等断言防漏检;T5明示`dotnet <明确构建DLL>`+hash记录(apphost教训落实);T6的101双诊断消失+第三问题即停边界明确。 **6. 边界可执行:是。** 失败停点(第三种拒档不扩大)、Editor准入不绕静态门、无Play/许可/远端、90064不假设仍可用、不用launch --restart。 **7. 附件对应既有证据:是。** 142锚点/A3未定位搜索记录/102分叉时间线均引用封存证据未重写历史;政策与26模块外键/Present不足保持未决;本方案非101导入或正式启用授权。 **8. 批准B1~B4:可以。** B0已完成(本审查对象);B1裁决→B2红测+四文件最小差异→B3验证(T3~T8)→B4交付→B5独立实施复核。 ## P3清单(不阻塞) - **P3-1**:T1建议补一条断言:显式null样本的Raw值**逐字节保留原始字符串**(含空白变体),与"DTO旗标不反推Raw"互相印证(方案文字已承诺,落为显式断言更利于B5复核)。 - **P3-2**:`PlayerKVChallengeState.IsExplicitNull`与`ExplicitNull()`工厂建议加XML注释注明"内部内存表示、不参与服务器序列化"(方案§3.1已声明,代码注释防后续维护者误用)。 - **P3-3**:B3若101出现第三诊断,建议停点记录直接引用本方案§2"白名单扩展需停在新差异"原文+诊断JSON路径,形成标准停点模板(后续单元复用)。 ## 结论 **通过P2-α-B方案,批准B1~B4实施。** 主会话核hash(已代验1277/1277)逐条裁决后按检查点推进;B4交付后交B5独立实施复核。本单元关闭仅覆盖两类空态兼容表示,不关闭整体P2-α/G4、不构成101导入或正式启用授权。