chore(release): prep CHANGELOG for v4.0.1 GA - #2768
Conversation
Promote `## [Unreleased]` to `# [4.0.1] => 2026-05-20` so `release.yml`'s release-checklist step (which refuses to publish on `=> TBD`) and its `awk '/^# \[VERSION\]/,/^---$/'` release-notes extraction both pick up the section. Change the section terminator from `----` (4 dashes) to `---` (3 dashes) — mirrors the same fix shipped in #2606 for the 4.0.0 cut. The awk range in `release.yml` matches only `^---$`, so a 4-dash terminator would let the extraction bleed into 4.0.0's notes. `wheels.json` is already at `4.0.1` (auto-bumped by `bump-develop-version.yml` after the 4.0.0 GA), so no version bump is needed here. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Signed-off-by: Peter Amiri <peter@alurium.com>
There was a problem hiding this comment.
Wheels Bot — Reviewer A
TL;DR: CHANGELOG-only pre-flight prep for the v4.0.1 GA tag. The three changes (header promotion, blockquote tagline, 4-dash to 3-dash separator) are all mechanically correct and well-motivated. Approving.
Correctness
Header promotion (## [Unreleased] to # [4.0.1](...) => 2026-05-20): heading level matches the # [4.0.0] precedent; date matches the PR landing date; URL follows the same pattern as the 4.0.0 entry.
Separator fix (line 102 area): release.yml uses awk '/^# [VERSION]/,/^---$/' CHANGELOG.md to extract release notes; the 4-dash form ---- would not match the ^---$ anchor, causing the GitHub Release body for 4.0.1 to bleed into the 4.0.0 section. The fix is correct and identical to the v4.0.0 analog (#2606). The preamble separators above the version header (lines 8 and 20) intentionally remain ---- — those precede the rebrand note and intro, not version blocks, so the awk range never reaches them.
Tagline accuracy: cross-checked against the CHANGELOG body. env() (#2756, confirmed at line 46 of the merged file), Vite asset-walk (lines 150-151), cfheader attributeCollection (#2750), Scoop wheels.cmd (#2766), viewStyle (#2718/#2731), and plural mappings (#2705/#2739) all have matching entries in the 4.0.1 ### Fixed / ### Added sections. The "~100 PRs" figure (PR body quotes 103 commits / ~97 unique PR refs) is a reasonable approximation.
Pre-flight checks in the PR body — awk line count reported at 85, no => TBD remaining, wheels.json already at 4.0.1 — provide strong independent assurance that the extraction boundary terminates correctly.
Commits
chore(release): prep CHANGELOG for v4.0.1 GA — type chore, scope release, subject under 100 chars, not ALL-CAPS. Conforms to commitlint.config.js.
Docs
This PR IS the doc change; no secondary docs update needed.
No correctness, cross-engine, test, or security concerns (CHANGELOG-only, no executable code). Clean approval.
Wheels Bot — Reviewer B (round 1)A's review checks out. The three claims (header level matches precedent, separator fix is mechanically correct, commit message conforms to commitlint) are all verified against the diff. No padding, no unsupported assertions. SycophancyNone detected. A cited specific evidence for every claim before approving. False positivesNone detected. Spot-checked each of A's assertions:
Missed issuesNone detected. This is a CHANGELOG.md-only change with no executable code. DCO is not a missed issue — the commit carries Verdict alignmentAPPROVE is consistent with the findings: pure documentation change, no cross-engine risk, no security surface, pre-flight assertions independently verifiable. ConvergenceAligned. A's review is accurate and complete; verdict is correct. No changes needed. |
…ybook (#2818) Prep for the 4.0.2 cut. - CHANGELOG.md: the separator below [Unreleased]/[4.0.2] was `----` (4 dashes). release.yml extracts release notes with the awk range /^# \[VERSION\]/,/^---$/, which terminates only on exactly three dashes, so a 4-dash separator silently pulls all of 4.0.1's notes into the 4.0.2 release. Flipped to `---`. (Same regression as #2606, #2768.) - release.yml: added a main-gated guard in the release-checklist step that mirrors the extraction awk and fails the release if the range bleeds into a later version heading, so this stops recurring. - RELEASE_PLAYBOOK.md: corrected stale guidance — version source is wheels.json (not box.json) since the 4.0 rebrand, and the release-day flow is PR-into-main + softprops auto-tag (main's PRs-only ruleset rejects `git push origin main --tags`). Documented the new separator guard and its failure mode. Signed-off-by: Peter Amiri <peter@alurium.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Release-cut reconciliation ahead of the 4.0.3 GA: - Rename [Unreleased] -> [4.0.3] with the 2026-06-09 release date and a summary blurb, matching the 4.0.2 promotion format (#2824). - Consolidate the duplicated ### Changed / ### Fixed sections that accumulated from incremental entry additions into one Added/Changed/Fixed trio (same order as the 4.0.2 block). - Drop the byte-identical duplicate #2844 (protectedControllerMethods) entry. - Add the missing consolidated entry for the 24-command CLI audit sweep (#2882, #2883, #2884, #2885). - Fix the separator below the promoted block to exactly '---' (3 dashes) so release.yml's release-notes awk extraction terminates correctly (the #2606/#2768 footgun its Validate Release Checklist step guards against). Cutting the release branch from develop AFTER this lands avoids the 4.0.2 back-port dance (#2824) where the rename lived only on the release branch. Signed-off-by: Peter Amiri <peter@alurium.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Summary
Pre-flight prep for the v4.0.1 GA tag. Mirrors #2606 (the v4.0.0 analog). Once this lands, the remaining release-day step is a single
release/v4.0.1-to-mainPR.What changed
## [Unreleased]to# [4.0.1](...) => 2026-05-20. This is the linerelease.ymlgrep-validates for=> TBD. Bump the date here on develop if the release-to-main PR slides past today.----(4 dashes) separator between the new 4.0.1 block and the 4.0.0 block to---(3 dashes).release.yml's release-notes extraction isawk '/^# \[VERSION\]/,/^---$/'— that pattern matches only the 3-dash form. Without this fix, the GitHub Release body for 4.0.1 would bleed into the 4.0.0 section. Same issue, same fix as chore: prep CHANGELOG for v4.0.0 GA #2606.paginationNav()framework presets, pluralmappings).Pre-flight checks
=> TBDfor 4.0.1 →release.ymlvalidation step passeswheels.jsonversion is clean (4.0.1, no-snapshotsuffix) → already bumped bybump-develop-version.ymlafter the v4.0.0 GAawk '/^# \[4\.0\.1\]/,/^---$/' CHANGELOG.md | wc -lreports 85 lines, ending immediately before# [4.0.0]Scope of v4.0.1
103 commits / ~97 unique PR references since the v4.0.0 tag (8 days). Highlights:
cfheaderattributeCollection trap (fix(dispatch): copy arguments to a plain struct in $header() for Adobe CF 2023 #2750),env()reserved-word parameter (fix(dispatch): swallow cfheader InvalidHeaderException when response committed #2756), Vite asset-walk array-by-value (fix(dispatch): swallow cfheader InvalidHeaderException when response committed #2756). Documented in .ai/wheels/cross-engine-compatibility.md and CLAUDE.md anti-patterns Fixed bug in $findRoute() that causes blow up on unmatched named route #10/New master #11.wheels.cmdcmd.exe bat-jar pre-parser (fix(cli): scoop wheels.cmd invokes java.exe directly to dodge cmd.exe bat-jar pre-parse #2766),.zip.sha512sidecar layout (fix(release): emit .zip.sha512 sidecars + close Scoop install gotchas (#2758) #2761), Git prereq doc fix (docs: add scoop install git prereq to Windows install steps #2763),scoop bucket add javadoc fix (docs: drop scoop bucket add java step after scoop-wheels#4 #2762).viewStyleargument with Bootstrap 4/5 and Tailwind presets (feat(view): add viewStyle preset to paginationNav and pageNumberLinks #2731), anchor-modeauto/always/never(fix(view): paginationNav anchor modes default to window-aware auto-suppress #2733), unknown-arg validation (fix(view): paginationNav rejects unknown sub-helper arguments #2726).mappingsfor legacy CFML aliases (wheels-sentry@1.0.0 is broken when installed via 'wheels packages add' — hardcoded plugins.sentry.SentryClient path doesn't resolve in vendor/wheels-sentry/ #2705/feat(config): pluralmappingsin package.json for legacy CFML aliases (#2705) #2739), auto-registered per-package mapping in PackageLoader (PackageLoader does not auto-register a per-package Lucee mapping — installed packages can't reference their own internal CFCs by static path #2712),wheels packages addis now the canonical install verb (fix(cli):wheels packageshelp now documentsaddas canonical install verb #2729).wheels deploy bootstrap/execflat aliases (#2677) #2690/fix(cli): add wheels deploy fetch-secrets/extract-secrets/print-secrets flat aliases (#2697) #2699),--releasealias for--version(fix(cli): add --release alias for deploy --version to dodge picocli (#2674) #2691), Dockerfile/.dockerignorescaffolding inwheels deploy init(feat(cli): scaffold Dockerfile and .dockerignore in wheels deploy init #2686).insertAll+ system-tables transaction skip (fix(model): Oracle insertAll uses INSERT ALL form to avoid RETURNING-with-VALUES error #2749/fix(migrator): renameSystemTables skips transaction wrapper on Oracle (#2745) #2753), MySQLaddColumnOptionstext-default carve-out (fix(migrator): carve out MySQL in addColumnOptionsSpec text-default assertion #2748), BoxLanglockingSpeccatch-scope discard workaround (fix(test): work around BoxLang catch-scope discard in lockingSpec #2754).Manual steps for me (after this PR merges to develop)
archive/develop-pre-v4.0.1,archive/main-pre-v4.0.1(keep for at least one cycle in case rollback is needed).release/v4.0.1-to-main(merge develop into main, since main's PR-required ruleset blocks direct push — see Release 4.0.0 — merge develop into main #2607 for the v4.0.0 pattern).release.ymlfires on the push to main, creates the v4.0.1 tag viasoftprops/action-gh-release, and publishes the GitHub Release.bump-develop-version.ymlshould auto-fire viarepository_dispatch(the fix for #2609 shipped on develop), opening a follow-up PR to bumpwheels.jsonto4.0.2.Test plan
🤖 Generated with Claude Code