Summary
loaf release creates the release commit and tag locally, then immediately invokes gh release create — without pushing either. gh refuses to create a release for a tag that only exists locally, so on any repo where loaf itself is responsible for pushing, the GitHub Release step fails every time and the operator has to repair by hand.
Observed
Repo: levifig/mvault, loaf 2.0.0-alpha.6 (repo initialized under 2.0.0-dev.42), hit identically on v0.11.0 and v0.11.1:
✓ Ran npm run build
✓ Committed release artifacts
✓ Created tag v0.11.1
loaf: Failed to create GitHub release: exit status 1: tag v0.11.1 exists locally but has not been pushed to levifig/mvault, please push it before continuing or specify the `--target` flag to create a new tag
The branch was fully in sync with origin before loaf release ran — the only unpushed refs were the release commit and tag loaf itself had just created.
Manual repair used both times
git push origin main --follow-tags
gh release create vX.Y.Z --title vX.Y.Z --notes-file <curated section>
Suggested fix
Insert a push step between tag creation and the GitHub Release step:
... → create release commit → create tag → git push --follow-tags → gh release create ...
Prefer push-first over gh release create --target <sha>: --target makes gh mint a fresh lightweight tag remotely, silently bypassing the signed annotated tag loaf just created locally.
A failure in the push step should abort before the GH-release step so partial-publish states stay easy to reason about.
Summary
loaf releasecreates the release commit and tag locally, then immediately invokesgh release create— without pushing either.ghrefuses to create a release for a tag that only exists locally, so on any repo where loaf itself is responsible for pushing, the GitHub Release step fails every time and the operator has to repair by hand.Observed
Repo:
levifig/mvault, loaf 2.0.0-alpha.6 (repo initialized under 2.0.0-dev.42), hit identically on v0.11.0 and v0.11.1:The branch was fully in sync with origin before
loaf releaseran — the only unpushed refs were the release commit and tag loaf itself had just created.Manual repair used both times
Suggested fix
Insert a push step between tag creation and the GitHub Release step:
Prefer push-first over
gh release create --target <sha>:--targetmakes gh mint a fresh lightweight tag remotely, silently bypassing the signed annotated tag loaf just created locally.A failure in the push step should abort before the GH-release step so partial-publish states stay easy to reason about.