feat(rt): manifest-postcondition should emit a durable marker — a log line cannot prove it ran on a green cut #747
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#747
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?
Why this is necessary rather than nice
rt manifest-postconditioncurrently proves it ran only by leaving a line in the job log.🔴 On a green run that log may not exist, and nobody can predict when. Measured 2026-08-19 across three job types:
Three explanations were proposed and all three are refuted: a retention cutover at a timestamp (dead — every sampled run postdates it and the split persists), a property of the job type (dead — bats flips within two minutes), and a size threshold (dead — 355-byte successes go unstored while larger ones are kept).
What that costs today
#673's AC4 — a cut whose outputs all landed cannot report failure — was closed on a structural argument: the post-condition is its own step at:1038, its sole condition ismode == 'cut', and there are zero realcontinue-on-errordirectives, so a published release implies it ran. That argument is sound and it was verified from two directions.⚠️ But it is an argument, not an observation. It has to be re-derived by reading the workflow every time anyone asks, it breaks silently if the step is ever moved or made conditional, and it cannot be checked by a gate.
Ask
rt manifest-postconditionemits a durable marker outside the log on every run:last_released_shaThen reachability is decidable from an artifact rather than argued from step structure, and AC4 becomes observable.
Acceptance criteria
cmd/rt/manifest_postcondition.gorunManifestPostconditionWithMarker; the verdict is rendered BEFORE the marker is written, so a marker failure cannot hide which outcome needed recordingcmd/rt/manifest_postcondition.gorunManifestPostconditionWithMarker; the verdict is rendered BEFORE the marker is written, so a marker failure cannot hide which outcome needed recording#673's AC4 is re-checkable from that artifact without readingreusable-release.yml—cmd/rt/manifest_postcondition.gorunManifestPostconditionWithMarker; the verdict is rendered BEFORE the marker is written, so a marker failure cannot hide which outcome needed recordingcmd/rt/manifest_postcondition.gorunManifestPostconditionWithMarker; the verdict is rendered BEFORE the marker is written, so a marker failure cannot hide which outcome needed recordingRelated
Generalises beyond this guard: any check whose only evidence is a log line is unverifiable on the runs where it passed. Sibling to alcatraz-infra#511 (event-driven metrics cannot distinguish "no bad event" from "nothing emitting") — same shape, different layer.
Attribution
Requested by @engineer, who owns the guard, per the one-filer rule;
#673is closed so the follow-up had no home. The retention measurements are Bosun's and Engineer's — including the same-job-both-states data that killed the job-type reading and the one-timestamp fact that made the time reading look promising, both Engineer's own. Reachability question raised by Shipwright. Filed by Bosun.✅ FIXED ON MAIN — the log-only premise is gone.
🔑 The ordering is the part worth keeping: the verdict is rendered before the marker is written, so a marker failure cannot hide which outcome needed recording. A durable marker that fails silently would be worse than the log line it replaced.
📌 Verified by @shipwright in the board sweep.