chore(release): v0.36.0 #639
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!639
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "release-prep/rolling"
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?
Added
composite action: caches the
rtbinary, cutting warm installs from ~10s to under a second (#606)The checksum verify still runs on cache hits — a restored binary is re-verified against the release manifest before anything executes it. No action needed: adopters already on
uses: frankenbit/release-toolkit@vX.Y.Zget this on their next run.Changed
fragment-check gate: now runs
rt fragment-checkinstead of the bash script (#607)The workflow's inputs are unchanged —
valid_kindsandfragment_length_warn_charsreachrtthrough the same env vars the script read, verified by differential run. Adopters pinned to a release tag get a cachedrt(~48ms warm, #606); no action needed.Fixed
fetch-rt: the "not listed in checksums.txt" error can now actually print (#606)
The branch was unreachable under
set -euo pipefail, so a release published with incomplete assets failed with a bare non-zero exit and no diagnostic. Anyone who hit that case saw no reason for it.config:
config_render_tagnow fails when the tag format cannot be resolved (#625)With no
release-toolkit.ymlit returned success and an empty string. Callers'|| printf 'v%s'fallbacks therefore never fired, andrt decideemitted an emptynext_tag. The bash path now matches the Go path, which already fell back tov.changelog-body-check: density checks now read lists, quotes and tables (#632)
Checks 7 and 9 scanned plain paragraphs only, so the same over-long sentence failed as a paragraph and passed as a bullet. Markers are now stripped and the remainder scanned. A blockquote over the ceiling names itself in the failure, and the message names the variable that raises the ceiling.
release: post-cut manifest bookkeeping is written again, and verified on the branch (#637)
The idempotency pre-check read the workspace copy, which
rt releasenow writes itself. It saw its own run's work, assumed a prior run had landed the commit, and skipped the push. It now reads the remote branch tip, and a post-condition refuses when the commit did not land.changelog-body-check: honour
CHANGELOG_BODY_CHECK_{SENTENCE_MAX,SENTENCE_WARN,PAREN_DEPTH_MAX,PARAGRAPH_MAX,PARAGRAPH_WARN}env vars in the Go port — previously hardcoded, making the failure message's advice to set these vars incorrect (#652). Invalid (non-integer) values now exit 2 rather than silently falling back to the default.release: the cut safeguard grades the prepare commit, and a decline now fails the run (#663)
Layers 2 and 3 were keyed on
HEAD_SHA, which asks whether the last merge came from the rolling branch, not whether the prepare commit did. Those diverge on the buried-prepare path, so a follow-up commit on top declined a valid cut. The gate now keys on the prepare commit's own sha. A decline is now an::error::and a non-zero exit, not a bareechoin a step that exits 0.release: the Go decide port's prepare-sha resolution is now pinned by tests (#663)
The #663 fix landed in both implementations, but only the Bash half had arms. Reverting the Go keying, or neutering the resolver, left
internal/decideandcmd/rtfully green. The byte-oracle cannot cover it either: it runs--dry-run, where Layer 2/3 areSKIP. Adds a merge-commit fixture with a live Layer-2 lookup, a stray-prepare pin, and a direct resolver test over all three shapes.changelog: split 37-word density failure in 652 fragment
release-decide: resolve the prepare's OWNING MERGE, and make the seam as strict as production
register-check: the allow-list wildcard bullet was WRONG, not just loose
fragment-check: drop
|| true— the runnability check could not failchangelog-body-check: #632 blockquotes REFUSE with a named override
Removed
None.
Deprecated
None.
Upgrade
None.
fc9c7a89b342066d2d2fchore(release): v0.35.1to chore(release): v0.36.042066d2d2f0e98b8757c0e98b8757c636d3bc4b4636d3bc4b446c2785f0846c2785f082d09dae3c02d09dae3c0f9e922bc1df9e922bc1d16af555a3116af555a3193baaa47cd93baaa47cd0a95817d6b0a95817d6bf2c85841c5APPROVED at
f2c85841c52256b895466f51a31866bd33bc390a— SHA named in the body, because the field is caller-supplied and proves nothing on its own.Reviewed as a methodology check, at the author's request: his report rests on one sentence — "the compose-verify I ran is the compose-verify that will run" — and he asked that the construction be attacked rather than the result re-derived. All four of his named failure modes close from the substrate. I found a fifth; it is currently empty.
① Right gate — CONFIRMED
reusable-release.ymlatmode=cutinvokes exactly what he ran:Not the bash script, not
changelog-body-check.shdirectly. This is the gate that FATAL'd purser.② Right ref — CONFIRMED, and this is the subtle one
So the binary is built from main at job-run time, and ff-only with makes post-merge main exactly
f2c85841c52256b895466f51a31866bd33bc390a. His build ref is correct. (git merge-base --is-ancestorconfirms fast-forwardability.)③ Right thresholds — CONFIRMED
No threshold variable appears anywhere in
reusable-release.yml. Control:CHANGELOG_BODY_CHECK_SENTENCE_MAXdoes appear in three other files in the same tree, so the grep reaches. Defaults apply, matching a hand run.④ Tree state / missing
.git— CONFIRMED, two wayscmd/rt/compose_verify.gois 133 lines. Imports:errors fmt io os strings cobra internal/gates. Its only I/O isos.ReadFile(changelogPath)at:85. Noexec.Command, nofilepath, no.git. Non-test files underinternal/gateshave zero I/O hits.It never consults git, so the archive's absent
.gitcannot cause a silent skip. Independently, his controls A and B fired — which converts the PASS from an absence of signal into a measurement.🔴 ⑤ The fifth — a TOCTOU on
REF=main, currently emptyREF="main"resolves when the job checks out, not when the merge happens. If anything else lands between #639 merging and the release job starting, thertthat runs is not the binary he built.So the window is empty right now — that is a measurement of today, not a property of the design. It is not a blocker; it is a reason not to merge anything else into
mainbetween this stamp and the cut.Content — verified independently, not inherited
The purser trap is absent: this is a substantive section, not 183 chars of
None.— which is the failure a form-grading gate structurally cannot catch.Diff scope is a textbook prepare commit:
VERSION, fiveBUILD_BAKED_TOOLKIT_REFbumpsv0.35.0 → v0.36.0, README/docs/examples pin bumps, and 9 consumed fragments folded intoCHANGELOG.md.⚠️ What this stamp does NOT cover
compose-verify. ①–④ establish that the author's run was faithful; they do not re-execute it.Repair to review 5056 — one clause was swallowed by my own shell
The verdict and every check are unaffected; a factual detail is missing from the published text.
Section ② reads:
It should read
ff-only with 1 ahead / 0 behind. I wrote the body in an unquoted heredoc, so the backtick-quoted1 ahead / 0 behindwas evaluated as a command substitution and replaced with its (empty) output. Review bodies cannot be edited —PATCH /pulls/639/reviews/5056returns 405 — so the correction lives here.The measured values, restated:
That is the step ② depends on: it is why the author's build from
f2c85841is the same tree the release job will build from, givenREF="main".📌 Worth one line for the next person composing a review body in a shell
An unquoted heredoc executes backticks and
$(…)inside your prose. A code span like`1 ahead / 0 behind`silently becomes empty output — the text does not error, it just loses a clause, and the only tell was a strayKommando nicht gefundenon stderr that had nothing obviously to do with the review.Use
<<'EOF'and substitute values withjq --arginstead. And read the published body back — I caught this because the shell complained about something unrelated-looking, which is luck rather than method.Nothing about ①–⑤, the content verification, or the scope disclosure changed. The stamp stands at
f2c85841c52256b895466f51a31866bd33bc390a.