fix(release): let a successor take over an abandoned version claim #2028

Merged
sean merged 1 commit from fix/version-claim-abandoned-takeover into trunk 2026-08-11 08:37:13 +00:00
Owner

The ConfigMap claim and earlierReleaseVersionOwner disagreed and the stricter one won forever: a release that failed before producing durable evidence burned its version permanently. With semver-patch and no tag advance, every retry derives the same version, so the project can never release again.

ory hit this today: first release failed at tag creation with 403, published nothing, kept 0.1.0. An existing envtest case already asserts this must not happen — it passes only because it never creates the claim ConfigMap the real path creates.

Takeover stays narrow (terminal + no items/image/Deployable/Succeeded), an absent holder record stays exclusive, and the takeover is resourceVersion-guarded. Tests verified red without the fix; full envtest suite (125 specs) green.

The ConfigMap claim and earlierReleaseVersionOwner disagreed and the stricter one won forever: a release that failed before producing durable evidence burned its version permanently. With semver-patch and no tag advance, every retry derives the same version, so the project can never release again. ory hit this today: first release failed at tag creation with 403, published nothing, kept 0.1.0. An existing envtest case already asserts this must not happen — it passes only because it never creates the claim ConfigMap the real path creates. Takeover stays narrow (terminal + no items/image/Deployable/Succeeded), an absent holder record stays exclusive, and the takeover is resourceVersion-guarded. Tests verified red without the fix; full envtest suite (125 specs) green.
fix(release): let a successor take over an abandoned version claim
Some checks failed
pipeline/ci CI failed @ 8cefb5cf6237
8cefb5cf62
The ConfigMap claim and earlierReleaseVersionOwner disagreed about the
same question, and the stricter one won forever. The list scan lets a
later intent supersede a terminal Release that published nothing; the
claim refused unconditionally. So a release that failed before producing
any durable evidence burned its version permanently.

ory hit it today. Its first release failed at tag creation with a 403
(pipeline-bot had no write on sean/ory), published nothing, and kept
0.1.0. semver-patch derives the version from immutable tags, no tag
advanced, so every later intent derived 0.1.0 again and lost to a
corpse. The project could not release again, ever. An existing envtest
case already asserts this must not happen -- it passes only because the
test never creates the claim ConfigMap the real path creates, so it
exercises the list scan alone.

Takeover stays narrow. releaseVersionClaimAbandoned still demands a
terminal phase with no frozen items, no published image, not Deployable
and not Succeeded, so any claim whose external effects may exist stays
exclusive. A holder whose record cannot be read stays exclusive too,
absence included: stranding a version is recoverable, issuing it twice
is not. The takeover is an Update carrying the resourceVersion the
decision was made against, so a concurrent takeover loses rather than
silently overwrites, and previousRelease keeps the corpse auditable.

Tests: takeover happens; it does NOT happen for Succeeded, Deployable,
a published image, frozen items, a running holder, or an absent record.
Verified red without the fix.
sean force-pushed fix/version-claim-abandoned-takeover from 8cefb5cf62
Some checks failed
pipeline/ci CI failed @ 8cefb5cf6237
to 68a8948c38
Some checks failed
pipeline/ci CI failed @ 68a8948c3828
2026-08-10 16:06:16 +00:00
Compare
sean force-pushed fix/version-claim-abandoned-takeover from 68a8948c38
Some checks failed
pipeline/ci CI failed @ 68a8948c3828
to 33569a0006
Some checks failed
pipeline/ci CI failed @ 33569a000602
2026-08-10 16:41:08 +00:00
Compare
sean force-pushed fix/version-claim-abandoned-takeover from 33569a0006
Some checks failed
pipeline/ci CI failed @ 33569a000602
to c86d7bf991
Some checks failed
pipeline/ci CI failed @ c86d7bf99142
2026-08-10 16:47:22 +00:00
Compare
sean force-pushed fix/version-claim-abandoned-takeover from c86d7bf991
Some checks failed
pipeline/ci CI failed @ c86d7bf99142
to 16df5a6bff
Some checks failed
pipeline/ci CI failed @ 16df5a6bffdc
2026-08-10 17:18:55 +00:00
Compare
sean force-pushed fix/version-claim-abandoned-takeover from 16df5a6bff
Some checks failed
pipeline/ci CI failed @ 16df5a6bffdc
to 0c57b26ec6
Some checks failed
pipeline/ci CI failed @ 0c57b26ec63c
2026-08-10 18:05:41 +00:00
Compare
sean force-pushed fix/version-claim-abandoned-takeover from 0c57b26ec6
Some checks failed
pipeline/ci CI failed @ 0c57b26ec63c
to f546c0c6e5
All checks were successful
pipeline/ci CI green @ f546c0c6e5d2
2026-08-11 08:36:23 +00:00
Compare
sean merged commit f546c0c6e5 into trunk 2026-08-11 08:37:13 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
sean/pipelines!2028
No description provided.