Files
ft/CodexOutput/upserver/阶段3C复核更正与补验收-2026-09-23.md

59 lines
7.4 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.
# 阶段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测试,但修复后的离线安全门必须先通过。