Skip to content

validate-deps: decide how the OSV gate should express an advisory with no fix available #4965

Description

@xuyushun441-sys

拆自 #4945 的建议 2。#4945 本身(brace-expansion 5.0.8 到 5.0.9)已由 PR #4961 修掉,合并后该 issue 会关闭,这条设计问题会跟着一起被埋掉,所以单独记录。未认领。

问题

.github/workflows/validate-deps.yml 的 OSV-Scanner step 对任意严重级别的 advisory 一律 exit 1。当命中的 advisory 修复版本时,这个行为完全正确 —— #4945 就是这样在 10 分钟内被清掉的。

但当一条 advisory 没有可用修复版本时(上游还没发补丁,或者补丁只在一个我们暂时吃不下的 major 里),同样的行为会把一个必跑 job 无限期钉红。而一个长期红的必跑检查,和没有扫描是等价的:所有人都学会跳过它,下一条真正可修的 advisory 在 PR 列表里长得和它一模一样。

这不是假设。pnpm-workspace.yaml 的 overrides 注释里已经记着好几处上游没有稳定修复版本的情形,现在是靠 pre-release pin 顶住的(better-auth 家族的 1.7.0-rc.2@better-auth/scim1.7.0-rc.1),而 pre-release pin 并不总是存在。

已有机制

workflow 注释指出现成的出口是 osv-scanner.toml[[IgnoredVulns]]:

# Note: OSV-Scanner blocks on any severity, not just high/critical. To
# accept a specific advisory, add an osv-scanner.toml [[IgnoredVulns]]
# entry rather than lowering the gate.

但仓库里目前没有 osv-scanner.toml,所以这条路径一次也没走过,也就没有约定:谁有权加豁免、要写什么理由、expires 该设多久、到期后由谁复核。

需要决定的

  1. 豁免走 [[IgnoredVulns]] 是否就是最终形态,还是要像 overrides 那样配一个带理由的注释块 + 一个 check 脚本(参考 check-override-consistency.mjs 的做法)来强制每条豁免必须写明:advisory id、为什么现在修不了、复核日期。
  2. expires 是否强制。一条永不过期的豁免,和今天这条永远红的 job 是同一个失败模式,只是方向相反 —— 前者静默,后者吵闹,都让人不再看。
  3. 定期扫描(该 workflow 已有 weekly cron)在豁免到期时应该怎么提醒 —— 该 job 已有 issues: write 权限,自动开 issue 是现成可用的。

倾向:豁免必须带 expires 且必须带理由,由一个 self-test 过的 check 脚本强制,与 overrides 块的现有风格保持一致 —— 但这属于会长期约束他人的流程决定,留给维护者定,不要 agent 自行猜。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions