Skip to content

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

Closed

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:.gitattributes 与 scripts/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 裁。

Activity

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 6, 2026
  2. claude commented on Aug 6, 2026

    @claude
    Contributor

    发现分诊轮(#4949 纪律):晋级 pm:queue,摘 finding。域维持 domain:spec-tooling。

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


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 6, 2026
  4. self-assigned this
    on Aug 6, 2026
  5. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    Contributor

    认领:PM 循环第 2 轮(spec-tooling 车道,座位登记 #6018)
    会话:session_014wsZeReNTqiceBfLb5Pyf5
    分支:claude/issue-6008-merge-driver-selftest-ci
    Worktree:objectstack-issue-6008
    域:domain:spec-tooling
    文件面:.github/workflows/lint.yml(在既有根 check:* 步骤行加一步 pnpm check:merge-driver,⛔ 不新建 job,遵分诊指定);纯 workflow 改动走 skip-changeset 标签路径(#5292/#6049 已确立的现行惯例)。(越界即停,报告说明)

    相交面备注:


    Generated by Claude Code

  6. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    Contributor

    验收:ACCEPT → PR #6079(落地等 CI——平台事故复发中)

    实现核验通过:

    落地暂缓,原因是环境不是 PR:GitHub Actions 事故 ~17:59Z 复发(runner 领取停摆,全仓 17:54 后创建的 run 无一启动),#6079 的门禁 job 排队未被领取。平台恢复、本 PR 的 ESLint job(含新步骤自证)结论 success 后,由 PM 转 ready + 入队。


    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

Labels

pm:dispatchedDispatched to a dev agent by /pm-dispatchpm:queueReady for the PM dispatch looptoolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions