@yigemo/choosefire 0.1.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 (62) hide show
  1. package/README.md +83 -0
  2. package/contracts/choosefire-family-wealth/v2/capability-matrix.v1.json +464 -0
  3. package/contracts/choosefire-family-wealth/v2/golden/performance.v1.json +79 -0
  4. package/contracts/choosefire-family-wealth/v2/golden/r2-contract.v1.json +1070 -0
  5. package/contracts/choosefire-family-wealth/v2/golden/scenarios.v1.json +241 -0
  6. package/contracts/choosefire-family-wealth/v2/golden/transport.v1.json +207 -0
  7. package/contracts/choosefire-family-wealth/v2/manifest.json +58 -0
  8. package/contracts/choosefire-family-wealth/v2/openapi.generated.json +2605 -0
  9. package/contracts/choosefire-family-wealth/v2/runtime-schemas/family-wealth.v2.schema.json +2127 -0
  10. package/contracts/choosefire-family-wealth/v2/taxonomies/account-types.v1.json +41 -0
  11. package/contracts/choosefire-family-wealth/v2/taxonomies/asset-classes.v1.json +45 -0
  12. package/contracts/choosefire-family-wealth/v2/taxonomies/transaction-types.v1.json +57 -0
  13. package/contracts/choosefire-financial-workspace/v1/field-registry.generated.json +137 -0
  14. package/contracts/choosefire-financial-workspace/v1/field-registry.manifest.json +11 -0
  15. package/contracts/choosefire-financial-workspace/v1/golden/commands.invalid.json +583 -0
  16. package/contracts/choosefire-financial-workspace/v1/golden/commands.valid.json +201 -0
  17. package/contracts/choosefire-financial-workspace/v1/golden/cursors.invalid.json +82 -0
  18. package/contracts/choosefire-financial-workspace/v1/golden/errors.invalid.json +191 -0
  19. package/contracts/choosefire-financial-workspace/v1/golden/errors.valid.json +298 -0
  20. package/contracts/choosefire-financial-workspace/v1/golden/fingerprints.json +105 -0
  21. package/contracts/choosefire-financial-workspace/v1/golden/projections.invalid.json +3543 -0
  22. package/contracts/choosefire-financial-workspace/v1/golden/projections.valid.json +2953 -0
  23. package/contracts/choosefire-financial-workspace/v1/manifest.json +69 -0
  24. package/contracts/choosefire-financial-workspace/v1/openapi.generated.json +1987 -0
  25. package/contracts/choosefire-financial-workspace/v1/runtime-schemas/financial-workspace.v1.schema.json +1496 -0
  26. package/dist/args.d.ts +5 -0
  27. package/dist/args.js +60 -0
  28. package/dist/args.js.map +1 -0
  29. package/dist/auth.d.ts +55 -0
  30. package/dist/auth.js +480 -0
  31. package/dist/auth.js.map +1 -0
  32. package/dist/commands.d.ts +4 -0
  33. package/dist/commands.js +637 -0
  34. package/dist/commands.js.map +1 -0
  35. package/dist/config.d.ts +10 -0
  36. package/dist/config.js +74 -0
  37. package/dist/config.js.map +1 -0
  38. package/dist/family-wealth-v2-contracts.d.ts +276 -0
  39. package/dist/family-wealth-v2-contracts.js +77 -0
  40. package/dist/family-wealth-v2-contracts.js.map +1 -0
  41. package/dist/family-wealth-v2-http.d.ts +65 -0
  42. package/dist/family-wealth-v2-http.js +340 -0
  43. package/dist/family-wealth-v2-http.js.map +1 -0
  44. package/dist/financial-workspace-contracts.d.ts +191 -0
  45. package/dist/financial-workspace-contracts.js +282 -0
  46. package/dist/financial-workspace-contracts.js.map +1 -0
  47. package/dist/http.d.ts +76 -0
  48. package/dist/http.js +446 -0
  49. package/dist/http.js.map +1 -0
  50. package/dist/index.d.ts +2 -0
  51. package/dist/index.js +50 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/output.d.ts +18 -0
  54. package/dist/output.js +111 -0
  55. package/dist/output.js.map +1 -0
  56. package/dist/token-store.d.ts +27 -0
  57. package/dist/token-store.js +408 -0
  58. package/dist/token-store.js.map +1 -0
  59. package/dist/types.d.ts +65 -0
  60. package/dist/types.js +5 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +43 -0
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # ChooseFIRE CLI
2
+
3
+ Command-line tools for ChooseFIRE data operations.
4
+
5
+ This CLI is intentionally thin: it calls approved ChooseFIRE backend endpoints and prints stable JSON for humans, scripts, and AI agents. It does not read or upload the rich local FIRE workspace.
6
+
7
+ ## Setup
8
+
9
+ Install the public package globally, then run it with the short `choosefire` command:
10
+
11
+ ```bash
12
+ npm install --global @yigemo/choosefire
13
+ choosefire --help
14
+ ```
15
+
16
+ For local development:
17
+
18
+ ```bash
19
+ pnpm install
20
+ pnpm build
21
+ ```
22
+
23
+ Log in through Accounts:
24
+
25
+ ```bash
26
+ choosefire auth login
27
+ ```
28
+
29
+ The CLI opens your browser, completes Accounts login, receives the callback on `127.0.0.1:8787`, and stores audience-separated legacy and workspace credentials in:
30
+
31
+ ```bash
32
+ ~/.choosefire/config.json
33
+ ```
34
+
35
+ For local backend development, only set the API base URL:
36
+
37
+ ```bash
38
+ export CHOOSEFIRE_API_BASE_URL=http://localhost:3000
39
+ ```
40
+
41
+ Account workspace transport and account authority remain unavailable. Keep the flag off unless the 5A4 evidence gate and enablement owner explicitly approve a controlled synthetic-account drill; real accounts and real financial data are not authorized:
42
+
43
+ ```bash
44
+ export CHOOSEFIRE_ACCOUNT_WORKSPACE_ENABLED=true
45
+ export CHOOSEFIRE_OIDC_CLIENT_ID=choosefire-cli
46
+ choosefire auth login --json
47
+ ```
48
+
49
+ ## Commands
50
+
51
+ ```bash
52
+ choosefire auth status --json
53
+ choosefire auth login --json
54
+ choosefire auth logout --json
55
+ choosefire workspace initialize --idempotency-key <key> --json
56
+ choosefire workspace snapshot --json
57
+ choosefire workspace summary --json
58
+ choosefire workspace activity --limit 50 [--cursor <cursor>] --json
59
+ choosefire workspace fact-record --expected-version <n> --idempotency-key <key> --field household.total_assets --amount 100.5 --currency CNY [--status confirmed|estimated] [--as-of <iso>] --json
60
+ choosefire plan list --json
61
+ choosefire plan get <plan-id> --json
62
+ choosefire plan update-inputs <plan-id> --annual-return 0.035 --annual-inflation 0.04 --expected-updated-at <iso> --dry-run --json
63
+ choosefire plan duplicate <plan-id> --name "Conservative" --set annualReturn=0.035 --expected-updated-at <iso> --dry-run --json
64
+ choosefire plan set-default <plan-id> --expected-updated-at <iso> --dry-run --json
65
+ choosefire plan archive <plan-id> --expected-updated-at <iso> --reason "cleanup" --dry-run --json
66
+ choosefire asset upsert --plan <plan-id> --account-id asset-bank --amount 300000 --expected-return 0.02 --expected-updated-at <iso> --dry-run --json
67
+ choosefire asset remove --plan <plan-id> --account-id asset-bank --reason "duplicate account" --expected-updated-at <iso> --dry-run --json
68
+ choosefire visual dataset --plan <plan-id> --kind overview --json
69
+ ```
70
+
71
+ The five `workspace` operations are a narrow account HTTP facade: initialize, snapshot, summary, activity, and fact record. They use the workspace bearer only, validate every request and response against the checked-in contract, never retry mutations, and never fall back to the legacy token or local files. When a mutation outcome is unknown, first read the latest snapshot and then explicitly retry the exact serialized body with the original idempotency key to recover the receipt-first outcome. Never generate a new key for that recovery attempt. The JSON error includes this exact recovery material and action.
72
+
73
+ Existing legacy plan write commands still default to dry-run unless `--apply` is passed. For CLI and MCP sources, `--expected-updated-at` should be provided to avoid overwriting newer data.
74
+
75
+ ## Development
76
+
77
+ ```bash
78
+ pnpm dev -- plan list --json
79
+ pnpm typecheck
80
+ pnpm build
81
+ pnpm test
82
+ pnpm contract:choosefire-workspace:check
83
+ ```
@@ -0,0 +1,464 @@
1
+ {
2
+ "contractId": "choosefire-family-wealth.v2",
3
+ "entries": [
4
+ {
5
+ "builtinAi": "unavailable",
6
+ "capabilityId": "household.initialize",
7
+ "cliPath": "household init",
8
+ "commandOrQuery": "workspace.initialize.v2",
9
+ "fixtureIds": [
10
+ "CFW-FIX-009"
11
+ ],
12
+ "mcpSurface": "unavailable (R1 MCP is read-only)",
13
+ "milestone": "R1",
14
+ "requiredRole": "owner",
15
+ "riskLevel": "L1",
16
+ "status": "web",
17
+ "storyIds": [
18
+ "ONBOARD-01",
19
+ "CHANNEL-01"
20
+ ],
21
+ "webPath": "/app"
22
+ },
23
+ {
24
+ "builtinAi": "read",
25
+ "capabilityId": "household.summary",
26
+ "cliPath": "household summary",
27
+ "commandOrQuery": "workspace.summary.v2",
28
+ "fixtureIds": [
29
+ "CFW-FIX-009"
30
+ ],
31
+ "mcpSurface": "choosefire://workspace/metadata",
32
+ "milestone": "R1",
33
+ "requiredRole": "owner_or_viewer",
34
+ "riskLevel": "L0",
35
+ "status": "parity",
36
+ "storyIds": [
37
+ "OVERVIEW-01",
38
+ "CHANNEL-01"
39
+ ],
40
+ "webPath": "/app"
41
+ },
42
+ {
43
+ "builtinAi": "read",
44
+ "capabilityId": "activity.list",
45
+ "cliPath": "activity list",
46
+ "commandOrQuery": "activity.page.v2",
47
+ "fixtureIds": [
48
+ "CFW-FIX-007",
49
+ "CFW-FIX-009"
50
+ ],
51
+ "mcpSurface": "unavailable (metadata advertises activity.page.v2)",
52
+ "milestone": "R1",
53
+ "requiredRole": "owner_or_viewer",
54
+ "riskLevel": "L0",
55
+ "status": "web",
56
+ "storyIds": [
57
+ "CHANNEL-01",
58
+ "SHARE-01"
59
+ ],
60
+ "webPath": "/app#activity"
61
+ },
62
+ {
63
+ "builtinAi": "unavailable",
64
+ "capabilityId": "asset.account.manage",
65
+ "cliPath": "wealth account-create|account-update|account-archive",
66
+ "commandOrQuery": "asset_account.create|update|archive.v2",
67
+ "fixtureIds": [
68
+ "CFW-FIX-001",
69
+ "CFW-FIX-005"
70
+ ],
71
+ "mcpSurface": "unavailable (R2 MCP is read-only)",
72
+ "milestone": "R2",
73
+ "requiredRole": "owner",
74
+ "riskLevel": "L2",
75
+ "status": "web",
76
+ "storyIds": [
77
+ "CAPTURE-01",
78
+ "ONBOARD-01"
79
+ ],
80
+ "webPath": "/app#assets"
81
+ },
82
+ {
83
+ "builtinAi": "unavailable",
84
+ "capabilityId": "valuation.append",
85
+ "cliPath": "wealth valuation-append",
86
+ "commandOrQuery": "valuation_snapshot.append.v2",
87
+ "fixtureIds": [
88
+ "CFW-FIX-001",
89
+ "CFW-FIX-002"
90
+ ],
91
+ "mcpSurface": "unavailable (R2 MCP is read-only)",
92
+ "milestone": "R2",
93
+ "requiredRole": "owner",
94
+ "riskLevel": "L1",
95
+ "status": "web",
96
+ "storyIds": [
97
+ "CAPTURE-01",
98
+ "TRACK-01"
99
+ ],
100
+ "webPath": "/app#assets"
101
+ },
102
+ {
103
+ "builtinAi": "unavailable",
104
+ "capabilityId": "classification.replace",
105
+ "cliPath": "wealth classify",
106
+ "commandOrQuery": "classification.replace.v2",
107
+ "fixtureIds": [
108
+ "CFW-FIX-005"
109
+ ],
110
+ "mcpSurface": "unavailable (R2 MCP is read-only)",
111
+ "milestone": "R2",
112
+ "requiredRole": "owner",
113
+ "riskLevel": "L2",
114
+ "status": "web",
115
+ "storyIds": [
116
+ "CAPTURE-01",
117
+ "OVERVIEW-01"
118
+ ],
119
+ "webPath": "/app#assets"
120
+ },
121
+ {
122
+ "builtinAi": "propose",
123
+ "capabilityId": "purpose.manage",
124
+ "cliPath": "purpose create|allocate",
125
+ "commandOrQuery": "purpose_bucket.commands.v2",
126
+ "fixtureIds": [
127
+ "CFW-FIX-005"
128
+ ],
129
+ "mcpSurface": "choosefire.purpose.*",
130
+ "milestone": "R5",
131
+ "requiredRole": "owner",
132
+ "riskLevel": "L2",
133
+ "status": "absent",
134
+ "storyIds": [
135
+ "GOAL-01",
136
+ "OVERVIEW-01"
137
+ ],
138
+ "webPath": "/app/plan"
139
+ },
140
+ {
141
+ "builtinAi": "read",
142
+ "capabilityId": "overview.read",
143
+ "cliPath": "wealth overview",
144
+ "commandOrQuery": "workspace.overview.v2",
145
+ "fixtureIds": [
146
+ "CFW-FIX-005",
147
+ "CFW-FIX-007",
148
+ "CFW-FIX-009"
149
+ ],
150
+ "mcpSurface": "choosefire://workspace/overview|portfolio-tree|data-quality",
151
+ "milestone": "R2",
152
+ "requiredRole": "owner_or_viewer",
153
+ "riskLevel": "L0",
154
+ "status": "parity",
155
+ "storyIds": [
156
+ "OVERVIEW-01",
157
+ "CHANNEL-01"
158
+ ],
159
+ "webPath": "/app"
160
+ },
161
+ {
162
+ "builtinAi": "apply_with_confirmation",
163
+ "capabilityId": "holding.manage",
164
+ "cliPath": "holding create|update|archive",
165
+ "commandOrQuery": "holding.commands.v2",
166
+ "fixtureIds": [
167
+ "CFW-FIX-003"
168
+ ],
169
+ "mcpSurface": "choosefire.holding.*",
170
+ "milestone": "R3",
171
+ "requiredRole": "owner",
172
+ "riskLevel": "L2",
173
+ "status": "absent",
174
+ "storyIds": [
175
+ "CAPTURE-01"
176
+ ],
177
+ "webPath": "/app/assets/:id"
178
+ },
179
+ {
180
+ "builtinAi": "apply_with_confirmation",
181
+ "capabilityId": "transaction.record",
182
+ "cliPath": "transaction record",
183
+ "commandOrQuery": "transaction.record.v2",
184
+ "fixtureIds": [
185
+ "CFW-FIX-003"
186
+ ],
187
+ "mcpSurface": "choosefire.transaction.record",
188
+ "milestone": "R3",
189
+ "requiredRole": "owner",
190
+ "riskLevel": "L1",
191
+ "status": "absent",
192
+ "storyIds": [
193
+ "CAPTURE-01",
194
+ "TRACK-01"
195
+ ],
196
+ "webPath": "/app/assets/:id"
197
+ },
198
+ {
199
+ "builtinAi": "apply_with_confirmation",
200
+ "capabilityId": "cash_flow.record",
201
+ "cliPath": "transaction cash-flow",
202
+ "commandOrQuery": "external_cash_flow.record.v2",
203
+ "fixtureIds": [
204
+ "CFW-FIX-002"
205
+ ],
206
+ "mcpSurface": "choosefire.cashFlow.record",
207
+ "milestone": "R3",
208
+ "requiredRole": "owner",
209
+ "riskLevel": "L1",
210
+ "status": "absent",
211
+ "storyIds": [
212
+ "CAPTURE-01",
213
+ "PERFORMANCE-01"
214
+ ],
215
+ "webPath": "/app/assets/:id"
216
+ },
217
+ {
218
+ "builtinAi": "propose",
219
+ "capabilityId": "import.apply",
220
+ "cliPath": "import inspect|preview|submit|apply",
221
+ "commandOrQuery": "import_batch.commands.v2",
222
+ "fixtureIds": [
223
+ "CFW-FIX-008"
224
+ ],
225
+ "mcpSurface": "choosefire.import.*",
226
+ "milestone": "R3",
227
+ "requiredRole": "owner",
228
+ "riskLevel": "L2",
229
+ "status": "absent",
230
+ "storyIds": [
231
+ "IMPORT-01",
232
+ "ONBOARD-01"
233
+ ],
234
+ "webPath": "/app/import"
235
+ },
236
+ {
237
+ "builtinAi": "propose",
238
+ "capabilityId": "ai.capture",
239
+ "cliPath": "candidate list|decide",
240
+ "commandOrQuery": "capture_candidate.commands.v2",
241
+ "fixtureIds": [
242
+ "CFW-FIX-009"
243
+ ],
244
+ "mcpSurface": "choosefire.capture.propose",
245
+ "milestone": "R3",
246
+ "requiredRole": "owner",
247
+ "riskLevel": "L2",
248
+ "status": "absent",
249
+ "storyIds": [
250
+ "AI-01",
251
+ "ONBOARD-01"
252
+ ],
253
+ "webPath": "/app/ai"
254
+ },
255
+ {
256
+ "builtinAi": "read",
257
+ "capabilityId": "performance.read",
258
+ "cliPath": "performance show",
259
+ "commandOrQuery": "performance.period.v2",
260
+ "fixtureIds": [
261
+ "CFW-FIX-001",
262
+ "CFW-FIX-002",
263
+ "CFW-FIX-003",
264
+ "CFW-FIX-004"
265
+ ],
266
+ "mcpSurface": "choosefire.performance.get",
267
+ "milestone": "R4",
268
+ "requiredRole": "owner_or_viewer",
269
+ "riskLevel": "L0",
270
+ "status": "absent",
271
+ "storyIds": [
272
+ "PERFORMANCE-01",
273
+ "TRACK-01"
274
+ ],
275
+ "webPath": "/app/performance"
276
+ },
277
+ {
278
+ "builtinAi": "read",
279
+ "capabilityId": "performance.gaps",
280
+ "cliPath": "performance gaps",
281
+ "commandOrQuery": "performance.gaps.v2",
282
+ "fixtureIds": [
283
+ "CFW-FIX-002",
284
+ "CFW-FIX-003"
285
+ ],
286
+ "mcpSurface": "choosefire://performance/gaps",
287
+ "milestone": "R4",
288
+ "requiredRole": "owner",
289
+ "riskLevel": "L0",
290
+ "status": "absent",
291
+ "storyIds": [
292
+ "PERFORMANCE-01"
293
+ ],
294
+ "webPath": "/app/performance"
295
+ },
296
+ {
297
+ "builtinAi": "propose",
298
+ "capabilityId": "goal.manage",
299
+ "cliPath": "goal create|update|retire",
300
+ "commandOrQuery": "financial_goal.commands.v2",
301
+ "fixtureIds": [
302
+ "CFW-FIX-006"
303
+ ],
304
+ "mcpSurface": "choosefire.goal.*",
305
+ "milestone": "R5",
306
+ "requiredRole": "owner",
307
+ "riskLevel": "L2",
308
+ "status": "absent",
309
+ "storyIds": [
310
+ "GOAL-01"
311
+ ],
312
+ "webPath": "/app/plan"
313
+ },
314
+ {
315
+ "builtinAi": "read",
316
+ "capabilityId": "scenario.compare",
317
+ "cliPath": "plan scenario compare",
318
+ "commandOrQuery": "plan.compare.v2",
319
+ "fixtureIds": [
320
+ "CFW-FIX-006"
321
+ ],
322
+ "mcpSurface": "choosefire.plan.compare",
323
+ "milestone": "R5",
324
+ "requiredRole": "owner_or_viewer",
325
+ "riskLevel": "L0",
326
+ "status": "absent",
327
+ "storyIds": [
328
+ "PLAN-01"
329
+ ],
330
+ "webPath": "/app/plan/scenarios"
331
+ },
332
+ {
333
+ "builtinAi": "unavailable",
334
+ "capabilityId": "plan.confirm",
335
+ "cliPath": "plan scenario confirm",
336
+ "commandOrQuery": "wealth_plan.confirm.v2",
337
+ "fixtureIds": [
338
+ "CFW-FIX-006"
339
+ ],
340
+ "mcpSurface": "choosefire.plan.confirm",
341
+ "milestone": "R5",
342
+ "requiredRole": "owner",
343
+ "riskLevel": "L3",
344
+ "status": "absent",
345
+ "storyIds": [
346
+ "PLAN-01",
347
+ "TRACK-01"
348
+ ],
349
+ "webPath": "/app/plan"
350
+ },
351
+ {
352
+ "builtinAi": "propose",
353
+ "capabilityId": "research.run",
354
+ "cliPath": "research start|refresh",
355
+ "commandOrQuery": "research_run.commands.v2",
356
+ "fixtureIds": [
357
+ "CFW-FIX-006"
358
+ ],
359
+ "mcpSurface": "choosefire.research.*",
360
+ "milestone": "R6",
361
+ "requiredRole": "owner",
362
+ "riskLevel": "L2",
363
+ "status": "absent",
364
+ "storyIds": [
365
+ "RESEARCH-01"
366
+ ],
367
+ "webPath": "/app/plan/research"
368
+ },
369
+ {
370
+ "builtinAi": "unavailable",
371
+ "capabilityId": "proposal.review",
372
+ "cliPath": "proposal decide|confirm",
373
+ "commandOrQuery": "allocation_proposal.commands.v2",
374
+ "fixtureIds": [
375
+ "CFW-FIX-006"
376
+ ],
377
+ "mcpSurface": "choosefire.proposal.*",
378
+ "milestone": "R6",
379
+ "requiredRole": "owner",
380
+ "riskLevel": "L3",
381
+ "status": "absent",
382
+ "storyIds": [
383
+ "PROPOSAL-01"
384
+ ],
385
+ "webPath": "/app/plan/proposals/:id"
386
+ },
387
+ {
388
+ "builtinAi": "unavailable",
389
+ "capabilityId": "household.invite",
390
+ "cliPath": "household invite|remove",
391
+ "commandOrQuery": "household_invite.commands.v2",
392
+ "fixtureIds": [
393
+ "CFW-FIX-007"
394
+ ],
395
+ "mcpSurface": "choosefire.household.*",
396
+ "milestone": "R7",
397
+ "requiredRole": "owner",
398
+ "riskLevel": "L3",
399
+ "status": "absent",
400
+ "storyIds": [
401
+ "SHARE-01"
402
+ ],
403
+ "webPath": "/app/household"
404
+ },
405
+ {
406
+ "builtinAi": "propose",
407
+ "capabilityId": "suggestion.manage",
408
+ "cliPath": "suggestion submit|decide",
409
+ "commandOrQuery": "member_suggestion.commands.v2",
410
+ "fixtureIds": [
411
+ "CFW-FIX-007"
412
+ ],
413
+ "mcpSurface": "choosefire.suggestion.*",
414
+ "milestone": "R7",
415
+ "requiredRole": "owner_or_viewer",
416
+ "riskLevel": "L2",
417
+ "status": "absent",
418
+ "storyIds": [
419
+ "SHARE-01"
420
+ ],
421
+ "webPath": "/app/pending"
422
+ },
423
+ {
424
+ "builtinAi": "unavailable",
425
+ "capabilityId": "review.complete",
426
+ "cliPath": "review prepare|complete",
427
+ "commandOrQuery": "review.commands.v2",
428
+ "fixtureIds": [
429
+ "CFW-FIX-001",
430
+ "CFW-FIX-002",
431
+ "CFW-FIX-003"
432
+ ],
433
+ "mcpSurface": "choosefire.review.*",
434
+ "milestone": "R8",
435
+ "requiredRole": "owner",
436
+ "riskLevel": "L3",
437
+ "status": "absent",
438
+ "storyIds": [
439
+ "REVIEW-01"
440
+ ],
441
+ "webPath": "/app/reviews"
442
+ },
443
+ {
444
+ "builtinAi": "unavailable",
445
+ "capabilityId": "legacy.migrate",
446
+ "cliPath": "migration preview|activate",
447
+ "commandOrQuery": "legacy_migration.commands.v2",
448
+ "fixtureIds": [
449
+ "CFW-FIX-010"
450
+ ],
451
+ "mcpSurface": "choosefire.migration.*",
452
+ "milestone": "R8",
453
+ "requiredRole": "owner",
454
+ "riskLevel": "L3",
455
+ "status": "absent",
456
+ "storyIds": [
457
+ "IMPORT-01",
458
+ "CHANNEL-01"
459
+ ],
460
+ "webPath": "/app/import/migration"
461
+ }
462
+ ],
463
+ "kind": "choosefire_family_wealth_capability_matrix.v1"
464
+ }
@@ -0,0 +1,79 @@
1
+ {
2
+ "calculationVersion": "performance.v1",
3
+ "cases": [
4
+ {
5
+ "caseId": "PERF-L1-001",
6
+ "expected": {
7
+ "balanceChange": "30000.00",
8
+ "estimatedProfit": null,
9
+ "level": "balance_change",
10
+ "moneyWeightedReturn": null,
11
+ "qualifiers": [
12
+ "not_investment_return"
13
+ ]
14
+ },
15
+ "fixtureId": "CFW-FIX-001",
16
+ "input": {
17
+ "beginningValue": "500000.00",
18
+ "endingValue": "530000.00",
19
+ "externalCashFlows": null
20
+ }
21
+ },
22
+ {
23
+ "caseId": "PERF-L2-001",
24
+ "expected": {
25
+ "assumptions": [
26
+ "midpoint_cashflow_assumption"
27
+ ],
28
+ "balanceChange": "15000.00",
29
+ "dietzDenominator": "105000.00",
30
+ "estimatedProfit": "5000.00",
31
+ "level": "estimated_return",
32
+ "moneyWeightedReturn": "0.047619047619"
33
+ },
34
+ "fixtureId": "CFW-FIX-002",
35
+ "input": {
36
+ "beginningValue": "100000.00",
37
+ "endingValue": "115000.00",
38
+ "externalCashFlows": [
39
+ {
40
+ "amount": "10000.00",
41
+ "weight": "0.50000000"
42
+ }
43
+ ]
44
+ }
45
+ },
46
+ {
47
+ "caseId": "PERF-L3-COVERAGE-001",
48
+ "expectedCoverage": {
49
+ "assumptions": [],
50
+ "calculationVersion": "performance.v1",
51
+ "eligibleMetrics": [
52
+ "money_weighted_return"
53
+ ],
54
+ "level": "detailed_performance",
55
+ "unavailableMetrics": [
56
+ {
57
+ "metric": "time_weighted_return",
58
+ "reason": "boundary_valuation_missing"
59
+ }
60
+ ],
61
+ "warnings": [
62
+ "r0_contract_only"
63
+ ]
64
+ },
65
+ "expectedResult": null,
66
+ "fixtureId": "CFW-FIX-003",
67
+ "input": {
68
+ "missingEvidence": [
69
+ "external_flow_boundary_valuation"
70
+ ],
71
+ "requestedMetrics": [
72
+ "money_weighted_return",
73
+ "time_weighted_return"
74
+ ]
75
+ }
76
+ }
77
+ ],
78
+ "kind": "choosefire_performance_golden_fixtures.v1"
79
+ }