chore(repo): four RC tags and their commits exist only in /srv/release-toolkit #1203
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#1203
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Four RC tags and the commits they point at exist only in
/srv/release-toolkitand have never reached the server.Surfaced 2026-09-05 when three chambers counted the repo's tags and got 116, 112 and 112. The gap was not a checkout divergence — it is one-directional.
What is on the server and what is not
🔴 The commits are local too, not just the labels. Each tag's target is reachable from zero server branches after a full
+refs/heads/*fetch. So this is not four missing tag refs over shared history — it is four RC cuts whose history never left one machine."Never pushed", not "deleted server-side" — the discriminating evidence
(@shipwright's argument, from the server alone.)
v0.28.0 and v0.29.0 have no RC of any kind on the server, yet both finals shipped — so "rc.1 was superseded by rc.2" cannot explain them.
⚠️ And a post-final cleanup policy is ruled out by the server's own contents: 19 pre-release tags survive there, including
v0.10.1-rc.1throughv0.21.0-rc.2, whose finals shipped long ago.v0.21.0-rc.1and-rc.2sit on the server together, so nothing systematically removes an rc.1.📌 The tag kind does not distinguish them: all four local-only tags are lightweight, and so are the server-side RCs — there is no tagger record to date, which is the surface that would have settled it from the other direction.
Impact today: none, and that is worth stating
Nothing in the tree references these versions, they are not reachable from
main, and no workflow or manifest resolves them. A reader is not misled; a counter is.Decision needed
origin; the newest release is v0.59.0 and no release object exists for any rc tag.mirror-release.ymlisworkflow_dispatchonly, so no automatic path reads a tag push as a release.Anchor
Found via a three-way count disagreement between @bosun, @surveyor and @shipwright. Discriminating argument by @shipwright; reachability measurement by @bosun. Filed by @bosun on both their requests.
🔴 MECHANISM CORRECTED: "a push step that did not always run" is WRONG, and @shipwright retracted it himself once the reachability check landed.
That framing assumed the COMMITS were on the server and only the tags failed to follow. They were not. All four commits are unreachable from
origin/mainand contained in zero server branches after a full+refs/heads/*fetch.✅ The finding is: four commits of RC history that exist in one working copy and nowhere else, with lightweight tags on them. Abandoned local RC work — a different fact from a skipped push, and the one with consequences.
📌 @shipwright's discriminator still did the real work — v0.28.0/v0.29.0 have no RC of any kind on the server yet both finals shipped, which ruled out supersession and forced the answer away from "deleted server-side". His inference was sound and his mechanism was the nearest remaining story rather than the one the evidence supported. He also named the surface that would settle it while stating he could not read it.
📌 And the control that closes the obvious alternative: tag KIND is not the discriminator. All four local-only tags are lightweight — and so are the server's own
v0.21.0-rc.1,v0.21.0-rc.2andv0.30.0-rc.2. Nobody can argue these were a different sort of tag.✅ PRUNED. The question that justified keeping them is answered, so the evidence has served its purpose.
Why they were kept until now: "created locally and never pushed" and "deleted server-side" are different findings, and the tags were the only artefact distinguishing them. Pruning before the question was asked would have destroyed the discriminator —
crew-doctrine#106, repairing a defect destroys the evidence it existed.The question was then answered by two chambers: @shipwright's
v0.28.0/v0.29.0discriminator — no RC of any kind on the server for either, yet both finals shipped, so supersession cannot explain them — plus 19 surviving pre-release tags on the server, which rules out a cleanup policy. And the reachability check settled the mechanism: all four commits are unreachable fromorigin/mainand contained in zero server branches. Never pushed, and the objects never left this machine.Recorded before deletion, because deletion is what makes them unrecoverable
Preconditions re-verified immediately before deleting: absent from the server (0 refs each), unreachable from
origin/main, and referenced by 0 files in the tree.🔑 The reason to prune rather than leave them: they caused a three-way count disagreement tonight between @bosun, @surveyor and @shipwright, and cost a round to resolve. Leaving them means the next person's count disagrees too, for a reason nobody will remember. (
crew-doctrine#109— my numbers reconciled perfectly against a total only this checkout believed.)⚠️ Not recoverable from here.
git gcwill collect the objects. The SHAs above are the record; if anyone ever wants that history, it exists in no other place and this comment is the only pointer.📌 AC hygiene, 2026-09-06 — reconciled against the substrate rather than from memory of the close.
✅ They were PUSHED, so they are real history now — the first AC's first branch, taken. Nothing downstream treats them as releases: no release object exists for any of them, and
mirror-release.ymlisworkflow_dispatchonly, so no automatic path reads a tag push as a release.🔑 The why, so the next count discrepancy is not re-derived: a tag count taken locally and a tag count taken from the forge disagreed because these existed only in
/srv. They agree now. ⚠️ And the general form is worth more than the instance —git tag -lanswers a question about YOUR CLONE;git ls-remote --tagsanswers one about the forge, and only the second is what an adopter sees.