@odla-ai/chapter 0.42.4 → 0.43.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odla-ai/chapter",
3
- "version": "0.42.4",
3
+ "version": "0.43.1",
4
4
  "description": "A leader/follower foundation for branded membership sites: shared CRM, admin, auth, payments, booking, and explicit record delivery from one defineChapter config.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://odla.ai/docs/packages/chapter",
@@ -581,6 +581,22 @@ this release. Preserve a host UI/route for non-USD or mismatched pricing. Test
581
581
  successful payment, duplicate webhook, failure, refund, and subscription
582
582
  cancellation before switching the UI.
583
583
 
584
+ For a shared Stripe account, preserve Chapter's closed partition metadata on
585
+ every new customer, subscription, payment intent, and refund: app, chapter,
586
+ environment, data environment, and stable runtime. Do not infer ownership from
587
+ the Stripe account or Price alone. A Worker with a named runtime prefers its
588
+ `stripe_webhook_secret__<runtime>` endpoint secret. During an existing app's
589
+ upgrade, Chapter falls back to the historical `stripe_webhook_secret` slot only
590
+ when the scoped slot is absent; replace that compatibility path by reconciling a
591
+ dedicated endpoint, without reading or manually copying either secret. The
592
+ signed webhook must apply an exact target
593
+ once, acknowledge a fully tagged sibling with zero local writes, quarantine an
594
+ unmatched event for operators, and accept a metadata-free legacy object only
595
+ when its Stripe customer, subscription, or gift id is already linked to this
596
+ chapter and runtime. Exercise all four paths in development, including a replay
597
+ of the identical body and an event-id collision with changed content, before
598
+ removing any legacy payment adapter.
599
+
584
600
  ### Calendar and email
585
601
 
586
602
  Complete dev Google booking consent, reconnecting any grant from the retired
@@ -762,7 +762,10 @@ deployed dev origin.
762
762
  endpoint, stores `stripe_webhook_secret__<name>` under write-only custody,
763
763
  and binds `ODLA_RUNTIME`; do not manually reuse one signing secret across
764
764
  endpoints. A legacy single-Worker app may still store
765
- `stripe_webhook_secret` directly.
765
+ `stripe_webhook_secret` directly. An upgraded named-runtime Worker falls back
766
+ to that historical slot only while its scoped endpoint secret is absent;
767
+ reconcile the dedicated endpoint to end the compatibility period without
768
+ reading or copying either secret.
766
769
  4. In the guarded `groups` row, set `stripePublishableKey` and `stripePriceId`.
767
770
  5. Confirm `policy.merchantDisclosureText` names the merchant the customer will
768
771
  see on the charge or receipt, including the chapter relationship when the
@@ -778,6 +781,18 @@ non-USD or unmatched pricing needs a host UI/route and cannot use the stock
778
781
  payment presentation. Never accept money until the provider equality check and
779
782
  webhook test prove authoritative paid/refunded state and idempotent replay.
780
783
 
784
+ Chapter tags every newly created Stripe customer, subscription, payment intent,
785
+ and refund with its app, chapter, environment, data environment, and stable
786
+ runtime identity. Do not replace or omit those fields in a host payment route.
787
+ The signed webhook acknowledges a fully tagged sibling event without a local
788
+ write, accepts an untagged legacy event only when the referenced Stripe object is
789
+ already linked to a local application or gift intent, and records a content-free
790
+ receipt for each applied or unmatched event. Prove all three dispositions with
791
+ synthetic test objects: exact target applies once, a sibling target writes zero
792
+ rows, and an unmatched legacy event is quarantined and observable. Replaying the
793
+ same event body must be a no-op; reusing its event id with different content must
794
+ raise a collision signal and must not apply.
795
+
781
796
  ### Google Calendar
782
797
 
783
798
  Complete the human Google booking consent from provisioning, then: