@ottochain/sdk 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/dist/cjs/apps/contracts/index.js +15 -8
  2. package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +35 -40
  3. package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +80 -37
  4. package/dist/cjs/apps/contracts/state-machines/contract-universal.js +4 -4
  5. package/dist/cjs/apps/corporate/index.js +2 -2
  6. package/dist/cjs/apps/corporate/state-machines/corp-board.js +169 -59
  7. package/dist/cjs/apps/corporate/state-machines/corp-entity.js +245 -47
  8. package/dist/cjs/apps/corporate/state-machines/corp-securities.js +407 -99
  9. package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +151 -37
  10. package/dist/cjs/apps/governance/index.js +14 -14
  11. package/dist/cjs/apps/governance/state-machines/dao-multisig.js +58 -40
  12. package/dist/cjs/apps/governance/state-machines/dao-reputation.js +46 -40
  13. package/dist/cjs/apps/governance/state-machines/dao-single.js +28 -11
  14. package/dist/cjs/apps/governance/state-machines/dao-token.js +67 -41
  15. package/dist/cjs/apps/governance/state-machines/governance-simple.js +93 -61
  16. package/dist/cjs/apps/governance/state-machines/governance-universal.js +2 -2
  17. package/dist/cjs/apps/identity/constants.js +55 -14
  18. package/dist/cjs/apps/identity/index.js +27 -11
  19. package/dist/cjs/apps/identity/state-machines/identity-agent.js +3 -3
  20. package/dist/cjs/apps/identity/state-machines/identity-oracle.js +25 -22
  21. package/dist/cjs/apps/identity/state-machines/identity-registry.js +288 -0
  22. package/dist/cjs/apps/identity/state-machines/identity-universal.js +3 -3
  23. package/dist/cjs/apps/identity/state-machines/index.js +3 -1
  24. package/dist/cjs/apps/index.js +19 -8
  25. package/dist/cjs/apps/lending/assets.js +223 -0
  26. package/dist/cjs/apps/lending/credit-scoring.js +87 -0
  27. package/dist/cjs/apps/lending/eligibility.js +121 -0
  28. package/dist/cjs/apps/lending/index.js +91 -0
  29. package/dist/cjs/apps/lending/state-machines/index.js +9 -0
  30. package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +412 -0
  31. package/dist/cjs/apps/markets/index.js +21 -11
  32. package/dist/cjs/apps/markets/state-machines/market-auction.js +14 -13
  33. package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +29 -24
  34. package/dist/cjs/apps/markets/state-machines/market-group-buy.js +24 -26
  35. package/dist/cjs/apps/markets/state-machines/market-prediction.js +80 -53
  36. package/dist/cjs/apps/markets/state-machines/market-universal.js +5 -5
  37. package/dist/cjs/apps/oracles/index.js +2 -2
  38. package/dist/cjs/errors.js +3 -3
  39. package/dist/cjs/generated/google/protobuf/struct.js +4 -4
  40. package/dist/cjs/generated/index.js +11 -7
  41. package/dist/cjs/generated/openapi.js +6 -0
  42. package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +50 -50
  43. package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +19 -20
  44. package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +13 -13
  45. package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +4 -4
  46. package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +124 -130
  47. package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +107 -107
  48. package/dist/cjs/generated/ottochain/v1/common.js +4 -4
  49. package/dist/cjs/generated/ottochain/v1/fiber.js +4 -4
  50. package/dist/cjs/index.js +41 -7
  51. package/dist/cjs/openapi.js +2 -0
  52. package/dist/cjs/ottochain/drop-nulls.js +1 -2
  53. package/dist/cjs/ottochain/genesis-manifest.js +11 -11
  54. package/dist/cjs/ottochain/index.js +23 -13
  55. package/dist/cjs/ottochain/metagraph-client.js +65 -8
  56. package/dist/cjs/ottochain/snapshot.js +11 -12
  57. package/dist/cjs/ottochain/transaction.js +57 -14
  58. package/dist/cjs/ottochain/types.js +16 -2
  59. package/dist/cjs/privacy/index.js +14 -0
  60. package/dist/cjs/privacy/sealed-bid.js +210 -0
  61. package/dist/cjs/privacy/shield-app.js +131 -0
  62. package/dist/cjs/schema/effects.js +40 -0
  63. package/dist/cjs/schema/fiber-app.js +19 -13
  64. package/dist/cjs/schema/guard-lint.js +352 -0
  65. package/dist/cjs/schema/guards.js +246 -0
  66. package/dist/cjs/signing.js +80 -0
  67. package/dist/cjs/types.js +2 -3
  68. package/dist/cjs/validation.js +8 -8
  69. package/dist/cjs/verify.js +9 -4
  70. package/dist/cjs/zk/commit.js +53 -0
  71. package/dist/cjs/zk/guard.js +107 -0
  72. package/dist/cjs/zk/index.js +48 -0
  73. package/dist/cjs/zk/preimage.js +37 -0
  74. package/dist/cjs/zk/prover.js +87 -0
  75. package/dist/cjs/zk/registry.js +62 -0
  76. package/dist/cjs/zk/types.js +28 -0
  77. package/dist/cjs/zk/witness.js +19 -0
  78. package/dist/esm/apps/contracts/index.js +7 -3
  79. package/dist/esm/apps/contracts/state-machines/contract-agreement.js +35 -40
  80. package/dist/esm/apps/contracts/state-machines/contract-escrow.js +80 -37
  81. package/dist/esm/apps/contracts/state-machines/contract-universal.js +4 -4
  82. package/dist/esm/apps/corporate/state-machines/corp-board.js +169 -59
  83. package/dist/esm/apps/corporate/state-machines/corp-entity.js +245 -47
  84. package/dist/esm/apps/corporate/state-machines/corp-securities.js +407 -99
  85. package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +151 -37
  86. package/dist/esm/apps/governance/state-machines/dao-multisig.js +58 -40
  87. package/dist/esm/apps/governance/state-machines/dao-reputation.js +46 -40
  88. package/dist/esm/apps/governance/state-machines/dao-single.js +28 -11
  89. package/dist/esm/apps/governance/state-machines/dao-token.js +67 -41
  90. package/dist/esm/apps/governance/state-machines/governance-simple.js +93 -61
  91. package/dist/esm/apps/governance/state-machines/governance-universal.js +2 -2
  92. package/dist/esm/apps/identity/constants.js +51 -12
  93. package/dist/esm/apps/identity/index.js +12 -7
  94. package/dist/esm/apps/identity/state-machines/identity-agent.js +3 -3
  95. package/dist/esm/apps/identity/state-machines/identity-oracle.js +25 -22
  96. package/dist/esm/apps/identity/state-machines/identity-registry.js +285 -0
  97. package/dist/esm/apps/identity/state-machines/identity-universal.js +3 -3
  98. package/dist/esm/apps/identity/state-machines/index.js +1 -0
  99. package/dist/esm/apps/index.js +1 -0
  100. package/dist/esm/apps/lending/assets.js +207 -0
  101. package/dist/esm/apps/lending/credit-scoring.js +81 -0
  102. package/dist/esm/apps/lending/eligibility.js +115 -0
  103. package/dist/esm/apps/lending/index.js +69 -0
  104. package/dist/esm/apps/lending/state-machines/index.js +5 -0
  105. package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +409 -0
  106. package/dist/esm/apps/markets/index.js +8 -4
  107. package/dist/esm/apps/markets/state-machines/market-auction.js +14 -13
  108. package/dist/esm/apps/markets/state-machines/market-crowdfund.js +29 -24
  109. package/dist/esm/apps/markets/state-machines/market-group-buy.js +24 -26
  110. package/dist/esm/apps/markets/state-machines/market-prediction.js +80 -53
  111. package/dist/esm/apps/markets/state-machines/market-universal.js +5 -5
  112. package/dist/esm/generated/index.js +9 -5
  113. package/dist/esm/generated/openapi.js +5 -0
  114. package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +46 -46
  115. package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +114 -120
  116. package/dist/esm/generated/ottochain/apps/markets/v1/market.js +100 -100
  117. package/dist/esm/index.js +21 -2
  118. package/dist/esm/openapi.js +1 -0
  119. package/dist/esm/ottochain/genesis-manifest.js +9 -9
  120. package/dist/esm/ottochain/index.js +2 -3
  121. package/dist/esm/ottochain/metagraph-client.js +65 -8
  122. package/dist/esm/ottochain/snapshot.js +4 -4
  123. package/dist/esm/ottochain/transaction.js +43 -3
  124. package/dist/esm/ottochain/types.js +15 -1
  125. package/dist/esm/privacy/index.js +6 -0
  126. package/dist/esm/privacy/sealed-bid.js +206 -0
  127. package/dist/esm/privacy/shield-app.js +127 -0
  128. package/dist/esm/schema/effects.js +35 -0
  129. package/dist/esm/schema/fiber-app.js +13 -6
  130. package/dist/esm/schema/guard-lint.js +346 -0
  131. package/dist/esm/schema/guards.js +229 -0
  132. package/dist/esm/signing.js +74 -0
  133. package/dist/esm/verify.js +8 -2
  134. package/dist/esm/zk/commit.js +44 -0
  135. package/dist/esm/zk/guard.js +99 -0
  136. package/dist/esm/zk/index.js +19 -0
  137. package/dist/esm/zk/preimage.js +30 -0
  138. package/dist/esm/zk/prover.js +82 -0
  139. package/dist/esm/zk/registry.js +55 -0
  140. package/dist/esm/zk/types.js +25 -0
  141. package/dist/esm/zk/witness.js +15 -0
  142. package/dist/types/apps/contracts/index.d.ts +69 -209
  143. package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +20 -95
  144. package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +46 -112
  145. package/dist/types/apps/corporate/index.d.ts +1040 -304
  146. package/dist/types/apps/corporate/state-machines/corp-board.d.ts +188 -52
  147. package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +267 -62
  148. package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +355 -131
  149. package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +225 -53
  150. package/dist/types/apps/governance/index.d.ts +296 -398
  151. package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +77 -92
  152. package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +42 -66
  153. package/dist/types/apps/governance/state-machines/dao-single.d.ts +25 -47
  154. package/dist/types/apps/governance/state-machines/dao-token.d.ts +60 -49
  155. package/dist/types/apps/governance/state-machines/governance-simple.d.ts +87 -117
  156. package/dist/types/apps/governance/state-machines/governance-universal.d.ts +2 -2
  157. package/dist/types/apps/identity/constants.d.ts +32 -4
  158. package/dist/types/apps/identity/index.d.ts +378 -94
  159. package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +16 -87
  160. package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
  161. package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
  162. package/dist/types/apps/index.d.ts +1 -0
  163. package/dist/types/apps/lending/assets.d.ts +258 -0
  164. package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
  165. package/dist/types/apps/lending/eligibility.d.ts +83 -0
  166. package/dist/types/apps/lending/index.d.ts +548 -0
  167. package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
  168. package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +528 -0
  169. package/dist/types/apps/markets/index.d.ts +108 -203
  170. package/dist/types/apps/markets/state-machines/market-auction.d.ts +13 -37
  171. package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +16 -34
  172. package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +17 -43
  173. package/dist/types/apps/markets/state-machines/market-prediction.d.ts +51 -72
  174. package/dist/types/apps/markets/state-machines/market-universal.d.ts +5 -5
  175. package/dist/types/generated/index.d.ts +5 -5
  176. package/dist/types/generated/openapi.d.ts +1257 -0
  177. package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
  178. package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
  179. package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
  180. package/dist/types/index.d.ts +6 -2
  181. package/dist/types/openapi.d.ts +22 -0
  182. package/dist/types/ottochain/genesis-manifest.d.ts +5 -5
  183. package/dist/types/ottochain/index.d.ts +5 -6
  184. package/dist/types/ottochain/metagraph-client.d.ts +49 -7
  185. package/dist/types/ottochain/snapshot.d.ts +6 -6
  186. package/dist/types/ottochain/transaction.d.ts +33 -1
  187. package/dist/types/ottochain/types.d.ts +335 -30
  188. package/dist/types/privacy/index.d.ts +6 -0
  189. package/dist/types/privacy/sealed-bid.d.ts +348 -0
  190. package/dist/types/privacy/shield-app.d.ts +48 -0
  191. package/dist/types/schema/effects.d.ts +34 -0
  192. package/dist/types/schema/fiber-app.d.ts +1 -2
  193. package/dist/types/schema/guard-lint.d.ts +111 -0
  194. package/dist/types/schema/guards.d.ts +134 -0
  195. package/dist/types/signing.d.ts +45 -0
  196. package/dist/types/validation.d.ts +22 -217
  197. package/dist/types/verify.d.ts +4 -0
  198. package/dist/types/zk/commit.d.ts +28 -0
  199. package/dist/types/zk/guard.d.ts +46 -0
  200. package/dist/types/zk/index.d.ts +19 -0
  201. package/dist/types/zk/preimage.d.ts +10 -0
  202. package/dist/types/zk/prover.d.ts +34 -0
  203. package/dist/types/zk/registry.d.ts +34 -0
  204. package/dist/types/zk/types.d.ts +33 -0
  205. package/dist/types/zk/witness.d.ts +40 -0
  206. package/package.json +27 -13
  207. package/dist/cjs/ottochain/normalize.js +0 -186
  208. package/dist/esm/ottochain/normalize.js +0 -179
  209. package/dist/types/ottochain/normalize.d.ts +0 -79
@@ -1,4 +1,6 @@
1
1
  import { defineFiberApp } from "../../../schema/fiber-app.js";
2
+ import { signerInSet, depInState } from "../../../schema/guards.js";
3
+ import { addDependency } from "../../../schema/effects.js";
2
4
  /**
3
5
  * Board of directors state machine managing director seats, meetings, quorum, and formal board actions.
4
6
  * Supports staggered boards with classified directors.
@@ -34,7 +36,7 @@ export const corpBoardDef = defineFiberApp({
34
36
  },
35
37
  },
36
38
  createSchema: {
37
- required: ["boardId", "entityId", "seats"],
39
+ required: ["boardId", "entityId", "seats", "authorizedRemovers"],
38
40
  properties: {
39
41
  boardId: {
40
42
  type: "string",
@@ -46,6 +48,12 @@ export const corpBoardDef = defineFiberApp({
46
48
  description: "Reference to parent corporate-entity",
47
49
  immutable: true,
48
50
  },
51
+ authorizedRemovers: {
52
+ type: "array",
53
+ 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.",
54
+ immutable: false,
55
+ items: { type: "address" },
56
+ },
49
57
  seats: {
50
58
  type: "object",
51
59
  properties: {
@@ -119,6 +127,7 @@ export const corpBoardDef = defineFiberApp({
119
127
  properties: {
120
128
  boardId: { type: "string", immutable: true },
121
129
  entityId: { type: "string", immutable: true },
130
+ authorizedRemovers: { type: "array", items: { type: "address" } },
122
131
  directors: {
123
132
  type: "array",
124
133
  items: { $ref: "#/definitions/Director" },
@@ -145,6 +154,9 @@ export const corpBoardDef = defineFiberApp({
145
154
  },
146
155
  createdAt: { type: "timestamp", computed: true },
147
156
  updatedAt: { type: "timestamp", computed: true },
157
+ // Two-phase removal (#24): propose_removal binds the resolution fiber + records the pending
158
+ // removal here; remove_for_cause asserts the bound resolution is EXECUTED, then clears this.
159
+ pendingRemoval: { type: "object", nullable: true, computed: true },
148
160
  },
149
161
  },
150
162
  eventSchemas: {
@@ -189,18 +201,20 @@ export const corpBoardDef = defineFiberApp({
189
201
  },
190
202
  },
191
203
  },
192
- remove_for_cause: {
193
- description: "Remove a director for cause (requires board or shareholder action depending on bylaws)",
194
- required: [
195
- "directorId",
196
- "cause",
197
- "removalResolutionRef",
198
- "effectiveDate",
199
- ],
204
+ propose_removal: {
205
+ description: "Phase 1 of for-cause removal: bind the executing resolution fiber (#24 _addDependency) and record the pending removal",
206
+ required: ["directorId", "cause", "removalResolutionRef"],
200
207
  properties: {
201
208
  directorId: { type: "string" },
202
209
  cause: { type: "string" },
203
210
  removalResolutionRef: { type: "string" },
211
+ },
212
+ },
213
+ remove_for_cause: {
214
+ description: "Phase 2 of for-cause removal: execute once the bound removal resolution is EXECUTED",
215
+ required: ["directorId", "effectiveDate"],
216
+ properties: {
217
+ directorId: { type: "string" },
204
218
  effectiveDate: { type: "string", format: "date" },
205
219
  },
206
220
  },
@@ -420,12 +434,8 @@ export const corpBoardDef = defineFiberApp({
420
434
  eventName: "elect_director",
421
435
  guard: {
422
436
  and: [
423
- {
424
- or: [
425
- { ">": [{ var: "state.seats.vacant" }, 0] },
426
- { "==": [{ var: "event.isFillingVacancy" }, true] },
427
- ],
428
- },
437
+ // vacancy gated solely on verified state — the forgeable event.isFillingVacancy disjunct was removed
438
+ { ">": [{ var: "state.seats.vacant" }, 0] },
429
439
  { "!=": [{ var: "event.electionResolutionRef" }, null] },
430
440
  {
431
441
  "!": {
@@ -435,11 +445,11 @@ export const corpBoardDef = defineFiberApp({
435
445
  and: [
436
446
  {
437
447
  "==": [
438
- { var: ".directorId" },
448
+ { var: "directorId" },
439
449
  { var: "event.directorId" },
440
450
  ],
441
451
  },
442
- { "==": [{ var: ".status" }, "ACTIVE"] },
452
+ { "==": [{ var: "status" }, "ACTIVE"] },
443
453
  ],
444
454
  },
445
455
  ],
@@ -452,7 +462,7 @@ export const corpBoardDef = defineFiberApp({
452
462
  { var: "state" },
453
463
  {
454
464
  directors: {
455
- cat: [
465
+ merge: [
456
466
  { var: "state.directors" },
457
467
  [
458
468
  {
@@ -482,9 +492,13 @@ export const corpBoardDef = defineFiberApp({
482
492
  ],
483
493
  },
484
494
  },
495
+ {
496
+ _emit: [
497
+ { name: "DIRECTOR_ELECTED", data: { var: "event" }, destination: "external" },
498
+ ],
499
+ },
485
500
  ],
486
501
  },
487
- emits: ["DIRECTOR_ELECTED"],
488
502
  },
489
503
  // ACTIVE -> ACTIVE (resign_director) and IN_MEETING -> ACTIVE (resign_director)
490
504
  {
@@ -496,8 +510,8 @@ export const corpBoardDef = defineFiberApp({
496
510
  { var: "state.directors" },
497
511
  {
498
512
  and: [
499
- { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
500
- { "==": [{ var: ".status" }, "ACTIVE"] },
513
+ { "==": [{ var: "directorId" }, { var: "event.directorId" }] },
514
+ { "==": [{ var: "status" }, "ACTIVE"] },
501
515
  ],
502
516
  },
503
517
  ],
@@ -513,7 +527,7 @@ export const corpBoardDef = defineFiberApp({
513
527
  if: [
514
528
  {
515
529
  "==": [
516
- { var: ".directorId" },
530
+ { var: "directorId" },
517
531
  { var: "event.directorId" },
518
532
  ],
519
533
  },
@@ -541,9 +555,13 @@ export const corpBoardDef = defineFiberApp({
541
555
  ],
542
556
  },
543
557
  },
558
+ {
559
+ _emit: [
560
+ { name: "DIRECTOR_RESIGNED", data: { var: "event" }, destination: "external" },
561
+ ],
562
+ },
544
563
  ],
545
564
  },
546
- emits: ["DIRECTOR_RESIGNED"],
547
565
  },
548
566
  {
549
567
  from: "IN_MEETING",
@@ -554,8 +572,8 @@ export const corpBoardDef = defineFiberApp({
554
572
  { var: "state.directors" },
555
573
  {
556
574
  and: [
557
- { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
558
- { "==": [{ var: ".status" }, "ACTIVE"] },
575
+ { "==": [{ var: "directorId" }, { var: "event.directorId" }] },
576
+ { "==": [{ var: "status" }, "ACTIVE"] },
559
577
  ],
560
578
  },
561
579
  ],
@@ -571,7 +589,7 @@ export const corpBoardDef = defineFiberApp({
571
589
  if: [
572
590
  {
573
591
  "==": [
574
- { var: ".directorId" },
592
+ { var: "directorId" },
575
593
  { var: "event.directorId" },
576
594
  ],
577
595
  },
@@ -599,33 +617,88 @@ export const corpBoardDef = defineFiberApp({
599
617
  ],
600
618
  },
601
619
  },
620
+ {
621
+ _emit: [
622
+ { name: "DIRECTOR_RESIGNED", data: { var: "event" }, destination: "external" },
623
+ ],
624
+ },
602
625
  ],
603
626
  },
604
- emits: ["DIRECTOR_RESIGNED"],
605
627
  },
606
- // ACTIVE -> ACTIVE (remove_for_cause)
628
+ // ACTIVE -> ACTIVE (propose_removal) — phase 1 (#24): bind the executing resolution fiber and
629
+ // record the pending removal, so the next transition can read the resolution's state.
630
+ {
631
+ from: "ACTIVE",
632
+ to: "ACTIVE",
633
+ eventName: "propose_removal",
634
+ guard: {
635
+ and: [
636
+ signerInSet("state.authorizedRemovers"),
637
+ {
638
+ some: [
639
+ { var: "state.directors" },
640
+ {
641
+ and: [
642
+ { "==": [{ var: "directorId" }, { var: "event.directorId" }] },
643
+ { "==": [{ var: "status" }, "ACTIVE"] },
644
+ ],
645
+ },
646
+ ],
647
+ },
648
+ ],
649
+ },
650
+ effect: {
651
+ merge: [
652
+ { var: "state" },
653
+ {
654
+ pendingRemoval: {
655
+ directorId: { var: "event.directorId" },
656
+ cause: { var: "event.cause" },
657
+ resolutionRef: { var: "event.removalResolutionRef" },
658
+ proposedAt: { var: "$ordinal" },
659
+ },
660
+ },
661
+ // bind the resolution fiber so remove_for_cause can assert its state next transition
662
+ addDependency({ var: "event.removalResolutionRef" }),
663
+ ],
664
+ },
665
+ dependencies: [],
666
+ },
667
+ // ACTIVE -> ACTIVE (remove_for_cause) — phase 2 (#24): execute once the bound removal resolution is
668
+ // EXECUTED. depInState replaces the dropped object-form dependency (which silently never gated).
607
669
  {
608
670
  from: "ACTIVE",
609
671
  to: "ACTIVE",
610
672
  eventName: "remove_for_cause",
673
+ // authority gate — a member of the pinned authorizedRemovers set must sign; an identity role
674
+ // attestation (BOARD_MEMBER/...) layers on additively when the identity registry lands (§4.2).
611
675
  guard: {
612
- some: [
613
- { var: "state.directors" },
676
+ and: [
677
+ signerInSet("state.authorizedRemovers"),
678
+ // the proposal must target this director, and its bound resolution must be EXECUTED
614
679
  {
615
- and: [
616
- { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
617
- { "==": [{ var: ".status" }, "ACTIVE"] },
680
+ "==": [
681
+ { var: "state.pendingRemoval.directorId" },
682
+ { var: "event.directorId" },
683
+ ],
684
+ },
685
+ depInState("state.pendingRemoval.resolutionRef", "EXECUTED"),
686
+ // event.directorId is the lookup key only — the director must exist and be ACTIVE
687
+ {
688
+ some: [
689
+ { var: "state.directors" },
690
+ {
691
+ and: [
692
+ {
693
+ "==": [{ var: "directorId" }, { var: "event.directorId" }],
694
+ },
695
+ { "==": [{ var: "status" }, "ACTIVE"] },
696
+ ],
697
+ },
618
698
  ],
619
699
  },
620
700
  ],
621
701
  },
622
- dependencies: [
623
- {
624
- machine: "corporate-resolution",
625
- instanceRef: { var: "event.removalResolutionRef" },
626
- requiredState: "EXECUTED",
627
- },
628
- ],
629
702
  effect: {
630
703
  merge: [
631
704
  { var: "state" },
@@ -637,7 +710,7 @@ export const corpBoardDef = defineFiberApp({
637
710
  if: [
638
711
  {
639
712
  "==": [
640
- { var: ".directorId" },
713
+ { var: "directorId" },
641
714
  { var: "event.directorId" },
642
715
  ],
643
716
  },
@@ -664,10 +737,17 @@ export const corpBoardDef = defineFiberApp({
664
737
  },
665
738
  ],
666
739
  },
740
+ // clear the consumed proposal
741
+ pendingRemoval: null,
742
+ },
743
+ {
744
+ _emit: [
745
+ { name: "DIRECTOR_REMOVED", data: { var: "event" }, destination: "external" },
746
+ ],
667
747
  },
668
748
  ],
669
749
  },
670
- emits: ["DIRECTOR_REMOVED"],
750
+ dependencies: [],
671
751
  },
672
752
  // ACTIVE -> ACTIVE (designate_chair)
673
753
  {
@@ -679,8 +759,8 @@ export const corpBoardDef = defineFiberApp({
679
759
  { var: "state.directors" },
680
760
  {
681
761
  and: [
682
- { "==": [{ var: ".directorId" }, { var: "event.directorId" }] },
683
- { "==": [{ var: ".status" }, "ACTIVE"] },
762
+ { "==": [{ var: "directorId" }, { var: "event.directorId" }] },
763
+ { "==": [{ var: "status" }, "ACTIVE"] },
684
764
  ],
685
765
  },
686
766
  ],
@@ -698,7 +778,7 @@ export const corpBoardDef = defineFiberApp({
698
778
  {
699
779
  isChair: {
700
780
  "==": [
701
- { var: ".directorId" },
781
+ { var: "directorId" },
702
782
  { var: "event.directorId" },
703
783
  ],
704
784
  },
@@ -760,9 +840,13 @@ export const corpBoardDef = defineFiberApp({
760
840
  quorumCount: 0,
761
841
  },
762
842
  },
843
+ {
844
+ _emit: [
845
+ { name: "BOARD_MEETING_SCHEDULED", data: { var: "event" }, destination: "external" },
846
+ ],
847
+ },
763
848
  ],
764
849
  },
765
- emits: ["BOARD_MEETING_SCHEDULED"],
766
850
  },
767
851
  // ACTIVE -> ACTIVE (record_attendance)
768
852
  {
@@ -779,9 +863,9 @@ export const corpBoardDef = defineFiberApp({
779
863
  {
780
864
  and: [
781
865
  {
782
- "==": [{ var: ".directorId" }, { var: "event.directorId" }],
866
+ "==": [{ var: "directorId" }, { var: "event.directorId" }],
783
867
  },
784
- { "==": [{ var: ".status" }, "ACTIVE"] },
868
+ { "==": [{ var: "status" }, "ACTIVE"] },
785
869
  ],
786
870
  },
787
871
  ],
@@ -797,7 +881,7 @@ export const corpBoardDef = defineFiberApp({
797
881
  { var: "state.currentMeeting" },
798
882
  {
799
883
  attendees: {
800
- cat: [
884
+ merge: [
801
885
  { var: "state.currentMeeting.attendees" },
802
886
  [
803
887
  {
@@ -840,9 +924,13 @@ export const corpBoardDef = defineFiberApp({
840
924
  ],
841
925
  },
842
926
  },
927
+ {
928
+ _emit: [
929
+ { name: "BOARD_MEETING_OPENED", data: { var: "event" }, destination: "external" },
930
+ ],
931
+ },
843
932
  ],
844
933
  },
845
- emits: ["BOARD_MEETING_OPENED"],
846
934
  },
847
935
  // IN_MEETING -> IN_MEETING (director_departs)
848
936
  {
@@ -865,7 +953,7 @@ export const corpBoardDef = defineFiberApp({
865
953
  if: [
866
954
  {
867
955
  "==": [
868
- { var: ".directorId" },
956
+ { var: "directorId" },
869
957
  { var: "event.directorId" },
870
958
  ],
871
959
  },
@@ -897,9 +985,16 @@ export const corpBoardDef = defineFiberApp({
897
985
  eventName: "quorum_lost",
898
986
  guard: { "==": [{ var: "state.currentMeeting.quorumPresent" }, false] },
899
987
  effect: {
900
- merge: [{ var: "state" }, { status: "QUORUM_LOST" }],
988
+ merge: [
989
+ { var: "state" },
990
+ { status: "QUORUM_LOST" },
991
+ {
992
+ _emit: [
993
+ { name: "BOARD_QUORUM_LOST", data: { var: "event" }, destination: "external" },
994
+ ],
995
+ },
996
+ ],
901
997
  },
902
- emits: ["BOARD_QUORUM_LOST"],
903
998
  },
904
999
  // QUORUM_LOST -> IN_MEETING
905
1000
  {
@@ -908,9 +1003,16 @@ export const corpBoardDef = defineFiberApp({
908
1003
  eventName: "quorum_restored",
909
1004
  guard: { "==": [{ var: "state.currentMeeting.quorumPresent" }, true] },
910
1005
  effect: {
911
- merge: [{ var: "state" }, { status: "IN_MEETING" }],
1006
+ merge: [
1007
+ { var: "state" },
1008
+ { status: "IN_MEETING" },
1009
+ {
1010
+ _emit: [
1011
+ { name: "BOARD_QUORUM_RESTORED", data: { var: "event" }, destination: "external" },
1012
+ ],
1013
+ },
1014
+ ],
912
1015
  },
913
- emits: ["BOARD_QUORUM_RESTORED"],
914
1016
  },
915
1017
  // IN_MEETING -> ACTIVE (adjourn)
916
1018
  {
@@ -925,7 +1027,7 @@ export const corpBoardDef = defineFiberApp({
925
1027
  status: "ACTIVE",
926
1028
  currentMeeting: null,
927
1029
  meetingHistory: {
928
- cat: [
1030
+ merge: [
929
1031
  { var: "state.meetingHistory" },
930
1032
  [
931
1033
  {
@@ -943,9 +1045,13 @@ export const corpBoardDef = defineFiberApp({
943
1045
  ],
944
1046
  },
945
1047
  },
1048
+ {
1049
+ _emit: [
1050
+ { name: "BOARD_MEETING_ADJOURNED", data: { var: "event" }, destination: "external" },
1051
+ ],
1052
+ },
946
1053
  ],
947
1054
  },
948
- emits: ["BOARD_MEETING_ADJOURNED"],
949
1055
  },
950
1056
  // QUORUM_LOST -> ACTIVE (adjourn)
951
1057
  {
@@ -960,7 +1066,7 @@ export const corpBoardDef = defineFiberApp({
960
1066
  status: "ACTIVE",
961
1067
  currentMeeting: null,
962
1068
  meetingHistory: {
963
- cat: [
1069
+ merge: [
964
1070
  { var: "state.meetingHistory" },
965
1071
  [
966
1072
  {
@@ -978,9 +1084,13 @@ export const corpBoardDef = defineFiberApp({
978
1084
  ],
979
1085
  },
980
1086
  },
1087
+ {
1088
+ _emit: [
1089
+ { name: "BOARD_MEETING_ADJOURNED", data: { var: "event" }, destination: "external" },
1090
+ ],
1091
+ },
981
1092
  ],
982
1093
  },
983
- emits: ["BOARD_MEETING_ADJOURNED"],
984
1094
  },
985
1095
  // ACTIVE -> ACTIVE (update_seats)
986
1096
  {