8.5 KiB
阶段4B2方案独立审查
日期:2026-09-23。审查者:ZCode会话。重要披露:本审查者同时是受审方案的编制者(作者自审性质的独立审查报告),主会话裁决时应知悉此身份并按其对结论权重自行斟酌;本报告以提示词§0"设计完整性门"为准绳从严审查,发现不因作者身份而淡化。本轮只读+仅新增本文件;未改原方案/共享入口/代码,未用子Agent,未访问正式服,未运行Unity(纯设计审查)。
受审版本
| 文件 | SHA256 |
|---|---|
| 阶段4B2游戏加载与内存隔离方案-待评审-2026-09-23.md | 8992B17D8B1DEAAA99D7DFDCC76AE2D21112FC259C675F6EDEB9205643C9803C |
| 其他AI审查提示词-4B2方案-2026-09-23.md(含§0设计完整性门,本次按此版执行) | 3E667B519C57F48E3462C1EFB44A5BF2E481C1A5DD2DD2C467EFCCBF3EED9AD3 |
实际读取:方案全文、前置链(4B1关闭裁决/4B分期/阶段4分期)、4B1/4A四个生产文件、方案§1全部源码(UserService登录链/InitData/SetMMTestValue/LoginApiServerCore/401订阅/Logout、AggUserService、DataCenter.PlayerData.LoadPlayerData与模块分发、PlayFabMgr.CompareDatas/GetLocalData、QuitAct)、调用盘点、模块InitData消费清单与CampDataMM写入点核对。作者自审补充(S-1~S-9)一并纳入对照。
最终结论
退回补全。 方向与架构正确(后端开关、插入点、五Verdict校验、副作用暂存思路、白名单边界均可保留),但按提示词§0"必要细节未明确时应退回补全,不留到编码时决定",存在5项P1级必要定义缺失。补全后可快速复审,无需推倒。
P1发现(必要定义缺失,阻塞批准)
P1-1|主档完整键集与逐模块重置规则留在实施检查点,违反"完整评审后编码"。 位置:方案§3"完整键清单由实施检查点1固化"、§5检查点2。依据:4B分期对4B2的审查要求原文为"单独列完整加载字段/模块、缺失与损坏策略、默认值来源";提示词§0明确禁止以"编码时再确定"代替设计裁决。实际模块清单(本审查核实):PlayerShopData、PlayerFishData、FishingEventData、BuffDataCenter、CampDataMM(DataCenter.PlayerData.cs:593–607)、BattlePassData(:862)、FishingBoxData(:697,嵌套解析)及LoadPlayerDataNew链——方案§3只列锚点。修改建议:方案正文必须包含①全部消费模块及其存档键清单(含PF模式现用键名);②每模块"缺键=回默认"还是"合并累积"的语义标注与残留风险结论;③特征键判定规则收紧(见P2-1)。
P1-2|双认证会话归属未裁决。 位置:方案§3加载门。依据:KV流程同时存在两个已认证S101会话——UserService.LoginApiServerCore创建并UseAccountSession给CustomServerMgr的apiSession,与PlayerKVLoginContext内部自建的session(4B1"拥有一个新建的S101AccountSession")。方案未裁决:双会话是否为最终形态(vs扩展4B1注入既有session——4B1方案明确说该扩展"必须在4B2/4B3方案中明确");Logout/401时两者的处置顺序;双登录的服务端影响;Done是否要求两者皆成功。修改建议:方案新增"会话拓扑"小节,明确选定双会话并给出顺序合同(如:注销时代际失效→撤KV context→关apiSession;Done要求API登录+KV Prepared二者皆成),或选定注入式并走4B1扩展差异评审。
P1-3|关闭屏障的失败恢复未设计——存在登录门死锁路径。 位置:方案§6("关闭任务并入下次登录await")、QuitAct有界等待。依据:4B1合同为CloseFailed后实例永久阻塞、新context须await旧Close成功;若旧Close因忽略取消传输而长期挂起或faulted,下次登录在await处无限阻塞。Quit超时(方案未定值)后同进程再次登录同理(提示词§0点名)。修改建议:方案必须设计恢复策略并写入矩阵,例如:登录门await旧Close采用有界等待+超时进入专用阻塞错误(保留证据、提示重启/人工处理),或定义"仅当旧Close已faulted且缓存锁已释放时可跳过等待"的可判定条件;同时给出QuitAct超时常量与超时后状态记录。
P1-4|KV模式下PlayFabMgr写通道未处置。 位置:方案§4/§7(禁改PlayFabMgr)与"KV成功后不镜像PF"已裁边界。依据:PlayFabMgr为MonoBehaviour单例,Unity受控加载中Awake必启40秒定时器;DataCenter各保存点(体力恢复等)仍经UpdateUserDataValue写PF。方案只声明"写路径4B2不接",未回答受控运行期旧写通道如何静默。修改建议:二选一并写入方案:①受控验收严格限定"加载段+断言窗口内零脏写触发",并给出该窗口内可能的脏写触发清单及其排除论证;②正式差异评审允许PlayFabMgr最小改动(后端开关短路),放弃"零改动"承诺。不允许留到编码时决定。
P1-5|IsLogin提前Done与401后台重登构成KV门旁路。 位置:方案§3加载门未覆盖。依据:UserService.LoginCore开头if (IsLogin) return Done——PF已登录且API已授权时直接Done,不经过KV准备门;401订阅的_ = LoginApiServer()后台重登恢复InternalId后,IsLogin再次为真,同样旁路。KV模式下该路径会让游戏以无KV快照状态进入Done。修改建议:方案必须定义KV模式下IsLogin提前Done的条件(如要求"当前代际内已有Prepared成功"状态位),并把401后台重登后的KV context重建(或明确不重建则禁止Done)写入§6合同与矩阵。
P2发现
P2-1|特征键"任一组命中"判定偏宽松(作者自审S-3,复核成立):孤立进度键而模块大档全缺的残档可判Valid。建议收紧为"至少一个模块大档键+至少一个进度键双命中"或等价规则,并入P1-1的键清单。
P2-2|暂存意图生命周期未定义(S-2):存储载体(内存/本地)、进程退出丢失是否接受(MM实验分组回退影响需显式裁决)、诊断形式、"未落盘"标记如何防止4B3前被误读。
P2-3|Unity受控验收的替身注入机制未定义(S-4):internal工厂跨程序集不可达;B2-20须在白名单内给出机制(Editor反射装配宿主/仅离线宿主验证+Unity仅验编译与开关行为),并同步调整矩阵措辞。
P2-4|初始化间接写入清单不全:方案只逐项处置了MMTest×3与Agg渠道标记;模块InitData链内是否触发写未经盘点。本审查抽查CampDataMM:SetIsFix含PF写但InitData传isSave:false(安全),证明"逐模块必须逐一验证"而非可假定。要求方案把"LoadPlayerData→OnInitData同步可达的全部写点清单+逐项处置"列为方案正文内容(非检查点)。
P2-5|开关读取时点未定(S-5):应明确"登录流程入口读取一次、会话内固定;配置热更改不生效于当前会话"。
P3发现
- P3-1|UserService改动面集中(S-6):给出"拆PlayerKVLoginFlow编排类"备选的明确取舍,而非仅留问题。
- P3-2|QuitAct超时值未定(S-7):给默认常量并进配置。
- P3-3|PF模式等价证据偏弱(S-8):补静态断言(原InitData调用位置仍在PF分支)。
- P3-4|InitTapJoy的UNITY_ANDROID条件编译在离线宿主不可测(S-9):指定验证载体。
- P3-5|措辞:路线表中"行为与现状逐字节等价"应为"行为等价"(代码新增分支判断,非逐字节)。
方案§10五问逐答
①开关等价性:机制可行,但需P2-5时点定义+P3-3证据补强;②特征键判定:不满足,按P2-1收紧并落实P1-1清单;③暂存边界:未完整定义(P2-2);④白名单可审性:基本清晰,UserService改动面建议按P3-1再权衡;⑤矩阵与启用门:存在旁路(P1-5),关闭屏障死锁路径未覆盖(P1-3)。
退回补全清单(修订版方案必须包含)
- P1-1:完整模块/键清单+逐模块缺键重置语义+收紧后的特征键规则(正文)。
- P1-2:会话拓扑小节(双会话裁决+注销/401顺序合同+Done双成功条件)。
- P1-3:关闭屏障失败恢复设计+Quit超时常量+对应矩阵项。
- P1-4:PF写通道处置裁决(收窄受控范围或PlayFabMgr差异评审)。
- P1-5:IsLogin提前Done/401重登的KV门条件(正文+矩阵)。
- P2-1~P2-5各自的最小定义。
修订后按本提示词快速复审(重点仅上述各项),通过再交主会话裁决批准实施。