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

50 lines
5.1 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.
# 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 内部回调及线上部署契约仍按前述边界处理。