@odla-ai/chapter 0.42.3 → 0.42.4

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/index.cjs CHANGED
@@ -32,16 +32,25 @@ __export(index_exports, {
32
32
  DEFAULT_CHAPTER_COPY: () => DEFAULT_CHAPTER_COPY,
33
33
  DEFAULT_SHARE_FIELDS: () => DEFAULT_SHARE_FIELDS,
34
34
  GIFT_OFFER_CATALOG_VERSION: () => GIFT_OFFER_CATALOG_VERSION,
35
+ JOURNEY_ENDINGS: () => JOURNEY_ENDINGS,
36
+ JOURNEY_STAGES: () => JOURNEY_STAGES,
35
37
  MAX_GIFT_OFFERS: () => MAX_GIFT_OFFERS,
36
38
  MEMBERSHIP_PAGE_RENDERER: () => MEMBERSHIP_PAGE_RENDERER,
37
39
  MEMBER_CONTENT_CONTROL_PATH: () => MEMBER_CONTENT_CONTROL_PATH,
38
40
  MEMBER_CONTENT_PATH: () => MEMBER_CONTENT_PATH,
39
41
  MEMBER_CONTENT_SCHEMA_VERSION: () => MEMBER_CONTENT_SCHEMA_VERSION,
42
+ MEMBER_SELF_EDITABLE_FIELDS: () => MEMBER_SELF_EDITABLE_FIELDS,
43
+ MEMBER_SELF_READABLE_FIELDS: () => MEMBER_SELF_READABLE_FIELDS,
44
+ MEMBER_SYSTEM_AUTHORITY_MATRIX: () => MEMBER_SYSTEM_AUTHORITY_MATRIX,
45
+ MEMBER_SYSTEM_CONTRACT_VERSION: () => MEMBER_SYSTEM_CONTRACT_VERSION,
46
+ MEMBER_SYSTEM_RECOVERY_OBJECTIVES: () => MEMBER_SYSTEM_RECOVERY_OBJECTIVES,
47
+ REQUIRED_NOTICE_KINDS: () => REQUIRED_NOTICE_KINDS,
40
48
  SCHEDULING_DEFAULTS: () => SCHEDULING_DEFAULTS,
41
49
  SIGNUP_CONTROL_PATH: () => SIGNUP_CONTROL_PATH,
42
50
  SIGNUP_CONTROL_SCHEMA_VERSION: () => SIGNUP_CONTROL_SCHEMA_VERSION,
43
51
  SIGNUP_CONTROL_THEME_MARKER: () => SIGNUP_CONTROL_THEME_MARKER,
44
52
  SIGNUP_CONTROL_THEME_STYLE_ID: () => SIGNUP_CONTROL_THEME_STYLE_ID,
53
+ SILVER_SALT_P0_FIXTURE: () => SILVER_SALT_P0_FIXTURE,
45
54
  applicantProfile: () => applicantProfile,
46
55
  applicationBookingUpdate: () => applicationBookingUpdate,
47
56
  applicationFlowFields: () => applicationFlowFields,
@@ -68,6 +77,8 @@ __export(index_exports, {
68
77
  chapterDb: () => chapterDb,
69
78
  chapterFlowFieldContract: () => chapterFlowFieldContract,
70
79
  clampArray: () => clampArray,
80
+ classifyMemberStripeEvent: () => classifyMemberStripeEvent,
81
+ classifyMemberSystemWrite: () => classifyMemberSystemWrite,
71
82
  clerkGetUser: () => clerkGetUser,
72
83
  clerkGetUserByEmail: () => clerkGetUserByEmail,
73
84
  clerkIntegration: () => clerkIntegration,
@@ -121,6 +132,8 @@ __export(index_exports, {
121
132
  memberContentDigest: () => memberContentDigest,
122
133
  memberContentDocument: () => memberContentDocument,
123
134
  memberSession: () => memberSession,
135
+ memberSystemAvailability: () => memberSystemAvailability,
136
+ memberSystemRollbackPlan: () => memberSystemRollbackPlan,
124
137
  membershipPageDocument: () => membershipPageDocument,
125
138
  membershipTierPresentationFromMarkdown: () => membershipTierPresentationFromMarkdown,
126
139
  networkSourceTag: () => networkSourceTag,
@@ -132,9 +145,12 @@ __export(index_exports, {
132
145
  paymentsReady: () => paymentsReady,
133
146
  personInputFromApp: () => personInputFromApp,
134
147
  planDelivery: () => planDelivery,
148
+ planMemberSystemEventReplay: () => planMemberSystemEventReplay,
149
+ planMemberSystemMigration: () => planMemberSystemMigration,
135
150
  projectApplicant: () => projectApplicant,
136
151
  projectBuilderLibraryDelivery: () => projectBuilderLibraryDelivery,
137
152
  projectMemberContent: () => projectMemberContent,
153
+ projectMemberSelf: () => projectMemberSelf,
138
154
  projectSharedRecord: () => projectSharedRecord,
139
155
  promoteBuilderLibraryResource: () => promoteBuilderLibraryResource,
140
156
  publicGiftOffers: () => publicGiftOffers,
@@ -177,6 +193,7 @@ __export(index_exports, {
177
193
  validateBuilderLibraryDocument: () => validateBuilderLibraryDocument,
178
194
  validateGiftOfferCatalog: () => validateGiftOfferCatalog,
179
195
  validateMemberContentDocument: () => validateMemberContentDocument,
196
+ validateMemberSystemAuthority: () => validateMemberSystemAuthority,
180
197
  validateMembershipPageDocument: () => validateMembershipPageDocument,
181
198
  validateScheduling: () => validateScheduling,
182
199
  validateSignupControlDocument: () => validateSignupControlDocument,
@@ -2219,8 +2236,8 @@ function tierPayable(tier, group, hasSecretKey) {
2219
2236
  function byOrder(a, b) {
2220
2237
  return a.sortOrder - b.sortOrder || a.id.localeCompare(b.id);
2221
2238
  }
2222
- function resolveTiers(group, rows2 = []) {
2223
- const stored = rows2.filter((tier) => tier.active);
2239
+ function resolveTiers(group, rows3 = []) {
2240
+ const stored = rows3.filter((tier) => tier.active);
2224
2241
  if (stored.length) return [...stored].sort(byOrder);
2225
2242
  return [{
2226
2243
  id: "standard",
@@ -4248,15 +4265,15 @@ function rowToTier(row, groupId) {
4248
4265
  }
4249
4266
  async function loadTiers(db, group) {
4250
4267
  const groupId = String(group.id ?? "");
4251
- let rows2;
4268
+ let rows3;
4252
4269
  try {
4253
- rows2 = (await db.query({
4270
+ rows3 = (await db.query({
4254
4271
  tiers: { $: { where: { groupId }, order: { sortOrder: "asc" }, limit: 100 } }
4255
4272
  })).tiers;
4256
4273
  } catch {
4257
- rows2 = void 0;
4274
+ rows3 = void 0;
4258
4275
  }
4259
- const list = Array.isArray(rows2) ? rows2.map((row) => rowToTier(row, groupId)) : [];
4276
+ const list = Array.isArray(rows3) ? rows3.map((row) => rowToTier(row, groupId)) : [];
4260
4277
  return resolveTiers(group, list);
4261
4278
  }
4262
4279
  async function loadOfferableTiers(db, group, hasSecretKey) {
@@ -4954,4 +4971,446 @@ async function exportChapterPromotion(input) {
4954
4971
  ]
4955
4972
  };
4956
4973
  }
4974
+
4975
+ // src/member-system-authority.ts
4976
+ var rows2 = (group) => group.fields.map((id4) => ({ ...group, id: id4 }));
4977
+ var MEMBER_SYSTEM_AUTHORITY_MATRIX = [
4978
+ ...rows2({
4979
+ scope: "network",
4980
+ writer: "network_person",
4981
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
4982
+ sensitivity: "pii",
4983
+ memberAccess: "edit",
4984
+ fields: [
4985
+ "person.legalName",
4986
+ "person.preferredName",
4987
+ "person.namePronunciation",
4988
+ "person.pronouns",
4989
+ "person.displayLegalName",
4990
+ "person.primaryEmail",
4991
+ "person.secondaryEmails",
4992
+ "person.phone",
4993
+ "person.linkedinUrl",
4994
+ "person.photo",
4995
+ "person.homeAddress",
4996
+ "person.fulfillmentFit",
4997
+ "person.fulfillmentSize"
4998
+ ]
4999
+ }),
5000
+ ...rows2({
5001
+ scope: "network",
5002
+ writer: "network_person",
5003
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
5004
+ sensitivity: "ordinary",
5005
+ memberAccess: "edit",
5006
+ fields: [
5007
+ "person.title",
5008
+ "person.company",
5009
+ "person.companyObservedAt",
5010
+ "person.region",
5011
+ "person.whyText",
5012
+ "person.whyTokens",
5013
+ "person.skillsOffered",
5014
+ "person.openToRequests",
5015
+ "person.directoryPhotoConsent"
5016
+ ]
5017
+ }),
5018
+ ...rows2({
5019
+ scope: "network",
5020
+ writer: "network_person",
5021
+ projections: ["bnf_admin", "chapter_admin"],
5022
+ sensitivity: "restricted",
5023
+ memberAccess: "none",
5024
+ fields: [
5025
+ "person.linkedinMemberId",
5026
+ "person.identityClaims",
5027
+ "person.aliases",
5028
+ "person.mergeHistory",
5029
+ "person.introducedByPersonId",
5030
+ "person.introducedAt",
5031
+ "person.firstTouch",
5032
+ "person.globalSuppression",
5033
+ "person.deceasedAt",
5034
+ "person.archivedAt"
5035
+ ]
5036
+ }),
5037
+ ...rows2({
5038
+ scope: "network",
5039
+ writer: "network_person",
5040
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
5041
+ sensitivity: "sensitive",
5042
+ memberAccess: "edit",
5043
+ fields: ["person.accreditationSelfCertification", "person.accreditationCategory", "person.accreditationExpiresAt"]
5044
+ }),
5045
+ ...rows2({
5046
+ scope: "network",
5047
+ writer: "network_person",
5048
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
5049
+ sensitivity: "restricted",
5050
+ memberAccess: "read",
5051
+ fields: ["person.acknowledgements"]
5052
+ }),
5053
+ ...rows2({
5054
+ scope: "provider",
5055
+ writer: "clerk",
5056
+ projections: ["clerk_identity", "bnf_admin", "chapter_admin"],
5057
+ sensitivity: "restricted",
5058
+ memberAccess: "none",
5059
+ fields: ["identity.clerkUserIds", "identity.clerkEmailVerification"]
5060
+ }),
5061
+ ...rows2({
5062
+ scope: "chapter",
5063
+ writer: "chapter_journey",
5064
+ projections: ["chapter_admin", "chapter_crm", "bnf_admin"],
5065
+ sensitivity: "ordinary",
5066
+ memberAccess: "none",
5067
+ fields: [
5068
+ "journey.chapterId",
5069
+ "journey.stage",
5070
+ "journey.stageEnteredAt",
5071
+ "journey.stageHistory",
5072
+ "journey.ending",
5073
+ "journey.endingReason",
5074
+ "journey.source",
5075
+ "journey.entryChapterId",
5076
+ "journey.route",
5077
+ "journey.flags",
5078
+ "journey.applicationStartedAt",
5079
+ "journey.appliedAt",
5080
+ "journey.paidAt",
5081
+ "journey.callBookedAt",
5082
+ "journey.metAt",
5083
+ "journey.approvedAt",
5084
+ "journey.onboardedAt",
5085
+ "journey.firstLoginAt",
5086
+ "journey.firstDealAt"
5087
+ ]
5088
+ }),
5089
+ ...rows2({
5090
+ scope: "chapter",
5091
+ writer: "chapter_journey",
5092
+ projections: ["chapter_admin", "chapter_crm"],
5093
+ sensitivity: "sensitive",
5094
+ memberAccess: "none",
5095
+ fields: [
5096
+ "journey.relationshipOwnerId",
5097
+ "journey.lastContactAt",
5098
+ "journey.nextAction",
5099
+ "journey.owes",
5100
+ "journey.asks",
5101
+ "journey.preparation",
5102
+ "journey.notes"
5103
+ ]
5104
+ }),
5105
+ ...rows2({
5106
+ scope: "chapter",
5107
+ writer: "chapter_journey",
5108
+ projections: ["chapter_admin", "chapter_crm", "member_self_service"],
5109
+ sensitivity: "ordinary",
5110
+ memberAccess: "edit",
5111
+ fields: ["journey.dealFlowConsent", "journey.directoryConsent", "journey.emailConsent", "journey.smsConsent"]
5112
+ }),
5113
+ ...rows2({
5114
+ scope: "chapter",
5115
+ writer: "chapter_journey",
5116
+ projections: ["chapter_admin", "bnf_admin", "member_self_service"],
5117
+ sensitivity: "ordinary",
5118
+ memberAccess: "read",
5119
+ fields: ["journey.memberNumber"]
5120
+ }),
5121
+ ...rows2({
5122
+ scope: "network",
5123
+ writer: "network_membership",
5124
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
5125
+ sensitivity: "ordinary",
5126
+ memberAccess: "read",
5127
+ fields: [
5128
+ "membership.chapterId",
5129
+ "membership.journeyId",
5130
+ "membership.termStartsAt",
5131
+ "membership.termEndsAt",
5132
+ "membership.tier",
5133
+ "membership.status",
5134
+ "membership.joinedAt",
5135
+ "membership.autoRenews",
5136
+ "membership.renewalAt",
5137
+ "membership.cancelsAt",
5138
+ "membership.graceEndsAt",
5139
+ "membership.foundingCohort",
5140
+ "membership.offeringPolicyVersion",
5141
+ "membership.discountPolicyVersion"
5142
+ ]
5143
+ }),
5144
+ ...rows2({
5145
+ scope: "network",
5146
+ writer: "network_commercial_projection",
5147
+ projections: ["bnf_admin", "chapter_admin"],
5148
+ sensitivity: "restricted",
5149
+ memberAccess: "none",
5150
+ fields: [
5151
+ "membership.stripeCustomerId",
5152
+ "membership.stripeSubscriptionId",
5153
+ "membership.stripePriceId",
5154
+ "membership.lastInvoiceId",
5155
+ "membership.paymentOutcome",
5156
+ "membership.refundOutcome"
5157
+ ]
5158
+ }),
5159
+ ...rows2({
5160
+ scope: "network",
5161
+ writer: "network_discount_policy",
5162
+ projections: ["bnf_admin", "chapter_admin", "stripe_billing"],
5163
+ sensitivity: "ordinary",
5164
+ memberAccess: "none",
5165
+ fields: [
5166
+ "discountPolicy.chapterId",
5167
+ "discountPolicy.version",
5168
+ "discountPolicy.eligibleOfferingIds",
5169
+ "discountPolicy.percentOff",
5170
+ "discountPolicy.amountOff",
5171
+ "discountPolicy.activatesOn",
5172
+ "discountPolicy.invoiceCount",
5173
+ "discountPolicy.expiresAt",
5174
+ "discountPolicy.stackingOrder",
5175
+ "discountPolicy.status"
5176
+ ]
5177
+ }),
5178
+ ...rows2({
5179
+ scope: "network",
5180
+ writer: "network_entitlement",
5181
+ projections: ["bnf_admin", "chapter_admin", "member_self_service", "stripe_billing"],
5182
+ sensitivity: "ordinary",
5183
+ memberAccess: "read",
5184
+ fields: [
5185
+ "entitlement.membershipId",
5186
+ "entitlement.kind",
5187
+ "entitlement.priceCents",
5188
+ "entitlement.currency",
5189
+ "entitlement.payerPersonId",
5190
+ "entitlement.purchasedAt",
5191
+ "entitlement.termEndsAt",
5192
+ "entitlement.renewsWithMembership",
5193
+ "entitlement.status"
5194
+ ]
5195
+ }),
5196
+ ...rows2({
5197
+ scope: "network",
5198
+ writer: "network_seat",
5199
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
5200
+ sensitivity: "pii",
5201
+ memberAccess: "read",
5202
+ fields: [
5203
+ "seat.membershipId",
5204
+ "seat.entitlementId",
5205
+ "seat.personId",
5206
+ "seat.recipientName",
5207
+ "seat.recipientEmail",
5208
+ "seat.role",
5209
+ "seat.status",
5210
+ "seat.acceptanceExpiresAt",
5211
+ "seat.acceptedAt",
5212
+ "seat.activatedAt",
5213
+ "seat.refundedAt"
5214
+ ]
5215
+ }),
5216
+ ...rows2({
5217
+ scope: "network",
5218
+ writer: "network_referral_ledger",
5219
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
5220
+ sensitivity: "ordinary",
5221
+ memberAccess: "read",
5222
+ fields: [
5223
+ "referral.referrerPersonId",
5224
+ "referral.referredPersonId",
5225
+ "referral.qualifiedMembershipId",
5226
+ "referral.creditCents",
5227
+ "referral.status",
5228
+ "referral.appliedInvoiceId",
5229
+ "referral.carryForwardCents",
5230
+ "referral.adjustmentOf"
5231
+ ]
5232
+ }),
5233
+ ...rows2({
5234
+ scope: "network",
5235
+ writer: "network_investment_ledger",
5236
+ projections: ["bnf_admin", "chapter_admin", "member_self_service"],
5237
+ sensitivity: "restricted",
5238
+ memberAccess: "read",
5239
+ fields: [
5240
+ "investment.personId",
5241
+ "investment.chapterId",
5242
+ "investment.season",
5243
+ "investment.purpose",
5244
+ "investment.targetCount",
5245
+ "investment.status",
5246
+ "investment.amountCents",
5247
+ "investment.closedAt",
5248
+ "investment.sourceReference"
5249
+ ]
5250
+ }),
5251
+ ...rows2({
5252
+ scope: "provider",
5253
+ writer: "stripe",
5254
+ projections: ["stripe_billing", "bnf_admin", "chapter_admin"],
5255
+ sensitivity: "restricted",
5256
+ memberAccess: "none",
5257
+ fields: [
5258
+ "commercial.charge",
5259
+ "commercial.invoice",
5260
+ "commercial.refund",
5261
+ "commercial.providerSubscription",
5262
+ "commercial.paymentMethod"
5263
+ ]
5264
+ })
5265
+ ];
5266
+ var MEMBER_SELF_EDITABLE_FIELDS = new Set(
5267
+ MEMBER_SYSTEM_AUTHORITY_MATRIX.filter((row) => row.memberAccess === "edit").map((row) => row.id)
5268
+ );
5269
+ var MEMBER_SELF_READABLE_FIELDS = new Set(
5270
+ MEMBER_SYSTEM_AUTHORITY_MATRIX.filter((row) => row.memberAccess !== "none").map((row) => row.id)
5271
+ );
5272
+ function projectMemberSelf(record4) {
5273
+ return Object.fromEntries(Object.entries(record4).filter(([field]) => MEMBER_SELF_READABLE_FIELDS.has(field)));
5274
+ }
5275
+ function classifyMemberSystemWrite(intent) {
5276
+ if (intent.actor === "bnf") return "reject_bnf_surface";
5277
+ const authority = MEMBER_SYSTEM_AUTHORITY_MATRIX.find((row) => row.id === intent.field);
5278
+ if (!authority) return "reject_unknown_field";
5279
+ if (authority.writer !== intent.actor) return "reject_wrong_writer";
5280
+ if (intent.expectedRevision !== intent.actualRevision) return "reject_stale_revision";
5281
+ return "apply";
5282
+ }
5283
+ function validateMemberSystemAuthority(matrix = MEMBER_SYSTEM_AUTHORITY_MATRIX) {
5284
+ const errors = [];
5285
+ const ids = /* @__PURE__ */ new Set();
5286
+ for (const row of matrix) {
5287
+ if (!row.id || !row.id.includes(".")) errors.push(`invalid field id "${row.id}"`);
5288
+ if (ids.has(row.id)) errors.push(`duplicate field authority "${row.id}"`);
5289
+ ids.add(row.id);
5290
+ if (row.memberAccess !== "none" && !row.projections.includes("member_self_service")) {
5291
+ errors.push(`${row.id} grants member access without a member_self_service projection`);
5292
+ }
5293
+ if (row.id.startsWith("person.") && (row.scope !== "network" || row.writer !== "network_person")) {
5294
+ errors.push(`${row.id} must be network_person authority`);
5295
+ }
5296
+ if (row.id.startsWith("journey.") && (row.scope !== "chapter" || row.writer !== "chapter_journey")) {
5297
+ errors.push(`${row.id} must be chapter_journey authority`);
5298
+ }
5299
+ }
5300
+ return { ok: errors.length === 0, errors };
5301
+ }
5302
+
5303
+ // src/member-system-contract.ts
5304
+ var MEMBER_SYSTEM_CONTRACT_VERSION = 1;
5305
+ var JOURNEY_STAGES = [
5306
+ "identified",
5307
+ "researched",
5308
+ "outreach",
5309
+ "in_conversation",
5310
+ "invited_or_requested",
5311
+ "application_started",
5312
+ "applied",
5313
+ "paid_awaiting_conversation",
5314
+ "ready_to_book",
5315
+ "booked",
5316
+ "met",
5317
+ "approved",
5318
+ "onboarded",
5319
+ "active",
5320
+ "first_deal"
5321
+ ];
5322
+ var JOURNEY_ENDINGS = ["passed", "declined", "withdrew", "lapsed"];
5323
+ var REQUIRED_NOTICE_KINDS = [
5324
+ "payment_receipt",
5325
+ "refund_confirmation",
5326
+ "security_alert",
5327
+ "legal_notice",
5328
+ "membership_status",
5329
+ "renewal_notice",
5330
+ "cancellation_confirmation"
5331
+ ];
5332
+ function memberSystemAvailability(input) {
5333
+ if (!input.odlaReachable) {
5334
+ return {
5335
+ bnfAdministration: false,
5336
+ chapterWorkflow: false,
5337
+ memberSelfService: false,
5338
+ newApplication: false,
5339
+ newCheckout: false,
5340
+ providerRenewalsMayContinue: true,
5341
+ reason: "odla_unavailable"
5342
+ };
5343
+ }
5344
+ return {
5345
+ bnfAdministration: input.bnfFrontendReachable,
5346
+ chapterWorkflow: true,
5347
+ memberSelfService: true,
5348
+ newApplication: true,
5349
+ newCheckout: true,
5350
+ providerRenewalsMayContinue: true,
5351
+ ...!input.bnfFrontendReachable ? { reason: "bnf_frontend_unavailable" } : {}
5352
+ };
5353
+ }
5354
+ function classifyMemberStripeEvent(identity, target, hasProvenLegacyLocalLink) {
5355
+ const keys = ["appId", "environment", "dataEnvironment", "runtime", "chapterId"];
5356
+ const supplied = keys.filter((key) => identity[key] !== void 0);
5357
+ if (supplied.some((key) => identity[key] !== target[key])) return "ignore_sibling";
5358
+ if (supplied.length === keys.length) return "apply";
5359
+ return hasProvenLegacyLocalLink ? "apply_legacy" : "quarantine_unmatched";
5360
+ }
5361
+ function planMemberSystemEventReplay(events) {
5362
+ const seen = /* @__PURE__ */ new Map();
5363
+ const plan = { accepted: [], replayed: [], collisions: [] };
5364
+ for (const event of events) {
5365
+ const digest = seen.get(event.id);
5366
+ if (digest === void 0) {
5367
+ seen.set(event.id, event.digest);
5368
+ plan.accepted.push(event.id);
5369
+ } else if (digest === event.digest) plan.replayed.push(event.id);
5370
+ else plan.collisions.push(event.id);
5371
+ }
5372
+ return plan;
5373
+ }
5374
+ var MEMBER_SYSTEM_RECOVERY_OBJECTIVES = {
5375
+ failClosedWithinMs: 0,
5376
+ replayProjectionWithinMinutes: 15,
5377
+ providerEventsRemainReplayable: true,
5378
+ requireHumanReviewForCollision: true
5379
+ };
5380
+ function planMemberSystemMigration(rows3) {
5381
+ const plan = { importIds: [], fixtureIds: [], rejectedIds: [] };
5382
+ for (const row of rows3) {
5383
+ if (row.source === "synthetic_fixture" && !row.isRealPerson) plan.fixtureIds.push(row.id);
5384
+ else if (row.source === "external_reimport" && row.isRealPerson && row.provenance) plan.importIds.push(row.id);
5385
+ else plan.rejectedIds.push(row.id);
5386
+ }
5387
+ return plan;
5388
+ }
5389
+ function memberSystemRollbackPlan() {
5390
+ return {
5391
+ stopNetworkWrites: true,
5392
+ disableBnfMemberMutations: true,
5393
+ keepChapterProductionReads: true,
5394
+ keepStripeBillingAuthority: true,
5395
+ deleteProviderObjects: false,
5396
+ reverseProviderPayments: false,
5397
+ reconciliationRequired: true
5398
+ };
5399
+ }
5400
+ var SILVER_SALT_P0_FIXTURE = {
5401
+ sourceInventory: { applications: 36, meetings: 7, emails: 49, realPeople: 0 },
5402
+ application: { id: "fixture_application_001", personId: "fixture_person_001", migrates: false },
5403
+ crm: { recordId: "fixture_crm_001", email: "fixture.member@example.invalid", migrates: false },
5404
+ clerk: { userId: "user_fixture_001", verifiedEmail: "fixture.member@example.invalid", migrates: false },
5405
+ stripe: {
5406
+ customerId: "cus_fixture_001",
5407
+ subscriptionId: "sub_fixture_001",
5408
+ productId: "prod_fixture_001",
5409
+ priceId: "price_fixture_001",
5410
+ eventId: "evt_fixture_001",
5411
+ migrates: false
5412
+ },
5413
+ unmatchedStripeEvent: { id: "evt_fixture_unmatched", disposition: "quarantine_unmatched" },
5414
+ legacyStripeEvent: { id: "evt_fixture_legacy", requiresProvenLocalLink: true }
5415
+ };
4957
5416
  //# sourceMappingURL=index.cjs.map