feat(scripts): check-override-consistency 增加 override 消费者体检与自失效上界报告 - #6093
Merged
Conversation
按 #5835 裁 A 的配套正交项(#6046):override 只在「可发布包 declared range 里 出现过」时才被校验,没有消费者的 override 会被直接跳过 —— 于是一条不可见的安全 声明两头都危险,既可能被误信为在生效,也可能被下一个 agent 顺手删掉。 新增两份体检,都是 report,⛔ 一律不改退出码: 1. 消费者普查:从本地 pnpm-lock.yaml 的 importers + snapshots 统计每条 override 的消费者数,零消费者点名报告,并写明「#5835 裁 A 决定保留」的姿态指引。 普查刻意做在包名一级:pnpm-lock.yaml 记的是 override 生效之后的解析结果, 一条正在干活的 override 早已把命中项抬到 target 之上、抬出了 selector, 实测「落在 selector 内的解析数」对 28 条 override 全为 0(包括在干活的), 根本分不出「空转」和「正在生效」。包名的有无是 lockfile 唯一能诚实给出的信号。 2. 自失效上界:selector 的排他上界 `<V` 落在 target 下限之上或与之相等时点名 —— target 所在版本线整条不在 scope 内,target 自身出公告要挪时 pin 会当场失配, 即 #4961 / #5032 里 `undici@>=7.23.0 <7.28.0` 的形状。 `--self-test` 17 条断言双向立住(有消费者不报 / 零消费者报出 / 自失效形状报出 / 上界高于 target 版本线不报 / lockfile 不可解析时降级不崩),并把既有的 declared range 主规则一并补上双向覆盖。self-test 接进新增的 `check:override-consistency` 命令链,validate-deps 工作流改调该命令链而非裸脚本 —— 不接线即 phantom check。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BDmDsu2575gDxeMCxXhDE3
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
This was referenced Aug 7, 2026
…rride-consumer-visibility # Conflicts: # package.json
hotlong
marked this pull request as ready for review
August 7, 2026 01:45
hotlong
enabled auto-merge
August 7, 2026 01:45
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #6046
按 #5835 裁 A 的配套正交项落地:
scripts/check-override-consistency.mjs增加两份体检,都是 report,一律不改退出码。
一、前提复核(落地前对
origin/main实测,非照抄 issue 正文)form-data随 #5825 失去唯一消费者、现为空转undici同样空转@ai-sdk/provider-utils@5.0.16依赖 undici 7.29.0;jsdom@30.0.1依赖 undici 8.9.0form-data、@tootallnate/once、react-router、@sveltejs/kit两点说明:
除了正文点名的 form-data,另有三条空转 override 同样没人发现。立项理由不但没被推翻,还更充分。
验收要求的「两条 override 都被点名报告、exit 仍 0」在实跑里成立,只是 undici 的点名理由
换成了真实的那个。⛔ 没有为了凑 issue 正文而把 undici 硬报成零消费者。
二、设计:为什么消费者普查做在包名一级
一个很自然的替代方案是「统计落在 override selector 范围内的解析数」。这个方案是错的,
因为
pnpm-lock.yaml记录的是 override 生效之后的解析结果:一条正在干活的 override早就把命中项抬到了 target 之上、也就抬出了自己的 selector。
实测:28 条 override 里,落在自己 selector 内的解析数全部为 0 —— 正在干活的那些也一样。
也就是说该信号根本分不出「空转」和「正在生效」,一用就是全员误报。
包名的有无是 lockfile 唯一能诚实给出的信号:名字在
importers+snapshots里都不出现,这条 override 就确实没有任何可改写的对象。脚本头注释里把这条限制写死了,免得下一个人再走一遍。
三、为什么是 report 而不是 red
裁决原文即「报告而非 red」。空转 override 是合法的纵深防御姿态 —— 不花成本,且一旦哪个依赖
把包重新引进来就立刻生效。所以体检输出里带了明确的保留指引,防止下一个 agent 顺手删:
脚本语言:
scripts/*.mjs全族 0 处 CJK(实测),故脚本输出沿用英文保持族内一致,中文说明放在 PR / commit 里 —— 与仓库「GitHub 可见文本用中文」的约定并不冲突。
四、self-test:17 条断言,双向
接进新增的
check:override-consistency命令链,validate-deps.yml改调该命令链而非裸脚本(不接线即 phantom check)。除新增两份体检外,顺带把既有的 declared-range 主规则也补上了
双向覆盖 —— 这个脚本此前完全没有 self-test。
五、现状实跑(
pnpm check:override-consistency,exit 0)既有普遍写法,不是本次新增的回归。所以这一栏被刻意写成「standing ledger」的口气,每行只留
key -> target(逐行重复的解释合并到段末讲一次),只有严格更差的那一种(上界低于 target下限、中间留出谁都不覆盖的空窗)才额外标
gap,当前只有@hono/node-server一条。若维护者希望把这一栏收窄(例如只报 OSV 安全 pin、跳过 better-auth 预发布兼容 pin),
可另开跟进单 —— 本单按裁决「点名 undici 形状」的字面要求实现,而 undici 的形状恰好就是
这 25 条共享的那一种,所以要点名 undici 就必然要点名同形状的其余各条,不能只挑一条报。
六、反向验证(方向在跑之前先声明)
findIdleOverrides直接返回空)lte改成ltgit status确认 lockfile 未被改动方向 2 第一次跑出来是全绿,但那是探针坏了不是断言不敏感:替换目标写成了
'undici: 7.29.0',,而源码里数组元素是' undici: 7.29.0',(引号在空格之前),replace 静默变成 no-op。加了「替换目标必须命中、替换必须改变文件」的守卫后重跑才得到上表结果。
⛔ 没有把那次假绿当成结论 —— 记在这里是因为「mutation 没生效」和「断言不敏感」在输出上长得一模一样。
方向 3 的预言之所以精确到「恰好 1 条」,是要证明 undici 是被
lte里的等值那一半接住的,而不是碰巧被 gap 那半覆盖 —— 若两条同时转红,说明断言没有真正区分这两种子形状。
七、门禁
pnpm check:override-consistencynpx eslint scripts/check-override-consistency.mjsnode scripts/check-nul-bytes.mjsgrep -naP自查改动三个文件的控制字节node scripts/check-workflow-status-functions.mjs八、范围
scripts/check-override-consistency.mjs、根package.json(一行命令链)、.github/workflows/validate-deps.yml(改调命令链 + 注释)。pnpm-workspace.yaml/pnpm-lock.yaml,未增删任何 override ——今日 OSV 公告波(js-yaml / mermaid)是 OSV 新公告波:js-yaml(GHSA-5p4m-2wfm-xmqj,High 7.5)+ mermaid 11.16.0 五条 —— Validate Dependencies 对触发它的 PR 全数转红 #6088,另座位在办,与本单 diff 完全不相交。
skip-changeset标签。Generated by Claude Code