From 13aa499dada9b2603917e7899f8bc4e97e03198a Mon Sep 17 00:00:00 2001 From: dan-claude-bot Date: Sun, 19 Jul 2026 15:40:48 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20a=20-dev=20endstate=20is=20always=20work?= =?UTF-8?q?=20=E2=80=94=20the=20post-release=20bump=20must=20not=20run=20r?= =?UTF-8?q?ed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The four-state table called '-dev but changed' half a ceremony and refused — but that state IS the mandatory post-release bump PR (bare -> X.Y.(Z+1)-dev after every release), which would have put a red run on main once per release, forever. A tree that ends -dev is by definition not a release: every such merge is work, and no-ops green with a NOTICE. The red verdicts now guard only bare endstates. Co-Authored-By: Claude Fable 5 --- .github/workflows/release.yml | 11 +++++++---- test/release.sh | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7621c95..59bc87d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -63,8 +63,10 @@ jobs: # job included. The version tells them apart, in four states: # -dev, unchanged → work under the label: green NOTICE # no-op, not a red run per infra PR - # -dev, changed → a bump that forgot to leave -dev: - # half a ceremony, refuse + # -dev, changed → still a dev tree, so still work — + # the post-release bump PR above all + # (bare -> -dev after every release): + # green NOTICE no-op # bare, unchanged, released → work merged in the post-release # window (ceremony landed, the -dev # bump has not): green NOTICE no-op @@ -85,8 +87,9 @@ jobs: echo "ceremony=no" >> "$GITHUB_OUTPUT" exit 0 fi - echo "VERSION changed ('$base' -> '$ver') but is still -dev — half a ceremony; a release PR ships a bare X.Y.Z — creating nothing." >&2 - exit 1 ;; + echo "NOTICE: VERSION changed ('$base' -> '$ver') and still ends -dev — a dev tree is by definition not a release. This is work (the post-release bump, a renumber); nothing to publish." + echo "ceremony=no" >> "$GITHUB_OUTPUT" + exit 0 ;; esac if [ "$base" = "$ver" ]; then if gh release view "$ver" --json name >/dev/null 2>&1; then diff --git a/test/release.sh b/test/release.sh index 9db7c1d..875c427 100644 --- a/test/release.sh +++ b/test/release.sh @@ -158,8 +158,8 @@ check "release.yml: tag + publish share one job (the anti-recursion shape)" 0 "" # and the gating output. check "release.yml: decide — dev-tree work no-ops green (not a red run per infra PR)" 0 "" \ grep -qF "release-flow work under the release label, not a ceremony" "$RY" -check "release.yml: decide — a half-ceremony (-dev but changed) refuses" 0 "" \ - grep -qF "half a ceremony" "$RY" +check "release.yml: decide — a -dev endstate is always work (the bump PR no-ops green)" 0 "" \ + grep -qF "a dev tree is by definition not a release" "$RY" check "release.yml: decide — post-release-window work no-ops green" 0 "" \ grep -qF "release-flow work merged in the post-release window" "$RY" check "release.yml: decide — bare, unchanged, never released refuses to guess" 0 "" \