feat(mirror): mirror on release: published again, and alert instead of commenting on a tracker #1586
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
frankenbit/release-toolkit#1586
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?
Successor to #1348, which closed having met its ACs. #1348 made the omission detectable; this makes it self-clearing and moves the report off a tracker nobody is reading.
Operator ruling, 2026-10-21, on both halves:
The enabler is not new — it was built, it worked, and it was deleted for an unrelated reason
⚠️ #1212's ruling is mine and it re-solved a solved problem. Its reasoning about not taking a hard dependency on a third party inside the cut stands; what it missed is that a separate workflow on
release: publishedalready gave exactly that isolation, and had done for six weeks.mirror-drift-check.ymlrelies on the same isolation today — it fires on that event to DETECT and does not mirror on it.Three layers
🔑 No quarantine window. The operator's reason, which corrects the premise my suggestion rested on: "The development of rt on our local forge is not for the sake of isolation / quarantine of other users, but rather because of convenience. We had the instant mirroring, but dropped it only because of the dependency that could break a cut." The local forge is not a staging gate, so there is nothing a delay would buy.
What must be got right
rc=2NEVER dispatches. Could-not-grade means the comparison was not made. Dispatching on it acts on no information; treating it as clean is #1259 again — the token 401'd while four releases were genuinely absent, and the check correctly refused before it could compare. Three states, three actions:0nothing ·1dispatch, then re-check ·2alert the instrument, dispatch nothing./srv/CLAUDE.md'ssystem_configs_driftpattern: a stopped checker leaves the last value served, including a reassuring zero. This matters MORE here than in #1348, because once drift self-clears, silence becomes the normal state — and silence is also what a dead nightly produces.force_recreatemust be unreachable from automation. It is destructive, andmirror-release.yml's header already confines it to the dispatch surface. Layer 1 and 2 passsince_tag/tag_nameonly.The dispatch mechanics are already proven in-repo
release.yml:184POSTs.../actions/workflows/<file>/dispatcheswithsecrets.RELEASE_TOOLKIT_TOKEN. ⚠️ And it falls back in SHELL on purpose — their TC-1 note (#41/#47) records that${{ secrets.A || secrets.B }}does not fall back when A is unset. Copy that shape rather than the obvious one.Open, for whoever picks this up
remote_writeout of the Actions run (precedent: storey's bench pushes its bars that way), or a host systemd timer plus node_exporter's textfile collector (precedent:system-configs-drift-check.timer). The second matches the existing drift-alert pattern exactly but movesMIRROR_TOKEN_GITEA_COMonto the host, which is a credential-placement decision for the operator.AC
rc=1,rc=2and clean are distinguishable from the alerting surface, andrc=2never triggers a mirrorrelease: published, and stop reopening a closed tracker #1587PR #1587 merged fast-forward-only at
05bd59caon review 8017 (official=true,stale=false, bound to that head), 5 of 5 required contexts green.Layers 1 and 2 are in. The alert is not, and two items carry forward:
remote_writeneeds protobuf+snappy from a shell step or two new deps in a 2-dep Go module; the textfile collector needs a host-side comparison, which would be a second implementation of a predicatert mirror-drift-checkalready owns. Neither is free and the choice is open. Less urgent now that drift should be the exception.mirror-drift-check.ymlto arm 135. That arm is the only assertion in this repo that grades a shell predicate by EXECUTING it, and its regexes are tied to the exact shape of two lines in the report step — the capture and the guard. It REFUSES rather than passing when it cannot locate them, which is the right failure, but a reshaping of that step turns a passing arm into a refusing one and the next reader will takeREFUSED: cannot extractfor a broken arm. A line in the step saying the capture and guard are graded by execution, and that reshaping them means re-pointing arm 135, costs nothing and saves a wrong conclusion. Raised in review 8017; deliberately deferred out of #1587 so a comment-only change did not cost a re-review round on an approved head.