发现于 #4815 的实施(选运行方式时读了这段守卫)。不在 #4815 范围内,单独记录。
事实(实测 origin/main @ de4e29a,worktree objectui-issue-4815)
scripts/vitest-invocation-guard.mjs 的文件头声称覆盖是全量的:
Called from the top of vitest.config.mts, so it covers EVERY entry point into this repo's Vitest ... (Every per-package vitest.config.ts re-exports the root config, and a package without one — e.g. packages/app-shell — resolves upward to it, so no package-level path skips this file.)
括号里那句对 11 个包不成立。按「文件里是否出现 vitest.config.mts / assertCanonicalVitestInvocation / 上溯 import」分类 packages/*/vitest.config.{ts,mts}(17 个文件):
- re-export(6):components、core、fields、plugin-dashboard、react、types
- 自带独立
defineConfig(11):plugin-calendar、plugin-charts、plugin-detail、plugin-form、plugin-gantt、plugin-grid、plugin-kanban、plugin-list、plugin-map、plugin-timeline、plugin-view
这 11 个文件都是自足的 defineConfig({...}),不 import 根配置,因此不调用守卫。
实测确认(不是读代码推断):
cd packages/plugin-grid && pnpm exec vitest run src/__tests__/bulkParamToField.test.ts
RUN v4.1.10 /home/user/objectui-issue-4815/packages/plugin-grid <- Vitest root ≠ 仓库根
Test Files 1 passed (1)
Tests 15 passed (15)
守卫的原则是「Any run whose Vitest root is not the repo root is refused」。这次运行的 Vitest root 就是包目录,没有被拒,退出码 0。
为什么值得记
守卫存在的理由是两种静默假绿(#3378 包内 cwd 收集了别人的文件、#3288 path filter 被 -- 吃掉)。这 11 个包正是唯一仍然可能踩到它们的地方,却是守卫唯一管不到的地方 —— 而文件头那句话会让下一个人相信已经管到了。危害不是「守卫没生效」这一件事,是一句可证伪的覆盖声明为假:读到它的人不会再去验证。
本次只测了带显式 path filter 的形态(它收集的确实是我点名的文件)。未测:这 11 个包下的裸 pnpm exec vitest run 是否会命中 #3378 那种「收集到 22 个别人的文件并报绿」—— 各包本地配置没有根配置的 projects 与绝对路径 apps/console,collect 行为可能与根配置不同,需要实测再下结论,别照抄 #3378 的数字。
#3240(open)问的是「哪些包真的需要本地配置」。本单不等于它,也不依赖它的答案:即便结论是这 11 个包都该保留本地配置,守卫要么应当覆盖它们,要么应当停止声称已覆盖。两条最小修法(任选,都不必等 #3240):
- 11 个本地配置各自 import 并调用
assertCanonicalVitestInvocation(与 6 个 re-export 包同构); - 或先把文件头那句话改成实测为真的措辞,把洞显式记在守卫里。
参考
发现于 #4815 的实施(选运行方式时读了这段守卫)。不在 #4815 范围内,单独记录。
事实(实测 origin/main @ de4e29a,worktree
objectui-issue-4815)scripts/vitest-invocation-guard.mjs的文件头声称覆盖是全量的:括号里那句对 11 个包不成立。按「文件里是否出现
vitest.config.mts/assertCanonicalVitestInvocation/ 上溯 import」分类packages/*/vitest.config.{ts,mts}(17 个文件):defineConfig(11):plugin-calendar、plugin-charts、plugin-detail、plugin-form、plugin-gantt、plugin-grid、plugin-kanban、plugin-list、plugin-map、plugin-timeline、plugin-view这 11 个文件都是自足的
defineConfig({...}),不 import 根配置,因此不调用守卫。实测确认(不是读代码推断):
守卫的原则是「Any run whose Vitest root is not the repo root is refused」。这次运行的 Vitest root 就是包目录,没有被拒,退出码 0。
为什么值得记
守卫存在的理由是两种静默假绿(#3378 包内 cwd 收集了别人的文件、#3288 path filter 被
--吃掉)。这 11 个包正是唯一仍然可能踩到它们的地方,却是守卫唯一管不到的地方 —— 而文件头那句话会让下一个人相信已经管到了。危害不是「守卫没生效」这一件事,是一句可证伪的覆盖声明为假:读到它的人不会再去验证。本次只测了带显式 path filter 的形态(它收集的确实是我点名的文件)。未测:这 11 个包下的裸
pnpm exec vitest run是否会命中 #3378 那种「收集到 22 个别人的文件并报绿」—— 各包本地配置没有根配置的projects与绝对路径apps/console,collect 行为可能与根配置不同,需要实测再下结论,别照抄 #3378 的数字。与 #3240 的关系
#3240(open)问的是「哪些包真的需要本地配置」。本单不等于它,也不依赖它的答案:即便结论是这 11 个包都该保留本地配置,守卫要么应当覆盖它们,要么应当停止声称已覆盖。两条最小修法(任选,都不必等 #3240):
assertCanonicalVitestInvocation(与 6 个 re-export 包同构);参考
scripts/vitest-invocation-guard.mjs(文件头覆盖声明与 "Deliberately strict" 一节)、vitest.config.mts:17pnpm --filter @object-ui/app-shell test跑的是 @object-ui/console 的 22 个文件,app-shell 自己的 276 个一个没跑,却报绿 #3378 /pnpm --filter <pkg> test -- --run <paths>静默忽略路径过滤:新加的测试文件根本没跑,而输出看起来正常 #3288(守卫要挡的两种假绿)