Files
ft/CodexOutput/upserver/B3BatchMigration/M2/M2-CP3A独立方案审查.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

70 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.
# M2 CP3A独立方案审查(含CP2A增量实施意见)
日期:2026-09-29。审查者:ZCode会话。本轮只读+hash重算+源码核对;未修改生产/测试源码/共享文档/方案/manifest。
## 受审hash核对
| 清单 | 结果 |
|---|---|
| CP2A-C15补审后交付(20项) | **20/20全部一致** |
| CP3A受审基线(18项) | **18/18全部一致** |
---
## 第一部分:CP2A补审增量实施意见
`_cheatingScore`修复经源码核实:
- `FishingChallengeManager.cs:70–74`:`ResetForKVLoad()`中`_cheatingScore=0`已单独置于`#if UNITY_EDITOR`——与批准的单文件补审方案精确一致
- 其余字段赋零在所有目标执行——原语义保持
**CP2A增量实施通过。** Player真实编译未取得(CLI Loop动态Player编译被Restricted规则拒绝)——CP2A保持未关闭,此状态准确。
---
## 第二部分:CP3A前审结论
**通过。** 无P1/P2;P3三条不阻塞。可批准CP3A实施(主会话裁决后)。
### 方案核心评估
CP3A的正确性在于**最小正确切口**:只把CP2A交接的原handle送达两个已有B01验证的服务实例(SettingService+ClubService),不做其他任何扩展。这比"全面替换容器"或"新建全局路由"的方案风险低几个数量级。
**同实例绑定设计**(§2.4)是本方案的关键正确决策:登录前SubBoostrap已注册/初始化这些服务→不能替换实例(会留旧引用)→只能在**已有实例上单次绑定原handle。失败关闭,不回退PF,同进程不许重登。这是唯一安全的方式。
### 四问逐答(§6要求)
**Q1:LocalNotificationService原实例绑定?**
**可以。**通知服务在登录前Init——沿用已初始化实例是正确选择(不重复请求系统权限/注册事件)。在途权限回调的竞态屏障:
- 方案§3.3已要求"回调必须同时验证原Setting实例和其原句柄"
- V03覆盖"在途回调不能跨绑定"
- 建议补一条:回调验证应在`await Init`恢复后的第一次操作前执行(当前合同已隐含,落为显式断言)
**Q2:ClubService构造时捕获PlayerKVRuntimeSelection可靠?**
**可靠。**时序核证:`SubBoostrap.RegisterServices`先注册RuntimeSelection→同方法内注册ClubService→ClubService构造时RuntimeSelection已在容器中。**无竞态**。如未来改为异步注册则需重审,当前同步注册无问题。
**Q3:部分绑定失败后"原对象保留陈旧句柄+本进程拒绝重登"是否闭合?**
**闭合。**部分失败(如Setting绑定成功、Club绑定失败)时:
- 已绑定的Setting保留原句柄——后续读写被原句柄的撤销机制拒绝
- 未绑定的Club无句柄——正式KV分支的"无句柄拒绝"生效
- 本进程拒绝重登——防部分绑定后尝试"修复"导致状态混乱
- **不需要额外把所有实例同时置为不可用**——两个拒绝路径(有陈旧句柄/无句柄)已覆盖
- V05覆盖此场景
**Q4:白名单和V01–V07是否足够?真实ClubService验证?**
**足够。**白名单5文件限定到方法/入口级别,禁改清单明确。
真实ClubService验证手段:
- **合成宿主**:编译真实`ClubService.cs`+真实`SettingService.cs`源文件+CP1/CP2A协调器→用合成Bridge/handle→验证绑定/读写/撤销——**B01已证明此模式可行**(B01Tests即为此类)
- **Unity CLI Loop Editor**:实际容器/服务实例验证——CP2A已有89组先例
- `ClubSlice`为历史切片不能替代——方案已明确
### P3清单
- **P3-1**:§3.2的"已有同一原句柄的重复调用可作检查后幂等"——建议实现时记录重复调用计数到诊断输出(便于发现意外多次调用)。
- **P3-2**:§3.1的`DefaultSettingService`捕获"是否要求正式KV"——建议XML注释说明"此标志来自启动冻结选择,运行期不可变",防后续维护者试图动态改。
- **P3-3**:V06"真实Player脚本编译若仍无不打包的CLI Loop方法"——建议CP3A实施时尝试Unity CLI Loop的`build`/`compile`命令带目标平台参数,如可行则同时关闭CP2A Player验证缺口。
## 结论
CP2A增量实施通过(`_cheatingScore`修复正确)。CP3A方案通过——5文件白名单+V01–V07可批准实施。主会话核hash裁决后按白名单连续实施,批末复核可按加速模式与后续合并。