@synap-core/workspace-templates 0.5.0 → 0.6.1

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.
@@ -10,6 +10,21 @@ meta:
10
10
  tags: [marketing, crm, outreach, leads, campaigns]
11
11
  isPublic: true
12
12
 
13
+ # SSOT ordering guarantee — this template REFERENCES foundation's pod-wide
14
+ # shared `lead` role. The apply engine seeds a shared profile's pod-wide BASE
15
+ # property body from whichever template creates it FIRST, and adds a REUSING
16
+ # template's extra props as workspace OVERLAYS. Without this dependency,
17
+ # marketing-first would make the pod-wide `lead` base marketing's 10-prop body
18
+ # for EVERY workspace. Requiring foundation makes the resolver install it first
19
+ # (deps-first), so the base is always foundation's SSOT body (leadStage, notes)
20
+ # and marketing's extras stay per-workspace overlays. `require`, not `compose`:
21
+ # foundation is a real workspace, not an overlay.
22
+ dependencies:
23
+ - slug: foundation
24
+ kind: workspace
25
+ relation: require
26
+ reason: "Provides the pod-wide lead role vocabulary (leadStage) this workspace reuses."
27
+
13
28
  workspace:
14
29
  name: Marketing Campaign OS
15
30
  description: "Track leads, manage campaigns, and let AI help run your outreach. Contacts, pipeline, tasks, and AI briefings — all connected."
@@ -20,6 +35,8 @@ workspace:
20
35
  - marketing.contacts
21
36
  - marketing.leads
22
37
  sourceRoles:
38
+ brand: consumer
39
+ content: consumer
23
40
  marketing: provider
24
41
 
25
42
  profiles:
@@ -80,6 +97,9 @@ profiles:
80
97
  color: blue
81
98
  description: "A person in your marketing contact list."
82
99
  semanticSlug: marketing.contact
100
+ profileKind: role
101
+ applicableKinds:
102
+ - person
83
103
  properties:
84
104
  - slug: contact-email
85
105
  label: Email
@@ -117,19 +137,35 @@ profiles:
117
137
  valueType: string
118
138
  inputType: text
119
139
 
140
+ # `scope: shared` dedups to the ONE pod-wide `lead` profile seeded by
141
+ # foundation.yaml (SSOT for leadStage). Ordering is guaranteed by the
142
+ # `require: foundation` dependency above — foundation always installs first,
143
+ # so the pod-wide BASE body is always foundation's and the props below are
144
+ # always workspace OVERLAYS on top of it. That is the legitimate extension
145
+ # mechanism: EXTRA props are fine. What is NOT fine is REDECLARING a prop
146
+ # foundation already owns (e.g. `leadStage`) with a divergent enum/default —
147
+ # that is base drift, and the SSOT tripwire fails on it.
148
+ # (Standards reference inherited base props like `leadStage` directly.)
149
+ #
150
+ # The same reasoning applies to the ROW-LEVEL fields, and more strictly: the
151
+ # row has no overlay mechanism, so this template must not restate what
152
+ # foundation owns. `description`, `semanticSlug` and `applicableKinds` are
153
+ # therefore OMITTED here — they are written only on the create path, which
154
+ # foundation always takes, so declaring them here asserted a value that never
155
+ # applied (this template claimed `applicableKinds: [person]` while the live row
156
+ # says [company, person]).
157
+ # `icon`/`color` are the exception that must be RESTATED rather than dropped:
158
+ # they are also read into `profileHintsMap` to build THIS workspace's auto-bento
159
+ # for `lead`, so omitting them regresses the widgets to a default indigo
160
+ # database icon. They must MATCH foundation's row (`user-plus`/`yellow`) — the
161
+ # old `green` rendered green widgets around a yellow row.
120
162
  - slug: lead
121
163
  displayName: Lead
122
164
  icon: user-plus
123
- color: green
124
- description: "A potential customer or partner contact in your pipeline"
125
- semanticSlug: marketing.lead
165
+ color: yellow
166
+ scope: shared
167
+ profileKind: role
126
168
  properties:
127
- - slug: lead-stage
128
- label: Stage
129
- valueType: string
130
- inputType: select
131
- enumValues: [new, contacted, interested, qualified, demo, proposal, converted, lost]
132
- constraints: { defaultValue: new }
133
169
  - slug: lead-source
134
170
  label: Source
135
171
  valueType: string
@@ -164,7 +200,7 @@ profiles:
164
200
  label: Last Contacted
165
201
  valueType: date
166
202
  inputType: date
167
- - slug: lead-notes
203
+ - slug: notes
168
204
  label: Notes
169
205
  valueType: string
170
206
  inputType: textarea
@@ -190,7 +226,7 @@ views:
190
226
  slug: lead-pipeline
191
227
  type: kanban
192
228
  scopeProfileSlug: lead
193
- groupBy: lead-stage
229
+ groupBy: leadStage
194
230
  description: "Lead pipeline kanban by stage."
195
231
 
196
232
  onboarding:
@@ -249,7 +285,7 @@ onboarding:
249
285
  - profileSlug: lead
250
286
  what: A few representative leads already in motion, placed at their true pipeline stage.
251
287
  cardinality: several
252
- keyFields: [lead-stage, lead-source, lead-company]
288
+ keyFields: [leadStage, lead-source, lead-company]
253
289
  - profileSlug: contact
254
290
  what: Key marketing contacts — the people already on the list and how they got there.
255
291
  cardinality: few