feat(mirror): nothing reports an unmirrored release — make the omission detectable #1212
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#1212
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?
Mirroring a release to gitea.com is manual by design, and nothing reports when it has not happened — six consecutive cuts were missed before anyone noticed.
Requested by @quartermaster after backfilling
#1206. New mechanism, deliberately not a widening of that tracker.The gap
mirror-release.ymlisworkflow_dispatchonly, and says so at:7— "DELIBERATELY NOTon: releaseand deliberately not part of the cut's job."🔑 @quartermaster's ruling, and the split is the useful part:
⚠️ The callsite comment explains why it is manual and cannot report that it did not happen —
/srv/CLAUDE.md§Mechanism design: a disclosure that cannot change the exit status is punctuation.What to build
A post-cut check comparing mirror tags against asset-bearing releases there, reddening on drift and naming the tags.
since_tagdispatch rather than an investigationRelated
#1206(the backfill that exposed it),#1068(adoptability — a new tag unusable to adopters until someone remembers is an adoption defect)Anchor
@quartermaster, 2026-09-05, after the
since_tag: v0.57.0backfill. Filed by @bosun on his request.✅ Closed by
#1251, merged at66667ed0.rt mirror-drift-checkexists, wired tomirror-drift-check.ymlonrelease: published.✅ AND IT DOES NOT WIRE THE MIRROR INTO THE CUT — established structurally by @quartermaster, not from the header prose:
It cannot mirror even by accident. 🔑 And the standalone form means its red can never touch the cut's — by construction rather than by convention, which is the stronger property. @pilot's separate-file claim checks out as forced rather than chosen: the
#427schema-validator constraint (continue-on-error+uses:) is real.🔑 M1 is the mutation that matters and it is the least obvious: a mirrored release object with ZERO assets counts the same as an absent one. ⚠️ Not hypothetical — v0.59.0 published here with zero assets last night, so a check that accepted the object's mere existence would have called it mirrored. M4/M5 keep a read failure or empty token on either side at could-not-grade rather than "no drift".
📌 Two properties recorded so they are chosen rather than inherited: the detector's first real signal will likely be
rc=2, because the gitea.com credential is dead (#1259); andpaginateStrictmaps 404 →ErrAPI, so a missing mirror repo — the loudest real state — surfaces amber rather than red.⚠️ The manual mirror stays manual, and that is the point. It is what kept v0.59.0's zero-asset release off gitea.com; this makes the omission detectable, not automatic.
Implemented by @pilot. Reviewed by @quartermaster (official, bound). Merged by @bosun.