@hyperscale0/udl 1.0.0 → 1.0.123

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 +5 -216
  2. package/LICENSE.md +356 -0
  3. package/NOTICE.md +8 -0
  4. package/README.md +14 -106
  5. package/dist/canonical.d.ts.map +1 -1
  6. package/dist/canonical.js +1 -29
  7. package/dist/canonical.js.map +1 -1
  8. package/dist/diagnostics.d.ts +13 -165
  9. package/dist/diagnostics.d.ts.map +1 -1
  10. package/dist/diagnostics.js +33 -157
  11. package/dist/diagnostics.js.map +1 -1
  12. package/dist/field-value.d.ts +5 -0
  13. package/dist/field-value.d.ts.map +1 -0
  14. package/dist/field-value.js +85 -0
  15. package/dist/field-value.js.map +1 -0
  16. package/dist/finance.d.ts +10 -53
  17. package/dist/finance.d.ts.map +1 -1
  18. package/dist/finance.js +252 -536
  19. package/dist/finance.js.map +1 -1
  20. package/dist/index.d.ts +9 -13
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +9 -9
  23. package/dist/index.js.map +1 -1
  24. package/dist/json.d.ts +2 -0
  25. package/dist/json.d.ts.map +1 -0
  26. package/dist/json.js +30 -0
  27. package/dist/json.js.map +1 -0
  28. package/dist/limits.d.ts +3 -28
  29. package/dist/limits.d.ts.map +1 -1
  30. package/dist/limits.js +5 -31
  31. package/dist/limits.js.map +1 -1
  32. package/dist/object-contract.d.ts +140 -0
  33. package/dist/object-contract.d.ts.map +1 -0
  34. package/dist/object-contract.js +314 -0
  35. package/dist/object-contract.js.map +1 -0
  36. package/dist/object-semantics-schema.d.ts +5710 -0
  37. package/dist/object-semantics-schema.d.ts.map +1 -0
  38. package/dist/object-semantics-schema.js +119 -0
  39. package/dist/object-semantics-schema.js.map +1 -0
  40. package/dist/object-semantics.d.ts +6 -0
  41. package/dist/object-semantics.d.ts.map +1 -0
  42. package/dist/object-semantics.js +279 -0
  43. package/dist/object-semantics.js.map +1 -0
  44. package/dist/object-structures.d.ts +4 -0
  45. package/dist/object-structures.d.ts.map +1 -0
  46. package/dist/object-structures.js +134 -0
  47. package/dist/object-structures.js.map +1 -0
  48. package/dist/reporting-validation.d.ts +8 -0
  49. package/dist/reporting-validation.d.ts.map +1 -0
  50. package/dist/reporting-validation.js +252 -0
  51. package/dist/reporting-validation.js.map +1 -0
  52. package/dist/reporting.d.ts +477 -0
  53. package/dist/reporting.d.ts.map +1 -0
  54. package/dist/reporting.js +169 -0
  55. package/dist/reporting.js.map +1 -0
  56. package/dist/schema.d.ts +5572 -2710
  57. package/dist/schema.d.ts.map +1 -1
  58. package/dist/schema.js +444 -1121
  59. package/dist/schema.js.map +1 -1
  60. package/dist/validation.d.ts +10 -73
  61. package/dist/validation.d.ts.map +1 -1
  62. package/dist/validation.js +1109 -2569
  63. package/dist/validation.js.map +1 -1
  64. package/docs/assets/brand/manifest.json +30 -0
  65. package/docs/assets/brand/udl-horizontal-white.svg +1 -0
  66. package/docs/assets/brand/udl-horizontal.svg +1 -0
  67. package/docs/assets/brand/udl-stacked-white.svg +1 -0
  68. package/docs/assets/brand/udl-stacked.svg +1 -0
  69. package/docs/assets/udl.svg +11 -0
  70. package/package.json +13 -22
  71. package/spec/README.md +300 -172
  72. package/spec/cars.udl.json +249 -0
  73. package/spec/udl.schema.json +3066 -2242
  74. package/src/canonical.ts +1 -35
  75. package/src/diagnostics.ts +76 -209
  76. package/src/field-value.ts +87 -0
  77. package/src/finance.ts +327 -832
  78. package/src/index.ts +18 -95
  79. package/src/json.ts +34 -0
  80. package/src/limits.ts +5 -31
  81. package/src/object-contract.ts +559 -0
  82. package/src/object-semantics-schema.ts +148 -0
  83. package/src/object-semantics.ts +378 -0
  84. package/src/object-structures.ts +255 -0
  85. package/src/reporting-validation.ts +383 -0
  86. package/src/reporting.ts +178 -0
  87. package/src/schema.ts +510 -1277
  88. package/src/validation.ts +1630 -4545
  89. package/LICENSE +0 -661
  90. package/LICENSING.md +0 -51
  91. package/TRADEMARKS.md +0 -35
  92. package/conformance/README.md +0 -82
  93. package/conformance/evolution/action-contract.expected.json +0 -10
  94. package/conformance/evolution/action-contract.live.udl +0 -44
  95. package/conformance/evolution/action-contract.next.udl +0 -45
  96. package/conformance/evolution/product-identity.expected.json +0 -10
  97. package/conformance/evolution/product-identity.live.udl +0 -55
  98. package/conformance/evolution/product-identity.next.udl +0 -55
  99. package/conformance/evolution/version-required.expected.json +0 -10
  100. package/conformance/evolution/version-required.live.udl +0 -55
  101. package/conformance/evolution/version-required.next.udl +0 -58
  102. package/conformance/invalid/action-without-transition.expected.json +0 -10
  103. package/conformance/invalid/action-without-transition.udl +0 -60
  104. package/conformance/invalid/agent-description-too-long.expected.json +0 -10
  105. package/conformance/invalid/agent-description-too-long.udl +0 -57
  106. package/conformance/invalid/blank-title.expected.json +0 -10
  107. package/conformance/invalid/blank-title.udl +0 -54
  108. package/conformance/invalid/composition-dial-duplicate-key.expected.json +0 -10
  109. package/conformance/invalid/composition-dial-duplicate-key.udl +0 -73
  110. package/conformance/invalid/depth-budget.expected.json +0 -10
  111. package/conformance/invalid/depth-budget.udl +0 -49
  112. package/conformance/invalid/duplicate-subject.expected.json +0 -10
  113. package/conformance/invalid/duplicate-subject.udl +0 -230
  114. package/conformance/invalid/forged-effects.expected.json +0 -10
  115. package/conformance/invalid/forged-effects.udl +0 -76
  116. package/conformance/invalid/format-version.expected.json +0 -10
  117. package/conformance/invalid/format-version.udl +0 -54
  118. package/conformance/invalid/instrument-id-not-snake-case.expected.json +0 -10
  119. package/conformance/invalid/instrument-id-not-snake-case.udl +0 -54
  120. package/conformance/invalid/invalid-aggregate-gate-shape.expected.json +0 -10
  121. package/conformance/invalid/invalid-aggregate-gate-shape.udl +0 -1819
  122. package/conformance/invalid/invalid-check-duration.expected.json +0 -10
  123. package/conformance/invalid/invalid-check-duration.udl +0 -219
  124. package/conformance/invalid/invalid-dial-anchor.expected.json +0 -10
  125. package/conformance/invalid/invalid-dial-anchor.udl +0 -219
  126. package/conformance/invalid/invalid-exception-parent-ref.expected.json +0 -10
  127. package/conformance/invalid/invalid-exception-parent-ref.udl +0 -2487
  128. package/conformance/invalid/invalid-exposure-shape.expected.json +0 -10
  129. package/conformance/invalid/invalid-exposure-shape.udl +0 -1819
  130. package/conformance/invalid/invalid-remainder.expected.json +0 -10
  131. package/conformance/invalid/invalid-remainder.udl +0 -220
  132. package/conformance/invalid/invalid-schema-keyword.expected.json +0 -10
  133. package/conformance/invalid/invalid-schema-keyword.udl +0 -220
  134. package/conformance/invalid/invalid-utf8.expected.json +0 -10
  135. package/conformance/invalid/invalid-utf8.udl +0 -1
  136. package/conformance/invalid/malformed-json.expected.json +0 -10
  137. package/conformance/invalid/malformed-json.udl +0 -1
  138. package/conformance/invalid/missing-create-action.expected.json +0 -10
  139. package/conformance/invalid/missing-create-action.udl +0 -48
  140. package/conformance/invalid/missing-exception-amount-field.expected.json +0 -10
  141. package/conformance/invalid/missing-exception-amount-field.udl +0 -2487
  142. package/conformance/invalid/missing-exception-contract.expected.json +0 -14
  143. package/conformance/invalid/missing-exception-contract.udl +0 -2523
  144. package/conformance/invalid/missing-exception-reason-field.expected.json +0 -10
  145. package/conformance/invalid/missing-exception-reason-field.udl +0 -2487
  146. package/conformance/invalid/not-an-object.expected.json +0 -10
  147. package/conformance/invalid/not-an-object.udl +0 -1
  148. package/conformance/invalid/payout-reconcile-not-a-bank-debit.expected.json +0 -10
  149. package/conformance/invalid/payout-reconcile-not-a-bank-debit.udl +0 -259
  150. package/conformance/invalid/quote-freeze-set-incomplete.expected.json +0 -10
  151. package/conformance/invalid/quote-freeze-set-incomplete.udl +0 -261
  152. package/conformance/invalid/quote-named-reference-gate.expected.json +0 -10
  153. package/conformance/invalid/quote-named-reference-gate.udl +0 -50
  154. package/conformance/invalid/reconcile-named-reference-gate.expected.json +0 -10
  155. package/conformance/invalid/reconcile-named-reference-gate.udl +0 -50
  156. package/conformance/invalid/unknown-key.expected.json +0 -10
  157. package/conformance/invalid/unknown-key.udl +0 -55
  158. package/conformance/invalid/unknown-reference-gate-field.expected.json +0 -10
  159. package/conformance/invalid/unknown-reference-gate-field.udl +0 -1819
  160. package/conformance/invalid/unknown-required-field.expected.json +0 -10
  161. package/conformance/invalid/unknown-required-field.udl +0 -220
  162. package/conformance/invalid/unreachable-state.expected.json +0 -10
  163. package/conformance/invalid/unreachable-state.udl +0 -55
  164. package/conformance/invalid/wrong-exception-amount-field.expected.json +0 -10
  165. package/conformance/invalid/wrong-exception-amount-field.udl +0 -2487
  166. package/conformance/invalid/wrong-exception-reason-field.expected.json +0 -10
  167. package/conformance/invalid/wrong-exception-reason-field.udl +0 -2487
  168. package/conformance/valid/agent-description.expected.json +0 -6
  169. package/conformance/valid/agent-description.udl +0 -66
  170. package/conformance/valid/cards.expected.json +0 -6
  171. package/conformance/valid/cards.udl +0 -1579
  172. package/conformance/valid/commerce-escrow.expected.json +0 -6
  173. package/conformance/valid/commerce-escrow.udl +0 -1512
  174. package/conformance/valid/compiled-crowdfunding.expected.json +0 -6
  175. package/conformance/valid/compiled-crowdfunding.udl +0 -1843
  176. package/conformance/valid/compiled-watch-club.expected.json +0 -6
  177. package/conformance/valid/compiled-watch-club.udl +0 -2486
  178. package/conformance/valid/complete-contract.expected.json +0 -6
  179. package/conformance/valid/complete-contract.udl +0 -218
  180. package/conformance/valid/effect-signatures.expected.json +0 -6
  181. package/conformance/valid/effect-signatures.udl +0 -75
  182. package/conformance/valid/hand-edited.expected.json +0 -6
  183. package/conformance/valid/hand-edited.udl +0 -1
  184. package/conformance/valid/insured-car-marketplace.expected.json +0 -6
  185. package/conformance/valid/insured-car-marketplace.udl +0 -1050
  186. package/conformance/valid/insured-travel.expected.json +0 -6
  187. package/conformance/valid/insured-travel.udl +0 -3469
  188. package/conformance/valid/minimal.expected.json +0 -6
  189. package/conformance/valid/minimal.udl +0 -54
  190. package/conformance/valid/protection.expected.json +0 -6
  191. package/conformance/valid/protection.udl +0 -1551
  192. package/conformance/valid/string-escaping.expected.json +0 -6
  193. package/conformance/valid/string-escaping.udl +0 -54
  194. package/dist/check-profiles.d.ts +0 -57
  195. package/dist/check-profiles.d.ts.map +0 -1
  196. package/dist/check-profiles.js +0 -62
  197. package/dist/check-profiles.js.map +0 -1
  198. package/dist/cli.d.ts +0 -3
  199. package/dist/cli.d.ts.map +0 -1
  200. package/dist/cli.js +0 -184
  201. package/dist/cli.js.map +0 -1
  202. package/dist/effects.d.ts +0 -41
  203. package/dist/effects.d.ts.map +0 -1
  204. package/dist/effects.js +0 -110
  205. package/dist/effects.js.map +0 -1
  206. package/dist/evolution.d.ts +0 -120
  207. package/dist/evolution.d.ts.map +0 -1
  208. package/dist/evolution.js +0 -567
  209. package/dist/evolution.js.map +0 -1
  210. package/dist/parser.d.ts +0 -4
  211. package/dist/parser.d.ts.map +0 -1
  212. package/dist/parser.js +0 -44
  213. package/dist/parser.js.map +0 -1
  214. package/docs/README.md +0 -14
  215. package/docs/guide/01-a-document.md +0 -37
  216. package/docs/guide/02-money-steps.md +0 -23
  217. package/docs/guide/03-laws.md +0 -18
  218. package/docs/guide/04-fees-and-remainder.md +0 -15
  219. package/docs/guide/05-checks-updates-dials.md +0 -7
  220. package/docs/guide/06-effects.md +0 -11
  221. package/docs/guide/07-evolution.md +0 -11
  222. package/docs/guide/08-implementing.md +0 -13
  223. package/docs/llms-full.txt +0 -1241
  224. package/docs/llms.txt +0 -14
  225. package/docs/reference/canonical.md +0 -16
  226. package/docs/reference/clauses.md +0 -986
  227. package/docs/reference/cli.md +0 -22
  228. package/docs/reference/diagnostics.md +0 -32
  229. package/skills/udl/SKILL.md +0 -28
  230. package/src/check-profiles.ts +0 -80
  231. package/src/cli.ts +0 -196
  232. package/src/effects.ts +0 -163
  233. package/src/evolution.ts +0 -965
  234. package/src/parser.ts +0 -58
@@ -1,10 +0,0 @@
1
- {
2
- "issues": [
3
- {
4
- "code": "UDL1003",
5
- "path": "$"
6
- }
7
- ],
8
- "summary": "Valid JSON that is not a UDL document.",
9
- "verdict": "invalid"
10
- }
@@ -1 +0,0 @@
1
- "a string"
@@ -1,10 +0,0 @@
1
- {
2
- "issues": [
3
- {
4
- "code": "UDL5005",
5
- "path": "$.instruments[0].actions.settle.reconcile[0].evidence"
6
- }
7
- ],
8
- "summary": "Bank evidence for payouts: an instrument that owns a payout closes it against a debit statement line, never against the provider confirmation of our own instruction.",
9
- "verdict": "invalid"
10
- }
@@ -1,259 +0,0 @@
1
- {
2
- "instruments": [
3
- {
4
- "actionOrder": [
5
- "create",
6
- "instruct",
7
- "settle"
8
- ],
9
- "actions": {
10
- "create": {
11
- "moves": [],
12
- "publicAction": "createSupplierPayout",
13
- "steps": [],
14
- "summary": "Create a supplier payout"
15
- },
16
- "instruct": {
17
- "moves": [],
18
- "payout": {
19
- "amount": "fields.netPayable",
20
- "beneficiaryField": "supplierBeneficiaryId",
21
- "beneficiaryPartyField": "supplierAccountId",
22
- "capture": "payoutId",
23
- "currencyField": "currency",
24
- "sourceAccountField": "treasuryAccountId",
25
- "speed": "standard"
26
- },
27
- "publicAction": "instructSupplierPayout",
28
- "steps": [],
29
- "summary": "Instruct the payout to the supplier"
30
- },
31
- "settle": {
32
- "due": {
33
- "field": "settleBy"
34
- },
35
- "moves": [],
36
- "reconcile": [
37
- {
38
- "amount": "fields.netPayable",
39
- "capture": "settlementEvidenceId",
40
- "counterpartyRef": "payoutId",
41
- "currencyField": "currency",
42
- "direction": "debit",
43
- "evidence": "provider_confirmation",
44
- "exception": {
45
- "amountField": "unmatchedAmount",
46
- "childInstrumentId": "supplier_payout_break",
47
- "maxOpen": 1,
48
- "reasonField": "breakReason",
49
- "refField": "supplierPayoutId"
50
- },
51
- "match": {
52
- "dial": "settlement_tolerance",
53
- "law": "tolerance",
54
- "minorUnits": 100
55
- },
56
- "within": {
57
- "field": "settleBy"
58
- }
59
- }
60
- ],
61
- "steps": [],
62
- "summary": "Match the bank's debit against what the instruction promised"
63
- }
64
- },
65
- "description": "A payout the instrument owns end to end: one instruction, one expectation about the debit it will produce, and one break when the debit never matches",
66
- "dials": [
67
- {
68
- "key": "settlement_tolerance",
69
- "kind": "reconcile_tolerance",
70
- "maxMinorUnits": 500,
71
- "summary": "Largest difference between the instructed amount and the settled debit that still counts as matched.",
72
- "title": "Settlement tolerance"
73
- }
74
- ],
75
- "fields": {
76
- "currency": {
77
- "description": "ISO 4217 currency code",
78
- "maxLength": 3,
79
- "minLength": 3,
80
- "pattern": "^[A-Z]{3}$",
81
- "type": "string"
82
- },
83
- "netPayable": {
84
- "description": "Amount instructed to the supplier in minor units",
85
- "pattern": "^[1-9][0-9]{0,17}$",
86
- "type": "string"
87
- },
88
- "settleBy": {
89
- "description": "Instant the expectation stops waiting and the unmatched amount becomes a break",
90
- "format": "hyperscale-date-time",
91
- "type": "string"
92
- },
93
- "supplierAccountId": {
94
- "description": "The supplier account",
95
- "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
96
- "type": "string",
97
- "x-hyperscale-reference-filter": {
98
- "column": "role",
99
- "values": [
100
- "customer_balance"
101
- ]
102
- }
103
- },
104
- "supplierBeneficiaryId": {
105
- "description": "Beneficiary ID for the payout instruction",
106
- "pattern": "^ben_(sandbox|live)_[a-z0-9]{8,64}$",
107
- "type": "string"
108
- },
109
- "treasuryAccountId": {
110
- "description": "The treasury account the payout leaves",
111
- "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
112
- "type": "string",
113
- "x-hyperscale-reference-filter": {
114
- "column": "role",
115
- "values": [
116
- "customer_balance"
117
- ]
118
- }
119
- }
120
- },
121
- "id": "supplier_payout",
122
- "idPrefix": "sp",
123
- "lifecycle": {
124
- "initial": "created",
125
- "states": [
126
- "created",
127
- "instructed",
128
- "settled"
129
- ],
130
- "transitions": {
131
- "instruct": {
132
- "from": [
133
- "created"
134
- ],
135
- "to": "instructed"
136
- },
137
- "settle": {
138
- "from": [
139
- "instructed"
140
- ],
141
- "to": "settled"
142
- }
143
- }
144
- },
145
- "parties": {
146
- "beneficiary": "supplierAccountId",
147
- "payer": "treasuryAccountId"
148
- },
149
- "required": [
150
- "netPayable",
151
- "supplierAccountId",
152
- "supplierBeneficiaryId",
153
- "currency",
154
- "treasuryAccountId",
155
- "settleBy"
156
- ],
157
- "summary": "Payout from treasury to supplier that is not done until the bank agrees",
158
- "title": "Supplier payout"
159
- },
160
- {
161
- "actionOrder": [
162
- "create",
163
- "carry"
164
- ],
165
- "actions": {
166
- "carry": {
167
- "moves": [],
168
- "publicAction": "carrySupplierPayoutBreak",
169
- "requiresRefs": [
170
- {
171
- "field": "supplierPayoutId",
172
- "match": {
173
- "fields.currency": "fields.currency"
174
- },
175
- "statuses": [
176
- "instructed"
177
- ]
178
- }
179
- ],
180
- "steps": [],
181
- "summary": "Carry the break to whoever owns it"
182
- },
183
- "create": {
184
- "moves": [],
185
- "publicAction": "createSupplierPayoutBreak",
186
- "requiresRefs": [
187
- {
188
- "field": "supplierPayoutId",
189
- "match": {
190
- "fields.currency": "fields.currency"
191
- },
192
- "statuses": [
193
- "instructed"
194
- ]
195
- }
196
- ],
197
- "steps": [],
198
- "summary": "Raise a break against an instructed payout"
199
- }
200
- },
201
- "description": "One break raised when a payout expectation reached its window with no matching debit; it is carried, never silently dropped",
202
- "fields": {
203
- "breakReason": {
204
- "description": "Why the expectation went unmatched",
205
- "maxLength": 180,
206
- "minLength": 1,
207
- "type": "string"
208
- },
209
- "currency": {
210
- "description": "ISO 4217 currency code",
211
- "maxLength": 3,
212
- "minLength": 3,
213
- "pattern": "^[A-Z]{3}$",
214
- "type": "string"
215
- },
216
- "supplierPayoutId": {
217
- "description": "Payout whose expectation broke",
218
- "pattern": "^sp_(sandbox|live)_[a-z0-9]{8,64}$",
219
- "type": "string"
220
- },
221
- "unmatchedAmount": {
222
- "description": "Difference between the instructed amount and the evidence, in minor units",
223
- "pattern": "^[1-9][0-9]{0,17}$",
224
- "type": "string"
225
- }
226
- },
227
- "id": "supplier_payout_break",
228
- "idPrefix": "spbk",
229
- "lifecycle": {
230
- "initial": "created",
231
- "states": [
232
- "created",
233
- "carried"
234
- ],
235
- "transitions": {
236
- "carry": {
237
- "from": [
238
- "created"
239
- ],
240
- "to": "carried"
241
- }
242
- }
243
- },
244
- "required": [
245
- "breakReason",
246
- "currency",
247
- "unmatchedAmount",
248
- "supplierPayoutId"
249
- ],
250
- "summary": "Unmatched settlement expectation carried as its own row",
251
- "title": "Supplier payout Break"
252
- }
253
- ],
254
- "product": "supplier_settlement",
255
- "subjects": [],
256
- "title": "Supplier settlement",
257
- "udl": 1,
258
- "version": 1
259
- }
@@ -1,10 +0,0 @@
1
- {
2
- "issues": [
3
- {
4
- "code": "UDL5006",
5
- "path": "$.instruments[0].actions.quote.quote.baseField"
6
- }
7
- ],
8
- "summary": "Freeze set completeness: an offer must freeze the base amount it prices and the account it pays, or the commit fingerprints values the price never pinned.",
9
- "verdict": "invalid"
10
- }
@@ -1,261 +0,0 @@
1
- {
2
- "instruments": [
3
- {
4
- "actionOrder": [
5
- "create",
6
- "fund",
7
- "dispute",
8
- "quote",
9
- "refund"
10
- ],
11
- "actions": {
12
- "create": {
13
- "description": "Opens escrow against an active listing and provisions its dedicated product escrow account. The amount, currency, and seller are derived from the locked listing -- never caller-supplied -- so escrow economics are the listing's by construction.",
14
- "moves": [],
15
- "steps": [
16
- {
17
- "bind": {
18
- "currency": {
19
- "from": "instance",
20
- "path": "fields.currency"
21
- },
22
- "owner.id": {
23
- "from": "instance",
24
- "path": "productId"
25
- },
26
- "owner.type": {
27
- "from": "const",
28
- "value": "product"
29
- },
30
- "productId": {
31
- "from": "instance",
32
- "path": "productId"
33
- },
34
- "role": {
35
- "from": "const",
36
- "value": "product_escrow"
37
- }
38
- },
39
- "capture": {
40
- "escrowAccountId": "accountId"
41
- },
42
- "operation": "account.escrow.provision"
43
- }
44
- ],
45
- "summary": "Create an escrow order"
46
- },
47
- "dispute": {
48
- "description": "Freezes the fully funded escrow before either milestone releases, preserving the entire balance while the parties decide what happens next.",
49
- "moves": [],
50
- "steps": [],
51
- "summary": "Dispute an escrow order"
52
- },
53
- "fund": {
54
- "description": "Moves the full purchase amount from the buyer account into the dedicated escrow account while the listing remains active.",
55
- "moves": [
56
- {
57
- "bind": {
58
- "amount": {
59
- "from": "instance",
60
- "path": "fields.amount"
61
- },
62
- "currency": {
63
- "from": "instance",
64
- "path": "fields.currency"
65
- },
66
- "destinationAccountId": {
67
- "from": "instance",
68
- "path": "refs.escrowAccountId"
69
- },
70
- "productId": {
71
- "from": "instance",
72
- "path": "productId"
73
- },
74
- "sourceAccountId": {
75
- "from": "instance",
76
- "path": "fields.buyerAccountId"
77
- }
78
- },
79
- "capture": {
80
- "fundTransferId": "transferId"
81
- },
82
- "key": "transfer",
83
- "operation": "internal_transfer.create"
84
- }
85
- ],
86
- "sandboxFailurePoint": "funding",
87
- "steps": [],
88
- "summary": "Fund an escrow order"
89
- },
90
- "quote": {
91
- "description": "Calculates the full buyer refund while disputed and parks the escrow for explicit confirmation. No money moves at quote time.",
92
- "moves": [],
93
- "quote": {
94
- "baseField": "amount",
95
- "chargeRef": "unwindPenalty",
96
- "charges": [
97
- {
98
- "bps": 0
99
- }
100
- ],
101
- "expires": {
102
- "offset": "PT15M"
103
- },
104
- "fixes": [
105
- "buyerAccountId"
106
- ],
107
- "netDestinationField": "buyerAccountId",
108
- "netRef": "unwindRefund"
109
- },
110
- "steps": [],
111
- "summary": "Quote an escrow refund"
112
- },
113
- "refund": {
114
- "commit": "quote",
115
- "description": "Confirms the quoted retreat and returns the full held amount from escrow to the buyer.",
116
- "moves": [
117
- {
118
- "bind": {
119
- "amount": {
120
- "from": "instance",
121
- "path": "refs.unwindRefund"
122
- },
123
- "currency": {
124
- "from": "instance",
125
- "path": "fields.currency"
126
- },
127
- "destinationAccountId": {
128
- "from": "instance",
129
- "path": "fields.buyerAccountId"
130
- },
131
- "productId": {
132
- "from": "instance",
133
- "path": "productId"
134
- },
135
- "sourceAccountId": {
136
- "from": "instance",
137
- "path": "refs.escrowAccountId"
138
- }
139
- },
140
- "capture": {
141
- "refundTransferId": "transferId"
142
- },
143
- "key": "transfer",
144
- "operation": "internal_transfer.create"
145
- }
146
- ],
147
- "steps": [],
148
- "summary": "Refund an escrow order"
149
- }
150
- },
151
- "callerParkedStates": {
152
- "created": "expire fires only when fundBy is set; without a funding deadline the escrow waits on the buyer to fund or cancel",
153
- "disputed": "dispute resolution is a human judgment; the parties resume the escrow or quote a refund",
154
- "funded": "releasing or disputing held value is a party decision; escrow deliberately holds until the parties act",
155
- "refund_quoted": "a quoted refund moves money only when the caller confirms it"
156
- },
157
- "description": "An escrow order holds the full purchase amount and releases it to the seller exactly once. Before release, a dispute freezes the full balance until work resumes or a quoted refund is confirmed.",
158
- "fields": {
159
- "amount": {
160
- "description": "Positive minor-unit integer amount serialized as a string (at most 18 digits)",
161
- "pattern": "^[1-9][0-9]{0,17}$",
162
- "type": "string"
163
- },
164
- "buyerAccountId": {
165
- "description": "Hyperscale account ID",
166
- "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
167
- "type": "string",
168
- "x-hyperscale-reference-filter": {
169
- "column": "role",
170
- "values": [
171
- "customer_balance"
172
- ]
173
- }
174
- },
175
- "currency": {
176
- "description": "ISO 4217 currency code",
177
- "maxLength": 3,
178
- "minLength": 3,
179
- "pattern": "^[A-Z]{3}$",
180
- "type": "string"
181
- },
182
- "fundBy": {
183
- "format": "hyperscale-date-time",
184
- "type": "string"
185
- },
186
- "memo": {
187
- "maxLength": 180,
188
- "minLength": 1,
189
- "type": "string"
190
- },
191
- "sellerAccountId": {
192
- "description": "Hyperscale account ID",
193
- "pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
194
- "type": "string",
195
- "x-hyperscale-reference-filter": {
196
- "column": "role",
197
- "values": [
198
- "customer_balance"
199
- ]
200
- }
201
- }
202
- },
203
- "id": "escrow_order",
204
- "idPrefix": "eord",
205
- "lifecycle": {
206
- "initial": "created",
207
- "states": [
208
- "created",
209
- "funded",
210
- "disputed",
211
- "refunded",
212
- "refund_quoted"
213
- ],
214
- "transitions": {
215
- "dispute": {
216
- "from": [
217
- "funded"
218
- ],
219
- "to": "disputed"
220
- },
221
- "fund": {
222
- "from": [
223
- "created"
224
- ],
225
- "to": "funded"
226
- },
227
- "quote": {
228
- "from": [
229
- "disputed"
230
- ],
231
- "to": "refund_quoted"
232
- },
233
- "refund": {
234
- "from": [
235
- "refund_quoted"
236
- ],
237
- "to": "refunded"
238
- }
239
- }
240
- },
241
- "parties": {
242
- "beneficiary": "sellerAccountId",
243
- "payer": "buyerAccountId"
244
- },
245
- "required": [
246
- "buyerAccountId",
247
- "sellerAccountId",
248
- "amount",
249
- "currency"
250
- ],
251
- "summary": "An escrow order whose refund quote omits its own base field.",
252
- "templateId": "escrow",
253
- "title": "Escrow order"
254
- }
255
- ],
256
- "product": "quote_freeze_set",
257
- "subjects": [],
258
- "title": "Quote freeze set",
259
- "udl": 1,
260
- "version": 1
261
- }
@@ -1,10 +0,0 @@
1
- {
2
- "issues": [
3
- {
4
- "code": "UDL5001",
5
- "path": "$.instruments[0].actions.quote.requiresRefs[0].field"
6
- }
7
- ],
8
- "summary": "An action named quote does not change the code for an ordinary reference-gate defect.",
9
- "verdict": "invalid"
10
- }
@@ -1,50 +0,0 @@
1
- {
2
- "instruments": [
3
- {
4
- "actionOrder": ["create", "quote"],
5
- "actions": {
6
- "create": {
7
- "moves": [],
8
- "steps": [],
9
- "summary": "File the note."
10
- },
11
- "quote": {
12
- "moves": [],
13
- "requiresRefs": [
14
- {
15
- "field": "reference",
16
- "statuses": ["open"]
17
- }
18
- ],
19
- "steps": [],
20
- "summary": "Close the note."
21
- }
22
- },
23
- "fields": {
24
- "reference": {
25
- "type": "string"
26
- }
27
- },
28
- "id": "note",
29
- "idPrefix": "note",
30
- "lifecycle": {
31
- "initial": "open",
32
- "states": ["open", "closed"],
33
- "transitions": {
34
- "quote": {
35
- "from": ["open"],
36
- "to": "closed"
37
- }
38
- }
39
- },
40
- "required": ["reference"],
41
- "summary": "A note a tenant files and later closes.",
42
- "title": "Note"
43
- }
44
- ],
45
- "product": "quote_named_reference_gate",
46
- "subjects": [],
47
- "title": "Quote named reference gate",
48
- "udl": 1,
49
- "version": 1
50
- }
@@ -1,10 +0,0 @@
1
- {
2
- "issues": [
3
- {
4
- "code": "UDL5001",
5
- "path": "$.instruments[0].actions.reconcile.requiresRefs[0].field"
6
- }
7
- ],
8
- "summary": "An action named reconcile does not change the code for an ordinary reference-gate defect.",
9
- "verdict": "invalid"
10
- }
@@ -1,50 +0,0 @@
1
- {
2
- "instruments": [
3
- {
4
- "actionOrder": ["create", "reconcile"],
5
- "actions": {
6
- "create": {
7
- "moves": [],
8
- "steps": [],
9
- "summary": "File the note."
10
- },
11
- "reconcile": {
12
- "moves": [],
13
- "requiresRefs": [
14
- {
15
- "field": "reference",
16
- "statuses": ["open"]
17
- }
18
- ],
19
- "steps": [],
20
- "summary": "Close the note."
21
- }
22
- },
23
- "fields": {
24
- "reference": {
25
- "type": "string"
26
- }
27
- },
28
- "id": "note",
29
- "idPrefix": "note",
30
- "lifecycle": {
31
- "initial": "open",
32
- "states": ["open", "closed"],
33
- "transitions": {
34
- "reconcile": {
35
- "from": ["open"],
36
- "to": "closed"
37
- }
38
- }
39
- },
40
- "required": ["reference"],
41
- "summary": "A note a tenant files and later closes.",
42
- "title": "Note"
43
- }
44
- ],
45
- "product": "reconcile_named_reference_gate",
46
- "subjects": [],
47
- "title": "Reconcile named reference gate",
48
- "udl": 1,
49
- "version": 1
50
- }
@@ -1,10 +0,0 @@
1
- {
2
- "issues": [
3
- {
4
- "code": "UDL1003",
5
- "path": "$"
6
- }
7
- ],
8
- "summary": "The grammar is closed: an unrecognized top-level key is refused, never ignored.",
9
- "verdict": "invalid"
10
- }