未认领。 实现 #4916 时按议题要求顺带扫了 scripts/ 下的同形状静默跳过,这三条与 #4916 是同一个缺陷 ,但在别的脚本里;不在那条 PR 的范围内(改了会让它失焦),按 Prime Directive #10 单独归档。
形状
和 #4916 一模一样:脚本声明一个 扫描根,walker 在读不到该目录时返回空 而不是抛错,于是根一改名 → 收集到 0 个文件 → 循环一次都不进 → errors 为空 → exit 0,门禁绿 。区别只在于 #4916 的空 catch {} 让 N 变小 ,这三条让 N 变成 0 —— 更彻底,同样安静。
1. scripts/check-single-authz-resolver.mjs:38
function walk ( dir , out = [ ] ) {
let entries ;
try { entries = readdirSync ( dir ) ; } catch { return out ; }
唯一扫描根是 walk(join(ROOT, 'packages'))。packages/ 改名 → 零文件 → "没有重复的 authz resolver",绿。
值得注意的是同一个文件里已经有正确写法 :第 71 行处理 DELEGATORS 缺失时是 errors.push('Delegator missing: ' + rel),响亮。修法照抄本文件下方即可。
2. scripts/check-startup-registry-verdict.mjs:217-222
function collectSourceFiles ( dir , out = [ ] ) {
let entries ;
try { entries = readdirSync ( dir ) ; } catch { return out ; }
第 846 行 collectSourceFiles(scanRoot) —— scanRoot 解析不到时同样静默返回 0 个文件。这个脚本的注释里写了整整一屏"启动期把没验证的东西写成 verified 有多危险",而它自己在扫不到源码时会给出一个空的 verdict。
3. scripts/check-driver-conformance.mjs:147-152
const listDir = ( dir ) => { try { return readdirSync ( dir ) ; } catch { return [ ] ; } } ;
DRIVERS_DIR = join(ROOT, 'packages', 'plugins')(第 79 行)。packages/plugins/ 改名 → 零个 driver → "所有 driver 都合规",绿。
判定为不同形状、不建议一起改 的
scripts/check-changeset-fixed.mjs / check-override-consistency.mjs —— catch { continue; } 出现在 glob 展开 的中途(readdirSync 某个 * 段、JSON.parse 某个 package.json)。这是在遍历一个本来就可能不存在的候选集合,不是"声明的根消失了",跳过是对的。
scripts/check-nul-bytes.mjs:168 —— 读不到时 skipped.unreadable.push(file),记账了 ,不是静默。
scripts/check-changeset-no-major.mjs:76 —— 没有 .changeset/ 时明确 console.log 后 exit 0,是声明过的 行为,不是吞掉。
建议的修法
和 #4916 落地的一致:扫描前先校验根可解析,不可解析就点名报错退出,不要 加"可选根"开关;并把红-绿双向证明折进各脚本已有的自检(有的话)。三条可以一条 PR 一起改,也可以拆 —— 但不要 和 #4916 合并,那条 PR 的范围是 check-doc-authoring.mjs。
关联
check-doc-authoring 的 walk 用 catch {} 吞掉不存在的 ROOT —— 目录一改名,门禁静默变瞎并继续报绿 #4916 —— 同缺陷,scripts/check-doc-authoring.mjs,已修
docs-accuracy-audit.js 的 ALL_HANDWRITTEN 清单 11 条全部指向改名前的 protocol/objectos/* —— 内部文档审计静默漏审整个 protocol/kernel 目录 #4851 / PR fix(tooling): 文档审计范围改为从目录派生,清单与磁盘不一致时判红 (#4851) #4921 —— 同缺陷,.claude/workflows/docs-accuracy-audit.js,已合
check:react-declaration-parity 是唯一没接进任何 workflow 的源码审计门禁,且无 MANIFEST 时静默 skip 退出 0 —— 它现在永远不可能红 #4690 / check:i18n 应把 unknown-authoring-key lint 判为失败 —— 否则第十份 extract 配置还会照抄同一个错 #4804 / check:init-service-contract 只认 getService,不认 getServiceAsync —— #4772 就是从这个洞里溜过去的 #4835 / merge.os-regen.driver 指向「上一个装过依赖的 worktree」的绝对路径 —— 该 worktree 一删,全容器的生成物合并驱动就坏了 #4868 / .claude/skills/** 的 markdown 不被任何门禁扫描 —— check:nul-bytes 只看 JS/TS,check:doc-authoring 的 ROOTS 不含 .claude/ #4890 —— 同族先例
未认领。 实现 #4916 时按议题要求顺带扫了
scripts/下的同形状静默跳过,这三条与 #4916 是同一个缺陷,但在别的脚本里;不在那条 PR 的范围内(改了会让它失焦),按 Prime Directive #10 单独归档。形状
和 #4916 一模一样:脚本声明一个扫描根,walker 在读不到该目录时返回空而不是抛错,于是根一改名 → 收集到 0 个文件 → 循环一次都不进 →
errors为空 → exit 0,门禁绿。区别只在于 #4916 的空catch {}让 N 变小,这三条让 N 变成 0 —— 更彻底,同样安静。1.
scripts/check-single-authz-resolver.mjs:38唯一扫描根是
walk(join(ROOT, 'packages'))。packages/改名 → 零文件 → "没有重复的 authz resolver",绿。值得注意的是同一个文件里已经有正确写法:第 71 行处理
DELEGATORS缺失时是errors.push('Delegator missing: ' + rel),响亮。修法照抄本文件下方即可。2.
scripts/check-startup-registry-verdict.mjs:217-222第 846 行
collectSourceFiles(scanRoot)——scanRoot解析不到时同样静默返回 0 个文件。这个脚本的注释里写了整整一屏"启动期把没验证的东西写成 verified 有多危险",而它自己在扫不到源码时会给出一个空的 verdict。3.
scripts/check-driver-conformance.mjs:147-152DRIVERS_DIR = join(ROOT, 'packages', 'plugins')(第 79 行)。packages/plugins/改名 → 零个 driver → "所有 driver 都合规",绿。判定为不同形状、不建议一起改的
scripts/check-changeset-fixed.mjs/check-override-consistency.mjs——catch { continue; }出现在 glob 展开的中途(readdirSync某个*段、JSON.parse某个package.json)。这是在遍历一个本来就可能不存在的候选集合,不是"声明的根消失了",跳过是对的。scripts/check-nul-bytes.mjs:168—— 读不到时skipped.unreadable.push(file),记账了,不是静默。scripts/check-changeset-no-major.mjs:76—— 没有.changeset/时明确console.log后 exit 0,是声明过的行为,不是吞掉。建议的修法
和 #4916 落地的一致:扫描前先校验根可解析,不可解析就点名报错退出,不要加"可选根"开关;并把红-绿双向证明折进各脚本已有的自检(有的话)。三条可以一条 PR 一起改,也可以拆 —— 但不要和 #4916 合并,那条 PR 的范围是
check-doc-authoring.mjs。关联
catch {}吞掉不存在的 ROOT —— 目录一改名,门禁静默变瞎并继续报绿 #4916 —— 同缺陷,scripts/check-doc-authoring.mjs,已修.claude/workflows/docs-accuracy-audit.js,已合check:i18n应把 unknown-authoring-key lint 判为失败 —— 否则第十份 extract 配置还会照抄同一个错 #4804 / check:init-service-contract 只认getService,不认getServiceAsync—— #4772 就是从这个洞里溜过去的 #4835 /merge.os-regen.driver指向「上一个装过依赖的 worktree」的绝对路径 —— 该 worktree 一删,全容器的生成物合并驱动就坏了 #4868 /.claude/skills/**的 markdown 不被任何门禁扫描 —— check:nul-bytes 只看 JS/TS,check:doc-authoring 的 ROOTS 不含 .claude/ #4890 —— 同族先例