Files
ft/CodexOutput/upserver/阶段4B2修订2方案独立审查-2026-09-23.md

73 lines
9.6 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.
# 阶段4B2修订2方案独立审查
日期:2026-09-23。审查者:ZCode会话。
**身份披露**:本审查者是4B2**原初稿**的编制者([初稿独立审查报告](阶段4B2方案独立审查-2026-09-23.md)开头已披露并按作者自审采纳);**未参与修订2及字段/模块合同的编写**(修订2由主会话编制)。按修订2提示词§1,本报告属"保留参与关系披露的独立审查",结论供主会话裁决时结合披露权衡。
本轮只读+仅新增本文件;未修改方案/基线/原报告/共享文档/代码;未使用子Agent;未访问正式服;未运行Unity或任何测试(纯设计审查,下述"源码验证"均为只读抽查)。
## 受审版本
`阶段4B2方案受审基线-修订2-2026-09-23.json`共123项,本审查逐项重算SHA256——**全部一致,无漂移**。核心受审件:
| 文件 | SHA256(前16,完整值见基线JSON) |
|---|---|
| 阶段4B2游戏加载与内存隔离方案-修订2-待评审-2026-09-23.md | 基线一致 |
| 阶段4B2字段与模块加载合同-2026-09-23.md | 基线一致 |
| 阶段4B2初稿审查裁决与修订说明-2026-09-23.md | 基线一致 |
## 最终结论
**通过(附2项P2裁决确认项与5项P3,无P1)。** 修订2把字段清单、模块空态、单会话借用、有界观察、防写门、受控入口、意图语义、文件白名单和22条矩阵全部前置到编码前,未发现"留到编码时决定"的必要定义缺失。建议主会话逐条裁决P2/P3后批准实施。
## 原初稿15项闭环核对
| 原编号 | 状态 |
|---|---|
| P1-1键清单 | **设计层已响应**:附件§2–§3固化两种主档格式、19槽与全部当前消费键(含M01–M31与NewPlayerDataDic附属键、同义冲突规则) |
| P1-2双会话 | **新方案替换原规则**:单认证+internal AccountLease借用;不采纳双会话;修复了CustomServerMgr.ReplaceTransport无排水问题(版本隔离+Lease.Close) |
| P1-3关闭屏障 | **设计层已响应**:有界观察(10s/5s,可配置1000–15000)+跨Root ShutdownRegistry+PreviousClosePending/Failed专用错误;明确拒绝"锁释放即绕过CloseFailed" |
| P1-4 PF写通道 | **新方案替换原规则**:显式放弃PlayFabMgr零改动,guard前置拦截+白名单+PF行为回归要求 |
| P1-5 IsLogin旁路 | **设计层已响应**:公共kv配置在任何认证前返回BackendNotEnabled;Agg捷径先判backend;受控入口永不返回Done |
| P2-1~P2-5、P3-1~P3-5 | 全部设计层已响应(严格完整主档判据、意图≤2项内存态Discarded、HotUpdate内Editor宿主+固定反射、附件§4写点裁决、配置入口捕获一次、拆编排类、5s/10s常量、PF行为回归+静态断言、TapJoy条件编译分层验证、"行为等价"措辞) |
## A–J分组核查结论(全部含源码抽查)
**A字段完整性:可审,通过。** 抽查验证:`LoadPlayerDataNew`的`newData.Split(',')`槽位0–18与附件§2表**逐槽一致**(含slot4=pearl/slot11=diamond的别名、slot12/13地图、slot16–18小游戏计数);`epdk/epbdk/estdk`键名与M25–M27一致;NewPlayerDataDic附属键(vipL/ld/ad/bd/ct/rt)与源码1004–1127区解析一致。主档"完整19槽或完整旧19键"替代"任一特征键"满足"完整业务校验"要求;两种布局共存冲突→ConflictingRepresentations、不静默挑份,自洽。未发现附件遗漏的同步消费键(注释掉的MonthCard/Challenge等已按Unconsumed处理并明示)。
**B业务内存:可审,通过。** 附件§5对M01–M31逐模块给出空态/替换集合与精确文件;"同一组业务对象A→B缺键整组断言、禁止抽样"消除了初稿最大缺口。抽查验证副作用的处置依据属实:`BargainPackData.LoadData→AddGiftFaceUIForce`(BargainPackData.cs:134)、`EventPotionDataManager.GetDataFromServer`内含Init调用、CampDataMM `SetIsFix`默认isSave=true的写点(附件M07明确禁止误用)——"不调用旧总入口、新增纯Decode/Reset/Replace"的路线与这些源码事实吻合。Poisoned容器销毁、不重试,闭合。
**C会话拓扑:可审,通过。** 4B1`PrepareCoreAsync`内部建session(源码核实)与"禁止外部先登录再借Cookie冒充单会话"一致;Lease"Prepared且未Closing"gate内原子发行、active计数、撤销后丢弃200返回值、Close顺序(撤销→workSettled→Lease→Bridge→session);CustomServerMgr internal绑定+版本隔离+Clear先递增版本——替换transport旧缺陷不复用。4B1原语义(重复Prepare/首token/历史任务/Volatile发布顺序)合同保留并要求全量重测(B2-19)+独立复核——扩展闭合。
**D有界观察:可审,通过。** 10s登录/gate、5s Quit仅限**观察者**,排水任务移交Registry持续存在;gate超时与获锁竞争释放已设计;迟到Prepare禁止Apply;CloseFailed不可绕过且不提供清空按钮(人工恢复另审)——与4B1关闭屏障裁决一致,无互等环(观察者返回不等 worker)。
**E副作用:可审,通过。** 抽查验证PlayFabMgr风险面属实:OnApplicationPause(133)/OnDestroy(155)/PlayerPrefs.Save(159)/SyncData/SyncDataImmidiate全部列入guard前置拦截;guard在改字典/缓冲/PlayerPrefs/构请求**之前**检查、"guard命中≠成功"(立即写返回false、void抛固定异常);且明确guard是第二道检查,零副作用主保证来自纯Decode/Replace+替身计数——职责划分诚实。进入受控范围前要求PlayFabMgr无pending buffer,防旧队列跨账号泄发。
**F受控入口:可审,通过。** 公共kv→BackendNotEnabled(Agg捷径同样先判,源码证实Agg确有IsLogin提前返回);能力仅UNITY_EDITOR创建、缺替身在首请求前失败;LoadedForValidation不授IsLogin/IsAuthorized、InternalId保持0、不发布EvtAPISvrLoginSuccess——不冒充游戏迁移完成。
**G意图/身份:可审,通过。** 意图≤2项、同键去重、显式Discarded、不跨epoch迁移、不落盘;MMTest的PF NewlyCreated(分桶)与S101 NewlyCreated(空档分类)用途分离明确;linkedAccout全新集合合并、EAccoutUrl缺失空字典;CleanupFailed+OriginalError双检查进入KVGameLoadResult。
**H载体与范围:可审,通过。** HotUpdate.asmdef存在(核实);UNITY_EDITOR整文件宿主位于HotUpdate内创建internal能力,Editor包装器仅反射固定RunAsync——不加InternalsVisibleTo、不改asmdef;离线宿主显式链接+Unity宿主链接真实源文件的分层避免复制逻辑;B2-12对UNITY_ANDROID分支的双编译定义处理明确,不冒充真机。
**I PF回归:可审,通过。** 因PlayFabMgr入白名单,方案已放弃hash等价主张,改为B2-01行为回归+静态核对(原InitData位置与时间校准后次序)+guard无租约直通——覆盖了初稿P3-3/P3-5。
**J阶段边界:可审,通过。** 受控入口永不Done、输出改 LoadedForValidation 是**收紧**而非删减:加载能力(纯适配器+编排+隔离)完整交付,仅最终接线延后至4B3/4D启用门;4B3(读写路由)/4C(消费)/身份/场景/tickets启用条件完整保留。
## 三项变化的分别裁决(提示词§4要求)
1. **4B1接口扩展(Lease/元数据/Close排水)**:同意。设计保留4B1已批准语义并强制全量重测+独立复核;Lease不公开凭据、路由白名单限`__kv_validation/*`、禁二次account/Login。
2. **PlayFabMgr及31模块扩围**:同意。PlayFabMgr仅guard检查点、PF分支原路径+行为回归;模块仅增纯Decode/Reset/Replace且禁改PF原入口;"清单外同步消费视为设计差异先补审"守住边界。
3. **公共kv禁止Done**:同意。这是消除P1-5旁路的正确代价;受控验证链完整可测,未削弱交付内容。
## 新发现
**P2-α|存量真实PF档兼容性是隐含产品政策,需用户显式确认。** 附件§2自_declare"比原PF加载更严格、不声称所有历史PF档都兼容、不符合布局的真实档须走单独迁移"。本阶段仅用合成档验证(正确),但"真实玩家档可能MissingCore→阻塞进游戏且无迁移方案"是**启用门前必须存在的流程**,属产品级决策。建议主会话裁决时将其列为启用门显式前置(迁移方案另审),避免4B3/4D时才发现。
**P2-β|M14 ClubService.cs白名单叠加。** 该文件已承载最小登录期未提交改动,4B2再改动使diff叠加、审查负担增大。建议实施时对M14三处加载态改动提供独立最小diff说明(非方案缺陷,流程建议)。
**P3**:①Editor宿主对GContext容器的捕获/替换/恢复若遇未捕获崩溃(非finally异常)会污染编辑器状态——建议驱动入口顶层try-catch保底恢复;②附件M05空态取表InitWheelTicket依赖表快照版本——已由"Decode前捕获固定"覆盖,实施时断言空态来源同一快照;③`KVLoginCloseObserveMs`无效配置在受控入口拒绝——建议明确拒绝错误码归类(Input或GateBusy);④B2-06"每一种codec至少正反例"工作量大,建议实施按模块分组交付证据;⑤诊断"最多32条描述"——建议明确超出时的聚合策略(按模块计数汇总)。
## 结论重申
**通过。** 无P1;P2-α/β为裁决确认项而非方案缺洞;P3五项为实施细化建议。原15项全部闭合且多项以更优规则替代。建议主会话:①逐条裁决本报告(特别是P2-α的启用门前置);②核对123项基线hash(本报告已代验一致);③批准后按主方案§9检查点0–4实施,检查点1(Lease/Registry+4B1全量回归)先行。