You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(ci): Check Changeset stops prescribing the empty changeset that stalled the release (#5292)
The gate's failure message offered "an empty changeset" and the
`skip-changeset` label as two equal ways out, and the comment above the
counter called them "on par". They are equal to THIS gate's counting, but
not downstream: the label is a gate-level exemption that produces no input
for changesets/action, while an empty-frontmatter changeset is a real input
to it. When every pending changeset is empty the action takes its
`hasChangesets && !hasNonEmptyChangesets` branch, prints "All changesets
are empty; not creating PR" and returns in 0 seconds -- no version PR, no
publish, Release run green. That is #4898, which stalled 17.0.0-rc.2.
The message was therefore an active mis-prescription: it handed a known
release-stalling input to whoever had just hit the wall.
Rewritten to three ranked routes, with the label preferred and the empty
changeset demoted to a warned last resort that names #4898. The counting
logic is untouched: an empty changeset still counts, so today's precedent
(#5453 / #5454, both merged behind empty changesets) stays valid.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GX3sL71LFq8m2usg6VqTSE
echo "::error::This PR adds no changeset. Run 'pnpm changeset' (an empty changeset is fine for changes that release nothing), or apply the 'skip-changeset' label if it does not need one."
116
+
# The full comparison goes to the job log — that is what an author
117
+
# reading `gh run view --log-failed`, or expanding this step in the
118
+
# UI, actually sees. The ::error:: annotation after it is the
119
+
# one-line version for the Checks tab. Both lead with the label.
120
+
# Terminator sits at this block's base indentation on purpose: YAML
121
+
# strips that much from every line, so `MSG` lands in column 0 of
122
+
# the generated script. Do not re-indent it.
123
+
cat <<'MSG'
124
+
This PR adds no changeset. There are three ways forward, and they are NOT
125
+
equivalent. Pick by what the PR actually releases:
126
+
127
+
1. It releases something
128
+
-> run 'pnpm changeset' and name the packages it releases.
129
+
130
+
2. It releases nothing (.github/, .claude/, docs/, content/, examples/,
131
+
tests-only, and the like)
132
+
-> apply the 'skip-changeset' label. <<< PREFERRED
133
+
The label is a gate-level exemption. It produces NO input for
134
+
changesets/action, so it cannot affect a release.
135
+
136
+
3. An empty-frontmatter changeset also satisfies this gate and stays
137
+
legal -- but it is a LAST RESORT, not the quick way past a red check.
138
+
Unlike the label it is a REAL INPUT to changesets/action: when every
139
+
pending changeset is empty, the action takes its
140
+
"hasChangesets && !hasNonEmptyChangesets" branch, prints
141
+
"All changesets are empty; not creating PR", and returns in 0 seconds
142
+
-- no version PR, no publish, and the Release run still goes GREEN.
143
+
That is #4898, which silently stalled 17.0.0-rc.2. It also buys you
144
+
nothing the label does not: an empty changeset names no package, so
145
+
its body reaches no CHANGELOG.
146
+
147
+
If you are unsure, take route 2. A wrong 'skip-changeset' label is caught by
148
+
review; a wrong empty changeset is caught by nobody.
149
+
MSG
150
+
echo "::error::This PR adds no changeset. If it releases nothing, apply the 'skip-changeset' label (preferred); otherwise run 'pnpm changeset' and name the packages. An empty-frontmatter changeset also passes this gate, but it is NOT equivalent to the label -- it is a real input to changesets/action, and an all-empty set stalls the release silently and greenly (#4898). Full comparison in this step's log."
0 commit comments