chore(release): v0.4.0 #76
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
4 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!76
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
Push-triggered rolling-release-PR mechanic — v0.4.0 replaces the v0.3.x operator-dispatched prep flow with a
push: branches: [main]trigger backed by a committed.release-toolkit-manifest.jsonstate file and a shell-based decision engine (scripts/release-decide.sh). On every push to main, the workflow walksgit log <last_released_sha>..HEADand decides one of three modes:noop(no release-relevant content),update(refresh the rolling release-prep PR with the accumulated bump), orcut(the operator merged the rolling PR — firedraft-release.sh+ commit-and-push the manifest update). The substrate-honest escape from the Forgejo Actions expression-engine bug (#41 / #47) that constrained the v0.3.x flow — no${{ github.event.* }}/${{ forgejo.event.* }}accesses on the load-bearing path.Fixed
scripts/release-prep.sh:DRY_RUN_INPUT/DRY_RUN_ENVenv-var sources now use truthy semantics — the literal string"false"no longer falsely enables dry-run (closes #70).scripts/release-prep.sh+.forgejo/workflows/_release.yml: defensive git identity setup beforegit commit— works on fresh CI runner containers without pre-configured git config; configurable viaRELEASE_TOOLKIT_GIT_NAME/RELEASE_TOOLKIT_GIT_EMAILenv vars; consumer-provided config preserved (closes #73).3cadde5a17to5f4812d76fGate-1 review — v0.4.0 rolling-release PR
Verdict: APPROVED (advisory — operator/QM is the merge-gate). Pinned to head
5f4812d.Full at-source pass on the rolling-PR shape. Every load-bearing claim verified against a fresh scratch clone at the head SHA.
Verified at source
0.4.0— correct minor bump from0.3.5(.added.mdfragment drives minor;bump_level_max(minor, patch) = minor).last_released_sha=ee4a9b4…,last_released_version=0.3.5). Correct: the rolling-prep PR must not write the manifest; the cut path commits it on merge.## [v0.4.0] - 2026-06-25is a pure+11/-0prepend; existing[v0.3.5]/[v0.3.4]sections untouched. Section ordering correct ([Unreleased]→[v0.4.0]→[v0.3.5]).changelog.d/fragments (52/70/73) are deleted, composed into the section. The §Fixed bullets are the operator-folded condensed summaries of the verbose fragment bodies; bothcloses #70andcloses #73links are preserved (the load-bearing trace survives the fold — no distinct fix silently dropped).success(both manifest-check jobs green).Cut-path readiness (forward-looking)
ee4a9b4(last_released_sha) is an ancestor of HEAD;git log ee4a9b4..HEAD= the full 9-commit v0.4.0 arc.draft-release.shextracts the release body viachangelog_get_section_content "$CHANGELOG" "$VERSION"(the## [v0.4.0]section), notchangelog.d/. So the deleted fragments are correct — the cut drafts from the already-composed section.VERSION=0.4.0resolves the## [v0.4.0]heading.One note, not a blocker: merging this PR fires the first live exercise of the cut path — the 3-layer cut-safeguard + manifest commit+push. This is the empirical backstop that #64's deferred Layer-2/3 FAIL-path tests leaned on. The happy-path detection was design-verified pre-merge (mode=cut via the prepare-subject +
release-prep/rollinghead-ref); the merge is its first real run. I'll watch the cut → draft when the operator merges.Clean to merge whenever the operator takes their cadence.