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

62 lines
6.3 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 隔离边界修订与复审确认
2026-09-30。按用户“更新一下审核,重新确认”,结合原ZCode第三轮意见与实际跨账号探测,形成本次统一补充。原独立报告不由开发侧改写,本文件供审核端确认修订后的完整方案边界。
## 一、已确认的本人KV合同
`Client/Assets/Scripts/Services/PlayerData/PlayerKVClient.cs:36`的GetAsync只有keys/token,请求POST playerdata/Get,身份来自当前认证会话。正常请求示例:
```json
{"keys":["LastLoginTimeUtc","LevelB"]}
```
示例只说明请求形状,不承诺这两个键目前已有值。**不要传playerId、playFabId或userId选择其他账号。** 原客户端未传这些字段,不存在需要删除的生产参数;此前添加参数仅在用户明确要求的只读探测中使用,没有写入生产代码。保留keys,不能把“去掉玩家ID参数”理解成删除所需键名或认证会话。
实测101请求102、102请求101,各用JSON三种目标ID参数及query playerId,8/8 HTTP200且只返回本人数据;本人前后摘要稳定。正常无目标参数的本人读取也已成功。因此无需再次测试删除参数能否读取本人,也无需为此新增迁移代码。
第三轮审查将Get/Set/Delete均限定本人账号,本次接受该合同边界;**网络实测只覆盖Get**,没有跨账号写入或删除测试,不能把它们写成已实测。结论不外推服务器没有其他公开资料接口。
## 二、对第三轮意见的逐项确认
| 第三轮意见 | 开发侧确认及实施限制 |
|---|---|
| 禁止客户端按目标ID逐个读他人KV | 接受;不扩展PlayerKVClient,不切换/冒用好友登录会话,不增加客户端跨玩家KV接口 |
| 好友、他人资料由服务端内部读取KV后返回 | 接受职责方向;客户端消费已有好友/资料路由,仅做调用与DTO映射。服务端内部实现由对应开发侧处理,本客户端Agent不改服务器代码 |
| LevelB写本人KV,供服务端聚合/资料读取 | 接受作为原统计能力的迁移方向;原计算、触发点、两统计名、调用者时序及错误语义保持。此项修订原R2中完全禁止本人KV统计写的旧方向,不恢复已撤回的临时副本+通用Flush方案;具体写入合同仍须审清 |
| 排行榜前50由服务端聚合 | 接受;不枚举玩家、不客户端拼榜、不把活动榜当等级榜。具体读取路由、统计名与结果映射仍待事实 |
| 公告/匹配走全局内容及协调接口 | 接受方向;保持原消费者和匹配时序,不猜私有键、不以结束匹配冒充迁移 |
| 整体审核通过后编码 | 继续执行;方向确认不等于完整接口、字段和文件边界都已获批 |
第三轮表中“客户端不新增跨玩家读取逻辑”应理解为不新增直接跨账号KV读取;已有好友搜索等业务请求仍然按原协议传目标UserID,不能误删friend/SearchFriend的PlayFabId参数或其他业务目标字段。
## 三、好友/公开资料的逐字段映射边界
这些是原消费者要求,不是声称服务器已新增的响应字段。返回可以采用兼容DTO,必须有实际协议或服务端确认后确定准确字段名。
| 原PF消费值 | KV业务返回必须提供的同义数据 | 当前证据 |
|---|---|---|
| FriendPlayFabId / PlayerProfile.PlayerId等玩家身份 | 目标新UserID;旧playFabId字段名可保留 | 好友列表与SearchFriend对101/102目标ID已实测正确 |
| DisplayName / AvatarUrl | 原昵称/头像资料,保留原默认昵称和事件流程 | 字段存在;SearchFriend样例内容为空,不据此宣称真实KV资料已投影 |
| Statistics中Name=LevelB的Value | 原触发点更新的同一复合统计分数 | 当前好友/SearchFriend未返回;普通level=1不能替代 |
| Profile.LastLogin | 对应好友的原语义时间,沿已定KV阶段方向核返回 | 现有样例未返回,源账号LastLoginTimeUtc也缺;不得伪造或改过滤 |
| GetPlayLv读取的Lv | 目标玩家普通等级,与复合LevelB区分 | SearchFriend返回1,本人KV分别62/60;数据来源/同步关系待核,不直接采用错误值 |
原Profile/Statistics为空时跳过整条、LastLogin为空时保留原异常表现、列表排序/名次/事件/AGG顺序均不改。既有每日初始化先消费旧LastLoginTimeUtc再保存当前值的时序保持;第三轮提议服务端读取该键,不自动证明它与PF最近登录时间全部等价。缺键、值存在时的投影与更新时点须明确,不能为了补字段改变每日刷新逻辑。
## 四、本次复审只需收敛的事项
1. **本人统计写**:本人KV作为原统计持久化来源的实际键/序列化、全球与地区写入顺序及一次原调用的完成/失败映射;不得未经评审引入刷新无关存档、额外等待或重试。
2. **好友与公开资料**:GetFriendsList/SearchFriend等既有业务路由的LevelB、LastLogin、普通等级字段、缺键和失败返回;源数据与服务端响应是否同义。已有路由和目标ID成功事实无需重审。
3. **等级榜**:全球/地区统计的读取入口、前50、StatValue/Position/UserID及资料映射;保持原已知语义,不凭空添加同分规则。
4. **公告和匹配**:准确的现有替代入口及原结果映射。继续属于本次迁移目标,不默认停用或延期。
以上集中在同一C3c完整审查,不再要求用户重新决定是否使用KV、新ID或好友时间阶段方向。涉及服务端字段事实的部分需准确证据,不能由审核意见或客户端代码猜出来。
## 五、交付与下一步
请审核端在原报告中明确:本文件一至三节是否准确;第四节各项最终合同与允许文件/方法;是否已达到**整体可编码**,未达到则只列具体事实缺口。当前只记录方向和实测,未冒充整批PASS。
证据:跨账号Get脱敏JSON及结论、SearchFriend脱敏JSON及结论、当前PlayerKVClient源码、原ZCode第三轮意见,统一登记在本次复审增量hash。早先“SearchFriend仅离线”“好友时间待DB/KV重选”“客户端加目标ID读取KV”的旧叙述均不再作为当前执行依据。
本轮没有新网络请求、生产/测试代码变更、服务器修改、Play或打包。完整审核门槛保持。