Skip to content

feat: stabilize v0.3.0 public API bundle#77

Merged
StefanSteiner merged 2 commits into
tableau:mainfrom
StefanSteiner:ssteiner/v0.3.0-rollup
May 28, 2026
Merged

feat: stabilize v0.3.0 public API bundle#77
StefanSteiner merged 2 commits into
tableau:mainfrom
StefanSteiner:ssteiner/v0.3.0-rollup

Conversation

@StefanSteiner
Copy link
Copy Markdown
Contributor

Summary

The v0.3.0 release rollup. This is the commit release-please will see and use to cut v0.3.0.

The four bundle PRs all landed under chore: prefixes to defer release-please from cutting an early version. This single feat: commit with a BREAKING CHANGE: footer aggregates the bundle and triggers the v0.3.0 release PR.

What's in v0.3.0

PR What Issue
#71 Flat public Error enum + ergonomic constructors workspace-wide #70
#73 Transaction API consolidation — RAII guard recommended; raw trio #[doc(hidden)] deprecated #69
#74 FromRow modernization — #[derive(FromRow)], RowAccessor, breaking trait signature, tuple impls deleted #61, #62
#76 Follow-ups A/B/C — typed io::Error sources in process.rs, Error::InvalidOperation variant, structured SQLSTATE on Cancelled / Closed / Connection

Deferred to v0.3.x

#75 — flatten internal client::Error. Internal-only, zero external consumers, scope grew on second look (51 producers + 15 kinds vs. originally estimated ~6). v0.3.0 has all user-facing improvements without it.

The changes in this PR

Commit 1 (feat:): Two-line documentation refresh in hyperdb-api/src/lib.rs to (a) add hyperdb-api-derive to the companion-crates list (it was added in #74 but not mentioned at the crate level), and (b) fix a stale crate name (sea-query-hypersea-query-hyperdb). This is the minimum-viable code change to carry a feat: commit. The semantic content of the release is in the commit body's BREAKING CHANGE: footer, which release-please uses to generate the v0.3.0 entry in CHANGELOG.md.

Commit 2 (chore(ci):): Pre-release CI/CD audit found that hyperdb-api-derive (added in #74) was missing from release.yml's publish-in-dependency-order step. Without this fix, cargo publish -p hyperdb-api would fail at release time because hyperdb-api/Cargo.toml pins hyperdb-api-derive = "=0.X.Y" (strict equality) and the registry wouldn't have hyperdb-api-derive 0.3.0 yet. Also adds the derive crate to the publish dry-run job in ci.yml so the same class of bug is caught in CI next time, and refreshes a stale "7 workspace-member version rows" comment in release-please.yml.

CI/CD readiness audit (pre-merge)

Both adversarial reviewers (line-level + architect) ran against the v0.3.0 CI/CD config. Findings reconciled:

Severity Finding Status
CRITICAL hyperdb-api-derive missing from release.yml publish list ✅ fixed in commit 2
MAJOR Derive crate not in ci.yml publish-dry-run ✅ fixed in commit 2
NIT Stale "7 workspace members" comment in release-please.yml ✅ fixed in commit 2
MAJOR (architect) release-please-config.json extra-files doesn't list every workspace crate Deferred to v0.3.x — every crate uses version.workspace = true so the workspace-root bump cascades automatically; the extra-files list only matters for crates with x-release-please-start-version markers (currently 3 crates, all listed). Filing follow-up.
MAJOR (architect) npm-build-publish vs. release.yml race / no rollback path Deferred — both workflows have idempotent re-run paths (already exists on guard for crates.io, will require similar for npm). Filing follow-up.
MAJOR (architect) Hardcoded required-check list in two places — silent skip on rename Deferred — would need a refactor against branches/main/protection API. Real but lower-stakes for the immediate v0.3.0 cycle. Filing follow-up.
MAJOR (architect) Strict =X.Y.Z pinning + 45s settle window — could time out in registry-lag scenarios Accepted as-is for v0.3.0; can add retry loop in v0.3.x.
MINOR (architect) Lockfile-sync sentinel awk pattern fragile to future cargo formatting changes Deferred — current cargo behavior is stable.
LOW (architect) No cargo-semver-checks guard against accidental #[non_exhaustive] removal v0.3.x improvement.

Verification

What happens after merge

  1. Release-please opens an aggregating chore: release main PR. The CHANGELOG.md entry on that PR will list:
  2. Inspect the CHANGELOG.md draft. Tweak if needed; the per-PR MIGRATING-0.3.md sections are already comprehensive.
  3. Merge the release PR. release-please tags v0.3.0, publishes crates (per the existing release.yml), and cuts a GitHub Release.
  4. Update MIGRATING-0.3.md if any post-merge corrections are needed (likely none — it's been polished across 4 PRs).

Test plan

This commit aggregates the breaking and additive API changes that ship
together as v0.3.0. The individual PRs landed under chore: prefixes to
defer release-please from cutting an early version; this single feat:
commit with a BREAKING CHANGE: footer is the trigger for the v0.3.0
release PR.

Bundle contents (all merged to main):
- tableau#70 (PR tableau#71)  — Flat public Error enum + ergonomic constructors
                  workspace-wide
- tableau#69 (PR tableau#73)  — Transaction API consolidation (RAII guard recommended;
                  raw trio deprecated and #[doc(hidden)])
- tableau#61 + tableau#62
  (PR tableau#74)      — FromRow modernization: #[derive(FromRow)] in new
                  hyperdb-api-derive crate, RowAccessor with cached
                  name->index lookup, breaking trait signature change,
                  blanket tuple impls deleted, #[hyperdb(rename)] and
                  #[hyperdb(index)] attributes
- tableau#76           — Follow-ups A/B/C: typed io::Error sources in process.rs,
                  Error::InvalidOperation variant for caller misuse,
                  structured SQLSTATE on Cancelled/Closed/Connection

Follow-up D (flatten internal client::Error) deferred to v0.3.x as
issue tableau#75 — internal-only, zero external consumers, larger than originally
scoped.

The code change in this commit is a small documentation refresh on the
crate-level rustdoc to (a) include hyperdb-api-derive in the companion
crates list and (b) fix a stale crate name (sea-query-hyper ->
sea-query-hyperdb). The body of the commit is the BREAKING CHANGE:
footer below; release-please uses it to generate the v0.3.0 entry in
CHANGELOG.md.

See MIGRATING-0.3.md for full migration recipes covering every breaking
change in the bundle.

BREAKING CHANGE: v0.3.0 reshapes the public hyperdb_api::Error enum
into a flat canonical structure (no Box<dyn StdError> cause channel,
no kind() method, no Other catch-all variant), and its constructor
surface (Error::new and Error::with_cause are deleted in favor of
domain-specific snake_case constructors). It also changes the FromRow
trait signature from fn from_row(row: &Row) to fn from_row(row:
RowAccessor<'_>), deletes the blanket 1/2/3/4-tuple FromRow impls,
deprecates Connection::begin_transaction/commit/rollback (use the RAII
guard at Connection::transaction() instead), introduces a new
Error::InvalidOperation variant, and changes Error::Cancelled and
Error::Closed from tuple to struct variants carrying structured
sqlstate. Every variant has a snake_case constructor; the FromRow
derive lives in a re-exported hyperdb-api-derive crate. See
MIGRATING-0.3.md for migration recipes.
Pre-release adversarial review of the v0.3.0 rollup CI/CD config caught
that hyperdb-api-derive (added in PR tableau#74) was missing from release.yml's
publish-in-dependency-order step. hyperdb-api/Cargo.toml strictly pins
hyperdb-api-derive = "=0.X.Y", so cargo publish -p hyperdb-api would
fail at release time when crates.io can't resolve the strict version
of derive (because release.yml never published it).

Verified topologically:
- hyperdb-api-derive has zero workspace deps (only syn/quote/proc-macro2
  from the registry), so it can publish before any workspace crate.
- It's a runtime dep of hyperdb-api only.
- Inserted right after hyperdb-api-salesforce; existing order otherwise
  unchanged. Added a dependency-order comment to the publish step
  explaining the topology so future contributors don't break it.

Also adds hyperdb-api-derive to ci.yml's publish dry-run job. The
dry-run job exists exactly to catch this class of bug before release
time. Without this addition, the same blocker could re-emerge after a
future major-version refactor of derive.

Updates the stale "7 workspace-member version rows" comment in
release-please.yml to reflect the current 8-member workspace
(hyperdb-api-derive added in tableau#74). The lockfile-sync sentinel
enumerates members at runtime via cargo metadata, so the count is
informational; correctness is unchanged.

Verified locally:
- cargo publish -p hyperdb-api-derive --dry-run: succeeds
- cargo publish -p sea-query-hyperdb --dry-run: succeeds
- cargo publish -p hyperdb-bootstrap --dry-run: succeeds
- cargo metadata workspace topology check: order in release.yml is
  consistent with non-dev deps across all 7 publishable crates.
@StefanSteiner StefanSteiner merged commit ac39b2c into tableau:main May 28, 2026
11 checks passed
StefanSteiner added a commit that referenced this pull request May 29, 2026
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 #77 (the v0.3.0 rollup) carries a BREAKING CHANGE: footer.
release-please opened release PR #78 proposing 1.0.0. We closed #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 #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 #78 is therefore invisible to the next run,
which will open a fresh release PR with the corrected 0.3.0 proposal.
@StefanSteiner StefanSteiner mentioned this pull request May 29, 2026
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