744a1cb086
用户裁定 2026-10-24:缺 mscoverage 组件时**失败**,不做 skip。于是 P1 之后那个 "钩子只挂 16/28 套"的缺口关闭了。 为什么挂这一根而不是补 12 根 per-module 钩子:本闸跑**全部 28 套**,并且守 "已覆盖行只增不减"的基线台账。这是 per-module 钩子结构性做不到的——删掉一套 测试,它那根钩子只会因为"没有文件要检查"而静默跳过(Skipped 不等于失败)。 实测接线代价:45 s(28 套,含 28 次 MSVC 编译与插桩运行)。 FAIL 语义已按本仓"合成自证"的纪律验证(不是只测绿的那一半):把 DTU_MS_COVERAGE 指到一个不存在的文件 → 钩子 Failed、脚本退出码 2、并打印可 执行的 [ENV] 提示(说明该 exe 装在哪、怎么覆盖)。脚本对显式环境变量刻意 "不做自动探测回退",所以指错会被点名,而不是悄悄换一份工具跑出另一本账。 顺手修掉三条**现在已经不成立**的文档说法(门禁文档最贵的就是骗人): - 口径 §7 第 8 条:原写"只有 BuildTools 且没勾代码覆盖率工具的机器会退出码 2"。 实测本机 Community 18.10 与 BuildTools 18.9 **两份安装都自带**该 exe(mtime 2026-09-15 02:30 / 2026-09-05 16:17,都是各自安装当日,不是后来补勾)→ VS 18 的 BuildTools 默认就带它。真实风险面只剩:裸 MSVC 无 VS 的机器、环境变量指错、 以及靠 PATH 兜底的环境。 - 门禁说明 host-unit-tests.md 盲区第 4 条:原写"没有对应钩子的模块 = 零回归"—— 如今 12 套新模块由总闸兜住,这句话已经不成立,改成两种口径并写清触发面。 - 同篇第 6 条:原写"无覆盖率统计"。行/函数覆盖**已有**度量(本闸出 Cobertura 并 守基线),仍无的只是分支覆盖——那是用户裁定 2026-10-23 记下的**已接受缺口**, 不是待办,改口时把这个区分写清楚。 钩子计数同步(新增 1 根 → 声明 40 根 / pre-commit 阶段 39 根 + commit-msg 的 gitlint,已用脚本核对,不是手数):AGENTS.md(总数、枚举、索引表)、 pre-commit使用说明.md(66 / 91 / 234 三处,含清点日期)、门禁说明 README (正文与索引标题,另加一行索引指向口径文档——23 篇不变,同一事实不在两处维护)、 门禁说明 gitlint.md(--no-verify 跳过的"其它 38 个"→39)、并行任务工作树方案。 自查:end-of-file-fixer 与 trailing-whitespace 复跑 Passed(首轮 --all-files 只 因末行空行红过一次,已按钩子自身规范化);doc-links --all --sections-strict 通过 (178 个文档);id-check --strict 零台账外新账;8 个改动文件 U+FFFD = 0、无 CRLF。 零代码改动,故未跑 @build。未 push。