Files
ft/CodexOutput/upserver/P2AlphaImport101/D0-独立方案评审.md

42 lines
4.9 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.
# P2AlphaImport101 D0-固定101历史档导入最小方案:独立方案评审
日期:2026-09-28。审查者:ZCode会话。独立性声明:未参与本方案编写与任何导入执行;此前参与为P2-α-A/B/C全链审查。本轮只读+hash重算+**源指纹独立逐值核对**;未构建/跑工具/访问正式或PF接口/操作Unity/验证危险参数。
## 受审hash核对
| 项 | 结果 |
|---|---|
| `design-review-hashes.json`(60项) | **全部一致** |
| `expectedAbsent`(Import101.cs/Import101Tests.cs/import-101.claimed) | **全部确认不存在** ✓ |
| `D0-source-values.json`(55条) | **本审查独立逐值重算:55/55键名/UTF8 hash全部一致**;源文件SHA256=`E6EB3E65…`吻合;source=PlayFab/title108EE8/customId101/55键元数据吻合 |
## 总判定
**通过。** 无P1/P2;P3三条不阻塞。方案是最小正确的单账号测试导入设计,且诚实处理了Import102先例中的已知缺口。
## 七项逐条
**1. 最小范围:确认。** 游戏源码零修改(Client下全部禁改);仅Preflight目录Program两固定单参分支+两个新辅助文件(expectedAbsent已证当前不存在);csproj默认包含规则免改。三路线取舍合理(改Import102为通用迁移器扩大已验收路径;裸HTTP脚本省略候选校验/claim/替身测试——均正确否决)。无遗漏必要依赖(复用S101AccountSession/PlayerKVClient/Schema.Decode/Import102取值方式复制)。
**2. 固定输入与门闭合:确认(经独立核对)。** 55键源指纹本审查逐值重算全部一致;两种历史null(M15/M22经B修复后)与未知键**原样写入不过滤**("不能按31模块过滤"正确);配置7项hash固定版本`import101-fixed-20260928-v1`+送审不符即停+**两清单自身hash在实现中锁定**(防同时改清单绕门)——三层固定闭合。候选Decode用本次真实ServerTimeUtc而非历史时间——正确。
**3. claim/并发/停写:足够且诚实。** claim在Set**之前**CreateNew持久化、之后即"已消耗"(崩溃不自动重跑);目标Get不提供CAS——**明确声明安全边界依赖专用账号停写窗口、不宣称消除并发竞争**;D3才建立实际窗口(不打断用户提前停机)。不要求全体用户迁移或CAS工程(正确留界)。
**4. 一次Set/Unknown/落盘失败口径:自洽(且修复了Import102已知缺口)。** "set-result写盘失败不短路观察"(作者自审明示这是对照真实Import102发现的缺口);进入Set后一切异常按"可能已写";观察Get恰一次不重试;成功五条件同时满足(Set明确Success+after恰55原值+证据持久化+停写未破坏),**Unknown后读值相同也不自动标成功**;无隐含重发/自动清空("失败不是恢复到空档的授权"——因Unknown/外部进度会使清空成数据丢失——正确)。
**5. 测试接缝与故障覆盖:可实施、不过度。** 接缝仅internal参数(输入副本/handler工厂/候选回调/保存回调);CLI固定绑真实实现、测试不联网;11个验证组覆盖源/登录/非空/候选/持久化/claim/成功/Unknown/落盘失败/after异常/再执行——含"故障注入≠真实样本不兼容"的显式区分声明。成功组至少一次真实55键+真实配置隔离Decode——与替身组分层清楚。
**6. D0–D4门完整:确认。** 方案评审→实现/离线(D2即交独立实施复核,**正式导入前双门**:实施复核+D3停写窗口)→一次执行→执行复核→限定关闭。当前仅批准方案。
**7. 限制声明完整:确认。** 请求计数上限(1登录+2Get+1Set)按实际到达阶段计数;登录可能新建账号的后置拒绝语义;PlayerId非回显;本地钟未校验;26模块外键/身份映射/业务覆盖限制保留;101导入≠全体用户/正式启用。
## P3清单(不阻塞)
- **P3-1**:D3停写窗口记录建议包含"窗口起止的本地UTC+操作者标识+当时101无其他连接的可核实手段清单(哪怕只有'用户声明所有客户端已停用')"——把不可证明性显式落为记录字段而非省略。
- **P3-2**:`D0-config-hashes.json`建议在D1实现中以常量内嵌版本串比对而非仅文件hash(防清单文件被移动后路径失效绕过门)。
- **P3-3**:观察Get的after矩阵建议记录"服务器返回键的原始顺序"(Ordinal对账不受影响,但顺序差异可作为未来并发观察的辅助信号,零成本留证)。
## 结论
**通过D0方案。** 主会话核hash(已代验60/60+absent 3/3+源指纹55/55独立重算)逐条裁决后按D1(三文件实现+专用构建)→D2(替身验证+独立实施复核)→D3(停写窗口+一次真实导入)→D4(执行复核+限定关闭)推进。本方案批准≠导入已执行;101导入成功也仅覆盖单账号测试,不代表全体用户迁移或P2-α整体关闭。