Files
ft/CodexOutput/upserver/阶段4B3设计准备与边界-2026-09-24.md

53 lines
7.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.
# 阶段4B3设计准备与边界
日期:2026-09-24。状态:**上下文和候选调用盘点已开始,尚非完整实施方案,尚未送审或批准编码。** 前置4B2已由主会话逐项裁决关闭,见[关闭裁决](阶段4B2实施复核裁决与关闭-2026-09-24.md)。
## 1. 用户目标和既定限制
下一阶段是普通读写路由、固定会话归属及延后回调隔离。沿用已审4B分期:先完整设计,用户交外部AI独立审查,主会话核hash/逐条裁决后实施,每检查点更新日志。不得凭4B2实施审查扩大到4B3代码。
普通KV写入Accepted只代表本地持久化接受,不等于远端Confirmed。初始化失败不能当缺键写默认值;单次登录固定后端,不混拼PF/KV、不自动回退、不双写。4B2受控能力不授权普通写入或玩法成功。正式地址固定http://s101.local:18080/,本阶段设计不访问正式服、不进入PlayMode、不打包,Unity仍使用CLI Loop。
## 2. 当前源码证据
候选扫描:[234行原始结果](阶段4B3存档候选调用扫描-2026-09-24.txt),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<bool>;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. 完整送审包仍需补齐的设计任务
下面是设计工作清单,**不是可编码任务书**;未完成项不能留到实施现场猜测。
1. **逐有效调用台账**:去除注释/定义,追踪各保存包装方法的上游调用者;每项记录源行、业务key、同步/await/事件/计时器/协程、回调创建点、固定归属捕获点、取消/退订点、可变对象所有者、变更发生时刻、localOnly及错误处理。带有奖励/消费/账号身份的项单独标出,不能只统计末端保存行。
2. **固定归属及内存合同**:明确OwnerInstanceId+epoch+对象生命周期;退出同步撤销后,旧操作在首次内存变更前就必须拒绝。说明主线程串行边界和异步切换后重检,不能只有写入前校验;共享对象原地重置复用时的旧引用尤其要验证。
3. **后端facade与失败合同**:定义有效缺键/拒读/NotReady、Accepted/StorageError/Blocked、localOnly、Flush水位、等待取消与内部排水;列出每个旧void/string/bool调用点如何处理,不能把未确认当成功。以既有State/Coordinator结果为准,不擅改底层语义。
4. **生命周期和加载连接**:准确说明private handle的受限发布条件、4B2验证入口继续隔离、初始化意图何时允许提交、固定40秒周期/暂停观察/恢复/退出如何归属;禁止直接解除guard后让PF缓冲复活。关闭超时仍不放行新会话。
5. **边界与验收**:从实际台账得出逐文件白名单;为A回调迟到到B、同账号新epoch、共享内存已换档、异步异常、失败本地持久化、401/退出/暂停、并发Flush与等待取消设计证据。使用合成传输和Unity CLI Loop;源码宿主不代替真实模块验证。留存首次失败,跨阶段禁改点如确需扩展先差异评审。
6. **完整方案自审及送审封板**:主方案+逐调用附件+白名单+验收矩阵+受审hash+外部提示词一起完成后才送完整方案评审。外部接受后由主会话逐项裁决;必要修订再次评审,不能将本文当实施批准。
## 5. 当前边界结论
已完成:4B2关闭、4B3上下文核查、候选扫描和关键风险证据。未完成:234行逐项语义分类及上游调用图、完整4B3设计包、独立方案审查、实施批准、任何4B3编码。后续应从第4节第1项继续,不能把候选扫描冒充完成台账。
KVSync StorageError与3C L7间歇问题保持根因未定的独立待查项。P2-α真实档兼容/迁移/备份/失败退出/人工恢复专项+用户产品确认、4C、tickets有界历史、身份专项和4D仍是正式启用前置。