@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
@@ -0,0 +1,1070 @@
1
+ {
2
+ "cases": [
3
+ {
4
+ "actorRole": "owner",
5
+ "caseId": "R2-ACCOUNT-CREATE-BANK-001",
6
+ "expectedAssertions": [
7
+ "owner can create a simplified bank account from an empty workspace",
8
+ "receipt advances workspace version from 1 to 2"
9
+ ],
10
+ "fixtureId": "CFW-FIX-001",
11
+ "request": {
12
+ "body": {
13
+ "commandId": "10000000-0000-4000-8000-000000000101",
14
+ "expectedObjectRevision": null,
15
+ "expectedWorkspaceVersion": 1,
16
+ "idempotencyKey": "r2-account-bank-create-001",
17
+ "kind": "asset_account.create.v2",
18
+ "payload": {
19
+ "account": {
20
+ "accountType": "bank",
21
+ "aggregationConsent": true,
22
+ "currency": "CNY",
23
+ "maintenanceMode": "simplified",
24
+ "name": "Daily Reserve",
25
+ "ownerSubjectId": "20000000-0000-4000-8000-000000000010",
26
+ "visibility": "household"
27
+ },
28
+ "accountId": "30000000-0000-4000-8000-000000000001"
29
+ },
30
+ "source": {
31
+ "channel": "cli",
32
+ "clientId": "choosefire-cli"
33
+ }
34
+ },
35
+ "method": "POST",
36
+ "path": "/choosefire/v2/workspace/asset-accounts",
37
+ "schema": "AssetAccountCreateCommandV2"
38
+ },
39
+ "response": {
40
+ "body": {
41
+ "code": 0,
42
+ "data": {
43
+ "affectedObjects": [
44
+ {
45
+ "objectId": "30000000-0000-4000-8000-000000000001",
46
+ "objectType": "asset_account"
47
+ }
48
+ ],
49
+ "baseWorkspaceVersion": 1,
50
+ "commandId": "10000000-0000-4000-8000-000000000101",
51
+ "committedAt": "2026-08-29T08:00:00.000Z",
52
+ "cursor": "eyJraW5kIjoiZmFtaWx5X3dlYWx0aF9jdXJzb3IudjIifQ.cmctZ29sZGVuLXIx",
53
+ "kind": "command_receipt.v2",
54
+ "projectionHints": [
55
+ "portfolio.tree.v2",
56
+ "workspace.overview.v2"
57
+ ],
58
+ "receiptId": "60000000-0000-4000-8000-000000000001",
59
+ "replayed": false,
60
+ "resultWorkspaceVersion": 2,
61
+ "status": "committed"
62
+ },
63
+ "kind": "family_wealth_success.v2",
64
+ "status": "success",
65
+ "success": true
66
+ },
67
+ "httpStatus": 200,
68
+ "schema": "CommandSuccessV2"
69
+ }
70
+ },
71
+ {
72
+ "actorRole": "owner",
73
+ "caseId": "R2-ACCOUNT-CREATE-PROPERTY-001",
74
+ "expectedAssertions": [
75
+ "a simplified property can be represented as a single account",
76
+ "account creation does not require holdings or transactions"
77
+ ],
78
+ "fixtureId": "CFW-FIX-001",
79
+ "request": {
80
+ "body": {
81
+ "commandId": "10000000-0000-4000-8000-000000000102",
82
+ "expectedObjectRevision": null,
83
+ "expectedWorkspaceVersion": 2,
84
+ "idempotencyKey": "r2-account-property-create-001",
85
+ "kind": "asset_account.create.v2",
86
+ "payload": {
87
+ "account": {
88
+ "accountType": "property",
89
+ "aggregationConsent": true,
90
+ "currency": "CNY",
91
+ "maintenanceMode": "simplified",
92
+ "name": "Primary Home",
93
+ "ownerSubjectId": "20000000-0000-4000-8000-000000000010",
94
+ "visibility": "household"
95
+ },
96
+ "accountId": "30000000-0000-4000-8000-000000000002"
97
+ },
98
+ "source": {
99
+ "channel": "cli",
100
+ "clientId": "choosefire-cli"
101
+ }
102
+ },
103
+ "method": "POST",
104
+ "path": "/choosefire/v2/workspace/asset-accounts",
105
+ "schema": "AssetAccountCreateCommandV2"
106
+ },
107
+ "response": {
108
+ "body": {
109
+ "code": 0,
110
+ "data": {
111
+ "affectedObjects": [
112
+ {
113
+ "objectId": "30000000-0000-4000-8000-000000000002",
114
+ "objectType": "asset_account"
115
+ }
116
+ ],
117
+ "baseWorkspaceVersion": 2,
118
+ "commandId": "10000000-0000-4000-8000-000000000102",
119
+ "committedAt": "2026-08-29T08:00:00.000Z",
120
+ "cursor": "eyJraW5kIjoiZmFtaWx5X3dlYWx0aF9jdXJzb3IudjIifQ.cmctZ29sZGVuLXIx",
121
+ "kind": "command_receipt.v2",
122
+ "projectionHints": [
123
+ "portfolio.tree.v2",
124
+ "workspace.overview.v2"
125
+ ],
126
+ "receiptId": "60000000-0000-4000-8000-000000000002",
127
+ "replayed": false,
128
+ "resultWorkspaceVersion": 3,
129
+ "status": "committed"
130
+ },
131
+ "kind": "family_wealth_success.v2",
132
+ "status": "success",
133
+ "success": true
134
+ },
135
+ "httpStatus": 200,
136
+ "schema": "CommandSuccessV2"
137
+ }
138
+ },
139
+ {
140
+ "actorRole": "owner",
141
+ "caseId": "R2-ACCOUNT-UPDATE-001",
142
+ "expectedAssertions": [
143
+ "an owner can replace editable account metadata with an object revision precondition",
144
+ "the receipt advances the workspace version and invalidates portfolio projections"
145
+ ],
146
+ "fixtureId": "CFW-FIX-001",
147
+ "request": {
148
+ "body": {
149
+ "commandId": "10000000-0000-4000-8000-000000000111",
150
+ "expectedObjectRevision": 1,
151
+ "expectedWorkspaceVersion": 4,
152
+ "idempotencyKey": "r2-account-bank-update-001",
153
+ "kind": "asset_account.update.v2",
154
+ "payload": {
155
+ "account": {
156
+ "accountType": "bank",
157
+ "aggregationConsent": true,
158
+ "currency": "CNY",
159
+ "maintenanceMode": "simplified",
160
+ "name": "Family Reserve",
161
+ "ownerSubjectId": "20000000-0000-4000-8000-000000000010",
162
+ "visibility": "household"
163
+ },
164
+ "accountId": "30000000-0000-4000-8000-000000000001"
165
+ },
166
+ "source": {
167
+ "channel": "cli",
168
+ "clientId": "choosefire-cli"
169
+ }
170
+ },
171
+ "method": "PUT",
172
+ "path": "/choosefire/v2/workspace/asset-accounts",
173
+ "schema": "AssetAccountUpdateCommandV2"
174
+ },
175
+ "response": {
176
+ "body": {
177
+ "code": 0,
178
+ "data": {
179
+ "affectedObjects": [
180
+ {
181
+ "objectId": "30000000-0000-4000-8000-000000000001",
182
+ "objectType": "asset_account"
183
+ }
184
+ ],
185
+ "baseWorkspaceVersion": 4,
186
+ "commandId": "10000000-0000-4000-8000-000000000111",
187
+ "committedAt": "2026-08-29T08:00:00.000Z",
188
+ "cursor": "eyJraW5kIjoiZmFtaWx5X3dlYWx0aF9jdXJzb3IudjIifQ.cmctZ29sZGVuLXIx",
189
+ "kind": "command_receipt.v2",
190
+ "projectionHints": [
191
+ "portfolio.tree.v2",
192
+ "workspace.overview.v2"
193
+ ],
194
+ "receiptId": "60000000-0000-4000-8000-000000000011",
195
+ "replayed": false,
196
+ "resultWorkspaceVersion": 5,
197
+ "status": "committed"
198
+ },
199
+ "kind": "family_wealth_success.v2",
200
+ "status": "success",
201
+ "success": true
202
+ },
203
+ "httpStatus": 200,
204
+ "schema": "CommandSuccessV2"
205
+ }
206
+ },
207
+ {
208
+ "actorRole": "owner",
209
+ "caseId": "R2-ACCOUNT-ARCHIVE-001",
210
+ "expectedAssertions": [
211
+ "account removal is a revision-checked archive rather than a destructive delete",
212
+ "archived accounts no longer participate in current projections"
213
+ ],
214
+ "fixtureId": "CFW-FIX-001",
215
+ "request": {
216
+ "body": {
217
+ "commandId": "10000000-0000-4000-8000-000000000112",
218
+ "expectedObjectRevision": 2,
219
+ "expectedWorkspaceVersion": 5,
220
+ "idempotencyKey": "r2-account-bank-archive-001",
221
+ "kind": "asset_account.archive.v2",
222
+ "payload": {
223
+ "accountId": "30000000-0000-4000-8000-000000000001",
224
+ "reason": "Account closed by the household"
225
+ },
226
+ "source": {
227
+ "channel": "cli",
228
+ "clientId": "choosefire-cli"
229
+ }
230
+ },
231
+ "method": "POST",
232
+ "path": "/choosefire/v2/workspace/asset-accounts/archive",
233
+ "schema": "AssetAccountArchiveCommandV2"
234
+ },
235
+ "response": {
236
+ "body": {
237
+ "code": 0,
238
+ "data": {
239
+ "affectedObjects": [
240
+ {
241
+ "objectId": "30000000-0000-4000-8000-000000000001",
242
+ "objectType": "asset_account"
243
+ }
244
+ ],
245
+ "baseWorkspaceVersion": 5,
246
+ "commandId": "10000000-0000-4000-8000-000000000112",
247
+ "committedAt": "2026-08-29T08:00:00.000Z",
248
+ "cursor": "eyJraW5kIjoiZmFtaWx5X3dlYWx0aF9jdXJzb3IudjIifQ.cmctZ29sZGVuLXIx",
249
+ "kind": "command_receipt.v2",
250
+ "projectionHints": [
251
+ "portfolio.tree.v2",
252
+ "workspace.overview.v2"
253
+ ],
254
+ "receiptId": "60000000-0000-4000-8000-000000000012",
255
+ "replayed": false,
256
+ "resultWorkspaceVersion": 6,
257
+ "status": "committed"
258
+ },
259
+ "kind": "family_wealth_success.v2",
260
+ "status": "success",
261
+ "success": true
262
+ },
263
+ "httpStatus": 200,
264
+ "schema": "CommandSuccessV2"
265
+ }
266
+ },
267
+ {
268
+ "actorRole": "owner",
269
+ "caseId": "R2-ACCOUNT-CREATE-BROKERAGE-001",
270
+ "expectedAssertions": [
271
+ "a detailed brokerage account is created without inventing holdings",
272
+ "maintenance mode does not claim a performance level"
273
+ ],
274
+ "fixtureId": "CFW-FIX-003",
275
+ "request": {
276
+ "body": {
277
+ "commandId": "10000000-0000-4000-8000-000000000103",
278
+ "expectedObjectRevision": null,
279
+ "expectedWorkspaceVersion": 3,
280
+ "idempotencyKey": "r2-account-brokerage-create-001",
281
+ "kind": "asset_account.create.v2",
282
+ "payload": {
283
+ "account": {
284
+ "accountType": "brokerage",
285
+ "aggregationConsent": true,
286
+ "currency": "CNY",
287
+ "maintenanceMode": "detailed",
288
+ "name": "Brokerage Account",
289
+ "ownerSubjectId": "20000000-0000-4000-8000-000000000010",
290
+ "visibility": "household"
291
+ },
292
+ "accountId": "30000000-0000-4000-8000-000000000003"
293
+ },
294
+ "source": {
295
+ "channel": "cli",
296
+ "clientId": "choosefire-cli"
297
+ }
298
+ },
299
+ "method": "POST",
300
+ "path": "/choosefire/v2/workspace/asset-accounts",
301
+ "schema": "AssetAccountCreateCommandV2"
302
+ },
303
+ "response": {
304
+ "body": {
305
+ "code": 0,
306
+ "data": {
307
+ "affectedObjects": [
308
+ {
309
+ "objectId": "30000000-0000-4000-8000-000000000003",
310
+ "objectType": "asset_account"
311
+ }
312
+ ],
313
+ "baseWorkspaceVersion": 3,
314
+ "commandId": "10000000-0000-4000-8000-000000000103",
315
+ "committedAt": "2026-08-29T08:00:00.000Z",
316
+ "cursor": "eyJraW5kIjoiZmFtaWx5X3dlYWx0aF9jdXJzb3IudjIifQ.cmctZ29sZGVuLXIx",
317
+ "kind": "command_receipt.v2",
318
+ "projectionHints": [
319
+ "portfolio.tree.v2",
320
+ "workspace.overview.v2"
321
+ ],
322
+ "receiptId": "60000000-0000-4000-8000-000000000003",
323
+ "replayed": false,
324
+ "resultWorkspaceVersion": 4,
325
+ "status": "committed"
326
+ },
327
+ "kind": "family_wealth_success.v2",
328
+ "status": "success",
329
+ "success": true
330
+ },
331
+ "httpStatus": 200,
332
+ "schema": "CommandSuccessV2"
333
+ }
334
+ },
335
+ {
336
+ "actorRole": "owner",
337
+ "caseId": "R2-VALUATION-APPEND-001",
338
+ "expectedAssertions": [
339
+ "valuation append preserves the historical snapshot record",
340
+ "estimated quality and asOf are visible to the overview projection"
341
+ ],
342
+ "fixtureId": "CFW-FIX-001",
343
+ "request": {
344
+ "body": {
345
+ "commandId": "10000000-0000-4000-8000-000000000104",
346
+ "expectedObjectRevision": null,
347
+ "expectedWorkspaceVersion": 4,
348
+ "idempotencyKey": "r2-valuation-property-001",
349
+ "kind": "valuation_snapshot.append.v2",
350
+ "payload": {
351
+ "snapshot": {
352
+ "asOf": "2026-08-28T00:00:00.000Z",
353
+ "quality": "estimated",
354
+ "scopeId": "30000000-0000-4000-8000-000000000002",
355
+ "scopeType": "account",
356
+ "source": {
357
+ "channel": "web",
358
+ "clientId": "choosefire-web"
359
+ },
360
+ "value": {
361
+ "amount": "1200000.00",
362
+ "currency": "CNY"
363
+ }
364
+ },
365
+ "snapshotId": "40000000-0000-4000-8000-000000000001"
366
+ },
367
+ "source": {
368
+ "channel": "web",
369
+ "clientId": "choosefire-web"
370
+ }
371
+ },
372
+ "method": "POST",
373
+ "path": "/choosefire/v2/workspace/valuations",
374
+ "schema": "ValuationSnapshotAppendCommandV2"
375
+ },
376
+ "response": {
377
+ "body": {
378
+ "code": 0,
379
+ "data": {
380
+ "affectedObjects": [
381
+ {
382
+ "objectId": "40000000-0000-4000-8000-000000000001",
383
+ "objectType": "valuation_snapshot"
384
+ },
385
+ {
386
+ "objectId": "30000000-0000-4000-8000-000000000002",
387
+ "objectType": "asset_account"
388
+ }
389
+ ],
390
+ "baseWorkspaceVersion": 4,
391
+ "commandId": "10000000-0000-4000-8000-000000000104",
392
+ "committedAt": "2026-08-29T08:00:00.000Z",
393
+ "cursor": "eyJraW5kIjoiZmFtaWx5X3dlYWx0aF9jdXJzb3IudjIifQ.cmctZ29sZGVuLXIx",
394
+ "kind": "command_receipt.v2",
395
+ "projectionHints": [
396
+ "workspace.overview.v2"
397
+ ],
398
+ "receiptId": "60000000-0000-4000-8000-000000000004",
399
+ "replayed": false,
400
+ "resultWorkspaceVersion": 5,
401
+ "status": "committed"
402
+ },
403
+ "kind": "family_wealth_success.v2",
404
+ "status": "success",
405
+ "success": true
406
+ },
407
+ "httpStatus": 200,
408
+ "schema": "CommandSuccessV2"
409
+ }
410
+ },
411
+ {
412
+ "actorRole": "owner",
413
+ "caseId": "R2-CLASSIFICATION-REPLACE-001",
414
+ "expectedAssertions": [
415
+ "asset classes total 10000 basis points",
416
+ "purpose buckets total 10000 basis points independently",
417
+ "classification replacement does not change account value"
418
+ ],
419
+ "fixtureId": "CFW-FIX-005",
420
+ "request": {
421
+ "body": {
422
+ "commandId": "10000000-0000-4000-8000-000000000105",
423
+ "expectedObjectRevision": 0,
424
+ "expectedWorkspaceVersion": 5,
425
+ "idempotencyKey": "r2-classification-property-001",
426
+ "kind": "classification.replace.v2",
427
+ "payload": {
428
+ "classification": {
429
+ "assetClasses": [
430
+ {
431
+ "basisPoints": 10000,
432
+ "code": "property"
433
+ }
434
+ ],
435
+ "effectiveFrom": "2026-08-29T00:00:00.000Z",
436
+ "purposeBuckets": [
437
+ {
438
+ "basisPoints": 6000,
439
+ "code": "safety_buffer"
440
+ },
441
+ {
442
+ "basisPoints": 4000,
443
+ "code": "near_term_spending"
444
+ }
445
+ ],
446
+ "scopeId": "30000000-0000-4000-8000-000000000002",
447
+ "scopeType": "account"
448
+ },
449
+ "classificationRevisionId": "50000000-0000-4000-8000-000000000001"
450
+ },
451
+ "source": {
452
+ "channel": "web",
453
+ "clientId": "choosefire-web"
454
+ }
455
+ },
456
+ "method": "PUT",
457
+ "path": "/choosefire/v2/workspace/classifications",
458
+ "schema": "ClassificationReplaceCommandV2"
459
+ },
460
+ "response": {
461
+ "body": {
462
+ "code": 0,
463
+ "data": {
464
+ "affectedObjects": [
465
+ {
466
+ "objectId": "50000000-0000-4000-8000-000000000001",
467
+ "objectType": "classification"
468
+ }
469
+ ],
470
+ "baseWorkspaceVersion": 5,
471
+ "commandId": "10000000-0000-4000-8000-000000000105",
472
+ "committedAt": "2026-08-29T08:00:00.000Z",
473
+ "cursor": "eyJraW5kIjoiZmFtaWx5X3dlYWx0aF9jdXJzb3IudjIifQ.cmctZ29sZGVuLXIx",
474
+ "kind": "command_receipt.v2",
475
+ "projectionHints": [
476
+ "allocation.matrix.v2",
477
+ "workspace.overview.v2"
478
+ ],
479
+ "receiptId": "60000000-0000-4000-8000-000000000005",
480
+ "replayed": false,
481
+ "resultWorkspaceVersion": 6,
482
+ "status": "committed"
483
+ },
484
+ "kind": "family_wealth_success.v2",
485
+ "status": "success",
486
+ "success": true
487
+ },
488
+ "httpStatus": 200,
489
+ "schema": "CommandSuccessV2"
490
+ }
491
+ },
492
+ {
493
+ "actorRole": "owner",
494
+ "caseId": "R2-OVERVIEW-OWNER-001",
495
+ "expectedAssertions": [
496
+ "owner sees gross assets, liabilities and net worth in base currency",
497
+ "estimated and stale quality remain visible instead of being hidden",
498
+ "asset-class and purpose totals are independently normalized"
499
+ ],
500
+ "fixtureId": "CFW-FIX-005",
501
+ "request": {
502
+ "body": null,
503
+ "method": "GET",
504
+ "path": "/choosefire/v2/workspace/overview",
505
+ "schema": null
506
+ },
507
+ "response": {
508
+ "body": {
509
+ "code": 0,
510
+ "data": {
511
+ "accounts": [
512
+ {
513
+ "accountId": "30000000-0000-4000-8000-000000000001",
514
+ "accountType": "bank",
515
+ "aggregationConsent": true,
516
+ "assetClasses": [
517
+ {
518
+ "basisPoints": 10000,
519
+ "code": "cash"
520
+ }
521
+ ],
522
+ "classificationRevision": 0,
523
+ "currency": "CNY",
524
+ "maintenanceMode": "simplified",
525
+ "name": "Daily Reserve",
526
+ "ownerSubjectId": "20000000-0000-4000-8000-000000000010",
527
+ "purposeBuckets": [
528
+ {
529
+ "basisPoints": 10000,
530
+ "code": "safety_buffer"
531
+ }
532
+ ],
533
+ "revision": 1,
534
+ "valuation": {
535
+ "asOf": "2026-08-29T00:00:00.000Z",
536
+ "freshness": "current",
537
+ "quality": "confirmed",
538
+ "value": {
539
+ "amount": "200000.00",
540
+ "currency": "CNY"
541
+ }
542
+ },
543
+ "visibility": "household"
544
+ },
545
+ {
546
+ "accountId": "30000000-0000-4000-8000-000000000002",
547
+ "accountType": "property",
548
+ "aggregationConsent": true,
549
+ "assetClasses": [
550
+ {
551
+ "basisPoints": 10000,
552
+ "code": "property"
553
+ }
554
+ ],
555
+ "classificationRevision": 1,
556
+ "currency": "CNY",
557
+ "maintenanceMode": "simplified",
558
+ "name": "Primary Home",
559
+ "ownerSubjectId": "20000000-0000-4000-8000-000000000010",
560
+ "purposeBuckets": [
561
+ {
562
+ "basisPoints": 6000,
563
+ "code": "safety_buffer"
564
+ },
565
+ {
566
+ "basisPoints": 4000,
567
+ "code": "near_term_spending"
568
+ }
569
+ ],
570
+ "revision": 1,
571
+ "valuation": {
572
+ "asOf": "2026-08-28T00:00:00.000Z",
573
+ "freshness": "stale",
574
+ "quality": "estimated",
575
+ "value": {
576
+ "amount": "1200000.00",
577
+ "currency": "CNY"
578
+ }
579
+ },
580
+ "visibility": "household"
581
+ },
582
+ {
583
+ "accountId": "30000000-0000-4000-8000-000000000003",
584
+ "accountType": "brokerage",
585
+ "aggregationConsent": true,
586
+ "assetClasses": [
587
+ {
588
+ "basisPoints": 10000,
589
+ "code": "equity"
590
+ }
591
+ ],
592
+ "classificationRevision": 0,
593
+ "currency": "CNY",
594
+ "maintenanceMode": "detailed",
595
+ "name": "Brokerage Account",
596
+ "ownerSubjectId": "20000000-0000-4000-8000-000000000010",
597
+ "purposeBuckets": [
598
+ {
599
+ "basisPoints": 10000,
600
+ "code": "long_term_investing"
601
+ }
602
+ ],
603
+ "revision": 1,
604
+ "valuation": {
605
+ "asOf": "2026-08-29T00:00:00.000Z",
606
+ "freshness": "current",
607
+ "quality": "confirmed",
608
+ "value": {
609
+ "amount": "300000.00",
610
+ "currency": "CNY"
611
+ }
612
+ },
613
+ "visibility": "household"
614
+ }
615
+ ],
616
+ "asOf": "2026-08-29T00:00:00.000Z",
617
+ "assetClasses": [
618
+ {
619
+ "basisPoints": 1176,
620
+ "code": "cash",
621
+ "value": {
622
+ "amount": "200000.00",
623
+ "currency": "CNY"
624
+ }
625
+ },
626
+ {
627
+ "basisPoints": 7059,
628
+ "code": "property",
629
+ "value": {
630
+ "amount": "1200000.00",
631
+ "currency": "CNY"
632
+ }
633
+ },
634
+ {
635
+ "basisPoints": 1765,
636
+ "code": "equity",
637
+ "value": {
638
+ "amount": "300000.00",
639
+ "currency": "CNY"
640
+ }
641
+ }
642
+ ],
643
+ "authority": {
644
+ "householdId": "20000000-0000-4000-8000-000000000001",
645
+ "role": "owner",
646
+ "workspaceId": "20000000-0000-4000-8000-000000000002"
647
+ },
648
+ "baseCurrency": "CNY",
649
+ "breakdownStatus": "complete",
650
+ "contractVersion": 2,
651
+ "coverage": {
652
+ "estimatedAccountCount": 1,
653
+ "missingValuationAccountCount": 0,
654
+ "staleAccountCount": 1,
655
+ "unclassifiedAccountCount": 0,
656
+ "unconverted": [],
657
+ "visibleAccountCount": 3
658
+ },
659
+ "kind": "workspace.overview.v2",
660
+ "privacy": {
661
+ "containsRestrictedData": false,
662
+ "suppressedFields": []
663
+ },
664
+ "projectionVersion": 1,
665
+ "purposeBuckets": [
666
+ {
667
+ "basisPoints": 5412,
668
+ "code": "safety_buffer",
669
+ "value": {
670
+ "amount": "920000.00",
671
+ "currency": "CNY"
672
+ }
673
+ },
674
+ {
675
+ "basisPoints": 2824,
676
+ "code": "near_term_spending",
677
+ "value": {
678
+ "amount": "480000.00",
679
+ "currency": "CNY"
680
+ }
681
+ },
682
+ {
683
+ "basisPoints": 1764,
684
+ "code": "long_term_investing",
685
+ "value": {
686
+ "amount": "300000.00",
687
+ "currency": "CNY"
688
+ }
689
+ }
690
+ ],
691
+ "totals": {
692
+ "grossAssets": {
693
+ "amount": "1700000.00",
694
+ "currency": "CNY"
695
+ },
696
+ "liabilities": {
697
+ "amount": "300000.00",
698
+ "currency": "CNY"
699
+ },
700
+ "netWorth": {
701
+ "amount": "1400000.00",
702
+ "currency": "CNY"
703
+ }
704
+ },
705
+ "warnings": [
706
+ "estimated_values_present",
707
+ "stale_values_present"
708
+ ],
709
+ "workspaceVersion": 6
710
+ },
711
+ "kind": "family_wealth_success.v2",
712
+ "status": "success",
713
+ "success": true
714
+ },
715
+ "httpStatus": 200,
716
+ "schema": "WorkspaceOverviewSuccessV2"
717
+ }
718
+ },
719
+ {
720
+ "actorRole": "viewer_suggester",
721
+ "caseId": "R2-OVERVIEW-VIEWER-001",
722
+ "expectedAssertions": [
723
+ "viewer receives only a fixed aggregate when private data is included",
724
+ "viewer cannot infer private account count or allocation breakdowns"
725
+ ],
726
+ "fixtureId": "CFW-FIX-007",
727
+ "request": {
728
+ "body": null,
729
+ "method": "GET",
730
+ "path": "/choosefire/v2/workspace/overview",
731
+ "schema": null
732
+ },
733
+ "response": {
734
+ "body": {
735
+ "code": 0,
736
+ "data": {
737
+ "accounts": [],
738
+ "asOf": "2026-08-29T00:00:00.000Z",
739
+ "assetClasses": [],
740
+ "authority": {
741
+ "householdId": "20000000-0000-4000-8000-000000000001",
742
+ "role": "viewer_suggester",
743
+ "workspaceId": "20000000-0000-4000-8000-000000000002"
744
+ },
745
+ "baseCurrency": "CNY",
746
+ "breakdownStatus": "suppressed_due_to_private_aggregation",
747
+ "contractVersion": 2,
748
+ "coverage": {
749
+ "estimatedAccountCount": 0,
750
+ "missingValuationAccountCount": 0,
751
+ "staleAccountCount": 0,
752
+ "unclassifiedAccountCount": 0,
753
+ "unconverted": [],
754
+ "visibleAccountCount": 0
755
+ },
756
+ "kind": "workspace.overview.v2",
757
+ "privacy": {
758
+ "containsRestrictedData": true,
759
+ "suppressedFields": [
760
+ "account_count",
761
+ "account_details",
762
+ "allocation_breakdowns",
763
+ "freshness_breakdown"
764
+ ]
765
+ },
766
+ "projectionVersion": 1,
767
+ "purposeBuckets": [],
768
+ "totals": {
769
+ "grossAssets": {
770
+ "amount": "1700000.00",
771
+ "currency": "CNY"
772
+ },
773
+ "liabilities": {
774
+ "amount": "300000.00",
775
+ "currency": "CNY"
776
+ },
777
+ "netWorth": {
778
+ "amount": "1400000.00",
779
+ "currency": "CNY"
780
+ }
781
+ },
782
+ "warnings": [
783
+ "restricted_values_aggregated"
784
+ ],
785
+ "workspaceVersion": 6
786
+ },
787
+ "kind": "family_wealth_success.v2",
788
+ "status": "success",
789
+ "success": true
790
+ },
791
+ "httpStatus": 200,
792
+ "schema": "WorkspaceOverviewSuccessV2"
793
+ }
794
+ },
795
+ {
796
+ "actorRole": "owner",
797
+ "caseId": "R2-OVERVIEW-MIXED-FX-001",
798
+ "expectedAssertions": [
799
+ "missing FX excludes the USD amount from CNY totals",
800
+ "overview discloses the excluded currency and reason"
801
+ ],
802
+ "fixtureId": "CFW-FIX-004",
803
+ "request": {
804
+ "body": null,
805
+ "method": "GET",
806
+ "path": "/choosefire/v2/workspace/overview",
807
+ "schema": null
808
+ },
809
+ "response": {
810
+ "body": {
811
+ "code": 0,
812
+ "data": {
813
+ "accounts": [],
814
+ "asOf": "2026-08-29T00:00:00.000Z",
815
+ "assetClasses": [],
816
+ "authority": {
817
+ "householdId": "20000000-0000-4000-8000-000000000001",
818
+ "role": "owner",
819
+ "workspaceId": "20000000-0000-4000-8000-000000000002"
820
+ },
821
+ "baseCurrency": "CNY",
822
+ "breakdownStatus": "complete",
823
+ "contractVersion": 2,
824
+ "coverage": {
825
+ "estimatedAccountCount": 1,
826
+ "missingValuationAccountCount": 0,
827
+ "staleAccountCount": 1,
828
+ "unclassifiedAccountCount": 0,
829
+ "unconverted": [
830
+ {
831
+ "amount": {
832
+ "amount": "10000.00",
833
+ "currency": "USD"
834
+ },
835
+ "reason": "fx_rate_missing"
836
+ }
837
+ ],
838
+ "visibleAccountCount": 3
839
+ },
840
+ "kind": "workspace.overview.v2",
841
+ "privacy": {
842
+ "containsRestrictedData": false,
843
+ "suppressedFields": []
844
+ },
845
+ "projectionVersion": 1,
846
+ "purposeBuckets": [],
847
+ "totals": {
848
+ "grossAssets": {
849
+ "amount": "1700000.00",
850
+ "currency": "CNY"
851
+ },
852
+ "liabilities": {
853
+ "amount": "300000.00",
854
+ "currency": "CNY"
855
+ },
856
+ "netWorth": {
857
+ "amount": "1400000.00",
858
+ "currency": "CNY"
859
+ }
860
+ },
861
+ "warnings": [
862
+ "unconverted_values_excluded"
863
+ ],
864
+ "workspaceVersion": 6
865
+ },
866
+ "kind": "family_wealth_success.v2",
867
+ "status": "success",
868
+ "success": true
869
+ },
870
+ "httpStatus": 200,
871
+ "schema": "WorkspaceOverviewSuccessV2"
872
+ }
873
+ },
874
+ {
875
+ "actorRole": "viewer_suggester",
876
+ "caseId": "R2-VIEWER-WRITE-DENIED-001",
877
+ "expectedAssertions": [
878
+ "viewer_suggester cannot create or edit formal asset accounts",
879
+ "permission denial has no workspace side effect"
880
+ ],
881
+ "fixtureId": "CFW-FIX-007",
882
+ "request": {
883
+ "body": {
884
+ "commandId": "10000000-0000-4000-8000-000000000106",
885
+ "expectedObjectRevision": null,
886
+ "expectedWorkspaceVersion": 1,
887
+ "idempotencyKey": "r2-account-bank-create-001",
888
+ "kind": "asset_account.create.v2",
889
+ "payload": {
890
+ "account": {
891
+ "accountType": "bank",
892
+ "aggregationConsent": true,
893
+ "currency": "CNY",
894
+ "maintenanceMode": "simplified",
895
+ "name": "Daily Reserve",
896
+ "ownerSubjectId": "20000000-0000-4000-8000-000000000010",
897
+ "visibility": "household"
898
+ },
899
+ "accountId": "30000000-0000-4000-8000-000000000001"
900
+ },
901
+ "source": {
902
+ "channel": "cli",
903
+ "clientId": "choosefire-cli"
904
+ }
905
+ },
906
+ "method": "POST",
907
+ "path": "/choosefire/v2/workspace/asset-accounts",
908
+ "schema": "AssetAccountCreateCommandV2"
909
+ },
910
+ "response": {
911
+ "body": {
912
+ "code": "PERMISSION_DENIED",
913
+ "error": {
914
+ "data": {
915
+ "contractId": "choosefire-family-wealth.v2",
916
+ "retryable": false
917
+ },
918
+ "message": "Only the household owner can change asset accounts.",
919
+ "requestId": "request-r2-viewer-write-denied"
920
+ },
921
+ "kind": "family_wealth_error.v2",
922
+ "status": "error",
923
+ "success": false
924
+ },
925
+ "httpStatus": 403,
926
+ "schema": "FamilyWealthErrorV2"
927
+ }
928
+ },
929
+ {
930
+ "actorRole": "owner",
931
+ "caseId": "R2-CAS-CONFLICT-001",
932
+ "expectedAssertions": [
933
+ "stale object revision is rejected without last-write-wins",
934
+ "conflict discloses current revision and conflicting fields"
935
+ ],
936
+ "fixtureId": "CFW-FIX-005",
937
+ "request": {
938
+ "body": {
939
+ "commandId": "10000000-0000-4000-8000-000000000107",
940
+ "expectedObjectRevision": 0,
941
+ "expectedWorkspaceVersion": 5,
942
+ "idempotencyKey": "r2-classification-stale-001",
943
+ "kind": "classification.replace.v2",
944
+ "payload": {
945
+ "classification": {
946
+ "assetClasses": [
947
+ {
948
+ "basisPoints": 10000,
949
+ "code": "property"
950
+ }
951
+ ],
952
+ "effectiveFrom": "2026-08-29T00:00:00.000Z",
953
+ "purposeBuckets": [
954
+ {
955
+ "basisPoints": 10000,
956
+ "code": "safety_buffer"
957
+ }
958
+ ],
959
+ "scopeId": "30000000-0000-4000-8000-000000000002",
960
+ "scopeType": "account"
961
+ },
962
+ "classificationRevisionId": "50000000-0000-4000-8000-000000000002"
963
+ },
964
+ "source": {
965
+ "channel": "web",
966
+ "clientId": "choosefire-web"
967
+ }
968
+ },
969
+ "method": "PUT",
970
+ "path": "/choosefire/v2/workspace/classifications",
971
+ "schema": "ClassificationReplaceCommandV2"
972
+ },
973
+ "response": {
974
+ "body": {
975
+ "code": "OBJECT_REVISION_CONFLICT",
976
+ "error": {
977
+ "data": {
978
+ "conflictingFields": [
979
+ "assetClasses",
980
+ "purposeBuckets"
981
+ ],
982
+ "contractId": "choosefire-family-wealth.v2",
983
+ "currentObjectRevision": 1,
984
+ "currentWorkspaceVersion": 6,
985
+ "retryable": false,
986
+ "safeRetry": false
987
+ },
988
+ "message": "The classification changed after this preview was created.",
989
+ "requestId": "request-r2-cas-conflict"
990
+ },
991
+ "kind": "family_wealth_error.v2",
992
+ "status": "error",
993
+ "success": false
994
+ },
995
+ "httpStatus": 409,
996
+ "schema": "FamilyWealthErrorV2"
997
+ }
998
+ },
999
+ {
1000
+ "actorRole": "owner",
1001
+ "caseId": "R2-IDEMPOTENT-REPLAY-001",
1002
+ "expectedAssertions": [
1003
+ "replaying the same idempotency key returns the original receipt id",
1004
+ "replay does not create a duplicate account or advance the version"
1005
+ ],
1006
+ "fixtureId": "CFW-FIX-001",
1007
+ "request": {
1008
+ "body": {
1009
+ "commandId": "10000000-0000-4000-8000-000000000101",
1010
+ "expectedObjectRevision": null,
1011
+ "expectedWorkspaceVersion": 1,
1012
+ "idempotencyKey": "r2-account-bank-create-001",
1013
+ "kind": "asset_account.create.v2",
1014
+ "payload": {
1015
+ "account": {
1016
+ "accountType": "bank",
1017
+ "aggregationConsent": true,
1018
+ "currency": "CNY",
1019
+ "maintenanceMode": "simplified",
1020
+ "name": "Daily Reserve",
1021
+ "ownerSubjectId": "20000000-0000-4000-8000-000000000010",
1022
+ "visibility": "household"
1023
+ },
1024
+ "accountId": "30000000-0000-4000-8000-000000000001"
1025
+ },
1026
+ "source": {
1027
+ "channel": "cli",
1028
+ "clientId": "choosefire-cli"
1029
+ }
1030
+ },
1031
+ "method": "POST",
1032
+ "path": "/choosefire/v2/workspace/asset-accounts",
1033
+ "schema": "AssetAccountCreateCommandV2"
1034
+ },
1035
+ "response": {
1036
+ "body": {
1037
+ "code": 0,
1038
+ "data": {
1039
+ "affectedObjects": [
1040
+ {
1041
+ "objectId": "30000000-0000-4000-8000-000000000001",
1042
+ "objectType": "asset_account"
1043
+ }
1044
+ ],
1045
+ "baseWorkspaceVersion": 1,
1046
+ "commandId": "10000000-0000-4000-8000-000000000101",
1047
+ "committedAt": "2026-08-29T08:00:00.000Z",
1048
+ "cursor": "eyJraW5kIjoiZmFtaWx5X3dlYWx0aF9jdXJzb3IudjIifQ.cmctZ29sZGVuLXIx",
1049
+ "kind": "command_receipt.v2",
1050
+ "projectionHints": [
1051
+ "portfolio.tree.v2",
1052
+ "workspace.overview.v2"
1053
+ ],
1054
+ "receiptId": "60000000-0000-4000-8000-000000000001",
1055
+ "replayed": true,
1056
+ "resultWorkspaceVersion": 2,
1057
+ "status": "committed"
1058
+ },
1059
+ "kind": "family_wealth_success.v2",
1060
+ "status": "success",
1061
+ "success": true
1062
+ },
1063
+ "httpStatus": 200,
1064
+ "schema": "CommandSuccessV2"
1065
+ }
1066
+ }
1067
+ ],
1068
+ "kind": "choosefire_r2_contract_golden.v1",
1069
+ "milestone": "R2"
1070
+ }