在 #5286 (spec 测试层进 tsc)的实施中发现,记录备查,未认领。基线 origin/main @ 01c0baef9。
事实
packages/spec/tsconfig.json 的 include 是 ["src/**/*"],tsconfig.test.json(#5286 新增)同样只到 src。于是整个 packages/spec/scripts/** 不在该包任何 tsconfig 的 program 里——既不是「被 exclude 排除」,而是压根没被 include 选进来,所以连 check:type-check-coverage 的 TESTS_COVERED 都数不到它(该不变式只统计 include 根之下的测试文件)。
这批文件不是死代码:
vitest.config.ts 的 include 含 scripts/**/*.test.ts,共 9 个测试文件 在 pnpm test 里真的跑;
其余是 gen:schema / gen:openapi / check:liveness / check:strictness-ledger 等 20 多个 CI gate 脚本本体。
也就是说:这些脚本决定 spec 的生成物和多条 gate 的判定,却没有任何类型检查器读过它们。这正是 #4311 的缺陷类别,只是下沉了一层(#4311 关心「包级 tsc 覆盖」,#5286 关心「测试层被 exclude」,本单是第三种形态:根本不在 include 里 )。
实测
把 scripts/**/* 并进 #5286 的 tsconfig.test.json(需同时把继承来的 rootDir: "./src" 放宽到 ".",因为 scripts/ 在 src/ 之外)后:
分层:
层
数量
说明
config-tier
TS5097 x13
.mts 后缀 import,需要 allowImportingTsExtensions
config-tier
TS2593/TS2304 x2
scripts/build-schemas-check-mode.test.ts 用了全局 beforeEach/afterEach,需 vitest 类型
config-tier
TS7016 x1
check-generated.ts import 仓库根的 .mjs 无声明文件
code-tier
TS2339 x5 + TS7006 x1
scripts/build-schemas.ts:1208-1228 —— 一串 Property 'keys'/'rev' does not exist on type 'never',某个值被推成 never 后仍在被取属性
noise
TS6133 x7
未使用的局部/导入(build-docs.ts x4、build-openapi.ts、generate-sbom.ts)
code-tier?
TS7006 x1
check-liveness.mts:618 隐式 any 参数
按 AGENTS.md 已写下的纪律:先修 config 层再读残差,build-schemas.ts 那堆 never 才是真正要看的东西——而 build-schemas.ts 是 gen:schema 的本体,spec 全部 JSON Schema 由它产出。
#5286 的 PR 明确把这块排除在外 并在 tsconfig.test.json 的注释里写明了理由(不夹带 riders)。同时确认:scripts/** 里没有任何 @ts-expect-error ,所以 #5286 新增的 PINS_CHECKED 不变式不受影响——这里藏的不是幽灵 pin,是没被检查的生成器。
建议方向(未定,交 triage)
把 scripts/**/* 并入 tsconfig.test.json(rootDir 放宽 + allowImportingTsExtensions + types 补 vitest),把 config-tier 一次修掉,code-tier 的 6 条按 @ts-expect-error 退役 pin 在 packages/spec 里是幽灵检查:tsconfig 把 **/*.test.ts 排除出唯一的 tsc --noEmit #5286 的每文件台账 packages/spec/test-typecheck-debt.json 收口或直接修完;或
给 scripts/ 单开一份 tsconfig,由 typecheck 脚本链一并指名(@ts-expect-error 退役 pin 在 packages/spec 里是幽灵检查:tsconfig 把 **/*.test.ts 排除出唯一的 tsc --noEmit #5286 改造后的 TESTS_COVERED 已经支持 sibling 配置被指名即算覆盖)。
两条路都会让 check:type-check-coverage 继续通过;差别只在 program 边界怎么切。
关联:#5286 、#4311 、AGENTS.md「Build & Test」段的 typecheck 覆盖纪律。
在 #5286(spec 测试层进 tsc)的实施中发现,记录备查,未认领。基线
origin/main@01c0baef9。事实
packages/spec/tsconfig.json的include是["src/**/*"],tsconfig.test.json(#5286 新增)同样只到src。于是整个packages/spec/scripts/**不在该包任何 tsconfig 的 program 里——既不是「被 exclude 排除」,而是压根没被 include 选进来,所以连check:type-check-coverage的TESTS_COVERED都数不到它(该不变式只统计 include 根之下的测试文件)。这批文件不是死代码:
vitest.config.ts的include含scripts/**/*.test.ts,共 9 个测试文件在pnpm test里真的跑;gen:schema/gen:openapi/check:liveness/check:strictness-ledger等 20 多个 CI gate 脚本本体。也就是说:这些脚本决定 spec 的生成物和多条 gate 的判定,却没有任何类型检查器读过它们。这正是 #4311 的缺陷类别,只是下沉了一层(#4311 关心「包级 tsc 覆盖」,#5286 关心「测试层被 exclude」,本单是第三种形态:根本不在 include 里)。
实测
把
scripts/**/*并进 #5286 的tsconfig.test.json(需同时把继承来的rootDir: "./src"放宽到".",因为scripts/在src/之外)后:分层:
.mts后缀 import,需要allowImportingTsExtensionsscripts/build-schemas-check-mode.test.ts用了全局beforeEach/afterEach,需 vitest 类型check-generated.tsimport 仓库根的.mjs无声明文件scripts/build-schemas.ts:1208-1228—— 一串Property 'keys'/'rev' does not exist on type 'never',某个值被推成never后仍在被取属性build-docs.tsx4、build-openapi.ts、generate-sbom.ts)check-liveness.mts:618隐式 any 参数按 AGENTS.md 已写下的纪律:先修 config 层再读残差,
build-schemas.ts那堆never才是真正要看的东西——而build-schemas.ts是gen:schema的本体,spec 全部 JSON Schema 由它产出。与 #5286 的边界
#5286 的 PR 明确把这块排除在外并在
tsconfig.test.json的注释里写明了理由(不夹带 riders)。同时确认:scripts/**里没有任何@ts-expect-error,所以 #5286 新增的PINS_CHECKED不变式不受影响——这里藏的不是幽灵 pin,是没被检查的生成器。建议方向(未定,交 triage)
scripts/**/*并入tsconfig.test.json(rootDir放宽 +allowImportingTsExtensions+types补 vitest),把 config-tier 一次修掉,code-tier 的 6 条按@ts-expect-error退役 pin 在packages/spec里是幽灵检查:tsconfig 把**/*.test.ts排除出唯一的tsc --noEmit#5286 的每文件台账packages/spec/test-typecheck-debt.json收口或直接修完;或scripts/单开一份 tsconfig,由typecheck脚本链一并指名(@ts-expect-error退役 pin 在packages/spec里是幽灵检查:tsconfig 把**/*.test.ts排除出唯一的tsc --noEmit#5286 改造后的TESTS_COVERED已经支持 sibling 配置被指名即算覆盖)。两条路都会让
check:type-check-coverage继续通过;差别只在 program 边界怎么切。关联:#5286、#4311、AGENTS.md「Build & Test」段的 typecheck 覆盖纪律。