@hyperscale0/hsx 1.0.0-beta.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/CHANGELOG.md +58 -9
  2. package/LICENSING.md +3 -3
  3. package/README.md +39 -149
  4. package/TRADEMARKS.md +4 -4
  5. package/bin/hsx.ts +2 -0
  6. package/dist/bin/hsx.js +2 -0
  7. package/dist/bin/hsx.js.map +1 -1
  8. package/dist/src/ast.d.ts +135 -10
  9. package/dist/src/ast.d.ts.map +1 -1
  10. package/dist/src/ast.js +24 -0
  11. package/dist/src/ast.js.map +1 -1
  12. package/dist/src/cli.d.ts +4 -1
  13. package/dist/src/cli.d.ts.map +1 -1
  14. package/dist/src/cli.js +172 -16
  15. package/dist/src/cli.js.map +1 -1
  16. package/dist/src/compile.d.ts +42 -7
  17. package/dist/src/compile.d.ts.map +1 -1
  18. package/dist/src/compile.js +82 -16
  19. package/dist/src/compile.js.map +1 -1
  20. package/dist/src/cost.d.ts +78 -0
  21. package/dist/src/cost.d.ts.map +1 -0
  22. package/dist/src/cost.js +369 -0
  23. package/dist/src/cost.js.map +1 -0
  24. package/dist/src/diagnostics.d.ts +11 -0
  25. package/dist/src/diagnostics.d.ts.map +1 -0
  26. package/dist/src/diagnostics.js +420 -0
  27. package/dist/src/diagnostics.js.map +1 -0
  28. package/dist/src/emit.d.ts +34 -0
  29. package/dist/src/emit.d.ts.map +1 -0
  30. package/dist/src/emit.js +137 -0
  31. package/dist/src/emit.js.map +1 -0
  32. package/dist/src/entry-overrides.d.ts +17 -3
  33. package/dist/src/entry-overrides.d.ts.map +1 -1
  34. package/dist/src/entry-overrides.js +180 -35
  35. package/dist/src/entry-overrides.js.map +1 -1
  36. package/dist/src/format.d.ts +10 -0
  37. package/dist/src/format.d.ts.map +1 -0
  38. package/dist/src/format.js +183 -0
  39. package/dist/src/format.js.map +1 -0
  40. package/dist/src/index.d.ts +11 -4
  41. package/dist/src/index.d.ts.map +1 -1
  42. package/dist/src/index.js +10 -3
  43. package/dist/src/index.js.map +1 -1
  44. package/dist/src/ir.d.ts +66 -0
  45. package/dist/src/ir.d.ts.map +1 -0
  46. package/dist/src/ir.js +15 -0
  47. package/dist/src/ir.js.map +1 -0
  48. package/dist/src/lex.d.ts +9 -1
  49. package/dist/src/lex.d.ts.map +1 -1
  50. package/dist/src/lex.js +50 -4
  51. package/dist/src/lex.js.map +1 -1
  52. package/dist/src/limits.d.ts +2 -3
  53. package/dist/src/limits.d.ts.map +1 -1
  54. package/dist/src/limits.js +2 -3
  55. package/dist/src/limits.js.map +1 -1
  56. package/dist/src/lsp/server.d.ts +32 -0
  57. package/dist/src/lsp/server.d.ts.map +1 -0
  58. package/dist/src/lsp/server.js +391 -0
  59. package/dist/src/lsp/server.js.map +1 -0
  60. package/dist/src/modules.d.ts +38 -0
  61. package/dist/src/modules.d.ts.map +1 -0
  62. package/dist/src/modules.js +368 -0
  63. package/dist/src/modules.js.map +1 -0
  64. package/dist/src/parse.d.ts.map +1 -1
  65. package/dist/src/parse.js +590 -17
  66. package/dist/src/parse.js.map +1 -1
  67. package/dist/src/std-bundle.d.ts +2 -0
  68. package/dist/src/std-bundle.d.ts.map +1 -0
  69. package/dist/src/std-bundle.js +88 -0
  70. package/dist/src/std-bundle.js.map +1 -0
  71. package/dist/src/std-library.d.ts +5 -0
  72. package/dist/src/std-library.d.ts.map +1 -0
  73. package/dist/src/std-library.js +9 -0
  74. package/dist/src/std-library.js.map +1 -0
  75. package/dist/src/typecheck.d.ts +8 -0
  76. package/dist/src/typecheck.d.ts.map +1 -0
  77. package/dist/src/typecheck.js +2958 -0
  78. package/dist/src/typecheck.js.map +1 -0
  79. package/dist/src/version.d.ts +4 -15
  80. package/dist/src/version.d.ts.map +1 -1
  81. package/dist/src/version.js +4 -15
  82. package/dist/src/version.js.map +1 -1
  83. package/docs/README.md +26 -0
  84. package/docs/guide/01-first-program.md +24 -0
  85. package/docs/guide/02-money.md +25 -0
  86. package/docs/guide/03-instruments.md +22 -0
  87. package/docs/guide/04-lifecycles.md +25 -0
  88. package/docs/guide/05-fees-and-splits.md +45 -0
  89. package/docs/guide/06-schedules.md +22 -0
  90. package/docs/guide/07-composition.md +46 -0
  91. package/docs/guide/08-writing-a-module.md +26 -0
  92. package/docs/guide/09-cost.md +24 -0
  93. package/docs/guide/10-diagnostics.md +27 -0
  94. package/docs/llms-full.txt +1739 -0
  95. package/docs/llms.txt +45 -0
  96. package/docs/playground.md +54 -0
  97. package/docs/reference/cli.md +35 -0
  98. package/docs/reference/diagnostics.md +619 -0
  99. package/docs/reference/grammar.md +39 -0
  100. package/docs/reference/std/advance.md +35 -0
  101. package/docs/reference/std/cancellable_booking.md +35 -0
  102. package/docs/reference/std/captured_payment.md +43 -0
  103. package/docs/reference/std/conditional_disbursement.md +33 -0
  104. package/docs/reference/std/credit_facility.md +35 -0
  105. package/docs/reference/std/held_payment.md +64 -0
  106. package/docs/reference/std/instant_transfer.md +30 -0
  107. package/docs/reference/std/metered.md +27 -0
  108. package/docs/reference/std/pooled_split.md +26 -0
  109. package/docs/reference/std/premium_forward.md +39 -0
  110. package/docs/reference/std/reconciled_payout.md +33 -0
  111. package/docs/reference/std/recurring_collection.md +25 -0
  112. package/docs/reference/std/rotating_pool.md +42 -0
  113. package/docs/reference/std/scheduled.md +51 -0
  114. package/docs/reference/std/security_deposit.md +46 -0
  115. package/docs/reference/std/settlement_batch.md +42 -0
  116. package/docs/reference/std/swap.md +46 -0
  117. package/docs/reference/std/threshold_pool.md +47 -0
  118. package/docs/reference/std/weighted_distribution.md +39 -0
  119. package/docs/reference/types.md +20 -0
  120. package/docs/reference/udl-output.md +13 -0
  121. package/docs/sessions/2026-09-02-two-instruments.hsx +21 -0
  122. package/docs/sessions/2026-09-02-two-instruments.md +41 -0
  123. package/examples/01-first-program/README.md +45 -0
  124. package/examples/01-first-program/tip-jar.hsx +17 -0
  125. package/examples/02-imports-and-archetypes/README.md +96 -0
  126. package/examples/02-imports-and-archetypes/photo-booth.hsx +37 -0
  127. package/examples/03-diagnostics/README.md +68 -0
  128. package/examples/03-diagnostics/corner-shop-fixed.hsx +22 -0
  129. package/examples/03-diagnostics/corner-shop.hsx +19 -0
  130. package/examples/04-complete-product/README.md +84 -0
  131. package/examples/04-complete-product/study-hall.hsx +67 -0
  132. package/examples/05-watch-club/README.md +9 -0
  133. package/examples/05-watch-club/watch-club.hsx +124 -0
  134. package/examples/README.md +18 -0
  135. package/examples/advance/README.md +3 -0
  136. package/examples/advance/advance.hsx +13 -0
  137. package/examples/advance/advance.udl +339 -0
  138. package/examples/cancellable_booking/README.md +3 -0
  139. package/examples/cancellable_booking/cancellable_booking.hsx +14 -0
  140. package/examples/cancellable_booking/cancellable_booking.udl +391 -0
  141. package/examples/captured_payment/README.md +3 -0
  142. package/examples/captured_payment/captured_payment.hsx +21 -0
  143. package/examples/captured_payment/captured_payment.udl +677 -0
  144. package/examples/conditional_disbursement/README.md +3 -0
  145. package/examples/conditional_disbursement/conditional_disbursement.hsx +17 -0
  146. package/examples/conditional_disbursement/conditional_disbursement.udl +412 -0
  147. package/examples/cost-table.json +386 -0
  148. package/examples/credit_facility/README.md +3 -0
  149. package/examples/credit_facility/credit_facility.hsx +27 -0
  150. package/examples/credit_facility/credit_facility.udl +1373 -0
  151. package/examples/held_payment/README.md +3 -0
  152. package/examples/held_payment/held_payment.hsx +13 -0
  153. package/examples/held_payment/held_payment.udl +507 -0
  154. package/examples/instant_transfer/README.md +3 -0
  155. package/examples/instant_transfer/instant_transfer.hsx +16 -0
  156. package/examples/instant_transfer/instant_transfer.udl +364 -0
  157. package/examples/metered/README.md +3 -0
  158. package/examples/metered/metered.hsx +13 -0
  159. package/examples/metered/metered.udl +247 -0
  160. package/examples/pooled_split/README.md +3 -0
  161. package/examples/pooled_split/pooled_split.hsx +15 -0
  162. package/examples/pooled_split/pooled_split.udl +425 -0
  163. package/examples/premium_forward/README.md +3 -0
  164. package/examples/premium_forward/premium_forward.hsx +19 -0
  165. package/examples/premium_forward/premium_forward.udl +594 -0
  166. package/examples/reconciled_payout/README.md +3 -0
  167. package/examples/reconciled_payout/reconciled_payout.hsx +13 -0
  168. package/examples/reconciled_payout/reconciled_payout.udl +303 -0
  169. package/examples/recurring_collection/README.md +3 -0
  170. package/examples/recurring_collection/recurring_collection.hsx +21 -0
  171. package/examples/recurring_collection/recurring_collection.udl +1130 -0
  172. package/examples/rotating_pool/README.md +3 -0
  173. package/examples/rotating_pool/rotating_pool.hsx +18 -0
  174. package/examples/rotating_pool/rotating_pool.udl +4352 -0
  175. package/examples/scheduled/README.md +3 -0
  176. package/examples/scheduled/scheduled.hsx +12 -0
  177. package/examples/scheduled/scheduled.udl +335 -0
  178. package/examples/security_deposit/README.md +3 -0
  179. package/examples/security_deposit/security_deposit.hsx +21 -0
  180. package/examples/security_deposit/security_deposit.udl +293 -0
  181. package/examples/settlement_batch/README.md +3 -0
  182. package/examples/settlement_batch/settlement_batch.hsx +19 -0
  183. package/examples/settlement_batch/settlement_batch.udl +753 -0
  184. package/examples/swap/README.md +3 -0
  185. package/examples/swap/swap.hsx +19 -0
  186. package/examples/swap/swap.udl +876 -0
  187. package/examples/threshold_pool/README.md +3 -0
  188. package/examples/threshold_pool/threshold_pool.hsx +16 -0
  189. package/examples/threshold_pool/threshold_pool.udl +667 -0
  190. package/examples/weighted_distribution/README.md +3 -0
  191. package/examples/weighted_distribution/weighted_distribution.hsx +20 -0
  192. package/examples/weighted_distribution/weighted_distribution.udl +337 -0
  193. package/package.json +27 -6
  194. package/skills/hsx/SKILL.md +483 -0
  195. package/src/ast.ts +193 -9
  196. package/src/cli.ts +191 -20
  197. package/src/compile.ts +160 -23
  198. package/src/cost.ts +579 -0
  199. package/src/diagnostics.ts +442 -0
  200. package/src/emit.ts +201 -0
  201. package/src/entry-overrides.ts +263 -48
  202. package/src/format.ts +261 -0
  203. package/src/index.ts +34 -4
  204. package/src/ir.ts +99 -0
  205. package/src/lex.ts +59 -4
  206. package/src/limits.ts +2 -3
  207. package/src/lsp/server.ts +460 -0
  208. package/src/modules.ts +446 -0
  209. package/src/parse.ts +655 -21
  210. package/src/std-bundle.ts +91 -0
  211. package/src/std-library.ts +12 -0
  212. package/src/typecheck.ts +3876 -0
  213. package/src/version.ts +4 -16
  214. package/std/SEMANTICS.md +130 -0
  215. package/std/settlements/advance.hsx +177 -0
  216. package/std/settlements/cancellable_booking.hsx +87 -0
  217. package/std/settlements/captured_payment.hsx +144 -0
  218. package/std/settlements/conditional_disbursement.hsx +185 -0
  219. package/std/settlements/credit_facility.hsx +167 -0
  220. package/std/settlements/held_payment.hsx +578 -0
  221. package/std/settlements/index.hsx +3 -0
  222. package/std/settlements/instant_transfer.hsx +190 -0
  223. package/std/settlements/metered.hsx +67 -0
  224. package/std/settlements/pooled_split.hsx +68 -0
  225. package/std/settlements/premium_forward.hsx +257 -0
  226. package/std/settlements/reconciled_payout.hsx +77 -0
  227. package/std/settlements/recurring_collection.hsx +27 -0
  228. package/std/settlements/rotating_pool.hsx +252 -0
  229. package/std/settlements/scheduled.hsx +641 -0
  230. package/std/settlements/security_deposit.hsx +166 -0
  231. package/std/settlements/settlement_batch.hsx +122 -0
  232. package/std/settlements/swap.hsx +1114 -0
  233. package/std/settlements/threshold_pool.hsx +221 -0
  234. package/std/settlements/weighted_distribution.hsx +141 -0
  235. package/dist/src/archetypes.d.ts +0 -17
  236. package/dist/src/archetypes.d.ts.map +0 -1
  237. package/dist/src/archetypes.js +0 -327
  238. package/dist/src/archetypes.js.map +0 -1
  239. package/dist/src/check.d.ts +0 -12
  240. package/dist/src/check.d.ts.map +0 -1
  241. package/dist/src/check.js +0 -1910
  242. package/dist/src/check.js.map +0 -1
  243. package/dist/src/lower.d.ts +0 -146
  244. package/dist/src/lower.d.ts.map +0 -1
  245. package/dist/src/lower.js +0 -4570
  246. package/dist/src/lower.js.map +0 -1
  247. package/dist/src/model.d.ts +0 -467
  248. package/dist/src/model.d.ts.map +0 -1
  249. package/dist/src/model.js +0 -15
  250. package/dist/src/model.js.map +0 -1
  251. package/spec/hsx-ir.schema.json +0 -920
  252. package/src/archetypes.ts +0 -340
  253. package/src/check.ts +0 -2938
  254. package/src/lower.ts +0 -5416
  255. package/src/model.ts +0 -519
@@ -1,920 +0,0 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://github.com/hyperscale0/hyperscale-hsx/spec/hsx-ir.schema.json",
4
- "title": "HSX compile artifacts",
5
- "description": "What `compile()` produces when the verdict is `valid` or `warning`, and what `hsx build` writes: the HSX-JSON IR document a runtime executes, plus the congruent Business Frame that describes the same product in business terms. This schema covers what the compiler EMITS. A runtime may accept a wider grammar; nothing the compiler emits may fall outside this file.",
6
- "type": "object",
7
- "required": ["document", "frame"],
8
- "additionalProperties": false,
9
- "properties": {
10
- "document": { "$ref": "#/$defs/document" },
11
- "frame": { "$ref": "#/$defs/frame" }
12
- },
13
-
14
- "$defs": {
15
- "snakeName": {
16
- "type": "string",
17
- "minLength": 1,
18
- "maxLength": 48,
19
- "pattern": "^[a-z][a-z0-9_]*$"
20
- },
21
- "camelName": {
22
- "type": "string",
23
- "minLength": 1,
24
- "maxLength": 48,
25
- "pattern": "^[a-z][A-Za-z0-9]*$"
26
- },
27
- "nounRefPath": {
28
- "type": "string",
29
- "pattern": "^(fields|refs)\\.[a-z][A-Za-z0-9]*$|^nounInstanceId$"
30
- },
31
- "instanceValuePath": {
32
- "type": "string",
33
- "pattern": "^(fields|refs)\\.[a-z][A-Za-z0-9]*$"
34
- },
35
- "endpoint": {
36
- "description": "A party name, or one of the two endpoints every settlement has without declaring them: `platform` and `escrow`.",
37
- "type": "string",
38
- "minLength": 1,
39
- "maxLength": 48
40
- },
41
- "isoDuration": {
42
- "description": "A fixed ISO-8601 duration. Calendar months never appear: they drift, so they cannot anchor an exact money deadline.",
43
- "type": "string",
44
- "minLength": 1,
45
- "maxLength": 24,
46
- "pattern": "^P([0-9]+[WDHMS]|T[0-9]+[HMS])"
47
- },
48
- "prose": { "type": "string", "minLength": 1, "maxLength": 400 },
49
-
50
- "document": {
51
- "title": "HSX-JSON IR document",
52
- "description": "One compiled program. Every settlement in the source becomes one noun; every noun carries its money fields, its conservation partitions, and one verb per admissible lifecycle step.",
53
- "type": "object",
54
- "required": ["hsx", "nouns", "product", "title"],
55
- "additionalProperties": false,
56
- "properties": {
57
- "hsx": {
58
- "description": "The IR format version. A consumer reads this integer to decide whether it understands the document.",
59
- "const": 1
60
- },
61
- "product": {
62
- "description": "The program name from the `program` header.",
63
- "$ref": "#/$defs/snakeName"
64
- },
65
- "title": {
66
- "description": "The program's human title, from the header string or derived from its name.",
67
- "type": "string",
68
- "minLength": 1,
69
- "maxLength": 80
70
- },
71
- "subjects": {
72
- "description": "One entry per declared asset: the non-money thing the settlements are about.",
73
- "type": "array",
74
- "maxItems": 6,
75
- "items": {
76
- "type": "object",
77
- "required": ["kind", "title", "value"],
78
- "additionalProperties": false,
79
- "properties": {
80
- "kind": { "$ref": "#/$defs/snakeName" },
81
- "title": { "type": "string", "minLength": 1, "maxLength": 60 },
82
- "value": { "enum": ["none", "optional", "required"] }
83
- }
84
- }
85
- },
86
- "nouns": {
87
- "type": "array",
88
- "maxItems": 8,
89
- "items": { "$ref": "#/$defs/noun" }
90
- }
91
- }
92
- },
93
-
94
- "noun": {
95
- "description": "One lowered settlement.",
96
- "type": "object",
97
- "required": ["id", "summary", "title", "verbs"],
98
- "additionalProperties": false,
99
- "properties": {
100
- "id": {
101
- "description": "The settlement's own name. Settlement names are noun ids; nothing renames them.",
102
- "$ref": "#/$defs/snakeName"
103
- },
104
- "prefix": {
105
- "description": "Optional explicit letter-only instance id prefix for generated child nouns.",
106
- "type": "string",
107
- "pattern": "^[a-z]{2,8}$"
108
- },
109
- "title": { "type": "string", "minLength": 1, "maxLength": 60 },
110
- "summary": { "type": "string", "minLength": 1, "maxLength": 200 },
111
- "desc": { "type": "string", "minLength": 1, "maxLength": 400 },
112
- "escrow": {
113
- "description": "Present and true when this settlement takes custody of money in its own escrow account.",
114
- "const": true
115
- },
116
- "distinctParties": {
117
- "description": "Present and true when two of this settlement's roles must be different parties at runtime.",
118
- "const": true
119
- },
120
- "actors": {
121
- "type": "object",
122
- "propertyNames": { "$ref": "#/$defs/snakeName" },
123
- "additionalProperties": { "enum": ["payer", "beneficiary", "party"] }
124
- },
125
- "aggregateInvariants": {
126
- "description": "Per-parent caps over generated child nouns, enforced under the parent lock before a child enters a counted status.",
127
- "type": "array",
128
- "minItems": 1,
129
- "maxItems": 12,
130
- "items": {
131
- "oneOf": [
132
- {
133
- "type": "object",
134
- "required": [
135
- "childField",
136
- "childNounId",
137
- "childRefField",
138
- "childStatuses",
139
- "parentField"
140
- ],
141
- "additionalProperties": false,
142
- "properties": {
143
- "childField": { "$ref": "#/$defs/camelName" },
144
- "childNounId": { "$ref": "#/$defs/snakeName" },
145
- "childRefField": { "$ref": "#/$defs/camelName" },
146
- "childStatuses": {
147
- "type": "array",
148
- "minItems": 1,
149
- "maxItems": 12,
150
- "items": { "$ref": "#/$defs/snakeName" }
151
- },
152
- "parentField": { "$ref": "#/$defs/camelName" }
153
- }
154
- },
155
- {
156
- "type": "object",
157
- "required": [
158
- "count",
159
- "childNounId",
160
- "childRefField",
161
- "childStatuses",
162
- "parentField"
163
- ],
164
- "additionalProperties": false,
165
- "properties": {
166
- "count": { "const": true },
167
- "childNounId": { "$ref": "#/$defs/snakeName" },
168
- "childRefField": { "$ref": "#/$defs/camelName" },
169
- "childStatuses": {
170
- "type": "array",
171
- "minItems": 1,
172
- "maxItems": 12,
173
- "items": { "$ref": "#/$defs/snakeName" }
174
- },
175
- "parentField": { "$ref": "#/$defs/camelName" }
176
- }
177
- }
178
- ]
179
- }
180
- },
181
- "derivedAmounts": {
182
- "description": "Machine-computed amounts derived from stored money fields. Callers never supply target fields.",
183
- "type": "array",
184
- "minItems": 1,
185
- "maxItems": 4,
186
- "items": {
187
- "type": "object",
188
- "required": ["field", "rounding", "rule", "sourceField"],
189
- "additionalProperties": false,
190
- "properties": {
191
- "field": { "$ref": "#/$defs/camelName" },
192
- "rounding": { "const": "floor" },
193
- "rule": {
194
- "type": "object",
195
- "required": ["bps", "kind"],
196
- "additionalProperties": false,
197
- "properties": {
198
- "bps": { "type": "integer", "minimum": 1, "maximum": 9999 },
199
- "kind": { "const": "percentage_of" }
200
- }
201
- },
202
- "sourceField": { "$ref": "#/$defs/camelName" }
203
- }
204
- }
205
- },
206
- "fields": {
207
- "description": "Every value an instance stores. `money` is a positive minor-unit integer; `date` is required, `date?` optional; `beneficiary` is a payout beneficiary ID; `ref:<noun>` is a required noun-instance reference.",
208
- "type": "object",
209
- "propertyNames": { "$ref": "#/$defs/camelName" },
210
- "additionalProperties": {
211
- "type": "object",
212
- "required": ["desc", "type"],
213
- "additionalProperties": false,
214
- "properties": {
215
- "desc": { "type": "string", "minLength": 1, "maxLength": 200 },
216
- "type": {
217
- "oneOf": [
218
- {
219
- "enum": [
220
- "money",
221
- "date",
222
- "date?",
223
- "text",
224
- "text?",
225
- "currency",
226
- "beneficiary",
227
- "count"
228
- ]
229
- },
230
- { "type": "string", "pattern": "^const:[1-9][0-9]*$" },
231
- { "type": "string", "pattern": "^ref:[a-z][a-z0-9_]*$" }
232
- ]
233
- }
234
- }
235
- }
236
- },
237
- "partitions": {
238
- "description": "Conservation laws over stored amounts: the piece fields sum exactly to the total field, proven at create admission before any money moves.",
239
- "type": "array",
240
- "maxItems": 4,
241
- "items": {
242
- "type": "object",
243
- "required": ["pieces", "total"],
244
- "additionalProperties": false,
245
- "properties": {
246
- "pieces": {
247
- "type": "array",
248
- "minItems": 2,
249
- "maxItems": 12,
250
- "items": { "$ref": "#/$defs/camelName" }
251
- },
252
- "total": { "$ref": "#/$defs/camelName" }
253
- }
254
- }
255
- },
256
- "verbs": {
257
- "description": "One entry per admissible lifecycle step. `create` is always present and is the only verb with no `from`.",
258
- "type": "object",
259
- "minProperties": 1,
260
- "propertyNames": { "$ref": "#/$defs/snakeName" },
261
- "additionalProperties": { "$ref": "#/$defs/verb" }
262
- }
263
- }
264
- },
265
-
266
- "verb": {
267
- "type": "object",
268
- "required": ["summary", "to"],
269
- "additionalProperties": false,
270
- "properties": {
271
- "from": {
272
- "description": "States this verb may run in. Absent on `create`.",
273
- "type": "array",
274
- "minItems": 1,
275
- "maxItems": 12,
276
- "items": { "$ref": "#/$defs/snakeName" }
277
- },
278
- "to": {
279
- "description": "The state the instance is in once this verb succeeds.",
280
- "$ref": "#/$defs/snakeName"
281
- },
282
- "summary": { "type": "string", "minLength": 1, "maxLength": 200 },
283
- "publicIntent": {
284
- "description": "The stable action-first lowerCamelCase operation name exposed to callers. System due verbs omit it.",
285
- "$ref": "#/$defs/camelName"
286
- },
287
- "moneyEvent": {
288
- "description": "The Business Frame money event this verb's moves belong to.",
289
- "$ref": "#/$defs/snakeName"
290
- },
291
- "moves": {
292
- "description": "The ledger operations this verb performs, in order, as one atomic batch.",
293
- "type": "array",
294
- "minItems": 1,
295
- "maxItems": 12,
296
- "items": { "$ref": "#/$defs/move" }
297
- },
298
- "requires": {
299
- "description": "Referenced noun instances whose status and stored values gate this verb before any movement runs.",
300
- "type": "object",
301
- "maxProperties": 8,
302
- "propertyNames": { "$ref": "#/$defs/camelName" },
303
- "additionalProperties": {
304
- "oneOf": [
305
- {
306
- "type": "array",
307
- "minItems": 1,
308
- "maxItems": 12,
309
- "items": { "$ref": "#/$defs/snakeName" }
310
- },
311
- {
312
- "type": "object",
313
- "required": ["statuses"],
314
- "additionalProperties": false,
315
- "anyOf": [
316
- { "required": ["bind"] },
317
- { "required": ["match"] },
318
- { "required": ["unique"] }
319
- ],
320
- "properties": {
321
- "bind": {
322
- "type": "object",
323
- "minProperties": 1,
324
- "maxProperties": 8,
325
- "propertyNames": { "$ref": "#/$defs/camelName" },
326
- "additionalProperties": { "$ref": "#/$defs/nounRefPath" }
327
- },
328
- "match": {
329
- "type": "object",
330
- "minProperties": 1,
331
- "maxProperties": 8,
332
- "propertyNames": { "$ref": "#/$defs/nounRefPath" },
333
- "additionalProperties": { "$ref": "#/$defs/nounRefPath" }
334
- },
335
- "statuses": {
336
- "type": "array",
337
- "minItems": 1,
338
- "maxItems": 12,
339
- "items": { "$ref": "#/$defs/snakeName" }
340
- },
341
- "unique": { "const": true }
342
- }
343
- }
344
- ]
345
- }
346
- },
347
- "due": {
348
- "description": "The verb runs when the stored date in `field` (plus `offset`) arrives, under the named rule.",
349
- "type": "object",
350
- "required": ["field"],
351
- "additionalProperties": false,
352
- "properties": {
353
- "field": { "$ref": "#/$defs/camelName" },
354
- "rule": { "$ref": "#/$defs/snakeName" },
355
- "offset": { "$ref": "#/$defs/isoDuration" }
356
- }
357
- },
358
- "deadline": {
359
- "description": "The verb stops being admissible once the stored date in `field` (plus `offset`) has passed.",
360
- "type": "object",
361
- "required": ["field"],
362
- "additionalProperties": false,
363
- "properties": {
364
- "field": { "$ref": "#/$defs/camelName" },
365
- "offset": { "$ref": "#/$defs/isoDuration" }
366
- }
367
- },
368
- "setsAt": {
369
- "description": "Running this verb stamps `field` with now plus `offset`. A marker records occurrence and cannot drive a due condition or deadline.",
370
- "type": "object",
371
- "required": ["field", "offset"],
372
- "additionalProperties": false,
373
- "properties": {
374
- "field": { "$ref": "#/$defs/camelName" },
375
- "marker": { "const": true },
376
- "offset": { "$ref": "#/$defs/isoDuration" }
377
- }
378
- },
379
- "port": {
380
- "description": "The verb is a decision port: only these actors may call it, and the answer comes from the tenant's own backend.",
381
- "type": "object",
382
- "required": ["allowed"],
383
- "additionalProperties": false,
384
- "properties": {
385
- "allowed": {
386
- "type": "array",
387
- "minItems": 1,
388
- "maxItems": 2,
389
- "items": { "$ref": "#/$defs/snakeName" }
390
- },
391
- "fields": {
392
- "type": "object",
393
- "maxProperties": 4,
394
- "propertyNames": { "$ref": "#/$defs/camelName" },
395
- "additionalProperties": { "enum": ["text"] }
396
- }
397
- }
398
- },
399
- "captureInput": {
400
- "description": "Persist selected caller input fields under noun refs so the terminal receipt retains decision evidence.",
401
- "type": "object",
402
- "maxProperties": 4,
403
- "propertyNames": { "$ref": "#/$defs/camelName" },
404
- "additionalProperties": { "$ref": "#/$defs/camelName" }
405
- },
406
- "payout": {
407
- "description": "Create one external payout instruction from stored noun values and capture its durable reference.",
408
- "type": "object",
409
- "required": [
410
- "amount",
411
- "beneficiaryField",
412
- "beneficiaryPartyField",
413
- "capture",
414
- "currencyField",
415
- "sourceAccountField",
416
- "speed"
417
- ],
418
- "additionalProperties": false,
419
- "properties": {
420
- "amount": { "$ref": "#/$defs/instanceValuePath" },
421
- "beneficiaryField": { "$ref": "#/$defs/camelName" },
422
- "beneficiaryPartyField": { "$ref": "#/$defs/camelName" },
423
- "capture": { "$ref": "#/$defs/camelName" },
424
- "currencyField": { "$ref": "#/$defs/camelName" },
425
- "sourceAccountField": { "$ref": "#/$defs/camelName" },
426
- "speed": { "const": "standard" }
427
- }
428
- },
429
- "requiresSettlement": {
430
- "description": "Allow a system transition only after durable settlement evidence matches the captured payout.",
431
- "type": "object",
432
- "required": ["capture", "payoutRef"],
433
- "additionalProperties": false,
434
- "properties": {
435
- "capture": { "$ref": "#/$defs/camelName" },
436
- "payoutRef": { "$ref": "#/$defs/camelName" }
437
- }
438
- },
439
- "signedSum": {
440
- "description": "A machine-computed signed sum over frozen child rows. The caller cannot supply the result.",
441
- "type": "object",
442
- "required": ["amountRef", "onNegative", "onZero", "sources"],
443
- "additionalProperties": false,
444
- "properties": {
445
- "amountRef": { "$ref": "#/$defs/camelName" },
446
- "onNegative": { "const": "refuse" },
447
- "onZero": { "enum": ["refuse", "skip_steps"] },
448
- "sources": {
449
- "type": "array",
450
- "minItems": 1,
451
- "maxItems": 6,
452
- "items": {
453
- "type": "object",
454
- "required": [
455
- "amountField",
456
- "nounId",
457
- "refField",
458
- "sign",
459
- "statuses",
460
- "subtotalRef"
461
- ],
462
- "additionalProperties": false,
463
- "properties": {
464
- "amountField": { "$ref": "#/$defs/camelName" },
465
- "nounId": { "$ref": "#/$defs/snakeName" },
466
- "refField": { "$ref": "#/$defs/camelName" },
467
- "sign": { "enum": ["add", "subtract"] },
468
- "statuses": {
469
- "type": "array",
470
- "minItems": 1,
471
- "maxItems": 4,
472
- "items": { "$ref": "#/$defs/snakeName" }
473
- },
474
- "subtotalRef": { "$ref": "#/$defs/camelName" }
475
- }
476
- }
477
- }
478
- }
479
- },
480
- "distribute": {
481
- "description": "A machine-computed deterministic largest-remainder share of a frozen parent pool.",
482
- "type": "object",
483
- "required": [
484
- "amountRef",
485
- "onZero",
486
- "pool",
487
- "refField",
488
- "statuses",
489
- "weightField"
490
- ],
491
- "additionalProperties": false,
492
- "properties": {
493
- "amountRef": { "$ref": "#/$defs/camelName" },
494
- "onZero": { "enum": ["refuse", "skip_steps"] },
495
- "pool": {
496
- "type": "object",
497
- "required": ["from", "path"],
498
- "additionalProperties": false,
499
- "properties": {
500
- "from": { "const": "parent" },
501
- "path": { "$ref": "#/$defs/nounRefPath" }
502
- }
503
- },
504
- "refField": { "$ref": "#/$defs/camelName" },
505
- "statuses": {
506
- "type": "array",
507
- "minItems": 1,
508
- "maxItems": 12,
509
- "items": { "$ref": "#/$defs/snakeName" }
510
- },
511
- "weightField": { "$ref": "#/$defs/camelName" }
512
- }
513
- },
514
- "requiresAggregate": {
515
- "description": "Locked aggregate conditions over child or sibling rows that must hold before the verb runs.",
516
- "type": "array",
517
- "minItems": 1,
518
- "maxItems": 8,
519
- "items": {
520
- "type": "object",
521
- "required": ["check", "over", "refField", "statuses"],
522
- "additionalProperties": false,
523
- "properties": {
524
- "check": {
525
- "oneOf": [
526
- {
527
- "type": "object",
528
- "required": ["amountField", "kind", "targetField"],
529
- "additionalProperties": false,
530
- "properties": {
531
- "amountField": { "$ref": "#/$defs/camelName" },
532
- "kind": {
533
- "enum": ["sum_at_least", "sum_below", "sum_exactly"]
534
- },
535
- "targetField": { "$ref": "#/$defs/camelName" }
536
- }
537
- },
538
- {
539
- "type": "object",
540
- "required": ["kind"],
541
- "additionalProperties": false,
542
- "properties": { "kind": { "const": "all_in" } }
543
- },
544
- {
545
- "type": "object",
546
- "required": ["kind", "targetField"],
547
- "additionalProperties": false,
548
- "properties": {
549
- "kind": { "const": "count_at_least" },
550
- "targetField": { "$ref": "#/$defs/camelName" }
551
- }
552
- },
553
- {
554
- "type": "object",
555
- "required": ["field", "kind"],
556
- "additionalProperties": false,
557
- "properties": {
558
- "field": { "$ref": "#/$defs/camelName" },
559
- "kind": { "const": "count_equals_field" }
560
- }
561
- }
562
- ]
563
- },
564
- "nounId": { "$ref": "#/$defs/snakeName" },
565
- "over": { "enum": ["children", "siblings"] },
566
- "refField": { "$ref": "#/$defs/camelName" },
567
- "statuses": {
568
- "type": "array",
569
- "minItems": 1,
570
- "maxItems": 12,
571
- "items": { "$ref": "#/$defs/snakeName" }
572
- }
573
- }
574
- }
575
- },
576
- "requiresExposure": {
577
- "description": "Atomic exposure caps over rows sharing one anchor. The current row contributes to the checked sum.",
578
- "type": "array",
579
- "minItems": 1,
580
- "maxItems": 8,
581
- "items": {
582
- "type": "object",
583
- "required": [
584
- "amountField",
585
- "anchorField",
586
- "capField",
587
- "childNounId",
588
- "statuses"
589
- ],
590
- "additionalProperties": false,
591
- "properties": {
592
- "amountField": { "$ref": "#/$defs/camelName" },
593
- "anchorField": { "$ref": "#/$defs/camelName" },
594
- "capField": { "$ref": "#/$defs/camelName" },
595
- "capOnAnchor": { "const": true },
596
- "childNounId": { "$ref": "#/$defs/snakeName" },
597
- "statuses": {
598
- "type": "array",
599
- "minItems": 1,
600
- "maxItems": 12,
601
- "items": { "$ref": "#/$defs/snakeName" }
602
- }
603
- }
604
- }
605
- },
606
- "requiresDrainedAccount": {
607
- "description": "The verb is admissible only when the settlement's escrow account holds nothing, so a terminal state can never strand custody.",
608
- "type": "object",
609
- "required": ["path"],
610
- "additionalProperties": false,
611
- "properties": {
612
- "path": { "const": "refs.escrowAccountId" }
613
- }
614
- }
615
- }
616
- },
617
-
618
- "move": {
619
- "description": "One ledger operation. `create` transfers money; `reserve` places a hold; `post` captures a reservation; `void` releases one.",
620
- "oneOf": [
621
- {
622
- "type": "object",
623
- "required": ["amount", "from", "key", "operation", "to"],
624
- "additionalProperties": false,
625
- "properties": {
626
- "operation": { "const": "create" },
627
- "key": { "$ref": "#/$defs/snakeName" },
628
- "amount": {
629
- "oneOf": [
630
- { "$ref": "#/$defs/camelName" },
631
- { "type": "string", "pattern": "^refs\\.[a-z][A-Za-z0-9]*$" }
632
- ]
633
- },
634
- "from": { "$ref": "#/$defs/endpoint" },
635
- "to": { "$ref": "#/$defs/endpoint" },
636
- "moneyEvent": { "$ref": "#/$defs/snakeName" },
637
- "clawbackOf": {
638
- "description": "This transfer reverses the named earlier reservation.",
639
- "$ref": "#/$defs/snakeName"
640
- }
641
- }
642
- },
643
- {
644
- "type": "object",
645
- "required": ["amount", "from", "key", "operation", "to"],
646
- "additionalProperties": false,
647
- "properties": {
648
- "operation": { "const": "reserve" },
649
- "key": { "$ref": "#/$defs/snakeName" },
650
- "amount": { "$ref": "#/$defs/camelName" },
651
- "expiresAt": { "$ref": "#/$defs/camelName" },
652
- "from": { "$ref": "#/$defs/endpoint" },
653
- "to": { "$ref": "#/$defs/endpoint" },
654
- "moneyEvent": { "$ref": "#/$defs/snakeName" }
655
- }
656
- },
657
- {
658
- "type": "object",
659
- "required": ["key", "operation", "reservation"],
660
- "additionalProperties": false,
661
- "properties": {
662
- "operation": { "const": "post" },
663
- "key": { "$ref": "#/$defs/snakeName" },
664
- "reservation": { "$ref": "#/$defs/snakeName" },
665
- "amount": { "$ref": "#/$defs/camelName" },
666
- "partialOnly": { "const": true },
667
- "capture": {
668
- "type": "object",
669
- "maxProperties": 4,
670
- "propertyNames": { "$ref": "#/$defs/camelName" },
671
- "additionalProperties": { "const": "postedAmount" }
672
- }
673
- }
674
- },
675
- {
676
- "type": "object",
677
- "required": ["key", "operation", "reservation"],
678
- "additionalProperties": false,
679
- "properties": {
680
- "operation": { "const": "void" },
681
- "key": { "$ref": "#/$defs/snakeName" },
682
- "reservation": { "$ref": "#/$defs/snakeName" },
683
- "reason": { "type": "string", "minLength": 1, "maxLength": 120 }
684
- }
685
- }
686
- ]
687
- },
688
-
689
- "frame": {
690
- "title": "Business Frame",
691
- "description": "The same product stated in business terms, congruent with the document by construction: every money movement in the IR is covered by exactly one money event here.",
692
- "type": "object",
693
- "required": [
694
- "actors",
695
- "confidence",
696
- "conservationGroups",
697
- "design",
698
- "feePolicy",
699
- "fees",
700
- "headline",
701
- "mechanics",
702
- "moneyEvents",
703
- "offPlatform",
704
- "openQuestions",
705
- "rules",
706
- "subjects",
707
- "summary"
708
- ],
709
- "additionalProperties": false,
710
- "properties": {
711
- "headline": { "$ref": "#/$defs/prose" },
712
- "summary": { "$ref": "#/$defs/prose" },
713
- "confidence": {
714
- "description": "Always `high`: a compiled frame is derived, not inferred.",
715
- "const": "high"
716
- },
717
- "mechanics": {
718
- "description": "The commercial shapes this program's archetypes add up to.",
719
- "type": "array",
720
- "minItems": 1,
721
- "items": {
722
- "enum": [
723
- "credit",
724
- "escrow",
725
- "insurance",
726
- "marketplace",
727
- "recurring_billing"
728
- ]
729
- }
730
- },
731
- "actors": {
732
- "type": "array",
733
- "items": {
734
- "type": "object",
735
- "required": ["key", "label", "maxCount", "minCount", "role"],
736
- "additionalProperties": false,
737
- "properties": {
738
- "key": { "$ref": "#/$defs/snakeName" },
739
- "label": { "$ref": "#/$defs/prose" },
740
- "minCount": { "type": "integer", "minimum": 0 },
741
- "maxCount": { "type": "integer", "minimum": 1 },
742
- "role": {
743
- "enum": [
744
- "payer",
745
- "beneficiary",
746
- "provider",
747
- "holder",
748
- "platform"
749
- ]
750
- }
751
- }
752
- }
753
- },
754
- "subjects": {
755
- "type": "array",
756
- "items": {
757
- "type": "object",
758
- "required": ["kind", "title"],
759
- "additionalProperties": false,
760
- "properties": {
761
- "kind": { "$ref": "#/$defs/snakeName" },
762
- "title": { "$ref": "#/$defs/prose" }
763
- }
764
- }
765
- },
766
- "moneyEvents": {
767
- "type": "array",
768
- "maxItems": 14,
769
- "items": { "$ref": "#/$defs/moneyEvent" }
770
- },
771
- "rules": {
772
- "type": "array",
773
- "items": { "$ref": "#/$defs/rule" }
774
- },
775
- "fees": {
776
- "type": "array",
777
- "items": {
778
- "type": "object",
779
- "required": ["label", "on", "structure"],
780
- "additionalProperties": false,
781
- "properties": {
782
- "label": { "$ref": "#/$defs/prose" },
783
- "on": { "$ref": "#/$defs/prose" },
784
- "structure": { "$ref": "#/$defs/prose" }
785
- }
786
- }
787
- },
788
- "feePolicy": { "enum": ["defined", "none"] },
789
- "design": {
790
- "description": "One line per lowered settlement, saying what the compiler decided and why.",
791
- "type": "array",
792
- "items": { "$ref": "#/$defs/prose" }
793
- },
794
- "offPlatform": {
795
- "description": "What changes hands outside the platform. Money never appears here.",
796
- "type": "array",
797
- "items": {
798
- "type": "object",
799
- "required": ["label", "why"],
800
- "additionalProperties": false,
801
- "properties": {
802
- "label": { "$ref": "#/$defs/prose" },
803
- "why": { "$ref": "#/$defs/prose" }
804
- }
805
- }
806
- },
807
- "conservationGroups": {
808
- "description": "Always empty from the compiler: conservation is proven on the noun's `partitions`, not restated here.",
809
- "type": "array",
810
- "maxItems": 0
811
- },
812
- "openQuestions": {
813
- "description": "Always empty from the compiler: a program that left a question open would not have compiled.",
814
- "type": "array",
815
- "maxItems": 0
816
- }
817
- }
818
- },
819
-
820
- "moneyEvent": {
821
- "description": "One movement of money, named so a rule can gate it and a person can read it.",
822
- "type": "object",
823
- "required": [
824
- "allocationTotalBps",
825
- "amount",
826
- "amountDependencies",
827
- "amountMode",
828
- "amountSchedule",
829
- "distribution",
830
- "fromActor",
831
- "key",
832
- "kind",
833
- "label",
834
- "occurrence",
835
- "timing",
836
- "toActor",
837
- "trigger"
838
- ],
839
- "additionalProperties": false,
840
- "properties": {
841
- "key": { "$ref": "#/$defs/snakeName" },
842
- "kind": {
843
- "enum": [
844
- "charge",
845
- "hold",
846
- "installment",
847
- "payout",
848
- "penalty",
849
- "premium",
850
- "refund"
851
- ]
852
- },
853
- "label": { "$ref": "#/$defs/prose" },
854
- "trigger": { "$ref": "#/$defs/prose" },
855
- "amount": {
856
- "description": "The amount in words. The exact arithmetic lives on the noun's fields and partitions.",
857
- "$ref": "#/$defs/prose"
858
- },
859
- "fromActor": { "$ref": "#/$defs/endpoint" },
860
- "toActor": { "$ref": "#/$defs/endpoint" },
861
- "occurrence": { "enum": ["once", "repeatable"] },
862
- "timing": { "enum": ["external_schedule", "on_lifecycle"] },
863
- "amountMode": {
864
- "enum": ["fixed", "runtime_bounded", "remaining_balance"]
865
- },
866
- "distribution": { "const": "single" },
867
- "allocationTotalBps": { "const": 0 },
868
- "amountDependencies": {
869
- "type": "array",
870
- "maxItems": 11,
871
- "items": { "$ref": "#/$defs/snakeName" }
872
- },
873
- "amountSchedule": { "type": "array", "maxItems": 0 }
874
- }
875
- },
876
-
877
- "rule": {
878
- "description": "A condition on the product: what must be true before a money event may run.",
879
- "type": "object",
880
- "required": [
881
- "allowedActors",
882
- "detail",
883
- "dueDriven",
884
- "enforcement",
885
- "gatesEvent",
886
- "key",
887
- "kind",
888
- "label",
889
- "tenantTunable"
890
- ],
891
- "additionalProperties": false,
892
- "properties": {
893
- "key": { "$ref": "#/$defs/snakeName" },
894
- "kind": { "enum": ["deadline", "release_condition"] },
895
- "label": { "$ref": "#/$defs/prose" },
896
- "detail": { "$ref": "#/$defs/prose" },
897
- "allowedActors": {
898
- "type": "array",
899
- "items": { "$ref": "#/$defs/snakeName" }
900
- },
901
- "gatesEvent": {
902
- "description": "The money event this rule gates, or null when it gates the lifecycle rather than one movement.",
903
- "anyOf": [{ "$ref": "#/$defs/snakeName" }, { "type": "null" }]
904
- },
905
- "dueDriven": {
906
- "description": "True when a stored date decides the rule, false when a decision port does.",
907
- "type": "boolean"
908
- },
909
- "enforcement": {
910
- "description": "`tenant_app` means the tenant's own backend answers; `platform` means the runtime decides without asking.",
911
- "enum": ["platform", "tenant_app"]
912
- },
913
- "tenantTunable": {
914
- "description": "Always false from the compiler: the source is the only place these terms change.",
915
- "const": false
916
- }
917
- }
918
- }
919
- }
920
- }