Files
ft/CodexOutput/upserver/B3BatchMigration/M2/M2-C3c审查主会话裁决与资料缓存实施边界-2026-09-30.md
Liubing\LB 6813da149a feat(upserver): 保存M2客户端KV迁移至本人统计写检查点
保存独立KV用户服务、固定会话存档与原业务接线,以及C3d资料缓存和C3e本人统计写。
保留原PF/AGG路线、业务公式和时序;榜单读取、好友资料、公告、匹配及首场景闸仍待完成。

验证:ServiceHost两条件各33组646断言;Unity CLI Loop编译0错误269警告。
包含相关方案、评审裁决、测试及状态文档。未操作服务器、正式账号或打包。
2026-09-30 19:19:05 +08:00

42 lines
4.8 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.
# C3c 审查主会话裁决与资料缓存实施边界
> **用户最新要求覆盖下文开工裁决:所有相关内容审核通过后才可编码,未确定内容先与用户确定,再交审核端。** 本文件中“仅本地缓存可先实施”“本次允许范围”等开工许可全部撤回,下面保留为历史分析,不作为编码依据。生产及测试代码尚未修改,C3ProfileCacheTests.cs尚不存在;统一基线28/28再次核验一致。当前状态为C3c未完整通过,禁止先做局部编码。
2026-09-30。用户要求“审核更新,确认一下,然后编码”。开工前已全文核对独立报告及相关生产源码。
## 核验
- 独立报告SHA256:E8B04A3686CC049479F8C9CB9A355284DD47BB76FE7CF8DF253E2134C4917795。
- 统一受审清单SHA256:7ACC6338C044B8A6E503DEEC5256AE81589549C4E8872220EC63876B91E3A6EA,28/28长度/hash一致。
- 原C3c清单SHA256:541DA9BB36AE7F9F3EE33C96489D05EC85729930E2C43C7EFB50AD3C9EC13F2C,主会话另外实际复算31/31一致。报告中的“间接核验”不当作独立重算31项的证据。
## 逐项裁决
| 项 | 主会话裁决 |
|---|---|
| R1 | 接受原行为核对及好友空Profile/Statistics跳过、JSON字符串项两点。null LastLogin.Value实际抛InvalidOperationException,并非报告写的NRE;不影响不能伪造时间的结论 |
| R2 | 接受未批准LevelB读写目标替换。无接口证据不能自行恢复已撤回暂存方案;不修改LeadboardData |
| R3 | 接受好友LevelB/LastLogin差异与榜聚合缺证据。当前不改FriendService或DTO,不把普通Level填分数 |
| R4 | 接受时间来源未裁决。纠正“沿跳过/null语义”歧义:原仅跳过缺Profile或Statistics,不跳过缺LastLogin;不得扩大过滤以掩盖问题 |
| R5 | 只接受可独立实现的资料缓存形状/默认值恢复。远端异步查询与成功事件需要实际数据源,不能留空async方法或发假成功事件冒充完成;公告、匹配不编码 |
| R6 | 按下面三文件边界实施本地可确认部分,不继承撤回的五测试文件名单,不新增抽象。远端未命中路径继续明确未完成 |
## 本次允许范围与前后对照
生产唯一文件:Client/Assets/Scripts/Services/KVUserService.cs,仅GetPlayerLv、GetPlayLv、GetPlayInfo。
1. GetPlayerLv:对齐原PlayFabUserService的缓存读取,缓存有值就原值返回,否则1。原KV本人直接读PlayerData/未知返回-1改为原缓存合同;SetPlayerLv仍在本人写入缓存时取真实PlayerData.lv,不修改该方法。null参数沿Dictionary原异常,不增加容错分支。
2. GetPlayInfo:空ID返回null;缓存命中返回同一对象;未命中创建原默认昵称占位并缓存。本人分支用已有认证资料在同一对象填name/avatar并按原版同步发布GetClubPlayInfoEvent,后续命中不重复发布。当前本人每次new对象且不发布事件的差异消除。
3. 他人GetPlayInfo:仅恢复已审同步占位引用;远端异步更新/事件不能在无数据源时实施,明确保留TODO且不发假事件,不接SearchFriend,不新增Provider或空异步实现。本项仍不是他人资料全链完成。
4. GetPlayLv:必须与GetPlayerLv的默认1解耦,否则未加载他人会被误报成功。保留现有已授权本人直读路径(完整原网络替换尚未批准);缓存命中按原值返回,包括已有负数,不新增归一化。未知他人保留现有明确InvalidOperationException;不提前改成KeyNotFoundException假装已做网络查询。原PF该异常发生在远端失败之后,必须连同真实远端读取一次迁移。此处对报告“异常形态立即对齐”建议限定接受,避免新增虚构请求/结果。
5. SetPlayInfo(string,string,string)按原PF行为替换缓存对象、不发布事件,保持原样。不自行改成更新已有引用或新增事件。
测试两文件:CodexOutput/upserver/KVGameLoadTests/ServiceHost/M2MergedGameplayTests.cs(接入已认证101/102合成场景);同目录新增C3ProfileCacheTests.cs(真实KV与PF服务对照)。不改宿主SDK夹具、项目文件或其他生产类。
## 验证与剩余项
- 红测先证明原KV缓存默认值/对象/事件差异;改后运行完整ServiceHost NON_ANDROID及ANDROID+AGG,原PF对照保持。
- 验证默认1不污染异步查询、缓存值含0/负数、null/空ID、本人缓存引用与事件次数、原SetPlayInfo替换规则、ClearPlayInfos、KV SDK计数不增加。必须使用真实已认证KV服务而非反射伪造授权。
- Unity仅CLI Loop编译;无Play、正式账号请求或打包。测试结果另记检查点,不用合成测试宣称远端资料功能完成。
- 其余C3c接口问题继续集中保留,不因完成少量缓存代码宣布首场景可放行。本轮不修改服务器、配置、场景、原奖励或业务消费者。