chore(release): v0.21.0 #287
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
5 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!287
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?
Changelog tooling + release automation: mechanical Cold-Read body linter, fragment template + brevity docs, auto re-pin of toolkit-self wrappers post-cut, and observability fields for cut-timing.
Added
Cold-Read body linter — new
reusable-changelog-body-check.ymlreusable workflow +scripts/changelog-body-check.sh. Runs 6 mechanical checks on the newest version-block inCHANGELOG.mdat PR time: version header + date, standard sections present, forward-reference detection, body length ceiling (5000 chars), bullet/prose consistency, duplicate section headers. Consumers wire it into theirpull_requestworkflow same shape asfragment-check.yml. Toolkit-self dogfood wiring deferred to #290. Closes #282 Layer 1.Fragment template + brevity docs — new
changelog.d/.template.mdstarter template +docs/conventions.md### Fragment brevitysection. Codifies "outcome + required action in 1-3 sentences" as the human-side density guidance; complements the automated linter. Closes #282 Layer 2.Auto re-pin of toolkit-self consumer wrappers —
reusable-release.ymlnow auto-re-pinsrelease.yml+manifest-check.yml+fragment-check.ymlto the just-cut tag as part of post-cut bookkeeping. Bundled with the bake-reset commit so both land atomically. Obsoletes the manual re-pin PR thatcheck-self-bootstrap.yml(#124) previously fired as a reminder for. External consumers are unaffected — the auto-re-pin targets toolkit-self only;if [[ -f ... ]]guard skips non-existent files. Closes #283.cut_complete.ms_total+path— thecut_completeJSON event now carriesms_total(total cut wall-clock in integer milliseconds) andpath(thealpha/gammapush-path). Off the workflow path (directdraft-release.shinvocation, or platformdatelacking%N) both fields degrade to empty — the same graceful-degradation contract asapi_call'sms. Completes the JSON-logging taxonomy from #159. (Part 2 of #204.)Changed
check-self-bootstrap.ymlscope narrowed — now fires only when the auto re-pin (#283) fails, not as a "human forgot" reminder. Consumers who relied on this check as a manual-re-pin nudge should transition to the auto re-pin flow;check-self-bootstrap.ymlstays as a substrate-failure fail-safe.docs/integration.mdpost-#172 migration note — corrected to reflect empirically-observed Forgejo behavior: undeclared inputs toworkflow_callreusables are silently ignored. The lazy-leave shape (bump@<ref>past #172, forget to droptoolkit_ref:) runs cleanly. Dropping the stale input is a hygiene fix, not a correctness fix. Closes #250.Fixed
Fragment-check baked ref stuck at
mainfor v0.20.0 consumers — v0.20.0 shippedreusable-changelog-fragment-check.ymlwithBUILD_BAKED_TOOLKIT_REF: 'main'becausereusable-release.yml's three runtime bake-reset loops (added in #278) only listed the two pre-existing reusables. Impact for consumers pinning@v0.20.0on the fragment-check wrapper:.release-toolkitscripts checked out atmain(the baked value) rather thanv0.20.0— substrate drift class. Upgrade action: re-pin fragment-check to@v0.21.0(the normal post-cut re-pin) to resolve. Extendedtests/workflows.batsbake-marker guard now walksreusable-release.yml's runtime loops so the class can't reintroduce. (Fold-in from #283 work.)Auto re-pin loops corrupted external consumer wrappers — without a toolkit-self gate, the auto re-pin (new in #283) would rewrite
release.yml/manifest-check.yml/fragment-check.ymlon any external consumer's checkout, breaking their pin state and their next CI run's reusable resolution. Both path-α and path-γ auto re-pin loops are now gated onif [[ -f .forgejo/workflows/reusable-release.yml ]](the toolkit-self detection). Caught pre-merge; no external consumer was affected in the wild.Cold-Read linter dogfood wrapper mis-scoped pre-cut — the toolkit-self dogfood wrapper for the Cold-Read body linter was dropped from #289 because the pre-v0.21.0 window has no consistent pin target (
@mainbreaks single-ref-alignment;@v0.21.0-rc.Ndoesn't yet contain the reusable). Deferred to #290 (post-v0.21.0-cut fold), same pattern as #281.Internal
update-doc-version-refs.shself-git addremoved —release-prep.sh's #236 auto-stage sweeps hook-modified tracked files, so the belt-and-suspenders self-stage from #251 is redundant. Closes #253.Removed / Deprecated
None.
Upgrade
No action required for consumers on
@v0.20.0unless the Fragment-check baked-ref bug (see Fixed) applies — re-pinfragment-check.ymlto@v0.21.0in that case. The Cold-Read body linter and fragment template are opt-in.b85893db01768ce2e84c768ce2e84ctoaff1bfef73aff1bfef73toacbd5956fbacbd5956fbto8e5a9389e5Cold-Read: release-toolkit v0.21.0 Changelog
Applied the Cold-Read prompt to the PR body verbatim. Perspective: contributor on v0.20.0, considering whether to upgrade, reading only this text.
1. 30-second skim
Not confident on headline. The sections are Added / Changed / Fixed / Internal — four distinct buckets, but "Internal" is non-standard and the fixed entries are two opaque bullets. After a full first skim the candidates for headline are: (a) the mechanical Cold-Read body linter, (b) the auto re-pin of toolkit-self wrappers. No single entry is visually prominent. I can say "changelog tooling layer + release automation" but couldn't confidently name the headline change unprompted. The bottom of Added also contains a bullet list that partially re-states prose already above it, creating a second scan trap.
2. The six reader questions
check-self-bootstrap.ymlnow fires only when automation breaks, not on human forget — a behavioral change to an existing CI check, but not called out as suchtoolkit_ref:drop is hygiene-only. But this isn't stated anywhere as "no action required."reusable-changelog-body-check.yml(automated linter), auto re-pin (#283), fragment template@v0.20.0got scripts atmain— correctness bug); two reviewer-driven tweakscheck-self-bootstrap.ymlscope change not framed as deprecation3. Entry inventory
cut_complete.ms_total+path(#204 part 2)reusable-changelog-body-check.yml+changelog-body-check.sh(#282 L1)changelog.d/.template.md+ fragment brevity docs (#282 L2)check-self-bootstrap.ymlnow fires only on automation failure (this last point deserves a Changed entry of its own — behavioral change to an existing check). Cut: "Bundled with the bake-reset commit... land atomically" is PR description@v0.20.0on fragment-check got scripts atmain(substrate drift). Belongs first in Fixed, not mid-Added prose#281 fold-innot in prose but without enough context; pick one form (prose or bullets, not both)docs/integration.mdundeclared-inputs note (#250)git.frankenbit.de, probed 2026-07-02" — platform version + probe date is PR description96d8d385REQUEST_CHANGES")96d8d385REQUEST_CHANGES" is an internal reviewer code — meaningless to a cold reader. State what was dropped and why in one plain sentenceupdate-doc-version-refs.shno longer self-git-adds (#253)git checkout -Bpath" history — one sentence max. If the project doesn't surface internal cleanup to contributors, CUT entirely4. Signal vs. noise
Rough split: ~45% actionable change-info, ~35% mechanism/internal-history narrative, ~20% reviewer-reference/cross-reference.
Biggest offenders:
reusable-changelog-body-check.ymlentry: the toolkit-self dogfood deferral (~100 words) is internal pre-cut window mechanics — no external consumer action, no behavioral signal96d8d385REQUEST_CHANGES", "Surveyor 08d1") carries near-zero signal for anyone outside the review thread5. Structure & scannability
**bold label**: textbullet format; Added entries are prose paragraphs. Same inconsistency as v0.20.0 — one form per release, please.check-self-bootstrap.ymlscope change (fires only on automation failure now) is behavioral, but buried inside the auto-re-pin prose with no dedicated Changed entry.6. Missing
check-self-bootstrap.ymlbehavior change — consumers who rely on this check being a "human forgot" reminder will notice it no longer fires for that case; deserves a dedicated Changed entry, not a parenthetical inside Added7. Verdict
Top 5 highest-leverage edits:
96d8d385REQUEST_CHANGES" / "Surveyor 08d1"; state what changed and why in one sentence each.check-self-bootstrap.ymlscope change into a dedicated Changed entry — behavioral change to an existing CI check; currently invisible inside the auto-re-pin prose.## v0.21.0 — YYYY-MM-DD+ one theme sentence; then one form (prose or bullets) throughout Added.Length verdict: About right in aggregate, but the distribution is wrong — Added is overlong (carries a misplaced fix + ~100-word deferral block), Fixed is under-informative (opaque codes). Redistributing ~100 words from Added to a rewritten Fixed would improve signal density without changing total length.
fix(#NNN):scope-as-issue-ref shape #293