@gregiteen/ssss-cli 0.11.0 → 0.11.2

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.
@@ -1,134 +1,1115 @@
1
1
  {
2
2
  "$schema": "https://ssss.dev/registry/v1",
3
- "registry": "festech",
4
- "extends": "core",
5
- "spec_version": "0.3",
6
- "description": "Festech extension registry. Defines the host-specific primitives that festech.live layers on top of the SSSS core (registry/core.json). Lifted from festech's docs/ssss/primitive-registry.json and assigned a portability class (§5.5) so a festech workspace can be exported as a backup/template/sale bundle. Core primitives (assistant, workflow, rule, security_role, skill, model, memory, task, conversation, run, conflict, page, migration, release) are NOT redefined here — they are governed by core.json. An extension MUST NOT redefine a core type.",
7
- "conformance": "A festech-conformant host MUST resolve portability for these primitives from this registry. The `resource_bound` primitives MUST ship only a requirement declaration (never the seller's bound value) in a template/sale export; the `tenant_private` primitives MUST be dropped from template/sale entirely (§5.5).",
8
-
3
+ "conformance": "A festech-conformant host MUST resolve portability for these primitives from this registry. The `resource_bound` primitives MUST ship only a requirement declaration (never the seller's bound value) in a template/sale export; the `tenant_private` primitives MUST be dropped from template/sale entirely (\u00a75.5).",
4
+ "description": "Festech extension registry. Defines the host-specific primitives that festech.live layers on top of the SSSS core (registry/core.json). Lifted from festech's docs/ssss/primitive-registry.json and assigned a portability class (\u00a75.5) so a festech workspace can be exported as a backup/template/sale bundle. Core primitives (assistant, workflow, rule, security_role, skill, model, memory, task, conversation, run, conflict, page, migration, release) are NOT redefined here \u2014 they are governed by core.json. An extension MUST NOT redefine a core type. Derived from the Festech application registry (docs/ssss/primitive-registry.json, 198 primitives); the 73 types observed in live vault data are declared here.",
9
5
  "document_primitives": {
10
- "domain": {
11
- "family": "resource",
12
- "canonical_path": "domains/<domain>.md",
6
+ "ai_integration": {
13
7
  "append_only": false,
8
+ "canonical_path": "integrations/ai.md",
9
+ "family": "record",
10
+ "portability": "tenant_private",
11
+ "projection_strategy": "replace",
12
+ "required_fields": [
13
+ "type",
14
+ "use_platform_tokens"
15
+ ]
16
+ },
17
+ "asset_share": {
18
+ "append_only": false,
19
+ "canonical_path": "asset_shares/<id>.md",
20
+ "family": "record",
21
+ "notes": "A time-limited share link for a festech file asset. Holds a bearer token, so it never travels in a template/sale export.",
14
22
  "portability": "resource_bound",
15
- "resource": { "kind": "domain", "binds": ["domain_name", "registrar"], "provision_relation": "owns_domain" },
16
- "required_fields": ["type", "domain_name", "registrar", "status", "payment_status"],
17
- "notes": "The seller's domain is NEVER transferred. In template/sale the bundle declares 'this business needs a domain'; the buyer binds their own at provision (§16)."
23
+ "required_fields": [
24
+ "type",
25
+ "id",
26
+ "token",
27
+ "asset_id"
28
+ ]
18
29
  },
19
- "phone_number": {
30
+ "audit_log": {
31
+ "append_only": true,
32
+ "canonical_path": "audit/logs/<year-month>/<audit-id>.md",
33
+ "family": "record",
34
+ "portability": "tenant_private",
35
+ "projection_strategy": "append_only_log",
36
+ "required_fields": [
37
+ "action",
38
+ "entity_id",
39
+ "entity_type",
40
+ "type"
41
+ ]
42
+ },
43
+ "automation": {
44
+ "append_only": false,
45
+ "canonical_path": "automations/<slug>.md",
46
+ "family": "record",
47
+ "notes": "App registry marks triggers required but they are absent in some live documents; not enforced.",
48
+ "portability": "tenant_private",
49
+ "projection_strategy": "vfs_event_router",
50
+ "required_fields": [
51
+ "name",
52
+ "type"
53
+ ]
54
+ },
55
+ "benefit-fulfillment": {
56
+ "append_only": false,
57
+ "canonical_path": "crm/fulfillments/<id>.md",
58
+ "family": "record",
59
+ "portability": "tenant_private",
60
+ "projection_strategy": "vfs_event_router",
61
+ "required_fields": [
62
+ "benefit_id",
63
+ "partnership_id",
64
+ "status",
65
+ "type"
66
+ ]
67
+ },
68
+ "call_log": {
69
+ "append_only": true,
70
+ "canonical_path": "comms/calls/<slug>.md",
71
+ "family": "record",
72
+ "portability": "tenant_private",
73
+ "projection_strategy": "insert_only",
74
+ "required_fields": [
75
+ "direction",
76
+ "phone_number",
77
+ "status",
78
+ "type"
79
+ ]
80
+ },
81
+ "channel": {
82
+ "append_only": false,
83
+ "canonical_path": "channels/<slug>.md",
84
+ "family": "record",
85
+ "portability": "tenant_private",
86
+ "required_fields": [
87
+ "type"
88
+ ]
89
+ },
90
+ "channel_membership": {
91
+ "append_only": false,
92
+ "canonical_path": "channel_memberships/<id>.md",
93
+ "family": "record",
94
+ "portability": "tenant_private",
95
+ "required_fields": [
96
+ "id",
97
+ "type"
98
+ ]
99
+ },
100
+ "chat_message": {
101
+ "append_only": true,
102
+ "canonical_path": "chat_messages/<slug>.md",
103
+ "family": "record",
104
+ "portability": "tenant_private",
105
+ "projection_strategy": "append",
106
+ "required_fields": [
107
+ "sender_id",
108
+ "thread_id",
109
+ "type"
110
+ ]
111
+ },
112
+ "chat_thread": {
113
+ "append_only": false,
114
+ "canonical_path": "chat_threads/<slug>.md",
115
+ "family": "record",
116
+ "portability": "tenant_private",
117
+ "projection_strategy": "replace",
118
+ "required_fields": [
119
+ "participant_a",
120
+ "type"
121
+ ]
122
+ },
123
+ "collective": {
124
+ "append_only": false,
125
+ "canonical_path": "collective.md",
126
+ "family": "record",
127
+ "portability": "tenant_private",
128
+ "projection_strategy": "replace",
129
+ "required_fields": [
130
+ "name",
131
+ "slug",
132
+ "type"
133
+ ]
134
+ },
135
+ "contact": {
136
+ "append_only": false,
137
+ "canonical_path": "crm/contacts/<slug>.md",
138
+ "family": "record",
139
+ "portability": "tenant_private",
140
+ "projection_strategy": "vfs_event_router",
141
+ "required_fields": [
142
+ "first_name",
143
+ "type"
144
+ ]
145
+ },
146
+ "contract": {
147
+ "append_only": false,
148
+ "canonical_path": "contracts/<id>.md",
149
+ "family": "record",
150
+ "portability": "tenant_private",
151
+ "projection_strategy": "replace",
152
+ "required_fields": [
153
+ "contractor_contact_id",
154
+ "title",
155
+ "type"
156
+ ]
157
+ },
158
+ "crm_referral": {
159
+ "append_only": false,
160
+ "canonical_path": "crm_referrals/<id>.md",
161
+ "family": "record",
162
+ "portability": "tenant_private",
163
+ "required_fields": [
164
+ "id",
165
+ "type"
166
+ ]
167
+ },
168
+ "design": {
169
+ "append_only": false,
170
+ "canonical_path": "design-profiles/<id>/DESIGN.md",
171
+ "family": "record",
172
+ "portability": "tenant_private",
173
+ "projection_strategy": "vfs_event_router",
174
+ "required_fields": [
175
+ "type"
176
+ ]
177
+ },
178
+ "design_system": {
179
+ "append_only": false,
180
+ "canonical_path": "design_system.md",
181
+ "family": "record",
182
+ "portability": "tenant_private",
183
+ "projection_strategy": "replace",
184
+ "required_fields": [
185
+ "type"
186
+ ]
187
+ },
188
+ "document": {
189
+ "append_only": false,
190
+ "canonical_path": "documents/<id>.md",
191
+ "family": "record",
192
+ "portability": "tenant_private",
193
+ "projection_strategy": "none",
194
+ "required_fields": [
195
+ "type"
196
+ ]
197
+ },
198
+ "domain": {
199
+ "append_only": false,
200
+ "canonical_path": "domains/<domain>.md",
20
201
  "family": "resource",
21
- "canonical_path": "telephony/PHONE_SYSTEM.md",
202
+ "notes": "The seller's domain is NEVER transferred. In template/sale the bundle declares 'this business needs a domain'; the buyer binds their own at provision (\u00a716).",
203
+ "portability": "resource_bound",
204
+ "required_fields": [
205
+ "type",
206
+ "domain_name",
207
+ "registrar",
208
+ "status",
209
+ "payment_status"
210
+ ],
211
+ "resource": {
212
+ "binds": [
213
+ "domain_name",
214
+ "registrar"
215
+ ],
216
+ "kind": "domain",
217
+ "provision_relation": "owns_domain"
218
+ }
219
+ },
220
+ "email_domain": {
221
+ "append_only": false,
222
+ "canonical_path": "communications/email/domains/<domain>.md",
223
+ "family": "record",
224
+ "portability": "tenant_private",
225
+ "projection_strategy": "vfs_event_router",
226
+ "required_fields": [
227
+ "domain",
228
+ "status",
229
+ "type"
230
+ ]
231
+ },
232
+ "email_mailbox": {
233
+ "append_only": false,
234
+ "canonical_path": "communications/email/mailboxes/<email>.md",
235
+ "family": "record",
236
+ "portability": "tenant_private",
237
+ "projection_strategy": "vfs_event_router",
238
+ "required_fields": [
239
+ "active",
240
+ "domain_id",
241
+ "email",
242
+ "quota",
243
+ "type"
244
+ ]
245
+ },
246
+ "event": {
247
+ "append_only": false,
248
+ "canonical_path": "events/<slug>.md",
249
+ "family": "record",
250
+ "portability": "tenant_private",
251
+ "projection_strategy": "vfs_event_router",
252
+ "required_fields": [
253
+ "event_type",
254
+ "type"
255
+ ]
256
+ },
257
+ "event_artist": {
258
+ "append_only": false,
259
+ "canonical_path": "events/<event-slug>/artists/<artist-slug>.md",
260
+ "family": "record",
261
+ "portability": "tenant_private",
262
+ "projection_strategy": "vfs_event_router",
263
+ "required_fields": [
264
+ "artist_name",
265
+ "event_slug",
266
+ "status",
267
+ "type"
268
+ ]
269
+ },
270
+ "event_asset": {
271
+ "append_only": false,
272
+ "canonical_path": "events/<event-slug>/assets/<slug>.md",
273
+ "family": "record",
274
+ "portability": "tenant_private",
275
+ "projection_strategy": "vfs_event_router",
276
+ "required_fields": [
277
+ "asset_category",
278
+ "file_name",
279
+ "file_type",
280
+ "file_url",
281
+ "type"
282
+ ]
283
+ },
284
+ "event_faq": {
285
+ "append_only": false,
286
+ "canonical_path": "event_faqs/<slug>.md",
287
+ "family": "record",
288
+ "portability": "tenant_private",
289
+ "projection_strategy": "replace",
290
+ "required_fields": [
291
+ "answer",
292
+ "event_id",
293
+ "question",
294
+ "type"
295
+ ]
296
+ },
297
+ "event_inventory": {
22
298
  "append_only": false,
299
+ "canonical_path": "events/<event-slug>/inventory/<booking-id>.md",
300
+ "family": "record",
301
+ "portability": "tenant_private",
302
+ "projection_strategy": "vfs_event_router",
303
+ "required_fields": [
304
+ "event_slug",
305
+ "item_name",
306
+ "status",
307
+ "type"
308
+ ]
309
+ },
310
+ "event_marketing_campaign": {
311
+ "append_only": false,
312
+ "canonical_path": "events/<event_slug>/marketing/<slug>.md",
313
+ "family": "record",
314
+ "portability": "tenant_private",
315
+ "projection_strategy": "upsert_on_id",
316
+ "required_fields": [
317
+ "campaign_name",
318
+ "channel",
319
+ "status",
320
+ "type"
321
+ ]
322
+ },
323
+ "event_message": {
324
+ "append_only": false,
325
+ "canonical_path": "event_messages/<slug>.md",
326
+ "family": "record",
327
+ "portability": "tenant_private",
328
+ "projection_strategy": "replace",
329
+ "required_fields": [
330
+ "author_name",
331
+ "event_id",
332
+ "type"
333
+ ]
334
+ },
335
+ "event_sponsor": {
336
+ "append_only": false,
337
+ "canonical_path": "events/<event-slug>/sponsors/<sponsor-slug>.md",
338
+ "family": "record",
339
+ "portability": "tenant_private",
340
+ "projection_strategy": "vfs_event_router",
341
+ "required_fields": [
342
+ "event_slug",
343
+ "name",
344
+ "status",
345
+ "type"
346
+ ]
347
+ },
348
+ "extension": {
349
+ "append_only": false,
350
+ "canonical_path": "extensions/<id>.md",
351
+ "family": "capability",
352
+ "notes": "Which extensions a workspace has installed is part of the business model and ships in a sale.",
353
+ "portability": "structural",
354
+ "required_fields": [
355
+ "type",
356
+ "extension",
357
+ "display_name",
358
+ "status"
359
+ ]
360
+ },
361
+ "favorite": {
362
+ "append_only": false,
363
+ "canonical_path": "favorites/<id>.md",
364
+ "family": "record",
365
+ "portability": "tenant_private",
366
+ "required_fields": [
367
+ "id",
368
+ "type"
369
+ ]
370
+ },
371
+ "file_asset": {
372
+ "append_only": false,
373
+ "canonical_path": "assets/<id>.md",
374
+ "family": "asset",
375
+ "notes": "Festech's uploaded-file record: points at an object via `file_upload`/`filename`. Distinct from core `ssss:asset` (a text-encoded payload) and from `media_asset` (brand assets under media/assets/).",
23
376
  "portability": "resource_bound",
24
- "resource": { "kind": "phone", "binds": ["phone_number", "provider"], "provision_relation": "routes_calls_to" },
25
- "required_fields": ["type", "phone_number", "provider", "status"]
377
+ "required_fields": [
378
+ "type",
379
+ "slug",
380
+ "asset_id"
381
+ ],
382
+ "resource": {
383
+ "binds": [
384
+ "file_upload"
385
+ ],
386
+ "kind": "storage",
387
+ "provision_relation": "stores_asset"
388
+ }
389
+ },
390
+ "grant_application": {
391
+ "append_only": false,
392
+ "canonical_path": "grants/<id>.md",
393
+ "family": "record",
394
+ "portability": "tenant_private",
395
+ "projection_strategy": "none",
396
+ "required_fields": [
397
+ "funder_name",
398
+ "grant_title",
399
+ "status",
400
+ "type"
401
+ ]
26
402
  },
27
403
  "integration_connection": {
28
- "family": "resource",
29
- "canonical_path": "integrations/<provider>.md",
30
404
  "append_only": false,
405
+ "canonical_path": "integrations/<provider>.md",
406
+ "family": "resource",
407
+ "notes": "Carries credentials/tokens to a third-party provider \u2014 the seller's connection value MUST be stripped; the buyer supplies their own at provision.",
31
408
  "portability": "resource_bound",
32
- "resource": { "kind": "api_connection", "binds": ["provider"], "provision_relation": "connects_to" },
33
- "required_fields": ["type", "provider", "status", "capabilities", "verified_at"],
34
- "notes": "Carries credentials/tokens to a third-party provider — the seller's connection value MUST be stripped; the buyer supplies their own at provision."
409
+ "required_fields": [
410
+ "type",
411
+ "provider",
412
+ "status",
413
+ "capabilities",
414
+ "verified_at"
415
+ ],
416
+ "resource": {
417
+ "binds": [
418
+ "provider"
419
+ ],
420
+ "kind": "api_connection",
421
+ "provision_relation": "connects_to"
422
+ }
35
423
  },
36
- "legal_policy": {
37
- "family": "governance",
38
- "canonical_path": "contracts/<id>.md",
424
+ "inventory_category": {
39
425
  "append_only": false,
40
- "portability": "structural",
41
- "required_fields": ["type", "title", "version", "effective_date", "policy_type"]
426
+ "canonical_path": "inventory_categorys/<id>.md",
427
+ "family": "record",
428
+ "portability": "tenant_private",
429
+ "required_fields": [
430
+ "id",
431
+ "type"
432
+ ]
42
433
  },
43
- "extension": {
44
- "family": "capability",
45
- "canonical_path": "extensions/<id>.md",
434
+ "inventory_checkout": {
435
+ "append_only": false,
436
+ "canonical_path": "inventory_checkouts/<id>.md",
437
+ "family": "record",
438
+ "portability": "tenant_private",
439
+ "required_fields": [
440
+ "id",
441
+ "type"
442
+ ]
443
+ },
444
+ "inventory_condition": {
445
+ "append_only": false,
446
+ "canonical_path": "inventory_conditions/<id>.md",
447
+ "family": "record",
448
+ "portability": "tenant_private",
449
+ "required_fields": [
450
+ "id",
451
+ "type"
452
+ ]
453
+ },
454
+ "inventory_item": {
455
+ "append_only": false,
456
+ "canonical_path": "inventory/<slug>.md",
457
+ "family": "record",
458
+ "portability": "tenant_private",
459
+ "projection_strategy": "replace",
460
+ "required_fields": [
461
+ "name",
462
+ "slug",
463
+ "status",
464
+ "type"
465
+ ]
466
+ },
467
+ "inventory_location": {
468
+ "append_only": false,
469
+ "canonical_path": "inventory_locations/<id>.md",
470
+ "family": "record",
471
+ "portability": "tenant_private",
472
+ "required_fields": [
473
+ "id",
474
+ "type"
475
+ ]
476
+ },
477
+ "inventory_review": {
478
+ "append_only": true,
479
+ "canonical_path": "inventory/reviews/<id>.md",
480
+ "family": "record",
481
+ "portability": "tenant_private",
482
+ "projection_strategy": "vfs_event_router",
483
+ "required_fields": [
484
+ "item_id",
485
+ "rating",
486
+ "reviewer_name",
487
+ "type"
488
+ ]
489
+ },
490
+ "inventory_stock_level": {
491
+ "append_only": false,
492
+ "canonical_path": "inventory/stock_levels/<id>.md",
493
+ "family": "record",
494
+ "portability": "tenant_private",
495
+ "projection_strategy": "vfs_event_router",
496
+ "required_fields": [
497
+ "quantity",
498
+ "type",
499
+ "variant_id"
500
+ ]
501
+ },
502
+ "inventory_transaction": {
503
+ "append_only": true,
504
+ "canonical_path": "inventory/transactions/<id>.md",
505
+ "family": "record",
506
+ "portability": "tenant_private",
507
+ "projection_strategy": "vfs_event_router",
508
+ "required_fields": [
509
+ "quantity",
510
+ "type",
511
+ "variant_id"
512
+ ]
513
+ },
514
+ "inventory_variant": {
515
+ "append_only": false,
516
+ "canonical_path": "inventory/variants/<id>.md",
517
+ "family": "record",
518
+ "portability": "tenant_private",
519
+ "projection_strategy": "vfs_event_router",
520
+ "required_fields": [
521
+ "item_id",
522
+ "name",
523
+ "sku",
524
+ "type"
525
+ ]
526
+ },
527
+ "invoice": {
528
+ "append_only": false,
529
+ "canonical_path": "finance/invoices/<id>.md",
530
+ "family": "record",
531
+ "portability": "tenant_private",
532
+ "projection_strategy": "replace",
533
+ "required_fields": [
534
+ "status",
535
+ "total",
536
+ "type"
537
+ ]
538
+ },
539
+ "invoice_item": {
46
540
  "append_only": false,
541
+ "canonical_path": "finance/invoices/<invoice_id>/items/<id>.md",
542
+ "family": "record",
543
+ "portability": "tenant_private",
544
+ "projection_strategy": "none",
545
+ "required_fields": [
546
+ "amount_cents",
547
+ "description",
548
+ "id",
549
+ "invoice_id",
550
+ "type"
551
+ ]
552
+ },
553
+ "ip-contributor": {
554
+ "append_only": false,
555
+ "canonical_path": "ip-contributors/<id>.md",
556
+ "family": "record",
557
+ "portability": "tenant_private",
558
+ "projection_strategy": "replace",
559
+ "required_fields": [
560
+ "contact_id",
561
+ "share_percentage",
562
+ "type",
563
+ "work_id"
564
+ ]
565
+ },
566
+ "ip-work": {
567
+ "append_only": false,
568
+ "canonical_path": "ip-works/<id>.md",
569
+ "family": "record",
570
+ "portability": "tenant_private",
571
+ "projection_strategy": "replace",
572
+ "required_fields": [
573
+ "owner_contact_id",
574
+ "type",
575
+ "work_type"
576
+ ]
577
+ },
578
+ "ip_usage_log": {
579
+ "append_only": false,
580
+ "canonical_path": "ip_usage_logs/<id>.md",
581
+ "family": "record",
582
+ "portability": "tenant_private",
583
+ "required_fields": [
584
+ "id",
585
+ "type"
586
+ ]
587
+ },
588
+ "knowledge": {
589
+ "append_only": false,
590
+ "canonical_path": "knowledge/<slug>.md",
591
+ "family": "knowledge",
592
+ "notes": "The curated knowledge base is a core sellable asset of the business model.",
47
593
  "portability": "structural",
48
- "required_fields": ["type", "extension", "display_name", "status"],
49
- "notes": "Which extensions a workspace has installed is part of the business model and ships in a sale."
594
+ "required_fields": [
595
+ "type",
596
+ "name",
597
+ "slug"
598
+ ]
50
599
  },
51
- "media_asset": {
52
- "family": "asset",
53
- "canonical_path": "media/assets/<asset-id>.md",
600
+ "knowledge_source": {
54
601
  "append_only": false,
602
+ "canonical_path": "knowledge/<knowledge-slug>/sources/<slug>.md",
603
+ "family": "knowledge",
604
+ "notes": "A source backing a structural knowledge base. A source ingesting private customer documents SHOULD override with x_portability: tenant_private.",
55
605
  "portability": "structural",
56
- "required_fields": ["type", "asset_id", "asset_type", "url"],
57
- "notes": "Brand/marketing assets are structural. An asset holding customer-uploaded content SHOULD override with x_portability: tenant_private."
606
+ "required_fields": [
607
+ "type",
608
+ "title",
609
+ "knowledge_base_slug"
610
+ ]
58
611
  },
59
612
  "language_convention": {
60
- "family": "localization",
61
- "canonical_path": "languages/<locale>/CONVENTION.md",
62
613
  "append_only": false,
614
+ "canonical_path": "languages/<locale>/CONVENTION.md",
615
+ "family": "localization",
63
616
  "portability": "structural",
64
- "required_fields": ["type", "locale", "language_name", "keys"]
617
+ "required_fields": [
618
+ "type",
619
+ "locale",
620
+ "language_name",
621
+ "keys"
622
+ ]
65
623
  },
66
- "knowledge": {
67
- "family": "knowledge",
68
- "canonical_path": "knowledge/<slug>.md",
624
+ "legal_policy": {
69
625
  "append_only": false,
626
+ "canonical_path": "contracts/<id>.md",
627
+ "family": "governance",
70
628
  "portability": "structural",
71
- "required_fields": ["type", "name", "slug"],
72
- "notes": "The curated knowledge base is a core sellable asset of the business model."
629
+ "required_fields": [
630
+ "type",
631
+ "title",
632
+ "version",
633
+ "effective_date",
634
+ "policy_type"
635
+ ]
73
636
  },
74
- "knowledge_source": {
75
- "family": "knowledge",
76
- "canonical_path": "knowledge/<knowledge-slug>/sources/<slug>.md",
637
+ "lost_found_item": {
638
+ "append_only": false,
639
+ "canonical_path": "lost_found_items/<slug>.md",
640
+ "family": "record",
641
+ "portability": "tenant_private",
642
+ "projection_strategy": "replace",
643
+ "required_fields": [
644
+ "category",
645
+ "description",
646
+ "type"
647
+ ]
648
+ },
649
+ "media_asset": {
77
650
  "append_only": false,
651
+ "canonical_path": "media/assets/<asset-id>.md",
652
+ "family": "asset",
653
+ "notes": "Brand/marketing assets are structural. An asset holding customer-uploaded content SHOULD override with x_portability: tenant_private.",
78
654
  "portability": "structural",
79
- "required_fields": ["type", "title", "knowledge_base_slug"],
80
- "notes": "A source backing a structural knowledge base. A source ingesting private customer documents SHOULD override with x_portability: tenant_private."
655
+ "required_fields": [
656
+ "type",
657
+ "asset_id",
658
+ "asset_type",
659
+ "url"
660
+ ]
661
+ },
662
+ "meeting": {
663
+ "append_only": false,
664
+ "canonical_path": "meetings/<slug>.md",
665
+ "family": "record",
666
+ "portability": "tenant_private",
667
+ "projection_strategy": "vfs_event_router",
668
+ "required_fields": [
669
+ "host_id",
670
+ "status",
671
+ "title",
672
+ "type"
673
+ ]
674
+ },
675
+ "member": {
676
+ "append_only": false,
677
+ "canonical_path": "members/<id>.md",
678
+ "family": "record",
679
+ "portability": "tenant_private",
680
+ "projection_strategy": "none",
681
+ "required_fields": [
682
+ "type"
683
+ ]
684
+ },
685
+ "message": {
686
+ "append_only": false,
687
+ "canonical_path": "message/<slug>.md",
688
+ "family": "record",
689
+ "portability": "tenant_private",
690
+ "required_fields": [
691
+ "type"
692
+ ]
693
+ },
694
+ "model-preferences": {
695
+ "append_only": false,
696
+ "canonical_path": "models/preferences/MODEL-PREFERENCES.md",
697
+ "family": "actor",
698
+ "portability": "tenant_private",
699
+ "required_fields": [
700
+ "type",
701
+ "user_id",
702
+ "workspace_id"
703
+ ]
81
704
  },
82
705
  "onboarding_state": {
83
- "family": "runtime",
706
+ "append_only": false,
84
707
  "canonical_path": "onboarding_state.md",
708
+ "family": "runtime",
709
+ "portability": "tenant_private",
710
+ "required_fields": [
711
+ "type",
712
+ "state_version",
713
+ "collective_id",
714
+ "completed_steps",
715
+ "deferred_steps",
716
+ "dismissed"
717
+ ]
718
+ },
719
+ "order": {
85
720
  "append_only": false,
721
+ "canonical_path": "order/<slug>.md",
722
+ "family": "record",
86
723
  "portability": "tenant_private",
87
- "required_fields": ["type", "state_version", "collective_id", "completed_steps", "deferred_steps", "dismissed"]
724
+ "required_fields": [
725
+ "type"
726
+ ]
88
727
  },
89
- "profile": {
90
- "family": "actor",
91
- "canonical_path": "PROFILE.md",
728
+ "page_revision": {
92
729
  "append_only": false,
730
+ "canonical_path": "page_revisions/<id>.md",
731
+ "family": "record",
93
732
  "portability": "tenant_private",
94
- "required_fields": ["type", "user_id", "locale"]
733
+ "required_fields": [
734
+ "id",
735
+ "type"
736
+ ]
95
737
  },
96
738
  "personalization": {
97
- "family": "actor",
98
- "canonical_path": "PERSONALIZATION.md",
99
739
  "append_only": false,
740
+ "canonical_path": "PERSONALIZATION.md",
741
+ "family": "actor",
100
742
  "portability": "tenant_private",
101
- "required_fields": ["type"]
743
+ "required_fields": [
744
+ "type"
745
+ ]
102
746
  },
103
- "model-preferences": {
747
+ "phone_number": {
748
+ "append_only": false,
749
+ "canonical_path": "telephony/PHONE_SYSTEM.md",
750
+ "family": "resource",
751
+ "portability": "resource_bound",
752
+ "required_fields": [
753
+ "type",
754
+ "phone_number",
755
+ "provider",
756
+ "status"
757
+ ],
758
+ "resource": {
759
+ "binds": [
760
+ "phone_number",
761
+ "provider"
762
+ ],
763
+ "kind": "phone",
764
+ "provision_relation": "routes_calls_to"
765
+ }
766
+ },
767
+ "profile": {
768
+ "append_only": false,
769
+ "canonical_path": "PROFILE.md",
104
770
  "family": "actor",
105
- "canonical_path": "models/preferences/MODEL-PREFERENCES.md",
771
+ "portability": "tenant_private",
772
+ "required_fields": [
773
+ "type",
774
+ "user_id",
775
+ "locale"
776
+ ]
777
+ },
778
+ "promo": {
106
779
  "append_only": false,
780
+ "canonical_path": "promos/<id>.md",
781
+ "family": "record",
107
782
  "portability": "tenant_private",
108
- "required_fields": ["type", "user_id", "workspace_id"]
783
+ "projection_strategy": "replace",
784
+ "required_fields": [
785
+ "code",
786
+ "discount_type",
787
+ "discount_value",
788
+ "type"
789
+ ]
109
790
  },
110
- "sharing_group": {
111
- "family": "actor",
112
- "canonical_path": "sharing-groups/<id>.md",
791
+ "recurring-invoice": {
792
+ "append_only": false,
793
+ "canonical_path": "recurring-invoices/<id>.md",
794
+ "family": "record",
795
+ "portability": "tenant_private",
796
+ "projection_strategy": "none",
797
+ "required_fields": [
798
+ "type"
799
+ ]
800
+ },
801
+ "resale_listing": {
802
+ "append_only": false,
803
+ "canonical_path": "resale/<id>.md",
804
+ "family": "record",
805
+ "portability": "tenant_private",
806
+ "projection_strategy": "replace",
807
+ "required_fields": [
808
+ "event_id",
809
+ "price_cents",
810
+ "seller_email",
811
+ "status",
812
+ "ticket_id",
813
+ "ticket_type_id",
814
+ "type"
815
+ ]
816
+ },
817
+ "rights-license": {
818
+ "append_only": false,
819
+ "canonical_path": "rights-licenses/<id>.md",
820
+ "family": "record",
821
+ "portability": "tenant_private",
822
+ "projection_strategy": "replace",
823
+ "required_fields": [
824
+ "license_type",
825
+ "licensee_contact_id",
826
+ "type",
827
+ "work_id"
828
+ ]
829
+ },
830
+ "rights_imported_royalty": {
831
+ "append_only": false,
832
+ "canonical_path": "rights_imported_royaltys/<id>.md",
833
+ "family": "record",
834
+ "portability": "tenant_private",
835
+ "required_fields": [
836
+ "id",
837
+ "type"
838
+ ]
839
+ },
840
+ "rights_royalty_import": {
113
841
  "append_only": false,
842
+ "canonical_path": "rights_royalty_imports/<id>.md",
843
+ "family": "record",
114
844
  "portability": "tenant_private",
115
- "required_fields": ["type", "name", "color", "owner_user_id"]
845
+ "required_fields": [
846
+ "id",
847
+ "type"
848
+ ]
849
+ },
850
+ "rights_royalty_payout": {
851
+ "append_only": false,
852
+ "canonical_path": "royalty-payouts/<id>.md",
853
+ "family": "record",
854
+ "portability": "tenant_private",
855
+ "projection_strategy": "none",
856
+ "required_fields": [
857
+ "type"
858
+ ]
859
+ },
860
+ "rights_royalty_rule": {
861
+ "append_only": false,
862
+ "canonical_path": "royalty-rules/<id>.md",
863
+ "family": "record",
864
+ "portability": "tenant_private",
865
+ "projection_strategy": "none",
866
+ "required_fields": [
867
+ "type"
868
+ ]
869
+ },
870
+ "royalty-payout": {
871
+ "append_only": false,
872
+ "canonical_path": "royalty-payouts/<id>.md",
873
+ "family": "record",
874
+ "portability": "tenant_private",
875
+ "projection_strategy": "replace",
876
+ "required_fields": [
877
+ "amount_cents",
878
+ "statement_id",
879
+ "type"
880
+ ]
881
+ },
882
+ "royalty-rule": {
883
+ "append_only": false,
884
+ "canonical_path": "royalty-rules/<id>.md",
885
+ "family": "record",
886
+ "portability": "tenant_private",
887
+ "projection_strategy": "replace",
888
+ "required_fields": [
889
+ "contributor_contact_id",
890
+ "rate_percentage",
891
+ "royalty_type",
892
+ "type",
893
+ "work_id"
894
+ ]
116
895
  },
117
896
  "settings": {
118
- "family": "config",
119
- "canonical_path": "SETTINGS.md",
120
897
  "append_only": false,
898
+ "canonical_path": "SETTINGS.md",
899
+ "family": "config",
900
+ "notes": "Workspace settings configure the business model (structural). Account-scoped settings SHOULD override with x_portability: tenant_private.",
121
901
  "portability": "structural",
122
- "required_fields": ["type"],
123
- "notes": "Workspace settings configure the business model (structural). Account-scoped settings SHOULD override with x_portability: tenant_private."
902
+ "required_fields": [
903
+ "type"
904
+ ]
905
+ },
906
+ "sharing_group": {
907
+ "append_only": false,
908
+ "canonical_path": "sharing-groups/<id>.md",
909
+ "family": "actor",
910
+ "portability": "tenant_private",
911
+ "required_fields": [
912
+ "type",
913
+ "name",
914
+ "color",
915
+ "owner_user_id"
916
+ ]
917
+ },
918
+ "sms_message": {
919
+ "append_only": true,
920
+ "canonical_path": "sms/messages/<id>.md",
921
+ "family": "record",
922
+ "portability": "tenant_private",
923
+ "projection_strategy": "append_only_log",
924
+ "required_fields": [
925
+ "direction",
926
+ "phone_number",
927
+ "type"
928
+ ]
929
+ },
930
+ "social-post": {
931
+ "append_only": false,
932
+ "canonical_path": "social-posts/<id>.md",
933
+ "family": "record",
934
+ "portability": "tenant_private",
935
+ "projection_strategy": "replace",
936
+ "required_fields": [
937
+ "body",
938
+ "type"
939
+ ]
940
+ },
941
+ "sponsorship-benefit": {
942
+ "append_only": false,
943
+ "canonical_path": "crm/benefits/<id>.md",
944
+ "family": "record",
945
+ "portability": "tenant_private",
946
+ "projection_strategy": "vfs_event_router",
947
+ "required_fields": [
948
+ "name",
949
+ "tier_id",
950
+ "type"
951
+ ]
952
+ },
953
+ "sponsorship-tier": {
954
+ "append_only": false,
955
+ "canonical_path": "crm/tiers/<id>.md",
956
+ "family": "record",
957
+ "portability": "tenant_private",
958
+ "projection_strategy": "vfs_event_router",
959
+ "required_fields": [
960
+ "name",
961
+ "type"
962
+ ]
963
+ },
964
+ "storefront": {
965
+ "append_only": false,
966
+ "canonical_path": "storefronts/<slug>.md",
967
+ "family": "record",
968
+ "portability": "tenant_private",
969
+ "projection_strategy": "vfs_event_router",
970
+ "required_fields": [
971
+ "owner_id",
972
+ "owner_type",
973
+ "slug",
974
+ "type"
975
+ ]
976
+ },
977
+ "stream": {
978
+ "append_only": false,
979
+ "canonical_path": "streams/<slug>.md",
980
+ "family": "record",
981
+ "portability": "tenant_private",
982
+ "projection_strategy": "none",
983
+ "required_fields": [
984
+ "type"
985
+ ]
986
+ },
987
+ "survey": {
988
+ "append_only": false,
989
+ "canonical_path": "surveys/<id>.md",
990
+ "family": "record",
991
+ "portability": "tenant_private",
992
+ "projection_strategy": "replace",
993
+ "required_fields": [
994
+ "event_id",
995
+ "question",
996
+ "type"
997
+ ]
124
998
  },
125
999
  "system_settings": {
126
- "family": "config",
1000
+ "append_only": false,
127
1001
  "canonical_path": "SYSTEM_SETTINGS.md",
1002
+ "family": "config",
1003
+ "notes": "Host/operator-level configuration; never transfers to a buyer.",
1004
+ "portability": "tenant_private",
1005
+ "required_fields": [
1006
+ "type"
1007
+ ]
1008
+ },
1009
+ "telecom_10dlc_campaign": {
1010
+ "append_only": false,
1011
+ "canonical_path": "telephony/10dlc/<id>.md",
1012
+ "family": "record",
1013
+ "portability": "tenant_private",
1014
+ "projection_strategy": "vfs_event_router",
1015
+ "required_fields": [
1016
+ "campaign_id",
1017
+ "status",
1018
+ "type"
1019
+ ]
1020
+ },
1021
+ "telecom_e911_address": {
1022
+ "append_only": false,
1023
+ "canonical_path": "telephony/e911/<id>.md",
1024
+ "family": "record",
1025
+ "portability": "tenant_private",
1026
+ "projection_strategy": "vfs_event_router",
1027
+ "required_fields": [
1028
+ "address_1",
1029
+ "city",
1030
+ "state",
1031
+ "type",
1032
+ "zip"
1033
+ ]
1034
+ },
1035
+ "telecom_number": {
1036
+ "append_only": false,
1037
+ "canonical_path": "telephony/numbers/<id>.md",
1038
+ "family": "record",
1039
+ "portability": "tenant_private",
1040
+ "projection_strategy": "vfs_event_router",
1041
+ "required_fields": [
1042
+ "phone_number",
1043
+ "provider",
1044
+ "status",
1045
+ "type"
1046
+ ]
1047
+ },
1048
+ "telecom_route": {
1049
+ "append_only": false,
1050
+ "canonical_path": "telephony/routes/<id>.md",
1051
+ "family": "record",
1052
+ "portability": "tenant_private",
1053
+ "projection_strategy": "vfs_event_router",
1054
+ "required_fields": [
1055
+ "destination_type",
1056
+ "number_id",
1057
+ "type"
1058
+ ]
1059
+ },
1060
+ "telecom_sms_quota": {
1061
+ "append_only": false,
1062
+ "canonical_path": "telephony/sms_quota/<id>.md",
1063
+ "family": "record",
1064
+ "portability": "tenant_private",
1065
+ "projection_strategy": "vfs_event_router",
1066
+ "required_fields": [
1067
+ "balance",
1068
+ "credits_used",
1069
+ "month",
1070
+ "type"
1071
+ ]
1072
+ },
1073
+ "ticket_transfer": {
128
1074
  "append_only": false,
1075
+ "canonical_path": "transfers/<id>.md",
1076
+ "family": "record",
129
1077
  "portability": "tenant_private",
130
- "required_fields": ["type"],
131
- "notes": "Host/operator-level configuration; never transfers to a buyer."
1078
+ "projection_strategy": "none",
1079
+ "required_fields": [
1080
+ "from_order_id",
1081
+ "from_ticket_id",
1082
+ "recipient_email",
1083
+ "to_order_id",
1084
+ "to_ticket_id",
1085
+ "type"
1086
+ ]
1087
+ },
1088
+ "venue": {
1089
+ "append_only": false,
1090
+ "canonical_path": "venues/<slug>.md",
1091
+ "family": "record",
1092
+ "portability": "tenant_private",
1093
+ "projection_strategy": "replace",
1094
+ "required_fields": [
1095
+ "type"
1096
+ ]
1097
+ },
1098
+ "voucher": {
1099
+ "append_only": false,
1100
+ "canonical_path": "vouchers/<slug>.md",
1101
+ "family": "record",
1102
+ "portability": "tenant_private",
1103
+ "projection_strategy": "replace",
1104
+ "required_fields": [
1105
+ "code",
1106
+ "label",
1107
+ "type"
1108
+ ]
132
1109
  }
133
- }
134
- }
1110
+ },
1111
+ "extends": "core",
1112
+ "registry": "festech",
1113
+ "spec_version": "0.3",
1114
+ "version": "2.0.0"
1115
+ }