Files
ft/CodexOutput/upserver/阶段4B2检查点2值类型空态独立审查-2026-09-23.md

41 lines
4.3 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.
# 阶段4B2检查点2值类型空态独立审查(D3)
日期:2026-09-23。审查者:ZCode会话。
**身份披露**:未参与本补审方案编写(由主会话编制)。延续性披露:原附件M21/M22/M24的null空态描述是**我此前修订2审查未发现的第三类附件缺陷**(继AD格式、FootPrint位宽之后)——三处均为"空态写成null但字段实为非Nullable struct"。本轮按源码逐项复核。
本轮只读+仅新增本文件;未改代码/方案/入口/TODO/日志/hash;无子Agent、无正式服、无PlayMode、无Unity执行。
## 基线核对
`阶段4B2检查点2值类型差异受审基线-2026-09-23.json`共10项,逐项重算SHA256——**全部一致**。
## 三处源码事实核实(全部属实)
| 模块 | 方案断言 | 本审查核实 |
|---|---|---|
| M21 PiggyBank | `PiggyBankPackData.cs:14`私有`struct Data`、`:36`非Nullable `Data _data` | ✓ 精确匹配(14行`private struct Data`、36行`private Data _data`) |
| M22 Bargain | `BargainPackData.cs:14`为`GeneralEventPackData _data`;`GeneralEventPackData.cs:3`为`public struct` | ✓ 精确匹配 |
| M24 ShootingRange | `ShootingRangeData.cs:11`为`RawData _data`(`new RawData()`初始化)、`:335`私有`struct RawData` | ✓ 精确匹配 |
**字段枚举核对**:M22的11个整数(currentEventID/redirectID/VIPLvlWhenEventActivate/purchaseCount/savingProgress/discountLvl/visualProgress/visualDiscountLvl/rodID/lastPackIDBought/packID)+2布尔(doNeedTrigger/isTriggered)+float inflation+`List<int> selections`——与`GeneralEventPackData.cs:3–21`**逐字段一致**;M24可见字段(EventId/CycleId/RedirectId/AmmoCount四个int+RewardFlag/TargetFlag两个`long`位集)与方案枚举一致(CurrentStageIdx/ChainProgress/HasBeenOpened/Inflation在方案枚举内,抽查窗口未覆盖但已见字段全部吻合,且Int64位集按声明位宽清零的要求明确)。原附件null空态确实不可直接实现,非文件漂移。
## 推荐修订评估:采纳(通过)
- **存在标记+原类型清零**是三案中唯一同时满足"不改PF公开面"与"显式Missing/Present区分"的方案:改Nullable会迫使PF getter/方法连锁调整(否决正确);只清零无标记则无法区分缺键与Present零值记录(否决正确,且与附件§1"缺失才生成空态、存在坏值才失败"的既有原则一致)。
- Missing/Present语义与修订2合同自洽:缺键→Missing(保持空态);Present需先过严格Decode+各自配置准入(M21的4055001映射仅对存在载荷、M22的PackType=3、M24按Dormant规则)——"Present不能从ID非0推断"明确堵住了隐式推断。
- JSON文字null仍Malformed、不调用旧Load/Init/Update/默认建档、selections新集合不共享、M24 Int64不缩窄(吸收D2教训)、失败重置全部模块且不留true标记、Reset异常Poisoned——全部与既定事务合同一致。
- 范围:`GeneralEventPackData.cs`仅作只读类型证据不入白名单;M15–19/25–28等其余载荷已按声明核查为class,不扩大调整面 ✓。
## 发现清单
**无P1/P2。** P3三条:
- **P3-1**:三模块存在标记建议统一命名并集中断言方式(如`KVLoadPresent`+internal只读访问),与M23的`ulong`完整位集、M08的字典替换在诊断输出中同列"存在性/完整性状态"——便于B2-22证据汇总。
- **P3-2**:M21 Reset枚举中的`savingProgress`在原附件§5 M21行未列出(原行只列四字段+redirectID)——本方案已补全为八字段,建议合并下一正式附件版时同步校正原§5 M21行的字段列举,保持两处一致。
- **P3-3**:建议在下一正式附件版的版本历史中同样登记D3(沿用D1/D2合并先例),避免"原文+两轮覆盖层"三层语义叠加。
## 结论
**D3通过。** 三处事实准确、字段枚举精确、修订方案在既有边界内闭合(不改公开面、不扩白名单、不改JSON格式与主档规则),必验用例覆盖同对象A→B全字段断言/存在标记/集合不共享/Int64清零/缺键与零值区分。建议主会话逐条裁决(含P3-2/3的附件合并细节)后并入下一正式附件版本,继续检查点2剩余模块。本次为设计差异补审:不重审D1/D2、不重做检查点1,不代表检查点2或4B2整体通过。