@ottochain/sdk 2.3.0 → 2.5.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 (287) hide show
  1. package/dist/cjs/apps/compute/index.js +33 -0
  2. package/dist/cjs/apps/compute/state-machines/compute-rule110.js +164 -0
  3. package/dist/cjs/apps/compute/state-machines/index.js +9 -0
  4. package/dist/cjs/apps/contracts/index.js +16 -9
  5. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +134 -161
  6. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +192 -170
  7. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +46 -58
  8. package/dist/cjs/apps/corporate/index.js +2 -2
  9. package/dist/cjs/apps/corporate/state-machines/corp-board.js +500 -456
  10. package/dist/cjs/apps/corporate/state-machines/corp-entity.js +487 -361
  11. package/dist/cjs/apps/corporate/state-machines/corp-securities.js +769 -576
  12. package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +567 -557
  13. package/dist/cjs/apps/governance/index.js +21 -21
  14. package/dist/cjs/apps/governance/state-machines/dao-multisig.js +188 -209
  15. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +181 -228
  16. package/dist/cjs/apps/governance/state-machines/dao-single.js +105 -88
  17. package/dist/cjs/apps/governance/state-machines/dao-token.js +199 -227
  18. package/dist/cjs/apps/governance/state-machines/governance-simple.js +231 -231
  19. package/dist/cjs/apps/governance/state-machines/governance-universal.js +64 -64
  20. package/dist/cjs/apps/identity/constants.js +55 -22
  21. package/dist/cjs/apps/identity/index.js +28 -12
  22. package/dist/cjs/apps/identity/state-machines/identity-agent.js +124 -158
  23. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +158 -173
  24. package/dist/cjs/apps/identity/state-machines/identity-registry.js +262 -0
  25. package/dist/cjs/apps/identity/state-machines/identity-universal.js +51 -57
  26. package/dist/cjs/apps/identity/state-machines/index.js +3 -1
  27. package/dist/cjs/apps/index.js +22 -8
  28. package/dist/cjs/apps/lending/assets.js +247 -0
  29. package/dist/cjs/apps/lending/credit-scoring.js +87 -0
  30. package/dist/cjs/apps/lending/eligibility.js +105 -0
  31. package/dist/cjs/apps/lending/index.js +91 -0
  32. package/dist/cjs/apps/lending/state-machines/index.js +9 -0
  33. package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +433 -0
  34. package/dist/cjs/apps/markets/index.js +22 -12
  35. package/dist/cjs/apps/markets/state-machines/market-auction.js +116 -134
  36. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +131 -141
  37. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +163 -184
  38. package/dist/cjs/apps/markets/state-machines/market-prediction.js +226 -233
  39. package/dist/cjs/apps/markets/state-machines/market-universal.js +65 -80
  40. package/dist/cjs/apps/oracles/index.js +3 -3
  41. package/dist/cjs/apps/privacy/index.js +67 -0
  42. package/dist/cjs/apps/privacy/state-machines/index.js +17 -0
  43. package/dist/cjs/apps/privacy/state-machines/mixer-ddhRing.js +286 -0
  44. package/dist/cjs/apps/privacy/state-machines/note-pool.js +476 -0
  45. package/dist/cjs/apps/staked-pool/assets.js +103 -0
  46. package/dist/cjs/apps/staked-pool/base.js +498 -0
  47. package/dist/cjs/apps/staked-pool/consumer.js +55 -0
  48. package/dist/cjs/apps/staked-pool/index.js +83 -0
  49. package/dist/cjs/apps/staked-pool/state-machines/index.js +12 -0
  50. package/dist/cjs/apps/staked-pool/state-machines/staked-pool-base.js +49 -0
  51. package/dist/cjs/apps/staked-pool/state-machines/staked-pool-oracle.js +131 -0
  52. package/dist/cjs/errors.js +3 -3
  53. package/dist/cjs/generated/google/protobuf/struct.js +5 -5
  54. package/dist/cjs/generated/google/protobuf/timestamp.js +1 -1
  55. package/dist/cjs/generated/index.js +11 -7
  56. package/dist/cjs/generated/openapi.js +6 -0
  57. package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +51 -51
  58. package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +20 -21
  59. package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +14 -14
  60. package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +5 -5
  61. package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +125 -131
  62. package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +108 -108
  63. package/dist/cjs/generated/ottochain/v1/common.js +5 -5
  64. package/dist/cjs/generated/ottochain/v1/fiber.js +44 -6
  65. package/dist/cjs/generated/ottochain/v1/messages.js +1 -1
  66. package/dist/cjs/generated/ottochain/v1/records.js +1 -1
  67. package/dist/cjs/index.js +58 -7
  68. package/dist/cjs/openapi.js +2 -0
  69. package/dist/cjs/ottochain/drop-nulls.js +1 -2
  70. package/dist/cjs/ottochain/genesis-manifest.js +17 -11
  71. package/dist/cjs/ottochain/index.js +23 -13
  72. package/dist/cjs/ottochain/metagraph-client.js +81 -16
  73. package/dist/cjs/ottochain/snapshot.js +13 -16
  74. package/dist/cjs/ottochain/transaction.js +67 -14
  75. package/dist/cjs/ottochain/types.js +16 -2
  76. package/dist/cjs/privacy/index.js +14 -0
  77. package/dist/cjs/privacy/sealed-bid.js +213 -0
  78. package/dist/cjs/privacy/shield-app.js +131 -0
  79. package/dist/cjs/schema/effects.js +156 -0
  80. package/dist/cjs/schema/fiber-app.js +150 -15
  81. package/dist/cjs/schema/guard-lint.js +343 -0
  82. package/dist/cjs/schema/guards.js +246 -0
  83. package/dist/cjs/signing.js +80 -0
  84. package/dist/cjs/templates/asset-policy.js +190 -0
  85. package/dist/cjs/templates/index.js +86 -0
  86. package/dist/cjs/templates/machine.js +130 -0
  87. package/dist/cjs/templates/migration.js +39 -0
  88. package/dist/cjs/templates/state-shape.js +38 -0
  89. package/dist/cjs/types.js +2 -3
  90. package/dist/cjs/validation.js +9 -11
  91. package/dist/cjs/verify.js +9 -4
  92. package/dist/cjs/zk/commit.js +53 -0
  93. package/dist/cjs/zk/guard.js +107 -0
  94. package/dist/cjs/zk/index.js +48 -0
  95. package/dist/cjs/zk/preimage.js +37 -0
  96. package/dist/cjs/zk/prover.js +87 -0
  97. package/dist/cjs/zk/registry.js +62 -0
  98. package/dist/cjs/zk/types.js +28 -0
  99. package/dist/cjs/zk/witness.js +19 -0
  100. package/dist/esm/apps/compute/index.js +29 -0
  101. package/dist/esm/apps/compute/state-machines/compute-rule110.js +161 -0
  102. package/dist/esm/apps/compute/state-machines/index.js +5 -0
  103. package/dist/esm/apps/contracts/index.js +9 -5
  104. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +135 -162
  105. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +193 -171
  106. package/dist/esm/apps/contracts/state-machines/contract-universal.js +47 -59
  107. package/dist/esm/apps/corporate/index.js +2 -2
  108. package/dist/esm/apps/corporate/state-machines/corp-board.js +501 -457
  109. package/dist/esm/apps/corporate/state-machines/corp-entity.js +488 -362
  110. package/dist/esm/apps/corporate/state-machines/corp-securities.js +770 -577
  111. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +568 -558
  112. package/dist/esm/apps/governance/index.js +10 -10
  113. package/dist/esm/apps/governance/state-machines/dao-multisig.js +189 -210
  114. package/dist/esm/apps/governance/state-machines/dao-reputation.js +182 -229
  115. package/dist/esm/apps/governance/state-machines/dao-single.js +106 -89
  116. package/dist/esm/apps/governance/state-machines/dao-token.js +200 -228
  117. package/dist/esm/apps/governance/state-machines/governance-simple.js +232 -232
  118. package/dist/esm/apps/governance/state-machines/governance-universal.js +65 -65
  119. package/dist/esm/apps/identity/constants.js +52 -21
  120. package/dist/esm/apps/identity/index.js +14 -9
  121. package/dist/esm/apps/identity/state-machines/identity-agent.js +125 -159
  122. package/dist/esm/apps/identity/state-machines/identity-oracle.js +159 -174
  123. package/dist/esm/apps/identity/state-machines/identity-registry.js +259 -0
  124. package/dist/esm/apps/identity/state-machines/identity-universal.js +52 -58
  125. package/dist/esm/apps/identity/state-machines/index.js +1 -0
  126. package/dist/esm/apps/index.js +9 -5
  127. package/dist/esm/apps/lending/assets.js +231 -0
  128. package/dist/esm/apps/lending/credit-scoring.js +81 -0
  129. package/dist/esm/apps/lending/eligibility.js +99 -0
  130. package/dist/esm/apps/lending/index.js +69 -0
  131. package/dist/esm/apps/lending/state-machines/index.js +5 -0
  132. package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +430 -0
  133. package/dist/esm/apps/markets/index.js +11 -7
  134. package/dist/esm/apps/markets/state-machines/market-auction.js +117 -135
  135. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +132 -142
  136. package/dist/esm/apps/markets/state-machines/market-group-buy.js +164 -185
  137. package/dist/esm/apps/markets/state-machines/market-prediction.js +227 -234
  138. package/dist/esm/apps/markets/state-machines/market-universal.js +66 -81
  139. package/dist/esm/apps/oracles/index.js +3 -3
  140. package/dist/esm/apps/privacy/index.js +56 -0
  141. package/dist/esm/apps/privacy/state-machines/index.js +6 -0
  142. package/dist/esm/apps/privacy/state-machines/mixer-ddhRing.js +282 -0
  143. package/dist/esm/apps/privacy/state-machines/note-pool.js +470 -0
  144. package/dist/esm/apps/staked-pool/assets.js +91 -0
  145. package/dist/esm/apps/staked-pool/base.js +493 -0
  146. package/dist/esm/apps/staked-pool/consumer.js +49 -0
  147. package/dist/esm/apps/staked-pool/index.js +60 -0
  148. package/dist/esm/apps/staked-pool/state-machines/index.js +6 -0
  149. package/dist/esm/apps/staked-pool/state-machines/staked-pool-base.js +46 -0
  150. package/dist/esm/apps/staked-pool/state-machines/staked-pool-oracle.js +127 -0
  151. package/dist/esm/generated/google/protobuf/struct.js +1 -1
  152. package/dist/esm/generated/google/protobuf/timestamp.js +1 -1
  153. package/dist/esm/generated/index.js +9 -5
  154. package/dist/esm/generated/openapi.js +5 -0
  155. package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +47 -47
  156. package/dist/esm/generated/ottochain/apps/corporate/v1/corporate.js +1 -1
  157. package/dist/esm/generated/ottochain/apps/governance/v1/governance.js +1 -1
  158. package/dist/esm/generated/ottochain/apps/identity/v1/attestation.js +1 -1
  159. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +115 -121
  160. package/dist/esm/generated/ottochain/apps/markets/v1/market.js +101 -101
  161. package/dist/esm/generated/ottochain/v1/common.js +1 -1
  162. package/dist/esm/generated/ottochain/v1/fiber.js +40 -2
  163. package/dist/esm/generated/ottochain/v1/messages.js +1 -1
  164. package/dist/esm/generated/ottochain/v1/records.js +1 -1
  165. package/dist/esm/index.js +28 -3
  166. package/dist/esm/openapi.js +1 -0
  167. package/dist/esm/ottochain/genesis-manifest.js +15 -9
  168. package/dist/esm/ottochain/index.js +2 -3
  169. package/dist/esm/ottochain/metagraph-client.js +81 -16
  170. package/dist/esm/ottochain/snapshot.js +6 -8
  171. package/dist/esm/ottochain/transaction.js +51 -3
  172. package/dist/esm/ottochain/types.js +15 -1
  173. package/dist/esm/privacy/index.js +6 -0
  174. package/dist/esm/privacy/sealed-bid.js +209 -0
  175. package/dist/esm/privacy/shield-app.js +127 -0
  176. package/dist/esm/schema/effects.js +145 -0
  177. package/dist/esm/schema/fiber-app.js +139 -8
  178. package/dist/esm/schema/guard-lint.js +337 -0
  179. package/dist/esm/schema/guards.js +228 -0
  180. package/dist/esm/signing.js +74 -0
  181. package/dist/esm/templates/asset-policy.js +182 -0
  182. package/dist/esm/templates/index.js +41 -0
  183. package/dist/esm/templates/machine.js +125 -0
  184. package/dist/esm/templates/migration.js +34 -0
  185. package/dist/esm/templates/state-shape.js +34 -0
  186. package/dist/esm/validation.js +1 -3
  187. package/dist/esm/verify.js +8 -2
  188. package/dist/esm/zk/commit.js +44 -0
  189. package/dist/esm/zk/guard.js +99 -0
  190. package/dist/esm/zk/index.js +19 -0
  191. package/dist/esm/zk/preimage.js +30 -0
  192. package/dist/esm/zk/prover.js +82 -0
  193. package/dist/esm/zk/registry.js +55 -0
  194. package/dist/esm/zk/types.js +25 -0
  195. package/dist/esm/zk/witness.js +15 -0
  196. package/dist/types/apps/compute/index.d.ts +176 -0
  197. package/dist/types/apps/compute/state-machines/compute-rule110.d.ts +157 -0
  198. package/dist/types/apps/compute/state-machines/index.d.ts +5 -0
  199. package/dist/types/apps/contracts/index.d.ts +81 -221
  200. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +23 -98
  201. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +49 -115
  202. package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +4 -4
  203. package/dist/types/apps/corporate/index.d.ts +1176 -440
  204. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +271 -135
  205. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +279 -74
  206. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +373 -149
  207. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +252 -80
  208. package/dist/types/apps/governance/index.d.ts +368 -470
  209. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +92 -107
  210. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +61 -85
  211. package/dist/types/apps/governance/state-machines/dao-single.d.ts +25 -47
  212. package/dist/types/apps/governance/state-machines/dao-token.d.ts +79 -68
  213. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +95 -125
  214. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +6 -6
  215. package/dist/types/apps/identity/constants.d.ts +33 -5
  216. package/dist/types/apps/identity/index.d.ts +415 -131
  217. package/dist/types/apps/identity/state-machines/identity-agent.d.ts +23 -23
  218. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +27 -98
  219. package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
  220. package/dist/types/apps/identity/state-machines/identity-universal.d.ts +4 -4
  221. package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
  222. package/dist/types/apps/index.d.ts +9 -5
  223. package/dist/types/apps/lending/assets.d.ts +258 -0
  224. package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
  225. package/dist/types/apps/lending/eligibility.d.ts +83 -0
  226. package/dist/types/apps/lending/index.d.ts +556 -0
  227. package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
  228. package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +536 -0
  229. package/dist/types/apps/markets/index.d.ts +181 -276
  230. package/dist/types/apps/markets/state-machines/market-auction.d.ts +25 -49
  231. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +35 -53
  232. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +35 -61
  233. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +65 -86
  234. package/dist/types/apps/markets/state-machines/market-universal.d.ts +12 -12
  235. package/dist/types/apps/oracles/index.d.ts +1 -1
  236. package/dist/types/apps/privacy/index.d.ts +328 -0
  237. package/dist/types/apps/privacy/state-machines/index.d.ts +6 -0
  238. package/dist/types/apps/privacy/state-machines/mixer-ddhRing.d.ts +337 -0
  239. package/dist/types/apps/privacy/state-machines/note-pool.d.ts +196 -0
  240. package/dist/types/apps/staked-pool/assets.d.ts +53 -0
  241. package/dist/types/apps/staked-pool/base.d.ts +80 -0
  242. package/dist/types/apps/staked-pool/consumer.d.ts +29 -0
  243. package/dist/types/apps/staked-pool/index.d.ts +51 -0
  244. package/dist/types/apps/staked-pool/state-machines/index.d.ts +6 -0
  245. package/dist/types/apps/staked-pool/state-machines/staked-pool-base.d.ts +8 -0
  246. package/dist/types/apps/staked-pool/state-machines/staked-pool-oracle.d.ts +34 -0
  247. package/dist/types/generated/index.d.ts +5 -5
  248. package/dist/types/generated/openapi.d.ts +1270 -0
  249. package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
  250. package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
  251. package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
  252. package/dist/types/generated/ottochain/v1/fiber.d.ts +7 -0
  253. package/dist/types/index.d.ts +7 -3
  254. package/dist/types/openapi.d.ts +24 -0
  255. package/dist/types/ottochain/genesis-manifest.d.ts +11 -5
  256. package/dist/types/ottochain/index.d.ts +5 -6
  257. package/dist/types/ottochain/metagraph-client.d.ts +49 -7
  258. package/dist/types/ottochain/snapshot.d.ts +6 -6
  259. package/dist/types/ottochain/transaction.d.ts +41 -1
  260. package/dist/types/ottochain/types.d.ts +336 -31
  261. package/dist/types/privacy/index.d.ts +6 -0
  262. package/dist/types/privacy/sealed-bid.d.ts +348 -0
  263. package/dist/types/privacy/shield-app.d.ts +48 -0
  264. package/dist/types/schema/effects.d.ts +141 -0
  265. package/dist/types/schema/fiber-app.d.ts +282 -2
  266. package/dist/types/schema/guard-lint.d.ts +111 -0
  267. package/dist/types/schema/guards.d.ts +146 -0
  268. package/dist/types/signing.d.ts +45 -0
  269. package/dist/types/templates/asset-policy.d.ts +119 -0
  270. package/dist/types/templates/index.d.ts +26 -0
  271. package/dist/types/templates/machine.d.ts +139 -0
  272. package/dist/types/templates/migration.d.ts +34 -0
  273. package/dist/types/templates/state-shape.d.ts +30 -0
  274. package/dist/types/validation.d.ts +22 -217
  275. package/dist/types/verify.d.ts +4 -0
  276. package/dist/types/zk/commit.d.ts +28 -0
  277. package/dist/types/zk/guard.d.ts +46 -0
  278. package/dist/types/zk/index.d.ts +19 -0
  279. package/dist/types/zk/preimage.d.ts +10 -0
  280. package/dist/types/zk/prover.d.ts +34 -0
  281. package/dist/types/zk/registry.d.ts +34 -0
  282. package/dist/types/zk/types.d.ts +33 -0
  283. package/dist/types/zk/witness.d.ts +40 -0
  284. package/package.json +47 -15
  285. package/dist/cjs/ottochain/normalize.js +0 -186
  286. package/dist/esm/ottochain/normalize.js +0 -179
  287. package/dist/types/ottochain/normalize.d.ts +0 -79
@@ -2,447 +2,441 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.corpBoardDef = void 0;
4
4
  const fiber_app_js_1 = require("../../../schema/fiber-app.js");
5
+ const guards_js_1 = require("../../../schema/guards.js");
6
+ const effects_js_1 = require("../../../schema/effects.js");
5
7
  /**
6
8
  * Board of directors state machine managing director seats, meetings, quorum, and formal board actions.
7
9
  * Supports staggered boards with classified directors.
8
10
  */
9
11
  exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
10
12
  metadata: {
11
- name: "CorpBoard",
12
- app: "corporate",
13
- type: "board",
14
- version: "1.0.0",
15
- description: "Board of directors state machine managing director seats, meetings, quorum, and formal board actions. Supports staggered boards with classified directors.",
13
+ name: 'CorpBoard',
14
+ app: 'corporate',
15
+ type: 'board',
16
+ version: '1.0.0',
17
+ description: 'Board of directors state machine managing director seats, meetings, quorum, and formal board actions. Supports staggered boards with classified directors.',
16
18
  crossReferences: {
17
19
  entity: {
18
- machine: "corporate-entity",
19
- description: "Parent corporate entity",
20
- foreignKey: "entityId",
20
+ machine: 'corporate-entity',
21
+ description: 'Parent corporate entity',
22
+ foreignKey: 'entityId',
21
23
  },
22
24
  resolutions: {
23
- machine: "corporate-resolution",
24
- description: "Board resolutions",
25
- foreignKey: "boardId",
25
+ machine: 'corporate-resolution',
26
+ description: 'Board resolutions',
27
+ foreignKey: 'boardId',
26
28
  },
27
29
  committees: {
28
- machine: "corporate-committee",
29
- description: "Board committees",
30
- foreignKey: "boardId",
30
+ machine: 'corporate-committee',
31
+ description: 'Board committees',
32
+ foreignKey: 'boardId',
31
33
  },
32
34
  officers: {
33
- machine: "corporate-officers",
34
- description: "Officers appointed by board",
35
- foreignKey: "entityId",
35
+ machine: 'corporate-officers',
36
+ description: 'Officers appointed by board',
37
+ foreignKey: 'entityId',
36
38
  },
37
39
  },
38
40
  },
39
41
  createSchema: {
40
- required: ["boardId", "entityId", "seats"],
42
+ required: ['boardId', 'entityId', 'seats', 'authorizedRemovers'],
41
43
  properties: {
42
44
  boardId: {
43
- type: "string",
44
- description: "Unique identifier for this board instance",
45
+ type: 'string',
46
+ description: 'Unique identifier for this board instance',
45
47
  immutable: true,
46
48
  },
47
49
  entityId: {
48
- type: "string",
49
- description: "Reference to parent corporate-entity",
50
+ type: 'string',
51
+ description: 'Reference to parent corporate-entity',
50
52
  immutable: true,
51
53
  },
54
+ authorizedRemovers: {
55
+ type: 'array',
56
+ description: 'State-pinned set of DAG addresses authorized to remove a director for cause (board/shareholder authority). A verified signer must be a member; checked against proofs[].address.',
57
+ immutable: false,
58
+ items: { type: 'address' },
59
+ },
52
60
  seats: {
53
- type: "object",
61
+ type: 'object',
54
62
  properties: {
55
63
  authorized: {
56
- type: "integer",
57
- description: "Number of board seats authorized by bylaws",
64
+ type: 'integer',
65
+ description: 'Number of board seats authorized by bylaws',
58
66
  },
59
- filled: { type: "integer" },
60
- vacant: { type: "integer" },
67
+ filled: { type: 'integer' },
68
+ vacant: { type: 'integer' },
61
69
  },
62
70
  },
63
71
  boardStructure: {
64
- type: "object",
72
+ type: 'object',
65
73
  properties: {
66
74
  isClassified: {
67
- type: "boolean",
68
- description: "Whether board has staggered terms",
75
+ type: 'boolean',
76
+ description: 'Whether board has staggered terms',
69
77
  },
70
78
  termYears: {
71
- type: "integer",
79
+ type: 'integer',
72
80
  default: 1,
73
- description: "Director term length",
81
+ description: 'Director term length',
74
82
  },
75
83
  classTerms: {
76
- type: "object",
84
+ type: 'object',
77
85
  properties: {
78
- CLASS_I: { type: "integer" },
79
- CLASS_II: { type: "integer" },
80
- CLASS_III: { type: "integer" },
86
+ CLASS_I: { type: 'integer' },
87
+ CLASS_II: { type: 'integer' },
88
+ CLASS_III: { type: 'integer' },
81
89
  },
82
90
  },
83
91
  },
84
92
  },
85
93
  quorumRules: {
86
- type: "object",
94
+ type: 'object',
87
95
  properties: {
88
96
  type: {
89
- type: "string",
90
- enum: ["MAJORITY", "SUPERMAJORITY", "FIXED_NUMBER"],
91
- default: "MAJORITY",
97
+ type: 'string',
98
+ enum: ['MAJORITY', 'SUPERMAJORITY', 'FIXED_NUMBER'],
99
+ default: 'MAJORITY',
92
100
  },
93
101
  threshold: {
94
- type: "number",
95
- description: "Fraction for majority/super, or count for fixed",
102
+ type: 'number',
103
+ description: 'Fraction for majority/super, or count for fixed',
96
104
  },
97
105
  minimumRequired: {
98
- type: "integer",
99
- description: "Absolute minimum regardless of formula",
106
+ type: 'integer',
107
+ description: 'Absolute minimum regardless of formula',
100
108
  },
101
109
  },
102
110
  },
103
111
  votingRules: {
104
- type: "object",
112
+ type: 'object',
105
113
  properties: {
106
114
  standardApproval: {
107
- type: "string",
108
- enum: ["MAJORITY_PRESENT", "MAJORITY_FULL_BOARD"],
109
- default: "MAJORITY_PRESENT",
115
+ type: 'string',
116
+ enum: ['MAJORITY_PRESENT', 'MAJORITY_FULL_BOARD'],
117
+ default: 'MAJORITY_PRESENT',
110
118
  },
111
119
  supermajorityMatters: {
112
- type: "array",
113
- items: { type: "string" },
114
- description: "Action types requiring supermajority",
120
+ type: 'array',
121
+ items: { type: 'string' },
122
+ description: 'Action types requiring supermajority',
115
123
  },
116
- supermajorityThreshold: { type: "number", default: 0.6667 },
124
+ supermajorityThreshold: { type: 'number', default: 0.6667 },
117
125
  },
118
126
  },
119
127
  },
120
128
  },
121
129
  stateSchema: {
122
130
  properties: {
123
- boardId: { type: "string", immutable: true },
124
- entityId: { type: "string", immutable: true },
131
+ boardId: { type: 'string', immutable: true },
132
+ entityId: { type: 'string', immutable: true },
133
+ authorizedRemovers: { type: 'array', items: { type: 'address' } },
125
134
  directors: {
126
- type: "array",
127
- items: { $ref: "#/definitions/Director" },
135
+ type: 'array',
136
+ items: { $ref: '#/definitions/Director' },
128
137
  computed: true,
129
138
  },
130
- seats: { type: "object" },
131
- boardStructure: { type: "object" },
132
- quorumRules: { type: "object" },
133
- votingRules: { type: "object" },
139
+ seats: { type: 'object' },
140
+ boardStructure: { type: 'object' },
141
+ quorumRules: { type: 'object' },
142
+ votingRules: { type: 'object' },
134
143
  currentMeeting: {
135
- $ref: "#/definitions/Meeting",
144
+ $ref: '#/definitions/Meeting',
136
145
  nullable: true,
137
146
  computed: true,
138
147
  },
139
148
  meetingHistory: {
140
- type: "array",
141
- items: { $ref: "#/definitions/MeetingRecord" },
149
+ type: 'array',
150
+ items: { $ref: '#/definitions/MeetingRecord' },
142
151
  computed: true,
143
152
  },
144
153
  status: {
145
- type: "string",
146
- enum: ["ACTIVE", "IN_MEETING", "QUORUM_LOST"],
154
+ type: 'string',
155
+ enum: ['ACTIVE', 'IN_MEETING', 'QUORUM_LOST'],
147
156
  computed: true,
148
157
  },
149
- createdAt: { type: "timestamp", computed: true },
150
- updatedAt: { type: "timestamp", computed: true },
158
+ createdAt: { type: 'timestamp', computed: true },
159
+ updatedAt: { type: 'timestamp', computed: true },
160
+ // Two-phase removal (#24): propose_removal binds the resolution fiber + records the pending
161
+ // removal here; remove_for_cause asserts the bound resolution is EXECUTED, then clears this.
162
+ pendingRemoval: { type: 'object', nullable: true, computed: true },
151
163
  },
152
164
  },
153
165
  eventSchemas: {
154
166
  elect_director: {
155
- description: "Add a new director to the board (election typically done at shareholder meeting or by board to fill vacancy)",
156
- required: [
157
- "directorId",
158
- "name",
159
- "termStart",
160
- "termEnd",
161
- "isIndependent",
162
- "electionResolutionRef",
163
- ],
167
+ description: 'Add a new director to the board (election typically done at shareholder meeting or by board to fill vacancy)',
168
+ required: ['directorId', 'name', 'termStart', 'termEnd', 'isIndependent', 'electionResolutionRef'],
164
169
  properties: {
165
- directorId: { type: "string" },
166
- name: { type: "string" },
167
- email: { type: "string" },
168
- termStart: { type: "string", format: "date" },
169
- termEnd: { type: "string", format: "date" },
170
+ directorId: { type: 'string' },
171
+ name: { type: 'string' },
172
+ email: { type: 'string' },
173
+ termStart: { type: 'string', format: 'date' },
174
+ termEnd: { type: 'string', format: 'date' },
170
175
  class: {
171
- type: "string",
172
- enum: ["CLASS_I", "CLASS_II", "CLASS_III", "UNCLASSIFIED"],
176
+ type: 'string',
177
+ enum: ['CLASS_I', 'CLASS_II', 'CLASS_III', 'UNCLASSIFIED'],
173
178
  },
174
- isIndependent: { type: "boolean" },
179
+ isIndependent: { type: 'boolean' },
175
180
  electionResolutionRef: {
176
- type: "string",
177
- description: "Shareholder or board resolution",
181
+ type: 'string',
182
+ description: 'Shareholder or board resolution',
178
183
  },
179
- isFillingVacancy: { type: "boolean", default: false },
184
+ isFillingVacancy: { type: 'boolean', default: false },
180
185
  },
181
186
  },
182
187
  resign_director: {
183
- description: "Director resigns from the board",
184
- required: ["directorId", "effectiveDate"],
188
+ description: 'Director resigns from the board',
189
+ required: ['directorId', 'effectiveDate'],
185
190
  properties: {
186
- directorId: { type: "string" },
187
- effectiveDate: { type: "string", format: "date" },
188
- reason: { type: "string" },
191
+ directorId: { type: 'string' },
192
+ effectiveDate: { type: 'string', format: 'date' },
193
+ reason: { type: 'string' },
189
194
  resignationLetter: {
190
- type: "string",
191
- description: "Document reference",
195
+ type: 'string',
196
+ description: 'Document reference',
192
197
  },
193
198
  },
194
199
  },
200
+ propose_removal: {
201
+ description: 'Phase 1 of for-cause removal: bind the executing resolution fiber (#24 _addDependency) and record the pending removal',
202
+ required: ['directorId', 'cause', 'removalResolutionRef'],
203
+ properties: {
204
+ directorId: { type: 'string' },
205
+ cause: { type: 'string' },
206
+ removalResolutionRef: { type: 'string' },
207
+ },
208
+ },
195
209
  remove_for_cause: {
196
- description: "Remove a director for cause (requires board or shareholder action depending on bylaws)",
197
- required: [
198
- "directorId",
199
- "cause",
200
- "removalResolutionRef",
201
- "effectiveDate",
202
- ],
210
+ description: 'Phase 2 of for-cause removal: execute once the bound removal resolution is EXECUTED',
211
+ required: ['directorId', 'effectiveDate'],
203
212
  properties: {
204
- directorId: { type: "string" },
205
- cause: { type: "string" },
206
- removalResolutionRef: { type: "string" },
207
- effectiveDate: { type: "string", format: "date" },
213
+ directorId: { type: 'string' },
214
+ effectiveDate: { type: 'string', format: 'date' },
208
215
  },
209
216
  },
210
217
  designate_chair: {
211
- description: "Designate a director as board chair",
212
- required: ["directorId", "resolutionRef"],
218
+ description: 'Designate a director as board chair',
219
+ required: ['directorId', 'resolutionRef'],
213
220
  properties: {
214
- directorId: { type: "string" },
215
- resolutionRef: { type: "string" },
221
+ directorId: { type: 'string' },
222
+ resolutionRef: { type: 'string' },
216
223
  },
217
224
  },
218
225
  call_meeting: {
219
- description: "Schedule a board meeting (can be called by chair, CEO, or directors per bylaws)",
220
- required: [
221
- "meetingId",
222
- "type",
223
- "scheduledDate",
224
- "calledBy",
225
- "noticeDate",
226
- ],
226
+ description: 'Schedule a board meeting (can be called by chair, CEO, or directors per bylaws)',
227
+ required: ['meetingId', 'type', 'scheduledDate', 'calledBy', 'noticeDate'],
227
228
  properties: {
228
- meetingId: { type: "string" },
229
+ meetingId: { type: 'string' },
229
230
  type: {
230
- type: "string",
231
- enum: ["REGULAR", "SPECIAL", "ANNUAL", "ORGANIZATIONAL"],
231
+ type: 'string',
232
+ enum: ['REGULAR', 'SPECIAL', 'ANNUAL', 'ORGANIZATIONAL'],
232
233
  },
233
- scheduledDate: { type: "string", format: "date-time" },
234
- location: { type: "string" },
235
- isVirtual: { type: "boolean", default: false },
234
+ scheduledDate: { type: 'string', format: 'date-time' },
235
+ location: { type: 'string' },
236
+ isVirtual: { type: 'boolean', default: false },
236
237
  calledBy: {
237
- type: "string",
238
- description: "Director ID or officer title",
238
+ type: 'string',
239
+ description: 'Director ID or officer title',
239
240
  },
240
- noticeDate: { type: "string", format: "date" },
241
- agenda: { type: "array", items: { type: "string" } },
241
+ noticeDate: { type: 'string', format: 'date' },
242
+ agenda: { type: 'array', items: { type: 'string' } },
242
243
  waiverOfNotice: {
243
- type: "boolean",
244
+ type: 'boolean',
244
245
  default: false,
245
- description: "If all directors waive notice",
246
+ description: 'If all directors waive notice',
246
247
  },
247
248
  },
248
249
  },
249
250
  record_attendance: {
250
251
  description: "Record a director's attendance before meeting opens",
251
- required: ["directorId", "present"],
252
+ required: ['directorId', 'present'],
252
253
  properties: {
253
- directorId: { type: "string" },
254
- present: { type: "boolean" },
255
- arrivedAt: { type: "string", format: "date-time" },
254
+ directorId: { type: 'string' },
255
+ present: { type: 'boolean' },
256
+ arrivedAt: { type: 'string', format: 'date-time' },
256
257
  },
257
258
  },
258
259
  open_meeting: {
259
- description: "Officially open the board meeting once quorum is established",
260
- required: ["openedAt"],
260
+ description: 'Officially open the board meeting once quorum is established',
261
+ required: ['openedAt'],
261
262
  properties: {
262
- openedAt: { type: "string", format: "date-time" },
263
+ openedAt: { type: 'string', format: 'date-time' },
263
264
  chairPresiding: {
264
- type: "string",
265
- description: "Director ID presiding",
265
+ type: 'string',
266
+ description: 'Director ID presiding',
266
267
  },
267
268
  },
268
269
  },
269
270
  director_departs: {
270
- description: "Record a director leaving the meeting (may affect quorum)",
271
- required: ["directorId", "departedAt"],
271
+ description: 'Record a director leaving the meeting (may affect quorum)',
272
+ required: ['directorId', 'departedAt'],
272
273
  properties: {
273
- directorId: { type: "string" },
274
- departedAt: { type: "string", format: "date-time" },
274
+ directorId: { type: 'string' },
275
+ departedAt: { type: 'string', format: 'date-time' },
275
276
  },
276
277
  },
277
278
  quorum_lost: {
278
- description: "Automatic transition when quorum is lost during meeting",
279
- required: ["lostAt"],
279
+ description: 'Automatic transition when quorum is lost during meeting',
280
+ required: ['lostAt'],
280
281
  properties: {
281
- lostAt: { type: "string", format: "date-time" },
282
+ lostAt: { type: 'string', format: 'date-time' },
282
283
  },
283
284
  },
284
285
  quorum_restored: {
285
- description: "Quorum restored after additional director(s) join",
286
- required: ["restoredAt", "directorId"],
286
+ description: 'Quorum restored after additional director(s) join',
287
+ required: ['restoredAt', 'directorId'],
287
288
  properties: {
288
- restoredAt: { type: "string", format: "date-time" },
289
- directorId: { type: "string", description: "Joining director" },
289
+ restoredAt: { type: 'string', format: 'date-time' },
290
+ directorId: { type: 'string', description: 'Joining director' },
290
291
  },
291
292
  },
292
293
  adjourn: {
293
- description: "Adjourn the board meeting",
294
- required: ["closedAt"],
294
+ description: 'Adjourn the board meeting',
295
+ required: ['closedAt'],
295
296
  properties: {
296
- closedAt: { type: "string", format: "date-time" },
297
+ closedAt: { type: 'string', format: 'date-time' },
297
298
  minutesRef: {
298
- type: "string",
299
- description: "Reference to meeting minutes document",
299
+ type: 'string',
300
+ description: 'Reference to meeting minutes document',
300
301
  },
301
- resolutionsPassed: { type: "array", items: { type: "string" } },
302
+ resolutionsPassed: { type: 'array', items: { type: 'string' } },
302
303
  adjournedTo: {
303
- type: "string",
304
- format: "date-time",
304
+ type: 'string',
305
+ format: 'date-time',
305
306
  nullable: true,
306
- description: "If adjourning to later date",
307
+ description: 'If adjourning to later date',
307
308
  },
308
309
  },
309
310
  },
310
311
  update_seats: {
311
- description: "Change the number of authorized board seats (requires bylaw amendment)",
312
- required: ["newAuthorizedSeats", "bylawAmendmentRef"],
312
+ description: 'Change the number of authorized board seats (requires bylaw amendment)',
313
+ required: ['newAuthorizedSeats', 'bylawAmendmentRef'],
313
314
  properties: {
314
- newAuthorizedSeats: { type: "integer" },
315
- bylawAmendmentRef: { type: "string" },
315
+ newAuthorizedSeats: { type: 'integer' },
316
+ bylawAmendmentRef: { type: 'string' },
316
317
  },
317
318
  },
318
319
  },
319
320
  definitions: {
320
321
  Director: {
321
- type: "object",
322
+ type: 'object',
322
323
  properties: {
323
- directorId: { type: "string" },
324
- name: { type: "string" },
325
- email: { type: "string" },
326
- termStart: { type: "string", format: "date" },
327
- termEnd: { type: "string", format: "date" },
324
+ directorId: { type: 'string' },
325
+ name: { type: 'string' },
326
+ email: { type: 'string' },
327
+ termStart: { type: 'string', format: 'date' },
328
+ termEnd: { type: 'string', format: 'date' },
328
329
  class: {
329
- type: "string",
330
- enum: ["CLASS_I", "CLASS_II", "CLASS_III", "UNCLASSIFIED"],
330
+ type: 'string',
331
+ enum: ['CLASS_I', 'CLASS_II', 'CLASS_III', 'UNCLASSIFIED'],
331
332
  },
332
333
  status: {
333
- type: "string",
334
- enum: ["ACTIVE", "RESIGNED", "REMOVED", "TERM_EXPIRED"],
334
+ type: 'string',
335
+ enum: ['ACTIVE', 'RESIGNED', 'REMOVED', 'TERM_EXPIRED'],
335
336
  },
336
337
  isIndependent: {
337
- type: "boolean",
338
- description: "Independence under applicable rules",
338
+ type: 'boolean',
339
+ description: 'Independence under applicable rules',
339
340
  },
340
- isChair: { type: "boolean", default: false },
341
- isLeadIndependent: { type: "boolean", default: false },
341
+ isChair: { type: 'boolean', default: false },
342
+ isLeadIndependent: { type: 'boolean', default: false },
342
343
  committees: {
343
- type: "array",
344
- items: { type: "string" },
345
- description: "Committee memberships by committee ID",
344
+ type: 'array',
345
+ items: { type: 'string' },
346
+ description: 'Committee memberships by committee ID',
346
347
  },
347
348
  electedBy: {
348
- type: "string",
349
- description: "Resolution reference for election",
349
+ type: 'string',
350
+ description: 'Resolution reference for election',
350
351
  },
351
- compensationAgreementRef: { type: "string", nullable: true },
352
+ compensationAgreementRef: { type: 'string', nullable: true },
352
353
  },
353
354
  },
354
355
  Meeting: {
355
- type: "object",
356
+ type: 'object',
356
357
  nullable: true,
357
358
  properties: {
358
- meetingId: { type: "string" },
359
+ meetingId: { type: 'string' },
359
360
  type: {
360
- type: "string",
361
- enum: ["REGULAR", "SPECIAL", "ANNUAL", "ORGANIZATIONAL"],
361
+ type: 'string',
362
+ enum: ['REGULAR', 'SPECIAL', 'ANNUAL', 'ORGANIZATIONAL'],
362
363
  },
363
- scheduledDate: { type: "string", format: "date-time" },
364
- location: { type: "string" },
365
- isVirtual: { type: "boolean" },
366
- calledBy: { type: "string" },
367
- noticeDate: { type: "string", format: "date" },
368
- agenda: { type: "array", items: { type: "string" } },
369
- attendees: { type: "array", items: { $ref: "#/definitions/Attendee" } },
370
- quorumPresent: { type: "boolean" },
371
- quorumCount: { type: "integer" },
372
- openedAt: { type: "string", format: "date-time", nullable: true },
373
- closedAt: { type: "string", format: "date-time", nullable: true },
374
- minutesRef: { type: "string", nullable: true },
364
+ scheduledDate: { type: 'string', format: 'date-time' },
365
+ location: { type: 'string' },
366
+ isVirtual: { type: 'boolean' },
367
+ calledBy: { type: 'string' },
368
+ noticeDate: { type: 'string', format: 'date' },
369
+ agenda: { type: 'array', items: { type: 'string' } },
370
+ attendees: { type: 'array', items: { $ref: '#/definitions/Attendee' } },
371
+ quorumPresent: { type: 'boolean' },
372
+ quorumCount: { type: 'integer' },
373
+ openedAt: { type: 'string', format: 'date-time', nullable: true },
374
+ closedAt: { type: 'string', format: 'date-time', nullable: true },
375
+ minutesRef: { type: 'string', nullable: true },
375
376
  },
376
377
  },
377
378
  Attendee: {
378
- type: "object",
379
+ type: 'object',
379
380
  properties: {
380
- directorId: { type: "string" },
381
- present: { type: "boolean" },
382
- arrivedAt: { type: "string", format: "date-time", nullable: true },
383
- departedAt: { type: "string", format: "date-time", nullable: true },
384
- viaProxy: { type: "boolean", default: false },
381
+ directorId: { type: 'string' },
382
+ present: { type: 'boolean' },
383
+ arrivedAt: { type: 'string', format: 'date-time', nullable: true },
384
+ departedAt: { type: 'string', format: 'date-time', nullable: true },
385
+ viaProxy: { type: 'boolean', default: false },
385
386
  },
386
387
  },
387
388
  MeetingRecord: {
388
- type: "object",
389
+ type: 'object',
389
390
  properties: {
390
- meetingId: { type: "string" },
391
- type: { type: "string" },
392
- date: { type: "string", format: "date" },
393
- quorumAchieved: { type: "boolean" },
394
- attendeeCount: { type: "integer" },
395
- resolutionsPassed: { type: "array", items: { type: "string" } },
396
- minutesRef: { type: "string" },
391
+ meetingId: { type: 'string' },
392
+ type: { type: 'string' },
393
+ date: { type: 'string', format: 'date' },
394
+ quorumAchieved: { type: 'boolean' },
395
+ attendeeCount: { type: 'integer' },
396
+ resolutionsPassed: { type: 'array', items: { type: 'string' } },
397
+ minutesRef: { type: 'string' },
397
398
  },
398
399
  },
399
400
  },
400
401
  states: {
401
402
  ACTIVE: {
402
- id: "ACTIVE",
403
+ id: 'ACTIVE',
403
404
  isFinal: false,
404
- description: "Board is constituted and able to conduct business. Default state between meetings.",
405
+ description: 'Board is constituted and able to conduct business. Default state between meetings.',
405
406
  },
406
407
  IN_MEETING: {
407
- id: "IN_MEETING",
408
+ id: 'IN_MEETING',
408
409
  isFinal: false,
409
- description: "Board meeting is in session with quorum present. Can take formal actions.",
410
+ description: 'Board meeting is in session with quorum present. Can take formal actions.',
410
411
  },
411
412
  QUORUM_LOST: {
412
- id: "QUORUM_LOST",
413
+ id: 'QUORUM_LOST',
413
414
  isFinal: false,
414
- description: "Meeting in progress but quorum lost due to departures. No further action until quorum restored or adjourned.",
415
+ description: 'Meeting in progress but quorum lost due to departures. No further action until quorum restored or adjourned.',
415
416
  },
416
417
  },
417
- initialState: "ACTIVE",
418
+ initialState: 'ACTIVE',
418
419
  transitions: [
419
420
  // ACTIVE -> ACTIVE (elect_director)
420
421
  {
421
- from: "ACTIVE",
422
- to: "ACTIVE",
423
- eventName: "elect_director",
422
+ from: 'ACTIVE',
423
+ to: 'ACTIVE',
424
+ eventName: 'elect_director',
424
425
  guard: {
425
426
  and: [
427
+ // vacancy gated solely on verified state — the forgeable event.isFillingVacancy disjunct was removed
428
+ { '>': [{ var: 'state.seats.vacant' }, 0] },
429
+ { '!=': [{ var: 'event.electionResolutionRef' }, null] },
426
430
  {
427
- or: [
428
- { ">": [{ var: "state.seats.vacant" }, 0] },
429
- { "==": [{ var: "event.isFillingVacancy" }, true] },
430
- ],
431
- },
432
- { "!=": [{ var: "event.electionResolutionRef" }, null] },
433
- {
434
- "!": {
431
+ '!': {
435
432
  some: [
436
- { var: "state.directors" },
433
+ { var: 'state.directors' },
437
434
  {
438
435
  and: [
439
436
  {
440
- "==": [
441
- { var: ".directorId" },
442
- { var: "event.directorId" },
443
- ],
437
+ '==': [{ var: 'directorId' }, { var: 'event.directorId' }],
444
438
  },
445
- { "==": [{ var: ".status" }, "ACTIVE"] },
439
+ { '==': [{ var: 'status' }, 'ACTIVE'] },
446
440
  ],
447
441
  },
448
442
  ],
@@ -452,258 +446,305 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
452
446
  },
453
447
  effect: {
454
448
  merge: [
455
- { var: "state" },
449
+ { var: 'state' },
456
450
  {
457
451
  directors: {
458
- cat: [
459
- { var: "state.directors" },
452
+ merge: [
453
+ { var: 'state.directors' },
460
454
  [
461
455
  {
462
- directorId: { var: "event.directorId" },
463
- name: { var: "event.name" },
464
- email: { var: "event.email" },
465
- termStart: { var: "event.termStart" },
466
- termEnd: { var: "event.termEnd" },
467
- class: { var: "event.class" },
468
- status: "ACTIVE",
469
- isIndependent: { var: "event.isIndependent" },
456
+ directorId: { var: 'event.directorId' },
457
+ name: { var: 'event.name' },
458
+ email: { var: 'event.email' },
459
+ termStart: { var: 'event.termStart' },
460
+ termEnd: { var: 'event.termEnd' },
461
+ class: { var: 'event.class' },
462
+ status: 'ACTIVE',
463
+ isIndependent: { var: 'event.isIndependent' },
470
464
  isChair: false,
471
465
  isLeadIndependent: false,
472
466
  committees: [],
473
- electedBy: { var: "event.electionResolutionRef" },
467
+ electedBy: { var: 'event.electionResolutionRef' },
474
468
  },
475
469
  ],
476
470
  ],
477
471
  },
478
472
  seats: {
479
473
  merge: [
480
- { var: "state.seats" },
474
+ { var: 'state.seats' },
481
475
  {
482
- filled: { "+": [{ var: "state.seats.filled" }, 1] },
483
- vacant: { "-": [{ var: "state.seats.vacant" }, 1] },
476
+ filled: { '+': [{ var: 'state.seats.filled' }, 1] },
477
+ vacant: { '-': [{ var: 'state.seats.vacant' }, 1] },
484
478
  },
485
479
  ],
486
480
  },
487
481
  },
482
+ {
483
+ _emit: [{ name: 'DIRECTOR_ELECTED', data: { var: 'event' }, destination: 'external' }],
484
+ },
488
485
  ],
489
486
  },
490
- emits: ["DIRECTOR_ELECTED"],
491
487
  },
492
488
  // ACTIVE -> ACTIVE (resign_director) and IN_MEETING -> ACTIVE (resign_director)
493
489
  {
494
- from: "ACTIVE",
495
- to: "ACTIVE",
496
- eventName: "resign_director",
490
+ from: 'ACTIVE',
491
+ to: 'ACTIVE',
492
+ eventName: 'resign_director',
497
493
  guard: {
498
494
  some: [
499
- { var: "state.directors" },
495
+ { var: 'state.directors' },
500
496
  {
501
497
  and: [
502
- { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
503
- { "==": [{ var: ".status" }, "ACTIVE"] },
498
+ { '==': [{ var: 'directorId' }, { var: 'event.directorId' }] },
499
+ { '==': [{ var: 'status' }, 'ACTIVE'] },
504
500
  ],
505
501
  },
506
502
  ],
507
503
  },
508
504
  effect: {
509
505
  merge: [
510
- { var: "state" },
506
+ { var: 'state' },
511
507
  {
512
508
  directors: {
513
509
  map: [
514
- { var: "state.directors" },
510
+ { var: 'state.directors' },
515
511
  {
516
512
  if: [
517
513
  {
518
- "==": [
519
- { var: ".directorId" },
520
- { var: "event.directorId" },
521
- ],
514
+ '==': [{ var: 'directorId' }, { var: 'event.directorId' }],
522
515
  },
523
516
  {
524
517
  merge: [
525
- { var: "" },
518
+ { var: '' },
526
519
  {
527
- status: "RESIGNED",
528
- termEnd: { var: "event.effectiveDate" },
520
+ status: 'RESIGNED',
521
+ termEnd: { var: 'event.effectiveDate' },
529
522
  },
530
523
  ],
531
524
  },
532
- { var: "" },
525
+ { var: '' },
533
526
  ],
534
527
  },
535
528
  ],
536
529
  },
537
530
  seats: {
538
531
  merge: [
539
- { var: "state.seats" },
532
+ { var: 'state.seats' },
540
533
  {
541
- filled: { "-": [{ var: "state.seats.filled" }, 1] },
542
- vacant: { "+": [{ var: "state.seats.vacant" }, 1] },
534
+ filled: { '-': [{ var: 'state.seats.filled' }, 1] },
535
+ vacant: { '+': [{ var: 'state.seats.vacant' }, 1] },
543
536
  },
544
537
  ],
545
538
  },
546
539
  },
540
+ {
541
+ _emit: [{ name: 'DIRECTOR_RESIGNED', data: { var: 'event' }, destination: 'external' }],
542
+ },
547
543
  ],
548
544
  },
549
- emits: ["DIRECTOR_RESIGNED"],
550
545
  },
551
546
  {
552
- from: "IN_MEETING",
553
- to: "ACTIVE",
554
- eventName: "resign_director",
547
+ from: 'IN_MEETING',
548
+ to: 'ACTIVE',
549
+ eventName: 'resign_director',
555
550
  guard: {
556
551
  some: [
557
- { var: "state.directors" },
552
+ { var: 'state.directors' },
558
553
  {
559
554
  and: [
560
- { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
561
- { "==": [{ var: ".status" }, "ACTIVE"] },
555
+ { '==': [{ var: 'directorId' }, { var: 'event.directorId' }] },
556
+ { '==': [{ var: 'status' }, 'ACTIVE'] },
562
557
  ],
563
558
  },
564
559
  ],
565
560
  },
566
561
  effect: {
567
562
  merge: [
568
- { var: "state" },
563
+ { var: 'state' },
569
564
  {
570
565
  directors: {
571
566
  map: [
572
- { var: "state.directors" },
567
+ { var: 'state.directors' },
573
568
  {
574
569
  if: [
575
570
  {
576
- "==": [
577
- { var: ".directorId" },
578
- { var: "event.directorId" },
579
- ],
571
+ '==': [{ var: 'directorId' }, { var: 'event.directorId' }],
580
572
  },
581
573
  {
582
574
  merge: [
583
- { var: "" },
575
+ { var: '' },
584
576
  {
585
- status: "RESIGNED",
586
- termEnd: { var: "event.effectiveDate" },
577
+ status: 'RESIGNED',
578
+ termEnd: { var: 'event.effectiveDate' },
587
579
  },
588
580
  ],
589
581
  },
590
- { var: "" },
582
+ { var: '' },
591
583
  ],
592
584
  },
593
585
  ],
594
586
  },
595
587
  seats: {
596
588
  merge: [
597
- { var: "state.seats" },
589
+ { var: 'state.seats' },
598
590
  {
599
- filled: { "-": [{ var: "state.seats.filled" }, 1] },
600
- vacant: { "+": [{ var: "state.seats.vacant" }, 1] },
591
+ filled: { '-': [{ var: 'state.seats.filled' }, 1] },
592
+ vacant: { '+': [{ var: 'state.seats.vacant' }, 1] },
601
593
  },
602
594
  ],
603
595
  },
604
596
  },
597
+ {
598
+ _emit: [{ name: 'DIRECTOR_RESIGNED', data: { var: 'event' }, destination: 'external' }],
599
+ },
605
600
  ],
606
601
  },
607
- emits: ["DIRECTOR_RESIGNED"],
608
602
  },
609
- // ACTIVE -> ACTIVE (remove_for_cause)
603
+ // ACTIVE -> ACTIVE (propose_removal) — phase 1 (#24): bind the executing resolution fiber and
604
+ // record the pending removal, so the next transition can read the resolution's state.
610
605
  {
611
- from: "ACTIVE",
612
- to: "ACTIVE",
613
- eventName: "remove_for_cause",
606
+ from: 'ACTIVE',
607
+ to: 'ACTIVE',
608
+ eventName: 'propose_removal',
614
609
  guard: {
615
- some: [
616
- { var: "state.directors" },
610
+ and: [
611
+ (0, guards_js_1.signerInSet)('state.authorizedRemovers'),
617
612
  {
618
- and: [
619
- { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
620
- { "==": [{ var: ".status" }, "ACTIVE"] },
613
+ some: [
614
+ { var: 'state.directors' },
615
+ {
616
+ and: [
617
+ { '==': [{ var: 'directorId' }, { var: 'event.directorId' }] },
618
+ { '==': [{ var: 'status' }, 'ACTIVE'] },
619
+ ],
620
+ },
621
+ ],
622
+ },
623
+ ],
624
+ },
625
+ effect: {
626
+ merge: [
627
+ { var: 'state' },
628
+ {
629
+ pendingRemoval: {
630
+ directorId: { var: 'event.directorId' },
631
+ cause: { var: 'event.cause' },
632
+ resolutionRef: { var: 'event.removalResolutionRef' },
633
+ proposedAt: { var: '$ordinal' },
634
+ },
635
+ },
636
+ // bind the resolution fiber so remove_for_cause can assert its state next transition
637
+ (0, effects_js_1.addDependency)({ var: 'event.removalResolutionRef' }),
638
+ ],
639
+ },
640
+ dependencies: [],
641
+ },
642
+ // ACTIVE -> ACTIVE (remove_for_cause) — phase 2 (#24): execute once the bound removal resolution is
643
+ // EXECUTED. depInState replaces the dropped object-form dependency (which silently never gated).
644
+ {
645
+ from: 'ACTIVE',
646
+ to: 'ACTIVE',
647
+ eventName: 'remove_for_cause',
648
+ // authority gate — a member of the pinned authorizedRemovers set must sign; an identity role
649
+ // attestation (BOARD_MEMBER/...) layers on additively when the identity registry lands (§4.2).
650
+ guard: {
651
+ and: [
652
+ (0, guards_js_1.signerInSet)('state.authorizedRemovers'),
653
+ // the proposal must target this director, and its bound resolution must be EXECUTED
654
+ {
655
+ '==': [{ var: 'state.pendingRemoval.directorId' }, { var: 'event.directorId' }],
656
+ },
657
+ (0, guards_js_1.depInState)('state.pendingRemoval.resolutionRef', 'EXECUTED'),
658
+ // event.directorId is the lookup key only — the director must exist and be ACTIVE
659
+ {
660
+ some: [
661
+ { var: 'state.directors' },
662
+ {
663
+ and: [
664
+ {
665
+ '==': [{ var: 'directorId' }, { var: 'event.directorId' }],
666
+ },
667
+ { '==': [{ var: 'status' }, 'ACTIVE'] },
668
+ ],
669
+ },
621
670
  ],
622
671
  },
623
672
  ],
624
673
  },
625
- dependencies: [
626
- {
627
- machine: "corporate-resolution",
628
- instanceRef: { var: "event.removalResolutionRef" },
629
- requiredState: "EXECUTED",
630
- },
631
- ],
632
674
  effect: {
633
675
  merge: [
634
- { var: "state" },
676
+ { var: 'state' },
635
677
  {
636
678
  directors: {
637
679
  map: [
638
- { var: "state.directors" },
680
+ { var: 'state.directors' },
639
681
  {
640
682
  if: [
641
683
  {
642
- "==": [
643
- { var: ".directorId" },
644
- { var: "event.directorId" },
645
- ],
684
+ '==': [{ var: 'directorId' }, { var: 'event.directorId' }],
646
685
  },
647
686
  {
648
687
  merge: [
649
- { var: "" },
688
+ { var: '' },
650
689
  {
651
- status: "REMOVED",
652
- termEnd: { var: "event.effectiveDate" },
690
+ status: 'REMOVED',
691
+ termEnd: { var: 'event.effectiveDate' },
653
692
  },
654
693
  ],
655
694
  },
656
- { var: "" },
695
+ { var: '' },
657
696
  ],
658
697
  },
659
698
  ],
660
699
  },
661
700
  seats: {
662
701
  merge: [
663
- { var: "state.seats" },
702
+ { var: 'state.seats' },
664
703
  {
665
- filled: { "-": [{ var: "state.seats.filled" }, 1] },
666
- vacant: { "+": [{ var: "state.seats.vacant" }, 1] },
704
+ filled: { '-': [{ var: 'state.seats.filled' }, 1] },
705
+ vacant: { '+': [{ var: 'state.seats.vacant' }, 1] },
667
706
  },
668
707
  ],
669
708
  },
709
+ // clear the consumed proposal
710
+ pendingRemoval: null,
711
+ },
712
+ {
713
+ _emit: [{ name: 'DIRECTOR_REMOVED', data: { var: 'event' }, destination: 'external' }],
670
714
  },
671
715
  ],
672
716
  },
673
- emits: ["DIRECTOR_REMOVED"],
717
+ dependencies: [],
674
718
  },
675
719
  // ACTIVE -> ACTIVE (designate_chair)
676
720
  {
677
- from: "ACTIVE",
678
- to: "ACTIVE",
679
- eventName: "designate_chair",
721
+ from: 'ACTIVE',
722
+ to: 'ACTIVE',
723
+ eventName: 'designate_chair',
680
724
  guard: {
681
725
  some: [
682
- { var: "state.directors" },
726
+ { var: 'state.directors' },
683
727
  {
684
728
  and: [
685
- { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
686
- { "==": [{ var: ".status" }, "ACTIVE"] },
729
+ { '==': [{ var: 'directorId' }, { var: 'event.directorId' }] },
730
+ { '==': [{ var: 'status' }, 'ACTIVE'] },
687
731
  ],
688
732
  },
689
733
  ],
690
734
  },
691
735
  effect: {
692
736
  merge: [
693
- { var: "state" },
737
+ { var: 'state' },
694
738
  {
695
739
  directors: {
696
740
  map: [
697
- { var: "state.directors" },
741
+ { var: 'state.directors' },
698
742
  {
699
743
  merge: [
700
- { var: "" },
744
+ { var: '' },
701
745
  {
702
746
  isChair: {
703
- "==": [
704
- { var: ".directorId" },
705
- { var: "event.directorId" },
706
- ],
747
+ '==': [{ var: 'directorId' }, { var: 'event.directorId' }],
707
748
  },
708
749
  },
709
750
  ],
@@ -716,21 +757,18 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
716
757
  },
717
758
  // ACTIVE -> ACTIVE (call_meeting)
718
759
  {
719
- from: "ACTIVE",
720
- to: "ACTIVE",
721
- eventName: "call_meeting",
760
+ from: 'ACTIVE',
761
+ to: 'ACTIVE',
762
+ eventName: 'call_meeting',
722
763
  guard: {
723
764
  and: [
724
765
  {
725
766
  or: [
726
- { "==": [{ var: "event.waiverOfNotice" }, true] },
767
+ { '==': [{ var: 'event.waiverOfNotice' }, true] },
727
768
  {
728
- ">=": [
769
+ '>=': [
729
770
  {
730
- "-": [
731
- { var: "event.scheduledDate" },
732
- { var: "event.noticeDate" },
733
- ],
771
+ '-': [{ var: 'event.scheduledDate' }, { var: 'event.noticeDate' }],
734
772
  },
735
773
  172800000, // 2 days in ms
736
774
  ],
@@ -739,52 +777,54 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
739
777
  },
740
778
  {
741
779
  or: [
742
- { "==": [{ var: "state.currentMeeting" }, null] },
743
- { "!=": [{ var: "state.currentMeeting.closedAt" }, null] },
780
+ { '==': [{ var: 'state.currentMeeting' }, null] },
781
+ { '!=': [{ var: 'state.currentMeeting.closedAt' }, null] },
744
782
  ],
745
783
  },
746
784
  ],
747
785
  },
748
786
  effect: {
749
787
  merge: [
750
- { var: "state" },
788
+ { var: 'state' },
751
789
  {
752
790
  currentMeeting: {
753
- meetingId: { var: "event.meetingId" },
754
- type: { var: "event.type" },
755
- scheduledDate: { var: "event.scheduledDate" },
756
- location: { var: "event.location" },
757
- isVirtual: { var: "event.isVirtual" },
758
- calledBy: { var: "event.calledBy" },
759
- noticeDate: { var: "event.noticeDate" },
760
- agenda: { var: "event.agenda" },
791
+ meetingId: { var: 'event.meetingId' },
792
+ type: { var: 'event.type' },
793
+ scheduledDate: { var: 'event.scheduledDate' },
794
+ location: { var: 'event.location' },
795
+ isVirtual: { var: 'event.isVirtual' },
796
+ calledBy: { var: 'event.calledBy' },
797
+ noticeDate: { var: 'event.noticeDate' },
798
+ agenda: { var: 'event.agenda' },
761
799
  attendees: [],
762
800
  quorumPresent: false,
763
801
  quorumCount: 0,
764
802
  },
765
803
  },
804
+ {
805
+ _emit: [{ name: 'BOARD_MEETING_SCHEDULED', data: { var: 'event' }, destination: 'external' }],
806
+ },
766
807
  ],
767
808
  },
768
- emits: ["BOARD_MEETING_SCHEDULED"],
769
809
  },
770
810
  // ACTIVE -> ACTIVE (record_attendance)
771
811
  {
772
- from: "ACTIVE",
773
- to: "ACTIVE",
774
- eventName: "record_attendance",
812
+ from: 'ACTIVE',
813
+ to: 'ACTIVE',
814
+ eventName: 'record_attendance',
775
815
  guard: {
776
816
  and: [
777
- { "!=": [{ var: "state.currentMeeting" }, null] },
778
- { "==": [{ var: "state.currentMeeting.openedAt" }, null] },
817
+ { '!=': [{ var: 'state.currentMeeting' }, null] },
818
+ { '==': [{ var: 'state.currentMeeting.openedAt' }, null] },
779
819
  {
780
820
  some: [
781
- { var: "state.directors" },
821
+ { var: 'state.directors' },
782
822
  {
783
823
  and: [
784
824
  {
785
- "==": [{ var: ".directorId" }, { var: "event.directorId" }],
825
+ '==': [{ var: 'directorId' }, { var: 'event.directorId' }],
786
826
  },
787
- { "==": [{ var: ".status" }, "ACTIVE"] },
827
+ { '==': [{ var: 'status' }, 'ACTIVE'] },
788
828
  ],
789
829
  },
790
830
  ],
@@ -793,20 +833,20 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
793
833
  },
794
834
  effect: {
795
835
  merge: [
796
- { var: "state" },
836
+ { var: 'state' },
797
837
  {
798
838
  currentMeeting: {
799
839
  merge: [
800
- { var: "state.currentMeeting" },
840
+ { var: 'state.currentMeeting' },
801
841
  {
802
842
  attendees: {
803
- cat: [
804
- { var: "state.currentMeeting.attendees" },
843
+ merge: [
844
+ { var: 'state.currentMeeting.attendees' },
805
845
  [
806
846
  {
807
- directorId: { var: "event.directorId" },
808
- present: { var: "event.present" },
809
- arrivedAt: { var: "event.arrivedAt" },
847
+ directorId: { var: 'event.directorId' },
848
+ present: { var: 'event.present' },
849
+ arrivedAt: { var: 'event.arrivedAt' },
810
850
  viaProxy: false,
811
851
  },
812
852
  ],
@@ -821,67 +861,63 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
821
861
  },
822
862
  // ACTIVE -> IN_MEETING (open_meeting)
823
863
  {
824
- from: "ACTIVE",
825
- to: "IN_MEETING",
826
- eventName: "open_meeting",
864
+ from: 'ACTIVE',
865
+ to: 'IN_MEETING',
866
+ eventName: 'open_meeting',
827
867
  guard: {
828
868
  and: [
829
- { "!=": [{ var: "state.currentMeeting" }, null] },
830
- { "==": [{ var: "state.currentMeeting.openedAt" }, null] },
831
- { "==": [{ var: "state.currentMeeting.quorumPresent" }, true] },
869
+ { '!=': [{ var: 'state.currentMeeting' }, null] },
870
+ { '==': [{ var: 'state.currentMeeting.openedAt' }, null] },
871
+ { '==': [{ var: 'state.currentMeeting.quorumPresent' }, true] },
832
872
  ],
833
873
  },
834
874
  effect: {
835
875
  merge: [
836
- { var: "state" },
876
+ { var: 'state' },
837
877
  {
838
- status: "IN_MEETING",
878
+ status: 'IN_MEETING',
839
879
  currentMeeting: {
840
- merge: [
841
- { var: "state.currentMeeting" },
842
- { openedAt: { var: "event.openedAt" } },
843
- ],
880
+ merge: [{ var: 'state.currentMeeting' }, { openedAt: { var: 'event.openedAt' } }],
844
881
  },
845
882
  },
883
+ {
884
+ _emit: [{ name: 'BOARD_MEETING_OPENED', data: { var: 'event' }, destination: 'external' }],
885
+ },
846
886
  ],
847
887
  },
848
- emits: ["BOARD_MEETING_OPENED"],
849
888
  },
850
889
  // IN_MEETING -> IN_MEETING (director_departs)
851
890
  {
852
- from: "IN_MEETING",
853
- to: "IN_MEETING",
854
- eventName: "director_departs",
855
- guard: { "==": [1, 1] },
891
+ from: 'IN_MEETING',
892
+ to: 'IN_MEETING',
893
+ eventName: 'director_departs',
894
+ guard: { '==': [1, 1] },
856
895
  effect: {
857
896
  merge: [
858
- { var: "state" },
897
+ { var: 'state' },
859
898
  {
860
899
  currentMeeting: {
861
900
  merge: [
862
- { var: "state.currentMeeting" },
901
+ { var: 'state.currentMeeting' },
863
902
  {
864
903
  attendees: {
865
904
  map: [
866
- { var: "state.currentMeeting.attendees" },
905
+ { var: 'state.currentMeeting.attendees' },
867
906
  {
868
907
  if: [
869
908
  {
870
- "==": [
871
- { var: ".directorId" },
872
- { var: "event.directorId" },
873
- ],
909
+ '==': [{ var: 'directorId' }, { var: 'event.directorId' }],
874
910
  },
875
911
  {
876
912
  merge: [
877
- { var: "" },
913
+ { var: '' },
878
914
  {
879
915
  present: false,
880
- departedAt: { var: "event.departedAt" },
916
+ departedAt: { var: 'event.departedAt' },
881
917
  },
882
918
  ],
883
919
  },
884
- { var: "" },
920
+ { var: '' },
885
921
  ],
886
922
  },
887
923
  ],
@@ -895,121 +931,129 @@ exports.corpBoardDef = (0, fiber_app_js_1.defineFiberApp)({
895
931
  },
896
932
  // IN_MEETING -> QUORUM_LOST
897
933
  {
898
- from: "IN_MEETING",
899
- to: "QUORUM_LOST",
900
- eventName: "quorum_lost",
901
- guard: { "==": [{ var: "state.currentMeeting.quorumPresent" }, false] },
934
+ from: 'IN_MEETING',
935
+ to: 'QUORUM_LOST',
936
+ eventName: 'quorum_lost',
937
+ guard: { '==': [{ var: 'state.currentMeeting.quorumPresent' }, false] },
902
938
  effect: {
903
- merge: [{ var: "state" }, { status: "QUORUM_LOST" }],
939
+ merge: [
940
+ { var: 'state' },
941
+ { status: 'QUORUM_LOST' },
942
+ {
943
+ _emit: [{ name: 'BOARD_QUORUM_LOST', data: { var: 'event' }, destination: 'external' }],
944
+ },
945
+ ],
904
946
  },
905
- emits: ["BOARD_QUORUM_LOST"],
906
947
  },
907
948
  // QUORUM_LOST -> IN_MEETING
908
949
  {
909
- from: "QUORUM_LOST",
910
- to: "IN_MEETING",
911
- eventName: "quorum_restored",
912
- guard: { "==": [{ var: "state.currentMeeting.quorumPresent" }, true] },
950
+ from: 'QUORUM_LOST',
951
+ to: 'IN_MEETING',
952
+ eventName: 'quorum_restored',
953
+ guard: { '==': [{ var: 'state.currentMeeting.quorumPresent' }, true] },
913
954
  effect: {
914
- merge: [{ var: "state" }, { status: "IN_MEETING" }],
955
+ merge: [
956
+ { var: 'state' },
957
+ { status: 'IN_MEETING' },
958
+ {
959
+ _emit: [{ name: 'BOARD_QUORUM_RESTORED', data: { var: 'event' }, destination: 'external' }],
960
+ },
961
+ ],
915
962
  },
916
- emits: ["BOARD_QUORUM_RESTORED"],
917
963
  },
918
964
  // IN_MEETING -> ACTIVE (adjourn)
919
965
  {
920
- from: "IN_MEETING",
921
- to: "ACTIVE",
922
- eventName: "adjourn",
923
- guard: { "==": [1, 1] },
966
+ from: 'IN_MEETING',
967
+ to: 'ACTIVE',
968
+ eventName: 'adjourn',
969
+ guard: { '==': [1, 1] },
924
970
  effect: {
925
971
  merge: [
926
- { var: "state" },
972
+ { var: 'state' },
927
973
  {
928
- status: "ACTIVE",
974
+ status: 'ACTIVE',
929
975
  currentMeeting: null,
930
976
  meetingHistory: {
931
- cat: [
932
- { var: "state.meetingHistory" },
977
+ merge: [
978
+ { var: 'state.meetingHistory' },
933
979
  [
934
980
  {
935
- meetingId: { var: "state.currentMeeting.meetingId" },
936
- type: { var: "state.currentMeeting.type" },
937
- date: { var: "state.currentMeeting.scheduledDate" },
981
+ meetingId: { var: 'state.currentMeeting.meetingId' },
982
+ type: { var: 'state.currentMeeting.type' },
983
+ date: { var: 'state.currentMeeting.scheduledDate' },
938
984
  quorumAchieved: {
939
- var: "state.currentMeeting.quorumPresent",
985
+ var: 'state.currentMeeting.quorumPresent',
940
986
  },
941
- attendeeCount: { var: "state.currentMeeting.quorumCount" },
942
- resolutionsPassed: { var: "event.resolutionsPassed" },
943
- minutesRef: { var: "event.minutesRef" },
987
+ attendeeCount: { var: 'state.currentMeeting.quorumCount' },
988
+ resolutionsPassed: { var: 'event.resolutionsPassed' },
989
+ minutesRef: { var: 'event.minutesRef' },
944
990
  },
945
991
  ],
946
992
  ],
947
993
  },
948
994
  },
995
+ {
996
+ _emit: [{ name: 'BOARD_MEETING_ADJOURNED', data: { var: 'event' }, destination: 'external' }],
997
+ },
949
998
  ],
950
999
  },
951
- emits: ["BOARD_MEETING_ADJOURNED"],
952
1000
  },
953
1001
  // QUORUM_LOST -> ACTIVE (adjourn)
954
1002
  {
955
- from: "QUORUM_LOST",
956
- to: "ACTIVE",
957
- eventName: "adjourn",
958
- guard: { "==": [1, 1] },
1003
+ from: 'QUORUM_LOST',
1004
+ to: 'ACTIVE',
1005
+ eventName: 'adjourn',
1006
+ guard: { '==': [1, 1] },
959
1007
  effect: {
960
1008
  merge: [
961
- { var: "state" },
1009
+ { var: 'state' },
962
1010
  {
963
- status: "ACTIVE",
1011
+ status: 'ACTIVE',
964
1012
  currentMeeting: null,
965
1013
  meetingHistory: {
966
- cat: [
967
- { var: "state.meetingHistory" },
1014
+ merge: [
1015
+ { var: 'state.meetingHistory' },
968
1016
  [
969
1017
  {
970
- meetingId: { var: "state.currentMeeting.meetingId" },
971
- type: { var: "state.currentMeeting.type" },
972
- date: { var: "state.currentMeeting.scheduledDate" },
1018
+ meetingId: { var: 'state.currentMeeting.meetingId' },
1019
+ type: { var: 'state.currentMeeting.type' },
1020
+ date: { var: 'state.currentMeeting.scheduledDate' },
973
1021
  quorumAchieved: {
974
- var: "state.currentMeeting.quorumPresent",
1022
+ var: 'state.currentMeeting.quorumPresent',
975
1023
  },
976
- attendeeCount: { var: "state.currentMeeting.quorumCount" },
977
- resolutionsPassed: { var: "event.resolutionsPassed" },
978
- minutesRef: { var: "event.minutesRef" },
1024
+ attendeeCount: { var: 'state.currentMeeting.quorumCount' },
1025
+ resolutionsPassed: { var: 'event.resolutionsPassed' },
1026
+ minutesRef: { var: 'event.minutesRef' },
979
1027
  },
980
1028
  ],
981
1029
  ],
982
1030
  },
983
1031
  },
1032
+ {
1033
+ _emit: [{ name: 'BOARD_MEETING_ADJOURNED', data: { var: 'event' }, destination: 'external' }],
1034
+ },
984
1035
  ],
985
1036
  },
986
- emits: ["BOARD_MEETING_ADJOURNED"],
987
1037
  },
988
1038
  // ACTIVE -> ACTIVE (update_seats)
989
1039
  {
990
- from: "ACTIVE",
991
- to: "ACTIVE",
992
- eventName: "update_seats",
1040
+ from: 'ACTIVE',
1041
+ to: 'ACTIVE',
1042
+ eventName: 'update_seats',
993
1043
  guard: {
994
- ">=": [
995
- { var: "event.newAuthorizedSeats" },
996
- { var: "state.seats.filled" },
997
- ],
1044
+ '>=': [{ var: 'event.newAuthorizedSeats' }, { var: 'state.seats.filled' }],
998
1045
  },
999
1046
  effect: {
1000
1047
  merge: [
1001
- { var: "state" },
1048
+ { var: 'state' },
1002
1049
  {
1003
1050
  seats: {
1004
1051
  merge: [
1005
- { var: "state.seats" },
1052
+ { var: 'state.seats' },
1006
1053
  {
1007
- authorized: { var: "event.newAuthorizedSeats" },
1054
+ authorized: { var: 'event.newAuthorizedSeats' },
1008
1055
  vacant: {
1009
- "-": [
1010
- { var: "event.newAuthorizedSeats" },
1011
- { var: "state.seats.filled" },
1012
- ],
1056
+ '-': [{ var: 'event.newAuthorizedSeats' }, { var: 'state.seats.filled' }],
1013
1057
  },
1014
1058
  },
1015
1059
  ],