Skip to content

form-data 与 undici 两条 OSV override 失去唯一消费者,现在空转 —— 保留还是退役需一次裁决 #5835

Closed

Description

@os-zhuang

观察类 finding,#5825 退役 packages/vscode-objectstack 时发现(PR #5834)。今天没有任何用户/CI 面受影响,门禁全绿,故不带 pm:queue,交 PM triage 定级。

事实

pnpm-workspace.yaml 的 overrides 里这两条:

'form-data@<4.0.6': '>=4.0.6'
'undici@>=7.23.0 <7.29.0': '^7.29.0'

按各自注释,唯一传递来源都是 @vscode/vsce(form-data 直接经它;undici 经 @vscode/vsce → cheerio)。@vscode/vsce 是 packages/vscode-objectstack 的 devDependency,随 #5825 退役一并离开依赖树(pnpm install 后 -125 个包)。删除后实测:

  • form-data —— 从依赖树彻底消失,lockfile 零解析条目。选择器匹配不到任何东西。
  • undici —— 仅剩两个副本,@ai-sdk/provider-utils 的 7.29.0 与 jsdom 的 8.9.0,两者都在 >=7.23.0 <7.29.0 这个左闭右开区间之外。选择器同样匹配不到任何东西。

即两条 pin 现在都是空转声明。check-override-consistency.mjs 对它们保持绿 —— 该门禁只校验「override 命名的包若出现在可发布包的 declared range 里,range 必须能解析到 override target」,一条没有消费者的 override 会被直接跳过,所以没有任何门禁会告诉你它空了。

PR #5834 的处置(以及为什么没顺手删)

保留选择器不动,只在注释里就地记录 CONSUMER GONE (#5825) 与保留理由。理由:在一个包退役 PR 里顺手摘掉安全 pin 是降低安全姿态,应当是独立决定;而留着的成本是零 —— 若未来某个传递依赖重新引入 form-data 或 7.2x 的 undici,pin 仍会把它按到已修补版本上。同时把 brace-expansion 注释里 minimatch 消费者清单中的 @vscode/vsce 去掉(ts-morph/eslint/@typescript-eslint/glob/archiver 仍在,那条 pin 依旧生效)。

待裁决

这两条空转 pin 保留还是退役?

  • A. 保留(现状) —— 零成本的纵深防御,未来传递依赖重新引入时自动生效。代价:overrides 块里长期躺着两条无消费者的声明,读者需靠注释才知道它们空转。
  • B. 退役 —— overrides 只保留真正在生效的条目,块更短更可信。代价:未来重新引入时不再有网,且需要有人盯着 OSV 重新加回。

倾向 A,但这是安全姿态问题,值得维护者明确一次而不是靠某个 PR 的顺手判断。若选 A,可考虑另加一个「override 有无消费者」的体检(报告而非 red)—— 目前空转是完全不可见的,而不可见的安全声明既可能被误信为在生效,也可能被下一个 agent 顺手删掉。

顺带记录:undici 这条仍是 <FIXED 形状

'undici@>=7.23.0 <7.29.0': '^7.29.0' 的上界正好等于其 target,即 #4961 警告、#5032 亲历过的自失效形状 —— 7.29.0 自己哪天中招,选择器就不再覆盖它。文件里已有 #5032 的完整教训记录,此处仅并列备忘,不属本 finding 的诉求。

Activity

  1. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    发现分诊:finding → needs-user-decision(域标签 domain:devx 沿用立单者所打,复核无误:落点 pnpm-workspace.yaml + scripts/check-override-consistency.mjs,属域表 devx 行的 scripts/(门禁类))。

    为什么不是三选一里的「持有」或「晋级」,而是转决策箱:发现分诊轮的三选一(晋级 / 关闭 not planned / 持有)适用于判级;本单的阻塞点不是级别不明,而是安全姿态需要维护者明确表态一次——正文自己写着「这是安全姿态问题,值得维护者明确一次而不是靠某个 PR 的顺手判断」。持有会让它在下一轮再被判一次(纯重复);晋级则等于替维护者选了 A 或 B。⇒ 转决策箱是唯一不越权又不空转的去向。

    决策卡的最小提问:两条已确认空转的 OSV override(form-data@<4.0.6、undici@>=7.23.0 <7.29.0)保留还是退役?

    ⚠️ 若选 A,请连带对一个配套项表态(它是本单真正的长期风险,不表态就等于把风险留在原地):正文指出空转本身完全不可见——check-override-consistency.mjs 只校验「override 命名的包若出现在可发布包的 declared range 里,range 必须能解析到 override target」,没有消费者的 override 会被直接跳过,所以没有任何门禁会告诉你它空了。而一条不可见的安全声明两头都危险:既可能被误信为在生效,也可能被下一个 agent 顺手删掉。⇒ 建议一并批准加一个「override 有无消费者」的体检,报告而非 red(立单者原话)。这一条若获批可拆成独立 pm:queue 单先落地,与 A/B 的选择正交。

    判「不打 pm:queue」的理由(与上条一致):今天零用户面、零 CI 面影响,门禁全绿;不是缺陷,不占派发队列。

    过时前提核验:本单立于 07:30Z(约半小时前),证据取自 PR #5834 的实测(pnpm install 后依赖树 -125 包、lockfile 逐条解析结果),复现路径明确;前提无过时风险。⚠️ 但有一条时序耦合需承接时确认:两条 override 的空转以 #5825(packages/vscode-objectstack 退役)确已合入为前件——拍板前请核实 PR #5834 的落地状态,若该退役被回退,本单前提即刻失效。

    查重(三仓 open issue + PR 各一遍):无重复单。关联而非重复:#5825 / PR #5834(发现路径)、#4961(自失效选择器形状的原始警告)、#5032(亲历该形状的教训记录)。ℹ️ 正文末段「undici 这条上界正好等于 target(<7.29.0 → ^7.29.0),仍是 #4961 / #5032 的自失效形状」是并列备忘,不属本单诉求——⛔ 承接时不要把它当作本单范围顺手改,若要处理请独立立单。

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    【裁决落地】维护者 2026-08-06 批复全舰队决策箱评估报告(批复「同意」),本单裁定:

    裁 A——form-data / undici 两条 OSV override 保留(零成本纵深防御,退役失网无回报);配套批准正交体检立项:「override 有无消费者」体检(报告而非 red),由 devx 座位拆单先行,消除门禁对空转 override 的不可见。undici 上界自失效形状按正文备忘归入体检范围。

    本单裁决即闭环:体检拆单后本单可关(completed)。

    流转:摘 needs-user-decision → pm:queue,归 devx 车道(拆体检单 + 关本单)。

    评估与落地会话:session_01N3uGFF8teXbpgtbEJ1aYXu


    Generated by Claude Code

  3. hotlong commented on Aug 6, 2026

    @hotlong
    Contributor

    按 10:44Z 裁决闭环(devx 车道,会话 session_01BDmDsu2575gDxeMCxXhDE3):裁 A 保留两条 override(本单裁决即闭环);配套体检已拆单 #6046(「override 有无消费者」报告式体检 + undici 自失效形状纳入范围,已入 devx 队列)。本单关闭(completed)。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions