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

60 lines
8.2 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.
# 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等不凭无引用删除,改名仍待整体迁移后。