Files
ft/CodexOutput/upserver/阶段4最小真实玩法闭环-102数据准备与cdTime最小兼容方案-待审-2026-09-24.md

66 lines
7.0 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.
# 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为:
```json
{"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方法这一参数:
```csharp
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. 测试与通过条件
1. 使用生产DecodeShop:本次真实JSON null样例应通过并保留Time=null;原有普通/空字符串通过且原值不变;缺字段、数字/布尔/对象/数组仍拒绝;ID/index/day/isOpen原严格检查不变。
2. 同一份102源备份、未改一字值的45键完整Schema预检须Valid,31模块齐全。随后重跑4B2离线与Unity M04相关固定用例/完整B2-20;固定装备链9组、许可测试、编译保持通过。101额外两项问题继续记录,不在本修订中修复。
3. 仅当以上通过,使用真实s101账号响应/服务器时间重新核验导入候选;不能把离线合成描述符当运行凭证。
## 4. 102一次性初始化的具体范围
机器清单:`KVGameplayLoopTests/102-import-proposal.json`,列明45个实际key、每个原始字符串的UTF-8字节数/SHA256、空KV前值、恢复删除集合。源字典字符串逐值复制,**不更改VIPAdPackData或任何业务值**;101不写。目标固定`http://s101.local:18080/`、账号102。
本方案评审通过及主会话裁决后,再依用户继续指令执行这份明确范围;目前清单状态为proposal,不实施导入。允许沿用账号的授权无需重复索取,但不能把模糊账号许可扩展成任意数据改写。
导入步骤:
1. Unity保持停止;重新登录102并全量Get,要求仍为0键,重新保存空档备份及摘要;若非空,停止,不覆盖。
2. 校验PF源文件及45项摘要,记录此次目标/实际请求key清单;调用现有PlayerKVClient.SetAsync写入这45键,禁止额外键、PF写或自动重试。
3. 不论响应结果如何,保留原始结果;若MayHaveCommitted,先Get逐项核对实际提交状态,不把Unknown当失败重发。无法确认则停止游戏验收。
4. 全量Get逐值确认45键、无额外键、原字符串完全相同;保存真实KV导入后全档备份,以该备份生成运行许可。初始化/装备运行允许key先限定这45个;遇范围外自动写按R1原合同停止并记录,不临时扩权。
5. 真实游戏前按实际会话、真实服务器时间和快照进行原正常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、热换号或打包。用户优先先跑起来和最少业务改动,本方案只修一个与真实合法存档不符的解码约束。