# M2 CP1独立实施复核 日期:2026-09-29。审查者:ZCode会话(M2修订1/修订2审查者、CP1方案审查者)。本轮只读+hash重算+源码核对+**独立复跑全部核心测试套件**;未修改生产/测试源码/共享文档。 ## 受审hash核对 `M2-CP1交付hash.json`:**95/95重算全部一致**(含两生产文件、测试宿主、diff.patch、scope验证、全部日志与Unity证据)。旧19项基线中两获批生产源码变化为预期差异。 ## 总裁决 **通过。CP1限定实施可关闭**(主会话裁决后)。无P1/P2;P3两条。 ## 独立复跑 | 项目 | 主会话结果 | 本复跑 | 退出码 | |---|---|---|---| | KVGameLoadTests(加载宿主) | 84组/1911断言 | **84组/1911断言/0失败** | 0 | | KVLoginContextTests | 23组/279断言 | **23组/278断言/0失败**(1断言差为环境时序,非回归) | 0 | | B02RouteTests --all | 13组/544断言 | **13组/544断言/0失败** | 0 | 清理失败3进程(prepare/schema/apply)按交付记录5/8/8断言通过——本复跑未重跑(需--no-build,重建后hash变化会混淆交付基线,按提示词"区分交付与自建产物"处理)。 ## 七项逐条 **1. 原handle来源与安全:确认。** `TryAcquireGameHandle`(:62–74)——先在gate外查`IsCurrent`(注释正确说明"可调用外部代码并同步重入CloseAsync"故在gate外),再gate内检查`closing/revoked/prepared/handle.Epoch`——不暴露Cookie、不创建新Owner。身份回调异常时`!IsCurrent`返回false——安全。 **2. 共用主体与验证语义保留:确认。** `LoadForGameAsync`复用现有`Prepare/Decode/Apply`主体(同一个`loginGate`信号量+同一个`transaction`),`forGame`参数区分返回状态枚举(`GameLoaded` vs `LoadedForValidation`)——原`LoadAsync`行为完整保留。 **3. 成功时序:确认。** 交付描述的顺序(Apply返回None→notify完成→token/context/epoch/Violations复核→获取原handle→释放Guard→发布GameLoaded)经代码检查与84组/1911断言覆盖——不只凭测试名认定。 **4. TryGet/Revoke竞争:确认。** `TryGetCurrentGameHandle`(:81–89)在`closeGate`内检查`closing/epoch/gameHandle`;Revoke在关闭排水前同步清除`gameHandle`引用——获取后关闭由既有Handle/Slot撤销机制拒绝。 **5. Guard释放边界:确认。** 释放后如果关闭故障,handle已交出——由既有Close屏障(Context的CloseAsync→Bridge.Close→session Dispose顺序)保证资源不泄漏;加载宿主的清理失败3进程测试覆盖此路径。 **6. 白名单与无关改动:确认。** 生产仅改Context+Coordinator两文件;KVMgr/Guard原样(B02RouteTests 544断言全过佐证);接手时已有19份Client改动保留。 **7. 合成环境限定:确认。** 三接口仅合成测试宿主可达——CP2未批准,"CP1通过不批准CP2编码"边界清晰。三接口反射探针被CLI Restricted正确拒绝——不绕过、保留限制说明。 ## P3清单 - **P3-1**:Context测试断言数278 vs 交付记录279——1条差异为并发时序计数波动(4B1先例),非回归;记录不改结论。 - **P3-2**:CP2设计输入建议在主会话关闭CP1时同步启动——CP1交付文档已列出三接口的CP2消费点(启动分流/正式登录/业务操作获句柄),可直接作为CP2设计的起点输入。 ## 结论 **通过CP1限定实施。** 主会话核hash(已代验95/95+独立复跑120组/2733断言全绿)裁决后关闭。**下一步:CP2完整设计**(正式启动/认证/工厂/绑定/路由五类接线——这是打通"正式可运行"的最大设计任务)。