bug(mirror-drift-check): v0.63.1 sat unmirrored for 24 days under 26 DRIFT comments on #1348 that reached nobody #1520
Labels
No labels
bump
major
bump
minor
bump
patch
kind
bug
kind
chore
kind
docs
kind
epic
kind
feature
loop/paused
mirror-drift
priority
critical
priority
high
priority
low
priority
medium
size
L
size
M
size
S
size
XL
status
blocked
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
frankenbit/release-toolkit#1520
Loading…
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?
v0.63.1 sat unmirrored on gitea.com for 24 days and 19 hours. Every morning,
mirror-drift-checkposted a comment to the standing tracker #1348 naming it: 26 comments, and none of them got a reply. The gap surfaced only on 2026-10-02, when the v0.64.0 cut's release-event run put a red status on the prep commit that the operator happened to see. #1348's shipped AC says the drift report goes to "a surface a reader actually looks at". This measurement says it does not.Measured
Measured 2026-10-02.
2026-09-08T01:21:51+02:00(GET /releases/tags/v0.63.1)2026-10-02T18:48:59Z, bymirror-release.ymlrun 19189, dispatched on operator requestmirror-releasedispatch before thattag_name=v0.63.02026-09-08T08:48:01+02:00to2026-10-02T20:37:17+02:00, all byforgejo-actions2026-09-07T23:20.priority/high, assigned toengineer, every AC tickedrelease: publishedfor v0.64.0) postedmirror-drift-check / drift = failureoneefff94, and the operator saw it on the cutRun 19185's log:
FAIL: 1 release(s) carry assets here and do not on the mirror: v0.63.1. After run 19189, both v0.63.1 and v0.64.0 are on the mirror. Theirchecksums.txt,checksums.txt.minisigandrt-linux-amd64match the origin's byte for byte (sha256 compared).Settled, and not reopened here
Mirroring is manual by design. See #1212, #1392 and
mirror-release.yml:23-27: "A mirror failure must not redden or block a cut that has already published correctly here." #1212's own words name the gap this issue measures: "manual is fine; manual with nothing watching produced the gap". Something is watching now. Nothing the watcher says reaches a person.Why it matters
rt mirror-drift-checknamed the right tag with the right remedy on every one of the 26 runs.Not established
engineer, the assignee, receives or reads Forgejo notifications for comments on an assigned issue. It was not probed. The outcome (0 replies in 24 days) is measured; the cause is not.Decision tree
(A) Show unmirrored tags where the operator already is during a cut. For example, the rolling release PR body or
rt decide's log line could name the unmirrored tags, advisory and never blocking.(B) Notify a named person. The DRIFT comment @-mentions the operator, or the check assigns the tracker to them.
(C) Escalate with age. Day 1 is a tracker comment. After N days, open a fresh issue assigned to the operator, or post the red where (A) would.
(D) Mirror on
release: publishedin a separate workflow, outside the cut's graph, and keep the drift check as the backstop.mirror-drift-check.ymlalready does: its red lands as its own status context, and the cut's jobs are untouched.mirror-drift-checkalready does today.Lean, for the operator to overrule: (D). It removes the step whose omission has now happened three times, and the stated reason for keeping it manual is satisfied by the same separation
mirror-drift-check.ymlalready uses. If (D) is declined, (B) is the cheapest delivery fix, once mention notifications are measured.Acceptance criteria
Closing as superseded by #1586 / PR #1587, which took an option this issue's decision tree does not name — and the residue is named below rather than closed with it.
This issue's finding is that the delivery reaches nobody: 26 correct DRIFT reports naming v0.63.1, 0 replies, 24 days and 19 hours unmirrored. Options (A) show it during a cut, (B) notify a named person, (C) escalate with age — all three keep the report as the mechanism and try to route it better.
(D), which is what landed: fix the cause so the report is rarely needed.
So the 24-day shape cannot recur the same way: the mirror no longer waits for a human to dispatch it, and a report that does appear lands on a tracker that shows up on the open board as new rather than as comment number 27 on a standing one.
What this does NOT fix, and where it now lives
🔑 The delivery question itself is not answered, it is made rarer. A filed tracker is still an issue on a board, and this issue's own evidence is that a board entry can go 24 days unread while the project's attention is elsewhere. The operator's words on 2026-10-21, closing #1348: "Reopening an issue and posting comments on it will only work if there are a dozen of other issues at most and the project is being actively worked on."
#1586 owns the real answer and it is unbuilt: a Prometheus gauge plus one Grafana alert, with a staleness partner so a stopped checker is alertable rather than serving a reassuring zero. Its open ACs carry it, including the push-path decision that blocks it —
remote_writeneeds protobuf+snappy from a shell step or new dependencies in a two-dependency Go module, and the textfile-collector route would be a second implementation of a predicatert mirror-drift-checkalready owns.⚠️ And one thing in this issue's "Not established" is still not established, so it is not being quietly dropped: whether the assignee receives or reads Forgejo notifications for an assigned issue, and whether an @-mention in a bot comment notifies on this instance. Neither was probed then and neither has been since. Option (B) depended on both. Also measured since, on the same instance: the forge has not successfully sent any notification email for at least two weeks —
alcatraz-infra#940, the relay's cert names onlylocalhostwhileSMTP_ADDR=smtp-relay, 0 deliveries fromgit@frankenbit.deagainst 10,852 from other senders. So for that window the answer to (B) was nobody receives anything, which is worth knowing before anyone reaches for a notification-based remedy again.Why it is closed rather than left open behind #1586
The measured instance is remediated (all 8 releases mirrored, byte-identical assets), the cause is addressed on main, and what remains is one AC on a tracker that already owns it. Leaving this open would put the same residue on two boards, which is this issue's own complaint in miniature.