2.0.1-beta4
Pre-release
Pre-release
ci(release): --clobber fallback for force-pushed tags
PUSH-REORGANIZATION §3.6 incident postmortem (2026-05-25): after
force-pushing the `2.0.1-beta4` tag from the Phase 2 commit to
the Phase 6 commit, CI re-ran on the force-push event, built the
fresh main.js with Phase 6 code, but the `Create release` step
failed with:
a release with the same tag name already exists: 2.0.1-beta4
Process completed with exit code 1.
`gh release create` does not replace an existing release. The
newly-built artifact was discarded; the GitHub release page kept
serving the old Phase 2 binary; `Settings → Community plugins →
Update` re-downloaded the same old binary because the version
string hadn't changed.
Fix: pipe `gh release create` to `gh release upload --clobber`
when the release already exists. The upload variant accepts the
file list and overwrites assets in place, which is exactly the
semantic we want for force-pushed tags.
Behavior after this patch:
- First push of a new tag → create succeeds, files uploaded.
Identical to before.
- Force-push of an existing tag → create fails ('release exists'),
fallback uploads files via --clobber, release artifacts
refreshed in place. Users who manually trigger update from
Settings → Community plugins now get the latest binary even
though the version string stayed the same.
- The shell short-circuit (`|| ...`) leaves the exit code of
the successful upload as the step's exit code, so CI passes.
Same pattern applied to both the -beta and non-beta branches of
the conditional.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>