Files
ft/CodexOutput/upserver/阶段3C补修复独立实施复核-2026-09-23.md

59 lines
7.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.
# 阶段3C补修复独立实施复核
日期:2026-09-23。复核者:用户指定外部AI(ZCode会话)。范围:对3C补修复(R1–R5)做只读代码审查+证据核验+独立复跑。本轮未修改任何测试或生产代码,未访问正式服,未创建新正式run(最终正式run已对应最终源码,无新正式验证必要)。
## 受审版本
| 对象 | SHA256 |
|---|---|
| `KVStage3CTests/Program.cs` | `66C41B8B0A8E0CD4FF13A3BED8212B3F61BF95E4707F5C6373B2104…`(完整值与提示词一致:`66C41B8B0A8E0CD4FF13A3BED8212B3F61BF95E4707F5C6373B235E21B20492A`) |
| `KVStage3CTests.csproj` | `27CC1AF41AC658EA9B8DE1ACB35E37058C294A93D30E232D42B9AFCBDD95A1E6`(未改) |
| 八份链接生产源码 | 与`repair-final-source-hashes.json`逐项重算一致(7个KV文件有3B历史基线;账号类按修复前基线核对)——**生产源码零改动** |
## 复核结论
**接受本轮3C补修复。R1–R5全部修复并经源码级核验与本复核独立复跑证实;未发现新P1/P2。建议主会话据此恢复3C(并按其流程恢复G3)通过;本报告不自动授权4A编码,4A按其任务书前置门另行批准。**
## R1–R5逐项裁决(全部通过)
**R1:通过。** 源码:`DrainBounded`(行416–438)超时后先`control.Timeout()`持久化失败/不确定状态并取消Lifetime,**随后必然`await operation`**——body及其`Owner.CloseAsync` finally永不脱离;`LiveAccount`/`VerifyOwner`将`control.Lifetime.Token`传入CreateAsync(行522/575),孤儿传输被确定性取消(A-S1落实);`RestrictedHandler`在转发前`EnsureRunning`、变更请求经`BeginWrite/EndWrite`把`InFlight`在入网前持久化、非200/异常按不确定落盘(行757–767);自动清理门(行497)要求`!HadUnknownWrite && !TimedOut && !InFlight`。替身证据(LifecycleGuards行887–930):忽略取消闸门下,超时后运行未完成、无任何Delete、竞争cleanup被拒(0登录);释放后drain完成、无后续账号登录、Owner缓存锁已释放;超时run显式补清理后**原始result/log字节不变**。失败批次未完成票据不阻塞Close(`Confirm`仅对成功Flush等待票据;"later-batch-unknown"替身断言无死锁,行945–952)。
**R2:通过。** 源码:schema2严格解析(`StrictJson`拒绝重复属性与尾随JSON,行1125–1130);`LoadManifest`(行1054–1078)字段集合必须与模板精确一致(未知/缺失字段拒绝)+逐字段类型校验+32KB上限;`ValidateManifest`(行1080–1105):RunId正则、Prefix必须等于RunId的精确派生(空前缀/任意前缀在数学上不可能通过)、Keys必须精确等于`prefix+_a/_b/_deleted`、manifest路径与RunId绑定同run、`CheckPath`拒绝`..`、多冒号盘符与逐级重解析点/链接(行1113–1123);cleanup授权要求`CollisionPreflight && !Running && !InFlight`且模式限定。负例证据(行824–879):22个篡改manifest+3个原始JSON畸形+3个路径变体+真实junction全部在登录前拒绝(0登录0网络)。`--cleanup`互斥run.lock(行440–444;并发拒绝替身行985–990)、只输出key哈希(行614,A-S3)。
**R3:通过。** 源码:`WriteNew`用`FileMode.CreateNew`(行1172–1177)——原result/log/diagnostic不可覆盖;`CleanupWith`(行607–639)保留原`ExecutionStatus/AssertionStatus/LastError`,`Completed = originalComplete && ok && …`不可升级,补救写入独立`cleanup-<guid>.json`;`Completed`不变式在**加载时**也强制(行1101–1102,篡改Completed=true会被拒绝)。替身证据:断言失败+清理成功仍Failed("acknowledged-noop-write"行960–967);补清理自身Unknown不重试且原判保持失败(行939–942);finally清理失败持久化(行969–979)。
**R4:通过。** 源码与L run证据:删除目标先种值并经DirectGet确认存在且值精确(行531–535);两账号写不同精确值;`VerifyOwner`以新登录/新Cookie/新Owner打开同缓存,经真实Get达Ready、精确值断言(a==value、b==value+"-b"、删除键缺席,行581–585)、关闭后持久快照pending/unknown/active/localOnly全0且baseline精确(行588–596);L2后重读101(行481);`EnvironmentIO.Jars`强制每次登录Cookie互异(行357–364)。L run日志:L1/L2/L3+双账号双新会话清理全部PASS。
**R5:通过。** 源码与O run证据:C子进程新Owner真实Get后断言Ready+基线精确值+持久清洁,观察文件记录**真实**重开状态(NotLoaded,行181–201);Unknown场景新旧handler共享mutationCount、重开后主动Flush且计数保持1(不重发跨handler证实,行275–308);缺主档+bak/tmp遗留均RecoveryRequired(行336–346);诊断全部来自真实状态/票据(`SnapshotDto`传入实际`Status`;ownerObservations含playerId/epoch/ownerInstanceId/statusBeforeClose/ticketStatuses);产物脱敏扫描覆盖fixture值、Cookie/Token头、用户路径(行1161–1165,`repair-artifact-scan.json`覆盖4个run)。
## 矩阵逐行核对(S0–F2)
交付文档§4的逐行映射与源码/产物一一核对属实;关键项独立验证:S0(`repair-cli-guards.json`+Main分派在任何登录前退出)、S1/S3(负例库)、O1–O8(本复核复跑8/8)、D1–D3(diagnostic实查+扫描)、H1–H3(含Owner级越界本地接受后零外发且冻结Unknown,行83–96)、L0–L6(L run产物逐项)、L7(合成,非正式服制造)、R1–R3回归、U1、F1。**F2(外部实施复核)由本报告完成。**未发现矩阵条目与证据不符。
## 本复核独立复跑(不沿用实施者结果)
| 命令 | 结果 |
|---|---|
| `dotnet run --no-restore --project KVStage3CTests -- --offline` | 8/8通过(含L7),退出码0 |
| `KVContractTests` | 42/42,退出码0 |
| `KVSyncTests` | 86/86,退出码0 |
| `KVSyncCoordinatorTests` | 29/29,退出码0 |
正式run盘点(runs/全量manifest扫描):3个无写入的预检失败run(CleanupAllowed=false,无可清数据)+5个Completed且双账号CleanedAccounts的run(含最终L `20260923073720_199d4e8a…`与首次L `20260923073436_93b96817…`)——**无遗留正式fixture,无需新正式验证或再次cleanup**。
## 提示词专项裁决
1. **"最后一次测试宿主失败分支补强后未复跑生产回归/Unity是否可接受":可接受。**理由:(a) 三个回归项目的csproj为显式文件清单,不编译`KVStage3CTests/Program.cs`——本复核已在最终源码状态下亲自复跑42/86/29全过;(b) Unity工程只编译`Client/Assets`,CodexOutput不在其中,八份生产源码hash未变,`repair-unity-compile.json`(Success=true、0错误/0警告)对其有效;(c) 最终正式run L与最终源码hash对应(交付§3明确为对应最终源码重跑)。
2. **限定自审的保守限制符合已批准范围**:忽略取消传输保持等待不伪报收尾、崩溃遗留Running/InFlight拒绝补cleanup需人工核查、schema1不自动升级——均为保守方向,未扩大授权。
## 非阻塞观察(P3,仅记录,不需返工)
1. `WriteArtifacts`的`File.Copy`会覆盖项目级`Latest-*.log`汇总副本;per-run产物仍不可变。仅提示后续工具不要把Latest-*当作不可变证据。
2. runs/目录含故意损坏的负例manifest(如trailing-json);自动化扫描需跳过simulation负例fixtures,否则解析报错(本复核扫描时已遇到,属预期测试数据)。
3. `Confirm`在成功Flush后逐票等待无token——因CompleteBatch已同步完成对应票据,实际不会悬挂;仅备忘。
## 结论与下一步
- **R1–R5全部通过;矩阵S0–F2逐行核验通过(F2闭环);无新P1/P2。**
- 建议:主会话据此裁决恢复3C通过(并按其流程恢复G3关闭表述),随后按4A任务书前置门批准4A编码。本报告不自动授权4A。