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

6.8 KiB
Raw Blame History

阶段确认与阶段2启动裁决

执行后更新(2026-09-22):阶段2已实现并通过42项契约/16项正式服检查、双账号清理、Unity编译及独立终审。当前结论以阶段2验收报告为准。下方“尚未实现/没有写删”描述的是启动时点;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验收门与任务

  • 重新核对G1、审查意见与服务器源码契约。
  • 固定本批文件/会话/错误处理边界,完成实施前评审。
  • 编写独立DTO/结果模型及Get/Set/Delete协议客户端。
  • 完成协议、参数、请求快照、错误分类、取消、结果未知、客户端所有权测试。
  • 101/102只操作本次唯一前缀key:新增/读/覆盖/空字符串/指定key/删除/不存在、同名key账号隔离、重新登录后持久化;无Cookie拒绝。
  • finally清理测试key并再次确认不存在,失败清理项不能遗漏或直接宣称通过。不打印真实存档内容,不写业务key。
  • Unity兼容编译/必要独立审查及证据落盘。通过之后才讨论阶段3;当前不打包。

本次阶段确认只完成契约复核与评审,没有新增生产KV代码、没有KV写删或数据库迁移。下一具体任务为独立适配层编码与本地契约测试。