Files
ft/CodexOutput/upserver/阶段确认与阶段2启动裁决-2026-09-22.md

67 lines
6.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.
# 阶段确认与阶段2启动裁决
> 执行后更新(2026-09-22):阶段2已实现并通过42项契约/16项正式服检查、双账号清理、Unity编译及独立终审。当前结论以[阶段2验收报告](阶段2独立KV验收-2026-09-22.md)为准。下方“尚未实现/没有写删”描述的是启动时点;JSON严格程度已在验收报告明确为结构严格、兼容Json.NET扩展语法。
2026-09-22。用户要求确认阶段,“无问题遗留则下一步”。此裁决在最小登录核心实现已通过的基础上,放行**阶段2独立KV适配**,不放行游戏存档切换/SDK删除。
## 1. 当前阶段与遗留分类
| 阶段 | 当前状态 |
|---|---|
| 阶段1:PlayFab到KV映射及接口方案 | 已评审通过;本次重新核对服务端契约,未发现影响独立适配的契约变化 |
| 提前执行的最小登录专项 | 核心实现、已发现缺陷整改、限定独立复审及主要自动化验收通过;未测平台/玩法项目继续单列 |
| 阶段2:独立KV Get/Set/Delete | **已启动:契约复核与本轮实施边界评审完成,生产适配尚未实现** |
| 阶段3:缓存与可靠同步 | 未开始,等待阶段2验收 |
| 阶段4:游戏登录/玩法存档切换 | 未开始,仍用PlayFab存档 |
| 阶段5:外围迁移与实时业务完善 | SignalR基础直连/释放子集已提前完成,其余暂停 |
| 阶段6:SDK删除、最终打包/真机 | 未开始,最后执行 |
最小登录本轮四文件的当前SHA256与修复后独立审查存证全部一致;独立结论无新增确认阻塞,58项定向通过,实际Unity最终101→102→101三轮错误0、Hub Test=OK。相关证据不在本次重复运行。
**不能写“完全没有任何遗留”。** Unity完整UI网络故障/最终平台重连、主动业务推送、人工钓鱼/完整存档和最终渠道包仍待验收;历史编译/运行警告也未全部清零。它们不阻塞独立协议层的开发,却不能据此放行生产存档替换或最终发布。本次没有重新确认所有外围业务正常。
## 2. 最新契约复核
服务端仓库 C:/projects/N3-Server-CN,HEAD 858fe7c922acca77058afc9c5f31518b52e04dfc。本次只读核对Controller、Model及Service,三份契约文件无工作区差异;不据本地源码断言部署和数据库迁移已通过验收。
- POST playerdata/Get:body为{}、keys=null或空列表时全量;指定keys按本人过滤;返回data字符串字典,不存在key不出现。
- POST playerdata/Set:data必填;空字典为服务端无操作成功;正常返回HTTP200空正文。
- POST playerdata/Delete:keys必填;空列表为无操作成功;正常返回HTTP200空正文。
- [Authorize],身份由Cookie的NameIdentifier十进制ID决定。请求体不能传playerId来代替认证。
- MySQL复合键为PlayerId+K,K最大128;值为字符串;服务端未提供客户端可用的revision/CAS/LastUpdated。
## 3. 方案比较与选定方案
| 方案 | 判断 |
|---|---|
| 独立协议客户端,注入固定会话HttpClient,先专用测试 | **沿用已批准的G1方案**;范围小,可单独证明契约和持久化 |
| 直接调用全局CustomServerMgr作为KV传输 | 暂不选;其返回null合并错误,且可换会话,不满足KV明确结果/固定所有权要求 |
| 直接改PlayFabMgr并切换游戏初始化 | 不放行;缺缓存可靠性与迁移验收,属于阶段3/4 |
已有授权和G1书面方案已明确账号、边界与成功条件;本次没有新增需要用户选择的数据迁移策略,不重复索要授权。使用brainstorming方法完成上下文/选项/设计/自查,文档沿用用户指定CodexOutput/upserver位置,不提交Git。
## 4. 编码前完整评审与实现边界
允许新增 Client/Assets/Scripts/Services/PlayerData/PlayerKVModels.cs、PlayerKVClient.cs及meta;补全 CodexOutput/upserver/KVContractTests,新增独立联调宿主。现有测试目录是未完成骨架,不算实现或通过。
- 构造固定绝对HTTP(S)API基址和由调用方拥有的HttpClient,绝对请求路径;不修改共享DefaultRequestHeaders/BaseAddress、不Dispose注入客户端。保留现有Newtonsoft,不引入包。
- GetAsync/SetAsync/DeleteAsync接收CancellationToken,请求数据在发送前复制;校验键非空且不超过128、Set值不得null但允许空字符串。Get空列表全量;Set/Delete空集合按服务端无操作契约处理;null写入参数为校验失败。
- Get严格要求完整JSON对象及data对象,所有值为字符串;空正文/缺data/非法值为Protocol,失败Data=null,只有有效data={}表示空存档。Set/Delete仅200表示成功,不依赖响应正文。
- 结果区分Validation、Unauthorized(401/403)、Http、Network、Timeout、Cancelled、Protocol及状态码;不携带服务器完整正文/存档值。无自动重登、无自动写重试。写请求发出后失败需明确“结果可能未知”,不能解释为服务器一定未写入。
- 固定会话所有权:本阶段测试宿主每个账号创建独立S101AccountSession,认证后捕获其CookieContainer,建立仅此账号/环境使用的HttpClient与KV实例;生命周期结束先取消在途操作、等待结束/清理,再释放HttpClient及认证会话。不把同一个KV实例接到另一个账号Cookie,不共享游戏全局manager,不新增生产桥接。
- 独立KV层不发布全局未授权事件、不改游戏UserService。原P1-4“生产会话桥接”继续保留为阶段3/4接入前置;当前独立协议与固定测试会话方案明确,不受该未实施桥接阻塞。
主会话完整评审裁决:边界、依赖、错误、所有权与验收条件明确,沿用已批准的独立适配方案,可进入编码。无伪造时间/默认档,无全局身份替换;缓存、可靠重试、冲突解决、游戏存档切换、俱乐部、SDK删除均不在本批。
## 5. 阶段2验收门与任务
- [x] 重新核对G1、审查意见与服务器源码契约。
- [x] 固定本批文件/会话/错误处理边界,完成实施前评审。
- [x] 编写独立DTO/结果模型及Get/Set/Delete协议客户端。
- [x] 完成协议、参数、请求快照、错误分类、取消、结果未知、客户端所有权测试。
- [x] 101/102只操作本次唯一前缀key:新增/读/覆盖/空字符串/指定key/删除/不存在、同名key账号隔离、重新登录后持久化;无Cookie拒绝。
- [x] finally清理测试key并再次确认不存在,失败清理项不能遗漏或直接宣称通过。不打印真实存档内容,不写业务key。
- [x] Unity兼容编译/必要独立审查及证据落盘。通过之后才讨论阶段3;当前不打包。
本次阶段确认只完成契约复核与评审,没有新增生产KV代码、没有KV写删或数据库迁移。下一具体任务为独立适配层编码与本地契约测试。