Skip to content

docs(release): explain the 2.0.0 alignment and the FFI publishing-repository change - #913

Merged
tobyhede merged 3 commits into
mainfrom
toby/release-notes-for-859
Aug 19, 2026
Merged

docs(release): explain the 2.0.0 alignment and the FFI publishing-repository change#913
tobyhede merged 3 commits into
mainfrom
toby/release-notes-for-859

Conversation

@tobyhede

Copy link
Copy Markdown
Contributor

Three defects found auditing #859's release notes. All three are in what consumers read on npm, and all three are fixed by changing what #859 will regenerate — merge this before merging #859.

1. Five packages ship a major with nothing to show for it

stash, @cipherstash/stack, stack-drizzle, stack-supabase and wizard go 1.0.0 → 2.0.0 carrying only Minor and Patch entries. @cipherstash/wizard@2.0.0 is a heading followed by two blank lines — on npm that reads as lost release notes, not "nothing changed".

The one real breaking change is @cipherstash/stack-prisma (Prisma Next 0.17). The other five inherit its number through the Changesets fixed group, and nothing in 485 lines of release notes said so. A stack-drizzle user would see 2.0.0, go looking for the migration guide, and find patch notes.

.changeset/stack-2-0-0-version-alignment.md says it in the changelog itself — where they will actually look, rather than in a PR description that is not published — and explains why the six are versioned together: stash init pins the versions it installs and the CLI embeds that map at build time, so a package shipping alone would leave the CLI recommending versions that no longer match what is published (#661, d8039141).

2. The six platform packages had no entry at all

0.32.0 is the first release of these packages published from cipherstash/stack. The attested provenance repository changes with it:

0.31.0   github.com/cipherstash/protectjs-ffi   .github/workflows/release.yml
0.32.0   github.com/cipherstash/stack           .github/workflows/release.yml

A verification policy pinning the source repository rejects 0.32.0 until updated. The wrapper's patch note covers the repository repoint, but it sits 270 lines down and the six platform packages — the ones a provenance checker actually installs — had empty sections.

.changeset/ffi-platform-packages-publishing-repository.md gives all six the note.

3. The CHANGELOG preamble was publishing as release notes

changeset version splices each release directly after the # Changelog line, so the hand-written preamble beneath it landed inside the newest section, under its heading. In #859 that is body lines 296–309: thirteen lines rendered as part of 0.32.0, ending with

Write a changeset, not a section here.

— an instruction addressed to contributors, about to publish to npm. It would have recurred every release.

Moved below the generated entries, where it explains the file's two halves and cannot be swept again, with a comment recording why nothing may sit between # Changelog and the first release heading.

Verification

Ran changeset version for real and rolled it back:

  • seven FFI packages still land on 0.32.0, six Stack packages on 2.0.0 — these changesets add prose, not version bumps
  • @cipherstash/wizard@2.0.0 and each platform package's 0.32.0 are no longer empty
  • no preamble text remains inside the 0.32.0 section
  • pnpm run test:scripts — 416 passing

Not fixed here

  • Five private packages are listed under "# Releases" in Version Packages #859 (e2e, basic-example, prisma-example, bench, test-kit) under a preamble saying packages "will be published to npm automatically". They will not — they are private. That is changesets/action template behaviour, not something a changeset can correct.
  • Prettier reformatted historical entries in the protect-ffi CHANGELOG during generation, dropping indentation from four continuation lines and breaking list rendering for already-published 0.28–0.31 notes.
  • packages/stack/src/diagnostics.ts:26 still says its changeset "is parked as .deferred until the publishing cutover". Stale since chore(release): retire the FFI publishing guard and activate its parked changesets #910.
  • @cipherstash/nextjs is at 4.1.2 in this repo and 4.3.0 on npm — two minors published from somewhere else. Unrelated to this release, but worth knowing.

…, and stop the CHANGELOG preamble shipping

Three defects found auditing the Version Packages PR (#859), all in what
consumers will read on npm.

**Five packages ship a major with nothing to show for it.** `stash`,
`@cipherstash/stack`, `stack-drizzle`, `stack-supabase` and `wizard` go 1.0.0 →
2.0.0 carrying only Minor and Patch entries — `wizard` carrying none at all, a
heading followed by two blank lines. The one real breaking change is in
`stack-prisma` (Prisma Next 0.17), and the other five inherit its number through
the Changesets `fixed` group. Nothing in 485 lines of release notes said so, so
a `stack-drizzle` user would have gone looking for a migration guide that does
not exist. A changeset now says it in the changelog itself, where they will
actually look, and explains why the packages are versioned together: `stash`
embeds the versions it installs, so a package shipping alone would leave the CLI
recommending versions that no longer match what is published.

**The six platform packages had no entry at all.** 0.32.0 is their first release
published from `cipherstash/stack` rather than `cipherstash/protectjs-ffi`, and
the attested provenance repository changes with it — a verification policy that
pins the source repository rejects 0.32.0 until updated. That was invisible to
the person it affects, who reads the platform package they install rather than
the wrapper.

**The CHANGELOG preamble was publishing as release notes.** `changeset version`
splices each release directly after the `# Changelog` line, so the hand-written
preamble beneath it landed inside the newest section, under its heading: thirteen
lines of 0.32.0 ending with "Write a changeset, not a section here" — an
instruction to contributors, shipped to npm. It moves below the generated
entries, where it explains the file's two halves and cannot be swept again, with
a comment recording why nothing may sit above the first release heading.

Verified by running `changeset version` and rolling it back: the seven FFI
packages still land on 0.32.0 and the six Stack packages on 2.0.0 — these
changesets add prose, not version bumps — `wizard`'s and each platform package's
entries are no longer empty, and no preamble text remains inside 0.32.0.
@tobyhede
tobyhede requested a review from a team as a code owner August 19, 2026 01:48
@changeset-bot

changeset-bot Bot commented Aug 19, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: d200ae6

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 18 packages
Name Type
@cipherstash/protect-ffi-darwin-x64 Patch
@cipherstash/protect-ffi-darwin-arm64 Patch
@cipherstash/protect-ffi-win32-x64-msvc Patch
@cipherstash/protect-ffi-linux-x64-gnu Patch
@cipherstash/protect-ffi-linux-arm64-gnu Patch
@cipherstash/protect-ffi-linux-x64-musl Patch
@cipherstash/stack-prisma Major
@cipherstash/protect-ffi Patch
stash Major
@cipherstash/stack Major
@cipherstash/stack-drizzle Major
@cipherstash/stack-supabase Major
@cipherstash/wizard Major
@cipherstash/prisma-example Patch
@cipherstash/basic-example Patch
@cipherstash/e2e Patch
@cipherstash/bench Patch
@cipherstash/test-kit Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

…se notes reach npm

Review findings on the previous commit, all in text it would have published.

**"No breaking changes in this package" was false for two of the five.** The same
2.0.0 ships `@cipherstash/stack`'s hex-only `clientKey` — a base64 value is now
rejected at client construction — and `stash`'s removal of
`stash eql validate --exclude-operator-family`, plus two checks that no longer
exit 1. Both are recorded at patch and minor respectively, which is a deliberate
maintainer call (#874: an undocumented decoder tolerance is not a contract
break, and should not by itself take five packages to 2.0.0). That call is not
reversed here — but a reader following "needs no code changes" into a failed
client construction is not served by it either, so the note now names both,
says where they are, and confines the drop-in claim to users of neither.

**"cipherstash/protectjs-ffi, which is now archived" was false.** The repository
is live; archiving is the last step of the cutover, after this release. Stated
as future, matching the sibling changeset that already had it right.

**The notes did not reach the packages they were written for.** `CHANGELOG.md`
was absent from `files` in `stack-drizzle`, `stack-supabase`, `stack-prisma`,
the protect-ffi wrapper and all six platform packages — so the provenance note
aimed at "the package a checker actually installs" shipped nowhere near it, and
"its own changelog carries the upgrade steps" pointed a Prisma user at a file
absent from their install. Added to all ten. Verified by `npm pack --dry-run`:
`stack-drizzle` now carries its 34.3kB CHANGELOG. The platform packages' copies
are generated by `changeset version`, and `_build-ffi-artifacts.yml` packs from
`changeset-release/main` after that runs, so the file exists at pack time.

**`repository.directory` does not point at the crate.** It points at each
platform's own stub under `packages/protect-ffi/platforms/`; only
`repository.url` moved to `cipherstash/stack`.

**The moved CHANGELOG section contradicted itself.** The heading excluded 0.31.0
while its first line included it, and its comment stated a rule stricter than
the real invariant — the constraint is headingless prose, since a heading
terminates the preceding section. Both corrected, and the comment's claim about
npm, false when written, is true now that the file is in `files`.

Versions are unchanged: seven FFI packages at minor, six Stack packages at
major. `test:scripts` 416 passing; all ten manifests parse.
…rect two stale changelog identities

**The references dangled in three of the five packages they render into.** The
alignment note pointed readers at "Adopt protect-ffi 0.31.0 under Patch Changes"
and "the `eql validate` entry under Minor Changes". Those sections exist in
`@cipherstash/stack`'s and `stash`'s changelogs — not in `stack-drizzle`'s,
`stack-supabase`'s or `wizard`'s, where the same entry is also rendered, and
where `wizard@2.0.0` has no other sections at all. Each reference now names the
package whose changelog holds it, so it resolves from wherever it is read.

**`packages/stack-prisma/CHANGELOG.md` still identified itself as
`@cipherstash/prisma-next`**, stale since the rename in #844. Harmless while the
file stayed out of the tarball; adding it to `files` in the previous commit made
it customer-visible, so the heading is corrected in the same release that starts
shipping it.

**`packages/cli/CHANGELOG.md` had the same defect and was already shipping it.**
Its heading read `@cipherstash/cli`, a name that does not exist on npm — the
package is `stash`, and this file has been in its `files` list all along. Not
caused by this PR, but it is one line and the same class of error.

All six published Stack packages now have a changelog heading matching their
package name.

Verified by running `changeset version` and rolling it back: no
"under Patch Changes" / "under Minor Changes" reference survives anywhere, and
`wizard@2.0.0` — which has no entries of its own — renders both references
naming `@cipherstash/stack` and `stash`. Versions unchanged. `test:scripts` 416
passing.
Comment on lines +9 to +13
**Why this package went to 2.0.0.** The major version number comes from
`@cipherstash/stack-prisma`, which moves to Prisma Next 0.17 — a breaking change
for its consumers, with the upgrade steps in its own Major Changes entry. These
six packages share one version line, so a major in any of them takes all six to
the same number:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I still feel conflicted about this. Prisma Next went from 0.16 to 0.17 but we are going from 1.0.0 to 2.0.0. Worth mentioning that Prisma Next will eventually be released as Prisma 8.0.0.

Versions. What even are they.

@coderdan coderdan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving because my comment is an opinion not a blocker. Interested in other view points.

@tobyhede
tobyhede merged commit a37f68c into main Aug 19, 2026
20 checks passed
@tobyhede
tobyhede deleted the toby/release-notes-for-859 branch August 19, 2026 05:19
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.

2 participants