path-gamma consumer never received a manifest PR — benign by fallback, silent by design? #661
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#661
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?
Observation, not a diagnosis
frankenbit/pursercompleted one full cut (v0.1.0, release job green, release published2026-08-05 22:38). It is a path-gamma consumer — no
RELEASE_TOOLKIT_TOKEN, soRELEASE_TOKEN_OVERRIDEis empty:So gamma delivers the manifest by PR. purser has no manifest, and no manifest PR ever existed.
Why it matters
The absence is currently benign —
release-decide.sh:221bootstrapsLAST_VERSIONfrom the neweststable tag, and that path works. But it is benign by fallback, not by design: a gamma consumer is
supposed to receive a manifest PR and never did, so it has been running on the bootstrap path since
adoption without anyone noticing.
It surfaced only because purser hit #417 (orphan CHANGELOG) and three of us had to reason about what
"update the manifest" means for a repo that has none.
What I did NOT check
discriminator and I have not read it.
one, in which case the question becomes why it was absent from
#17/#21.So this is "the delivery did not happen", not "the code is broken". Those need different fixes and
I am not asserting the second.
Suggested first step
Read the v0.1.0 release run's log around the manifest step. If gamma skipped silently, that is a
graceful-degradation path degrading past the point of usefulness — a consumer that never gets a
manifest gets no signal that it did not.
Related: #660 (the recovery doc's manifest wording), #78 (the gamma mechanism), ADR-0007.
Remedy verdict — LIVE and unchanged
The mechanism is present and unchanged, which sharpens rather than weakens this issue: the code
that should open the PR exists, and a gamma consumer has still never received one. So the
hypothesis space is the branch runs and the PR-open step fails silently, not the path was removed.
The remedy as filed — read the v0.1.0 run log around the manifest step — is still the correct and
cheapest next action, and still unrun.
🔗 See
#637: that is the alpha arm of the same subsystem regressing. Both fail silently, bothbranch off
:458. Neither has the negative control#637's AC4 asks for.Answered. The cause is #637's defect seen from the gamma side, and it was fixed in v0.36.0
The suggested first step — read the v0.1.0 run log around the manifest step — is done. It was the discriminator, as filed.
Finding the log, because the obvious read was wrong
releasejob task 20755 has an emptylog_filenamein Forgejo'saction_tasktable, and its neighbours have logs. That reads as a deleted log and it is not one:A
uses:caller job is a container with no execution and therefore no log. The v0.1.0 log isdecide + act, task20754.The log line, and it is unambiguous
The gamma branch was never reached. The idempotency precheck skipped first, and the step exited 0. So the answer to "was gamma reached, errored, or no-op'd" is: it was never reached.
Why the precheck skipped against a manifest that does not exist
Because in
v0.35.0it read the working tree:rt releaseruns above this step and writes the manifest itself. So by the time the guard ran, the workspace file recordedHEAD_SHA, and the guard read its own run's write and skipped its own run's work. The workspace copy then died with the runner: never committed, never PR'd, andchangelog.d-style consumption meant nothing surfaced it.This is the same defect as #637, and the identifiers close the window
So it is not a gamma-specific bug. The precheck sits above the alpha/gamma split, so both paths were affected by one commit:
Two consumers, two paths, two independent observations, one cause.
✅ purser is already repinned
release.ymltoday readsreusable-release.yml@v0.36.0, so purser carries the fix. No code change is indicated by this tracker.What is NOT resolved, and it is the part worth keeping
purser still has no manifest, because the missed write was never retried, and nothing anywhere says so. That is this tracker's own framing — a consumer that never gets a manifest gets no signal that it did not — and it survives the fix.
The gamma PR-open itself is fail-loud (
::error::failed to open manifest PR+exit 1), so the remaining hole is not there. It is the absence of a post-condition: a cut can complete with no manifest landed and no manifest PR open, and exit 0.That is exactly #637's AC3 and AC4. The two trackers converge on one piece of work rather than two, and I would rather build it once — writing that up on #637.
Method note against myself
Two instrument errors on the way here, both self-caught, both worth naming because they nearly produced findings:
origin/mainis the PARENT's localmain, not the parent'sorigin/main. Mine was one commit stale, and the composed section came back missing a fragment that is plainly onmain— one sentence from "prep silently drops fragments".log_filenameempty read as "the log was deleted." It means the job never executed anything. The DB had the answer; the filesystem did not.Closing — the residual landed in
#741(merged atdac08dd)This tracker was answered in comment 95834: purser's
v0.1.0ranreusable-release.yml@v0.35.0, whose manifest precheck read the working tree.rt releasewrites the manifest there first, so the guard read its own run's write and skipped — every time, silently, exit 0. Regression commit6547d9c(mine), fixed bya4553a1inv0.36.0; purser had already repinned.The residual was the missing post-condition, and it is the same object as
#637AC3/AC4 — one mechanism, two trackers, opposite paths. That is why this stayed open after the cause was named: the precheck fix stopped the guard reading its own write, but nothing yet refused a cut that finished having written no bookkeeping at all.#741adds it, verified onmainatdac08dd:Gamma-specific, since that is this tracker's path: an open manifest PR passes, because it is path gamma's terminal state — the bookkeeping lands on merge. The gate cannot tell you whether that merge will happen, and its pass message says so rather than leaving it implicit. What it now refuses is the case this tracker reported: a cut finishing with neither a landed manifest nor an open PR, and exiting 0.
Closing as delivered.
#637carries the ticked ACs and the fuller scope note (comment 96426).