dist-workspace.toml does not set create-release = false. Eight cargo-dist repos in the fleet do — aski, xray, xled, xshape, paxc, waddle, ved and ship-test-rust — and their config is otherwise the same shape as this one: cargo-dist-version = "0.31.0", hosting = "github", publish-jobs = ["homebrew"].
What happens without it
ship creates the GitHub release itself, with a person's token, because a token-created release fires the release: published that the other workflows wait on. The tag push then starts dist's release.yml, whose host job ends in the line dist generates when create-release is absent — .github/workflows/release.yml:279:
gh release create "${{ needs.plan.outputs.tag }}" --target "$RELEASE_COMMIT" ... artifacts/*
That fails on a tag that already has a release, and its failure skips publish-homebrew-formula and announce. The five platform archives, their checksums, the source tarball, the manifest and the generated formula are all built and none of them reaches the release.
This happened for real releasing excelano/slipql 0.1.0 on 2026-09-18, which had the identical config. slipql now carries the line.
Why it is worth fixing before the next release rather than after
dist generates release.yml with pull_request and tag-push triggers and no workflow_dispatch, and a workflow is read from the commit its tag names. So a repo that hits this cannot re-run the fixed workflow against the tag it spent. Recovering slipql meant downloading the failed run's artifacts, verifying each checksum by hand, gh release upload, and pushing the formula to the tap.
The fix
One line at the end of the [dist] block, with the comment aski carries:
# ship creates the release; dist attaches to it.
create-release = false
Then dist generate to rewrite release.yml, which swaps the gh release create for the upload-and-edit pair.
Until then
anderix/ship#84 landed a pre-flight row, so ship anderix/lux now refuses at the status screen — before the tag — rather than losing the host job after it. Nothing is at risk; the release just will not start.
🤖 Generated with Claude Code
dist-workspace.tomldoes not setcreate-release = false. Eight cargo-dist repos in the fleet do — aski, xray, xled, xshape, paxc, waddle, ved and ship-test-rust — and their config is otherwise the same shape as this one:cargo-dist-version = "0.31.0",hosting = "github",publish-jobs = ["homebrew"].What happens without it
ship creates the GitHub release itself, with a person's token, because a token-created release fires the
release: publishedthat the other workflows wait on. The tag push then starts dist'srelease.yml, whosehostjob ends in the line dist generates whencreate-releaseis absent —.github/workflows/release.yml:279:That fails on a tag that already has a release, and its failure skips
publish-homebrew-formulaandannounce. The five platform archives, their checksums, the source tarball, the manifest and the generated formula are all built and none of them reaches the release.This happened for real releasing
excelano/slipql0.1.0 on 2026-09-18, which had the identical config. slipql now carries the line.Why it is worth fixing before the next release rather than after
dist generates
release.ymlwithpull_requestand tag-push triggers and noworkflow_dispatch, and a workflow is read from the commit its tag names. So a repo that hits this cannot re-run the fixed workflow against the tag it spent. Recovering slipql meant downloading the failed run's artifacts, verifying each checksum by hand,gh release upload, and pushing the formula to the tap.The fix
One line at the end of the
[dist]block, with the comment aski carries:Then
dist generateto rewriterelease.yml, which swaps thegh release createfor the upload-and-edit pair.Until then
anderix/ship#84 landed a pre-flight row, so
ship anderix/luxnow refuses at the status screen — before the tag — rather than losing the host job after it. Nothing is at risk; the release just will not start.🤖 Generated with Claude Code