deps(auth): move the better-auth family 1.7.1 to 1.7.2 in step, and return @better-auth/scim to the family range - #13938
Conversation
WIP: overrides + plugin-auth manifest + lockfile.
📓 Docs Drift Check
What this run could not see
Coarse fallback — 11 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
|
ACCEPT — Two of my three Zone 2 items came back falsified, and both corrections are better than what I asked forC — I was wrong, precisely. I wrote "I believe nothing published changes." Verified: A — my framing was falsified, not just my guess. I wrote "the measurement decides, not my preference." It does not: two full B — confirmed, and my word "blocked" was wrong. ⭐ This is the sharpest finding in the report: on ⇒ That is the #3653 ruling's "silence rather than satisfy" shape running in the opposite direction, with scim held behind the family. The pin written to prevent a silent downgrade had started causing one. Verification — re-derived by this seat
⭐ On the rewritten comment: keeping the ruling's live half in the same paragraph that retires its dead half is the thing that stops the next reader re-deriving the whole argument. ⛔ Deleting the block would have left the next seat free to bump scim alone.
|
Fixes #13715
The whole better-auth family moves 1.7.1 → 1.7.2 in step, and
@better-auth/scimreturns to the family's^range. Eleven override entriesin
pnpm-workspace.yamland the five@objectstack/plugin-authdeclarationsmove together in one commit; no source file changes.
This is the follow-up the #3653 ruling of 2026-08-27 named. That ruling held
scim at an exact
1.7.1— one deliberate step behind^1.7.1— because^1.7.1then resolved scim to 1.7.2, whosebetter-auth/@better-auth/corepeers are
^1.7.2, while the installed family was still 1.7.1, and these veryoverrides would have rewritten those peer ranges down and silenced the
mismatch rather than satisfy it. Its own words for the remedy: floating to
1.7.2+ is "its own follow-up with the family moved in step, never a side effect
of a lockfile refresh."
Peer-range evidence — the thing the ruling was protecting
Upstream, per
npm view, at 1.7.2:better-auth@better-auth/corebetter-call@better-auth/utils@better-auth/scim@1.7.2^1.7.2^1.7.21.4.00.4.2@better-auth/oauth-provider@1.7.2^1.7.2^1.7.21.4.00.4.2@better-auth/sso@1.7.2^1.7.2^1.7.21.4.00.4.2better-auth@1.7.2depends on@better-auth/coreat an exact1.7.2(andon the five adapters plus telemetry at exact 1.7.2), so one stable range on the
root drags the family with it.
npm view PKG dist-tags.latestreads1.7.2forall eleven members.
After the change, on this branch, read off the installed tree rather than argued:
node_modules/.pnpmholds exactly one copy of each of the eleven, all at1.7.2. scim's
^1.7.2peers survive on disk unrewritten, and the tree handsthem
better-auth@1.7.2and@better-auth/core@1.7.2— satisfied, notsilenced. That is the condition the exact hold existed for, and it is gone.
better-call@1.4.0and@better-auth/utils@0.4.2are peered exactly as theywere at 1.7.1, and
better-auth's stale optionalbetter-sqlite3@^12.0.0peeris unchanged, so the scaffold's
peerDependencyRulesand their pin tests inpackages/cli/test/init.test.tsare untouched and stay green.^1.7.2vs exact1.7.2— what was measured, and what the measurement could not decideTwo arms, each a full
pnpm install --lockfile-only, differing only in scim'soverride target and its
plugin-authdeclaration. The two lockfiles arebyte-identical except for the two lines that echo the input:
No resolved version differs, and no peer-resolution suffix differs. So the
honest reading is that the measurement does not choose — both shapes satisfy
the peers identically today. The choice is therefore made on durability, and
stated as such rather than dressed as a measurement:
oauth-providerandssoare the other two standalone familyplugins, they peer the family in exactly the same shape (table above), and
both carry
^. An exact scim would be the one asymmetric member with noreason left to state, since the reason it had is measurably gone.
cannot take the next patch is the wrong shape for a package with that history;
^1.7.2floors at the same version and can.The family's "one line or nothing" discipline is unchanged and restated in the
file: a bump that moves scim alone is still the mistake the ruling named.
Is #13887 measurably unblocked? Yes — with a control
The Dependabot group PR carrying these bumps stays open and is Dependabot's;
nothing here was pushed to it, and its predecessor — the one this card
originally named, which was closed unmerged with its branch deleted — was not
used to derive anything. Three arms, all measured with
check:override-consistencycapturing its exit code before any pipe:pnpm-workspace.yamloverrideplugin-authdeclaration'1.7.1'(origin/main)"1.7.2"(that PR's own ask)better-auth1.7.2'^1.7.2'(this branch)"1.7.2"(that PR's own ask, verbatim)'^1.7.2'(this branch)"^1.7.2"(this branch)The blocked arm's verdict, quoted from the gate:
and the unblocked arms':
Both mutation legs proved the edit reached disk with anchored
grep -ccountsin both directions, and both restore legs proved byte identity against the
HEADblob hash (git diff HEADempty,git hash-objectequal).A finding worth its own line: on
origin/main's override, that PR's ask doesnot fail to install.
pnpm install --lockfile-onlyexits 0, prints notone word about better-auth, resolves
@better-auth/scim@1.7.1next tobetter-auth@1.7.2, and rewrites the recorded importer specifier from thedeclared
1.7.2down to1.7.1. The split family is silent at the installlayer;
check:override-consistencyis the only thing that catches it. That isthe ruling's "silence rather than satisfy" shape, observed in the opposite
direction — scim held behind the family instead of running ahead of it.
Merging that PR's branch into this one conflicts on exactly one better-auth
line — scim's spelling,
^1.7.2here against its exact1.7.2— whilebetter-auth,@better-auth/core,oauth-providerandssoauto-merge becauseboth sides already say
^1.7.2. Resolved in that PR's favour (its exactspelling kept verbatim, along with its
@noble/hashesandjosebumps), themerged tree resolves clean at 1.7.2 for all eleven. Its remaining bumps were
never blocked by this override.
The rewritten rationale, quoted
The block previously explained why scim sat one step behind. That explanation is
now false, so it was rewritten rather than deleted, and the two passages above
it that stated the same exact-pin rationale were corrected in place. The GHSA
advisory notes are otherwise untouched — this bump interacts with
GHSA-j8v8-g9cx-5qf4 only as its floor, which stays satisfied at 1.7.2, and with
no other advisory in that block.
(The
PKGabove stands in for the package name; the file itself carries theangle-bracket spelling.)
Changeset
Owed and written. The workspace overrides do not ship, but
@objectstack/plugin-authis published and five of its declared dependencyranges change — which is exactly what a downstream
npx create-objectstackinstall resolves.
.changeset/better-auth-family-1-7-2-in-step.md,patch.Verification — all at head
957dfc5e3pnpm --filter @objectstack/plugin-auth exec vitest run --maxWorkers=2—87 test files, 1783 tests, all passing on better-auth 1.7.2
(
os-verify-lock: VERDICT command-exit 0).pnpm --filter @objectstack/plugin-auth run typecheck—EXIT=0(bothprograms:
tsc --noEmitandtsconfig.examples.json).turbo run buildover./packages/*+./packages/*/*— 70 successful, 70total (
VERDICT command-exit 0); every heavy run went throughscripts/pm/os-verify-lock.sh.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, 30 run, pluscheck:ratchet-remedy-authoritywhich path derivation cannot name.
comm -23 derived ranis empty.29 green;
check-test-completenessexits 3, which is its ownPREREQUISITE-NOT-MET code (it grades a saved
turbo run testlog and none waspassed) — recorded as NOT MEASURED, not as a pass and not as a red, per
the instruction in its own failure text.
evidence rather than claimed. (1) Population read from
eslint.config.mjsitself: every
files:glob names only{ts,tsx,mts,cts,js,jsx,mjs,cjs}.(2) Count read from
--format json: all 4 changed paths report, each with0errors and the message "File ignored because no matching configuration wassupplied." (3) Invariance for untouched files: the config enables no
type-aware linting —
parserOptions.projectandprojectServiceeach occur0 times in it, confirmed by grep, and the config's own comment at line 328
states it with a positive control — so a dependency-version change cannot move
any untouched file's verdict. CI runs the repo-wide sweep regardless.
Draft, so CI can report before review.
Generated by Claude Code
Generated by Claude Code