@openlup/platform 0.20.0 → 0.22.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 (458) hide show
  1. package/CHANGELOG.md +272 -278
  2. package/README.md +195 -6
  3. package/dist/composition/composeBundle.d.ts +13 -0
  4. package/dist/composition/composeBundle.js +4 -0
  5. package/dist/composition/fulfillmentContribution.d.ts +21 -0
  6. package/dist/composition/fulfillmentContribution.js +19 -0
  7. package/dist/composition/index.d.ts +1 -0
  8. package/dist/composition/index.js +2 -0
  9. package/dist/fulfillment/adapterConformance.d.ts +3 -0
  10. package/dist/fulfillment/adapterConformance.js +223 -0
  11. package/dist/fulfillment/bindings.d.ts +3 -0
  12. package/dist/fulfillment/bindings.js +29 -0
  13. package/dist/fulfillment/commerceFulfillmentHandlers.d.ts +29 -0
  14. package/dist/fulfillment/commerceFulfillmentHandlers.js +184 -0
  15. package/dist/fulfillment/commerceFulfillmentReadModel.d.ts +86 -0
  16. package/dist/fulfillment/commerceFulfillmentReadModel.js +131 -0
  17. package/dist/fulfillment/contracts/alignment.d.ts +25 -0
  18. package/dist/fulfillment/contracts/alignment.js +1 -0
  19. package/dist/fulfillment/contracts/bindings.d.ts +51 -0
  20. package/dist/fulfillment/contracts/bindings.js +1 -0
  21. package/dist/fulfillment/contracts/capabilities.d.ts +29 -0
  22. package/dist/fulfillment/contracts/capabilities.js +1 -0
  23. package/dist/fulfillment/contracts/conformance.d.ts +93 -0
  24. package/dist/fulfillment/contracts/conformance.js +1 -0
  25. package/dist/fulfillment/contracts/customerAlignment.d.ts +6 -0
  26. package/dist/fulfillment/contracts/customerAlignment.js +1 -0
  27. package/dist/fulfillment/contracts/dispatch.d.ts +105 -0
  28. package/dist/fulfillment/contracts/dispatch.js +1 -0
  29. package/dist/fulfillment/contracts/index.d.ts +18 -0
  30. package/dist/fulfillment/contracts/index.js +1 -0
  31. package/dist/fulfillment/contracts/label.d.ts +35 -0
  32. package/dist/fulfillment/contracts/label.js +1 -0
  33. package/dist/fulfillment/contracts/nativeUnsupported.d.ts +6 -0
  34. package/dist/fulfillment/contracts/nativeUnsupported.js +1 -0
  35. package/dist/fulfillment/contracts/observation.d.ts +52 -0
  36. package/dist/fulfillment/contracts/observation.js +1 -0
  37. package/dist/fulfillment/contracts/operator.d.ts +64 -0
  38. package/dist/fulfillment/contracts/operator.js +1 -0
  39. package/dist/fulfillment/contracts/read.d.ts +110 -0
  40. package/dist/fulfillment/contracts/read.js +1 -0
  41. package/dist/fulfillment/contracts/readback.d.ts +38 -0
  42. package/dist/fulfillment/contracts/readback.js +1 -0
  43. package/dist/fulfillment/contracts/replacement.d.ts +34 -0
  44. package/dist/fulfillment/contracts/replacement.js +1 -0
  45. package/dist/fulfillment/contracts/store.d.ts +86 -0
  46. package/dist/fulfillment/contracts/store.js +1 -0
  47. package/dist/fulfillment/contracts/sync.d.ts +170 -0
  48. package/dist/fulfillment/contracts/sync.js +1 -0
  49. package/dist/fulfillment/currentFulfillmentParcel.d.ts +2 -0
  50. package/dist/fulfillment/currentFulfillmentParcel.js +1 -0
  51. package/dist/fulfillment/delayReadModel.d.ts +11 -0
  52. package/dist/fulfillment/delayReadModel.js +45 -0
  53. package/dist/fulfillment/deliveryAlignmentReadModel.d.ts +4 -0
  54. package/dist/fulfillment/deliveryAlignmentReadModel.js +12 -0
  55. package/dist/fulfillment/dispatchProjection.d.ts +7 -0
  56. package/dist/fulfillment/dispatchProjection.js +18 -0
  57. package/dist/fulfillment/fulfillmentObservationEffects.d.ts +66 -0
  58. package/dist/fulfillment/fulfillmentObservationEffects.js +36 -0
  59. package/dist/fulfillment/handlerSchemas.d.ts +647 -0
  60. package/dist/fulfillment/handlerSchemas.js +213 -0
  61. package/dist/fulfillment/handlerSupport.d.ts +33 -0
  62. package/dist/fulfillment/handlerSupport.js +25 -0
  63. package/dist/fulfillment/index.d.ts +37 -0
  64. package/dist/fulfillment/index.js +37 -0
  65. package/dist/fulfillment/labelLifecycle.d.ts +24 -0
  66. package/dist/fulfillment/labelLifecycle.js +9 -0
  67. package/dist/fulfillment/lowStockEvidenceHandler.d.ts +36 -0
  68. package/dist/fulfillment/lowStockEvidenceHandler.js +46 -0
  69. package/dist/fulfillment/migrations.d.ts +27 -0
  70. package/dist/fulfillment/migrations.js +8 -0
  71. package/dist/fulfillment/nativeUnsupported.d.ts +10 -0
  72. package/dist/fulfillment/nativeUnsupported.js +18 -0
  73. package/dist/fulfillment/normalizedFulfillmentFacts.d.ts +2 -0
  74. package/dist/fulfillment/normalizedFulfillmentFacts.js +1 -0
  75. package/dist/fulfillment/observationProjection.d.ts +11 -0
  76. package/dist/fulfillment/observationProjection.js +37 -0
  77. package/dist/fulfillment/omnipack/capabilities.d.ts +3 -0
  78. package/dist/fulfillment/omnipack/capabilities.js +16 -0
  79. package/dist/fulfillment/omnipack/client.d.ts +37 -0
  80. package/dist/fulfillment/omnipack/client.js +162 -0
  81. package/dist/fulfillment/omnipack/index.d.ts +52 -0
  82. package/dist/fulfillment/omnipack/index.js +349 -0
  83. package/dist/fulfillment/omnipack/mappers.d.ts +73 -0
  84. package/dist/fulfillment/omnipack/mappers.js +177 -0
  85. package/dist/fulfillment/omnipack/observation.d.ts +21 -0
  86. package/dist/fulfillment/omnipack/observation.js +57 -0
  87. package/dist/fulfillment/omnipack/omnipackDispatchPayload.d.ts +36 -0
  88. package/dist/fulfillment/omnipack/omnipackDispatchPayload.js +63 -0
  89. package/dist/fulfillment/omnipack/omnipackOutboundOrderPayload.d.ts +83 -0
  90. package/dist/fulfillment/omnipack/omnipackOutboundOrderPayload.js +113 -0
  91. package/dist/fulfillment/omnipack/omnipackProductPackPayload.d.ts +11 -0
  92. package/dist/fulfillment/omnipack/omnipackProductPackPayload.js +38 -0
  93. package/dist/fulfillment/omnipack/omnipackProductPayload.d.ts +18 -0
  94. package/dist/fulfillment/omnipack/omnipackProductPayload.js +51 -0
  95. package/dist/fulfillment/omnipack/omnipackReconciliationPayload.d.ts +1 -0
  96. package/dist/fulfillment/omnipack/omnipackReconciliationPayload.js +3 -0
  97. package/dist/fulfillment/omnipack/omnipackStatusVocabulary.d.ts +4 -0
  98. package/dist/fulfillment/omnipack/omnipackStatusVocabulary.js +87 -0
  99. package/dist/fulfillment/omnipack/omnipackWebhookPayload.d.ts +9 -0
  100. package/dist/fulfillment/omnipack/omnipackWebhookPayload.js +76 -0
  101. package/dist/fulfillment/omnipack/productSyncMappers.d.ts +18 -0
  102. package/dist/fulfillment/omnipack/productSyncMappers.js +43 -0
  103. package/dist/fulfillment/omnipack/providerError.d.ts +25 -0
  104. package/dist/fulfillment/omnipack/providerError.js +47 -0
  105. package/dist/fulfillment/omnipack/trackingReferences.d.ts +16 -0
  106. package/dist/fulfillment/omnipack/trackingReferences.js +52 -0
  107. package/dist/fulfillment/paidFulfillmentRecovery.d.ts +67 -0
  108. package/dist/fulfillment/paidFulfillmentRecovery.js +154 -0
  109. package/dist/fulfillment/paidHandoff.d.ts +27 -0
  110. package/dist/fulfillment/paidHandoff.js +86 -0
  111. package/dist/fulfillment/paidHandoffPorts.d.ts +24 -0
  112. package/dist/fulfillment/paidHandoffPorts.js +3 -0
  113. package/dist/fulfillment/postgresDeliveryAlignment.d.ts +4 -0
  114. package/dist/fulfillment/postgresDeliveryAlignment.js +12 -0
  115. package/dist/fulfillment/postgresDispatchStore.d.ts +16 -0
  116. package/dist/fulfillment/postgresDispatchStore.js +44 -0
  117. package/dist/fulfillment/postgresEvidenceReadPort.d.ts +25 -0
  118. package/dist/fulfillment/postgresEvidenceReadPort.js +45 -0
  119. package/dist/fulfillment/postgresPaidFulfillmentRecovery.d.ts +25 -0
  120. package/dist/fulfillment/postgresPaidFulfillmentRecovery.js +26 -0
  121. package/dist/fulfillment/postgresPaidHandoffStore.d.ts +4 -0
  122. package/dist/fulfillment/postgresPaidHandoffStore.js +10 -0
  123. package/dist/fulfillment/postgresShipmentSpine.d.ts +63 -0
  124. package/dist/fulfillment/postgresShipmentSpine.js +232 -0
  125. package/dist/fulfillment/postgresStockSyncPort.d.ts +8 -0
  126. package/dist/fulfillment/postgresStockSyncPort.js +63 -0
  127. package/dist/fulfillment/productReconciliationEvidenceHandler.d.ts +36 -0
  128. package/dist/fulfillment/productReconciliationEvidenceHandler.js +50 -0
  129. package/dist/fulfillment/providerCapabilities.d.ts +9 -0
  130. package/dist/fulfillment/providerCapabilities.js +17 -0
  131. package/dist/fulfillment/providerCommandLedger.d.ts +143 -0
  132. package/dist/fulfillment/providerCommandLedger.js +14 -0
  133. package/dist/fulfillment/providerDispatchAcceptance.d.ts +26 -0
  134. package/dist/fulfillment/providerDispatchAcceptance.js +23 -0
  135. package/dist/fulfillment/providerDispatchError.d.ts +6 -0
  136. package/dist/fulfillment/providerDispatchError.js +5 -0
  137. package/dist/fulfillment/providerDispatchWorker.d.ts +31 -0
  138. package/dist/fulfillment/providerDispatchWorker.js +172 -0
  139. package/dist/fulfillment/providerProductSyncWorker.d.ts +28 -0
  140. package/dist/fulfillment/providerProductSyncWorker.js +122 -0
  141. package/dist/fulfillment/providerReconciliationError.d.ts +9 -0
  142. package/dist/fulfillment/providerReconciliationError.js +17 -0
  143. package/dist/fulfillment/providerReconciliationTerminalSkip.d.ts +2 -0
  144. package/dist/fulfillment/providerReconciliationTerminalSkip.js +6 -0
  145. package/dist/fulfillment/providerReconciliationTimestamp.d.ts +1 -0
  146. package/dist/fulfillment/providerReconciliationTimestamp.js +27 -0
  147. package/dist/fulfillment/providerReconciliationWorker.d.ts +82 -0
  148. package/dist/fulfillment/providerReconciliationWorker.js +151 -0
  149. package/dist/fulfillment/providerStockAvailability.d.ts +13 -0
  150. package/dist/fulfillment/providerStockAvailability.js +51 -0
  151. package/dist/fulfillment/providerStockSyncWorker.d.ts +37 -0
  152. package/dist/fulfillment/providerStockSyncWorker.js +186 -0
  153. package/dist/fulfillment/providerTrackingReferences.d.ts +15 -0
  154. package/dist/fulfillment/providerTrackingReferences.js +23 -0
  155. package/dist/fulfillment/replacementRefusals.d.ts +5 -0
  156. package/dist/fulfillment/replacementRefusals.js +38 -0
  157. package/dist/fulfillment/replacementShipmentHandler.d.ts +5 -0
  158. package/dist/fulfillment/replacementShipmentHandler.js +46 -0
  159. package/dist/fulfillment/schemaCapabilities.d.ts +13 -0
  160. package/dist/fulfillment/schemaCapabilities.js +7 -0
  161. package/dist/fulfillment/shipmentsOverviewHandler.d.ts +16 -0
  162. package/dist/fulfillment/shipmentsOverviewHandler.js +54 -0
  163. package/dist/fulfillment/statusMap.d.ts +2 -0
  164. package/dist/fulfillment/statusMap.js +1 -0
  165. package/dist/fulfillment/trackingProgress.d.ts +1 -0
  166. package/dist/fulfillment/trackingProgress.js +1 -0
  167. package/dist/fulfillment/verifiedIngress.d.ts +52 -0
  168. package/dist/fulfillment/verifiedIngress.js +66 -0
  169. package/dist/payments/adapterConformance.d.ts +8 -0
  170. package/dist/payments/adapterConformance.js +109 -0
  171. package/dist/payments/bindings.d.ts +3 -0
  172. package/dist/payments/bindings.js +17 -0
  173. package/dist/payments/checkoutActivePaymentActionResolver.d.ts +7 -0
  174. package/dist/payments/checkoutActivePaymentActionResolver.js +77 -0
  175. package/dist/payments/checkoutRecoveryPaymentResolver.d.ts +8 -0
  176. package/dist/payments/checkoutRecoveryPaymentResolver.js +87 -0
  177. package/dist/payments/contracts/adapter.d.ts +113 -0
  178. package/dist/payments/contracts/adapter.js +1 -0
  179. package/dist/payments/contracts/conformance.d.ts +155 -0
  180. package/dist/payments/contracts/conformance.js +1 -0
  181. package/dist/payments/contracts/evidence.d.ts +157 -0
  182. package/dist/payments/contracts/evidence.js +1 -0
  183. package/dist/payments/contracts/index.d.ts +10 -0
  184. package/dist/payments/contracts/index.js +1 -0
  185. package/dist/payments/contracts/preparedAttempt.d.ts +69 -0
  186. package/dist/payments/contracts/preparedAttempt.js +1 -0
  187. package/dist/payments/contracts/reconciliation.d.ts +303 -0
  188. package/dist/payments/contracts/reconciliation.js +1 -0
  189. package/dist/payments/contracts/repair.d.ts +92 -0
  190. package/dist/payments/contracts/repair.js +1 -0
  191. package/dist/payments/contracts/truth.d.ts +92 -0
  192. package/dist/payments/contracts/truth.js +1 -0
  193. package/dist/payments/eventConformanceRunner.d.ts +12 -0
  194. package/dist/payments/eventConformanceRunner.js +125 -0
  195. package/dist/payments/index.d.ts +16 -0
  196. package/dist/payments/index.js +16 -0
  197. package/dist/payments/paymentAttemptSilenceWindow.d.ts +10 -0
  198. package/dist/payments/paymentAttemptSilenceWindow.js +19 -0
  199. package/dist/payments/paymentMethodLifecycle.d.ts +11 -0
  200. package/dist/payments/paymentMethodLifecycle.js +37 -0
  201. package/dist/payments/paymentProviderReconciliationAbsenceReopen.d.ts +7 -0
  202. package/dist/payments/paymentProviderReconciliationAbsenceReopen.js +100 -0
  203. package/dist/payments/paymentProviderReconciliationEvidence.d.ts +36 -0
  204. package/dist/payments/paymentProviderReconciliationEvidence.js +91 -0
  205. package/dist/payments/paymentProviderReconciliationWorker.d.ts +4 -0
  206. package/dist/payments/paymentProviderReconciliationWorker.js +245 -0
  207. package/dist/payments/paymentTruth.d.ts +8 -0
  208. package/dist/payments/paymentTruth.js +125 -0
  209. package/dist/payments/paymentVerifyNowHandler.d.ts +27 -0
  210. package/dist/payments/paymentVerifyNowHandler.js +70 -0
  211. package/dist/payments/paymentVerifyNowService.d.ts +23 -0
  212. package/dist/payments/paymentVerifyNowService.js +93 -0
  213. package/dist/payments/paymentWebhookPostProcessing.d.ts +22 -0
  214. package/dist/payments/paymentWebhookPostProcessing.js +15 -0
  215. package/dist/payments/postgresPaymentTruth.d.ts +10 -0
  216. package/dist/payments/postgresPaymentTruth.js +126 -0
  217. package/dist/payments/preparedAttempt.d.ts +6 -0
  218. package/dist/payments/preparedAttempt.js +70 -0
  219. package/dist/payments/preparedAttemptFinalization.d.ts +5 -0
  220. package/dist/payments/preparedAttemptFinalization.js +12 -0
  221. package/dist/payments/schemaCapabilities.d.ts +10 -0
  222. package/dist/payments/schemaCapabilities.js +10 -0
  223. package/dist/payments/sql.d.ts +20 -0
  224. package/dist/payments/sql.js +6 -0
  225. package/dist/payments/stripe/classifyDecline.d.ts +46 -0
  226. package/dist/payments/stripe/classifyDecline.js +58 -0
  227. package/dist/payments/stripe/declineFailureHints.d.ts +46 -0
  228. package/dist/payments/stripe/declineFailureHints.js +87 -0
  229. package/dist/payments/stripe/donorContracts.d.ts +120 -0
  230. package/dist/payments/stripe/donorContracts.js +1 -0
  231. package/dist/payments/stripe/executionDecline.d.ts +53 -0
  232. package/dist/payments/stripe/executionDecline.js +107 -0
  233. package/dist/payments/stripe/index.d.ts +41 -0
  234. package/dist/payments/stripe/index.js +264 -0
  235. package/dist/payments/stripe/intentMapper.d.ts +26 -0
  236. package/dist/payments/stripe/intentMapper.js +51 -0
  237. package/dist/payments/stripe/methodFacts.d.ts +10 -0
  238. package/dist/payments/stripe/methodFacts.js +12 -0
  239. package/dist/payments/stripe/paymentFailureEvidence.d.ts +26 -0
  240. package/dist/payments/stripe/paymentFailureEvidence.js +33 -0
  241. package/dist/payments/stripe/stripeFailureEvidence.d.ts +41 -0
  242. package/dist/payments/stripe/stripeFailureEvidence.js +82 -0
  243. package/dist/payments/stripe/stripeIntentConfirmationEvidence.d.ts +28 -0
  244. package/dist/payments/stripe/stripeIntentConfirmationEvidence.js +32 -0
  245. package/dist/payments/stripe/stripePaymentReconciliationProvider.d.ts +35 -0
  246. package/dist/payments/stripe/stripePaymentReconciliationProvider.js +222 -0
  247. package/dist/payments/stripe/stripeRefundEvidence.d.ts +8 -0
  248. package/dist/payments/stripe/stripeRefundEvidence.js +17 -0
  249. package/dist/payments/stripe/stripeSandboxPaymentExecutionAdapter.d.ts +45 -0
  250. package/dist/payments/stripe/stripeSandboxPaymentExecutionAdapter.js +220 -0
  251. package/dist/payments/stripe/stripeWebhookNormalizer.d.ts +14 -0
  252. package/dist/payments/stripe/stripeWebhookNormalizer.js +243 -0
  253. package/dist/payments/stripe/webhookSignature.d.ts +14 -0
  254. package/dist/payments/stripe/webhookSignature.js +43 -0
  255. package/dist/payments/tpay/blikRecurringMapper.d.ts +37 -0
  256. package/dist/payments/tpay/blikRecurringMapper.js +24 -0
  257. package/dist/payments/tpay/capabilities.d.ts +3 -0
  258. package/dist/payments/tpay/capabilities.js +18 -0
  259. package/dist/payments/tpay/classifyDecline.d.ts +46 -0
  260. package/dist/payments/tpay/classifyDecline.js +58 -0
  261. package/dist/payments/tpay/declineFailureHints.d.ts +72 -0
  262. package/dist/payments/tpay/declineFailureHints.js +37 -0
  263. package/dist/payments/tpay/donorContracts.d.ts +140 -0
  264. package/dist/payments/tpay/donorContracts.js +1 -0
  265. package/dist/payments/tpay/index.d.ts +73 -0
  266. package/dist/payments/tpay/index.js +294 -0
  267. package/dist/payments/tpay/paymentFailureEvidence.d.ts +26 -0
  268. package/dist/payments/tpay/paymentFailureEvidence.js +33 -0
  269. package/dist/payments/tpay/preparedProviderAttempt.d.ts +22 -0
  270. package/dist/payments/tpay/preparedProviderAttempt.js +24 -0
  271. package/dist/payments/tpay/providerAttemptFailureDiagnostic.d.ts +3 -0
  272. package/dist/payments/tpay/providerAttemptFailureDiagnostic.js +95 -0
  273. package/dist/payments/tpay/tpayCreateTransactionInput.d.ts +25 -0
  274. package/dist/payments/tpay/tpayCreateTransactionInput.js +128 -0
  275. package/dist/payments/tpay/tpayDeclineEvidence.d.ts +126 -0
  276. package/dist/payments/tpay/tpayDeclineEvidence.js +177 -0
  277. package/dist/payments/tpay/tpayDispatchFailure.d.ts +60 -0
  278. package/dist/payments/tpay/tpayDispatchFailure.js +121 -0
  279. package/dist/payments/tpay/tpayFailureEvidence.d.ts +20 -0
  280. package/dist/payments/tpay/tpayFailureEvidence.js +61 -0
  281. package/dist/payments/tpay/tpayHttpClient.d.ts +52 -0
  282. package/dist/payments/tpay/tpayHttpClient.js +185 -0
  283. package/dist/payments/tpay/tpayHttpFailure.d.ts +57 -0
  284. package/dist/payments/tpay/tpayHttpFailure.js +143 -0
  285. package/dist/payments/tpay/tpayPaymentExecutionAdapter.d.ts +20 -0
  286. package/dist/payments/tpay/tpayPaymentExecutionAdapter.js +249 -0
  287. package/dist/payments/tpay/tpayPaymentReconciliationProvider.d.ts +5 -0
  288. package/dist/payments/tpay/tpayPaymentReconciliationProvider.js +244 -0
  289. package/dist/payments/tpay/tpayTransactionPayload.d.ts +120 -0
  290. package/dist/payments/tpay/tpayTransactionPayload.js +96 -0
  291. package/dist/payments/tpay/wallClockTime.d.ts +31 -0
  292. package/dist/payments/tpay/wallClockTime.js +57 -0
  293. package/dist/payments/tpay/webhookJwsVerifier.d.ts +17 -0
  294. package/dist/payments/tpay/webhookJwsVerifier.js +51 -0
  295. package/dist/payments/tpay/webhookNormalizer.d.ts +54 -0
  296. package/dist/payments/tpay/webhookNormalizer.js +200 -0
  297. package/dist/payments/verifiedEvidenceProjection.d.ts +12 -0
  298. package/dist/payments/verifiedEvidenceProjection.js +166 -0
  299. package/dist/payments/verifiedIngress.d.ts +119 -0
  300. package/dist/payments/verifiedIngress.js +220 -0
  301. package/package.json +37 -2
  302. package/release-gates.json +105 -3
  303. package/sql/20260808210000_fulfillment_shipment_rail.sql +810 -0
  304. package/sql/20260810180000_payment_settlement_rail.sql +574 -0
  305. package/sql/20260815150000_payment_truth_reconciliation.sql +479 -0
  306. package/sql/20260819150000_fulfillment_shipment_sequence.sql +98 -0
  307. package/sql/20260826100000_late_payment_shifts_the_subscription_cycle.sql +215 -0
  308. package/sql/20261022080000_fulfillment_command_ledger.sql +786 -0
  309. package/sql/20261022090000_fulfillment_delivery_alignment.sql +1106 -0
  310. package/src/composition/composeBundle.ts +13 -0
  311. package/src/composition/fulfillmentContribution.ts +28 -0
  312. package/src/composition/index.ts +2 -0
  313. package/src/fulfillment/adapterConformance.ts +195 -0
  314. package/src/fulfillment/bindings.ts +26 -0
  315. package/src/fulfillment/commerceFulfillmentHandlers.ts +263 -0
  316. package/src/fulfillment/commerceFulfillmentReadModel.ts +257 -0
  317. package/src/fulfillment/contracts/alignment.ts +13 -0
  318. package/src/fulfillment/contracts/bindings.ts +30 -0
  319. package/src/fulfillment/contracts/capabilities.ts +15 -0
  320. package/src/fulfillment/contracts/conformance.ts +61 -0
  321. package/src/fulfillment/contracts/customerAlignment.ts +4 -0
  322. package/src/fulfillment/contracts/dispatch.ts +58 -0
  323. package/src/fulfillment/contracts/index.ts +18 -0
  324. package/src/fulfillment/contracts/label.ts +9 -0
  325. package/src/fulfillment/contracts/nativeUnsupported.ts +6 -0
  326. package/src/fulfillment/contracts/observation.ts +18 -0
  327. package/src/fulfillment/contracts/operator.ts +31 -0
  328. package/src/fulfillment/contracts/read.ts +42 -0
  329. package/src/fulfillment/contracts/readback.ts +11 -0
  330. package/src/fulfillment/contracts/replacement.ts +15 -0
  331. package/src/fulfillment/contracts/store.ts +26 -0
  332. package/src/fulfillment/contracts/sync.ts +61 -0
  333. package/src/fulfillment/currentFulfillmentParcel.ts +2 -0
  334. package/src/fulfillment/delayReadModel.ts +60 -0
  335. package/src/fulfillment/deliveryAlignmentReadModel.ts +15 -0
  336. package/src/fulfillment/dispatchProjection.ts +20 -0
  337. package/src/fulfillment/fulfillmentObservationEffects.ts +86 -0
  338. package/src/fulfillment/handlerSchemas.ts +255 -0
  339. package/src/fulfillment/handlerSupport.ts +25 -0
  340. package/src/fulfillment/index.ts +38 -0
  341. package/src/fulfillment/labelLifecycle.ts +11 -0
  342. package/src/fulfillment/lowStockEvidenceHandler.ts +60 -0
  343. package/src/fulfillment/migrations.ts +8 -0
  344. package/src/fulfillment/nativeUnsupported.ts +23 -0
  345. package/src/fulfillment/normalizedFulfillmentFacts.ts +2 -0
  346. package/src/fulfillment/observationProjection.ts +41 -0
  347. package/src/fulfillment/omnipack/capabilities.ts +18 -0
  348. package/src/fulfillment/omnipack/client.ts +258 -0
  349. package/src/fulfillment/omnipack/index.ts +312 -0
  350. package/src/fulfillment/omnipack/mappers.ts +261 -0
  351. package/src/fulfillment/omnipack/observation.ts +61 -0
  352. package/src/fulfillment/omnipack/omnipackDispatchPayload.ts +93 -0
  353. package/src/fulfillment/omnipack/omnipackOutboundOrderPayload.ts +194 -0
  354. package/src/fulfillment/omnipack/omnipackProductPackPayload.ts +47 -0
  355. package/src/fulfillment/omnipack/omnipackProductPayload.ts +67 -0
  356. package/src/fulfillment/omnipack/omnipackReconciliationPayload.ts +7 -0
  357. package/src/fulfillment/omnipack/omnipackStatusVocabulary.ts +103 -0
  358. package/src/fulfillment/omnipack/omnipackWebhookPayload.ts +73 -0
  359. package/src/fulfillment/omnipack/productSyncMappers.ts +74 -0
  360. package/src/fulfillment/omnipack/providerError.ts +64 -0
  361. package/src/fulfillment/omnipack/trackingReferences.ts +77 -0
  362. package/src/fulfillment/paidFulfillmentRecovery.ts +252 -0
  363. package/src/fulfillment/paidHandoff.ts +122 -0
  364. package/src/fulfillment/paidHandoffPorts.ts +21 -0
  365. package/src/fulfillment/postgresDeliveryAlignment.ts +14 -0
  366. package/src/fulfillment/postgresDispatchStore.ts +55 -0
  367. package/src/fulfillment/postgresEvidenceReadPort.ts +59 -0
  368. package/src/fulfillment/postgresPaidFulfillmentRecovery.ts +29 -0
  369. package/src/fulfillment/postgresPaidHandoffStore.ts +11 -0
  370. package/src/fulfillment/postgresShipmentSpine.ts +321 -0
  371. package/src/fulfillment/postgresStockSyncPort.ts +65 -0
  372. package/src/fulfillment/productReconciliationEvidenceHandler.ts +64 -0
  373. package/src/fulfillment/providerCapabilities.ts +18 -0
  374. package/src/fulfillment/providerCommandLedger.ts +53 -0
  375. package/src/fulfillment/providerDispatchAcceptance.ts +31 -0
  376. package/src/fulfillment/providerDispatchError.ts +7 -0
  377. package/src/fulfillment/providerDispatchWorker.ts +131 -0
  378. package/src/fulfillment/providerProductSyncWorker.ts +154 -0
  379. package/src/fulfillment/providerReconciliationError.ts +20 -0
  380. package/src/fulfillment/providerReconciliationTerminalSkip.ts +8 -0
  381. package/src/fulfillment/providerReconciliationTimestamp.ts +34 -0
  382. package/src/fulfillment/providerReconciliationWorker.ts +150 -0
  383. package/src/fulfillment/providerStockAvailability.ts +60 -0
  384. package/src/fulfillment/providerStockSyncWorker.ts +222 -0
  385. package/src/fulfillment/providerTrackingReferences.ts +31 -0
  386. package/src/fulfillment/replacementRefusals.ts +43 -0
  387. package/src/fulfillment/replacementShipmentHandler.ts +47 -0
  388. package/src/fulfillment/schemaCapabilities.ts +7 -0
  389. package/src/fulfillment/shipmentsOverviewHandler.ts +73 -0
  390. package/src/fulfillment/statusMap.ts +2 -0
  391. package/src/fulfillment/trackingProgress.ts +1 -0
  392. package/src/fulfillment/verifiedIngress.ts +80 -0
  393. package/src/payments/adapterConformance.ts +118 -0
  394. package/src/payments/bindings.ts +17 -0
  395. package/src/payments/checkoutActivePaymentActionResolver.ts +97 -0
  396. package/src/payments/checkoutRecoveryPaymentResolver.ts +108 -0
  397. package/src/payments/contracts/adapter.ts +96 -0
  398. package/src/payments/contracts/conformance.ts +171 -0
  399. package/src/payments/contracts/evidence.ts +142 -0
  400. package/src/payments/contracts/index.ts +54 -0
  401. package/src/payments/contracts/preparedAttempt.ts +86 -0
  402. package/src/payments/contracts/reconciliation.ts +296 -0
  403. package/src/payments/contracts/repair.ts +95 -0
  404. package/src/payments/contracts/truth.ts +108 -0
  405. package/src/payments/eventConformanceRunner.ts +149 -0
  406. package/src/payments/index.ts +21 -0
  407. package/src/payments/paymentAttemptSilenceWindow.ts +26 -0
  408. package/src/payments/paymentMethodLifecycle.ts +50 -0
  409. package/src/payments/paymentProviderReconciliationAbsenceReopen.ts +130 -0
  410. package/src/payments/paymentProviderReconciliationEvidence.ts +117 -0
  411. package/src/payments/paymentProviderReconciliationWorker.ts +291 -0
  412. package/src/payments/paymentTruth.ts +131 -0
  413. package/src/payments/paymentVerifyNowHandler.ts +94 -0
  414. package/src/payments/paymentVerifyNowService.ts +125 -0
  415. package/src/payments/paymentWebhookPostProcessing.ts +36 -0
  416. package/src/payments/postgresPaymentTruth.ts +149 -0
  417. package/src/payments/preparedAttempt.ts +90 -0
  418. package/src/payments/preparedAttemptFinalization.ts +13 -0
  419. package/src/payments/schemaCapabilities.ts +10 -0
  420. package/src/payments/sql.ts +6 -0
  421. package/src/payments/stripe/classifyDecline.ts +62 -0
  422. package/src/payments/stripe/declineFailureHints.ts +89 -0
  423. package/src/payments/stripe/donorContracts.ts +87 -0
  424. package/src/payments/stripe/executionDecline.ts +126 -0
  425. package/src/payments/stripe/index.ts +265 -0
  426. package/src/payments/stripe/intentMapper.ts +58 -0
  427. package/src/payments/stripe/methodFacts.ts +21 -0
  428. package/src/payments/stripe/paymentFailureEvidence.ts +58 -0
  429. package/src/payments/stripe/stripeFailureEvidence.ts +115 -0
  430. package/src/payments/stripe/stripeIntentConfirmationEvidence.ts +34 -0
  431. package/src/payments/stripe/stripePaymentReconciliationProvider.ts +263 -0
  432. package/src/payments/stripe/stripeRefundEvidence.ts +19 -0
  433. package/src/payments/stripe/stripeSandboxPaymentExecutionAdapter.ts +283 -0
  434. package/src/payments/stripe/stripeWebhookNormalizer.ts +277 -0
  435. package/src/payments/stripe/webhookSignature.ts +55 -0
  436. package/src/payments/tpay/blikRecurringMapper.ts +42 -0
  437. package/src/payments/tpay/capabilities.ts +21 -0
  438. package/src/payments/tpay/classifyDecline.ts +62 -0
  439. package/src/payments/tpay/declineFailureHints.ts +90 -0
  440. package/src/payments/tpay/donorContracts.ts +104 -0
  441. package/src/payments/tpay/index.ts +293 -0
  442. package/src/payments/tpay/paymentFailureEvidence.ts +58 -0
  443. package/src/payments/tpay/preparedProviderAttempt.ts +38 -0
  444. package/src/payments/tpay/providerAttemptFailureDiagnostic.ts +99 -0
  445. package/src/payments/tpay/tpayCreateTransactionInput.ts +158 -0
  446. package/src/payments/tpay/tpayDeclineEvidence.ts +233 -0
  447. package/src/payments/tpay/tpayDispatchFailure.ts +186 -0
  448. package/src/payments/tpay/tpayFailureEvidence.ts +75 -0
  449. package/src/payments/tpay/tpayHttpClient.ts +290 -0
  450. package/src/payments/tpay/tpayHttpFailure.ts +186 -0
  451. package/src/payments/tpay/tpayPaymentExecutionAdapter.ts +297 -0
  452. package/src/payments/tpay/tpayPaymentReconciliationProvider.ts +285 -0
  453. package/src/payments/tpay/tpayTransactionPayload.ts +207 -0
  454. package/src/payments/tpay/wallClockTime.ts +57 -0
  455. package/src/payments/tpay/webhookJwsVerifier.ts +82 -0
  456. package/src/payments/tpay/webhookNormalizer.ts +279 -0
  457. package/src/payments/verifiedEvidenceProjection.ts +179 -0
  458. package/src/payments/verifiedIngress.ts +317 -0
package/CHANGELOG.md CHANGED
@@ -4,10 +4,281 @@ Notable changes to this public-source workspace package are recorded here.
4
4
  “Unreleased” means no npm version carries the change yet; immutable OpenLup
5
5
  source previews may already ship some changes, and their release notes say
6
6
  which. Declaration snapshots track candidate drift, not a stable API or
7
- SemVer promise.
7
+ SemVer promise. This file keeps the current release and the two previous ones;
8
+ earlier releases are recorded verbatim in `packages/platform/CHANGELOG-HISTORY.md`
9
+ in the source repository.
8
10
 
9
11
  ## [Unreleased]
10
12
 
13
+ ## [0.22.0]
14
+
15
+ - Publishable on the npm `latest` dist-tag as `0.22.0`, from tag
16
+ `openlup-platform-v0.22.0`.
17
+
18
+ - Add eleven experimental reference-application support exports on the existing payment vendor subpaths. Reuse contributed execution, readback, mapping and diagnostic helpers; preserve the no-charge error class identity. Neutral payment exports and default activation remain unchanged.
19
+
20
+ Migration: none.
21
+
22
+ ### Opt-in warehouse fulfillment example
23
+
24
+ Add the experimental, opt-in warehouse fulfillment entry described in the README behind the frozen neutral fulfillment ports: explicit injected I/O, prepared-byte binding, closed evidence, token observations and positive readback. Default-off; account readiness is host-owned. Exact absence, label create/void and cancellation remain unsupported.
25
+
26
+ Missing or malformed evidence refuses before credential resolution or HTTP.
27
+
28
+ Migration: none
29
+
30
+ ### Offline warehouse fulfillment conformance
31
+
32
+ Prove the opt-in warehouse fulfillment entry described in the README with M08's offline conformance runner using injected
33
+ HTTP and synthetic fixtures. Cover dispatch replay and refusals, observation,
34
+ readback, stock and product sync, plus real-worker host-ledger fences after
35
+ restart and retention eviction. No provider-account or activation proof is claimed.
36
+
37
+ Migration: none
38
+
39
+ ### Fulfillment contracts and status canon
40
+
41
+ Add experimental `fulfillment` and type-only `fulfillment/contracts` entries with
42
+ contributed status decisions, strict core parser bindings, concrete provider/store
43
+ ports and injected default-off capabilities. No adapter, executor, route or default
44
+ profile is activated; existing reference integrations remain unchanged.
45
+
46
+ Declared adaptation: empty or absent provider selection is a typed refusal in the
47
+ new package, rather than the donor host's implicit simulator alias. The donor alias
48
+ remains an open owner follow-up; this contribution does not change donor logic.
49
+ Private provider trace columns and registry/environment values are excluded from
50
+ the neutral package; persisted command fingerprints and opaque host keys are retained.
51
+
52
+ Migration: none (new surface; no existing reference behavior changes).
53
+
54
+ ### Fulfillment paid handoff and fenced dispatch
55
+
56
+ Add the paid outbox handler/recovery classifier, injected dispatch worker and
57
+ separate durable command-ledger protocol through the new fulfillment entry.
58
+ Preserve one contact remap, opaque host keys, actual-command fingerprints,
59
+ readback/attempt/begin order and local accepted-proof repair without another POST.
60
+ Provider/money/inventory authority remains injected; no SQL, route or activation.
61
+
62
+ Approved port amendment G14 adds recordProviderAttempt to the new
63
+ FulfillmentStorePort. It records only sanitized prepared DispatchEvidence plus
64
+ mode/recorded status and opaque references, after authoritative claim readback;
65
+ same-key replay writes no second attempt and contact remap retains its own key.
66
+ No new named export or subpath is added by this method. Other contracts are unchanged.
67
+
68
+ Correctable draft re-claim must refresh fingerprint and evidence atomically.
69
+ Store conformance and native durability/fencing and SQL proofs remain later work.
70
+
71
+ Migration: none (new surface; contracts and orchestration land in one release).
72
+
73
+ ### Fulfillment observation and sync workers
74
+
75
+ Add neutral observation effects, verified ingress, observation reconciliation,
76
+ tracking, stock/product sync, read-only evidence handlers and the offline
77
+ runFulfillmentAdapterConformance at the existing fulfillment entry.
78
+
79
+ Migration: approved G15 extends the unreleased SyncCursor with optional
80
+ coverageGapSkus (legacy absence reads as []). Only consecutive succeeded runs
81
+ confirm a reservation coverage gap; running/failed cursors clear the set.
82
+ Migration: approved G16 changes readLocalInventoryStock(requestedAt) to typed
83
+ unaggregated lines with skuRef, quantity balances, fulfillable, locationStatus,
84
+ lotStatus and expiresAt. The worker filters/sums at the captured clock; expiry
85
+ exactly then is excluded. Inventory authority and the provider stock-sync shape
86
+ are unchanged.
87
+ Migration: approved G17 adds inline localPersistence: ingress records eventKey
88
+ receipts preserving firstReceivedAt and marks processing idempotently;
89
+ reconciliation reads local status/latestStatusOccurredAt/handedOverAt. No named
90
+ persistence type is exported. Durable replay and processing remain host obligations.
91
+ A superseding conflict returns superseded but persists only processed status,
92
+ without a dedicated superseded-reason field.
93
+
94
+ Correlated ingress requires a nonblank observation or dispatch external reference
95
+ before acceptance/status/effects/processed mark; failure leaves the receipt
96
+ unprocessed. Stock-contention annotation is best-effort before the original stock
97
+ failure is rethrown; recovered-picked receipt diagnostics remain typed. Effects
98
+ retain stock → handover → tracking → invoice and callback/throw order.
99
+ Reconciliation fails the run on unknown readback and projects unmapped correlation
100
+ evidence before host calls. Product evidence reads retain safe authorization/read
101
+ refusal detail. Private codecs, keys, carrier URLs and provider errors stay
102
+ host-owned; typed evidence replaces raw payload pass-through. The conformance
103
+ runner accepts adapter-owned offline subjects and returns sanitized evidence;
104
+ fixture checks do not establish durable store atomicity or arrival alignment.
105
+
106
+ ### Fulfillment native persistence and delivery alignment
107
+
108
+ Add native shipment, evidence, stock, recovery, dispatch, paid-handoff and
109
+ alignment stores through the existing fulfillment entry. Sparse migration
110
+ projections bind native units 5/27/51/73/74; install the complete catalogue.
111
+ Coverage-gap cursor state and received/status/processed evidence are
112
+ durable, while local inventory lines and contact preparation remain explicit
113
+ host inputs. Native 3pl acceptance uses a dispatch evidence receipt and preserves
114
+ the cancellation fence without inventing an owned label or physical packing.
115
+
116
+ Native admission: overdue-delivery admission guards only NEW cycle
117
+ admission/insert, matching the donor's guard_cycle_insert. Existing-cycle retries
118
+ through renewal operations and dunning bypass admission and neither mint nor
119
+ consume a one-use receipt. No retry_scheduled state or payments lifecycle change is
120
+ introduced. Native continuity requires the complete canonical migration graph,
121
+ real-PostgreSQL installation, replay and access-control checks.
122
+
123
+ ### Fulfillment operator lifecycle and customer delay projection
124
+
125
+ Add host-owned operator and replacement handlers through the fulfillment entry.
126
+ Mutation callbacks require actor attribution and idempotency keys; the host owns
127
+ atomic replay receipts and replacement eligibility, reservation and hold effects.
128
+ Native bindings return a shared typed unsupported refusal without writing.
129
+ Customer delay projection keeps absent cases distinct, hides aligned history
130
+ when the schedule advances and never presents manual review as protection.
131
+ Label helpers preserve transient downloads and cleanup uncertainty. Current
132
+ parcel helpers retain sequence selection and companion attribution. These
133
+ exports mount no route, dispatch no parcel and attest no replacement arrival.
134
+
135
+ ### Fulfillment commerce reads and recorded progress
136
+
137
+ Add host-owned commerce list/detail projections, a shipments overview handler and
138
+ typed read callbacks. Projected payment status passes through unchanged and
139
+ native reads return the shared unsupported refusal. Preserve opaque host overview
140
+ buckets and the legacy shipment-status facade. Progress completion requires
141
+ recorded milestones and uses the host-resolved customer step.
142
+
143
+ ### Fulfillment internal simplification
144
+
145
+ Reuse the empty stock-balance constructor in aggregation and sync, and append to
146
+ private recovery groups without copying each growing array. Fulfillment results,
147
+ public contracts, key bytes and effect order remain unchanged.
148
+
149
+ ### Fulfillment service composition and preparation
150
+
151
+ Add explicit default-off fulfillment services, a structural contribution and an
152
+ inert reference preparation binding. Authoritative source edits and redacted
153
+ context synchronization share the native dispatch and shipment locks. Missing
154
+ preparation refuses readiness. No route, schedule, renewal wrapper or automatic
155
+ dispatch is activated.
156
+
157
+ ### Fulfillment presentation ownership
158
+
159
+ The status canon, actual-evidence tracking progress, current-parcel selection and
160
+ canonical fact parsers belong to `@openlup/core/fulfillment`. Platform keeps thin
161
+ compatibility re-exports and preserves its existing narrowed fact type names.
162
+ Fulfillment contracts re-export the shared status and progress types from core.
163
+ Server orchestration remains in platform. Browser code, including the host
164
+ status, fact and current-parcel facades and the account order views, imports
165
+ these helpers from core, so no browser graph loads the platform fulfillment
166
+ runtime.
167
+
168
+ Migration: existing platform imports remain valid; no application or schema
169
+ migration is required. Core exposes narrowed fact aliases with a `Canonical`
170
+ prefix while its generic fact exports retain their names.
171
+
172
+ Migration: upgrade core, outbox and platform together from `0.21.0` to `0.22.0` for exact peer pins. Install the complete canonical native migration chain through units 73/74 (`20261022080000_fulfillment_command_ledger.sql` and `20261022090000_fulfillment_delivery_alignment.sql`), never the sparse package projections alone. Before, these fulfillment services were host-owned; after, explicitly compose selected ports and default-off services. Nothing mounts routes, schedules dispatch or composes the native renewal runner automatically. Keep native alignment off or shadow until the G23 decorator is composed. Arrival alignment remains once and later-only; undelivered replacements remain outstanding, and replacement confirmation must only record actual customer arrival. Preserve G15–G17 cursor, receipt and local-status persistence when implementing host stores. An application rollback does not reverse the forward migrations; older runners refuse the extended ledger.
173
+
174
+ ### Known limitations
175
+
176
+ - Portable dunning repair has no managed twin: exhaustion still pauses active subscriptions there; retaining active status needs a managed forward.
177
+ - D8-1: native advisory v2 promo-code candidates/rejection details unavailable.
178
+ - D8-2: native mounted v2 issue/honor/fallback unavailable.
179
+ - D8-3: native acquisition-only mounted issuance/honor unavailable.
180
+ - D8-4: full native/managed eligibility equivalence unavailable.
181
+ - Bundle-1: independent DB human-only actor-kind enforcement absent natively; first in the native-backend parity round.
182
+ - Bundle-2: managed-equivalent actor-kind/email history absent natively.
183
+ - Bundle-3 closes injected-reader M05 mounted admin/feed readback only. Native new-purchase stock read absent despite P5a installed-store proof; deferred second after bundle-1 (owner 2026-10-21); readiness refuses.
184
+ - Bundle-4: incumbent real-PostgreSQL contention only; no exactly-once guarantee.
185
+ - Managed schema/pgTAP retain `44.404`; removal needs owner decision/forward; reference composition supplies it to app code.
186
+ - A1 offline only; account/hosted-time/owner TEST evidence unclaimed; `communications/klaviyo` verification-pending.
187
+ - M05 omitted opt-ins preserve defaults/outputs/read order/schedules/refusals/acceptance-token bytes/SQL.
188
+ - Native inventory adjustment unavailable; address writes refuse readiness. Flat-rate save needs selected port/Core readiness/applied-seed observation.
189
+ - Native shipping audit unavailable; handler swallows best-effort audit failure.
190
+ - Native flat-rate integer bounds (0 through host maximum; reference 100,000 minor units) use request schema, not DB CHECK.
191
+ - Managed ATP/forecast/dated-supply/pagination readback unproved/pending M06.
192
+ - Managed two-session locks/concurrency/uncovered compensation unproved/pending M06.
193
+ - Managed exact-prefix upgrade/ledger unproved/pending M06.
194
+ - Managed address idempotency/conflict/readback unproved/pending M06.
195
+ - Managed successful flat-rate read/save unproved/pending host authority.
196
+ - M06 stock-wait lifecycle/durable timing/staging controls retain C5/C6; busy/try-gate, continuity/flag/TTL transfers are dispositions, not PASS.
197
+ - Shipping national-registry fields/locale-specific `canonicalAddressKey` fold await M16 host market pack/key migration; reference shipping copy stays locale-specific until M16.
198
+ - Native durable prepared storage, method setup, absence reopen and cumulative refunds unavailable; no production installation parity claimed.
199
+ - Typed refusal-envelope forwarding unavailable (`failureReason` only); reusable registration needs host ownership resolution.
200
+ - Incomplete chargebacks stay refunds/unapplied: reclassification bypasses evidence validation into dispute apply; limited operator recovery.
201
+ - Audit compatibility still detects `chargeId`; refund operation identity/original money supply no typed charge identity.
202
+ - M07 follow-up: repair poll can clear host redirect; post-timeout verify never restarts polling; unlocalized poller; fixture builds/never calls handler.
203
+ - M07 follow-up: reference status route wrong-rail witness.
204
+ - M07 follow-up: explicit reference-route refusal for unsupported method setup.
205
+ - M07 follow-up: deployment-neutral disabled-verify reason.
206
+ - M07 follow-up: reference card normalizer missing-amount path; package settling evidence already requires positive money.
207
+
208
+ - Native delivery alignment stays off or shadow until a host composes the native automatic-renewal runner with the G23 renewal admission decorator. The decorator alone neither composes nor activates the runner.
209
+ - The core fulfillment status map carries localized adopter labels; replace them with host-injected labels or internationalization keys before any stable-framework claim.
210
+ - The warehouse adapter example is opt-in and has offline conformance only; no provider-account proof or activation is established. Exact absence, label create/void and cancellation remain unsupported.
211
+ - After an alignment extension, a deferred renewal operation at the old schedule remains claimed with no reader or reservation effect. Changed terms snapshots conflict under the existing snapshot-conflict rules.
212
+
213
+ Native parity remains host-owned at these seams. Missing native bindings use the shared `FULFILLMENT_NATIVE_UNSUPPORTED` refusal; no partial write or parity claim is implied.
214
+
215
+ | Amendment | Host-owned seam and native boundary |
216
+ | --- | --- |
217
+ | G18 | Replacement creation and atomic eligibility/replay receipts; native replacement callback refuses. |
218
+ | G19 | Operator mutations, actor attribution and replay receipts; native mutation callbacks refuse. |
219
+ | G20 | Customer alignment rows; native reader refuses, while the pure delay projection remains callable. |
220
+ | G21 | Commerce list/detail and shipments overview; native read callbacks refuse. |
221
+ | G22 | Authoritative preparation edits, authorization and replay receipts; missing preparation binding refuses before dispatch, after disabled/selection/readiness checks. |
222
+
223
+ ## [0.21.0]
224
+
225
+ - Publishable on the npm `latest` dist-tag as `0.21.0`, from tag
226
+ `openlup-platform-v0.21.0`.
227
+ - Preview set: core/outbox unchanged, UI private `0.0.0`; published `0.20.0` size baselines, unchanged caps.
228
+
229
+ ### Cumulative M07 status: payment truth and repair surfaces complete for this wave
230
+
231
+ - Experimental payments/contracts/runtime: unchanged prepared ordering; neutral execution/evidence/readback/conformance, verified truth, first-receipt ingress, method lifecycle/reconciliation; host-owned persistence, translation/failure policy.
232
+ - Native PostgreSQL truth/settlement/later-only alignment; three unchanged sparse SQL projections, not an install chain. Refunds never cancel subscriptions.
233
+ - Repair/recovery/buyer verify inject rail capabilities; unknown rails refuse. Reference BFF retains mapping/schemas/ownership/auth order/transient callbacks. Browser/verify outcomes never prove payment success.
234
+ - Reference-application source (no new export), opt-in repair view: `commerce/paymentStatusClient`, `commerce/paymentVerifyClient`, `payment/components/PaymentStatusPoller`; stored paid alone confirms, redirects require HTTPS, collection/confirmation stay injected, unsupported setup is visible. Exact file/specifier guards refuse broad commerce/operator clients; source-import proof keeps default view unmounted.
235
+ - Truth services/one optional named binder use the host executor, no new schedule/executor. Selectors default-off: nothing activates by default. First-insert adapter fingerprint excludes receipt time/audit.
236
+ - Two experimental example adapter subpaths under `./payments/`, named in the README. Card-processor example: three frozen exports, injected host client/neutral ports; refund creation, split authorization/capture and exact absence unavailable; cancellation needs host support.
237
+ - Regional-processor example: host I/O, Model O aliases, verified observations, purpose-sensitive readback; check certificate validity/notification freshness. Both examples have no import I/O/default binding and await account TEST evidence.
238
+ - Example adapter advisory: mismatched nonzero refusal money stays unknown/manual; trusted document refusals mean customer data correction; configuration mismatches throw before I/O. Unpaid/transient no-dispatch classifications unchanged.
239
+ - Settling money missing/invalid/non-positive or blank currency refuses as amount mismatch; conformance requires positive money. Empty optional transients stop false leak refusals; JSON-escaped transients in diagnostics/readbacks/stored payloads and payer contact in execution results now refuse.
240
+ - Private types reuse canonical money/attempts; unused imports removed, runtime/API unchanged.
241
+
242
+ Migration: upgrade all `@openlup/*` `0.20.0` → `0.21.0` for exact pins. No schema migration; install the canonical catalogue, not sparse projections. Attempts add optional method selection/transient payer contact; contact is dispatch-only, never persisted/audited/logged/diagnosed. Missing adapter-required input requires exact before-dispatch `notDispatched`. Registration refs/kind/status require host `resolveMethodOwner` client/subscription ownership or are omitted. Lifecycle/normalized nested audit copies typed fields only; conformance scans all for secrets/contact. Adapter-filtered redacted audit never stores raw bodies; typed evidence overrides reader facts, audit bag fills untyped facts; identity/fingerprint exclude bag/receipt time. Other changes need no migration, and nothing rewires a host automatically.
243
+
244
+ Migration: F2 replaces assumed full refund with `require-evidence`: missing/null kind/amount/operation identity is durably recorded/acknowledged, not applied. Supply original money, stable operation identity and cumulative snapshot, event delta or explicit full reversal (`refund`/`chargeback`); full evidence stays valid. Former default needs `refundEvidencePolicy: "legacy-assume-full"`, also in the reference handler; no native parity implied.
245
+
246
+ Migration: D11 changes every caller of the reference payment control port (the selected verified ingress, the existing provider webhook handler and the captured reference checkout): apply/post-process redelivery using the first stored receipt instant, not redelivery time, so it cannot shift the cycle again. Replay reads winning receipt evidence and refuses (503) when that instant is unavailable. A legacy pre-fingerprint row takes the later clock once. Retain receipt evidence on upgrade; provider routes are not switched to opt-in ingress.
247
+
248
+ ### Known limitations
249
+
250
+ - Portable dunning repair has no managed twin: exhaustion still pauses active subscriptions there; retaining active status needs a managed forward.
251
+ - D8-1: native advisory v2 promo-code candidates/rejection details unavailable.
252
+ - D8-2: native mounted v2 issue/honor/fallback unavailable.
253
+ - D8-3: native acquisition-only mounted issuance/honor unavailable.
254
+ - D8-4: full native/managed eligibility equivalence unavailable.
255
+ - Bundle-1: independent DB human-only actor-kind enforcement absent natively; first in the native-backend parity round.
256
+ - Bundle-2: managed-equivalent actor-kind/email history absent natively.
257
+ - Bundle-3 closes injected-reader M05 mounted admin/feed readback only. Native new-purchase stock read absent despite P5a installed-store proof; deferred second after bundle-1 (owner 2026-10-21); readiness refuses.
258
+ - Bundle-4: incumbent real-PostgreSQL contention only; no exactly-once guarantee.
259
+ - Managed schema/pgTAP retain `44.404`; removal needs owner decision/forward; reference composition supplies it to app code.
260
+ - A1 offline only; account/hosted-time/owner TEST evidence unclaimed; `communications/klaviyo` verification-pending.
261
+ - M05 omitted opt-ins preserve defaults/outputs/read order/schedules/refusals/acceptance-token bytes/SQL.
262
+ - Native inventory adjustment unavailable; address writes refuse readiness. Flat-rate save needs selected port/Core readiness/applied-seed observation.
263
+ - Native shipping audit unavailable; handler swallows best-effort audit failure.
264
+ - Native flat-rate integer bounds (0 through host maximum; reference 100,000 minor units) use request schema, not DB CHECK.
265
+ - Managed ATP/forecast/dated-supply/pagination readback unproved/pending M06.
266
+ - Managed two-session locks/concurrency/uncovered compensation unproved/pending M06.
267
+ - Managed exact-prefix upgrade/ledger unproved/pending M06.
268
+ - Managed address idempotency/conflict/readback unproved/pending M06.
269
+ - Managed successful flat-rate read/save unproved/pending host authority.
270
+ - M06 stock-wait lifecycle/durable timing/staging controls retain C5/C6; busy/try-gate, continuity/flag/TTL transfers are dispositions, not PASS.
271
+ - Shipping national-registry fields/locale-specific `canonicalAddressKey` fold await M16 host market pack/key migration; reference shipping copy stays locale-specific until M16.
272
+ - Native durable prepared storage, method setup, absence reopen and cumulative refunds unavailable; no production installation parity claimed.
273
+ - Typed refusal-envelope forwarding unavailable (`failureReason` only); reusable registration needs host ownership resolution.
274
+ - Incomplete chargebacks stay refunds/unapplied: reclassification bypasses evidence validation into dispute apply; limited operator recovery.
275
+ - Audit compatibility still detects `chargeId`; refund operation identity/original money supply no typed charge identity.
276
+ - M07 follow-up: repair poll can clear host redirect; post-timeout verify never restarts polling; unlocalized poller; fixture builds/never calls handler.
277
+ - M07 follow-up: reference status route wrong-rail witness.
278
+ - M07 follow-up: explicit reference-route refusal for unsupported method setup.
279
+ - M07 follow-up: deployment-neutral disabled-verify reason.
280
+ - M07 follow-up: reference card normalizer missing-amount path; package settling evidence already requires positive money.
281
+
11
282
  ## [0.20.0]
12
283
 
13
284
  - Publishable on the npm `latest` dist-tag as `0.20.0`, from tag
@@ -106,280 +377,3 @@ projections as an installation chain.
106
377
  `canonicalAddressKey` retains a locale-specific character fold. M16 owns their
107
378
  move behind a host-supplied market pack with a canonical-key migration plan.
108
379
  - Reference shipping UI copy remains locale-specific until M16.
109
-
110
- ## [0.19.0]
111
-
112
- - Publishable on the npm `latest` dist-tag as `0.19.0`, from tag
113
- `openlup-platform-v0.19.0`.
114
-
115
- ### 0.18.0 → 0.19.0 set scope
116
-
117
- - Prepare the complete development-preview minor set at `0.19.0`, including everything on main since `0.18.0`; core and outbox are unchanged republications, and UI stays private `0.0.0`.
118
- - M05 parity adds opt-in shipping-promise consent, post-discount threshold shipping and acquisition orchestration to the experimental pricing, promotions and shipping entries; financial policy and acquisition capability remain host supplied.
119
- - M05 parity adds effective native bundle selection and an authoritative preview hook, optional resolved-target/detail/feed context fields and `selectEffectiveBundleTargetPrice`; effective feeds require unambiguous gross unit anchors and whole-BOM readiness.
120
- - Add `createConcurrentCommercePriceAuthorityPort` with concurrent history scheduling, selected-list identity and base-refusal precedence; browser additions are type-only.
121
- - Catalog/contracts draft canonical JSON detects lone surrogates without regex lookbehind so it loads in Safari before 16.4, with unchanged behavior.
122
- - M06 P5a adds explicit inventory store/provider bindings and structural inventory contribution, keeping reference catalog-stock composition inert and managed authorization intact; native new-purchase stock reads remain unsupported pending an owner decision and native adjustment still refuses.
123
- - M06 P5a retains focused installed-consumer, runtime-role, managed FEFO/adjustment and consume/refund replay evidence with unproved parity gates retained in the M06 ledger.
124
- - M06 P5b adds opt-in shipping selection, address and flat-rate bindings with injected validation and authority; native address writes remain unsupported and refuse required readiness.
125
- - M06 P5b adds the final isolated installed inventory/shipping consumer, preserving incumbent selection errors and flat-rate behavior.
126
- - M06 in progress: inventory and shipping entries are early surfaces; module not complete
127
- - Supporting main changes sort platform registration lists one item per line and use the database clock in the M05 P7 quote witness; neither adds runtime behavior.
128
-
129
- Migration: upgrade the complete `@openlup/*` set from `0.18.0` to `0.19.0` for exact internal pins; existing bindings need no change and new module adoption remains explicit and experimental. Hosts selecting shipping promises must forward `shippingTerms` through both acceptance callbacks and use a context schema that preserves the selected terms. Bind `resolveQuoteShippingPromotions` to the promotions factory to select the bounded two-pass threshold path; financial policy and acquisition capability remain host supplied. The additive APIs require a minor set and introduce no activation. For both M05 24b and M06 P5b, the pricing and promotions API reports reorder existing enum/union members because declaration emit order changed (24b follows the catalog-to-pricing import); no member is added, removed or changed and callers need no migration for that reorder. Install the complete canonical migration catalogue, never sparse package projections as an installation chain; this preparation adds no SQL migration.
130
-
131
- ### Known limitations
132
-
133
- - D8-1: native advisory v2 promo-code candidates and rejection details are not supported on the native backend.
134
- - D8-2: native mounted v2 code issue/honor/fallback is not supported on the native backend.
135
- - D8-3: acquisition-only mounted issuance/honor is not supported on the native backend.
136
- - D8-4: full native/managed eligibility equivalence is not supported on the native backend.
137
- - Bundle-1: independent database human-only actor-kind enforcement is not supported on the native backend and is the first item of a future native-backend parity round.
138
- - Bundle-2: managed-equivalent actor-kind/email history is not supported on the native backend.
139
- - Bundle-3 remains closed for M05 mounted admin/feed readback with an injected stock reader, while native new-purchase stock reads remain unsupported despite P5a's installed native inventory-store read proof.
140
- - Bundle-4 establishes only incumbent real-PostgreSQL contention characterization and provides no exactly-once guarantee.
141
- - The managed baseline schema and its pgTAP tests retain the incumbent legacy value `44.404`; removing it needs a forward migration and an owner decision, while reference composition supplies that value to application code.
142
- - A1 evidence is offline only: account verification, hosted-time behaviour and owner TEST certification are not claimed, and the `communications/klaviyo` adapter's capabilities stay verification-pending.
143
- - M05 parity seams are opt-in and omitted bindings preserve incumbent defaults, outputs, read order, scheduling, refusals, acceptance-token bytes and exported SQL.
144
- - Native inventory adjustment remains unsupported; native address writes and flat-rate saves refuse required-capability readiness.
145
- - M06 managed host ATP/forecast/supply/pagination, remaining compensation/concurrency/lock-order, exact-prefix upgrade/ledger, address idempotency/conflict/readback and runtime rate authority remain pending in the M06 ledger.
146
- - M06 adopter stock-wait lifecycle, durable subscription timing and staging control observations retain their separate C5/C6 evidence gates.
147
-
148
- ### Size note
149
-
150
- Only platform `pack.docs.maxPackedBytes` rises from 40,960 to 49,152 B; all other caps and budgets remain unchanged. All three baselines use integrity-verified published `0.18.0` tarballs.
151
-
152
- Question (2026-10-21): "The platform package's root docs (README + CHANGELOG) will exceed their 40,960 B gzip cap at the next release. What should we do?"
153
- Owner's answer: "Raise to 49,152 B (Recommended)"
154
- Option description shown to the owner: "Same figure as core. Unblocks the next few releases; the CHANGELOG grows every release, so this cap would otherwise block each one."
155
- Recorded as an owner decision taken through the coordinator's question on 2026-10-21.
156
-
157
- ## [0.18.0]
158
-
159
- - Publishable on the npm `latest` dist-tag as `0.18.0`, from tag
160
- `openlup-platform-v0.18.0`.
161
-
162
- - M06 P4: retain named compatibility shims, restrict inventory smoke evidence to package-owned tests, neutralize synthetic transport fixtures and clarify inventory documentation; no runtime or API change.
163
-
164
- ### 0.17.0 → 0.18.0 set scope
165
-
166
- - Prepare the complete development-preview set at `0.18.0`: core and outbox are
167
- unchanged republications; platform includes every change on main in this set.
168
- - M05 adds catalog foundation/contracts, draft validation, product/lifecycle DTOs,
169
- authority/GTIN/quantity helpers, media and source-pack operations,
170
- fixed-bundle read/admin/feed logic, native envelope/draft stores and an inert
171
- catalog contribution; pricing adds the neutral quote foundation, authority,
172
- subscription policy and assignment token, quote/offer projection, opt-in
173
- acquisition terms and promise consent; promotions includes advisory, preview, acceptance,
174
- admin/native reads and sweep with explicit host bindings; lifecycle/publication
175
- contracts alone do not provide a publisher or native lifecycle writes.
176
- - M05 P6: pricing and bundle comments are corrected, VAT arithmetic delegates to the
177
- existing helper and moved test fixtures are neutral with assertions unchanged;
178
- no API change.
179
- - Reference-application source: opt-in catalog, product, basket, builder and admin UI consumes explicit
180
- data/locale/media/lifecycle inputs; basket edits invalidate promise consent and
181
- minor-money display uses the currency exponent.
182
- - Shipped catalog SQL projects unchanged canonical positions 1/8/16/19/58/59/61,
183
- promotions projects 47/48 and inventory projects 27/33; native catalog factories
184
- retain the existing store bodies and references preserve their named exports.
185
- - A1 adds 17 neutral marketing/consent declarations, the three-function `communications/resend`
186
- entry, the `communications/klaviyo` marketing adapter and lazy opt-in reference bindings with
187
- invocation-time admission; default routes, schedules and handlers stay empty.
188
- Existing providers remain assignable; existing neutral entries keep their runtime
189
- behaviour (the declarations above are additive), and the maintained reference
190
- adapter and default wiring are unchanged.
191
- Authenticated raw webhooks and GET-only delivery reconciliation retain host
192
- ownership of persistence and admission; no SDK or default sender is added.
193
- `communications/klaviyo` profile projection, negative consent readback,
194
- account-wide deletion acknowledgement and authoritative consent push stay
195
- verification-pending until the host supplies owner TEST verification.
196
- Audience-scoped deletion and deletion status are unsupported; newsletter sync
197
- refuses. No flow control, historical import, suppression edits or automatic
198
- mutation retry is added.
199
- - Consent push grants stay audience-scoped; only withdrawals may be account-wide.
200
- The capability declares `grantEffect`; accepted/acknowledged results require
201
- `reconcileRequired`. Conformance keeps grants unsettled until settlement and
202
- fresh readback. Withdrawals bypass grant-caused fences/quarantine but retain
203
- same-key withdrawal fences and account cooling. No push factory, activation,
204
- callback, retry or subpath is added.
205
- - M06 in progress: inventory and shipping entries are early surfaces; module not complete
206
- - The merged M06 surfaces include inventory contracts/admin/native reads, injected
207
- new-purchase availability, reservation policy/maintenance and dated forecast
208
- calculation with required provider injection, plus shipping selection, address
209
- and rate handlers with required host validation.
210
- - @openlup/platform size growth: added M05 catalog, pricing and promotions implementations, native stores and SQL projections, A1 communications adapters and consent contracts, and the merged early M06 inventory/shipping surfaces with their declarations and documentation.
211
-
212
- Migration: upgrade the entire `@openlup/*` set from `0.17.0` to `0.18.0` for exact
213
- core peer pins; new module adoption remains explicit and experimental.
214
- Catalog and promotions server entries are adapters: their declarations require
215
- selected optional `pg` peers, while runtime imports and injected executors work
216
- without them and their contracts entries remain non-adapters. Supply host schemas, authorization,
217
- responders and policies through the documented bindings. Acquisition requires
218
- an explicit `AcquisitionFinancialPolicy` with no default; absence refuses with
219
- `acquisition_terms_policy_unconfigured`, and reference activation remains off.
220
- Bind resolved terms from the final optional issue/honor callback argument for
221
- acquisition-aware acceptance; existing callbacks remain assignable. Stop
222
- assigning `NegativeFeedback.kind` or `.outcome`, now readonly. Reference-application
223
- source threshold classifiers require the host's explicit threshold. Generated enum declaration
224
- ordering changes preserve member values and runtime behavior. Catalog adds
225
- `createPostgresBundleCatalogStore`, `createPostgresCatalogDraftStore` and
226
- `createPostgresCatalogSkuEnvelopeReadPort`, plus `BUNDLE_MIGRATIONS` (16/19) and
227
- `CATALOG_MIGRATIONS` (1/8/58/59/61); composition adds
228
- `createCatalogContribution` and `CatalogContributionInput`, with no public export
229
- removed or renamed. Existing named reference imports remain compatibility paths.
230
- The native writer, pooled transaction binding and transport remain reference-owned;
231
- browser schemas stay local. Core remains the promotions evaluator; no claim writer
232
- is added, and claim writing and mounted acceptance retain their owners. Reference
233
- shipping selection, pickup and stock UI mechanics and browser validation stay local.
234
- Install the complete canonical migration manifest, never sparse package SQL
235
- projections as an installation chain; this preparation adds no new SQL migration.
236
- A1 hosts retain credentials, identity/authority, atomic storage, environment,
237
- egress and schedule ownership; acknowledged/accepted does not establish remote
238
- effect and local consent remains authoritative.
239
-
240
- ### Known limitations
241
-
242
- - D8-1: native advisory v2 promo-code candidates and rejection details are not supported on the native backend.
243
- - D8-2: native mounted v2 code issue/honor/fallback is not supported on the native backend.
244
- - D8-3: acquisition-only mounted issuance/honor is not supported on the native backend.
245
- - D8-4: full native/managed eligibility equivalence is not supported on the native backend.
246
- - Bundle-1: independent database human-only actor-kind enforcement is not supported on the native backend and is the first item of a future native-backend parity round.
247
- - Bundle-2: managed-equivalent actor-kind/email history is not supported on the native backend.
248
- - Bundle-3 is closed for M05 mounted admin/feed readback through the merged availability builder with an injected stock reader; the real native stock read remains M06 P5a work.
249
- - Bundle-4 establishes only incumbent real-PostgreSQL contention characterization and provides no exactly-once guarantee.
250
- - The managed baseline schema and its pgTAP tests retain the incumbent legacy value `44.404`; removing it needs a forward migration and an owner decision, while reference composition supplies that value to application code.
251
- - A1 evidence is offline only: account verification, hosted-time behaviour and owner TEST certification are not claimed, and the `communications/klaviyo` adapter's capabilities stay verification-pending.
252
-
253
- ## [0.17.0]
254
-
255
- - Publishable on the npm `latest` dist-tag as `0.17.0`, from tag
256
- `openlup-platform-v0.17.0`.
257
-
258
- - Add experimental `./communications` and browser-safe
259
- `./communications/contracts`, plus generic capped raw-body, hex-HMAC and
260
- constant-time comparison helpers in the existing `./http` entry. Compose neutral
261
- transport/results/capture, rendering/content, independent Auth verification,
262
- receipt/observation, polling/reconciliation, consent and membership sync engines.
263
- Provider clients, protocol/key mapping, copy and activation remain host-owned.
264
- - Require explicit egress admission for supported injected network senders.
265
- Guarded transports validate fresh host decisions, redirect sink sends and
266
- suppress drops before network entry; provider names grant no admission.
267
- Capture remains local acceptance. Preserve the maintained reference transport
268
- through its trusted composition bridge and keep Auth/provider verification separate.
269
- - Add Polish/English invoice, role, opt-out and inquiry default-content factories
270
- with whole-copy injection. Preserve implicit Polish invoice and existing role
271
- expectations; EN invoice is construction-time opt-in. Reference opt-out page
272
- copy, EN legacy/error text, document language and escaping change deliberately.
273
- Pure inquiry rendering activates no sender. See the
274
- [B1/B2 expectation inventory](../../docs/platform/plans/oss-m04-communications-triggers.md#b1-egress-boundary).
275
- - Add an opt-in immutable composition-time purpose registry with mandatory
276
- classification and finite legacy defaults. Registration grants no consent,
277
- provider activation or managed schema permission; custom-purpose persistence
278
- stays with the host. Add neutral newsletter processing and marketing ports
279
- without a runner or a new public purpose.
280
- - Add four bounded native store groups: delivery observation/readback, existing-rail
281
- membership sync, operator notification recipients and durable consent decisions.
282
- Append CREATE-only direct catalogue position 70,
283
- `20261019200000_communications_native_operations.sql`, and its exact sparse
284
- projection. Standard factory lanes refuse unsafe effective privileges.
285
- Sync uses `public.outbox_events`; the sidecar is not another executor.
286
- - Compose selected native readback and atomic signed-token preferences with Core
287
- readiness, explicit provider/binding identities and host-supplied clocks and
288
- schedules. Add distinct opt-in operator evidence and installed substitute-provider
289
- proof. Captured, network-accepted and membership-synced are not delivered.
290
- Native consent excludes managed 16-hour / 2-day / 4-week caps and legacy
291
- contact-touching, and is not a send-time fence. No default cadence, deployment
292
- activation, full native general sender or UI package capability is added.
293
- [T07 destinations](../../docs/platform/plans/oss-m04-communications-triggers.md#t07-destination-matrix)
294
- remain explicitly open with their owning modules.
295
- - @openlup/platform size growth: added the reviewed neutral communications runtime and browser content contracts, bounded native stores and SQL projection, and their API/adoption documentation.
296
-
297
- Migration: `0.16.0` did not export communications. Upgrade the complete package
298
- set to `0.17.0` for the exact core peers, then explicitly select and bind the new
299
- experimental capability. Existing non-communications entries retain their contracts.
300
- The host retains renderer/copy, environment, origin, egress, provider protocol,
301
- credentials and schedule ownership. The generic HTTP helpers do not replace the
302
- independent Auth Standard Webhooks or provider-specific verification protocols.
303
-
304
- Install the complete selected direct canonical catalogue through position 70
305
- before selecting native stores. `COMMUNICATIONS_MIGRATIONS` projects positions
306
- 2, 9, 20 and 70; never reapply these sparse files over an existing canonical
307
- history or treat them as a standalone chain. Preserve managed/private lineage
308
- and custom-purpose persistence: registering a purpose does not expand managed
309
- CHECKs. Thread the same registered purpose union and registry through selected
310
- policy, token, newsletter and store bindings; omitted arguments retain finite
311
- legacy defaults and existing signing bytes.
312
-
313
- `registerNativeSyncWorkInTransaction` is a trusted host transaction seam. Its
314
- caller-owned executor must already hold the lane's safe effective privileges;
315
- this function does not check those privileges. The caller owns the transaction
316
- and must commit or roll back permission, sidecar and existing-rail effects
317
- atomically. Use a safely admitted lane; the helper grants no provider or claim
318
- authority. Standard native sync factory transactions check
319
- `public.communication_native_sync_state`, `public.outbox_events` and
320
- `public.communication_recipient_consents`.
321
-
322
- Custom native stores must provide binding-scoped `findByMessageId`, bounded
323
- `listEvidence` (1–100) and atomic `registerPreference` as declared by the new
324
- surface. Supply explicit provider/binding identities and full catalogue admission.
325
- Hosts preserving older opt-out page bytes retain their own presentation binding;
326
- token purposes, verification and existing HTTP status/header semantics remain.
327
- See the [package composition guidance](README.md#communications-import).
328
-
329
- Growth reading: +61.4% against the retained initial `0.16.0` baseline (256,973
330
- packed bytes), measured before S1 notes at 414,808 bytes; final S1 measurements
331
- are recorded in the programme evidence. No cap is changed. Baseline evidence
332
- (2026-10-20): the published `0.16.0` tarball is 257,434 packed bytes, SHA256
333
- `030756175d61279aab0ae7b26b27783e08467ec93673f5623d19d0b7fc436463`.
334
- S1 option B retains the initial release-gates baseline rather than replacing it
335
- with this observed registry identity.
336
-
337
- ## [0.16.0]
338
-
339
- - Publishable on the npm `latest` dist-tag as `0.16.0`, from tag
340
- `openlup-platform-v0.16.0`.
341
-
342
- - Add the experimental identity capability at `./identity` and browser-safe
343
- `./identity/contracts`: role-based authorization, actor-scoped profiles,
344
- bounded normalized contact matching, unconfirmed soft accounts with explicit
345
- email-trust policies, and configured-origin magic-link redirect resolution.
346
- - Add operator invitations with transactional pending acceptance, expiry,
347
- cancellation and revoked re-invitation for direct stores, and immediate active
348
- membership with repeat/concurrent recovery for managed stores. Direct operator
349
- login uses single-use email challenges, operator-audience sessions, live
350
- membership authorization, explicit first-administrator bootstrap and bounded
351
- challenge pruning. An opt-in OIDC access-token verifier provides pinned issuer
352
- discovery, bounded rotating JWKS, strict claim validation and deterministic
353
- issuer/subject principals for direct composition.
354
- - Add versioned personal-data contributors, identity export and transactional
355
- direct erasure with contributor vetoes, challenge/invitation cleanup,
356
- pseudonymization, guarded operator revocation and idempotent receipts. Managed
357
- export reports incomplete coverage; managed erasure refuses with
358
- `MANAGED_PRIVACY_ERASURE_UNAVAILABLE` without mutation. Issued tokens may remain
359
- valid until expiry.
360
- - Add seven byte-identical identity SQL projections and host-selected module
361
- schema readiness. The projections retain canonical migration identities and
362
- positions; they are not a standalone installation chain.
363
-
364
- Migration: identity adoption is opt-in; upgrade the complete package set together
365
- for the exact `@openlup/core` `0.16.0` peer pin. Supply the selected bundle's schema
366
- inventory, clients and delivery bindings, an explicit email-trust policy, exact
367
- redirect origins, a distinct operator audience and a deployment policy for
368
- admin, operator and privacy routes. Managed soft-account provisioning requires
369
- an email-trust envelope with automatic confirmation disabled and all enabled
370
- non-email providers declared email-verifying. Install the complete direct
371
- catalogue through `20261018190000_identity_privacy_erasures` before enabling
372
- identity; never reapply projections to an existing canonical history. Managed
373
- adopters need their committed chain's
374
- `20261018160000_identity_service_role_capabilities.sql` forward for contact linking
375
- and operator membership capabilities, and must supply their own erasure path.
376
-
377
- ## [0.15.0]
378
-
379
- - Publishable on the npm `latest` dist-tag as `0.15.0`, from tag
380
- `openlup-platform-v0.15.0`.
381
-
382
- - First publication of `@openlup/platform`, the server substrate for an OpenLup application, with one module subpath each for `http`, `bff`, `scheduler`, `blob`, `data`, `migrations`, `job-ledger`, `kernel` and `composition`.
383
- - Transport-neutral scheduled jobs: a `run(context)` contract, an empty job registry, a lease-aware runner and an authenticated HTTP cron entry, with a constant-time cron secret comparison.
384
- - Per-capability bundle readiness that refuses an unknown bundle and reports every missing scheduler, lock and blob setting together.
385
- - Blob capability selection with filesystem, Vercel Blob, Supabase Storage and S3 bindings; `pg`, `@types/pg` and `@aws-sdk/client-s3` are optional peers, and an adapter refuses a missing peer with `OPENLUP_E_PEER_MISSING`.