Files
ft/CodexOutput/upserver/B3BatchMigration/M2/M2-CP2A独立方案审查主会话裁决与实施边界-2026-09-29.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

7.0 KiB
Raw Blame History

M2 CP2A 独立方案审查主会话裁决与实施边界

日期:2026-09-29。受审件:CP2A完整方案、37项基线;报告:原ZCode独立审查。报告 SHA256:47C412B6F8F29BB09979A5C95EAE31CFBA57DE0810C8FC4BAC6D9ACB9F36D521。主会话重算受审长度及 SHA256 37/37 一致,清单自身 SHA256 B36C685EB9E9571DEFA383395EAD61CB86143CB9762FAE4FF208CF49F44A411A。报告未改受审方案/源码。按源码核对后,接受“CP2A可独立实施”的总裁决,批准下述收窄后的白名单;不等于批准CP2B首场景或M2整体上线。

六项逐条裁决

  1. 启动分流:接受。Boostrap.AfterAssetUpdateV2 已持有 config,SubBoostrap.RegisterServices 现在无条件创建 PF 组件;捕获必须在创建前,KV 不创建 PF 组件,PF 默认顺序保持。Editor loop 在该方法后段写 kv-loop,正式捕获不能误拒已有许可路径;AGG 的 kv 在启动处显式失败。禁止运行中变更已捕获模式。
  2. 账号与三传输:接受并限定。请求前仅允许规范 101/102,响应再次核同 ID、newCreate=false、非空且31模块 Schema Valid;任何失败不自动建档/写入/回退。正式三 handler 各自拥有并共享单 CookieContainer,真实网络工厂与 Editor 验证工厂隔离,API 严格等于 http://s101.local:18080/。Application.persistentDataPath 为 CacheRoot,现有 PlayerKVCacheIdentity 已追加 API 指纹和玩家 ID,不再手工重复拼路径。
  3. 正式实例与 CP1 接口:接受。正式普通 UserService 准入与 kvControlledInstance 验证准入互斥。LoadForGameAsync、Coordinator 内 TryAcquireGameHandle、UserService 的 TryGetCurrentGameHandle(epoch) 均在 CP2A 消费;不得复制加载主体、另造 Owner 或全局当前 handle。Apply 前与成功后复核无旧 PF、未发布身份、同一 epoch;第31模块仅在正式加载窗口重置/替换。
  4. 内部状态与双重闸:接受。KVHandoffReady 是内部检查点,公开 IsLogin/IsAuthorized 和 EvtAPISvrLoginSuccess 留 CP2B;PFLoginAct 不注册待 API 登录的 RT 订阅、不初始化 Mail/IAP、不 Unload,LoginStage.RequestNextAct 再阻断跳场景。PF 旧路径不改;KV 失败不进原无限重试对话。PFLoginAct.OnDestroy 的 linked token 不等于 UserService 的 LoginLifetime,因此不能仅靠它保证 Coordinator 撤销;正式分支须在同文件销毁路径显式 Logout,且在 UserService 注册 Application.quitting 同步撤销兜底,二者幂等。无需新 MonoBehaviour 生命周期文件。
  5. 正式租约:接受。CP2A 只绑定同一 Context 的正式 lease,业务路由集合为空;旧 CustomServerPost 在 KV 模式仍拒绝,验证两路由原义不变。关闭先清内部 ready/handle,再 Revoke 与 Registry 排水;GameLoaded 后 Close 故障不得当作资源释放。由于 CP2A 不发业务请求,401/403 的正式业务分发在 CP2B 路由启用时评审,不为了合成测试开放正式路由。
  6. 白名单与验收:接受并纠正计数。报告称“12项”,而受审方案表按单个生产文件列有12个既有/必需文件+1个条件新生命周期文件,总上限13。主会话依据 P3-4 不批准新增 PlayerKVRuntimeLifetime.cs,改用既有 PFLoginAct 销毁路径和 UserService Application.quitting;本次批准的生产文件上限为下列 12项。测试宿主可在独立测试目录新增/调整,须命中真实生产源码,不使用正式账号作单测。Editor 和 Player 目标都要求0错误;历史 _cheatingScore 不得冒充通过或顺手越界修复。

P3逐条处理

项 裁决 实施限定
P3-1 101/102注释 接受 在准入常量处注明本批受审范围,扩员需完整方案审查;不引入可运行时放宽的配置。
P3-2 版本令牌含创建时间/配置hash 不采纳建议形式 PlayerKVSchemaSnapshot.Version 当前只与本次传入的 expectedVersion 对比,且保存于 PlayerKVDecodedSave.ConfigurationVersion;创建时间会使重跑不稳定,配置hash前缀没有可验证的服务端协议含义。正式路径用固定、非空的本地 decoder 版本令牌(例如 formal-v1)并捕获当前真实 cfg.Tables;不宣称服务端 Schema 协议版本。若需配置指纹另起合同审查。
P3-3 KV错误码到UI 限定接受 复用已有 PlayerKVGameLoadError/KVLastError 映射为可区分的失败呈现和诊断;不新增错误体系、不显示 Cookie/内部 handle。
P3-4 可复用生命周期 接受并收窄 不新增 RuntimeLifetime 文件;在已批准 UserService 和 PFLoginAct 中做退出/销毁撤销,合成测试验证一次、重复、Close失败与新 Context 阻断。如 Unity 生命周期验证证明二者无法保证,先补审,不直接扩白名单。

获批生产文件白名单(12项上限)

  1. Client/Assets/Scripts/AOTScripts/Boostrap.cs:传递已加载 config。
  2. Client/Assets/Scripts/SubBoostrap.cs:捕获模式、PF/KV 组件分流。
  3. 新 Client/Assets/Scripts/Services/PlayerData/PlayerKVRuntimeSelection.cs 及必要 .meta:不可变模式、地址和101/102准入;不持有 Cookie/handle。
  4. Client/Assets/Scripts/Services/PlayerData/PlayerKVControlledLoadCapability.cs:正式三传输工厂,与验证工厂隔离。
  5. Client/Assets/Scripts/Services/PlayerData/PlayerKVLoginContext.cs:仅为正式现存档/身份检查所必需的最小受限入口;若无需改即保持原样。
  6. Client/Assets/Scripts/Services/PlayerData/PlayerKVGameLoadCoordinator.cs:仅正式既有档门与原对象交接所需的最小变化;CP1/验证旧合同不变。
  7. Client/Assets/Scripts/Services/PlayerData/PlayerKVGameplayBindings.cs:同一31模块绑定进入Player目标,Editor loop默认版本不变。
  8. Client/Assets/Scripts/Stages/LoginStage.cs:缺少的实际注册及阶段双闸。
  9. Client/Assets/Scripts/Services/UserService.cs:正式模式分流、内部ready/Logout/退出撤销,PF分支不变。
  10. Client/Assets/Scripts/Services/UserService.KVLoad.cs:正式加载配置与既有验证分支隔离。
  11. Client/Assets/Scripts/Stages/PFLoginAct.cs:KV登录停止点、失败呈现、销毁撤销;PF分支不变。
  12. Client/Assets/Scripts/Core/CustomServerMgr.cs:正式空路由租约绑定/关闭,不开放业务API。

PlayFabMgr.cs、KVMgr.cs 四入口、Guard方法体、AggUserService.cs、FishingStage、Survey/Leaderboard、Editor permit/loop、正式账号配置/数据均不在本批。白名单外确需修改时停止编码,补方案与独立审查。CP2A 仅可在合成环境实施与验证;不自动真实访问 101/102。每检查点更新日志,保留原工作树;批末交原 ZCode 独立实施复核并由主会话核交付hash后才能限定关闭。最终 CP4/CP5 必须清闲置实现和旧Mgr运行调用,不打包。