Files
ft/CodexOutput/upserver/P2-alpha-B两类历史空态兼容方案独立审查-2026-09-28.md

40 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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导入或正式启用授权。