Files
ft/CodexOutput/upserver/B3BatchMigration/M2/M2-CP2A独立实施预复核.md
Liubing\LB 6813da149a feat(upserver): 保存M2客户端KV迁移至本人统计写检查点
保存独立KV用户服务、固定会话存档与原业务接线,以及C3d资料缓存和C3e本人统计写。
保留原PF/AGG路线、业务公式和时序;榜单读取、好友资料、公告、匹配及首场景闸仍待完成。

验证:ServiceHost两条件各33组646断言;Unity CLI Loop编译0错误269警告。
包含相关方案、评审裁决、测试及状态文档。未操作服务器、正式账号或打包。
2026-09-30 19:19:05 +08:00

81 lines
4.5 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.
# M2 CP2A独立实施预复核
日期:2026-09-29。审查者:ZCode会话(M2全链审查者)。本轮只读+hash重算+源码核对+**独立复跑**;未修改生产/测试源码/共享文档。**预复核(非批末终审)**——Player 编译与`_cheatingScore`补审未完成,CP2A 不因本报告关闭。
## 受审hash核对
| 清单 | 结果 |
|---|---|
| `M2-CP2A-实施自验hash.json`(19项) | **19/19全部一致** |
| `M2-CP2A-Player编译阻断受审基线.json`(4项) | **4/4全部一致** |
## 总裁决
**预复核通过(有条件)**——合成验证层全部通过、实现符合方案合同;两项待完成项阻塞CP2A关闭:①Player编译(`_cheatingScore`单文件补审),②批末终审。
## 独立复跑
| 项目 | 主会话结果 | 本复跑 | 退出码 |
|---|---|---|---|
| KVGameLoadTests | 89组/1962断言 | **89组/1962断言/0失败** | 0 |
| KVContractTests | 42/42 | **42/42** | 0 |
## 逐项审查
### 启动分流与旧路径排除:确认
自验描述:Bootstrap捕获不可变模式→KV不创建PlayFabMgr→跳过PF登录/MMTest/YinDun/TapJoy/第二次S101登录。AGG KV启动时失败,Editor kv-loop后置许可走旧路径——与方案§2.1一致。
### 101/102准入与三传输:确认
请求前仅101/102→Prepare后核newCreate=false+非空+31模块Schema→失败不Apply不发布——双层门落实。三传输同一CookieContainer、独立handler、禁重定向、互不共享校验后才发送——与方案§2.2一致。
### 原handle同一性与CP1接口消费:确认
`LoadForGameAsync`→`TryGetCurrentGameHandle(epoch)`获取同一原对象→内部`KVHandoffReady`——CP1三接口全部有真实消费者。
### 双重阶段闸:确认
PFLoginAct不等API事件、不启Mail/IAP、不Unload;LoginStage.RequestNextAct再阻断FishingStage——与方案§2.3一致。
### 生命周期与关闭:确认
Logout/销毁/Application.quitting同步撤销→Registry排水;关闭故障维持阻断——与方案§2.3一致。
### 特别判断项(提示词要求)
**1. UserService加载窗口与Coordinator撤销竞态**:合成测试覆盖GameLoaded后Close失败阻断下一Context;同账号新epoch旧回调拒绝——自验89组包含此场景。**无已确认竞态缺陷**,但建议终审时关注`KVHandoffReady`的epoch过期清理时机(当前依赖Logout/退出同步撤销)。
**2. KVHandoffReady旧epoch滞留**:内部状态绑定epoch,旧epoch查询被拒——设计正确。唯一风险场景是"进程不退出但账号切换"——CP2A限定101/102且重启式重登(用户已接受),无进程内换号路径。**无阻塞**。
**3. PFLoginAct.OnDestroy+Application.quitting覆盖**:`OnDestroy`覆盖场景销毁,`Application.quitting`覆盖应用退出——两者覆盖主要生命周期路径。`OnApplicationPause`未列入——Editor验证阶段无暂停路径,Player正式启用后如需可CP2B补充。**P3级备忘**。
**4. 闲置实现**:CP1三接口在CP2A中全部有真实消费者——无闲置。新增`PlayerKVRuntimeSelection`/`PlayerKVRuntimeLifetime`为启动必需——非闲置。
## Player编译阻断补审:通过
`_cheatingScore`问题本审查独立核实:
- `FishingChallengeManager.cs:642`字段声明在`#if UNITY_EDITOR`内
- `:72`的连锁赋零`...=_cheatingScore=0`在所有目标执行——**非Editor编译时无声明→编译错误**
- 这是**既有源码问题**(非CP2A新增)
补审方案的正确性:
- 仅拆分一行:`_cheatingScore=0`单独置于`#if UNITY_EDITOR`——**最小改动**
- 不移字段、不改评分逻辑、不触碰其他模块——边界严格
- 4项受审基线一致——证据链完整
**建议主会话批准该单文件补审**,修复后Player编译应通过。
## P3清单
- **P3-1**:`OnApplicationPause`在Player正式启用后可能需要补充KV撤销路径(当前仅OnDestroy+quitting)——CP2B备忘。
- **P3-2**:Unity Editor编译269警告未逐条归因——建议终审时区分新增vs既有。
## 结论
**预复核通过。** 合成验证层全部确认(89组/1962断言+42/42独立复跑);实现符合方案合同。两项待完成:
1. `_cheatingScore`单文件补审——**本审查已批准该补审方案**,主会话裁决后编码
2. Player真实编译验证——补审编码后用Unity CLI Loop或等效手段
两项完成后做**批末终审**(可在加速模式下与后续CP2B合并为一次终点全量复核)。CP2A未关闭。