# 阶段4最小真实玩法闭环R1实施独立复核 日期:2026-09-24。审查者:ZCode会话。独立性声明:未参与R1实施与真实运行;此前参与为R1方案/补充/cdTime三轮设计审查。本轮只读+复跑取证,仅新增本报告。 ## 受审hash核对 `KVGameplayLoopTests/real102-implementation-review-hashes.json`共210项,逐项重算——**全部一致**。 ## 总结论 **修订后接受。** R1核心真实闭环证据充分且经本复核独立核实;一项P2(排行榜建筑缺键NRE)必须在**正式关闭前**修复——其单方法修订方案本报告**批准**,落地并回归后即可关闭R1。 ## 五个专项回答 **① Advert唯一业务变更符合批准:确认。** Schema:451现为`o["cdTime"]?.Type==JTokenType.Null ? null : String(o["cdTime"])`——与已批补丁逐字一致;92项基线外业务源码无其他变化(210项hash核对佐证)。 **② 45键导入与初始化3键变化符合授权:确认。** 导入工件齐全(before/candidate-schema/set-result/verification/after);`run-summary`:sourceKeys=45→currentKeys=45、outOfScopeKeys=0、allAttemptedKeysAllowed=true;事件流14条如实:5次本地写尝试(ShopPackBuyCount×1、NewPlayerDataDic×2、BattlePassRecordTask×2,3键全在45范围内)、本地accepted≠HTTP Set的口径已区分;日序264→266、战令tick、vipL/ad/rt推进均归因原业务初始化逻辑,无人工改值;导入claimed标记保留、不可重复执行。 **③ 真实闭环证据充分:确认。** 本复核逐项独立核实: - **事件流**:claim→ready(OwnerInstance/Epoch)→5写→`equipment-confirmed tickets=1`@06:18:14Z→closed@06:19:17Z——原装备票据Confirmed与正常关闭均有原始时间戳; - **双进程**:原进程54200正常退出(gracefully);新进程120896;`real102-newcache-before.json`证明新缓存在登录前不存在;第二轮OwnerInstanceId `94968f2b…`≠首轮`01f3136f…`;`real102-restored-memory.json`恢复30003/等级60/金币213645/珍珠445/钻石100与服务器一致;第二轮无装备操作(同值本地写1次,非改值伪造); - **服务器态**:装备后备份`9BECFC6E…`与最终备份`D951CBDC…`逐值一致(仍45键)、101仍空;场景dirty处理(saveAsCopy逐字节SHA256相等后重开原场景)严谨;两进程占用标记保留、根permit不存在、最终playing/Ready=false。 - **操作失误如实披露**:CLI首脚本Newtonsoft重复引用失败、同批误触Play即Stop(未见登录)、测试进程锁输出——均保留记录不计成功。 **④ 测试辅助与排行榜异常的影响:** - **P2-1|排行榜建筑缺键NRE(必须在关闭前修复)**:`real102-errors.json`堆栈`PlayerData.get_InfiniteBuildingLevel():97 ← LeadboardData.SetLvData()`——`InfiniteBuildingData`原字段默认`"0"`(:96),新DecodePlayer缺键返回null(Schema:656)经Replace覆盖默认后getter对null调Split抛NRE。102合法缺键即触发,**任何缺该键的真实账号登录都会命中**——未阻断本次鱼竿保存(装备链正常),但按"不以核心闭环通过忽略已知异常"原则阻塞R1关闭。 - **P3-1|签到关闭回调CLI触发**:可领奖时btn_close被原业务隐藏,本轮经CLI触发现有关闭回调(只DestroyUI不领奖)——测试辅助边界如实记录;后续鱼竿包/选竿/装备均为CLI模拟真实UI点击。此项界定为"非完全无辅助的端到端用户流程",不阻塞R1(R1目标是存档闭环而非UI自动化验收),但应在关闭记录中保留该边界说明。 **⑤ 批准DecodePlayer缺键默认值单方法修订。** 评估: - `string building=null`→`"0"`**恰好恢复原始默认体验**(原字段初始化即"0",旧InitData仅存在key时覆盖→缺键玩家历来体验"0")——已核实:96/:97与:656三处源码; - 边界严格:已有字符串(含空串)原样、显式null仍Malformed(:662既有检查不动)、不改Reset清空合同、不在getter吞异常、不向服务器补写; - 配套回归范围正确:原PlayerSchemaTests缺键断言null→0修正+新增"缺键→真实Replace→InfiniteBuildingLevel==0"的M01 Unity固定验证+旧值不泄漏+显式null拒绝测试; - 建议补一条:修复后真实登录验证`LeadboardData.SetLvData`不再抛错(102复跑或合成M01+排行榜调用链固定用例),把NRE回归纳入关闭证据。 ## 本复核独立复跑 | 命令 | 结果 | 退出码 | |---|---|---| | KVGameLoadTests(4B2离线) | 75组/1713断言/0失败 | 0 | | KVSaveRouteTests(B3A默认探针) | 通过 | 0 | ## P清单汇总 - **P2-1**:InfiniteBuildingLevel缺键NRE——批准的修订落地+断言修正+M01真实Replace验证+NRE回归后关闭R1(上述⑤)。 - **P3-1**:签到关闭回调测试辅助边界——关闭记录保留说明。 - **P3-2**:B3A默认探针(不带--all)仅1组61断言——本复核补跑为抽样;关闭前按清单全量复跑(含--all三探针)。 ## 边界重申 R1通过≠全量迁移/正式启用:热换号、全B/C、消费4C、101其余兼容、身份、tickets长期历史、P2-α存量真实用户专项、4D/G4启用门全部保持;运行仍依赖PF外围身份;102验证结果默认保留。主会话核hash(已代验210/210)、裁决并落地P2-1后可正式关闭R1。