Files
ft/CodexOutput/upserver/B3BatchMigration/M2/M2-C3d资料缓存用户澄清与实施记录-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

47 lines
6.9 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.
# C3d 资料缓存:用户澄清与实施记录
2026-09-30。依据原ZCode第五轮范围性审核,以及用户本轮明确确认:“暂不改变其对外行为和接入远端查询”。此为原C3c已审子范围的实施检查点编号,不新增审核轮次。
## 开工裁决与精确边界
- GetPlayLv的“不动”指保持修改前外部行为、暂不接远端等级查询;允许同一文件内最小解耦取值。本人已认证时仍读PlayerData.lv,他人仍读现有缓存,缺值仍用内部-1判定;原level>=0成功、否则失败Task/InvalidOperationException保持。null/空ID、负数结果不顺手修正。
- GetPlayerLv恢复原PF同步缓存合同:仅查缓存、缺键1;缓存0/负数保留,null沿原Dictionary参数异常。SetPlayerLv保持原实现。
- GetPlayInfo恢复原空ID、缓存同一对象、缺项默认名占位;本人用已有认证资料同步更新并发一次事件。他人通过已有FriendRequest("SearchFriend", SearchFriendReq.PlayFabId=目标UserID)异步更新同一对象,Code>0且Info!=null才更新并发事件,空昵称保留默认名。不得把响应普通Level写入levels缓存或提前接GetPlayLv。
- SetPlayInfo(string,string,string)与ClearPlayInfos按原替换/清空规则,不发额外事件。远端填充如需私有重载,其唯一调用点为GetPlayInfo,作用是保留原async void更新顺序;不新增抽象层。HTTP失败沿CustomServerMgr日志/null,坏JSON映射读取失败日志而不发成功事件,不吞其他编程异常。
- 生产只改Client/Assets/Scripts/Services/KVUserService.cs上述方法及必要私有填充重载。测试只改ServiceHost/M2MergedGameplayTests.cs并新增C3ProfileCacheTests.cs,复用现有真实KV登录与PF类、内存HTTP/SDK哨兵;不修改PF/AGG源码或SDK夹具。
- 四项服务端能力、LeadboardData/FriendService/FriendModel/TileNewsManager/Duel/PlayerKVClient、LastLogin、首场景双闸保持原状。真实runtimeVerified不置true。无服务器修改、无正式请求、无Play/打包。
## 验证计划
红测先验证缓存默认值、对象引用/事件及异步资料更新差异,再改生产;对照真实PF服务缓存行为。覆盖101/102已认证场景、未命中1但GetPlayLv仍失败、本人直读不变、0/负数/null/空ID、成功及失败响应、不将SearchFriend.Level当作已取等级、重复请求/引用、替换与清空、KV相关SDK调用0。完整ServiceHost运行NON_ANDROID及ANDROID+AGG,最后只用Unity CLI Loop编译。
开工核验:原28项、31项基线及第五轮报告hash重新核对;用户澄清消除上次记录的约束冲突。当前记录先于任何本轮生产/测试修改,具体红绿结果与交付范围随后追加,未运行部分不标完成。
## 红测检查点
NON_ANDROID完整宿主在真实KV101已认证场景报告17项预期迁移差异(默认值、本人引用/事件、远端占位与请求/发布);退出码1。真实PF缓存/SDK对照先行通过;生产尚未修改。首败日志M2-C3d红测-NON_ANDROID.log保留。GetPlayLv当前未加载/本人直读/负数边界检查通过,后续须保持。
## 实施与离线回归检查点
生产仅KVUserService.cs:GetPlayerLv回到原缓存默认1;GetPlayLv独立按原本人/缓存/未知路径取值,负数和未加载仍为原失败Task,无远端等级查询。GetPlayInfo复用原占位对象/本人事件和私有async void填充方式,他人改走已存在SearchFriend并只消费昵称/头像;不写入等级缓存。SetPlayerLv、公开SetPlayInfo替换规则、ClearPlayInfos实现保持。私有填充重载只有GetPlayInfo一个调用点,承担原异步更新,不新增抽象层。
新增C3ProfileCacheTests及M2MergedGameplayTests的合成登录接入,共三组新增测试(真实PF参考、KV101、KV102)。最终NON_ANDROID与ANDROID+AGG分别24组491断言、0失败、formalRequests=0;全套原宿主用例仍执行。测试使用真实服务和内存HTTP,不能视为线上资料来源已验。
本轮遇到并处理的验证问题:
- 首次绿测HTTP500返回null时,JSON.NET对null输入抛ArgumentNullException;在该接线处沿原失败null路径返回,不发成功事件。补充空响应/坏JSON用例。首败日志保留。
- 原存档用例StorageError追到UnauthorizedAccessException;默认临时目录及工作区临时目录均复现,同代码沙箱外完整回归通过。未改存档实现、未跳断言。临时FirstChanceException诊断代码已移除,仅保留日志。
- Unity首次编译暴露真实PlayerData.lv为ObscuredInt而宿主为int,已在复制原取值表达式时显式转换int;保持原返回值语义,未改PlayerData或SDK。首次1错误/269警告证据保留。
- CLI曾因Node子进程EPERM失败,不能算编译通过;改在工具批准的沙箱外运行同一CLI。常规编译成功报告0错;一度误用Assembly-CSharp.dll检查时间,后查HotUpdate.asmdef确认该代码实际属于HotUpdate.dll,其17:44:09产物晚于最终源码17:44:01。纠正该判断,并完成已触发的强制编译和后续错误日志核对。
- 最终源文件中重复的空响应检查已清理;上述两条件491断言均在清理及显式转换后重新完整运行。Unity最终结果另附。
源码范围核对:开工2120项C#基线中仅KVUserService.cs、M2MergedGameplayTests.cs改变,新增C3ProfileCacheTests.cs,其他2118项保持。项目/SDK夹具、原PF/AGG源码、四项挂起能力和首场景双闸未改。未修改服务器、未发正式请求、未Play/付费/打包。未进行git提交或回滚既有改动。
## 最终验证与限定完成
- 最终ServiceHost NON_ANDROID、ANDROID+AGG各24组491断言、0失败,日志formalRequests=0;新增三组,未跳过原回归。
- Unity CLI Loop常规编译Success=true、ErrorCount=0;强制编译返回Success=null并要求取日志,该null不当作成功证明。随后get-logs按error CS[0-9]+筛选结果TotalCount=0,编辑器playing=false、compiling=false;实际HotUpdate程序集覆盖最终源码。Console总错误174条中保留已有故障验证等日志,不声称整个Console清零或真实场景通关。
- 首次Unity类型错误269条警告、HTTP失败映射异常、沙箱文件/Node进程权限失败等首败证据保留;没有隐藏失败。曾查询不支持的editor-state帮助,已改用CLI只读execute-dynamic-code确认状态;未使用UnitySkills。
- 本C3d子批的已审实现和离线/Editor验证完成。GetPlayLv仍没有新远端查询;四项服务端能力、真实首场景及跨进程保存恢复、渠道/Player和C4最终审查尚未关闭。临时冻结仍须在最终通关前恢复,命名/旧业务修正仍留整个迁移完成后另行授权。
- 不新增逐功能送审,不再将已澄清的getter边界作为阻塞。后续四项按服务端实际交付合并原C3c合同裁决与接线;本次日志和overlay只记录获审范围,不冒充整个M2完成。