Skip to content

objectui 没有「发布性改动必须声明 changeset」闸门 —— changeset-guard.yml 的触发器决定了它只看得见已经带 changeset 的 PR(objectui#3518 因此整个从发布记录里消失) #6174

Description

@hotlong

#6159 的 pin bump(PR #6173,范围 f995a452..7dfbeb70)执行 #6099 复核时发现,与 #6159 本身无关,按 Prime Directive #10 单独记录。

现象

objectui#3518 —— commit 0e50440,fix(form): bind ``previous`` for field rules and stop resubmitting read-only fields —— 落在本次 pin 范围内,改动 26 个文件,覆盖 packages/componentspackages/plugin-formpackages/typespackages/data-objectstackpackages/app-shell 以及全部十个 locale pack,新增两个测试文件。它没有添加任何 .changeset/*.md

证据(在 objectui 检出里,只读):

$ git show --name-status --format='' 0e50440 -- .changeset/
(空)

后果是双向的:

  1. objectui 自己的发布记录里没有它。 7dfbeb7(chore: release packages (#3248))消费掉了当时挂着的 88 个 changeset 并发布,0e50440 的代码随 @object-ui/components 等包一起出去了,但任何 CHANGELOG 里都没有一行提到它。
  2. 平台侧的 console changeset 也拿不到它。 scripts/objectui-changeset-digest.mjs 的判据是「objectui 声明了什么」(bump-objectui.sh 的 pin changeset 只收 feat|fix 且静默截断到 40 条 —— 破坏性 refactor! 进不了前端发布记录 #4731),这条判据本身是对的 —— 它忠实地把 0e50440 归进「20 个不带 changeset 的 commit」并把这个数字写进正文。但一个真实的、用户可见的表单行为变更,就这样只以一个计数的形式存在于 v17 的发布记录里。

这正是 #3340 记录过的那一类损失(v16 因 pin 滞后丢了 4 条前端改动)换了一扇门进来:不是 pin 陈旧,而是源头就没声明check:objectui-pin-fresh 对此完全无能为力 —— 它证明的是 pin 是否 CURRENT,而 0e50440 已经在范围内了。

根因:闸门的触发器把它自己挡在门外

objectui 有 .github/workflows/changeset-guard.yml,但读它的触发器:

on:
  pull_request:
    branches: [main, develop]
    paths:
      - '.changeset/**'

以及它唯一的 job:

jobs:
  no-major:
    name: Changeset Bump Policy

两件事叠在一起,结果是结构性的:

  • 这个 workflow 只在 .changeset/** 发生变化时才启动。一个「漏了 changeset」的 PR 按定义不动 .changeset/**,所以它一个 job 都不跑。
  • 就算跑了,它检查的也是级别策略(不许 major),而不是「这次改动该不该带 changeset」。

也就是说:能发现「缺 changeset」的检查,恰恰跑不到缺 changeset 的 PR 上。这个 workflow 的注释本身就写明了它是为「只加 changeset 的 PR 会一个 workflow 都不启动」这个反向问题设计的 —— 设计是自洽的,只是正向的那个问题从来没有闸门

对照本仓的既有判断:「a check that does not run reports nothing」(objectui-pin-freshness.yml 的 WHY THE JOB IS NEVER SKIPPED 段),以及 Route & surface ownership §3「Absence must be loud」。这里的缺席是完全静默的。

需要决定的事(留给 triage,我不预设)

修复面在 objectui,不在本仓,所以这条主要是路由 + 记录。可选方向,成本递增:

  • A. objectui 加一个反向触发的 changeset-required 闸门:PR 改到 packages/*/src/** 但没加 .changeset/*.md 时红,配 skip-changeset 标签逃生口。这是最直接的一版,和本仓 check-empty-changeset.mjs + skip-changeset 的组合同构。
  • B. 只补记录不加闸门:给 objectui#3518 补一个追溯 changeset。能修这一次,修不了这个类。
  • C. 平台侧把「无 changeset 的 commit」从计数升级为点名:objectui-range.mjs 已经有 --all 能按 subject 逐条列出被排除的 commit(见其 self-test「--all itemizes the excluded commits by subject」),把它接进 console changeset 正文,至少让漏声明的改动在平台发布记录里留下标题。这不解决 objectui 侧的根因,但把静默变成了可读的噪声。

我倾向 A + C:A 治根因,C 让平台侧在 A 落地之前不再是全盲,而且 C 需要的能力已经写好了、只差接线。B 单独做等于承认下一次还会发生。

不在本 issue 范围内

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