7.0 KiB
R1:102数据准备与cdTime最小兼容方案(待审)
已完成的补充
M24独立补充审查81项hash一致,已逐条裁决并实施登录期单例注册。V-1固定编译宿主通过9组28断言:同步嵌套原票据、全部Confirmed、Superseded停止、Flush水位、401不重认证、Unknown不重发、关闭不Flush、越权key/失效读取拒绝,以及M24同一单例/容器恢复。未改CLI Restricted规则,实际调用只允许固定case。原B3A/31模块Unity回归也通过,首败与修正均保留。R1仍未完成真实闭环,V-4待真实验收。
1. 数据选择已收敛:102原档,不造数据
依用户允许沿用101/102并选择合适方式的授权,已只读备份本项目实际登录PF标题108EE8的数据:101为55键、102为45键。CreateAccount=false;未创建账号、写PF、写KV或保存SessionTicket。空闲Editor的PlayFabSettings标题6DC6D与持久覆盖配置不同;按GConfig最后应用持久配置、UserService登录前覆盖标题的源码,读取108EE8,未访问6DC6D。
既有KV备份两账号均空。PF102拥有RodData中的20001、30003,RodLevelData分别为3、10;当前装备20001,拟从真实鱼竿面板装备已有30003。不提升等级、不发货币、不购买、不抛竿。
PF102源文件:KVGameplayLoopTests/pf-source-backups/20260924T041802Z/102.json,SHA256 827F36084648449CEFAFB96B3CE62093DF70B8A87E33A526DA5B03A9C135A377。102空KV备份:KVGameplayLoopTests/backups/20260924T035000Z/102.json,SHA256 A4DA163C8E53A171AA74485F2DCA4FE92303F7E6A8573A5FFDBB90A711B1F402。
本地Schema只读预检使用明确标注的离线合成描述符和当前UTC/项目配置,未Open/Apply或发布句柄,不代表真实认证成功。结果:101有3个错误(M04广告时间、M15的JSON null、M22的selections null);102只有M04字段5一个错误。证据KVGameplayLoopTests/pf-source-schema.json。选择102可避免本轮扩大另外两类兼容修订。
2. 根因与唯一代码修订申请
102中VIPAdPackData为:
{"ID":0,"index":0,"day":264,"cdTime":null,"isOpen":true}
这是现有业务可产生的数据:AdvertData.cdTime是可空string;PlayerShopData每日刷新明确赋null,OpenVIPAdPackData创建新AdvertData后未赋时间即序列化保存。现有GetVIPAdPackTime用TryParseDateTime处理该值。新Schema的Advert函数却一律执行String(o["cdTime"]),拒绝JSON null。
建议保留102原值,改解码约束,禁止改档躲过校验。 仅修改Client/Assets/Scripts/Services/PlayerData/PlayerKVSaveSchema.cs的Advert方法这一参数:
o["cdTime"]?.Type == JTokenType.Null ? null : String(o["cdTime"])
其他参数、字段类型、每日逻辑、序列化、UI、经济算法保持。只允许“字段存在且值为JSON null”或原有字符串;缺字段、数字、布尔、对象、数组继续Malformed。PlayerKVAdvertValue.Time与ReplaceFromKVDecoded已能原样携带null,无需改模型/模块。不得把JSON null转换为空字符串、删除VIPAdPackData、放宽全局String helper或批量容忍其他模块null。
这是已关闭4B2 Schema的新增兼容差异,超出R1现行源码白名单,因此尚未修改,须本方案独立评审与主会话裁决后实施。新增白名单仅上述一个方法,以及KVGameplayLoopTests内专项测试/导入核验工具;原R1白名单继续有效。
3. 测试与通过条件
- 使用生产DecodeShop:本次真实JSON null样例应通过并保留Time=null;原有普通/空字符串通过且原值不变;缺字段、数字/布尔/对象/数组仍拒绝;ID/index/day/isOpen原严格检查不变。
- 同一份102源备份、未改一字值的45键完整Schema预检须Valid,31模块齐全。随后重跑4B2离线与Unity M04相关固定用例/完整B2-20;固定装备链9组、许可测试、编译保持通过。101额外两项问题继续记录,不在本修订中修复。
- 仅当以上通过,使用真实s101账号响应/服务器时间重新核验导入候选;不能把离线合成描述符当运行凭证。
4. 102一次性初始化的具体范围
机器清单:KVGameplayLoopTests/102-import-proposal.json,列明45个实际key、每个原始字符串的UTF-8字节数/SHA256、空KV前值、恢复删除集合。源字典字符串逐值复制,不更改VIPAdPackData或任何业务值;101不写。目标固定http://s101.local:18080/、账号102。
本方案评审通过及主会话裁决后,再依用户继续指令执行这份明确范围;目前清单状态为proposal,不实施导入。允许沿用账号的授权无需重复索取,但不能把模糊账号许可扩展成任意数据改写。
导入步骤:
- Unity保持停止;重新登录102并全量Get,要求仍为0键,重新保存空档备份及摘要;若非空,停止,不覆盖。
- 校验PF源文件及45项摘要,记录此次目标/实际请求key清单;调用现有PlayerKVClient.SetAsync写入这45键,禁止额外键、PF写或自动重试。
- 不论响应结果如何,保留原始结果;若MayHaveCommitted,先Get逐项核对实际提交状态,不把Unknown当失败重发。无法确认则停止游戏验收。
- 全量Get逐值确认45键、无额外键、原字符串完全相同;保存真实KV导入后全档备份,以该备份生成运行许可。初始化/装备运行允许key先限定这45个;遇范围外自动写按R1原合同停止并记录,不临时扩权。
- 真实游戏前按实际会话、真实服务器时间和快照进行原正常Decode/Apply。装备20001→30003需全部原票据Confirmed,然后正常退出、重启Unity进程并使用新缓存,从服务器恢复30003。完整运行前后关键字段摘要需核对。
恢复方式(主会话负责,保留执行记录):需要恢复导入前空KV时,仅Delete清单列出的45个新键,再全量Get确认空;若发现清单外键或非本次运行可解释的变化,停止核对,不全库清空。测试成功默认保留102验证结果,不自动删除。PF原档始终不写。
5. 独立评审提示词
请审查本次唯一Schema差异与102具体初始化范围,先核对KVGameplayLoopTests/102-compatibility-review-hashes.json,阅读补充裁决、PF源Schema诊断和导入proposal。核实cdTime=null是否确为既有合法业务输出、局部nullable解码是否保留严格类型及其他模块边界;检查45键逐值导入/空基线/Unknown观察/精确恢复是否足够。
请只新增《阶段4最小真实玩法闭环102数据与cdTime兼容独立审查-2026-09-24.md》和自有证据,不改共享源码、入口/TODO/开发日志。分别给出“是否批准单方法兼容修订”“102初始化方案是否可执行”,列具体P1/P2/P3;无需重审M24或已通过的V-1,也不能将此视为R1实施关闭。
不申请全游戏迁移、101其余null兼容、通用迁移框架、消费4C、热换号或打包。用户优先先跑起来和最少业务改动,本方案只修一个与真实合法存档不符的解码约束。