Files
ft/CodexOutput/upserver/B3BatchMigration/M2/M2-正式接线依赖补审方案-修订2-待评审.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

50 lines
7.4 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正式接线依赖补审方案(修订2,待评审)
日期:2026-09-29。继承[修订1主方案](M2-先移植后优化完整方案-修订1-待独立审查.md)的“先移植后优化”目标、旧成员映射与CP3–CP5,不回写受审原件。依据[修订1独立报告](M2-先移植后优化独立方案审查-修订1.md)的P2-1以及[主会话逐项裁决](M2-修订1独立审查主会话裁决与新增阻断-2026-09-29.md),修正“CP1–CP2约30–50行即可进正式玩法”的漏项。本方案仍**不批准任何生产代码**;独立复审后再明确批准边界。
## 1. 真正依赖顺序
```mermaid
flowchart TD
A[已关闭:B02四入口/4B2受控验证] --> B[CP1:合成环境中验证正式加载交接合同]
B --> C[CP2:真实启动/认证/网络/31模块注册接线]
C --> D[CP3:业务域调用迁移]
D --> E[CP4:旧Mgr运行引用和自动执行归零]
E --> F[CP5:证据驱动清理Guard及无用代码]
X[SubBoostrap总创建PF组件] --> C
Y[kv配置被拒/登录走PF] --> C
Z[网络借用仅验证路由] --> C
W[Bindings仅Editor] --> C
```
CP1只验证可复用的**加载→释放Guard→原handle交接**语义,不宣称普通客户端已能登录;CP2才是正式路径。这样不会为绕过启动阻断而复制Editor许可循环或把PF SDK挪进KVMgr。用户要求业务批较大,CP1/CP2是两个不同的系统边界,不按单函数审批。CP1的新增接口在CP2必须实际使用;若CP2评审认为不适用,应在合并前删掉,不保留闲置迁移框架。
## 2. CP1精确合同(申请独立复审后批准)
1. `PlayerKVLoginContext`增加仅 `internal` 的 `TryAcquireGameHandle(long expectedEpoch, out PlayerKVGameSessionHandle handle)`:在同一Context的`prepared==1`、未`closing/revoked`、`IsCurrent`且`handle.Epoch==expectedEpoch`时返回**现存原对象**;不创建新Owner、不公开Cookie;Close前后和旧epoch均失败。取得句柄不代表公布可写状态,最终发布由协调器做。实现不得在Context自身的`gate`内调用可能重入的外部身份回调。
2. `PlayerKVGameLoadCoordinator`保留现有`LoadAsync`与`LoadedForValidation`完整语义;新增`LoadForGameAsync(string id, PlayerKVGameLoadCapability capability, CancellationToken token, Func<bool> identityCurrent)`,共用现有Prepare/Decode/Apply主体,不复制200行流程。成功分支在`transaction.Apply(...)`返回None、`notify`完成且最终`token/context/epoch/Violations`复核通过**之后**取得原handle,随后释放该次Guard,最后发布内部`GameLoaded`状态。任何一步失败继续走原Revoke/Close;不得仅使KVMgr忽略Guard。返回值必须与`LoadedForValidation`可区分;历史失败结果不携可用handle。
3. 协调器增加`TryGetCurrentGameHandle(long expectedEpoch, out PlayerKVGameSessionHandle handle)`,只有正式成功状态、相同epoch、Context当前有效、未closing且Guard已释放才返回;`Revoke`在关闭异步排水之前同步清除内部可发布引用/状态。调用方捕获该原对象,后续旧回调不得重新查询“当前账号”换Owner。Close并发时即使调用方曾取得对象,也由现有Handle/Slot撤销机制拒绝其操作。具体Guard释放、状态发布与`Revoke`并发锁顺序列入实施测试,不在锁内await。
4. CP1不新增通用存档facade、全局handle、PF同名转发、第二套缓存/定时器。`PlayerKVGameLoadGuard.cs`及`KVMgr.cs`四入口方法体原样保持。**CP1白名单**:仅`PlayerKVLoginContext.cs`、`PlayerKVGameLoadCoordinator.cs`和直接验证上述时序的既有/新增合成测试宿主;若实际编译确需结果类型在同一协调器文件中增`GameLoaded`枚举状态,仍属该白名单。不得修改`SubBoostrap`、`UserService`、`CustomServerMgr`或真实账号配置。验证包括原4B2加载回归、B02四入口/Guard、成功交接后合成读写、Apply/notify失败、同账号新epoch、关闭竞态。
CP1只解决原协调器**能否产生可写的固定handle**。它不是正式运行功能,因此不把Player编译、真实会话登录或B01正式接线记为已通过。只有复审明确认可此拆分及白名单,主会话核hash裁决后才能编码。
## 3. CP2正式接线必须完整评审的范围(当前不申请编码)
| 源码入口 | 当前阻断 | CP2所需设计证据 |
|---|---|---|
| `SubBoostrap.cs` + `PlayFabMgr.Awake` | 普通启动无条件创建PF组件并启动旧40秒同步;CP1不能要求“PF未启动”同时又沿用普通启动 | 按启动时捕获的backend分流创建旧组件,PF默认不变;KV模式不建立旧缓冲/定时器。配置变更只影响下一次完整启动,不在半途把已运行PF组件转KV。停用前核Unity生命周期/Prefab调用。 |
| `UserService.KVLoad.cs`、`UserService.cs`、`AggUserService.cs` | `kv`配置拒绝;普通登录PF先行;授权状态和渠道路径依赖PF | 精确小写KV分支的单次S101认证、错误码、IsLogin/IsAuthorized/Logout、API身份发布与渠道身份映射;PF分支无改;不得从受控验证工厂/Editor permit偷接正式入口。 |
| `PlayerKVControlledLoadCapability.cs` + `PlayerKVLoginContext.cs` | 只有`UNITY_EDITOR`验证工厂;生产配置/三条transport未定 | 独立正式工厂,固定API地址来自已捕获配置且必须等于`s101.local:18080`,同一CookieContainer、三条不同拥有者的handler、CacheRoot和表快照来源;不共享/转移验证能力。 |
| `PlayerKVGameplayBindings.cs` + `LoginStage.cs` | 31模块Bind整文件只在Editor;Player对象注册/静止点未核 | 只提升实际相同的Snapshot/Bind源码进入Player编译,逐模块核容器注册、登录时序与Apply前静止条件;失败不得以空对象替代。 |
| `CustomServerMgr.cs` + `PlayerKVAccountLease` | KV借用只允两条验证路由,普通API在`kvOnly`抛错 | 以单会话租约承接正式业务API,请求路由/Method白名单、SessionVersion/401/Close隔离、被撤销请求丢弃;不能改回旧Cookie替换。需按即将启用的业务域列真实API调用,不能全开放网络能力。 |
CP2精确源码白名单、路由清单、账号/历史档策略、Editor/Player编译与真实闭环验收矩阵**尚待完整设计审查**。其范围显著超过修订1独立报告估计的30–50行。CP1实施时不得擅改CP2文件作为“顺手接线”;CP2完成后才可称正式可运行。Player构建的历史`_cheatingScore`错误可以单列来源,但正式交付不得把有编译错误的构建算通过。
## 4. P3归档与停止条件
- P3-1:Guard当前方法调用按主会话核证为20处/5文件,另有类型/字段引用;本轮只记录用途,不随CP1移动Guard。CP5另判断是否从正式KVMgr调用链移除,并删除最终无用代码。
- P3-2:CP3每个业务域记PF旧缓冲/40秒/暂停退出触发与KV实际行为差异,CP4停止旧组件前必须对账。
- P3-3:CP1合成验证可以明确“未声称Player构建通过”;CP2正式可运行要求Player目标0错误。历史错误若需最小修复,先列单独白名单与回归,不混入KVMgr迁移逻辑。
若复审核实CP1接口一经加入就必然要求改普通启动、验证路径无法保持原行为、或Guard释放与Revoke并发无法用现有锁/Handle撤销保证,则**不批准CP1编码**,退回合并CP1/CP2完整方案。所有检查点继续更新开发日志,默认PF保持原状;无正式账号写入、无打包。