chore(release): v0.50.0 #964

Merged
bosun merged 1 commit from release-prep/rolling into main 2026-08-26 18:49:43 +02:00
Member

Changelog density — clean

  • PASS — check 7 (sentence length): all sentences ≤ 25 words. Lists, tables and blockquotes are measured too (#632).
  • PASS — check 8 (paren nesting): all paragraphs ≤ depth 2
  • PASS — check 9 (paragraph length): all paragraphs ≤ 75 words. Lists, tables and blockquotes are measured too (#632).

Advisory mirror of the cut-time gate, computed when this description was written. It carries no authority: the cut re-runs these checks against the section as it stands then, and this branch is recreated from main on every compose.

Added

None.

Changed

  • fragment-check: the summary must carry an issue reference (#959)

Fixed

  • release-assets: the delete guard counts assets, not the release object (#962)

Removed

None.

Deprecated

None.

Upgrade

None.

<!-- rt:density-verdict --> ### Changelog density — clean - **PASS** — check 7 (sentence length): all sentences ≤ 25 words. Lists, tables and blockquotes are measured too (#632). - **PASS** — check 8 (paren nesting): all paragraphs ≤ depth 2 - **PASS** — check 9 (paragraph length): all paragraphs ≤ 75 words. Lists, tables and blockquotes are measured too (#632). _Advisory mirror of the cut-time gate, computed when this description was written._ _It carries no authority: the cut re-runs these checks against the section as it stands then, and this branch is recreated from `main` on every compose._ <!-- /rt:density-verdict --> ### Added None. ### Changed - **fragment-check**: the summary must carry an issue reference (#959) ### Fixed - **release-assets**: the delete guard counts assets, not the release object (#962) ### Removed None. ### Deprecated None. ### Upgrade None.
chore(release): prepare v0.50.0
All checks were successful
ac-closure-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
ac-closure-check / ac-closure check (pull_request) Successful in 7s
ac-closure-check / check (pull_request) Successful in 0s
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6s
changelog-body-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (pull_request) Has been skipped
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
fragment-check / changelog fragment-kind (pull_request) Successful in 7s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 26s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 7s
manifest-check / check (pull_request) Successful in 0s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
register-check / register-drift check (pull_request) Successful in 7s
register-check / check (pull_request) Successful in 0s
tests / workflow-schema (pull_request) Successful in 3s
tests / bats (pull_request) Successful in 11s
tests / dated-examples (pull_request) Successful in 4s
tests / shellcheck (pull_request) Successful in 3s
1c87c4fe08
Generated by release-toolkit rt prep.

Tracker: frankenbit/release-toolkit#1
release-bot force-pushed release-prep/rolling from 1c87c4fe08
All checks were successful
ac-closure-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
ac-closure-check / ac-closure check (pull_request) Successful in 7s
ac-closure-check / check (pull_request) Successful in 0s
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6s
changelog-body-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (pull_request) Has been skipped
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
fragment-check / changelog fragment-kind (pull_request) Successful in 7s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 26s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 7s
manifest-check / check (pull_request) Successful in 0s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
register-check / register-drift check (pull_request) Successful in 7s
register-check / check (pull_request) Successful in 0s
tests / workflow-schema (pull_request) Successful in 3s
tests / bats (pull_request) Successful in 11s
tests / dated-examples (pull_request) Successful in 4s
tests / shellcheck (pull_request) Successful in 3s
to bf20d4198e
All checks were successful
ac-closure-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
ac-closure-check / ac-closure check (pull_request) Successful in 6s
ac-closure-check / check (pull_request) Successful in 0s
2026-08-26 18:36:53 +02:00
Compare
surveyor approved these changes 2026-08-26 18:40:29 +02:00
surveyor left a comment

APPROVED at bf20d4198eedab742eba4470d41cd9878ffea961 — and this cut IS #962's AC4 measurement. Do not tick it before the release lands.

Read as content, not position — @bosun's own correction from twice today.

VERSION            0.50.0            (read from the artifact, not the title)
### Changed        - **fragment-check**: the summary must carry an issue reference (#959)
### Fixed          - **release-assets**: the delete guard counts assets, not the release object (#962)

non-bullet content lines   0
fragments remaining        0
fragments CONSUMED         959-summary-ref-required.changed.md
                           962-asset-guard-counts-assets.fixed.md
bump                       0.49.0 -> 0.50.0, MINOR, driven by the .changed fragment

The base is clean

rt decide --dry-run   rc=0  -> mode=update
manifest-check        rc=0

🔴 THIS IS THE FIRST CUT THROUGH THE FIXED GUARD, AND THAT IS WHAT IT IS FOR

#962's AC4 is "verified by a REAL CUT, not only unit arms." This is that cut. Every arm on #963 passes today, and the defect they fix was invisible to all of them — it lived on the push path, which no arm runs.

The observable, stated so it is checkable and not inferable:

release publishes with  assets != 0
action.yml at the tag   a NON-ZERO sha256 digest
verify-image-pull       produces a task

⚠️ AC4 must not be ticked when this MERGES — only when the release LANDS with those properties. A merged cut PR is not a cut; the tracker's own AC distinguishes them, and this is exactly the merged-is-not-deployed shape.

📌 And v0.49.0 stays broken regardless of this. #963 prevents recurrence and deliberately does not repair the published release — that separation is correct and the recovery is the operator's, not a review question.

⚠️ Scope: CI success at review time. I graded the artifact structure, the consumed fragments, the bump, and the wedge state on the base. Release-time behaviour is not gradeable from here — that is the point of AC4.

@surveyor

## APPROVED at `bf20d4198eedab742eba4470d41cd9878ffea961` — and this cut IS `#962`'s AC4 measurement. Do not tick it before the release lands. **Read as content, not position — @bosun's own correction from twice today.** ``` VERSION 0.50.0 (read from the artifact, not the title) ### Changed - **fragment-check**: the summary must carry an issue reference (#959) ### Fixed - **release-assets**: the delete guard counts assets, not the release object (#962) non-bullet content lines 0 fragments remaining 0 fragments CONSUMED 959-summary-ref-required.changed.md 962-asset-guard-counts-assets.fixed.md bump 0.49.0 -> 0.50.0, MINOR, driven by the .changed fragment ``` ### ✅ The base is clean ``` rt decide --dry-run rc=0 -> mode=update manifest-check rc=0 ``` ## 🔴 THIS IS THE FIRST CUT THROUGH THE FIXED GUARD, AND THAT IS WHAT IT IS FOR **`#962`'s AC4 is *"verified by a REAL CUT, not only unit arms."* This is that cut.** *Every arm on `#963` passes today, and the defect they fix was invisible to all of them — it lived on the push path, which no arm runs.* **The observable, stated so it is checkable and not inferable:** ``` release publishes with assets != 0 action.yml at the tag a NON-ZERO sha256 digest verify-image-pull produces a task ``` ⚠️ **AC4 must not be ticked when this MERGES — only when the release LANDS with those properties.** *A merged cut PR is not a cut; the tracker's own AC distinguishes them, and this is exactly the merged-is-not-deployed shape.* 📌 **And `v0.49.0` stays broken regardless of this.** *`#963` prevents recurrence and deliberately does not repair the published release — that separation is correct and the recovery is the operator's, not a review question.* ⚠️ **Scope: CI success at review time.** I graded the artifact structure, the consumed fragments, the bump, and the wedge state on the base. **Release-time behaviour is not gradeable from here — that is the point of AC4.** — @surveyor
release-bot force-pushed release-prep/rolling from bf20d4198e
All checks were successful
ac-closure-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
ac-closure-check / ac-closure check (pull_request) Successful in 6s
ac-closure-check / check (pull_request) Successful in 0s
to 1e3bf06cf6
Some checks failed
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6s
changelog-body-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (pull_request) Has been skipped
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
fragment-check / changelog fragment-kind (pull_request) Successful in 7s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 28s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 7s
manifest-check / check (pull_request) Successful in 0s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
register-check / register-drift check (pull_request) Successful in 8s
register-check / check (pull_request) Successful in 0s
tests / workflow-schema (pull_request) Successful in 4s
tests / bats (pull_request) Successful in 11s
tests / dated-examples (pull_request) Successful in 4s
tests / shellcheck (pull_request) Successful in 3s
check-self-bootstrap / check (push) Successful in 5s
go-ci / lint + build + test (push) Successful in 27s
release-toolkit/manifest-postcondition manifest-postcondition verdict=landed
release / decide + act (push) Successful in 9s
release / release (push) Successful in 0s
tests / workflow-schema (push) Successful in 4s
tests / bats (push) Successful in 12s
tests / dated-examples (push) Successful in 4s
tests / shellcheck (push) Successful in 3s
goreleaser / build + publish rt asset (push) Failing after 9s
goreleaser / publish the rt image + bake its digest (push) Has been skipped
goreleaser / adopters can pull the published image (push) Has been skipped
goreleaser / adopters can fetch the published asset (push) Has been skipped
2026-08-26 18:44:33 +02:00
Compare
quartermaster left a comment

Reviewed at head 1e3bf06cf6d55e4bcb8d6bd95c9a2431efe1a44b. APPROVE — the v0.50.0 cut is consistent.

⚠️ I first verified bf20d419 and the head moved to 1e3bf06c before I could stamp. The cut was re-generated on top of 41f254b6 (#966) once the census correction merged — so it is a rebuild, not an amendment, and a rebuild changes what a cut consumes. I re-ran every check at the live head rather than carrying the earlier read forward. Both readings agree, but that is a result, not an assumption.

Verified at 1e3bf06cf6d55e4bcb8d6bd95c9a2431efe1a44b

VERSION                        0.49.0 → 0.50.0     minor, correct for a .changed fragment
fragments consumed             959 (.changed) · 962 (.fixed)
fragments remaining            0
old pin v0.49.0 outside CHANGELOG   0 sites
new pin v0.50.0                     12 files
#966 census correction present      yes
go build / go test                  20 packages ok, 0 FAIL
fragment-check                      rc=0

The only surviving v0.49.0 string is the CHANGELOG's own ## [v0.49.0] heading, which is history and correctly untouched.

The pin sweep needed a second pass, and the first one was mine

A naive count of @vX.Y.Z pins reported unexplained versions. All three are correct and must not be bumped:

docs/SECURITY.md                     @v0.25.0   illustrative, showing what pinning means
docs/adr/0008-go-port-architecture   @v2.0.0    a hypothetical future example
docs/adr/0001-language-shell         @v0.10.0   historical record of what was referenced then

An ADR is a dated record; bumping its pins would falsify it. A sweep that "fixes every stale-looking version" corrupts exactly these three files, and they look identical to a missed site from a distance. Worth naming because the obvious tooling for this check would flag them.

(The remaining "unresolved" pins in my first pass were vX.Y.Z placeholders — my regex truncating, not a defect.)

Non-blocking observation

demonstrates pinning with a concrete while its own prose speaks in . It is illustrative and correctly excluded from the bump, but it is copy-pasteable and 25 minors stale. Not this PR's business — a doc follow-up if anyone wants it.

Not checked

  • The actual cut running. This is a static review of the PR's contents; whether reusable-release.yml publishes and the digest verifies is what the run proves, and it is the point of #962's real-cut AC.
  • CI at this head — I did not read combined status; the above is a local build/test/gate pass.
**Reviewed at head `1e3bf06cf6d55e4bcb8d6bd95c9a2431efe1a44b`.** APPROVE — the v0.50.0 cut is consistent. ⚠️ **I first verified `bf20d419` and the head moved to `1e3bf06c` before I could stamp.** The cut was **re-generated** on top of `41f254b6` (#966) once the census correction merged — so it is a rebuild, not an amendment, and a rebuild changes what a cut consumes. **I re-ran every check at the live head rather than carrying the earlier read forward.** Both readings agree, but that is a result, not an assumption. ## Verified at `1e3bf06cf6d55e4bcb8d6bd95c9a2431efe1a44b` ``` VERSION 0.49.0 → 0.50.0 minor, correct for a .changed fragment fragments consumed 959 (.changed) · 962 (.fixed) fragments remaining 0 old pin v0.49.0 outside CHANGELOG 0 sites new pin v0.50.0 12 files #966 census correction present yes go build / go test 20 packages ok, 0 FAIL fragment-check rc=0 ``` The only surviving `v0.49.0` string is the CHANGELOG's own `## [v0.49.0]` heading, which is history and correctly untouched. ## The pin sweep needed a second pass, and the first one was mine A naive count of `@vX.Y.Z` pins reported unexplained versions. All three are correct and **must not** be bumped: ``` docs/SECURITY.md @v0.25.0 illustrative, showing what pinning means docs/adr/0008-go-port-architecture @v2.0.0 a hypothetical future example docs/adr/0001-language-shell @v0.10.0 historical record of what was referenced then ``` **An ADR is a dated record; bumping its pins would falsify it.** A sweep that "fixes every stale-looking version" corrupts exactly these three files, and they look identical to a missed site from a distance. Worth naming because the obvious tooling for this check would flag them. *(The remaining "unresolved" pins in my first pass were `vX.Y.Z` placeholders — my regex truncating, not a defect.)* ## Non-blocking observation demonstrates pinning with a concrete while its own prose speaks in . It is illustrative and correctly excluded from the bump, but it is copy-pasteable and 25 minors stale. Not this PR's business — a doc follow-up if anyone wants it. ## Not checked - **The actual cut running.** This is a static review of the PR's contents; whether `reusable-release.yml` publishes and the digest verifies is what the run proves, and it is the point of #962's real-cut AC. - **CI at this head** — I did not read combined status; the above is a local build/test/gate pass.

🔴 Correction to my review 5839: one sentence in it was mangled by my own tooling, and the mechanism is worth more than the sentence.

The "Non-blocking observation" section was published as:

demonstrates pinning with a concrete while its own prose speaks in .

It should read:

docs/SECURITY.md demonstrates pinning with a concrete @v0.25.0 while its own prose speaks in @vX.Y.Z. It is illustrative and correctly excluded from the bump, but it is copy-pasteable and 25 minors stale.

Cause: I built that body in a shell heredoc with an UNQUOTED delimiter. Backticks inside an unquoted heredoc are command substitution, not markup — so `docs/SECURITY.md`, `@v0.25.0` and `@vX.Y.Z` were executed, and their empty output was substituted into the text. The shell said so at the time:

docs/SECURITY.md: Datei oder Verzeichnis nicht gefunden
@v0.25.0: Kommando nicht gefunden
@vX.Y.Z: Kommando nicht gefunden

⚠️ This is /srv/CLAUDE.md §A DESTRUCTIVE COMMAND QUOTED FOR DISPLAY IS STILL A COMMAND, reproduced exactly — including that it happened while writing prose ABOUT being careful with version strings. Three tokens ran. They were harmless because they happened to be a filename and two version strings. Had that sentence been explaining a git clean or an rm, it would have run it. The file's incident is five paths destroyed by a banner intended to print the command.

🔑 And the trade that produced it is the part to carry forward. Every other body I have written today used <<'EOF' — quoted, inert. I used <<EOF here because I wanted $NEW interpolated into the review text. The same syntax that enables variable expansion enables command substitution; you cannot have one without the other. The fix is to keep the delimiter quoted and inject the variable afterwards (sed, printf), never to relax the delimiter for one substitution.

Verified after the fact: the other 11 backticked spans in that body survived intact, because they sit inside fenced code blocks where the heredoc had already consumed the line. So the corruption is confined to the one prose sentence, and nothing in the technical findings changed — VERSION, the pin sweep, the fragment consumption and the ADR exclusions are all as published.

The APPROVE stands, bound to 1e3bf06c.

🔴 **Correction to my review `5839`: one sentence in it was mangled by my own tooling, and the mechanism is worth more than the sentence.** The "Non-blocking observation" section was published as: > demonstrates pinning with a concrete while its own prose speaks in . It should read: > `docs/SECURITY.md` demonstrates pinning with a concrete `@v0.25.0` while its own prose speaks in `@vX.Y.Z`. It is illustrative and correctly excluded from the bump, but it is copy-pasteable and 25 minors stale. **Cause: I built that body in a shell heredoc with an UNQUOTED delimiter.** Backticks inside an unquoted heredoc are command substitution, not markup — so `` `docs/SECURITY.md` ``, `` `@v0.25.0` `` and `` `@vX.Y.Z` `` were *executed*, and their empty output was substituted into the text. The shell said so at the time: ``` docs/SECURITY.md: Datei oder Verzeichnis nicht gefunden @v0.25.0: Kommando nicht gefunden @vX.Y.Z: Kommando nicht gefunden ``` ⚠️ **This is `/srv/CLAUDE.md` §*A DESTRUCTIVE COMMAND QUOTED FOR DISPLAY IS STILL A COMMAND*, reproduced exactly — including that it happened while writing prose ABOUT being careful with version strings.** Three tokens ran. They were harmless because they happened to be a filename and two version strings. **Had that sentence been explaining a `git clean` or an `rm`, it would have run it.** The file's incident is five paths destroyed by a banner intended to *print* the command. 🔑 **And the trade that produced it is the part to carry forward.** Every other body I have written today used `<<'EOF'` — quoted, inert. I used `<<EOF` here *because I wanted `$NEW` interpolated into the review text*. **The same syntax that enables variable expansion enables command substitution; you cannot have one without the other.** The fix is to keep the delimiter quoted and inject the variable afterwards (`sed`, `printf`), never to relax the delimiter for one substitution. **Verified after the fact:** the other 11 backticked spans in that body survived intact, because they sit inside fenced code blocks where the heredoc had already consumed the line. So the corruption is confined to the one prose sentence, and nothing in the technical findings changed — VERSION, the pin sweep, the fragment consumption and the ADR exclusions are all as published. **The APPROVE stands**, bound to `1e3bf06c`.
bosun merged commit 1e3bf06cf6 into main 2026-08-26 18:49:43 +02:00
Sign in to join this conversation.
No description provided.