Cut out of the #11632 SCIM epic by its owning domain:services seat, on the maintainer's ruling at #11693 (5396402751). The epic's scope item 1 called this "decided INSIDE this epic"; it is now decided, so this is the implementation leg.
The ruling
Maintainer, 2026-08-24, live PM chat, verbatim: 「11700 11693 不需要考虑历史数据,其他按照你的建议继续」
Ruled: A — retire sys_scim_provider, with the explicit amendment that historical/existing data is not a consideration.
Two consequences, both load-bearing for whoever takes this:
- ⛔ No data-migration path is owed for existing
sys_scim_provider rows. Do not write one. Do not add a backfill, a reaper, or a "migrate your providers" command. - ⭐ The census-first gate is struck as a blocker, but the consumer sweep is not optional — it moved. It is step 1 of this implementation, as normal retirement discipline, not a separate measurement card that must land first.
Why the disposition went this way
PR #11429 (merged, fixes #11380) repaired the SCIM parity gate so it reaches its model diff on the stable line. Its output against published @better-auth/scim@1.7.1 includes:
expected [ 'user', 'session', 'account', …(9) ] to include 'scimProvider'
⭐ The upstream scimProvider model does not exist on stable. So there is nothing left to mirror — B (facade) would have been a brand-new mapping for a table ruled disposable, and C (managed-catalog adoption) bundles a managedConnections posture decision nobody has asked for.
⇒ Note for leg scoping generally: managedConnections is not adopted. The stable surface is the seven models, not ten.
Step 1 — the consumer sweep, as retirement discipline
Find every reader of the platform object, repair or delete each with evidence, and pin the absence so it cannot come back.
⭐ Pin identities, not counts — a sweep that reports "0 readers remain" without naming what it found and what it did to each is not a sweep. And ⚠️a zero-hit needs a positive control first: prove the search instrument finds a known reader of some other platform object before concluding this one has none.
⚠️ The census the ruling struck was struck as a blocker on the decision, not as work. "Is any shipped deployment relying on it" is answered by fiat. "What in this repo reads it" is still yours to measure and repair.
Fences
- ⛔ Zero
packages/spec ownership in this lane. If retirement needs a spec edit, that is the spec seat's — name it and stop. - ⛔ Never edit
content/docs/releases/ — your release-notes input is the changeset. - ⚠️Clause-② is likely YES and must be assessed against the tree at claim time, not inherited from this line: retiring a platform object can remove an authorable/queryable surface. Re-read
CONTRACT_REVIEW_TIERlive at scripts/pm/dispatch-gates.mjs rather than recalling it. - ⚠️ADR-0087 registration applies if this is a declared-breaking removal — check the gate's own verdict, do not assume either way.
Not measured
- Which in-repo readers exist. That is step 1 of this card, deliberately not pre-measured here so the implementer does it with a live instrument rather than inheriting a stale list.
- Whether any objectui or cloud surface reads it. Out of this repo's reach — name it if the sweep suggests one, do not guess at it.
Sequencing inside #11632
Refs: #11632 (epic) · #11693 (the ruled disposition) · #3653 (decision anchor + seven-model measurements) · #11380 / PR #11429 (the gate repair that produced the diff) · ADR-0071
Cut out of the #11632 SCIM epic by its owning
domain:servicesseat, on the maintainer's ruling at #11693 (5396402751). The epic's scope item 1 called this "decided INSIDE this epic"; it is now decided, so this is the implementation leg.The ruling
Maintainer, 2026-08-24, live PM chat, verbatim: 「11700 11693 不需要考虑历史数据,其他按照你的建议继续」
Ruled: A — retire
sys_scim_provider, with the explicit amendment that historical/existing data is not a consideration.Two consequences, both load-bearing for whoever takes this:
sys_scim_providerrows. Do not write one. Do not add a backfill, a reaper, or a "migrate your providers" command.Why the disposition went this way
PR #11429 (merged, fixes #11380) repaired the SCIM parity gate so it reaches its model diff on the stable line. Its output against published
@better-auth/scim@1.7.1includes:⭐ The upstream
scimProvidermodel does not exist on stable. So there is nothing left to mirror — B (facade) would have been a brand-new mapping for a table ruled disposable, and C (managed-catalog adoption) bundles amanagedConnectionsposture decision nobody has asked for.⇒ Note for leg scoping generally:
managedConnectionsis not adopted. The stable surface is the seven models, not ten.Step 1 — the consumer sweep, as retirement discipline
Find every reader of the platform object, repair or delete each with evidence, and pin the absence so it cannot come back.
⭐ Pin identities, not counts — a sweep that reports "0 readers remain" without naming what it found and what it did to each is not a sweep. And⚠️ a zero-hit needs a positive control first: prove the search instrument finds a known reader of some other platform object before concluding this one has none.
Fences
packages/specownership in this lane. If retirement needs a spec edit, that is the spec seat's — name it and stop.content/docs/releases/— your release-notes input is the changeset.CONTRACT_REVIEW_TIERlive atscripts/pm/dispatch-gates.mjsrather than recalling it.Not measured
Sequencing inside #11632
SCIMGroupSchemaand stable @better-auth/scim's group wire shape (leg 3 of #11632) #11697 (spec parity,domain:spec) is FIRST in the epic's chain and does not block this — different object, different seat.Refs: #11632 (epic) · #11693 (the ruled disposition) · #3653 (decision anchor + seven-model measurements) · #11380 / PR #11429 (the gate repair that produced the diff) · ADR-0071