Files
ft/CodexOutput/upserver/B3BatchMigration/M2/M2-C3e本人统计写裁决与实施记录-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

8.2 KiB
Raw Blame History

C3e 本人统计写裁决与实施记录

2026-09-30。C3e为原C3c内的实施检查点,不新增评审轮。依据原ZCode第六轮R2-S附条件许可与用户“继续”,先核原21项增量及2121项源码,再开始测试/生产修改。

开工前逐项裁决

  1. C1采纳:本人LevelB及合法地区前缀LevelB,原分数InvariantCulture十进制字符串。其本身就是统计数据,不另建快照、读侧真值或改公式。
  2. C2采纳KV分支同名去重,缺地区时原SetLvData生成两个LevelB,仅写一次。审核称PF重复统计“净效果相同”缺少线上证据,本端不将其写成实测事实;执行的是已明确批准的KV缺地区单键边界。唯一现存调用者给同名键相同值,不扩展通用统计规则。
  3. C3采纳原服务错误日志后正常结束,保留参数/编程错误原传播。原包装器错误回调返回null不等于“任何情况下从不抛出”;不依据该绝对表述增加catch-all。真实PlayerKVClient已把HTTP/网络/IO/取消等转为结果,store消费结果并捕获取消;按返回失败逐项日志,不引入新的传输层异常处理。若实际验证出现文档化的未映射服务失败,在本文件必要范围修正并留首败。
  4. C4采纳:捕获本次store,至少一项接受则await一次既有FlushAsync;全部拒写只记错。刷新其他pending及完成时点差异登记为本轮获审接线差异,不声称与PF单HTTP请求完全一致;不新增选择性刷新接口。
  5. C5采纳:逐键拒写记录键与错误;Flush非Confirmed记录此次键集合和状态,不能由批量结果推断每键远端成功。部分接受/确认、Superseded、注销均不加补偿、锁、重试或回退。原子性不作假设。
  6. C6采纳:生产唯一DataCenter.LeadboardData.cs,只改SetLeadboardData的KV分支及using。SetLvData/AwaitSetLvData、公式/clamp/lv回写、触发点、读榜、活动榜零改动。原完整参数列表先构造,保留长度错误发生在写入前。PF/AGG分支保留。
  7. C7采纳:旧PF Last/Max/Sum及重置配置仍为读侧联调确认项,不据建议直接称Last已证实;不阻塞本次获审写入。榜读、好友、公告、匹配、LastLogin、双闸和转场注销处理均不顺带修改。

测试边界按原申请及本轮“按候选”批准:ServiceHost.csproj链接完整真实LeadboardData;C3IdentityCompatibilityTests去除同名常量替身、补原item编译签名;Stubs补必要未执行业务/引擎签名及PF请求记录;Program接新测试;新增C3StatisticsWriteTests。M2MergedGameplayTests/C3ProfileCacheTests原断言不动,不新建生产测试层。红测应证明KV错误落入PF,再编码、双条件完整回归、CLI Loop编译。无线上请求、Play、服务器操作或打包。

检查点

本节后续追加核验、红测、实施与验证结果。测试/编译未运行前不写通过;临时路径在全迁移最终验收前恢复,命名与原业务修正留迁移完成后。

开工核验:原增量21项中20项原字节一致,仅原报告新增第六轮;当前报告SHA256=FAEC69EF05B6A2E9D9C854466868AF0EE6B513DD23C27E19E784E7B8084BD526。2121项C#源码基线全部一致。以上裁决已在代码前记录,开始获审测试输入与红测。

红测检查点:完整真实LeadboardData入宿主后,首次编译缺活动分支PlayerPrefs整型及ChangeSource签名,仅补测试壳(意外调用抛错),未改生产。随后NON_ANDROID完整宿主原用例和PF/AGG统计对照通过,新增KV断言按预期失败:KV statistics must replace PF with existing store;退出1,日志保留。现开始唯一获审生产方法。

实施与验证检查点

生产仅SetLeadboardData新增21行KV分支及两个using:原参数列表构造后捕获store,同名键只写一次;每项沿原值转InvariantCulture字符串;至少一项接受才await一次现有Flush,拒写及非Confirmed记录日志,随后返回原调用者。未加新类/接口、catch-all、重试、回退或闲置辅助实现。SetLvData、AwaitSetLvData、原算法/上限、PF/AGG请求、活动榜、读榜和UI完全未修改。

最终NON_ANDROID及ANDROID+AGG各33组646断言通过,formalRequests=0;原24组491断言继续执行,新增9组155断言。真实完整LeadboardData入宿主,无复制统计算法;原PF/AGG请求参数及错误log/null任务完成为SDK夹具对照,包装器另由源码核查。真实KVUserService/store/handle/coordinator搭配内存HTTP验证:双键持久化及新登录读取、网络异常映射、无关pending失败随行、关闭注册表等待后换号、同键已发更新与未发Superseded、多键部分结果;不冒充线上验证。

保留的首败及修正:

  • 首次宿主编译缺活动分支依赖签名,只补获审测试壳,未改活动业务。
  • 红测按预期证明KV仍调用PF,生产修正后该断言通过。
  • 首次绿测把旧写入未结束时的新账号登录误期望为立即成功。追到Coordinator在登录前Observe关闭注册表,改为断言新登录等待、旧请求结束后才成功;两个账号使用独立模拟数据,检查所有统计传输仍属于101,不改生产会话逻辑。
  • 同键写入初测误把“已派发后更新”当Superseded。源码只替代未派发票据,因此拆成已发确认旧值/新值留待下次Flush,以及先占用派发再替代未发统计两项。后者明确断言仅地区统计持久化、全球键未确认且日志含Superseded,未用放宽断言代替真实差异。
  • 最终断言补齐后重跑两种条件,两个最终日志均为33/646/0正式请求。无需重跑其他无关宿主。

Unity CLI Loop最终Success=true,ErrorCount=0、WarningCount=269;日志全部保留,未顺手修项目警告。HotUpdate.dll时间19:13:30晚于生产源19:11:19,覆盖最终生产代码;CLI只读状态playing=false、compiling=false。没有Play、真实Player构建或打包。

本轮源码基线2121项中仅4项既有C#改变(生产LeadboardData、测试C3IdentityCompatibilityTests/Program/Stubs),新增C3StatisticsWriteTests,其余2117项一致;另ServiceHost.csproj链接真实生产文件。M2MergedGameplayTests和C3ProfileCacheTests及原KVUserService不变。精确受审边界内的git diff --check通过;保留工作树原有其他改动,不提交或回滚。源码范围见M2-C3e源码范围核验.json。

服务端集中对齐增量:客户端本人统计合同已实施

此节与《M2-四项PlayFab能力迁移-服务端开发对接文档-2026-09-30.md》一起使用,不改写该冻结提案的历史hash。

项目 已实施的客户端合同
存储 认证本人的playerdata/Set,由原store/handle/KVMgr发送,无目标他人ID
全球统计 键LevelB;例等级12、建筑34保存字符串1200034
地区统计 已知大陆码AF/AN/AS/EU/NA/OC/SA加LevelB,值同全球;未知/缺失只写LevelB,不虚构地区
更新时点 原首场景/等级变化/建筑变化及300秒延迟;公式与原clamp不变
LastLoginTimeUtc 本批未修改,继续原每日初始化后已有保存流程
聚合/好友消费 后续按以上同名键及整数语义读取;不从普通Level伪造建筑分数,不查询时重算替代原更新时间

唯一补记的历史配置确认项:原PF LevelB/地区LevelB的Last/Max/Sum及版本/重置配置是什么,服务端聚合应保持其等价语义;目前未取得配置证据,不能将“推荐核Last”写成已确认。第六轮明确此项不阻塞本次客户端写入,读取/聚合联调时集中确认,不单独再开本人写入审核。

限定完成与后续

C3e获审本人统计写接线、双条件离线验证及Editor编译完成;不是整个等级榜或M2完成。KV分支已避开UpdatePlayerStatisticsAsync,源文件保留该调用供PF/AGG使用。余下榜读/好友/远端普通等级/公告/匹配依赖实际等价合同,继续原C3c集中接线;目前不新增逐函数送审。双闸、转场Logout、匹配绕行和移动平台待最终恢复与验证;无新增临时冻结。最终闲置清理仅限本迁移造成且无消费者的实现,原BaseEventData等不凭无引用删除,改名仍待整体迁移后。