Skip to content

[finding] check:merge-driver 的两个 --self-test 没有任何 workflow 在跑 —— 合并驱动的规则回归只在有人手工跑根脚本时才现形 #6008

Description

@baozhoutao

#4723(PR #6000)里给 scripts/check-regen-pending.mjs --self-test 加了一条断言时发现的,与该单无关,单独记录。

现象

package.json:

check:merge-driver = node scripts/git-merge-regen.mjs --self-test && node scripts/check-regen-pending.mjs --self-test

这条命令没有出现在任何 workflow 里

实测(origin/main)

$ for f in $(git ls-tree -r --name-only origin/main .github/workflows/); do
    git show origin/main:$f | grep -Hn "merge-driver" /dev/stdin | sed "s|/dev/stdin|$f|"
  done
(空 —— 零命中)

$ # 反查:同类的根 check 脚本确实在 lint.yml 里
$ ... grep -Hn "check:nul-bytes" ...
.github/workflows/lint.yml:121:      # The command name stays `check:nul-bytes` for continuity ...
.github/workflows/lint.yml:124:        run: pnpm check:nul-bytes

零命中已按惯例用邻近词反查过,grep 本身是好的。

.githooks/pre-commit 跑的是 check-regen-pending.mjs主路径(无 pending marker 时直接退出),不是 --self-test。所以两个 self-test 在 CI 上从未执行。

它们守的是什么

  • git-merge-regen.mjs --self-test:.gitattributesscripts/regen-artifacts.mjs 的双向对账、gen:/check: 名字在 spec 的 package.json 里可解析、pre-commit 在 index 里可执行、merge.os-regen.driver 在当前 worktree 可解析,外加一次端到端合并证明。
  • check-regen-pending.mjs --self-test:陈旧判定规则的危险方向(「该说 stale 时说了 fresh」)。

这些都是 #4675 那套「生成物不走文本合并」的地基。对账一旦失衡,合并驱动会对某个路径静默失效 —— 而 git-merge-regen.mjs 自己的注释就说,这类失衡「只有跑 self-test 才看得见」。

为什么标 finding 而不是缺陷

今天没有用户会撞到:驱动是好的,对账是平的(本地跑 pnpm check:merge-driver 全绿)。这是一道覆盖面的洞,不是一个已发生的故障 —— 与 #4690 同类(一道被归档为「在别处跑」的门禁,实际哪里都没跑),只是这次是根脚本而非 spec 门禁。

可能的方向

lint.yml 里已经有一排同形状的根 check:* 步骤(check:nul-bytes / check:i18n / check:doc-authoring …),加一步 pnpm check:merge-driver 即可,亚秒级到数秒级。是否值得占一个必需步骤,交 PM 裁。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions