@happyvertical/smrt-profiles 0.51.32 → 0.51.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__smrt-register__.d.ts +2 -0
- package/dist/__smrt-register__.d.ts.map +1 -0
- package/dist/agent-profile.d.ts +71 -0
- package/dist/agent-profile.d.ts.map +1 -0
- package/dist/auth/index.d.ts +12 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/magicLinkService.d.ts +79 -0
- package/dist/auth/magicLinkService.d.ts.map +1 -0
- package/dist/auth/nip05Handler.d.ts +73 -0
- package/dist/auth/nip05Handler.d.ts.map +1 -0
- package/dist/auth/normalizeIdentityEmail.d.ts +8 -0
- package/dist/auth/normalizeIdentityEmail.d.ts.map +1 -0
- package/dist/auth/nostrCrypto.d.ts +111 -0
- package/dist/auth/nostrCrypto.d.ts.map +1 -0
- package/dist/auth/oidcProvisioningCoordinator.d.ts +58 -0
- package/dist/auth/oidcProvisioningCoordinator.d.ts.map +1 -0
- package/dist/auth/oidcProvisioningPrimitives.d.ts +23 -0
- package/dist/auth/oidcProvisioningPrimitives.d.ts.map +1 -0
- package/dist/auth/resolveIdentity.d.ts +188 -0
- package/dist/auth/resolveIdentity.d.ts.map +1 -0
- package/dist/collections/ApiKeyCollection.d.ts +46 -0
- package/dist/collections/ApiKeyCollection.d.ts.map +1 -0
- package/dist/collections/AuditLogCollection.d.ts +50 -0
- package/dist/collections/AuditLogCollection.d.ts.map +1 -0
- package/dist/collections/MagicLinkTokenCollection.d.ts +58 -0
- package/dist/collections/MagicLinkTokenCollection.d.ts.map +1 -0
- package/dist/collections/NostrIdentityCollection.d.ts +66 -0
- package/dist/collections/NostrIdentityCollection.d.ts.map +1 -0
- package/dist/collections/OidcIdentityCollection.d.ts +45 -0
- package/dist/collections/OidcIdentityCollection.d.ts.map +1 -0
- package/dist/collections/OidcProfileEmailReservationCollection.d.ts +7 -0
- package/dist/collections/OidcProfileEmailReservationCollection.d.ts.map +1 -0
- package/dist/collections/ProfileAssetCollection.d.ts +17 -0
- package/dist/collections/ProfileAssetCollection.d.ts.map +1 -0
- package/dist/collections/ProfileCollection.d.ts +130 -0
- package/dist/collections/ProfileCollection.d.ts.map +1 -0
- package/dist/collections/ProfileMetadataCollection.d.ts +33 -0
- package/dist/collections/ProfileMetadataCollection.d.ts.map +1 -0
- package/dist/collections/ProfileMetafieldCollection.d.ts +31 -0
- package/dist/collections/ProfileMetafieldCollection.d.ts.map +1 -0
- package/dist/collections/ProfileRelationshipCollection.d.ts +44 -0
- package/dist/collections/ProfileRelationshipCollection.d.ts.map +1 -0
- package/dist/collections/ProfileRelationshipTermCollection.d.ts +32 -0
- package/dist/collections/ProfileRelationshipTermCollection.d.ts.map +1 -0
- package/dist/collections/ProfileRelationshipTypeCollection.d.ts +41 -0
- package/dist/collections/ProfileRelationshipTypeCollection.d.ts.map +1 -0
- package/dist/collections/ProfileTypeCollection.d.ts +40 -0
- package/dist/collections/ProfileTypeCollection.d.ts.map +1 -0
- package/dist/collections/index.d.ts +18 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/index.d.ts +55 -2059
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -1
- package/dist/internal/oidc-provisioning.d.ts +14 -119
- package/dist/internal/oidc-provisioning.d.ts.map +1 -0
- package/dist/manifest.json +1 -1
- package/dist/migrations/backfillProfileEmailKeys.d.ts +16 -0
- package/dist/migrations/backfillProfileEmailKeys.d.ts.map +1 -0
- package/dist/models/ApiKey.d.ts +94 -0
- package/dist/models/ApiKey.d.ts.map +1 -0
- package/dist/models/AuditLog.d.ts +71 -0
- package/dist/models/AuditLog.d.ts.map +1 -0
- package/dist/models/MagicLinkToken.d.ts +104 -0
- package/dist/models/MagicLinkToken.d.ts.map +1 -0
- package/dist/models/NostrIdentity.d.ts +112 -0
- package/dist/models/NostrIdentity.d.ts.map +1 -0
- package/dist/models/OidcIdentity.d.ts +82 -0
- package/dist/models/OidcIdentity.d.ts.map +1 -0
- package/dist/models/OidcProfileEmailReservation.d.ts +12 -0
- package/dist/models/OidcProfileEmailReservation.d.ts.map +1 -0
- package/dist/models/Profile.d.ts +243 -0
- package/dist/models/Profile.d.ts.map +1 -0
- package/dist/models/ProfileAsset.d.ts +18 -0
- package/dist/models/ProfileAsset.d.ts.map +1 -0
- package/dist/models/ProfileMetadata.d.ts +33 -0
- package/dist/models/ProfileMetadata.d.ts.map +1 -0
- package/dist/models/ProfileMetafield.d.ts +62 -0
- package/dist/models/ProfileMetafield.d.ts.map +1 -0
- package/dist/models/ProfileRelationship.d.ts +56 -0
- package/dist/models/ProfileRelationship.d.ts.map +1 -0
- package/dist/models/ProfileRelationshipTerm.d.ts +37 -0
- package/dist/models/ProfileRelationshipTerm.d.ts.map +1 -0
- package/dist/models/ProfileRelationshipType.d.ts +59 -0
- package/dist/models/ProfileRelationshipType.d.ts.map +1 -0
- package/dist/models/ProfileType.d.ts +27 -0
- package/dist/models/ProfileType.d.ts.map +1 -0
- package/dist/models/ProfileTypes.d.ts +32 -0
- package/dist/models/ProfileTypes.d.ts.map +1 -0
- package/dist/models/index.d.ts +18 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/prompts.d.ts +17 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/smrt-knowledge.json +4 -4
- package/dist/testing/oidcProvisioningDecisionMatrix.d.ts +1168 -0
- package/dist/testing/oidcProvisioningDecisionMatrix.d.ts.map +1 -0
- package/dist/types.d.ts +33 -732
- package/dist/types.d.ts.map +1 -0
- package/dist/utils.d.ts +52 -817
- package/dist/utils.d.ts.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1,1168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical executable contract for Profile and User OIDC provisioning.
|
|
3
|
+
*
|
|
4
|
+
* The Profiles and Users suites execute the applicable rows directly. Public
|
|
5
|
+
* documentation links here instead of maintaining a second behavioral table.
|
|
6
|
+
*/
|
|
7
|
+
export type OidcProvisioningIdentityState = 'none' | 'exact_global_person' | 'exact_legacy_tenant_profile' | 'exact_legacy_non_person_profile' | 'exact_ambiguous_legacy_links' | 'exact_missing_profile';
|
|
8
|
+
export type OidcProvisioningEmailState = 'missing' | 'no_match' | 'one_unowned_global_person' | 'tenant_scoped_collision' | 'non_person_collision' | 'duplicate_normalized_profiles' | 'already_owned_global_person' | 'different_global_person';
|
|
9
|
+
export type OidcProvisioningVerificationState = 'verified' | 'unverified' | 'claim_missing';
|
|
10
|
+
export type OidcProvisioningResolverResult = 'absent' | 'undefined' | 'null' | 'same_profile' | 'different_profile' | 'owned_profile' | 'throws';
|
|
11
|
+
export type OidcProvisioningOwnerAuthorizationResult = 'matching_owner' | 'multiple_owners' | 'no_owner' | 'null' | 'wrong_user';
|
|
12
|
+
export type OidcProvisioningExecutionState = 'first_callback' | 'exact_subsequent_callback' | 'concurrent_winner_and_observer' | 'concurrent_email_competitors' | 'durable_arbiter_retry' | 'caller_owned_transaction' | 'concurrent_authorized_callbacks' | 'root_transaction_rollback' | 'duckdb_caller_owned_transaction';
|
|
13
|
+
export type OidcProvisioningPublicErrorCode = 'ambiguous_email' | 'ambiguous_identity' | 'email_mismatch' | 'email_key_backfill_required' | 'missing_profile' | 'non_person' | 'profile_owned' | 'rejected' | 'tenant_scoped' | 'transaction_required' | 'user_email_backfill_required' | 'user_email_conflict' | null;
|
|
14
|
+
export type OidcProvisioningPublicError = {
|
|
15
|
+
code: Exclude<OidcProvisioningPublicErrorCode, null>;
|
|
16
|
+
} | {
|
|
17
|
+
messageIncludes: string;
|
|
18
|
+
} | {
|
|
19
|
+
name: string;
|
|
20
|
+
} | null;
|
|
21
|
+
export type OidcProvisioningSelectedProfile = 'new_profile' | 'email_match' | 'exact_identity_profile' | 'resolver_profile' | 'authorized_profile' | 'concurrent_winner' | null;
|
|
22
|
+
export type OidcProvisioningReadiness = 'none' | 'profile_email_keys' | 'profile_and_user_email_keys';
|
|
23
|
+
export interface OidcProvisioningCreatedRows {
|
|
24
|
+
profile: number;
|
|
25
|
+
oidcIdentity: number;
|
|
26
|
+
user: number;
|
|
27
|
+
session: number;
|
|
28
|
+
}
|
|
29
|
+
export interface OidcProvisioningSurfaceExpectation {
|
|
30
|
+
outcome: 'success' | 'rejected' | 'mixed';
|
|
31
|
+
publicError: OidcProvisioningPublicError;
|
|
32
|
+
selectedProfile: OidcProvisioningSelectedProfile;
|
|
33
|
+
resolverCalls: number | 'at_least_2';
|
|
34
|
+
ownerAuthorizerCalls: number | 'at_least_2';
|
|
35
|
+
/** Exact issuer/subject authority is never rebindable. */
|
|
36
|
+
rebindAllowed: false;
|
|
37
|
+
/** Backfill marker state installed by the runner for this surface. */
|
|
38
|
+
readiness: OidcProvisioningReadiness;
|
|
39
|
+
retry: 'none' | 'once_after_race';
|
|
40
|
+
resultCreated: 'created' | 'reused' | 'created_and_reused' | 'none';
|
|
41
|
+
createdRows: OidcProvisioningCreatedRows;
|
|
42
|
+
}
|
|
43
|
+
export type OidcProvisioningAdapterStatus = 'required' | 'sqlite_parity' | 'root_serialized' | 'not_applicable' | 'unsupported';
|
|
44
|
+
export interface OidcProvisioningAdapterExpectation {
|
|
45
|
+
status: OidcProvisioningAdapterStatus;
|
|
46
|
+
invariant?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface OidcProvisioningScenario {
|
|
49
|
+
id: string;
|
|
50
|
+
title: string;
|
|
51
|
+
identity: OidcProvisioningIdentityState;
|
|
52
|
+
email: OidcProvisioningEmailState;
|
|
53
|
+
verification: OidcProvisioningVerificationState;
|
|
54
|
+
resolver: OidcProvisioningResolverResult;
|
|
55
|
+
ownerAuthorization?: OidcProvisioningOwnerAuthorizationResult;
|
|
56
|
+
execution: OidcProvisioningExecutionState;
|
|
57
|
+
adapters: {
|
|
58
|
+
sqlite: OidcProvisioningAdapterExpectation;
|
|
59
|
+
postgres: OidcProvisioningAdapterExpectation;
|
|
60
|
+
duckdb: OidcProvisioningAdapterExpectation;
|
|
61
|
+
};
|
|
62
|
+
expectations: {
|
|
63
|
+
profiles?: OidcProvisioningSurfaceExpectation;
|
|
64
|
+
users?: OidcProvisioningSurfaceExpectation;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Typed scenario table consumed by both package suites.
|
|
69
|
+
*
|
|
70
|
+
* Row counts are deltas from the declared fixture state. A rejected row always
|
|
71
|
+
* declares zero User and session creation; the runners assert every delta.
|
|
72
|
+
*/
|
|
73
|
+
export declare const OIDC_PROVISIONING_DECISION_MATRIX: readonly [{
|
|
74
|
+
readonly id: "new-verified-no-match";
|
|
75
|
+
readonly title: "verified first callback creates a new canonical identity";
|
|
76
|
+
readonly identity: "none";
|
|
77
|
+
readonly email: "no_match";
|
|
78
|
+
readonly verification: "verified";
|
|
79
|
+
readonly resolver: "absent";
|
|
80
|
+
readonly execution: "first_callback";
|
|
81
|
+
readonly adapters: {
|
|
82
|
+
readonly sqlite: {
|
|
83
|
+
readonly status: "required";
|
|
84
|
+
};
|
|
85
|
+
readonly postgres: {
|
|
86
|
+
readonly status: "sqlite_parity";
|
|
87
|
+
};
|
|
88
|
+
readonly duckdb: {
|
|
89
|
+
readonly status: "root_serialized";
|
|
90
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
readonly expectations: {
|
|
94
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
95
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
96
|
+
};
|
|
97
|
+
}, {
|
|
98
|
+
readonly id: "new-missing-email";
|
|
99
|
+
readonly title: "Profile-only provisioning allows a missing email while Users reject";
|
|
100
|
+
readonly identity: "none";
|
|
101
|
+
readonly email: "missing";
|
|
102
|
+
readonly verification: "claim_missing";
|
|
103
|
+
readonly resolver: "absent";
|
|
104
|
+
readonly execution: "first_callback";
|
|
105
|
+
readonly adapters: {
|
|
106
|
+
readonly sqlite: {
|
|
107
|
+
readonly status: "required";
|
|
108
|
+
};
|
|
109
|
+
readonly postgres: {
|
|
110
|
+
readonly status: "sqlite_parity";
|
|
111
|
+
};
|
|
112
|
+
readonly duckdb: {
|
|
113
|
+
readonly status: "root_serialized";
|
|
114
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
readonly expectations: {
|
|
118
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
119
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
120
|
+
};
|
|
121
|
+
}, {
|
|
122
|
+
readonly id: "new-unverified-no-match";
|
|
123
|
+
readonly title: "Profile-only provisioning isolates an unverified email while Users reject";
|
|
124
|
+
readonly identity: "none";
|
|
125
|
+
readonly email: "no_match";
|
|
126
|
+
readonly verification: "unverified";
|
|
127
|
+
readonly resolver: "absent";
|
|
128
|
+
readonly execution: "first_callback";
|
|
129
|
+
readonly adapters: {
|
|
130
|
+
readonly sqlite: {
|
|
131
|
+
readonly status: "required";
|
|
132
|
+
};
|
|
133
|
+
readonly postgres: {
|
|
134
|
+
readonly status: "sqlite_parity";
|
|
135
|
+
};
|
|
136
|
+
readonly duckdb: {
|
|
137
|
+
readonly status: "root_serialized";
|
|
138
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
readonly expectations: {
|
|
142
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
143
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
144
|
+
};
|
|
145
|
+
}, {
|
|
146
|
+
readonly id: "new-unverified-email-match";
|
|
147
|
+
readonly title: "an unverified email never reuses an existing Profile";
|
|
148
|
+
readonly identity: "none";
|
|
149
|
+
readonly email: "one_unowned_global_person";
|
|
150
|
+
readonly verification: "unverified";
|
|
151
|
+
readonly resolver: "absent";
|
|
152
|
+
readonly execution: "first_callback";
|
|
153
|
+
readonly adapters: {
|
|
154
|
+
readonly sqlite: {
|
|
155
|
+
readonly status: "required";
|
|
156
|
+
};
|
|
157
|
+
readonly postgres: {
|
|
158
|
+
readonly status: "sqlite_parity";
|
|
159
|
+
};
|
|
160
|
+
readonly duckdb: {
|
|
161
|
+
readonly status: "root_serialized";
|
|
162
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
readonly expectations: {
|
|
166
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
167
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
168
|
+
};
|
|
169
|
+
}, {
|
|
170
|
+
readonly id: "new-verified-email-match";
|
|
171
|
+
readonly title: "only owner-aware User provisioning may reuse a safe email match";
|
|
172
|
+
readonly identity: "none";
|
|
173
|
+
readonly email: "one_unowned_global_person";
|
|
174
|
+
readonly verification: "verified";
|
|
175
|
+
readonly resolver: "absent";
|
|
176
|
+
readonly execution: "first_callback";
|
|
177
|
+
readonly adapters: {
|
|
178
|
+
readonly sqlite: {
|
|
179
|
+
readonly status: "required";
|
|
180
|
+
};
|
|
181
|
+
readonly postgres: {
|
|
182
|
+
readonly status: "sqlite_parity";
|
|
183
|
+
};
|
|
184
|
+
readonly duckdb: {
|
|
185
|
+
readonly status: "root_serialized";
|
|
186
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
187
|
+
};
|
|
188
|
+
};
|
|
189
|
+
readonly expectations: {
|
|
190
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
191
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
192
|
+
};
|
|
193
|
+
}, {
|
|
194
|
+
readonly id: "new-verified-tenant-collision";
|
|
195
|
+
readonly title: "tenant-scoped email collisions fail closed";
|
|
196
|
+
readonly identity: "none";
|
|
197
|
+
readonly email: "tenant_scoped_collision";
|
|
198
|
+
readonly verification: "verified";
|
|
199
|
+
readonly resolver: "absent";
|
|
200
|
+
readonly execution: "first_callback";
|
|
201
|
+
readonly adapters: {
|
|
202
|
+
readonly sqlite: {
|
|
203
|
+
readonly status: "required";
|
|
204
|
+
};
|
|
205
|
+
readonly postgres: {
|
|
206
|
+
readonly status: "sqlite_parity";
|
|
207
|
+
};
|
|
208
|
+
readonly duckdb: {
|
|
209
|
+
readonly status: "root_serialized";
|
|
210
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
211
|
+
};
|
|
212
|
+
};
|
|
213
|
+
readonly expectations: {
|
|
214
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
215
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
216
|
+
};
|
|
217
|
+
}, {
|
|
218
|
+
readonly id: "new-verified-non-person-collision";
|
|
219
|
+
readonly title: "non-Person email collisions fail closed";
|
|
220
|
+
readonly identity: "none";
|
|
221
|
+
readonly email: "non_person_collision";
|
|
222
|
+
readonly verification: "verified";
|
|
223
|
+
readonly resolver: "absent";
|
|
224
|
+
readonly execution: "first_callback";
|
|
225
|
+
readonly adapters: {
|
|
226
|
+
readonly sqlite: {
|
|
227
|
+
readonly status: "required";
|
|
228
|
+
};
|
|
229
|
+
readonly postgres: {
|
|
230
|
+
readonly status: "sqlite_parity";
|
|
231
|
+
};
|
|
232
|
+
readonly duckdb: {
|
|
233
|
+
readonly status: "root_serialized";
|
|
234
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
235
|
+
};
|
|
236
|
+
};
|
|
237
|
+
readonly expectations: {
|
|
238
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
239
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
240
|
+
};
|
|
241
|
+
}, {
|
|
242
|
+
readonly id: "new-verified-duplicate-email";
|
|
243
|
+
readonly title: "duplicate normalized Profile emails fail closed";
|
|
244
|
+
readonly identity: "none";
|
|
245
|
+
readonly email: "duplicate_normalized_profiles";
|
|
246
|
+
readonly verification: "verified";
|
|
247
|
+
readonly resolver: "absent";
|
|
248
|
+
readonly execution: "first_callback";
|
|
249
|
+
readonly adapters: {
|
|
250
|
+
readonly sqlite: {
|
|
251
|
+
readonly status: "required";
|
|
252
|
+
};
|
|
253
|
+
readonly postgres: {
|
|
254
|
+
readonly status: "sqlite_parity";
|
|
255
|
+
};
|
|
256
|
+
readonly duckdb: {
|
|
257
|
+
readonly status: "root_serialized";
|
|
258
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
259
|
+
};
|
|
260
|
+
};
|
|
261
|
+
readonly expectations: {
|
|
262
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
263
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
264
|
+
};
|
|
265
|
+
}, {
|
|
266
|
+
readonly id: "new-verified-owned-profile";
|
|
267
|
+
readonly title: "an already-owned email match cannot acquire another identity";
|
|
268
|
+
readonly identity: "none";
|
|
269
|
+
readonly email: "already_owned_global_person";
|
|
270
|
+
readonly verification: "verified";
|
|
271
|
+
readonly resolver: "absent";
|
|
272
|
+
readonly execution: "first_callback";
|
|
273
|
+
readonly adapters: {
|
|
274
|
+
readonly sqlite: {
|
|
275
|
+
readonly status: "required";
|
|
276
|
+
};
|
|
277
|
+
readonly postgres: {
|
|
278
|
+
readonly status: "sqlite_parity";
|
|
279
|
+
};
|
|
280
|
+
readonly duckdb: {
|
|
281
|
+
readonly status: "root_serialized";
|
|
282
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
283
|
+
};
|
|
284
|
+
};
|
|
285
|
+
readonly expectations: {
|
|
286
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
287
|
+
};
|
|
288
|
+
}, {
|
|
289
|
+
readonly id: "owner-authorized-first-binding";
|
|
290
|
+
readonly title: "explicit owner authorization binds a verified first identity to its pre-provisioned User";
|
|
291
|
+
readonly identity: "none";
|
|
292
|
+
readonly email: "already_owned_global_person";
|
|
293
|
+
readonly verification: "verified";
|
|
294
|
+
readonly resolver: "absent";
|
|
295
|
+
readonly ownerAuthorization: "matching_owner";
|
|
296
|
+
readonly execution: "first_callback";
|
|
297
|
+
readonly adapters: {
|
|
298
|
+
readonly sqlite: {
|
|
299
|
+
readonly status: "required";
|
|
300
|
+
};
|
|
301
|
+
readonly postgres: {
|
|
302
|
+
readonly status: "sqlite_parity";
|
|
303
|
+
};
|
|
304
|
+
readonly duckdb: {
|
|
305
|
+
readonly status: "root_serialized";
|
|
306
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
307
|
+
};
|
|
308
|
+
};
|
|
309
|
+
readonly expectations: {
|
|
310
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
311
|
+
};
|
|
312
|
+
}, {
|
|
313
|
+
readonly id: "owner-authorizer-rejects";
|
|
314
|
+
readonly title: "a null owner authorization rejects before identity creation";
|
|
315
|
+
readonly identity: "none";
|
|
316
|
+
readonly email: "already_owned_global_person";
|
|
317
|
+
readonly verification: "verified";
|
|
318
|
+
readonly resolver: "absent";
|
|
319
|
+
readonly ownerAuthorization: "null";
|
|
320
|
+
readonly execution: "first_callback";
|
|
321
|
+
readonly adapters: {
|
|
322
|
+
readonly sqlite: {
|
|
323
|
+
readonly status: "required";
|
|
324
|
+
};
|
|
325
|
+
readonly postgres: {
|
|
326
|
+
readonly status: "sqlite_parity";
|
|
327
|
+
};
|
|
328
|
+
readonly duckdb: {
|
|
329
|
+
readonly status: "root_serialized";
|
|
330
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
331
|
+
};
|
|
332
|
+
};
|
|
333
|
+
readonly expectations: {
|
|
334
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
335
|
+
};
|
|
336
|
+
}, {
|
|
337
|
+
readonly id: "owner-authorized-unverified";
|
|
338
|
+
readonly title: "owner authorization never overrides an explicitly unverified email";
|
|
339
|
+
readonly identity: "none";
|
|
340
|
+
readonly email: "already_owned_global_person";
|
|
341
|
+
readonly verification: "unverified";
|
|
342
|
+
readonly resolver: "absent";
|
|
343
|
+
readonly ownerAuthorization: "matching_owner";
|
|
344
|
+
readonly execution: "first_callback";
|
|
345
|
+
readonly adapters: {
|
|
346
|
+
readonly sqlite: {
|
|
347
|
+
readonly status: "required";
|
|
348
|
+
};
|
|
349
|
+
readonly postgres: {
|
|
350
|
+
readonly status: "sqlite_parity";
|
|
351
|
+
};
|
|
352
|
+
readonly duckdb: {
|
|
353
|
+
readonly status: "root_serialized";
|
|
354
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
355
|
+
};
|
|
356
|
+
};
|
|
357
|
+
readonly expectations: {
|
|
358
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
359
|
+
};
|
|
360
|
+
}, {
|
|
361
|
+
readonly id: "owner-authorized-missing-verification";
|
|
362
|
+
readonly title: "owner authorization requires an explicit true verification claim";
|
|
363
|
+
readonly identity: "none";
|
|
364
|
+
readonly email: "already_owned_global_person";
|
|
365
|
+
readonly verification: "claim_missing";
|
|
366
|
+
readonly resolver: "absent";
|
|
367
|
+
readonly ownerAuthorization: "matching_owner";
|
|
368
|
+
readonly execution: "first_callback";
|
|
369
|
+
readonly adapters: {
|
|
370
|
+
readonly sqlite: {
|
|
371
|
+
readonly status: "required";
|
|
372
|
+
};
|
|
373
|
+
readonly postgres: {
|
|
374
|
+
readonly status: "sqlite_parity";
|
|
375
|
+
};
|
|
376
|
+
readonly duckdb: {
|
|
377
|
+
readonly status: "root_serialized";
|
|
378
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
379
|
+
};
|
|
380
|
+
};
|
|
381
|
+
readonly expectations: {
|
|
382
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
383
|
+
};
|
|
384
|
+
}, {
|
|
385
|
+
readonly id: "owner-authorized-profile-email-mismatch";
|
|
386
|
+
readonly title: "an authorized Profile must match the verified claim email";
|
|
387
|
+
readonly identity: "none";
|
|
388
|
+
readonly email: "different_global_person";
|
|
389
|
+
readonly verification: "verified";
|
|
390
|
+
readonly resolver: "absent";
|
|
391
|
+
readonly ownerAuthorization: "matching_owner";
|
|
392
|
+
readonly execution: "first_callback";
|
|
393
|
+
readonly adapters: {
|
|
394
|
+
readonly sqlite: {
|
|
395
|
+
readonly status: "required";
|
|
396
|
+
};
|
|
397
|
+
readonly postgres: {
|
|
398
|
+
readonly status: "sqlite_parity";
|
|
399
|
+
};
|
|
400
|
+
readonly duckdb: {
|
|
401
|
+
readonly status: "root_serialized";
|
|
402
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
403
|
+
};
|
|
404
|
+
};
|
|
405
|
+
readonly expectations: {
|
|
406
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
407
|
+
};
|
|
408
|
+
}, {
|
|
409
|
+
readonly id: "owner-authorized-user-email-mismatch";
|
|
410
|
+
readonly title: "the authorized owner must match the verified claim email";
|
|
411
|
+
readonly identity: "none";
|
|
412
|
+
readonly email: "already_owned_global_person";
|
|
413
|
+
readonly verification: "verified";
|
|
414
|
+
readonly resolver: "absent";
|
|
415
|
+
readonly ownerAuthorization: "matching_owner";
|
|
416
|
+
readonly execution: "first_callback";
|
|
417
|
+
readonly adapters: {
|
|
418
|
+
readonly sqlite: {
|
|
419
|
+
readonly status: "required";
|
|
420
|
+
};
|
|
421
|
+
readonly postgres: {
|
|
422
|
+
readonly status: "sqlite_parity";
|
|
423
|
+
};
|
|
424
|
+
readonly duckdb: {
|
|
425
|
+
readonly status: "root_serialized";
|
|
426
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
427
|
+
};
|
|
428
|
+
};
|
|
429
|
+
readonly expectations: {
|
|
430
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
431
|
+
};
|
|
432
|
+
}, {
|
|
433
|
+
readonly id: "owner-authorized-tenant-profile";
|
|
434
|
+
readonly title: "owner authorization cannot select a tenant-scoped Profile";
|
|
435
|
+
readonly identity: "none";
|
|
436
|
+
readonly email: "tenant_scoped_collision";
|
|
437
|
+
readonly verification: "verified";
|
|
438
|
+
readonly resolver: "absent";
|
|
439
|
+
readonly ownerAuthorization: "matching_owner";
|
|
440
|
+
readonly execution: "first_callback";
|
|
441
|
+
readonly adapters: {
|
|
442
|
+
readonly sqlite: {
|
|
443
|
+
readonly status: "required";
|
|
444
|
+
};
|
|
445
|
+
readonly postgres: {
|
|
446
|
+
readonly status: "sqlite_parity";
|
|
447
|
+
};
|
|
448
|
+
readonly duckdb: {
|
|
449
|
+
readonly status: "root_serialized";
|
|
450
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
451
|
+
};
|
|
452
|
+
};
|
|
453
|
+
readonly expectations: {
|
|
454
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
455
|
+
};
|
|
456
|
+
}, {
|
|
457
|
+
readonly id: "owner-authorized-non-person";
|
|
458
|
+
readonly title: "owner authorization cannot select a non-Person Profile";
|
|
459
|
+
readonly identity: "none";
|
|
460
|
+
readonly email: "non_person_collision";
|
|
461
|
+
readonly verification: "verified";
|
|
462
|
+
readonly resolver: "absent";
|
|
463
|
+
readonly ownerAuthorization: "matching_owner";
|
|
464
|
+
readonly execution: "first_callback";
|
|
465
|
+
readonly adapters: {
|
|
466
|
+
readonly sqlite: {
|
|
467
|
+
readonly status: "required";
|
|
468
|
+
};
|
|
469
|
+
readonly postgres: {
|
|
470
|
+
readonly status: "sqlite_parity";
|
|
471
|
+
};
|
|
472
|
+
readonly duckdb: {
|
|
473
|
+
readonly status: "root_serialized";
|
|
474
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
475
|
+
};
|
|
476
|
+
};
|
|
477
|
+
readonly expectations: {
|
|
478
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
479
|
+
};
|
|
480
|
+
}, {
|
|
481
|
+
readonly id: "owner-authorized-ambiguous-profile";
|
|
482
|
+
readonly title: "owner authorization cannot select an ambiguous Profile email";
|
|
483
|
+
readonly identity: "none";
|
|
484
|
+
readonly email: "duplicate_normalized_profiles";
|
|
485
|
+
readonly verification: "verified";
|
|
486
|
+
readonly resolver: "absent";
|
|
487
|
+
readonly ownerAuthorization: "matching_owner";
|
|
488
|
+
readonly execution: "first_callback";
|
|
489
|
+
readonly adapters: {
|
|
490
|
+
readonly sqlite: {
|
|
491
|
+
readonly status: "required";
|
|
492
|
+
};
|
|
493
|
+
readonly postgres: {
|
|
494
|
+
readonly status: "sqlite_parity";
|
|
495
|
+
};
|
|
496
|
+
readonly duckdb: {
|
|
497
|
+
readonly status: "root_serialized";
|
|
498
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
499
|
+
};
|
|
500
|
+
};
|
|
501
|
+
readonly expectations: {
|
|
502
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
503
|
+
};
|
|
504
|
+
}, {
|
|
505
|
+
readonly id: "owner-authorized-no-owner";
|
|
506
|
+
readonly title: "owner authorization requires exactly one Profile owner";
|
|
507
|
+
readonly identity: "none";
|
|
508
|
+
readonly email: "one_unowned_global_person";
|
|
509
|
+
readonly verification: "verified";
|
|
510
|
+
readonly resolver: "absent";
|
|
511
|
+
readonly ownerAuthorization: "no_owner";
|
|
512
|
+
readonly execution: "first_callback";
|
|
513
|
+
readonly adapters: {
|
|
514
|
+
readonly sqlite: {
|
|
515
|
+
readonly status: "required";
|
|
516
|
+
};
|
|
517
|
+
readonly postgres: {
|
|
518
|
+
readonly status: "sqlite_parity";
|
|
519
|
+
};
|
|
520
|
+
readonly duckdb: {
|
|
521
|
+
readonly status: "root_serialized";
|
|
522
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
523
|
+
};
|
|
524
|
+
};
|
|
525
|
+
readonly expectations: {
|
|
526
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
527
|
+
};
|
|
528
|
+
}, {
|
|
529
|
+
readonly id: "owner-authorized-multiple-owners";
|
|
530
|
+
readonly title: "owner authorization rejects legacy multiple Profile owners";
|
|
531
|
+
readonly identity: "none";
|
|
532
|
+
readonly email: "already_owned_global_person";
|
|
533
|
+
readonly verification: "verified";
|
|
534
|
+
readonly resolver: "absent";
|
|
535
|
+
readonly ownerAuthorization: "multiple_owners";
|
|
536
|
+
readonly execution: "first_callback";
|
|
537
|
+
readonly adapters: {
|
|
538
|
+
readonly sqlite: {
|
|
539
|
+
readonly status: "required";
|
|
540
|
+
};
|
|
541
|
+
readonly postgres: {
|
|
542
|
+
readonly status: "sqlite_parity";
|
|
543
|
+
};
|
|
544
|
+
readonly duckdb: {
|
|
545
|
+
readonly status: "root_serialized";
|
|
546
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
547
|
+
};
|
|
548
|
+
};
|
|
549
|
+
readonly expectations: {
|
|
550
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
551
|
+
};
|
|
552
|
+
}, {
|
|
553
|
+
readonly id: "owner-authorized-wrong-user";
|
|
554
|
+
readonly title: "owner authorization rejects a User that does not own the Profile";
|
|
555
|
+
readonly identity: "none";
|
|
556
|
+
readonly email: "already_owned_global_person";
|
|
557
|
+
readonly verification: "verified";
|
|
558
|
+
readonly resolver: "absent";
|
|
559
|
+
readonly ownerAuthorization: "wrong_user";
|
|
560
|
+
readonly execution: "first_callback";
|
|
561
|
+
readonly adapters: {
|
|
562
|
+
readonly sqlite: {
|
|
563
|
+
readonly status: "required";
|
|
564
|
+
};
|
|
565
|
+
readonly postgres: {
|
|
566
|
+
readonly status: "sqlite_parity";
|
|
567
|
+
};
|
|
568
|
+
readonly duckdb: {
|
|
569
|
+
readonly status: "root_serialized";
|
|
570
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
571
|
+
};
|
|
572
|
+
};
|
|
573
|
+
readonly expectations: {
|
|
574
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
575
|
+
};
|
|
576
|
+
}, {
|
|
577
|
+
readonly id: "owner-authorized-conflicting-identity";
|
|
578
|
+
readonly title: "owner authorization cannot rebind an exact conflicting identity";
|
|
579
|
+
readonly identity: "exact_global_person";
|
|
580
|
+
readonly email: "different_global_person";
|
|
581
|
+
readonly verification: "verified";
|
|
582
|
+
readonly resolver: "absent";
|
|
583
|
+
readonly ownerAuthorization: "matching_owner";
|
|
584
|
+
readonly execution: "exact_subsequent_callback";
|
|
585
|
+
readonly adapters: {
|
|
586
|
+
readonly sqlite: {
|
|
587
|
+
readonly status: "required";
|
|
588
|
+
};
|
|
589
|
+
readonly postgres: {
|
|
590
|
+
readonly status: "sqlite_parity";
|
|
591
|
+
};
|
|
592
|
+
readonly duckdb: {
|
|
593
|
+
readonly status: "root_serialized";
|
|
594
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
595
|
+
};
|
|
596
|
+
};
|
|
597
|
+
readonly expectations: {
|
|
598
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
599
|
+
};
|
|
600
|
+
}, {
|
|
601
|
+
readonly id: "owner-authorized-concurrent-callbacks";
|
|
602
|
+
readonly title: "concurrent authorized callbacks converge on one existing User and identity";
|
|
603
|
+
readonly identity: "none";
|
|
604
|
+
readonly email: "already_owned_global_person";
|
|
605
|
+
readonly verification: "verified";
|
|
606
|
+
readonly resolver: "absent";
|
|
607
|
+
readonly ownerAuthorization: "matching_owner";
|
|
608
|
+
readonly execution: "concurrent_authorized_callbacks";
|
|
609
|
+
readonly adapters: {
|
|
610
|
+
readonly sqlite: {
|
|
611
|
+
readonly status: "required";
|
|
612
|
+
};
|
|
613
|
+
readonly postgres: {
|
|
614
|
+
readonly status: "required";
|
|
615
|
+
};
|
|
616
|
+
readonly duckdb: {
|
|
617
|
+
readonly status: "root_serialized";
|
|
618
|
+
readonly invariant: "DuckDB uses root-handle serialization instead of overlapping independent transactions.";
|
|
619
|
+
};
|
|
620
|
+
};
|
|
621
|
+
readonly expectations: {
|
|
622
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
623
|
+
};
|
|
624
|
+
}, {
|
|
625
|
+
readonly id: "owner-authorizer-durable-arbiter-retry";
|
|
626
|
+
readonly title: "a durable race retry invokes the idempotent owner authorizer again";
|
|
627
|
+
readonly identity: "none";
|
|
628
|
+
readonly email: "already_owned_global_person";
|
|
629
|
+
readonly verification: "verified";
|
|
630
|
+
readonly resolver: "absent";
|
|
631
|
+
readonly ownerAuthorization: "matching_owner";
|
|
632
|
+
readonly execution: "durable_arbiter_retry";
|
|
633
|
+
readonly adapters: {
|
|
634
|
+
readonly sqlite: {
|
|
635
|
+
readonly status: "required";
|
|
636
|
+
};
|
|
637
|
+
readonly postgres: {
|
|
638
|
+
readonly status: "required";
|
|
639
|
+
};
|
|
640
|
+
readonly duckdb: {
|
|
641
|
+
readonly status: "root_serialized";
|
|
642
|
+
readonly invariant: "DuckDB uses root-handle serialization instead of overlapping independent transactions.";
|
|
643
|
+
};
|
|
644
|
+
};
|
|
645
|
+
readonly expectations: {
|
|
646
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
647
|
+
};
|
|
648
|
+
}, {
|
|
649
|
+
readonly id: "exact-safe-owned";
|
|
650
|
+
readonly title: "an exact safe identity reuses its canonical Profile and User";
|
|
651
|
+
readonly identity: "exact_global_person";
|
|
652
|
+
readonly email: "already_owned_global_person";
|
|
653
|
+
readonly verification: "verified";
|
|
654
|
+
readonly resolver: "absent";
|
|
655
|
+
readonly execution: "exact_subsequent_callback";
|
|
656
|
+
readonly adapters: {
|
|
657
|
+
readonly sqlite: {
|
|
658
|
+
readonly status: "required";
|
|
659
|
+
};
|
|
660
|
+
readonly postgres: {
|
|
661
|
+
readonly status: "sqlite_parity";
|
|
662
|
+
};
|
|
663
|
+
readonly duckdb: {
|
|
664
|
+
readonly status: "root_serialized";
|
|
665
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
666
|
+
};
|
|
667
|
+
};
|
|
668
|
+
readonly expectations: {
|
|
669
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
670
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
671
|
+
};
|
|
672
|
+
}, {
|
|
673
|
+
readonly id: "exact-safe-unowned";
|
|
674
|
+
readonly title: "an exact safe identity without an owner may create one User";
|
|
675
|
+
readonly identity: "exact_global_person";
|
|
676
|
+
readonly email: "one_unowned_global_person";
|
|
677
|
+
readonly verification: "verified";
|
|
678
|
+
readonly resolver: "absent";
|
|
679
|
+
readonly execution: "exact_subsequent_callback";
|
|
680
|
+
readonly adapters: {
|
|
681
|
+
readonly sqlite: {
|
|
682
|
+
readonly status: "required";
|
|
683
|
+
};
|
|
684
|
+
readonly postgres: {
|
|
685
|
+
readonly status: "sqlite_parity";
|
|
686
|
+
};
|
|
687
|
+
readonly duckdb: {
|
|
688
|
+
readonly status: "root_serialized";
|
|
689
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
690
|
+
};
|
|
691
|
+
};
|
|
692
|
+
readonly expectations: {
|
|
693
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
694
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
695
|
+
};
|
|
696
|
+
}, {
|
|
697
|
+
readonly id: "exact-legacy-tenant-profile";
|
|
698
|
+
readonly title: "Profile-only legacy exact reuse succeeds while Users fail closed";
|
|
699
|
+
readonly identity: "exact_legacy_tenant_profile";
|
|
700
|
+
readonly email: "tenant_scoped_collision";
|
|
701
|
+
readonly verification: "verified";
|
|
702
|
+
readonly resolver: "absent";
|
|
703
|
+
readonly execution: "exact_subsequent_callback";
|
|
704
|
+
readonly adapters: {
|
|
705
|
+
readonly sqlite: {
|
|
706
|
+
readonly status: "required";
|
|
707
|
+
};
|
|
708
|
+
readonly postgres: {
|
|
709
|
+
readonly status: "sqlite_parity";
|
|
710
|
+
};
|
|
711
|
+
readonly duckdb: {
|
|
712
|
+
readonly status: "root_serialized";
|
|
713
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
714
|
+
};
|
|
715
|
+
};
|
|
716
|
+
readonly expectations: {
|
|
717
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
718
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
719
|
+
};
|
|
720
|
+
}, {
|
|
721
|
+
readonly id: "exact-legacy-non-person-profile";
|
|
722
|
+
readonly title: "Profile-only non-Person exact reuse succeeds while Users fail closed";
|
|
723
|
+
readonly identity: "exact_legacy_non_person_profile";
|
|
724
|
+
readonly email: "non_person_collision";
|
|
725
|
+
readonly verification: "verified";
|
|
726
|
+
readonly resolver: "absent";
|
|
727
|
+
readonly execution: "exact_subsequent_callback";
|
|
728
|
+
readonly adapters: {
|
|
729
|
+
readonly sqlite: {
|
|
730
|
+
readonly status: "required";
|
|
731
|
+
};
|
|
732
|
+
readonly postgres: {
|
|
733
|
+
readonly status: "sqlite_parity";
|
|
734
|
+
};
|
|
735
|
+
readonly duckdb: {
|
|
736
|
+
readonly status: "root_serialized";
|
|
737
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
738
|
+
};
|
|
739
|
+
};
|
|
740
|
+
readonly expectations: {
|
|
741
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
742
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
743
|
+
};
|
|
744
|
+
}, {
|
|
745
|
+
readonly id: "exact-ambiguous-legacy-links";
|
|
746
|
+
readonly title: "ambiguous legacy exact identities fail closed";
|
|
747
|
+
readonly identity: "exact_ambiguous_legacy_links";
|
|
748
|
+
readonly email: "one_unowned_global_person";
|
|
749
|
+
readonly verification: "verified";
|
|
750
|
+
readonly resolver: "absent";
|
|
751
|
+
readonly execution: "exact_subsequent_callback";
|
|
752
|
+
readonly adapters: {
|
|
753
|
+
readonly sqlite: {
|
|
754
|
+
readonly status: "required";
|
|
755
|
+
};
|
|
756
|
+
readonly postgres: {
|
|
757
|
+
readonly status: "sqlite_parity";
|
|
758
|
+
};
|
|
759
|
+
readonly duckdb: {
|
|
760
|
+
readonly status: "root_serialized";
|
|
761
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
762
|
+
};
|
|
763
|
+
};
|
|
764
|
+
readonly expectations: {
|
|
765
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
766
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
767
|
+
};
|
|
768
|
+
}, {
|
|
769
|
+
readonly id: "exact-missing-profile";
|
|
770
|
+
readonly title: "an exact identity with a missing Profile fails closed";
|
|
771
|
+
readonly identity: "exact_missing_profile";
|
|
772
|
+
readonly email: "no_match";
|
|
773
|
+
readonly verification: "verified";
|
|
774
|
+
readonly resolver: "absent";
|
|
775
|
+
readonly execution: "exact_subsequent_callback";
|
|
776
|
+
readonly adapters: {
|
|
777
|
+
readonly sqlite: {
|
|
778
|
+
readonly status: "required";
|
|
779
|
+
};
|
|
780
|
+
readonly postgres: {
|
|
781
|
+
readonly status: "sqlite_parity";
|
|
782
|
+
};
|
|
783
|
+
readonly duckdb: {
|
|
784
|
+
readonly status: "root_serialized";
|
|
785
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
786
|
+
};
|
|
787
|
+
};
|
|
788
|
+
readonly expectations: {
|
|
789
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
790
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
791
|
+
};
|
|
792
|
+
}, {
|
|
793
|
+
readonly id: "resolver-undefined-new";
|
|
794
|
+
readonly title: "undefined resolver output selects the secure default";
|
|
795
|
+
readonly identity: "none";
|
|
796
|
+
readonly email: "no_match";
|
|
797
|
+
readonly verification: "verified";
|
|
798
|
+
readonly resolver: "undefined";
|
|
799
|
+
readonly execution: "first_callback";
|
|
800
|
+
readonly adapters: {
|
|
801
|
+
readonly sqlite: {
|
|
802
|
+
readonly status: "required";
|
|
803
|
+
};
|
|
804
|
+
readonly postgres: {
|
|
805
|
+
readonly status: "sqlite_parity";
|
|
806
|
+
};
|
|
807
|
+
readonly duckdb: {
|
|
808
|
+
readonly status: "root_serialized";
|
|
809
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
810
|
+
};
|
|
811
|
+
};
|
|
812
|
+
readonly expectations: {
|
|
813
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
814
|
+
};
|
|
815
|
+
}, {
|
|
816
|
+
readonly id: "resolver-null-new";
|
|
817
|
+
readonly title: "null resolver output rejects before provisioning";
|
|
818
|
+
readonly identity: "none";
|
|
819
|
+
readonly email: "no_match";
|
|
820
|
+
readonly verification: "verified";
|
|
821
|
+
readonly resolver: "null";
|
|
822
|
+
readonly execution: "first_callback";
|
|
823
|
+
readonly adapters: {
|
|
824
|
+
readonly sqlite: {
|
|
825
|
+
readonly status: "required";
|
|
826
|
+
};
|
|
827
|
+
readonly postgres: {
|
|
828
|
+
readonly status: "sqlite_parity";
|
|
829
|
+
};
|
|
830
|
+
readonly duckdb: {
|
|
831
|
+
readonly status: "root_serialized";
|
|
832
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
833
|
+
};
|
|
834
|
+
};
|
|
835
|
+
readonly expectations: {
|
|
836
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
837
|
+
};
|
|
838
|
+
}, {
|
|
839
|
+
readonly id: "resolver-same-new";
|
|
840
|
+
readonly title: "a resolver may select the same safe canonical Profile for a new identity";
|
|
841
|
+
readonly identity: "none";
|
|
842
|
+
readonly email: "one_unowned_global_person";
|
|
843
|
+
readonly verification: "verified";
|
|
844
|
+
readonly resolver: "same_profile";
|
|
845
|
+
readonly execution: "first_callback";
|
|
846
|
+
readonly adapters: {
|
|
847
|
+
readonly sqlite: {
|
|
848
|
+
readonly status: "required";
|
|
849
|
+
};
|
|
850
|
+
readonly postgres: {
|
|
851
|
+
readonly status: "sqlite_parity";
|
|
852
|
+
};
|
|
853
|
+
readonly duckdb: {
|
|
854
|
+
readonly status: "root_serialized";
|
|
855
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
856
|
+
};
|
|
857
|
+
};
|
|
858
|
+
readonly expectations: {
|
|
859
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
860
|
+
};
|
|
861
|
+
}, {
|
|
862
|
+
readonly id: "resolver-owned-new";
|
|
863
|
+
readonly title: "a resolver-selected owned Profile fails closed";
|
|
864
|
+
readonly identity: "none";
|
|
865
|
+
readonly email: "already_owned_global_person";
|
|
866
|
+
readonly verification: "verified";
|
|
867
|
+
readonly resolver: "owned_profile";
|
|
868
|
+
readonly execution: "first_callback";
|
|
869
|
+
readonly adapters: {
|
|
870
|
+
readonly sqlite: {
|
|
871
|
+
readonly status: "required";
|
|
872
|
+
};
|
|
873
|
+
readonly postgres: {
|
|
874
|
+
readonly status: "sqlite_parity";
|
|
875
|
+
};
|
|
876
|
+
readonly duckdb: {
|
|
877
|
+
readonly status: "root_serialized";
|
|
878
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
879
|
+
};
|
|
880
|
+
};
|
|
881
|
+
readonly expectations: {
|
|
882
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
883
|
+
};
|
|
884
|
+
}, {
|
|
885
|
+
readonly id: "resolver-same-exact";
|
|
886
|
+
readonly title: "a resolver may confirm but not rebind an exact identity";
|
|
887
|
+
readonly identity: "exact_global_person";
|
|
888
|
+
readonly email: "already_owned_global_person";
|
|
889
|
+
readonly verification: "verified";
|
|
890
|
+
readonly resolver: "same_profile";
|
|
891
|
+
readonly execution: "exact_subsequent_callback";
|
|
892
|
+
readonly adapters: {
|
|
893
|
+
readonly sqlite: {
|
|
894
|
+
readonly status: "required";
|
|
895
|
+
};
|
|
896
|
+
readonly postgres: {
|
|
897
|
+
readonly status: "sqlite_parity";
|
|
898
|
+
};
|
|
899
|
+
readonly duckdb: {
|
|
900
|
+
readonly status: "root_serialized";
|
|
901
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
902
|
+
};
|
|
903
|
+
};
|
|
904
|
+
readonly expectations: {
|
|
905
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
906
|
+
};
|
|
907
|
+
}, {
|
|
908
|
+
readonly id: "resolver-different-exact";
|
|
909
|
+
readonly title: "a resolver cannot rebind an exact identity to a different Profile";
|
|
910
|
+
readonly identity: "exact_global_person";
|
|
911
|
+
readonly email: "different_global_person";
|
|
912
|
+
readonly verification: "verified";
|
|
913
|
+
readonly resolver: "different_profile";
|
|
914
|
+
readonly execution: "exact_subsequent_callback";
|
|
915
|
+
readonly adapters: {
|
|
916
|
+
readonly sqlite: {
|
|
917
|
+
readonly status: "required";
|
|
918
|
+
};
|
|
919
|
+
readonly postgres: {
|
|
920
|
+
readonly status: "sqlite_parity";
|
|
921
|
+
};
|
|
922
|
+
readonly duckdb: {
|
|
923
|
+
readonly status: "root_serialized";
|
|
924
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
925
|
+
};
|
|
926
|
+
};
|
|
927
|
+
readonly expectations: {
|
|
928
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
929
|
+
};
|
|
930
|
+
}, {
|
|
931
|
+
readonly id: "resolver-null-exact";
|
|
932
|
+
readonly title: "null resolver output rejects exact identity reuse";
|
|
933
|
+
readonly identity: "exact_global_person";
|
|
934
|
+
readonly email: "already_owned_global_person";
|
|
935
|
+
readonly verification: "verified";
|
|
936
|
+
readonly resolver: "null";
|
|
937
|
+
readonly execution: "exact_subsequent_callback";
|
|
938
|
+
readonly adapters: {
|
|
939
|
+
readonly sqlite: {
|
|
940
|
+
readonly status: "required";
|
|
941
|
+
};
|
|
942
|
+
readonly postgres: {
|
|
943
|
+
readonly status: "sqlite_parity";
|
|
944
|
+
};
|
|
945
|
+
readonly duckdb: {
|
|
946
|
+
readonly status: "root_serialized";
|
|
947
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
948
|
+
};
|
|
949
|
+
};
|
|
950
|
+
readonly expectations: {
|
|
951
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
952
|
+
};
|
|
953
|
+
}, {
|
|
954
|
+
readonly id: "resolver-throws-new";
|
|
955
|
+
readonly title: "resolver exceptions roll back without authentication state";
|
|
956
|
+
readonly identity: "none";
|
|
957
|
+
readonly email: "no_match";
|
|
958
|
+
readonly verification: "verified";
|
|
959
|
+
readonly resolver: "throws";
|
|
960
|
+
readonly execution: "first_callback";
|
|
961
|
+
readonly adapters: {
|
|
962
|
+
readonly sqlite: {
|
|
963
|
+
readonly status: "required";
|
|
964
|
+
};
|
|
965
|
+
readonly postgres: {
|
|
966
|
+
readonly status: "sqlite_parity";
|
|
967
|
+
};
|
|
968
|
+
readonly duckdb: {
|
|
969
|
+
readonly status: "root_serialized";
|
|
970
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
971
|
+
};
|
|
972
|
+
};
|
|
973
|
+
readonly expectations: {
|
|
974
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
975
|
+
};
|
|
976
|
+
}, {
|
|
977
|
+
readonly id: "profile-readiness-missing";
|
|
978
|
+
readonly title: "email-based lookup fails until Profile email keys are ready";
|
|
979
|
+
readonly identity: "none";
|
|
980
|
+
readonly email: "one_unowned_global_person";
|
|
981
|
+
readonly verification: "verified";
|
|
982
|
+
readonly resolver: "absent";
|
|
983
|
+
readonly execution: "first_callback";
|
|
984
|
+
readonly adapters: {
|
|
985
|
+
readonly sqlite: {
|
|
986
|
+
readonly status: "required";
|
|
987
|
+
};
|
|
988
|
+
readonly postgres: {
|
|
989
|
+
readonly status: "sqlite_parity";
|
|
990
|
+
};
|
|
991
|
+
readonly duckdb: {
|
|
992
|
+
readonly status: "root_serialized";
|
|
993
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
994
|
+
};
|
|
995
|
+
};
|
|
996
|
+
readonly expectations: {
|
|
997
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
998
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
999
|
+
};
|
|
1000
|
+
}, {
|
|
1001
|
+
readonly id: "user-readiness-missing";
|
|
1002
|
+
readonly title: "User creation fails until User email keys are ready";
|
|
1003
|
+
readonly identity: "none";
|
|
1004
|
+
readonly email: "no_match";
|
|
1005
|
+
readonly verification: "verified";
|
|
1006
|
+
readonly resolver: "absent";
|
|
1007
|
+
readonly execution: "first_callback";
|
|
1008
|
+
readonly adapters: {
|
|
1009
|
+
readonly sqlite: {
|
|
1010
|
+
readonly status: "required";
|
|
1011
|
+
};
|
|
1012
|
+
readonly postgres: {
|
|
1013
|
+
readonly status: "sqlite_parity";
|
|
1014
|
+
};
|
|
1015
|
+
readonly duckdb: {
|
|
1016
|
+
readonly status: "root_serialized";
|
|
1017
|
+
readonly invariant: "DuckDB provisioning is supported through a root database and is serialized per database URL.";
|
|
1018
|
+
};
|
|
1019
|
+
};
|
|
1020
|
+
readonly expectations: {
|
|
1021
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
1022
|
+
};
|
|
1023
|
+
}, {
|
|
1024
|
+
readonly id: "concurrent-winner-and-observer";
|
|
1025
|
+
readonly title: "both concurrent callbacks run policy and converge on the winner";
|
|
1026
|
+
readonly identity: "none";
|
|
1027
|
+
readonly email: "no_match";
|
|
1028
|
+
readonly verification: "verified";
|
|
1029
|
+
readonly resolver: "undefined";
|
|
1030
|
+
readonly execution: "concurrent_winner_and_observer";
|
|
1031
|
+
readonly adapters: {
|
|
1032
|
+
readonly sqlite: {
|
|
1033
|
+
readonly status: "required";
|
|
1034
|
+
};
|
|
1035
|
+
readonly postgres: {
|
|
1036
|
+
readonly status: "required";
|
|
1037
|
+
};
|
|
1038
|
+
readonly duckdb: {
|
|
1039
|
+
readonly status: "root_serialized";
|
|
1040
|
+
readonly invariant: "DuckDB uses root-handle serialization instead of overlapping independent transactions.";
|
|
1041
|
+
};
|
|
1042
|
+
};
|
|
1043
|
+
readonly expectations: {
|
|
1044
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
1045
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
1046
|
+
};
|
|
1047
|
+
}, {
|
|
1048
|
+
readonly id: "concurrent-email-competitors";
|
|
1049
|
+
readonly title: "only one concurrent subject may claim a verified email";
|
|
1050
|
+
readonly identity: "none";
|
|
1051
|
+
readonly email: "no_match";
|
|
1052
|
+
readonly verification: "verified";
|
|
1053
|
+
readonly resolver: "undefined";
|
|
1054
|
+
readonly execution: "concurrent_email_competitors";
|
|
1055
|
+
readonly adapters: {
|
|
1056
|
+
readonly sqlite: {
|
|
1057
|
+
readonly status: "required";
|
|
1058
|
+
};
|
|
1059
|
+
readonly postgres: {
|
|
1060
|
+
readonly status: "required";
|
|
1061
|
+
};
|
|
1062
|
+
readonly duckdb: {
|
|
1063
|
+
readonly status: "root_serialized";
|
|
1064
|
+
readonly invariant: "DuckDB uses root-handle serialization instead of overlapping independent transactions.";
|
|
1065
|
+
};
|
|
1066
|
+
};
|
|
1067
|
+
readonly expectations: {
|
|
1068
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
1069
|
+
};
|
|
1070
|
+
}, {
|
|
1071
|
+
readonly id: "resolver-durable-arbiter-retry";
|
|
1072
|
+
readonly title: "a durable race retry invokes the idempotent resolver again";
|
|
1073
|
+
readonly identity: "none";
|
|
1074
|
+
readonly email: "no_match";
|
|
1075
|
+
readonly verification: "verified";
|
|
1076
|
+
readonly resolver: "undefined";
|
|
1077
|
+
readonly execution: "durable_arbiter_retry";
|
|
1078
|
+
readonly adapters: {
|
|
1079
|
+
readonly sqlite: {
|
|
1080
|
+
readonly status: "required";
|
|
1081
|
+
};
|
|
1082
|
+
readonly postgres: {
|
|
1083
|
+
readonly status: "required";
|
|
1084
|
+
};
|
|
1085
|
+
readonly duckdb: {
|
|
1086
|
+
readonly status: "root_serialized";
|
|
1087
|
+
readonly invariant: "DuckDB uses root-handle serialization instead of overlapping independent transactions.";
|
|
1088
|
+
};
|
|
1089
|
+
};
|
|
1090
|
+
readonly expectations: {
|
|
1091
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
1092
|
+
};
|
|
1093
|
+
}, {
|
|
1094
|
+
readonly id: "caller-owned-transaction";
|
|
1095
|
+
readonly title: "caller-owned transactions use a savepoint where supported";
|
|
1096
|
+
readonly identity: "none";
|
|
1097
|
+
readonly email: "no_match";
|
|
1098
|
+
readonly verification: "verified";
|
|
1099
|
+
readonly resolver: "undefined";
|
|
1100
|
+
readonly execution: "caller_owned_transaction";
|
|
1101
|
+
readonly adapters: {
|
|
1102
|
+
readonly sqlite: {
|
|
1103
|
+
readonly status: "required";
|
|
1104
|
+
};
|
|
1105
|
+
readonly postgres: {
|
|
1106
|
+
readonly status: "required";
|
|
1107
|
+
};
|
|
1108
|
+
readonly duckdb: {
|
|
1109
|
+
readonly status: "unsupported";
|
|
1110
|
+
readonly invariant: "DuckDB transaction handles do not support the savepoint contract; pass the root database.";
|
|
1111
|
+
};
|
|
1112
|
+
};
|
|
1113
|
+
readonly expectations: {
|
|
1114
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
1115
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
1116
|
+
};
|
|
1117
|
+
}, {
|
|
1118
|
+
readonly id: "root-transaction-resolver-rollback";
|
|
1119
|
+
readonly title: "root coordination rolls resolver rejection back atomically";
|
|
1120
|
+
readonly identity: "none";
|
|
1121
|
+
readonly email: "no_match";
|
|
1122
|
+
readonly verification: "verified";
|
|
1123
|
+
readonly resolver: "null";
|
|
1124
|
+
readonly execution: "root_transaction_rollback";
|
|
1125
|
+
readonly adapters: {
|
|
1126
|
+
readonly sqlite: {
|
|
1127
|
+
readonly status: "required";
|
|
1128
|
+
};
|
|
1129
|
+
readonly postgres: {
|
|
1130
|
+
readonly status: "required";
|
|
1131
|
+
};
|
|
1132
|
+
readonly duckdb: {
|
|
1133
|
+
readonly status: "root_serialized";
|
|
1134
|
+
readonly invariant: "DuckDB uses root-handle serialization instead of overlapping independent transactions.";
|
|
1135
|
+
};
|
|
1136
|
+
};
|
|
1137
|
+
readonly expectations: {
|
|
1138
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
1139
|
+
};
|
|
1140
|
+
}, {
|
|
1141
|
+
readonly id: "duckdb-caller-owned-transaction";
|
|
1142
|
+
readonly title: "DuckDB caller-owned transactions fail closed and remain usable";
|
|
1143
|
+
readonly identity: "none";
|
|
1144
|
+
readonly email: "no_match";
|
|
1145
|
+
readonly verification: "verified";
|
|
1146
|
+
readonly resolver: "absent";
|
|
1147
|
+
readonly execution: "duckdb_caller_owned_transaction";
|
|
1148
|
+
readonly adapters: {
|
|
1149
|
+
readonly sqlite: {
|
|
1150
|
+
readonly status: "not_applicable";
|
|
1151
|
+
};
|
|
1152
|
+
readonly postgres: {
|
|
1153
|
+
readonly status: "not_applicable";
|
|
1154
|
+
};
|
|
1155
|
+
readonly duckdb: {
|
|
1156
|
+
readonly status: "required";
|
|
1157
|
+
readonly invariant: "DuckDB transaction handles fail closed before provisioning writes and leave the caller transaction usable.";
|
|
1158
|
+
};
|
|
1159
|
+
};
|
|
1160
|
+
readonly expectations: {
|
|
1161
|
+
readonly profiles: OidcProvisioningSurfaceExpectation;
|
|
1162
|
+
readonly users: OidcProvisioningSurfaceExpectation;
|
|
1163
|
+
};
|
|
1164
|
+
}];
|
|
1165
|
+
export type OidcProvisioningDecisionScenario = (typeof OIDC_PROVISIONING_DECISION_MATRIX)[number];
|
|
1166
|
+
export declare function getOidcProvisioningDecisionScenario(id: OidcProvisioningDecisionScenario['id']): OidcProvisioningDecisionScenario;
|
|
1167
|
+
export declare function getOidcProvisioningPublicErrorCode(expectation: OidcProvisioningSurfaceExpectation | undefined): Exclude<OidcProvisioningPublicErrorCode, null>;
|
|
1168
|
+
//# sourceMappingURL=oidcProvisioningDecisionMatrix.d.ts.map
|