@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.
- package/dist/cjs/apps/compute/index.js +33 -0
- package/dist/cjs/apps/compute/state-machines/compute-rule110.js +164 -0
- package/dist/cjs/apps/compute/state-machines/index.js +9 -0
- package/dist/cjs/apps/contracts/index.js +16 -9
- package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +134 -161
- package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +192 -170
- package/dist/cjs/apps/contracts/state-machines/contract-universal.js +46 -58
- package/dist/cjs/apps/corporate/index.js +2 -2
- package/dist/cjs/apps/corporate/state-machines/corp-board.js +500 -456
- package/dist/cjs/apps/corporate/state-machines/corp-entity.js +487 -361
- package/dist/cjs/apps/corporate/state-machines/corp-securities.js +769 -576
- package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +567 -557
- package/dist/cjs/apps/governance/index.js +21 -21
- package/dist/cjs/apps/governance/state-machines/dao-multisig.js +188 -209
- package/dist/cjs/apps/governance/state-machines/dao-reputation.js +181 -228
- package/dist/cjs/apps/governance/state-machines/dao-single.js +105 -88
- package/dist/cjs/apps/governance/state-machines/dao-token.js +199 -227
- package/dist/cjs/apps/governance/state-machines/governance-simple.js +231 -231
- package/dist/cjs/apps/governance/state-machines/governance-universal.js +64 -64
- package/dist/cjs/apps/identity/constants.js +55 -22
- package/dist/cjs/apps/identity/index.js +28 -12
- package/dist/cjs/apps/identity/state-machines/identity-agent.js +124 -158
- package/dist/cjs/apps/identity/state-machines/identity-oracle.js +158 -173
- package/dist/cjs/apps/identity/state-machines/identity-registry.js +262 -0
- package/dist/cjs/apps/identity/state-machines/identity-universal.js +51 -57
- package/dist/cjs/apps/identity/state-machines/index.js +3 -1
- package/dist/cjs/apps/index.js +22 -8
- package/dist/cjs/apps/lending/assets.js +247 -0
- package/dist/cjs/apps/lending/credit-scoring.js +87 -0
- package/dist/cjs/apps/lending/eligibility.js +105 -0
- package/dist/cjs/apps/lending/index.js +91 -0
- package/dist/cjs/apps/lending/state-machines/index.js +9 -0
- package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +433 -0
- package/dist/cjs/apps/markets/index.js +22 -12
- package/dist/cjs/apps/markets/state-machines/market-auction.js +116 -134
- package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +131 -141
- package/dist/cjs/apps/markets/state-machines/market-group-buy.js +163 -184
- package/dist/cjs/apps/markets/state-machines/market-prediction.js +226 -233
- package/dist/cjs/apps/markets/state-machines/market-universal.js +65 -80
- package/dist/cjs/apps/oracles/index.js +3 -3
- package/dist/cjs/apps/privacy/index.js +67 -0
- package/dist/cjs/apps/privacy/state-machines/index.js +17 -0
- package/dist/cjs/apps/privacy/state-machines/mixer-ddhRing.js +286 -0
- package/dist/cjs/apps/privacy/state-machines/note-pool.js +476 -0
- package/dist/cjs/apps/staked-pool/assets.js +103 -0
- package/dist/cjs/apps/staked-pool/base.js +498 -0
- package/dist/cjs/apps/staked-pool/consumer.js +55 -0
- package/dist/cjs/apps/staked-pool/index.js +83 -0
- package/dist/cjs/apps/staked-pool/state-machines/index.js +12 -0
- package/dist/cjs/apps/staked-pool/state-machines/staked-pool-base.js +49 -0
- package/dist/cjs/apps/staked-pool/state-machines/staked-pool-oracle.js +131 -0
- package/dist/cjs/errors.js +3 -3
- package/dist/cjs/generated/google/protobuf/struct.js +5 -5
- package/dist/cjs/generated/google/protobuf/timestamp.js +1 -1
- package/dist/cjs/generated/index.js +11 -7
- package/dist/cjs/generated/openapi.js +6 -0
- package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +51 -51
- package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +20 -21
- package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +14 -14
- package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +5 -5
- package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +125 -131
- package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +108 -108
- package/dist/cjs/generated/ottochain/v1/common.js +5 -5
- package/dist/cjs/generated/ottochain/v1/fiber.js +44 -6
- package/dist/cjs/generated/ottochain/v1/messages.js +1 -1
- package/dist/cjs/generated/ottochain/v1/records.js +1 -1
- package/dist/cjs/index.js +58 -7
- package/dist/cjs/openapi.js +2 -0
- package/dist/cjs/ottochain/drop-nulls.js +1 -2
- package/dist/cjs/ottochain/genesis-manifest.js +17 -11
- package/dist/cjs/ottochain/index.js +23 -13
- package/dist/cjs/ottochain/metagraph-client.js +81 -16
- package/dist/cjs/ottochain/snapshot.js +13 -16
- package/dist/cjs/ottochain/transaction.js +67 -14
- package/dist/cjs/ottochain/types.js +16 -2
- package/dist/cjs/privacy/index.js +14 -0
- package/dist/cjs/privacy/sealed-bid.js +213 -0
- package/dist/cjs/privacy/shield-app.js +131 -0
- package/dist/cjs/schema/effects.js +156 -0
- package/dist/cjs/schema/fiber-app.js +150 -15
- package/dist/cjs/schema/guard-lint.js +343 -0
- package/dist/cjs/schema/guards.js +246 -0
- package/dist/cjs/signing.js +80 -0
- package/dist/cjs/templates/asset-policy.js +190 -0
- package/dist/cjs/templates/index.js +86 -0
- package/dist/cjs/templates/machine.js +130 -0
- package/dist/cjs/templates/migration.js +39 -0
- package/dist/cjs/templates/state-shape.js +38 -0
- package/dist/cjs/types.js +2 -3
- package/dist/cjs/validation.js +9 -11
- package/dist/cjs/verify.js +9 -4
- package/dist/cjs/zk/commit.js +53 -0
- package/dist/cjs/zk/guard.js +107 -0
- package/dist/cjs/zk/index.js +48 -0
- package/dist/cjs/zk/preimage.js +37 -0
- package/dist/cjs/zk/prover.js +87 -0
- package/dist/cjs/zk/registry.js +62 -0
- package/dist/cjs/zk/types.js +28 -0
- package/dist/cjs/zk/witness.js +19 -0
- package/dist/esm/apps/compute/index.js +29 -0
- package/dist/esm/apps/compute/state-machines/compute-rule110.js +161 -0
- package/dist/esm/apps/compute/state-machines/index.js +5 -0
- package/dist/esm/apps/contracts/index.js +9 -5
- package/dist/esm/apps/contracts/state-machines/contract-agreement.js +135 -162
- package/dist/esm/apps/contracts/state-machines/contract-escrow.js +193 -171
- package/dist/esm/apps/contracts/state-machines/contract-universal.js +47 -59
- package/dist/esm/apps/corporate/index.js +2 -2
- package/dist/esm/apps/corporate/state-machines/corp-board.js +501 -457
- package/dist/esm/apps/corporate/state-machines/corp-entity.js +488 -362
- package/dist/esm/apps/corporate/state-machines/corp-securities.js +770 -577
- package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +568 -558
- package/dist/esm/apps/governance/index.js +10 -10
- package/dist/esm/apps/governance/state-machines/dao-multisig.js +189 -210
- package/dist/esm/apps/governance/state-machines/dao-reputation.js +182 -229
- package/dist/esm/apps/governance/state-machines/dao-single.js +106 -89
- package/dist/esm/apps/governance/state-machines/dao-token.js +200 -228
- package/dist/esm/apps/governance/state-machines/governance-simple.js +232 -232
- package/dist/esm/apps/governance/state-machines/governance-universal.js +65 -65
- package/dist/esm/apps/identity/constants.js +52 -21
- package/dist/esm/apps/identity/index.js +14 -9
- package/dist/esm/apps/identity/state-machines/identity-agent.js +125 -159
- package/dist/esm/apps/identity/state-machines/identity-oracle.js +159 -174
- package/dist/esm/apps/identity/state-machines/identity-registry.js +259 -0
- package/dist/esm/apps/identity/state-machines/identity-universal.js +52 -58
- package/dist/esm/apps/identity/state-machines/index.js +1 -0
- package/dist/esm/apps/index.js +9 -5
- package/dist/esm/apps/lending/assets.js +231 -0
- package/dist/esm/apps/lending/credit-scoring.js +81 -0
- package/dist/esm/apps/lending/eligibility.js +99 -0
- package/dist/esm/apps/lending/index.js +69 -0
- package/dist/esm/apps/lending/state-machines/index.js +5 -0
- package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +430 -0
- package/dist/esm/apps/markets/index.js +11 -7
- package/dist/esm/apps/markets/state-machines/market-auction.js +117 -135
- package/dist/esm/apps/markets/state-machines/market-crowdfund.js +132 -142
- package/dist/esm/apps/markets/state-machines/market-group-buy.js +164 -185
- package/dist/esm/apps/markets/state-machines/market-prediction.js +227 -234
- package/dist/esm/apps/markets/state-machines/market-universal.js +66 -81
- package/dist/esm/apps/oracles/index.js +3 -3
- package/dist/esm/apps/privacy/index.js +56 -0
- package/dist/esm/apps/privacy/state-machines/index.js +6 -0
- package/dist/esm/apps/privacy/state-machines/mixer-ddhRing.js +282 -0
- package/dist/esm/apps/privacy/state-machines/note-pool.js +470 -0
- package/dist/esm/apps/staked-pool/assets.js +91 -0
- package/dist/esm/apps/staked-pool/base.js +493 -0
- package/dist/esm/apps/staked-pool/consumer.js +49 -0
- package/dist/esm/apps/staked-pool/index.js +60 -0
- package/dist/esm/apps/staked-pool/state-machines/index.js +6 -0
- package/dist/esm/apps/staked-pool/state-machines/staked-pool-base.js +46 -0
- package/dist/esm/apps/staked-pool/state-machines/staked-pool-oracle.js +127 -0
- package/dist/esm/generated/google/protobuf/struct.js +1 -1
- package/dist/esm/generated/google/protobuf/timestamp.js +1 -1
- package/dist/esm/generated/index.js +9 -5
- package/dist/esm/generated/openapi.js +5 -0
- package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +47 -47
- package/dist/esm/generated/ottochain/apps/corporate/v1/corporate.js +1 -1
- package/dist/esm/generated/ottochain/apps/governance/v1/governance.js +1 -1
- package/dist/esm/generated/ottochain/apps/identity/v1/attestation.js +1 -1
- package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +115 -121
- package/dist/esm/generated/ottochain/apps/markets/v1/market.js +101 -101
- package/dist/esm/generated/ottochain/v1/common.js +1 -1
- package/dist/esm/generated/ottochain/v1/fiber.js +40 -2
- package/dist/esm/generated/ottochain/v1/messages.js +1 -1
- package/dist/esm/generated/ottochain/v1/records.js +1 -1
- package/dist/esm/index.js +28 -3
- package/dist/esm/openapi.js +1 -0
- package/dist/esm/ottochain/genesis-manifest.js +15 -9
- package/dist/esm/ottochain/index.js +2 -3
- package/dist/esm/ottochain/metagraph-client.js +81 -16
- package/dist/esm/ottochain/snapshot.js +6 -8
- package/dist/esm/ottochain/transaction.js +51 -3
- package/dist/esm/ottochain/types.js +15 -1
- package/dist/esm/privacy/index.js +6 -0
- package/dist/esm/privacy/sealed-bid.js +209 -0
- package/dist/esm/privacy/shield-app.js +127 -0
- package/dist/esm/schema/effects.js +145 -0
- package/dist/esm/schema/fiber-app.js +139 -8
- package/dist/esm/schema/guard-lint.js +337 -0
- package/dist/esm/schema/guards.js +228 -0
- package/dist/esm/signing.js +74 -0
- package/dist/esm/templates/asset-policy.js +182 -0
- package/dist/esm/templates/index.js +41 -0
- package/dist/esm/templates/machine.js +125 -0
- package/dist/esm/templates/migration.js +34 -0
- package/dist/esm/templates/state-shape.js +34 -0
- package/dist/esm/validation.js +1 -3
- package/dist/esm/verify.js +8 -2
- package/dist/esm/zk/commit.js +44 -0
- package/dist/esm/zk/guard.js +99 -0
- package/dist/esm/zk/index.js +19 -0
- package/dist/esm/zk/preimage.js +30 -0
- package/dist/esm/zk/prover.js +82 -0
- package/dist/esm/zk/registry.js +55 -0
- package/dist/esm/zk/types.js +25 -0
- package/dist/esm/zk/witness.js +15 -0
- package/dist/types/apps/compute/index.d.ts +176 -0
- package/dist/types/apps/compute/state-machines/compute-rule110.d.ts +157 -0
- package/dist/types/apps/compute/state-machines/index.d.ts +5 -0
- package/dist/types/apps/contracts/index.d.ts +81 -221
- package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +23 -98
- package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +49 -115
- package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +4 -4
- package/dist/types/apps/corporate/index.d.ts +1176 -440
- package/dist/types/apps/corporate/state-machines/corp-board.d.ts +271 -135
- package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +279 -74
- package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +373 -149
- package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +252 -80
- package/dist/types/apps/governance/index.d.ts +368 -470
- package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +92 -107
- package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +61 -85
- package/dist/types/apps/governance/state-machines/dao-single.d.ts +25 -47
- package/dist/types/apps/governance/state-machines/dao-token.d.ts +79 -68
- package/dist/types/apps/governance/state-machines/governance-simple.d.ts +95 -125
- package/dist/types/apps/governance/state-machines/governance-universal.d.ts +6 -6
- package/dist/types/apps/identity/constants.d.ts +33 -5
- package/dist/types/apps/identity/index.d.ts +415 -131
- package/dist/types/apps/identity/state-machines/identity-agent.d.ts +23 -23
- package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +27 -98
- package/dist/types/apps/identity/state-machines/identity-registry.d.ts +379 -0
- package/dist/types/apps/identity/state-machines/identity-universal.d.ts +4 -4
- package/dist/types/apps/identity/state-machines/index.d.ts +1 -0
- package/dist/types/apps/index.d.ts +9 -5
- package/dist/types/apps/lending/assets.d.ts +258 -0
- package/dist/types/apps/lending/credit-scoring.d.ts +80 -0
- package/dist/types/apps/lending/eligibility.d.ts +83 -0
- package/dist/types/apps/lending/index.d.ts +556 -0
- package/dist/types/apps/lending/state-machines/index.d.ts +5 -0
- package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +536 -0
- package/dist/types/apps/markets/index.d.ts +181 -276
- package/dist/types/apps/markets/state-machines/market-auction.d.ts +25 -49
- package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +35 -53
- package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +35 -61
- package/dist/types/apps/markets/state-machines/market-prediction.d.ts +65 -86
- package/dist/types/apps/markets/state-machines/market-universal.d.ts +12 -12
- package/dist/types/apps/oracles/index.d.ts +1 -1
- package/dist/types/apps/privacy/index.d.ts +328 -0
- package/dist/types/apps/privacy/state-machines/index.d.ts +6 -0
- package/dist/types/apps/privacy/state-machines/mixer-ddhRing.d.ts +337 -0
- package/dist/types/apps/privacy/state-machines/note-pool.d.ts +196 -0
- package/dist/types/apps/staked-pool/assets.d.ts +53 -0
- package/dist/types/apps/staked-pool/base.d.ts +80 -0
- package/dist/types/apps/staked-pool/consumer.d.ts +29 -0
- package/dist/types/apps/staked-pool/index.d.ts +51 -0
- package/dist/types/apps/staked-pool/state-machines/index.d.ts +6 -0
- package/dist/types/apps/staked-pool/state-machines/staked-pool-base.d.ts +8 -0
- package/dist/types/apps/staked-pool/state-machines/staked-pool-oracle.d.ts +34 -0
- package/dist/types/generated/index.d.ts +5 -5
- package/dist/types/generated/openapi.d.ts +1270 -0
- package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +5 -5
- package/dist/types/generated/ottochain/apps/identity/v1/identity.d.ts +12 -12
- package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +11 -11
- package/dist/types/generated/ottochain/v1/fiber.d.ts +7 -0
- package/dist/types/index.d.ts +7 -3
- package/dist/types/openapi.d.ts +24 -0
- package/dist/types/ottochain/genesis-manifest.d.ts +11 -5
- package/dist/types/ottochain/index.d.ts +5 -6
- package/dist/types/ottochain/metagraph-client.d.ts +49 -7
- package/dist/types/ottochain/snapshot.d.ts +6 -6
- package/dist/types/ottochain/transaction.d.ts +41 -1
- package/dist/types/ottochain/types.d.ts +336 -31
- package/dist/types/privacy/index.d.ts +6 -0
- package/dist/types/privacy/sealed-bid.d.ts +348 -0
- package/dist/types/privacy/shield-app.d.ts +48 -0
- package/dist/types/schema/effects.d.ts +141 -0
- package/dist/types/schema/fiber-app.d.ts +282 -2
- package/dist/types/schema/guard-lint.d.ts +111 -0
- package/dist/types/schema/guards.d.ts +146 -0
- package/dist/types/signing.d.ts +45 -0
- package/dist/types/templates/asset-policy.d.ts +119 -0
- package/dist/types/templates/index.d.ts +26 -0
- package/dist/types/templates/machine.d.ts +139 -0
- package/dist/types/templates/migration.d.ts +34 -0
- package/dist/types/templates/state-shape.d.ts +30 -0
- package/dist/types/validation.d.ts +22 -217
- package/dist/types/verify.d.ts +4 -0
- package/dist/types/zk/commit.d.ts +28 -0
- package/dist/types/zk/guard.d.ts +46 -0
- package/dist/types/zk/index.d.ts +19 -0
- package/dist/types/zk/preimage.d.ts +10 -0
- package/dist/types/zk/prover.d.ts +34 -0
- package/dist/types/zk/registry.d.ts +34 -0
- package/dist/types/zk/types.d.ts +33 -0
- package/dist/types/zk/witness.d.ts +40 -0
- package/package.json +47 -15
- package/dist/cjs/ottochain/normalize.js +0 -186
- package/dist/esm/ottochain/normalize.js +0 -179
- 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:
|
|
12
|
-
app:
|
|
13
|
-
type:
|
|
14
|
-
version:
|
|
15
|
-
description:
|
|
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:
|
|
19
|
-
description:
|
|
20
|
-
foreignKey:
|
|
20
|
+
machine: 'corporate-entity',
|
|
21
|
+
description: 'Parent corporate entity',
|
|
22
|
+
foreignKey: 'entityId',
|
|
21
23
|
},
|
|
22
24
|
resolutions: {
|
|
23
|
-
machine:
|
|
24
|
-
description:
|
|
25
|
-
foreignKey:
|
|
25
|
+
machine: 'corporate-resolution',
|
|
26
|
+
description: 'Board resolutions',
|
|
27
|
+
foreignKey: 'boardId',
|
|
26
28
|
},
|
|
27
29
|
committees: {
|
|
28
|
-
machine:
|
|
29
|
-
description:
|
|
30
|
-
foreignKey:
|
|
30
|
+
machine: 'corporate-committee',
|
|
31
|
+
description: 'Board committees',
|
|
32
|
+
foreignKey: 'boardId',
|
|
31
33
|
},
|
|
32
34
|
officers: {
|
|
33
|
-
machine:
|
|
34
|
-
description:
|
|
35
|
-
foreignKey:
|
|
35
|
+
machine: 'corporate-officers',
|
|
36
|
+
description: 'Officers appointed by board',
|
|
37
|
+
foreignKey: 'entityId',
|
|
36
38
|
},
|
|
37
39
|
},
|
|
38
40
|
},
|
|
39
41
|
createSchema: {
|
|
40
|
-
required: [
|
|
42
|
+
required: ['boardId', 'entityId', 'seats', 'authorizedRemovers'],
|
|
41
43
|
properties: {
|
|
42
44
|
boardId: {
|
|
43
|
-
type:
|
|
44
|
-
description:
|
|
45
|
+
type: 'string',
|
|
46
|
+
description: 'Unique identifier for this board instance',
|
|
45
47
|
immutable: true,
|
|
46
48
|
},
|
|
47
49
|
entityId: {
|
|
48
|
-
type:
|
|
49
|
-
description:
|
|
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:
|
|
61
|
+
type: 'object',
|
|
54
62
|
properties: {
|
|
55
63
|
authorized: {
|
|
56
|
-
type:
|
|
57
|
-
description:
|
|
64
|
+
type: 'integer',
|
|
65
|
+
description: 'Number of board seats authorized by bylaws',
|
|
58
66
|
},
|
|
59
|
-
filled: { type:
|
|
60
|
-
vacant: { type:
|
|
67
|
+
filled: { type: 'integer' },
|
|
68
|
+
vacant: { type: 'integer' },
|
|
61
69
|
},
|
|
62
70
|
},
|
|
63
71
|
boardStructure: {
|
|
64
|
-
type:
|
|
72
|
+
type: 'object',
|
|
65
73
|
properties: {
|
|
66
74
|
isClassified: {
|
|
67
|
-
type:
|
|
68
|
-
description:
|
|
75
|
+
type: 'boolean',
|
|
76
|
+
description: 'Whether board has staggered terms',
|
|
69
77
|
},
|
|
70
78
|
termYears: {
|
|
71
|
-
type:
|
|
79
|
+
type: 'integer',
|
|
72
80
|
default: 1,
|
|
73
|
-
description:
|
|
81
|
+
description: 'Director term length',
|
|
74
82
|
},
|
|
75
83
|
classTerms: {
|
|
76
|
-
type:
|
|
84
|
+
type: 'object',
|
|
77
85
|
properties: {
|
|
78
|
-
CLASS_I: { type:
|
|
79
|
-
CLASS_II: { type:
|
|
80
|
-
CLASS_III: { type:
|
|
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:
|
|
94
|
+
type: 'object',
|
|
87
95
|
properties: {
|
|
88
96
|
type: {
|
|
89
|
-
type:
|
|
90
|
-
enum: [
|
|
91
|
-
default:
|
|
97
|
+
type: 'string',
|
|
98
|
+
enum: ['MAJORITY', 'SUPERMAJORITY', 'FIXED_NUMBER'],
|
|
99
|
+
default: 'MAJORITY',
|
|
92
100
|
},
|
|
93
101
|
threshold: {
|
|
94
|
-
type:
|
|
95
|
-
description:
|
|
102
|
+
type: 'number',
|
|
103
|
+
description: 'Fraction for majority/super, or count for fixed',
|
|
96
104
|
},
|
|
97
105
|
minimumRequired: {
|
|
98
|
-
type:
|
|
99
|
-
description:
|
|
106
|
+
type: 'integer',
|
|
107
|
+
description: 'Absolute minimum regardless of formula',
|
|
100
108
|
},
|
|
101
109
|
},
|
|
102
110
|
},
|
|
103
111
|
votingRules: {
|
|
104
|
-
type:
|
|
112
|
+
type: 'object',
|
|
105
113
|
properties: {
|
|
106
114
|
standardApproval: {
|
|
107
|
-
type:
|
|
108
|
-
enum: [
|
|
109
|
-
default:
|
|
115
|
+
type: 'string',
|
|
116
|
+
enum: ['MAJORITY_PRESENT', 'MAJORITY_FULL_BOARD'],
|
|
117
|
+
default: 'MAJORITY_PRESENT',
|
|
110
118
|
},
|
|
111
119
|
supermajorityMatters: {
|
|
112
|
-
type:
|
|
113
|
-
items: { type:
|
|
114
|
-
description:
|
|
120
|
+
type: 'array',
|
|
121
|
+
items: { type: 'string' },
|
|
122
|
+
description: 'Action types requiring supermajority',
|
|
115
123
|
},
|
|
116
|
-
supermajorityThreshold: { type:
|
|
124
|
+
supermajorityThreshold: { type: 'number', default: 0.6667 },
|
|
117
125
|
},
|
|
118
126
|
},
|
|
119
127
|
},
|
|
120
128
|
},
|
|
121
129
|
stateSchema: {
|
|
122
130
|
properties: {
|
|
123
|
-
boardId: { type:
|
|
124
|
-
entityId: { type:
|
|
131
|
+
boardId: { type: 'string', immutable: true },
|
|
132
|
+
entityId: { type: 'string', immutable: true },
|
|
133
|
+
authorizedRemovers: { type: 'array', items: { type: 'address' } },
|
|
125
134
|
directors: {
|
|
126
|
-
type:
|
|
127
|
-
items: { $ref:
|
|
135
|
+
type: 'array',
|
|
136
|
+
items: { $ref: '#/definitions/Director' },
|
|
128
137
|
computed: true,
|
|
129
138
|
},
|
|
130
|
-
seats: { type:
|
|
131
|
-
boardStructure: { type:
|
|
132
|
-
quorumRules: { type:
|
|
133
|
-
votingRules: { type:
|
|
139
|
+
seats: { type: 'object' },
|
|
140
|
+
boardStructure: { type: 'object' },
|
|
141
|
+
quorumRules: { type: 'object' },
|
|
142
|
+
votingRules: { type: 'object' },
|
|
134
143
|
currentMeeting: {
|
|
135
|
-
$ref:
|
|
144
|
+
$ref: '#/definitions/Meeting',
|
|
136
145
|
nullable: true,
|
|
137
146
|
computed: true,
|
|
138
147
|
},
|
|
139
148
|
meetingHistory: {
|
|
140
|
-
type:
|
|
141
|
-
items: { $ref:
|
|
149
|
+
type: 'array',
|
|
150
|
+
items: { $ref: '#/definitions/MeetingRecord' },
|
|
142
151
|
computed: true,
|
|
143
152
|
},
|
|
144
153
|
status: {
|
|
145
|
-
type:
|
|
146
|
-
enum: [
|
|
154
|
+
type: 'string',
|
|
155
|
+
enum: ['ACTIVE', 'IN_MEETING', 'QUORUM_LOST'],
|
|
147
156
|
computed: true,
|
|
148
157
|
},
|
|
149
|
-
createdAt: { type:
|
|
150
|
-
updatedAt: { type:
|
|
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:
|
|
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:
|
|
166
|
-
name: { type:
|
|
167
|
-
email: { type:
|
|
168
|
-
termStart: { type:
|
|
169
|
-
termEnd: { type:
|
|
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:
|
|
172
|
-
enum: [
|
|
176
|
+
type: 'string',
|
|
177
|
+
enum: ['CLASS_I', 'CLASS_II', 'CLASS_III', 'UNCLASSIFIED'],
|
|
173
178
|
},
|
|
174
|
-
isIndependent: { type:
|
|
179
|
+
isIndependent: { type: 'boolean' },
|
|
175
180
|
electionResolutionRef: {
|
|
176
|
-
type:
|
|
177
|
-
description:
|
|
181
|
+
type: 'string',
|
|
182
|
+
description: 'Shareholder or board resolution',
|
|
178
183
|
},
|
|
179
|
-
isFillingVacancy: { type:
|
|
184
|
+
isFillingVacancy: { type: 'boolean', default: false },
|
|
180
185
|
},
|
|
181
186
|
},
|
|
182
187
|
resign_director: {
|
|
183
|
-
description:
|
|
184
|
-
required: [
|
|
188
|
+
description: 'Director resigns from the board',
|
|
189
|
+
required: ['directorId', 'effectiveDate'],
|
|
185
190
|
properties: {
|
|
186
|
-
directorId: { type:
|
|
187
|
-
effectiveDate: { type:
|
|
188
|
-
reason: { type:
|
|
191
|
+
directorId: { type: 'string' },
|
|
192
|
+
effectiveDate: { type: 'string', format: 'date' },
|
|
193
|
+
reason: { type: 'string' },
|
|
189
194
|
resignationLetter: {
|
|
190
|
-
type:
|
|
191
|
-
description:
|
|
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:
|
|
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:
|
|
205
|
-
|
|
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:
|
|
212
|
-
required: [
|
|
218
|
+
description: 'Designate a director as board chair',
|
|
219
|
+
required: ['directorId', 'resolutionRef'],
|
|
213
220
|
properties: {
|
|
214
|
-
directorId: { type:
|
|
215
|
-
resolutionRef: { type:
|
|
221
|
+
directorId: { type: 'string' },
|
|
222
|
+
resolutionRef: { type: 'string' },
|
|
216
223
|
},
|
|
217
224
|
},
|
|
218
225
|
call_meeting: {
|
|
219
|
-
description:
|
|
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:
|
|
229
|
+
meetingId: { type: 'string' },
|
|
229
230
|
type: {
|
|
230
|
-
type:
|
|
231
|
-
enum: [
|
|
231
|
+
type: 'string',
|
|
232
|
+
enum: ['REGULAR', 'SPECIAL', 'ANNUAL', 'ORGANIZATIONAL'],
|
|
232
233
|
},
|
|
233
|
-
scheduledDate: { type:
|
|
234
|
-
location: { type:
|
|
235
|
-
isVirtual: { type:
|
|
234
|
+
scheduledDate: { type: 'string', format: 'date-time' },
|
|
235
|
+
location: { type: 'string' },
|
|
236
|
+
isVirtual: { type: 'boolean', default: false },
|
|
236
237
|
calledBy: {
|
|
237
|
-
type:
|
|
238
|
-
description:
|
|
238
|
+
type: 'string',
|
|
239
|
+
description: 'Director ID or officer title',
|
|
239
240
|
},
|
|
240
|
-
noticeDate: { type:
|
|
241
|
-
agenda: { type:
|
|
241
|
+
noticeDate: { type: 'string', format: 'date' },
|
|
242
|
+
agenda: { type: 'array', items: { type: 'string' } },
|
|
242
243
|
waiverOfNotice: {
|
|
243
|
-
type:
|
|
244
|
+
type: 'boolean',
|
|
244
245
|
default: false,
|
|
245
|
-
description:
|
|
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: [
|
|
252
|
+
required: ['directorId', 'present'],
|
|
252
253
|
properties: {
|
|
253
|
-
directorId: { type:
|
|
254
|
-
present: { type:
|
|
255
|
-
arrivedAt: { type:
|
|
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:
|
|
260
|
-
required: [
|
|
260
|
+
description: 'Officially open the board meeting once quorum is established',
|
|
261
|
+
required: ['openedAt'],
|
|
261
262
|
properties: {
|
|
262
|
-
openedAt: { type:
|
|
263
|
+
openedAt: { type: 'string', format: 'date-time' },
|
|
263
264
|
chairPresiding: {
|
|
264
|
-
type:
|
|
265
|
-
description:
|
|
265
|
+
type: 'string',
|
|
266
|
+
description: 'Director ID presiding',
|
|
266
267
|
},
|
|
267
268
|
},
|
|
268
269
|
},
|
|
269
270
|
director_departs: {
|
|
270
|
-
description:
|
|
271
|
-
required: [
|
|
271
|
+
description: 'Record a director leaving the meeting (may affect quorum)',
|
|
272
|
+
required: ['directorId', 'departedAt'],
|
|
272
273
|
properties: {
|
|
273
|
-
directorId: { type:
|
|
274
|
-
departedAt: { type:
|
|
274
|
+
directorId: { type: 'string' },
|
|
275
|
+
departedAt: { type: 'string', format: 'date-time' },
|
|
275
276
|
},
|
|
276
277
|
},
|
|
277
278
|
quorum_lost: {
|
|
278
|
-
description:
|
|
279
|
-
required: [
|
|
279
|
+
description: 'Automatic transition when quorum is lost during meeting',
|
|
280
|
+
required: ['lostAt'],
|
|
280
281
|
properties: {
|
|
281
|
-
lostAt: { type:
|
|
282
|
+
lostAt: { type: 'string', format: 'date-time' },
|
|
282
283
|
},
|
|
283
284
|
},
|
|
284
285
|
quorum_restored: {
|
|
285
|
-
description:
|
|
286
|
-
required: [
|
|
286
|
+
description: 'Quorum restored after additional director(s) join',
|
|
287
|
+
required: ['restoredAt', 'directorId'],
|
|
287
288
|
properties: {
|
|
288
|
-
restoredAt: { type:
|
|
289
|
-
directorId: { type:
|
|
289
|
+
restoredAt: { type: 'string', format: 'date-time' },
|
|
290
|
+
directorId: { type: 'string', description: 'Joining director' },
|
|
290
291
|
},
|
|
291
292
|
},
|
|
292
293
|
adjourn: {
|
|
293
|
-
description:
|
|
294
|
-
required: [
|
|
294
|
+
description: 'Adjourn the board meeting',
|
|
295
|
+
required: ['closedAt'],
|
|
295
296
|
properties: {
|
|
296
|
-
closedAt: { type:
|
|
297
|
+
closedAt: { type: 'string', format: 'date-time' },
|
|
297
298
|
minutesRef: {
|
|
298
|
-
type:
|
|
299
|
-
description:
|
|
299
|
+
type: 'string',
|
|
300
|
+
description: 'Reference to meeting minutes document',
|
|
300
301
|
},
|
|
301
|
-
resolutionsPassed: { type:
|
|
302
|
+
resolutionsPassed: { type: 'array', items: { type: 'string' } },
|
|
302
303
|
adjournedTo: {
|
|
303
|
-
type:
|
|
304
|
-
format:
|
|
304
|
+
type: 'string',
|
|
305
|
+
format: 'date-time',
|
|
305
306
|
nullable: true,
|
|
306
|
-
description:
|
|
307
|
+
description: 'If adjourning to later date',
|
|
307
308
|
},
|
|
308
309
|
},
|
|
309
310
|
},
|
|
310
311
|
update_seats: {
|
|
311
|
-
description:
|
|
312
|
-
required: [
|
|
312
|
+
description: 'Change the number of authorized board seats (requires bylaw amendment)',
|
|
313
|
+
required: ['newAuthorizedSeats', 'bylawAmendmentRef'],
|
|
313
314
|
properties: {
|
|
314
|
-
newAuthorizedSeats: { type:
|
|
315
|
-
bylawAmendmentRef: { type:
|
|
315
|
+
newAuthorizedSeats: { type: 'integer' },
|
|
316
|
+
bylawAmendmentRef: { type: 'string' },
|
|
316
317
|
},
|
|
317
318
|
},
|
|
318
319
|
},
|
|
319
320
|
definitions: {
|
|
320
321
|
Director: {
|
|
321
|
-
type:
|
|
322
|
+
type: 'object',
|
|
322
323
|
properties: {
|
|
323
|
-
directorId: { type:
|
|
324
|
-
name: { type:
|
|
325
|
-
email: { type:
|
|
326
|
-
termStart: { type:
|
|
327
|
-
termEnd: { type:
|
|
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:
|
|
330
|
-
enum: [
|
|
330
|
+
type: 'string',
|
|
331
|
+
enum: ['CLASS_I', 'CLASS_II', 'CLASS_III', 'UNCLASSIFIED'],
|
|
331
332
|
},
|
|
332
333
|
status: {
|
|
333
|
-
type:
|
|
334
|
-
enum: [
|
|
334
|
+
type: 'string',
|
|
335
|
+
enum: ['ACTIVE', 'RESIGNED', 'REMOVED', 'TERM_EXPIRED'],
|
|
335
336
|
},
|
|
336
337
|
isIndependent: {
|
|
337
|
-
type:
|
|
338
|
-
description:
|
|
338
|
+
type: 'boolean',
|
|
339
|
+
description: 'Independence under applicable rules',
|
|
339
340
|
},
|
|
340
|
-
isChair: { type:
|
|
341
|
-
isLeadIndependent: { type:
|
|
341
|
+
isChair: { type: 'boolean', default: false },
|
|
342
|
+
isLeadIndependent: { type: 'boolean', default: false },
|
|
342
343
|
committees: {
|
|
343
|
-
type:
|
|
344
|
-
items: { type:
|
|
345
|
-
description:
|
|
344
|
+
type: 'array',
|
|
345
|
+
items: { type: 'string' },
|
|
346
|
+
description: 'Committee memberships by committee ID',
|
|
346
347
|
},
|
|
347
348
|
electedBy: {
|
|
348
|
-
type:
|
|
349
|
-
description:
|
|
349
|
+
type: 'string',
|
|
350
|
+
description: 'Resolution reference for election',
|
|
350
351
|
},
|
|
351
|
-
compensationAgreementRef: { type:
|
|
352
|
+
compensationAgreementRef: { type: 'string', nullable: true },
|
|
352
353
|
},
|
|
353
354
|
},
|
|
354
355
|
Meeting: {
|
|
355
|
-
type:
|
|
356
|
+
type: 'object',
|
|
356
357
|
nullable: true,
|
|
357
358
|
properties: {
|
|
358
|
-
meetingId: { type:
|
|
359
|
+
meetingId: { type: 'string' },
|
|
359
360
|
type: {
|
|
360
|
-
type:
|
|
361
|
-
enum: [
|
|
361
|
+
type: 'string',
|
|
362
|
+
enum: ['REGULAR', 'SPECIAL', 'ANNUAL', 'ORGANIZATIONAL'],
|
|
362
363
|
},
|
|
363
|
-
scheduledDate: { type:
|
|
364
|
-
location: { type:
|
|
365
|
-
isVirtual: { type:
|
|
366
|
-
calledBy: { type:
|
|
367
|
-
noticeDate: { type:
|
|
368
|
-
agenda: { type:
|
|
369
|
-
attendees: { type:
|
|
370
|
-
quorumPresent: { type:
|
|
371
|
-
quorumCount: { type:
|
|
372
|
-
openedAt: { type:
|
|
373
|
-
closedAt: { type:
|
|
374
|
-
minutesRef: { type:
|
|
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:
|
|
379
|
+
type: 'object',
|
|
379
380
|
properties: {
|
|
380
|
-
directorId: { type:
|
|
381
|
-
present: { type:
|
|
382
|
-
arrivedAt: { type:
|
|
383
|
-
departedAt: { type:
|
|
384
|
-
viaProxy: { type:
|
|
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:
|
|
389
|
+
type: 'object',
|
|
389
390
|
properties: {
|
|
390
|
-
meetingId: { type:
|
|
391
|
-
type: { type:
|
|
392
|
-
date: { type:
|
|
393
|
-
quorumAchieved: { type:
|
|
394
|
-
attendeeCount: { type:
|
|
395
|
-
resolutionsPassed: { type:
|
|
396
|
-
minutesRef: { type:
|
|
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:
|
|
403
|
+
id: 'ACTIVE',
|
|
403
404
|
isFinal: false,
|
|
404
|
-
description:
|
|
405
|
+
description: 'Board is constituted and able to conduct business. Default state between meetings.',
|
|
405
406
|
},
|
|
406
407
|
IN_MEETING: {
|
|
407
|
-
id:
|
|
408
|
+
id: 'IN_MEETING',
|
|
408
409
|
isFinal: false,
|
|
409
|
-
description:
|
|
410
|
+
description: 'Board meeting is in session with quorum present. Can take formal actions.',
|
|
410
411
|
},
|
|
411
412
|
QUORUM_LOST: {
|
|
412
|
-
id:
|
|
413
|
+
id: 'QUORUM_LOST',
|
|
413
414
|
isFinal: false,
|
|
414
|
-
description:
|
|
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:
|
|
418
|
+
initialState: 'ACTIVE',
|
|
418
419
|
transitions: [
|
|
419
420
|
// ACTIVE -> ACTIVE (elect_director)
|
|
420
421
|
{
|
|
421
|
-
from:
|
|
422
|
-
to:
|
|
423
|
-
eventName:
|
|
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
|
-
|
|
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:
|
|
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
|
-
{
|
|
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:
|
|
449
|
+
{ var: 'state' },
|
|
456
450
|
{
|
|
457
451
|
directors: {
|
|
458
|
-
|
|
459
|
-
{ var:
|
|
452
|
+
merge: [
|
|
453
|
+
{ var: 'state.directors' },
|
|
460
454
|
[
|
|
461
455
|
{
|
|
462
|
-
directorId: { var:
|
|
463
|
-
name: { var:
|
|
464
|
-
email: { var:
|
|
465
|
-
termStart: { var:
|
|
466
|
-
termEnd: { var:
|
|
467
|
-
class: { var:
|
|
468
|
-
status:
|
|
469
|
-
isIndependent: { var:
|
|
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:
|
|
467
|
+
electedBy: { var: 'event.electionResolutionRef' },
|
|
474
468
|
},
|
|
475
469
|
],
|
|
476
470
|
],
|
|
477
471
|
},
|
|
478
472
|
seats: {
|
|
479
473
|
merge: [
|
|
480
|
-
{ var:
|
|
474
|
+
{ var: 'state.seats' },
|
|
481
475
|
{
|
|
482
|
-
filled: {
|
|
483
|
-
vacant: {
|
|
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:
|
|
495
|
-
to:
|
|
496
|
-
eventName:
|
|
490
|
+
from: 'ACTIVE',
|
|
491
|
+
to: 'ACTIVE',
|
|
492
|
+
eventName: 'resign_director',
|
|
497
493
|
guard: {
|
|
498
494
|
some: [
|
|
499
|
-
{ var:
|
|
495
|
+
{ var: 'state.directors' },
|
|
500
496
|
{
|
|
501
497
|
and: [
|
|
502
|
-
{
|
|
503
|
-
{
|
|
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:
|
|
506
|
+
{ var: 'state' },
|
|
511
507
|
{
|
|
512
508
|
directors: {
|
|
513
509
|
map: [
|
|
514
|
-
{ var:
|
|
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:
|
|
528
|
-
termEnd: { var:
|
|
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:
|
|
532
|
+
{ var: 'state.seats' },
|
|
540
533
|
{
|
|
541
|
-
filled: {
|
|
542
|
-
vacant: {
|
|
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:
|
|
553
|
-
to:
|
|
554
|
-
eventName:
|
|
547
|
+
from: 'IN_MEETING',
|
|
548
|
+
to: 'ACTIVE',
|
|
549
|
+
eventName: 'resign_director',
|
|
555
550
|
guard: {
|
|
556
551
|
some: [
|
|
557
|
-
{ var:
|
|
552
|
+
{ var: 'state.directors' },
|
|
558
553
|
{
|
|
559
554
|
and: [
|
|
560
|
-
{
|
|
561
|
-
{
|
|
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:
|
|
563
|
+
{ var: 'state' },
|
|
569
564
|
{
|
|
570
565
|
directors: {
|
|
571
566
|
map: [
|
|
572
|
-
{ var:
|
|
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:
|
|
586
|
-
termEnd: { var:
|
|
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:
|
|
589
|
+
{ var: 'state.seats' },
|
|
598
590
|
{
|
|
599
|
-
filled: {
|
|
600
|
-
vacant: {
|
|
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 (
|
|
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:
|
|
612
|
-
to:
|
|
613
|
-
eventName:
|
|
606
|
+
from: 'ACTIVE',
|
|
607
|
+
to: 'ACTIVE',
|
|
608
|
+
eventName: 'propose_removal',
|
|
614
609
|
guard: {
|
|
615
|
-
|
|
616
|
-
|
|
610
|
+
and: [
|
|
611
|
+
(0, guards_js_1.signerInSet)('state.authorizedRemovers'),
|
|
617
612
|
{
|
|
618
|
-
|
|
619
|
-
{
|
|
620
|
-
{
|
|
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:
|
|
676
|
+
{ var: 'state' },
|
|
635
677
|
{
|
|
636
678
|
directors: {
|
|
637
679
|
map: [
|
|
638
|
-
{ var:
|
|
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:
|
|
652
|
-
termEnd: { var:
|
|
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:
|
|
702
|
+
{ var: 'state.seats' },
|
|
664
703
|
{
|
|
665
|
-
filled: {
|
|
666
|
-
vacant: {
|
|
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
|
-
|
|
717
|
+
dependencies: [],
|
|
674
718
|
},
|
|
675
719
|
// ACTIVE -> ACTIVE (designate_chair)
|
|
676
720
|
{
|
|
677
|
-
from:
|
|
678
|
-
to:
|
|
679
|
-
eventName:
|
|
721
|
+
from: 'ACTIVE',
|
|
722
|
+
to: 'ACTIVE',
|
|
723
|
+
eventName: 'designate_chair',
|
|
680
724
|
guard: {
|
|
681
725
|
some: [
|
|
682
|
-
{ var:
|
|
726
|
+
{ var: 'state.directors' },
|
|
683
727
|
{
|
|
684
728
|
and: [
|
|
685
|
-
{
|
|
686
|
-
{
|
|
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:
|
|
737
|
+
{ var: 'state' },
|
|
694
738
|
{
|
|
695
739
|
directors: {
|
|
696
740
|
map: [
|
|
697
|
-
{ var:
|
|
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:
|
|
720
|
-
to:
|
|
721
|
-
eventName:
|
|
760
|
+
from: 'ACTIVE',
|
|
761
|
+
to: 'ACTIVE',
|
|
762
|
+
eventName: 'call_meeting',
|
|
722
763
|
guard: {
|
|
723
764
|
and: [
|
|
724
765
|
{
|
|
725
766
|
or: [
|
|
726
|
-
{
|
|
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
|
-
{
|
|
743
|
-
{
|
|
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:
|
|
788
|
+
{ var: 'state' },
|
|
751
789
|
{
|
|
752
790
|
currentMeeting: {
|
|
753
|
-
meetingId: { var:
|
|
754
|
-
type: { var:
|
|
755
|
-
scheduledDate: { var:
|
|
756
|
-
location: { var:
|
|
757
|
-
isVirtual: { var:
|
|
758
|
-
calledBy: { var:
|
|
759
|
-
noticeDate: { var:
|
|
760
|
-
agenda: { var:
|
|
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:
|
|
773
|
-
to:
|
|
774
|
-
eventName:
|
|
812
|
+
from: 'ACTIVE',
|
|
813
|
+
to: 'ACTIVE',
|
|
814
|
+
eventName: 'record_attendance',
|
|
775
815
|
guard: {
|
|
776
816
|
and: [
|
|
777
|
-
{
|
|
778
|
-
{
|
|
817
|
+
{ '!=': [{ var: 'state.currentMeeting' }, null] },
|
|
818
|
+
{ '==': [{ var: 'state.currentMeeting.openedAt' }, null] },
|
|
779
819
|
{
|
|
780
820
|
some: [
|
|
781
|
-
{ var:
|
|
821
|
+
{ var: 'state.directors' },
|
|
782
822
|
{
|
|
783
823
|
and: [
|
|
784
824
|
{
|
|
785
|
-
|
|
825
|
+
'==': [{ var: 'directorId' }, { var: 'event.directorId' }],
|
|
786
826
|
},
|
|
787
|
-
{
|
|
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:
|
|
836
|
+
{ var: 'state' },
|
|
797
837
|
{
|
|
798
838
|
currentMeeting: {
|
|
799
839
|
merge: [
|
|
800
|
-
{ var:
|
|
840
|
+
{ var: 'state.currentMeeting' },
|
|
801
841
|
{
|
|
802
842
|
attendees: {
|
|
803
|
-
|
|
804
|
-
{ var:
|
|
843
|
+
merge: [
|
|
844
|
+
{ var: 'state.currentMeeting.attendees' },
|
|
805
845
|
[
|
|
806
846
|
{
|
|
807
|
-
directorId: { var:
|
|
808
|
-
present: { var:
|
|
809
|
-
arrivedAt: { var:
|
|
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:
|
|
825
|
-
to:
|
|
826
|
-
eventName:
|
|
864
|
+
from: 'ACTIVE',
|
|
865
|
+
to: 'IN_MEETING',
|
|
866
|
+
eventName: 'open_meeting',
|
|
827
867
|
guard: {
|
|
828
868
|
and: [
|
|
829
|
-
{
|
|
830
|
-
{
|
|
831
|
-
{
|
|
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:
|
|
876
|
+
{ var: 'state' },
|
|
837
877
|
{
|
|
838
|
-
status:
|
|
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:
|
|
853
|
-
to:
|
|
854
|
-
eventName:
|
|
855
|
-
guard: {
|
|
891
|
+
from: 'IN_MEETING',
|
|
892
|
+
to: 'IN_MEETING',
|
|
893
|
+
eventName: 'director_departs',
|
|
894
|
+
guard: { '==': [1, 1] },
|
|
856
895
|
effect: {
|
|
857
896
|
merge: [
|
|
858
|
-
{ var:
|
|
897
|
+
{ var: 'state' },
|
|
859
898
|
{
|
|
860
899
|
currentMeeting: {
|
|
861
900
|
merge: [
|
|
862
|
-
{ var:
|
|
901
|
+
{ var: 'state.currentMeeting' },
|
|
863
902
|
{
|
|
864
903
|
attendees: {
|
|
865
904
|
map: [
|
|
866
|
-
{ var:
|
|
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:
|
|
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:
|
|
899
|
-
to:
|
|
900
|
-
eventName:
|
|
901
|
-
guard: {
|
|
934
|
+
from: 'IN_MEETING',
|
|
935
|
+
to: 'QUORUM_LOST',
|
|
936
|
+
eventName: 'quorum_lost',
|
|
937
|
+
guard: { '==': [{ var: 'state.currentMeeting.quorumPresent' }, false] },
|
|
902
938
|
effect: {
|
|
903
|
-
merge: [
|
|
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:
|
|
910
|
-
to:
|
|
911
|
-
eventName:
|
|
912
|
-
guard: {
|
|
950
|
+
from: 'QUORUM_LOST',
|
|
951
|
+
to: 'IN_MEETING',
|
|
952
|
+
eventName: 'quorum_restored',
|
|
953
|
+
guard: { '==': [{ var: 'state.currentMeeting.quorumPresent' }, true] },
|
|
913
954
|
effect: {
|
|
914
|
-
merge: [
|
|
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:
|
|
921
|
-
to:
|
|
922
|
-
eventName:
|
|
923
|
-
guard: {
|
|
966
|
+
from: 'IN_MEETING',
|
|
967
|
+
to: 'ACTIVE',
|
|
968
|
+
eventName: 'adjourn',
|
|
969
|
+
guard: { '==': [1, 1] },
|
|
924
970
|
effect: {
|
|
925
971
|
merge: [
|
|
926
|
-
{ var:
|
|
972
|
+
{ var: 'state' },
|
|
927
973
|
{
|
|
928
|
-
status:
|
|
974
|
+
status: 'ACTIVE',
|
|
929
975
|
currentMeeting: null,
|
|
930
976
|
meetingHistory: {
|
|
931
|
-
|
|
932
|
-
{ var:
|
|
977
|
+
merge: [
|
|
978
|
+
{ var: 'state.meetingHistory' },
|
|
933
979
|
[
|
|
934
980
|
{
|
|
935
|
-
meetingId: { var:
|
|
936
|
-
type: { var:
|
|
937
|
-
date: { var:
|
|
981
|
+
meetingId: { var: 'state.currentMeeting.meetingId' },
|
|
982
|
+
type: { var: 'state.currentMeeting.type' },
|
|
983
|
+
date: { var: 'state.currentMeeting.scheduledDate' },
|
|
938
984
|
quorumAchieved: {
|
|
939
|
-
var:
|
|
985
|
+
var: 'state.currentMeeting.quorumPresent',
|
|
940
986
|
},
|
|
941
|
-
attendeeCount: { var:
|
|
942
|
-
resolutionsPassed: { var:
|
|
943
|
-
minutesRef: { var:
|
|
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:
|
|
956
|
-
to:
|
|
957
|
-
eventName:
|
|
958
|
-
guard: {
|
|
1003
|
+
from: 'QUORUM_LOST',
|
|
1004
|
+
to: 'ACTIVE',
|
|
1005
|
+
eventName: 'adjourn',
|
|
1006
|
+
guard: { '==': [1, 1] },
|
|
959
1007
|
effect: {
|
|
960
1008
|
merge: [
|
|
961
|
-
{ var:
|
|
1009
|
+
{ var: 'state' },
|
|
962
1010
|
{
|
|
963
|
-
status:
|
|
1011
|
+
status: 'ACTIVE',
|
|
964
1012
|
currentMeeting: null,
|
|
965
1013
|
meetingHistory: {
|
|
966
|
-
|
|
967
|
-
{ var:
|
|
1014
|
+
merge: [
|
|
1015
|
+
{ var: 'state.meetingHistory' },
|
|
968
1016
|
[
|
|
969
1017
|
{
|
|
970
|
-
meetingId: { var:
|
|
971
|
-
type: { var:
|
|
972
|
-
date: { var:
|
|
1018
|
+
meetingId: { var: 'state.currentMeeting.meetingId' },
|
|
1019
|
+
type: { var: 'state.currentMeeting.type' },
|
|
1020
|
+
date: { var: 'state.currentMeeting.scheduledDate' },
|
|
973
1021
|
quorumAchieved: {
|
|
974
|
-
var:
|
|
1022
|
+
var: 'state.currentMeeting.quorumPresent',
|
|
975
1023
|
},
|
|
976
|
-
attendeeCount: { var:
|
|
977
|
-
resolutionsPassed: { var:
|
|
978
|
-
minutesRef: { var:
|
|
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:
|
|
991
|
-
to:
|
|
992
|
-
eventName:
|
|
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:
|
|
1048
|
+
{ var: 'state' },
|
|
1002
1049
|
{
|
|
1003
1050
|
seats: {
|
|
1004
1051
|
merge: [
|
|
1005
|
-
{ var:
|
|
1052
|
+
{ var: 'state.seats' },
|
|
1006
1053
|
{
|
|
1007
|
-
authorized: { var:
|
|
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
|
],
|