Skip to content

check-single-authz-resolver 的扫描语料没有下限断言:根解析成功但一个文件都没扫到仍然绿(observation) #5916

Description

@os-zhuang

模式

与 #4932 完全同族,第三个门禁。实现 #4932 时顺手核到的,不在那一单的文件面内,单独记账。

scripts/check-single-authz-resolver.mjs 已经补过 #4916 那一半 —— 每个 SCAN_ROOTS 先解析,死根按名报错:

function collectScanFiles(root = ROOT, roots = SCAN_ROOTS) {
  assertRootsResolvable(root, roots);
  const out = [];
  for (const rel of roots) walk(join(root, rel), out);
  return out;   // <- 长度从不断言
}

缺的是另一半:根解析成功、但走完一个文件都没收到,out 为空 → 检查 (1) 遍历空集合 → 零 error → 绿。目录还在、可读,assertRootsResolvable 满意;语料搬走了(子树迁出 packages/、扩展名换了、walk 的过滤条件收窄)这件事没有任何断言看得见。

它自己的模块头已经把问题写出来了

scripts/check-single-authz-resolver.mjs:23-36 那段:

walk() used to open with … the scan cannot tell you it never ran; only its (unprinted) file count could, and nobody reads a count that is not printed.

那一段接着说,packages/ 整体改名今天之所以会被下游抓到,是因为两个 DELEGATOR 恰好也在同一个根下,并明说这是「luck, not coverage」。补一条扫描数下限就把这份运气换成机制。

为什么是 observation,不是当前缺陷

SCAN_ROOTS = ['packages'],今天有数千个 .ts,实测扫描数远大于零 —— 记录的是可蒸发性,不是已蒸发,和 #4932 正文的定性一致。

修法(与 #4932 落地的形状一致)

collectScanFiles 里按根统计:任一声明的根产出 0 个文件即抛错、按名报红。参 PR(#4932)给 scripts/check-doc-authoring.mjs 的 EmptyRootError —— 下限取「每个声明的根至少 1 个文件」,由本次 walk 现算,不引入需要维护的高水位棘轮;并在 self-test 里钉红/绿两个方向(单根为空 → 红且只点名该根;全空 → 红且报总数 0;恢复 → 绿)。

相关

Activity

  1. claude commented on Aug 6, 2026

    @claude
    Contributor

    发现分诊轮:判级 = 晋级 pm:queue(域 domain:devx 保持不变)。

    过时前提检查:成立。 origin/main @ 7adc841 复核 scripts/check-single-authz-resolver.mjs:SCAN_ROOTS = ['packages'](:70)、assertRootsResolvable(:91)已在、collectScanFiles(:128-129)先断言根可解析后 out 长度从不断言、:143 直接 for (const abs of collectScanFiles(root)) —— 与正文逐字一致,缺口仍在。

    晋级理由(为什么不持有 —— 这是本轮唯一按「CI 判绿正确性」升级的一条):

    1. 它是发现型闸门在「什么都没发现」时静默通过这一族的第三例,而前两例(check-doc-authoring / check-driver-conformance)已由 发现型闸门在「什么都没发现」时静默通过:check-doc-authoring 与 check-driver-conformance 缺非空断言 #4932 落地关闭(completed) ⇒ 修法形状不需要再设计,照抄 EmptyRootError 即可,下限由本次 walk 现算,不引入需要维护的高水位棘轮;
    2. 判据不是「今天红不红」,而是这道门能不能诚实地告诉你它跑没跑 —— 门禁本身的模块头(:23-36)已经把这件事写死:packages/ 整体改名今天之所以被抓到,靠的是两个 DELEGATOR 恰好在同一根下,原文自称 "luck, not coverage"。把运气换成机制属恢复不变量(restore-invariant),按 step 0 自动入队,不占维护者决策位;
    3. 同族的两处已修、这一处没修,本身就是不对称 —— 留着等于让同一道纪律在三个门禁上有两种答案。

    派发令建议(照 #4932 的落地体例):collectScanFiles 按根统计,任一声明的根产出 0 个文件即抛错并按名报红;self-test 钉红/绿两个方向(单根为空 → 红且只点名该根;全空 → 红且报总数 0;恢复 → 绿)。

    查重:三仓搜 check-single-authz-resolver / EmptyRootError / 空语料闸门,命中 #4932(已闭,同族先例)、#4916 / #4930(死根按名报错,是本条缺的另一半,均已落地)、#4690(「提取失败必须红」的出处);无重复入口。

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. self-assigned this
    on Aug 6, 2026
  3. hotlong commented on Aug 6, 2026

    @hotlong
    Contributor

    认领:PM 循环第 3 轮(devx 车道)
    会话:session_01BDmDsu2575gDxeMCxXhDE3
    分支:claude/issue-5916-authz-resolver-scan-floor
    Worktree:objectstack-issue-5916
    域:domain:devx
    文件面:scripts/check-single-authz-resolver.mjs(越界即停,报告说明)

    按分诊裁定照 #4932 的 EmptyRootError 形状:按根统计,任一声明根产出 0 文件即按名报红;self-test 钉红/绿双向;下限现算不引入棘轮。


    Generated by Claude Code

  4. hotlong commented on Aug 6, 2026

    @hotlong
    Contributor

    验收(devx 车道,会话 session_01BDmDsu2575gDxeMCxXhDE3):ACCEPT → PR #6056,已转 ready 并挂 auto-merge(required 集随平台恢复转绿即自动入队)。

    交付摘要:

    • scripts/check-single-authz-resolver.mjs 照 发现型闸门在「什么都没发现」时静默通过:check-doc-authoring 与 check-driver-conformance 缺非空断言 #4932 EmptyRootError 形状补按根下限:任一声明根产出 0 文件即按名报红并带本次总数;下限现算零棘轮;reportEmptyRoots 与死根报错分开、指向两种真实成因。
    • 前提复核带精化:探针 (a) 实测「红但红错理由」(两条误导性 Delegator missing 顶罪)—— 比 issue 字面的「整体绿」更准,即模块头自认的 luck-not-coverage;探针 (b)(.mts 重复解析器)在未改 main 上绿 = 缺口实证。
    • 还原式反证 7 断言全红,含钉住旧误诊的那条(「报空扫描而非误导性 delegator 判决」);end-to-end:探针 (a) 在修后脚本上退出 1 并报 packages — 0 files,取代顶罪行。真语料 3053 文件实跑绿,零误报。
    • CI 门禁族双绿(ESLint step 17 即新 self-test 真跑);其余红均为 Set up job 重试环签名(3-6 分钟时长吻合)+ filter job 死亡引发的全量拉起,平台故障残波,非本单缺陷。
    • 越界发现:check-single-authz-resolver 的 walk 只收 .ts,packages/ 下 12 个 .mts 从不被扫描(observation) #6070(walk 只收 .ts,12 个 .mts/.cts 从不进语料 —— 实测休眠、与按根下限结构性正交、亦非被否的高水位棘轮;finding 持有待分诊)。

    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions