chore(release): v0.20.0 #264

Merged
bosun merged 2 commits from release-prep/rolling into main 2026-07-02 12:10:48 +02:00
Member

v0.20.0 — 2026-07-02

First-cut reliability hardening. Every issue that surfaced on the first external toolkit-driven cut (tmux-tell) is now fixed at the substrate. Upgrade is a pin bump — fragment-check wiring is opt-in, everything else is transparent.

Added

Push-whitelist pre-flight on path-α cuts. draft-release.sh now probes the consumer's default-branch protection before doing any work. Fails fast + names the missing identity if release-bot isn't on push_whitelist_usernames, instead of the late mid-cut Not allowed to push to protected branch rejection that leaves the manifest desynced. Only fails on a definitive misconfig; warns-and-proceeds otherwise. docs/integration.md names it as a path-α precondition.

reusable-changelog-fragment-check.yml + scripts/fragment-check.sh. Consumers wire it into their pull_request workflow to fail-loud on unknown-kind fragments (e.g. .documentation.md) before merge, instead of at the next cut. See docs/integration.md § fragment-check.yml for the consumer stanza. Closes #271.

Changed

docs/operations.md gained an annual release-bot PAT rotation-cadence section. No action required on existing installs; consult before regenerating the RELEASE_TOOLKIT_TOKEN Actions secret. Closes #273.

Fixed

External cuts no longer halt on the post-cut bake-reset step. The reusable's bake-reset blocks now guard git commit with git diff --cached --quiet, so the empty-staging case (every external consumer — the bake-reset is toolkit-self-only by design) cleanly skips the commit + push instead of failing "nothing to commit" and cascading into the manifest never landing. This unblocks every external toolkit-driven cut. Toolkit-self behavior unchanged.

forgejo_find_pr_by_head no longer mutates a random open PR. Forgejo's head= query filter is empirically ignored, so .[0].number was picking whichever PR the API sorted first — releasing PATCHes onto a random open feature PR instead of the actual rolling PR. Now filters response client-side by exact head.label / head.ref match. No consumer-side change required. Closes #274.

Rolling-PR prepare-commit push now authenticates with the path-α PAT. Previously it reused the actions/checkout system token, which Forgejo Actions' anti-recursion safeguard suppresses — so no CI ran on the rolling PR and its required checks could never satisfy. The push now injects FORGEJO_TOKEN (the RELEASE_TOOLKIT_TOKEN PAT) as an HTTP Authorization header, mirroring the manifest push. Necessary but not sufficient — the consumer must still set RELEASE_TOOLKIT_TOKEN to a real-user PAT (the documented path-α setup).

release-decide detects the chore(release): prepare vX.Y.Z commit anywhere in the merged range, not only at HEAD. Previously, any commit landing on top of the prepare commit (a rebase nudge, a CHANGELOG dedupe) shifted HEAD off the prepare subject and the cut was silently skipped — the manifest stayed at the old version, no tag/release, stale rolling PR against the old baseline. The range scan is a full git-log walk. Existing Layer 2/3 safeguards still gate — a stale prepare commit in range falls through to mode=update loudly. Squash-merge of the rolling PR is not yet covered; tracked as #259.

Fragment vs conventional-commit duplicate suppressed at generation layer. When a fragment and a CC subject reference the same issue number, release-prep.sh now suppresses the CC-subject bullet in favour of the fragment prose (richer wins). A [changelog-dedup] line is logged to stderr for auditability. Closes #258.

release-prep.sh PR body assembly now re-normalizes through changelog_merge_sections so any surviving duplicate ### Kind headings collapse to one section per kind. Belt-and-suspenders on top of the merge already done in changelog_transition. Closes #272.

Removed / Deprecated

None.

Upgrade

Pin your consumer wrapper's uses:@<ref> to v0.20.0. Fragment-check wiring is opt-in (add .forgejo/workflows/fragment-check.yml per docs/integration.md if you want the pre-merge gate). Everything else is transparent.

## v0.20.0 — 2026-07-02 First-cut reliability hardening. Every issue that surfaced on the first external toolkit-driven cut (tmux-tell) is now fixed at the substrate. Upgrade is a pin bump — fragment-check wiring is opt-in, everything else is transparent. ### Added **Push-whitelist pre-flight on path-α cuts.** `draft-release.sh` now probes the consumer's default-branch protection before doing any work. Fails fast + names the missing identity if `release-bot` isn't on `push_whitelist_usernames`, instead of the late mid-cut `Not allowed to push to protected branch` rejection that leaves the manifest desynced. Only fails on a *definitive* misconfig; warns-and-proceeds otherwise. `docs/integration.md` names it as a path-α precondition. **`reusable-changelog-fragment-check.yml` + `scripts/fragment-check.sh`.** Consumers wire it into their `pull_request` workflow to fail-loud on unknown-kind fragments (e.g. `.documentation.md`) before merge, instead of at the next cut. See [docs/integration.md § fragment-check.yml](docs/integration.md) for the consumer stanza. Closes #271. ### Changed **`docs/operations.md` gained an annual `release-bot` PAT rotation-cadence section.** No action required on existing installs; consult before regenerating the `RELEASE_TOOLKIT_TOKEN` Actions secret. Closes #273. ### Fixed **External cuts no longer halt on the post-cut bake-reset step.** The reusable's bake-reset blocks now guard `git commit` with `git diff --cached --quiet`, so the empty-staging case (every external consumer — the bake-reset is toolkit-self-only by design) cleanly skips the commit + push instead of failing "nothing to commit" and cascading into the manifest never landing. This unblocks every external toolkit-driven cut. Toolkit-self behavior unchanged. **`forgejo_find_pr_by_head` no longer mutates a random open PR.** Forgejo's `head=` query filter is empirically ignored, so `.[0].number` was picking whichever PR the API sorted first — releasing PATCHes onto a random open feature PR instead of the actual rolling PR. Now filters response client-side by exact `head.label` / `head.ref` match. No consumer-side change required. Closes #274. **Rolling-PR prepare-commit push now authenticates with the path-α PAT.** Previously it reused the `actions/checkout` system token, which Forgejo Actions' anti-recursion safeguard suppresses — so no CI ran on the rolling PR and its required checks could never satisfy. The push now injects `FORGEJO_TOKEN` (the `RELEASE_TOOLKIT_TOKEN` PAT) as an HTTP `Authorization` header, mirroring the manifest push. Necessary but not sufficient — the consumer must still set `RELEASE_TOOLKIT_TOKEN` to a real-user PAT (the documented path-α setup). **`release-decide` detects the `chore(release): prepare vX.Y.Z` commit anywhere in the merged range, not only at HEAD.** Previously, any commit landing on top of the prepare commit (a rebase nudge, a CHANGELOG dedupe) shifted HEAD off the prepare subject and the cut was silently skipped — the manifest stayed at the old version, no tag/release, stale rolling PR against the old baseline. The range scan is a full git-log walk. Existing Layer 2/3 safeguards still gate — a stale prepare commit in range falls through to `mode=update` loudly. Squash-merge of the rolling PR is not yet covered; tracked as #259. **Fragment vs conventional-commit duplicate suppressed at generation layer.** When a fragment and a CC subject reference the same issue number, `release-prep.sh` now suppresses the CC-subject bullet in favour of the fragment prose (richer wins). A `[changelog-dedup]` line is logged to stderr for auditability. Closes #258. **`release-prep.sh` PR body assembly now re-normalizes through `changelog_merge_sections`** so any surviving duplicate `### Kind` headings collapse to one section per kind. Belt-and-suspenders on top of the merge already done in `changelog_transition`. Closes #272. ### Removed / Deprecated None. ### Upgrade Pin your consumer wrapper's `uses:@<ref>` to `v0.20.0`. Fragment-check wiring is opt-in (add `.forgejo/workflows/fragment-check.yml` per [docs/integration.md](docs/integration.md) if you want the pre-merge gate). Everything else is transparent.
forgejo-actions force-pushed release-prep/rolling from 9e317b2c76
Some checks failed
check-self-bootstrap / check (pull_request) Failing after 3s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
manifest-check / check (pull_request) Successful in 0s
to cf1c45c2a9 2026-06-29 21:32:37 +02:00
Compare
release-bot changed title from chore(release): v0.19.1 to chore(release): v0.20.0 2026-06-29 22:09:48 +02:00
forgejo-actions force-pushed release-prep/rolling from cf1c45c2a9 to 95a0efef93 2026-06-29 22:09:48 +02:00 Compare
forgejo-actions force-pushed release-prep/rolling from 95a0efef93 to e9e8349bc1 2026-06-29 22:13:13 +02:00 Compare
forgejo-actions force-pushed release-prep/rolling from e9e8349bc1 to 21aa688cb2 2026-06-30 15:32:37 +02:00 Compare
forgejo-actions force-pushed release-prep/rolling from 21aa688cb2 to 4b575d7196 2026-06-30 15:34:59 +02:00 Compare
forgejo-actions force-pushed release-prep/rolling from 4b575d7196 to 3c0547fa22 2026-07-02 10:00:23 +02:00 Compare
forgejo-actions force-pushed release-prep/rolling from 3c0547fa22 to b98d01a61e 2026-07-02 10:00:55 +02:00 Compare
forgejo-actions force-pushed release-prep/rolling from b98d01a61e to 3d15a7e311 2026-07-02 10:16:58 +02:00 Compare
alex approved these changes 2026-07-02 11:52:46 +02:00
Dismissed
Owner

Cold-Read: release-toolkit v0.20.0 Changelog

Applied the Cold-Read prompt to the PR body verbatim. Perspective: contributor on v0.19.0, considering whether to upgrade, reading only this text.


1. 30-second skim

Confident on theme, not on headline. Six of nine entries are fixes, and most of them share a root cause: things that broke on the first toolkit-driven tmux-tell cut. The release is clearly "first-cut reliability hardening" — but that isn't stated anywhere; the reader has to infer it from cross-referencing entries. The highest-severity fix (bake-reset failing on every external cut) is the fifth of six Fixed entries with no prominence. The most user-alarming fix (wrong PR mutated by forgejo_find_pr_by_head) is last.


2. The six reader questions

Question Answer Speed
Are there breaking changes? No explicit breaking changes; push-whitelist pre-flight is a new early-failure behavior on path-α, but only catches misconfigs that would fail mid-cut anyway Not found as a callout — has to be inferred
Must I change config, commands, or scripts to upgrade? Fragment-check wiring is opt-in (new); ensure RELEASE_TOOLKIT_TOKEN is still a real-user PAT (unchanged requirement, re-stated); push_whitelist membership documented as path-α precondition in docs/integration.md Not found as a clear upgrade checklist; scattered
What's new I might actually want? reusable-changelog-fragment-check.yml (fail-loud on bad fragment kinds before merge), push-whitelist pre-flight Top (Added section)
What was fixed — plausibly hitting? forgejo_find_pr_by_head mutating the wrong PR, bake-reset halting every external cut, release-decide silently skipping cuts when HEAD isn't the prepare commit Mid/bottom — need to read through all six Fixed entries
Anything removed or deprecated? Not addressed Not found — no Removed section
Is a migration path / upgrade step given? Partial: fragment-check wiring stanza in docs/integration.md; no "upgrade from v0.19.0" step Not found as a unit

3. Entry inventory

Entry Verdict One-line reason
Push-whitelist pre-flight on path-α COMPRESS The definitive-misconfig vs. warn-and-proceed condition logic (~5 sentences) compresses to 2; the tmux-tell anchor belongs in PR description
reusable-changelog-fragment-check.yml + fragment-check.sh (#271) COMPRESS Keep: new workflow + consumer wiring pointer. Cut: tmux-tell#655→#658 recovery backstory is PR description
docs/operations.md PAT rotation cadence (#273) KEEP Correctly scoped, one sentence, right section
Rolling-PR prepare-commit push uses PAT not system token COMPRESS Keep: PAT required, CI now fires, "necessary but not sufficient" caveat. Cut: anti-recursion mechanism explanation is PR description
Fragment-vs-CC-commit dedup at generation layer (#258) COMPRESS + FORMAT Right content, too long; also the only bullet-prefixed entry (- Fragment-vs-...) in a section of prose paragraphs — formatting inconsistency
release-decide range scan for prepare commit (#259 ref) COMPRESS Keep: symptom (silent skip), fix (range scan), squash-merge caveat + #259 follow-up. Cut: "merge-commit's second-parent" mechanism
Bake-reset "nothing to commit" on external consumers COMPRESS Keep: impact (every external cut needed manual recovery), fix (diff guard), toolkit-self unaffected. Cut: the 4-step cascade (empty add loop → halt → manifest never lands → walk window stuck) is PR description. Also: see §6 for version-number confusion
release-prep.sh duplicate ### Kind headings (#272) KEEP Short, scoped, has issue ref
forgejo_find_pr_by_head client-side head filtering (#274) COMPRESS Keep: wrong-PR mutation impact, fix (client-side filter). Cut: "(release-toolkit#274, reproduced on tmux-tell v0.29.0 cycle 2026-07-01)" is PR description, not changelog

4. Signal vs. noise

Rough split: ~50% actionable change-info, ~35% mechanism/root-cause narrative, ~15% cross-reference/context.

This is tighter than the tmux-tell v0.27.0 body — most entries are reasonable length. The noise concentration is in three Fixed entries:

  • Bake-reset: ~4 steps of cascade-failure explanation for a one-sentence user outcome ("every external cut needed manual manifest recovery until now")
  • forgejo_find_pr_by_head: the reproduction details (specific consumer + cycle date) belong in the PR
  • Rolling-PR PAT: the anti-recursion mechanism explanation

5. Structure & scannability

  • Standard buckets (Added / Changed / Fixed): yes. No Removed or Deprecated section (appropriate if nothing was removed; worth a one-liner confirming so).
  • Breaking changes and highlights at the top: no. The two highest-severity fixes (bake-reset, forgejo_find_pr_by_head) are entries 5 and 6 in Fixed, with no visual weight.
  • Entry phrasing: mostly parallel prose paragraphs, except the fragment-dedup entry which opens with - Fragment-vs-conventional-commit... — the only bullet in a section of undecorated paragraphs. Pick one form.
  • Version bump v0.19.0 → v0.20.0: minor bump for 2 additions + 1 docs change + 6 fixes, all backwards-compatible. Consistent with semver. [GUESS — policy unknown]

6. Missing

  • Version number — "v0.20.0" does not appear in the changelog text itself
  • Date — no release date
  • Upgrade / consumer action summary — is it just "pin to the new tag"? Fragment-check wiring is opt-in; everything else is transparent. A one-liner would close this.
  • "Since v0.22.0" in the bake-reset entry — from the perspective of a reader on v0.19.0, this references a version that doesn't exist yet. If it refers to a consumer version (e.g. tmux-tell v0.22.0), name the consumer explicitly. As written it reads as a forward-reference to a future release-toolkit version. [GUESS attempted, failed — changelog should not require guessing]
  • 1-line release summary — the theme (first-cut reliability hardening) is coherent but unstated; a reader skimming headers gets no orientation before diving into sections

7. Verdict

Top 5 highest-leverage edits:

  1. Fix or clarify "since v0.22.0" in the bake-reset entry — it reads as a forward-reference from a v0.19.0 reader. If it means a consumer version, name the consumer.
  2. Surface the bake-reset fix's severity — "every external cut needed manual manifest recovery" is the highest-impact fix in this release; it deserves to be the first Fixed entry, or flagged at the top with a note.
  3. Add version header + 1-line summary## v0.20.0 — YYYY-MM-DD and one sentence on the release theme before the sections.
  4. Fix the bullet/prose inconsistency in Fixed — the fragment-dedup entry is the only bullet-prefixed item; normalise to prose paragraphs (or convert all to bullets).
  5. Cut cascade-failure chains to PR descriptions — bake-reset and forgejo_find_pr_by_head carry 3–4 steps of root-cause explanation. Keep impact + fix outcome; move mechanism to the PR body.

Length verdict: About right for the content volume. Unlike v0.27.0, this doesn't read as bloated — entries are tighter on average. The noise is localised to two or three Fixed entries and could be trimmed ~20% without losing any user-actionable content.

# Cold-Read: release-toolkit v0.20.0 Changelog *Applied the [Cold-Read prompt](https://docs.saratow.net/books/tmux-tell/page/cold-read-prompt) to the PR body verbatim. Perspective: contributor on v0.19.0, considering whether to upgrade, reading only this text.* --- ## 1. 30-second skim Confident on theme, not on headline. Six of nine entries are fixes, and most of them share a root cause: things that broke on the first toolkit-driven tmux-tell cut. The release is clearly "first-cut reliability hardening" — but that isn't stated anywhere; the reader has to infer it from cross-referencing entries. The highest-severity fix (bake-reset failing on every external cut) is the fifth of six Fixed entries with no prominence. The most user-alarming fix (wrong PR mutated by `forgejo_find_pr_by_head`) is last. --- ## 2. The six reader questions | Question | Answer | Speed | |---|---|---| | Are there breaking changes? | No explicit breaking changes; push-whitelist pre-flight is a new early-failure behavior on path-α, but only catches misconfigs that would fail mid-cut anyway | Not found as a callout — has to be inferred | | Must I change config, commands, or scripts to upgrade? | Fragment-check wiring is opt-in (new); ensure `RELEASE_TOOLKIT_TOKEN` is still a real-user PAT (unchanged requirement, re-stated); push_whitelist membership documented as path-α precondition in `docs/integration.md` | Not found as a clear upgrade checklist; scattered | | What's new I might actually want? | `reusable-changelog-fragment-check.yml` (fail-loud on bad fragment kinds before merge), push-whitelist pre-flight | Top (Added section) | | What was fixed — plausibly hitting? | `forgejo_find_pr_by_head` mutating the wrong PR, bake-reset halting every external cut, release-decide silently skipping cuts when HEAD isn't the prepare commit | Mid/bottom — need to read through all six Fixed entries | | Anything removed or deprecated? | Not addressed | Not found — no Removed section | | Is a migration path / upgrade step given? | Partial: fragment-check wiring stanza in `docs/integration.md`; no "upgrade from v0.19.0" step | Not found as a unit | --- ## 3. Entry inventory | Entry | Verdict | One-line reason | |---|---|---| | Push-whitelist pre-flight on path-α | COMPRESS | The definitive-misconfig vs. warn-and-proceed condition logic (~5 sentences) compresses to 2; the tmux-tell anchor belongs in PR description | | `reusable-changelog-fragment-check.yml` + `fragment-check.sh` (#271) | COMPRESS | Keep: new workflow + consumer wiring pointer. Cut: tmux-tell#655→#658 recovery backstory is PR description | | `docs/operations.md` PAT rotation cadence (#273) | KEEP | Correctly scoped, one sentence, right section | | Rolling-PR prepare-commit push uses PAT not system token | COMPRESS | Keep: PAT required, CI now fires, "necessary but not sufficient" caveat. Cut: anti-recursion mechanism explanation is PR description | | Fragment-vs-CC-commit dedup at generation layer (#258) | COMPRESS + FORMAT | Right content, too long; also the only bullet-prefixed entry (`- Fragment-vs-...`) in a section of prose paragraphs — formatting inconsistency | | `release-decide` range scan for prepare commit (#259 ref) | COMPRESS | Keep: symptom (silent skip), fix (range scan), squash-merge caveat + #259 follow-up. Cut: "merge-commit's second-parent" mechanism | | Bake-reset "nothing to commit" on external consumers | COMPRESS | Keep: impact (every external cut needed manual recovery), fix (diff guard), toolkit-self unaffected. Cut: the 4-step cascade (empty add loop → halt → manifest never lands → walk window stuck) is PR description. Also: see §6 for version-number confusion | | `release-prep.sh` duplicate `### Kind` headings (#272) | KEEP | Short, scoped, has issue ref | | `forgejo_find_pr_by_head` client-side head filtering (#274) | COMPRESS | Keep: wrong-PR mutation impact, fix (client-side filter). Cut: "(release-toolkit#274, reproduced on tmux-tell v0.29.0 cycle 2026-07-01)" is PR description, not changelog | --- ## 4. Signal vs. noise Rough split: **~50% actionable change-info, ~35% mechanism/root-cause narrative, ~15% cross-reference/context**. This is tighter than the tmux-tell v0.27.0 body — most entries are reasonable length. The noise concentration is in three Fixed entries: - Bake-reset: ~4 steps of cascade-failure explanation for a one-sentence user outcome ("every external cut needed manual manifest recovery until now") - forgejo_find_pr_by_head: the reproduction details (specific consumer + cycle date) belong in the PR - Rolling-PR PAT: the anti-recursion mechanism explanation --- ## 5. Structure & scannability - Standard buckets (Added / Changed / Fixed): yes. No Removed or Deprecated section (appropriate if nothing was removed; worth a one-liner confirming so). - Breaking changes and highlights at the top: no. The two highest-severity fixes (bake-reset, forgejo_find_pr_by_head) are entries 5 and 6 in Fixed, with no visual weight. - Entry phrasing: mostly parallel prose paragraphs, except the fragment-dedup entry which opens with `- Fragment-vs-conventional-commit...` — the only bullet in a section of undecorated paragraphs. Pick one form. - Version bump v0.19.0 → v0.20.0: minor bump for 2 additions + 1 docs change + 6 fixes, all backwards-compatible. Consistent with semver. [GUESS — policy unknown] --- ## 6. Missing - **Version number** — "v0.20.0" does not appear in the changelog text itself - **Date** — no release date - **Upgrade / consumer action summary** — is it just "pin to the new tag"? Fragment-check wiring is opt-in; everything else is transparent. A one-liner would close this. - **"Since v0.22.0" in the bake-reset entry** — from the perspective of a reader on v0.19.0, this references a version that doesn't exist yet. If it refers to a consumer version (e.g. tmux-tell v0.22.0), name the consumer explicitly. As written it reads as a forward-reference to a future release-toolkit version. [GUESS attempted, failed — changelog should not require guessing] - **1-line release summary** — the theme (first-cut reliability hardening) is coherent but unstated; a reader skimming headers gets no orientation before diving into sections --- ## 7. Verdict **Top 5 highest-leverage edits:** 1. **Fix or clarify "since v0.22.0"** in the bake-reset entry — it reads as a forward-reference from a v0.19.0 reader. If it means a consumer version, name the consumer. 2. **Surface the bake-reset fix's severity** — "every external cut needed manual manifest recovery" is the highest-impact fix in this release; it deserves to be the first Fixed entry, or flagged at the top with a note. 3. **Add version header + 1-line summary** — `## v0.20.0 — YYYY-MM-DD` and one sentence on the release theme before the sections. 4. **Fix the bullet/prose inconsistency in Fixed** — the fragment-dedup entry is the only bullet-prefixed item; normalise to prose paragraphs (or convert all to bullets). 5. **Cut cascade-failure chains to PR descriptions** — bake-reset and forgejo_find_pr_by_head carry 3–4 steps of root-cause explanation. Keep impact + fix outcome; move mechanism to the PR body. **Length verdict:** About right for the content volume. Unlike v0.27.0, this doesn't read as bloated — entries are tighter on average. The noise is localised to two or three Fixed entries and could be trimmed ~20% without losing any user-actionable content.
docs(changelog): compress v0.20.0 body per Pilot Cold-Read
Some checks failed
check-self-bootstrap / check (pull_request) Failing after 3s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
manifest-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (push) Failing after 3s
release / decide + act (push) Successful in 6s
release / release (push) Successful in 0s
9fdc60db52
Pilot fired Cold Read on PR #264 (per the #628 discipline). Findings:

1. **"since v0.22.0" in bake-reset entry** — forward-reference unresolvable
   from a v0.19.0 reader. Removed the version anchor; the fact "every
   external cut needed manual recovery" is the load-bearing content.
2. **Severity ordering in Fixed** — the two highest-impact fixes
   (bake-reset halting every external cut; forgejo_find_pr_by_head
   mutating a random PR) were entries 5 and 6 with no visual weight.
   Moved to positions 1 and 2.
3. **Bullet/prose inconsistency** — the Fragment-vs-CC entry was the
   only bullet-prefixed item in a section of prose paragraphs.
   Normalized to bold-lead prose paragraphs across the section.
4. **Missing version header + theme summary** — added
   `## [v0.20.0] - 2026-07-02` header (already present) + a 1-line
   "first-cut reliability hardening" release theme + Upgrade
   section.
5. **Compressed cascade-failure narratives** — bake-reset, rolling-PR
   PAT auth, and forgejo_find_pr_by_head trimmed to impact + fix
   outcome; mechanism narratives moved to PR bodies (they live there
   permanently).

Result: 4254 chars (from 6280 — ~32% reduction). Still a bit above
tmux-tell v0.27.0's post-Cold-Read 2500-char target, but Pilot's
verdict said length is "about right for content volume, not
blocking-heavy" — the primary catches were structural, not size.

Also added:
- Explicit `### Removed / Deprecated: None.` section so the reader
  doesn't infer absence-as-omission
- `### Upgrade` section stating the pin-bump is the whole ceremony
  (fragment-check wiring opt-in, everything else transparent)

The rolling-PR body was PATCHed to match via forgejo.edit_pull_request
before this commit; releasing this compress on the branch keeps
main's CHANGELOG.md aligned with what the reader sees on the PR + on
the release page (draft-release.sh reads the CHANGELOG section for
the release body).

Full Cold-Read report:
#264 (comment)
surveyor dismissed alex's review 2026-07-02 12:10:18 +02:00
Reason:

New commits pushed, approval review dismissed automatically according to repository settings

bosun merged commit 9fdc60db52 into main 2026-07-02 12:10:48 +02:00
Sign in to join this conversation.
No description provided.