feat(platform-objects)!: retire the sys_scim_provider platform object (consumer sweep first, no data migration) - #12963
Conversation
Remove the rc.1-era @better-auth/scim connection-row object and every in-repo reader, plus its registry line in packages/spec/src/system/constants/platform-object-names.ts (one PR, both halves — the registry conformance test asserts the set bidirectionally). Stable @better-auth/scim 1.7.x derives no scimProvider model (#3653 landed in PR #12726), so the object backed nothing. No data migration by ruling. The ADR-0066 D3 capability-gate pin moves from the retired object to the surviving sibling SysSsoProvider so the gate cannot be dropped silently. Translation bundles regenerated (pnpm i18n:extract). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LpRNHxWZgSUgVnFT9mQQo4
…7 ledger + changeset Semantic entry scim-provider-object-retired (major 18), registry regions regenerated (major-18 entries project into spec-changes.json/upgrade guide only when that major ships — registry.ts is the only artifact that moves). Breaking changeset ships as minor per the launch-window convention, with the adr-0087 registered marker. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LpRNHxWZgSUgVnFT9mQQo4
…tire-scim-provider-c
📓 Docs Drift CheckThis PR changes 6 package(s): 65 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: ⛔ 6 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails. What this run could not see
Coarse fallback — 134 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 3410a2d2926e851a7a3a0822dc16faa41678ad87 && git checkout 3410a2d2926e851a7a3a0822dc16faa41678ad87
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin b1a987e4a853132b0a76245c8c49f062be1d664d 736390e57bfe4f240627bb9b310c59c7f9dca7ce && git checkout -B drift-repro b1a987e4a853132b0a76245c8c49f062be1d664d && git merge --no-ff 736390e57bfe4f240627bb9b310c59c7f9dca7ce
node scripts/docs-audit/affected-docs.mjs --json b1a987e4a853132b0a76245c8c49f062be1d664d
|
Fixes #11757
Part of #11632 — the epic stays open; this is leg 1a.
What this does
Retires the
sys_scim_providerplatform object — the rc.1-era@better-auth/scimconnection row — and removes its one registry line inpackages/spec/src/system/constants/platform-object-names.tsin the SAME PR. That pairing is the 2026-08-28 maintainer ruling (C: one seat carries both halves, recorded on the card); PR #12726 landed the same shape in the same file in the opposite direction (addition) and is the worked precedent. The disposition itself was ruled on #11693 (2026-08-24, maintainer, verbatim on the card): A — retire, and NO data migration is owed. Accordingly this PR ships no backfill, no reaper, no migrate command; existingsys_scim_providertables in deployed databases are left untouched. After PR #12726 (the stable-1.7.1 migration that discharged #3653) the installed library derives no scimProvider model, so the object backed nothing — nothing could write a row to it.Out of scope, untouched by this PR:
sys_scim_connection_credential(fenced by the card),docs/adr/0066(governed surface — its 2026-07 narrative is historical record),content/docs/releases/(release-owned), package CHANGELOGs and other PRs' changesets (historical record), and the pnpm-workspace.yaml pin narrative (its "retires separately under #11757" sentence stays true). #11632 remains open; #3653 stays discharged — neither is addressed here beyond what the lines above state.Step 1 — consumer sweep, positive control first
Instrument:
git grep -Fagainst the dedicated worktree's pinned HEAD (BASE8beb3deaf), never the shared checkout. Positive controls BEFORE any zero was read:sys_usermatched 702 files,sys_scim_connectionmatched 19 — the instrument finds known readers of other platform objects through the same channel. Every identity from the 2026-08-24 measurement report was re-verified on the current ref rather than inherited (PR #12726 had moved several).Readers repaired or deleted, per identity:
packages/platform-objects/src/identity/sys-scim-provider.object.tspackages/platform-objects/src/identity/index.tspackages/platform-objects/scripts/i18n-extract.config.tspackages/platform-objects/src/apps/translations/*.generated.ts(4 locales + 3 source-hash files)pnpm i18n:extract— thesys_scim_providerblocks drop out (0 residual hits)packages/platform-objects/src/apps/translations/bundle-ownership.test.tsOWNED_OBJECTSentry removedpackages/platform-objects/src/identity/action-predicate-sparse-face.test.tspackages/platform-objects/src/platform-objects.test.tsSysSsoProvider(samemanage_platform_settingsgate, declared atsys-sso-provider.object.ts:60) — deleting the case outright would have left the D3 sso/scim gate with zero test pinspackages/plugins/plugin-auth/src/manifest.tsauthIdentityObjectsentry removed — the runtime provisioning listpackages/plugins/plugin-auth/src/objectql-adapter.tsAUTH_MODEL_TO_PROTOCOL.scimProviderentry removed (stable 1.7.1 derives no such model; the entry bridged nothing)packages/plugins/plugin-auth/src/better-auth-schema-parity.test.tsPLATFORM_OBJECTSentry removed (its own comment said it stays only until this lands)packages/plugins/plugin-auth/src/credential-at-rest-posture.test.tsAUTH_OBJECTSentry removedpackages/plugins/plugin-auth/src/managed-extension-fields.test.tsUNMAPPED_MANAGED_OBJECTSexemption removed — the suite's own stale-entry assertion forces this once the object stops declaring managedBy better-authpackages/plugins/plugin-security/src/objects/default-permission-sets.tsBETTER_AUTH_MANAGED_OBJECTSentry removed — pinned bidirectionally against live managedBy declarations bydefault-permission-sets.test.tspackages/spec/src/system/constants/platform-object-names.tspackages/objectql/src/registry.ts+registry-tenant-index-follows-wall.test.tspackages/qa/dogfood/test/authz-conformance.matrix.tssecure-by-default-postureenforcement prose retargeted to the survivingsys_sso_providercarriercontent/docs/permissions/authorization.mdxobjectui / cloud: the sweep surfaced no cross-repo reader candidates from this repo's side (no exported symbol other than
SysScimProvidernames it, and that export had no in-repo importers outside the list above); per the card, cross-repo verification is out of this repo's reach and was not guessed at.Reverse verification — the absence pin
The registry conformance test (
packages/spec/src/system/constants/platform-object-names.test.ts) scans every*.object.tsand asserts exact per-package set equality with the registry, both directions — so it IS the absence pin, and no redundant twin test was written. Measured on this branch (mutation and restore both proven on disk, script carried an EXIT/INT/TERM restore trap, no build involved — the test reads source via readFileSync and a relative import):registry group "platform-objects" is out of date.name: 'sys_scim_provider'at exactly 1 hit, registry hits 0 — vitest exit 1, the test's own verdict line: AssertionError: registry group "platform-objects" is out of date: expected 46-name set to deeply equal 47. 1 failed, 6 passed.git status --porcelain0 lines,git diff HEAD0 bytes.Verification (final head
736390e57, after merging origin/main churn — 5 commits, overlap re-run)platform-object-names+migrations(114), platform-objects (523), plugin-auth (1695 — includes the SCIM parity gate withKNOWN_UNMAPPED_MODELSas the empty exact set, untouched), plugin-security (1578, re-run on the merged head), objectql tenant-index (11), qa authz-conformance matrix (27).node scripts/pm/dispatch-gates.mjs(no path args,--repoasserted): 56 families run locally, all green after full closure build — includingcheck:authorable-surface,check:docs,check:liveness,check:strictness-ledger,check:empty-state,check:api-surface(via spec check:generated: all 14 artifacts current),check:i18n,check:i18n-stale-fill,check:engine-double-contract,check:where-matcher,check:cross-package-test-inputs,check:type-check-coverage,check:type-check-debt,check:migration-registry,check:nul-bytes, changeset family incl.check-adr-0087-registrationandcheck-changeset-no-major.736390e57: plugin-security tests, cross-package-test-inputs, engine-double-contract, comment-mask-adoption, spec conformance + migrations, adr-0087, changeset-no-major, check:i18n — all green.ADR-0087 and changeset
The gate's own verdict: 1 declared-breaking changeset, carrying disposition
registered scim-provider-object-retired(new entry). The ledger entry ispackages/spec/src/migrations/entries/semantic/18.scim-provider-object-retired.ts(registry regions regenerated; major-18 entries project into spec-changes.json and the upgrade guide only when that major ships, matching the existing 18.x stock). The changeset (.changeset/retire-sys-scim-provider-object.md) declares BREAKING with per-surface FROM → TO mappings and ships as minor per the launch-window convention and the #12726 precedent. The IdP token-reissue note stays a scheduled human operational action, per the card.Review posture
Clause-② YES (public registry narrowing — ruled): this PR stays DRAFT; the contract-review chain owns enqueue. No labels were set by this seat. (Authored in session
session_01LpRNHxWZgSUgVnFT9mQQo4.)Generated by Claude Code