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
# strips that much from every line, so `MSG` lands in column 0 of
272
280
# the generated script. Do not re-indent it.
273
281
cat <<'MSG'
274
-
This PR adds no changeset. There are three ways forward, and they are NOT
275
-
equivalent. Pick by what the PR actually releases:
282
+
This PR adds no changeset. There are TWO ways forward -- route 3 used to be
283
+
a third and is now closed, see below. Pick by what the PR actually releases:
276
284
277
285
1. It releases something
278
286
-> run 'pnpm changeset' and name the packages it releases.
279
287
280
-
2. It releases nothing (.github/, .claude/, docs/, content/, examples/,
281
-
tests-only, and the like)
288
+
2. It releases nothing (.github/, .claude/, skills/, docs/, content/,
289
+
examples/, tests-only, and the like)
282
290
-> apply the 'skip-changeset' label. <<< PREFERRED
283
291
The label is a gate-level exemption. It produces NO input for
284
292
changesets/action, so it cannot affect a release.
285
293
286
-
3. An empty-frontmatter changeset also satisfies this gate and stays
287
-
legal -- but it is a LAST RESORT, not the quick way past a red check.
288
-
Unlike the label it is a REAL INPUT to changesets/action: when every
289
-
pending changeset is empty, the action takes its
294
+
'skills/**' is on that list, and it is spelled out because the git
295
+
log says otherwise (#5947). Changes to PUBLISHED skills have
296
+
repeatedly shipped with an empty changeset instead -- #4607, #5130,
297
+
#5451 / PR #5799 -- on the reasoning "skills/ ships with no npm
298
+
package, so there is no package to name". That premise is true:
299
+
skills/ is not a workspace member and no package's 'files' field
300
+
includes it. The conclusion does not follow. Naming no package is
301
+
precisely what the LABEL is for; an empty changeset names no package
302
+
EITHER, and pays #4898 for the privilege. Take the label.
303
+
304
+
3. (CLOSED) An empty-frontmatter changeset. Still present in the
305
+
repository's history and still counted by this step, but the step
306
+
below now REJECTS any that a PR newly adds (#5471). It was never worth
307
+
taking: it names no package, so its body reaches no CHANGELOG, and it
308
+
buys nothing the label does not. What it uniquely buys is risk --
309
+
unlike the label it is a REAL INPUT to changesets/action, and when
310
+
every pending changeset is empty the action takes its
290
311
"hasChangesets && !hasNonEmptyChangesets" branch, prints
291
312
"All changesets are empty; not creating PR", and returns in 0 seconds
292
313
-- no version PR, no publish, and the Release run still goes GREEN.
293
-
That is #4898, which silently stalled 17.0.0-rc.2. It also buys you
294
-
nothing the label does not: an empty changeset names no package, so
295
-
its body reaches no CHANGELOG.
314
+
That is #4898, which silently stalled 17.0.0-rc.2. The empty
315
+
changesets already on main are exempt and stay where they are; only
316
+
newly introduced ones are rejected.
296
317
297
318
If you are unsure, take route 2. A wrong 'skip-changeset' label is caught by
298
319
review; a wrong empty changeset is caught by nobody.
299
320
MSG
300
-
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."
321
+
echo "::error::This PR adds no changeset. If it releases nothing (including any 'skills/**' change -- see #5947), apply the 'skip-changeset' label; otherwise run 'pnpm changeset' and name the packages. An empty-frontmatter changeset is NOT a third option any more: the step below rejects newly added ones (#5471), because 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."
301
322
exit 1
302
323
fi
303
324
echo "This PR adds $ADDED changeset(s)."
304
325
326
+
# #5471: an empty-frontmatter changeset is rejected when this PR is the one
327
+
# introducing it. Ruled 2026-08-06 after the #5292 / PR #5467 prose route
328
+
# failed to hold -- empty files kept accruing at roughly ten a day while
329
+
# the workflow text called them a LAST RESORT, and the `skills/**`
0 commit comments