模式
两个闸门都靠「扫描发现目标 → 逐个检查」工作,而发现环节的失败被吞成空集合,空集合又天然通过所有检查。目录一旦被改名或移走,闸门就变成永远为绿的装饰品,且没有任何信号。
scripts/check-doc-authoring.mjs:45
const files = [];
for (const r of ROOTS) { try { walk(r, files); } catch {} }
某个 ROOT 不存在 → 静默少扫一批文件。极端情况 files 为空 → 「215 files clean」变成「0 files clean」,仍然退出 0。
scripts/check-driver-conformance.mjs:150
const listDir = (dir) => { try { return readdirSync(dir); } catch { return []; } };
…
function discoverDrivers() { return listDir(DRIVERS_DIR).filter(…) }
DRIVERS_DIR 不存在 → 发现 0 个 driver → 一致性检查无事可做 → 通过。模块头写着「An empty ledger is the intended steady state」,那说的是账本(LEDGER)可以为空;发现结果为空是完全不同的一件事,不该同样放行。
仓库里已有正例
temporal-conformance 那次(#4081)加过一条明确的非空守卫:「both TZ-skewed steps carry a non-vacuity guard that fails the job if the process zone is UTC or the offset is zero, so the coverage cannot silently evaporate」。这里缺的就是同一件东西。
建议
两处各加一条下限断言:发现数为 0(或显著低于上次)时 ::error:: 退 1,而不是打印一句「clean」。check-doc-authoring 已经在打印文件数,把那个数变成断言即可,成本极低。
相关
优先级不高 —— 这两处目前都在正常发现到目标(实测 check-doc-authoring 报 215 个文件)。记录的是可蒸发性,不是当前已蒸发。
模式
两个闸门都靠「扫描发现目标 → 逐个检查」工作,而发现环节的失败被吞成空集合,空集合又天然通过所有检查。目录一旦被改名或移走,闸门就变成永远为绿的装饰品,且没有任何信号。
scripts/check-doc-authoring.mjs:45某个 ROOT 不存在 → 静默少扫一批文件。极端情况
files为空 → 「215 files clean」变成「0 files clean」,仍然退出 0。scripts/check-driver-conformance.mjs:150DRIVERS_DIR不存在 → 发现 0 个 driver → 一致性检查无事可做 → 通过。模块头写着「An empty ledger is the intended steady state」,那说的是账本(LEDGER)可以为空;发现结果为空是完全不同的一件事,不该同样放行。仓库里已有正例
temporal-conformance 那次(#4081)加过一条明确的非空守卫:「both TZ-skewed steps carry a non-vacuity guard that fails the job if the process zone is UTC or the offset is zero, so the coverage cannot silently evaporate」。这里缺的就是同一件东西。
建议
两处各加一条下限断言:发现数为 0(或显著低于上次)时
::error::退 1,而不是打印一句「clean」。check-doc-authoring已经在打印文件数,把那个数变成断言即可,成本极低。相关
filterjob 一旦失败,Test Core / Build Core / Dogfood 会全部 skipped 而分支保护判为通过 —— 隐式 success() 今天已第三次咬人 #4928 是 GitHub Actions 层的同类:「什么都没跑」被判为通过。Spec Coverage定时任务今天 06:03 失败过一次(run 30788919747),7 次里 1 次,单次失败暂未定性,一并记在这里备查。优先级不高 —— 这两处目前都在正常发现到目标(实测
check-doc-authoring报 215 个文件)。记录的是可蒸发性,不是当前已蒸发。