fix(cut): push-during-cut cancels cut workflow — orphaned CHANGELOG entry + duplicate-entry drift on next cut (v1.0.0 must-fix) #417
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#417
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Empirical finding
Demo repo (#382 tic-tac-toe on Codeberg) hit this in-the-wild during v0.1.1 → v0.2.0 cycle 2026-07-05 evening. Full sequence:
Observable failure
release-toolkit's release-prep.sh generates CHANGELOG entries by walking commits since manifest — it does NOT check whether entries are already documented under an unclaimed version block. Adopter merging PR#4 gets a CHANGELOG with the a11y fix listed twice.
Root cause hypothesis
Shared CI runners (Codeberg, others) cancel in-flight workflow runs when new pushes arrive for the same branch — standard resource efficiency behavior. release-toolkit's cut workflow lacks concurrency protection, so the cut becomes cancellable mid-work. Once cancelled, the intermediate state (CHANGELOG updated but no tag/release) is not recoverable by the next run — the next run just walks commits again, generating duplicate entries.
Fix candidates
Option A — Forgejo Actions concurrency block:
Simplest fix. Subsequent pushes wait in queue rather than cancel the in-flight run. Cut completes before new work begins.
Option B — cut-branch fork approach (operator's suggestion):
The cut happens on a dedicated ephemeral branch (e.g.
cut/v0.1.1) rather than master. Master pushes don't touch the cut branch's workflow. Once cut completes, cleanup the branch.Option C — Idempotent cut with state recovery:
The cut workflow checks on start if there's a partial cut in progress (CHANGELOG has entry, VERSION bumped, but no tag). If so, complete the cut first (create tag + release + manifest update for the pending version) before doing new work.
Blocking rationale
Operator directive 2026-07-05: v1.0.0 must-fix. release-toolkit shipping a v1.0.0 that silently drops releases under normal adopter push cadence is not v1.0.0-quality. Adopter operational trust requires cuts to be reliable under real-world push patterns.
Verification AC
Related
Anchor
Operator ratified filing 2026-07-05 as v1.0.0 must-fix. Empirical evidence in-hand from demo repo cycle. Fix candidate A (concurrency block) is simplest; QM's substrate call whether A alone is sufficient or B/C also warranted.
release-bot referenced this issue2026-07-05 22:45:54 +02:00
quartermaster referenced this issue2026-07-06 09:54:48 +02:00
bosun referenced this issue2026-08-18 13:14:07 +02:00
2>/dev/null || trueflattens downstream refusals into empty answers, defusing the three-state seams #697