# M2 合批 C2c 连续开发记录(2026-09-29) 本轮从 C2b 连续推进存档、奖励、消耗和异步会话,没有按模块新增送审。检查点是证据与恢复点,不是自动停止点。只有确实超出已审白名单的差异集中处理;正式报告与原受审基线保持原字节,既有工作树保留。未读取或修改服务器代码。 ## 已实施内容 - 新迁 134 项业务存档,累计 **198/202** 经共用固定会话 store。另 3 项是 Club/Setting 已有原 handle 提示存档路线,其 PF 分支继续保留;最后 1 项是无实际消费者的 `BaseEventData.UploadData`,登记最终闲置清理,不为了增加计数迁移无用类。原 224 项受审台账不回写,进度另存。两个即时消耗的实际等待链已编码,均未称真实运行通过。 - Camp、TriggerPack、商店/礼包、Buff、签到、幸运任务、伙伴、小游戏、足迹、广告及其他动态活动模型接固定 store,保留原键/序列化。嵌套礼包/优惠券由既有父对象绑定同一个 store。仅缺键可初始化默认值;本次触及的 JSON 读取不再把空串、JSON null 或解析错误当新档。原自定义格式未据此宣称全部坏档边界已验证。FootPrint 更新保留原 KV 64 位高位。 - `PlayerSaveStores.cs` 内加入已审同步动作回执收集:收集窗口只包围同步 apply/主档保存,await 前解除;同键保留本动作最后回执,逐一 Confirmed 后才执行延期展示。旧会话、Guard、Unknown、拒写、LocalOnly、异动作覆盖均不能报告成功。先检查存档可用再改物品;失败保留动作占用,不自动重放、切账号或回滚。未新增 Manager、Owner 或事务协议。 - Survey 按 KV 十进制、PF 十六进制计算尾数,原 URL 与列表档保留。sid 重入拦截,奖励、领取标识和主档共同确认;真实 SurveyPanel 等待 Task。邀请奖励同样确认物品和最终 count 后才返回;实际 EventInviteFriends 等待领取结果,过期资源/链接回调不刷新新界面。 - 邮件固定用户/store,缓存仍以 UserId 隔离;Fetch/Send/UpdateState 回包先核生命周期再写缓存。批量领取改为 RewardTaken,请求前冻结去重未领集合与奖励定义,保留个人邮件 LureInflation。KV 结果未知时在请求邮件状态前拒绝;远端成功后确认物品保存,再返回 true。PlayerItemData 和 Inflation 内多处 ShowData 纳入同步动作延期展示。 - 商店抵扣券、订单成功奖励按实际同步调用栈收集连带存档;SDK/订单回调按原订单号防止同会话重发,异步 SKU/订单查询检查固定生命周期。**补单释放实际 HomePanel 调用尚未改 Task/await,不属于已完成奖励确认链**,见集中差异单。 - 俱乐部签到在请求前捕获用户/原俱乐部/奖励/store;远端成功后收集签到标记、奖励和主档,确认后才发成功展示与聊天通知。确认失败不解除本次奖励防重入。尚无该真实服务的完整端到端用例,编译不等于运行验收。 - FishingBehaviorB 等扣饵确认后才进入 WaitForFishBite;转盘等扣费确认后才抽随机值/启动动画,KV 奖励存档确认后继续展示。移除旧不论成功都置同步完成的路径;Unknown 不自动重扣。PF 即时主档保存使用现有 NewPlayerDataDic 的真实打包数据,未另造 energy 顶层字段。正式钓鱼/转盘均未运行。 - Chat 只消费本次用户生命周期,订阅去重并兼容 Init 时已授权,退出取消登录等待/重试,禁止旧会话重连与排队 UI 更新。原 RT 服务已有 SessionVersion/连接版本隔离,本轮未改 SignalR 协议,未运行真实 RTM/SignalR。SubBoostrap 的已有 Editor PF 直入注入域补共用 store,未放开 KV 直入。 ## 验证与真实首败 - ServiceHost NON_ANDROID、ANDROID+AGG 各 **20 组 / 262 断言通过,formalRequests=0**。使用真实 store/KVMgr、Survey、邮件 Handler/Cache、EventToken、FootPrint 与伙伴存档类;HTTP、库存和配置等仍有夹具,不能替代生产奖励全链。新覆盖最终回执、跨批覆盖、重入、拒写、Unknown 不重放、提前展示、短十进制 ID、个人/批量邮件、旧回包、足迹高位与自定义档格式。 - CLI Loop Editor 编译最新 **Success=true,0 错误、272 警告**,原始 JSON 保留。不把 Editor/ANDROID+AGG 宿主条件当实际 Player 构建。 - 真实 Unity 固定入口 M08–M23 **28 断言**、B2-20 **83 断言 / 31 实模块 / 两 epoch / restored=true** 通过,非 Play。历史加载核心 90 组/2008 断言本轮未重跑,不混作本轮计数。 - **旧奖励回归没有通过**:`KVGameplayLoopSetup.RunValidationAsync("fishing-reward")` 首败为 `GuideDataCenter.Init:100` 空引用。旧 `UserService.KVFishingRewardValidation.cs` 手动 new Guide/Player 等对象,没有注册或注入新增 store。该文件在正式白名单外。没有以生产 nullable fallback、跳过 Init、削弱断言或删旧回归掩盖问题。实际首败、堆栈和运行目录均保留;退出检查 playing=false、compiling=false、enabled=false、ready=false、permitExists=false。 - 旧装备固定回归 **9 组/28 断言通过,formalRequests=0、restored=true**;旧 `fishing-consume` 未通过,首败为 MiniBattlePassDataProvider.GetMiniBattlePassRecord:143,调用来自 UserService.KVFishingValidation.FishingSubscribers.Bind:300,仍是隔离 fixture 缺 store。动态执行工具的外层 Success=true 只表示成功返回诊断文本,内部 FAILED 绝不当测试通过。该消费验证宿主与旧奖励宿主一并纳入最小差异;已通过的 UserService.KVGameplayLoop.cs 不请求扩大修改。 - 开发中曾出现 doPauseMultiDraw 字段误删导致 3 个编译错误、伙伴存档缺 using 导致 2 个编译错误,已修复后重编。测试夹具命名空间、MailStateInfo 反序列化方式、跨批覆盖构造曾首败,修的是夹具本身,不改生产协议迎合测试。动态代码 JsonConvert 产生重复程序集引用后改直接返回结果对象。 - 本地合成测试的 File.Replace 与 CLI Node spawn 在沙箱内受限,经工具批准执行原检查;未改原子缓存协议。没有自动审批拒绝、没有用 UnitySkills。范围内 `git diff --check` 通过。完整 hash 与白名单自核见本检查点 JSON。 ## 待完成,不能凭本次通过销账 1. 集中补齐 HomePanel 实际补单 await,以及旧奖励/消耗验证宿主对新 store 的注入;必须先对这几条白名单差异完成明确审查,再改相应文件。详见《M2-合批-C2c集中边界差异与后续连续开发方案》。无须重审整套 KV 方案。 2. 逐真实奖励栈补齐尚未覆盖的异步延伸与 UI 失败/待处理展示。当前若干失败仅记录日志或返回 false,不能称完整体验通关;普通活动写入已迁不等于所有活动奖励都逐动作确认完毕。 3. 邮件、签到、订单仍有远端已消费但 KV 未落盘的跨系统窗口;单动作多键也无事务回滚。不得自动 AddItem 重放补偿,不称奖励完整通关。SDK 支付假实现不证明真实支付能力。 4. 真实初场景/PF 调用为零、两提供方初始化/40 秒保存/退出/重登、真实 Chat/RT、Player 仍待验证。两个阶段闸和 PFLoginAct.OnDestroy 临时撤销须在满足统一放行条件时同步清理,不能只移一闸。 5. 外部聚合榜单、公开资料、好友/匹配替代按原集中问题单继续;新 ID 与个人 KV 存储原则不再询问。移动端易盾/TapJoy、所有开发冻结/忽略路径、闲置实现、物理反向依赖和最后统一改名,全部按最终清理清单逐项销账。 所有生产调用 `runtimeVerified` 仍 false,M2 未通关。正式地址仍为 `http://s101.local:18080/`;未正式账号请求、Play、付费或打包。