Repository navigation
check-single-authz-resolver 的扫描语料没有下限断言:根解析成功但一个文件都没扫到仍然绿(observation) #5916
Description
Activity
发现分诊轮:判级 = 晋级
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 判绿正确性」升级的一条):
- 它是发现型闸门在「什么都没发现」时静默通过这一族的第三例,而前两例(
check-doc-authoring/check-driver-conformance)已由 发现型闸门在「什么都没发现」时静默通过:check-doc-authoring 与 check-driver-conformance 缺非空断言 #4932 落地关闭(completed) ⇒ 修法形状不需要再设计,照抄EmptyRootError即可,下限由本次 walk 现算,不引入需要维护的高水位棘轮; - 判据不是「今天红不红」,而是这道门能不能诚实地告诉你它跑没跑 —— 门禁本身的模块头(
:23-36)已经把这件事写死:packages/整体改名今天之所以被抓到,靠的是两个 DELEGATOR 恰好在同一根下,原文自称 "luck, not coverage"。把运气换成机制属恢复不变量(restore-invariant),按 step 0 自动入队,不占维护者决策位; - 同族的两处已修、这一处没修,本身就是不对称 —— 留着等于让同一道纪律在三个门禁上有两种答案。
派发令建议(照 #4932 的落地体例):
collectScanFiles按根统计,任一声明的根产出 0 个文件即抛错并按名报红;self-test 钉红/绿两个方向(单根为空 → 红且只点名该根;全空 → 红且报总数 0;恢复 → 绿)。查重:三仓搜
check-single-authz-resolver/EmptyRootError/ 空语料闸门,命中 #4932(已闭,同族先例)、#4916 / #4930(死根按名报错,是本条缺的另一半,均已落地)、#4690(「提取失败必须红」的出处);无重复入口。本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
- 它是发现型闸门在「什么都没发现」时静默通过这一族的第三例,而前两例(
认领: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
验收(devx 车道,会话
session_01BDmDsu2575gDxeMCxXhDE3):ACCEPT → PR #6056,已转 ready 并挂 auto-merge(required 集随平台恢复转绿即自动入队)。交付摘要:
scripts/check-single-authz-resolver.mjs照 发现型闸门在「什么都没发现」时静默通过:check-doc-authoring 与 check-driver-conformance 缺非空断言 #4932EmptyRootError形状补按根下限:任一声明根产出 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 分钟时长吻合)+
filterjob 死亡引发的全量拉起,平台故障残波,非本单缺陷。 - 越界发现:check-single-authz-resolver 的 walk 只收
.ts,packages/下 12 个.mts从不被扫描(observation) #6070(walk 只收.ts,12 个.mts/.cts从不进语料 —— 实测休眠、与按根下限结构性正交、亦非被否的高水位棘轮;finding 持有待分诊)。
Generated by Claude Code
模式
与 #4932 完全同族,第三个门禁。实现 #4932 时顺手核到的,不在那一单的文件面内,单独记账。
scripts/check-single-authz-resolver.mjs已经补过 #4916 那一半 —— 每个SCAN_ROOTS先解析,死根按名报错:缺的是另一半:根解析成功、但走完一个文件都没收到,
out为空 → 检查 (1) 遍历空集合 → 零 error → 绿。目录还在、可读,assertRootsResolvable满意;语料搬走了(子树迁出packages/、扩展名换了、walk 的过滤条件收窄)这件事没有任何断言看得见。它自己的模块头已经把问题写出来了
scripts/check-single-authz-resolver.mjs:23-36那段:那一段接着说,
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;恢复 → 绿)。相关
catch {}吞掉不存在的 ROOT —— 目录一改名,门禁静默变瞎并继续报绿 #4916 / 三个 check:* 脚本的扫描根消失时返回空数组而不是报错 —— 目录一改名,门禁在零个文件上报绿 #4930 —— 死根按名报错的两次落地,是本条缺的那一半的另一半。