Files
ft/CodexOutput/upserver/F1-F2-F3代码审查.md

5.1 KiB
Raw Blame History

F1 / F2 / F3 代码独立审查

日期:2026-09-21。审查对象:当前未提交工作区本轮修复。审查者为主任务派生的独立审查 agent,不是另建 Codex Session。只写本文件,不修改生产代码。

初审裁决

暂不通过:确认 2 项需修复的回归。 F3 退出先失效、F1 本人 API 身份及成员 UI 比较、F2 CreateClub/QuitClub 显式成功与会话检查的主要方向正确。以下问题修复并验证后复审。

R1 / P2:批量拒绝申请的真实成功码被拒绝

  • 客户端 ClubService.HandleApply 只接受 code=0,空 applyId 的清列表逻辑位于其后,因此实际无法到达。
  • 服务端 LeaderboardAPI/Services/Club/ClubService.cs:538–544 对空 playerId 删除申请列表后返回 code=4。
  • 影响:批量拒绝服务端已成功,本地申请列表与红点仍残留。与实施方案“保留批量拒绝”不符。
  • 建议:只在 !isAgree && applyId == "" 情况认可 code=4;普通单个操作仍按真实合同处理,空 ID 同意操作应阻断。补真实 code=4 的测试。

R2 / P1:签到时间后移后,按钮仍可重复点击并重复发奖

  • SocialClubJoined.OnSign 调用 async void ClubSingin() 后立即调用 SetSignCD();本批把 signTime 设置移到了请求成功后,立即刷新仍看到未签到,按钮保持可用,成功后也未主动刷新这个 UI。
  • ClubSingin 没有进行中及当天已签到保护;服务端 ClubSingin 对任何会员请求都返回 code=0,没有按日期去重。
  • 影响:网络等待期间双击或成功后再次点击会再次发出签到请求,并多次执行 AddItemByDrop。这是本次调整暴露的具体资源重复发放风险。
  • 建议:增加会话关联的签到进行中保护、成功日期保护;失败后允许重试;UI 等待请求结束再刷新并恢复按钮,过期会话不能发奖或覆盖新 UI。验证双击、成功后再次调用、失败重试及旧会话响应。

已核查通过的局部设计

  • QuitAct 在第一个 await 和 UI 清理前消费注销标记并调用 Logout;无需注销路径保留。Hub 释放异常仍可继续清理。
  • AggUserService 先 base.Logout 再渠道 Logout,先使客户端认证失效。
  • 11 个本人 ID 请求使用已认证 ApiPlayerId,旧 PlayFab 存档 UserId 未全局替换;目标 ID 保持目标语义,缓存本人映射使用数字身份。
  • 受改请求在 await 后核对会话版本和身份;GetClubDetails 的第二个聊天 await 后再次核对。
  • CreateClub 明确 code=0 且 clubInfo/id 有效才成功,code=1 不触发创建 UI 再扣消耗;QuitClub 仅 code=0/1 才清理。
  • 三个成员 UI 的本人判定使用 ApiPlayerId。

验证证据边界

本 agent 独立阅读实际生产源码、服务端本地源码、测试生成器及测试用例;尚未自行执行测试。主任务负责执行并提供测试结果。

ExitTests 编译实际 QuitAct,但用户服务、SDK、HTTP、Hub 为替身,不能将 DeliverOldHttpAndLogin 的模拟断言描述为实际 SDK 回调验证。ClubRegression 初版只提取 CreateClub/QuitClub/Demote/Promote/Kickout,25 项通过不包含 HandleApply/ClubSingin,也不等于完整俱乐部场景通过。

不连接正式服、不实际创建/退出俱乐部、不操作玩家资产;本地服务器合同不保证线上部署版本一致。聊天内部异步发送、体力捐赠、点赞与其他未覆盖社交方法仍需后续迁移,不能因此宣称全社交隔离已完成。

修复后复审裁决

本批代码审查通过:初审 R1、R2 均已修复,未发现本次边界内其他已确认阻塞项。 可关闭本批代码阻塞;不表示全游戏迁移完成,也不替代 Unity 场景、渠道 SDK 和真实断网重连验收。

  • R1:HandleApply 在发送前拒绝空 ID 的同意操作,空 ID 拒绝仅认可 code=4,普通单人请求仍只认可 code=0。已阅读实际改后源码,并确认测试包含成功清列表、错误 code 不清列表、空同意不发请求。
  • R2:ClubSingin 返回 Task;会话版本对应的进行中状态阻止并发重复请求,成功后以完整日期阻止当天重复发奖,finally 只释放本次版本的锁。请求失败不提前写签到时间,允许重试;旧会话响应不发奖、不写存档。SocialClubJoined.OnSign 禁用交互、等待完成并在同会话 finally 刷新签到 UI,日期比较已从 DayOfYear 改为 Date。
  • 复审实跑:dotnet run --project CodexOutput/upserver/ClubRegression/ClubRegression.csproj --no-restore --verbosity quiet,退出 0,31 项通过。实际源码方法由生成器提取;运行环境、传输与奖励对象为替身,UI await 刷新链本次为源码审查,未执行 Unity 点击测试。
  • 主任务报告 2079 源码重编译通过;本 agent 未重复编译,具体命令和完整结果由主任务验收文档保留。

保留限制:服务端签到本身仍不实现跨设备幂等;此次修复覆盖客户端正常操作重复点击引入的回归。完整签到持久化可靠性随 KV 阶段继续验收。其余未迁移社交功能、SDK 内部回调及线上部署契约仍按前述边界处理。