# 阶段3技术方案独立评审(ZCode 会话) 日期:2026-09-22。评审人:ZCode 主会话(应用户"对阶段3技术方案做一下评审"要求执行)。评审对象:《阶段3缓存同步方案与评审-2026-09-22.md》全文、既有独立方案审查闭环,以及方案所述边界与当前工作区实际状态的一致性。本轮只读核查与落盘本文件,未修改任何生产代码、状态文档或测试。 ## 裁决摘要 **技术方案内容:通过(含对 R1–R4 闭环的复核)。两条收紧策略:建议用户确认(附条件,见第四节)。但存在一项 P0 级存证失真和一项 P1 级验收门未闭合,必须在推进 3B 前纠正。** 方案本身的工程质量高:写前日志、单写者租约、原子替换、快照严格校验、B/L/R 三方比较、未知保守冻结等合同完整自洽,且已写出的 3A 代码与方案逐项吻合。问题不在设计,在于**文档记录的工作状态与工作区实际状态已经分叉**。 ## 一、P0:存证与实际状态失真(阻塞 3B 放行) 时间线(文件 mtime 取证): | 时间 | 事件 | 证据 | |---|---|---| | 15:01 | 接手入口/开发状态/TODO 落盘,均写明"本轮仅文档、无生产代码修改或测试执行、待用户确认后进入3A" | 三文件 mtime 2026-09-22 15:01:41 | | 15:03 | 独立方案审查终验完成,记录主方案 hash `097EE094…`,明确"用户确认与3A实施仍未勾选" | 阶段3缓存同步独立方案审查-2026-09-22.md | | 15:14 | 主方案被再次修改:顶部改为"用户本轮'继续'已确认新策略,现进入3A实施",检查表勾选用户确认 | 当前 hash `70c7C5D8…` ≠ 审查终验 hash | | 15:19–15:25 | 3A 三个生产文件写入(PlayerKVSyncState/PlayerKVCacheStore/PlayerKVSyncModels) | 文件 mtime | | 15:24 / 15:27 | KVSyncTests 执行:74 项、86 项全部通过 | Initial.log / Latest.log | 三个具体问题: 1. **"用户确认"依据不足且自相矛盾。** 主方案顶部称用户以"继续"确认两条收紧策略,但同文档底部结论仍写"待用户确认两项策略,生产代码尚未实现";独立审查明确要求"这两条不能由独立技术审查替代用户确认,也不能由历史G1推定"。本轮用户实际动作是要求评审方案,不构成对该两策略的确认。修改发生在独立审查终验 hash 之后,未经复核。 2. **状态文档与实际相反。** 15:01 的三份状态文档声明无生产代码与未执行测试;实际 3A 已实现且 86 项测试已通过。任何后续接手者按文档理解会被误导,违反项目自身落盘协议。 3. **3A 实施事实缺正式记载。** 86 项测试通过没有对应验收文档,未记载与方案 G3A 用例矩阵的覆盖对应关系。 **整改要求(进入 3B 前):** ① 用户对本报告第四节明确表态;② 主方案顶部/底部及三份状态文档按实际状态改写一致,"用户确认"以用户的明确表述为准;③ 3A 已实施事实按实际补记载(文件清单、测试证据、未完成项单列)。 ## 二、P1:G3A 验收门未闭合 按方案自设验收门,3A 完成需要"状态转换、磁盘故障、隔离及重启恢复测试,**Unity 兼容编译**"与独立 review。当前: - 离线测试 86 项通过(合成 fixture,含磁盘边界故障注入、租约跨进程、损坏快照拒绝、序号溢出等); - **Unity 编译验证缺失**(现有 kv-unity-compile.json 为阶段2证据,不含三个新文件); - **3A 代码独立复审缺失**(本报告评审了方案与代码一致性,不替代按 G3A 清单的逐项验收); - **G3A 验收报告未落盘**。 ## 三、技术评审结论 ### 3.1 通过项(方案与已写代码逐项核对) | 领域 | 核对结果 | |---|---| | 写前日志 | BeginBatch 先 Commit 落盘再暴露批次(`batch = snapshot.Active` 在 Commit 成功后),符合§7.1 | | 批次规则 | sequence 升序、连续同类型、≤10 key:`TakeWhile(Exists==首项).Take(10)`;解码校验同规则 | | v1/v2 并发 | ConfirmBatch 精确 sequence 移除、v2 基线推进 `WithBase(v1)`;与§7.1 一致 | | B/L/R | R==L 确认移除、R==B 保留、均不等→Conflict;unknown 优先且不因观察解除;整次合并单次落盘 | | 磁盘顺序 | tmp→Flush(true)→File.Replace(保留bak)/首次Move;mayHaveCommitted 窗口覆盖 AfterReplace 故障注入 | | 快照校验 | 身份绑定(api/playerId 必须匹配)、sequence 唯一且