Skip to content

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

Closed

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-note、ci-node-22-pin、duplicate-fix-guard),把各自正文原句 grep 全仓 CHANGELOG.md → 各 0 处命中;
  • 对照组:任取一个非空 changeset 的正文首句 → 命中 packages/spec/CHANGELOG.md 与 packages/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.json 为 mode: 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 的验收过程。

Activity

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    domain:devxDomain lane — seat card indexed by label:pm:seat
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 5, 2026
  2. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    发现分诊轮:转 needs-user-decision(摘 finding,保留 domain:devx)。理由:本单自陈是「禁止空 changeset 进 .changeset/」的决策证据存放点、由维护者裁定是否立项 —— 这是 决定待做,不是观察持有;实测证据(零收益、单向风险表)已齐,存量 172 个的处置与禁在哪一层两问随裁决一并定。准了 → 按裁定层级立项回队;不准 → 记 hold 三要素。本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  3. claude commented on Aug 6, 2026

    @claude
    Contributor

    裁决(2026-08-06):方案 A——PR 闸门禁止新增空 frontmatter changeset。

    与 Check Changeset 同层加闸:新增的空 frontmatter changeset 直接红(指向 skip-changeset 标签路径);存量 182 个豁免不动。依据:实测文案劝阻无效(#5467 已合,空文件仍一天净增 10 个),每个新空文件都是未来 #4898(0 秒静默不发版)的输入;「tests/docs-only 声明只走标签一条路」单通道收敛。

    存量清理留到 changeset pre exit 时另单处理(届时验证 changeset version 对空文件的删除行为)——A 不碰发布机器、可秒回滚。量级 S。

    经办:PM 会话 session_01GcjbQLUQKysMU9uXB34iyv;维护者 2026-08-06 审阅决策简报后授权按建议执行(否决窗口:可评论/重开推翻)。


    Generated by Claude Code

  4. added
    pm:queueReady for the PM dispatch loop
    and removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Aug 6, 2026
  5. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    【裁决落地】维护者 2026-08-06 批复全舰队决策箱评估报告(批复「同意」),本单裁定:

    准立项——禁止空 frontmatter changeset 进 .changeset/:① 闸门落 PR 层(最轻,不碰发布机器/changeset 配置);② 存量 172 个空文件禁新增 + 豁免,不随 pre exit 清(避免动发布态)。实测证据(零 CHANGELOG 产出 + 独担 #4898「0 秒静默不发版」风险)成立。

    流转:摘 needs-user-decision → pm:queue,归 devx 车道。

    评估与落地会话:session_01N3uGFF8teXbpgtbEJ1aYXu


    Generated by Claude Code

  6. self-assigned this
    on Aug 6, 2026
  7. hotlong commented on Aug 6, 2026

    @hotlong
    Contributor

    认领:PM 循环第 3 轮(devx 车道)
    会话:session_01BDmDsu2575gDxeMCxXhDE3
    分支:claude/issue-5471-ban-empty-changeset-gate
    Worktree:objectstack-issue-5471
    域:domain:devx
    文件面:.github/workflows/pr-automation.yml(Check Changeset 步骤)或配套 scripts/ 新脚本、.changeset/(仅豁免清单如需)(越界即停,报告说明)

    按 10:44Z 已批裁决执行:PR 层闸门,新增空 frontmatter changeset → 红并指向 skip-changeset 标签路径;存量 172 豁免不动;⛔ 不碰发布机器/changeset 配置。与 #5947 并轨:同一 PR 双 Fixes(见该单认领)。⚠️ 同文件 #5620(allow-major 步骤)pm:blocked 休眠中,⛔ 不碰那一步。


    Generated by Claude Code

  8. hotlong commented on Aug 6, 2026

    @hotlong
    Contributor

    验收(devx 车道,会话 session_01BDmDsu2575gDxeMCxXhDE3):ACCEPT → PR #6059(双 Fixes 并轨 #5947),已转 ready 并挂 auto-merge —— 平台故障波中 auto-merge 会在 required 集转绿时自动入队,无需人工盯。

    交付摘要(按 10:44Z 已批裁决):


    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

ci/cddomain:devxDomain lane — seat card indexed by label:pm:seatpm: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