@synap-core/workspace-templates 0.12.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/README.md +483 -0
  2. package/automations/bookmark-enrichment.automation.json +321 -0
  3. package/automations/github-pr-events.automation.json +505 -0
  4. package/automations/mail-feed.automation.json +86 -0
  5. package/automations/ship-a-change-checks-green.automation.json +106 -0
  6. package/automations/ship-a-change-checks-red.automation.json +106 -0
  7. package/automations/ship-a-change-deployed.automation.json +56 -0
  8. package/automations/ship-a-change-pr-merged.automation.json +110 -0
  9. package/automations/ship-a-change-pr-opened.automation.json +104 -0
  10. package/automations/url-bookmark-capture.automation.json +132 -0
  11. package/capabilities/agency-skills.capability.json +157 -0
  12. package/capabilities/apify.capability.json +265 -0
  13. package/capabilities/apollo.capability.json +120 -0
  14. package/capabilities/arch-backend.capability.json +97 -0
  15. package/capabilities/arch-client-intelligence.capability.json +401 -0
  16. package/capabilities/backblaze-b2.capability.json +205 -0
  17. package/capabilities/cal-com.capability.json +266 -0
  18. package/capabilities/canva.capability.json +274 -0
  19. package/capabilities/claude-code-routines.capability.json +172 -0
  20. package/capabilities/claude-managed-agents.capability.json +215 -0
  21. package/capabilities/client-comms-report.capability.json +246 -0
  22. package/capabilities/content-idea-to-production.capability.json +29 -0
  23. package/capabilities/datagouv.capability.json +315 -0
  24. package/capabilities/discord-bot.capability.json +157 -0
  25. package/capabilities/dropbox.capability.json +281 -0
  26. package/capabilities/exa.capability.json +109 -0
  27. package/capabilities/fal-ai.capability.json +83 -0
  28. package/capabilities/fal-media-lab.capability.json +158 -0
  29. package/capabilities/fireflies.capability.json +191 -0
  30. package/capabilities/freellmapi.capability.json +114 -0
  31. package/capabilities/generic-apikey.capability.json +92 -0
  32. package/capabilities/github-merge.capability.json +99 -0
  33. package/capabilities/github-read.capability.json +325 -0
  34. package/capabilities/governance-tighten-recommender.capability.json +81 -0
  35. package/capabilities/jev.capability.json +226 -0
  36. package/capabilities/lead-conversion-enrollment.capability.json +246 -0
  37. package/capabilities/mail-feed.capability.json +277 -0
  38. package/capabilities/mailgun.capability.json +52 -0
  39. package/capabilities/nango-google.capability.json +639 -0
  40. package/capabilities/notion.capability.json +417 -0
  41. package/capabilities/omniroute.capability.json +137 -0
  42. package/capabilities/posthog-analytics.capability.json +258 -0
  43. package/capabilities/postiz.capability.json +467 -0
  44. package/capabilities/proactive-digest.capability.json +190 -0
  45. package/capabilities/proton.capability.json +288 -0
  46. package/capabilities/replicate-rvm.capability.json +97 -0
  47. package/capabilities/research-methods.capability.json +57 -0
  48. package/capabilities/shopify.capability.json +395 -0
  49. package/capabilities/slack.capability.json +369 -0
  50. package/capabilities/stripe.capability.json +420 -0
  51. package/capabilities/telegram-bridge.capability.json +56 -0
  52. package/capabilities/treg.capability.json +102 -0
  53. package/capabilities/unipile-linkedin.capability.json +471 -0
  54. package/capabilities/vercel.capability.json +424 -0
  55. package/dist/define-CPS0n8BV.d.ts +1331 -0
  56. package/dist/index.d.ts +174 -900
  57. package/dist/index.js +26148 -23931
  58. package/dist/index.js.map +1 -1
  59. package/dist/wire.d.ts +222 -0
  60. package/dist/wire.js +77 -0
  61. package/dist/wire.js.map +1 -0
  62. package/package.json +27 -4
  63. package/packs/bookmark-views-pack.json +33 -0
  64. package/packs/crm-pack.json +76 -0
  65. package/packs/customer-profile.json +28 -0
  66. package/packs/deep-research.playbook.json +30 -0
  67. package/packs/event-views-pack.json +33 -0
  68. package/packs/habit-profile.json +27 -0
  69. package/packs/hr-pack.json +54 -0
  70. package/packs/invoice-profile.json +28 -0
  71. package/packs/knowledge-base-pack.json +56 -0
  72. package/packs/meeting-profile.json +29 -0
  73. package/packs/product-profile.json +30 -0
  74. package/packs/project-management-pack.json +49 -0
  75. package/packs/recipe-profile.json +29 -0
  76. package/packs/task-views-pack.json +39 -0
  77. package/retired.yaml +136 -0
  78. package/skills/app-factory-build-slice/SKILL.md +70 -0
  79. package/skills/app-factory-build-slice.catalog.json +17 -0
  80. package/skills/app-factory-design-canvas/SKILL.md +96 -0
  81. package/skills/app-factory-design-canvas.catalog.json +17 -0
  82. package/skills/app-factory-design-review/SKILL.md +99 -0
  83. package/skills/app-factory-design-review.catalog.json +18 -0
  84. package/skills/app-factory-research/SKILL.md +123 -0
  85. package/skills/app-factory-research.catalog.json +17 -0
  86. package/skills/bookmark-enrichment/SKILL.md +40 -0
  87. package/skills/carousel-format/carousel-format.skill.json +18 -0
  88. package/skills/collage-broll/collage-broll.skill.json +20 -0
  89. package/skills/content-taste/content-taste.skill.json +18 -0
  90. package/skills/creative-director/creative-director.skill.json +18 -0
  91. package/skills/design-critique/SKILL.md +135 -0
  92. package/skills/design-critique.catalog.json +12 -0
  93. package/skills/designing-with-real-components/SKILL.md +140 -0
  94. package/skills/designing-with-real-components.catalog.json +12 -0
  95. package/skills/edit-loop/edit-loop.skill.json +25 -0
  96. package/skills/facecam-edit/facecam-edit.skill.json +24 -0
  97. package/skills/mapping-the-server/SKILL.md +54 -0
  98. package/skills/math-explainer-manimgx/math-explainer-manimgx.skill.json +20 -0
  99. package/skills/motion-quality-gates/motion-quality-gates.skill.json +20 -0
  100. package/skills/open-design-edit/open-design-edit.skill.json +24 -0
  101. package/skills/reading-client-progress/SKILL.md +65 -0
  102. package/skills/routing-to-channels/SKILL.md +54 -0
  103. package/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
  104. package/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
  105. package/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
  106. package/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
  107. package/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
  108. package/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
  109. package/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
  110. package/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
  111. package/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
  112. package/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
  113. package/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
  114. package/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
  115. package/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
  116. package/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
  117. package/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
  118. package/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
  119. package/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
  120. package/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
  121. package/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
  122. package/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
  123. package/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
  124. package/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
  125. package/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
  126. package/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
  127. package/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
  128. package/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
  129. package/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
  130. package/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
  131. package/skills/video-direction/video-direction.skill.json +20 -0
  132. package/skills/video-style-vocabulary/video-style-vocabulary.skill.json +20 -0
  133. package/skills/video-toolbox/video-toolbox.skill.json +20 -0
  134. package/src/__fixtures__/lifecycle-presets.flat-before.json +205 -0
  135. package/src/agency-os.yaml +122 -0
  136. package/src/agent-os-skill-slugs.test.ts +65 -0
  137. package/src/apify-social-reader.test.ts +317 -0
  138. package/src/base.yaml +85 -39
  139. package/src/blockchain-ecosystem.yaml +1 -0
  140. package/src/brand-library.yaml +525 -14
  141. package/src/builder-dev-fold.template.test.ts +113 -0
  142. package/src/builder.yaml +779 -91
  143. package/src/business-model-catalog-description.test.ts +47 -0
  144. package/src/business-model-grp.template.test.ts +214 -0
  145. package/src/business-model.yaml +296 -49
  146. package/src/catalog-safety.test.ts +198 -0
  147. package/src/catalog.template-items.test.ts +75 -0
  148. package/src/catalog.ts +66 -2
  149. package/src/concept-guard.test.ts +28 -8
  150. package/src/concept-guard.ts +2 -2
  151. package/src/content-creation.template.test.ts +52 -0
  152. package/src/content-creation.yaml +192 -0
  153. package/src/content-os.edit-loop.template.test.ts +210 -0
  154. package/src/content-os.publish-due-posts.template.test.ts +261 -0
  155. package/src/content-os.template.test.ts +322 -0
  156. package/src/content-os.video-takes.template.test.ts +338 -0
  157. package/src/content-os.work-a-take.template.test.ts +125 -0
  158. package/src/content-os.yaml +1830 -39
  159. package/src/content-studio-retired.template.test.ts +82 -0
  160. package/src/corpus-flow-validity.test.ts +4 -5
  161. package/src/crm-absorbs-outreach.template.test.ts +117 -0
  162. package/src/crm-build-plan.template.test.ts +128 -0
  163. package/src/crm-lists.template.test.ts +96 -0
  164. package/src/crm-messages-cadence.template.test.ts +164 -0
  165. package/src/crm-one-send-door.template.test.ts +65 -0
  166. package/src/crm.yaml +1456 -181
  167. package/src/decisions-wave.template.test.ts +186 -0
  168. package/src/define.ts +130 -17
  169. package/src/design-to-implementation.template.test.ts +94 -0
  170. package/src/domain-template-type.test.ts +75 -0
  171. package/src/ecosystem.yaml +27 -66
  172. package/src/enterprise-os.yaml +10 -134
  173. package/src/facecam-edit.audio-studio.test.ts +188 -0
  174. package/src/fal-generate-image.test.ts +200 -0
  175. package/src/fal-media-lab-pod-files.test.ts +180 -0
  176. package/src/finance.yaml +254 -1
  177. package/src/foundation.yaml +78 -38
  178. package/src/frame-host-modules.d.mts +6 -0
  179. package/src/frame-host-modules.mjs +58 -0
  180. package/src/generate.mjs +9 -3
  181. package/src/github-merge.test.ts +210 -0
  182. package/src/grants.yaml +46 -17
  183. package/src/hr.yaml +39 -6
  184. package/src/index.ts +36 -1
  185. package/src/intent.test.ts +161 -0
  186. package/src/internal-runbook.yaml +19 -1
  187. package/src/jev.test.ts +356 -0
  188. package/src/legal.yaml +33 -1
  189. package/src/life-os.yaml +51 -240
  190. package/src/lifecycle-coverage.test.ts +124 -0
  191. package/src/lifecycle-declarations.test.ts +252 -0
  192. package/src/lifecycle-presets.test.ts +468 -0
  193. package/src/lifecycle-presets.ts +494 -0
  194. package/src/lifecycle-stuck.test.ts +46 -0
  195. package/src/lifecycle-waits.parity.test.ts +319 -0
  196. package/src/marketing.yaml +108 -4
  197. package/src/meetings-knowledge.yaml +18 -0
  198. package/src/networking.yaml +23 -2
  199. package/src/operations.yaml +304 -4
  200. package/src/pipeline-views.template.test.ts +88 -0
  201. package/src/playbook-goal-placeholders.test.ts +57 -0
  202. package/src/postiz-contract.test.ts +134 -0
  203. package/src/presentation-declarations.test.ts +174 -0
  204. package/src/process-contract.validate.test.ts +352 -0
  205. package/src/project-management.yaml +39 -740
  206. package/src/publish-body.d.mts +29 -0
  207. package/src/publish-body.mjs +74 -0
  208. package/src/publish-body.test.ts +74 -0
  209. package/src/publish-official-lib.test.ts +176 -0
  210. package/src/replicate-rvm.test.ts +504 -0
  211. package/src/research-base.yaml +119 -20
  212. package/src/research-decision.yaml +60 -3
  213. package/src/reserved-profile-slugs.test.ts +83 -0
  214. package/src/retired-goal-kinds.test.ts +58 -0
  215. package/src/role-reference-and-step-domain.test.ts +192 -0
  216. package/src/seed-obligation.test.ts +1 -6
  217. package/src/send-message-maps.test.ts +227 -0
  218. package/src/shared-role-ssot.test.ts +40 -2
  219. package/src/ship-a-change.template.test.ts +177 -0
  220. package/src/skills.test.ts +170 -0
  221. package/src/social.yaml +85 -27
  222. package/src/space-packages.freshness.test.ts +97 -0
  223. package/src/space-packages.generated.ts +40 -0
  224. package/src/space-packages.test.ts +125 -0
  225. package/src/space-packages.ts +73 -0
  226. package/src/start.test.ts +188 -0
  227. package/src/task-intents.test.ts +293 -0
  228. package/src/templates.ts +20851 -21496
  229. package/src/types.ts +443 -60
  230. package/src/unipile-publish-post.test.ts +162 -0
  231. package/src/validate-flow.drift.test.ts +2 -3
  232. package/src/validate-flow.ts +22 -2
  233. package/src/validate-onboarding.test.ts +59 -0
  234. package/src/validate.test.ts +71 -4
  235. package/src/validate.ts +1335 -7
  236. package/src/wire-core.ts +231 -0
  237. package/src/wire.test.ts +159 -0
  238. package/src/wire.ts +107 -0
  239. package/src/agent-fleet.yaml +0 -1645
  240. package/src/business-developer.template.test.ts +0 -351
  241. package/src/business-developer.yaml +0 -860
  242. package/src/content-studio.yaml +0 -361
  243. package/src/dev-dashboard.yaml +0 -990
  244. package/src/outreach-comms.yaml +0 -486
  245. package/src/the-arch.yaml +0 -201
@@ -11,6 +11,9 @@ meta:
11
11
  color: "#B67A38"
12
12
  tags: [brand, assets, tokens, templates, components, creative]
13
13
  isPublic: true
14
+ # A LIBRARY: it produces nothing a home counts (homes).
15
+ intent:
16
+ label: Brand
14
17
 
15
18
  workspace:
16
19
  name: Brand Library
@@ -36,6 +39,16 @@ profiles:
36
39
  color: amber
37
40
  description: "Root brand context: positioning, audience, website, voice summary, and generation intent."
38
41
  semanticSlug: brand.identity
42
+ # The ONE lifecycle (work model L1): every option's category.
43
+ lifecycle:
44
+ property: brand-status
45
+ options:
46
+ - { key: draft, category: open }
47
+ - { key: active, category: done }
48
+ - { key: archived, category: lost }
49
+ # How it renders (entity rendering, decision 8): @synap-core/types/presentation.
50
+ presentation:
51
+ family: document
39
52
  properties:
40
53
  - slug: brand-type
41
54
  label: Brand type
@@ -58,6 +71,12 @@ profiles:
58
71
  inputType: select
59
72
  enumValues: [draft, active, archived]
60
73
  constraints: { defaultValue: active }
74
+ - slug: default-brand
75
+ label: Default brand
76
+ description: Used when no project is selected.
77
+ valueType: boolean
78
+ inputType: checkbox
79
+ constraints: { defaultValue: false }
61
80
  - slug: brand-tagline
62
81
  label: Tagline
63
82
  valueType: string
@@ -97,6 +116,13 @@ profiles:
97
116
  color: violet
98
117
  description: Approved palette entry with semantic role, usage notes, and print references.
99
118
  semanticSlug: brand.color
119
+ # The ONE lifecycle (work model L1): the asset base without its review
120
+ # step (lifecycle-presets.ts). The compiler writes the options and the
121
+ # select's enumValues.
122
+ lifecycle:
123
+ property: color-status
124
+ adopts: asset
125
+ drop: [in-review]
100
126
  properties:
101
127
  - slug: color-role
102
128
  label: Role
@@ -160,7 +186,6 @@ profiles:
160
186
  label: Status
161
187
  valueType: string
162
188
  inputType: select
163
- enumValues: [draft, approved, deprecated]
164
189
  constraints: { defaultValue: approved }
165
190
 
166
191
  - slug: brand-font
@@ -169,6 +194,18 @@ profiles:
169
194
  color: blue
170
195
  description: Typeface with role, family, licensing, import URL, weights, and fallback stack.
171
196
  semanticSlug: brand.font
197
+ # The ONE lifecycle (work model L1): every option's category.
198
+ lifecycle:
199
+ property: font-status
200
+ options:
201
+ - { key: active, category: done }
202
+ - { key: draft, category: open }
203
+ - { key: deprecated, category: lost }
204
+ # How it renders (entity rendering, decision 8): @synap-core/types/presentation.
205
+ presentation:
206
+ family: media
207
+ media:
208
+ source: { property: font-document-id }
172
209
  properties:
173
210
  - slug: font-role
174
211
  label: Role
@@ -220,6 +257,23 @@ profiles:
220
257
  color: green
221
258
  description: "Document-backed or URL-backed reusable media: logos, imagery, icons, fonts, video, references, and documents."
222
259
  semanticSlug: brand.asset
260
+ # The ONE lifecycle (work model L1): the asset base without its review
261
+ # step; deprecating an asset is a person's call (lifecycle-presets.ts).
262
+ lifecycle:
263
+ property: asset-status
264
+ adopts: asset
265
+ drop: [in-review]
266
+ humanOnly: { deprecated: true }
267
+ # How it renders (entity rendering, decision 8): @synap-core/types/presentation.
268
+ # The picture: an upload (asset-document-id — both upload doors write it),
269
+ # else an external URL (asset-url — add-by-URL, the edit form): a link
270
+ # until the pod copies it, never a hot-linked image.
271
+ presentation:
272
+ family: media
273
+ media:
274
+ source: { property: asset-document-id }
275
+ fallbacks:
276
+ - { property: asset-url }
223
277
  properties:
224
278
  - slug: asset-kind
225
279
  label: Kind
@@ -236,7 +290,9 @@ profiles:
236
290
  icon-set,
237
291
  illustration,
238
292
  photo,
293
+ image,
239
294
  video,
295
+ audio,
240
296
  document,
241
297
  font,
242
298
  3d-model,
@@ -267,12 +323,68 @@ profiles:
267
323
  label: Status
268
324
  valueType: string
269
325
  inputType: select
270
- enumValues: [draft, approved, deprecated]
271
- constraints: { defaultValue: approved }
326
+ constraints: { defaultValue: draft }
327
+ - slug: asset-style
328
+ label: Style
329
+ valueType: string
330
+ inputType: select
331
+ enumValues: [on-white, on-dark, organic, editorial, technical, generative, cinematic, playful, bold, other]
272
332
  - slug: asset-usage
273
333
  label: Usage notes
274
334
  valueType: string
275
335
  inputType: textarea
336
+ # ── Inspiration → variation → Canva loop ──────────────────────────────
337
+ # An inspiration is an asset like any other: it keeps WHERE it came from
338
+ # and, when it is AI-made, the prompt that produced it — so any AI that
339
+ # reads the library can ask for "another version" without guessing.
340
+ - slug: asset-role
341
+ label: Role
342
+ description: Where this sits in the loop. Inspiration = something we admire; working = a draft we are iterating; final = approved output.
343
+ valueType: string
344
+ inputType: select
345
+ enumValues: [inspiration, working, final]
346
+ - slug: asset-origin
347
+ label: Made by
348
+ description: Who made it. Say unknown rather than guess.
349
+ valueType: string
350
+ inputType: select
351
+ enumValues: [human, ai-generated, mixed, unknown]
352
+ - slug: asset-source-url
353
+ label: Found at
354
+ description: The page or post where we found it (provenance). The file itself goes in External URL or Document ID.
355
+ valueType: string
356
+ inputType: url
357
+ - slug: asset-generator
358
+ label: Generator
359
+ description: AI model or tool that made it (e.g. Midjourney, Flux, GPT Image). Only if known.
360
+ valueType: string
361
+ inputType: text
362
+ - slug: asset-prompt
363
+ label: Prompt
364
+ description: The exact prompt behind an AI-made image, verbatim. Never reconstruct or paraphrase one.
365
+ valueType: string
366
+ inputType: textarea
367
+ - slug: asset-prompt-status
368
+ label: Prompt status
369
+ description: Lets an AI tell "no prompt" from "prompt not found yet".
370
+ valueType: string
371
+ inputType: select
372
+ enumValues: [known, not-found, not-applicable]
373
+ - slug: asset-generation-params
374
+ label: Generation settings
375
+ description: Seed, aspect ratio, negative prompt, reference images, model version — whatever is needed to reproduce it.
376
+ valueType: string
377
+ inputType: textarea
378
+ - slug: asset-canva-id
379
+ label: Canva ID
380
+ description: Canva asset or design ID once this has been sent to Canva.
381
+ valueType: string
382
+ inputType: text
383
+ - slug: asset-canva-url
384
+ label: Canva link
385
+ description: Edit link of the Canva design or asset.
386
+ valueType: string
387
+ inputType: url
276
388
  - slug: asset-tags
277
389
  label: Tags
278
390
  valueType: string
@@ -300,6 +412,18 @@ profiles:
300
412
  color: teal
301
413
  description: Website, competitor, campaign, moodboard, or example used as source context for generation.
302
414
  semanticSlug: brand.reference
415
+ # The ONE lifecycle (work model L1): the asset base (lifecycle-presets.ts).
416
+ # Its review step is `studied` (2026-10-12): the takeaways are written, a
417
+ # person has not approved it as a source yet.
418
+ lifecycle:
419
+ property: reference-status
420
+ adopts: asset
421
+ rename: { in-review: studied, deprecated: archived }
422
+ # How it renders (entity rendering, decision 8): @synap-core/types/presentation.
423
+ presentation:
424
+ family: link
425
+ media:
426
+ source: { property: reference-url }
303
427
  properties:
304
428
  - slug: reference-kind
305
429
  label: Kind
@@ -328,8 +452,29 @@ profiles:
328
452
  label: Status
329
453
  valueType: string
330
454
  inputType: select
331
- enumValues: [draft, approved, archived]
332
- constraints: { defaultValue: approved }
455
+ constraints: { defaultValue: draft }
456
+ - slug: reference-style
457
+ label: Style
458
+ valueType: string
459
+ inputType: select
460
+ enumValues: [on-white, on-dark, organic, editorial, technical, generative, cinematic, playful, bold, other]
461
+ # What a study of the reference keeps. Content guidelines are distilled
462
+ # from these (guideline → reference, `derived_from`).
463
+ - slug: reference-takeaways
464
+ label: What to take
465
+ description: What to borrow from it — layout, elements, voice, pacing.
466
+ valueType: string
467
+ inputType: textarea
468
+ - slug: reference-avoid
469
+ label: What to avoid
470
+ valueType: string
471
+ inputType: textarea
472
+ - slug: reference-formats
473
+ label: Formats
474
+ description: The content formats this reference is an example of.
475
+ valueType: array
476
+ inputType: select
477
+ enumValues: [carousel, deck, video-motion, video-face, image, text]
333
478
 
334
479
  - slug: brand-token-set
335
480
  displayName: Token Set
@@ -337,6 +482,13 @@ profiles:
337
482
  color: violet
338
483
  description: Generated or curated design tokens for color, typography, spacing, radii, and exported CSS variables.
339
484
  semanticSlug: brand.tokens
485
+ # The ONE lifecycle (work model L1): every option's category.
486
+ lifecycle:
487
+ property: token-status
488
+ options:
489
+ - { key: draft, category: open }
490
+ - { key: active, category: done }
491
+ - { key: archived, category: lost }
340
492
  properties:
341
493
  - slug: token-status
342
494
  label: Status
@@ -373,6 +525,13 @@ profiles:
373
525
  color: orange
374
526
  description: "Generated or curated voice guidance by context: traits, tone, vocabulary, and copy examples."
375
527
  semanticSlug: brand.voice
528
+ # The ONE lifecycle (work model L1): every option's category.
529
+ lifecycle:
530
+ property: voice-status
531
+ options:
532
+ - { key: draft, category: open }
533
+ - { key: approved, category: done }
534
+ - { key: deprecated, category: lost, humanOnly: true }
376
535
  properties:
377
536
  - slug: voice-context
378
537
  label: Context
@@ -395,7 +554,9 @@ profiles:
395
554
  valueType: string
396
555
  inputType: select
397
556
  enumValues: [draft, approved, deprecated]
398
- constraints: { defaultValue: approved }
557
+ # A new guide is a draft until a person approves it (founder decision
558
+ # 2026-10-12): content is only checked against an approved voice.
559
+ constraints: { defaultValue: draft }
399
560
  - slug: voice-personality-traits
400
561
  label: Personality
401
562
  valueType: string
@@ -483,30 +644,55 @@ profiles:
483
644
  valueType: string
484
645
  inputType: textarea
485
646
 
647
+ # `scope: shared` — the ONE pod-wide template kind (plan D6): Content OS
648
+ # re-declares it to get the grant, instead of owning a `content-template`
649
+ # twin (retired by the w11.content.template-* manifest ops). Shares the
650
+ # DEFINITION, not the entities — no `entityScope: pod`, so each brand
651
+ # workspace's templates stay its own.
486
652
  - slug: brand-template
487
653
  displayName: Brand Template
488
654
  icon: layout-template
489
655
  color: pink
490
- description: Reusable output template for artboards, decks, carousels, banners, documents, or generated HTML.
656
+ description: Reusable output template for artboards, decks, carousels, banners, documents, video, or generated HTML.
491
657
  semanticSlug: brand.template
658
+ scope: shared
659
+ # The ONE lifecycle (work model L1): every option's category.
660
+ lifecycle:
661
+ property: template-status
662
+ options:
663
+ - { key: draft, category: open }
664
+ - { key: approved, category: done }
665
+ - { key: deprecated, category: lost }
666
+ # How it renders (entity rendering, decision 8): @synap-core/types/presentation.
667
+ presentation:
668
+ family: document
492
669
  properties:
493
670
  - slug: template-kind
494
671
  label: Kind
495
672
  valueType: string
496
673
  inputType: select
497
674
  enumValues:
498
- [artboard, deck, carousel, banner, document, html, social, other]
675
+ [artboard, deck, carousel, banner, document, html, social, video, other]
499
676
  - slug: template-status
500
677
  label: Status
501
678
  valueType: string
502
679
  inputType: select
503
680
  enumValues: [draft, approved, deprecated]
504
- constraints: { defaultValue: approved }
681
+ constraints: { defaultValue: draft }
682
+ - slug: template-style
683
+ label: Style
684
+ valueType: string
685
+ inputType: select
686
+ enumValues: [on-white, on-dark, organic, editorial, technical, generative, cinematic, playful, bold, other]
687
+ # `layered` = a carousel / image built as a layered composition in the
688
+ # pod, `open-design` = a deck or PDF document built in Open Design: the
689
+ # words content-os `render-engine` uses (static edit loop, founder D1,
690
+ # 2 Nov 2026). Additive only: the reconciler never drops a value.
505
691
  - slug: template-format
506
692
  label: Format
507
693
  valueType: string
508
694
  inputType: select
509
- enumValues: [tldraw, html, json, markdown, image, mixed]
695
+ enumValues: [tldraw, html, json, markdown, image, mixed, hyperframes, layered, open-design]
510
696
  - slug: template-config
511
697
  label: Config JSON
512
698
  valueType: string
@@ -515,6 +701,32 @@ profiles:
515
701
  label: Usage notes
516
702
  valueType: string
517
703
  inputType: textarea
704
+ # ── Folded in from content-studio's `production-recipe` (decision D2,
705
+ # 2026-10-12): a recipe was a template with a platform and a script. Same
706
+ # values as recipe-platform / recipe-mode / recipe-script / recipe-stages.
707
+ - slug: template-platform
708
+ label: Platform
709
+ valueType: string
710
+ inputType: select
711
+ enumValues: [instagram, tiktok, youtube, linkedin, x, all]
712
+ - slug: template-mode
713
+ label: Render mode
714
+ valueType: string
715
+ inputType: select
716
+ enumValues: [fast, quality, data]
717
+ - slug: template-script
718
+ label: Script
719
+ valueType: string
720
+ inputType: textarea
721
+ - slug: template-stages
722
+ label: Stages
723
+ valueType: string
724
+ inputType: textarea
725
+ - slug: template-slots
726
+ label: Slots JSON
727
+ description: 'What a piece made from this template fills in: [{"slot", "component", "need": required|recommended|optional, "where"}].'
728
+ valueType: string
729
+ inputType: textarea
518
730
 
519
731
  - slug: brand-component
520
732
  displayName: Brand Component
@@ -522,6 +734,13 @@ profiles:
522
734
  color: green
523
735
  description: "Reusable branded UI or content component: hero, CTA, card, quote, banner, section, or HTML snippet."
524
736
  semanticSlug: brand.component
737
+ # The ONE lifecycle (work model L1): every option's category.
738
+ lifecycle:
739
+ property: component-status
740
+ options:
741
+ - { key: draft, category: open }
742
+ - { key: approved, category: done }
743
+ - { key: deprecated, category: lost }
525
744
  properties:
526
745
  - slug: component-kind
527
746
  label: Kind
@@ -548,6 +767,57 @@ profiles:
548
767
  valueType: string
549
768
  inputType: textarea
550
769
 
770
+ # How this brand makes content, distilled from approved references (decision
771
+ # D3, 2026-10-12). `base` = holds for everything; `format` = one format
772
+ # (carousel, video…); `frame` = the structure for one goal (sell, tutorial…).
773
+ # The long body is the entity's document. Workspace-scoped like brand-rule and
774
+ # brand-voice-guide: other spaces READ it through the pod-visible Brand space.
775
+ - slug: content-guideline
776
+ displayName: Content Guideline
777
+ icon: book-open-check
778
+ color: amber
779
+ description: "How this brand makes content: a base guideline, a format guideline, or the frame for one goal — distilled from approved references."
780
+ semanticSlug: brand.content-guideline
781
+ # The ONE lifecycle (work model L1): every option's category.
782
+ lifecycle:
783
+ property: guideline-status
784
+ options:
785
+ - { key: draft, category: open }
786
+ - { key: approved, category: done }
787
+ - { key: deprecated, category: lost, humanOnly: true }
788
+ # How it renders (entity rendering, decision 8): @synap-core/types/presentation.
789
+ presentation:
790
+ family: document
791
+ properties:
792
+ - slug: guideline-type
793
+ label: Type
794
+ valueType: string
795
+ inputType: select
796
+ enumValues: [base, format, frame]
797
+ constraints: { defaultValue: base }
798
+ - slug: guideline-format
799
+ label: Format
800
+ valueType: string
801
+ inputType: select
802
+ enumValues: [any, carousel, deck, video-motion, video-face, image, text, thread, newsletter]
803
+ constraints: { defaultValue: any }
804
+ - slug: guideline-goal
805
+ label: Goal
806
+ description: Only for a frame guideline — the goal this structure serves.
807
+ valueType: string
808
+ inputType: select
809
+ enumValues: [sell, hot-take, tutorial, product-demo, announcement, proof, behind-the-scenes, community]
810
+ - slug: guideline-status
811
+ label: Status
812
+ valueType: string
813
+ inputType: select
814
+ enumValues: [draft, approved, deprecated]
815
+ constraints: { defaultValue: draft }
816
+ - slug: guideline-summary
817
+ label: Summary
818
+ valueType: string
819
+ inputType: textarea
820
+
551
821
  views:
552
822
  - name: Brand Identity
553
823
  slug: brand-identities
@@ -600,6 +870,11 @@ views:
600
870
  type: grid
601
871
  scopeProfileSlug: brand-component
602
872
  description: Reusable branded blocks and snippets.
873
+ - name: Content Guidelines
874
+ slug: content-guidelines
875
+ type: list
876
+ scopeProfileSlug: content-guideline
877
+ description: Base, format and goal-frame guidelines for making content.
603
878
 
604
879
  entityLinks:
605
880
  - sourceProfileSlug: brand-token-set
@@ -614,13 +889,45 @@ entityLinks:
614
889
  targetProfileSlug: brand-asset
615
890
  type: references
616
891
  label: References asset
892
+ # A variation points at the asset it was made from (child → parent). Same
893
+ # edge for "AI version of an inspiration" and "Canva export of a draft".
894
+ - sourceProfileSlug: brand-asset
895
+ targetProfileSlug: brand-asset
896
+ type: derived_from
897
+ label: Variation of
898
+ - sourceProfileSlug: brand-asset
899
+ targetProfileSlug: brand-reference
900
+ type: references
901
+ label: Found in reference
617
902
  - sourceProfileSlug: brand-template
618
903
  targetProfileSlug: brand-token-set
619
904
  type: uses
620
905
  label: Uses token set
906
+ - sourceProfileSlug: content-guideline
907
+ targetProfileSlug: brand-reference
908
+ type: derived_from
909
+ label: Distilled from
621
910
 
622
911
  onboarding:
623
- goal: Capture the brand's expressive DNA — voice, visual identity, and the rules that keep everything on-brand — so any human or AI can generate on-brand content and assets.
912
+ purpose: >-
913
+ The brand's source of truth. Before writing copy or generating an asset,
914
+ read the brand identity, the voice guides and the mandatory rules here;
915
+ store brand assets, colors, fonts and token sets as their own typed kinds,
916
+ never as generic files.
917
+ anchors:
918
+ - profileSlug: brand-identity
919
+ role: root
920
+ limit: 10
921
+ - profileSlug: brand-rule
922
+ role: context
923
+ limit: 10
924
+ - profileSlug: brand-voice-guide
925
+ role: context
926
+ limit: 3
927
+ - profileSlug: content-guideline
928
+ role: context
929
+ limit: 5
930
+ goal: One brand identity per project, filed into that project (the Brand space is shared; the project picks the brand). Capture each brand's expressive DNA — voice, visual identity, and the rules that keep everything on-brand — so any human or AI can generate on-brand content and assets.
624
931
  framing: >
625
932
  THE BRAND STRATEGIST: Act as a seasoned brand strategist. Draw out how the
626
933
  brand sounds (tone, personality, do's and don'ts), how it looks (identity,
@@ -629,6 +936,11 @@ onboarding:
629
936
  positioning) so the brand expresses the strategy, never contradicts it.
630
937
  expertise:
631
938
  starters:
939
+ - >
940
+ A post that sells follows a frame, not a pitch: Story (a real moment),
941
+ Example (what it looked like in practice), Lesson (what that taught),
942
+ Link (where to go next). Propose it as the brand's first frame guideline
943
+ for the `sell` goal, then test it on one real post before approving.
632
944
  - >
633
945
  Adjectives don't define a voice — "friendly, bold, human" describes every
634
946
  brand and constrains none. Propose voice as a small set of DO / DON'T pairs
@@ -660,17 +972,25 @@ onboarding:
660
972
  AA on text is off-brand the moment it's inaccessible. If they've picked
661
973
  colors without checking text-on-surface contrast, flag it before it's
662
974
  codified into tokens.
975
+ - >
976
+ Inspiration without distillation. A wall of saved references teaches an
977
+ AI nothing it can follow. Each reference only counts once its takeaways
978
+ and what to avoid are written down, and those become a guideline a person
979
+ approves. Until then it is a bookmark.
663
980
  bar: >
664
981
  A stranger handed the voice pairs, the color roles, and the rules could write a
665
982
  new paragraph and pick a button color that both read unmistakably as THIS brand —
666
983
  and every rule is testable on a real sentence or a real screen, not a vibe.
667
984
  collect:
668
985
  - profileSlug: brand-identity
669
- what: The core brand identity — name, essence, and how it presents itself.
670
- cardinality: one
986
+ what: One brand identity per project — name, essence, and how it presents itself — filed into its project. Mark one as the default brand when several exist.
987
+ cardinality: few
988
+ min: 1
989
+ keyFields: [brand-positioning, brand-audience-primary]
671
990
  - profileSlug: brand-voice-guide
672
991
  what: Voice guides — tone, personality traits, vocabulary, and do/don't examples per context.
673
992
  cardinality: few
993
+ min: 1
674
994
  keyFields:
675
995
  [
676
996
  voice-personality-traits,
@@ -681,17 +1001,87 @@ onboarding:
681
1001
  - profileSlug: brand-rule
682
1002
  what: Usage rules and constraints (mandatory / important / guideline).
683
1003
  cardinality: several
1004
+ min: 1
1005
+ keyFields: [rule-content]
684
1006
  - profileSlug: brand-color
685
1007
  what: The brand's core colors.
686
1008
  cardinality: few
687
1009
  - profileSlug: brand-font
688
1010
  what: The brand's typefaces (heading / body / mono).
689
1011
  cardinality: few
1012
+ - profileSlug: brand-reference
1013
+ what: At least three references a person has approved, each with what to take from it and what to avoid.
1014
+ cardinality: several
1015
+ min: 3
1016
+ keyFields: [reference-url, reference-takeaways, reference-avoid]
1017
+ - profileSlug: content-guideline
1018
+ what: An approved base guideline (how all of this brand's content is made), then a format or frame guideline when one is needed.
1019
+ cardinality: few
1020
+ min: 1
1021
+ keyFields: [guideline-type, guideline-summary]
1022
+ - profileSlug: brand-template
1023
+ what: At least one approved template for each format the brand publishes, with its slots.
1024
+ cardinality: few
1025
+ min: 1
1026
+ keyFields: [template-kind, template-slots]
690
1027
  openingQuestions:
691
1028
  - In three words, how should the brand sound?
692
1029
  - What's one thing the brand must never say or do?
693
1030
  - Who's the brand talking to (tie this back to your Foundation audience)?
694
- doneWhen: A brand identity + at least one voice guide + a few rules are captured.
1031
+ doneWhen: >-
1032
+ Ready for content: a brand identity, an approved voice guide, the rules, at
1033
+ least three approved references, an approved base content guideline, and at
1034
+ least one approved template for each format the brand publishes.
1035
+
1036
+ rules:
1037
+ - key: brand-approved-assets-first
1038
+ intent: >-
1039
+ When generating brand content or an asset, use only APPROVED brand
1040
+ assets, references and templates plus the active token set; a draft is a
1041
+ candidate the user has not validated yet and never feeds generation.
1042
+ Match the piece's style to their Style field. Create new variants only
1043
+ when the user explicitly asks for exploration, and load the
1044
+ creative-director skill (linked to this space) to route the ask.
1045
+ - key: brand-read-before-generating
1046
+ intent: >-
1047
+ Before writing copy or generating an asset for this brand, read its brand
1048
+ identity, voice guides and mandatory brand rules in the Brand Library, and
1049
+ follow them.
1050
+ - key: brand-store-typed
1051
+ intent: >-
1052
+ Store brand material as its own Brand Library kind (brand-asset,
1053
+ brand-color, brand-font, brand-token-set, brand-rule, brand-reference,
1054
+ content-guideline), never as a generic file or note.
1055
+
1056
+ skills:
1057
+ # The space DECLARES what its work needs, so every AI here is told the skill
1058
+ # exists and finds it first — instead of the rule above having to ASK for it in
1059
+ # prose, which a model may or may not honour. `on-demand`: the Brand space is a
1060
+ # reference space, so the director loads when the work calls for it.
1061
+ #
1062
+ # A REF, not a copy: the skill itself ships as its own package
1063
+ # (`skills/creative-director.skill.json`), installed via the `dependencies`
1064
+ # block below. This is the LINK; that is the INSTALL.
1065
+ - slug: creative-director
1066
+ when: Any content ask about this brand — carousel, deck, video, text
1067
+ mode: on-demand
1068
+ - slug: content-taste
1069
+ when: Studying inspiration, writing content guidelines, building the asset kit
1070
+ mode: on-demand
1071
+
1072
+ dependencies:
1073
+ # Bottom-up authoring: the small standalone piece is published first, then the
1074
+ # spaces that need it declare it. Resolved BEFORE the skills linker runs
1075
+ # (dependencies are Step 0 of materialization; the linker runs post-workspace),
1076
+ # so a freshly installed skill links instead of reporting `unresolved`.
1077
+ - slug: creative-director
1078
+ kind: skill
1079
+ relation: require
1080
+ reason: "Routes every content ask to this brand's approved recipes, references and assets."
1081
+ - slug: content-taste
1082
+ kind: skill
1083
+ relation: require
1084
+ reason: "Turns references into approved guidelines and the asset kit content is made from."
695
1085
 
696
1086
  app:
697
1087
  kind: native
@@ -764,3 +1154,124 @@ bento:
764
1154
  - kind: view
765
1155
  viewName: Templates
766
1156
  pos: { x: 6, y: 8, w: 6, h: 4 }
1157
+
1158
+ playbooks:
1159
+ - name: Make a brand asset
1160
+ description: Turn a request for a logo, image, icon or template into a draft built from the approved brand, and approve it with a person before anything uses it.
1161
+ goalTemplate: >-
1162
+ Make this brand asset ({asset}); each stage moves its status. DRAFT: read
1163
+ the request and the approved brand only — approved colours, fonts,
1164
+ references and the active token set; never a draft — and load the
1165
+ creative-director skill to pick the recipe. Make the draft (or up to
1166
+ three variants, each its own asset derived from this one) and record the
1167
+ generator, prompt and parameters on it. APPROVE: a person approves one
1168
+ draft as final; with variants, the approval asks them to `choose` one,
1169
+ your recommendation first, and that choice is the approval. Until then
1170
+ nothing may use it.
1171
+ Deprecating an asset is a person's call.
1172
+ subjectProfile:
1173
+ profileSlug: brand-asset
1174
+ statusProperty: asset-status
1175
+ humanOnlyStatuses: [deprecated]
1176
+ params:
1177
+ - { name: asset, type: entity, label: Brand asset, required: true }
1178
+ executor: is-agent
1179
+ status: active
1180
+ requiredIntents: [generate_media]
1181
+ expectedOutputs:
1182
+ - { kind: brand-asset, label: Variants, relationToSubject: derived_from }
1183
+ stages:
1184
+ - key: draft
1185
+ name: Draft
1186
+ category: started
1187
+ subjectStatus: draft
1188
+ goal: Build the draft from approved brand sources only and record how it was made.
1189
+ criteria:
1190
+ - key: asset-approved-sources
1191
+ statement: The draft was built only from approved colours, fonts, references and the active token set.
1192
+ check: { kind: judge }
1193
+ - key: asset-provenance
1194
+ statement: The asset records its generator, prompt and parameters, or says it was made by hand.
1195
+ check: { kind: judge }
1196
+ - key: approve
1197
+ name: Approve
1198
+ category: completed
1199
+ subjectStatus: approved
1200
+ goal: A person approves one draft as final; with variants, they choose one, recommended first.
1201
+ gate: { kind: human }
1202
+ onFail: { toStage: draft }
1203
+
1204
+ - name: Write the brand voice
1205
+ description: Draft or revise the brand voice guide from what the brand already publishes, and approve it with a person.
1206
+ goalTemplate: >-
1207
+ Write this brand voice guide ({guide}); each stage moves its status.
1208
+ DRAFT: read the brand identity, the approved assets and the last posts
1209
+ and emails the brand published; write the voice in a few traits, each
1210
+ with a do and a don't taken from real examples, and the words to use and
1211
+ avoid. APPROVE: a person approves the guide; then it is what every draft
1212
+ is checked against. Retiring a guide is a person's call.
1213
+ subjectProfile:
1214
+ profileSlug: brand-voice-guide
1215
+ statusProperty: voice-status
1216
+ humanOnlyStatuses: [deprecated]
1217
+ params:
1218
+ - { name: guide, type: entity, label: Brand voice guide, required: true }
1219
+ executor: is-agent
1220
+ status: active
1221
+ stages:
1222
+ - key: draft
1223
+ name: Draft
1224
+ category: started
1225
+ subjectStatus: draft
1226
+ goal: Write the voice traits with real do and don't examples, and the words to use and avoid.
1227
+ criteria:
1228
+ - key: voice-examples
1229
+ statement: Every voice trait has a do and a don't example taken from published material.
1230
+ check: { kind: judge }
1231
+ - key: approve
1232
+ name: Approve
1233
+ category: completed
1234
+ subjectStatus: approved
1235
+ goal: A person approves the guide.
1236
+ gate: { kind: human }
1237
+ onFail: { toStage: draft }
1238
+
1239
+ - name: Write a content guideline
1240
+ description: Distil approved references into a content guideline (base, format or the frame for one goal), and approve it with a person.
1241
+ goalTemplate: >-
1242
+ Write this content guideline ({guideline}); each stage moves its status.
1243
+ DRAFT: read the brand identity, the approved voice guide and the approved
1244
+ references; load the content-taste skill. Write what to take and what to
1245
+ avoid as rules a maker can follow, link the guideline to every reference
1246
+ it was distilled from, and fill the summary. For a frame guideline, set
1247
+ the goal and give the structure in order. APPROVE: a person approves the
1248
+ guideline; then content is made and checked against it. Retiring a
1249
+ guideline is a person's call.
1250
+ subjectProfile:
1251
+ profileSlug: content-guideline
1252
+ statusProperty: guideline-status
1253
+ humanOnlyStatuses: [deprecated]
1254
+ params:
1255
+ - { name: guideline, type: entity, label: Content guideline, required: true }
1256
+ executor: is-agent
1257
+ status: active
1258
+ stages:
1259
+ - key: draft
1260
+ name: Draft
1261
+ category: started
1262
+ subjectStatus: draft
1263
+ goal: Distil the approved references into rules a maker can follow, linked to their sources.
1264
+ criteria:
1265
+ - key: guideline-sources
1266
+ statement: The guideline is linked to at least one approved reference it was distilled from.
1267
+ check: { kind: judge }
1268
+ - key: guideline-followable
1269
+ statement: Every point says what to do or avoid concretely enough to check a draft against it.
1270
+ check: { kind: judge }
1271
+ - key: approve
1272
+ name: Approve
1273
+ category: completed
1274
+ subjectStatus: approved
1275
+ goal: A person approves the guideline.
1276
+ gate: { kind: human }
1277
+ onFail: { toStage: draft }