# M2 CP2A独立方案审查:正式登录与原句柄交接 日期:2026-09-29。审查者:ZCode会话(M2全链审查者:修订1/修订2/CP1方案与实施)。本轮只读+hash重算+源码核对;未修改方案/生产源码/共享文档/历史报告。 ## 受审hash核对 `M2-CP2A受审基线.json`:**37/37重算全部一致**。 ## 总裁决 **通过。CP2A可批准实施**(主会话核hash裁决后)。无P1/P2;P3四条。 ## 六项逐条裁决 ### 1. 启动分流与PF默认保持:确认 - `AfterAssetUpdateV2`传入config→`RegisterServices`在组件创建前捕获`playfab`/`kv`——**正确的捕获时机**(:91 AddComponent之前); - KV不创建`PlayFabMgr`——从源头消除旧40秒循环/PlayerPrefs合档风险; - Editor loop后置`kv-loop`不被误拒(§2.1明确分离); - AGG KV显式拒绝; - 运行期配置改不切后端——正确(防半途切换)。 **CP2A可达旧调用检查**:不创建PF组件后,`SetMMTestValue`/`LoginPlayFab`/TapJoy/YinDun均因KV分支不走这些路径而不可达——§2.3逐条排除。 ### 2. 账号准入与三传输所有权:完整 - 请求前规范化+仅101/102常量(后续扩员另审); - 登录后`newCreate=false`+**非空完整Schema验证**(不是只看newCreate)——双层门; - 三独立handler共享同一CookieContainer——与4A Owner同一模式; - 正式工厂与验证工厂隔离——§2.2"测试替身不能经Editor permit混入正式运行"。 ### 3. 正式实例准入与CP1接口消费:闭合 - 普通PlayFabUserService获一次性正式加载准入(与kvControlledInstance互斥); - `unstarted`在Apply前复核; - 第31模块仅在正式加载窗口内允许Reset/Replace; - **CP1三接口全部有真实消费者**(LoadForGameAsync由UserService调/TryGetCurrentGameHandle由UserService按epoch调一次/TryAcquireGameHandle由Coordinator内部调)——接口闭环。 ### 4. KVHandoffReady与双重阶段闸:语义自洽 - 内部`KVHandoffReady(epoch, originalHandle)`≠公开`IsLogin`/`IsAuthorized`——**正确的分层**(公开状态是身份发布问题,留CP2B随首场景评审); - `PFLoginAct`:KV分支不注册`WaitForAPISvrLogin`(防永远等待)、不初始化Mail/IAP、不Unload——收到内部状态后停在登录阶段; - `LoginStage.RequestNextAct`**双重阻断**进FishingStage——防后续UI误触发; - 首场景依赖清单(mail/fetch/Survey×2/排行榜/anti-cheat/friend等旧PF或API调用)因此全部不可达——正确的安全边界。 ### 5. CustomServerMgr空路由与关闭:充分 - 正式租约绑定但CP2A API路由集合为**空**——任何`CustomServerPost`在KV模式拒绝——最保守正确; - 401/旧epoch/Logout同步清内部状态→Revoke→Registry排水; - Close故障阻断新Context——与4A/CP1合同一致。 ### 6. 白名单与矩阵:完整可独立编码 **白名单12项**(2修改Boostrap/SubBoostrap+2新RuntimeSelection/RuntimeLifetime+4修改PlayerData+2修改LoginStage/Bindings+3修改UserService/PFLoginAct/CustomServerMgr)——每项限定到具体方法/入口。禁改清单明确(PlayFabMgr/KVMgr/Guard/AggUserService/FishingStage等)。 **验收矩阵六类**(PF不回归/KV准入/成功交接/竞态关闭/网络/目标编译)覆盖充分——含Editor+Player双目标编译+历史`_cheatingScore`另列。 **CP2A能否独立编码**:可以——它的停止点(不进首场景)使其不依赖FishingStage内的迁移。CP2B首场景是下一独立边界。 ## P3清单 - **P3-1**:§2.1的`PlayerKVRuntimeSelection`——建议实现时在类内加XML注释说明"101/102为受审常量,扩员须完整方案审查"——防后续维护者直接改常量。 - **P3-2**:§2.2的"Bindings对正式路径接受明确的本地decoder版本令牌"——建议令牌命名包含创建时间或配置指纹前缀(如`formal-`),使不同配置版本可区分。 - **P3-3**:§2.3的"KV加载失败显示失败并要求显式重启或登出"——建议在PFLoginAct中为KV失败路径加一个可区分的错误码(如`PlayerKVGameLoadError`→UI映射),便于CP2B扩展错误提示。 - **P3-4**:§3白名单的`PlayerKVRuntimeLifetime.cs`标注"若现有根对象生命周期没有合适位置"——建议CP2A实施时先评估是否有现有可复用点(如Coordinator的Registry已覆盖排水),避免新增文件成为冗余。 ## 结论 **通过CP2A方案。** 主会话核hash(已代验37/37)逐条裁决后按白名单实施。CP2A完成后做批末独立实施复核,其关闭仅表示"正式登录与原handle交接可达",不启用首场景/玩法/公开授权。CP2B首场景为下一独立方案。