Files
ft/CodexOutput/upserver/B3BatchMigration/M2/M2-CP1实施交付与CP2输入-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

5.5 KiB
Raw Blame History

M2 CP1实施交付与CP2输入

日期:2026-09-29。依据修订2主会话完整裁决与白名单。CP1已限定实施,批末待原ZCode独立复核,尚未关闭。CP2正式接线未获批编码,M2整体迁移未完成。

实现及范围

  • PlayerKVLoginContext.cs:仅新增internal原handle获取,在外部身份回调后于Context gate复查prepared、closing、revoked和epoch,不新建Owner。
  • PlayerKVGameLoadCoordinator.cs:原LoadAsync与新增LoadForGameAsync共用一个加载主体;仅成功Apply、notify和最终核验后释放本次Guard并发布GameLoaded。TryGetCurrentGameHandle在外部回调前后复核发布状态,Revoke同步清空引用并提升epoch,异步排水仍用原关闭链。结果只记历史状态,不携带可用handle。
  • 原Guard类和KVMgr四方法没有修改。没有改启动、UserService、认证工厂、网络路由、31模块Player绑定或正式配置。没有增加facade、全局handle、缓存或PF转发壳。
  • 测试变化:既有加载宿主增加KVMgr/KeyReadResult源码链接;CoordinatorTests接入7组CP1测试(含GameHandoffTests新文件)。临时红测反射兼容分支已去掉,最终直接调用受审接口。
  • 本次新增生产差异仅2文件;接手时已有19份Client改动逐项hash保持一致。见 CP1-scope-verification.json。受审19项中仅两份获批生产源码变化,其余17项保持原字节,原ZCode报告保持原样。

验证证据

检查 当前结果与证据
受审基线 主会话19/19一致,M2-修订2主会话hash核验.json;这是编码前证据,不要求编码后仍与旧两源码相同。
红测 CP1-red.log:78组中只有新用例失败,原因是现有成功路径Guard仍阻断读取;既有77组通过。
测试编译首败 CP1-green-first.log:新测试误把PlayerKVEditResult.Accepted写为Success;仅修测试属性,无生产API改动。
加载宿主全回归 CP1-green-final.log:84组、1911断言、0失败。包含成功原对象交接及实际KVMgr本地写读、通知前禁止取得、Apply/notify/schema/身份失败、通知取消/撤销、同账号新epoch、验证模式隔离、外部身份回调重入关闭、发布/查询时后台撤销、Prepare晚响应丢弃。
4B1 Context回归 CP1-context-regression.log:23组、279断言、0失败。
B02四入口与Guard CP1-B02-all-regression.log:13组、544断言、0失败。第一次未带--all的单组检查另存于CP1-B02-regression.log,不冒充完整回归。
清理失败隔离进程 分别使用 --cleanup-failure prepare/schema/apply,三个独立进程0失败,断言5/8/8;结果见CP1-cleanup-*.log。沿用既有验证分支清理失败合同,不将其说成新正式路径故障注入。
Unity 仅CLI Loop;CP1-unity-compile.json报告0错误、272警告、Success=null,不能只凭此字段称成功。前后状态均非Play/非编译,CP1-unity-errors.json唯一错误是本轮不支持的get-project-info命令,无源码编译错误日志。只读接口反射查询被Restricted安全规则拒绝(CP1-unity-loaded-api.json),不声称接口加载探针通过,不绕过限制。未执行真实账号,未验证Player目标。
范围与diff CP1-scope-verification.json核已有19份改动及新增两源码白名单;git diff --check无空白错误。

合成HTTP使用原测试专用无效域名和Handler,实际本地缓存写入仅测试runs目录;没有请求正式 http://s101.local:18080/。正式地址、101/102配置、许可和claimed均未改。测试中合成身份字符串不代表访问同名正式账号。

并发合同与复核重点

外部身份回调不在Context gate或Coordinator closeGate内调用;回调返回后再次检查epoch、closing和对象身份。发布与Revoke使用同一个closeGate,不在该锁中await。Guard Dispose与Reject由原Guard内部锁串行,释放后的计数不会再增加;若最终计数异常则不发布,仍经Revoke/Close处理。测试用真实后台撤销和主线程清理队列,不向生产类植入测试专用钩子。

CP1只提供合成环境可验证的交接能力。它不解决正式启动/认证可达性,也不替代Player编译、正式路由或真实闭环。独立复核仍应检查成功发布与直接Context关闭/身份变化的边界、既有失败清理语义和Guard释放后发生关闭故障的处理。

CP2设计输入及后续门

三个接口消费关系详见批准文件:TryAcquireGameHandle仅由Coordinator内部调用;UserService未来正式KV分支调用LoadForGameAsync;会话入口按预期epoch取得一次原handle,业务捕获后传入KVMgr,旧回调不得重新查询当前账号。当前后两者只有合成测试调用,不能写成正式消费已存在。

CP2仍需完整方案覆盖:启动backend捕获/旧组件创建分流,单次S101认证与授权状态/渠道身份,正式工厂及三transport所有权,31模块Player注册静止点,按业务域限定API Method/路由与401/SessionVersion/关闭隔离;另列账号历史档政策、精确白名单、Editor/Player 0错误及真实闭环验收。不得靠Editor验证工厂或permit接入正式流程。

CP2若不消费某CP1接口,必须在合并前移除该接口和失效测试;最终CP4清旧Mgr自动执行/运行调用,CP5凭证据清闲置实现并出最终流程图。现阶段暂不打包。下一步为原ZCode对本批独立实施复核,主会话再核交付hash并逐项裁决。