@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,425 @@
1
+ {
2
+ "instruments": [
3
+ {
4
+ "actionOrder": [
5
+ "create",
6
+ "fund_share_1",
7
+ "distribute_share_1",
8
+ "fund_share_2",
9
+ "distribute_share_2"
10
+ ],
11
+ "actions": {
12
+ "create": {
13
+ "agentDescription": "Open a pool period and provision the escrow account the pool sits in. This is the first call on the period, and funding a share refuses until it lands. It moves no money.",
14
+ "moves": [],
15
+ "publicAction": "createPool",
16
+ "steps": [
17
+ {
18
+ "bind": {
19
+ "currency": {
20
+ "from": "instance",
21
+ "path": "fields.currency"
22
+ },
23
+ "owner.id": {
24
+ "from": "instance",
25
+ "path": "productId"
26
+ },
27
+ "owner.type": {
28
+ "from": "const",
29
+ "value": "product"
30
+ },
31
+ "productId": {
32
+ "from": "instance",
33
+ "path": "productId"
34
+ },
35
+ "role": {
36
+ "from": "const",
37
+ "value": "product_escrow"
38
+ }
39
+ },
40
+ "capture": {
41
+ "escrowAccountId": "accountId"
42
+ },
43
+ "operation": "account.escrow.provision"
44
+ }
45
+ ],
46
+ "summary": "Open a pool period"
47
+ },
48
+ "distribute_share_1": {
49
+ "due": {
50
+ "field": "payoutDueAt"
51
+ },
52
+ "effects": {
53
+ "moves": [
54
+ {
55
+ "signature": "moves.transfer.internal",
56
+ "source": "moves[0]"
57
+ }
58
+ ],
59
+ "schedules": [
60
+ {
61
+ "signature": "schedules.due",
62
+ "source": "due"
63
+ }
64
+ ]
65
+ },
66
+ "moves": [
67
+ {
68
+ "bind": {
69
+ "amount": {
70
+ "from": "instance",
71
+ "path": "fields.firstRecipientShareAmount"
72
+ },
73
+ "currency": {
74
+ "from": "instance",
75
+ "path": "fields.currency"
76
+ },
77
+ "destinationAccountId": {
78
+ "from": "instance",
79
+ "path": "fields.firstRecipientAccountId"
80
+ },
81
+ "metadata.instrumentId": {
82
+ "from": "const",
83
+ "value": "pool"
84
+ },
85
+ "metadata.instrumentInstanceId": {
86
+ "from": "instance",
87
+ "path": "instrumentInstanceId"
88
+ },
89
+ "metadata.phase": {
90
+ "from": "const",
91
+ "value": "distribute_share_1"
92
+ },
93
+ "productId": {
94
+ "from": "instance",
95
+ "path": "productId"
96
+ },
97
+ "sourceAccountId": {
98
+ "from": "instance",
99
+ "path": "refs.escrowAccountId"
100
+ }
101
+ },
102
+ "capture": {
103
+ "distributeShare1TransferTransferId": "transferId"
104
+ },
105
+ "key": "transfer",
106
+ "operation": "internal_transfer.create"
107
+ }
108
+ ],
109
+ "steps": [],
110
+ "summary": "Distribute the first recipient's share of the pool"
111
+ },
112
+ "distribute_share_2": {
113
+ "due": {
114
+ "field": "payoutDueAt"
115
+ },
116
+ "effects": {
117
+ "moves": [
118
+ {
119
+ "signature": "moves.transfer.internal",
120
+ "source": "moves[0]"
121
+ }
122
+ ],
123
+ "schedules": [
124
+ {
125
+ "signature": "schedules.due",
126
+ "source": "due"
127
+ }
128
+ ]
129
+ },
130
+ "moves": [
131
+ {
132
+ "bind": {
133
+ "amount": {
134
+ "from": "instance",
135
+ "path": "fields.secondRecipientShareAmount"
136
+ },
137
+ "currency": {
138
+ "from": "instance",
139
+ "path": "fields.currency"
140
+ },
141
+ "destinationAccountId": {
142
+ "from": "instance",
143
+ "path": "fields.secondRecipientAccountId"
144
+ },
145
+ "metadata.instrumentId": {
146
+ "from": "const",
147
+ "value": "pool"
148
+ },
149
+ "metadata.instrumentInstanceId": {
150
+ "from": "instance",
151
+ "path": "instrumentInstanceId"
152
+ },
153
+ "metadata.phase": {
154
+ "from": "const",
155
+ "value": "distribute_share_2"
156
+ },
157
+ "productId": {
158
+ "from": "instance",
159
+ "path": "productId"
160
+ },
161
+ "sourceAccountId": {
162
+ "from": "instance",
163
+ "path": "refs.escrowAccountId"
164
+ }
165
+ },
166
+ "capture": {
167
+ "distributeShare2TransferTransferId": "transferId"
168
+ },
169
+ "key": "transfer",
170
+ "operation": "internal_transfer.create"
171
+ }
172
+ ],
173
+ "steps": [],
174
+ "summary": "Distribute the second recipient's share of the pool"
175
+ },
176
+ "fund_share_1": {
177
+ "agentDescription": "Move share 1 of the period total, the first recipient's cut, from the payer into the pool escrow. Shares fund in order, so every earlier share must be in already. It debits the payer for real. The pool pays out from the stored payout date with no release call.",
178
+ "effects": {
179
+ "moves": [
180
+ {
181
+ "signature": "moves.collection.pay_in",
182
+ "source": "moves[0]"
183
+ }
184
+ ]
185
+ },
186
+ "moves": [
187
+ {
188
+ "bind": {
189
+ "amount": {
190
+ "from": "instance",
191
+ "path": "fields.firstRecipientShareAmount"
192
+ },
193
+ "currency": {
194
+ "from": "instance",
195
+ "path": "fields.currency"
196
+ },
197
+ "destinationAccountId": {
198
+ "from": "instance",
199
+ "path": "refs.escrowAccountId"
200
+ },
201
+ "metadata.instrumentId": {
202
+ "from": "const",
203
+ "value": "pool"
204
+ },
205
+ "metadata.instrumentInstanceId": {
206
+ "from": "instance",
207
+ "path": "instrumentInstanceId"
208
+ },
209
+ "metadata.phase": {
210
+ "from": "const",
211
+ "value": "fund_share_1"
212
+ },
213
+ "productId": {
214
+ "from": "instance",
215
+ "path": "productId"
216
+ },
217
+ "sourceAccountId": {
218
+ "from": "instance",
219
+ "path": "fields.payerAccountId"
220
+ }
221
+ },
222
+ "capture": {
223
+ "fundShare1TransferTransferId": "transferId"
224
+ },
225
+ "key": "transfer",
226
+ "operation": "internal_transfer.create"
227
+ }
228
+ ],
229
+ "publicAction": "fundShare1Pool",
230
+ "steps": [],
231
+ "summary": "Pool share 1 of the period total"
232
+ },
233
+ "fund_share_2": {
234
+ "agentDescription": "Move share 2 of the period total, the second recipient's cut, from the payer into the pool escrow. Shares fund in order, so every earlier share must be in already. It debits the payer for real. The pool pays out from the stored payout date with no release call.",
235
+ "effects": {
236
+ "moves": [
237
+ {
238
+ "signature": "moves.collection.pay_in",
239
+ "source": "moves[0]"
240
+ }
241
+ ]
242
+ },
243
+ "moves": [
244
+ {
245
+ "bind": {
246
+ "amount": {
247
+ "from": "instance",
248
+ "path": "fields.secondRecipientShareAmount"
249
+ },
250
+ "currency": {
251
+ "from": "instance",
252
+ "path": "fields.currency"
253
+ },
254
+ "destinationAccountId": {
255
+ "from": "instance",
256
+ "path": "refs.escrowAccountId"
257
+ },
258
+ "metadata.instrumentId": {
259
+ "from": "const",
260
+ "value": "pool"
261
+ },
262
+ "metadata.instrumentInstanceId": {
263
+ "from": "instance",
264
+ "path": "instrumentInstanceId"
265
+ },
266
+ "metadata.phase": {
267
+ "from": "const",
268
+ "value": "fund_share_2"
269
+ },
270
+ "productId": {
271
+ "from": "instance",
272
+ "path": "productId"
273
+ },
274
+ "sourceAccountId": {
275
+ "from": "instance",
276
+ "path": "fields.payerAccountId"
277
+ }
278
+ },
279
+ "capture": {
280
+ "fundShare2TransferTransferId": "transferId"
281
+ },
282
+ "key": "transfer",
283
+ "operation": "internal_transfer.create"
284
+ }
285
+ ],
286
+ "publicAction": "fundShare2Pool",
287
+ "steps": [],
288
+ "summary": "Pool share 2 of the period total"
289
+ }
290
+ },
291
+ "agentDescription": "Reach for pool when the payer funds one period total that is then split across 2 fixed recipients by stored share amounts. Callers fund the pool one share at a time. Each recipient's payout fires from the stored payout date, not from a call.",
292
+ "description": "Pooled split: the payer pools the period's poolAmount share by share; the pool distributes to every recipient in full on the stored payout date",
293
+ "fields": {
294
+ "currency": {
295
+ "description": "ISO 4217 currency code",
296
+ "maxLength": 3,
297
+ "minLength": 3,
298
+ "pattern": "^[A-Z]{3}$",
299
+ "type": "string"
300
+ },
301
+ "firstRecipientAccountId": {
302
+ "description": "The first recipient account",
303
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
304
+ "type": "string",
305
+ "x-hyperscale-reference-filter": {
306
+ "column": "role",
307
+ "values": [
308
+ "customer_balance"
309
+ ]
310
+ }
311
+ },
312
+ "firstRecipientShareAmount": {
313
+ "description": "60% of poolAmount (carries the integer-division remainder): the first recipient's share. Computed as floor(poolAmount * 6000 / 10000) in SAR minor units",
314
+ "pattern": "^[1-9][0-9]{0,17}$",
315
+ "type": "string"
316
+ },
317
+ "payerAccountId": {
318
+ "description": "The payer account",
319
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
320
+ "type": "string",
321
+ "x-hyperscale-reference-filter": {
322
+ "column": "role",
323
+ "values": [
324
+ "customer_balance"
325
+ ]
326
+ }
327
+ },
328
+ "payoutDueAt": {
329
+ "description": "The period's payout date; the pool distributes from it",
330
+ "format": "hyperscale-date-time",
331
+ "type": "string"
332
+ },
333
+ "poolAmount": {
334
+ "description": "The pooled period total in SAR minor units; the share fields below partition it exactly",
335
+ "pattern": "^[1-9][0-9]{0,17}$",
336
+ "type": "string"
337
+ },
338
+ "secondRecipientAccountId": {
339
+ "description": "The second recipient account",
340
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
341
+ "type": "string",
342
+ "x-hyperscale-reference-filter": {
343
+ "column": "role",
344
+ "values": [
345
+ "customer_balance"
346
+ ]
347
+ }
348
+ },
349
+ "secondRecipientShareAmount": {
350
+ "description": "40% of poolAmount: the second recipient's share. Computed as floor(poolAmount * 4000 / 10000) in SAR minor units",
351
+ "pattern": "^[1-9][0-9]{0,17}$",
352
+ "type": "string"
353
+ }
354
+ },
355
+ "id": "pool",
356
+ "idPrefix": "pool",
357
+ "lifecycle": {
358
+ "initial": "created",
359
+ "states": [
360
+ "created",
361
+ "pooling_1",
362
+ "pooled",
363
+ "distributing_1",
364
+ "distributed"
365
+ ],
366
+ "transitions": {
367
+ "distribute_share_1": {
368
+ "from": [
369
+ "pooled"
370
+ ],
371
+ "to": "distributing_1"
372
+ },
373
+ "distribute_share_2": {
374
+ "from": [
375
+ "distributing_1"
376
+ ],
377
+ "to": "distributed"
378
+ },
379
+ "fund_share_1": {
380
+ "from": [
381
+ "created"
382
+ ],
383
+ "to": "pooling_1"
384
+ },
385
+ "fund_share_2": {
386
+ "from": [
387
+ "pooling_1"
388
+ ],
389
+ "to": "pooled"
390
+ }
391
+ }
392
+ },
393
+ "parties": {
394
+ "beneficiary": "firstRecipientAccountId",
395
+ "payer": "payerAccountId"
396
+ },
397
+ "partitions": [
398
+ {
399
+ "pieceFields": [
400
+ "firstRecipientShareAmount",
401
+ "secondRecipientShareAmount"
402
+ ],
403
+ "totalField": "poolAmount"
404
+ }
405
+ ],
406
+ "required": [
407
+ "payerAccountId",
408
+ "firstRecipientAccountId",
409
+ "secondRecipientAccountId",
410
+ "poolAmount",
411
+ "payoutDueAt",
412
+ "firstRecipientShareAmount",
413
+ "secondRecipientShareAmount",
414
+ "currency"
415
+ ],
416
+ "summary": "Period pool from payer split 2 ways",
417
+ "title": "Pool"
418
+ }
419
+ ],
420
+ "product": "pooled_split_example",
421
+ "subjects": [],
422
+ "title": "Pooled split example",
423
+ "udl": 1,
424
+ "version": 1
425
+ }
@@ -0,0 +1,3 @@
1
+ # premium_forward
2
+
3
+ This example applies the `premium_forward` standard-library module. Its sibling UDL file pins the canonical compiler output byte for byte. The company and parties are invented.
@@ -0,0 +1,19 @@
1
+ program premium_forward_example "Premium forward example"
2
+ import { premium_forward } from "std/settlements"
3
+ party policyholder: person
4
+ party carrier: business
5
+ settlement premium = premium_forward {
6
+ payer: policyholder
7
+ carrier: carrier
8
+ amount: premiumAmount: money(SAR)
9
+ commission: 2%
10
+ bind: port bind_policy
11
+ policy_ref: policyReference
12
+ renewal_due: renewalDueAt
13
+ endorsement: port record_endorsement
14
+ }
15
+ port bind_policy { allowed: [policyholder, carrier] }
16
+ port record_endorsement {
17
+ allowed: [carrier]
18
+ shape: { evidenceReference: text }
19
+ }