Skip to content

chore: enable bump-minor-pre-major for pre-1.0 releases#79

Merged
StefanSteiner merged 1 commit into
tableau:mainfrom
StefanSteiner:ssteiner/bump-minor-pre-major
May 29, 2026
Merged

chore: enable bump-minor-pre-major for pre-1.0 releases#79
StefanSteiner merged 1 commit into
tableau:mainfrom
StefanSteiner:ssteiner/bump-minor-pre-major

Conversation

@StefanSteiner
Copy link
Copy Markdown
Contributor

Summary

Configures release-please to bump 0.x.y → 0.(x+1).0 on a BREAKING CHANGE: footer instead of jumping straight to 1.0.0. Adds "bump-minor-pre-major": true to release-please-config.json at both the top level (default for all packages) and the per-package level (defense-in-depth).

Why now — recovery from PR #78

PR #77 (the v0.3.0 rollup) carried a BREAKING CHANGE: footer. After it merged, release-please opened PR #78 titled chore: release main proposing 1.0.0 — release-please's default behavior on a 0.x.y release-type:simple package is that BREAKING CHANGE: triggers a 1.0.0 bump.

That's not what we wanted. We wanted 0.3.0 (the API is intentionally still pre-1.0). PR #78 was closed without merging.

State right now (verified):

  • .release-please-manifest.json is still {".":"0.2.3"} (no tag cut, manifest never bumped) ✅
  • No v0.3.0 or v1.0.0 git tag exists on main
  • PR chore: release main #78 closed with autorelease: pending label still attached
  • Latest GitHub release is still v0.2.3

This config change applies retroactively. release-please evaluates bump-minor-pre-major against current commits at run time (verified in src/manifest.ts:1746-1747), so the BREAKING CHANGE: footer already on main will produce a 0.3.0 proposal on the next run.

Schema verification

Field exists at both levels in the release-please config schema:

  • Top-level under properties.bump-minor-pre-major (acts as default)
  • Per-package under definitions.ReleaserConfigOptions.properties.bump-minor-pre-major (overrides default)

Source impl at line 1746 reads pathConfig.bumpMinorPreMajor ?? defaultConfig.bumpMinorPreMajor, so per-package wins; setting both is harmless and makes intent explicit.

What happens after merge

  1. release-please runs on the merge commit.
  2. It sees:
  3. Opens a fresh release PR proposing 0.3.0 with a chore: release main title.
  4. Inspect the auto-generated CHANGELOG.md draft on that PR — should aggregate chore(api): flatten Error enum and add ergonomic constructors workspace-wide (#70) #71, chore(api): deprecate raw transaction trio; migrate MCP async paths to RAII (#69) #73, chore(api): modernize FromRow with #[derive] + RowAccessor (#61, #62) #74, chore(api): v0.3.0 follow-ups (A: typed I/O sources, B: InvalidOperation, C: structured SQLSTATE) #76 contributions (all chore(api): commits get reclassified under the major-bump section because of the BREAKING CHANGE footer; the bump itself is constrained to minor by this flag).
  5. Merge the release PR. release-please tags v0.3.0, fires release.yml (crates.io publish — now with hyperdb-api-derive correctly in the publish list per feat: stabilize v0.3.0 public API bundle #77 commit 2), and npm-build-publish.yml.

Why not other paths

  • Path B (Release-As: 0.3.0 empty commit): one-shot override; leaves the misconfiguration in place. A future 0.x BREAKING CHANGE would re-trigger the same 1.0.0 trap. Path A fixes the underlying config.
  • Path C (manually edit manifest to 0.3.0): would tell release-please that 0.3.0 is already released. Next release PR would compute from there as if v0.3.0 had been tagged. Silently drops the v0.3.0 release entirely. Avoid.
  • autorelease: snooze on PR chore: release main #78: snooze prevents re-proposal of the exact same version; release-please would still want 1.0.0 next time. Snoozing without changing the bump rule is "wait until something changes" — and this PR is what makes something change.

Test plan

If the new release PR still proposes 1.0.0 after this merges, fall back to Path B: git commit --allow-empty -m "chore: release 0.3.0\n\nRelease-As: 0.3.0".

Closes the recovery flow opened by closing PR #78.

Configures release-please to bump 0.x.y → 0.(x+1).0 on a BREAKING
CHANGE: footer instead of bumping straight to 1.0.0. The default
release-please behavior for any 0.x.y release-type:simple package is
that BREAKING CHANGE triggers a 1.0.0 bump; bump-minor-pre-major:true
overrides that to "BREAKING CHANGE while < 1.0.0 only bumps minor".

Why now: PR tableau#77 (the v0.3.0 rollup) carries a BREAKING CHANGE: footer.
release-please opened release PR tableau#78 proposing 1.0.0. We closed tableau#78
without merging — the manifest is still 0.2.3, no tag was cut. With
this config change, the next release-please run will recompute against
main and propose 0.3.0 instead of 1.0.0.

Schema verification: bump-minor-pre-major is a documented field on the
release-please config schema at both the top level (acts as default
for all packages) and the per-package level. Verified against
https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json
and the implementation in release-please src/manifest.ts:1746-1747
which reads pathConfig.bumpMinorPreMajor ?? defaultConfig.bumpMinorPreMajor.
Setting both explicitly for defense-in-depth.

This config is evaluated against current commits at run time, so it
applies retroactively to the BREAKING CHANGE: footer already on main.
No need to amend the rollup commit or cherry-pick history.

Note: the closed PR tableau#78 still has the autorelease: pending label. That
label only matters on OPEN PRs; release-please's matcher
(findOpenReleasePullRequests) ignores closed ones unless they carry
autorelease: snooze. PR tableau#78 is therefore invisible to the next run,
which will open a fresh release PR with the corrected 0.3.0 proposal.
@StefanSteiner StefanSteiner merged commit 3443785 into tableau:main May 29, 2026
10 checks passed
StefanSteiner added a commit that referenced this pull request May 29, 2026
…stays the gate (#87)

Configures release-please to NOT create the GitHub Release / git tag
when the "chore: release main" PR merges. release-please continues to
open release PRs (CHANGELOG, version bumps, manifest updates) — only
the auto-tagging step is disabled. The maintainer creates the tag
manually via `gh release create`, which fires release.yml → crates.io
publish.

Why: crates.io and npm are immutable. Once cargo publish succeeds, the
version exists forever; cargo yank only marks it "don't pick by default"
without freeing the version slot. The manual tag step is the only
maintainer-controlled checkpoint between merging the release PR and
permanently publishing the version. We discovered this property
inadvertently during the v0.3.0 release: release-please failed to
auto-tag (upstream googleapis/release-please#1946), forcing a manual
gh release create + label-edit recovery. The recovery worked cleanly
and the human checkpoint turned out to be valuable — better to codify
it than depend on an upstream bug staying broken.

Schema verification: skip-github-release is documented at both the
top-level and per-package level in
https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json
(found at $.properties.skip-github-release and at
$.definitions.ReleaserConfigOptions.properties.skip-github-release).
Setting both for defense-in-depth and to make intent explicit, matching
the bump-minor-pre-major pattern from #79.

Cost: every release becomes manual, including patch releases. The
tag-creation procedure is documented in #83 (filed for follow-up
docs work in GITHUB_OPERATIONS.md).

Net: trades one-time-per-release manual work for permanent prevention
of accidentally shipping an incorrect version to immutable registries.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant