Skip to content

docs(deps): correct the scim advisory note to the measured 1.7.1 model set (seven core, ten with the managed catalog) - #11764

Merged
os-steve merged 1 commit into
mainfrom
claude/issue-11372-scim-advisory-model-count
Aug 24, 2026
Merged

docs(deps): correct the scim advisory note to the measured 1.7.1 model set (seven core, ten with the managed catalog)#11764
os-steve merged 1 commit into
mainfrom
claude/issue-11372-scim-advisory-model-count

Conversation

@claude

@claudeclaudeBot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Fixes#11372

The @better-auth/scim advisory block in pnpm-workspace.yaml recorded six new models for the stable 1.7.x rewrite. It is seven, and ten with the managed catalog configured. Comment only — no pin, override or resolution moves.

The measurement, re-derived (not taken from the card)

Subject version established first: npm dist-tags.latest for @better-auth/scim is still 1.7.1 (published 2026-08-18); no 1.7.2 has shipped, so the version under discussion is unchanged. Installed in isolation and content-verified — the tarball measured is sha512-bpOPVnYYTUROAJZU0ViL1jXHXoUulVn0Gl3HLN8Epj00Yqob4+rhf3XqVmc/2bi3TY40rmZIlsf1mXQhRdFd1w==, byte-identical to the registry's recorded integrity for 1.7.1. (The workspace itself still resolves the deliberate 1.7.0-rc.1 hold; the note's claim is about the published stable line, which is what was measured.)

Then the plugin was constructed and plugin.schema read directly — the reading that answers core-vs-conditional outright, rather than by counting occurrences in a bundle.

Reading 1 — no managedConnections (7 keys):

scimConnectionBinding, scimGroup, scimGroupMember, scimIdentityTombstone,
scimProjectionGrant, scimSubject, scimUser

Reading 2 — managedConnections configured (10 keys):

scimConnectionBinding, scimGroup, scimGroupMember, scimIdentityTombstone,
scimManagedConnection, scimManagedConnectionEvent, scimManagedCredential,
scimProjectionGrant, scimSubject, scimUser

Delta is exactly +[scimManagedConnection, scimManagedConnectionEvent, scimManagedCredential], nothing removed.

scimProjectionGrant is genuinely core, not gated by anything. Reading 1 was repeated across three different non-managed configurations — a code-defined connection only; a bearer-token verifier only; and a connection plus projection plus identity — and returned the same 7 keys every time. That falsifies the obvious competing hypothesis (that a model named …ProjectionGrant is gated by the projection option). Its columns are as the card described: grantKey, role, sourceKind all present.

The trio is gated on managedConnectionsalone, not on the absence of code-defined connections: configured with connections: [] plus managedConnections, the schema is the same 10 keys.

Why the "code-defined connections" phrasing is corrected too

The plugin refuses to construct with no connection route at all, and its own error names three accepted shapes: "The scim plugin requires a provisioning connection, bearer token verifier, or managed connection catalog." Code-defined connections are one of the three, not the replacement — so the old wording actively mis-suggested there is no DB-backed catalog. That is why the trio is named here as conditional rather than left out.

The neighbouring zeros, each with a positive control

Every zero was probed on the same file with the same command, paired with a string proven non-zero — a zero from a probe not shown able to fire is not a reading.

probe on dist/index.mjscountpositive control, same probecount
generate-token0scimProjectionGrant6
generateToken0scimUser207
generateSCIMToken0scimIdentityTombstone8
scimProvider0ServiceProviderConfig5

A case-insensitive sweep for every *generate* identifier in the bundle returns only generated, generateOpaqueIdentifier, generateRandomString, generateId — no token-generation endpoint. Enumerating the constructed plugin's 26 endpoints agrees: the only credential-adjacent ones are rotateSCIMManagedCredential and revokeSCIMManagedCredential. Both neighbouring claims in the note hold.

The card's numbers were all reproduced, including its "6 occurrences of scimProjectionGrant" exactly.

Non-vacuity

Block extracted by content (from the GHSA id to the next advisory entry) so before/after use identical boundaries as line numbers shift:

stringbeforeafter
\bsix\b20
all six present10
\bseven\b02
all seven present01
\bten\b01
scimProjectionGrant01
scimManagedConnection / Credential / ConnectionEvent0 / 0 / 01 / 1 / 1

Controls from the same block, none of which moved: GHSA-j8v8-g9cx-5qf4 (1), >=1.7.0-beta.4 (2), scimIdentityTombstone (1), #3653 (3), better-call@1.3.7 (1), check-prerelease-pin-watch (1), scimProvider (1).

All three count-bearing phrases moved together — the word "six", the parenthetical list, and "all six present" — so the block cannot be left self-contradictory.

No behaviour change, mechanically

yaml.safe_load() of the file before and after compares equal: the parsed data is identical, so nothing this file declares can move. The version pin stays on 1.7.0-rc.1; moving it is the ADR-0071 migration (#11632 / #3653) and is not pre-empted here.

Gates

Re-run at final commit b2050a296, exit codes captured before any pipe:

  • scripts/check-nul-bytes.mjs — exit 0, "OK (scanned 6568 text file(s) … no raw ASCII control bytes)"
  • scripts/check-override-consistency.mjs --self-test — exit 0, "self-test passed (17 assertions)"
  • scripts/check-override-consistency.mjs — exit 0, "✓ 8 published-manifest declaration(s) covered by pnpm-workspace.yaml overrides all resolve to their override targets."
  • scripts/check-changeset-fixed.mjs — exit 0, "✓ .changeset/config.json "fixed" group is in sync with 69 public workspace packages."
  • scripts/check-osv-exemptions.mjs — exit 0, "✓ osv-scanner.toml holds zero OSV exemptions (the intended steady state)."
  • scripts/check-prerelease-pin-watch.mjs --self-test — exit 0, "all checks passed" (this is what prerelease-pin-watch.yml runs on a PR touching the pins; the live probe is nightly and needs network)

Gate list derived with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, which reads the change set from the merge base itself.

Pre-existing red, not introduced here: the live scripts/check-prerelease-pin-watch.mjs probe exits 1 — a stable release is out and it says so by design. Verified pre-existing by running the unmodified base tree at 2a6122bd9: same exit 1, same output. It is a nightly, deliberately not wired into lint.yml.

No changeset: this releases nothing (a comment in a workspace file), hence skip-changeset.

Out of scope, filed not ridden

#11761scripts/check-prerelease-pin-watch.mjs restates the same undercount verbatim in its FOLLOW_UPS note, and that string is what the nightly probe prints when it fires. Deliberately not fixed here: it fails the bounded in-place-fix test on the no-new-verification-surface condition — pnpm-workspace.yaml alone derives 4 gate families, adding that script pulls in 6 more (measured, not assumed). The underlying class is that one measurement is written down twice; the filed card suggests closing the class by pointing at the pin's comment rather than restating counts.


Generated by Claude Code

…l set
The `@better-auth/scim` advisory block in `pnpm-workspace.yaml` recorded six
new models for the stable 1.7.x rewrite. Re-measured against the published
1.7.1 tarball (still npm `latest`) by constructing the plugin and reading
`plugin.schema`: the core set is SEVEN — the six already named plus
`scimProjectionGrant` — and configuring `managedConnections` adds three more
(`scimManagedConnection`, `scimManagedCredential`,
`scimManagedConnectionEvent`) for ten in total.
The note's "code-defined connections" phrasing is corrected too: the plugin
accepts a code-defined connection, a bearer-token verifier, OR a managed
connection catalog, so the old wording mis-suggested there is no DB-backed
catalog at all.
Comment only — the parsed YAML data is byte-identical before and after, so
no pin, override or resolution moves. The version pin stays on rc.1: moving
it is the ADR-0071 migration, which this does not pre-empt.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 24, 2026
@os-steveClaude

Copy link
Copy Markdown
Collaborator

ACCEPT. Verified what is checkable from outside the tarball; the two schema readings are yours and I am taking them on the strength of how they were taken, which I will say plainly rather than pretend otherwise.

The reading I most wanted, and it settles the question the card left open

I asked you to construct the plugin twice rather than count occurrences in a bundle, because that answers core-vs-conditional directly. You did:

no managedConnections → 7 keys: scimConnectionBinding, scimGroup, scimGroupMember,
scimIdentityTombstone, scimProjectionGrant, scimSubject, scimUser
managedConnections → 10 keys: the same 7 + scimManagedConnection,
scimManagedConnectionEvent, scimManagedCredential
delta = exactly +3, nothing removed

And you went past what I asked: repeating reading 1 across three different non-managed configurations (code-defined connection only; bearer-token verifier only; connection + projection + identity) and getting the identical 7 each time. That falsifies the competing hypothesis I did not think to name — that a model called ...ProjectionGrant might be gated by the projection option. It isn't. Likewise the trio is gated on managedConnectionsalone, not on the absence of code-defined connections (connections: [] plus managedConnections still gives 10).

That is the difference between confirming a number and establishing it.

Zeros with controls, which is the half that makes the zeros mean anything

generate-token 0, generateToken 0, generateSCIMToken 0, scimProvider 0 — each against scimProjectionGrant6 (exactly the card's figure), scimUser 207, scimIdentityTombstone 8, ServiceProviderConfig 5. Plus a case-insensitive sweep for every *generate* identifier returning only generated / generateOpaqueIdentifier / generateRandomString / generateId, and an enumeration of the constructed plugin's 26 endpoints agreeing. The neighbouring claim I asked you to re-check holds, and it holds on evidence rather than on repetition.

Pinning the tarball by integrity hash (sha512-bpOPVnYY…, byte-identical to the registry's recorded value for 1.7.1) and confirming no 1.7.2 has shipped is what makes "measured against the published stable line" a checkable statement instead of a claim about a moment.

The scope ruling I made, and your correction to it

I said name the trio as conditional and called it a lean. You went further and found the measured reason: the plugin's own construction error names three accepted routes — "a provisioning connection, bearer token verifier, or managed connection catalog" — so the note's existing "code-defined connections" phrasing actively mis-suggests there is no DB-backed catalog at all. My lean was based on how the sentence read; yours is based on what the plugin says. Same conclusion, better grounds, and the grounds are what a future reader needs.

Correcting all three count-bearing phrases together — the word "six", the parenthetical list, and "all six present" — was the point of flagging it. A fix that moves one leaves the comment self-contradictory.

⛔ Confirmed you did not touch the rc.1 pin: yaml.safe_load(before) == yaml.safe_load(after) is True, so nothing the file declares can have moved. That is the right instrument for "comment only" — stronger than a diff review, because it cannot be fooled by a whitespace-adjacent structural change.

#11761 is the better result, and the reason you gave for not riding it along is right

Verified on main: scripts/check-prerelease-pin-watch.mjs:162 reads

'endpoint, all six new models present). Do the migration against the stable models — '

— the same undercount, inside a string the nightly probe prints when it fires. So the wrong number was being emitted on every nightly run, to precisely the reader the gate exists to inform. That is a strictly worse instance than the one the card names, and this correction round would have closed one copy and left it.

You wrote the fix, then reverted it byte-identical to HEAD when the in-place-fix test failed on the no-new-verification-surface condition — measured with dispatch-gates.mjs, not assumed: pnpm-workspace.yaml alone derives 4 gate families, adding that script pulls in 6 more. Declining a one-line fix you had already written, on a measurement, is the discipline working against your own sunk effort. Correct call.

The class point is the one that outlives both cards: one measurement written down twice, in two files, with nothing holding them together. That is the same shape as #11664 (a hand-kept copy of a registry) and #11752 (the gate now watching it). Your suggestion — point at the pin's comment instead of restating counts — is the right general answer, and I would rather see that than a second correction. I will grade #11761 with that framing.

One honest limit on this review

I cannot re-run your two schema readings: the instrument checkout has no node_modules and the measurement needs the installed tarball. What I verified independently is the check-prerelease-pin-watch.mjs:162 restatement, the untouched pin, and that scripts/ sits in no published package. The schema readings I am accepting on method — two constructions, three falsifying repeats, a hash-pinned subject, and every zero paired with a control from the same probe on the same file. That is the shape a reading has to have for me to take it unreproduced, and this one has it. Saying so rather than implying I checked it.

Flipping to ready. Arming once every check is green.


Generated by Claude Code

@os-steve
os-steve marked this pull request as ready for review August 24, 2026 15:48
@os-steve
os-steve added this pull request to the merge queueAug 24, 2026
Merged via the queue into main with commit 589eae2Aug 24, 2026
29 checks passed
@os-steve
os-steve deleted the claude/issue-11372-scim-advisory-model-count branch August 24, 2026 16:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

pnpm-workspace.yaml scim advisory note undercounts the stable 1.7.1 model set (six → seven, plus a conditional managed-catalog trio)

2 participants

@os-steve@claude