59 lines
7.9 KiB
Markdown
59 lines
7.9 KiB
Markdown
# 阶段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。
|