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

42 lines
5.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 CP1实施交付与CP2输入
日期:2026-09-29。依据[修订2主会话完整裁决与白名单](M2-修订2独立复审主会话裁决与CP1实施边界-2026-09-29.md)。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并逐项裁决。