Files
ft/CodexOutput/upserver/阶段4最小真实玩法闭环R1实施独立复核-2026-09-24.md

51 lines
5.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.
# 阶段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。