README: three steps run past the tag, and the publish is one of them

The overview's fail-loudly paragraph said "Only two steps run past the tag"
and attributed the tag-standing/no-release state to the artifact hook alone.
Past `tag the merge commit` (release.yml:224) come three steps: the artifact
hook (:236), `publish the release` (:246) and the -dev re-arm (:267). The
publish is `gh release create --verify-tag`, so it can fail on the API call
or the assets with the tag already standing — the same state, from a second
cause.

State the count as three and sort them by what a failure leaves behind: two
fail before the release exists (hook, publish), both recovered by the tag
door; the third is the re-arm, still the one failure in the file that leaves
a real release behind. The nothing-exists recovery text names the publish
among the causes of a tag with no release too; its remedy is unchanged.
This commit is contained in:
cndgrr 2026-08-04 23:29:12 +00:00
parent 1410c01caf
commit 263bb74652

View file

@ -122,12 +122,16 @@ transcription because humans err silently and machines fail loudly:
**everything asserts its way to certainty and fails loudly, creating **everything asserts its way to certainty and fails loudly, creating
nothing** — a wrong release is worse than a missing one, so every assert in nothing** — a wrong release is worse than a missing one, so every assert in
this file fires *before its door creates anything*, and one that fails leaves this file fires *before its door creates anything*, and one that fails leaves
zero artifacts of the run's own: no tag it made, no release, no bump. Only two zero artifacts of the run's own: no tag it made, no release, no bump. Three
steps run past the tag. The consumer's steps run past the tag, and what a failure at each leaves behind is what
sorts them. Two fail before the release exists: the consumer's
[artifact hook](docs/CONSUMERS.md#the-artifact-hook) sits between the tag and [artifact hook](docs/CONSUMERS.md#the-artifact-hook) sits between the tag and
the publish, so its non-zero exit aborts with a tag standing and no release — the publish, so its non-zero exit aborts, and the publish itself
a state the [nothing-exists assert](#the-merge-door-refused-releaseyml) names, ([`gh release create --verify-tag`](.github/workflows/release.yml#L246-L258))
and recovers by the tag door. The re-arm runs after the publish, and its can fail on the API call or the assets. Either leaves the same state — a tag
standing and no release — which the
[nothing-exists assert](#the-merge-door-refused-releaseyml) names and the tag
door recovers. The third is the re-arm, which runs after the publish, and its
refusal is the single failure in this file that leaves a real release behind. refusal is the single failure in this file that leaves a real release behind.
## The two doors ## The two doors
@ -485,9 +489,9 @@ clobber, and what catches a manual tag racing the merge. If the release
truly exists, there is nothing to do: this red is the system declining to do truly exists, there is nothing to do: this red is the system declining to do
the thing twice. If the tag exists but the release does not (a manual tag the thing twice. If the tag exists but the release does not (a manual tag
won the race, or won the race, or
[a failed artifact hook](docs/CONSUMERS.md#the-artifact-hook)), recover by [a failed artifact hook](docs/CONSUMERS.md#the-artifact-hook), or the publish
the tag door: delete and re-push the tag, or `gh release create` by hand step itself failing after the tag), recover by the tag door: delete and
from a fixed tree. re-push the tag, or `gh release create` by hand from a fixed tree.
> direct push refused (branch protection?) — opening the bump PR instead > direct push refused (branch protection?) — opening the bump PR instead