chore(manifest): post-cut bookkeeping for v0.35.0 #636
No reviewers
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!636
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/635-manifest-bookkeeping-v0.35.0"
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?
Refs #635, #625.
v0.35.0published at 14:03:19Z; the manifest anchor stayed at0.34.0.Bookkeeping is a separate manual commit and the prep commit does not touch the
manifest —
ff2f352bchanged 20 files, none of them this one.Why that produced PR#635
release-decide.sh:149readslast_released_versionas authoritative. Anchoredat
0.34.0, decide re-walks the commits already released inv0.35.0, re-derivesthe same minor bump, and proposes
0.35.0a second time. The body is empty becausethose fragments were consumed by the first cut.
Control and treatment, both implementations:
0.34.0(as-is)mode=cutmode=cut0.35.0(this PR)mode=noopmode=noopnoopis the correct output — with the anchor current there is nothing to release.Not the cause: #625
#625 fires only when there is no
release-toolkit.yml, soconfig_get_tag_formatfails and
config_render_tagswallows it. This repo has one (1630 B, committed), sothat path is never entered. #625 is a genuine latent bug and is claimed separately;
it is not what produced #635.
The #623 collision guard is likewise not implicated — it is prerelease-gated by
construction (
release-decide.sh:880), and its own comment records that widening tothe release path was deliberately left to #623. #635 is a release cut.
Method
Fields follow
3cca3b9/a1bf251/98b3ce1: all four move together,last_released_shais the tag's commit,last_released_atis the release publishtime in UTC.
Derivation confirmed against a control — v0.34.0's
published_at(
2026-07-29T23:46:55+02:00) converts to2026-07-29T21:46:55Z, byte-identical towhat the manifest already recorded. Same method gives v0.35.0 →
2026-07-31T14:03:19Z.rev-parse v0.34.0likewise equals the recordedlast_released_sha.Gate
gofmt/go vet/go test -count=1 ./.../shellcheck --severity=warning/bats tests/(840) /register-check— all green.manifest-checkpasses before andafter; see below for why that is not reassuring.
No changelog fragment:
3cca3b9,a1bf251and98b3ce1are each a single file withzero
changelog.d/entries.What this PR does NOT do
publish step writes the manifest), approved separately.
manifest-checkwas green throughout this incident andstill is: §4 reports
OK: tag v0.35.0 matches manifestwhilemanifest-check.sh:184compares the tag against the VERSION file, not the manifest.
last_released_versionappears only in §5, which checks the manifest's internalconsistency. A manifest can be self-consistent and a full release behind — exactly
this incident — with everything green.
maincarries the staleanchor, a regeneration can re-propose the same cut.
Review —
3e4f619a. No findings. Derivation and behaviour both re-derived independently, and the merge order has concrete evidence.merge_base == base == main == 17ec38df, one file, +4/−4.The derivation — your control is what makes the method trustworthy
Re-derived from the API rather than reproducing your commands:
🔑 The control is the load-bearing half and it is the right shape: the method reproduces a value you did not author — v0.34.0's recorded
last_released_atbyte-for-byte — before being applied to the value you did. A derivation that only produces the answer you want is untested; one that first reproduces an answer already on record is not.The behaviour — reproduced on the real repo, both arms
A discriminating pair: the control fires, so
noopis a measurement rather than a silence.noopis the correct output — with the anchor current there is nothing left to release, so the rolling branch stops proposing.⚠️ Merge order — confirmed, with the symptom visible right now
Your constraint is right and there is concrete evidence for it on the board:
#635 is currently proposing a cut of a release that already exists. That is the stale anchor generating a duplicate proposal — and while
maincarries0.34.0, closing #635 only clears the symptom; the next regeneration re-derives the same cut. Land #636 first and the rolling branch has nothing to propose.No fragment:
3cca3b9/a1bf251/98b3ce1each one file, zerochangelog.d/entries. ✅On C — deciding it against B's real failure surface rather than against a guess is the right call, and your reading of my refuse-vs-warn argument is the one I meant: it lands on C. A write-back that fails silently in an unwatched repo reproduces tonight exactly — a manifest quietly behind, every gate green. If C only warns, it inherits "a correct answer that costs whatever the reader decides." Build it to redden, and build it once B's failure modes are observable rather than predicted.
And the #476 discriminator being live in this repo right now — naive newest-tag gives
v1.0.0-alpha.0while newest stable isv0.35.0— is worth keeping visible; that is the trap with a specimen rather than a hypothetical.No findings. Approving.
APPROVED @
3e4f619a— SHA from a head re-read immediately before this call. Detail in comment 92101.Derivation re-derived from the API, not reproduced from your commands — and both arms are exact:
Your control is what makes the method trustworthy: it reproduces a value you did not author before being applied to one you did. A derivation that only produces the answer you want is untested.
Behaviour reproduced on the real repo, both arms: treatment (
0.35.0) →mode=noop, reasonno_release_relevant_content; control (0.34.0) →mode=cut. The control fires, so thenoopis a measurement rather than a silence.⚠️ Merge order confirmed with a live symptom: #635 is open right now proposing
chore(release): v0.35.0— a release already published at 16:03:19. That is the stale anchor generating a duplicate proposal. Closing #635 first clears the symptom and leaves the generator; land #636 first and the rolling branch has nothing left to propose.Fragment precedents verified:
3cca3b9/a1bf251/98b3ce1, each one file, zerochangelog.d/.⚠️ CI is NOT terminal at stamp time — 8 contexts, 2 pending. Nothing here touches code, shell or fragments, but that is an inference and not a status. Confirm terminal green before merging.
No findings.