@synap-core/workspace-templates 0.12.0 → 0.24.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 (237) hide show
  1. package/README.md +509 -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 +1496 -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 +494 -0
  54. package/capabilities/vercel.capability.json +424 -0
  55. package/dist/define-DqoItRiR.d.ts +1370 -0
  56. package/dist/index.d.ts +174 -900
  57. package/dist/index.js +26447 -24075
  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/retired.yaml +136 -0
  64. package/skills/app-factory-build-slice/SKILL.md +70 -0
  65. package/skills/app-factory-build-slice.catalog.json +17 -0
  66. package/skills/app-factory-design-canvas/SKILL.md +96 -0
  67. package/skills/app-factory-design-canvas.catalog.json +17 -0
  68. package/skills/app-factory-design-review/SKILL.md +105 -0
  69. package/skills/app-factory-design-review.catalog.json +18 -0
  70. package/skills/app-factory-research/SKILL.md +123 -0
  71. package/skills/app-factory-research.catalog.json +17 -0
  72. package/skills/bookmark-enrichment/SKILL.md +40 -0
  73. package/skills/carousel-format/carousel-format.skill.json +18 -0
  74. package/skills/collage-broll/collage-broll.skill.json +20 -0
  75. package/skills/content-taste/content-taste.skill.json +18 -0
  76. package/skills/creative-director/creative-director.skill.json +18 -0
  77. package/skills/design-critique/SKILL.md +138 -0
  78. package/skills/design-critique.catalog.json +12 -0
  79. package/skills/designing-with-real-components/SKILL.md +140 -0
  80. package/skills/designing-with-real-components.catalog.json +12 -0
  81. package/skills/edit-loop/edit-loop.skill.json +25 -0
  82. package/skills/facecam-edit/facecam-edit.skill.json +24 -0
  83. package/skills/mapping-the-server/SKILL.md +54 -0
  84. package/skills/math-explainer-manimgx/math-explainer-manimgx.skill.json +20 -0
  85. package/skills/motion-quality-gates/motion-quality-gates.skill.json +20 -0
  86. package/skills/open-design-edit/open-design-edit.skill.json +24 -0
  87. package/skills/reading-client-progress/SKILL.md +65 -0
  88. package/skills/routing-to-channels/SKILL.md +54 -0
  89. package/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
  90. package/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
  91. package/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
  92. package/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
  93. package/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
  94. package/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
  95. package/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
  96. package/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
  97. package/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
  98. package/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
  99. package/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
  100. package/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
  101. package/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
  102. package/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
  103. package/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
  104. package/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
  105. package/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
  106. package/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
  107. package/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
  108. package/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
  109. package/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
  110. package/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
  111. package/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
  112. package/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
  113. package/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
  114. package/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
  115. package/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
  116. package/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
  117. package/skills/video-direction/video-direction.skill.json +20 -0
  118. package/skills/video-style-vocabulary/video-style-vocabulary.skill.json +20 -0
  119. package/skills/video-toolbox/video-toolbox.skill.json +20 -0
  120. package/src/__fixtures__/lifecycle-presets.flat-before.json +205 -0
  121. package/src/agency-os.yaml +122 -0
  122. package/src/agent-os-skill-slugs.test.ts +65 -0
  123. package/src/apify-social-reader.test.ts +317 -0
  124. package/src/base.yaml +85 -39
  125. package/src/blockchain-ecosystem.yaml +1 -0
  126. package/src/brand-library.yaml +525 -14
  127. package/src/builder-dev-fold.template.test.ts +113 -0
  128. package/src/builder.yaml +779 -91
  129. package/src/business-model-catalog-description.test.ts +47 -0
  130. package/src/business-model-grp.template.test.ts +214 -0
  131. package/src/business-model.yaml +296 -49
  132. package/src/catalog-safety.test.ts +198 -0
  133. package/src/catalog.template-items.test.ts +75 -0
  134. package/src/catalog.ts +66 -2
  135. package/src/concept-guard.test.ts +28 -8
  136. package/src/concept-guard.ts +2 -2
  137. package/src/content-creation.template.test.ts +52 -0
  138. package/src/content-creation.yaml +192 -0
  139. package/src/content-os.edit-loop.template.test.ts +210 -0
  140. package/src/content-os.publish-due-posts.template.test.ts +261 -0
  141. package/src/content-os.template.test.ts +349 -0
  142. package/src/content-os.video-takes.template.test.ts +338 -0
  143. package/src/content-os.work-a-take.template.test.ts +125 -0
  144. package/src/content-os.yaml +1873 -39
  145. package/src/content-studio-retired.template.test.ts +82 -0
  146. package/src/corpus-flow-validity.test.ts +4 -5
  147. package/src/crm-absorbs-outreach.template.test.ts +117 -0
  148. package/src/crm-build-plan.template.test.ts +128 -0
  149. package/src/crm-lists.template.test.ts +96 -0
  150. package/src/crm-messages-cadence.template.test.ts +246 -0
  151. package/src/crm-one-send-door.template.test.ts +65 -0
  152. package/src/crm.yaml +1563 -181
  153. package/src/decisions-wave.template.test.ts +186 -0
  154. package/src/define.ts +146 -17
  155. package/src/design-to-implementation.template.test.ts +94 -0
  156. package/src/domain-template-type.test.ts +75 -0
  157. package/src/ecosystem.yaml +27 -66
  158. package/src/enterprise-os.yaml +10 -134
  159. package/src/facecam-edit.audio-studio.test.ts +188 -0
  160. package/src/fal-generate-image.test.ts +200 -0
  161. package/src/fal-media-lab-pod-files.test.ts +180 -0
  162. package/src/finance.yaml +254 -1
  163. package/src/foundation.yaml +78 -38
  164. package/src/frame-host-modules.d.mts +6 -0
  165. package/src/frame-host-modules.mjs +58 -0
  166. package/src/generate.mjs +9 -3
  167. package/src/github-merge.test.ts +210 -0
  168. package/src/grants.yaml +46 -17
  169. package/src/hr.yaml +39 -6
  170. package/src/index.ts +36 -1
  171. package/src/intent.test.ts +161 -0
  172. package/src/internal-runbook.yaml +19 -1
  173. package/src/jev.test.ts +356 -0
  174. package/src/legal.yaml +33 -1
  175. package/src/life-os.yaml +51 -240
  176. package/src/lifecycle-coverage.test.ts +124 -0
  177. package/src/lifecycle-declarations.test.ts +252 -0
  178. package/src/lifecycle-presets.test.ts +468 -0
  179. package/src/lifecycle-presets.ts +494 -0
  180. package/src/lifecycle-stuck.test.ts +46 -0
  181. package/src/lifecycle-waits.parity.test.ts +319 -0
  182. package/src/marketing.yaml +108 -4
  183. package/src/meetings-knowledge.yaml +18 -0
  184. package/src/networking.yaml +23 -2
  185. package/src/operations.yaml +304 -4
  186. package/src/pipeline-views.template.test.ts +88 -0
  187. package/src/playbook-goal-placeholders.test.ts +57 -0
  188. package/src/postiz-contract.test.ts +134 -0
  189. package/src/presentation-declarations.test.ts +174 -0
  190. package/src/process-contract.validate.test.ts +352 -0
  191. package/src/project-management.yaml +39 -740
  192. package/src/publish-body.d.mts +29 -0
  193. package/src/publish-body.mjs +74 -0
  194. package/src/publish-body.test.ts +74 -0
  195. package/src/publish-official-lib.test.ts +176 -0
  196. package/src/replicate-rvm.test.ts +504 -0
  197. package/src/research-base.yaml +119 -20
  198. package/src/research-decision.yaml +60 -3
  199. package/src/reserved-profile-slugs.test.ts +81 -0
  200. package/src/retired-goal-kinds.test.ts +52 -0
  201. package/src/role-reference-and-step-domain.test.ts +192 -0
  202. package/src/seed-obligation.test.ts +1 -6
  203. package/src/send-message-maps.test.ts +227 -0
  204. package/src/shared-role-ssot.test.ts +40 -2
  205. package/src/ship-a-change.template.test.ts +177 -0
  206. package/src/skills.test.ts +170 -0
  207. package/src/social.yaml +85 -27
  208. package/src/space-packages.freshness.test.ts +97 -0
  209. package/src/space-packages.generated.ts +40 -0
  210. package/src/space-packages.test.ts +125 -0
  211. package/src/space-packages.ts +73 -0
  212. package/src/start.test.ts +188 -0
  213. package/src/stripe-capability.test.ts +192 -0
  214. package/src/task-intents.test.ts +293 -0
  215. package/src/template-documents.test.ts +158 -0
  216. package/src/templates.ts +20907 -21464
  217. package/src/types.ts +475 -61
  218. package/src/unipile-linkedin-find-profile.test.ts +183 -0
  219. package/src/unipile-publish-post.test.ts +162 -0
  220. package/src/validate-flow.drift.test.ts +2 -3
  221. package/src/validate-flow.ts +22 -2
  222. package/src/validate-onboarding.test.ts +59 -0
  223. package/src/validate.test.ts +71 -4
  224. package/src/validate.ts +1416 -7
  225. package/src/wire-core.ts +231 -0
  226. package/src/wire.test.ts +159 -0
  227. package/src/wire.ts +107 -0
  228. package/views/bookmark-views-pack.view.json +39 -0
  229. package/views/event-views-pack.view.json +45 -0
  230. package/views/task-views-pack.view.json +53 -0
  231. package/src/agent-fleet.yaml +0 -1645
  232. package/src/business-developer.template.test.ts +0 -351
  233. package/src/business-developer.yaml +0 -860
  234. package/src/content-studio.yaml +0 -361
  235. package/src/dev-dashboard.yaml +0 -990
  236. package/src/outreach-comms.yaml +0 -486
  237. package/src/the-arch.yaml +0 -201
package/src/life-os.yaml CHANGED
@@ -13,6 +13,9 @@ meta:
13
13
  color: "#8B5CF6"
14
14
  tags: [pkm, second-brain, knowledge, reading, life-os, notes]
15
15
  isPublic: true
16
+ # A LIBRARY: it produces nothing a home counts (homes).
17
+ intent:
18
+ label: Knowledge
16
19
 
17
20
  workspace:
18
21
  name: Second Brain — Knowledge OS
@@ -145,6 +148,12 @@ profiles:
145
148
  color: "#F59E0B"
146
149
  description: Your reading library — track books, progress and insights.
147
150
  scope: WORKSPACE
151
+ # How it renders (entity rendering, decision 8): @synap-core/types/presentation.
152
+ presentation:
153
+ family: record
154
+ media:
155
+ source: { property: cover-url }
156
+ kind: image
148
157
  properties:
149
158
  - slug: title
150
159
  label: Title
@@ -213,6 +222,12 @@ profiles:
213
222
  # system row and these life-os props land as this workspace's OVERLAY.
214
223
  # (Was `scope: WORKSPACE`, which contradicted the pod-wide model.)
215
224
  entityScope: pod
225
+ # How it renders (entity rendering, decision 8): @synap-core/types/presentation.
226
+ presentation:
227
+ family: record
228
+ media:
229
+ source: { property: avatar-url }
230
+ kind: image
216
231
  properties:
217
232
  - slug: name
218
233
  label: Name
@@ -258,41 +273,6 @@ profiles:
258
273
  valueType: string
259
274
  inputType: url
260
275
 
261
- - slug: project
262
- displayName: Project
263
- icon: FolderOpen
264
- color: "#F97316"
265
- description: Bounded efforts with a defined outcome and timeline.
266
- scope: WORKSPACE
267
- properties:
268
- - slug: title
269
- label: Title
270
- valueType: string
271
- inputType: text
272
- required: true
273
- - slug: status
274
- label: Status
275
- valueType: string
276
- inputType: select
277
- enumValues: [idea, planning, active, on-hold, completed, archived]
278
- - slug: outcome
279
- label: Outcome
280
- valueType: string
281
- inputType: textarea
282
- - slug: due-date
283
- label: Due Date
284
- valueType: date
285
- inputType: date
286
- - slug: progress
287
- label: Progress
288
- valueType: number
289
- inputType: number
290
- constraints: { min: 0, max: 100 }
291
- - slug: area
292
- label: Area
293
- valueType: string
294
- inputType: text
295
-
296
276
  - slug: area
297
277
  displayName: Area
298
278
  icon: Compass
@@ -325,6 +305,11 @@ profiles:
325
305
  color: "#10B981"
326
306
  description: Web articles and blog posts worth saving and processing.
327
307
  scope: WORKSPACE
308
+ # How it renders (entity rendering, decision 8): @synap-core/types/presentation.
309
+ presentation:
310
+ family: link
311
+ media:
312
+ source: { property: url }
328
313
  properties:
329
314
  - slug: title
330
315
  label: Title
@@ -362,6 +347,11 @@ profiles:
362
347
  color: "#3B82F6"
363
348
  description: Quick links to valuable resources and pages.
364
349
  scope: WORKSPACE
350
+ # How it renders (entity rendering, decision 8): @synap-core/types/presentation.
351
+ presentation:
352
+ family: link
353
+ media:
354
+ source: { property: url }
365
355
  properties:
366
356
  - slug: title
367
357
  label: Title
@@ -392,6 +382,14 @@ profiles:
392
382
  color: "#EF4444"
393
383
  description: Raw sparks and early-stage thinking.
394
384
  scope: WORKSPACE
385
+ # The ONE lifecycle (work model L1): every option's category.
386
+ lifecycle:
387
+ property: status
388
+ options:
389
+ - { key: raw, category: open }
390
+ - { key: exploring, category: active }
391
+ - { key: validated, category: done }
392
+ - { key: shelved, category: paused }
395
393
  properties:
396
394
  - slug: title
397
395
  label: Title
@@ -416,47 +414,17 @@ profiles:
416
414
  inputType: number
417
415
  constraints: { min: 1, max: 5 }
418
416
 
419
- - slug: goal
420
- displayName: Goal
421
- icon: Target
422
- color: "#14B8A6"
423
- description: Intentions with a target state and measurable progress.
424
- scope: WORKSPACE
425
- properties:
426
- - slug: title
427
- label: Title
428
- valueType: string
429
- inputType: text
430
- required: true
431
- - slug: description
432
- label: Description
433
- valueType: string
434
- inputType: textarea
435
- - slug: status
436
- label: Status
437
- valueType: string
438
- inputType: select
439
- enumValues: [active, achieved, abandoned]
440
- - slug: target-date
441
- label: Target Date
442
- valueType: date
443
- inputType: date
444
- - slug: progress
445
- label: Progress
446
- valueType: number
447
- inputType: number
448
- constraints: { min: 0, max: 100 }
449
- - slug: area
450
- label: Area
451
- valueType: string
452
- inputType: text
453
-
454
417
  - slug: video
455
418
  displayName: Video
456
419
  icon: Video
457
420
  color: "#8B5CF6"
458
421
  description: Video content from YouTube, courses, and other platforms.
459
422
  scope: WORKSPACE
423
+ # How it renders (entity rendering, decision 8): @synap-core/types/presentation.
424
+ presentation:
425
+ family: link
426
+ media:
427
+ source: { property: url }
460
428
  properties:
461
429
  - slug: title
462
430
  label: Title
@@ -490,6 +458,11 @@ profiles:
490
458
  color: "#EC4899"
491
459
  description: Episodes and shows worth listening to or already consumed.
492
460
  scope: WORKSPACE
461
+ # How it renders (entity rendering, decision 8): @synap-core/types/presentation.
462
+ presentation:
463
+ family: link
464
+ media:
465
+ source: { property: url }
493
466
  properties:
494
467
  - slug: title
495
468
  label: Title
@@ -609,6 +582,11 @@ profiles:
609
582
  color: "#6366F1"
610
583
  description: Educational courses you're taking or have completed.
611
584
  scope: WORKSPACE
585
+ # How it renders (entity rendering, decision 8): @synap-core/types/presentation.
586
+ presentation:
587
+ family: link
588
+ media:
589
+ source: { property: url }
612
590
  properties:
613
591
  - slug: title
614
592
  label: Title
@@ -779,14 +757,6 @@ views:
779
757
  - name: People Network
780
758
  type: table
781
759
  scopeProfileSlug: person
782
- - name: Active Projects
783
- type: kanban
784
- scopeProfileSlug: project
785
- config:
786
- groupByField: status
787
- - name: All Projects
788
- type: table
789
- scopeProfileSlug: project
790
760
  - name: All Areas
791
761
  type: table
792
762
  scopeProfileSlug: area
@@ -809,9 +779,6 @@ views:
809
779
  scopeProfileSlug: idea
810
780
  config:
811
781
  groupByField: status
812
- - name: All Goals
813
- type: table
814
- scopeProfileSlug: goal
815
782
  - name: Notes Dashboard
816
783
  type: bento
817
784
  scopeProfileSlug: note
@@ -1027,68 +994,6 @@ views:
1027
994
  kind: view
1028
995
  viewName: People Network
1029
996
  pos: { x: 0, y: 4, w: 12, h: 6 }
1030
- - name: Projects Dashboard
1031
- type: bento
1032
- scopeProfileSlug: project
1033
- config:
1034
- blocks:
1035
- - id: prd-b1
1036
- kind: widget
1037
- widgetType: welcome-header
1038
- pos: { x: 0, y: 0, w: 12, h: 2 }
1039
- config: { title: Projects, subtitle: Your active initiatives }
1040
- - id: prd-b2
1041
- kind: widget
1042
- widgetType: entity-count
1043
- pos: { x: 0, y: 2, w: 3, h: 2 }
1044
- config:
1045
- {
1046
- profileSlug: project,
1047
- label: Active,
1048
- icon: Play,
1049
- filter: { status: active },
1050
- color: green,
1051
- }
1052
- - id: prd-b3
1053
- kind: widget
1054
- widgetType: entity-count
1055
- pos: { x: 3, y: 2, w: 3, h: 2 }
1056
- config:
1057
- {
1058
- profileSlug: project,
1059
- label: Planning,
1060
- icon: Map,
1061
- filter: { status: planning },
1062
- color: blue,
1063
- }
1064
- - id: prd-b4
1065
- kind: widget
1066
- widgetType: entity-count
1067
- pos: { x: 6, y: 2, w: 3, h: 2 }
1068
- config:
1069
- {
1070
- profileSlug: project,
1071
- label: On Hold,
1072
- icon: PauseCircle,
1073
- filter: { status: on-hold },
1074
- color: amber,
1075
- }
1076
- - id: prd-b5
1077
- kind: widget
1078
- widgetType: entity-count
1079
- pos: { x: 9, y: 2, w: 3, h: 2 }
1080
- config:
1081
- {
1082
- profileSlug: project,
1083
- label: Completed,
1084
- icon: CheckCircle,
1085
- filter: { status: completed },
1086
- color: purple,
1087
- }
1088
- - id: prd-b6
1089
- kind: view
1090
- viewName: Active Projects
1091
- pos: { x: 0, y: 4, w: 12, h: 6 }
1092
997
  - name: Quotes Dashboard
1093
998
  type: bento
1094
999
  scopeProfileSlug: quote
@@ -1146,12 +1051,6 @@ views:
1146
1051
  icon: Compass,
1147
1052
  filter: { status: active },
1148
1053
  }
1149
- - id: ad-b3
1150
- kind: widget
1151
- widgetType: entity-count
1152
- pos: { x: 6, y: 2, w: 6, h: 2 }
1153
- config:
1154
- { profileSlug: project, label: Total Projects, icon: FolderOpen }
1155
1054
  - id: ad-b4
1156
1055
  kind: view
1157
1056
  viewName: All Areas
@@ -1206,10 +1105,6 @@ layout:
1206
1105
  profileSlug: person
1207
1106
  label: People
1208
1107
  icon: Users
1209
- - kind: profile
1210
- profileSlug: project
1211
- label: Projects
1212
- icon: FolderOpen
1213
1108
  - kind: profile
1214
1109
  profileSlug: area
1215
1110
  label: Areas
@@ -1232,10 +1127,6 @@ entityLinks:
1232
1127
  targetProfileSlug: book
1233
1128
  type: references
1234
1129
  label: References
1235
- - sourceProfileSlug: note
1236
- targetProfileSlug: project
1237
- type: feeds-into
1238
- label: Feeds into
1239
1130
  - sourceProfileSlug: highlight
1240
1131
  targetProfileSlug: book
1241
1132
  type: from
@@ -1252,18 +1143,6 @@ entityLinks:
1252
1143
  targetProfileSlug: person
1253
1144
  type: written-by
1254
1145
  label: Written by
1255
- - sourceProfileSlug: idea
1256
- targetProfileSlug: project
1257
- type: feeds-into
1258
- label: Feeds into
1259
- - sourceProfileSlug: project
1260
- targetProfileSlug: area
1261
- type: belongs-to
1262
- label: Belongs to
1263
- - sourceProfileSlug: goal
1264
- targetProfileSlug: area
1265
- type: in-area
1266
- label: In area
1267
1146
  - sourceProfileSlug: concept
1268
1147
  targetProfileSlug: concept
1269
1148
  type: related-to
@@ -1318,7 +1197,6 @@ bento:
1318
1197
  - { label: Add Book, icon: BookOpen, profileSlug: book }
1319
1198
  - { label: Capture Idea, icon: Zap, profileSlug: idea }
1320
1199
  - { label: Concepts, icon: Lightbulb, profileSlug: concept }
1321
- - { label: Projects, icon: FolderOpen, profileSlug: project }
1322
1200
  - { label: People, icon: Users, profileSlug: person }
1323
1201
  - kind: widget
1324
1202
  widgetType: calendar
@@ -1437,28 +1315,6 @@ profileEntityBentoTemplates:
1437
1315
  widgetType: entity-list
1438
1316
  pos: { x: 6, y: 3, w: 6, h: 4 }
1439
1317
  config: { profileSlug: article, title: Articles by, limit: 8 }
1440
- project:
1441
- blocks:
1442
- - id: project-eb-b1
1443
- kind: widget
1444
- widgetType: entity-spotlight
1445
- pos: { x: 0, y: 0, w: 8, h: 3 }
1446
- config: { seed: pinned, layout: detail }
1447
- - id: project-eb-b2
1448
- kind: widget
1449
- widgetType: entity-count
1450
- pos: { x: 8, y: 0, w: 4, h: 3 }
1451
- config: { profileSlug: idea, label: Ideas, icon: Zap }
1452
- - id: project-eb-b3
1453
- kind: widget
1454
- widgetType: entity-list
1455
- pos: { x: 0, y: 3, w: 6, h: 4 }
1456
- config: { profileSlug: note, title: Project Notes, limit: 8 }
1457
- - id: project-eb-b4
1458
- kind: widget
1459
- widgetType: entity-list
1460
- pos: { x: 6, y: 3, w: 6, h: 4 }
1461
- config: { profileSlug: idea, title: Ideas, limit: 8 }
1462
1318
  area:
1463
1319
  blocks:
1464
1320
  - id: area-eb-b1
@@ -1466,50 +1322,11 @@ profileEntityBentoTemplates:
1466
1322
  widgetType: entity-spotlight
1467
1323
  pos: { x: 0, y: 0, w: 8, h: 3 }
1468
1324
  config: { seed: pinned, layout: detail }
1469
- - id: area-eb-b2
1470
- kind: widget
1471
- widgetType: entity-count
1472
- pos: { x: 8, y: 0, w: 4, h: 3 }
1473
- config:
1474
- {
1475
- profileSlug: project,
1476
- label: Projects,
1477
- icon: FolderOpen,
1478
- color: green,
1479
- }
1480
- - id: area-eb-b3
1481
- kind: widget
1482
- widgetType: entity-list
1483
- pos: { x: 0, y: 3, w: 12, h: 4 }
1484
- config: { profileSlug: project, title: Projects, limit: 10 }
1485
- goal:
1486
- blocks:
1487
- - id: goal-eb-b1
1488
- kind: widget
1489
- widgetType: entity-spotlight
1490
- pos: { x: 0, y: 0, w: 8, h: 3 }
1491
- config: { seed: pinned, layout: detail }
1492
- - id: goal-eb-b2
1493
- kind: widget
1494
- widgetType: metrics-summary
1495
- pos: { x: 8, y: 0, w: 4, h: 3 }
1496
- config:
1497
- {
1498
- profileSlug: project,
1499
- property: progress,
1500
- aggregation: average,
1501
- title: Avg Project Progress,
1502
- }
1503
- - id: goal-eb-b3
1504
- kind: widget
1505
- widgetType: entity-list
1506
- pos: { x: 0, y: 3, w: 12, h: 4 }
1507
- config: { profileSlug: project, title: Related Projects, limit: 8 }
1508
1325
 
1509
1326
  # Per-workspace adaptive onboarding context (from synap-backend life-os.package.json)
1510
1327
  onboarding:
1511
1328
  goal: Capture the shape of the user's life — their areas of focus, current goals, active projects, key people, and what they're reading or learning — so the second brain starts grounded in who they actually are.
1512
- framing: Act as a thoughtful personal-knowledge coach. Gently tease out the domains they care about, what they're working toward, what's in motion, who matters to them, and what they're consuming. Translate that into areas, goals, projects, people, and books.
1329
+ framing: Act as a thoughtful personal-knowledge coach. Gently tease out the domains they care about, what they're working toward, what's in motion, who matters to them, and what they're consuming. Translate that into areas, projects, people, and books. Goals are the pod's own goals (tracks), not an entity kind in this space; start each as a track (a goal) and file its notes into its project. Projects are the pod's own projects, not an entity kind; create each through the project door and file its notes into it.
1513
1330
  expertise:
1514
1331
  starters:
1515
1332
  - >
@@ -1550,22 +1367,16 @@ onboarding:
1550
1367
  a next action, and a review habit named so the system gets revisited, not just fed.
1551
1368
  collect:
1552
1369
  - profileSlug: area
1370
+ min: 1
1553
1371
  what: The ongoing areas of life / responsibility they want to keep standards in
1554
1372
  cardinality: few
1555
1373
  keyFields: [title, description, standard]
1556
- - profileSlug: goal
1557
- what: The goals they're currently working toward
1558
- cardinality: few
1559
- keyFields: [title, target-date, area, progress]
1560
- - profileSlug: project
1561
- what: The active projects in motion (the concrete efforts that advance their goals)
1562
- cardinality: few
1563
- keyFields: [title, status]
1564
1374
  - profileSlug: person
1565
1375
  what: The key people in their world
1566
1376
  cardinality: several
1567
1377
  keyFields: [name, relationship, company]
1568
1378
  - profileSlug: book
1379
+ min: 1
1569
1380
  what: What they're currently reading or learning from
1570
1381
  cardinality: few
1571
1382
  keyFields: [title, author, status]
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Lifecycle coverage — kinds with a lifecycle should have a process that moves it.
3
+ *
4
+ * A kind with a lifecycle select (`post-status`, `deal-stage`, …) is a process
5
+ * waiting to be declared: the engine can bind a playbook's stages to it
6
+ * (`subjectProfile.statusProperty` + `stages[].subjectStatus`), but only if a
7
+ * playbook binds the kind at all. This file holds two guards.
8
+ *
9
+ * (1) RATCHET. Count the kinds across the WHOLE corpus that have a lifecycle and
10
+ * that NO playbook binds through `subjectProfile`. It may only go DOWN:
11
+ * `count <= BASELINE`. Lower BASELINE when you bind a kind; never raise it to
12
+ * bank a new unbound lifecycle kind — bind it, or don't give it a lifecycle.
13
+ *
14
+ * "Has a lifecycle" = a `select` property whose slug contains "status" or
15
+ * "stage", CASE-INSENSITIVE. EXCLUDED: agent/runtime machine state, which
16
+ * the system writes and no person or process moves through —
17
+ * `agent_status`, `runStatus`, `lastRunStatus`, `run_status`, `job-status`
18
+ * (RUNTIME_STATUS below). Kind identity is the profile slug, deduplicated
19
+ * across templates (a shared kind re-declared in two templates counts once).
20
+ *
21
+ * (2) COVERAGE. For every playbook whose stages bind the lifecycle (it declares
22
+ * `subjectProfile.statusProperty` AND at least one stage `subjectStatus`),
23
+ * every enum value of that property must be some stage's `subjectStatus` or
24
+ * listed in `humanOnlyStatuses`. A value in neither is a state the process
25
+ * silently cannot reach or leave.
26
+ *
27
+ * NOT covered: a playbook that declares `statusProperty` only to READ the
28
+ * lifecycle (an activator, e.g. Content OS "Repurpose" fires on Published
29
+ * and creates NEW posts) and binds no stage. It owns no status, so asking it
30
+ * to cover the enum would force it to list every value as human-only.
31
+ *
32
+ * The functions + BASELINE live in scripts/catalog-lib.mjs (validateCatalog
33
+ * enforces them at publish). Both scans derive their set by globbing `src/*.yaml` (readYamlTemplates);
34
+ * nothing is hand-listed. Negative controls (run 2026-10-08): baseline 94 →
35
+ * red "expected 95 to be less than or equal to 94"; removing "Archived" from
36
+ * Produce Content's humanOnlyStatuses → red, naming `post-status = Archived`.
37
+ */
38
+
39
+ import { describe, expect, it } from "vitest";
40
+ import { readYamlTemplates } from "./generate.mjs";
41
+ import type { WorkspaceYaml } from "./types.js";
42
+ // The rule lives in the ONE catalog lib (validateCatalog runs it on every
43
+ // publish); this file pins it against the real corpus.
44
+ import {
45
+ LIFECYCLE_BASELINE as BASELINE,
46
+ LIFECYCLE_PATTERNS,
47
+ boundKinds,
48
+ lifecycleKinds,
49
+ unboundLifecycleKinds,
50
+ uncoveredStatuses,
51
+ } from "../scripts/catalog-lib.mjs";
52
+
53
+ const { RUNTIME_STATUS, LIFECYCLE } = LIFECYCLE_PATTERNS;
54
+
55
+ const corpus = readYamlTemplates().map((t) => t.data as WorkspaceYaml);
56
+
57
+ describe("lifecycle coverage — ratchet", () => {
58
+ it("non-vacuity: the scan sees the corpus and a literal lifecycle kind", () => {
59
+ expect(corpus.length).toBeGreaterThanOrEqual(25);
60
+ const kinds = lifecycleKinds(corpus);
61
+ expect(kinds.size).toBeGreaterThanOrEqual(80);
62
+ expect(kinds.get("post")?.has("post-status")).toBe(true);
63
+ // Case-insensitive: a camelCase lifecycle field is seen.
64
+ expect(LIFECYCLE.test("dealStage")).toBe(true);
65
+ // The runtime exclusion sees what it excludes, and only that.
66
+ for (const s of ["agent_status", "runStatus", "lastRunStatus", "run_status", "job-status"])
67
+ expect(RUNTIME_STATUS.test(s)).toBe(true);
68
+ expect(RUNTIME_STATUS.test("post-status")).toBe(false);
69
+ expect(boundKinds(corpus).has("post")).toBe(true);
70
+ });
71
+
72
+ it(`unbound lifecycle kinds never grow past the baseline (${BASELINE})`, () => {
73
+ const unbound = unboundLifecycleKinds(corpus);
74
+ expect(unbound.length, unbound.join(", ")).toBeLessThanOrEqual(BASELINE);
75
+ });
76
+ });
77
+
78
+ describe("lifecycle coverage — every status of a stage-bound lifecycle is owned", () => {
79
+ it("non-vacuity: at least two playbooks bind stages to a lifecycle", () => {
80
+ const binders = corpus.flatMap((t) =>
81
+ (t.playbooks ?? []).filter(
82
+ (pb) => pb.subjectProfile?.statusProperty && (pb.stages ?? []).some((s) => s.subjectStatus)
83
+ )
84
+ );
85
+ expect(binders.length).toBeGreaterThanOrEqual(2);
86
+ });
87
+
88
+ it("self-check: an un-owned status is reported", () => {
89
+ const clone = structuredClone(corpus);
90
+ const produce = clone
91
+ .find((t) => t.meta.slug === "content-os")!
92
+ .playbooks!.find((p) => p.name === "Produce Content")!;
93
+ produce.humanOnlyStatuses = ["Idea"];
94
+ expect(uncoveredStatuses(clone)).toContain("content-os › Produce Content: post-status = Archived");
95
+ });
96
+
97
+ it("every enum value is a stage's subjectStatus or a humanOnlyStatus", () => {
98
+ expect(uncoveredStatuses(corpus)).toEqual([]);
99
+ });
100
+ });
101
+
102
+ // ONE LIFECYCLE PER KIND OR ROLE (work model, founder rule 2026-10-11). A
103
+ // second lifecycle select on the same kind is two truths about where the thing
104
+ // stands (deal once carried `dealStage` AND `commercialStage`; the lead role
105
+ // `leadStage` AND an overlay `lifecycleStage`). RATCHET on the EXCESS — the sum
106
+ // over kinds of (lifecycle-named selects − 1) — so re-adding a second stage to a
107
+ // kind that is already counted still turns this red. It counts by NAME, so side
108
+ // statuses (`handoffStatus`, `commissionStatus`) are counted too: that is the
109
+ // limit of a name scan, and why this is a ratchet, not a zero assertion.
110
+ // Lower EXCESS_BASELINE when you fold one; never raise it.
111
+ const EXCESS_BASELINE = 9;
112
+ describe("one lifecycle per kind or role — ratchet", () => {
113
+ it(`excess lifecycle-named selects never grow past ${EXCESS_BASELINE}`, () => {
114
+ const kinds = lifecycleKinds(corpus);
115
+ const multi = [...kinds].filter(([, set]) => set.size > 1);
116
+ const excess = multi.reduce((n, [, set]) => n + set.size - 1, 0);
117
+ expect(kinds.get("deal")?.has("commercialStage")).toBe(true); // non-vacuity
118
+ expect(kinds.get("deal")?.has("dealStage"), "deal's retired dealStage is back").toBe(false);
119
+ expect(kinds.get("lead")?.has("lifecycleStage"), "lead's retired lifecycleStage is back").toBe(false);
120
+ expect(excess, multi.map(([k, s]) => `${k}: ${[...s].join(",")}`).join("; ")).toBeLessThanOrEqual(
121
+ EXCESS_BASELINE
122
+ );
123
+ });
124
+ });