Skip to content

Commit 222b208

Browse files
committed
chore(spec): register the sys_scim_provider retirement in the ADR-0087 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
1 parent 5370b6b commit 222b208

3 files changed

Lines changed: 121 additions & 0 deletions

File tree

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
---
2+
'@objectstack/platform-objects': minor
3+
'@objectstack/spec': minor
4+
'@objectstack/plugin-auth': minor
5+
'@objectstack/plugin-security': minor
6+
---
7+
8+
**BREAKING (platform object removed):** the `sys_scim_provider` platform object is retired (#11757, ruled on #11693 — leg 1a of the #11632 SCIM epic).
9+
10+
FROM → TO, per surface:
11+
12+
- `SysScimProvider` (export of `@objectstack/platform-objects` / `.../identity`) → removed, no replacement export. Fix: delete the import. Stable SCIM state lives on the seven `sys_scim_*` stable-model objects (#3653), and connection credentials on `sys_scim_connection_credential`.
13+
- `sys_scim_provider` in `PLATFORM_PROVIDED_OBJECT_NAMES` (`@objectstack/spec/system`) → removed. `isPlatformProvidedObjectName('sys_scim_provider')` is now `false`, so a stack referencing the name is flagged as a probable typo instead of resolving.
14+
- plugin-auth: the object is no longer provisioned, and `AUTH_MODEL_TO_PROTOCOL` carries no `scimProvider` entry — the installed stable `@better-auth/scim@1.7.1` derives no such model, so the entry bridged nothing.
15+
- plugin-security: the `BETTER_AUTH_MANAGED_OBJECTS` write-deny entry for it is gone with the object (the list is pinned bidirectionally against `managedBy: 'better-auth'` declarations).
16+
17+
The rc.1-era row was written only by the retired `/scim/generate-token` endpoint; after the stable-1.7.1 migration (PR #12726) nothing could write to it. Per the maintainer's ruling (2026-08-24, 「不需要考虑历史数据」; reaffirmed 2026-08-25 — SCIM has no real customers), **no data migration ships**: existing `sys_scim_provider` tables in deployed databases are left untouched — no backfill, no reaper, no migrate command. SCIM-enabled deployments re-register connections on the stable surface; the IdP token reissue is a migration-day operator action regardless of this change.
18+
19+
The ADR-0066 D3 capability-gate pin moves from the retired object to its surviving sibling `sys_sso_provider`, so the gate posture stays test-pinned.
20+
21+
Breaking ships as `minor` per the launch-window convention (`scripts/check-changeset-no-major.mjs`) and the #12726 precedent on the same ruling.
22+
23+
<!-- adr-0087: registered scim-provider-object-retired -->
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.
2+
3+
import type { SemanticMigration } from '../../types.js';
4+
5+
export const entry: SemanticMigration = {
6+
id: 'scim-provider-object-retired',
7+
surface:
8+
'the `sys_scim_provider` platform object (`SysScimProvider` in '
9+
+ '`@objectstack/platform-objects/identity`, re-exported from the package '
10+
+ 'root) and its name in `PLATFORM_PROVIDED_OBJECT_NAMES` '
11+
+ '(`@objectstack/spec/system` constants). The rc.1-era `@better-auth/scim` '
12+
+ 'connection row: one row per SCIM bearer connection, written only by the '
13+
+ 'retired `/scim/generate-token` endpoint.',
14+
replacement:
15+
'(removed — no direct replacement row. The stable `@better-auth/scim` '
16+
+ '1.7.x line (#3653, PR #12726) derives no `scimProvider` model: SCIM '
17+
+ 'state lives in the seven stable platform objects '
18+
+ '(`sys_scim_connection_binding`, `sys_scim_group`, '
19+
+ '`sys_scim_group_member`, `sys_scim_identity_tombstone`, '
20+
+ '`sys_scim_projection_grant`, `sys_scim_subject`, `sys_scim_user`) and '
21+
+ 'connection credentials in the ObjectStack-owned '
22+
+ '`sys_scim_connection_credential`, minted/verified by '
23+
+ '`scim-connection-service.ts` behind the application-owned '
24+
+ '`verifyBearerToken`. A SCIM-enabled deployment re-registers its '
25+
+ 'connections on the stable surface; rc.1 token digests are not portable '
26+
+ 'on any path, so the IdP reissues its token — a migration-day operator '
27+
+ 'action, not a code rewrite.)',
28+
reason:
29+
'Maintainer ruling 2026-08-24 on #11693 (verbatim: 「11700 11693 不需要考虑'
30+
+ '历史数据,其他按照你的建议继续」) — disposition A: retire, with no '
31+
+ 'data-migration path owed for existing rows (reaffirmed 2026-08-25: SCIM '
32+
+ 'has no real customers; the binding constraint is a smooth upgrade). '
33+
+ 'Executed as #11757 after the stable-1.7.1 migration landed (#3653 / '
34+
+ 'PR #12726): the installed library derives no `scimProvider` model, so '
35+
+ 'the object backed nothing — nothing could write a row to it any more. '
36+
+ 'Retiring it also removes its `provider_id` unique index, whose '
37+
+ 'stricter-than-upstream uniqueness was flagged on #3653 and parked '
38+
+ 'pending exactly this retirement.',
39+
acceptanceCriteria:
40+
'No code imports `SysScimProvider` from `@objectstack/platform-objects` '
41+
+ '(TS2305 after upgrade); `isPlatformProvidedObjectName(\'sys_scim_provider\')` '
42+
+ 'returns false, so a stack referencing the name is flagged as a probable '
43+
+ 'typo rather than resolved; plugin-auth provisions no `sys_scim_provider` '
44+
+ 'object and `AUTH_MODEL_TO_PROTOCOL` carries no `scimProvider` entry; the '
45+
+ 'spec registry conformance test (`platform-object-names.test.ts`) pins '
46+
+ 'the absence bidirectionally — re-adding either the object file or the '
47+
+ 'registry name alone reds `registry group "platform-objects" is out of '
48+
+ 'date` (measured both ways on #11757). Existing `sys_scim_provider` '
49+
+ 'tables in deployed databases are left in place untouched, by ruling — '
50+
+ 'no backfill, no reaper, no migrate command.',
51+
};

packages/spec/src/migrations/registry.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6987,6 +6987,53 @@ const step18: MigrationStep = {
69876987
+ '`collapsible: true` explicitly — an unset key now defers to the renderer, which does '
69886988
+ 'not collapse.',
69896989
},
6990+
{
6991+
id: 'scim-provider-object-retired',
6992+
surface:
6993+
'the `sys_scim_provider` platform object (`SysScimProvider` in '
6994+
+ '`@objectstack/platform-objects/identity`, re-exported from the package '
6995+
+ 'root) and its name in `PLATFORM_PROVIDED_OBJECT_NAMES` '
6996+
+ '(`@objectstack/spec/system` constants). The rc.1-era `@better-auth/scim` '
6997+
+ 'connection row: one row per SCIM bearer connection, written only by the '
6998+
+ 'retired `/scim/generate-token` endpoint.',
6999+
replacement:
7000+
'(removed — no direct replacement row. The stable `@better-auth/scim` '
7001+
+ '1.7.x line (#3653, PR #12726) derives no `scimProvider` model: SCIM '
7002+
+ 'state lives in the seven stable platform objects '
7003+
+ '(`sys_scim_connection_binding`, `sys_scim_group`, '
7004+
+ '`sys_scim_group_member`, `sys_scim_identity_tombstone`, '
7005+
+ '`sys_scim_projection_grant`, `sys_scim_subject`, `sys_scim_user`) and '
7006+
+ 'connection credentials in the ObjectStack-owned '
7007+
+ '`sys_scim_connection_credential`, minted/verified by '
7008+
+ '`scim-connection-service.ts` behind the application-owned '
7009+
+ '`verifyBearerToken`. A SCIM-enabled deployment re-registers its '
7010+
+ 'connections on the stable surface; rc.1 token digests are not portable '
7011+
+ 'on any path, so the IdP reissues its token — a migration-day operator '
7012+
+ 'action, not a code rewrite.)',
7013+
reason:
7014+
'Maintainer ruling 2026-08-24 on #11693 (verbatim: 「11700 11693 不需要考虑'
7015+
+ '历史数据,其他按照你的建议继续」) — disposition A: retire, with no '
7016+
+ 'data-migration path owed for existing rows (reaffirmed 2026-08-25: SCIM '
7017+
+ 'has no real customers; the binding constraint is a smooth upgrade). '
7018+
+ 'Executed as #11757 after the stable-1.7.1 migration landed (#3653 / '
7019+
+ 'PR #12726): the installed library derives no `scimProvider` model, so '
7020+
+ 'the object backed nothing — nothing could write a row to it any more. '
7021+
+ 'Retiring it also removes its `provider_id` unique index, whose '
7022+
+ 'stricter-than-upstream uniqueness was flagged on #3653 and parked '
7023+
+ 'pending exactly this retirement.',
7024+
acceptanceCriteria:
7025+
'No code imports `SysScimProvider` from `@objectstack/platform-objects` '
7026+
+ '(TS2305 after upgrade); `isPlatformProvidedObjectName(\'sys_scim_provider\')` '
7027+
+ 'returns false, so a stack referencing the name is flagged as a probable '
7028+
+ 'typo rather than resolved; plugin-auth provisions no `sys_scim_provider` '
7029+
+ 'object and `AUTH_MODEL_TO_PROTOCOL` carries no `scimProvider` entry; the '
7030+
+ 'spec registry conformance test (`platform-object-names.test.ts`) pins '
7031+
+ 'the absence bidirectionally — re-adding either the object file or the '
7032+
+ 'registry name alone reds `registry group "platform-objects" is out of '
7033+
+ 'date` (measured both ways on #11757). Existing `sys_scim_provider` '
7034+
+ 'tables in deployed databases are left in place untouched, by ruling — '
7035+
+ 'no backfill, no reaper, no migrate command.',
7036+
},
69907037
{
69917038
id: 'send-template-input-org-retired',
69927039
surface: 'contracts.emailService.sendTemplate input.org',

0 commit comments

Comments
 (0)