59 lines
7.4 KiB
Markdown
59 lines
7.4 KiB
Markdown
# 阶段3C复核更正与补验收
|
||
|
||
> 最新终审:用户指定外部AI复核接受,无新P1/P2;主会话核对版本并裁决R1–R5/F2关闭,3C/G3通过。见[终审裁决](3C补修复终审裁决与4A准入-2026-09-23.md)。下方“待外部复核”等表述为当时状态,最新结论以本注为准。
|
||
|
||
日期:2026-09-23。性质:阶段4前置核对中的源码只读复核;本轮只修改文档,不执行正式服、不改测试或生产代码。本文覆盖上一轮“3C矩阵全部通过、无遗留问题、可结束3C”的结论。
|
||
|
||
最新状态:独立审查A通过,R1–R5全部确认;主会话已批准本文件§3限定修复实施。六项补充及边界见《3C补验收与4A方案审查裁决-2026-09-23.md》。R1–R5现已完成限定修复和本轮技术验证,详见《阶段3C补修复交付与逐项证据-2026-09-23.md》;外部实施复核尚待完成,3C未恢复最终通过。
|
||
|
||
## 1. 当前裁决
|
||
|
||
补充核对:用户另开的终验AI已新增《阶段3C最终验收-2026-09-23.md》,复跑后判定G3关闭。本轮核对的Program.cs SHA256仍为其验收版本`3C89DA087AA3841ADBA79A11BB2BAC724FD8F5F429D2124F826185EBBDDA64DA`;因此下列问题并非后续代码变更引入,应交该外部审查角色复裁。原报告保留,不修改其作者结论。
|
||
|
||
**3C需要补修复与补验收,阶段4不得进入编码。** 已有offline 7/7、live 3/3、42/86/29、Unity编译结果作为历史执行事实保留;这些分组通过不能证明每个矩阵条目已满足。
|
||
|
||
上一轮主会话把正常路径分组成功扩大成全部验收门通过,属于本会话报告错误,现明确更正。未观察到正式服数据损坏;以下是源码可达风险及覆盖缺口,不能写成已经发生的数据事故。原manifest及清理日志保持原样,不重新执行清理。
|
||
|
||
## 2. 具体发现
|
||
|
||
| 编号/严重度 | 源码位置(KVStage3CTests/Program.cs) | 触发与影响 | 必要处置 |
|
||
|---|---|---|---|
|
||
| R1/P1 | `Run`约531行,`Live`约283–301行 | `WaitAsync(20s)`仅终止等待,不终止底层任务。组合登录/Get/Flush总耗时超过20s后,底层任务可继续写,而finally已经开始Delete;`HadUnknownWrite`也可能尚未落盘。 | live不得借用离线通用超时包装器;超时必须进入独立停止状态,先禁止后续变更、记录不确定性,确认任务和传输收尾后退出;该次不得自动cleanup。用替身验证迟到写与清理无重叠。 |
|
||
| R2/P1 | `LoadManifest`约510行、`ValidateManifest`约516行 | prefix未校验固定格式,空前缀可通过StartsWith;keys只检查数量与前缀,未验证唯一性和精确后缀。run/cache只要求在runs内,未绑定同一run,也未拒绝链接。篡改manifest可能授权删除非fixture key。 | 读文件前约束路径;严格schema、mode、runId、前缀、三个精确key、唯一性、同run目录与相对cache路径;拒绝重解析点/链接、未知字段、重复JSON属性及越界路径。cleanup要求完整预检授权。所有无效输入在登录前拒绝。 |
|
||
| R3/P2 | `CleanupCore`约363行、`Cleanup`约339行 | Completed仅根据清理和Unknown设置,忽略正常断言失败。另起cleanup进程重置failed,还会重写原result,可能把失败运行表现为成功。 | 原执行结果不可变;cleanup仅生成单独的补救结果/追加清理状态。Completed必须同时依据原运行所有用例通过、无Unknown及双账号双会话清理。失败不得升级成功。 |
|
||
| R4/P2 | `LiveAccount`约307–330行 | 读回只检查key存在,不核对值;102写入后不重新读101;新登录只创建直接Client,不重建Owner。无效Set、共享账号存储均可能通过现有断言。 | 精确核对101/102各自值,102写后再读101;两账号均新Cookie、新Owner重新打开同缓存,经真实Get后Ready、无pending/unknown;Delete先确认目标存在再删除。 |
|
||
| R5/P2 | `OfflineChild`、`ConservativeUnknown`、`CorruptionPolicy`、`WriteArtifacts`约539行 | C子进程只Open状态未做Get,不断言Ready/远端值;Unknown不重发计数未覆盖新handler;未覆盖缺主档bak/tmp和live退出编排故障;诊断Ready为硬编码,live无state/票据/epoch等完整字段。 | 逐项补O2/O6/O7/L7/D1,计数贯穿重开handler;记录真实状态与时间点,重开未Get应为NotLoaded;逐Owner关闭前收集票据,关闭后只输出真实快照计数,不伪造Ready。 |
|
||
|
||
## 3. 修复任务书(独立审查通过,已批准修复实施)
|
||
|
||
目标:完整满足已批准3C方案的安全门,不改变生产协议和3A/3B保守语义。
|
||
|
||
文件边界:只允许修改`KVStage3CTests/Program.cs`,必要时修改其csproj;新增该目录运行证据。由主会话维护实施记录与入口文档。禁止修改生产代码、既有42/86/29测试、账号业务数据或Unity项目配置。
|
||
|
||
已采纳实施补充:
|
||
|
||
- A-S1:编排linked CTS连接Owner生命周期及传输,超时请求取消后等待Close/全部任务收尾;忽略取消时不能宣称已经停止。超时/Unknown本次不自动cleanup;收尾完成仅是后续显式补清理的必要条件。
|
||
- A-S2:原运行断言状态和最终失败/未完成状态持久化进manifest;原result/log不可改写,补清理独立产物不得把原失败变成成功。
|
||
- A-S3:严格JObject解析并拒绝未知字段/重复属性,登录前完成全部校验;合法cleanup输出待删key的SHA256清单。
|
||
- R3保持P2分级,按P1优先级修复,和R1/R2一起阻塞新的正式运行。
|
||
|
||
实施顺序:
|
||
|
||
1. R2:固定manifest与路径验证,构造空prefix、替换key、重复key、错误mode/API/账号、跨run、路径穿越、链接及重复JSON属性反例,全部断言登录/网络次数0。
|
||
2. R1/R3:统一正式执行和清理生命周期;用合成传输复现超时后台继续运行、Unknown停止、finally异常、已失败运行补清理、补清理自身不确定等分支。断言原结果永不提升成功、无自动清理/重试不确定变更。
|
||
3. R4/R5:补充矩阵缺口;诊断/结果/log专用DTO、字段白名单和敏感内容扫描;票据按真实结果累计。缓存都归本run/cache下不同测试子目录。
|
||
4. 离线完整通过并经限定源码审查后,才执行一次新的正式正常路径联调。原成功run保留为历史,不覆盖。
|
||
5. 复跑42/86/29与Unity CLI Loop;生产hash比较;按矩阵逐行提供测试名、产物路径和结论。未执行项写待验收,不按分组名推断。
|
||
6. 正式结果与补验收交由用户指定外部AI独立复核;无P1/P2并逐项裁决后才能恢复3C通过。
|
||
|
||
## 4. 报告事实的边界
|
||
|
||
- 账号预检中的`PlayerId`是客户端据输入保存的身份;仅它相等不证明服务端Cookie身份,必须结合账号数据隔离联调。
|
||
- 既有KV七文件有历史hash基线;S101AccountSession只有本次记录hash,不能称八文件均有3B历史基线。
|
||
- 日志中无Unknown的正常运行结果保留;未实现L7替身验证不能据此宣称Unknown退出分支已经验证。
|
||
- 文档中的“每步落盘”今后以真实检查点追加,不把事后汇总描述为当时已及时保存。
|
||
|
||
## 5. 下一步
|
||
|
||
外部审查和主会话裁决已完成,下一步实施限定3C修复与补验收;完成后仍需外部实施复核。4A设计已通过,编码仍以前置问题关闭为条件;无需重新授权101/102限定fixture测试,但修复后的离线安全门必须先通过。
|