Skip to content

空 frontmatter changeset 相对 skip-changeset 标签零收益、单向风险 —— 「禁止空 changeset 进 .changeset/」的决策证据(#5292 结案后无处存放) #5471

Description

@os-zhuang

这不是待办工单,是一条决策证据的存放点。 不带 pm:queue、不指派,由维护者裁定是否立项。

为什么单独开一条

#5292 提出过一个备选方案:「若认为空 changeset 在某些场景下确实是正当声明,那就需要在闸门之外再加一道:禁止空 frontmatter 的 changeset 进入 .changeset/,让『声明』只走标签这一条路。」

devx 车道 2026-08-05 的分诊把它明确划到本单之外(牵动 changesets/action 的输入语义与发布机器行为,#4898/#4899/#4901 一族),留待维护者认可后另行立项。

问题在于:#5292 会被 PR #5467 关掉,这个提案连同下面这条证据就跟着一起沉底了。所以把它单独记在这里。

新证据:空 changeset 相对标签是零收益、单向风险

处理 #5292 时顺手实测了「空 frontmatter changeset 到底产出了什么」,结论比原 issue 的描述更强:

它什么都不产出。

  • 取三个已被 changeset version 消费过的空 changeset(adr-0044-revise-service-owned-noteci-node-22-pinduplicate-fix-guard),把各自正文原句 grep 全仓 CHANGELOG.md各 0 处命中;
  • 对照组:任取一个非空 changeset 的正文首句 → 命中 packages/spec/CHANGELOG.mdpackages/cli/CHANGELOG.md,2 处

机制上也讲得通:空 frontmatter 不点名任何 package,summary 是挂在 release 上的,零 release 即零挂载点,正文因此进不了任何 CHANGELOG。

于是两条出路的收益/风险表变成完全单向:

skip-changeset 标签 空 frontmatter changeset
满足 Check Changeset 闸门
产出 CHANGELOG 条目 (实测)
是否成为 changesets/action 的输入
全空时触发 0 秒静默不发版分支(#4898) 不可能 可能

即:空 changeset 没有任何标签给不了的东西,却独家带来 #4898 的风险面。它作为「声明」手段没有存在理由 —— 这正是「干脆禁掉」这个方案的核心论据,而在写 #5292 时这一条还只是推测。

现状盘点(origin/main @ 61fde5e44)

  • .changeset/*.md(不含 README)共 1065,其中空 frontmatter 172;
  • pre.jsonmode: pre / tag: rc,记录 860 个已消费 id;那 172 个空文件里 140 个已记录(RC 模式保留的残留)、32 个未记录(下一次 release run 的待消费输入);
  • 32 个里 26 个在历史根提交即存在(无法再归因),6 个可归因且全部来自只碰非发布路径的 PR —— 未发现无主残留;
  • 0 秒分支当前未被触发:待消费的 changeset 里还有 173 个非空,hasNonEmptyChangesets 为真。

明细见 PR #5467 的正文。

若要立项,值得先想清楚的两点

  1. 既有的 172 个空文件怎么办。 直接禁止新增 + 存量豁免?还是随下一次 changeset pre exit 一并清掉?后者要确认 changeset version 对空文件的删除行为(本次未验证)。
  2. 禁在哪一层。 加一道 PR 闸门(和 Check Changeset 同层,只拦新增)最轻;改 changeset 配置/包装脚本让它压根写不出空 frontmatter 更彻底,但会碰发布机器。这两者的取舍属于发布面,不该由 devx 车道自行决定。

相关:#5292(文案已由 PR #5467 修正)、#4898(被静默卡死的那次发布)、#4899#4901
出处:PR #5467 的验收过程。

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