@hyperscale0/hsx 1.0.0-alpha.6 → 1.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/CHANGELOG.md +48 -10
  2. package/LICENSING.md +3 -3
  3. package/README.md +37 -149
  4. package/TRADEMARKS.md +4 -4
  5. package/dist/src/ast.d.ts +129 -10
  6. package/dist/src/ast.d.ts.map +1 -1
  7. package/dist/src/cli.d.ts +2 -1
  8. package/dist/src/cli.d.ts.map +1 -1
  9. package/dist/src/cli.js +148 -12
  10. package/dist/src/cli.js.map +1 -1
  11. package/dist/src/compile.d.ts +41 -4
  12. package/dist/src/compile.d.ts.map +1 -1
  13. package/dist/src/compile.js +82 -15
  14. package/dist/src/compile.js.map +1 -1
  15. package/dist/src/cost.d.ts +78 -0
  16. package/dist/src/cost.d.ts.map +1 -0
  17. package/dist/src/cost.js +369 -0
  18. package/dist/src/cost.js.map +1 -0
  19. package/dist/src/diagnostics.d.ts +11 -0
  20. package/dist/src/diagnostics.d.ts.map +1 -0
  21. package/dist/src/diagnostics.js +420 -0
  22. package/dist/src/diagnostics.js.map +1 -0
  23. package/dist/src/emit.d.ts +35 -0
  24. package/dist/src/emit.d.ts.map +1 -0
  25. package/dist/src/emit.js +359 -0
  26. package/dist/src/emit.js.map +1 -0
  27. package/dist/src/entry-overrides.d.ts +17 -3
  28. package/dist/src/entry-overrides.d.ts.map +1 -1
  29. package/dist/src/entry-overrides.js +180 -35
  30. package/dist/src/entry-overrides.js.map +1 -1
  31. package/dist/src/format.d.ts +10 -0
  32. package/dist/src/format.d.ts.map +1 -0
  33. package/dist/src/format.js +183 -0
  34. package/dist/src/format.js.map +1 -0
  35. package/dist/src/index.d.ts +10 -4
  36. package/dist/src/index.d.ts.map +1 -1
  37. package/dist/src/index.js +8 -3
  38. package/dist/src/index.js.map +1 -1
  39. package/dist/src/ir.d.ts +66 -0
  40. package/dist/src/ir.d.ts.map +1 -0
  41. package/dist/src/ir.js +15 -0
  42. package/dist/src/ir.js.map +1 -0
  43. package/dist/src/lex.d.ts +9 -1
  44. package/dist/src/lex.d.ts.map +1 -1
  45. package/dist/src/lex.js +50 -4
  46. package/dist/src/lex.js.map +1 -1
  47. package/dist/src/limits.d.ts +2 -3
  48. package/dist/src/limits.d.ts.map +1 -1
  49. package/dist/src/limits.js +2 -3
  50. package/dist/src/limits.js.map +1 -1
  51. package/dist/src/modules.d.ts +36 -0
  52. package/dist/src/modules.d.ts.map +1 -0
  53. package/dist/src/modules.js +372 -0
  54. package/dist/src/modules.js.map +1 -0
  55. package/dist/src/parse.d.ts.map +1 -1
  56. package/dist/src/parse.js +590 -17
  57. package/dist/src/parse.js.map +1 -1
  58. package/dist/src/typecheck.d.ts +8 -0
  59. package/dist/src/typecheck.d.ts.map +1 -0
  60. package/dist/src/typecheck.js +2958 -0
  61. package/dist/src/typecheck.js.map +1 -0
  62. package/dist/src/version.d.ts +4 -15
  63. package/dist/src/version.d.ts.map +1 -1
  64. package/dist/src/version.js +4 -15
  65. package/dist/src/version.js.map +1 -1
  66. package/docs/README.md +23 -0
  67. package/docs/guide/01-first-program.md +24 -0
  68. package/docs/guide/02-money.md +25 -0
  69. package/docs/guide/03-instruments.md +22 -0
  70. package/docs/guide/04-lifecycles.md +25 -0
  71. package/docs/guide/05-fees-and-splits.md +45 -0
  72. package/docs/guide/06-schedules.md +22 -0
  73. package/docs/guide/07-composition.md +46 -0
  74. package/docs/guide/08-writing-a-module.md +26 -0
  75. package/docs/guide/09-cost.md +24 -0
  76. package/docs/guide/10-diagnostics.md +27 -0
  77. package/docs/llms-full.txt +1738 -0
  78. package/docs/llms.txt +45 -0
  79. package/docs/reference/cli.md +33 -0
  80. package/docs/reference/diagnostics.md +619 -0
  81. package/docs/reference/grammar.md +39 -0
  82. package/docs/reference/std/advance.md +35 -0
  83. package/docs/reference/std/cancellable_booking.md +35 -0
  84. package/docs/reference/std/captured_payment.md +43 -0
  85. package/docs/reference/std/conditional_disbursement.md +33 -0
  86. package/docs/reference/std/credit_facility.md +35 -0
  87. package/docs/reference/std/held_payment.md +64 -0
  88. package/docs/reference/std/instant_transfer.md +30 -0
  89. package/docs/reference/std/metered.md +27 -0
  90. package/docs/reference/std/pooled_split.md +26 -0
  91. package/docs/reference/std/premium_forward.md +39 -0
  92. package/docs/reference/std/reconciled_payout.md +33 -0
  93. package/docs/reference/std/recurring_collection.md +25 -0
  94. package/docs/reference/std/rotating_pool.md +42 -0
  95. package/docs/reference/std/scheduled.md +51 -0
  96. package/docs/reference/std/security_deposit.md +46 -0
  97. package/docs/reference/std/settlement_batch.md +42 -0
  98. package/docs/reference/std/swap.md +46 -0
  99. package/docs/reference/std/threshold_pool.md +47 -0
  100. package/docs/reference/std/weighted_distribution.md +39 -0
  101. package/docs/reference/types.md +20 -0
  102. package/docs/reference/udl-output.md +14 -0
  103. package/docs/sessions/2026-09-02-two-instruments.hsx +21 -0
  104. package/docs/sessions/2026-09-02-two-instruments.md +41 -0
  105. package/examples/01-first-program/README.md +45 -0
  106. package/examples/01-first-program/tip-jar.hsx +17 -0
  107. package/examples/02-imports-and-archetypes/README.md +99 -0
  108. package/examples/02-imports-and-archetypes/photo-booth.hsx +37 -0
  109. package/examples/03-diagnostics/README.md +68 -0
  110. package/examples/03-diagnostics/corner-shop-fixed.hsx +22 -0
  111. package/examples/03-diagnostics/corner-shop.hsx +19 -0
  112. package/examples/04-complete-product/README.md +87 -0
  113. package/examples/04-complete-product/study-hall.hsx +67 -0
  114. package/examples/05-watch-club/README.md +9 -0
  115. package/examples/05-watch-club/watch-club.hsx +124 -0
  116. package/examples/README.md +18 -0
  117. package/examples/advance/README.md +3 -0
  118. package/examples/advance/advance.hsx +13 -0
  119. package/examples/advance/advance.udl +339 -0
  120. package/examples/cancellable_booking/README.md +3 -0
  121. package/examples/cancellable_booking/cancellable_booking.hsx +14 -0
  122. package/examples/cancellable_booking/cancellable_booking.udl +391 -0
  123. package/examples/captured_payment/README.md +3 -0
  124. package/examples/captured_payment/captured_payment.hsx +21 -0
  125. package/examples/captured_payment/captured_payment.udl +677 -0
  126. package/examples/conditional_disbursement/README.md +3 -0
  127. package/examples/conditional_disbursement/conditional_disbursement.hsx +17 -0
  128. package/examples/conditional_disbursement/conditional_disbursement.udl +412 -0
  129. package/examples/cost-table.json +386 -0
  130. package/examples/credit_facility/README.md +3 -0
  131. package/examples/credit_facility/credit_facility.hsx +27 -0
  132. package/examples/credit_facility/credit_facility.udl +1373 -0
  133. package/examples/held_payment/README.md +3 -0
  134. package/examples/held_payment/held_payment.hsx +13 -0
  135. package/examples/held_payment/held_payment.udl +507 -0
  136. package/examples/instant_transfer/README.md +3 -0
  137. package/examples/instant_transfer/instant_transfer.hsx +16 -0
  138. package/examples/instant_transfer/instant_transfer.udl +364 -0
  139. package/examples/metered/README.md +3 -0
  140. package/examples/metered/metered.hsx +13 -0
  141. package/examples/metered/metered.udl +247 -0
  142. package/examples/pooled_split/README.md +3 -0
  143. package/examples/pooled_split/pooled_split.hsx +15 -0
  144. package/examples/pooled_split/pooled_split.udl +425 -0
  145. package/examples/premium_forward/README.md +3 -0
  146. package/examples/premium_forward/premium_forward.hsx +19 -0
  147. package/examples/premium_forward/premium_forward.udl +594 -0
  148. package/examples/reconciled_payout/README.md +3 -0
  149. package/examples/reconciled_payout/reconciled_payout.hsx +13 -0
  150. package/examples/reconciled_payout/reconciled_payout.udl +303 -0
  151. package/examples/recurring_collection/README.md +3 -0
  152. package/examples/recurring_collection/recurring_collection.hsx +21 -0
  153. package/examples/recurring_collection/recurring_collection.udl +1130 -0
  154. package/examples/rotating_pool/README.md +3 -0
  155. package/examples/rotating_pool/rotating_pool.hsx +18 -0
  156. package/examples/rotating_pool/rotating_pool.udl +4352 -0
  157. package/examples/scheduled/README.md +3 -0
  158. package/examples/scheduled/scheduled.hsx +12 -0
  159. package/examples/scheduled/scheduled.udl +335 -0
  160. package/examples/security_deposit/README.md +3 -0
  161. package/examples/security_deposit/security_deposit.hsx +21 -0
  162. package/examples/security_deposit/security_deposit.udl +293 -0
  163. package/examples/settlement_batch/README.md +3 -0
  164. package/examples/settlement_batch/settlement_batch.hsx +19 -0
  165. package/examples/settlement_batch/settlement_batch.udl +753 -0
  166. package/examples/swap/README.md +3 -0
  167. package/examples/swap/swap.hsx +19 -0
  168. package/examples/swap/swap.udl +876 -0
  169. package/examples/threshold_pool/README.md +3 -0
  170. package/examples/threshold_pool/threshold_pool.hsx +16 -0
  171. package/examples/threshold_pool/threshold_pool.udl +667 -0
  172. package/examples/weighted_distribution/README.md +3 -0
  173. package/examples/weighted_distribution/weighted_distribution.hsx +20 -0
  174. package/examples/weighted_distribution/weighted_distribution.udl +337 -0
  175. package/package.json +19 -6
  176. package/skills/hsx/SKILL.md +483 -0
  177. package/src/ast.ts +163 -9
  178. package/src/cli.ts +164 -12
  179. package/src/compile.ts +160 -20
  180. package/src/cost.ts +579 -0
  181. package/src/diagnostics.ts +442 -0
  182. package/src/emit.ts +447 -0
  183. package/src/entry-overrides.ts +263 -48
  184. package/src/format.ts +261 -0
  185. package/src/index.ts +32 -4
  186. package/src/ir.ts +99 -0
  187. package/src/lex.ts +59 -4
  188. package/src/limits.ts +2 -3
  189. package/src/modules.ts +444 -0
  190. package/src/parse.ts +655 -21
  191. package/src/typecheck.ts +3876 -0
  192. package/src/version.ts +4 -16
  193. package/std/SEMANTICS.md +130 -0
  194. package/std/settlements/advance.hsx +177 -0
  195. package/std/settlements/cancellable_booking.hsx +87 -0
  196. package/std/settlements/captured_payment.hsx +144 -0
  197. package/std/settlements/conditional_disbursement.hsx +185 -0
  198. package/std/settlements/credit_facility.hsx +167 -0
  199. package/std/settlements/held_payment.hsx +578 -0
  200. package/std/settlements/index.hsx +3 -0
  201. package/std/settlements/instant_transfer.hsx +190 -0
  202. package/std/settlements/metered.hsx +67 -0
  203. package/std/settlements/pooled_split.hsx +68 -0
  204. package/std/settlements/premium_forward.hsx +257 -0
  205. package/std/settlements/reconciled_payout.hsx +77 -0
  206. package/std/settlements/recurring_collection.hsx +27 -0
  207. package/std/settlements/rotating_pool.hsx +252 -0
  208. package/std/settlements/scheduled.hsx +641 -0
  209. package/std/settlements/security_deposit.hsx +166 -0
  210. package/std/settlements/settlement_batch.hsx +122 -0
  211. package/std/settlements/swap.hsx +1114 -0
  212. package/std/settlements/threshold_pool.hsx +221 -0
  213. package/std/settlements/weighted_distribution.hsx +141 -0
  214. package/dist/src/archetypes.d.ts +0 -17
  215. package/dist/src/archetypes.d.ts.map +0 -1
  216. package/dist/src/archetypes.js +0 -327
  217. package/dist/src/archetypes.js.map +0 -1
  218. package/dist/src/check.d.ts +0 -12
  219. package/dist/src/check.d.ts.map +0 -1
  220. package/dist/src/check.js +0 -1910
  221. package/dist/src/check.js.map +0 -1
  222. package/dist/src/lower.d.ts +0 -146
  223. package/dist/src/lower.d.ts.map +0 -1
  224. package/dist/src/lower.js +0 -4570
  225. package/dist/src/lower.js.map +0 -1
  226. package/dist/src/model.d.ts +0 -467
  227. package/dist/src/model.d.ts.map +0 -1
  228. package/dist/src/model.js +0 -15
  229. package/dist/src/model.js.map +0 -1
  230. package/spec/hsx-ir.schema.json +0 -920
  231. package/src/archetypes.ts +0 -340
  232. package/src/check.ts +0 -2938
  233. package/src/lower.ts +0 -5416
  234. package/src/model.ts +0 -519
@@ -0,0 +1,4352 @@
1
+ {
2
+ "instruments": [
3
+ {
4
+ "actionOrder": [
5
+ "create",
6
+ "cancel",
7
+ "activate",
8
+ "ready_cycle_1",
9
+ "advance_cycle_1",
10
+ "ready_cycle_2",
11
+ "advance_cycle_2",
12
+ "ready_cycle_3",
13
+ "advance_cycle_3"
14
+ ],
15
+ "actions": {
16
+ "activate": {
17
+ "agentDescription": "Start cycle one. Refused unless every member on the roster has exactly one contribution row waiting at the first cycle, so a pool can never run a member short. No money moves.",
18
+ "effects": {
19
+ "reads": [
20
+ {
21
+ "signature": "reads.requires_aggregate",
22
+ "source": "requiresAggregate"
23
+ }
24
+ ]
25
+ },
26
+ "moves": [],
27
+ "publicAction": "activatePool",
28
+ "requiresAggregate": [
29
+ {
30
+ "check": {
31
+ "field": "one",
32
+ "kind": "count_equals_field"
33
+ },
34
+ "instrumentId": "pool_member_a_contribution",
35
+ "over": "children",
36
+ "refField": "poolId",
37
+ "statuses": [
38
+ "cycle_1_due"
39
+ ]
40
+ },
41
+ {
42
+ "check": {
43
+ "field": "one",
44
+ "kind": "count_equals_field"
45
+ },
46
+ "instrumentId": "pool_member_b_contribution",
47
+ "over": "children",
48
+ "refField": "poolId",
49
+ "statuses": [
50
+ "cycle_1_due"
51
+ ]
52
+ },
53
+ {
54
+ "check": {
55
+ "field": "one",
56
+ "kind": "count_equals_field"
57
+ },
58
+ "instrumentId": "pool_member_c_contribution",
59
+ "over": "children",
60
+ "refField": "poolId",
61
+ "statuses": [
62
+ "cycle_1_due"
63
+ ]
64
+ }
65
+ ],
66
+ "steps": [],
67
+ "summary": "Activate only after every fixed member row exists once"
68
+ },
69
+ "advance_cycle_1": {
70
+ "agentDescription": "Close cycle 1 once every member row has paid into that cycle pot, moving the pool to the next cycle or to completed on the last one. Refused while any row is unpaid. No money moves here. The money moved on the member rows.",
71
+ "effects": {
72
+ "reads": [
73
+ {
74
+ "signature": "reads.requires_aggregate",
75
+ "source": "requiresAggregate"
76
+ }
77
+ ]
78
+ },
79
+ "moves": [],
80
+ "publicAction": "advanceCycle1Pool",
81
+ "requiresAggregate": [
82
+ {
83
+ "check": {
84
+ "kind": "all_in"
85
+ },
86
+ "instrumentId": "pool_member_a_contribution",
87
+ "over": "children",
88
+ "refField": "poolId",
89
+ "statuses": [
90
+ "cycle_2_due"
91
+ ]
92
+ },
93
+ {
94
+ "check": {
95
+ "kind": "all_in"
96
+ },
97
+ "instrumentId": "pool_member_b_contribution",
98
+ "over": "children",
99
+ "refField": "poolId",
100
+ "statuses": [
101
+ "cycle_2_due"
102
+ ]
103
+ },
104
+ {
105
+ "check": {
106
+ "kind": "all_in"
107
+ },
108
+ "instrumentId": "pool_member_c_contribution",
109
+ "over": "children",
110
+ "refField": "poolId",
111
+ "statuses": [
112
+ "cycle_2_due"
113
+ ]
114
+ }
115
+ ],
116
+ "steps": [],
117
+ "summary": "Advance after every cycle 1 contribution pays"
118
+ },
119
+ "advance_cycle_2": {
120
+ "agentDescription": "Close cycle 2 once every member row has paid into that cycle pot, moving the pool to the next cycle or to completed on the last one. Refused while any row is unpaid. No money moves here. The money moved on the member rows.",
121
+ "effects": {
122
+ "reads": [
123
+ {
124
+ "signature": "reads.requires_aggregate",
125
+ "source": "requiresAggregate"
126
+ }
127
+ ]
128
+ },
129
+ "moves": [],
130
+ "publicAction": "advanceCycle2Pool",
131
+ "requiresAggregate": [
132
+ {
133
+ "check": {
134
+ "kind": "all_in"
135
+ },
136
+ "instrumentId": "pool_member_a_contribution",
137
+ "over": "children",
138
+ "refField": "poolId",
139
+ "statuses": [
140
+ "cycle_3_due"
141
+ ]
142
+ },
143
+ {
144
+ "check": {
145
+ "kind": "all_in"
146
+ },
147
+ "instrumentId": "pool_member_b_contribution",
148
+ "over": "children",
149
+ "refField": "poolId",
150
+ "statuses": [
151
+ "cycle_3_due"
152
+ ]
153
+ },
154
+ {
155
+ "check": {
156
+ "kind": "all_in"
157
+ },
158
+ "instrumentId": "pool_member_c_contribution",
159
+ "over": "children",
160
+ "refField": "poolId",
161
+ "statuses": [
162
+ "cycle_3_due"
163
+ ]
164
+ }
165
+ ],
166
+ "steps": [],
167
+ "summary": "Advance after every cycle 2 contribution pays"
168
+ },
169
+ "advance_cycle_3": {
170
+ "agentDescription": "Close cycle 3 once every member row has paid into that cycle pot, moving the pool to the next cycle or to completed on the last one. Refused while any row is unpaid. No money moves here. The money moved on the member rows.",
171
+ "effects": {
172
+ "reads": [
173
+ {
174
+ "signature": "reads.requires_aggregate",
175
+ "source": "requiresAggregate"
176
+ }
177
+ ]
178
+ },
179
+ "moves": [],
180
+ "publicAction": "advanceCycle3Pool",
181
+ "requiresAggregate": [
182
+ {
183
+ "check": {
184
+ "kind": "all_in"
185
+ },
186
+ "instrumentId": "pool_member_a_contribution",
187
+ "over": "children",
188
+ "refField": "poolId",
189
+ "statuses": [
190
+ "completed"
191
+ ]
192
+ },
193
+ {
194
+ "check": {
195
+ "kind": "all_in"
196
+ },
197
+ "instrumentId": "pool_member_b_contribution",
198
+ "over": "children",
199
+ "refField": "poolId",
200
+ "statuses": [
201
+ "completed"
202
+ ]
203
+ },
204
+ {
205
+ "check": {
206
+ "kind": "all_in"
207
+ },
208
+ "instrumentId": "pool_member_c_contribution",
209
+ "over": "children",
210
+ "refField": "poolId",
211
+ "statuses": [
212
+ "completed"
213
+ ]
214
+ }
215
+ ],
216
+ "steps": [],
217
+ "summary": "Complete after the final shared pot pays"
218
+ },
219
+ "cancel": {
220
+ "agentDescription": "Cancel the pool before it activates. Only a forming pool cancels, no money has moved yet, and there is nothing to refund. Once the pool activates this exit is gone.",
221
+ "moves": [],
222
+ "publicAction": "cancelPool",
223
+ "steps": [],
224
+ "summary": "Cancel before activation without moving money"
225
+ },
226
+ "create": {
227
+ "agentDescription": "Create the pool with its frozen roster, cycle count, contribution amount, and payout order. No money moves. Each member's contribution row is created separately, and the pool cannot activate until every row exists.",
228
+ "moves": [],
229
+ "publicAction": "createPool",
230
+ "steps": [],
231
+ "summary": "Create the fixed roster before activation"
232
+ },
233
+ "ready_cycle_1": {
234
+ "agentDescription": "Lock cycle 1 once every member row is funded or covered by the guarantor. Refused while any row is still due or defaulted. No money moves here. Locking the cycle is what lets its payouts run.",
235
+ "effects": {
236
+ "reads": [
237
+ {
238
+ "signature": "reads.requires_aggregate",
239
+ "source": "requiresAggregate"
240
+ }
241
+ ]
242
+ },
243
+ "moves": [],
244
+ "publicAction": "readyCycle1Pool",
245
+ "requiresAggregate": [
246
+ {
247
+ "check": {
248
+ "kind": "all_in"
249
+ },
250
+ "instrumentId": "pool_member_a_contribution",
251
+ "over": "children",
252
+ "refField": "poolId",
253
+ "statuses": [
254
+ "cycle_1_funded",
255
+ "cycle_1_guaranteed"
256
+ ]
257
+ },
258
+ {
259
+ "check": {
260
+ "kind": "all_in"
261
+ },
262
+ "instrumentId": "pool_member_b_contribution",
263
+ "over": "children",
264
+ "refField": "poolId",
265
+ "statuses": [
266
+ "cycle_1_funded",
267
+ "cycle_1_guaranteed"
268
+ ]
269
+ },
270
+ {
271
+ "check": {
272
+ "kind": "all_in"
273
+ },
274
+ "instrumentId": "pool_member_c_contribution",
275
+ "over": "children",
276
+ "refField": "poolId",
277
+ "statuses": [
278
+ "cycle_1_funded",
279
+ "cycle_1_guaranteed"
280
+ ]
281
+ }
282
+ ],
283
+ "steps": [],
284
+ "summary": "Lock cycle 1 only after every member row is funded or guaranteed"
285
+ },
286
+ "ready_cycle_2": {
287
+ "agentDescription": "Lock cycle 2 once every member row is funded or covered by the guarantor. Refused while any row is still due or defaulted. No money moves here. Locking the cycle is what lets its payouts run.",
288
+ "effects": {
289
+ "reads": [
290
+ {
291
+ "signature": "reads.requires_aggregate",
292
+ "source": "requiresAggregate"
293
+ }
294
+ ]
295
+ },
296
+ "moves": [],
297
+ "publicAction": "readyCycle2Pool",
298
+ "requiresAggregate": [
299
+ {
300
+ "check": {
301
+ "kind": "all_in"
302
+ },
303
+ "instrumentId": "pool_member_a_contribution",
304
+ "over": "children",
305
+ "refField": "poolId",
306
+ "statuses": [
307
+ "cycle_2_funded",
308
+ "cycle_2_guaranteed"
309
+ ]
310
+ },
311
+ {
312
+ "check": {
313
+ "kind": "all_in"
314
+ },
315
+ "instrumentId": "pool_member_b_contribution",
316
+ "over": "children",
317
+ "refField": "poolId",
318
+ "statuses": [
319
+ "cycle_2_funded",
320
+ "cycle_2_guaranteed"
321
+ ]
322
+ },
323
+ {
324
+ "check": {
325
+ "kind": "all_in"
326
+ },
327
+ "instrumentId": "pool_member_c_contribution",
328
+ "over": "children",
329
+ "refField": "poolId",
330
+ "statuses": [
331
+ "cycle_2_funded",
332
+ "cycle_2_guaranteed"
333
+ ]
334
+ }
335
+ ],
336
+ "steps": [],
337
+ "summary": "Lock cycle 2 only after every member row is funded or guaranteed"
338
+ },
339
+ "ready_cycle_3": {
340
+ "agentDescription": "Lock cycle 3 once every member row is funded or covered by the guarantor. Refused while any row is still due or defaulted. No money moves here. Locking the cycle is what lets its payouts run.",
341
+ "effects": {
342
+ "reads": [
343
+ {
344
+ "signature": "reads.requires_aggregate",
345
+ "source": "requiresAggregate"
346
+ }
347
+ ]
348
+ },
349
+ "moves": [],
350
+ "publicAction": "readyCycle3Pool",
351
+ "requiresAggregate": [
352
+ {
353
+ "check": {
354
+ "kind": "all_in"
355
+ },
356
+ "instrumentId": "pool_member_a_contribution",
357
+ "over": "children",
358
+ "refField": "poolId",
359
+ "statuses": [
360
+ "cycle_3_funded",
361
+ "cycle_3_guaranteed"
362
+ ]
363
+ },
364
+ {
365
+ "check": {
366
+ "kind": "all_in"
367
+ },
368
+ "instrumentId": "pool_member_b_contribution",
369
+ "over": "children",
370
+ "refField": "poolId",
371
+ "statuses": [
372
+ "cycle_3_funded",
373
+ "cycle_3_guaranteed"
374
+ ]
375
+ },
376
+ {
377
+ "check": {
378
+ "kind": "all_in"
379
+ },
380
+ "instrumentId": "pool_member_c_contribution",
381
+ "over": "children",
382
+ "refField": "poolId",
383
+ "statuses": [
384
+ "cycle_3_funded",
385
+ "cycle_3_guaranteed"
386
+ ]
387
+ }
388
+ ],
389
+ "steps": [],
390
+ "summary": "Lock cycle 3 only after every member row is funded or guaranteed"
391
+ }
392
+ },
393
+ "agentDescription": "Reach for rotating pool when a fixed group pays the same contribution every cycle and one member takes the whole pot each cycle, in a declared order. The roster freezes at creation, one contribution row per member, and the pot rotates until every member has been paid. Scheduled is the one payer, one payee shape on a calendar.",
394
+ "description": "Fixed rotating contribution and payout order",
395
+ "fields": {
396
+ "contributionAmount": {
397
+ "description": "Exact contribution in SAR minor units",
398
+ "pattern": "^[1-9][0-9]{0,17}$",
399
+ "type": "string"
400
+ },
401
+ "currency": {
402
+ "description": "ISO 4217 currency code",
403
+ "maxLength": 3,
404
+ "minLength": 3,
405
+ "pattern": "^[A-Z]{3}$",
406
+ "type": "string"
407
+ },
408
+ "firstContributionAt": {
409
+ "description": "Stored first contribution due date",
410
+ "format": "hyperscale-date-time",
411
+ "type": "string"
412
+ },
413
+ "guarantorAccountId": {
414
+ "description": "The guarantor account",
415
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
416
+ "type": "string",
417
+ "x-hyperscale-reference-filter": {
418
+ "column": "role",
419
+ "values": [
420
+ "customer_balance"
421
+ ]
422
+ }
423
+ },
424
+ "memberAAccountId": {
425
+ "description": "The member a account",
426
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
427
+ "type": "string",
428
+ "x-hyperscale-reference-filter": {
429
+ "column": "role",
430
+ "values": [
431
+ "customer_balance"
432
+ ]
433
+ }
434
+ },
435
+ "memberBAccountId": {
436
+ "description": "The member b account",
437
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
438
+ "type": "string",
439
+ "x-hyperscale-reference-filter": {
440
+ "column": "role",
441
+ "values": [
442
+ "customer_balance"
443
+ ]
444
+ }
445
+ },
446
+ "memberCAccountId": {
447
+ "description": "The member c account",
448
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
449
+ "type": "string",
450
+ "x-hyperscale-reference-filter": {
451
+ "column": "role",
452
+ "values": [
453
+ "customer_balance"
454
+ ]
455
+ }
456
+ },
457
+ "one": {
458
+ "const": 1,
459
+ "description": "Exact fixed member-row count",
460
+ "type": "integer"
461
+ }
462
+ },
463
+ "id": "pool",
464
+ "idPrefix": "pool",
465
+ "lifecycle": {
466
+ "initial": "forming",
467
+ "states": [
468
+ "forming",
469
+ "cancelled",
470
+ "active_cycle_1",
471
+ "cycle_1_ready",
472
+ "active_cycle_2",
473
+ "cycle_2_ready",
474
+ "active_cycle_3",
475
+ "cycle_3_ready",
476
+ "completed"
477
+ ],
478
+ "transitions": {
479
+ "activate": {
480
+ "from": [
481
+ "forming"
482
+ ],
483
+ "to": "active_cycle_1"
484
+ },
485
+ "advance_cycle_1": {
486
+ "from": [
487
+ "cycle_1_ready"
488
+ ],
489
+ "to": "active_cycle_2"
490
+ },
491
+ "advance_cycle_2": {
492
+ "from": [
493
+ "cycle_2_ready"
494
+ ],
495
+ "to": "active_cycle_3"
496
+ },
497
+ "advance_cycle_3": {
498
+ "from": [
499
+ "cycle_3_ready"
500
+ ],
501
+ "to": "completed"
502
+ },
503
+ "cancel": {
504
+ "from": [
505
+ "forming"
506
+ ],
507
+ "to": "cancelled"
508
+ },
509
+ "ready_cycle_1": {
510
+ "from": [
511
+ "active_cycle_1"
512
+ ],
513
+ "to": "cycle_1_ready"
514
+ },
515
+ "ready_cycle_2": {
516
+ "from": [
517
+ "active_cycle_2"
518
+ ],
519
+ "to": "cycle_2_ready"
520
+ },
521
+ "ready_cycle_3": {
522
+ "from": [
523
+ "active_cycle_3"
524
+ ],
525
+ "to": "cycle_3_ready"
526
+ }
527
+ }
528
+ },
529
+ "parties": {
530
+ "payer": "guarantorAccountId"
531
+ },
532
+ "required": [
533
+ "memberAAccountId",
534
+ "memberBAccountId",
535
+ "memberCAccountId",
536
+ "guarantorAccountId",
537
+ "currency",
538
+ "contributionAmount",
539
+ "firstContributionAt",
540
+ "one"
541
+ ],
542
+ "summary": "3-member rotating pool",
543
+ "title": "Pool"
544
+ },
545
+ {
546
+ "actionOrder": [
547
+ "create",
548
+ "contribute_cycle_1",
549
+ "mark_default_cycle_1",
550
+ "guarantee_cycle_1",
551
+ "pay_cycle_1",
552
+ "pay_guaranteed_cycle_1",
553
+ "contribute_cycle_2",
554
+ "mark_default_cycle_2",
555
+ "guarantee_cycle_2",
556
+ "pay_cycle_2",
557
+ "pay_guaranteed_cycle_2",
558
+ "contribute_cycle_3",
559
+ "mark_default_cycle_3",
560
+ "guarantee_cycle_3",
561
+ "pay_cycle_3",
562
+ "pay_guaranteed_cycle_3",
563
+ "close"
564
+ ],
565
+ "actions": {
566
+ "close": {
567
+ "agentDescription": "Retire this member row after its final payout. Refused while the row escrow account still holds anything, so a row can never close over stranded money. No money moves.",
568
+ "moves": [],
569
+ "publicAction": "closePoolMemberAContribution",
570
+ "requiresDrainedAccount": {
571
+ "path": "refs.escrowAccountId"
572
+ },
573
+ "steps": [],
574
+ "summary": "Complete after the final payout drains this member custody"
575
+ },
576
+ "contribute_cycle_1": {
577
+ "due": {
578
+ "field": "firstContributionAt"
579
+ },
580
+ "effects": {
581
+ "moves": [
582
+ {
583
+ "signature": "moves.collection.pay_in",
584
+ "source": "moves[0]"
585
+ }
586
+ ],
587
+ "reads": [
588
+ {
589
+ "signature": "reads.requires_refs",
590
+ "source": "requiresRefs"
591
+ }
592
+ ],
593
+ "schedules": [
594
+ {
595
+ "signature": "schedules.due",
596
+ "source": "due"
597
+ }
598
+ ]
599
+ },
600
+ "moves": [
601
+ {
602
+ "bind": {
603
+ "amount": {
604
+ "from": "instance",
605
+ "path": "fields.contributionAmount"
606
+ },
607
+ "currency": {
608
+ "from": "instance",
609
+ "path": "fields.currency"
610
+ },
611
+ "destinationAccountId": {
612
+ "from": "instance",
613
+ "path": "refs.escrowAccountId"
614
+ },
615
+ "metadata.instrumentId": {
616
+ "from": "const",
617
+ "value": "pool_member_a_contribution"
618
+ },
619
+ "metadata.instrumentInstanceId": {
620
+ "from": "instance",
621
+ "path": "instrumentInstanceId"
622
+ },
623
+ "metadata.phase": {
624
+ "from": "const",
625
+ "value": "contribute_cycle_1"
626
+ },
627
+ "productId": {
628
+ "from": "instance",
629
+ "path": "productId"
630
+ },
631
+ "sourceAccountId": {
632
+ "from": "instance",
633
+ "path": "fields.memberAAccountId"
634
+ }
635
+ },
636
+ "capture": {
637
+ "contributeCycle1ContributionTransferId": "transferId"
638
+ },
639
+ "key": "contribution",
640
+ "operation": "internal_transfer.create"
641
+ }
642
+ ],
643
+ "requiresRefs": [
644
+ {
645
+ "field": "poolId",
646
+ "statuses": [
647
+ "active_cycle_1"
648
+ ]
649
+ }
650
+ ],
651
+ "steps": [],
652
+ "summary": "Fund member a's cycle 1 contribution"
653
+ },
654
+ "contribute_cycle_2": {
655
+ "due": {
656
+ "field": "firstContributionAt",
657
+ "offset": "P30D"
658
+ },
659
+ "effects": {
660
+ "moves": [
661
+ {
662
+ "signature": "moves.collection.pay_in",
663
+ "source": "moves[0]"
664
+ }
665
+ ],
666
+ "reads": [
667
+ {
668
+ "signature": "reads.requires_refs",
669
+ "source": "requiresRefs"
670
+ }
671
+ ],
672
+ "schedules": [
673
+ {
674
+ "signature": "schedules.due",
675
+ "source": "due"
676
+ }
677
+ ]
678
+ },
679
+ "moves": [
680
+ {
681
+ "bind": {
682
+ "amount": {
683
+ "from": "instance",
684
+ "path": "fields.contributionAmount"
685
+ },
686
+ "currency": {
687
+ "from": "instance",
688
+ "path": "fields.currency"
689
+ },
690
+ "destinationAccountId": {
691
+ "from": "instance",
692
+ "path": "refs.escrowAccountId"
693
+ },
694
+ "metadata.instrumentId": {
695
+ "from": "const",
696
+ "value": "pool_member_a_contribution"
697
+ },
698
+ "metadata.instrumentInstanceId": {
699
+ "from": "instance",
700
+ "path": "instrumentInstanceId"
701
+ },
702
+ "metadata.phase": {
703
+ "from": "const",
704
+ "value": "contribute_cycle_2"
705
+ },
706
+ "productId": {
707
+ "from": "instance",
708
+ "path": "productId"
709
+ },
710
+ "sourceAccountId": {
711
+ "from": "instance",
712
+ "path": "fields.memberAAccountId"
713
+ }
714
+ },
715
+ "capture": {
716
+ "contributeCycle2ContributionTransferId": "transferId"
717
+ },
718
+ "key": "contribution",
719
+ "operation": "internal_transfer.create"
720
+ }
721
+ ],
722
+ "requiresRefs": [
723
+ {
724
+ "field": "poolId",
725
+ "statuses": [
726
+ "active_cycle_2"
727
+ ]
728
+ }
729
+ ],
730
+ "steps": [],
731
+ "summary": "Fund member a's cycle 2 contribution"
732
+ },
733
+ "contribute_cycle_3": {
734
+ "due": {
735
+ "field": "firstContributionAt",
736
+ "offset": "P60D"
737
+ },
738
+ "effects": {
739
+ "moves": [
740
+ {
741
+ "signature": "moves.collection.pay_in",
742
+ "source": "moves[0]"
743
+ }
744
+ ],
745
+ "reads": [
746
+ {
747
+ "signature": "reads.requires_refs",
748
+ "source": "requiresRefs"
749
+ }
750
+ ],
751
+ "schedules": [
752
+ {
753
+ "signature": "schedules.due",
754
+ "source": "due"
755
+ }
756
+ ]
757
+ },
758
+ "moves": [
759
+ {
760
+ "bind": {
761
+ "amount": {
762
+ "from": "instance",
763
+ "path": "fields.contributionAmount"
764
+ },
765
+ "currency": {
766
+ "from": "instance",
767
+ "path": "fields.currency"
768
+ },
769
+ "destinationAccountId": {
770
+ "from": "instance",
771
+ "path": "refs.escrowAccountId"
772
+ },
773
+ "metadata.instrumentId": {
774
+ "from": "const",
775
+ "value": "pool_member_a_contribution"
776
+ },
777
+ "metadata.instrumentInstanceId": {
778
+ "from": "instance",
779
+ "path": "instrumentInstanceId"
780
+ },
781
+ "metadata.phase": {
782
+ "from": "const",
783
+ "value": "contribute_cycle_3"
784
+ },
785
+ "productId": {
786
+ "from": "instance",
787
+ "path": "productId"
788
+ },
789
+ "sourceAccountId": {
790
+ "from": "instance",
791
+ "path": "fields.memberAAccountId"
792
+ }
793
+ },
794
+ "capture": {
795
+ "contributeCycle3ContributionTransferId": "transferId"
796
+ },
797
+ "key": "contribution",
798
+ "operation": "internal_transfer.create"
799
+ }
800
+ ],
801
+ "requiresRefs": [
802
+ {
803
+ "field": "poolId",
804
+ "statuses": [
805
+ "active_cycle_3"
806
+ ]
807
+ }
808
+ ],
809
+ "steps": [],
810
+ "summary": "Fund member a's cycle 3 contribution"
811
+ },
812
+ "create": {
813
+ "agentDescription": "Create the contribution row for the member a and provision its escrow account. The pool must still be forming, and every member needs exactly one row before the pool can activate. No money moves.",
814
+ "effects": {
815
+ "reads": [
816
+ {
817
+ "signature": "reads.requires_refs",
818
+ "source": "requiresRefs"
819
+ }
820
+ ]
821
+ },
822
+ "moves": [],
823
+ "publicAction": "createPoolMemberAContribution",
824
+ "requiresRefs": [
825
+ {
826
+ "bind": {
827
+ "contributionAmount": "fields.contributionAmount",
828
+ "currency": "fields.currency",
829
+ "firstContributionAt": "fields.firstContributionAt",
830
+ "guarantorAccountId": "fields.guarantorAccountId",
831
+ "memberAAccountId": "fields.memberAAccountId",
832
+ "memberBAccountId": "fields.memberBAccountId",
833
+ "memberCAccountId": "fields.memberCAccountId"
834
+ },
835
+ "field": "poolId",
836
+ "statuses": [
837
+ "forming"
838
+ ],
839
+ "unique": true
840
+ }
841
+ ],
842
+ "steps": [
843
+ {
844
+ "bind": {
845
+ "currency": {
846
+ "from": "instance",
847
+ "path": "fields.currency"
848
+ },
849
+ "owner.id": {
850
+ "from": "instance",
851
+ "path": "productId"
852
+ },
853
+ "owner.type": {
854
+ "from": "const",
855
+ "value": "product"
856
+ },
857
+ "productId": {
858
+ "from": "instance",
859
+ "path": "productId"
860
+ },
861
+ "role": {
862
+ "from": "const",
863
+ "value": "product_escrow"
864
+ }
865
+ },
866
+ "capture": {
867
+ "escrowAccountId": "accountId"
868
+ },
869
+ "operation": "account.escrow.provision"
870
+ }
871
+ ],
872
+ "summary": "Create the fixed contribution row for member a"
873
+ },
874
+ "guarantee_cycle_1": {
875
+ "agentDescription": "Have the guarantor fund cycle 1 for this member after the row defaulted. The row must be marked defaulted for that cycle. This moves the guarantor's money into the row escrow so the pot still pays in full.",
876
+ "effects": {
877
+ "moves": [
878
+ {
879
+ "signature": "moves.collection.pay_in",
880
+ "source": "moves[0]"
881
+ }
882
+ ],
883
+ "reads": [
884
+ {
885
+ "signature": "reads.requires_refs",
886
+ "source": "requiresRefs"
887
+ }
888
+ ]
889
+ },
890
+ "moves": [
891
+ {
892
+ "bind": {
893
+ "amount": {
894
+ "from": "instance",
895
+ "path": "fields.contributionAmount"
896
+ },
897
+ "currency": {
898
+ "from": "instance",
899
+ "path": "fields.currency"
900
+ },
901
+ "destinationAccountId": {
902
+ "from": "instance",
903
+ "path": "refs.escrowAccountId"
904
+ },
905
+ "metadata.instrumentId": {
906
+ "from": "const",
907
+ "value": "pool_member_a_contribution"
908
+ },
909
+ "metadata.instrumentInstanceId": {
910
+ "from": "instance",
911
+ "path": "instrumentInstanceId"
912
+ },
913
+ "metadata.phase": {
914
+ "from": "const",
915
+ "value": "guarantee_cycle_1"
916
+ },
917
+ "productId": {
918
+ "from": "instance",
919
+ "path": "productId"
920
+ },
921
+ "sourceAccountId": {
922
+ "from": "instance",
923
+ "path": "fields.guarantorAccountId"
924
+ }
925
+ },
926
+ "capture": {
927
+ "guaranteeCycle1GuaranteeTransferId": "transferId"
928
+ },
929
+ "key": "guarantee",
930
+ "operation": "internal_transfer.create"
931
+ }
932
+ ],
933
+ "publicAction": "guaranteeCycle1PoolMemberAContribution",
934
+ "requiresRefs": [
935
+ {
936
+ "field": "poolId",
937
+ "statuses": [
938
+ "active_cycle_1"
939
+ ]
940
+ }
941
+ ],
942
+ "steps": [],
943
+ "summary": "Fund the defaulted cycle 1 amount before payout"
944
+ },
945
+ "guarantee_cycle_2": {
946
+ "agentDescription": "Have the guarantor fund cycle 2 for this member after the row defaulted. The row must be marked defaulted for that cycle. This moves the guarantor's money into the row escrow so the pot still pays in full.",
947
+ "effects": {
948
+ "moves": [
949
+ {
950
+ "signature": "moves.collection.pay_in",
951
+ "source": "moves[0]"
952
+ }
953
+ ],
954
+ "reads": [
955
+ {
956
+ "signature": "reads.requires_refs",
957
+ "source": "requiresRefs"
958
+ }
959
+ ]
960
+ },
961
+ "moves": [
962
+ {
963
+ "bind": {
964
+ "amount": {
965
+ "from": "instance",
966
+ "path": "fields.contributionAmount"
967
+ },
968
+ "currency": {
969
+ "from": "instance",
970
+ "path": "fields.currency"
971
+ },
972
+ "destinationAccountId": {
973
+ "from": "instance",
974
+ "path": "refs.escrowAccountId"
975
+ },
976
+ "metadata.instrumentId": {
977
+ "from": "const",
978
+ "value": "pool_member_a_contribution"
979
+ },
980
+ "metadata.instrumentInstanceId": {
981
+ "from": "instance",
982
+ "path": "instrumentInstanceId"
983
+ },
984
+ "metadata.phase": {
985
+ "from": "const",
986
+ "value": "guarantee_cycle_2"
987
+ },
988
+ "productId": {
989
+ "from": "instance",
990
+ "path": "productId"
991
+ },
992
+ "sourceAccountId": {
993
+ "from": "instance",
994
+ "path": "fields.guarantorAccountId"
995
+ }
996
+ },
997
+ "capture": {
998
+ "guaranteeCycle2GuaranteeTransferId": "transferId"
999
+ },
1000
+ "key": "guarantee",
1001
+ "operation": "internal_transfer.create"
1002
+ }
1003
+ ],
1004
+ "publicAction": "guaranteeCycle2PoolMemberAContribution",
1005
+ "requiresRefs": [
1006
+ {
1007
+ "field": "poolId",
1008
+ "statuses": [
1009
+ "active_cycle_2"
1010
+ ]
1011
+ }
1012
+ ],
1013
+ "steps": [],
1014
+ "summary": "Fund the defaulted cycle 2 amount before payout"
1015
+ },
1016
+ "guarantee_cycle_3": {
1017
+ "agentDescription": "Have the guarantor fund cycle 3 for this member after the row defaulted. The row must be marked defaulted for that cycle. This moves the guarantor's money into the row escrow so the pot still pays in full.",
1018
+ "effects": {
1019
+ "moves": [
1020
+ {
1021
+ "signature": "moves.collection.pay_in",
1022
+ "source": "moves[0]"
1023
+ }
1024
+ ],
1025
+ "reads": [
1026
+ {
1027
+ "signature": "reads.requires_refs",
1028
+ "source": "requiresRefs"
1029
+ }
1030
+ ]
1031
+ },
1032
+ "moves": [
1033
+ {
1034
+ "bind": {
1035
+ "amount": {
1036
+ "from": "instance",
1037
+ "path": "fields.contributionAmount"
1038
+ },
1039
+ "currency": {
1040
+ "from": "instance",
1041
+ "path": "fields.currency"
1042
+ },
1043
+ "destinationAccountId": {
1044
+ "from": "instance",
1045
+ "path": "refs.escrowAccountId"
1046
+ },
1047
+ "metadata.instrumentId": {
1048
+ "from": "const",
1049
+ "value": "pool_member_a_contribution"
1050
+ },
1051
+ "metadata.instrumentInstanceId": {
1052
+ "from": "instance",
1053
+ "path": "instrumentInstanceId"
1054
+ },
1055
+ "metadata.phase": {
1056
+ "from": "const",
1057
+ "value": "guarantee_cycle_3"
1058
+ },
1059
+ "productId": {
1060
+ "from": "instance",
1061
+ "path": "productId"
1062
+ },
1063
+ "sourceAccountId": {
1064
+ "from": "instance",
1065
+ "path": "fields.guarantorAccountId"
1066
+ }
1067
+ },
1068
+ "capture": {
1069
+ "guaranteeCycle3GuaranteeTransferId": "transferId"
1070
+ },
1071
+ "key": "guarantee",
1072
+ "operation": "internal_transfer.create"
1073
+ }
1074
+ ],
1075
+ "publicAction": "guaranteeCycle3PoolMemberAContribution",
1076
+ "requiresRefs": [
1077
+ {
1078
+ "field": "poolId",
1079
+ "statuses": [
1080
+ "active_cycle_3"
1081
+ ]
1082
+ }
1083
+ ],
1084
+ "steps": [],
1085
+ "summary": "Fund the defaulted cycle 3 amount before payout"
1086
+ },
1087
+ "mark_default_cycle_1": {
1088
+ "due": {
1089
+ "field": "firstContributionAt"
1090
+ },
1091
+ "effects": {
1092
+ "reads": [
1093
+ {
1094
+ "signature": "reads.requires_refs",
1095
+ "source": "requiresRefs"
1096
+ }
1097
+ ],
1098
+ "schedules": [
1099
+ {
1100
+ "signature": "schedules.due",
1101
+ "source": "due"
1102
+ }
1103
+ ]
1104
+ },
1105
+ "moves": [],
1106
+ "requiresRefs": [
1107
+ {
1108
+ "field": "poolId",
1109
+ "statuses": [
1110
+ "active_cycle_1"
1111
+ ]
1112
+ }
1113
+ ],
1114
+ "steps": [],
1115
+ "summary": "Mark the stored cycle 1 due condition"
1116
+ },
1117
+ "mark_default_cycle_2": {
1118
+ "due": {
1119
+ "field": "firstContributionAt",
1120
+ "offset": "P30D"
1121
+ },
1122
+ "effects": {
1123
+ "reads": [
1124
+ {
1125
+ "signature": "reads.requires_refs",
1126
+ "source": "requiresRefs"
1127
+ }
1128
+ ],
1129
+ "schedules": [
1130
+ {
1131
+ "signature": "schedules.due",
1132
+ "source": "due"
1133
+ }
1134
+ ]
1135
+ },
1136
+ "moves": [],
1137
+ "requiresRefs": [
1138
+ {
1139
+ "field": "poolId",
1140
+ "statuses": [
1141
+ "active_cycle_2"
1142
+ ]
1143
+ }
1144
+ ],
1145
+ "steps": [],
1146
+ "summary": "Mark the stored cycle 2 due condition"
1147
+ },
1148
+ "mark_default_cycle_3": {
1149
+ "due": {
1150
+ "field": "firstContributionAt",
1151
+ "offset": "P60D"
1152
+ },
1153
+ "effects": {
1154
+ "reads": [
1155
+ {
1156
+ "signature": "reads.requires_refs",
1157
+ "source": "requiresRefs"
1158
+ }
1159
+ ],
1160
+ "schedules": [
1161
+ {
1162
+ "signature": "schedules.due",
1163
+ "source": "due"
1164
+ }
1165
+ ]
1166
+ },
1167
+ "moves": [],
1168
+ "requiresRefs": [
1169
+ {
1170
+ "field": "poolId",
1171
+ "statuses": [
1172
+ "active_cycle_3"
1173
+ ]
1174
+ }
1175
+ ],
1176
+ "steps": [],
1177
+ "summary": "Mark the stored cycle 3 due condition"
1178
+ },
1179
+ "pay_cycle_1": {
1180
+ "agentDescription": "Pay this row's funded cycle 1 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be funded rather than guaranteed. This moves money and does not reverse.",
1181
+ "effects": {
1182
+ "moves": [
1183
+ {
1184
+ "signature": "moves.transfer.internal",
1185
+ "source": "moves[0]"
1186
+ }
1187
+ ],
1188
+ "reads": [
1189
+ {
1190
+ "signature": "reads.requires_refs",
1191
+ "source": "requiresRefs"
1192
+ }
1193
+ ]
1194
+ },
1195
+ "moves": [
1196
+ {
1197
+ "bind": {
1198
+ "amount": {
1199
+ "from": "instance",
1200
+ "path": "fields.contributionAmount"
1201
+ },
1202
+ "currency": {
1203
+ "from": "instance",
1204
+ "path": "fields.currency"
1205
+ },
1206
+ "destinationAccountId": {
1207
+ "from": "instance",
1208
+ "path": "fields.memberBAccountId"
1209
+ },
1210
+ "metadata.instrumentId": {
1211
+ "from": "const",
1212
+ "value": "pool_member_a_contribution"
1213
+ },
1214
+ "metadata.instrumentInstanceId": {
1215
+ "from": "instance",
1216
+ "path": "instrumentInstanceId"
1217
+ },
1218
+ "metadata.phase": {
1219
+ "from": "const",
1220
+ "value": "pay_cycle_1"
1221
+ },
1222
+ "productId": {
1223
+ "from": "instance",
1224
+ "path": "productId"
1225
+ },
1226
+ "sourceAccountId": {
1227
+ "from": "instance",
1228
+ "path": "refs.escrowAccountId"
1229
+ }
1230
+ },
1231
+ "capture": {
1232
+ "payCycle1PayoutTransferId": "transferId"
1233
+ },
1234
+ "key": "payout",
1235
+ "operation": "internal_transfer.create"
1236
+ }
1237
+ ],
1238
+ "publicAction": "payCycle1PoolMemberAContribution",
1239
+ "requiresRefs": [
1240
+ {
1241
+ "field": "poolId",
1242
+ "statuses": [
1243
+ "cycle_1_ready"
1244
+ ]
1245
+ }
1246
+ ],
1247
+ "steps": [],
1248
+ "summary": "Pay this member's stored contribution into cycle 1's shared pot recipient"
1249
+ },
1250
+ "pay_cycle_2": {
1251
+ "agentDescription": "Pay this row's funded cycle 2 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be funded rather than guaranteed. This moves money and does not reverse.",
1252
+ "effects": {
1253
+ "moves": [
1254
+ {
1255
+ "signature": "moves.transfer.internal",
1256
+ "source": "moves[0]"
1257
+ }
1258
+ ],
1259
+ "reads": [
1260
+ {
1261
+ "signature": "reads.requires_refs",
1262
+ "source": "requiresRefs"
1263
+ }
1264
+ ]
1265
+ },
1266
+ "moves": [
1267
+ {
1268
+ "bind": {
1269
+ "amount": {
1270
+ "from": "instance",
1271
+ "path": "fields.contributionAmount"
1272
+ },
1273
+ "currency": {
1274
+ "from": "instance",
1275
+ "path": "fields.currency"
1276
+ },
1277
+ "destinationAccountId": {
1278
+ "from": "instance",
1279
+ "path": "fields.memberCAccountId"
1280
+ },
1281
+ "metadata.instrumentId": {
1282
+ "from": "const",
1283
+ "value": "pool_member_a_contribution"
1284
+ },
1285
+ "metadata.instrumentInstanceId": {
1286
+ "from": "instance",
1287
+ "path": "instrumentInstanceId"
1288
+ },
1289
+ "metadata.phase": {
1290
+ "from": "const",
1291
+ "value": "pay_cycle_2"
1292
+ },
1293
+ "productId": {
1294
+ "from": "instance",
1295
+ "path": "productId"
1296
+ },
1297
+ "sourceAccountId": {
1298
+ "from": "instance",
1299
+ "path": "refs.escrowAccountId"
1300
+ }
1301
+ },
1302
+ "capture": {
1303
+ "payCycle2PayoutTransferId": "transferId"
1304
+ },
1305
+ "key": "payout",
1306
+ "operation": "internal_transfer.create"
1307
+ }
1308
+ ],
1309
+ "publicAction": "payCycle2PoolMemberAContribution",
1310
+ "requiresRefs": [
1311
+ {
1312
+ "field": "poolId",
1313
+ "statuses": [
1314
+ "cycle_2_ready"
1315
+ ]
1316
+ }
1317
+ ],
1318
+ "steps": [],
1319
+ "summary": "Pay this member's stored contribution into cycle 2's shared pot recipient"
1320
+ },
1321
+ "pay_cycle_3": {
1322
+ "agentDescription": "Pay this row's funded cycle 3 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be funded rather than guaranteed. This moves money and does not reverse.",
1323
+ "effects": {
1324
+ "moves": [
1325
+ {
1326
+ "signature": "moves.transfer.internal",
1327
+ "source": "moves[0]"
1328
+ }
1329
+ ],
1330
+ "reads": [
1331
+ {
1332
+ "signature": "reads.requires_refs",
1333
+ "source": "requiresRefs"
1334
+ }
1335
+ ]
1336
+ },
1337
+ "moves": [
1338
+ {
1339
+ "bind": {
1340
+ "amount": {
1341
+ "from": "instance",
1342
+ "path": "fields.contributionAmount"
1343
+ },
1344
+ "currency": {
1345
+ "from": "instance",
1346
+ "path": "fields.currency"
1347
+ },
1348
+ "destinationAccountId": {
1349
+ "from": "instance",
1350
+ "path": "fields.memberAAccountId"
1351
+ },
1352
+ "metadata.instrumentId": {
1353
+ "from": "const",
1354
+ "value": "pool_member_a_contribution"
1355
+ },
1356
+ "metadata.instrumentInstanceId": {
1357
+ "from": "instance",
1358
+ "path": "instrumentInstanceId"
1359
+ },
1360
+ "metadata.phase": {
1361
+ "from": "const",
1362
+ "value": "pay_cycle_3"
1363
+ },
1364
+ "productId": {
1365
+ "from": "instance",
1366
+ "path": "productId"
1367
+ },
1368
+ "sourceAccountId": {
1369
+ "from": "instance",
1370
+ "path": "refs.escrowAccountId"
1371
+ }
1372
+ },
1373
+ "capture": {
1374
+ "payCycle3PayoutTransferId": "transferId"
1375
+ },
1376
+ "key": "payout",
1377
+ "operation": "internal_transfer.create"
1378
+ }
1379
+ ],
1380
+ "publicAction": "payCycle3PoolMemberAContribution",
1381
+ "requiresRefs": [
1382
+ {
1383
+ "field": "poolId",
1384
+ "statuses": [
1385
+ "cycle_3_ready"
1386
+ ]
1387
+ }
1388
+ ],
1389
+ "steps": [],
1390
+ "summary": "Pay this member's stored contribution into cycle 3's shared pot recipient"
1391
+ },
1392
+ "pay_guaranteed_cycle_1": {
1393
+ "agentDescription": "Pay this row's guarantor-funded cycle 1 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be guaranteed rather than funded. This moves money and does not reverse.",
1394
+ "effects": {
1395
+ "moves": [
1396
+ {
1397
+ "signature": "moves.transfer.internal",
1398
+ "source": "moves[0]"
1399
+ }
1400
+ ],
1401
+ "reads": [
1402
+ {
1403
+ "signature": "reads.requires_refs",
1404
+ "source": "requiresRefs"
1405
+ }
1406
+ ]
1407
+ },
1408
+ "moves": [
1409
+ {
1410
+ "bind": {
1411
+ "amount": {
1412
+ "from": "instance",
1413
+ "path": "fields.contributionAmount"
1414
+ },
1415
+ "currency": {
1416
+ "from": "instance",
1417
+ "path": "fields.currency"
1418
+ },
1419
+ "destinationAccountId": {
1420
+ "from": "instance",
1421
+ "path": "fields.memberBAccountId"
1422
+ },
1423
+ "metadata.instrumentId": {
1424
+ "from": "const",
1425
+ "value": "pool_member_a_contribution"
1426
+ },
1427
+ "metadata.instrumentInstanceId": {
1428
+ "from": "instance",
1429
+ "path": "instrumentInstanceId"
1430
+ },
1431
+ "metadata.phase": {
1432
+ "from": "const",
1433
+ "value": "pay_guaranteed_cycle_1"
1434
+ },
1435
+ "productId": {
1436
+ "from": "instance",
1437
+ "path": "productId"
1438
+ },
1439
+ "sourceAccountId": {
1440
+ "from": "instance",
1441
+ "path": "refs.escrowAccountId"
1442
+ }
1443
+ },
1444
+ "capture": {
1445
+ "payGuaranteedCycle1PayoutTransferId": "transferId"
1446
+ },
1447
+ "key": "payout",
1448
+ "operation": "internal_transfer.create"
1449
+ }
1450
+ ],
1451
+ "publicAction": "payGuaranteedCycle1PoolMemberAContribution",
1452
+ "requiresRefs": [
1453
+ {
1454
+ "field": "poolId",
1455
+ "statuses": [
1456
+ "cycle_1_ready"
1457
+ ]
1458
+ }
1459
+ ],
1460
+ "steps": [],
1461
+ "summary": "Pay the funded default into cycle 1's stored recipient"
1462
+ },
1463
+ "pay_guaranteed_cycle_2": {
1464
+ "agentDescription": "Pay this row's guarantor-funded cycle 2 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be guaranteed rather than funded. This moves money and does not reverse.",
1465
+ "effects": {
1466
+ "moves": [
1467
+ {
1468
+ "signature": "moves.transfer.internal",
1469
+ "source": "moves[0]"
1470
+ }
1471
+ ],
1472
+ "reads": [
1473
+ {
1474
+ "signature": "reads.requires_refs",
1475
+ "source": "requiresRefs"
1476
+ }
1477
+ ]
1478
+ },
1479
+ "moves": [
1480
+ {
1481
+ "bind": {
1482
+ "amount": {
1483
+ "from": "instance",
1484
+ "path": "fields.contributionAmount"
1485
+ },
1486
+ "currency": {
1487
+ "from": "instance",
1488
+ "path": "fields.currency"
1489
+ },
1490
+ "destinationAccountId": {
1491
+ "from": "instance",
1492
+ "path": "fields.memberCAccountId"
1493
+ },
1494
+ "metadata.instrumentId": {
1495
+ "from": "const",
1496
+ "value": "pool_member_a_contribution"
1497
+ },
1498
+ "metadata.instrumentInstanceId": {
1499
+ "from": "instance",
1500
+ "path": "instrumentInstanceId"
1501
+ },
1502
+ "metadata.phase": {
1503
+ "from": "const",
1504
+ "value": "pay_guaranteed_cycle_2"
1505
+ },
1506
+ "productId": {
1507
+ "from": "instance",
1508
+ "path": "productId"
1509
+ },
1510
+ "sourceAccountId": {
1511
+ "from": "instance",
1512
+ "path": "refs.escrowAccountId"
1513
+ }
1514
+ },
1515
+ "capture": {
1516
+ "payGuaranteedCycle2PayoutTransferId": "transferId"
1517
+ },
1518
+ "key": "payout",
1519
+ "operation": "internal_transfer.create"
1520
+ }
1521
+ ],
1522
+ "publicAction": "payGuaranteedCycle2PoolMemberAContribution",
1523
+ "requiresRefs": [
1524
+ {
1525
+ "field": "poolId",
1526
+ "statuses": [
1527
+ "cycle_2_ready"
1528
+ ]
1529
+ }
1530
+ ],
1531
+ "steps": [],
1532
+ "summary": "Pay the funded default into cycle 2's stored recipient"
1533
+ },
1534
+ "pay_guaranteed_cycle_3": {
1535
+ "agentDescription": "Pay this row's guarantor-funded cycle 3 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be guaranteed rather than funded. This moves money and does not reverse.",
1536
+ "effects": {
1537
+ "moves": [
1538
+ {
1539
+ "signature": "moves.transfer.internal",
1540
+ "source": "moves[0]"
1541
+ }
1542
+ ],
1543
+ "reads": [
1544
+ {
1545
+ "signature": "reads.requires_refs",
1546
+ "source": "requiresRefs"
1547
+ }
1548
+ ]
1549
+ },
1550
+ "moves": [
1551
+ {
1552
+ "bind": {
1553
+ "amount": {
1554
+ "from": "instance",
1555
+ "path": "fields.contributionAmount"
1556
+ },
1557
+ "currency": {
1558
+ "from": "instance",
1559
+ "path": "fields.currency"
1560
+ },
1561
+ "destinationAccountId": {
1562
+ "from": "instance",
1563
+ "path": "fields.memberAAccountId"
1564
+ },
1565
+ "metadata.instrumentId": {
1566
+ "from": "const",
1567
+ "value": "pool_member_a_contribution"
1568
+ },
1569
+ "metadata.instrumentInstanceId": {
1570
+ "from": "instance",
1571
+ "path": "instrumentInstanceId"
1572
+ },
1573
+ "metadata.phase": {
1574
+ "from": "const",
1575
+ "value": "pay_guaranteed_cycle_3"
1576
+ },
1577
+ "productId": {
1578
+ "from": "instance",
1579
+ "path": "productId"
1580
+ },
1581
+ "sourceAccountId": {
1582
+ "from": "instance",
1583
+ "path": "refs.escrowAccountId"
1584
+ }
1585
+ },
1586
+ "capture": {
1587
+ "payGuaranteedCycle3PayoutTransferId": "transferId"
1588
+ },
1589
+ "key": "payout",
1590
+ "operation": "internal_transfer.create"
1591
+ }
1592
+ ],
1593
+ "publicAction": "payGuaranteedCycle3PoolMemberAContribution",
1594
+ "requiresRefs": [
1595
+ {
1596
+ "field": "poolId",
1597
+ "statuses": [
1598
+ "cycle_3_ready"
1599
+ ]
1600
+ }
1601
+ ],
1602
+ "steps": [],
1603
+ "summary": "Pay the funded default into cycle 3's stored recipient"
1604
+ }
1605
+ },
1606
+ "agentDescription": "One seat in the pool. The member a pays the same contribution every cycle and takes the whole pot on their turn. Every contribution, default, guarantee, and payout for that member happens on this row, never on the pool itself.",
1607
+ "description": "Fixed contribution row for member a",
1608
+ "fields": {
1609
+ "contributionAmount": {
1610
+ "description": "Exact contribution amount shared by every cycle",
1611
+ "pattern": "^[1-9][0-9]{0,17}$",
1612
+ "type": "string"
1613
+ },
1614
+ "currency": {
1615
+ "description": "ISO 4217 currency code",
1616
+ "maxLength": 3,
1617
+ "minLength": 3,
1618
+ "pattern": "^[A-Z]{3}$",
1619
+ "type": "string"
1620
+ },
1621
+ "firstContributionAt": {
1622
+ "description": "First due anchor derived from the pool",
1623
+ "format": "hyperscale-date-time",
1624
+ "type": "string"
1625
+ },
1626
+ "guarantorAccountId": {
1627
+ "description": "The guarantor account",
1628
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
1629
+ "type": "string",
1630
+ "x-hyperscale-reference-filter": {
1631
+ "column": "role",
1632
+ "values": [
1633
+ "customer_balance"
1634
+ ]
1635
+ }
1636
+ },
1637
+ "memberAAccountId": {
1638
+ "description": "The member a account",
1639
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
1640
+ "type": "string",
1641
+ "x-hyperscale-reference-filter": {
1642
+ "column": "role",
1643
+ "values": [
1644
+ "customer_balance"
1645
+ ]
1646
+ }
1647
+ },
1648
+ "memberBAccountId": {
1649
+ "description": "The member b account",
1650
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
1651
+ "type": "string",
1652
+ "x-hyperscale-reference-filter": {
1653
+ "column": "role",
1654
+ "values": [
1655
+ "customer_balance"
1656
+ ]
1657
+ }
1658
+ },
1659
+ "memberCAccountId": {
1660
+ "description": "The member c account",
1661
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
1662
+ "type": "string",
1663
+ "x-hyperscale-reference-filter": {
1664
+ "column": "role",
1665
+ "values": [
1666
+ "customer_balance"
1667
+ ]
1668
+ }
1669
+ },
1670
+ "poolId": {
1671
+ "description": "The exact pool",
1672
+ "pattern": "^pool_(sandbox|live)_[a-z0-9]{8,64}$",
1673
+ "type": "string"
1674
+ }
1675
+ },
1676
+ "id": "pool_member_a_contribution",
1677
+ "idPrefix": "zzaa",
1678
+ "lifecycle": {
1679
+ "initial": "cycle_1_due",
1680
+ "states": [
1681
+ "cycle_1_due",
1682
+ "cycle_1_funded",
1683
+ "cycle_1_defaulted",
1684
+ "cycle_1_guaranteed",
1685
+ "cycle_2_due",
1686
+ "cycle_2_funded",
1687
+ "cycle_2_defaulted",
1688
+ "cycle_2_guaranteed",
1689
+ "cycle_3_due",
1690
+ "cycle_3_funded",
1691
+ "cycle_3_defaulted",
1692
+ "cycle_3_guaranteed",
1693
+ "final_paid",
1694
+ "completed"
1695
+ ],
1696
+ "transitions": {
1697
+ "close": {
1698
+ "from": [
1699
+ "final_paid"
1700
+ ],
1701
+ "to": "completed"
1702
+ },
1703
+ "contribute_cycle_1": {
1704
+ "from": [
1705
+ "cycle_1_due"
1706
+ ],
1707
+ "to": "cycle_1_funded"
1708
+ },
1709
+ "contribute_cycle_2": {
1710
+ "from": [
1711
+ "cycle_2_due"
1712
+ ],
1713
+ "to": "cycle_2_funded"
1714
+ },
1715
+ "contribute_cycle_3": {
1716
+ "from": [
1717
+ "cycle_3_due"
1718
+ ],
1719
+ "to": "cycle_3_funded"
1720
+ },
1721
+ "guarantee_cycle_1": {
1722
+ "from": [
1723
+ "cycle_1_defaulted"
1724
+ ],
1725
+ "to": "cycle_1_guaranteed"
1726
+ },
1727
+ "guarantee_cycle_2": {
1728
+ "from": [
1729
+ "cycle_2_defaulted"
1730
+ ],
1731
+ "to": "cycle_2_guaranteed"
1732
+ },
1733
+ "guarantee_cycle_3": {
1734
+ "from": [
1735
+ "cycle_3_defaulted"
1736
+ ],
1737
+ "to": "cycle_3_guaranteed"
1738
+ },
1739
+ "mark_default_cycle_1": {
1740
+ "from": [
1741
+ "cycle_1_due"
1742
+ ],
1743
+ "to": "cycle_1_defaulted"
1744
+ },
1745
+ "mark_default_cycle_2": {
1746
+ "from": [
1747
+ "cycle_2_due"
1748
+ ],
1749
+ "to": "cycle_2_defaulted"
1750
+ },
1751
+ "mark_default_cycle_3": {
1752
+ "from": [
1753
+ "cycle_3_due"
1754
+ ],
1755
+ "to": "cycle_3_defaulted"
1756
+ },
1757
+ "pay_cycle_1": {
1758
+ "from": [
1759
+ "cycle_1_funded"
1760
+ ],
1761
+ "to": "cycle_2_due"
1762
+ },
1763
+ "pay_cycle_2": {
1764
+ "from": [
1765
+ "cycle_2_funded"
1766
+ ],
1767
+ "to": "cycle_3_due"
1768
+ },
1769
+ "pay_cycle_3": {
1770
+ "from": [
1771
+ "cycle_3_funded"
1772
+ ],
1773
+ "to": "final_paid"
1774
+ },
1775
+ "pay_guaranteed_cycle_1": {
1776
+ "from": [
1777
+ "cycle_1_guaranteed"
1778
+ ],
1779
+ "to": "cycle_2_due"
1780
+ },
1781
+ "pay_guaranteed_cycle_2": {
1782
+ "from": [
1783
+ "cycle_2_guaranteed"
1784
+ ],
1785
+ "to": "cycle_3_due"
1786
+ },
1787
+ "pay_guaranteed_cycle_3": {
1788
+ "from": [
1789
+ "cycle_3_guaranteed"
1790
+ ],
1791
+ "to": "final_paid"
1792
+ }
1793
+ }
1794
+ },
1795
+ "parties": {
1796
+ "beneficiary": "memberAAccountId",
1797
+ "payer": "guarantorAccountId"
1798
+ },
1799
+ "required": [
1800
+ "memberAAccountId",
1801
+ "guarantorAccountId",
1802
+ "memberBAccountId",
1803
+ "memberCAccountId",
1804
+ "contributionAmount",
1805
+ "currency",
1806
+ "firstContributionAt",
1807
+ "poolId"
1808
+ ],
1809
+ "summary": "member a contribution row",
1810
+ "title": "Pool Member a Contribution"
1811
+ },
1812
+ {
1813
+ "actionOrder": [
1814
+ "create",
1815
+ "contribute_cycle_1",
1816
+ "mark_default_cycle_1",
1817
+ "guarantee_cycle_1",
1818
+ "pay_cycle_1",
1819
+ "pay_guaranteed_cycle_1",
1820
+ "contribute_cycle_2",
1821
+ "mark_default_cycle_2",
1822
+ "guarantee_cycle_2",
1823
+ "pay_cycle_2",
1824
+ "pay_guaranteed_cycle_2",
1825
+ "contribute_cycle_3",
1826
+ "mark_default_cycle_3",
1827
+ "guarantee_cycle_3",
1828
+ "pay_cycle_3",
1829
+ "pay_guaranteed_cycle_3",
1830
+ "close"
1831
+ ],
1832
+ "actions": {
1833
+ "close": {
1834
+ "agentDescription": "Retire this member row after its final payout. Refused while the row escrow account still holds anything, so a row can never close over stranded money. No money moves.",
1835
+ "moves": [],
1836
+ "publicAction": "closePoolMemberBContribution",
1837
+ "requiresDrainedAccount": {
1838
+ "path": "refs.escrowAccountId"
1839
+ },
1840
+ "steps": [],
1841
+ "summary": "Complete after the final payout drains this member custody"
1842
+ },
1843
+ "contribute_cycle_1": {
1844
+ "due": {
1845
+ "field": "firstContributionAt"
1846
+ },
1847
+ "effects": {
1848
+ "moves": [
1849
+ {
1850
+ "signature": "moves.collection.pay_in",
1851
+ "source": "moves[0]"
1852
+ }
1853
+ ],
1854
+ "reads": [
1855
+ {
1856
+ "signature": "reads.requires_refs",
1857
+ "source": "requiresRefs"
1858
+ }
1859
+ ],
1860
+ "schedules": [
1861
+ {
1862
+ "signature": "schedules.due",
1863
+ "source": "due"
1864
+ }
1865
+ ]
1866
+ },
1867
+ "moves": [
1868
+ {
1869
+ "bind": {
1870
+ "amount": {
1871
+ "from": "instance",
1872
+ "path": "fields.contributionAmount"
1873
+ },
1874
+ "currency": {
1875
+ "from": "instance",
1876
+ "path": "fields.currency"
1877
+ },
1878
+ "destinationAccountId": {
1879
+ "from": "instance",
1880
+ "path": "refs.escrowAccountId"
1881
+ },
1882
+ "metadata.instrumentId": {
1883
+ "from": "const",
1884
+ "value": "pool_member_b_contribution"
1885
+ },
1886
+ "metadata.instrumentInstanceId": {
1887
+ "from": "instance",
1888
+ "path": "instrumentInstanceId"
1889
+ },
1890
+ "metadata.phase": {
1891
+ "from": "const",
1892
+ "value": "contribute_cycle_1"
1893
+ },
1894
+ "productId": {
1895
+ "from": "instance",
1896
+ "path": "productId"
1897
+ },
1898
+ "sourceAccountId": {
1899
+ "from": "instance",
1900
+ "path": "fields.memberBAccountId"
1901
+ }
1902
+ },
1903
+ "capture": {
1904
+ "contributeCycle1ContributionTransferId": "transferId"
1905
+ },
1906
+ "key": "contribution",
1907
+ "operation": "internal_transfer.create"
1908
+ }
1909
+ ],
1910
+ "requiresRefs": [
1911
+ {
1912
+ "field": "poolId",
1913
+ "statuses": [
1914
+ "active_cycle_1"
1915
+ ]
1916
+ }
1917
+ ],
1918
+ "steps": [],
1919
+ "summary": "Fund member b's cycle 1 contribution"
1920
+ },
1921
+ "contribute_cycle_2": {
1922
+ "due": {
1923
+ "field": "firstContributionAt",
1924
+ "offset": "P30D"
1925
+ },
1926
+ "effects": {
1927
+ "moves": [
1928
+ {
1929
+ "signature": "moves.collection.pay_in",
1930
+ "source": "moves[0]"
1931
+ }
1932
+ ],
1933
+ "reads": [
1934
+ {
1935
+ "signature": "reads.requires_refs",
1936
+ "source": "requiresRefs"
1937
+ }
1938
+ ],
1939
+ "schedules": [
1940
+ {
1941
+ "signature": "schedules.due",
1942
+ "source": "due"
1943
+ }
1944
+ ]
1945
+ },
1946
+ "moves": [
1947
+ {
1948
+ "bind": {
1949
+ "amount": {
1950
+ "from": "instance",
1951
+ "path": "fields.contributionAmount"
1952
+ },
1953
+ "currency": {
1954
+ "from": "instance",
1955
+ "path": "fields.currency"
1956
+ },
1957
+ "destinationAccountId": {
1958
+ "from": "instance",
1959
+ "path": "refs.escrowAccountId"
1960
+ },
1961
+ "metadata.instrumentId": {
1962
+ "from": "const",
1963
+ "value": "pool_member_b_contribution"
1964
+ },
1965
+ "metadata.instrumentInstanceId": {
1966
+ "from": "instance",
1967
+ "path": "instrumentInstanceId"
1968
+ },
1969
+ "metadata.phase": {
1970
+ "from": "const",
1971
+ "value": "contribute_cycle_2"
1972
+ },
1973
+ "productId": {
1974
+ "from": "instance",
1975
+ "path": "productId"
1976
+ },
1977
+ "sourceAccountId": {
1978
+ "from": "instance",
1979
+ "path": "fields.memberBAccountId"
1980
+ }
1981
+ },
1982
+ "capture": {
1983
+ "contributeCycle2ContributionTransferId": "transferId"
1984
+ },
1985
+ "key": "contribution",
1986
+ "operation": "internal_transfer.create"
1987
+ }
1988
+ ],
1989
+ "requiresRefs": [
1990
+ {
1991
+ "field": "poolId",
1992
+ "statuses": [
1993
+ "active_cycle_2"
1994
+ ]
1995
+ }
1996
+ ],
1997
+ "steps": [],
1998
+ "summary": "Fund member b's cycle 2 contribution"
1999
+ },
2000
+ "contribute_cycle_3": {
2001
+ "due": {
2002
+ "field": "firstContributionAt",
2003
+ "offset": "P60D"
2004
+ },
2005
+ "effects": {
2006
+ "moves": [
2007
+ {
2008
+ "signature": "moves.collection.pay_in",
2009
+ "source": "moves[0]"
2010
+ }
2011
+ ],
2012
+ "reads": [
2013
+ {
2014
+ "signature": "reads.requires_refs",
2015
+ "source": "requiresRefs"
2016
+ }
2017
+ ],
2018
+ "schedules": [
2019
+ {
2020
+ "signature": "schedules.due",
2021
+ "source": "due"
2022
+ }
2023
+ ]
2024
+ },
2025
+ "moves": [
2026
+ {
2027
+ "bind": {
2028
+ "amount": {
2029
+ "from": "instance",
2030
+ "path": "fields.contributionAmount"
2031
+ },
2032
+ "currency": {
2033
+ "from": "instance",
2034
+ "path": "fields.currency"
2035
+ },
2036
+ "destinationAccountId": {
2037
+ "from": "instance",
2038
+ "path": "refs.escrowAccountId"
2039
+ },
2040
+ "metadata.instrumentId": {
2041
+ "from": "const",
2042
+ "value": "pool_member_b_contribution"
2043
+ },
2044
+ "metadata.instrumentInstanceId": {
2045
+ "from": "instance",
2046
+ "path": "instrumentInstanceId"
2047
+ },
2048
+ "metadata.phase": {
2049
+ "from": "const",
2050
+ "value": "contribute_cycle_3"
2051
+ },
2052
+ "productId": {
2053
+ "from": "instance",
2054
+ "path": "productId"
2055
+ },
2056
+ "sourceAccountId": {
2057
+ "from": "instance",
2058
+ "path": "fields.memberBAccountId"
2059
+ }
2060
+ },
2061
+ "capture": {
2062
+ "contributeCycle3ContributionTransferId": "transferId"
2063
+ },
2064
+ "key": "contribution",
2065
+ "operation": "internal_transfer.create"
2066
+ }
2067
+ ],
2068
+ "requiresRefs": [
2069
+ {
2070
+ "field": "poolId",
2071
+ "statuses": [
2072
+ "active_cycle_3"
2073
+ ]
2074
+ }
2075
+ ],
2076
+ "steps": [],
2077
+ "summary": "Fund member b's cycle 3 contribution"
2078
+ },
2079
+ "create": {
2080
+ "agentDescription": "Create the contribution row for the member b and provision its escrow account. The pool must still be forming, and every member needs exactly one row before the pool can activate. No money moves.",
2081
+ "effects": {
2082
+ "reads": [
2083
+ {
2084
+ "signature": "reads.requires_refs",
2085
+ "source": "requiresRefs"
2086
+ }
2087
+ ]
2088
+ },
2089
+ "moves": [],
2090
+ "publicAction": "createPoolMemberBContribution",
2091
+ "requiresRefs": [
2092
+ {
2093
+ "bind": {
2094
+ "contributionAmount": "fields.contributionAmount",
2095
+ "currency": "fields.currency",
2096
+ "firstContributionAt": "fields.firstContributionAt",
2097
+ "guarantorAccountId": "fields.guarantorAccountId",
2098
+ "memberAAccountId": "fields.memberAAccountId",
2099
+ "memberBAccountId": "fields.memberBAccountId",
2100
+ "memberCAccountId": "fields.memberCAccountId"
2101
+ },
2102
+ "field": "poolId",
2103
+ "statuses": [
2104
+ "forming"
2105
+ ],
2106
+ "unique": true
2107
+ }
2108
+ ],
2109
+ "steps": [
2110
+ {
2111
+ "bind": {
2112
+ "currency": {
2113
+ "from": "instance",
2114
+ "path": "fields.currency"
2115
+ },
2116
+ "owner.id": {
2117
+ "from": "instance",
2118
+ "path": "productId"
2119
+ },
2120
+ "owner.type": {
2121
+ "from": "const",
2122
+ "value": "product"
2123
+ },
2124
+ "productId": {
2125
+ "from": "instance",
2126
+ "path": "productId"
2127
+ },
2128
+ "role": {
2129
+ "from": "const",
2130
+ "value": "product_escrow"
2131
+ }
2132
+ },
2133
+ "capture": {
2134
+ "escrowAccountId": "accountId"
2135
+ },
2136
+ "operation": "account.escrow.provision"
2137
+ }
2138
+ ],
2139
+ "summary": "Create the fixed contribution row for member b"
2140
+ },
2141
+ "guarantee_cycle_1": {
2142
+ "agentDescription": "Have the guarantor fund cycle 1 for this member after the row defaulted. The row must be marked defaulted for that cycle. This moves the guarantor's money into the row escrow so the pot still pays in full.",
2143
+ "effects": {
2144
+ "moves": [
2145
+ {
2146
+ "signature": "moves.collection.pay_in",
2147
+ "source": "moves[0]"
2148
+ }
2149
+ ],
2150
+ "reads": [
2151
+ {
2152
+ "signature": "reads.requires_refs",
2153
+ "source": "requiresRefs"
2154
+ }
2155
+ ]
2156
+ },
2157
+ "moves": [
2158
+ {
2159
+ "bind": {
2160
+ "amount": {
2161
+ "from": "instance",
2162
+ "path": "fields.contributionAmount"
2163
+ },
2164
+ "currency": {
2165
+ "from": "instance",
2166
+ "path": "fields.currency"
2167
+ },
2168
+ "destinationAccountId": {
2169
+ "from": "instance",
2170
+ "path": "refs.escrowAccountId"
2171
+ },
2172
+ "metadata.instrumentId": {
2173
+ "from": "const",
2174
+ "value": "pool_member_b_contribution"
2175
+ },
2176
+ "metadata.instrumentInstanceId": {
2177
+ "from": "instance",
2178
+ "path": "instrumentInstanceId"
2179
+ },
2180
+ "metadata.phase": {
2181
+ "from": "const",
2182
+ "value": "guarantee_cycle_1"
2183
+ },
2184
+ "productId": {
2185
+ "from": "instance",
2186
+ "path": "productId"
2187
+ },
2188
+ "sourceAccountId": {
2189
+ "from": "instance",
2190
+ "path": "fields.guarantorAccountId"
2191
+ }
2192
+ },
2193
+ "capture": {
2194
+ "guaranteeCycle1GuaranteeTransferId": "transferId"
2195
+ },
2196
+ "key": "guarantee",
2197
+ "operation": "internal_transfer.create"
2198
+ }
2199
+ ],
2200
+ "publicAction": "guaranteeCycle1PoolMemberBContribution",
2201
+ "requiresRefs": [
2202
+ {
2203
+ "field": "poolId",
2204
+ "statuses": [
2205
+ "active_cycle_1"
2206
+ ]
2207
+ }
2208
+ ],
2209
+ "steps": [],
2210
+ "summary": "Fund the defaulted cycle 1 amount before payout"
2211
+ },
2212
+ "guarantee_cycle_2": {
2213
+ "agentDescription": "Have the guarantor fund cycle 2 for this member after the row defaulted. The row must be marked defaulted for that cycle. This moves the guarantor's money into the row escrow so the pot still pays in full.",
2214
+ "effects": {
2215
+ "moves": [
2216
+ {
2217
+ "signature": "moves.collection.pay_in",
2218
+ "source": "moves[0]"
2219
+ }
2220
+ ],
2221
+ "reads": [
2222
+ {
2223
+ "signature": "reads.requires_refs",
2224
+ "source": "requiresRefs"
2225
+ }
2226
+ ]
2227
+ },
2228
+ "moves": [
2229
+ {
2230
+ "bind": {
2231
+ "amount": {
2232
+ "from": "instance",
2233
+ "path": "fields.contributionAmount"
2234
+ },
2235
+ "currency": {
2236
+ "from": "instance",
2237
+ "path": "fields.currency"
2238
+ },
2239
+ "destinationAccountId": {
2240
+ "from": "instance",
2241
+ "path": "refs.escrowAccountId"
2242
+ },
2243
+ "metadata.instrumentId": {
2244
+ "from": "const",
2245
+ "value": "pool_member_b_contribution"
2246
+ },
2247
+ "metadata.instrumentInstanceId": {
2248
+ "from": "instance",
2249
+ "path": "instrumentInstanceId"
2250
+ },
2251
+ "metadata.phase": {
2252
+ "from": "const",
2253
+ "value": "guarantee_cycle_2"
2254
+ },
2255
+ "productId": {
2256
+ "from": "instance",
2257
+ "path": "productId"
2258
+ },
2259
+ "sourceAccountId": {
2260
+ "from": "instance",
2261
+ "path": "fields.guarantorAccountId"
2262
+ }
2263
+ },
2264
+ "capture": {
2265
+ "guaranteeCycle2GuaranteeTransferId": "transferId"
2266
+ },
2267
+ "key": "guarantee",
2268
+ "operation": "internal_transfer.create"
2269
+ }
2270
+ ],
2271
+ "publicAction": "guaranteeCycle2PoolMemberBContribution",
2272
+ "requiresRefs": [
2273
+ {
2274
+ "field": "poolId",
2275
+ "statuses": [
2276
+ "active_cycle_2"
2277
+ ]
2278
+ }
2279
+ ],
2280
+ "steps": [],
2281
+ "summary": "Fund the defaulted cycle 2 amount before payout"
2282
+ },
2283
+ "guarantee_cycle_3": {
2284
+ "agentDescription": "Have the guarantor fund cycle 3 for this member after the row defaulted. The row must be marked defaulted for that cycle. This moves the guarantor's money into the row escrow so the pot still pays in full.",
2285
+ "effects": {
2286
+ "moves": [
2287
+ {
2288
+ "signature": "moves.collection.pay_in",
2289
+ "source": "moves[0]"
2290
+ }
2291
+ ],
2292
+ "reads": [
2293
+ {
2294
+ "signature": "reads.requires_refs",
2295
+ "source": "requiresRefs"
2296
+ }
2297
+ ]
2298
+ },
2299
+ "moves": [
2300
+ {
2301
+ "bind": {
2302
+ "amount": {
2303
+ "from": "instance",
2304
+ "path": "fields.contributionAmount"
2305
+ },
2306
+ "currency": {
2307
+ "from": "instance",
2308
+ "path": "fields.currency"
2309
+ },
2310
+ "destinationAccountId": {
2311
+ "from": "instance",
2312
+ "path": "refs.escrowAccountId"
2313
+ },
2314
+ "metadata.instrumentId": {
2315
+ "from": "const",
2316
+ "value": "pool_member_b_contribution"
2317
+ },
2318
+ "metadata.instrumentInstanceId": {
2319
+ "from": "instance",
2320
+ "path": "instrumentInstanceId"
2321
+ },
2322
+ "metadata.phase": {
2323
+ "from": "const",
2324
+ "value": "guarantee_cycle_3"
2325
+ },
2326
+ "productId": {
2327
+ "from": "instance",
2328
+ "path": "productId"
2329
+ },
2330
+ "sourceAccountId": {
2331
+ "from": "instance",
2332
+ "path": "fields.guarantorAccountId"
2333
+ }
2334
+ },
2335
+ "capture": {
2336
+ "guaranteeCycle3GuaranteeTransferId": "transferId"
2337
+ },
2338
+ "key": "guarantee",
2339
+ "operation": "internal_transfer.create"
2340
+ }
2341
+ ],
2342
+ "publicAction": "guaranteeCycle3PoolMemberBContribution",
2343
+ "requiresRefs": [
2344
+ {
2345
+ "field": "poolId",
2346
+ "statuses": [
2347
+ "active_cycle_3"
2348
+ ]
2349
+ }
2350
+ ],
2351
+ "steps": [],
2352
+ "summary": "Fund the defaulted cycle 3 amount before payout"
2353
+ },
2354
+ "mark_default_cycle_1": {
2355
+ "due": {
2356
+ "field": "firstContributionAt"
2357
+ },
2358
+ "effects": {
2359
+ "reads": [
2360
+ {
2361
+ "signature": "reads.requires_refs",
2362
+ "source": "requiresRefs"
2363
+ }
2364
+ ],
2365
+ "schedules": [
2366
+ {
2367
+ "signature": "schedules.due",
2368
+ "source": "due"
2369
+ }
2370
+ ]
2371
+ },
2372
+ "moves": [],
2373
+ "requiresRefs": [
2374
+ {
2375
+ "field": "poolId",
2376
+ "statuses": [
2377
+ "active_cycle_1"
2378
+ ]
2379
+ }
2380
+ ],
2381
+ "steps": [],
2382
+ "summary": "Mark the stored cycle 1 due condition"
2383
+ },
2384
+ "mark_default_cycle_2": {
2385
+ "due": {
2386
+ "field": "firstContributionAt",
2387
+ "offset": "P30D"
2388
+ },
2389
+ "effects": {
2390
+ "reads": [
2391
+ {
2392
+ "signature": "reads.requires_refs",
2393
+ "source": "requiresRefs"
2394
+ }
2395
+ ],
2396
+ "schedules": [
2397
+ {
2398
+ "signature": "schedules.due",
2399
+ "source": "due"
2400
+ }
2401
+ ]
2402
+ },
2403
+ "moves": [],
2404
+ "requiresRefs": [
2405
+ {
2406
+ "field": "poolId",
2407
+ "statuses": [
2408
+ "active_cycle_2"
2409
+ ]
2410
+ }
2411
+ ],
2412
+ "steps": [],
2413
+ "summary": "Mark the stored cycle 2 due condition"
2414
+ },
2415
+ "mark_default_cycle_3": {
2416
+ "due": {
2417
+ "field": "firstContributionAt",
2418
+ "offset": "P60D"
2419
+ },
2420
+ "effects": {
2421
+ "reads": [
2422
+ {
2423
+ "signature": "reads.requires_refs",
2424
+ "source": "requiresRefs"
2425
+ }
2426
+ ],
2427
+ "schedules": [
2428
+ {
2429
+ "signature": "schedules.due",
2430
+ "source": "due"
2431
+ }
2432
+ ]
2433
+ },
2434
+ "moves": [],
2435
+ "requiresRefs": [
2436
+ {
2437
+ "field": "poolId",
2438
+ "statuses": [
2439
+ "active_cycle_3"
2440
+ ]
2441
+ }
2442
+ ],
2443
+ "steps": [],
2444
+ "summary": "Mark the stored cycle 3 due condition"
2445
+ },
2446
+ "pay_cycle_1": {
2447
+ "agentDescription": "Pay this row's funded cycle 1 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be funded rather than guaranteed. This moves money and does not reverse.",
2448
+ "effects": {
2449
+ "moves": [
2450
+ {
2451
+ "signature": "moves.transfer.internal",
2452
+ "source": "moves[0]"
2453
+ }
2454
+ ],
2455
+ "reads": [
2456
+ {
2457
+ "signature": "reads.requires_refs",
2458
+ "source": "requiresRefs"
2459
+ }
2460
+ ]
2461
+ },
2462
+ "moves": [
2463
+ {
2464
+ "bind": {
2465
+ "amount": {
2466
+ "from": "instance",
2467
+ "path": "fields.contributionAmount"
2468
+ },
2469
+ "currency": {
2470
+ "from": "instance",
2471
+ "path": "fields.currency"
2472
+ },
2473
+ "destinationAccountId": {
2474
+ "from": "instance",
2475
+ "path": "fields.memberBAccountId"
2476
+ },
2477
+ "metadata.instrumentId": {
2478
+ "from": "const",
2479
+ "value": "pool_member_b_contribution"
2480
+ },
2481
+ "metadata.instrumentInstanceId": {
2482
+ "from": "instance",
2483
+ "path": "instrumentInstanceId"
2484
+ },
2485
+ "metadata.phase": {
2486
+ "from": "const",
2487
+ "value": "pay_cycle_1"
2488
+ },
2489
+ "productId": {
2490
+ "from": "instance",
2491
+ "path": "productId"
2492
+ },
2493
+ "sourceAccountId": {
2494
+ "from": "instance",
2495
+ "path": "refs.escrowAccountId"
2496
+ }
2497
+ },
2498
+ "capture": {
2499
+ "payCycle1PayoutTransferId": "transferId"
2500
+ },
2501
+ "key": "payout",
2502
+ "operation": "internal_transfer.create"
2503
+ }
2504
+ ],
2505
+ "publicAction": "payCycle1PoolMemberBContribution",
2506
+ "requiresRefs": [
2507
+ {
2508
+ "field": "poolId",
2509
+ "statuses": [
2510
+ "cycle_1_ready"
2511
+ ]
2512
+ }
2513
+ ],
2514
+ "steps": [],
2515
+ "summary": "Pay this member's stored contribution into cycle 1's shared pot recipient"
2516
+ },
2517
+ "pay_cycle_2": {
2518
+ "agentDescription": "Pay this row's funded cycle 2 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be funded rather than guaranteed. This moves money and does not reverse.",
2519
+ "effects": {
2520
+ "moves": [
2521
+ {
2522
+ "signature": "moves.transfer.internal",
2523
+ "source": "moves[0]"
2524
+ }
2525
+ ],
2526
+ "reads": [
2527
+ {
2528
+ "signature": "reads.requires_refs",
2529
+ "source": "requiresRefs"
2530
+ }
2531
+ ]
2532
+ },
2533
+ "moves": [
2534
+ {
2535
+ "bind": {
2536
+ "amount": {
2537
+ "from": "instance",
2538
+ "path": "fields.contributionAmount"
2539
+ },
2540
+ "currency": {
2541
+ "from": "instance",
2542
+ "path": "fields.currency"
2543
+ },
2544
+ "destinationAccountId": {
2545
+ "from": "instance",
2546
+ "path": "fields.memberCAccountId"
2547
+ },
2548
+ "metadata.instrumentId": {
2549
+ "from": "const",
2550
+ "value": "pool_member_b_contribution"
2551
+ },
2552
+ "metadata.instrumentInstanceId": {
2553
+ "from": "instance",
2554
+ "path": "instrumentInstanceId"
2555
+ },
2556
+ "metadata.phase": {
2557
+ "from": "const",
2558
+ "value": "pay_cycle_2"
2559
+ },
2560
+ "productId": {
2561
+ "from": "instance",
2562
+ "path": "productId"
2563
+ },
2564
+ "sourceAccountId": {
2565
+ "from": "instance",
2566
+ "path": "refs.escrowAccountId"
2567
+ }
2568
+ },
2569
+ "capture": {
2570
+ "payCycle2PayoutTransferId": "transferId"
2571
+ },
2572
+ "key": "payout",
2573
+ "operation": "internal_transfer.create"
2574
+ }
2575
+ ],
2576
+ "publicAction": "payCycle2PoolMemberBContribution",
2577
+ "requiresRefs": [
2578
+ {
2579
+ "field": "poolId",
2580
+ "statuses": [
2581
+ "cycle_2_ready"
2582
+ ]
2583
+ }
2584
+ ],
2585
+ "steps": [],
2586
+ "summary": "Pay this member's stored contribution into cycle 2's shared pot recipient"
2587
+ },
2588
+ "pay_cycle_3": {
2589
+ "agentDescription": "Pay this row's funded cycle 3 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be funded rather than guaranteed. This moves money and does not reverse.",
2590
+ "effects": {
2591
+ "moves": [
2592
+ {
2593
+ "signature": "moves.transfer.internal",
2594
+ "source": "moves[0]"
2595
+ }
2596
+ ],
2597
+ "reads": [
2598
+ {
2599
+ "signature": "reads.requires_refs",
2600
+ "source": "requiresRefs"
2601
+ }
2602
+ ]
2603
+ },
2604
+ "moves": [
2605
+ {
2606
+ "bind": {
2607
+ "amount": {
2608
+ "from": "instance",
2609
+ "path": "fields.contributionAmount"
2610
+ },
2611
+ "currency": {
2612
+ "from": "instance",
2613
+ "path": "fields.currency"
2614
+ },
2615
+ "destinationAccountId": {
2616
+ "from": "instance",
2617
+ "path": "fields.memberAAccountId"
2618
+ },
2619
+ "metadata.instrumentId": {
2620
+ "from": "const",
2621
+ "value": "pool_member_b_contribution"
2622
+ },
2623
+ "metadata.instrumentInstanceId": {
2624
+ "from": "instance",
2625
+ "path": "instrumentInstanceId"
2626
+ },
2627
+ "metadata.phase": {
2628
+ "from": "const",
2629
+ "value": "pay_cycle_3"
2630
+ },
2631
+ "productId": {
2632
+ "from": "instance",
2633
+ "path": "productId"
2634
+ },
2635
+ "sourceAccountId": {
2636
+ "from": "instance",
2637
+ "path": "refs.escrowAccountId"
2638
+ }
2639
+ },
2640
+ "capture": {
2641
+ "payCycle3PayoutTransferId": "transferId"
2642
+ },
2643
+ "key": "payout",
2644
+ "operation": "internal_transfer.create"
2645
+ }
2646
+ ],
2647
+ "publicAction": "payCycle3PoolMemberBContribution",
2648
+ "requiresRefs": [
2649
+ {
2650
+ "field": "poolId",
2651
+ "statuses": [
2652
+ "cycle_3_ready"
2653
+ ]
2654
+ }
2655
+ ],
2656
+ "steps": [],
2657
+ "summary": "Pay this member's stored contribution into cycle 3's shared pot recipient"
2658
+ },
2659
+ "pay_guaranteed_cycle_1": {
2660
+ "agentDescription": "Pay this row's guarantor-funded cycle 1 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be guaranteed rather than funded. This moves money and does not reverse.",
2661
+ "effects": {
2662
+ "moves": [
2663
+ {
2664
+ "signature": "moves.transfer.internal",
2665
+ "source": "moves[0]"
2666
+ }
2667
+ ],
2668
+ "reads": [
2669
+ {
2670
+ "signature": "reads.requires_refs",
2671
+ "source": "requiresRefs"
2672
+ }
2673
+ ]
2674
+ },
2675
+ "moves": [
2676
+ {
2677
+ "bind": {
2678
+ "amount": {
2679
+ "from": "instance",
2680
+ "path": "fields.contributionAmount"
2681
+ },
2682
+ "currency": {
2683
+ "from": "instance",
2684
+ "path": "fields.currency"
2685
+ },
2686
+ "destinationAccountId": {
2687
+ "from": "instance",
2688
+ "path": "fields.memberBAccountId"
2689
+ },
2690
+ "metadata.instrumentId": {
2691
+ "from": "const",
2692
+ "value": "pool_member_b_contribution"
2693
+ },
2694
+ "metadata.instrumentInstanceId": {
2695
+ "from": "instance",
2696
+ "path": "instrumentInstanceId"
2697
+ },
2698
+ "metadata.phase": {
2699
+ "from": "const",
2700
+ "value": "pay_guaranteed_cycle_1"
2701
+ },
2702
+ "productId": {
2703
+ "from": "instance",
2704
+ "path": "productId"
2705
+ },
2706
+ "sourceAccountId": {
2707
+ "from": "instance",
2708
+ "path": "refs.escrowAccountId"
2709
+ }
2710
+ },
2711
+ "capture": {
2712
+ "payGuaranteedCycle1PayoutTransferId": "transferId"
2713
+ },
2714
+ "key": "payout",
2715
+ "operation": "internal_transfer.create"
2716
+ }
2717
+ ],
2718
+ "publicAction": "payGuaranteedCycle1PoolMemberBContribution",
2719
+ "requiresRefs": [
2720
+ {
2721
+ "field": "poolId",
2722
+ "statuses": [
2723
+ "cycle_1_ready"
2724
+ ]
2725
+ }
2726
+ ],
2727
+ "steps": [],
2728
+ "summary": "Pay the funded default into cycle 1's stored recipient"
2729
+ },
2730
+ "pay_guaranteed_cycle_2": {
2731
+ "agentDescription": "Pay this row's guarantor-funded cycle 2 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be guaranteed rather than funded. This moves money and does not reverse.",
2732
+ "effects": {
2733
+ "moves": [
2734
+ {
2735
+ "signature": "moves.transfer.internal",
2736
+ "source": "moves[0]"
2737
+ }
2738
+ ],
2739
+ "reads": [
2740
+ {
2741
+ "signature": "reads.requires_refs",
2742
+ "source": "requiresRefs"
2743
+ }
2744
+ ]
2745
+ },
2746
+ "moves": [
2747
+ {
2748
+ "bind": {
2749
+ "amount": {
2750
+ "from": "instance",
2751
+ "path": "fields.contributionAmount"
2752
+ },
2753
+ "currency": {
2754
+ "from": "instance",
2755
+ "path": "fields.currency"
2756
+ },
2757
+ "destinationAccountId": {
2758
+ "from": "instance",
2759
+ "path": "fields.memberCAccountId"
2760
+ },
2761
+ "metadata.instrumentId": {
2762
+ "from": "const",
2763
+ "value": "pool_member_b_contribution"
2764
+ },
2765
+ "metadata.instrumentInstanceId": {
2766
+ "from": "instance",
2767
+ "path": "instrumentInstanceId"
2768
+ },
2769
+ "metadata.phase": {
2770
+ "from": "const",
2771
+ "value": "pay_guaranteed_cycle_2"
2772
+ },
2773
+ "productId": {
2774
+ "from": "instance",
2775
+ "path": "productId"
2776
+ },
2777
+ "sourceAccountId": {
2778
+ "from": "instance",
2779
+ "path": "refs.escrowAccountId"
2780
+ }
2781
+ },
2782
+ "capture": {
2783
+ "payGuaranteedCycle2PayoutTransferId": "transferId"
2784
+ },
2785
+ "key": "payout",
2786
+ "operation": "internal_transfer.create"
2787
+ }
2788
+ ],
2789
+ "publicAction": "payGuaranteedCycle2PoolMemberBContribution",
2790
+ "requiresRefs": [
2791
+ {
2792
+ "field": "poolId",
2793
+ "statuses": [
2794
+ "cycle_2_ready"
2795
+ ]
2796
+ }
2797
+ ],
2798
+ "steps": [],
2799
+ "summary": "Pay the funded default into cycle 2's stored recipient"
2800
+ },
2801
+ "pay_guaranteed_cycle_3": {
2802
+ "agentDescription": "Pay this row's guarantor-funded cycle 3 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be guaranteed rather than funded. This moves money and does not reverse.",
2803
+ "effects": {
2804
+ "moves": [
2805
+ {
2806
+ "signature": "moves.transfer.internal",
2807
+ "source": "moves[0]"
2808
+ }
2809
+ ],
2810
+ "reads": [
2811
+ {
2812
+ "signature": "reads.requires_refs",
2813
+ "source": "requiresRefs"
2814
+ }
2815
+ ]
2816
+ },
2817
+ "moves": [
2818
+ {
2819
+ "bind": {
2820
+ "amount": {
2821
+ "from": "instance",
2822
+ "path": "fields.contributionAmount"
2823
+ },
2824
+ "currency": {
2825
+ "from": "instance",
2826
+ "path": "fields.currency"
2827
+ },
2828
+ "destinationAccountId": {
2829
+ "from": "instance",
2830
+ "path": "fields.memberAAccountId"
2831
+ },
2832
+ "metadata.instrumentId": {
2833
+ "from": "const",
2834
+ "value": "pool_member_b_contribution"
2835
+ },
2836
+ "metadata.instrumentInstanceId": {
2837
+ "from": "instance",
2838
+ "path": "instrumentInstanceId"
2839
+ },
2840
+ "metadata.phase": {
2841
+ "from": "const",
2842
+ "value": "pay_guaranteed_cycle_3"
2843
+ },
2844
+ "productId": {
2845
+ "from": "instance",
2846
+ "path": "productId"
2847
+ },
2848
+ "sourceAccountId": {
2849
+ "from": "instance",
2850
+ "path": "refs.escrowAccountId"
2851
+ }
2852
+ },
2853
+ "capture": {
2854
+ "payGuaranteedCycle3PayoutTransferId": "transferId"
2855
+ },
2856
+ "key": "payout",
2857
+ "operation": "internal_transfer.create"
2858
+ }
2859
+ ],
2860
+ "publicAction": "payGuaranteedCycle3PoolMemberBContribution",
2861
+ "requiresRefs": [
2862
+ {
2863
+ "field": "poolId",
2864
+ "statuses": [
2865
+ "cycle_3_ready"
2866
+ ]
2867
+ }
2868
+ ],
2869
+ "steps": [],
2870
+ "summary": "Pay the funded default into cycle 3's stored recipient"
2871
+ }
2872
+ },
2873
+ "agentDescription": "One seat in the pool. The member b pays the same contribution every cycle and takes the whole pot on their turn. Every contribution, default, guarantee, and payout for that member happens on this row, never on the pool itself.",
2874
+ "description": "Fixed contribution row for member b",
2875
+ "fields": {
2876
+ "contributionAmount": {
2877
+ "description": "Exact contribution amount shared by every cycle",
2878
+ "pattern": "^[1-9][0-9]{0,17}$",
2879
+ "type": "string"
2880
+ },
2881
+ "currency": {
2882
+ "description": "ISO 4217 currency code",
2883
+ "maxLength": 3,
2884
+ "minLength": 3,
2885
+ "pattern": "^[A-Z]{3}$",
2886
+ "type": "string"
2887
+ },
2888
+ "firstContributionAt": {
2889
+ "description": "First due anchor derived from the pool",
2890
+ "format": "hyperscale-date-time",
2891
+ "type": "string"
2892
+ },
2893
+ "guarantorAccountId": {
2894
+ "description": "The guarantor account",
2895
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
2896
+ "type": "string",
2897
+ "x-hyperscale-reference-filter": {
2898
+ "column": "role",
2899
+ "values": [
2900
+ "customer_balance"
2901
+ ]
2902
+ }
2903
+ },
2904
+ "memberAAccountId": {
2905
+ "description": "The member a account",
2906
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
2907
+ "type": "string",
2908
+ "x-hyperscale-reference-filter": {
2909
+ "column": "role",
2910
+ "values": [
2911
+ "customer_balance"
2912
+ ]
2913
+ }
2914
+ },
2915
+ "memberBAccountId": {
2916
+ "description": "The member b account",
2917
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
2918
+ "type": "string",
2919
+ "x-hyperscale-reference-filter": {
2920
+ "column": "role",
2921
+ "values": [
2922
+ "customer_balance"
2923
+ ]
2924
+ }
2925
+ },
2926
+ "memberCAccountId": {
2927
+ "description": "The member c account",
2928
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
2929
+ "type": "string",
2930
+ "x-hyperscale-reference-filter": {
2931
+ "column": "role",
2932
+ "values": [
2933
+ "customer_balance"
2934
+ ]
2935
+ }
2936
+ },
2937
+ "poolId": {
2938
+ "description": "The exact pool",
2939
+ "pattern": "^pool_(sandbox|live)_[a-z0-9]{8,64}$",
2940
+ "type": "string"
2941
+ }
2942
+ },
2943
+ "id": "pool_member_b_contribution",
2944
+ "idPrefix": "zzab",
2945
+ "lifecycle": {
2946
+ "initial": "cycle_1_due",
2947
+ "states": [
2948
+ "cycle_1_due",
2949
+ "cycle_1_funded",
2950
+ "cycle_1_defaulted",
2951
+ "cycle_1_guaranteed",
2952
+ "cycle_2_due",
2953
+ "cycle_2_funded",
2954
+ "cycle_2_defaulted",
2955
+ "cycle_2_guaranteed",
2956
+ "cycle_3_due",
2957
+ "cycle_3_funded",
2958
+ "cycle_3_defaulted",
2959
+ "cycle_3_guaranteed",
2960
+ "final_paid",
2961
+ "completed"
2962
+ ],
2963
+ "transitions": {
2964
+ "close": {
2965
+ "from": [
2966
+ "final_paid"
2967
+ ],
2968
+ "to": "completed"
2969
+ },
2970
+ "contribute_cycle_1": {
2971
+ "from": [
2972
+ "cycle_1_due"
2973
+ ],
2974
+ "to": "cycle_1_funded"
2975
+ },
2976
+ "contribute_cycle_2": {
2977
+ "from": [
2978
+ "cycle_2_due"
2979
+ ],
2980
+ "to": "cycle_2_funded"
2981
+ },
2982
+ "contribute_cycle_3": {
2983
+ "from": [
2984
+ "cycle_3_due"
2985
+ ],
2986
+ "to": "cycle_3_funded"
2987
+ },
2988
+ "guarantee_cycle_1": {
2989
+ "from": [
2990
+ "cycle_1_defaulted"
2991
+ ],
2992
+ "to": "cycle_1_guaranteed"
2993
+ },
2994
+ "guarantee_cycle_2": {
2995
+ "from": [
2996
+ "cycle_2_defaulted"
2997
+ ],
2998
+ "to": "cycle_2_guaranteed"
2999
+ },
3000
+ "guarantee_cycle_3": {
3001
+ "from": [
3002
+ "cycle_3_defaulted"
3003
+ ],
3004
+ "to": "cycle_3_guaranteed"
3005
+ },
3006
+ "mark_default_cycle_1": {
3007
+ "from": [
3008
+ "cycle_1_due"
3009
+ ],
3010
+ "to": "cycle_1_defaulted"
3011
+ },
3012
+ "mark_default_cycle_2": {
3013
+ "from": [
3014
+ "cycle_2_due"
3015
+ ],
3016
+ "to": "cycle_2_defaulted"
3017
+ },
3018
+ "mark_default_cycle_3": {
3019
+ "from": [
3020
+ "cycle_3_due"
3021
+ ],
3022
+ "to": "cycle_3_defaulted"
3023
+ },
3024
+ "pay_cycle_1": {
3025
+ "from": [
3026
+ "cycle_1_funded"
3027
+ ],
3028
+ "to": "cycle_2_due"
3029
+ },
3030
+ "pay_cycle_2": {
3031
+ "from": [
3032
+ "cycle_2_funded"
3033
+ ],
3034
+ "to": "cycle_3_due"
3035
+ },
3036
+ "pay_cycle_3": {
3037
+ "from": [
3038
+ "cycle_3_funded"
3039
+ ],
3040
+ "to": "final_paid"
3041
+ },
3042
+ "pay_guaranteed_cycle_1": {
3043
+ "from": [
3044
+ "cycle_1_guaranteed"
3045
+ ],
3046
+ "to": "cycle_2_due"
3047
+ },
3048
+ "pay_guaranteed_cycle_2": {
3049
+ "from": [
3050
+ "cycle_2_guaranteed"
3051
+ ],
3052
+ "to": "cycle_3_due"
3053
+ },
3054
+ "pay_guaranteed_cycle_3": {
3055
+ "from": [
3056
+ "cycle_3_guaranteed"
3057
+ ],
3058
+ "to": "final_paid"
3059
+ }
3060
+ }
3061
+ },
3062
+ "parties": {
3063
+ "beneficiary": "memberBAccountId",
3064
+ "payer": "guarantorAccountId"
3065
+ },
3066
+ "required": [
3067
+ "memberBAccountId",
3068
+ "guarantorAccountId",
3069
+ "memberCAccountId",
3070
+ "memberAAccountId",
3071
+ "contributionAmount",
3072
+ "currency",
3073
+ "firstContributionAt",
3074
+ "poolId"
3075
+ ],
3076
+ "summary": "member b contribution row",
3077
+ "title": "Pool Member b Contribution"
3078
+ },
3079
+ {
3080
+ "actionOrder": [
3081
+ "create",
3082
+ "contribute_cycle_1",
3083
+ "mark_default_cycle_1",
3084
+ "guarantee_cycle_1",
3085
+ "pay_cycle_1",
3086
+ "pay_guaranteed_cycle_1",
3087
+ "contribute_cycle_2",
3088
+ "mark_default_cycle_2",
3089
+ "guarantee_cycle_2",
3090
+ "pay_cycle_2",
3091
+ "pay_guaranteed_cycle_2",
3092
+ "contribute_cycle_3",
3093
+ "mark_default_cycle_3",
3094
+ "guarantee_cycle_3",
3095
+ "pay_cycle_3",
3096
+ "pay_guaranteed_cycle_3",
3097
+ "close"
3098
+ ],
3099
+ "actions": {
3100
+ "close": {
3101
+ "agentDescription": "Retire this member row after its final payout. Refused while the row escrow account still holds anything, so a row can never close over stranded money. No money moves.",
3102
+ "moves": [],
3103
+ "publicAction": "closePoolMemberCContribution",
3104
+ "requiresDrainedAccount": {
3105
+ "path": "refs.escrowAccountId"
3106
+ },
3107
+ "steps": [],
3108
+ "summary": "Complete after the final payout drains this member custody"
3109
+ },
3110
+ "contribute_cycle_1": {
3111
+ "due": {
3112
+ "field": "firstContributionAt"
3113
+ },
3114
+ "effects": {
3115
+ "moves": [
3116
+ {
3117
+ "signature": "moves.collection.pay_in",
3118
+ "source": "moves[0]"
3119
+ }
3120
+ ],
3121
+ "reads": [
3122
+ {
3123
+ "signature": "reads.requires_refs",
3124
+ "source": "requiresRefs"
3125
+ }
3126
+ ],
3127
+ "schedules": [
3128
+ {
3129
+ "signature": "schedules.due",
3130
+ "source": "due"
3131
+ }
3132
+ ]
3133
+ },
3134
+ "moves": [
3135
+ {
3136
+ "bind": {
3137
+ "amount": {
3138
+ "from": "instance",
3139
+ "path": "fields.contributionAmount"
3140
+ },
3141
+ "currency": {
3142
+ "from": "instance",
3143
+ "path": "fields.currency"
3144
+ },
3145
+ "destinationAccountId": {
3146
+ "from": "instance",
3147
+ "path": "refs.escrowAccountId"
3148
+ },
3149
+ "metadata.instrumentId": {
3150
+ "from": "const",
3151
+ "value": "pool_member_c_contribution"
3152
+ },
3153
+ "metadata.instrumentInstanceId": {
3154
+ "from": "instance",
3155
+ "path": "instrumentInstanceId"
3156
+ },
3157
+ "metadata.phase": {
3158
+ "from": "const",
3159
+ "value": "contribute_cycle_1"
3160
+ },
3161
+ "productId": {
3162
+ "from": "instance",
3163
+ "path": "productId"
3164
+ },
3165
+ "sourceAccountId": {
3166
+ "from": "instance",
3167
+ "path": "fields.memberCAccountId"
3168
+ }
3169
+ },
3170
+ "capture": {
3171
+ "contributeCycle1ContributionTransferId": "transferId"
3172
+ },
3173
+ "key": "contribution",
3174
+ "operation": "internal_transfer.create"
3175
+ }
3176
+ ],
3177
+ "requiresRefs": [
3178
+ {
3179
+ "field": "poolId",
3180
+ "statuses": [
3181
+ "active_cycle_1"
3182
+ ]
3183
+ }
3184
+ ],
3185
+ "steps": [],
3186
+ "summary": "Fund member c's cycle 1 contribution"
3187
+ },
3188
+ "contribute_cycle_2": {
3189
+ "due": {
3190
+ "field": "firstContributionAt",
3191
+ "offset": "P30D"
3192
+ },
3193
+ "effects": {
3194
+ "moves": [
3195
+ {
3196
+ "signature": "moves.collection.pay_in",
3197
+ "source": "moves[0]"
3198
+ }
3199
+ ],
3200
+ "reads": [
3201
+ {
3202
+ "signature": "reads.requires_refs",
3203
+ "source": "requiresRefs"
3204
+ }
3205
+ ],
3206
+ "schedules": [
3207
+ {
3208
+ "signature": "schedules.due",
3209
+ "source": "due"
3210
+ }
3211
+ ]
3212
+ },
3213
+ "moves": [
3214
+ {
3215
+ "bind": {
3216
+ "amount": {
3217
+ "from": "instance",
3218
+ "path": "fields.contributionAmount"
3219
+ },
3220
+ "currency": {
3221
+ "from": "instance",
3222
+ "path": "fields.currency"
3223
+ },
3224
+ "destinationAccountId": {
3225
+ "from": "instance",
3226
+ "path": "refs.escrowAccountId"
3227
+ },
3228
+ "metadata.instrumentId": {
3229
+ "from": "const",
3230
+ "value": "pool_member_c_contribution"
3231
+ },
3232
+ "metadata.instrumentInstanceId": {
3233
+ "from": "instance",
3234
+ "path": "instrumentInstanceId"
3235
+ },
3236
+ "metadata.phase": {
3237
+ "from": "const",
3238
+ "value": "contribute_cycle_2"
3239
+ },
3240
+ "productId": {
3241
+ "from": "instance",
3242
+ "path": "productId"
3243
+ },
3244
+ "sourceAccountId": {
3245
+ "from": "instance",
3246
+ "path": "fields.memberCAccountId"
3247
+ }
3248
+ },
3249
+ "capture": {
3250
+ "contributeCycle2ContributionTransferId": "transferId"
3251
+ },
3252
+ "key": "contribution",
3253
+ "operation": "internal_transfer.create"
3254
+ }
3255
+ ],
3256
+ "requiresRefs": [
3257
+ {
3258
+ "field": "poolId",
3259
+ "statuses": [
3260
+ "active_cycle_2"
3261
+ ]
3262
+ }
3263
+ ],
3264
+ "steps": [],
3265
+ "summary": "Fund member c's cycle 2 contribution"
3266
+ },
3267
+ "contribute_cycle_3": {
3268
+ "due": {
3269
+ "field": "firstContributionAt",
3270
+ "offset": "P60D"
3271
+ },
3272
+ "effects": {
3273
+ "moves": [
3274
+ {
3275
+ "signature": "moves.collection.pay_in",
3276
+ "source": "moves[0]"
3277
+ }
3278
+ ],
3279
+ "reads": [
3280
+ {
3281
+ "signature": "reads.requires_refs",
3282
+ "source": "requiresRefs"
3283
+ }
3284
+ ],
3285
+ "schedules": [
3286
+ {
3287
+ "signature": "schedules.due",
3288
+ "source": "due"
3289
+ }
3290
+ ]
3291
+ },
3292
+ "moves": [
3293
+ {
3294
+ "bind": {
3295
+ "amount": {
3296
+ "from": "instance",
3297
+ "path": "fields.contributionAmount"
3298
+ },
3299
+ "currency": {
3300
+ "from": "instance",
3301
+ "path": "fields.currency"
3302
+ },
3303
+ "destinationAccountId": {
3304
+ "from": "instance",
3305
+ "path": "refs.escrowAccountId"
3306
+ },
3307
+ "metadata.instrumentId": {
3308
+ "from": "const",
3309
+ "value": "pool_member_c_contribution"
3310
+ },
3311
+ "metadata.instrumentInstanceId": {
3312
+ "from": "instance",
3313
+ "path": "instrumentInstanceId"
3314
+ },
3315
+ "metadata.phase": {
3316
+ "from": "const",
3317
+ "value": "contribute_cycle_3"
3318
+ },
3319
+ "productId": {
3320
+ "from": "instance",
3321
+ "path": "productId"
3322
+ },
3323
+ "sourceAccountId": {
3324
+ "from": "instance",
3325
+ "path": "fields.memberCAccountId"
3326
+ }
3327
+ },
3328
+ "capture": {
3329
+ "contributeCycle3ContributionTransferId": "transferId"
3330
+ },
3331
+ "key": "contribution",
3332
+ "operation": "internal_transfer.create"
3333
+ }
3334
+ ],
3335
+ "requiresRefs": [
3336
+ {
3337
+ "field": "poolId",
3338
+ "statuses": [
3339
+ "active_cycle_3"
3340
+ ]
3341
+ }
3342
+ ],
3343
+ "steps": [],
3344
+ "summary": "Fund member c's cycle 3 contribution"
3345
+ },
3346
+ "create": {
3347
+ "agentDescription": "Create the contribution row for the member c and provision its escrow account. The pool must still be forming, and every member needs exactly one row before the pool can activate. No money moves.",
3348
+ "effects": {
3349
+ "reads": [
3350
+ {
3351
+ "signature": "reads.requires_refs",
3352
+ "source": "requiresRefs"
3353
+ }
3354
+ ]
3355
+ },
3356
+ "moves": [],
3357
+ "publicAction": "createPoolMemberCContribution",
3358
+ "requiresRefs": [
3359
+ {
3360
+ "bind": {
3361
+ "contributionAmount": "fields.contributionAmount",
3362
+ "currency": "fields.currency",
3363
+ "firstContributionAt": "fields.firstContributionAt",
3364
+ "guarantorAccountId": "fields.guarantorAccountId",
3365
+ "memberAAccountId": "fields.memberAAccountId",
3366
+ "memberBAccountId": "fields.memberBAccountId",
3367
+ "memberCAccountId": "fields.memberCAccountId"
3368
+ },
3369
+ "field": "poolId",
3370
+ "statuses": [
3371
+ "forming"
3372
+ ],
3373
+ "unique": true
3374
+ }
3375
+ ],
3376
+ "steps": [
3377
+ {
3378
+ "bind": {
3379
+ "currency": {
3380
+ "from": "instance",
3381
+ "path": "fields.currency"
3382
+ },
3383
+ "owner.id": {
3384
+ "from": "instance",
3385
+ "path": "productId"
3386
+ },
3387
+ "owner.type": {
3388
+ "from": "const",
3389
+ "value": "product"
3390
+ },
3391
+ "productId": {
3392
+ "from": "instance",
3393
+ "path": "productId"
3394
+ },
3395
+ "role": {
3396
+ "from": "const",
3397
+ "value": "product_escrow"
3398
+ }
3399
+ },
3400
+ "capture": {
3401
+ "escrowAccountId": "accountId"
3402
+ },
3403
+ "operation": "account.escrow.provision"
3404
+ }
3405
+ ],
3406
+ "summary": "Create the fixed contribution row for member c"
3407
+ },
3408
+ "guarantee_cycle_1": {
3409
+ "agentDescription": "Have the guarantor fund cycle 1 for this member after the row defaulted. The row must be marked defaulted for that cycle. This moves the guarantor's money into the row escrow so the pot still pays in full.",
3410
+ "effects": {
3411
+ "moves": [
3412
+ {
3413
+ "signature": "moves.collection.pay_in",
3414
+ "source": "moves[0]"
3415
+ }
3416
+ ],
3417
+ "reads": [
3418
+ {
3419
+ "signature": "reads.requires_refs",
3420
+ "source": "requiresRefs"
3421
+ }
3422
+ ]
3423
+ },
3424
+ "moves": [
3425
+ {
3426
+ "bind": {
3427
+ "amount": {
3428
+ "from": "instance",
3429
+ "path": "fields.contributionAmount"
3430
+ },
3431
+ "currency": {
3432
+ "from": "instance",
3433
+ "path": "fields.currency"
3434
+ },
3435
+ "destinationAccountId": {
3436
+ "from": "instance",
3437
+ "path": "refs.escrowAccountId"
3438
+ },
3439
+ "metadata.instrumentId": {
3440
+ "from": "const",
3441
+ "value": "pool_member_c_contribution"
3442
+ },
3443
+ "metadata.instrumentInstanceId": {
3444
+ "from": "instance",
3445
+ "path": "instrumentInstanceId"
3446
+ },
3447
+ "metadata.phase": {
3448
+ "from": "const",
3449
+ "value": "guarantee_cycle_1"
3450
+ },
3451
+ "productId": {
3452
+ "from": "instance",
3453
+ "path": "productId"
3454
+ },
3455
+ "sourceAccountId": {
3456
+ "from": "instance",
3457
+ "path": "fields.guarantorAccountId"
3458
+ }
3459
+ },
3460
+ "capture": {
3461
+ "guaranteeCycle1GuaranteeTransferId": "transferId"
3462
+ },
3463
+ "key": "guarantee",
3464
+ "operation": "internal_transfer.create"
3465
+ }
3466
+ ],
3467
+ "publicAction": "guaranteeCycle1PoolMemberCContribution",
3468
+ "requiresRefs": [
3469
+ {
3470
+ "field": "poolId",
3471
+ "statuses": [
3472
+ "active_cycle_1"
3473
+ ]
3474
+ }
3475
+ ],
3476
+ "steps": [],
3477
+ "summary": "Fund the defaulted cycle 1 amount before payout"
3478
+ },
3479
+ "guarantee_cycle_2": {
3480
+ "agentDescription": "Have the guarantor fund cycle 2 for this member after the row defaulted. The row must be marked defaulted for that cycle. This moves the guarantor's money into the row escrow so the pot still pays in full.",
3481
+ "effects": {
3482
+ "moves": [
3483
+ {
3484
+ "signature": "moves.collection.pay_in",
3485
+ "source": "moves[0]"
3486
+ }
3487
+ ],
3488
+ "reads": [
3489
+ {
3490
+ "signature": "reads.requires_refs",
3491
+ "source": "requiresRefs"
3492
+ }
3493
+ ]
3494
+ },
3495
+ "moves": [
3496
+ {
3497
+ "bind": {
3498
+ "amount": {
3499
+ "from": "instance",
3500
+ "path": "fields.contributionAmount"
3501
+ },
3502
+ "currency": {
3503
+ "from": "instance",
3504
+ "path": "fields.currency"
3505
+ },
3506
+ "destinationAccountId": {
3507
+ "from": "instance",
3508
+ "path": "refs.escrowAccountId"
3509
+ },
3510
+ "metadata.instrumentId": {
3511
+ "from": "const",
3512
+ "value": "pool_member_c_contribution"
3513
+ },
3514
+ "metadata.instrumentInstanceId": {
3515
+ "from": "instance",
3516
+ "path": "instrumentInstanceId"
3517
+ },
3518
+ "metadata.phase": {
3519
+ "from": "const",
3520
+ "value": "guarantee_cycle_2"
3521
+ },
3522
+ "productId": {
3523
+ "from": "instance",
3524
+ "path": "productId"
3525
+ },
3526
+ "sourceAccountId": {
3527
+ "from": "instance",
3528
+ "path": "fields.guarantorAccountId"
3529
+ }
3530
+ },
3531
+ "capture": {
3532
+ "guaranteeCycle2GuaranteeTransferId": "transferId"
3533
+ },
3534
+ "key": "guarantee",
3535
+ "operation": "internal_transfer.create"
3536
+ }
3537
+ ],
3538
+ "publicAction": "guaranteeCycle2PoolMemberCContribution",
3539
+ "requiresRefs": [
3540
+ {
3541
+ "field": "poolId",
3542
+ "statuses": [
3543
+ "active_cycle_2"
3544
+ ]
3545
+ }
3546
+ ],
3547
+ "steps": [],
3548
+ "summary": "Fund the defaulted cycle 2 amount before payout"
3549
+ },
3550
+ "guarantee_cycle_3": {
3551
+ "agentDescription": "Have the guarantor fund cycle 3 for this member after the row defaulted. The row must be marked defaulted for that cycle. This moves the guarantor's money into the row escrow so the pot still pays in full.",
3552
+ "effects": {
3553
+ "moves": [
3554
+ {
3555
+ "signature": "moves.collection.pay_in",
3556
+ "source": "moves[0]"
3557
+ }
3558
+ ],
3559
+ "reads": [
3560
+ {
3561
+ "signature": "reads.requires_refs",
3562
+ "source": "requiresRefs"
3563
+ }
3564
+ ]
3565
+ },
3566
+ "moves": [
3567
+ {
3568
+ "bind": {
3569
+ "amount": {
3570
+ "from": "instance",
3571
+ "path": "fields.contributionAmount"
3572
+ },
3573
+ "currency": {
3574
+ "from": "instance",
3575
+ "path": "fields.currency"
3576
+ },
3577
+ "destinationAccountId": {
3578
+ "from": "instance",
3579
+ "path": "refs.escrowAccountId"
3580
+ },
3581
+ "metadata.instrumentId": {
3582
+ "from": "const",
3583
+ "value": "pool_member_c_contribution"
3584
+ },
3585
+ "metadata.instrumentInstanceId": {
3586
+ "from": "instance",
3587
+ "path": "instrumentInstanceId"
3588
+ },
3589
+ "metadata.phase": {
3590
+ "from": "const",
3591
+ "value": "guarantee_cycle_3"
3592
+ },
3593
+ "productId": {
3594
+ "from": "instance",
3595
+ "path": "productId"
3596
+ },
3597
+ "sourceAccountId": {
3598
+ "from": "instance",
3599
+ "path": "fields.guarantorAccountId"
3600
+ }
3601
+ },
3602
+ "capture": {
3603
+ "guaranteeCycle3GuaranteeTransferId": "transferId"
3604
+ },
3605
+ "key": "guarantee",
3606
+ "operation": "internal_transfer.create"
3607
+ }
3608
+ ],
3609
+ "publicAction": "guaranteeCycle3PoolMemberCContribution",
3610
+ "requiresRefs": [
3611
+ {
3612
+ "field": "poolId",
3613
+ "statuses": [
3614
+ "active_cycle_3"
3615
+ ]
3616
+ }
3617
+ ],
3618
+ "steps": [],
3619
+ "summary": "Fund the defaulted cycle 3 amount before payout"
3620
+ },
3621
+ "mark_default_cycle_1": {
3622
+ "due": {
3623
+ "field": "firstContributionAt"
3624
+ },
3625
+ "effects": {
3626
+ "reads": [
3627
+ {
3628
+ "signature": "reads.requires_refs",
3629
+ "source": "requiresRefs"
3630
+ }
3631
+ ],
3632
+ "schedules": [
3633
+ {
3634
+ "signature": "schedules.due",
3635
+ "source": "due"
3636
+ }
3637
+ ]
3638
+ },
3639
+ "moves": [],
3640
+ "requiresRefs": [
3641
+ {
3642
+ "field": "poolId",
3643
+ "statuses": [
3644
+ "active_cycle_1"
3645
+ ]
3646
+ }
3647
+ ],
3648
+ "steps": [],
3649
+ "summary": "Mark the stored cycle 1 due condition"
3650
+ },
3651
+ "mark_default_cycle_2": {
3652
+ "due": {
3653
+ "field": "firstContributionAt",
3654
+ "offset": "P30D"
3655
+ },
3656
+ "effects": {
3657
+ "reads": [
3658
+ {
3659
+ "signature": "reads.requires_refs",
3660
+ "source": "requiresRefs"
3661
+ }
3662
+ ],
3663
+ "schedules": [
3664
+ {
3665
+ "signature": "schedules.due",
3666
+ "source": "due"
3667
+ }
3668
+ ]
3669
+ },
3670
+ "moves": [],
3671
+ "requiresRefs": [
3672
+ {
3673
+ "field": "poolId",
3674
+ "statuses": [
3675
+ "active_cycle_2"
3676
+ ]
3677
+ }
3678
+ ],
3679
+ "steps": [],
3680
+ "summary": "Mark the stored cycle 2 due condition"
3681
+ },
3682
+ "mark_default_cycle_3": {
3683
+ "due": {
3684
+ "field": "firstContributionAt",
3685
+ "offset": "P60D"
3686
+ },
3687
+ "effects": {
3688
+ "reads": [
3689
+ {
3690
+ "signature": "reads.requires_refs",
3691
+ "source": "requiresRefs"
3692
+ }
3693
+ ],
3694
+ "schedules": [
3695
+ {
3696
+ "signature": "schedules.due",
3697
+ "source": "due"
3698
+ }
3699
+ ]
3700
+ },
3701
+ "moves": [],
3702
+ "requiresRefs": [
3703
+ {
3704
+ "field": "poolId",
3705
+ "statuses": [
3706
+ "active_cycle_3"
3707
+ ]
3708
+ }
3709
+ ],
3710
+ "steps": [],
3711
+ "summary": "Mark the stored cycle 3 due condition"
3712
+ },
3713
+ "pay_cycle_1": {
3714
+ "agentDescription": "Pay this row's funded cycle 1 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be funded rather than guaranteed. This moves money and does not reverse.",
3715
+ "effects": {
3716
+ "moves": [
3717
+ {
3718
+ "signature": "moves.transfer.internal",
3719
+ "source": "moves[0]"
3720
+ }
3721
+ ],
3722
+ "reads": [
3723
+ {
3724
+ "signature": "reads.requires_refs",
3725
+ "source": "requiresRefs"
3726
+ }
3727
+ ]
3728
+ },
3729
+ "moves": [
3730
+ {
3731
+ "bind": {
3732
+ "amount": {
3733
+ "from": "instance",
3734
+ "path": "fields.contributionAmount"
3735
+ },
3736
+ "currency": {
3737
+ "from": "instance",
3738
+ "path": "fields.currency"
3739
+ },
3740
+ "destinationAccountId": {
3741
+ "from": "instance",
3742
+ "path": "fields.memberBAccountId"
3743
+ },
3744
+ "metadata.instrumentId": {
3745
+ "from": "const",
3746
+ "value": "pool_member_c_contribution"
3747
+ },
3748
+ "metadata.instrumentInstanceId": {
3749
+ "from": "instance",
3750
+ "path": "instrumentInstanceId"
3751
+ },
3752
+ "metadata.phase": {
3753
+ "from": "const",
3754
+ "value": "pay_cycle_1"
3755
+ },
3756
+ "productId": {
3757
+ "from": "instance",
3758
+ "path": "productId"
3759
+ },
3760
+ "sourceAccountId": {
3761
+ "from": "instance",
3762
+ "path": "refs.escrowAccountId"
3763
+ }
3764
+ },
3765
+ "capture": {
3766
+ "payCycle1PayoutTransferId": "transferId"
3767
+ },
3768
+ "key": "payout",
3769
+ "operation": "internal_transfer.create"
3770
+ }
3771
+ ],
3772
+ "publicAction": "payCycle1PoolMemberCContribution",
3773
+ "requiresRefs": [
3774
+ {
3775
+ "field": "poolId",
3776
+ "statuses": [
3777
+ "cycle_1_ready"
3778
+ ]
3779
+ }
3780
+ ],
3781
+ "steps": [],
3782
+ "summary": "Pay this member's stored contribution into cycle 1's shared pot recipient"
3783
+ },
3784
+ "pay_cycle_2": {
3785
+ "agentDescription": "Pay this row's funded cycle 2 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be funded rather than guaranteed. This moves money and does not reverse.",
3786
+ "effects": {
3787
+ "moves": [
3788
+ {
3789
+ "signature": "moves.transfer.internal",
3790
+ "source": "moves[0]"
3791
+ }
3792
+ ],
3793
+ "reads": [
3794
+ {
3795
+ "signature": "reads.requires_refs",
3796
+ "source": "requiresRefs"
3797
+ }
3798
+ ]
3799
+ },
3800
+ "moves": [
3801
+ {
3802
+ "bind": {
3803
+ "amount": {
3804
+ "from": "instance",
3805
+ "path": "fields.contributionAmount"
3806
+ },
3807
+ "currency": {
3808
+ "from": "instance",
3809
+ "path": "fields.currency"
3810
+ },
3811
+ "destinationAccountId": {
3812
+ "from": "instance",
3813
+ "path": "fields.memberCAccountId"
3814
+ },
3815
+ "metadata.instrumentId": {
3816
+ "from": "const",
3817
+ "value": "pool_member_c_contribution"
3818
+ },
3819
+ "metadata.instrumentInstanceId": {
3820
+ "from": "instance",
3821
+ "path": "instrumentInstanceId"
3822
+ },
3823
+ "metadata.phase": {
3824
+ "from": "const",
3825
+ "value": "pay_cycle_2"
3826
+ },
3827
+ "productId": {
3828
+ "from": "instance",
3829
+ "path": "productId"
3830
+ },
3831
+ "sourceAccountId": {
3832
+ "from": "instance",
3833
+ "path": "refs.escrowAccountId"
3834
+ }
3835
+ },
3836
+ "capture": {
3837
+ "payCycle2PayoutTransferId": "transferId"
3838
+ },
3839
+ "key": "payout",
3840
+ "operation": "internal_transfer.create"
3841
+ }
3842
+ ],
3843
+ "publicAction": "payCycle2PoolMemberCContribution",
3844
+ "requiresRefs": [
3845
+ {
3846
+ "field": "poolId",
3847
+ "statuses": [
3848
+ "cycle_2_ready"
3849
+ ]
3850
+ }
3851
+ ],
3852
+ "steps": [],
3853
+ "summary": "Pay this member's stored contribution into cycle 2's shared pot recipient"
3854
+ },
3855
+ "pay_cycle_3": {
3856
+ "agentDescription": "Pay this row's funded cycle 3 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be funded rather than guaranteed. This moves money and does not reverse.",
3857
+ "effects": {
3858
+ "moves": [
3859
+ {
3860
+ "signature": "moves.transfer.internal",
3861
+ "source": "moves[0]"
3862
+ }
3863
+ ],
3864
+ "reads": [
3865
+ {
3866
+ "signature": "reads.requires_refs",
3867
+ "source": "requiresRefs"
3868
+ }
3869
+ ]
3870
+ },
3871
+ "moves": [
3872
+ {
3873
+ "bind": {
3874
+ "amount": {
3875
+ "from": "instance",
3876
+ "path": "fields.contributionAmount"
3877
+ },
3878
+ "currency": {
3879
+ "from": "instance",
3880
+ "path": "fields.currency"
3881
+ },
3882
+ "destinationAccountId": {
3883
+ "from": "instance",
3884
+ "path": "fields.memberAAccountId"
3885
+ },
3886
+ "metadata.instrumentId": {
3887
+ "from": "const",
3888
+ "value": "pool_member_c_contribution"
3889
+ },
3890
+ "metadata.instrumentInstanceId": {
3891
+ "from": "instance",
3892
+ "path": "instrumentInstanceId"
3893
+ },
3894
+ "metadata.phase": {
3895
+ "from": "const",
3896
+ "value": "pay_cycle_3"
3897
+ },
3898
+ "productId": {
3899
+ "from": "instance",
3900
+ "path": "productId"
3901
+ },
3902
+ "sourceAccountId": {
3903
+ "from": "instance",
3904
+ "path": "refs.escrowAccountId"
3905
+ }
3906
+ },
3907
+ "capture": {
3908
+ "payCycle3PayoutTransferId": "transferId"
3909
+ },
3910
+ "key": "payout",
3911
+ "operation": "internal_transfer.create"
3912
+ }
3913
+ ],
3914
+ "publicAction": "payCycle3PoolMemberCContribution",
3915
+ "requiresRefs": [
3916
+ {
3917
+ "field": "poolId",
3918
+ "statuses": [
3919
+ "cycle_3_ready"
3920
+ ]
3921
+ }
3922
+ ],
3923
+ "steps": [],
3924
+ "summary": "Pay this member's stored contribution into cycle 3's shared pot recipient"
3925
+ },
3926
+ "pay_guaranteed_cycle_1": {
3927
+ "agentDescription": "Pay this row's guarantor-funded cycle 1 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be guaranteed rather than funded. This moves money and does not reverse.",
3928
+ "effects": {
3929
+ "moves": [
3930
+ {
3931
+ "signature": "moves.transfer.internal",
3932
+ "source": "moves[0]"
3933
+ }
3934
+ ],
3935
+ "reads": [
3936
+ {
3937
+ "signature": "reads.requires_refs",
3938
+ "source": "requiresRefs"
3939
+ }
3940
+ ]
3941
+ },
3942
+ "moves": [
3943
+ {
3944
+ "bind": {
3945
+ "amount": {
3946
+ "from": "instance",
3947
+ "path": "fields.contributionAmount"
3948
+ },
3949
+ "currency": {
3950
+ "from": "instance",
3951
+ "path": "fields.currency"
3952
+ },
3953
+ "destinationAccountId": {
3954
+ "from": "instance",
3955
+ "path": "fields.memberBAccountId"
3956
+ },
3957
+ "metadata.instrumentId": {
3958
+ "from": "const",
3959
+ "value": "pool_member_c_contribution"
3960
+ },
3961
+ "metadata.instrumentInstanceId": {
3962
+ "from": "instance",
3963
+ "path": "instrumentInstanceId"
3964
+ },
3965
+ "metadata.phase": {
3966
+ "from": "const",
3967
+ "value": "pay_guaranteed_cycle_1"
3968
+ },
3969
+ "productId": {
3970
+ "from": "instance",
3971
+ "path": "productId"
3972
+ },
3973
+ "sourceAccountId": {
3974
+ "from": "instance",
3975
+ "path": "refs.escrowAccountId"
3976
+ }
3977
+ },
3978
+ "capture": {
3979
+ "payGuaranteedCycle1PayoutTransferId": "transferId"
3980
+ },
3981
+ "key": "payout",
3982
+ "operation": "internal_transfer.create"
3983
+ }
3984
+ ],
3985
+ "publicAction": "payGuaranteedCycle1PoolMemberCContribution",
3986
+ "requiresRefs": [
3987
+ {
3988
+ "field": "poolId",
3989
+ "statuses": [
3990
+ "cycle_1_ready"
3991
+ ]
3992
+ }
3993
+ ],
3994
+ "steps": [],
3995
+ "summary": "Pay the funded default into cycle 1's stored recipient"
3996
+ },
3997
+ "pay_guaranteed_cycle_2": {
3998
+ "agentDescription": "Pay this row's guarantor-funded cycle 2 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be guaranteed rather than funded. This moves money and does not reverse.",
3999
+ "effects": {
4000
+ "moves": [
4001
+ {
4002
+ "signature": "moves.transfer.internal",
4003
+ "source": "moves[0]"
4004
+ }
4005
+ ],
4006
+ "reads": [
4007
+ {
4008
+ "signature": "reads.requires_refs",
4009
+ "source": "requiresRefs"
4010
+ }
4011
+ ]
4012
+ },
4013
+ "moves": [
4014
+ {
4015
+ "bind": {
4016
+ "amount": {
4017
+ "from": "instance",
4018
+ "path": "fields.contributionAmount"
4019
+ },
4020
+ "currency": {
4021
+ "from": "instance",
4022
+ "path": "fields.currency"
4023
+ },
4024
+ "destinationAccountId": {
4025
+ "from": "instance",
4026
+ "path": "fields.memberCAccountId"
4027
+ },
4028
+ "metadata.instrumentId": {
4029
+ "from": "const",
4030
+ "value": "pool_member_c_contribution"
4031
+ },
4032
+ "metadata.instrumentInstanceId": {
4033
+ "from": "instance",
4034
+ "path": "instrumentInstanceId"
4035
+ },
4036
+ "metadata.phase": {
4037
+ "from": "const",
4038
+ "value": "pay_guaranteed_cycle_2"
4039
+ },
4040
+ "productId": {
4041
+ "from": "instance",
4042
+ "path": "productId"
4043
+ },
4044
+ "sourceAccountId": {
4045
+ "from": "instance",
4046
+ "path": "refs.escrowAccountId"
4047
+ }
4048
+ },
4049
+ "capture": {
4050
+ "payGuaranteedCycle2PayoutTransferId": "transferId"
4051
+ },
4052
+ "key": "payout",
4053
+ "operation": "internal_transfer.create"
4054
+ }
4055
+ ],
4056
+ "publicAction": "payGuaranteedCycle2PoolMemberCContribution",
4057
+ "requiresRefs": [
4058
+ {
4059
+ "field": "poolId",
4060
+ "statuses": [
4061
+ "cycle_2_ready"
4062
+ ]
4063
+ }
4064
+ ],
4065
+ "steps": [],
4066
+ "summary": "Pay the funded default into cycle 2's stored recipient"
4067
+ },
4068
+ "pay_guaranteed_cycle_3": {
4069
+ "agentDescription": "Pay this row's guarantor-funded cycle 3 contribution out of escrow to whoever holds the pot that cycle. The cycle must be locked first and the row must be guaranteed rather than funded. This moves money and does not reverse.",
4070
+ "effects": {
4071
+ "moves": [
4072
+ {
4073
+ "signature": "moves.transfer.internal",
4074
+ "source": "moves[0]"
4075
+ }
4076
+ ],
4077
+ "reads": [
4078
+ {
4079
+ "signature": "reads.requires_refs",
4080
+ "source": "requiresRefs"
4081
+ }
4082
+ ]
4083
+ },
4084
+ "moves": [
4085
+ {
4086
+ "bind": {
4087
+ "amount": {
4088
+ "from": "instance",
4089
+ "path": "fields.contributionAmount"
4090
+ },
4091
+ "currency": {
4092
+ "from": "instance",
4093
+ "path": "fields.currency"
4094
+ },
4095
+ "destinationAccountId": {
4096
+ "from": "instance",
4097
+ "path": "fields.memberAAccountId"
4098
+ },
4099
+ "metadata.instrumentId": {
4100
+ "from": "const",
4101
+ "value": "pool_member_c_contribution"
4102
+ },
4103
+ "metadata.instrumentInstanceId": {
4104
+ "from": "instance",
4105
+ "path": "instrumentInstanceId"
4106
+ },
4107
+ "metadata.phase": {
4108
+ "from": "const",
4109
+ "value": "pay_guaranteed_cycle_3"
4110
+ },
4111
+ "productId": {
4112
+ "from": "instance",
4113
+ "path": "productId"
4114
+ },
4115
+ "sourceAccountId": {
4116
+ "from": "instance",
4117
+ "path": "refs.escrowAccountId"
4118
+ }
4119
+ },
4120
+ "capture": {
4121
+ "payGuaranteedCycle3PayoutTransferId": "transferId"
4122
+ },
4123
+ "key": "payout",
4124
+ "operation": "internal_transfer.create"
4125
+ }
4126
+ ],
4127
+ "publicAction": "payGuaranteedCycle3PoolMemberCContribution",
4128
+ "requiresRefs": [
4129
+ {
4130
+ "field": "poolId",
4131
+ "statuses": [
4132
+ "cycle_3_ready"
4133
+ ]
4134
+ }
4135
+ ],
4136
+ "steps": [],
4137
+ "summary": "Pay the funded default into cycle 3's stored recipient"
4138
+ }
4139
+ },
4140
+ "agentDescription": "One seat in the pool. The member c pays the same contribution every cycle and takes the whole pot on their turn. Every contribution, default, guarantee, and payout for that member happens on this row, never on the pool itself.",
4141
+ "description": "Fixed contribution row for member c",
4142
+ "fields": {
4143
+ "contributionAmount": {
4144
+ "description": "Exact contribution amount shared by every cycle",
4145
+ "pattern": "^[1-9][0-9]{0,17}$",
4146
+ "type": "string"
4147
+ },
4148
+ "currency": {
4149
+ "description": "ISO 4217 currency code",
4150
+ "maxLength": 3,
4151
+ "minLength": 3,
4152
+ "pattern": "^[A-Z]{3}$",
4153
+ "type": "string"
4154
+ },
4155
+ "firstContributionAt": {
4156
+ "description": "First due anchor derived from the pool",
4157
+ "format": "hyperscale-date-time",
4158
+ "type": "string"
4159
+ },
4160
+ "guarantorAccountId": {
4161
+ "description": "The guarantor account",
4162
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
4163
+ "type": "string",
4164
+ "x-hyperscale-reference-filter": {
4165
+ "column": "role",
4166
+ "values": [
4167
+ "customer_balance"
4168
+ ]
4169
+ }
4170
+ },
4171
+ "memberAAccountId": {
4172
+ "description": "The member a account",
4173
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
4174
+ "type": "string",
4175
+ "x-hyperscale-reference-filter": {
4176
+ "column": "role",
4177
+ "values": [
4178
+ "customer_balance"
4179
+ ]
4180
+ }
4181
+ },
4182
+ "memberBAccountId": {
4183
+ "description": "The member b account",
4184
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
4185
+ "type": "string",
4186
+ "x-hyperscale-reference-filter": {
4187
+ "column": "role",
4188
+ "values": [
4189
+ "customer_balance"
4190
+ ]
4191
+ }
4192
+ },
4193
+ "memberCAccountId": {
4194
+ "description": "The member c account",
4195
+ "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
4196
+ "type": "string",
4197
+ "x-hyperscale-reference-filter": {
4198
+ "column": "role",
4199
+ "values": [
4200
+ "customer_balance"
4201
+ ]
4202
+ }
4203
+ },
4204
+ "poolId": {
4205
+ "description": "The exact pool",
4206
+ "pattern": "^pool_(sandbox|live)_[a-z0-9]{8,64}$",
4207
+ "type": "string"
4208
+ }
4209
+ },
4210
+ "id": "pool_member_c_contribution",
4211
+ "idPrefix": "zzac",
4212
+ "lifecycle": {
4213
+ "initial": "cycle_1_due",
4214
+ "states": [
4215
+ "cycle_1_due",
4216
+ "cycle_1_funded",
4217
+ "cycle_1_defaulted",
4218
+ "cycle_1_guaranteed",
4219
+ "cycle_2_due",
4220
+ "cycle_2_funded",
4221
+ "cycle_2_defaulted",
4222
+ "cycle_2_guaranteed",
4223
+ "cycle_3_due",
4224
+ "cycle_3_funded",
4225
+ "cycle_3_defaulted",
4226
+ "cycle_3_guaranteed",
4227
+ "final_paid",
4228
+ "completed"
4229
+ ],
4230
+ "transitions": {
4231
+ "close": {
4232
+ "from": [
4233
+ "final_paid"
4234
+ ],
4235
+ "to": "completed"
4236
+ },
4237
+ "contribute_cycle_1": {
4238
+ "from": [
4239
+ "cycle_1_due"
4240
+ ],
4241
+ "to": "cycle_1_funded"
4242
+ },
4243
+ "contribute_cycle_2": {
4244
+ "from": [
4245
+ "cycle_2_due"
4246
+ ],
4247
+ "to": "cycle_2_funded"
4248
+ },
4249
+ "contribute_cycle_3": {
4250
+ "from": [
4251
+ "cycle_3_due"
4252
+ ],
4253
+ "to": "cycle_3_funded"
4254
+ },
4255
+ "guarantee_cycle_1": {
4256
+ "from": [
4257
+ "cycle_1_defaulted"
4258
+ ],
4259
+ "to": "cycle_1_guaranteed"
4260
+ },
4261
+ "guarantee_cycle_2": {
4262
+ "from": [
4263
+ "cycle_2_defaulted"
4264
+ ],
4265
+ "to": "cycle_2_guaranteed"
4266
+ },
4267
+ "guarantee_cycle_3": {
4268
+ "from": [
4269
+ "cycle_3_defaulted"
4270
+ ],
4271
+ "to": "cycle_3_guaranteed"
4272
+ },
4273
+ "mark_default_cycle_1": {
4274
+ "from": [
4275
+ "cycle_1_due"
4276
+ ],
4277
+ "to": "cycle_1_defaulted"
4278
+ },
4279
+ "mark_default_cycle_2": {
4280
+ "from": [
4281
+ "cycle_2_due"
4282
+ ],
4283
+ "to": "cycle_2_defaulted"
4284
+ },
4285
+ "mark_default_cycle_3": {
4286
+ "from": [
4287
+ "cycle_3_due"
4288
+ ],
4289
+ "to": "cycle_3_defaulted"
4290
+ },
4291
+ "pay_cycle_1": {
4292
+ "from": [
4293
+ "cycle_1_funded"
4294
+ ],
4295
+ "to": "cycle_2_due"
4296
+ },
4297
+ "pay_cycle_2": {
4298
+ "from": [
4299
+ "cycle_2_funded"
4300
+ ],
4301
+ "to": "cycle_3_due"
4302
+ },
4303
+ "pay_cycle_3": {
4304
+ "from": [
4305
+ "cycle_3_funded"
4306
+ ],
4307
+ "to": "final_paid"
4308
+ },
4309
+ "pay_guaranteed_cycle_1": {
4310
+ "from": [
4311
+ "cycle_1_guaranteed"
4312
+ ],
4313
+ "to": "cycle_2_due"
4314
+ },
4315
+ "pay_guaranteed_cycle_2": {
4316
+ "from": [
4317
+ "cycle_2_guaranteed"
4318
+ ],
4319
+ "to": "cycle_3_due"
4320
+ },
4321
+ "pay_guaranteed_cycle_3": {
4322
+ "from": [
4323
+ "cycle_3_guaranteed"
4324
+ ],
4325
+ "to": "final_paid"
4326
+ }
4327
+ }
4328
+ },
4329
+ "parties": {
4330
+ "beneficiary": "memberCAccountId",
4331
+ "payer": "guarantorAccountId"
4332
+ },
4333
+ "required": [
4334
+ "memberCAccountId",
4335
+ "guarantorAccountId",
4336
+ "memberBAccountId",
4337
+ "memberAAccountId",
4338
+ "contributionAmount",
4339
+ "currency",
4340
+ "firstContributionAt",
4341
+ "poolId"
4342
+ ],
4343
+ "summary": "member c contribution row",
4344
+ "title": "Pool Member c Contribution"
4345
+ }
4346
+ ],
4347
+ "product": "rotating_pool_example",
4348
+ "subjects": [],
4349
+ "title": "Rotating pool example",
4350
+ "udl": 1,
4351
+ "version": 1
4352
+ }