@synap-core/workspace-templates 0.7.2 → 0.7.3

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 (44) hide show
  1. package/dist/index.d.ts +207 -8
  2. package/dist/index.js +2148 -1480
  3. package/dist/index.js.map +1 -1
  4. package/package.json +1 -1
  5. package/src/agent-fleet.yaml +666 -108
  6. package/src/blockchain-ecosystem.yaml +1 -0
  7. package/src/brand-library.yaml +127 -12
  8. package/src/builder.yaml +116 -12
  9. package/src/business-developer.yaml +102 -18
  10. package/src/catalog.ts +13 -3
  11. package/src/communication.yaml +23 -453
  12. package/src/composition-graph.test.ts +26 -0
  13. package/src/content-os.yaml +103 -10
  14. package/src/content-studio.yaml +1 -0
  15. package/src/crm.yaml +1 -0
  16. package/src/define.ts +8 -8
  17. package/src/dev-dashboard.yaml +43 -9
  18. package/src/domains.test.ts +117 -0
  19. package/src/domains.ts +102 -0
  20. package/src/ecosystem.yaml +21 -4
  21. package/src/enterprise-os.yaml +1 -0
  22. package/src/finance.yaml +46 -5
  23. package/src/foundation.yaml +13 -1
  24. package/src/grants.yaml +1 -0
  25. package/src/hr.yaml +61 -8
  26. package/src/index.ts +29 -0
  27. package/src/internal-runbook.yaml +36 -5
  28. package/src/legal.yaml +97 -12
  29. package/src/life-os.yaml +188 -27
  30. package/src/marketing.yaml +15 -2
  31. package/src/meetings-knowledge.yaml +7 -1
  32. package/src/operations.yaml +347 -0
  33. package/src/outreach-comms.yaml +6 -1
  34. package/src/project-management.yaml +840 -111
  35. package/src/research-base.yaml +516 -0
  36. package/src/research-decision.yaml +158 -0
  37. package/src/shared-role-ssot.test.ts +268 -0
  38. package/src/social.yaml +105 -37
  39. package/src/templates.ts +4548 -4304
  40. package/src/the-arch.yaml +1 -0
  41. package/src/types.ts +9 -0
  42. package/src/validate.test.ts +81 -0
  43. package/src/validate.ts +561 -0
  44. package/src/personal.yaml +0 -177
package/dist/index.js CHANGED
@@ -11,6 +11,7 @@ var DATA = {
11
11
  "agent-fleet": {
12
12
  "meta": {
13
13
  "slug": "agent-fleet",
14
+ "domain": "build",
14
15
  "name": "Agent Fleet",
15
16
  "description": "Manage your fleet of AI agents \u2014 the agents, their providers, skills, and the work they do.",
16
17
  "icon": "bot",
@@ -2738,6 +2739,7 @@ var DATA = {
2738
2739
  "blockchain-ecosystem": {
2739
2740
  "meta": {
2740
2741
  "slug": "blockchain-ecosystem",
2742
+ "domain": "strategy",
2741
2743
  "name": "Blockchain Ecosystem",
2742
2744
  "description": "Web3 market actors \u2014 market-makers, auditors, dev shops, KOLs \u2014 and how they connect. Overlays the Ecosystem workspace.",
2743
2745
  "icon": "boxes",
@@ -3210,6 +3212,7 @@ var DATA = {
3210
3212
  "brand-library": {
3211
3213
  "meta": {
3212
3214
  "slug": "brand-library",
3215
+ "domain": "content",
3213
3216
  "name": "Brand Library",
3214
3217
  "description": "Reusable source of truth for brand identity, colors, typography, assets, tokens, templates, and generation rules.",
3215
3218
  "icon": "palette",
@@ -4348,6 +4351,7 @@ var DATA = {
4348
4351
  "builder-workspace": {
4349
4352
  "meta": {
4350
4353
  "slug": "builder-workspace",
4354
+ "domain": "build",
4351
4355
  "name": "Builder",
4352
4356
  "description": "Builder workspace \u2014 apps, features, services, packages, environments, deployments, recipes, decisions, incidents, plus delegated agent tasks/projects/skills/providers.",
4353
4357
  "icon": "wrench",
@@ -6761,6 +6765,7 @@ var DATA = {
6761
6765
  "business-developer": {
6762
6766
  "meta": {
6763
6767
  "slug": "business-developer",
6768
+ "domain": "revenue",
6764
6769
  "name": "Business Developer",
6765
6770
  "description": "A lead-first sales motion for a CRM workspace: qualify leads, work commercial proposals, and hand won clients to the next system.",
6766
6771
  "icon": "target",
@@ -7793,6 +7798,7 @@ var DATA = {
7793
7798
  "communication": {
7794
7799
  "meta": {
7795
7800
  "slug": "communication",
7801
+ "domain": "content",
7796
7802
  "name": "Communication",
7797
7803
  "description": "Owns brand identity, voice, and narrative/positioning \u2014 the on-brand source of truth every downstream domain (Content, Marketing, Social) reads from so everything ships on-brand and on-message.",
7798
7804
  "icon": "messages-square",
@@ -7806,931 +7812,132 @@ var DATA = {
7806
7812
  ],
7807
7813
  "isPublic": true
7808
7814
  },
7815
+ "dependencies": [
7816
+ {
7817
+ "slug": "brand-library",
7818
+ "kind": "workspace",
7819
+ "relation": "compose",
7820
+ "reason": "Layers positioning, narrative, and audience onto your Brand Library."
7821
+ }
7822
+ ],
7809
7823
  "workspace": {
7810
- "name": "Communication",
7811
- "description": "Owns brand identity, voice, and narrative/positioning \u2014 the on-brand source of truth every downstream domain reads from.",
7812
- "subtype": "communication",
7813
- "visibility": "pod_visible",
7824
+ "name": "Brand Library",
7825
+ "description": "The strategic messaging layer \u2014 positioning, narrative, audience, and differentiators \u2014 layered onto your Brand Library.",
7826
+ "subtype": "brand-library",
7814
7827
  "capabilities": [
7815
- "brand.library",
7816
- "brand.identity",
7817
7828
  "brand.voice",
7818
- "brand.assets",
7819
- "brand.templates",
7820
- "brand.components",
7821
7829
  "narrative.positioning"
7822
7830
  ],
7823
7831
  "sourceRoles": {
7824
- "brand": "consumer",
7825
7832
  "narrative": "provider"
7826
7833
  }
7827
7834
  },
7828
7835
  "profiles": [
7829
7836
  {
7830
- "slug": "brand-identity",
7831
- "displayName": "Brand Identity",
7832
- "icon": "fingerprint",
7833
- "color": "amber",
7834
- "description": "Root brand context: positioning, audience, website, voice summary, and generation intent.",
7835
- "semanticSlug": "brand.identity",
7837
+ "slug": "positioning",
7838
+ "displayName": "Positioning",
7839
+ "icon": "crosshair",
7840
+ "color": "cyan",
7841
+ "description": "Market category, who we stand against, and why we win.",
7836
7842
  "properties": [
7837
7843
  {
7838
- "slug": "brand-type",
7839
- "label": "Brand type",
7840
- "valueType": "string",
7841
- "inputType": "select",
7842
- "enumValues": [
7843
- "product-digital",
7844
- "product-physical",
7845
- "agency",
7846
- "personal-brand",
7847
- "nonprofit",
7848
- "institutional",
7849
- "universal"
7850
- ],
7851
- "constraints": {
7852
- "defaultValue": "universal"
7853
- }
7854
- },
7855
- {
7856
- "slug": "brand-status",
7857
- "label": "Status",
7858
- "valueType": "string",
7859
- "inputType": "select",
7860
- "enumValues": [
7861
- "draft",
7862
- "active",
7863
- "archived"
7864
- ],
7865
- "constraints": {
7866
- "defaultValue": "active"
7867
- }
7868
- },
7869
- {
7870
- "slug": "brand-tagline",
7871
- "label": "Tagline",
7872
- "valueType": "string",
7873
- "inputType": "text"
7874
- },
7875
- {
7876
- "slug": "brand-website",
7877
- "label": "Website",
7878
- "valueType": "string",
7879
- "inputType": "url"
7880
- },
7881
- {
7882
- "slug": "brand-industry",
7883
- "label": "Industry",
7844
+ "slug": "category",
7845
+ "label": "Category",
7884
7846
  "valueType": "string",
7885
7847
  "inputType": "text"
7886
7848
  },
7887
7849
  {
7888
- "slug": "brand-positioning",
7889
- "label": "Positioning",
7890
- "valueType": "string",
7891
- "inputType": "textarea"
7892
- },
7893
- {
7894
- "slug": "brand-audience-primary",
7895
- "label": "Primary audience",
7896
- "valueType": "string",
7897
- "inputType": "textarea"
7898
- },
7899
- {
7900
- "slug": "brand-audience-secondary",
7901
- "label": "Secondary audience",
7902
- "valueType": "string",
7903
- "inputType": "textarea"
7904
- },
7905
- {
7906
- "slug": "brand-voice-summary",
7907
- "label": "Voice summary",
7850
+ "slug": "against",
7851
+ "label": "Against",
7908
7852
  "valueType": "string",
7909
7853
  "inputType": "textarea"
7910
7854
  },
7911
7855
  {
7912
- "slug": "brand-notes",
7913
- "label": "Notes",
7856
+ "slug": "because",
7857
+ "label": "Because",
7914
7858
  "valueType": "string",
7915
7859
  "inputType": "textarea"
7916
7860
  }
7917
7861
  ]
7918
7862
  },
7919
7863
  {
7920
- "slug": "brand-color",
7921
- "displayName": "Brand Color",
7922
- "icon": "swatch-book",
7923
- "color": "violet",
7924
- "description": "Approved palette entry with semantic role, usage notes, and print references.",
7925
- "semanticSlug": "brand.color",
7864
+ "slug": "narrative",
7865
+ "displayName": "Narrative",
7866
+ "icon": "book-open",
7867
+ "color": "amber",
7868
+ "description": "The origin -> insight -> mission story arc.",
7926
7869
  "properties": [
7927
7870
  {
7928
- "slug": "color-role",
7929
- "label": "Role",
7871
+ "slug": "arc",
7872
+ "label": "Story arc",
7930
7873
  "valueType": "string",
7931
- "inputType": "select",
7932
- "enumValues": [
7933
- "primary",
7934
- "secondary",
7935
- "accent",
7936
- "background",
7937
- "surface",
7938
- "surface-elevated",
7939
- "text",
7940
- "text-muted",
7941
- "border",
7942
- "success",
7943
- "warning",
7944
- "error",
7945
- "info",
7946
- "neutral",
7947
- "campaign",
7948
- "custom"
7949
- ],
7950
- "constraints": {
7951
- "defaultValue": "custom"
7952
- }
7874
+ "inputType": "textarea"
7953
7875
  },
7954
7876
  {
7955
- "slug": "color-group",
7956
- "label": "Group",
7877
+ "slug": "status",
7878
+ "label": "Status",
7957
7879
  "valueType": "string",
7958
7880
  "inputType": "select",
7959
7881
  "enumValues": [
7960
- "core",
7961
- "extended",
7962
- "semantic",
7963
- "neutral",
7964
- "seasonal",
7965
- "campaign"
7882
+ "draft",
7883
+ "active",
7884
+ "archived"
7966
7885
  ],
7967
7886
  "constraints": {
7968
- "defaultValue": "core"
7887
+ "defaultValue": "active"
7969
7888
  }
7970
- },
7971
- {
7972
- "slug": "color-hex",
7973
- "label": "Hex",
7974
- "valueType": "string",
7975
- "inputType": "color"
7976
- },
7977
- {
7978
- "slug": "color-rgb",
7979
- "label": "RGB",
7980
- "valueType": "string",
7981
- "inputType": "text"
7982
- },
7983
- {
7984
- "slug": "color-cmyk",
7985
- "label": "CMYK",
7986
- "valueType": "string",
7987
- "inputType": "text"
7988
- },
7989
- {
7990
- "slug": "color-pantone",
7991
- "label": "Pantone",
7992
- "valueType": "string",
7993
- "inputType": "text"
7994
- },
7889
+ }
7890
+ ]
7891
+ },
7892
+ {
7893
+ "slug": "audience",
7894
+ "displayName": "Audience",
7895
+ "icon": "users",
7896
+ "color": "blue",
7897
+ "description": "An ideal customer profile \u2014 who we are built for.",
7898
+ "properties": [
7995
7899
  {
7996
- "slug": "color-ral",
7997
- "label": "RAL",
7900
+ "slug": "segment",
7901
+ "label": "Segment",
7998
7902
  "valueType": "string",
7999
7903
  "inputType": "text"
8000
7904
  },
8001
7905
  {
8002
- "slug": "color-token-name",
8003
- "label": "Token name",
7906
+ "slug": "persona",
7907
+ "label": "Persona",
8004
7908
  "valueType": "string",
8005
- "inputType": "text"
7909
+ "inputType": "textarea"
8006
7910
  },
8007
7911
  {
8008
- "slug": "color-usage",
8009
- "label": "Usage note",
7912
+ "slug": "jobs-to-be-done",
7913
+ "label": "Jobs to be done",
8010
7914
  "valueType": "string",
8011
7915
  "inputType": "textarea"
8012
7916
  },
8013
7917
  {
8014
- "slug": "color-status",
8015
- "label": "Status",
8016
- "valueType": "string",
8017
- "inputType": "select",
8018
- "enumValues": [
8019
- "draft",
8020
- "approved",
8021
- "deprecated"
8022
- ],
8023
- "constraints": {
8024
- "defaultValue": "approved"
8025
- }
7918
+ "slug": "traits",
7919
+ "label": "Traits",
7920
+ "valueType": "array",
7921
+ "inputType": "text"
8026
7922
  }
8027
7923
  ]
8028
7924
  },
8029
7925
  {
8030
- "slug": "brand-font",
8031
- "displayName": "Brand Typeface",
8032
- "icon": "type",
8033
- "color": "blue",
8034
- "description": "Typeface with role, family, licensing, import URL, weights, and fallback stack.",
8035
- "semanticSlug": "brand.font",
7926
+ "slug": "differentiator",
7927
+ "displayName": "Differentiator",
7928
+ "icon": "sparkles",
7929
+ "color": "green",
7930
+ "description": "One thing only we do, believe, or refuse.",
8036
7931
  "properties": [
8037
7932
  {
8038
- "slug": "font-role",
8039
- "label": "Role",
7933
+ "slug": "statement",
7934
+ "label": "Statement",
8040
7935
  "valueType": "string",
8041
- "inputType": "select",
8042
- "enumValues": [
8043
- "heading",
8044
- "body",
8045
- "display",
8046
- "mono",
8047
- "accent",
8048
- "ui",
8049
- "caption"
8050
- ],
8051
- "constraints": {
8052
- "defaultValue": "body"
8053
- }
7936
+ "inputType": "textarea"
8054
7937
  },
8055
7938
  {
8056
- "slug": "font-family",
8057
- "label": "Family",
8058
- "valueType": "string",
8059
- "inputType": "text"
8060
- },
8061
- {
8062
- "slug": "font-foundry",
8063
- "label": "Foundry",
8064
- "valueType": "string",
8065
- "inputType": "text"
8066
- },
8067
- {
8068
- "slug": "font-license",
8069
- "label": "License",
8070
- "valueType": "string",
8071
- "inputType": "select",
8072
- "enumValues": [
8073
- "open-source",
8074
- "google-fonts",
8075
- "adobe-fonts",
8076
- "licensed",
8077
- "custom",
8078
- "system"
8079
- ],
8080
- "constraints": {
8081
- "defaultValue": "google-fonts"
8082
- }
8083
- },
8084
- {
8085
- "slug": "font-weights",
8086
- "label": "Weights",
8087
- "valueType": "string",
8088
- "inputType": "text"
8089
- },
8090
- {
8091
- "slug": "font-fallback",
8092
- "label": "Fallback stack",
8093
- "valueType": "string",
8094
- "inputType": "text"
8095
- },
8096
- {
8097
- "slug": "font-url",
8098
- "label": "Import URL",
8099
- "valueType": "string",
8100
- "inputType": "url"
8101
- },
8102
- {
8103
- "slug": "font-document-id",
8104
- "label": "Font document ID",
8105
- "valueType": "string",
8106
- "inputType": "text"
8107
- },
8108
- {
8109
- "slug": "font-status",
8110
- "label": "Status",
8111
- "valueType": "string",
8112
- "inputType": "select",
8113
- "enumValues": [
8114
- "active",
8115
- "draft",
8116
- "deprecated"
8117
- ],
8118
- "constraints": {
8119
- "defaultValue": "active"
8120
- }
8121
- }
8122
- ]
8123
- },
8124
- {
8125
- "slug": "brand-asset",
8126
- "displayName": "Brand Asset",
8127
- "icon": "image",
8128
- "color": "green",
8129
- "description": "Document-backed or URL-backed reusable media: logos, imagery, icons, fonts, video, references, and documents.",
8130
- "semanticSlug": "brand.asset",
8131
- "properties": [
8132
- {
8133
- "slug": "asset-kind",
8134
- "label": "Kind",
8135
- "valueType": "string",
8136
- "inputType": "select",
8137
- "enumValues": [
8138
- "logo",
8139
- "wordmark",
8140
- "symbol",
8141
- "monogram",
8142
- "pattern",
8143
- "texture",
8144
- "icon-set",
8145
- "illustration",
8146
- "photo",
8147
- "video",
8148
- "document",
8149
- "font",
8150
- "3d-model",
8151
- "print-ready",
8152
- "reference",
8153
- "other"
8154
- ]
8155
- },
8156
- {
8157
- "slug": "asset-variant",
8158
- "label": "Variant",
8159
- "valueType": "string",
8160
- "inputType": "select",
8161
- "enumValues": [
8162
- "primary",
8163
- "secondary",
8164
- "horizontal",
8165
- "stacked",
8166
- "mono-dark",
8167
- "mono-light",
8168
- "white",
8169
- "reversed",
8170
- "favicon",
8171
- "social-avatar",
8172
- "og-image",
8173
- "other"
8174
- ]
8175
- },
8176
- {
8177
- "slug": "asset-status",
8178
- "label": "Status",
8179
- "valueType": "string",
8180
- "inputType": "select",
8181
- "enumValues": [
8182
- "draft",
8183
- "approved",
8184
- "deprecated"
8185
- ],
8186
- "constraints": {
8187
- "defaultValue": "approved"
8188
- }
8189
- },
8190
- {
8191
- "slug": "asset-usage",
8192
- "label": "Usage notes",
8193
- "valueType": "string",
8194
- "inputType": "textarea"
8195
- },
8196
- {
8197
- "slug": "asset-tags",
8198
- "label": "Tags",
8199
- "valueType": "string",
8200
- "inputType": "text"
8201
- },
8202
- {
8203
- "slug": "asset-url",
8204
- "label": "External URL",
8205
- "valueType": "string",
8206
- "inputType": "url"
8207
- },
8208
- {
8209
- "slug": "asset-document-id",
8210
- "label": "Document ID",
8211
- "valueType": "string",
8212
- "inputType": "text"
8213
- },
8214
- {
8215
- "slug": "asset-file-id",
8216
- "label": "Legacy file ID",
8217
- "valueType": "string",
8218
- "inputType": "text"
8219
- },
8220
- {
8221
- "slug": "asset-alt-text",
8222
- "label": "Alt text",
8223
- "valueType": "string",
8224
- "inputType": "textarea"
8225
- }
8226
- ]
8227
- },
8228
- {
8229
- "slug": "brand-reference",
8230
- "displayName": "Brand Reference",
8231
- "icon": "bookmark",
8232
- "color": "teal",
8233
- "description": "Website, competitor, campaign, moodboard, or example used as source context for generation.",
8234
- "semanticSlug": "brand.reference",
8235
- "properties": [
8236
- {
8237
- "slug": "reference-kind",
8238
- "label": "Kind",
8239
- "valueType": "string",
8240
- "inputType": "select",
8241
- "enumValues": [
8242
- "website",
8243
- "competitor",
8244
- "campaign",
8245
- "moodboard",
8246
- "copy-example",
8247
- "design-example",
8248
- "customer-example",
8249
- "other"
8250
- ]
8251
- },
8252
- {
8253
- "slug": "reference-url",
8254
- "label": "URL",
8255
- "valueType": "string",
8256
- "inputType": "url"
8257
- },
8258
- {
8259
- "slug": "reference-notes",
8260
- "label": "Notes",
8261
- "valueType": "string",
8262
- "inputType": "textarea"
8263
- },
8264
- {
8265
- "slug": "reference-status",
8266
- "label": "Status",
8267
- "valueType": "string",
8268
- "inputType": "select",
8269
- "enumValues": [
8270
- "draft",
8271
- "approved",
8272
- "archived"
8273
- ],
8274
- "constraints": {
8275
- "defaultValue": "approved"
8276
- }
8277
- }
8278
- ]
8279
- },
8280
- {
8281
- "slug": "brand-token-set",
8282
- "displayName": "Token Set",
8283
- "icon": "code-2",
8284
- "color": "violet",
8285
- "description": "Generated or curated design tokens for color, typography, spacing, radii, and exported CSS variables.",
8286
- "semanticSlug": "brand.tokens",
8287
- "properties": [
8288
- {
8289
- "slug": "token-status",
8290
- "label": "Status",
8291
- "valueType": "string",
8292
- "inputType": "select",
8293
- "enumValues": [
8294
- "draft",
8295
- "active",
8296
- "archived"
8297
- ],
8298
- "constraints": {
8299
- "defaultValue": "active"
8300
- }
8301
- },
8302
- {
8303
- "slug": "token-mode",
8304
- "label": "Mode",
8305
- "valueType": "string",
8306
- "inputType": "select",
8307
- "enumValues": [
8308
- "base",
8309
- "light",
8310
- "dark",
8311
- "high-contrast",
8312
- "campaign",
8313
- "experimental"
8314
- ],
8315
- "constraints": {
8316
- "defaultValue": "base"
8317
- }
8318
- },
8319
- {
8320
- "slug": "token-source-ids",
8321
- "label": "Source IDs",
8322
- "valueType": "string",
8323
- "inputType": "textarea"
8324
- },
8325
- {
8326
- "slug": "token-json",
8327
- "label": "Tokens JSON",
8328
- "valueType": "string",
8329
- "inputType": "textarea"
8330
- },
8331
- {
8332
- "slug": "token-css",
8333
- "label": "CSS variables",
8334
- "valueType": "string",
8335
- "inputType": "textarea"
8336
- },
8337
- {
8338
- "slug": "token-notes",
8339
- "label": "Notes",
8340
- "valueType": "string",
8341
- "inputType": "textarea"
8342
- }
8343
- ]
8344
- },
8345
- {
8346
- "slug": "brand-voice-guide",
8347
- "displayName": "Voice Guide",
8348
- "icon": "message-circle",
8349
- "color": "orange",
8350
- "description": "Generated or curated voice guidance by context: traits, tone, vocabulary, and copy examples.",
8351
- "semanticSlug": "brand.voice",
8352
- "properties": [
8353
- {
8354
- "slug": "voice-context",
8355
- "label": "Context",
8356
- "valueType": "string",
8357
- "inputType": "select",
8358
- "enumValues": [
8359
- "general",
8360
- "marketing",
8361
- "product",
8362
- "support",
8363
- "social",
8364
- "legal",
8365
- "editorial",
8366
- "investor"
8367
- ],
8368
- "constraints": {
8369
- "defaultValue": "general"
8370
- }
8371
- },
8372
- {
8373
- "slug": "voice-status",
8374
- "label": "Status",
8375
- "valueType": "string",
8376
- "inputType": "select",
8377
- "enumValues": [
8378
- "draft",
8379
- "approved",
8380
- "deprecated"
8381
- ],
8382
- "constraints": {
8383
- "defaultValue": "approved"
8384
- }
8385
- },
8386
- {
8387
- "slug": "voice-personality-traits",
8388
- "label": "Personality",
8389
- "valueType": "string",
8390
- "inputType": "textarea"
8391
- },
8392
- {
8393
- "slug": "voice-tone-descriptors",
8394
- "label": "Tone",
8395
- "valueType": "string",
8396
- "inputType": "text"
8397
- },
8398
- {
8399
- "slug": "voice-vocabulary",
8400
- "label": "Vocabulary",
8401
- "valueType": "string",
8402
- "inputType": "textarea"
8403
- },
8404
- {
8405
- "slug": "voice-example-do",
8406
- "label": "Do",
8407
- "valueType": "string",
8408
- "inputType": "textarea"
8409
- },
8410
- {
8411
- "slug": "voice-example-dont",
8412
- "label": "Don't",
8413
- "valueType": "string",
8414
- "inputType": "textarea"
8415
- },
8416
- {
8417
- "slug": "voice-source-ids",
8418
- "label": "Source IDs",
8419
- "valueType": "string",
8420
- "inputType": "textarea"
8421
- }
8422
- ]
8423
- },
8424
- {
8425
- "slug": "brand-rule",
8426
- "displayName": "Brand Rule",
8427
- "icon": "shield-check",
8428
- "color": "red",
8429
- "description": "Usage constraints, accessibility requirements, do/don't examples, and generation guidance.",
8430
- "semanticSlug": "brand.rule",
8431
- "properties": [
8432
- {
8433
- "slug": "rule-kind",
8434
- "label": "Kind",
8435
- "valueType": "string",
8436
- "inputType": "select",
8437
- "enumValues": [
8438
- "visual",
8439
- "voice",
8440
- "legal",
8441
- "accessibility",
8442
- "sizing",
8443
- "clearance",
8444
- "color-usage",
8445
- "typography-usage",
8446
- "do",
8447
- "dont",
8448
- "generation",
8449
- "other"
8450
- ]
8451
- },
8452
- {
8453
- "slug": "rule-subject",
8454
- "label": "Subject",
8455
- "valueType": "string",
8456
- "inputType": "select",
8457
- "enumValues": [
8458
- "logo",
8459
- "color",
8460
- "typography",
8461
- "pattern",
8462
- "asset",
8463
- "voice",
8464
- "general",
8465
- "digital",
8466
- "print",
8467
- "packaging"
8468
- ]
8469
- },
8470
- {
8471
- "slug": "rule-severity",
8472
- "label": "Severity",
8473
- "valueType": "string",
8474
- "inputType": "select",
8475
- "enumValues": [
8476
- "guideline",
8477
- "important",
8478
- "mandatory"
8479
- ],
8480
- "constraints": {
8481
- "defaultValue": "important"
8482
- }
8483
- },
8484
- {
8485
- "slug": "rule-content",
8486
- "label": "Rule",
8487
- "valueType": "string",
8488
- "inputType": "textarea"
8489
- },
8490
- {
8491
- "slug": "rule-example",
8492
- "label": "Example",
8493
- "valueType": "string",
8494
- "inputType": "textarea"
8495
- },
8496
- {
8497
- "slug": "rule-source-ids",
8498
- "label": "Source IDs",
8499
- "valueType": "string",
8500
- "inputType": "textarea"
8501
- }
8502
- ]
8503
- },
8504
- {
8505
- "slug": "brand-template",
8506
- "displayName": "Brand Template",
8507
- "icon": "layout-template",
8508
- "color": "pink",
8509
- "description": "Reusable output template for artboards, decks, carousels, banners, documents, or generated HTML.",
8510
- "semanticSlug": "brand.template",
8511
- "properties": [
8512
- {
8513
- "slug": "template-kind",
8514
- "label": "Kind",
8515
- "valueType": "string",
8516
- "inputType": "select",
8517
- "enumValues": [
8518
- "artboard",
8519
- "deck",
8520
- "carousel",
8521
- "banner",
8522
- "document",
8523
- "html",
8524
- "social",
8525
- "other"
8526
- ]
8527
- },
8528
- {
8529
- "slug": "template-status",
8530
- "label": "Status",
8531
- "valueType": "string",
8532
- "inputType": "select",
8533
- "enumValues": [
8534
- "draft",
8535
- "approved",
8536
- "deprecated"
8537
- ],
8538
- "constraints": {
8539
- "defaultValue": "approved"
8540
- }
8541
- },
8542
- {
8543
- "slug": "template-format",
8544
- "label": "Format",
8545
- "valueType": "string",
8546
- "inputType": "select",
8547
- "enumValues": [
8548
- "tldraw",
8549
- "html",
8550
- "json",
8551
- "markdown",
8552
- "image",
8553
- "mixed"
8554
- ]
8555
- },
8556
- {
8557
- "slug": "template-config",
8558
- "label": "Config JSON",
8559
- "valueType": "string",
8560
- "inputType": "textarea"
8561
- },
8562
- {
8563
- "slug": "template-usage",
8564
- "label": "Usage notes",
8565
- "valueType": "string",
8566
- "inputType": "textarea"
8567
- }
8568
- ]
8569
- },
8570
- {
8571
- "slug": "brand-component",
8572
- "displayName": "Brand Component",
8573
- "icon": "component",
8574
- "color": "green",
8575
- "description": "Reusable branded UI or content component: hero, CTA, card, quote, banner, section, or HTML snippet.",
8576
- "semanticSlug": "brand.component",
8577
- "properties": [
8578
- {
8579
- "slug": "component-kind",
8580
- "label": "Kind",
8581
- "valueType": "string",
8582
- "inputType": "select",
8583
- "enumValues": [
8584
- "hero",
8585
- "card",
8586
- "cta",
8587
- "quote",
8588
- "banner",
8589
- "section",
8590
- "layout",
8591
- "html",
8592
- "other"
8593
- ]
8594
- },
8595
- {
8596
- "slug": "component-status",
8597
- "label": "Status",
8598
- "valueType": "string",
8599
- "inputType": "select",
8600
- "enumValues": [
8601
- "draft",
8602
- "approved",
8603
- "deprecated"
8604
- ],
8605
- "constraints": {
8606
- "defaultValue": "approved"
8607
- }
8608
- },
8609
- {
8610
- "slug": "component-html",
8611
- "label": "HTML",
8612
- "valueType": "string",
8613
- "inputType": "textarea"
8614
- },
8615
- {
8616
- "slug": "component-props",
8617
- "label": "Props JSON",
8618
- "valueType": "string",
8619
- "inputType": "textarea"
8620
- },
8621
- {
8622
- "slug": "component-usage",
8623
- "label": "Usage notes",
8624
- "valueType": "string",
8625
- "inputType": "textarea"
8626
- }
8627
- ]
8628
- },
8629
- {
8630
- "slug": "positioning",
8631
- "displayName": "Positioning",
8632
- "icon": "crosshair",
8633
- "color": "cyan",
8634
- "description": "Market category, who we stand against, and why we win.",
8635
- "properties": [
8636
- {
8637
- "slug": "category",
8638
- "label": "Category",
8639
- "valueType": "string",
8640
- "inputType": "text"
8641
- },
8642
- {
8643
- "slug": "against",
8644
- "label": "Against",
8645
- "valueType": "string",
8646
- "inputType": "textarea"
8647
- },
8648
- {
8649
- "slug": "because",
8650
- "label": "Because",
8651
- "valueType": "string",
8652
- "inputType": "textarea"
8653
- }
8654
- ]
8655
- },
8656
- {
8657
- "slug": "narrative",
8658
- "displayName": "Narrative",
8659
- "icon": "book-open",
8660
- "color": "amber",
8661
- "description": "The origin -> insight -> mission story arc.",
8662
- "properties": [
8663
- {
8664
- "slug": "arc",
8665
- "label": "Story arc",
8666
- "valueType": "string",
8667
- "inputType": "textarea"
8668
- },
8669
- {
8670
- "slug": "status",
8671
- "label": "Status",
8672
- "valueType": "string",
8673
- "inputType": "select",
8674
- "enumValues": [
8675
- "draft",
8676
- "active",
8677
- "archived"
8678
- ],
8679
- "constraints": {
8680
- "defaultValue": "active"
8681
- }
8682
- }
8683
- ]
8684
- },
8685
- {
8686
- "slug": "audience",
8687
- "displayName": "Audience",
8688
- "icon": "users",
8689
- "color": "blue",
8690
- "description": "An ideal customer profile \u2014 who we are built for.",
8691
- "properties": [
8692
- {
8693
- "slug": "segment",
8694
- "label": "Segment",
8695
- "valueType": "string",
8696
- "inputType": "text"
8697
- },
8698
- {
8699
- "slug": "persona",
8700
- "label": "Persona",
8701
- "valueType": "string",
8702
- "inputType": "textarea"
8703
- },
8704
- {
8705
- "slug": "jobs-to-be-done",
8706
- "label": "Jobs to be done",
8707
- "valueType": "string",
8708
- "inputType": "textarea"
8709
- },
8710
- {
8711
- "slug": "traits",
8712
- "label": "Traits",
8713
- "valueType": "array",
8714
- "inputType": "text"
8715
- }
8716
- ]
8717
- },
8718
- {
8719
- "slug": "differentiator",
8720
- "displayName": "Differentiator",
8721
- "icon": "sparkles",
8722
- "color": "green",
8723
- "description": "One thing only we do, believe, or refuse.",
8724
- "properties": [
8725
- {
8726
- "slug": "statement",
8727
- "label": "Statement",
8728
- "valueType": "string",
8729
- "inputType": "textarea"
8730
- },
8731
- {
8732
- "slug": "proof",
8733
- "label": "Proof",
7939
+ "slug": "proof",
7940
+ "label": "Proof",
8734
7941
  "valueType": "string",
8735
7942
  "inputType": "textarea"
8736
7943
  }
@@ -8905,6 +8112,7 @@ var DATA = {
8905
8112
  "content-os": {
8906
8113
  "meta": {
8907
8114
  "slug": "content-os",
8115
+ "domain": "content",
8908
8116
  "name": "Content OS",
8909
8117
  "description": "Your editorial operating system \u2014 pillars, posts, platforms, and newsletters. Turn raw thinking into a published content engine, all connected to your campaigns and brand voice.",
8910
8118
  "icon": "pen-tool",
@@ -9184,7 +8392,7 @@ var DATA = {
9184
8392
  "icon": "share-2",
9185
8393
  "color": "#06B6D4",
9186
8394
  "description": "A social account, newsletter publication, or podcast channel. Each platform has its own audience metrics and publishing rhythm.",
9187
- "scope": "WORKSPACE",
8395
+ "scope": "shared",
9188
8396
  "properties": [
9189
8397
  {
9190
8398
  "slug": "platform-type",
@@ -9205,6 +8413,13 @@ var DATA = {
9205
8413
  "Other"
9206
8414
  ]
9207
8415
  },
8416
+ {
8417
+ "slug": "handle",
8418
+ "label": "Handle",
8419
+ "valueType": "string",
8420
+ "inputType": "text",
8421
+ "placeholder": "@username"
8422
+ },
9208
8423
  {
9209
8424
  "slug": "platform-status",
9210
8425
  "label": "Status",
@@ -9740,6 +8955,7 @@ var DATA = {
9740
8955
  "content-studio": {
9741
8956
  "meta": {
9742
8957
  "slug": "content-studio",
8958
+ "domain": "content",
9743
8959
  "name": "Content Studio",
9744
8960
  "description": "HyperFrames + Remotion video pipeline \u2014 script, design, compose, render, publish.",
9745
8961
  "icon": "clapperboard",
@@ -10275,6 +9491,7 @@ var DATA = {
10275
9491
  "crm": {
10276
9492
  "meta": {
10277
9493
  "slug": "crm",
9494
+ "domain": "revenue",
10278
9495
  "name": "CRM",
10279
9496
  "description": "Sales pipeline and contact management from first contact to handoff.",
10280
9497
  "icon": "handshake",
@@ -10844,6 +10061,7 @@ var DATA = {
10844
10061
  "dev-dashboard": {
10845
10062
  "meta": {
10846
10063
  "slug": "dev-dashboard",
10064
+ "domain": "build",
10847
10065
  "name": "Synap Dev \u2014 Infrastructure Command Center",
10848
10066
  "description": "Internal DevOps dashboard for monitoring Synap infrastructure. Tracks services, vendors, and environments with health status, architecture flow map, and quick access to admin panels.",
10849
10067
  "icon": "server",
@@ -12554,6 +11772,7 @@ var DATA = {
12554
11772
  "ecosystem": {
12555
11773
  "meta": {
12556
11774
  "slug": "ecosystem",
11775
+ "domain": "strategy",
12557
11776
  "name": "Ecosystem",
12558
11777
  "description": "Map the market you operate in \u2014 the partners, competitors, and players, the segments and trends, and the relationships between them.",
12559
11778
  "icon": "radar",
@@ -13300,6 +12519,7 @@ var DATA = {
13300
12519
  "enterprise-os": {
13301
12520
  "meta": {
13302
12521
  "slug": "enterprise-os",
12522
+ "domain": "company",
13303
12523
  "name": "Enterprise OS",
13304
12524
  "description": "Stand up a company's public operating core in one install \u2014 strategy, market, operations, and pipeline \u2014 plus a command tower to track objectives across them.",
13305
12525
  "icon": "layout-dashboard",
@@ -13536,6 +12756,7 @@ var DATA = {
13536
12756
  "finance": {
13537
12757
  "meta": {
13538
12758
  "slug": "finance",
12759
+ "domain": "company",
13539
12760
  "name": "Finance",
13540
12761
  "description": "The company's money model \u2014 accounts, receivables, spend, revenue streams, budgets, and runway.",
13541
12762
  "icon": "banknote",
@@ -14377,6 +13598,7 @@ var DATA = {
14377
13598
  "foundation": {
14378
13599
  "meta": {
14379
13600
  "slug": "foundation",
13601
+ "domain": "strategy",
14380
13602
  "name": "Foundation",
14381
13603
  "description": "The strategic DNA \u2014 mission, audience, positioning, and principles \u2014 that every workspace inherits.",
14382
13604
  "icon": "compass",
@@ -15217,6 +14439,7 @@ var DATA = {
15217
14439
  "grants": {
15218
14440
  "meta": {
15219
14441
  "slug": "grants",
14442
+ "domain": "revenue",
15220
14443
  "name": "Grants Pipeline",
15221
14444
  "description": "Grant-agency operations \u2014 submissions, rounds, analyses. Overlays the Operations workspace.",
15222
14445
  "icon": "award",
@@ -16692,6 +15915,7 @@ var DATA = {
16692
15915
  "hr": {
16693
15916
  "meta": {
16694
15917
  "slug": "hr",
15918
+ "domain": "company",
16695
15919
  "name": "HR",
16696
15920
  "description": "The people operating system \u2014 team, hiring, performance reviews, and policies in one place.",
16697
15921
  "icon": "users-round",
@@ -17518,6 +16742,7 @@ var DATA = {
17518
16742
  "internal-runbook": {
17519
16743
  "meta": {
17520
16744
  "slug": "internal-runbook",
16745
+ "domain": "company",
17521
16746
  "name": "Internal Runbook",
17522
16747
  "description": "The company's operating system \u2014 SOPs, workflows, vendors, tools, metrics, and rituals that keep the business running.",
17523
16748
  "icon": "settings-2",
@@ -17533,7 +16758,6 @@ var DATA = {
17533
16758
  "workspace": {
17534
16759
  "name": "Internal Runbook",
17535
16760
  "description": "The operating layer of the company \u2014 documented procedures, recurring processes, the tool stack and vendors behind them, operational metrics, and the rituals that keep the team aligned.",
17536
- "proposalId": "operations-v1",
17537
16761
  "subtype": "internal-runbook",
17538
16762
  "visibility": "members",
17539
16763
  "workspaceType": "operational",
@@ -18354,6 +17578,7 @@ var DATA = {
18354
17578
  "legal": {
18355
17579
  "meta": {
18356
17580
  "slug": "legal",
17581
+ "domain": "company",
18357
17582
  "name": "Legal",
18358
17583
  "description": "The company's legal operating system \u2014 contracts, compliance, IP, entities, and matters.",
18359
17584
  "icon": "scale",
@@ -19217,6 +18442,7 @@ var DATA = {
19217
18442
  "life-os": {
19218
18443
  "meta": {
19219
18444
  "slug": "life-os",
18445
+ "domain": "knowledge",
19220
18446
  "name": "Second Brain \u2014 Knowledge OS",
19221
18447
  "description": "A sovereign personal knowledge management workspace. Capture everything, connect ideas, build your external brain.",
19222
18448
  "icon": "brain",
@@ -22050,6 +21276,7 @@ var DATA = {
22050
21276
  "marketing-campaign": {
22051
21277
  "meta": {
22052
21278
  "slug": "marketing-campaign",
21279
+ "domain": "revenue",
22053
21280
  "name": "Marketing Campaigns",
22054
21281
  "description": "Track leads, manage campaigns, and let AI help run your outreach. Contacts, pipeline, tasks, and AI briefings \u2014 all connected.",
22055
21282
  "icon": "megaphone",
@@ -22481,6 +21708,7 @@ var DATA = {
22481
21708
  "meetings-knowledge": {
22482
21709
  "meta": {
22483
21710
  "slug": "meetings-knowledge",
21711
+ "domain": "knowledge",
22484
21712
  "name": "Meetings & Knowledge",
22485
21713
  "description": "Import and summarize meetings \u2014 transcripts become notes, action items become tasks, and attendees become tracked people.",
22486
21714
  "icon": "video",
@@ -22860,6 +22088,7 @@ var DATA = {
22860
22088
  "operations": {
22861
22089
  "meta": {
22862
22090
  "slug": "operations",
22091
+ "domain": "company",
22863
22092
  "name": "Operations",
22864
22093
  "description": "Deliver client work end to end \u2014 the engagements you're running, the deliverables due inside them, and the contracts that govern them. Won deals from CRM hand off into engagements here.",
22865
22094
  "icon": "briefcase",
@@ -22887,6 +22116,14 @@ var DATA = {
22887
22116
  "operations": "provider"
22888
22117
  }
22889
22118
  },
22119
+ "dependencies": [
22120
+ {
22121
+ "slug": "foundation",
22122
+ "kind": "workspace",
22123
+ "relation": "require",
22124
+ "reason": "Provides the pod-wide `client` role the daily client-briefing automation queries."
22125
+ }
22126
+ ],
22890
22127
  "profiles": [
22891
22128
  {
22892
22129
  "slug": "engagement",
@@ -23074,6 +22311,72 @@ var DATA = {
23074
22311
  "inputType": "textarea"
23075
22312
  }
23076
22313
  ]
22314
+ },
22315
+ {
22316
+ "slug": "client-briefing",
22317
+ "displayName": "Client Briefing",
22318
+ "icon": "newspaper",
22319
+ "color": "#F59E0B",
22320
+ "description": "A dated internal recap of one client's recent communications \u2014 what moved, what's at risk, what's next. For the team, never for the client.",
22321
+ "properties": [
22322
+ {
22323
+ "slug": "briefing-client",
22324
+ "label": "Client",
22325
+ "valueType": "entity_id",
22326
+ "targetProfileSlug": "company",
22327
+ "inputType": "entity_select"
22328
+ },
22329
+ {
22330
+ "slug": "briefing-date",
22331
+ "label": "Written At",
22332
+ "valueType": "date",
22333
+ "inputType": "date"
22334
+ },
22335
+ {
22336
+ "slug": "briefing-key",
22337
+ "label": "Run Key",
22338
+ "valueType": "string",
22339
+ "inputType": "text"
22340
+ },
22341
+ {
22342
+ "slug": "briefing-headline",
22343
+ "label": "Headline",
22344
+ "valueType": "string",
22345
+ "inputType": "text"
22346
+ },
22347
+ {
22348
+ "slug": "briefing-summary",
22349
+ "label": "Summary",
22350
+ "valueType": "string",
22351
+ "inputType": "textarea"
22352
+ },
22353
+ {
22354
+ "slug": "briefing-risks",
22355
+ "label": "Risks",
22356
+ "valueType": "string",
22357
+ "inputType": "textarea"
22358
+ },
22359
+ {
22360
+ "slug": "briefing-next-actions",
22361
+ "label": "Next Actions",
22362
+ "valueType": "string",
22363
+ "inputType": "textarea"
22364
+ },
22365
+ {
22366
+ "slug": "briefing-message-count",
22367
+ "label": "Messages Read",
22368
+ "valueType": "number",
22369
+ "inputType": "number"
22370
+ }
22371
+ ]
22372
+ }
22373
+ ],
22374
+ "entityLinks": [
22375
+ {
22376
+ "sourceProfileSlug": "client-briefing",
22377
+ "targetProfileSlug": "company",
22378
+ "type": "briefing_about_client",
22379
+ "label": "Client"
23077
22380
  }
23078
22381
  ],
23079
22382
  "views": [
@@ -23099,6 +22402,13 @@ var DATA = {
23099
22402
  "type": "table",
23100
22403
  "scopeProfileSlug": "contract",
23101
22404
  "description": "Contracts with their status, value, and term."
22405
+ },
22406
+ {
22407
+ "name": "Client Briefings",
22408
+ "slug": "client-briefings",
22409
+ "type": "list",
22410
+ "scopeProfileSlug": "client-briefing",
22411
+ "description": "The daily internal recaps, newest first."
23102
22412
  }
23103
22413
  ],
23104
22414
  "onboarding": {
@@ -23125,75 +22435,322 @@ var DATA = {
23125
22435
  "due-date"
23126
22436
  ]
23127
22437
  }
23128
- ],
23129
- "openingQuestions": [
23130
- "Which client engagements are active right now, and who's the client on each?",
23131
- "What's due next \u2014 which deliverables are in flight, and when are they owed?",
23132
- "Which engagements have a contract behind them, and which are still on a handshake?"
23133
- ],
23134
- "doneWhen": "at least one active engagement with a deliverable placed inside it."
23135
- },
23136
- "app": {
23137
- "kind": "stored",
23138
- "cellKey": "entity-detail"
23139
- },
23140
- "layout": {
23141
- "pinnedApps": [
23142
- "dashboard",
23143
- "data"
23144
- ],
23145
- "defaultView": "Engagements",
23146
- "defaultApp": null,
23147
- "sidebarItems": [
23148
- {
23149
- "kind": "view",
23150
- "viewName": "Engagements",
23151
- "label": "Engagements",
23152
- "icon": "briefcase"
23153
- },
23154
- {
23155
- "kind": "view",
23156
- "viewName": "Deliverables",
23157
- "label": "Deliverables",
23158
- "icon": "package-check"
23159
- },
23160
- {
23161
- "kind": "view",
23162
- "viewName": "Contracts",
23163
- "label": "Contracts",
23164
- "icon": "file-signature"
23165
- }
23166
- ]
23167
- },
23168
- "bento": {
23169
- "viewName": "Engagements",
23170
- "blocks": [
23171
- {
23172
- "kind": "view",
23173
- "viewName": "Deliverables",
23174
- "pos": {
23175
- "x": 0,
23176
- "y": 0,
23177
- "w": 6,
23178
- "h": 5
23179
- }
23180
- },
23181
- {
23182
- "kind": "view",
23183
- "viewName": "Contracts",
23184
- "pos": {
23185
- "x": 6,
23186
- "y": 0,
23187
- "w": 6,
23188
- "h": 5
23189
- }
23190
- }
23191
- ]
23192
- }
22438
+ ],
22439
+ "openingQuestions": [
22440
+ "Which client engagements are active right now, and who's the client on each?",
22441
+ "What's due next \u2014 which deliverables are in flight, and when are they owed?",
22442
+ "Which engagements have a contract behind them, and which are still on a handshake?"
22443
+ ],
22444
+ "doneWhen": "at least one active engagement with a deliverable placed inside it."
22445
+ },
22446
+ "app": {
22447
+ "kind": "stored",
22448
+ "cellKey": "entity-detail"
22449
+ },
22450
+ "layout": {
22451
+ "pinnedApps": [
22452
+ "dashboard",
22453
+ "data"
22454
+ ],
22455
+ "defaultView": "Engagements",
22456
+ "defaultApp": null,
22457
+ "sidebarItems": [
22458
+ {
22459
+ "kind": "view",
22460
+ "viewName": "Engagements",
22461
+ "label": "Engagements",
22462
+ "icon": "briefcase"
22463
+ },
22464
+ {
22465
+ "kind": "view",
22466
+ "viewName": "Deliverables",
22467
+ "label": "Deliverables",
22468
+ "icon": "package-check"
22469
+ },
22470
+ {
22471
+ "kind": "view",
22472
+ "viewName": "Contracts",
22473
+ "label": "Contracts",
22474
+ "icon": "file-signature"
22475
+ }
22476
+ ]
22477
+ },
22478
+ "bento": {
22479
+ "viewName": "Engagements",
22480
+ "blocks": [
22481
+ {
22482
+ "kind": "view",
22483
+ "viewName": "Deliverables",
22484
+ "pos": {
22485
+ "x": 0,
22486
+ "y": 0,
22487
+ "w": 6,
22488
+ "h": 5
22489
+ }
22490
+ },
22491
+ {
22492
+ "kind": "view",
22493
+ "viewName": "Contracts",
22494
+ "pos": {
22495
+ "x": 6,
22496
+ "y": 0,
22497
+ "w": 6,
22498
+ "h": 5
22499
+ }
22500
+ }
22501
+ ]
22502
+ },
22503
+ "automations": [
22504
+ {
22505
+ "key": "operations-daily-client-briefing",
22506
+ "name": "Daily client briefing",
22507
+ "description": "Each morning, for every client, distil their recent comms into one batched digest, save it as a durable client-briefing, and post the recap to the client's internal TEAM channel (never the client-facing channel).",
22508
+ "triggerType": "cron",
22509
+ "triggerConfig": {
22510
+ "expression": "0 8 * * *"
22511
+ },
22512
+ "status": "active",
22513
+ "metadata": {
22514
+ "templateKey": "operations-daily-client-briefing",
22515
+ "requiresPodWideEntityQueryLens": true
22516
+ },
22517
+ "flow": {
22518
+ "nodes": [
22519
+ {
22520
+ "id": "trigger",
22521
+ "type": "trigger",
22522
+ "position": {
22523
+ "x": 0,
22524
+ "y": 0
22525
+ },
22526
+ "data": {
22527
+ "label": "Daily at 08:00",
22528
+ "triggerType": "cron",
22529
+ "config": {
22530
+ "expression": "0 8 * * *"
22531
+ }
22532
+ }
22533
+ },
22534
+ {
22535
+ "id": "list-clients",
22536
+ "type": "capability",
22537
+ "position": {
22538
+ "x": 0,
22539
+ "y": 120
22540
+ },
22541
+ "data": {
22542
+ "label": "List clients (pod-wide `client` role)",
22543
+ "verbId": "entity.query",
22544
+ "inputMapping": {
22545
+ "profileSlug": "client",
22546
+ "scope": "pod",
22547
+ "limit": "100"
22548
+ }
22549
+ }
22550
+ },
22551
+ {
22552
+ "id": "clients-loop",
22553
+ "type": "loop",
22554
+ "position": {
22555
+ "x": 0,
22556
+ "y": 240
22557
+ },
22558
+ "data": {
22559
+ "label": "For each client",
22560
+ "iteratorExpression": "steps.list-clients.output.entities",
22561
+ "itemVariable": "client"
22562
+ }
22563
+ },
22564
+ {
22565
+ "id": "read-comms",
22566
+ "type": "messages_query",
22567
+ "position": {
22568
+ "x": 0,
22569
+ "y": 360
22570
+ },
22571
+ "data": {
22572
+ "label": "Read this client's recent comms",
22573
+ "subjectEntityId": "{{loop.item.id}}",
22574
+ "limit": 40
22575
+ }
22576
+ },
22577
+ {
22578
+ "id": "digest",
22579
+ "type": "capability",
22580
+ "position": {
22581
+ "x": 0,
22582
+ "y": 480
22583
+ },
22584
+ "data": {
22585
+ "label": "Distil the real signal \u2192 JSON",
22586
+ "verbId": "ai.generate",
22587
+ "inputMapping": {
22588
+ "json": "true",
22589
+ "maxTokens": "1200",
22590
+ "system": "You advise a client-delivery team. You read one client's recent inbound messages and surface only what genuinely matters. You are firewall-aware: your output is for the INTERNAL team, never the client.",
22591
+ "prompt": `Digest the recent communications for the client "{{loop.item.title}}" into a concise internal briefing for OUR delivery team.
22592
+ PEOPLE GUARD (do not break): distinguish the CLIENT's people from OUR team members who also appear in the thread. Never treat a teammate as a client contact, lead, or new person. Only real, client-side signal counts.
22593
+ Surface ONLY real signal: status changes, decisions, deals/opportunities, competitor mentions, new client-side leads/contacts, risks/blockers, and deadlines/commitments. Skip small talk and noise. Lead with what matters; keep it tight.
22594
+ Respond with STRICT JSON and NOTHING else: {
22595
+ "hasSignal": "true" or "false" (a STRING),
22596
+ "headline": "<one-line summary; empty string when hasSignal is 'false'>",
22597
+ "summary": "<a short markdown digest for the team; empty string when 'false'>",
22598
+ "risks": "<risks/blockers as short markdown, or empty string>",
22599
+ "nextActions": "<recommended next actions as short markdown, or empty string>"
22600
+ } Set hasSignal to "false" when there is no notable activity (no messages, or only chatter).
22601
+ Recent conversation (oldest first, JSON): {{steps.read-comms.output.messages}}`
22602
+ }
22603
+ }
22604
+ },
22605
+ {
22606
+ "id": "signal-gate",
22607
+ "type": "condition",
22608
+ "position": {
22609
+ "x": 0,
22610
+ "y": 600
22611
+ },
22612
+ "data": {
22613
+ "label": "Only continue when there's real signal",
22614
+ "expression": "steps.digest.output.hasSignal === true"
22615
+ }
22616
+ },
22617
+ {
22618
+ "id": "write-briefing",
22619
+ "type": "output",
22620
+ "position": {
22621
+ "x": 0,
22622
+ "y": 720
22623
+ },
22624
+ "data": {
22625
+ "label": "Save the client briefing",
22626
+ "outputType": "entity_create",
22627
+ "config": {
22628
+ "profileSlug": "client-briefing",
22629
+ "title": "Briefing \u2014 {{loop.item.title}}",
22630
+ "dedupeBy": "briefing-key",
22631
+ "properties": {
22632
+ "briefing-key": "{{loop.item.id}}::{{trigger.payload.scheduledAt}}",
22633
+ "briefing-client": "{{loop.item.id}}",
22634
+ "briefing-date": "{{trigger.payload.scheduledAt}}",
22635
+ "briefing-headline": "{{steps.digest.output.headline}}",
22636
+ "briefing-summary": "{{steps.digest.output.summary}}",
22637
+ "briefing-risks": "{{steps.digest.output.risks}}",
22638
+ "briefing-next-actions": "{{steps.digest.output.nextActions}}",
22639
+ "briefing-message-count": "{{steps.read-comms.output.count}}"
22640
+ }
22641
+ }
22642
+ }
22643
+ },
22644
+ {
22645
+ "id": "link-briefing",
22646
+ "type": "output",
22647
+ "position": {
22648
+ "x": 0,
22649
+ "y": 840
22650
+ },
22651
+ "data": {
22652
+ "label": "Link briefing \u2192 client",
22653
+ "outputType": "relation_create",
22654
+ "config": {
22655
+ "fromEntityId": "{{steps.write-briefing.output.entityId}}",
22656
+ "toEntityId": "{{loop.item.id}}",
22657
+ "relationType": "briefing_about_client"
22658
+ }
22659
+ }
22660
+ },
22661
+ {
22662
+ "id": "resolve-team",
22663
+ "type": "capability",
22664
+ "position": {
22665
+ "x": 0,
22666
+ "y": 960
22667
+ },
22668
+ "data": {
22669
+ "label": "Resolve the client's TEAM channel (FIREWALL)",
22670
+ "verbId": "channel.resolve",
22671
+ "inputMapping": {
22672
+ "contextObjectType": "entity",
22673
+ "contextObjectId": "{{loop.item.id}}",
22674
+ "branchPurpose": "team"
22675
+ }
22676
+ }
22677
+ },
22678
+ {
22679
+ "id": "post-recap",
22680
+ "type": "output",
22681
+ "position": {
22682
+ "x": 0,
22683
+ "y": 1080
22684
+ },
22685
+ "data": {
22686
+ "label": "Post the recap to the TEAM channel (FIREWALL)",
22687
+ "outputType": "channel_message",
22688
+ "config": {
22689
+ "channelId": "{{steps.resolve-team.output.channelId}}",
22690
+ "content": "**{{loop.item.title}} \u2014 daily briefing**\n{{steps.digest.output.headline}}\n{{steps.digest.output.summary}}\n**Risks:** {{steps.digest.output.risks}}\n**Next:** {{steps.digest.output.nextActions}}",
22691
+ "metadata": {
22692
+ "automationMessage": true,
22693
+ "kind": "client-briefing"
22694
+ }
22695
+ }
22696
+ }
22697
+ }
22698
+ ],
22699
+ "edges": [
22700
+ {
22701
+ "id": "e-trigger-list",
22702
+ "source": "trigger",
22703
+ "target": "list-clients"
22704
+ },
22705
+ {
22706
+ "id": "e-list-loop",
22707
+ "source": "list-clients",
22708
+ "target": "clients-loop"
22709
+ },
22710
+ {
22711
+ "id": "e-loop-read",
22712
+ "source": "clients-loop",
22713
+ "target": "read-comms"
22714
+ },
22715
+ {
22716
+ "id": "e-read-digest",
22717
+ "source": "read-comms",
22718
+ "target": "digest"
22719
+ },
22720
+ {
22721
+ "id": "e-digest-gate",
22722
+ "source": "digest",
22723
+ "target": "signal-gate"
22724
+ },
22725
+ {
22726
+ "id": "e-gate-write",
22727
+ "source": "signal-gate",
22728
+ "target": "write-briefing"
22729
+ },
22730
+ {
22731
+ "id": "e-write-link",
22732
+ "source": "write-briefing",
22733
+ "target": "link-briefing"
22734
+ },
22735
+ {
22736
+ "id": "e-link-resolve",
22737
+ "source": "link-briefing",
22738
+ "target": "resolve-team"
22739
+ },
22740
+ {
22741
+ "id": "e-resolve-post",
22742
+ "source": "resolve-team",
22743
+ "target": "post-recap"
22744
+ }
22745
+ ]
22746
+ }
22747
+ }
22748
+ ]
23193
22749
  },
23194
22750
  "outreach-comms": {
23195
22751
  "meta": {
23196
22752
  "slug": "outreach-comms",
22753
+ "domain": "revenue",
23197
22754
  "name": "Outreach & Comms",
23198
22755
  "description": "Personalized LinkedIn and email outreach \u2014 sequenced touches against real people and companies, drafted and sent by an agent.",
23199
22756
  "icon": "send",
@@ -23580,257 +23137,28 @@ var DATA = {
23580
23137
  }
23581
23138
  ]
23582
23139
  },
23583
- "bento": {
23584
- "viewName": "Outreach Home",
23585
- "blocks": [
23586
- {
23587
- "kind": "view",
23588
- "viewName": "Campaigns",
23589
- "pos": {
23590
- "x": 0,
23591
- "y": 0,
23592
- "w": 8,
23593
- "h": 5
23594
- }
23595
- },
23596
- {
23597
- "kind": "view",
23598
- "viewName": "Touches",
23599
- "pos": {
23600
- "x": 8,
23601
- "y": 0,
23602
- "w": 4,
23603
- "h": 5
23604
- }
23605
- }
23606
- ]
23607
- }
23608
- },
23609
- "personal": {
23610
- "meta": {
23611
- "slug": "personal",
23612
- "name": "Personal Knowledge",
23613
- "description": "Capture notes, bookmarks, and articles \u2014 your AI-organized second brain.",
23614
- "icon": "brain",
23615
- "color": "#0891B2",
23616
- "tags": [
23617
- "personal",
23618
- "knowledge",
23619
- "notes",
23620
- "second-brain"
23621
- ],
23622
- "isPublic": true
23623
- },
23624
- "workspace": {
23625
- "name": "Personal",
23626
- "description": "Your personal knowledge base \u2014 capture anything, let AI organize it.",
23627
- "proposalId": "personal-v1",
23628
- "subtype": "personal",
23629
- "visibility": "pod_visible",
23630
- "capabilities": [
23631
- "knowledge.capture",
23632
- "knowledge.organize"
23633
- ]
23634
- },
23635
- "profiles": [
23636
- {
23637
- "slug": "note",
23638
- "displayName": "Note",
23639
- "icon": "file-text",
23640
- "color": "amber",
23641
- "description": "A quick note or idea.",
23642
- "properties": [
23643
- {
23644
- "slug": "tags",
23645
- "label": "Tags",
23646
- "valueType": "array",
23647
- "inputType": "text"
23648
- }
23649
- ]
23650
- },
23651
- {
23652
- "slug": "bookmark",
23653
- "displayName": "Bookmark",
23654
- "icon": "bookmark",
23655
- "color": "blue",
23656
- "description": "A saved URL or web reference.",
23657
- "properties": [
23658
- {
23659
- "slug": "url",
23660
- "label": "URL",
23661
- "valueType": "string",
23662
- "inputType": "url"
23663
- }
23664
- ]
23665
- },
23666
- {
23667
- "slug": "article",
23668
- "displayName": "Article",
23669
- "icon": "book-open",
23670
- "color": "violet",
23671
- "description": "A long-form article or reading-list item.",
23672
- "properties": [
23673
- {
23674
- "slug": "readStatus",
23675
- "label": "Status",
23676
- "valueType": "string",
23677
- "inputType": "select",
23678
- "enumValues": [
23679
- "to-read",
23680
- "reading",
23681
- "read",
23682
- "archived"
23683
- ]
23684
- },
23685
- {
23686
- "slug": "url",
23687
- "label": "Source URL",
23688
- "valueType": "string",
23689
- "inputType": "url"
23690
- }
23691
- ]
23692
- },
23693
- {
23694
- "slug": "project",
23695
- "displayName": "Project",
23696
- "icon": "folder",
23697
- "color": "green",
23698
- "description": "A project grouping related notes and references.",
23699
- "properties": [
23700
- {
23701
- "slug": "status",
23702
- "label": "Status",
23703
- "valueType": "string",
23704
- "inputType": "select",
23705
- "enumValues": [
23706
- "active",
23707
- "paused",
23708
- "done",
23709
- "archived"
23710
- ]
23711
- }
23712
- ]
23713
- }
23714
- ],
23715
- "views": [
23716
- {
23717
- "name": "Feed",
23718
- "type": "masonry",
23719
- "scopeProfileSlugs": [
23720
- "note",
23721
- "bookmark",
23722
- "article",
23723
- "project"
23724
- ],
23725
- "description": "Everything you captured, newest first."
23726
- },
23727
- {
23728
- "name": "Reading List",
23729
- "type": "table",
23730
- "scopeProfileSlug": "article",
23731
- "description": "Articles to read, in progress, and read."
23732
- },
23733
- {
23734
- "name": "Bookmarks",
23735
- "type": "grid",
23736
- "scopeProfileSlug": "bookmark",
23737
- "description": "Saved web references."
23738
- }
23739
- ],
23740
- "onboarding": {
23741
- "goal": "Capture the shape of the user's world \u2014 what they're working on, what they're reading and saving, and how they think \u2014 so the workspace starts grounded in who they actually are.",
23742
- "framing": "THE KNOWLEDGE COACH: Act as a gentle, thoughtful personal-knowledge coach. You're here to understand their world, not audit it \u2014 curious, warm, never pushy. Meet them where they are: a couple of honest notes beat a perfect system. Reflect back what you hear so it feels captured, not interrogated.\n",
23743
- "expertise": {
23744
- "starters": [
23745
- `Start from ONE real recurring need, not a structure. Ask "what do you keep losing track of?" \u2014 the tab you meant to read, the idea you forgot, the link you can't find again \u2014 and seed that single thing. A personal space earns trust by solving one nagging friction, then grows; it dies if it opens as an empty filing cabinet.
23746
- `,
23747
- "Propose the 2-3 things they ACTUALLY want to track, then stop. Most people need exactly: a place for stray notes, a reading list, and a bookmark pile. Name those, seed one item in each, and resist adding projects/tags/statuses they didn't ask for. The default here is deliberately lean \u2014 under-structure on purpose.\n",
23748
- "Mirror their own capture habit instead of imposing one. Ask what a jotted thought usually looks like for them \u2014 a link, a one-liner, a voice-note-to-self \u2014 and map the workspace to that shape. If they dump links, lead with bookmarks; if they write, lead with notes. Match reality; don't teach them a new ritual.\n"
23749
- ],
23750
- "blindSpots": [
23751
- "The productivity-system graveyard: elaborate setups \u2014 nested tags, six statuses, color-coded areas \u2014 built with enthusiasm on day one and abandoned by day seven. The failure mode is over-structuring, not under-structuring. Every field you add is a field they must maintain; keep it embarrassingly simple and let it grow later.\n",
23752
- `People try to design the "perfect system" before they have any content, and stall. Structure should emerge FROM real notes, not precede them. If they're deliberating over categories with an empty workspace, cut it short \u2014 capture three real things first, and let the shape reveal itself.
23753
- `,
23754
- 'A reading list nobody triages just becomes guilt. People pile "to-read" articles and never mark anything read or dropped, so the list rots into a backlog they avoid. Give it a lightweight status (to-read / reading / read / archived) and normalize archiving unread \u2014 a shrinking list is a healthy one.\n'
23755
- ],
23756
- "bar": `A GREAT result is TWO OR THREE things they genuinely care about, each with a real item already in it \u2014 not an empty scaffold. It should feel like a lean personal shelf they'll actually open tomorrow, with nothing to maintain that they didn't ask for. If it looks like a "productivity system", it's already too much.
23757
- `
23758
- },
23759
- "collect": [
23760
- {
23761
- "profileSlug": "project",
23762
- "what": "The handful of things they're actively working on or care about right now.",
23763
- "cardinality": "few",
23764
- "keyFields": [
23765
- "name",
23766
- "status"
23767
- ]
23768
- },
23769
- {
23770
- "profileSlug": "note",
23771
- "what": "A few ideas, thoughts, or things on their mind \u2014 however rough.",
23772
- "cardinality": "several",
23773
- "keyFields": [
23774
- "name",
23775
- "tags"
23776
- ]
23777
- },
23778
- {
23779
- "profileSlug": "article",
23780
- "what": "What they're reading or mean to read \u2014 their reading list.",
23781
- "cardinality": "several",
23782
- "keyFields": [
23783
- "name",
23784
- "readStatus"
23785
- ]
23786
- },
23787
- {
23788
- "profileSlug": "bookmark",
23789
- "what": "Web references and links worth keeping.",
23790
- "cardinality": "several",
23791
- "keyFields": [
23792
- "name",
23793
- "url"
23794
- ]
23795
- }
23796
- ],
23797
- "openingQuestions": [
23798
- "What are you working on or thinking about most these days?",
23799
- "What have you been reading, saving, or meaning to get to?",
23800
- "When you jot something down, what does it usually look like \u2014 a link, a note, a task?"
23801
- ],
23802
- "doneWhen": "at least one project or note captured, plus one thing they're reading or saving."
23803
- },
23804
- "app": {
23805
- "kind": "stored",
23806
- "cellKey": "entity-detail"
23807
- },
23808
- "layout": {
23809
- "pinnedApps": [
23810
- "dashboard",
23811
- "data",
23812
- "chat"
23813
- ],
23814
- "defaultView": "Feed",
23815
- "defaultApp": null,
23816
- "sidebarItems": [
23817
- {
23818
- "kind": "view",
23819
- "viewName": "Feed",
23820
- "label": "Feed",
23821
- "icon": "layout-dashboard"
23822
- },
23140
+ "bento": {
23141
+ "viewName": "Outreach Home",
23142
+ "blocks": [
23823
23143
  {
23824
23144
  "kind": "view",
23825
- "viewName": "Reading List",
23826
- "label": "Reading List",
23827
- "icon": "book-open"
23145
+ "viewName": "Campaigns",
23146
+ "pos": {
23147
+ "x": 0,
23148
+ "y": 0,
23149
+ "w": 8,
23150
+ "h": 5
23151
+ }
23828
23152
  },
23829
23153
  {
23830
23154
  "kind": "view",
23831
- "viewName": "Bookmarks",
23832
- "label": "Bookmarks",
23833
- "icon": "bookmark"
23155
+ "viewName": "Touches",
23156
+ "pos": {
23157
+ "x": 8,
23158
+ "y": 0,
23159
+ "w": 4,
23160
+ "h": 5
23161
+ }
23834
23162
  }
23835
23163
  ]
23836
23164
  }
@@ -23838,6 +23166,7 @@ var DATA = {
23838
23166
  "project-management": {
23839
23167
  "meta": {
23840
23168
  "slug": "project-management",
23169
+ "domain": "build",
23841
23170
  "name": "Project Management OS",
23842
23171
  "description": "OKR-first project management workspace. Objectives, key results, projects, sprints, and tasks as connected entities \u2014 navigable from any direction in a relationship graph. Designed for solo founders and small teams who want goal-execution alignment without per-seat overhead.",
23843
23172
  "icon": "kanban-square",
@@ -25919,330 +25248,1197 @@ var DATA = {
25919
25248
  "label": "Due This Week",
25920
25249
  "icon": "calendar"
25921
25250
  }
25922
- },
25251
+ },
25252
+ {
25253
+ "kind": "view",
25254
+ "viewName": "OKR Progress Table",
25255
+ "pos": {
25256
+ "x": 0,
25257
+ "y": 5,
25258
+ "w": 7,
25259
+ "h": 8
25260
+ }
25261
+ },
25262
+ {
25263
+ "kind": "view",
25264
+ "viewName": "Sprint Board",
25265
+ "pos": {
25266
+ "x": 7,
25267
+ "y": 5,
25268
+ "w": 5,
25269
+ "h": 8
25270
+ }
25271
+ },
25272
+ {
25273
+ "kind": "view",
25274
+ "viewName": "Project Timeline",
25275
+ "pos": {
25276
+ "x": 0,
25277
+ "y": 13,
25278
+ "w": 8,
25279
+ "h": 6
25280
+ }
25281
+ },
25282
+ {
25283
+ "kind": "view",
25284
+ "viewName": "Weekly Focus",
25285
+ "pos": {
25286
+ "x": 8,
25287
+ "y": 13,
25288
+ "w": 4,
25289
+ "h": 6
25290
+ }
25291
+ }
25292
+ ]
25293
+ },
25294
+ "profileEntityBentoTemplates": {
25295
+ "okr": {
25296
+ "blocks": [
25297
+ {
25298
+ "id": "okr-eb-header",
25299
+ "kind": "widget",
25300
+ "widgetType": "entity-header",
25301
+ "pos": {
25302
+ "x": 0,
25303
+ "y": 0,
25304
+ "w": 12,
25305
+ "h": 2
25306
+ }
25307
+ },
25308
+ {
25309
+ "id": "okr-eb-props",
25310
+ "kind": "widget",
25311
+ "widgetType": "entity-properties",
25312
+ "pos": {
25313
+ "x": 0,
25314
+ "y": 2,
25315
+ "w": 4,
25316
+ "h": 8
25317
+ }
25318
+ },
25319
+ {
25320
+ "id": "okr-eb-projects",
25321
+ "kind": "widget",
25322
+ "widgetType": "entity-list",
25323
+ "pos": {
25324
+ "x": 4,
25325
+ "y": 2,
25326
+ "w": 8,
25327
+ "h": 4
25328
+ },
25329
+ "config": {
25330
+ "profileSlug": "project",
25331
+ "title": "Projects",
25332
+ "limit": 6,
25333
+ "variant": "compact"
25334
+ }
25335
+ },
25336
+ {
25337
+ "id": "okr-eb-content",
25338
+ "kind": "widget",
25339
+ "widgetType": "entity-content",
25340
+ "pos": {
25341
+ "x": 4,
25342
+ "y": 6,
25343
+ "w": 8,
25344
+ "h": 4
25345
+ }
25346
+ }
25347
+ ]
25348
+ },
25349
+ "project": {
25350
+ "blocks": [
25351
+ {
25352
+ "id": "proj-eb-header",
25353
+ "kind": "widget",
25354
+ "widgetType": "entity-header",
25355
+ "pos": {
25356
+ "x": 0,
25357
+ "y": 0,
25358
+ "w": 12,
25359
+ "h": 2
25360
+ }
25361
+ },
25362
+ {
25363
+ "id": "proj-eb-props",
25364
+ "kind": "widget",
25365
+ "widgetType": "entity-properties",
25366
+ "pos": {
25367
+ "x": 0,
25368
+ "y": 2,
25369
+ "w": 4,
25370
+ "h": 8
25371
+ }
25372
+ },
25373
+ {
25374
+ "id": "proj-eb-tasks",
25375
+ "kind": "widget",
25376
+ "widgetType": "entity-list",
25377
+ "pos": {
25378
+ "x": 4,
25379
+ "y": 2,
25380
+ "w": 8,
25381
+ "h": 4
25382
+ },
25383
+ "config": {
25384
+ "profileSlug": "task",
25385
+ "title": "Tasks",
25386
+ "limit": 8,
25387
+ "variant": "compact"
25388
+ }
25389
+ },
25390
+ {
25391
+ "id": "proj-eb-content",
25392
+ "kind": "widget",
25393
+ "widgetType": "entity-content",
25394
+ "pos": {
25395
+ "x": 4,
25396
+ "y": 6,
25397
+ "w": 8,
25398
+ "h": 4
25399
+ }
25400
+ }
25401
+ ]
25402
+ },
25403
+ "task": {
25404
+ "blocks": [
25405
+ {
25406
+ "id": "task-eb-header",
25407
+ "kind": "widget",
25408
+ "widgetType": "entity-header",
25409
+ "pos": {
25410
+ "x": 0,
25411
+ "y": 0,
25412
+ "w": 12,
25413
+ "h": 2
25414
+ }
25415
+ },
25416
+ {
25417
+ "id": "task-eb-props",
25418
+ "kind": "widget",
25419
+ "widgetType": "entity-properties",
25420
+ "pos": {
25421
+ "x": 0,
25422
+ "y": 2,
25423
+ "w": 5,
25424
+ "h": 8
25425
+ }
25426
+ },
25427
+ {
25428
+ "id": "task-eb-content",
25429
+ "kind": "widget",
25430
+ "widgetType": "entity-content",
25431
+ "pos": {
25432
+ "x": 5,
25433
+ "y": 2,
25434
+ "w": 7,
25435
+ "h": 8
25436
+ }
25437
+ }
25438
+ ]
25439
+ },
25440
+ "sprint": {
25441
+ "blocks": [
25442
+ {
25443
+ "id": "sprint-eb-header",
25444
+ "kind": "widget",
25445
+ "widgetType": "entity-header",
25446
+ "pos": {
25447
+ "x": 0,
25448
+ "y": 0,
25449
+ "w": 12,
25450
+ "h": 2
25451
+ }
25452
+ },
25453
+ {
25454
+ "id": "sprint-eb-props",
25455
+ "kind": "widget",
25456
+ "widgetType": "entity-properties",
25457
+ "pos": {
25458
+ "x": 0,
25459
+ "y": 2,
25460
+ "w": 4,
25461
+ "h": 6
25462
+ }
25463
+ },
25464
+ {
25465
+ "id": "sprint-eb-tasks",
25466
+ "kind": "widget",
25467
+ "widgetType": "entity-list",
25468
+ "pos": {
25469
+ "x": 4,
25470
+ "y": 2,
25471
+ "w": 8,
25472
+ "h": 6
25473
+ },
25474
+ "config": {
25475
+ "profileSlug": "task",
25476
+ "title": "Sprint Tasks",
25477
+ "limit": 10,
25478
+ "variant": "compact"
25479
+ }
25480
+ }
25481
+ ]
25482
+ }
25483
+ },
25484
+ "playbooks": [
25485
+ {
25486
+ "name": "Sprint Retrospective",
25487
+ "goalTemplate": "Run a retrospective for {sprint} to review what went well, what didn't, and what to improve next sprint.",
25488
+ "params": [
25489
+ {
25490
+ "name": "sprint",
25491
+ "type": "entity",
25492
+ "label": "Sprint",
25493
+ "required": true
25494
+ }
25495
+ ]
25496
+ }
25497
+ ],
25498
+ "onboarding": {
25499
+ "goal": "Capture the user's goals, the projects in flight, the current sprint, and who's involved \u2014 so the workspace mirrors how their team actually plans and delivers.",
25500
+ "framing": "Act as a sharp delivery lead / chief of staff. Tease out what outcomes matter this quarter, what's actively being worked, what's in the current cycle, and who owns what. Translate that into OKRs, projects, a sprint, and people.",
25501
+ "expertise": {
25502
+ "starters": [
25503
+ `Don't collect a wishlist of goals \u2014 force ONE north-star metric and 2-3 key results that move it. Propose "the single number that means this quarter succeeded" first, then the handful of measurable KRs under it. Five objectives is zero objectives; a team that's aiming at everything is aiming at nothing.
25504
+ `,
25505
+ `Capture what's actually in flight and impose a WIP limit as you go. Ask "what's genuinely being worked THIS week" \u2014 not the backlog \u2014 and if it's more than the team can finish, that's the finding. Too many projects in progress means nothing ships; the map should make the overload visible.
25506
+ `,
25507
+ 'Every project and KR gets a named owner before anything else. Lead with "who owns this?" \u2014 a goal with no owner is a hope, and it will quietly slip. Capture the person on the project the moment you capture the project; ownerless work is the first thing to surface, not the last.\n'
25508
+ ],
25509
+ "blindSpots": [
25510
+ `"Everything is P1" is the prioritization failure that guarantees the wrong things ship. When every project is Critical, priority carries no information and the team defaults to whatever's loudest. Push back on the priority field \u2014 force a real ranking, because if you can't say what's LESS important, you haven't prioritized at all.
25511
+ `,
25512
+ `A goal with no owner is a hope, and hopes don't ship. Teams write beautiful OKRs with an empty owner field, and the KR that belongs to "the team" belongs to no one. Surface every ownerless objective, project, and KR \u2014 accountability is a name, not a shared intention.
25513
+ `,
25514
+ 'Too much work-in-progress is the silent throughput killer. Founders equate "many things started" with progress, but a dozen 60%-done projects deliver nothing while three finished ones deliver value. Watch the count of In-Progress items and flag when it exceeds what the team can actually close in a cycle.\n'
25515
+ ],
25516
+ "bar": `A great result is a workspace where the line from a single north-star metric down to the task in flight this week is unbroken: one clear objective with measurable KRs, every project and goal owned by a named person, a real priority ranking (not all-P1), and a WIP that matches capacity. You can answer "are we on track, who owns the thing that's slipping, and what should we STOP to ship what matters?" in one look.
25517
+ `
25518
+ },
25519
+ "collect": [
25923
25520
  {
25924
- "kind": "view",
25925
- "viewName": "OKR Progress Table",
25926
- "pos": {
25927
- "x": 0,
25928
- "y": 5,
25929
- "w": 7,
25930
- "h": 8
25931
- }
25521
+ "profileSlug": "okr",
25522
+ "what": "The goals / OKRs that define success this quarter",
25523
+ "cardinality": "few",
25524
+ "keyFields": [
25525
+ "title",
25526
+ "okr-quarter",
25527
+ "okr-owner",
25528
+ "kr1-label"
25529
+ ]
25932
25530
  },
25933
25531
  {
25934
- "kind": "view",
25935
- "viewName": "Sprint Board",
25936
- "pos": {
25937
- "x": 7,
25938
- "y": 5,
25939
- "w": 5,
25940
- "h": 8
25941
- }
25532
+ "profileSlug": "project",
25533
+ "what": "The projects actively in flight and their priority",
25534
+ "cardinality": "several",
25535
+ "keyFields": [
25536
+ "title",
25537
+ "project-status",
25538
+ "project-priority",
25539
+ "project-linked-okr"
25540
+ ]
25942
25541
  },
25943
25542
  {
25944
- "kind": "view",
25945
- "viewName": "Project Timeline",
25946
- "pos": {
25947
- "x": 0,
25948
- "y": 13,
25949
- "w": 8,
25950
- "h": 6
25951
- }
25543
+ "profileSlug": "sprint",
25544
+ "what": "The current cycle / sprint and its goal",
25545
+ "cardinality": "one",
25546
+ "keyFields": [
25547
+ "title",
25548
+ "sprint-goal",
25549
+ "sprint-start",
25550
+ "sprint-end"
25551
+ ]
25952
25552
  },
25953
25553
  {
25954
- "kind": "view",
25955
- "viewName": "Weekly Focus",
25956
- "pos": {
25957
- "x": 8,
25958
- "y": 13,
25959
- "w": 4,
25960
- "h": 6
25961
- }
25554
+ "profileSlug": "person",
25555
+ "what": "The key people on the team and their roles",
25556
+ "cardinality": "several",
25557
+ "keyFields": [
25558
+ "name",
25559
+ "person-role",
25560
+ "person-email"
25561
+ ]
25962
25562
  }
25963
- ]
25563
+ ],
25564
+ "openingQuestions": [
25565
+ "What are the big outcomes you're trying to hit this quarter?",
25566
+ "What projects are actively in flight right now, and which matter most?",
25567
+ "Who's on the team, and what does each person own?"
25568
+ ],
25569
+ "doneWhen": "This quarter's goals exist, active projects are captured with priority, a current sprint is defined, and the core team is on the board."
25570
+ }
25571
+ },
25572
+ "research-base": {
25573
+ "meta": {
25574
+ "slug": "research-base",
25575
+ "domain": "knowledge",
25576
+ "name": "Research",
25577
+ "description": "A research substrate \u2014 turn a question into a fully-recorded investigation. Sources ranked (nothing dropped), hypotheses weighed, findings mapped onto a living graph of fields and concepts.",
25578
+ "icon": "microscope",
25579
+ "color": "#8B5CF6",
25580
+ "tags": [
25581
+ "research",
25582
+ "knowledge",
25583
+ "graph",
25584
+ "sources",
25585
+ "evidence",
25586
+ "learning"
25587
+ ],
25588
+ "isPublic": true
25964
25589
  },
25965
- "profileEntityBentoTemplates": {
25966
- "okr": {
25967
- "blocks": [
25590
+ "workspace": {
25591
+ "name": "Research",
25592
+ "description": "Turn a question into a fully-recorded investigation \u2014 sources ranked, hypotheses weighed, findings mapped onto a living graph of fields and concepts.",
25593
+ "subtype": "research-base",
25594
+ "visibility": "pod_visible",
25595
+ "capabilities": [
25596
+ "research.graph",
25597
+ "research.sources"
25598
+ ],
25599
+ "sourceRoles": {
25600
+ "research": "provider"
25601
+ }
25602
+ },
25603
+ "profiles": [
25604
+ {
25605
+ "slug": "question",
25606
+ "displayName": "Question",
25607
+ "icon": "help-circle",
25608
+ "color": "blue",
25609
+ "description": "An open question driving an investigation \u2014 the thing research answers.",
25610
+ "properties": [
25968
25611
  {
25969
- "id": "okr-eb-header",
25970
- "kind": "widget",
25971
- "widgetType": "entity-header",
25972
- "pos": {
25973
- "x": 0,
25974
- "y": 0,
25975
- "w": 12,
25976
- "h": 2
25612
+ "slug": "questionStatus",
25613
+ "label": "Status",
25614
+ "valueType": "string",
25615
+ "inputType": "select",
25616
+ "enumValues": [
25617
+ "open",
25618
+ "exploring",
25619
+ "answered",
25620
+ "abandoned"
25621
+ ],
25622
+ "constraints": {
25623
+ "defaultValue": "open"
25624
+ }
25625
+ }
25626
+ ]
25627
+ },
25628
+ {
25629
+ "slug": "research",
25630
+ "displayName": "Research",
25631
+ "icon": "microscope",
25632
+ "color": "violet",
25633
+ "description": "An investigation \u2014 the sources consulted, the findings, the confidence, and the conclusion.",
25634
+ "properties": [
25635
+ {
25636
+ "slug": "researchStatus",
25637
+ "label": "Status",
25638
+ "valueType": "string",
25639
+ "inputType": "select",
25640
+ "enumValues": [
25641
+ "ongoing",
25642
+ "concluded",
25643
+ "abandoned"
25644
+ ],
25645
+ "constraints": {
25646
+ "defaultValue": "ongoing"
25647
+ }
25648
+ },
25649
+ {
25650
+ "slug": "conclusion",
25651
+ "label": "Conclusion",
25652
+ "valueType": "string",
25653
+ "inputType": "textarea"
25654
+ },
25655
+ {
25656
+ "slug": "researchConfidence",
25657
+ "label": "Confidence",
25658
+ "valueType": "string",
25659
+ "inputType": "select",
25660
+ "enumValues": [
25661
+ "low",
25662
+ "medium",
25663
+ "high"
25664
+ ]
25665
+ }
25666
+ ]
25667
+ },
25668
+ {
25669
+ "slug": "field",
25670
+ "displayName": "Field",
25671
+ "icon": "layers",
25672
+ "color": "indigo",
25673
+ "description": "A domain of knowledge \u2014 Mathematics, Physics, AI, Philosophy. Fields overlap and feed each other.",
25674
+ "properties": [
25675
+ {
25676
+ "slug": "description",
25677
+ "label": "Description",
25678
+ "valueType": "string",
25679
+ "inputType": "textarea"
25680
+ },
25681
+ {
25682
+ "slug": "aliases",
25683
+ "label": "Also known as",
25684
+ "valueType": "array",
25685
+ "inputType": "tags"
25686
+ }
25687
+ ]
25688
+ },
25689
+ {
25690
+ "slug": "concept",
25691
+ "displayName": "Concept",
25692
+ "icon": "lightbulb",
25693
+ "color": "amber",
25694
+ "description": "An atomic idea \u2014 Bayesian inference, gradient descent, qualia. Belongs to one or more fields; has prerequisites.",
25695
+ "properties": [
25696
+ {
25697
+ "slug": "definition",
25698
+ "label": "Definition",
25699
+ "valueType": "string",
25700
+ "inputType": "textarea"
25701
+ },
25702
+ {
25703
+ "slug": "aliases",
25704
+ "label": "Also known as",
25705
+ "valueType": "array",
25706
+ "inputType": "tags"
25707
+ }
25708
+ ]
25709
+ },
25710
+ {
25711
+ "slug": "source",
25712
+ "displayName": "Source",
25713
+ "icon": "file-text",
25714
+ "color": "cyan",
25715
+ "description": "Anything consulted \u2014 a paper, article, dataset, or post. Ranked by credibility and NEVER discarded; rejected sources are kept with a reason.",
25716
+ "properties": [
25717
+ {
25718
+ "slug": "url",
25719
+ "label": "URL",
25720
+ "valueType": "string",
25721
+ "inputType": "url"
25722
+ },
25723
+ {
25724
+ "slug": "author",
25725
+ "label": "Author",
25726
+ "valueType": "string",
25727
+ "inputType": "text"
25728
+ },
25729
+ {
25730
+ "slug": "publishedAt",
25731
+ "label": "Published",
25732
+ "valueType": "date",
25733
+ "inputType": "date"
25734
+ },
25735
+ {
25736
+ "slug": "sourceType",
25737
+ "label": "Type",
25738
+ "valueType": "string",
25739
+ "inputType": "select",
25740
+ "enumValues": [
25741
+ "paper",
25742
+ "article",
25743
+ "book",
25744
+ "dataset",
25745
+ "blog",
25746
+ "video",
25747
+ "forum",
25748
+ "other"
25749
+ ],
25750
+ "constraints": {
25751
+ "defaultValue": "article"
25752
+ }
25753
+ },
25754
+ {
25755
+ "slug": "credibilityBand",
25756
+ "label": "Credibility",
25757
+ "valueType": "string",
25758
+ "inputType": "select",
25759
+ "enumValues": [
25760
+ "high",
25761
+ "medium",
25762
+ "low",
25763
+ "unknown"
25764
+ ],
25765
+ "constraints": {
25766
+ "defaultValue": "unknown"
25977
25767
  }
25978
25768
  },
25979
25769
  {
25980
- "id": "okr-eb-props",
25981
- "kind": "widget",
25982
- "widgetType": "entity-properties",
25983
- "pos": {
25984
- "x": 0,
25985
- "y": 2,
25986
- "w": 4,
25987
- "h": 8
25770
+ "slug": "qualityScore",
25771
+ "label": "Quality (0\u2013100)",
25772
+ "valueType": "number",
25773
+ "inputType": "number",
25774
+ "constraints": {
25775
+ "min": 0,
25776
+ "max": 100
25988
25777
  }
25989
25778
  },
25990
25779
  {
25991
- "id": "okr-eb-projects",
25992
- "kind": "widget",
25993
- "widgetType": "entity-list",
25994
- "pos": {
25995
- "x": 4,
25996
- "y": 2,
25997
- "w": 8,
25998
- "h": 4
25999
- },
26000
- "config": {
26001
- "profileSlug": "project",
26002
- "title": "Projects",
26003
- "limit": 6,
26004
- "variant": "compact"
25780
+ "slug": "status",
25781
+ "label": "Status",
25782
+ "valueType": "string",
25783
+ "inputType": "select",
25784
+ "enumValues": [
25785
+ "cited",
25786
+ "considered",
25787
+ "rejected"
25788
+ ],
25789
+ "constraints": {
25790
+ "defaultValue": "considered"
26005
25791
  }
26006
25792
  },
26007
25793
  {
26008
- "id": "okr-eb-content",
26009
- "kind": "widget",
26010
- "widgetType": "entity-content",
26011
- "pos": {
26012
- "x": 4,
26013
- "y": 6,
26014
- "w": 8,
26015
- "h": 4
26016
- }
25794
+ "slug": "whyRejected",
25795
+ "label": "Why rejected",
25796
+ "valueType": "string",
25797
+ "inputType": "textarea"
25798
+ },
25799
+ {
25800
+ "slug": "retrievedAt",
25801
+ "label": "Retrieved",
25802
+ "valueType": "date",
25803
+ "inputType": "date"
26017
25804
  }
26018
25805
  ]
26019
25806
  },
26020
- "project": {
26021
- "blocks": [
25807
+ {
25808
+ "slug": "hypothesis",
25809
+ "displayName": "Hypothesis",
25810
+ "icon": "git-branch",
25811
+ "color": "violet",
25812
+ "description": "A candidate theory or answer under test \u2014 argued for and against by sources.",
25813
+ "properties": [
26022
25814
  {
26023
- "id": "proj-eb-header",
26024
- "kind": "widget",
26025
- "widgetType": "entity-header",
26026
- "pos": {
26027
- "x": 0,
26028
- "y": 0,
26029
- "w": 12,
26030
- "h": 2
26031
- }
25815
+ "slug": "statement",
25816
+ "label": "Statement",
25817
+ "valueType": "string",
25818
+ "inputType": "textarea"
26032
25819
  },
26033
25820
  {
26034
- "id": "proj-eb-props",
26035
- "kind": "widget",
26036
- "widgetType": "entity-properties",
26037
- "pos": {
26038
- "x": 0,
26039
- "y": 2,
26040
- "w": 4,
26041
- "h": 8
25821
+ "slug": "stance",
25822
+ "label": "Stance",
25823
+ "valueType": "string",
25824
+ "inputType": "select",
25825
+ "enumValues": [
25826
+ "proposed",
25827
+ "supported",
25828
+ "contested",
25829
+ "refuted",
25830
+ "superseded"
25831
+ ],
25832
+ "constraints": {
25833
+ "defaultValue": "proposed"
26042
25834
  }
26043
25835
  },
26044
25836
  {
26045
- "id": "proj-eb-tasks",
26046
- "kind": "widget",
26047
- "widgetType": "entity-list",
26048
- "pos": {
26049
- "x": 4,
26050
- "y": 2,
26051
- "w": 8,
26052
- "h": 4
26053
- },
26054
- "config": {
26055
- "profileSlug": "task",
26056
- "title": "Tasks",
26057
- "limit": 8,
26058
- "variant": "compact"
26059
- }
25837
+ "slug": "confidence",
25838
+ "label": "Confidence",
25839
+ "valueType": "string",
25840
+ "inputType": "select",
25841
+ "enumValues": [
25842
+ "low",
25843
+ "medium",
25844
+ "high"
25845
+ ]
26060
25846
  },
26061
25847
  {
26062
- "id": "proj-eb-content",
26063
- "kind": "widget",
26064
- "widgetType": "entity-content",
26065
- "pos": {
26066
- "x": 4,
26067
- "y": 6,
26068
- "w": 8,
26069
- "h": 4
26070
- }
25848
+ "slug": "reasoning",
25849
+ "label": "Reasoning",
25850
+ "valueType": "string",
25851
+ "inputType": "textarea"
26071
25852
  }
26072
25853
  ]
26073
25854
  },
26074
- "task": {
26075
- "blocks": [
25855
+ {
25856
+ "slug": "finding",
25857
+ "displayName": "Finding",
25858
+ "icon": "check-circle",
25859
+ "color": "#10B981",
25860
+ "description": "A validated fact \u2014 the thing established between the question, the sources, and the reasoning. Carries calibrated confidence and links to its evidence.",
25861
+ "properties": [
26076
25862
  {
26077
- "id": "task-eb-header",
26078
- "kind": "widget",
26079
- "widgetType": "entity-header",
26080
- "pos": {
26081
- "x": 0,
26082
- "y": 0,
26083
- "w": 12,
26084
- "h": 2
26085
- }
25863
+ "slug": "claim",
25864
+ "label": "Claim",
25865
+ "valueType": "string",
25866
+ "inputType": "textarea"
26086
25867
  },
26087
25868
  {
26088
- "id": "task-eb-props",
26089
- "kind": "widget",
26090
- "widgetType": "entity-properties",
26091
- "pos": {
26092
- "x": 0,
26093
- "y": 2,
26094
- "w": 5,
26095
- "h": 8
25869
+ "slug": "confidence",
25870
+ "label": "Confidence (0\u20131)",
25871
+ "valueType": "number",
25872
+ "inputType": "number",
25873
+ "constraints": {
25874
+ "min": 0,
25875
+ "max": 1
26096
25876
  }
26097
25877
  },
26098
25878
  {
26099
- "id": "task-eb-content",
26100
- "kind": "widget",
26101
- "widgetType": "entity-content",
26102
- "pos": {
26103
- "x": 5,
26104
- "y": 2,
26105
- "w": 7,
26106
- "h": 8
25879
+ "slug": "evidenceSummary",
25880
+ "label": "Evidence summary",
25881
+ "valueType": "string",
25882
+ "inputType": "textarea"
25883
+ },
25884
+ {
25885
+ "slug": "status",
25886
+ "label": "Status",
25887
+ "valueType": "string",
25888
+ "inputType": "select",
25889
+ "enumValues": [
25890
+ "validated",
25891
+ "provisional",
25892
+ "retracted"
25893
+ ],
25894
+ "constraints": {
25895
+ "defaultValue": "provisional"
26107
25896
  }
26108
25897
  }
26109
25898
  ]
25899
+ }
25900
+ ],
25901
+ "views": [
25902
+ {
25903
+ "name": "Knowledge Map",
25904
+ "slug": "research-knowledge-map",
25905
+ "type": "graph",
25906
+ "scopeProfileSlugs": [
25907
+ "field",
25908
+ "concept",
25909
+ "finding"
25910
+ ],
25911
+ "description": "The cartography \u2014 fields and concepts, their overlaps and prerequisites, and the findings attached to them.",
25912
+ "defaultView": true,
25913
+ "config": {
25914
+ "layout": "force",
25915
+ "showRelations": true
25916
+ }
25917
+ },
25918
+ {
25919
+ "name": "Open Questions",
25920
+ "slug": "research-open-questions",
25921
+ "type": "list",
25922
+ "scopeProfileSlug": "question",
25923
+ "description": "Questions still open \u2014 the research backlog.",
25924
+ "config": {
25925
+ "filterBy": {
25926
+ "field": "questionStatus",
25927
+ "operator": "is",
25928
+ "value": "open"
25929
+ }
25930
+ }
25931
+ },
25932
+ {
25933
+ "name": "Sources",
25934
+ "slug": "research-sources",
25935
+ "type": "table",
25936
+ "scopeProfileSlug": "source",
25937
+ "description": "Every source consulted, ranked by credibility \u2014 including the ones that were considered and rejected.",
25938
+ "config": {
25939
+ "columns": [
25940
+ "title",
25941
+ "sourceType",
25942
+ "credibilityBand",
25943
+ "qualityScore",
25944
+ "status"
25945
+ ]
25946
+ }
25947
+ },
25948
+ {
25949
+ "name": "Hypotheses",
25950
+ "slug": "research-hypotheses",
25951
+ "type": "kanban",
25952
+ "scopeProfileSlug": "hypothesis",
25953
+ "groupBy": "stance",
25954
+ "description": "Candidate theories, grouped by where the evidence has left them.",
25955
+ "config": {
25956
+ "groupBy": "stance"
25957
+ }
25958
+ },
25959
+ {
25960
+ "name": "Findings",
25961
+ "slug": "research-findings",
25962
+ "type": "table",
25963
+ "scopeProfileSlug": "finding",
25964
+ "description": "What's been established, with its confidence.",
25965
+ "config": {
25966
+ "columns": [
25967
+ "title",
25968
+ "confidence",
25969
+ "status"
25970
+ ]
25971
+ }
25972
+ },
25973
+ {
25974
+ "name": "Research Log",
25975
+ "slug": "research-log",
25976
+ "type": "table",
25977
+ "scopeProfileSlug": "research",
25978
+ "description": "Every investigation and where it stands.",
25979
+ "config": {
25980
+ "columns": [
25981
+ "title",
25982
+ "researchStatus",
25983
+ "researchConfidence"
25984
+ ]
25985
+ }
25986
+ }
25987
+ ],
25988
+ "entityLinks": [
25989
+ {
25990
+ "sourceProfileSlug": "field",
25991
+ "targetProfileSlug": "field",
25992
+ "type": "overlaps_with",
25993
+ "label": "Overlaps with"
25994
+ },
25995
+ {
25996
+ "sourceProfileSlug": "concept",
25997
+ "targetProfileSlug": "field",
25998
+ "type": "part_of",
25999
+ "label": "Part of"
26000
+ },
26001
+ {
26002
+ "sourceProfileSlug": "concept",
26003
+ "targetProfileSlug": "concept",
26004
+ "type": "prerequisite_of",
26005
+ "label": "Prerequisite of"
26006
+ },
26007
+ {
26008
+ "sourceProfileSlug": "concept",
26009
+ "targetProfileSlug": "concept",
26010
+ "type": "relates_to",
26011
+ "label": "Relates to"
26012
+ },
26013
+ {
26014
+ "sourceProfileSlug": "research",
26015
+ "targetProfileSlug": "question",
26016
+ "type": "investigates",
26017
+ "label": "Investigates"
26018
+ },
26019
+ {
26020
+ "sourceProfileSlug": "hypothesis",
26021
+ "targetProfileSlug": "question",
26022
+ "type": "answers",
26023
+ "label": "Answers"
26024
+ },
26025
+ {
26026
+ "sourceProfileSlug": "research",
26027
+ "targetProfileSlug": "source",
26028
+ "type": "explored",
26029
+ "label": "Explored"
26030
+ },
26031
+ {
26032
+ "sourceProfileSlug": "research",
26033
+ "targetProfileSlug": "finding",
26034
+ "type": "concluded",
26035
+ "label": "Concluded"
26036
+ },
26037
+ {
26038
+ "sourceProfileSlug": "source",
26039
+ "targetProfileSlug": "hypothesis",
26040
+ "type": "supports",
26041
+ "label": "Supports"
26042
+ },
26043
+ {
26044
+ "sourceProfileSlug": "source",
26045
+ "targetProfileSlug": "hypothesis",
26046
+ "type": "contradicts",
26047
+ "label": "Contradicts"
26048
+ },
26049
+ {
26050
+ "sourceProfileSlug": "source",
26051
+ "targetProfileSlug": "source",
26052
+ "type": "cites",
26053
+ "label": "Cites"
26054
+ },
26055
+ {
26056
+ "sourceProfileSlug": "finding",
26057
+ "targetProfileSlug": "research",
26058
+ "type": "derived_from",
26059
+ "label": "Derived from"
26060
+ },
26061
+ {
26062
+ "sourceProfileSlug": "finding",
26063
+ "targetProfileSlug": "source",
26064
+ "type": "supported_by",
26065
+ "label": "Supported by"
26110
26066
  },
26111
- "sprint": {
26112
- "blocks": [
26113
- {
26114
- "id": "sprint-eb-header",
26115
- "kind": "widget",
26116
- "widgetType": "entity-header",
26117
- "pos": {
26118
- "x": 0,
26119
- "y": 0,
26120
- "w": 12,
26121
- "h": 2
26122
- }
26123
- },
26124
- {
26125
- "id": "sprint-eb-props",
26126
- "kind": "widget",
26127
- "widgetType": "entity-properties",
26128
- "pos": {
26129
- "x": 0,
26130
- "y": 2,
26131
- "w": 4,
26132
- "h": 6
26133
- }
26134
- },
26135
- {
26136
- "id": "sprint-eb-tasks",
26137
- "kind": "widget",
26138
- "widgetType": "entity-list",
26139
- "pos": {
26140
- "x": 4,
26141
- "y": 2,
26142
- "w": 8,
26143
- "h": 6
26144
- },
26145
- "config": {
26146
- "profileSlug": "task",
26147
- "title": "Sprint Tasks",
26148
- "limit": 10,
26149
- "variant": "compact"
26150
- }
26151
- }
26152
- ]
26067
+ {
26068
+ "sourceProfileSlug": "finding",
26069
+ "targetProfileSlug": "concept",
26070
+ "type": "about",
26071
+ "label": "About"
26153
26072
  }
26154
- },
26073
+ ],
26155
26074
  "playbooks": [
26156
26075
  {
26157
- "name": "Sprint Retrospective",
26158
- "goalTemplate": "Run a retrospective for {sprint} to review what went well, what didn't, and what to improve next sprint.",
26076
+ "name": "Research a Question",
26077
+ "description": "Investigate a question end-to-end \u2014 gather and rank sources (keeping the rejected ones), weigh hypotheses, emit findings with calibrated confidence, and map them onto the knowledge graph.",
26078
+ "goalTemplate": "Investigate the question {question} and record the WHOLE investigation, not just the answer. Steps: (1) Use the source-triage skill to gather sources widely via web search, classify each by type and credibility, and create a `source` entity for every one \u2014 including the ones you rejected, marked rejected with a reason (never silently drop a source). (2) Form the candidate answers as `hypothesis` entities and link each to the question; link every source that bears on a hypothesis with `supports` or `contradicts`. (3) Use the evidence-synthesis skill to weigh the supporting vs contradicting sources and emit `finding` entities with honestly calibrated confidence, each `supported_by` its sources and `derived_from` this research. (4) Use the concept-cartography skill to place the findings onto the knowledge map \u2014 resolve or create the `field`/`concept` entities and wire `about` / `part_of` / `overlaps_with` / `prerequisite_of` edges, deduping against what already exists. (5) Create the `research` entity that `investigates` the question and `explored` the sources, write its conclusion and confidence, and set the question's status to answered. Every write is proposal-gated and reviewable.",
26079
+ "subjectProfile": {
26080
+ "profileSlug": "question"
26081
+ },
26159
26082
  "params": [
26160
26083
  {
26161
- "name": "sprint",
26084
+ "name": "question",
26162
26085
  "type": "entity",
26163
- "label": "Sprint",
26086
+ "label": "Question",
26164
26087
  "required": true
26165
26088
  }
26166
- ]
26089
+ ],
26090
+ "executor": "is-agent",
26091
+ "grants": [
26092
+ "source-triage",
26093
+ "evidence-synthesis",
26094
+ "concept-cartography",
26095
+ "exa_search",
26096
+ "entity.create"
26097
+ ],
26098
+ "status": "active"
26099
+ }
26100
+ ],
26101
+ "actionPlacements": [
26102
+ {
26103
+ "profileSlug": "question",
26104
+ "surface": "entity-detail",
26105
+ "kind": "playbook",
26106
+ "ref": "Research a Question",
26107
+ "label": "Research this"
26108
+ }
26109
+ ],
26110
+ "integrations": [
26111
+ {
26112
+ "templateKey": "research-methods"
26113
+ },
26114
+ {
26115
+ "templateKey": "exa"
26167
26116
  }
26168
26117
  ],
26169
26118
  "onboarding": {
26170
- "goal": "Capture the user's goals, the projects in flight, the current sprint, and who's involved \u2014 so the workspace mirrors how their team actually plans and delivers.",
26171
- "framing": "Act as a sharp delivery lead / chief of staff. Tease out what outcomes matter this quarter, what's actively being worked, what's in the current cycle, and who owns what. Translate that into OKRs, projects, a sprint, and people.",
26119
+ "goal": "Seed the workspace with the first real questions worth researching and the fields they live in \u2014 so the agent has something concrete to investigate, not a blank graph.\n",
26120
+ "framing": `THE RESEARCH LEAD: Act as a sharp research lead who cares about the QUESTION
26121
+ being well-formed and the EVIDENCE being honest. A vague question ("learn
26122
+ about AI") produces vague research; push for a question with a real edge \u2014 one
26123
+ a good answer would actually change. And insist the work keeps its
26124
+ counter-evidence: research that only kept what agreed with it isn't research.
26125
+ `,
26172
26126
  "expertise": {
26173
26127
  "starters": [
26174
- `Don't collect a wishlist of goals \u2014 force ONE north-star metric and 2-3 key results that move it. Propose "the single number that means this quarter succeeded" first, then the handful of measurable KRs under it. Five objectives is zero objectives; a team that's aiming at everything is aiming at nothing.
26175
- `,
26176
- `Capture what's actually in flight and impose a WIP limit as you go. Ask "what's genuinely being worked THIS week" \u2014 not the backlog \u2014 and if it's more than the team can finish, that's the finding. Too many projects in progress means nothing ships; the map should make the overload visible.
26177
- `,
26178
- 'Every project and KR gets a named owner before anything else. Lead with "who owns this?" \u2014 a goal with no owner is a hope, and it will quietly slip. Capture the person on the project the moment you capture the project; ownerless work is the first thing to surface, not the last.\n'
26128
+ 'A researchable question names what would count as an answer. "Is X better than Y for Z?" beats "tell me about X" \u2014 the first has a shape the evidence can fill; the second is a topic, not a question.\n',
26129
+ "Name the field(s) the question lives in up front \u2014 even roughly. It's the first anchor on the map, and it's what lets the system later surface the neighbouring field you didn't think to look in.\n"
26179
26130
  ],
26180
26131
  "blindSpots": [
26181
- `"Everything is P1" is the prioritization failure that guarantees the wrong things ship. When every project is Critical, priority carries no information and the team defaults to whatever's loudest. Push back on the priority field \u2014 force a real ranking, because if you can't say what's LESS important, you haven't prioritized at all.
26182
- `,
26183
- `A goal with no owner is a hope, and hopes don't ship. Teams write beautiful OKRs with an empty owner field, and the KR that belongs to "the team" belongs to no one. Surface every ownerless objective, project, and KR \u2014 accountability is a name, not a shared intention.
26184
- `,
26185
- 'Too much work-in-progress is the silent throughput killer. Founders equate "many things started" with progress, but a dozen 60%-done projects deliver nothing while three finished ones deliver value. Watch the count of In-Progress items and flag when it exceeds what the team can actually close in a cycle.\n'
26186
- ],
26187
- "bar": `A great result is a workspace where the line from a single north-star metric down to the task in flight this week is unbroken: one clear objective with measurable KRs, every project and goal owned by a named person, a real priority ranking (not all-P1), and a WIP that matches capacity. You can answer "are we on track, who owns the thing that's slipping, and what should we STOP to ship what matters?" in one look.
26188
- `
26132
+ "The most valuable sources are often the ones that DISAGREE. If the founder only wants confirmation, say plainly that a one-sided answer is a weaker answer \u2014 the method keeps both sides on purpose.\n",
26133
+ '"I already know the answer" is where research quietly stops being research. If the conclusion is decided before the sources are gathered, flag it \u2014 the point is to be able to be wrong.\n'
26134
+ ]
26189
26135
  },
26190
26136
  "collect": [
26191
26137
  {
26192
- "profileSlug": "okr",
26193
- "what": "The goals / OKRs that define success this quarter",
26138
+ "profileSlug": "question",
26139
+ "what": "The first real questions worth investigating \u2014 each with a genuine edge, not a topic.",
26194
26140
  "cardinality": "few",
26195
26141
  "keyFields": [
26196
- "title",
26197
- "okr-quarter",
26198
- "okr-owner",
26199
- "kr1-label"
26142
+ "questionStatus"
26200
26143
  ]
26201
26144
  },
26202
26145
  {
26203
- "profileSlug": "project",
26204
- "what": "The projects actively in flight and their priority",
26205
- "cardinality": "several",
26146
+ "profileSlug": "field",
26147
+ "what": "The fields these questions live in \u2014 the first anchors on the knowledge map.",
26148
+ "cardinality": "few",
26206
26149
  "keyFields": [
26207
- "title",
26208
- "project-status",
26209
- "project-priority",
26210
- "project-linked-okr"
26150
+ "description"
26211
26151
  ]
26152
+ }
26153
+ ],
26154
+ "openingQuestions": [
26155
+ "What's a question you actually want a well-evidenced answer to \u2014 one where a good answer would change what you do?",
26156
+ "Which field(s) does it sit in \u2014 and is there a neighbouring field it might borrow from?",
26157
+ "What would count as a convincing answer, and what would change your mind?"
26158
+ ],
26159
+ "doneWhen": "At least one well-formed question captured with its field(s) anchored on the map, ready for the Research a Question playbook to run against.\n"
26160
+ },
26161
+ "app": {
26162
+ "kind": "stored",
26163
+ "cellKey": "entity-detail"
26164
+ },
26165
+ "layout": {
26166
+ "defaultView": "Knowledge Map",
26167
+ "defaultApp": null,
26168
+ "pinnedApps": [
26169
+ "dashboard",
26170
+ "data",
26171
+ "chat"
26172
+ ],
26173
+ "sidebarItems": [
26174
+ {
26175
+ "kind": "view",
26176
+ "viewName": "Knowledge Map",
26177
+ "label": "Map",
26178
+ "icon": "layers"
26212
26179
  },
26213
26180
  {
26214
- "profileSlug": "sprint",
26215
- "what": "The current cycle / sprint and its goal",
26216
- "cardinality": "one",
26217
- "keyFields": [
26181
+ "kind": "view",
26182
+ "viewName": "Open Questions",
26183
+ "label": "Questions",
26184
+ "icon": "help-circle"
26185
+ },
26186
+ {
26187
+ "kind": "view",
26188
+ "viewName": "Sources",
26189
+ "label": "Sources",
26190
+ "icon": "file-text"
26191
+ },
26192
+ {
26193
+ "kind": "view",
26194
+ "viewName": "Findings",
26195
+ "label": "Findings",
26196
+ "icon": "check-circle"
26197
+ },
26198
+ {
26199
+ "kind": "app",
26200
+ "appId": "data",
26201
+ "label": "Data",
26202
+ "icon": "database"
26203
+ }
26204
+ ]
26205
+ },
26206
+ "bento": {
26207
+ "viewName": "Research Home",
26208
+ "blocks": [
26209
+ {
26210
+ "kind": "view",
26211
+ "viewName": "Knowledge Map",
26212
+ "pos": {
26213
+ "x": 0,
26214
+ "y": 0,
26215
+ "w": 8,
26216
+ "h": 6
26217
+ }
26218
+ },
26219
+ {
26220
+ "kind": "view",
26221
+ "viewName": "Open Questions",
26222
+ "pos": {
26223
+ "x": 8,
26224
+ "y": 0,
26225
+ "w": 4,
26226
+ "h": 3
26227
+ }
26228
+ },
26229
+ {
26230
+ "kind": "view",
26231
+ "viewName": "Findings",
26232
+ "pos": {
26233
+ "x": 8,
26234
+ "y": 3,
26235
+ "w": 4,
26236
+ "h": 3
26237
+ }
26238
+ }
26239
+ ]
26240
+ }
26241
+ },
26242
+ "research-decision": {
26243
+ "meta": {
26244
+ "slug": "research-decision",
26245
+ "domain": "knowledge",
26246
+ "name": "Decision Analysis",
26247
+ "description": "Turn an open question into a decision \u2014 options weighed with evidence, and the roads-not-taken preserved with the reasons they lost. Composes onto the Research substrate.",
26248
+ "icon": "scale",
26249
+ "color": "#F59E0B",
26250
+ "tags": [
26251
+ "research",
26252
+ "decision",
26253
+ "ibis",
26254
+ "analysis",
26255
+ "evidence"
26256
+ ],
26257
+ "isPublic": true
26258
+ },
26259
+ "workspace": {
26260
+ "name": "Research",
26261
+ "description": "Adds the IBIS decision-analysis method to the Research substrate \u2014 weigh options with evidence and record the decision, not just the winner.",
26262
+ "subtype": "research-base"
26263
+ },
26264
+ "dependencies": [
26265
+ {
26266
+ "slug": "research-base",
26267
+ "relation": "compose",
26268
+ "reason": "Decision Analysis is a research method \u2014 it needs the Research substrate (question / source / hypothesis / finding) to work over."
26269
+ }
26270
+ ],
26271
+ "profiles": [
26272
+ {
26273
+ "slug": "question",
26274
+ "displayName": "Question",
26275
+ "icon": "help-circle",
26276
+ "color": "blue",
26277
+ "description": "The open question being decided.",
26278
+ "properties": [
26279
+ {
26280
+ "slug": "questionStatus",
26281
+ "label": "Status",
26282
+ "valueType": "string",
26283
+ "inputType": "select",
26284
+ "enumValues": [
26285
+ "open",
26286
+ "exploring",
26287
+ "answered",
26288
+ "abandoned"
26289
+ ],
26290
+ "constraints": {
26291
+ "defaultValue": "open"
26292
+ }
26293
+ }
26294
+ ]
26295
+ },
26296
+ {
26297
+ "slug": "hypothesis",
26298
+ "displayName": "Option",
26299
+ "icon": "git-branch",
26300
+ "color": "violet",
26301
+ "description": "A candidate option under consideration \u2014 argued for and against by sources.",
26302
+ "properties": [
26303
+ {
26304
+ "slug": "stance",
26305
+ "label": "Stance",
26306
+ "valueType": "string",
26307
+ "inputType": "select",
26308
+ "enumValues": [
26309
+ "proposed",
26310
+ "supported",
26311
+ "contested",
26312
+ "refuted",
26313
+ "superseded"
26314
+ ],
26315
+ "constraints": {
26316
+ "defaultValue": "proposed"
26317
+ }
26318
+ }
26319
+ ]
26320
+ },
26321
+ {
26322
+ "slug": "decision",
26323
+ "displayName": "Decision",
26324
+ "icon": "scale",
26325
+ "color": "amber",
26326
+ "description": "A resolved decision \u2014 the recommendation, why it won, and the alternatives that lost (and why).",
26327
+ "properties": [
26328
+ {
26329
+ "slug": "summary",
26330
+ "label": "Summary",
26331
+ "valueType": "string",
26332
+ "inputType": "text"
26333
+ },
26334
+ {
26335
+ "slug": "rationale",
26336
+ "label": "Rationale",
26337
+ "valueType": "string",
26338
+ "inputType": "textarea"
26339
+ },
26340
+ {
26341
+ "slug": "alternatives",
26342
+ "label": "Alternatives considered",
26343
+ "valueType": "string",
26344
+ "inputType": "textarea"
26345
+ },
26346
+ {
26347
+ "slug": "decisionStatus",
26348
+ "label": "Status",
26349
+ "valueType": "string",
26350
+ "inputType": "select",
26351
+ "enumValues": [
26352
+ "proposed",
26353
+ "accepted",
26354
+ "superseded",
26355
+ "rejected"
26356
+ ],
26357
+ "constraints": {
26358
+ "defaultValue": "proposed"
26359
+ }
26360
+ }
26361
+ ]
26362
+ }
26363
+ ],
26364
+ "views": [
26365
+ {
26366
+ "name": "Decisions",
26367
+ "slug": "research-decisions",
26368
+ "type": "table",
26369
+ "scopeProfileSlug": "decision",
26370
+ "description": "Every decision reached, its recommendation, and where it stands.",
26371
+ "config": {
26372
+ "columns": [
26218
26373
  "title",
26219
- "sprint-goal",
26220
- "sprint-start",
26221
- "sprint-end"
26222
- ]
26223
- },
26224
- {
26225
- "profileSlug": "person",
26226
- "what": "The key people on the team and their roles",
26227
- "cardinality": "several",
26228
- "keyFields": [
26229
- "name",
26230
- "person-role",
26231
- "person-email"
26374
+ "summary",
26375
+ "decisionStatus"
26232
26376
  ]
26233
26377
  }
26234
- ],
26235
- "openingQuestions": [
26236
- "What are the big outcomes you're trying to hit this quarter?",
26237
- "What projects are actively in flight right now, and which matter most?",
26238
- "Who's on the team, and what does each person own?"
26239
- ],
26240
- "doneWhen": "This quarter's goals exist, active projects are captured with priority, a current sprint is defined, and the core team is on the board."
26241
- }
26378
+ }
26379
+ ],
26380
+ "entityLinks": [
26381
+ {
26382
+ "sourceProfileSlug": "decision",
26383
+ "targetProfileSlug": "question",
26384
+ "type": "resolves",
26385
+ "label": "Resolves"
26386
+ },
26387
+ {
26388
+ "sourceProfileSlug": "hypothesis",
26389
+ "targetProfileSlug": "decision",
26390
+ "type": "considered_in",
26391
+ "label": "Considered in"
26392
+ }
26393
+ ],
26394
+ "playbooks": [
26395
+ {
26396
+ "name": "Decision Analysis",
26397
+ "description": "Structure an open question as a decision via IBIS \u2014 enumerate the options, argue each with evidence (keeping the rejected sources), weigh against explicit criteria, and record the decision with its roads-not-taken.",
26398
+ "goalTemplate": "Analyze the question {question} as a DECISION and record the reasoning, not just the verdict, using the ibis-decision-analysis skill. Steps: (1) State the issue sharply so the options are genuinely mutually exclusive. (2) Enumerate the real options \u2014 including the status-quo \u2014 as `hypothesis` entities linked to the question, and to the resulting decision via `considered_in`. (3) For each option, gather the sources that `supports` and those that `contradicts` it (use source gathering; KEEP the rejected sources with a reason \u2014 never drop the counter-evidence). (4) Weigh the options against explicit, named criteria (cost, reversibility, risk, time, evidence strength). (5) Record the recommendation as a `decision` entity that `resolves` the question \u2014 its rationale explains why it won, and its `alternatives` field preserves the options that lost and WHY. (6) Note what evidence would change the decision. Every write is proposal-gated.",
26399
+ "subjectProfile": {
26400
+ "profileSlug": "question"
26401
+ },
26402
+ "params": [
26403
+ {
26404
+ "name": "question",
26405
+ "type": "entity",
26406
+ "label": "Question",
26407
+ "required": true
26408
+ }
26409
+ ],
26410
+ "executor": "is-agent",
26411
+ "grants": [
26412
+ "ibis-decision-analysis",
26413
+ "source-triage",
26414
+ "exa_search",
26415
+ "entity.create"
26416
+ ],
26417
+ "status": "active"
26418
+ }
26419
+ ],
26420
+ "actionPlacements": [
26421
+ {
26422
+ "profileSlug": "question",
26423
+ "surface": "entity-detail",
26424
+ "kind": "playbook",
26425
+ "ref": "Decision Analysis",
26426
+ "label": "Analyze as decision"
26427
+ }
26428
+ ],
26429
+ "integrations": [
26430
+ {
26431
+ "templateKey": "research-methods"
26432
+ },
26433
+ {
26434
+ "templateKey": "exa"
26435
+ }
26436
+ ]
26242
26437
  },
26243
26438
  "social": {
26244
26439
  "meta": {
26245
26440
  "slug": "social",
26441
+ "domain": "content",
26246
26442
  "name": "Social",
26247
26443
  "description": "Plan, schedule, and publish across your channels \u2014 then track how each post performs. Channels, posts, schedules, and engagement signals, all connected.",
26248
26444
  "icon": "share-2",
@@ -26255,6 +26451,14 @@ var DATA = {
26255
26451
  ],
26256
26452
  "isPublic": true
26257
26453
  },
26454
+ "dependencies": [
26455
+ {
26456
+ "slug": "content-os",
26457
+ "kind": "workspace",
26458
+ "relation": "require",
26459
+ "reason": "Reuses Content OS's shared platform (publishing-account) vocabulary."
26460
+ }
26461
+ ],
26258
26462
  "workspace": {
26259
26463
  "name": "Social",
26260
26464
  "description": "The distribution layer \u2014 the channels you publish on, the posts and schedules that pace them, and the engagement signals that tell you what's working.",
@@ -26273,59 +26477,110 @@ var DATA = {
26273
26477
  },
26274
26478
  "profiles": [
26275
26479
  {
26276
- "slug": "channel",
26277
- "displayName": "Channel",
26278
- "icon": "radio",
26279
- "color": "#1D9BF0",
26280
- "description": "A social account you publish on \u2014 a platform, a handle, and its audience.",
26480
+ "slug": "platform",
26481
+ "displayName": "Platform",
26482
+ "icon": "share-2",
26483
+ "color": "#06B6D4",
26484
+ "description": "A social account, newsletter publication, or podcast channel. Each platform has its own audience metrics and publishing rhythm.",
26485
+ "scope": "shared",
26281
26486
  "properties": [
26282
26487
  {
26283
- "slug": "platform",
26284
- "label": "Platform",
26488
+ "slug": "platform-type",
26489
+ "label": "Type",
26285
26490
  "valueType": "string",
26286
26491
  "inputType": "select",
26287
26492
  "enumValues": [
26288
- "x",
26289
- "linkedin",
26290
- "instagram",
26291
- "tiktok",
26292
- "youtube",
26293
- "facebook",
26294
- "threads",
26295
- "other"
26493
+ "LinkedIn",
26494
+ "Instagram",
26495
+ "TikTok",
26496
+ "YouTube",
26497
+ "Twitter / X",
26498
+ "Threads",
26499
+ "Bluesky",
26500
+ "Newsletter",
26501
+ "Podcast",
26502
+ "Blog / Website",
26503
+ "Other"
26296
26504
  ]
26297
26505
  },
26298
26506
  {
26299
26507
  "slug": "handle",
26300
26508
  "label": "Handle",
26301
26509
  "valueType": "string",
26302
- "inputType": "text"
26510
+ "inputType": "text",
26511
+ "placeholder": "@username"
26303
26512
  },
26304
26513
  {
26305
- "slug": "channel-url",
26306
- "label": "URL",
26514
+ "slug": "platform-status",
26515
+ "label": "Status",
26307
26516
  "valueType": "string",
26308
- "inputType": "url"
26517
+ "inputType": "select",
26518
+ "enumValues": [
26519
+ "Active",
26520
+ "Building",
26521
+ "Maintenance Mode",
26522
+ "Inactive"
26523
+ ]
26524
+ },
26525
+ {
26526
+ "slug": "platform-url",
26527
+ "label": "Profile URL",
26528
+ "valueType": "string",
26529
+ "inputType": "text",
26530
+ "placeholder": "https://...",
26531
+ "constraints": {
26532
+ "format": "url"
26533
+ }
26309
26534
  },
26310
26535
  {
26311
26536
  "slug": "follower-count",
26312
- "label": "Followers",
26537
+ "label": "Follower / Subscriber Count",
26313
26538
  "valueType": "number",
26314
26539
  "inputType": "number"
26315
26540
  },
26316
26541
  {
26317
- "slug": "channel-status",
26318
- "label": "Status",
26542
+ "slug": "follower-target",
26543
+ "label": "Target Count",
26544
+ "valueType": "number",
26545
+ "inputType": "number"
26546
+ },
26547
+ {
26548
+ "slug": "avg-engagement-rate",
26549
+ "label": "Avg Engagement Rate (%)",
26550
+ "valueType": "number",
26551
+ "inputType": "number"
26552
+ },
26553
+ {
26554
+ "slug": "platform-posting-freq",
26555
+ "label": "Posting Frequency",
26319
26556
  "valueType": "string",
26320
26557
  "inputType": "select",
26321
26558
  "enumValues": [
26322
- "active",
26323
- "paused",
26324
- "archived"
26325
- ],
26326
- "constraints": {
26327
- "defaultValue": "active"
26328
- }
26559
+ "Daily",
26560
+ "3x / week",
26561
+ "2x / week",
26562
+ "Weekly",
26563
+ "Bi-weekly",
26564
+ "Monthly",
26565
+ "As Needed"
26566
+ ]
26567
+ },
26568
+ {
26569
+ "slug": "last-post-date",
26570
+ "label": "Last Post Date",
26571
+ "valueType": "date"
26572
+ },
26573
+ {
26574
+ "slug": "platform-notes",
26575
+ "label": "Notes",
26576
+ "valueType": "string",
26577
+ "inputType": "text",
26578
+ "placeholder": "What works here? Tone, format, best times..."
26579
+ },
26580
+ {
26581
+ "slug": "platform-tags",
26582
+ "label": "Tags",
26583
+ "valueType": "array"
26329
26584
  }
26330
26585
  ]
26331
26586
  },
@@ -26352,10 +26607,10 @@ var DATA = {
26352
26607
  }
26353
26608
  },
26354
26609
  {
26355
- "slug": "post-channel",
26356
- "label": "Channel",
26610
+ "slug": "post-platform",
26611
+ "label": "Platform",
26357
26612
  "valueType": "entity_id",
26358
- "targetProfileSlug": "channel",
26613
+ "targetProfileSlug": "platform",
26359
26614
  "inputType": "entity_select"
26360
26615
  },
26361
26616
  {
@@ -26398,10 +26653,10 @@ var DATA = {
26398
26653
  "description": "A recurring cadence for a channel \u2014 the slot pattern that keeps posting consistent.",
26399
26654
  "properties": [
26400
26655
  {
26401
- "slug": "schedule-channel",
26402
- "label": "Channel",
26656
+ "slug": "schedule-platform",
26657
+ "label": "Platform",
26403
26658
  "valueType": "entity_id",
26404
- "targetProfileSlug": "channel",
26659
+ "targetProfileSlug": "platform",
26405
26660
  "inputType": "entity_select"
26406
26661
  },
26407
26662
  {
@@ -26439,10 +26694,10 @@ var DATA = {
26439
26694
  "description": "A performance reading for a channel over a period \u2014 reach, impressions, and the reactions that came back.",
26440
26695
  "properties": [
26441
26696
  {
26442
- "slug": "signal-channel",
26443
- "label": "Channel",
26697
+ "slug": "signal-platform",
26698
+ "label": "Platform",
26444
26699
  "valueType": "entity_id",
26445
- "targetProfileSlug": "channel",
26700
+ "targetProfileSlug": "platform",
26446
26701
  "inputType": "entity_select"
26447
26702
  },
26448
26703
  {
@@ -26506,11 +26761,11 @@ var DATA = {
26506
26761
  "description": "Posts on a board by status \u2014 draft to published."
26507
26762
  },
26508
26763
  {
26509
- "name": "Channels",
26510
- "slug": "channels",
26764
+ "name": "Platforms",
26765
+ "slug": "platforms",
26511
26766
  "type": "table",
26512
- "scopeProfileSlug": "channel",
26513
- "description": "The channels you publish on, with platform, handle, and audience."
26767
+ "scopeProfileSlug": "platform",
26768
+ "description": "The platforms you publish on, with type, handle, and audience."
26514
26769
  },
26515
26770
  {
26516
26771
  "name": "Signals",
@@ -26525,21 +26780,21 @@ var DATA = {
26525
26780
  "framing": 'THE SOCIAL LEAD: Act as a sharp distribution lead. Anchor every post to a real Content asset or a Marketing brief \u2014 social is the distribution arm, not a separate content factory. Push for one channel done genuinely well over spraying thin across five. Refuse "we post everywhere" \u2014 ask which channel actually earns attention, and what the real cadence is.\n',
26526
26781
  "collect": [
26527
26782
  {
26528
- "profileSlug": "channel",
26529
- "what": "The channels you actually publish on \u2014 one per real account, with its platform and handle.",
26783
+ "profileSlug": "platform",
26784
+ "what": "The platforms you actually publish on \u2014 one per real account, with its type and handle.",
26530
26785
  "cardinality": "few",
26531
26786
  "keyFields": [
26532
- "platform",
26787
+ "platform-type",
26533
26788
  "handle"
26534
26789
  ]
26535
26790
  },
26536
26791
  {
26537
26792
  "profileSlug": "social-post",
26538
- "what": "The posts in motion \u2014 drafts, scheduled, and recently published \u2014 each tied to its channel.",
26793
+ "what": "The posts in motion \u2014 drafts, scheduled, and recently published \u2014 each tied to its platform.",
26539
26794
  "cardinality": "several",
26540
26795
  "keyFields": [
26541
26796
  "post-status",
26542
- "post-channel"
26797
+ "post-platform"
26543
26798
  ]
26544
26799
  }
26545
26800
  ],
@@ -26570,8 +26825,8 @@ var DATA = {
26570
26825
  },
26571
26826
  {
26572
26827
  "kind": "view",
26573
- "viewName": "Channels",
26574
- "label": "Channels",
26828
+ "viewName": "Platforms",
26829
+ "label": "Platforms",
26575
26830
  "icon": "radio"
26576
26831
  },
26577
26832
  {
@@ -26587,7 +26842,7 @@ var DATA = {
26587
26842
  "blocks": [
26588
26843
  {
26589
26844
  "kind": "view",
26590
- "viewName": "Channels",
26845
+ "viewName": "Platforms",
26591
26846
  "pos": {
26592
26847
  "x": 0,
26593
26848
  "y": 0,
@@ -26611,6 +26866,7 @@ var DATA = {
26611
26866
  "the-arch": {
26612
26867
  "meta": {
26613
26868
  "slug": "the-arch",
26869
+ "domain": "company",
26614
26870
  "name": "The Arch",
26615
26871
  "description": "The complete private company brain \u2014 the whole Enterprise OS plus the grant pipeline, the web3 ecosystem overlay, and the dev dashboard.",
26616
26872
  "icon": "landmark",
@@ -26855,6 +27111,7 @@ function rowToRemoteEntry(row, isPrivate) {
26855
27111
  name: row.displayName,
26856
27112
  description: row.description ?? void 0,
26857
27113
  category: row.category,
27114
+ domain: row.domain ?? void 0,
26858
27115
  tags: row.tags ?? [],
26859
27116
  icon: row.icon ?? null,
26860
27117
  isPrivate
@@ -26884,10 +27141,12 @@ function bundledToEntry(tpl) {
26884
27141
  slug: tpl.meta.slug,
26885
27142
  name: tpl.meta.name,
26886
27143
  description: tpl.meta.description,
26887
- // Every bundled template is a full workspace — the CP calls this category
26888
- // "workspace" (PACKAGE_TYPES). Finer display grouping is derived from `tags`
26889
- // by the consumer (browser `categoryFor`), not baked in here.
27144
+ // `category` is the PACKAGE TYPE — every bundled template is a full
27145
+ // workspace (PACKAGE_TYPES). Human display grouping is the SEPARATE
27146
+ // authored `domain` field (see ./domains.ts), read straight from meta —
27147
+ // not re-derived from tags by each consumer, which is what drifted before.
26890
27148
  category: "workspace",
27149
+ domain: tpl.meta.domain,
26891
27150
  tags: tpl.meta.tags ?? [],
26892
27151
  icon: tpl.meta.icon,
26893
27152
  isPrivate: tpl.meta.isPublic === false,
@@ -26901,6 +27160,7 @@ function remoteToEntry(row) {
26901
27160
  name: row.name,
26902
27161
  description: row.description,
26903
27162
  category: row.category,
27163
+ domain: row.domain,
26904
27164
  tags: row.tags ?? [],
26905
27165
  icon: row.icon ?? null,
26906
27166
  isPrivate: row.isPrivate ?? false,
@@ -27212,6 +27472,402 @@ function formatConceptViolations(violations) {
27212
27472
  return violations.map((v) => ` \u2022 [${v.rule}] ${v.message}`).join("\n");
27213
27473
  }
27214
27474
 
27475
+ // src/domains.ts
27476
+ var OTHER_DOMAIN_ID = "other";
27477
+ var OTHER_DOMAIN_LABEL = "More";
27478
+ var TEMPLATE_DOMAINS = [
27479
+ { id: "strategy", label: "Strategy & Market" },
27480
+ { id: "revenue", label: "Sales & Marketing" },
27481
+ { id: "content", label: "Content & Social" },
27482
+ { id: "company", label: "Company & Operations" },
27483
+ { id: "build", label: "Build & Operate" },
27484
+ { id: "knowledge", label: "Knowledge & Research" }
27485
+ ];
27486
+ var KNOWN = new Map(
27487
+ TEMPLATE_DOMAINS.map((d, i) => [d.id, { label: d.label, order: i }])
27488
+ );
27489
+ function isKnownDomain(id) {
27490
+ return id != null && KNOWN.has(id);
27491
+ }
27492
+ function domainLabel(id) {
27493
+ if (!id) return OTHER_DOMAIN_LABEL;
27494
+ const known = KNOWN.get(id);
27495
+ if (known) return known.label;
27496
+ return id.replace(/[-_]/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
27497
+ }
27498
+ function groupByDomain(items, domainOf) {
27499
+ const buckets = /* @__PURE__ */ new Map();
27500
+ for (const item of items) {
27501
+ const id = domainOf(item) || OTHER_DOMAIN_ID;
27502
+ const bucket = buckets.get(id);
27503
+ if (bucket) bucket.push(item);
27504
+ else buckets.set(id, [item]);
27505
+ }
27506
+ const rank = (id) => {
27507
+ if (id === OTHER_DOMAIN_ID) return Number.MAX_SAFE_INTEGER;
27508
+ const known = KNOWN.get(id);
27509
+ return known ? known.order : 1e6;
27510
+ };
27511
+ return [...buckets.entries()].sort(([a], [b]) => {
27512
+ const ra = rank(a);
27513
+ const rb = rank(b);
27514
+ if (ra !== rb) return ra - rb;
27515
+ return a < b ? -1 : a > b ? 1 : 0;
27516
+ }).map(([id, groupItems]) => ({
27517
+ id,
27518
+ label: id === OTHER_DOMAIN_ID ? OTHER_DOMAIN_LABEL : domainLabel(id),
27519
+ items: groupItems
27520
+ }));
27521
+ }
27522
+
27523
+ // src/validate.ts
27524
+ var REQUIRED_META_FIELDS = [
27525
+ "slug",
27526
+ "name",
27527
+ "description",
27528
+ "icon",
27529
+ "color"
27530
+ ];
27531
+ var REQUIRED_WORKSPACE_FIELDS = ["name", "description"];
27532
+ var SCOPE_EXEMPT = /* @__PURE__ */ new Set(["whiteboard", "mindmap", "bento"]);
27533
+ var SYSTEM_PROFILES = /* @__PURE__ */ new Set([
27534
+ // Core capture hierarchy
27535
+ "note",
27536
+ "task",
27537
+ "event",
27538
+ "bookmark",
27539
+ "website",
27540
+ "article",
27541
+ // People / orgs / CRM
27542
+ "person",
27543
+ "contact",
27544
+ "company",
27545
+ "deal",
27546
+ // Files + programmatic kinds
27547
+ "file",
27548
+ "anchor",
27549
+ "signal_item",
27550
+ // Knowledge-work flow
27551
+ "decision",
27552
+ "question",
27553
+ "research",
27554
+ "knowledge",
27555
+ "user_observation"
27556
+ ]);
27557
+ function isPodWideProfile(p) {
27558
+ return String(p.scope || "").toLowerCase() === "shared";
27559
+ }
27560
+ function collectBaseProfileSlugs(data, resolveDep, seen = /* @__PURE__ */ new Set()) {
27561
+ const out = /* @__PURE__ */ new Set();
27562
+ for (const dep of data.dependencies || []) {
27563
+ if (dep.relation !== "compose" && dep.relation !== "require") continue;
27564
+ if (seen.has(dep.slug)) continue;
27565
+ seen.add(dep.slug);
27566
+ const base = resolveDep(dep.slug);
27567
+ if (!base) continue;
27568
+ const podWideOnly = dep.relation === "require";
27569
+ for (const p of base.profiles || []) {
27570
+ if (podWideOnly && !isPodWideProfile(p)) continue;
27571
+ out.add(p.slug);
27572
+ }
27573
+ for (const s of collectBaseProfileSlugs(base, resolveDep, seen)) out.add(s);
27574
+ }
27575
+ return out;
27576
+ }
27577
+ function collectProfileSlugRefs(node, path, out) {
27578
+ if (node == null || typeof node !== "object") return;
27579
+ if (Array.isArray(node)) {
27580
+ node.forEach((v, i) => collectProfileSlugRefs(v, `${path}[${i}]`, out));
27581
+ return;
27582
+ }
27583
+ for (const [k, v] of Object.entries(node)) {
27584
+ if (k === "profileSlug" && typeof v === "string" && !v.includes("{{")) {
27585
+ out.push({ where: `${path}.profileSlug`, slug: v });
27586
+ } else {
27587
+ collectProfileSlugRefs(v, `${path}.${k}`, out);
27588
+ }
27589
+ }
27590
+ }
27591
+ function resolveDepFrom(opts) {
27592
+ if (opts.resolveDep) return opts.resolveDep;
27593
+ if (opts.corpus) {
27594
+ const bySlug = /* @__PURE__ */ new Map();
27595
+ for (const t of opts.corpus) {
27596
+ const s = t.meta?.slug;
27597
+ if (s) bySlug.set(s, t);
27598
+ }
27599
+ return (slug) => bySlug.get(slug);
27600
+ }
27601
+ return () => void 0;
27602
+ }
27603
+ function validateTemplate(tpl, opts = {}) {
27604
+ const errors = [];
27605
+ const add = (rule, path, message) => errors.push({ rule, path, message });
27606
+ if (!tpl.meta) add("meta-required", "meta", "Missing required field: meta");
27607
+ else {
27608
+ for (const f of REQUIRED_META_FIELDS) {
27609
+ if (!tpl.meta[f]) add("meta-field-required", `meta.${f}`, `meta.${f} is required`);
27610
+ }
27611
+ }
27612
+ if (!tpl.workspace)
27613
+ add("workspace-required", "workspace", "Missing required field: workspace");
27614
+ else {
27615
+ for (const f of REQUIRED_WORKSPACE_FIELDS) {
27616
+ if (!tpl.workspace[f])
27617
+ add("workspace-field-required", `workspace.${f}`, `workspace.${f} is required`);
27618
+ }
27619
+ }
27620
+ if (!tpl.profiles || tpl.profiles.length === 0) {
27621
+ add("profiles-required", "profiles", "At least one profile is required");
27622
+ }
27623
+ const baseProfileSlugs = collectBaseProfileSlugs(tpl, resolveDepFrom(opts));
27624
+ const slugs = new Set((tpl.profiles || []).map((p) => p.slug));
27625
+ const known = (s) => slugs.has(s) || SYSTEM_PROFILES.has(s) || baseProfileSlugs.has(s);
27626
+ for (const v of tpl.views || []) {
27627
+ const type = String(v.type || "").toLowerCase();
27628
+ const scoped = v.scopeProfileSlug || v.scopeProfileSlugs && v.scopeProfileSlugs.length;
27629
+ if (!SCOPE_EXEMPT.has(type) && !scoped) {
27630
+ add(
27631
+ "view-missing-scope",
27632
+ `views."${v.name}"`,
27633
+ `view "${v.name}" (${type}) needs scopeProfileSlug(s) \u2014 structured views require a scope`
27634
+ );
27635
+ }
27636
+ if (v.scopeProfileSlug && !known(v.scopeProfileSlug))
27637
+ add(
27638
+ "view-scope-unknown",
27639
+ `views."${v.name}".scopeProfileSlug`,
27640
+ `view "${v.name}" scopes unknown profile "${v.scopeProfileSlug}"`
27641
+ );
27642
+ for (const s of v.scopeProfileSlugs || [])
27643
+ if (!known(s))
27644
+ add(
27645
+ "view-scope-unknown",
27646
+ `views."${v.name}".scopeProfileSlugs`,
27647
+ `view "${v.name}" scopes unknown profile "${s}"`
27648
+ );
27649
+ }
27650
+ for (const p of tpl.profiles || []) {
27651
+ for (const pr of p.properties || []) {
27652
+ if (pr.targetProfileSlug && !known(pr.targetProfileSlug)) {
27653
+ add(
27654
+ "property-target-unknown",
27655
+ `profiles.${p.slug}.${pr.slug}.targetProfileSlug`,
27656
+ `property ${p.slug}.${pr.slug} targets unknown profile "${pr.targetProfileSlug}"`
27657
+ );
27658
+ }
27659
+ }
27660
+ }
27661
+ for (const el of tpl.entityLinks || []) {
27662
+ if (!known(el.sourceProfileSlug))
27663
+ add(
27664
+ "entitylink-source-unknown",
27665
+ "entityLinks",
27666
+ `entityLink source "${el.sourceProfileSlug}" is unknown`
27667
+ );
27668
+ if (!known(el.targetProfileSlug))
27669
+ add(
27670
+ "entitylink-target-unknown",
27671
+ "entityLinks",
27672
+ `entityLink target "${el.targetProfileSlug}" is unknown`
27673
+ );
27674
+ if (typeof el.type !== "string" || !el.type) {
27675
+ add(
27676
+ "entitylink-missing-type",
27677
+ "entityLinks",
27678
+ `entityLink ${el.sourceProfileSlug}\u2192${el.targetProfileSlug} is missing its \`type\` (the predicate)`
27679
+ );
27680
+ }
27681
+ }
27682
+ for (const c of tpl.onboarding?.collect || []) {
27683
+ if (!known(c.profileSlug))
27684
+ add(
27685
+ "onboarding-ref-unknown",
27686
+ "onboarding.collect",
27687
+ `onboarding.collect references unknown profile "${c.profileSlug}"`
27688
+ );
27689
+ }
27690
+ for (const s of tpl.seedEntities || []) {
27691
+ if (!known(s.profileSlug))
27692
+ add(
27693
+ "seedentity-ref-unknown",
27694
+ "seedEntities",
27695
+ `seedEntity references unknown profile "${s.profileSlug}"`
27696
+ );
27697
+ }
27698
+ for (const a of tpl.automations || []) {
27699
+ const refs = [];
27700
+ collectProfileSlugRefs(a.triggerConfig, `automation "${a.name}".triggerConfig`, refs);
27701
+ collectProfileSlugRefs(a.flow, `automation "${a.name}".flow`, refs);
27702
+ for (const r of refs)
27703
+ if (!known(r.slug))
27704
+ add("automation-ref-unknown", r.where, `${r.where} references unknown profile "${r.slug}"`);
27705
+ }
27706
+ for (const pb of tpl.playbooks || []) {
27707
+ const ps = pb.subjectProfile?.profileSlug;
27708
+ if (ps && !known(ps))
27709
+ add(
27710
+ "playbook-ref-unknown",
27711
+ `playbooks."${pb.name}".subjectProfile`,
27712
+ `playbook "${pb.name}".subjectProfile references unknown profile "${ps}"`
27713
+ );
27714
+ }
27715
+ for (const ap of tpl.actionPlacements || []) {
27716
+ if (ap.profileSlug && !known(ap.profileSlug)) {
27717
+ add(
27718
+ "actionplacement-ref-unknown",
27719
+ "actionPlacements",
27720
+ `actionPlacement "${ap.label ?? ap.ref}" references unknown profile "${ap.profileSlug}"`
27721
+ );
27722
+ }
27723
+ }
27724
+ for (const si of tpl.layout?.sidebarItems || []) {
27725
+ if (si.profileSlug && !known(si.profileSlug)) {
27726
+ add(
27727
+ "sidebar-ref-unknown",
27728
+ "layout.sidebarItems",
27729
+ `layout.sidebarItems ("${si.label ?? si.profileSlug}") references unknown profile "${si.profileSlug}"`
27730
+ );
27731
+ }
27732
+ }
27733
+ for (const dt of tpl.displayTemplates || []) {
27734
+ if (dt.entityType && !known(dt.entityType)) {
27735
+ add(
27736
+ "displaytemplate-ref-unknown",
27737
+ `displayTemplates."${dt.name}".entityType`,
27738
+ `displayTemplate "${dt.name}" targets unknown profile "${dt.entityType}" (entityType)`
27739
+ );
27740
+ }
27741
+ }
27742
+ for (const key of Object.keys(tpl.profileEntityBentoTemplates || {})) {
27743
+ if (!known(key))
27744
+ add(
27745
+ "bentotemplate-ref-unknown",
27746
+ "profileEntityBentoTemplates",
27747
+ `profileEntityBentoTemplates has an entry for unknown profile "${key}"`
27748
+ );
27749
+ }
27750
+ const composeDeps = (tpl.dependencies || []).filter((d) => d.relation === "compose");
27751
+ for (const dep of composeDeps) {
27752
+ if (tpl.workspace?.visibility !== void 0) {
27753
+ add(
27754
+ "overlay-visibility",
27755
+ "workspace.visibility",
27756
+ `overlay (compose on "${dep.slug}") must OMIT workspace.visibility \u2014 it overwrites the base's on additive reconcile`
27757
+ );
27758
+ }
27759
+ if (tpl.workspace?.subtype !== dep.slug) {
27760
+ add(
27761
+ "overlay-subtype",
27762
+ "workspace.subtype",
27763
+ `overlay (compose on "${dep.slug}") must set workspace.subtype to "${dep.slug}" (found "${tpl.workspace?.subtype}")`
27764
+ );
27765
+ }
27766
+ }
27767
+ const blocks = tpl.bento?.blocks ?? [];
27768
+ const authoredWidgets = blocks.filter((b) => b.kind === "widget");
27769
+ const authoredViews = blocks.filter((b) => b.kind === "view");
27770
+ const unknownKind = blocks.filter((b) => b.kind !== "widget" && b.kind !== "view");
27771
+ if (unknownKind.length) {
27772
+ add(
27773
+ "bento-unknown-kind",
27774
+ "bento.blocks",
27775
+ `${unknownKind.length} bento block(s) with unknown kind: ${unknownKind.map((b) => String(b.kind)).join(", ")}`
27776
+ );
27777
+ }
27778
+ const badWidgets = authoredWidgets.filter((b) => !b.widgetType);
27779
+ const badViews = authoredViews.filter((b) => !b.viewName);
27780
+ if (badWidgets.length) {
27781
+ add(
27782
+ "bento-widget-missing-type",
27783
+ "bento.blocks",
27784
+ `${badWidgets.length} widget block(s) missing widgetType`
27785
+ );
27786
+ }
27787
+ if (badViews.length) {
27788
+ add(
27789
+ "bento-view-missing-name",
27790
+ "bento.blocks",
27791
+ `${badViews.length} view block(s) missing viewName`
27792
+ );
27793
+ }
27794
+ if (opts.converters) {
27795
+ const { toWorkspaceDefinition: toWorkspaceDefinition2, toPackageDefinition: toPackageDefinition2 } = opts.converters;
27796
+ const { definition } = toWorkspaceDefinition2(tpl);
27797
+ const pkg = toPackageDefinition2(tpl);
27798
+ if (blocks.length > 0) {
27799
+ const expectW = authoredWidgets.length - badWidgets.length;
27800
+ const expectV = authoredViews.length - badViews.length;
27801
+ const doors = [
27802
+ ["tRPC createFromDefinition", definition.bentoLayout ?? [], definition.bentoViewBlocks ?? []],
27803
+ ["CP packages/apply", pkg.bentoLayout ?? [], pkg.bentoViewBlocks ?? []]
27804
+ ];
27805
+ for (const [door, layout, viewBlocks] of doors) {
27806
+ if (layout.length !== expectW || viewBlocks.length !== expectV) {
27807
+ add(
27808
+ "bento-split-count",
27809
+ "bento.blocks",
27810
+ `[${door}]: authored ${expectW} widget/${expectV} view \u2192 got ${layout.length} bentoLayout/${viewBlocks.length} bentoViewBlocks`
27811
+ );
27812
+ }
27813
+ const layoutBad = layout.filter((b) => typeof b.widgetType !== "string");
27814
+ const viewsBad = viewBlocks.filter(
27815
+ (b) => typeof b.viewName !== "string" || b.kind !== "view"
27816
+ );
27817
+ if (layoutBad.length) {
27818
+ add(
27819
+ "bento-layout-shape",
27820
+ "bento.blocks",
27821
+ `[${door}]: ${layoutBad.length} bentoLayout block(s) without a string widgetType (mis-routed view block?)`
27822
+ );
27823
+ }
27824
+ if (viewsBad.length) {
27825
+ add(
27826
+ "bento-viewblocks-shape",
27827
+ "bento.blocks",
27828
+ `[${door}]: ${viewsBad.length} bentoViewBlocks entry(s) without kind:'view' + string viewName (mis-routed widget block?)`
27829
+ );
27830
+ }
27831
+ }
27832
+ }
27833
+ const authoredViewName = tpl.bento?.viewName;
27834
+ if (authoredViewName) {
27835
+ if (definition.bentoViewName !== authoredViewName) {
27836
+ add(
27837
+ "bento-viewname-parity",
27838
+ "bento.viewName",
27839
+ `[tRPC]: authored bento.viewName "${authoredViewName}" \u2192 got "${definition.bentoViewName}"`
27840
+ );
27841
+ }
27842
+ if (pkg.bentoViewName !== authoredViewName) {
27843
+ add(
27844
+ "bento-viewname-parity",
27845
+ "bento.viewName",
27846
+ `[CP]: authored bento.viewName "${authoredViewName}" \u2192 got "${pkg.bentoViewName}"`
27847
+ );
27848
+ }
27849
+ }
27850
+ const authored = tpl.integrations ?? [];
27851
+ const wsCaps = definition.capabilities ?? [];
27852
+ const pkgCaps = pkg.capabilities ?? [];
27853
+ if (wsCaps.length !== authored.length) {
27854
+ add(
27855
+ "capabilities-count",
27856
+ "integrations",
27857
+ `[tRPC]: authored ${authored.length} integration(s) \u2192 got ${wsCaps.length} capabilities`
27858
+ );
27859
+ }
27860
+ if (JSON.stringify(wsCaps) !== JSON.stringify(pkgCaps)) {
27861
+ add(
27862
+ "capabilities-parity",
27863
+ "integrations",
27864
+ `capability parity mismatch \u2014 tRPC door and CP door emit different capabilities`
27865
+ );
27866
+ }
27867
+ }
27868
+ return { ok: errors.length === 0, errors };
27869
+ }
27870
+
27215
27871
  // src/define.ts
27216
27872
  function toAutomationWire(automations) {
27217
27873
  return automations?.map((a) => ({
@@ -27336,6 +27992,7 @@ function toPackageDefinition(slugOrYaml) {
27336
27992
  slug: tpl.meta.slug,
27337
27993
  icon: tpl.meta.icon,
27338
27994
  color: tpl.meta.color,
27995
+ domain: tpl.meta.domain,
27339
27996
  tags: tpl.meta.tags,
27340
27997
  isPublic: tpl.meta.isPublic ?? true
27341
27998
  },
@@ -27368,16 +28025,26 @@ function toPackageDefinition(slugOrYaml) {
27368
28025
  }
27369
28026
  export {
27370
28027
  DECLARED_DIVERGENCES,
28028
+ OTHER_DOMAIN_ID,
28029
+ OTHER_DOMAIN_LABEL,
27371
28030
  PACKAGE_DEPENDENCY_KINDS,
28031
+ REQUIRED_META_FIELDS,
28032
+ REQUIRED_WORKSPACE_FIELDS,
28033
+ SYSTEM_PROFILES,
28034
+ TEMPLATE_DOMAINS,
27372
28035
  WORKSPACE_TEMPLATES,
27373
28036
  assembleCatalog,
27374
28037
  bundledEdgesOf,
28038
+ collectBaseProfileSlugs,
27375
28039
  computeTemplateUpdates,
27376
28040
  conceptTerm,
28041
+ domainLabel,
27377
28042
  findConceptViolations,
27378
28043
  formatConceptViolations,
27379
28044
  getWorkspaceTemplate,
28045
+ groupByDomain,
27380
28046
  isHashVersion,
28047
+ isKnownDomain,
27381
28048
  layerTemplateGraph,
27382
28049
  listPublicTemplates,
27383
28050
  listWorkspaceTemplates,
@@ -27385,6 +28052,7 @@ export {
27385
28052
  rowToRemoteEntry,
27386
28053
  splitBentoBlocks,
27387
28054
  toPackageDefinition,
27388
- toWorkspaceDefinition
28055
+ toWorkspaceDefinition,
28056
+ validateTemplate
27389
28057
  };
27390
28058
  //# sourceMappingURL=index.js.map