@hyperscale0/udl 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +5 -1
  3. package/conformance/invalid/invalid-journeys.expected.json +3 -19
  4. package/conformance/invalid/invalid-journeys.udl +47 -49
  5. package/conformance/valid/attested.expected.json +6 -0
  6. package/conformance/valid/attested.udl +251 -0
  7. package/conformance/valid/hand-edited.expected.json +1 -1
  8. package/conformance/valid/hand-edited.udl +1 -1
  9. package/conformance/valid/minimal.expected.json +1 -1
  10. package/conformance/valid/minimal.udl +0 -15
  11. package/conformance/valid/vocabulary.expected.json +6 -0
  12. package/conformance/valid/vocabulary.udl +1999 -0
  13. package/dist/allocation.d.ts +60 -0
  14. package/dist/allocation.d.ts.map +1 -0
  15. package/dist/allocation.js +177 -0
  16. package/dist/allocation.js.map +1 -0
  17. package/dist/diagnostics.d.ts +1 -31
  18. package/dist/diagnostics.d.ts.map +1 -1
  19. package/dist/diagnostics.js +0 -30
  20. package/dist/diagnostics.js.map +1 -1
  21. package/dist/distribution.d.ts +15 -0
  22. package/dist/distribution.d.ts.map +1 -0
  23. package/dist/distribution.js +49 -0
  24. package/dist/distribution.js.map +1 -0
  25. package/dist/effects.d.ts.map +1 -1
  26. package/dist/effects.js +23 -1
  27. package/dist/effects.js.map +1 -1
  28. package/dist/evolution.d.ts +12 -0
  29. package/dist/evolution.d.ts.map +1 -1
  30. package/dist/evolution.js +42 -1
  31. package/dist/evolution.js.map +1 -1
  32. package/dist/finance.d.ts +18 -1
  33. package/dist/finance.d.ts.map +1 -1
  34. package/dist/finance.js +158 -27
  35. package/dist/finance.js.map +1 -1
  36. package/dist/index.d.ts +8 -2
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +5 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/instrument-references.d.ts +5 -0
  41. package/dist/instrument-references.d.ts.map +1 -0
  42. package/dist/instrument-references.js +69 -0
  43. package/dist/instrument-references.js.map +1 -0
  44. package/dist/limits.d.ts +3 -3
  45. package/dist/limits.d.ts.map +1 -1
  46. package/dist/limits.js +3 -7
  47. package/dist/limits.js.map +1 -1
  48. package/dist/reference.d.ts +3 -0
  49. package/dist/reference.d.ts.map +1 -0
  50. package/dist/reference.js +28 -0
  51. package/dist/reference.js.map +1 -0
  52. package/dist/schema.d.ts +1232 -83
  53. package/dist/schema.d.ts.map +1 -1
  54. package/dist/schema.js +398 -60
  55. package/dist/schema.js.map +1 -1
  56. package/dist/validation.d.ts +14 -0
  57. package/dist/validation.d.ts.map +1 -1
  58. package/dist/validation.js +75 -131
  59. package/dist/validation.js.map +1 -1
  60. package/dist/vocabulary.d.ts +23 -0
  61. package/dist/vocabulary.d.ts.map +1 -0
  62. package/dist/vocabulary.js +965 -0
  63. package/dist/vocabulary.js.map +1 -0
  64. package/docs/README.md +2 -1
  65. package/docs/funding-custody.md +165 -0
  66. package/docs/guide/09-schedules-and-allocation.md +130 -0
  67. package/docs/llms-full.txt +620 -101
  68. package/docs/llms.txt +1 -1
  69. package/docs/reference/clauses.md +451 -63
  70. package/docs/reference/cli.md +3 -1
  71. package/docs/reference/diagnostics.md +33 -38
  72. package/package.json +5 -6
  73. package/spec/udl.schema.json +1095 -118
  74. package/src/allocation.ts +259 -0
  75. package/src/diagnostics.ts +0 -32
  76. package/src/distribution.ts +61 -0
  77. package/src/effects.ts +27 -1
  78. package/src/evolution.ts +63 -3
  79. package/src/finance.ts +218 -24
  80. package/src/index.ts +30 -3
  81. package/src/instrument-references.ts +98 -0
  82. package/src/limits.ts +3 -7
  83. package/src/reference.ts +31 -0
  84. package/src/schema.ts +417 -66
  85. package/src/validation.ts +112 -182
  86. package/src/vocabulary.ts +1508 -0
package/docs/llms.txt CHANGED
@@ -1,4 +1,4 @@
1
- <!-- Generated by scripts/docs/build.ts from @hyperscale0/udl 2.3.0. Edit the source, not llms.txt. -->
1
+ <!-- Generated by scripts/docs/build.ts from @hyperscale0/udl 2.4.0. Edit the source, not llms.txt. -->
2
2
 
3
3
  # UDL documentation
4
4
 
@@ -1,9 +1,259 @@
1
- <!-- Generated by scripts/docs/build.ts from @hyperscale0/udl 2.3.0. Edit the source, not clauses.md. -->
1
+ <!-- Generated by scripts/docs/build.ts from @hyperscale0/udl 2.4.0. Edit the source, not clauses.md. -->
2
2
 
3
3
  # Clause reference
4
4
 
5
5
  This page lists every entry in `udlClauseVocabulary`. The examples are copied from admitted documents under `conformance/valid`.
6
6
 
7
+ ## funding
8
+
9
+ - Scope: action
10
+ - UDL target: `funding`
11
+ - Cardinality: one
12
+ - Linear outputs: none
13
+ - Effects: moves.transfer.internal per clause
14
+ - Law: Requirements-as-data law and closure law
15
+ - Conformance source: `vocabulary.udl`
16
+
17
+ ```json
18
+ {
19
+ "capture": "snapshot",
20
+ "collectAction": "collect",
21
+ "destinationAccountField": "fundingAccount",
22
+ "obligationField": "obligationId",
23
+ "principalField": "principal",
24
+ "sourceAccountPath": "refs.escrow",
25
+ "terms": {
26
+ "currency": "currency",
27
+ "principal": "principal"
28
+ },
29
+ "ticketAccountField": "wallet",
30
+ "ticketAmountField": "amount",
31
+ "ticketInstrumentId": "ticket",
32
+ "ticketInvestorField": "investor",
33
+ "ticketRefField": "roundId",
34
+ "ticketStatus": "open"
35
+ }
36
+ ```
37
+
38
+ ## receipt distribution
39
+
40
+ - Scope: action
41
+ - UDL target: `receiptDistribution`
42
+ - Cardinality: one
43
+ - Linear outputs: none
44
+ - Effects: decides.allocation per clause; moves.allocation per clause
45
+ - Law: Requirements-as-data law and closure law
46
+ - Conformance source: `vocabulary.udl`
47
+
48
+ ```json
49
+ {
50
+ "capture": "receipt",
51
+ "feeAccountField": "fee",
52
+ "feeBps": 100,
53
+ "mode": "cash",
54
+ "receiptField": "receiptId",
55
+ "receiptPath": "refs.allocationReceipt",
56
+ "residualAccountField": "residual",
57
+ "roundField": "roundId",
58
+ "snapshotRef": "snapshot",
59
+ "taxAccountField": "tax",
60
+ "vatBps": 1500
61
+ }
62
+ ```
63
+
64
+ ## requires allocation
65
+
66
+ - Scope: action
67
+ - UDL target: `requiresAllocation`
68
+ - Cardinality: one
69
+ - Linear outputs: none
70
+ - Effects: decides.allocation per clause
71
+ - Law: Requirements-as-data law and closure law
72
+ - Conformance source: `vocabulary.udl`
73
+
74
+ ```json
75
+ {
76
+ "buckets": [
77
+ "principal",
78
+ "profit"
79
+ ],
80
+ "check": "settled",
81
+ "refField": "coverId",
82
+ "slice": "self"
83
+ }
84
+ ```
85
+
86
+ ## allocation
87
+
88
+ - Scope: instrument
89
+ - UDL target: `allocation`
90
+ - Cardinality: one
91
+ - Linear outputs: none
92
+ - Effects: none
93
+ - Law: Requirements-as-data law and closure law
94
+ - Conformance source: `vocabulary.udl`
95
+
96
+ ```json
97
+ {
98
+ "buckets": [
99
+ {
100
+ "key": "principal",
101
+ "source": {
102
+ "amountField": "principal",
103
+ "destinationField": "receiver",
104
+ "from": "slice"
105
+ }
106
+ },
107
+ {
108
+ "key": "profit",
109
+ "source": {
110
+ "amountField": "profit",
111
+ "destinationField": "receiver",
112
+ "from": "slice"
113
+ }
114
+ },
115
+ {
116
+ "key": "cost",
117
+ "source": {
118
+ "amountField": "amount",
119
+ "destinationField": "receiver",
120
+ "from": "children",
121
+ "parameters": {
122
+ "cost": true
123
+ },
124
+ "refField": "sliceId",
125
+ "statuses": [
126
+ "open"
127
+ ],
128
+ "template": "assessment"
129
+ }
130
+ }
131
+ ],
132
+ "dueField": "dueAt",
133
+ "earningRuleField": "earningRule",
134
+ "positionField": "position",
135
+ "sliceInstrumentId": "slice",
136
+ "sliceRefField": "coverId",
137
+ "sliceStatuses": [
138
+ "open"
139
+ ]
140
+ }
141
+ ```
142
+
143
+ ## contributions
144
+
145
+ - Scope: instrument
146
+ - UDL target: `contributions`
147
+ - Cardinality: one
148
+ - Linear outputs: none
149
+ - Effects: none
150
+ - Law: Requirements-as-data law and closure law
151
+ - Conformance source: `vocabulary.udl`
152
+
153
+ ```json
154
+ {
155
+ "accountKey": "origin",
156
+ "amountKey": "amount",
157
+ "field": "contributions",
158
+ "totalField": "price"
159
+ }
160
+ ```
161
+
162
+ ## allocate
163
+
164
+ - Scope: action
165
+ - UDL target: `allocate`
166
+ - Cardinality: one
167
+ - Linear outputs: none
168
+ - Effects: decides.allocation per clause; moves.allocation per clause
169
+ - Law: Requirements-as-data law and closure law
170
+ - Conformance source: `vocabulary.udl`
171
+
172
+ ```json
173
+ {
174
+ "capture": "payoffReceipt",
175
+ "mode": "payoff",
176
+ "paymentIdentityField": "paymentIdentity",
177
+ "sourceAccountField": "payerAccount"
178
+ }
179
+ ```
180
+
181
+ ## contribution stage
182
+
183
+ - Scope: action
184
+ - UDL target: `contributionStage`
185
+ - Cardinality: one
186
+ - Linear outputs: none
187
+ - Effects: moves.transfer.internal per clause
188
+ - Law: Requirements-as-data law and closure law
189
+ - Conformance source: `vocabulary.udl`
190
+
191
+ ```json
192
+ {
193
+ "accountPath": "refs.hold",
194
+ "stage": "fund"
195
+ }
196
+ ```
197
+
198
+ ## date order
199
+
200
+ - Scope: instrument
201
+ - UDL target: `dateOrder`
202
+ - Cardinality: many
203
+ - Linear outputs: none
204
+ - Effects: none
205
+ - Law: Requirements-as-data law and closure law
206
+ - Conformance source: `vocabulary.udl`
207
+
208
+ ```json
209
+ [
210
+ {
211
+ "afterField": "end",
212
+ "beforeField": "start",
213
+ "operator": "<"
214
+ }
215
+ ]
216
+ ```
217
+
218
+ ## unique
219
+
220
+ - Scope: action
221
+ - UDL target: `unique`
222
+ - Cardinality: one
223
+ - Linear outputs: none
224
+ - Effects: decides.subject_unique per clause
225
+ - Law: Requirements-as-data law and closure law
226
+ - Conformance source: `vocabulary.udl`
227
+
228
+ ```json
229
+ {
230
+ "byFields": [
231
+ "borrower",
232
+ "currency"
233
+ ],
234
+ "namespace": "borrower_limit"
235
+ }
236
+ ```
237
+
238
+ ## transitions refs
239
+
240
+ - Scope: action
241
+ - UDL target: `transitionsRefs`
242
+ - Cardinality: many
243
+ - Linear outputs: none
244
+ - Effects: decides.referenced_transition per element
245
+ - Law: Requirements-as-data law and closure law
246
+ - Conformance source: `vocabulary.udl`
247
+
248
+ ```json
249
+ [
250
+ {
251
+ "action": "close",
252
+ "field": "coverId"
253
+ }
254
+ ]
255
+ ```
256
+
7
257
  ## action library
8
258
 
9
259
  - Scope: instrument
@@ -17,7 +267,10 @@ This page lists every entry in `udlClauseVocabulary`. The examples are copied fr
17
267
  ```json
18
268
  {
19
269
  "transfers": {
20
- "actionOrder": ["execute_fund", "execute_release"],
270
+ "actionOrder": [
271
+ "execute_fund",
272
+ "execute_release"
273
+ ],
21
274
  "actions": {
22
275
  "execute_fund": {
23
276
  "approval": "inherit",
@@ -40,7 +293,9 @@ This page lists every entry in `udlClauseVocabulary`. The examples are copied fr
40
293
  "operation": "internal_transfer.create"
41
294
  }
42
295
  ],
43
- "order": ["leaf_fund"],
296
+ "order": [
297
+ "leaf_fund"
298
+ ],
44
299
  "parameters": {
45
300
  "inst": {
46
301
  "kind": "instance"
@@ -73,7 +328,9 @@ This page lists every entry in `udlClauseVocabulary`. The examples are copied fr
73
328
  "operation": "internal_transfer.create"
74
329
  }
75
330
  ],
76
- "order": ["leaf_rel"],
331
+ "order": [
332
+ "leaf_rel"
333
+ ],
77
334
  "parameters": {
78
335
  "inst": {
79
336
  "kind": "instance"
@@ -127,6 +384,52 @@ This page lists every entry in `udlClauseVocabulary`. The examples are copied fr
127
384
  ]
128
385
  ```
129
386
 
387
+ ## requires input
388
+
389
+ - Scope: action
390
+ - UDL target: `requiresInput`
391
+ - Cardinality: one
392
+ - Linear outputs: none
393
+ - Effects: none
394
+ - Law: Requirements-as-data law and closure law
395
+ - Conformance source: `attested.udl`
396
+
397
+ ```json
398
+ {
399
+ "amount": "fields.amount"
400
+ }
401
+ ```
402
+
403
+ ## engine owned
404
+
405
+ - Scope: action
406
+ - UDL target: `engineOwned`
407
+ - Cardinality: one
408
+ - Linear outputs: none
409
+ - Effects: none
410
+ - Law: Requirements-as-data law and closure law
411
+ - Conformance source: `attested.udl`
412
+
413
+ ```json
414
+ true
415
+ ```
416
+
417
+ ## capture engine
418
+
419
+ - Scope: action
420
+ - UDL target: `captureEngine`
421
+ - Cardinality: one
422
+ - Linear outputs: none
423
+ - Effects: none
424
+ - Law: Requirements-as-data law and closure law
425
+ - Conformance source: `attested.udl`
426
+
427
+ ```json
428
+ {
429
+ "consumedByOperationId": "operationId"
430
+ }
431
+ ```
432
+
130
433
  ## capture input
131
434
 
132
435
  - Scope: action
@@ -181,7 +484,10 @@ A commit has no separate effect row. The committing action consumes the quote th
181
484
  "expires": {
182
485
  "offset": "PT15M"
183
486
  },
184
- "fixes": ["amount", "buyerAccountId"],
487
+ "fixes": [
488
+ "amount",
489
+ "buyerAccountId"
490
+ ],
185
491
  "netDestinationField": "buyerAccountId",
186
492
  "netRef": "unwindRefund"
187
493
  }
@@ -258,7 +564,10 @@ A commit has no separate effect row. The committing action consumes the quote th
258
564
  "path": "fields.distributableAmount"
259
565
  },
260
566
  "refField": "repaymentDistributionId",
261
- "statuses": ["recorded", "paid"],
567
+ "statuses": [
568
+ "recorded",
569
+ "paid"
570
+ ],
262
571
  "weightField": "committedWeight"
263
572
  }
264
573
  ```
@@ -351,19 +660,21 @@ true
351
660
  - Linear outputs: none
352
661
  - Effects: none
353
662
  - Law: Requirements-as-data law and closure law
354
- - Conformance source: `cards.udl`
663
+ - Conformance source: `attested.udl`
355
664
 
356
665
  ```json
357
666
  {
358
667
  "additionalProperties": false,
359
668
  "properties": {
360
- "reason": {
361
- "maxLength": 180,
362
- "minLength": 1,
363
- "type": "string"
669
+ "amount": {
670
+ "pattern": "^[1-9][0-9]{0,17}$",
671
+ "type": "string",
672
+ "x-hyperscale-currency": "SAR"
364
673
  }
365
674
  },
366
- "required": ["reason"],
675
+ "required": [
676
+ "amount"
677
+ ],
367
678
  "type": "object"
368
679
  }
369
680
  ```
@@ -416,7 +727,10 @@ true
416
727
 
417
728
  ```json
418
729
  {
419
- "fund_order": ["p1", "p2"],
730
+ "fund_order": [
731
+ "p1",
732
+ "p2"
733
+ ],
420
734
  "id": "split_plan",
421
735
  "pieces": [
422
736
  {
@@ -432,10 +746,18 @@ true
432
746
  "release_to": "p2Release"
433
747
  }
434
748
  ],
435
- "refund_order": ["p1"],
436
- "release_order": ["p1", "p2"],
749
+ "refund_order": [
750
+ "p1"
751
+ ],
752
+ "release_order": [
753
+ "p1",
754
+ "p2"
755
+ ],
437
756
  "total": "totalAmount",
438
- "unfund_order": ["p2", "p1"]
757
+ "unfund_order": [
758
+ "p2",
759
+ "p1"
760
+ ]
439
761
  }
440
762
  ```
441
763
 
@@ -464,11 +786,14 @@ true
464
786
  - Linear outputs: none
465
787
  - Effects: decides.tenant_port per clause
466
788
  - Law: Requirements-as-data law and closure law
467
- - Conformance source: `compiled-crowdfunding.udl`
789
+ - Conformance source: `attested.udl`
468
790
 
469
791
  ```json
470
792
  {
471
- "allowedParties": ["beneficiary"]
793
+ "allowedParties": [
794
+ "decider"
795
+ ],
796
+ "capture": "decidedBy"
472
797
  }
473
798
  ```
474
799
 
@@ -577,7 +902,9 @@ true
577
902
  "instrumentId": "borrower_loan_installment_1_payment",
578
903
  "over": "children",
579
904
  "refField": "borrowerLoanId",
580
- "statuses": ["paid"]
905
+ "statuses": [
906
+ "paid"
907
+ ]
581
908
  }
582
909
  ]
583
910
  ```
@@ -598,7 +925,9 @@ true
598
925
  "checkKind": "identity_verification",
599
926
  "family": "national_identity",
600
927
  "maxAge": "P30D",
601
- "statuses": ["completed"],
928
+ "statuses": [
929
+ "completed"
930
+ ],
602
931
  "subjectField": "subjectId"
603
932
  }
604
933
  ]
@@ -638,7 +967,9 @@ true
638
967
  "capField": "installment1Amount",
639
968
  "capOnAnchor": true,
640
969
  "childInstrumentId": "borrower_loan_installment_1_payment",
641
- "statuses": ["paid"]
970
+ "statuses": [
971
+ "paid"
972
+ ]
642
973
  }
643
974
  ]
644
975
  ```
@@ -651,13 +982,27 @@ true
651
982
  - Linear outputs: none
652
983
  - Effects: reads.requires_refs per clause
653
984
  - Law: Requirements-as-data law and closure law
654
- - Conformance source: `cards.udl`
985
+ - Conformance source: `attested.udl`
655
986
 
656
987
  ```json
657
988
  [
658
989
  {
659
- "field": "cardholderId",
660
- "statuses": ["active"]
990
+ "attests": {
991
+ "action": "fields.actionName",
992
+ "consume": "consume",
993
+ "digest": "fields.digest",
994
+ "expiresAt": "fields.expiry",
995
+ "instrument": "fields.requestInstrument",
996
+ "party": "decider",
997
+ "role": "fields.role"
998
+ },
999
+ "field": "approvalId",
1000
+ "match": {
1001
+ "instrumentInstanceId": "fields.requestId"
1002
+ },
1003
+ "statuses": [
1004
+ "approved"
1005
+ ]
661
1006
  }
662
1007
  ]
663
1008
  ```
@@ -715,7 +1060,9 @@ true
715
1060
  "instrumentId": "seller_payout_capture_entry",
716
1061
  "refField": "sellerPayoutId",
717
1062
  "sign": "add",
718
- "statuses": ["accrued"],
1063
+ "statuses": [
1064
+ "accrued"
1065
+ ],
719
1066
  "subtotalRef": "grossCaptureAmount"
720
1067
  },
721
1068
  {
@@ -723,7 +1070,9 @@ true
723
1070
  "instrumentId": "seller_payout_credit_adjustment",
724
1071
  "refField": "sellerPayoutId",
725
1072
  "sign": "add",
726
- "statuses": ["applied"],
1073
+ "statuses": [
1074
+ "applied"
1075
+ ],
727
1076
  "subtotalRef": "creditAdjustmentAmount"
728
1077
  },
729
1078
  {
@@ -731,7 +1080,9 @@ true
731
1080
  "instrumentId": "seller_payout_debit_adjustment",
732
1081
  "refField": "sellerPayoutId",
733
1082
  "sign": "subtract",
734
- "statuses": ["applied"],
1083
+ "statuses": [
1084
+ "applied"
1085
+ ],
735
1086
  "subtotalRef": "debitAdjustmentAmount"
736
1087
  }
737
1088
  ]
@@ -777,7 +1128,9 @@ true
777
1128
  - Conformance source: `commerce-escrow.udl`
778
1129
 
779
1130
  ```json
780
- ["escrowOrderId"]
1131
+ [
1132
+ "escrowOrderId"
1133
+ ]
781
1134
  ```
782
1135
 
783
1136
  ## notify
@@ -831,14 +1184,18 @@ true
831
1184
  "childField": "amount",
832
1185
  "childInstrumentId": "borrower_loan_installment_1_payment",
833
1186
  "childRefField": "borrowerLoanId",
834
- "childStatuses": ["paid"],
1187
+ "childStatuses": [
1188
+ "paid"
1189
+ ],
835
1190
  "parentField": "installment1Amount"
836
1191
  },
837
1192
  {
838
1193
  "childField": "amount",
839
1194
  "childInstrumentId": "borrower_loan_installment_2_payment",
840
1195
  "childRefField": "borrowerLoanId",
841
- "childStatuses": ["paid"],
1196
+ "childStatuses": [
1197
+ "paid"
1198
+ ],
842
1199
  "parentField": "installment2Amount"
843
1200
  }
844
1201
  ]
@@ -1013,34 +1370,6 @@ true
1013
1370
  "note"
1014
1371
  ```
1015
1372
 
1016
- ## journeys
1017
-
1018
- - Scope: instrument
1019
- - UDL target: `journeys`
1020
- - Cardinality: many
1021
- - Linear outputs: none
1022
- - Effects: none
1023
- - Law: Requirements-as-data law and closure law
1024
- - Conformance source: `hand-edited.udl`
1025
-
1026
- ```json
1027
- [
1028
- {
1029
- "id": "file_note",
1030
- "label": "File a note",
1031
- "steps": [
1032
- {
1033
- "bind": {},
1034
- "example": "default",
1035
- "id": "note",
1036
- "operation": "note.create"
1037
- }
1038
- ],
1039
- "summary": "File a note."
1040
- }
1041
- ]
1042
- ```
1043
-
1044
1373
  ## nav
1045
1374
 
1046
1375
  - Scope: instrument
@@ -1052,7 +1381,10 @@ true
1052
1381
  - Conformance source: `cards.udl`
1053
1382
 
1054
1383
  ```json
1055
- ["Blueprints", "Cardholders"]
1384
+ [
1385
+ "Blueprints",
1386
+ "Cardholders"
1387
+ ]
1056
1388
  ```
1057
1389
 
1058
1390
  ## partitions
@@ -1068,7 +1400,10 @@ true
1068
1400
  ```json
1069
1401
  [
1070
1402
  {
1071
- "pieceFields": ["installment1Amount", "installment2Amount"],
1403
+ "pieceFields": [
1404
+ "installment1Amount",
1405
+ "installment2Amount"
1406
+ ],
1072
1407
  "totalField": "principalAmount"
1073
1408
  }
1074
1409
  ]
@@ -1086,7 +1421,10 @@ true
1086
1421
 
1087
1422
  ```json
1088
1423
  {
1089
- "kinds": ["vehicle", "merchandise"]
1424
+ "kinds": [
1425
+ "vehicle",
1426
+ "merchandise"
1427
+ ]
1090
1428
  }
1091
1429
  ```
1092
1430
 
@@ -1118,6 +1456,25 @@ true
1118
1456
  "public"
1119
1457
  ```
1120
1458
 
1459
+ ## template binding
1460
+
1461
+ - Scope: instrument
1462
+ - UDL target: `templateBinding`
1463
+ - Cardinality: one
1464
+ - Linear outputs: none
1465
+ - Effects: none
1466
+ - Law: Requirements-as-data law and closure law
1467
+ - Conformance source: `vocabulary.udl`
1468
+
1469
+ ```json
1470
+ {
1471
+ "id": "assessment",
1472
+ "parameters": {
1473
+ "cost": true
1474
+ }
1475
+ }
1476
+ ```
1477
+
1121
1478
  ## template id
1122
1479
 
1123
1480
  - Scope: instrument
@@ -1169,7 +1526,38 @@ true
1169
1526
  "name": "update_cardholder_contact"
1170
1527
  }
1171
1528
  ],
1172
- "fields": ["displayName", "email", "phoneNumber"],
1173
- "states": ["pending", "active", "suspended"]
1529
+ "fields": [
1530
+ "displayName",
1531
+ "email",
1532
+ "phoneNumber"
1533
+ ],
1534
+ "states": [
1535
+ "pending",
1536
+ "active",
1537
+ "suspended"
1538
+ ]
1539
+ }
1540
+ ```
1541
+
1542
+ ## request authority
1543
+
1544
+ - Scope: action
1545
+ - UDL target: `requestAuthority`
1546
+ - Cardinality: one
1547
+ - Linear outputs: none
1548
+ - Effects: none
1549
+ - Law: Requirements-as-data law and closure law
1550
+ - Conformance source: `attested.udl`
1551
+
1552
+ ```json
1553
+ {
1554
+ "actionField": "actionName",
1555
+ "digestField": "digest",
1556
+ "expiresField": "expiry",
1557
+ "inputField": "requestInput",
1558
+ "instanceField": "requestId",
1559
+ "instrumentField": "requestInstrument",
1560
+ "party": "decider",
1561
+ "roleField": "role"
1174
1562
  }
1175
1563
  ```