@hyperscale0/hsx 1.0.0-beta.1 → 1.0.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 (255) hide show
  1. package/CHANGELOG.md +58 -9
  2. package/LICENSING.md +3 -3
  3. package/README.md +39 -149
  4. package/TRADEMARKS.md +4 -4
  5. package/bin/hsx.ts +2 -0
  6. package/dist/bin/hsx.js +2 -0
  7. package/dist/bin/hsx.js.map +1 -1
  8. package/dist/src/ast.d.ts +135 -10
  9. package/dist/src/ast.d.ts.map +1 -1
  10. package/dist/src/ast.js +24 -0
  11. package/dist/src/ast.js.map +1 -1
  12. package/dist/src/cli.d.ts +4 -1
  13. package/dist/src/cli.d.ts.map +1 -1
  14. package/dist/src/cli.js +172 -16
  15. package/dist/src/cli.js.map +1 -1
  16. package/dist/src/compile.d.ts +42 -7
  17. package/dist/src/compile.d.ts.map +1 -1
  18. package/dist/src/compile.js +82 -16
  19. package/dist/src/compile.js.map +1 -1
  20. package/dist/src/cost.d.ts +78 -0
  21. package/dist/src/cost.d.ts.map +1 -0
  22. package/dist/src/cost.js +369 -0
  23. package/dist/src/cost.js.map +1 -0
  24. package/dist/src/diagnostics.d.ts +11 -0
  25. package/dist/src/diagnostics.d.ts.map +1 -0
  26. package/dist/src/diagnostics.js +420 -0
  27. package/dist/src/diagnostics.js.map +1 -0
  28. package/dist/src/emit.d.ts +34 -0
  29. package/dist/src/emit.d.ts.map +1 -0
  30. package/dist/src/emit.js +137 -0
  31. package/dist/src/emit.js.map +1 -0
  32. package/dist/src/entry-overrides.d.ts +17 -3
  33. package/dist/src/entry-overrides.d.ts.map +1 -1
  34. package/dist/src/entry-overrides.js +180 -35
  35. package/dist/src/entry-overrides.js.map +1 -1
  36. package/dist/src/format.d.ts +10 -0
  37. package/dist/src/format.d.ts.map +1 -0
  38. package/dist/src/format.js +183 -0
  39. package/dist/src/format.js.map +1 -0
  40. package/dist/src/index.d.ts +11 -4
  41. package/dist/src/index.d.ts.map +1 -1
  42. package/dist/src/index.js +10 -3
  43. package/dist/src/index.js.map +1 -1
  44. package/dist/src/ir.d.ts +66 -0
  45. package/dist/src/ir.d.ts.map +1 -0
  46. package/dist/src/ir.js +15 -0
  47. package/dist/src/ir.js.map +1 -0
  48. package/dist/src/lex.d.ts +9 -1
  49. package/dist/src/lex.d.ts.map +1 -1
  50. package/dist/src/lex.js +50 -4
  51. package/dist/src/lex.js.map +1 -1
  52. package/dist/src/limits.d.ts +2 -3
  53. package/dist/src/limits.d.ts.map +1 -1
  54. package/dist/src/limits.js +2 -3
  55. package/dist/src/limits.js.map +1 -1
  56. package/dist/src/lsp/server.d.ts +32 -0
  57. package/dist/src/lsp/server.d.ts.map +1 -0
  58. package/dist/src/lsp/server.js +391 -0
  59. package/dist/src/lsp/server.js.map +1 -0
  60. package/dist/src/modules.d.ts +38 -0
  61. package/dist/src/modules.d.ts.map +1 -0
  62. package/dist/src/modules.js +368 -0
  63. package/dist/src/modules.js.map +1 -0
  64. package/dist/src/parse.d.ts.map +1 -1
  65. package/dist/src/parse.js +590 -17
  66. package/dist/src/parse.js.map +1 -1
  67. package/dist/src/std-bundle.d.ts +2 -0
  68. package/dist/src/std-bundle.d.ts.map +1 -0
  69. package/dist/src/std-bundle.js +88 -0
  70. package/dist/src/std-bundle.js.map +1 -0
  71. package/dist/src/std-library.d.ts +5 -0
  72. package/dist/src/std-library.d.ts.map +1 -0
  73. package/dist/src/std-library.js +9 -0
  74. package/dist/src/std-library.js.map +1 -0
  75. package/dist/src/typecheck.d.ts +8 -0
  76. package/dist/src/typecheck.d.ts.map +1 -0
  77. package/dist/src/typecheck.js +2958 -0
  78. package/dist/src/typecheck.js.map +1 -0
  79. package/dist/src/version.d.ts +4 -15
  80. package/dist/src/version.d.ts.map +1 -1
  81. package/dist/src/version.js +4 -15
  82. package/dist/src/version.js.map +1 -1
  83. package/docs/README.md +26 -0
  84. package/docs/guide/01-first-program.md +24 -0
  85. package/docs/guide/02-money.md +25 -0
  86. package/docs/guide/03-instruments.md +22 -0
  87. package/docs/guide/04-lifecycles.md +25 -0
  88. package/docs/guide/05-fees-and-splits.md +45 -0
  89. package/docs/guide/06-schedules.md +22 -0
  90. package/docs/guide/07-composition.md +46 -0
  91. package/docs/guide/08-writing-a-module.md +26 -0
  92. package/docs/guide/09-cost.md +24 -0
  93. package/docs/guide/10-diagnostics.md +27 -0
  94. package/docs/llms-full.txt +1739 -0
  95. package/docs/llms.txt +45 -0
  96. package/docs/playground.md +54 -0
  97. package/docs/reference/cli.md +35 -0
  98. package/docs/reference/diagnostics.md +619 -0
  99. package/docs/reference/grammar.md +39 -0
  100. package/docs/reference/std/advance.md +35 -0
  101. package/docs/reference/std/cancellable_booking.md +35 -0
  102. package/docs/reference/std/captured_payment.md +43 -0
  103. package/docs/reference/std/conditional_disbursement.md +33 -0
  104. package/docs/reference/std/credit_facility.md +35 -0
  105. package/docs/reference/std/held_payment.md +64 -0
  106. package/docs/reference/std/instant_transfer.md +30 -0
  107. package/docs/reference/std/metered.md +27 -0
  108. package/docs/reference/std/pooled_split.md +26 -0
  109. package/docs/reference/std/premium_forward.md +39 -0
  110. package/docs/reference/std/reconciled_payout.md +33 -0
  111. package/docs/reference/std/recurring_collection.md +25 -0
  112. package/docs/reference/std/rotating_pool.md +42 -0
  113. package/docs/reference/std/scheduled.md +51 -0
  114. package/docs/reference/std/security_deposit.md +46 -0
  115. package/docs/reference/std/settlement_batch.md +42 -0
  116. package/docs/reference/std/swap.md +46 -0
  117. package/docs/reference/std/threshold_pool.md +47 -0
  118. package/docs/reference/std/weighted_distribution.md +39 -0
  119. package/docs/reference/types.md +20 -0
  120. package/docs/reference/udl-output.md +13 -0
  121. package/docs/sessions/2026-09-02-two-instruments.hsx +21 -0
  122. package/docs/sessions/2026-09-02-two-instruments.md +41 -0
  123. package/examples/01-first-program/README.md +45 -0
  124. package/examples/01-first-program/tip-jar.hsx +17 -0
  125. package/examples/02-imports-and-archetypes/README.md +96 -0
  126. package/examples/02-imports-and-archetypes/photo-booth.hsx +37 -0
  127. package/examples/03-diagnostics/README.md +68 -0
  128. package/examples/03-diagnostics/corner-shop-fixed.hsx +22 -0
  129. package/examples/03-diagnostics/corner-shop.hsx +19 -0
  130. package/examples/04-complete-product/README.md +84 -0
  131. package/examples/04-complete-product/study-hall.hsx +67 -0
  132. package/examples/05-watch-club/README.md +9 -0
  133. package/examples/05-watch-club/watch-club.hsx +124 -0
  134. package/examples/README.md +18 -0
  135. package/examples/advance/README.md +3 -0
  136. package/examples/advance/advance.hsx +13 -0
  137. package/examples/advance/advance.udl +339 -0
  138. package/examples/cancellable_booking/README.md +3 -0
  139. package/examples/cancellable_booking/cancellable_booking.hsx +14 -0
  140. package/examples/cancellable_booking/cancellable_booking.udl +391 -0
  141. package/examples/captured_payment/README.md +3 -0
  142. package/examples/captured_payment/captured_payment.hsx +21 -0
  143. package/examples/captured_payment/captured_payment.udl +677 -0
  144. package/examples/conditional_disbursement/README.md +3 -0
  145. package/examples/conditional_disbursement/conditional_disbursement.hsx +17 -0
  146. package/examples/conditional_disbursement/conditional_disbursement.udl +412 -0
  147. package/examples/cost-table.json +386 -0
  148. package/examples/credit_facility/README.md +3 -0
  149. package/examples/credit_facility/credit_facility.hsx +27 -0
  150. package/examples/credit_facility/credit_facility.udl +1373 -0
  151. package/examples/held_payment/README.md +3 -0
  152. package/examples/held_payment/held_payment.hsx +13 -0
  153. package/examples/held_payment/held_payment.udl +507 -0
  154. package/examples/instant_transfer/README.md +3 -0
  155. package/examples/instant_transfer/instant_transfer.hsx +16 -0
  156. package/examples/instant_transfer/instant_transfer.udl +364 -0
  157. package/examples/metered/README.md +3 -0
  158. package/examples/metered/metered.hsx +13 -0
  159. package/examples/metered/metered.udl +247 -0
  160. package/examples/pooled_split/README.md +3 -0
  161. package/examples/pooled_split/pooled_split.hsx +15 -0
  162. package/examples/pooled_split/pooled_split.udl +425 -0
  163. package/examples/premium_forward/README.md +3 -0
  164. package/examples/premium_forward/premium_forward.hsx +19 -0
  165. package/examples/premium_forward/premium_forward.udl +594 -0
  166. package/examples/reconciled_payout/README.md +3 -0
  167. package/examples/reconciled_payout/reconciled_payout.hsx +13 -0
  168. package/examples/reconciled_payout/reconciled_payout.udl +303 -0
  169. package/examples/recurring_collection/README.md +3 -0
  170. package/examples/recurring_collection/recurring_collection.hsx +21 -0
  171. package/examples/recurring_collection/recurring_collection.udl +1130 -0
  172. package/examples/rotating_pool/README.md +3 -0
  173. package/examples/rotating_pool/rotating_pool.hsx +18 -0
  174. package/examples/rotating_pool/rotating_pool.udl +4352 -0
  175. package/examples/scheduled/README.md +3 -0
  176. package/examples/scheduled/scheduled.hsx +12 -0
  177. package/examples/scheduled/scheduled.udl +335 -0
  178. package/examples/security_deposit/README.md +3 -0
  179. package/examples/security_deposit/security_deposit.hsx +21 -0
  180. package/examples/security_deposit/security_deposit.udl +293 -0
  181. package/examples/settlement_batch/README.md +3 -0
  182. package/examples/settlement_batch/settlement_batch.hsx +19 -0
  183. package/examples/settlement_batch/settlement_batch.udl +753 -0
  184. package/examples/swap/README.md +3 -0
  185. package/examples/swap/swap.hsx +19 -0
  186. package/examples/swap/swap.udl +876 -0
  187. package/examples/threshold_pool/README.md +3 -0
  188. package/examples/threshold_pool/threshold_pool.hsx +16 -0
  189. package/examples/threshold_pool/threshold_pool.udl +667 -0
  190. package/examples/weighted_distribution/README.md +3 -0
  191. package/examples/weighted_distribution/weighted_distribution.hsx +20 -0
  192. package/examples/weighted_distribution/weighted_distribution.udl +337 -0
  193. package/package.json +27 -6
  194. package/skills/hsx/SKILL.md +483 -0
  195. package/src/ast.ts +193 -9
  196. package/src/cli.ts +191 -20
  197. package/src/compile.ts +160 -23
  198. package/src/cost.ts +579 -0
  199. package/src/diagnostics.ts +442 -0
  200. package/src/emit.ts +201 -0
  201. package/src/entry-overrides.ts +263 -48
  202. package/src/format.ts +261 -0
  203. package/src/index.ts +34 -4
  204. package/src/ir.ts +99 -0
  205. package/src/lex.ts +59 -4
  206. package/src/limits.ts +2 -3
  207. package/src/lsp/server.ts +460 -0
  208. package/src/modules.ts +446 -0
  209. package/src/parse.ts +655 -21
  210. package/src/std-bundle.ts +91 -0
  211. package/src/std-library.ts +12 -0
  212. package/src/typecheck.ts +3876 -0
  213. package/src/version.ts +4 -16
  214. package/std/SEMANTICS.md +130 -0
  215. package/std/settlements/advance.hsx +177 -0
  216. package/std/settlements/cancellable_booking.hsx +87 -0
  217. package/std/settlements/captured_payment.hsx +144 -0
  218. package/std/settlements/conditional_disbursement.hsx +185 -0
  219. package/std/settlements/credit_facility.hsx +167 -0
  220. package/std/settlements/held_payment.hsx +578 -0
  221. package/std/settlements/index.hsx +3 -0
  222. package/std/settlements/instant_transfer.hsx +190 -0
  223. package/std/settlements/metered.hsx +67 -0
  224. package/std/settlements/pooled_split.hsx +68 -0
  225. package/std/settlements/premium_forward.hsx +257 -0
  226. package/std/settlements/reconciled_payout.hsx +77 -0
  227. package/std/settlements/recurring_collection.hsx +27 -0
  228. package/std/settlements/rotating_pool.hsx +252 -0
  229. package/std/settlements/scheduled.hsx +641 -0
  230. package/std/settlements/security_deposit.hsx +166 -0
  231. package/std/settlements/settlement_batch.hsx +122 -0
  232. package/std/settlements/swap.hsx +1114 -0
  233. package/std/settlements/threshold_pool.hsx +221 -0
  234. package/std/settlements/weighted_distribution.hsx +141 -0
  235. package/dist/src/archetypes.d.ts +0 -17
  236. package/dist/src/archetypes.d.ts.map +0 -1
  237. package/dist/src/archetypes.js +0 -327
  238. package/dist/src/archetypes.js.map +0 -1
  239. package/dist/src/check.d.ts +0 -12
  240. package/dist/src/check.d.ts.map +0 -1
  241. package/dist/src/check.js +0 -1910
  242. package/dist/src/check.js.map +0 -1
  243. package/dist/src/lower.d.ts +0 -146
  244. package/dist/src/lower.d.ts.map +0 -1
  245. package/dist/src/lower.js +0 -4570
  246. package/dist/src/lower.js.map +0 -1
  247. package/dist/src/model.d.ts +0 -467
  248. package/dist/src/model.d.ts.map +0 -1
  249. package/dist/src/model.js +0 -15
  250. package/dist/src/model.js.map +0 -1
  251. package/spec/hsx-ir.schema.json +0 -920
  252. package/src/archetypes.ts +0 -340
  253. package/src/check.ts +0 -2938
  254. package/src/lower.ts +0 -5416
  255. package/src/model.ts +0 -519
@@ -0,0 +1,677 @@
1
+ {
2
+ "instruments": [
3
+ {
4
+ "actionOrder": [
5
+ "create",
6
+ "authorize",
7
+ "capture",
8
+ "capture_more",
9
+ "settle",
10
+ "void",
11
+ "expire",
12
+ "settle_on_expiry",
13
+ "correct_capture",
14
+ "reverse_capture"
15
+ ],
16
+ "actions": {
17
+ "authorize": {
18
+ "agentDescription": "Reserve the authorizedAmount against the payer in the payee's favor until reserveUntil. The payment must be created. The money is held, not paid: capture and settle post it, void and expiry release it.",
19
+ "effects": {
20
+ "holds": [
21
+ {
22
+ "signature": "holds.reserve",
23
+ "source": "moves[0]"
24
+ }
25
+ ],
26
+ "moves": [
27
+ {
28
+ "signature": "moves.transfer.internal",
29
+ "source": "moves[0]"
30
+ }
31
+ ]
32
+ },
33
+ "moves": [
34
+ {
35
+ "bind": {
36
+ "amount": {
37
+ "from": "instance",
38
+ "path": "fields.authorizedAmount"
39
+ },
40
+ "currency": {
41
+ "from": "instance",
42
+ "path": "fields.currency"
43
+ },
44
+ "destinationAccountId": {
45
+ "from": "instance",
46
+ "path": "fields.payeeAccountId"
47
+ },
48
+ "metadata.instrumentId": {
49
+ "from": "const",
50
+ "value": "card_payment"
51
+ },
52
+ "metadata.instrumentInstanceId": {
53
+ "from": "instance",
54
+ "path": "instrumentInstanceId"
55
+ },
56
+ "metadata.phase": {
57
+ "from": "const",
58
+ "value": "authorize"
59
+ },
60
+ "productId": {
61
+ "from": "instance",
62
+ "path": "productId"
63
+ },
64
+ "sourceAccountId": {
65
+ "from": "instance",
66
+ "path": "fields.payerAccountId"
67
+ }
68
+ },
69
+ "capture": {
70
+ "authorizeReservationTransferId": "transferId"
71
+ },
72
+ "key": "reservation",
73
+ "operation": "internal_transfer.reserve"
74
+ }
75
+ ],
76
+ "publicAction": "authorizeCardPayment",
77
+ "steps": [],
78
+ "summary": "Reserve the authorizedAmount until reserveUntil"
79
+ },
80
+ "capture": {
81
+ "agentDescription": "Post the first capture slice out of the live reservation. The payment must be authorized and the caller passes captureAmount in minor units. The slice settles for good and void can no longer release the reservation. Call before reserveUntil.",
82
+ "deadline": {
83
+ "field": "reserveUntil"
84
+ },
85
+ "effects": {
86
+ "moves": [
87
+ {
88
+ "signature": "moves.transfer.internal",
89
+ "source": "moves[0]"
90
+ }
91
+ ],
92
+ "schedules": [
93
+ {
94
+ "signature": "schedules.deadline",
95
+ "source": "deadline"
96
+ }
97
+ ]
98
+ },
99
+ "input": {
100
+ "additionalProperties": false,
101
+ "properties": {
102
+ "captureAmount": {
103
+ "description": "Positive partial capture amount in minor units",
104
+ "pattern": "^[1-9][0-9]{0,17}$",
105
+ "type": "string"
106
+ }
107
+ },
108
+ "required": [
109
+ "captureAmount"
110
+ ],
111
+ "type": "object"
112
+ },
113
+ "moves": [
114
+ {
115
+ "bind": {
116
+ "amount": {
117
+ "from": "input",
118
+ "path": "captureAmount"
119
+ },
120
+ "currency": {
121
+ "from": "instance",
122
+ "path": "fields.currency"
123
+ },
124
+ "postMode": {
125
+ "from": "const",
126
+ "value": "partial_only"
127
+ },
128
+ "transferId": {
129
+ "from": "instance",
130
+ "path": "refs.authorizeReservationTransferId"
131
+ }
132
+ },
133
+ "capture": {
134
+ "capturedAmount": "postedAmount"
135
+ },
136
+ "key": "post",
137
+ "operation": "internal_transfer.post"
138
+ }
139
+ ],
140
+ "publicAction": "captureCardPayment",
141
+ "steps": [],
142
+ "summary": "Post one strict partial capture slice"
143
+ },
144
+ "capture_more": {
145
+ "agentDescription": "Post another capture slice out of a partly captured reservation. Call this only after capture took the first slice. Each slice settles for good, and the uncaptured remainder still releases at reserveUntil.",
146
+ "deadline": {
147
+ "field": "reserveUntil"
148
+ },
149
+ "effects": {
150
+ "moves": [
151
+ {
152
+ "signature": "moves.transfer.internal",
153
+ "source": "moves[0]"
154
+ }
155
+ ],
156
+ "schedules": [
157
+ {
158
+ "signature": "schedules.deadline",
159
+ "source": "deadline"
160
+ }
161
+ ]
162
+ },
163
+ "input": {
164
+ "additionalProperties": false,
165
+ "properties": {
166
+ "captureAmount": {
167
+ "description": "Positive partial capture amount in minor units",
168
+ "pattern": "^[1-9][0-9]{0,17}$",
169
+ "type": "string"
170
+ }
171
+ },
172
+ "required": [
173
+ "captureAmount"
174
+ ],
175
+ "type": "object"
176
+ },
177
+ "moves": [
178
+ {
179
+ "bind": {
180
+ "amount": {
181
+ "from": "input",
182
+ "path": "captureAmount"
183
+ },
184
+ "currency": {
185
+ "from": "instance",
186
+ "path": "fields.currency"
187
+ },
188
+ "postMode": {
189
+ "from": "const",
190
+ "value": "partial_only"
191
+ },
192
+ "transferId": {
193
+ "from": "instance",
194
+ "path": "refs.authorizeReservationTransferId"
195
+ }
196
+ },
197
+ "capture": {
198
+ "capturedAmount": "postedAmount"
199
+ },
200
+ "key": "post",
201
+ "operation": "internal_transfer.post"
202
+ }
203
+ ],
204
+ "publicAction": "captureMoreCardPayment",
205
+ "steps": [],
206
+ "summary": "Post another strict partial capture slice"
207
+ },
208
+ "correct_capture": {
209
+ "agentDescription": "Return the whole captured amount to the payer after the payment settled. Only a settled payment corrects, and only the party the product authorized may call it. The money moves back and there is no undo.",
210
+ "effects": {
211
+ "decides": [
212
+ {
213
+ "signature": "decides.tenant_port",
214
+ "source": "port"
215
+ }
216
+ ],
217
+ "moves": [
218
+ {
219
+ "signature": "moves.transfer.internal",
220
+ "source": "moves[0]"
221
+ }
222
+ ]
223
+ },
224
+ "moves": [
225
+ {
226
+ "bind": {
227
+ "amount": {
228
+ "from": "instance",
229
+ "path": "refs.capturedAmount"
230
+ },
231
+ "currency": {
232
+ "from": "instance",
233
+ "path": "fields.currency"
234
+ },
235
+ "destinationAccountId": {
236
+ "from": "instance",
237
+ "path": "fields.payerAccountId"
238
+ },
239
+ "metadata.clawbackOfTransferId": {
240
+ "from": "instance",
241
+ "path": "refs.authorizeReservationTransferId"
242
+ },
243
+ "metadata.instrumentId": {
244
+ "from": "const",
245
+ "value": "card_payment"
246
+ },
247
+ "metadata.instrumentInstanceId": {
248
+ "from": "instance",
249
+ "path": "instrumentInstanceId"
250
+ },
251
+ "metadata.phase": {
252
+ "from": "const",
253
+ "value": "correct_capture"
254
+ },
255
+ "productId": {
256
+ "from": "instance",
257
+ "path": "productId"
258
+ },
259
+ "sourceAccountId": {
260
+ "from": "instance",
261
+ "path": "fields.payeeAccountId"
262
+ }
263
+ },
264
+ "capture": {
265
+ "correctCaptureTransferTransferId": "transferId"
266
+ },
267
+ "key": "transfer",
268
+ "operation": "internal_transfer.create"
269
+ }
270
+ ],
271
+ "port": {
272
+ "allowedParties": [
273
+ "beneficiary"
274
+ ]
275
+ },
276
+ "publicAction": "correctCaptureCardPayment",
277
+ "steps": [],
278
+ "summary": "Return the full captured amount on payee correction"
279
+ },
280
+ "create": {
281
+ "agentDescription": "Open the payment row before anything is reserved. The caller supplies the authorizedAmount, the currency, and both party accounts. This reserves nothing, call authorize next.",
282
+ "moves": [],
283
+ "publicAction": "createCardPayment",
284
+ "steps": [],
285
+ "summary": "Create a card payment"
286
+ },
287
+ "expire": {
288
+ "due": {
289
+ "field": "reserveUntil"
290
+ },
291
+ "effects": {
292
+ "moves": [
293
+ {
294
+ "signature": "moves.transfer.internal",
295
+ "source": "moves[0]"
296
+ }
297
+ ],
298
+ "schedules": [
299
+ {
300
+ "signature": "schedules.due",
301
+ "source": "due"
302
+ }
303
+ ]
304
+ },
305
+ "moves": [
306
+ {
307
+ "bind": {
308
+ "reason": {
309
+ "from": "const",
310
+ "value": "Uncaptured reservation expired"
311
+ },
312
+ "transferId": {
313
+ "from": "instance",
314
+ "path": "refs.authorizeReservationTransferId"
315
+ }
316
+ },
317
+ "key": "void",
318
+ "operation": "internal_transfer.void"
319
+ }
320
+ ],
321
+ "steps": [],
322
+ "summary": "Release an uncaptured reservation at expiry"
323
+ },
324
+ "reverse_capture": {
325
+ "agentDescription": "Return the whole captured amount to the payer on an external reversal. The payment must be settled and the call must land before reversalUntil. The caller passes externalReference, which stays in the receipt. There is no undo.",
326
+ "captureInput": {
327
+ "externalReference": "externalReference"
328
+ },
329
+ "deadline": {
330
+ "field": "reversalUntil"
331
+ },
332
+ "effects": {
333
+ "decides": [
334
+ {
335
+ "signature": "decides.tenant_port",
336
+ "source": "port"
337
+ }
338
+ ],
339
+ "moves": [
340
+ {
341
+ "signature": "moves.transfer.internal",
342
+ "source": "moves[0]"
343
+ }
344
+ ],
345
+ "schedules": [
346
+ {
347
+ "signature": "schedules.deadline",
348
+ "source": "deadline"
349
+ }
350
+ ]
351
+ },
352
+ "input": {
353
+ "additionalProperties": false,
354
+ "properties": {
355
+ "externalReference": {
356
+ "description": "Required decision reference retained in the operation receipt",
357
+ "maxLength": 180,
358
+ "minLength": 1,
359
+ "type": "string"
360
+ }
361
+ },
362
+ "required": [
363
+ "externalReference"
364
+ ],
365
+ "type": "object"
366
+ },
367
+ "moves": [
368
+ {
369
+ "bind": {
370
+ "amount": {
371
+ "from": "instance",
372
+ "path": "refs.capturedAmount"
373
+ },
374
+ "currency": {
375
+ "from": "instance",
376
+ "path": "fields.currency"
377
+ },
378
+ "destinationAccountId": {
379
+ "from": "instance",
380
+ "path": "fields.payerAccountId"
381
+ },
382
+ "metadata.clawbackOfTransferId": {
383
+ "from": "instance",
384
+ "path": "refs.authorizeReservationTransferId"
385
+ },
386
+ "metadata.instrumentId": {
387
+ "from": "const",
388
+ "value": "card_payment"
389
+ },
390
+ "metadata.instrumentInstanceId": {
391
+ "from": "instance",
392
+ "path": "instrumentInstanceId"
393
+ },
394
+ "metadata.phase": {
395
+ "from": "const",
396
+ "value": "reverse_capture"
397
+ },
398
+ "productId": {
399
+ "from": "instance",
400
+ "path": "productId"
401
+ },
402
+ "sourceAccountId": {
403
+ "from": "instance",
404
+ "path": "fields.payeeAccountId"
405
+ }
406
+ },
407
+ "capture": {
408
+ "reverseCaptureTransferTransferId": "transferId"
409
+ },
410
+ "key": "transfer",
411
+ "operation": "internal_transfer.create"
412
+ }
413
+ ],
414
+ "port": {
415
+ "allowedParties": [
416
+ "beneficiary"
417
+ ]
418
+ },
419
+ "publicAction": "reverseCaptureCardPayment",
420
+ "steps": [],
421
+ "summary": "Return the full captured amount on an external reversal"
422
+ },
423
+ "settle": {
424
+ "agentDescription": "Post the whole reserved remainder and finish the payment. The payment must be authorized or partly captured. The money settles and the external reversal window opens on reversalUntil.",
425
+ "deadline": {
426
+ "field": "reserveUntil"
427
+ },
428
+ "effects": {
429
+ "moves": [
430
+ {
431
+ "signature": "moves.transfer.internal",
432
+ "source": "moves[0]"
433
+ }
434
+ ],
435
+ "schedules": [
436
+ {
437
+ "signature": "schedules.deadline",
438
+ "source": "deadline"
439
+ }
440
+ ]
441
+ },
442
+ "moves": [
443
+ {
444
+ "bind": {
445
+ "transferId": {
446
+ "from": "instance",
447
+ "path": "refs.authorizeReservationTransferId"
448
+ }
449
+ },
450
+ "capture": {
451
+ "capturedAmount": "postedAmount"
452
+ },
453
+ "key": "post",
454
+ "operation": "internal_transfer.post"
455
+ }
456
+ ],
457
+ "publicAction": "settleCardPayment",
458
+ "setsAt": {
459
+ "field": "reversalUntil",
460
+ "offset": "P14D"
461
+ },
462
+ "steps": [],
463
+ "summary": "Post the full reserved remainder and settle"
464
+ },
465
+ "settle_on_expiry": {
466
+ "due": {
467
+ "field": "reserveUntil"
468
+ },
469
+ "effects": {
470
+ "moves": [
471
+ {
472
+ "signature": "moves.transfer.internal",
473
+ "source": "moves[0]"
474
+ }
475
+ ],
476
+ "schedules": [
477
+ {
478
+ "signature": "schedules.due",
479
+ "source": "due"
480
+ }
481
+ ]
482
+ },
483
+ "moves": [
484
+ {
485
+ "bind": {
486
+ "reason": {
487
+ "from": "const",
488
+ "value": "Uncaptured remainder released at expiry"
489
+ },
490
+ "transferId": {
491
+ "from": "instance",
492
+ "path": "refs.authorizeReservationTransferId"
493
+ }
494
+ },
495
+ "key": "void",
496
+ "operation": "internal_transfer.void"
497
+ }
498
+ ],
499
+ "setsAt": {
500
+ "field": "reversalUntil",
501
+ "offset": "P14D"
502
+ },
503
+ "steps": [],
504
+ "summary": "Release the uncaptured remainder and settle captured slices"
505
+ },
506
+ "void": {
507
+ "agentDescription": "Release the reservation whole and cancel the payment. Only an authorized reservation with nothing captured can void. Once any slice is captured, settle it or let it expire instead.",
508
+ "effects": {
509
+ "moves": [
510
+ {
511
+ "signature": "moves.transfer.internal",
512
+ "source": "moves[0]"
513
+ }
514
+ ]
515
+ },
516
+ "moves": [
517
+ {
518
+ "bind": {
519
+ "reason": {
520
+ "from": "const",
521
+ "value": "Reservation voided before any capture"
522
+ },
523
+ "transferId": {
524
+ "from": "instance",
525
+ "path": "refs.authorizeReservationTransferId"
526
+ }
527
+ },
528
+ "key": "void",
529
+ "operation": "internal_transfer.void"
530
+ }
531
+ ],
532
+ "publicAction": "voidCardPayment",
533
+ "steps": [],
534
+ "summary": "Release an entirely uncaptured reservation"
535
+ }
536
+ },
537
+ "agentDescription": "Reach for captured payment when the payee reserves against the payer first and then takes the money in slices before reserveUntil. Pick instant transfer when the whole amount moves at once, and deposit when the reservation is claimed or returned whole.",
538
+ "description": "Payer reservation captured by the payee in slices within a fixed window",
539
+ "fields": {
540
+ "authorizedAmount": {
541
+ "description": "Maximum captured amount in SAR minor units",
542
+ "pattern": "^[1-9][0-9]{0,17}$",
543
+ "type": "string"
544
+ },
545
+ "currency": {
546
+ "description": "ISO 4217 currency code",
547
+ "maxLength": 3,
548
+ "minLength": 3,
549
+ "pattern": "^[A-Z]{3}$",
550
+ "type": "string"
551
+ },
552
+ "payeeAccountId": {
553
+ "description": "The payee account",
554
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
555
+ "type": "string",
556
+ "x-hyperscale-reference-filter": {
557
+ "column": "role",
558
+ "values": [
559
+ "customer_balance"
560
+ ]
561
+ }
562
+ },
563
+ "payerAccountId": {
564
+ "description": "The payer account",
565
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
566
+ "type": "string",
567
+ "x-hyperscale-reference-filter": {
568
+ "column": "role",
569
+ "values": [
570
+ "customer_balance"
571
+ ]
572
+ }
573
+ },
574
+ "reserveUntil": {
575
+ "description": "Reservation expiry that releases any uncaptured remainder",
576
+ "format": "hyperscale-date-time",
577
+ "type": "string"
578
+ },
579
+ "reversalUntil": {
580
+ "description": "Machine-owned external reversal cutoff anchored when settlement completes",
581
+ "format": "hyperscale-date-time",
582
+ "type": "string"
583
+ }
584
+ },
585
+ "id": "card_payment",
586
+ "idPrefix": "cp",
587
+ "lifecycle": {
588
+ "initial": "created",
589
+ "states": [
590
+ "created",
591
+ "authorized",
592
+ "partially_captured",
593
+ "settled",
594
+ "voided",
595
+ "expired",
596
+ "corrected",
597
+ "reversed"
598
+ ],
599
+ "transitions": {
600
+ "authorize": {
601
+ "from": [
602
+ "created"
603
+ ],
604
+ "to": "authorized"
605
+ },
606
+ "capture": {
607
+ "from": [
608
+ "authorized"
609
+ ],
610
+ "to": "partially_captured"
611
+ },
612
+ "capture_more": {
613
+ "from": [
614
+ "partially_captured"
615
+ ],
616
+ "to": "partially_captured"
617
+ },
618
+ "correct_capture": {
619
+ "from": [
620
+ "settled"
621
+ ],
622
+ "to": "corrected"
623
+ },
624
+ "expire": {
625
+ "from": [
626
+ "authorized"
627
+ ],
628
+ "to": "expired"
629
+ },
630
+ "reverse_capture": {
631
+ "from": [
632
+ "settled"
633
+ ],
634
+ "to": "reversed"
635
+ },
636
+ "settle": {
637
+ "from": [
638
+ "authorized",
639
+ "partially_captured"
640
+ ],
641
+ "to": "settled"
642
+ },
643
+ "settle_on_expiry": {
644
+ "from": [
645
+ "partially_captured"
646
+ ],
647
+ "to": "settled"
648
+ },
649
+ "void": {
650
+ "from": [
651
+ "authorized"
652
+ ],
653
+ "to": "voided"
654
+ }
655
+ }
656
+ },
657
+ "parties": {
658
+ "beneficiary": "payeeAccountId",
659
+ "payer": "payerAccountId"
660
+ },
661
+ "required": [
662
+ "payerAccountId",
663
+ "payeeAccountId",
664
+ "authorizedAmount",
665
+ "reserveUntil",
666
+ "currency"
667
+ ],
668
+ "summary": "Capture reservation from payer to payee",
669
+ "title": "Card payment"
670
+ }
671
+ ],
672
+ "product": "captured_payment_example",
673
+ "subjects": [],
674
+ "title": "Captured payment example",
675
+ "udl": 1,
676
+ "version": 1
677
+ }
@@ -0,0 +1,3 @@
1
+ # conditional_disbursement
2
+
3
+ This example applies the `conditional_disbursement` standard-library module. Its sibling UDL file pins the canonical compiler output byte for byte. The company and parties are invented.
@@ -0,0 +1,17 @@
1
+ program conditional_disbursement_example "Conditional disbursement example"
2
+ import { conditional_disbursement } from "std/settlements"
3
+ party source: business
4
+ party claimant: person
5
+ settlement claim_payment = conditional_disbursement {
6
+ source: source
7
+ destination: claimant
8
+ cap: policyLimit: money(SAR)
9
+ amount: approvedAmount: money(SAR)
10
+ decision: port approve_claim
11
+ reopen_policy: refuse
12
+ recovery_policy: separate_transfer
13
+ }
14
+ port approve_claim {
15
+ allowed: [source]
16
+ shape: { evidenceReference: text }
17
+ }