test: validate PCH failure-repair regression on actual Debug and Release targets - #187
Conversation
Add fixed creator/consumer caller-repair sequences with exact source provenance, original diagnostics, PCH/object/executable identities, preserved cache generations and explicit not-run phases. Reuse #186 collector helpers without changing them. No product, VERSION, original test inventory or benchmark harness changes. No automatic recovery, retry, future timestamps, default cancellation or release authorization.
Iviesever
left a comment
There was a problem hiding this comment.
实质验收决定:接纳本 PR 的限定测试增量;不放行 5.6.0 发布
验收对象:base 1a7c460c84e3614ef10ce9266ec8dfb5003b6a5a → head 65cbd8536c035f188f58f188bf332a8869d33bbe。CI test-merge bd5f4ccf2541a374ca692749135cea9a66e83761 的两个父提交精确匹配;head/test-merge tree 均为 96629b0d75061027ca0eacd4a5522806215b95f7。两份 Windows 源码归档均独立重算全部 438 个文件的 Git tree;排除两个新增文件后精确恢复 base tree 280326bc1ce6bd46b962311d57e02b55f628af44。产品、原生测试清单、原性能 harness、共享 freshness helper 与 VERSION 均未改。本轮只有一个提交、两个新文件、397 additions/0 deletions,无竞争 PR。
一、实际 Windows 证据,不是总绿灯或本地模拟
全部使用原始 attempt 1,无重跑、追加 head、降低门槛或失败覆盖。本地环境为 Linux;没有声称本地运行过 Windows/MSVC。
- Native C++ #756 / run34752958705:完整读取 Debug 四个配对子分片 job
103713549157 / 103713549171 / 103713549187 / 103713549214原始日志,八个子分片实际执行数为8,9,9,9,10,12,11,11,逐项确认 79/79 独立测试程序运行通过。Debug prepare job103712484171 原始日志另核对:83 个产品翻译单元、82 个共享非 main 单元;ambient CL/LINK 隔离、external include、ASan/LibFuzzer/OpenMP、默认库/搜索路径、PCH/header-unit/P1689 freshness、__has_include、link side-output 等真实对照;canonical 参数 444 项和高风险语义变体 44 项实际执行。KASAN 项仅证明所有权 fail-closed,不冒充真实内核运行。 - Native Release #634 / run34752958684:完整读取 Release 四个配对子分片 job
103713286368 / 103713286367 / 103713286343 / 103713286341,同样逐项 79/79。完整读取 Stage0 prepare job103712470597,核对 pinned seed 与 83/82 TU、5.5.0。两配置都实际保留 prewrite inventory 44、target admission 84、recipe inventory 28、write-domain 39、readonly mapping 33 等边界测试;complete write set、full project transaction、readonly authorization 仍为 false。原始 C2338、LNK2019/LNK1120 和警告输出未被隐藏。 - PCH Failure Recovery #1 / run34752958691:两配置原始产物均下载并由独立离线审计核对,不仅读取 summary.passed。creator/consumer × Debug/Release 共 4 条五阶段序列、20 次真实调用全部完成;4 次故意编译失败保留 exit 4 和完整原始诊断;8 次暖启动无 PCH/消费者编译、无链接、所记录的 PCH/creator/object/exe 身份不变;not-run=0。
- 实际目标明确选择 Debug/MTd 或 Release/MT;配置目录和 creator/consumer 的
_DEBUG断言一致。失败不链接、不运行旧程序、不改变旧 exe/运行事件历史。creator 修复重建 PCH 和两个消费者;consumer 修复保留 PCH/creator/main obj,只更新 worker 与链接。修复后运行新一代程序 37→41 或 43,并核对 stdin、环境、空参数/带空格参数、Unicode 工作目录、stdout/stderr 和退出码。 - 8 次输入变更都是普通写入,保留上一代和本次实际 mtime 与观测时间;独立核对新源码确实晚于既有产物、且不在观测时间之后。没有未来时间戳、阶段间清缓存、重试或 freshness 放宽。PDB/IDB 内容没有被打开或复制,不将结果解释为 PDB 静止/完整写集合证明。
二、自举和包验收
完整读取 job103713640388:pinned seed → Stage0 → Stage1 → 清空构建状态 → Stage2,两次 self-host 均实际重新编译 83 TU;安装/重装/卸载/PATH 所有权通过。
Stage1 SHA256 b9e8ade6a6fa3fb2abf029b79bcd173fb28e56f6a4865f37c6e2c1e235b16afd;Stage2 SHA256 dfb70e7c67120d21eae28693a5dc1bf715d9485515a610e72535154fc89abc2c。两者不同,原门槛证明干净重建闭环,不宣称逐字节可重现。
原始包 artifact10316668527 已下载,独立核对外层 Actions ZIP SHA256 25826e63b1682c1413f83d7fb8166d48a697b8f6e2ba5605e5e73518ab868618、内层 ZIP/sidecar 9ac2ae15c2c779caa8a0ab3fa650676895009457dc6aa857b503979788b19f6f,仅七个扁平运行时文件,VERSION 5.5.0,AMD64 PE 程序哈希等于日志中已验证 Stage1。其余文本与 exact source 仅允许 Git checkout CRLF 差异。Documentation #198/run34752958655 通过;publish-release 明确 skipped,不计作发布成功。
三、原始独立 ABBA #627:门槛通过,但不利样本不清账
Performance #627/run34752958686,完整原始 job103712470592 与 artifact10316363294(SHA256 0a37590d8402f70b5355f4c1d5bbf06ae69c5ea4961936926a5efcd6731a26e3)已复核。原 observer-OFF 19×4 ABBA 的 76 对样本全部保留,72 组有内部数据的完整 counter/breakdown/cache-hit/miss 向量完全一致。四对 external/no-op 的内部计数保持 unavailable,不伪造成零。逐对重算,不用两个独立中位数之差冒充配对中位数。
external/no-op 四对变化:
-5.2205 ms / -32.0492357%+3.9498 ms / +36.4685570%+0.8329 ms / +7.8266835%+0.3213 ms / +2.9106688%
配对中位差 +0.5771 ms / +5.3686761%,未触发事先声明的 external/no-op 配对中位数同时 >+1ms AND >+10% 阻塞门槛。该规则不是其他 18 场景的统一阈值。
其他必须保留的不利结果:target-scale-cold 配对中位差 +354.135ms/+3.9759804%,最不利 +4751.707ms/+120.6877748%;single-tu 中位差 +28.0325ms/+20.4340942%,最不利 +734.216ms;link-only 中位差 +36.839ms/+57.0938878%,最不利 +562.087ms。全部 19 场景的有利/不利配对及 raw JSON 均完整保留;没有 AA 扣除、异常值删除、归因噪声或重跑取代。
因此,本决定仅基于既定 PR 门槛、完整正确性/包证据及产品/构建/基准契约零改动,接纳这个测试增量;不是零开销结论,不是完整候选性能通过,也不是稳定版风险豁免。 上述新尾部必须随历史问题进入后续累计性能处置。不能断言它与 common129 同因,更不能用本轮外部 no-op 中位数清零历史问题。
四、范围与下一接手点
这只覆盖“调用者修复源码后再构建”,不增加产品自动恢复。没有默认 CLI 取消、写锁、完整事务、会话或驻留服务。#172 继续 Draft/HOLD;历史 #172/#176 C1041、#170 +1.6946ms/+13.7988%、#180 Performance#599 +2.07175ms/+16.2700%、common129 +5.354s/+6.480s、#186/#625 不利尾部均保留为待处置发布阻塞,本轮 #627 新不利样本一并记账。VERSION 仍为 5.5.0,不改历史 tag/资产、不发布。
本次只比较 1a7c460… → 65cbd85…。下一单主题应收口“released v5.5.0 → 完整候选的累计变化/实际执行证据/剩余缺口映射”,只补真实未覆盖项,不重复造测试;无缺口再冻结完整候选进入累计性能与历史风险处置。已发现 release-cumulative-evidence.yml 仍锁定 v5.4.0/d041668…,不可直接冒充 v5.5.0 基线;正确 released v5.5.0 当前解析为 08cdc20a9f9380e18132d21a619288224fd07fd4。入口调整另拆主题,本 PR 不混入。
所有实跑采用原 attempt1;本轮断言自检、PCH 原始证据审计、ABBA 离线重算和包审计首次均通过。可携带证据包含四份原始 Actions artifact ZIP 与审计脚本/结果;原有 native 大日志已通过连接器完整读取,另保留明确标注为人工转录的 job/逐项执行台账,不把台账伪装成原始日志归档。接下来可将标题改回 test:、转 Ready 并仅以精确 head 正常合并;实际 merge 身份和合并后 CI 另行核对后更新 #164。
Scope and predeclared decision gates
Test-only 5.6.0 cumulative correctness increment; NOT a performance optimization or release authorization. The
perf:title only invokes the repository's existing independent ABBA workflow; its harness and thresholds are unchanged. Keep Draft until substantive evidence review.1a7c460c84e3614ef10ce9266ec8dfb5003b6a5a(merged perf: validate cumulative foreground failure-repair compatibility #186).65cbd8536c035f188f58f188bf332a8869d33bbe.96629b0d75061027ca0eacd4a5522806215b95f7.Coverage mapping before implementation
Existing
cpp/tests/e2e/mqb_pch_e2e_tests.cppcovers cold/warm, source/header changes, missing PCH repair, discovery/config overrides, static/DLL and fail-closed unsupported modes. Its mainbuild_args, static and DLL paths explicitly select--debug; a Release-built test host is NOT proof those target paths run in Release.tests/native/verify_pch_inspection.ps1tests side-effect-free coordinator inspection with a Debug contract; it is not real CLI creator/consumer compilation failure recovery. #186'sverify_foreground_recovery.pycovers ordinary/named-module compile/link failure and caller repair, without PCH. Existing real-MSVC ownership/PCH probes are adverse service-lifecycle studies, not normal CLI recovery acceptance, and their C1041 counterexamples remain unresolved.This PR adds only the missing normal CLI PCH creator or consumer compilation failure -> caller fixes the source -> new output generation -> warm reuse. It reuses #186's artifact/hash/freshness helpers without modifying them. No product automatic-recovery feature is introduced and no broad existing test is duplicated.
Fixed matrix and assertions
Debug and Release each build the exact candidate MQB using the pinned seed and run two independent five-phase sequences: cold, warm, expected compile failure, caller repair, repaired warm. 20 total real MQB invocations across both configurations, including four intentionally induced compile failures and eight warm invocations. Dependent phases stop on the first unexpected outcome and are explicitly not-run; the other independent mode/configuration is still collected. No retry, future timestamps, inter-phase cache cleanup, global service kill, /FS removal or silent /Z7 change.
Actual targets receive explicit
--debug --runtime MTdor--release --runtime MT, retain configuration-specific PCH/creator object paths, and check_DEBUGconsistency in both creator and consumer sources. A header-only creator edit must regenerate PCH, compile both consumers in the proper order and link once. A worker-only edit must preserve the PCH pair and unchanged main object. Expected failures retain exit 4 and the original distinctive compiler diagnostic, may not link/run the previous executable, and must preserve the previous program event history. Repairs execute distinct generations (37 -> 41 or 43). Warm invocations may not compile PCH/consumers/link or change recorded PCH/object/executable hashes, sizes or mtimes. Input, environment, empty/space arguments, Unicode cwd and stdout/stderr are checked.The workflow preserves source.zip, exact base/head/tree/version, seed/candidate hashes, full build transcript, each invocation argv/stdin/input identity, raw stdout/stderr, actual executable/PCH/creator generations, cache/dependency records, original failures and not-run phases. PDB/IDB contents are deliberately not opened or copied. This is not proof of PDB quiescence, complete writer sets, same-timestamp editing or historical C1041 resolution.
Gates established BEFORE Windows measurements
#164 remains the single roadmap/status entry. #172 stays Draft/HOLD; historical #172/#176 C1041, #170 +1.6946ms/+13.7988%, #180 Performance #599 +2.07175ms/+16.2700%, common129 +5.354s/+6.480s and #186/#625 adverse tails remain release-blocking risks. This per-PR comparison does not replace released v5.5.0 vs the complete candidate. VERSION remains 5.5.0. No default CLI cancellation/write lock, full transactions, sessions/residency, historical tag/asset changes or 5.6.0 release.
Local validation so far: reconstructed baseline archive tree exactly
280326bc1ce6bd46b962311d57e02b55f628af44; candidate tree exactly matches local reconstruction; Python self-tests, syntax, YAML matrix and diff whitespace checks passed. The working environment is Linux: no local Windows/MSVC execution is claimed. Windows and ABBA results pending.