10 KiB
4C1方案审查裁决与实施记录
检查点0:完整评审裁决与实施批准
独立报告《阶段4C1普通钓鱼消费确认方案独立审查-2026-09-24.md》接受,无P1/P2。主会话34项受审hash全部一致;报告摘要及25个源码字节快照见KVFishingConsumeTests/checkpoint0.json和before/。源码快照含订阅者和HomeBtnRecharge,保留实际行号。
逐项裁决:①范围接受,首轮只到开放拉杆;②动作身份/生命周期接受,重复与旧回调不得再扣费;③双表示冲突接受,使用原整档序列化;④写入矩阵接受,活动激活仍按方案拒绝/不计通过;⑤消费按各key最终原票据确认,中间可追溯替代不改装备合同;⑥部分提交/Unknown不重扣、不补偿,专用测试模式可停止;⑦真实运行备份/配置门/一次动作/新进程恢复接受;⑧白名单与测试矩阵接受。报告将消费事件发布文件并计入“8个订阅文件”,该措辞不等于8个独立订阅者,以方案矩阵及实际源码为准。
| P3 | 裁决与落地要求 |
|---|---|
| 1 恢复计时派发前替代 | 接受;原最终票据被异步写替代就失败,保留证据,不暂停恢复计时。不能自动再次扣费;若真实run失败,先核服务器态和备份,再决定新进程验证,不能简单重播 |
| 2 Tween Kill | 接受;区分正常完成后的AutoKill与中途Kill,后者撤销继续资格;补实际继续路径断言 |
| 3 localOnly中间写 | 接受;真实ReduceEnergy(false)的中间写必须捕获;最终主档原remote票据确认,不把localOnly宣称远端确认 |
| 4 行号/订阅快照 | 接受;检查点0保存25源码原始字节,后续差异以该版本为准 |
主会话批准按主方案§7白名单实施,按§8检查点推进;不开放转盘/鱼获/热换号,不改底层、Schema、任务算法、场景、SDK或服务器。不需要再次询问101/102授权。发生范围外需求必须先形成具体差异评审,不能用此批准扩大范围。
当前检查点0完成;检查点1测试先行→最小实现,检查点2回归,检查点3真实运行门与验证,检查点4独立实施复核仍待完成。每个检查点更新日志;未完成不提前关闭。
检查点1进度(尚未整体通过)
已编写4份白名单旧源码与一个固定Editor验证host及meta。旧逻辑红测2项预期失败、许可旧实现8例中4失败;新版8例全通过、R1许可15断言通过。4B2全量75组1716断言、B3A全量13组544断言通过。
Unity编译0错误270警告;固定合成验证15组44断言成功,证据KVGameplayLoopTests/fishing-fixed-runs/20260924T074127_e8025245a5f5479986d968c2b693b4a7/result.json。测试替身仅.invalid、正式请求0,静态状态和owner排水已恢复。旧CLI执行在域重载后续跑,新请求返回Another execution is already in progress;以该固定host落盘的result及events为独立证据,不把CLI错误称成功。
首次夹具构造顺序错误与Tween测试失败保留。Tween根因经项目DOTween.dll IL核实:Init/AutoInit在非Play直接返回,Kill在initialized=false直接返回。因此固定host同步块暂设该初始化门,调用原Tween Complete/Kill并在finally恢复;未修改DOTween DLL或生产算法。此证据只覆盖固定夹具回调,不替代真实UI生命周期验收。
待补恢复阈值/等待期间恢复写、真实消费控制流与订阅绑定、其余既有回归。无活动permit,真实102消费未开始,检查点1/2不提前勾选完成。
检查点1/2:限定实现与回归完成,真实验收待运行
- 固定Unity验证18组78断言:真实PlayerData四种恢复分支、真实Achievement/BattlePass/MiniBP/LuckyGame/LuckMagic订阅及原保存方法、多key原票据确认;Unknown/401/部分提交/存储失败/30秒超时及Tween生命周期边界。最终证据KVGameplayLoopTests/fishing-fixed-runs/20260924T074932_c6600abed66e46da8241eec269ea8a1d/result.json。
- 实际ConsumeBait/ConsumeBaitOnKVAsync/KVFishingCurrent方法从当前源码提取编译,27断言覆盖Pending、确认后一次继续、重复与不支持鱼种/离线/活动、await后上下文变化;视觉继续与存储为spy,不冒称真实UI。ControlSlice.cs.txt及control-source-tests-retry.log。
- 真实订阅测试使用从未Awake的PlayFab组件,固定反射临时指向实例,使原Save走已有KV分支;没有启动PF计时或网络。测试finally恢复单例、红点、本地化和容器。MiniBP活动窗口为合成夹具设置,不更改真实服务器时间。
- Unity既有回归:M01等168断言、31模块B2-20 83断言、装备9组28断言均通过。退出实际源码Editor 10组35断言、SERVICE_HOST 10组30断言通过。此前4B2全量75组1716、B3A13组544保持有效,底层未改。
- Editor编译0错误;SERVICE_HOST完整HotUpdate响应文件编译exit0。非Editor候选和换回受审源码的对照均仅在原FishingChallengeManager.cs:72报_cheatingScore不存在,不是本次引入,不改白名单外文件;不能写成默认player编译成功。默认PF预处理差异只有using与Tween局部变量接收原返回值,没有改旧消费语句。
- 写批次记录保留值hash和原顺序,Confirmed审计输出最终key/sequence/hash。动作每进程只创建一次,引用身份等价于本期固定一次动作版本;不增可重置配额。
检查点3准备:仅正式登录2次+Get2次只读备份,Set/Delete=0。102仍45键,energy403、energyRM102、倍率索引4(离线配置候选费用10),101空。预计写键/存在性/允许变化字段/config hash见real-preflight-matrix.json,备份SHA B43CC4AB7E55B72AF46D76F082AD612F7994C7CE63272A7C526E714355027723。运行时仍须再次核Tables、费用、MaxEnergy、活动状态;不以离线预检代替。102不重复导入,claim不得删除。只开一次普通抛竿至可拉杆,然后正常退出、新进程恢复;不点击拉杆或领奖。
检查点3实跑发现:已完成消费后的正常UI销毁误报取消
Unity129848一次真实抛竿,2026-09-24T07:55:50Z:403→393,energyRM102→112,主档原sequence4与战令任务原sequence3均Confirmed;随后显示btn_draw,未点击鱼钩/领取。运行前后活动sentry/Scope快照完全一致。通过正常QuitStage请求退出后,先发生FishingBehaviorB.OnDisable,后发生Loop关闭;当前CancelFishing只检查Ready,因此已Continued动作被误报Fault。07:56:07Z closed,playing=false;不是保存失败或二次扣费。
编码前裁决:方案§3.5要求撤销对象继续资格;消费进行中/等待中需要Fault,已确认且已继续的动作正常结束不再属于等待状态。批准在原白名单CancelFishing内将Fault条件收窄为Ready且尚未Continued,始终保留Cancelled标记、进程一次配额及未完成消费的Fault行为。新增实际OnDisable方法的完成后取消回归,先留红测。此修订落实既有生命周期合同,不扩大功能或修改退出/底层。当前实跑不记无异常通过;修复后以合成回归+新进程只读恢复验收,不重扣、不补档、不删除claimed。
已完成动作取消修复的验证
原固定OnDisable回归先失败(normal-disable-red.json),单条件修复后19组81断言全部通过(normal-disable-green.json),编译0错误270警告。真实退出还出现AStage.UnloadActAsync NullReference:栈显示此次Fault引发ExitKVGameplayLoopAsync再次SwitchStage,与原正常Quit并发;不能省略为仅提示文字。修复完成后OnDisable不再发Fault,消除此处重复退出触发;未改Stage框架。首次真实run两条Error保留(real-final-errors.json),该修复尚未在第二次真实消费中验证,不重扣来掩盖首跑问题。
正式只读对账:101空且未变,102仍45键,恰好2键变化。NewPlayerDataDic仅19槽中的3(403→393)、9(102→112)变化及ad的消费成就102→112/日期114→266;其他主档字段不变。BattlePassRecordTask每日10003、每周20001各0→10;其余43键逐值相同,最终两键hash与原Confirmed审计一致。见real-after-consume-diff.json。前后活动状态快照一致;无活动激活/额外键,无鱼获或奖励。
Unity编辑器进程关闭工具限制
游戏已先通过QuitStage完成closed并停止Play。随后使用uloop launch --quit请求正常退出编辑器:沙箱内首次EPERM;经权限放行后CLI发送正常退出信号,10秒未退出,工具自动降级强制结束进程129848。本会话没有显式请求force,但必须按工具真实输出记录,不能声称编辑器进程正常退出。见unity-normal-quit-process-approved.log。该动作发生在服务器对账、Owner排水和游戏closed之后;新进程恢复仍可验证服务器存档,但“编辑器进程优雅退出”不计通过。后续不重复使用这个自动强制退出行为,恢复验证后保留编辑器空闲即可。
检查点3完成与检查点4交付(2026-09-24)
新进程41828的CLI恢复连接后,登录前run/claimed不存在;恢复energy393、energyRM112、消费成就112、战令每日10003/每周20001各10,货币鱼竿不变。正常QuitStage closed,playing=false、ready=false、error=null、Console Error0。最终只读备份101空、102原45键与消费后全部逐值一致,无二次消费。permit两份归档,5个claimed保留;编辑器空闲,不再调用带自动强杀的quit工具。
检查点4交付验收报告、作者自审与独立实施复核提示词,生成受审hash。首次真实退出错误、修复红绿证据、编辑器自动强杀及默认非Editor既有编译错误均保留。当前责任在独立评审侧;主会话收到后逐项裁决才能关闭4C1。无新许可、无下一阶段实施批准、无打包。
检查点5~7:独立实施复核裁决与关闭
主会话在共享文档更新前核172/172受审hash一致,Q1~Q8及四P3逐条裁决,正式关闭限定4C1。详见关闭裁决。首跑退出错误、修后未二次收费、Editor强杀、非Editor既有编译失败均保留。恢复run包含同值登录保存受理,不泛称只读。本轮仅文档关闭,无源码修改、重跑或服务器请求;下一步主会话准备后续完整方案。