# M2 CP2B-T 正式 KV 普通业务请求运输交付与待终审 日期:2026-09-29。状态:**实现及本地合成验收完成,待一次独立实施复核和主会话终裁;不代表 CP2B 首场景或整体 M2 完成。** 编码前的[完整方案](M2-CP2B-T正式KV普通业务请求恢复完整方案-待独立审查.md)已按 7/7 hash 独立补审,并由[主会话逐项裁决](M2-CP2B-T完整审查主会话裁决与实施白名单-2026-09-29.md)批准精确白名单。 ## 实际交付 - `PlayerKVLoginContext.cs`:原租约继承 capability 创建时固定的 formal/validation 模式。验证模式仍只接受两条精确验证路由;正式模式只接受规范相对 GET/POST,拒验证、再次认证和专用 playerdata 路由。正式租约沿用原账号 Cookie 和关闭排水,并把业务超时设为旧 `CustomServerMgr` 的 15 秒。 - `CustomServerMgr.cs`:`BindKVForGame` 仍在 Apply 前绑定但不发布业务;只在同 epoch 的 GameLoaded/CP3A 原句柄与三原实例交接后一次 `EnableKVBusiness`。普通 GET/POST 及现有包装方法走同一租约,不再受 KV 全局拒绝门阻挡。`Cookie` 仅在当前正式就绪租约返回同一 CookieContainer;401/403、退出/清理先禁用、递增版本并作废旧响应,禁止同一租约再次发布。后台普通请求先调度到创建管理器的同步上下文,避免在 HTTP 响应线程直接撤销 Unity 服务。PF 发送分支保持原逻辑。 - `UserService.KVLoad.cs`:正式原句柄和 Setting/Club/Notification 交接后发布运输就绪;正式 KV 专用 401 事件走 `LogoutFormalKV`,退出和异常先禁用运输再撤销 Coordinator。不改公开 `IsLogin`、`ApiPlayerId` 或跳场景闸。 - 合成测试覆盖正式/验证隔离、同 Cookie、15 秒超时、方法/路径/JSON、未就绪零发送、普通 GET/POST、404、401、后台主线程交接、在途旧响应、同账号新 epoch、重复发布拒绝、Close 失败关闭屏障及旧 PF 回归。产品代码未保留仅供测试读取超时的属性。 ## 本地验证 | 检查 | 结果 | |---|---| | KVGameLoadTests | 90组、2012断言、0失败 | | ServiceHost 非Android | 10组、119断言、正式请求0 | | ServiceHost Android+AGG | 10组、119断言、正式请求0 | | Unity CLI Loop Editor 编译 | Success=true、0错误、272警告;见[结构化核验](M2-CP2B-T-Editor编译核验.json) | | 范围与空白 | 本批白名单内 `git diff --check` 无空白错误;保留原工作树 | 验证全部使用本地合成 handler,没有调用正式 101/102、业务路由或本机服务器代码。沙箱直接写既有 `obj` 被拒,测试在获准的本地命令环境完成;没有改服务器或打包。 ## 仍待的独立边界 批末独立实施复核须重点核:正式就绪时点及只发布一次、401/403 的会话版本和 UserService 撤销时序、后台回原线程、Cookie/RTService 既有消费者、Close 幂等及新 epoch、验证租约与 PF 旧分支不回归;核交付清单字节数/hash,指出白名单漂移与闲置实现。若报告发现实质问题,先按最小增量裁决再修改代码。 本批**不证明**线上 Mail/Friend/Club/AntiCheat 等路由或响应合同、`IsLogin`/`ApiPlayerId` 正式发布、SignalR 真连接、真实 Player 脚本编译、`FishingStage` 全链或最终通关。当前 `LoginStage` KV 阶段闸继续阻断,固定正式地址 `http://s101.local:18080/`;Unity 自动化仅 CLI Loop,不用 UnitySkills,暂不打包。`PlayerKV*` 命名和剩余开发期临时路径按最终清单在整体移植后处理。