@openlup/platform 0.27.0 → 0.29.0

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.
Files changed (232) hide show
  1. package/CHANGELOG.md +386 -127
  2. package/README.md +251 -9
  3. package/dist/account-support/accountReadFacade.d.ts +8 -0
  4. package/dist/account-support/accountReadFacade.js +10 -0
  5. package/dist/account-support/accountReadModels.d.ts +69 -0
  6. package/dist/account-support/accountReadModels.js +272 -0
  7. package/dist/account-support/bindings.d.ts +23 -0
  8. package/dist/account-support/bindings.js +16 -0
  9. package/dist/account-support/contracts/account.d.ts +281 -0
  10. package/dist/account-support/contracts/account.js +1 -0
  11. package/dist/account-support/contracts/capabilities.d.ts +44 -0
  12. package/dist/account-support/contracts/capabilities.js +1 -0
  13. package/dist/account-support/contracts/commands.d.ts +307 -0
  14. package/dist/account-support/contracts/commands.js +1 -0
  15. package/dist/account-support/contracts/customer360.d.ts +154 -0
  16. package/dist/account-support/contracts/customer360.js +1 -0
  17. package/dist/account-support/contracts/index.d.ts +10 -0
  18. package/dist/account-support/contracts/index.js +1 -0
  19. package/dist/account-support/contracts/invoice.d.ts +79 -0
  20. package/dist/account-support/contracts/invoice.js +1 -0
  21. package/dist/account-support/contracts/operator.d.ts +289 -0
  22. package/dist/account-support/contracts/operator.js +1 -0
  23. package/dist/account-support/contribution.d.ts +24 -0
  24. package/dist/account-support/contribution.js +22 -0
  25. package/dist/account-support/customer360.d.ts +106 -0
  26. package/dist/account-support/customer360.js +163 -0
  27. package/dist/account-support/customerAccountReadDiagnostics.d.ts +11 -0
  28. package/dist/account-support/customerAccountReadDiagnostics.js +71 -0
  29. package/dist/account-support/index.d.ts +26 -0
  30. package/dist/account-support/index.js +15 -0
  31. package/dist/account-support/invoiceAccess.d.ts +57 -0
  32. package/dist/account-support/invoiceAccess.js +40 -0
  33. package/dist/account-support/migrations.d.ts +14 -0
  34. package/dist/account-support/migrations.js +7 -0
  35. package/dist/account-support/operatorAuthority.d.ts +67 -0
  36. package/dist/account-support/operatorAuthority.js +379 -0
  37. package/dist/account-support/operatorRecovery.d.ts +66 -0
  38. package/dist/account-support/operatorRecovery.js +129 -0
  39. package/dist/account-support/orderHistory.d.ts +50 -0
  40. package/dist/account-support/orderHistory.js +188 -0
  41. package/dist/account-support/paymentMethodComposition.d.ts +5 -0
  42. package/dist/account-support/paymentMethodComposition.js +4 -0
  43. package/dist/account-support/postgresOperatorAuthority.d.ts +16 -0
  44. package/dist/account-support/postgresOperatorAuthority.js +93 -0
  45. package/dist/account-support/selfService.d.ts +6 -0
  46. package/dist/account-support/selfService.js +81 -0
  47. package/dist/account-support/subscriptionCommandCodec.d.ts +10 -0
  48. package/dist/account-support/subscriptionCommandCodec.js +38 -0
  49. package/dist/catalog/draftSchemas.d.ts +1 -1
  50. package/dist/catalog/foundationSchemas.d.ts +3 -3
  51. package/dist/catalog/resolvedSkuProjection.d.ts +2 -2
  52. package/dist/catalog/sellableSchemas.d.ts +2 -2
  53. package/dist/commerce/checkoutCommandSchemas.d.ts +2 -2
  54. package/dist/commerce/checkoutResumeSchemas.d.ts +6 -6
  55. package/dist/commerce/checkoutSchemas.d.ts +12 -12
  56. package/dist/commerce/commerceReturnsPort.d.ts +2 -2
  57. package/dist/commerce/configuratorIntentSchemas.d.ts +2 -2
  58. package/dist/commerce/contractPrimitives.d.ts +8 -8
  59. package/dist/commerce/customerDefaultsSnapshotSchemas.d.ts +4 -4
  60. package/dist/commerce/model/omsReadModelHelpers.d.ts +4 -4
  61. package/dist/commerce/offerAvailabilitySchemas.d.ts +1 -1
  62. package/dist/commerce/oms/omsContractBase.d.ts +15 -15
  63. package/dist/commerce/oms/omsContractReadAuxSchemas.d.ts +11 -11
  64. package/dist/commerce/oms/omsContractReadSchemas.d.ts +121 -121
  65. package/dist/commerce/oms/omsContractRequests.d.ts +13 -13
  66. package/dist/commerce/oms/omsControlPlane.d.ts +22 -22
  67. package/dist/commerce/oms/omsFulfillmentContractSchemas.d.ts +12 -12
  68. package/dist/commerce/oms/omsFulfillmentDebugSchemas.d.ts +12 -12
  69. package/dist/commerce/orderReviewContracts.d.ts +33 -33
  70. package/dist/commerce/outboxEventSchemas.d.ts +4 -4
  71. package/dist/commerce/schemas.d.ts +21 -21
  72. package/dist/commerce/server/orderReviewHandlers.d.ts +10 -10
  73. package/dist/communications/consentPurposeRegistry.d.ts +1 -1
  74. package/dist/communications/newsletterIntegrationContracts.d.ts +8 -8
  75. package/dist/composition/accountSupportContribution.d.ts +18 -0
  76. package/dist/composition/accountSupportContribution.js +21 -0
  77. package/dist/composition/index.d.ts +2 -0
  78. package/dist/composition/index.js +2 -0
  79. package/dist/composition/marketingContribution.d.ts +21 -0
  80. package/dist/composition/marketingContribution.js +29 -0
  81. package/dist/fulfillment/handlerSchemas.d.ts +40 -40
  82. package/dist/identity/customerContracts.d.ts +2 -2
  83. package/dist/invoicing/snapshot.d.ts +1 -1
  84. package/dist/marketing/acquisitionCaseSchemas.d.ts +103 -0
  85. package/dist/marketing/acquisitionCaseSchemas.js +53 -0
  86. package/dist/marketing/acquisitionEvidenceSchemas.d.ts +105 -0
  87. package/dist/marketing/acquisitionEvidenceSchemas.js +55 -0
  88. package/dist/marketing/analytics/dataLayer.d.ts +18 -0
  89. package/dist/marketing/analytics/dataLayer.js +111 -0
  90. package/dist/marketing/analytics/noop.d.ts +9 -0
  91. package/dist/marketing/analytics/noop.js +8 -0
  92. package/dist/marketing/analytics/purchaseFacts.d.ts +4 -0
  93. package/dist/marketing/analytics/purchaseFacts.js +69 -0
  94. package/dist/marketing/analytics/routePolicy.d.ts +10 -0
  95. package/dist/marketing/analytics/routePolicy.js +59 -0
  96. package/dist/marketing/consentEvidence.d.ts +8 -0
  97. package/dist/marketing/consentEvidence.js +32 -0
  98. package/dist/marketing/contactLegal.d.ts +14 -0
  99. package/dist/marketing/contactLegal.js +19 -0
  100. package/dist/marketing/contracts/acquisition.d.ts +88 -0
  101. package/dist/marketing/contracts/acquisition.js +1 -0
  102. package/dist/marketing/contracts/acquisitionPorts.d.ts +49 -0
  103. package/dist/marketing/contracts/acquisitionPorts.js +1 -0
  104. package/dist/marketing/contracts/analytics.d.ts +144 -0
  105. package/dist/marketing/contracts/analytics.js +1 -0
  106. package/dist/marketing/contracts/contactLegal.d.ts +53 -0
  107. package/dist/marketing/contracts/contactLegal.js +1 -0
  108. package/dist/marketing/contracts/index.d.ts +6 -0
  109. package/dist/marketing/contracts/index.js +1 -0
  110. package/dist/marketing/contracts/prelaunch.d.ts +39 -0
  111. package/dist/marketing/contracts/prelaunch.js +1 -0
  112. package/dist/marketing/index.d.ts +16 -0
  113. package/dist/marketing/index.js +14 -0
  114. package/dist/marketing/prelaunchAcquisitionSchemas.d.ts +116 -0
  115. package/dist/marketing/prelaunchAcquisitionSchemas.js +51 -0
  116. package/dist/marketing/seo/jsonLd.d.ts +157 -0
  117. package/dist/marketing/seo/jsonLd.js +127 -0
  118. package/dist/marketing/seo/metadata.d.ts +41 -0
  119. package/dist/marketing/seo/metadata.js +36 -0
  120. package/dist/marketing/seo/serializeJsonLd.d.ts +1 -0
  121. package/dist/marketing/seo/serializeJsonLd.js +6 -0
  122. package/dist/marketing/seo/urls.d.ts +14 -0
  123. package/dist/marketing/seo/urls.js +23 -0
  124. package/dist/marketing/server/acquisitionCaseDirect.d.ts +4 -0
  125. package/dist/marketing/server/acquisitionCaseDirect.js +88 -0
  126. package/dist/marketing/server/acquisitionCaseHandlers.d.ts +28 -0
  127. package/dist/marketing/server/acquisitionCaseHandlers.js +40 -0
  128. package/dist/marketing/server/acquisitionCasePorts.d.ts +42 -0
  129. package/dist/marketing/server/acquisitionCasePorts.js +1 -0
  130. package/dist/marketing/server/acquisitionEvidenceDirect.d.ts +5 -0
  131. package/dist/marketing/server/acquisitionEvidenceDirect.js +100 -0
  132. package/dist/marketing/server/analyticsContext.d.ts +3 -0
  133. package/dist/marketing/server/analyticsContext.js +65 -0
  134. package/dist/marketing/server/analyticsContextPorts.d.ts +31 -0
  135. package/dist/marketing/server/analyticsContextPorts.js +1 -0
  136. package/dist/marketing/server/bindings.d.ts +14 -0
  137. package/dist/marketing/server/bindings.js +18 -0
  138. package/dist/marketing/server/directPorts.d.ts +26 -0
  139. package/dist/marketing/server/directPorts.js +1 -0
  140. package/dist/marketing/server/index.d.ts +14 -0
  141. package/dist/marketing/server/index.js +11 -0
  142. package/dist/marketing/server/postgres/acquisitionCaseRoutines.d.ts +10 -0
  143. package/dist/marketing/server/postgres/acquisitionCaseRoutines.js +204 -0
  144. package/dist/marketing/server/postgres/acquisitionEvidenceRoutines.d.ts +10 -0
  145. package/dist/marketing/server/postgres/acquisitionEvidenceRoutines.js +107 -0
  146. package/dist/marketing/server/postgres/index.d.ts +3 -0
  147. package/dist/marketing/server/postgres/index.js +3 -0
  148. package/dist/marketing/server/prelaunchAcquisitionDirect.d.ts +4 -0
  149. package/dist/marketing/server/prelaunchAcquisitionDirect.js +122 -0
  150. package/dist/marketing/server/privacyContributor.d.ts +66 -0
  151. package/dist/marketing/server/privacyContributor.js +87 -0
  152. package/dist/marketing/server/research/adminSurveyResponsesHandler.d.ts +9 -0
  153. package/dist/marketing/server/research/adminSurveyResponsesHandler.js +53 -0
  154. package/dist/marketing/server/research/managedSurveyResponseSubmit.d.ts +39 -0
  155. package/dist/marketing/server/research/managedSurveyResponseSubmit.js +102 -0
  156. package/dist/marketing/server/research/surveyResponseSubmitHandler.d.ts +8 -0
  157. package/dist/marketing/server/research/surveyResponseSubmitHandler.js +41 -0
  158. package/dist/marketing/validation.d.ts +2 -0
  159. package/dist/marketing/validation.js +3 -0
  160. package/dist/pricing/acquisitionQuoteBinding.d.ts +1 -1
  161. package/dist/pricing/catalogFactsSchemas.d.ts +1 -1
  162. package/dist/pricing/quotePromotionEvidence.d.ts +1 -1
  163. package/dist/pricing/quoteSchemas.d.ts +56 -56
  164. package/dist/promotions/adminPromotionCodesContracts.d.ts +30 -30
  165. package/dist/promotions/adminPromotionsContracts.d.ts +14 -14
  166. package/package.json +32 -2
  167. package/release-gates.json +99 -4
  168. package/sql/20261026120000_account_support_operator_authority.sql +693 -0
  169. package/src/account-support/accountReadFacade.ts +15 -0
  170. package/src/account-support/accountReadModels.ts +371 -0
  171. package/src/account-support/bindings.ts +28 -0
  172. package/src/account-support/contracts/account.ts +306 -0
  173. package/src/account-support/contracts/capabilities.ts +30 -0
  174. package/src/account-support/contracts/commands.ts +243 -0
  175. package/src/account-support/contracts/customer360.ts +150 -0
  176. package/src/account-support/contracts/index.ts +141 -0
  177. package/src/account-support/contracts/invoice.ts +44 -0
  178. package/src/account-support/contracts/operator.ts +123 -0
  179. package/src/account-support/contribution.ts +35 -0
  180. package/src/account-support/customer360.ts +268 -0
  181. package/src/account-support/customerAccountReadDiagnostics.ts +83 -0
  182. package/src/account-support/index.ts +72 -0
  183. package/src/account-support/invoiceAccess.ts +63 -0
  184. package/src/account-support/migrations.ts +7 -0
  185. package/src/account-support/operatorAuthority.ts +393 -0
  186. package/src/account-support/operatorRecovery.ts +136 -0
  187. package/src/account-support/orderHistory.ts +309 -0
  188. package/src/account-support/paymentMethodComposition.ts +8 -0
  189. package/src/account-support/postgresOperatorAuthority.ts +92 -0
  190. package/src/account-support/selfService.ts +83 -0
  191. package/src/account-support/subscriptionCommandCodec.ts +48 -0
  192. package/src/composition/accountSupportContribution.ts +28 -0
  193. package/src/composition/index.ts +2 -0
  194. package/src/composition/marketingContribution.ts +37 -0
  195. package/src/marketing/acquisitionCaseSchemas.ts +75 -0
  196. package/src/marketing/acquisitionEvidenceSchemas.ts +72 -0
  197. package/src/marketing/analytics/dataLayer.ts +100 -0
  198. package/src/marketing/analytics/noop.ts +14 -0
  199. package/src/marketing/analytics/purchaseFacts.ts +63 -0
  200. package/src/marketing/analytics/routePolicy.ts +55 -0
  201. package/src/marketing/consentEvidence.ts +36 -0
  202. package/src/marketing/contactLegal.ts +22 -0
  203. package/src/marketing/contracts/acquisition.ts +50 -0
  204. package/src/marketing/contracts/acquisitionPorts.ts +48 -0
  205. package/src/marketing/contracts/analytics.ts +88 -0
  206. package/src/marketing/contracts/contactLegal.ts +41 -0
  207. package/src/marketing/contracts/index.ts +17 -0
  208. package/src/marketing/contracts/prelaunch.ts +15 -0
  209. package/src/marketing/index.ts +16 -0
  210. package/src/marketing/prelaunchAcquisitionSchemas.ts +64 -0
  211. package/src/marketing/seo/jsonLd.ts +153 -0
  212. package/src/marketing/seo/metadata.ts +62 -0
  213. package/src/marketing/seo/serializeJsonLd.ts +6 -0
  214. package/src/marketing/seo/urls.ts +34 -0
  215. package/src/marketing/server/acquisitionCaseDirect.ts +67 -0
  216. package/src/marketing/server/acquisitionCaseHandlers.ts +57 -0
  217. package/src/marketing/server/acquisitionCasePorts.ts +42 -0
  218. package/src/marketing/server/acquisitionEvidenceDirect.ts +76 -0
  219. package/src/marketing/server/analyticsContext.ts +55 -0
  220. package/src/marketing/server/analyticsContextPorts.ts +28 -0
  221. package/src/marketing/server/bindings.ts +27 -0
  222. package/src/marketing/server/directPorts.ts +27 -0
  223. package/src/marketing/server/index.ts +14 -0
  224. package/src/marketing/server/postgres/acquisitionCaseRoutines.ts +218 -0
  225. package/src/marketing/server/postgres/acquisitionEvidenceRoutines.ts +103 -0
  226. package/src/marketing/server/postgres/index.ts +3 -0
  227. package/src/marketing/server/prelaunchAcquisitionDirect.ts +121 -0
  228. package/src/marketing/server/privacyContributor.ts +123 -0
  229. package/src/marketing/server/research/adminSurveyResponsesHandler.ts +78 -0
  230. package/src/marketing/server/research/managedSurveyResponseSubmit.ts +158 -0
  231. package/src/marketing/server/research/surveyResponseSubmitHandler.ts +57 -0
  232. package/src/marketing/validation.ts +3 -0
package/CHANGELOG.md CHANGED
@@ -10,6 +10,392 @@ in the source repository.
10
10
 
11
11
  ## [Unreleased]
12
12
 
13
+ ## [0.29.0]
14
+
15
+ - Publishable on the npm `latest` dist-tag as `0.29.0`, from tag
16
+ `openlup-platform-v0.29.0`.
17
+
18
+ Adds experimental browser-safe marketing runtime contracts and a type-only
19
+ contracts entry through unchanged schema movement and reference import rebinding.
20
+ Core research remains the compatibility owner. Parsing, defaults, issue details
21
+ and order, and existing inferred input/output types retain their behavior.
22
+
23
+ Migration: No observable divergence is introduced for existing reference consumers; shims retain their exported names and schema object identities.
24
+ Migration: New public subpath `@openlup/platform/marketing` exposes browser-safe runtime contracts without a server entry.
25
+ Migration: New public subpath `@openlup/platform/marketing/contracts` exposes types only, with no Zod or runtime-module imports.
26
+ Migration: New public export `ACQUISITION_CASE_CONTRACT_VERSION` is available from `@openlup/platform/marketing`.
27
+ Migration: New public export `ACQUISITION_CASE_VIEW` is available from `@openlup/platform/marketing`.
28
+ Migration: New public export `ACQUISITION_CASE_SOURCE` is available from `@openlup/platform/marketing`.
29
+ Migration: New public export `acquisitionOpaqueReferenceSchema` is available from `@openlup/platform/marketing`.
30
+ Migration: New public export `acquisitionAddressReferenceSchema` is available from `@openlup/platform/marketing`.
31
+ Migration: New public export `acquisitionCaseStateSchema` is available from `@openlup/platform/marketing`.
32
+ Migration: New public export `acquisitionCaseProjectionSchema` is available from `@openlup/platform/marketing`.
33
+ Migration: New public export `acquisitionCaseListRequestSchema` is available from `@openlup/platform/marketing`.
34
+ Migration: New public export `acquisitionCaseListResponseSchema` is available from `@openlup/platform/marketing`.
35
+ Migration: New public export `acquisitionCaseActiveCountResponseSchema` is available from `@openlup/platform/marketing`.
36
+ Migration: New public export `acquisitionIdempotencyKeySchema` is available from `@openlup/platform/marketing`.
37
+ Migration: New public export `ACQUISITION_SURVEY_VERSION` is available from `@openlup/platform/marketing`.
38
+ Migration: New public export `ACQUISITION_NEWSLETTER_VERSION` is available from `@openlup/platform/marketing`.
39
+ Migration: New public export `acquisitionSurveySubmitSchema` is available from `@openlup/platform/marketing`.
40
+ Migration: New public export `acquisitionSurveyEvidenceSchema` is available from `@openlup/platform/marketing`.
41
+ Migration: New public export `acquisitionSurveySubmitResponseSchema` is available from `@openlup/platform/marketing`.
42
+ Migration: New public export `acquisitionSurveyListQuerySchema` is available from `@openlup/platform/marketing`.
43
+ Migration: New public export `acquisitionSurveyListResponseSchema` is available from `@openlup/platform/marketing`.
44
+ Migration: New public export `acquisitionNewsletterConsentEventSchema` is available from `@openlup/platform/marketing`.
45
+ Migration: New public export `acquisitionNewsletterConsentResponseSchema` is available from `@openlup/platform/marketing`.
46
+ Migration: New public export `marketingResearchJsonSchema` is available from `@openlup/platform/marketing` with its core object identity.
47
+ Migration: New public export `researchSurveyTypeSchema` is available from `@openlup/platform/marketing` with its core object identity.
48
+ Migration: New public export `adminSurveyResponsesRequestSchema` is available from `@openlup/platform/marketing` with its core object identity.
49
+ Migration: New public export `adminSurveyResponseRowSchema` is available from `@openlup/platform/marketing` with its core object identity.
50
+ Migration: New public export `adminSurveyResponsesResponseSchema` is available from `@openlup/platform/marketing` with its core object identity.
51
+ Migration: New public export `researchSurveySubmitRequestSchema` is available from `@openlup/platform/marketing` with its core object identity.
52
+ Migration: New public export `researchSurveySubmitResponseSchema` is available from `@openlup/platform/marketing` with its core object identity.
53
+ Migration: New public type `AcquisitionOpaqueReference` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
54
+ Migration: New public type `AcquisitionAddressReference` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
55
+ Migration: New public type `AcquisitionCaseState` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
56
+ Migration: New public type `AcquisitionCaseProjection` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
57
+ Migration: New public type `AcquisitionCaseListRequest` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
58
+ Migration: New public type `AcquisitionCaseListResponse` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
59
+ Migration: New public type `AcquisitionCaseActiveCountResponse` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
60
+ Migration: New public type `AcquisitionIdempotencyKey` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
61
+ Migration: New public type `AcquisitionSurveySubmit` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
62
+ Migration: New public type `AcquisitionSurveyEvidence` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
63
+ Migration: New public type `AcquisitionSurveySubmitResponse` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
64
+ Migration: New public type `AcquisitionSurveyListQuery` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
65
+ Migration: New public type `AcquisitionSurveyListResponse` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
66
+ Migration: New public type `AcquisitionNewsletterConsentEvent` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
67
+ Migration: New public type `AcquisitionNewsletterConsentResponse` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
68
+ Migration: New public type `MarketingResearchJson` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
69
+ Migration: New public type `ResearchSurveyType` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
70
+ Migration: New public type `AdminSurveyResponsesRequest` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
71
+ Migration: New public type `AdminSurveyResponseRow` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
72
+ Migration: New public type `AdminSurveyResponsesResponse` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
73
+ Migration: New public type `ResearchSurveySubmitRequest` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
74
+ Migration: New public type `ResearchSurveySubmitResponse` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
75
+ Migration: New public type `MarketingResearchSurveyResponsesReadPort` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
76
+ Migration: New public type `MarketingResearchSurveyRequestHeaders` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
77
+ Migration: New public type `MarketingResearchSurveySubmitPort` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
78
+ Migration: `en|pl` locale restriction is known debt tied to the persisted CHECK; locale widening needs a future migration and is outside M13 scope.
79
+ Migration: Retired acquisition case submit/transition request and response contracts and the app-owned client-version binding are intentionally not published.
80
+ Migration: New public export `PRELAUNCH_ACQUISITION_VIEW` is available from `@openlup/platform/marketing`.
81
+ Migration: New public export `PRELAUNCH_ACQUISITION_CONTRACT_VERSION` is available from `@openlup/platform/marketing`.
82
+ Migration: New public export `prelaunchAcquisitionListRequestSchema` is available from `@openlup/platform/marketing`.
83
+ Migration: New public export `prelaunchAcquisitionDetailRequestSchema` is available from `@openlup/platform/marketing`.
84
+ Migration: New public export `prelaunchAcquisitionLeadSchema` is available from `@openlup/platform/marketing`.
85
+ Migration: New public export `prelaunchAcquisitionListResponseSchema` is available from `@openlup/platform/marketing`.
86
+ Migration: New public export `prelaunchAcquisitionDetailResponseSchema` is available from `@openlup/platform/marketing`.
87
+ Migration: New public type `AcquisitionCaseFailureKind` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
88
+ Migration: New public type `AcquisitionCaseResult` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
89
+ Migration: New public type `AcquisitionCaseListQuery` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
90
+ Migration: New public type `AcquisitionCaseGetQuery` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
91
+ Migration: New public type `AcquisitionCasePort` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
92
+ Migration: New public type `AcquisitionEvidenceFailure` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
93
+ Migration: New public type `AcquisitionEvidenceResult` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
94
+ Migration: New public type `AcquisitionEvidencePort` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
95
+ Migration: New public type `PrelaunchAcquisitionListRequest` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
96
+ Migration: New public type `PrelaunchAcquisitionDetailRequest` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
97
+ Migration: New public type `PrelaunchAcquisitionLead` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
98
+ Migration: New public type `PrelaunchAcquisitionListResponse` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
99
+ Migration: New public type `PrelaunchAcquisitionDetailResponse` is available from `@openlup/platform/marketing` and `@openlup/platform/marketing/contracts`.
100
+ Migration: The rich prelaunch DTO and retired acquisition case submit/transition port methods and commands are intentionally not published.
101
+ Migration: The marketing runtime entry configures the shared Zod instance in jitless mode on load, the same as the pricing, catalog and communications entries; the type-only marketing/contracts entry has no runtime initialization.
102
+
103
+ Adds experimental Node-only marketing server factories through unchanged
104
+ acquisition, research and PostgreSQL algorithm movement. Host composition retains
105
+ routing, environment, authorization, observed wrappers and notification copy.
106
+ Browser marketing entries retain their isolated schema/type-only boundaries.
107
+
108
+ Migration: New public subpath `@openlup/platform/marketing/server` contains acquisition case handlers, direct acquisition history and prelaunch reads, survey evidence and consent commands, research handlers and managed survey orchestration.
109
+ Migration: PostgreSQL port factories are published separately under `@openlup/platform/marketing/server/postgres` so the server entry does not load the existing optional `pg` peer. Select `/postgres` with that peer installed. Reference bindings load the adapter lazily after their bundle and connection guards. SQL text, signatures, role selection, pool creation and transaction handling retain their behavior.
110
+ Migration: `createAdminClientsTestersDirectHandler` maps to the neutral package symbol `createAcquisitionCaseListDirectHandler`; `createTesterProgramActiveCountDirectHandler` maps to `createAcquisitionCaseActiveCountDirectHandler`. The reference retains both original factory names and route registrations.
111
+ Migration: `handleAcquisitionSurveySubmit`, `handleAcquisitionSurveyList` and `handleAcquisitionNewsletterConsent` compose `createAcquisitionSurveySubmitDirectHandler`, `createAcquisitionSurveyListDirectHandler` and `createAcquisitionNewsletterConsentDirectHandler`, respectively. Successful evidence values remain forwarded without response-schema validation.
112
+ Migration: Direct factories receive the host BFF responder, authorization callback and binding resolver. Acquisition list/count additionally receive the direct-bundle predicate at its original guard position. Prelaunch/evidence bundle and request-view dispatch remain with host callers; no additional guard is introduced.
113
+ Migration: Research submit/admin handler dependencies receive the BFF responder and use platform HTTP types. Research schemas and ports retain the `@openlup/core/marketing/research` compatibility owner. Delivery types retain their communications/contracts owner.
114
+ Migration: Managed survey submission receives `renderNotificationHtml(type, responseData, id)` and `notificationSubject(type, now)`. HTML renders before the subject clock read, after policy filtering. The host retains subject/HTML copy and escaping; rendered values reach delivery unchanged.
115
+ Migration: Server-only structural submit/transition request and command types retain the historical adapter signatures without adding schemas or changing either browser entry. Retired route factories, terminal refusals, admin auth binding, observed wrappers and raw signed consent ingress remain application-owned.
116
+ Migration: Reference acquisition handler and PostgreSQL adapter paths retain thin package re-exports; runtime bindings retain lazy adapter imports. Reference research handler files bind the responder, and managed submission binds notification copy while retaining live host configuration reads. Prelaunch rich read models and admin leads remain application-owned.
117
+ Migration: Neutral characterization lives under `packages/platform/test/marketing/server/`, including the complete survey/consent direct-handler witness. Six superseded reference test files are removed: acquisition case handlers, both PostgreSQL adapters, prelaunch direct handlers, research submit handler and research admin responses handler. Each asserts only package-owned behavior.
118
+ Migration: Reference direct acquisition tests retain retirement and real admin-auth assertions. Reference prelaunch route tests and evidence direct tests retain host composition coverage. Managed submission retains only reference-side copy/escaping coverage; package tests assert the synthetic renderer seam and ordering.
119
+ Migration: Real PostgreSQL parity lives at `tests/postgres/acquisitionEvidenceParity.test.ts`, imports package factories from `/marketing/server/postgres`, applies the hash-checked manifest prefix and connects all ports using a login granted only runtime-role membership. Missing Docker throws instead of skipping. The fixture owner is used only for setup, state inspection and the donor's append-only trigger proof; separate runtime-role mutation assertions retain privilege-denial coverage in the same case. The witness retains 11 cases. Test rows use deterministic synthetic identifiers and timestamps, and emails use `example.invalid`.
120
+ Migration: The installed consumer exercises a historical count and a conflict refusal with injected bindings without optional peers. The `/postgres` entry receives missing-peer import refusal and selected-peer factory/refusal checks through the existing adapter proof. One package-boundary bundle case prevents the server entry from reaching PostgreSQL adapters or `pg`, bringing the additive seam cases to seven within the eight-case limit. Exact export, API and package-smoke inventories include both server entries; artifact caps, dependencies, migrations and grants are unchanged.
121
+
122
+ The browser-safe marketing surface provides inert analytics defaults, independently attempted local sinks, injected route policy, paid purchase projection and historical consent-time selection. The reference application binds its existing policy and wire names while preserving its purchase transcript. Local admission booleans establish synchronous acceptance only, never delivery.
123
+
124
+ Migration: `AnalyticsStepName<StepName = string>` and `AnalyticsEventMap<StepName = string>` accept host step literals instead of a product-specific union. `AnalyticsCheckoutItem`, `AnalyticsPurchaseItem`, `AnalyticsCheckoutMode`, `AnalyticsPaymentWaitOutcome` and `AnalyticsEventName` retain the neutral event vocabulary. Types are also available type-only through `./marketing/contracts`.
125
+ Migration: `createNoopAnalytics` reuses the existing core `AnalyticsPort`. `initializeDeploymentAnalytics`, `trackDeploymentEvent`, `syncAdvertisingConsent` and `trackAdvertisingPurchase` are inert defaults.
126
+ Migration: The donor-only transport ownership field and provider-specific purchase envelope, transport result and transport types are excluded private transport concerns; hosts extend their own event map outside the package.
127
+ Migration: `createAnalyticsDataLayer` replaces module-global mutable state with per-instance state. `AnalyticsDataLayerOptions` injects consent storage/event names, event prefix, container reader, deployment callback and browser access. Defaults are inert. `AnalyticsBrowserWindow`, `AnalyticsCookieConsent`, `AnalyticsSinkAttemptMask` and `AnalyticsSinkAdmission` describe those seams. Host bindings retain historical literals. Consent command arguments, ordering, parse rules, push-time advertising grants and independent synchronous admission are preserved; no pre-consent replay is added.
128
+ Migration: Hosts must supply `AnalyticsDataLayerOptions.consentSignalNames` to enable optional event admission and consent commands: one `analytics` wire name and ordered `advertising` wire names. Omission pushes no consent commands and returns false from `pushAnalyticsEvent`, even with browser access, a container and stored consent; deployment sink attempts are unaffected. Supplied settings retain the analytics key first, then advertising keys in host order, with unchanged consent values.
129
+ Migration: `createAnalyticsRoutePolicy` takes required `AnalyticsRoutePolicyInput` public paths, redirect sources and sensitive sets; there is no ambient route manifest or default sensitive-path policy. `normalizeAnalyticsPathname` preserves normalization. The returned optional-route eligibility method uses a neutral name; hosts alias their historical name.
130
+ Migration: `projectPaidPurchase`, structural `PurchaseOrder` and `PurchaseSuppressionReason` preserve paid allocation, grouping, residual shipping, cap and ordered refusal logic. Currency is a plain string with no ambient currency initialization. The reference guards unsupported kinds before projection through a null input, preserving its renewal refusal and order/payment precedence; the package admits renewal as subscription, matching the donor.
131
+ Migration: `selectMarketingHistoricalConsentTime`, `MarketingHistoricalConsentCommand`, `MarketingHistoricalConsentState` and `MarketingHistoricalConsentResult` expose only chronology facts and the exact compared state literals. Command authorization, persistence and workers stay with the host.
132
+ Migration: `createAnalyticsContextHandler` is exported only by `./marketing/server`, with server-only `AnalyticsContextHandlerDeps`, `AnalyticsContextPersistencePort`, `AnalyticsContextStoreResolver` and `AnalyticsContextCapabilityCrypto`. Platform `HttpRequest`/`HttpResponse` and a required host `BffResponder` replace application HTTP/envelope imports; the host keeps its route path and observability wrapper.
133
+ Migration: The context handler requires an `isEnabled` reader instead of reading an ambient flag. The host retains the flag name and exact enabled-value comparison; the package has no enabling default. Method, flag, origin and strict request-schema refusal order and error codes/messages are preserved. The schema uses the package's jitless validation wrapper.
134
+ Migration: `AnalyticsContextHandlerDeps.clientIdField` is a required host binding for the historical client-id wire field name. Each handler builds its strict schema once with that key, retaining the numeric-dot-numeric pattern, 64-character limit, optional field, `explicitGrant` default false and granted-requires-client-id refusal. Internal and persistence fields remain `clientId`; hosts retain their serving wire names.
135
+ Migration: The host supplies `capabilityCrypto.mintToken` and `hashToken` instead of built-in cryptography, and `cookieName` as the historical compatibility input. Minting must provide opaque 32-byte lowercase hexadecimal tokens and hashing must preserve the host's cryptographic digest. Cookie parsing still selects the first matching name, accepts only 64 lowercase hexadecimal characters and hashes the token; mint timing, cookie attributes and explicit no-store placement are unchanged.
136
+ Migration: `resolveStore` replaces the application gateway lookup; null still refuses with `UPSTREAM_UNAVAILABLE`. `AnalyticsContextPersistencePort.syncContext` receives token hash, granted and client id, and `enrollSubscriptions` receives the verified subject and context hash. These throwing operations replace the application RPC-call wrapper; the host keeps RPC names, argument translation, error-to-throw handling and gateway service authority. Only literal true is active. No default persistence or portable SQL exists, and no reference route is added; a host must supply persistence before mounting the handler.
137
+ Migration: Required `readAccessToken` and `resolveTrustedSubject` bindings replace application authentication imports. The host verifies the bearer under its service authority; invalid bearer grants still refuse before writes, withdrawal needs no identity, and enrollment uses only the verified subject. Explicit regrant replacement, revoked predecessor retention and `{ active }` responses are unchanged. An active result is a local context fact, never delivery; telemetry context failure never gates commerce.
138
+
139
+ Extend the experimental browser-safe `@openlup/platform/marketing` entry with
140
+ JSON-LD serialization and graphs, route URLs and hreflang, an ordered head
141
+ descriptor and contact/legal plain-data projections. Contact/legal/privacy
142
+ content contracts are type-only exports from `@openlup/platform/marketing/contracts`
143
+ and the runtime entry. Applications supply all identity, origin, locale, image,
144
+ document and processor facts. Responsibility-specific source files re-export
145
+ through the existing marketing barrel without adding a subpath, renderer,
146
+ dependency, network call or application policy. Fresh synthetic conformance and
147
+ browser-bundle tests, API declaration snapshots and the installed consumer
148
+ witness both entries.
149
+
150
+ Donor divergences: entity facts, lifecycle-selected organization type, contact
151
+ type/languages, image URLs/dimensions, route registry, default locale and social
152
+ metadata become explicit inputs. Product brand prefixing, fixed category,
153
+ audience, fallback weight and image-slug lookup are removed; category, images,
154
+ SKU, GTIN and net content are caller supplied or omitted. The fixed locale union
155
+ becomes strings, and FAQ fields use neutral question/answer names. The private
156
+ image variant helper, language detection and unregistered-route alternate escape
157
+ hatch remain application concerns. The head's canonical input uses the injected
158
+ route contract instead of the donor's loose absolute-URL passthrough.
159
+ The head requires application-supplied image width, image height and Twitter
160
+ handle, and emits `og:image:width`, `og:image:height` and `twitter:site`
161
+ unconditionally in donor order. `og:locale:alternate` remains conditional on
162
+ a supplied alternate locale.
163
+
164
+ Contact shaping uses supplied support email, shared organization facts, address
165
+ text and ordered registration label/value pairs in place of private identity
166
+ constants and country-specific identifiers. The optional `registrationAuthority`
167
+ line is absent only when its input is undefined; supplied blank company lines
168
+ are retained. Legal shaping takes supplied title, intro and ordered title/body
169
+ sections in place of fixed translation keys and section inventories. The
170
+ last-updated text is optional; supplied blank text is retained. Page markup,
171
+ translations, navigation and other contact copy remain application-owned.
172
+ Privacy processor disclosures are new structural types, with no projection.
173
+
174
+ The reference `SeoHead` adapter renders the descriptor through the existing
175
+ `react-helmet-async` dependency with `defer={false}`, removes unmanaged shell
176
+ canonical/alternate links after client commit only in the host-supplied `csr`
177
+ render mode (as in the donor), and emits the serialized JSON-LD
178
+ unchanged. These donor host behaviours stay outside the package. The adapter
179
+ has no serving-route mount; mounting is a later integration. Its tests witness
180
+ hidden-document commits, hostile script data and shell canonical replacement.
181
+
182
+ Migration: none. Both entries are extended additively; no SQL or application route changes.
183
+
184
+ The experimental `createMarketingContribution` helper in
185
+ `@openlup/platform/composition` describes selected marketing callables as an inert
186
+ `marketing` capability providing `./marketing`, `./marketing/contracts` and
187
+ `./marketing/server`, depending on identity's `./identity/contracts` runtime
188
+ obligation schema.
189
+ Handlers are projected to descriptors without `handle`; ports, routes and
190
+ triggers retain supplied callable identity. Duplicate registration identities
191
+ refuse, and null ports remain required without creating callable bindings.
192
+
193
+ Divergences from the donor: no donor composition exists; this helper supplies
194
+ descriptors only; no worker, route or schedule is installed.
195
+
196
+ Migration: Import `createMarketingContribution` from `@openlup/platform/composition` and supply already-bound operations, handler registrations, routes, schedules and host schema requirements explicitly.
197
+ Migration: Bind each required operation under `@openlup/platform/marketing:<name>`; a null operation remains a Core readiness obligation and reports `OPENLUP_E_PORT_MISSING` until bound.
198
+ Migration: The helper invokes no operation during construction. Host admission and installation of workers, routes and schedules remain application-owned.
199
+
200
+ The existing `./marketing/server` entry additionally exports the marketing privacy
201
+ contributor and default-off binding. Both complete owner ports and explicit
202
+ enablement select one contributor, shared by the callables supplied to composition.
203
+ Unbound or partial ownership reports unavailable coverage and unresolved
204
+ obligations; identity refuses erasure before owner effects. Identity owns the
205
+ subscriptions veto, receipt replay and rollback. The fence runs only during
206
+ `eraseOrRetain`, after all assessments; fence failure throws without owner text.
207
+ Accepted provider requests retain an accepted-not-observed reason and never
208
+ claim deletion or complete remote export coverage.
209
+
210
+ Donor divergences: worker, operator and store stay app-owned. Only O18 outcomes
211
+ and fence semantics are contributed; provider calls, claims, retries, schedules,
212
+ SQL and late-import orphan handling remain with their owners. The reference
213
+ privacy graph leaves marketing unselected, and marketing privacy coverage there
214
+ remains an open gap. Raw managed questionnaires and other processors are outside
215
+ this contributor's coverage.
216
+
217
+ Migration: Import `createMarketingPrivacyBindings` and its owner port types from `@openlup/platform/marketing/server`; bind both complete transactional owners and set `enabled: true` explicitly to select a contributor.
218
+ Migration: Register the returned contributor with identity and pass the returned `exportPersonalData`, `assessErasure` and `eraseOrRetain` callables as the marketing record to `createMarketingContribution`; disabled or partial bindings expose null callables.
219
+ Migration: Compose identity's `./identity/contracts` module dependency and preserve its assessment-before-mutation, subscriptions veto, receipt replay and unit-of-work rollback contract.
220
+ Migration: Keep remote profile coverage unavailable; accepted requests and outstanding imports or targets do not establish observed deletion. The reference requires a separately authorized owner binding before marketing privacy coverage can be claimed.
221
+
222
+ Declaration repair: Privacy owner ports and `MarketingPrivacyContributor` use
223
+ local structural types and identity's `./identity/contracts` types, preserving
224
+ compatibility with identity's contributor without referencing its main entry.
225
+ `./marketing/server` remains free of the optional `pg` peer in strict installed
226
+ declaration compilation; only `./marketing/server/postgres` selects that peer.
227
+ The runtime obligation schema still comes from `./identity/contracts`.
228
+ Identity's public surface, privacy execution and the 16-case K5 budget are unchanged.
229
+
230
+ - Packed root-documentation budget: the docs-gzip cap in release-gates.json rises from 57,344 B to 73,728 B, approved by the owner on 2026-10-26, because the assembled 0.29.0 notes measured 63,226 B; no other cap changes.
231
+
232
+ ## [0.28.0]
233
+
234
+ - Publishable on the npm `latest` dist-tag as `0.28.0`, from tag
235
+ `openlup-platform-v0.28.0`.
236
+
237
+ Add experimental account-support and type-only account-support/contracts exports
238
+ with five owner-derived envelopes, explicit capability types, unchanged account-read
239
+ diagnostics and an injected read facade. Hosts retain authorization, projections,
240
+ private extensions and driver selection; command envelopes install no executor.
241
+ Add owner-equality, browser, delegation, reference and packed-consumer witnesses.
242
+
243
+ Migration: none for existing callers. The new subpaths are additive and the
244
+ reference diagnostic path retains its exports and behavior. The catalog,
245
+ commerce-server, commerce, fulfillment, identity, pricing and promotions API
246
+ reports (`api/catalog.api.md`, `api/commerce-server.api.md`, `api/commerce.api.md`,
247
+ `api/fulfillment.api.md`, `api/identity.api.md`, `api/pricing.api.md`,
248
+ `api/promotions.api.md`) reorder existing enum/union members because declaration
249
+ emit order changed after adding the module: member order only, no declaration
250
+ change; no member is added, removed or changed. No SQL migration or activation.
251
+
252
+ Add bounded account/support read composition through the existing experimental
253
+ account-support and type-only account-support/contracts entries. New runtime
254
+ exports: CUSTOMER_ACCOUNT_V2_CONTRACT_VERSION, readAccountSnapshot,
255
+ isCustomerVisibleSubscription, recurringPrice, computeEditState, editCutoff,
256
+ buildActionRequired, CUSTOMER_ORDERS_CONTRACT_VERSION, readCustomerOrderSummaries,
257
+ readCustomerOrderDetail, customerOrderMoney, toOrderMoneyHeader, toOrderMoneyItem,
258
+ mapCustomerOrderLines, lineListTotalMinor, SUPPORT_CUSTOMER_360_CONTRACT_VERSION,
259
+ projectCustomer360Snapshot, deriveContactHealth, boundedCustomerJourneyAudit,
260
+ createCustomer360ReadFacade, createInvoiceAccess, downloadOwnedInvoicePdf and
261
+ deriveCustomerDocumentDeliveryStatus. Add neutral account/order/support DTOs and
262
+ typed source, projection and invoice-owner ports; preserve R1 exports.
263
+
264
+ Reference factories and host-fed views are default-off/unmounted. Native support
265
+ reads use the existing authorized PostgreSQL scope; unselected capabilities
266
+ refuse explicitly. Pricing, captured presentation and private extensions stay
267
+ host injected. Invoice access binds the document to a found owned-order history
268
+ before ticket resolution or artifact IO, adding one history read; foreign/unknown
269
+ documents return denied. Download requires a bound owned-order history; an unbound
270
+ history reports unsupported (host_binding_required). Denied, unknown and unsupported
271
+ history results retain their distinct M09 outcomes before ticket/artifact IO;
272
+ thrown history stays unknown. M09 PDF validation remains unchanged.
273
+ Customer 360 facade authorization now runs before every source read and returns
274
+ denied with zero source IO on refusal. The reference binding uses that callback
275
+ once per call before opening a governed journey or independent diagnostic scope.
276
+ Customer 360 subscription pointer enrichment includes optional nullable
277
+ paymentMethodKind, preserving selected-empty null and unread omission. Reference
278
+ diagnostic search, segment history and v2 overview select their own authorized
279
+ scope; reference line presentation picks only its declared display fields.
280
+
281
+ Migration: the unreleased Customer360Subscription gains optional nullable
282
+ paymentMethodKind. Selected Customer360ProjectionInput.subscriptionPointers values
283
+ now supply paymentMethodKind alongside shippingAddressId; use null for known-empty
284
+ evidence and omit the pointer source when unread. Callers of the unreleased
285
+ createCustomer360ReadFacade now supply authorize(): Promise<boolean> alongside
286
+ journey, summary and diagnostics, and handle the added { kind: "denied" } result
287
+ on every method. No SQL migration is required.
288
+
289
+ The unchanged generator also regenerates these sibling API reports:
290
+ - `packages/platform/api/catalog.api.md`
291
+ - `packages/platform/api/commerce-server.api.md`
292
+ - `packages/platform/api/commerce.api.md`
293
+ - `packages/platform/api/communications.api.md`
294
+ - `packages/platform/api/fulfillment.api.md`
295
+ - `packages/platform/api/identity.api.md`
296
+ - `packages/platform/api/invoicing.api.md`
297
+ - `packages/platform/api/pricing.api.md`
298
+ - `packages/platform/api/promotions.api.md`
299
+
300
+ These generated companions are member order only, no declaration change. No
301
+ snapshot is hand-edited; no member is added, removed or changed in those reports.
302
+
303
+ Add experimental self-service composition returning SelfServiceCommandFacade,
304
+ with required host capabilities and every guarded output lane. ENV-R3-1 keeps
305
+ input lanes optional and adds nativeLegacySubscription plus subscriptionControl.
306
+ Unselected methods return AccountSupportLaneUnavailable: paymentMethod uses the
307
+ host paymentMethodSetup refusal by identity, commerce uses commerceRecovery,
308
+ and every other lane uses a frozen host_binding_required refusal after its guard.
309
+ Native routing retains ownership-before-quote behavior and explicit pause; typed,
310
+ raw, profile, method, commerce and recovery delegates keep owner results/refusals.
311
+ Raw/typed admission requires the supplied clientId before every owner call. The
312
+ trailing `ControlSnapshot = unknown` generic preserves snapshot DTOs and existing
313
+ twelve-argument consumers.
314
+ The generic M07 adapter maps setupMethod to paymentMethod.execute. No owner type
315
+ imports or new module-graph edges. Native repair is a registered follow-up, not a
316
+ cut; token handlers stay in reference source. The reference binding remains off.
317
+
318
+ The unchanged API generator leaves two sibling snapshots changed from final R1:
319
+ `commerce-server.api.md` and `commerce.api.md` under `packages/platform/api/`.
320
+ These are disclosed generated companions: member order only, no
321
+ declaration change, proven by AST comparison normalizing union/enum member order.
322
+
323
+ Migration: development-preview envelope delta ENV-R3-1. Supply verified context,
324
+ AccountSupportCapabilities and complete selected owner lanes. Handle the named
325
+ unavailable arm in method results. Supported paymentMethodSetup requires paymentMethod; supported
326
+ commerceRecovery/configuredPurchase require commerce; supported subscription
327
+ genericBundleCommands/commandBoundReceipts require a subscription command lane. No schema, dependency, release cap, activation or browser cutover change.
328
+
329
+ Add explicit operator recovery composition, current managed email claim/settlement,
330
+ managed account link and human recovery fence, and native support delegation to
331
+ M10 through injected executors. Preserve donor callback and failure ordering;
332
+ expose actual optional owner receipts and truthful link-then-action partial results.
333
+ The reference binding remains default-off and unmounted.
334
+
335
+ Migration:
336
+ - Introduce the frozen native support-authority SQL and packed twin plus the
337
+ managed current-authority forward, after complete same-rail predecessors.
338
+ - Retire `customer_support_correct_subject_email_v1`: human calls raise 55000
339
+ `customer_support_email_correction_requires_admission`; drain old callers and
340
+ use admission → claim → claim-fenced identity commit → settlement.
341
+ - operator_subscription_actions: 3 combined email calls now execute admission → claim → claimed auth move (linked only, deferred fence forced before settlement) → settlement; existing success/replay/collision/stale/audit expectations retained; human roster fixture added.
342
+ - operator_contact_correction: 4 combined email calls now execute admission → claim → claimed auth move (linked only, deferred fence forced before settlement) → settlement; existing success/replay/collision/stale/audit expectations retained; human roster fixture added.
343
+ - runtime_capability_boundary: missing-subject/null-clock correction uses admission (same subject_not_found result); human admission fixture added; machine retired-entry 42501 unchanged.
344
+ - marketing_lead_email_namespace: 1 combined email calls now execute admission → claim → claimed auth move (linked only, deferred fence forced before settlement) → settlement; existing success/replay/collision/stale/audit expectations retained; human roster fixture added.
345
+ - absorb_lead: 1 combined email calls now execute admission → claim → claimed auth move (linked only, deferred fence forced before settlement) → settlement; existing success/replay/collision/stale/audit expectations retained; human roster fixture added.
346
+ - CD-8: use `status = 'payment_pending'` for native residual-unpaid detection,
347
+ matching the native cycle CHECK; native outcomes and the managed predicate stay
348
+ unchanged. The native witness covers resume with and without that cycle.
349
+ - CD-9 standing donor-adopter adoption mapping: link keeps the same body; the donor adopter uses
350
+ INVOKER with table-wide `service_role` access, while OpenLup uses DEFINER under
351
+ column-level capability closure. Preserve the migration owner, fixed search
352
+ path and service-only EXECUTE; widen no table grant. Retired email correction
353
+ and recovery remain INVOKER.
354
+ - RD-R4-4 link refusal proof: machine/non-human, missing and inactive operators
355
+ leave clients, support commands and audit rows unchanged. Subject refusals
356
+ leave clients and auth identities unchanged and write exactly one refusal
357
+ receipt plus one matching audit row for the key, with no other row/xmin changes.
358
+ Unknown subjects return `refused` / `subject_not_found`; email expectation,
359
+ foreign-identity and already-linked conflicts return `conflict` with
360
+ `email_expectation_conflict`, `identity_linked_elsewhere` and
361
+ `subject_account_linked`, respectively. Same-key replay returns the stored
362
+ refusal unchanged with zero further writes.
363
+ - Native M03 contact/link and unsupported M10 subcases remain named refusals;
364
+ no historical migration, pin, module graph or source-release contract changes.
365
+
366
+ API generator companions and measured verification are recorded in the module plan.
367
+
368
+ Add inert account/support graph bindings, guarded owner services and composition
369
+ descriptors over the R1–R4 envelopes. The reference recipe is default-off, mounts
370
+ nothing and starts no workers. Service/port/route aliases share one callable
371
+ guard; readiness is observed before every entrance. Owner authorization, keys,
372
+ receipts, refusals and M04 delivery/replay remain with their existing owners.
373
+ The reference operator subscription adapter restores donor BFF command metadata
374
+ around one R4 dispatch and serializes only the strict donor outcome fields,
375
+ including decoded ISO timestamps and explicit nulls. Optional native `ownerReceipt`
376
+ evidence stays server-side and is absent from the response. The composition witness
377
+ distinguishes that response from SQL storage.
378
+
379
+ Migration: additive `createAccountSupportBindings`, `createAccountSupportServices`
380
+ and `createAccountSupportContribution` exports. Hosts supply one graph, prebound
381
+ operations, exact selected schema and complete catalogue identity, map admission
382
+ refusals before serving routes, and explicitly compose declared owner contributions.
383
+ Null selected operations remain required/unbound. Commerce is a nullable injected
384
+ record returning `unsupported/host_binding_required` when unbound. The reference
385
+ `commerceOwner` option accepts the host-built M11 selection over bound checkout,
386
+ recovery and ATP callables, with the complete account/M11/ATP schema union and
387
+ matching enablement/readiness. R5b does not construct M11 or import its adapters;
388
+ it uses a local structural selection type. Supply the existing effect registry
389
+ as `commerceRegistry` and forward guarded services and contributions once;
390
+ unknown stock, unsupported options and commerce outcomes remain unchanged.
391
+ While account-support is disabled, a supplied M11 selection stays cold: the
392
+ keyed commerce entrance returns the disabled refusal before the selected owner
393
+ or the injected record runs, and no M11 contribution, port, route, trigger,
394
+ reference handle or schema requirement is forwarded.
395
+ Configured recovery/purchase elements use explicit host paths and clients. No SQL, version, serving
396
+ activation or source-release snapshot changes. Regenerated account-support and
397
+ composition API reports describe these additions; no sibling API report changed.
398
+
13
399
  ## [0.27.0]
14
400
 
15
401
  - Publishable on the npm `latest` dist-tag as `0.27.0`, from tag
@@ -147,130 +533,3 @@ Migration: Subscription finalize validates retained acquisition terms under the
147
533
  Migration: The acquisition terms reader refuses absent effective terms; the no-policy finalize compatibility branch remains available.
148
534
  Migration: New-purchase stock reads use ATP with renewal exemption fixed false, bounded SKU arrays and conservative stale reporting. The service-only reader uses owner privileges with `SECURITY DEFINER` and `search_path = pg_catalog, pg_temp`.
149
535
  Migration: Starter graduation admits 14, 21 or 28 days, while provisional creation uses the retained starter interval and subscription timezone default. Rolling back below the forward with a 21-day marker is unsupported; roll forward.
150
-
151
- ## [0.26.0]
152
-
153
- - Publishable on the npm `latest` dist-tag as `0.26.0`, from tag
154
- `openlup-platform-v0.26.0`.
155
-
156
- Managed dunning attempt replay.
157
-
158
- Carry the exact applied failure attempt through renewal propagation. Managed
159
- same/stale observations replay the canonical result; newer attributed failures
160
- advance and revoke prior recovery authority, including used tokens.
161
-
162
- Migration: `CycleChargeFailurePropagationPort.openDunningCase` now requires nullable `failedPaymentAttemptId`; update host implementations and callers to pass the applied transition's identity.
163
- Migration: `applyFailedResult` may return `paymentAttemptId?: string | null`; return the durable applied attempt so propagation can forward it, including on replay.
164
- Migration: managed hosts must pass exact applied-transition attribution to the new overloads. Fresh missing attribution refuses with SQLSTATE `55000`; do not substitute the current or prepared attempt. Already-applied donor schema/backfill requires the explicit host mapping in DATA_AND_MIGRATIONS.
165
-
166
- Native attempt-replay parity remains REGISTERED with M10; these managed forwards
167
- do not implement native parity or authorize host activation.
168
-
169
- ## [0.25.0]
170
-
171
- - Publishable on the npm `latest` dist-tag as `0.25.0`, from tag
172
- `openlup-platform-v0.25.0`.
173
-
174
- - Re-pin the pending M10/F17 control fixtures after landed M08/M09 without
175
- changing either installation rail, the migration manifest or landed N1. The
176
- 16-entry packet has seven native and nine managed pins. Native X restores
177
- ATP-counted late-positive stock recovery; Y filters paid retry candidates
178
- before LIMIT. Fold command-preview receipt replay into uninstalled N2, keeping
179
- apply unchanged. Preserve the historical 14-pin approval reader and exact
180
- prefix, definition, statement, ACL and catalog controls. Real PostgreSQL
181
- witnesses cover ATP, starvation, all 43 fresh command scenarios and raw preview
182
- replay with no counts/columns/xmin delta.
183
-
184
- No package SQL asset, export, runtime activation or external CI dependency is
185
- introduced. The development-preview boundary remains.
186
-
187
- - Fix uninstalled N3 normal_due pagination to exclude waiting/stock_secured cases before LIMIT, preventing normal-renewal starvation.
188
-
189
- - Repair uninstalled N2 donor no-op truth for native bundle/resize, plan, package, add-on and same-UTC-day slide commands before repricing: preserve locked prices after catalogue changes, writing only the command receipt, with no quote, event or version increment. Native resize compares lines/cadence; portion mode/factor remain host-owned without native storage. Predicate-removal mutants cover every mapped donor action; apply stays unchanged.
190
-
191
- - Audit pending M10 donor change and no-op semantics together. N2 plan edits
192
- apply requested core lines; new add-ons normalize quantity, preserve cadence
193
- and compare UUIDs by value. N3 preserves paused waits, filters eligible recovery
194
- before LIMIT, binds frozen reads to the current active schedule, reports free
195
- stock separately from own holds, and ignores closed/unpaid realization notices.
196
- Real PostgreSQL tables cover applied state, no-op/refusal/replay and rolled-back
197
- assignment mutants. Installed rails and N2 apply remain unchanged; channel
198
- exposure/admission parity stays outside the frozen stock-seam claim.
199
-
200
- - Close the 0.24.0 known limitation that managed dunning exhaustion still pauses active subscriptions.
201
- - Land the reviewed managed M1/M2 prefix: refunds preserve subscription lifecycle and paid history; exhausted dunning stays open with NULL retry and active service until authorized same-cycle repair.
202
- - Folded scope E-gate-replay-loop-landed-untested: retain the existing interleaving-aware catalog replay and add the Docker-free landed N1/M1/M2 witness.
203
- - Folded scope D-earlier-pin-digest-unplanted: prove CI and release refuse changed earlier M1 bytes beneath landed M2.
204
-
205
- Migration notes: Apply M1 then M2. Existing paused, expired and refund-cancelled history is not rewritten or reactivated. The existing first-cycle refund stock-release guard remains; later refund-evidence parity and stock-wait/winback changes are separate. No runner is activated.
206
-
207
- - Add native N2 command preview/apply stores and a P1 command adapter with atomic future terms, actor/key/actual-command receipts and applied/replayed/noop/refused outcomes; preserve frozen current obligations and existing native callers.
208
- - Type-level flip for dev-preview consumers: `NATIVE_SUBSCRIPTION_CAPABILITIES.genericBundleCommands.supported` and `.commandBoundReceipts.supported` change from `false` to `true`; command results now include `SubscriptionCommandRefusal`.
209
-
210
- Migration: install N1 then N2 through the complete native manifest; preserve receipts on rollback. Accepted future prices use lock_until_edit, proration none. Address mutation and private introductory/graduation policy stay host-owned; native activation continues to require captured payment evidence.
211
-
212
- Migration (C73, temporary limitation): managed `subscription_create_provisional_for_checkout` stamps an explicit timezone literal equal to today's `subscriptions.timezone` column DEFAULT. Adopters changing that DEFAULT must also replace the function until the scheduled follow-up forward follows the DEFAULT; no managed SQL changes here.
213
-
214
- Migration: `SubscriptionCommandPort.apply()` may now return `SubscriptionCommandRefusal` (`outcome: "refused"`), so callers must handle it.
215
-
216
- - Type-level change visible to dev-preview consumers: `RenewalPaymentRail.execute` adds an optional `failure` field for explicit failure evidence.
217
- - A host or driver skips `openCase` after a replayed `applyFailure` receipt only when that rung's case propagation already committed; otherwise recovery must complete propagation. The P8 retry driver must add a replay/case-advanced signal and a zero-delta witness for replay after committed propagation.
218
- - N2 preview follows the supplied core lines for plan-length changes (omitted lines retain stored expansion); new add-ons normalize missing/nonpositive quantity to one, add-on actions preserve cadence, and quantity updates/removals compare variant UUIDs case-insensitively.
219
-
220
- Land the seven reviewed managed stock-wait/ATP and F17 refund-parity forwards.
221
- Managed hosts can use the service-role SQL functions and pgTAP witnesses; the
222
- package declares the SQL surface and keeps TypeScript stock recovery unavailable
223
- because no managed adapter implements the stock-wait/availability ports.
224
-
225
- Migration: apply the complete managed prefix through `20261024185100` before
226
- calling stock-wait or refund-evidence functions. M4 extends M2's active/open
227
- continuity with wait exclusion before LIMIT. M5 makes positive customer
228
- cancellations immediately winback-eligible within 120 days, retaining episode
229
- dedupe, and maps started/resumed notices. F17 accepts cumulative provider snapshots,
230
- emits one refunded event on transition, and preserves M1 refund/lifecycle
231
- independence. Keep captured obligations and receipts on rollback and disable the
232
- host stock-wait driver first. SQL installs no scheduler or payment executor.
233
-
234
- ATP protects active upcoming demand within 14 days plus live provider hard holds.
235
- The exposure hook remains zero; current donor channel admission is deferred.
236
- This is a development-preview SQL surface, not a composed managed TypeScript port
237
- or a claim of advance future-cycle reservations or stable installation support.
238
-
239
- Native stock-wait persistence, frozen discovery and stock-only refusal recovery
240
- now have transaction-bound adapters. The native ATP/new-purchase read protects
241
- hard holds and fixed 14-day soft subscription demand; the renewal allocator uses
242
- the same seam. X restores late-paid released stock once, and Y filters paid and
243
- settled retry obligations before LIMIT. Managed stock wait and runner composition
244
- remain separate; native selection still requires passing real-PostgreSQL proof.
245
-
246
- Migration: install the native N3, ATP seam, allocator, X and Y prefix in filename
247
- order, with their package twins and regenerated selected-catalog-v2 inventory.
248
- Migration: upgrading hosts must grant their native inventory-reserving runtime
249
- role EXECUTE on public.inventory_available_to_promise(text,text,timestamptz,boolean)
250
- and public.inventory_channel_exposure_quantity(text,text), plus SELECT on the
251
- seam's underlying relations as listed in Data and migrations, before using the
252
- updated allocator or N3 stock-wait paths.
253
- `StockWaitStorePort.listCandidates` now returns `StockWaitFrozenCase[]`: discovery
254
- may have no durable case yet. Hosts must retain its frozen snapshot and binding.
255
- Frozen discovery requires the active current schedule; paused current waits remain open.
256
- Deficits separate own reserved units from free ATP and subtract both for missing
257
- units. Closed or pending-payment resume callbacks return null without writes; paid
258
- fulfillment-pending orders can complete realization admission.
259
- No advance reservation, physical coverage guarantee or one-time checkout writer
260
- is introduced. No pause, payment execution or parcel-arrival fact is added.
261
- Uncaptured stock refusals rotate on the operation selection timestamp even when
262
- missing or stale stock prevents case creation, allowing replenished work through
263
- a bounded candidate page.
264
-
265
- M10 P6 + P8: composed subscriptions (development preview)
266
-
267
- Migration: Additive `./subscriptions` facades are `createSubscriptionServices`, `createSubscriptionCommandExamples`, `createSubscriptionLifecycleMessages` and `subscriptionLifecycleTemplate`; hosts explicitly supply readiness, execution, commands and M04 delivery. No factory activates serving work. `SubscriptionLifecycleFact` is exported from this entry; `subscriptionLifecycleTemplate(kind, retryAttempt?)` preserves the installed payment-failure rungs (1, 2, otherwise 3). `runRenewalBatchRows` exposes the existing per-row error-result isolation for composed hosts.
268
- Migration: Additive `./composition` entry `createSubscriptionContribution` describes exactly one selected subscription schedule; off supplies none. Hosts bind its callable to their existing population lease and observe the complete installed schema.
269
- Migration: `createPostgresRetryStore` adds `failureProgress(operationId,key)`, returning receipt replay and committed case progression. The native retry driver completes interrupted propagation and skips already advanced cases; existing applyFailure/openCase signatures remain unchanged.
270
-
271
- The inert native reference binding composes mandatory G23, dunning and stock wait.
272
- Captured alignment cases retain authority under off. Prepared attempts reconcile
273
- without re-execution; ordinary retries bind the frozen mandate and logical cycle.
274
- M04 owns delivery; M12 owns aggregation. No SQL asset, serving swap, release or
275
- managed TypeScript recovery is introduced. Native multi-cycle prepaid and M07
276
- prepared-attempt-store capabilities retain their named unsupported boundaries.