7.1 KiB
阶段4B3设计准备与边界
日期:2026-09-24。状态:上下文和候选调用盘点已开始,尚非完整实施方案,尚未送审或批准编码。 前置4B2已由主会话逐项裁决关闭,见关闭裁决。
1. 用户目标和既定限制
下一阶段是普通读写路由、固定会话归属及延后回调隔离。沿用已审4B分期:先完整设计,用户交外部AI独立审查,主会话核hash/逐条裁决后实施,每检查点更新日志。不得凭4B2实施审查扩大到4B3代码。
普通KV写入Accepted只代表本地持久化接受,不等于远端Confirmed。初始化失败不能当缺键写默认值;单次登录固定后端,不混拼PF/KV、不自动回退、不双写。4B2受控能力不授权普通写入或玩法成功。正式地址固定http://s101.local:18080/,本阶段设计不访问正式服、不进入PlayMode、不打包,Unity仍使用CLI Loop。
2. 当前源码证据
候选扫描:234行原始结果,84个文件;包含定义、注释和加载适配引用,不是234个有效调用,也不是84个待修改文件。检索模式为PlayFabMgr|PlayFabClient(API|AsyncAPI)\.(UpdateUserData|GetUserData),范围Client/Assets/Scripts/**/*.cs,排除Services/PlayerData以单独审计基础设施。补查SDK方法名没有额外直接SDK存档入口;这不证明委托、别名、反射和上游业务回调已经穷尽。
| 已核对位置 | 当前事实 | 4B3设计必须回答 |
|---|---|---|
| Core/PlayFabMgr.cs | 普通写void、读string/null、立即写Task;Awake启动40秒循环;暂停/退出/销毁调用旧同步;4B2guard覆盖入口 | 后端何时固定、旧定时器如何退场、结构化失败如何向调用者传播;不能把失败读变成null缺键 |
| Services/PlayerData/PlayerKVGameSessionBridge.cs | 固定句柄有ReadLocalSnapshot/Update/Delete/Flush/WaitForTicket | 复用已有能力,避免另建Owner/State;延后操作不能重新查当前句柄 |
| Services/PlayerData/PlayerKVLoginContext.cs | handle私有,只向4B2提供受限AccountLease | 如需新增写能力须列为明确接口扩展并评审,不能悄悄公开handle或扩大现有Lease路由 |
| Services/UserService.KVLoad.cs | kv→BackendNotEnabled;非法值→BackendUnsupported;受控playfab→Input | 新普通路径与旧验证路径权限分离,保持缺省PF;明确新准入门而非删除guard |
| Services/ClubService.cs:607 | ClubSingin在await前捕获API身份/版本,await后已检查IsClubSessionCurrent,然后修改signTime、保存并可能奖励 | 现有防护应复用;仍需证明API版本与存档owner/epoch关联,不能只更换最后一行保存 |
| UI/Setting/BindAccountPopupPanel.cs:200 | OnLinkSns await渠道绑定后调用全局存档;其外层按钮回调还更新UI和发奖 | 捕获点必须早于await,并覆盖外层后续副作用;同账号重登也不能只比PlayerId |
| Services/FriendService.cs:74 | OnReceiveLinkAward先发道具/发布事件,再改领取计数并保存 | 普通存档失败处理牵涉奖励一致性;必须明确4B3隔离与4C消费/奖励合同边界,不能用bool包装假装解决 |
| GampPlay/FishingB/FishingBehaviorB.cs:786;UI/Turntable/FishingTurntablePanel.cs:582 | 两个SyncDataImmidiate消费调用仍是旧bool合同 | 留给4C独立方案;在4C通过前不启用含这些路径的KV玩法 |
| Services/UserService.cs:794 | 存在直接GetUserDataAsync | 应按调用对象区分本人/他人/旧PF外围,不能全量替换为本人KV |
3. 路线比较与建议
| 路线 | 评估 |
|---|---|
| 仅将PlayFabMgr内部转向当前KV句柄 | 修改少,但旧账号回调可能在换号后取得新句柄;且内存可能早于保存被污染,不满足隔离合同。 |
| 全部业务、消费、身份一次切换 | 范围混入4C和身份专项,错误处理及验证难以闭合,不符合已审分期。 |
| 固定会话操作归属+逐调用隔离+统一生命周期路由 | 推荐。复用4A固定句柄,以每条调用链证明归属、取消点、内存副作用及持久化失败行为;全链完成前保持正式禁用。 |
不为分期提前增加一套“验证专用普通存档框架”。先确定实际生产调用合同,再将必要最小接口和测试列入白名单。涉及31模块的现有纯加载适配器默认不重写,字体、场景、资源、第三方SDK默认不进入范围。
4. 完整送审包仍需补齐的设计任务
下面是设计工作清单,不是可编码任务书;未完成项不能留到实施现场猜测。
- 逐有效调用台账:去除注释/定义,追踪各保存包装方法的上游调用者;每项记录源行、业务key、同步/await/事件/计时器/协程、回调创建点、固定归属捕获点、取消/退订点、可变对象所有者、变更发生时刻、localOnly及错误处理。带有奖励/消费/账号身份的项单独标出,不能只统计末端保存行。
- 固定归属及内存合同:明确OwnerInstanceId+epoch+对象生命周期;退出同步撤销后,旧操作在首次内存变更前就必须拒绝。说明主线程串行边界和异步切换后重检,不能只有写入前校验;共享对象原地重置复用时的旧引用尤其要验证。
- 后端facade与失败合同:定义有效缺键/拒读/NotReady、Accepted/StorageError/Blocked、localOnly、Flush水位、等待取消与内部排水;列出每个旧void/string/bool调用点如何处理,不能把未确认当成功。以既有State/Coordinator结果为准,不擅改底层语义。
- 生命周期和加载连接:准确说明private handle的受限发布条件、4B2验证入口继续隔离、初始化意图何时允许提交、固定40秒周期/暂停观察/恢复/退出如何归属;禁止直接解除guard后让PF缓冲复活。关闭超时仍不放行新会话。
- 边界与验收:从实际台账得出逐文件白名单;为A回调迟到到B、同账号新epoch、共享内存已换档、异步异常、失败本地持久化、401/退出/暂停、并发Flush与等待取消设计证据。使用合成传输和Unity CLI Loop;源码宿主不代替真实模块验证。留存首次失败,跨阶段禁改点如确需扩展先差异评审。
- 完整方案自审及送审封板:主方案+逐调用附件+白名单+验收矩阵+受审hash+外部提示词一起完成后才送完整方案评审。外部接受后由主会话逐项裁决;必要修订再次评审,不能将本文当实施批准。
5. 当前边界结论
已完成:4B2关闭、4B3上下文核查、候选扫描和关键风险证据。未完成:234行逐项语义分类及上游调用图、完整4B3设计包、独立方案审查、实施批准、任何4B3编码。后续应从第4节第1项继续,不能把候选扫描冒充完成台账。
KVSync StorageError与3C L7间歇问题保持根因未定的独立待查项。P2-α真实档兼容/迁移/备份/失败退出/人工恢复专项+用户产品确认、4C、tickets有界历史、身份专项和4D仍是正式启用前置。