4.0 KiB
Gameplay101Validation 不可用药水引导恢复独立方案审查
日期:2026-09-28。审查者:ZCode会话。独立性声明:未参与本方案编写与101首次运行;此前参与为业务包方案审查。本轮只读+hash重算+源码核对;未运行Unity/正式接口/修改共享状态。
受审hash核对
stale-guide-review-hashes.json:19/19重算全部一致。
总判定
通过。 无P1/P2;P3两条不阻塞。根因链准确、三选一取舍正确(放宽门会导致AddIndex(true)误完成引导——本审查独立核实该危险真实存在)、改动合同最小且边界严格。
重点逐项(按§6提示词)
1. Init处延期避免错误指针:正确。 根因链经源码核实:GuideDataCenter.Init(:95 async void)不检查活动可用性即恢复未完成指针→CheckRewardGuide因指针非空拦截→用户被要求完成无入口的引导。延期分支置于取现有_saveData之后、原恢复循环之前——源头不产生活动指针,正确位置。
2. save数据与isUpdate保持:合同明确。 延期时同_saveData按原键加入keyValuePairs后continue;不设curSaveData/curDefine/curGroupDefine、不改isUpdate、不发布事件、不额外Save、不清其他组指针、保留原字典数据——只阻止挂载不丢进度(活动将来可用时下次登录仍能原路恢复)。
3. GetEvent只读语义与异常分支:严格。 GetEvent(4,5)(:449)只读查询严格=-1才延期;禁用GetEventAndInit/SetEvent/FixPotionData等有副作用接口;异常不当作-1(记录警告继续原恢复,由钓鱼准入拒绝)——保守方向正确。
4. 其他组/PF/非Editor不回归:边界完备。 限定UNITY_EDITOR&&!SERVICE_HOST+KV Ready+恰EventPotion01+isFinish=false+guideSubIndex>0且在范围内;EventPotion02/已完成/索引0/其他组/活动可用均原路径;默认PF与非Editor完全不触发。
5. AddIndex(true)/GuideNextEvent误改风险:真实且被正确规避。 本审查独立核实三处AddIndex(true)调用(FishingUpdateSys:2037/3028+FishingRewardPanel:582)——若选路线2放宽CheckRewardGuide,收鱼/鱼死亡时会把EventPotion01误标完成并写档。路线1(源头延期)是唯一正确选择;延期后无当前引导→AddIndex(true)无目标可改。
6. 红绿验证充分:是。 红测用101真实EventPotion01残留(非清指针替身)重现阻塞;绿测同输入指针不挂载+存档不变;可用药水活动经隔离配置构造走原恢复(不丢旧进度);异常/其他组/边界全覆盖;"延后后调用AddIndex(true)不得改药水标记"的专项验证直接锁定核心风险;Init为async void的测试时序(完成信号/下一帧观察/有限超时/每例恢复容器)考虑周全。
7. 当前会话退出后才编码+剩余闭环覆盖:完整。 68504在Play须先正常QuitStage/归档许可——不能运行中改源码触发域重载;后续连续执行(红测→两文件修改→回归→新进程→真实抛竿→收下→退出→v1恢复→统一复核)与原业务包合同一致;新增验收项"EventPotion01未被误完成+GuideSaveDataNew保持"精确对应本修正的风险。
P3清单(不阻塞)
- P3-1:延期分支的条件2要求"对应节点属于EventPotionPanel"——建议实现时以
guidanceGroupDefines节点数组实际Panel名断言(而非仅组名推断),测试加一条节点Panel不匹配时不延期的负例。 - P3-2:
GetEvent(4,5)的magic数字(type4/subType5)建议在修正分支内用具名常量或注释标明语义(药水活动类型对),便于未来维护。
结论
通过本最小修正方案。 主会话核hash(已代验19/19)逐条裁决后:先正常退出当前68504会话(归档许可/保留claim),再连续执行红测→两文件修改→回归→新进程真实闭环→统一交付复核。原业务包合同继续有效;本修正不扩大到全平台/全部活动引导政策。