Skip to content

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

Closed

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. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    domain:devxDomain lane — seat card indexed by label:pm:seat
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 6, 2026
  2. added
    pm:queueReady for the PM dispatch loop
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 6, 2026
  3. 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

  4. self-assigned this
    on Aug 6, 2026
  5. 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

  6. 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

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpm:queueReady for the PM dispatch looptoolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions