@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.
@@ -0,0 +1,689 @@
1
+ # Communication workspace template
2
+ # Enterprise-OS reference "Communication" domain (Wave 1).
3
+ # MERGES the Brand Library's brand kinds with the Foundation's narrative kinds:
4
+ # Communication OWNS the brand + narrative ARTIFACTS (identity, voice, rules,
5
+ # positioning, narrative, audience, differentiator) — the on-brand source every
6
+ # downstream domain (Content, Marketing, Social) reads from. It does NOT own
7
+ # company-DNA (mission/vision/values) nor relationship roles (client/partner).
8
+
9
+ meta:
10
+ slug: communication
11
+ name: Communication
12
+ description: "Owns brand identity, voice, and narrative/positioning — the on-brand source of truth every downstream domain (Content, Marketing, Social) reads from so everything ships on-brand and on-message."
13
+ icon: messages-square
14
+ color: "#7C3AED"
15
+ tags: [communication, brand, narrative, voice, positioning]
16
+ isPublic: true
17
+
18
+ workspace:
19
+ name: Communication
20
+ description: "Owns brand identity, voice, and narrative/positioning — the on-brand source of truth every downstream domain reads from."
21
+ subtype: communication
22
+ visibility: pod_visible
23
+ capabilities:
24
+ - brand.library
25
+ - brand.identity
26
+ - brand.voice
27
+ - brand.assets
28
+ - brand.templates
29
+ - brand.components
30
+ - narrative.positioning
31
+ # Communication CONSUMES brand and PROVIDES narrative.
32
+ #
33
+ # `brand: provider` here was a LIVE bug, not dead metadata. brand-library.yaml
34
+ # also declares `brand: provider`, and the IS reads this to pick which
35
+ # workspace supplies brand for EVERY agent's system prompt
36
+ # (`resolveWorkspaceForCapability` in agents/utils/context-manager.ts): it
37
+ # filters candidates by the `brand.library` capability, then takes the FIRST
38
+ # workspace whose sourceRoles.brand is a provider. With both installed, "first"
39
+ # is whatever order listWorkspaces returned — an arbitrary, non-deterministic
40
+ # brand voice across turns. brand-library is the canonical brand source (this
41
+ # file's brand profiles are, by its own admission below, verbatim from it);
42
+ # Communication is the narrative/voice layer that reads from it.
43
+ #
44
+ # Every other domain in this template set has exactly ONE provider and names
45
+ # its consumers (content-studio: `brand: consumer`; marketing: `brand: consumer`).
46
+ # `brand` was the only domain with two. This restores that invariant.
47
+ #
48
+ # Expressed as a source ROLE, not `defaultSources.brand`, because a
49
+ # TemplateDefaultSource requires a concrete `workspaceId` (types.ts) that does
50
+ # not exist until provisioning — a template cannot know it. finance.yaml makes
51
+ # the same call for `strategy` and says so. `defaultSources` remains the
52
+ # correct RUNTIME override (`synap_declare_workspace_source`).
53
+ #
54
+ # The `brand.library` capability above is deliberately KEPT: it is what the
55
+ # resolver filters candidates on, and it makes this workspace a graceful
56
+ # fallback (step 3) when brand-library is not installed — in which case the
57
+ # local brand profiles below are exactly what the agent should read.
58
+ sourceRoles:
59
+ brand: consumer
60
+ narrative: provider
61
+
62
+ profiles:
63
+ # ═══════════════════════════════════════════════════════════════════════════
64
+ # BRAND KINDS — verbatim from brand-library.yaml
65
+ # ═══════════════════════════════════════════════════════════════════════════
66
+ - slug: brand-identity
67
+ displayName: Brand Identity
68
+ icon: fingerprint
69
+ color: amber
70
+ description: "Root brand context: positioning, audience, website, voice summary, and generation intent."
71
+ semanticSlug: brand.identity
72
+ properties:
73
+ - slug: brand-type
74
+ label: Brand type
75
+ valueType: string
76
+ inputType: select
77
+ enumValues: [product-digital, product-physical, agency, personal-brand, nonprofit, institutional, universal]
78
+ constraints: { defaultValue: universal }
79
+ - slug: brand-status
80
+ label: Status
81
+ valueType: string
82
+ inputType: select
83
+ enumValues: [draft, active, archived]
84
+ constraints: { defaultValue: active }
85
+ - slug: brand-tagline
86
+ label: Tagline
87
+ valueType: string
88
+ inputType: text
89
+ - slug: brand-website
90
+ label: Website
91
+ valueType: string
92
+ inputType: url
93
+ - slug: brand-industry
94
+ label: Industry
95
+ valueType: string
96
+ inputType: text
97
+ - slug: brand-positioning
98
+ label: Positioning
99
+ valueType: string
100
+ inputType: textarea
101
+ - slug: brand-audience-primary
102
+ label: Primary audience
103
+ valueType: string
104
+ inputType: textarea
105
+ - slug: brand-audience-secondary
106
+ label: Secondary audience
107
+ valueType: string
108
+ inputType: textarea
109
+ - slug: brand-voice-summary
110
+ label: Voice summary
111
+ valueType: string
112
+ inputType: textarea
113
+ - slug: brand-notes
114
+ label: Notes
115
+ valueType: string
116
+ inputType: textarea
117
+
118
+ - slug: brand-color
119
+ displayName: Brand Color
120
+ icon: swatch-book
121
+ color: violet
122
+ description: Approved palette entry with semantic role, usage notes, and print references.
123
+ semanticSlug: brand.color
124
+ properties:
125
+ - slug: color-role
126
+ label: Role
127
+ valueType: string
128
+ inputType: select
129
+ enumValues: [primary, secondary, accent, background, surface, surface-elevated, text, text-muted, border, success, warning, error, info, neutral, campaign, custom]
130
+ constraints: { defaultValue: custom }
131
+ - slug: color-group
132
+ label: Group
133
+ valueType: string
134
+ inputType: select
135
+ enumValues: [core, extended, semantic, neutral, seasonal, campaign]
136
+ constraints: { defaultValue: core }
137
+ - slug: color-hex
138
+ label: Hex
139
+ valueType: string
140
+ inputType: color
141
+ - slug: color-rgb
142
+ label: RGB
143
+ valueType: string
144
+ inputType: text
145
+ - slug: color-cmyk
146
+ label: CMYK
147
+ valueType: string
148
+ inputType: text
149
+ - slug: color-pantone
150
+ label: Pantone
151
+ valueType: string
152
+ inputType: text
153
+ - slug: color-ral
154
+ label: RAL
155
+ valueType: string
156
+ inputType: text
157
+ - slug: color-token-name
158
+ label: Token name
159
+ valueType: string
160
+ inputType: text
161
+ - slug: color-usage
162
+ label: Usage note
163
+ valueType: string
164
+ inputType: textarea
165
+ - slug: color-status
166
+ label: Status
167
+ valueType: string
168
+ inputType: select
169
+ enumValues: [draft, approved, deprecated]
170
+ constraints: { defaultValue: approved }
171
+
172
+ - slug: brand-font
173
+ displayName: Brand Typeface
174
+ icon: type
175
+ color: blue
176
+ description: Typeface with role, family, licensing, import URL, weights, and fallback stack.
177
+ semanticSlug: brand.font
178
+ properties:
179
+ - slug: font-role
180
+ label: Role
181
+ valueType: string
182
+ inputType: select
183
+ enumValues: [heading, body, display, mono, accent, ui, caption]
184
+ constraints: { defaultValue: body }
185
+ - slug: font-family
186
+ label: Family
187
+ valueType: string
188
+ inputType: text
189
+ - slug: font-foundry
190
+ label: Foundry
191
+ valueType: string
192
+ inputType: text
193
+ - slug: font-license
194
+ label: License
195
+ valueType: string
196
+ inputType: select
197
+ enumValues: [open-source, google-fonts, adobe-fonts, licensed, custom, system]
198
+ constraints: { defaultValue: google-fonts }
199
+ - slug: font-weights
200
+ label: Weights
201
+ valueType: string
202
+ inputType: text
203
+ - slug: font-fallback
204
+ label: Fallback stack
205
+ valueType: string
206
+ inputType: text
207
+ - slug: font-url
208
+ label: Import URL
209
+ valueType: string
210
+ inputType: url
211
+ - slug: font-document-id
212
+ label: Font document ID
213
+ valueType: string
214
+ inputType: text
215
+ - slug: font-status
216
+ label: Status
217
+ valueType: string
218
+ inputType: select
219
+ enumValues: [active, draft, deprecated]
220
+ constraints: { defaultValue: active }
221
+
222
+ - slug: brand-asset
223
+ displayName: Brand Asset
224
+ icon: image
225
+ color: green
226
+ description: "Document-backed or URL-backed reusable media: logos, imagery, icons, fonts, video, references, and documents."
227
+ semanticSlug: brand.asset
228
+ properties:
229
+ - slug: asset-kind
230
+ label: Kind
231
+ valueType: string
232
+ inputType: select
233
+ enumValues: [logo, wordmark, symbol, monogram, pattern, texture, icon-set, illustration, photo, video, document, font, 3d-model, print-ready, reference, other]
234
+ - slug: asset-variant
235
+ label: Variant
236
+ valueType: string
237
+ inputType: select
238
+ enumValues: [primary, secondary, horizontal, stacked, mono-dark, mono-light, white, reversed, favicon, social-avatar, og-image, other]
239
+ - slug: asset-status
240
+ label: Status
241
+ valueType: string
242
+ inputType: select
243
+ enumValues: [draft, approved, deprecated]
244
+ constraints: { defaultValue: approved }
245
+ - slug: asset-usage
246
+ label: Usage notes
247
+ valueType: string
248
+ inputType: textarea
249
+ - slug: asset-tags
250
+ label: Tags
251
+ valueType: string
252
+ inputType: text
253
+ - slug: asset-url
254
+ label: External URL
255
+ valueType: string
256
+ inputType: url
257
+ - slug: asset-document-id
258
+ label: Document ID
259
+ valueType: string
260
+ inputType: text
261
+ - slug: asset-file-id
262
+ label: Legacy file ID
263
+ valueType: string
264
+ inputType: text
265
+ - slug: asset-alt-text
266
+ label: Alt text
267
+ valueType: string
268
+ inputType: textarea
269
+
270
+ - slug: brand-reference
271
+ displayName: Brand Reference
272
+ icon: bookmark
273
+ color: teal
274
+ description: Website, competitor, campaign, moodboard, or example used as source context for generation.
275
+ semanticSlug: brand.reference
276
+ properties:
277
+ - slug: reference-kind
278
+ label: Kind
279
+ valueType: string
280
+ inputType: select
281
+ enumValues: [website, competitor, campaign, moodboard, copy-example, design-example, customer-example, other]
282
+ - slug: reference-url
283
+ label: URL
284
+ valueType: string
285
+ inputType: url
286
+ - slug: reference-notes
287
+ label: Notes
288
+ valueType: string
289
+ inputType: textarea
290
+ - slug: reference-status
291
+ label: Status
292
+ valueType: string
293
+ inputType: select
294
+ enumValues: [draft, approved, archived]
295
+ constraints: { defaultValue: approved }
296
+
297
+ - slug: brand-token-set
298
+ displayName: Token Set
299
+ icon: code-2
300
+ color: violet
301
+ description: Generated or curated design tokens for color, typography, spacing, radii, and exported CSS variables.
302
+ semanticSlug: brand.tokens
303
+ properties:
304
+ - slug: token-status
305
+ label: Status
306
+ valueType: string
307
+ inputType: select
308
+ enumValues: [draft, active, archived]
309
+ constraints: { defaultValue: active }
310
+ - slug: token-mode
311
+ label: Mode
312
+ valueType: string
313
+ inputType: select
314
+ enumValues: [base, light, dark, high-contrast, campaign, experimental]
315
+ constraints: { defaultValue: base }
316
+ - slug: token-source-ids
317
+ label: Source IDs
318
+ valueType: string
319
+ inputType: textarea
320
+ - slug: token-json
321
+ label: Tokens JSON
322
+ valueType: string
323
+ inputType: textarea
324
+ - slug: token-css
325
+ label: CSS variables
326
+ valueType: string
327
+ inputType: textarea
328
+ - slug: token-notes
329
+ label: Notes
330
+ valueType: string
331
+ inputType: textarea
332
+
333
+ - slug: brand-voice-guide
334
+ displayName: Voice Guide
335
+ icon: message-circle
336
+ color: orange
337
+ description: "Generated or curated voice guidance by context: traits, tone, vocabulary, and copy examples."
338
+ semanticSlug: brand.voice
339
+ properties:
340
+ - slug: voice-context
341
+ label: Context
342
+ valueType: string
343
+ inputType: select
344
+ enumValues: [general, marketing, product, support, social, legal, editorial, investor]
345
+ constraints: { defaultValue: general }
346
+ - slug: voice-status
347
+ label: Status
348
+ valueType: string
349
+ inputType: select
350
+ enumValues: [draft, approved, deprecated]
351
+ constraints: { defaultValue: approved }
352
+ - slug: voice-personality-traits
353
+ label: Personality
354
+ valueType: string
355
+ inputType: textarea
356
+ - slug: voice-tone-descriptors
357
+ label: Tone
358
+ valueType: string
359
+ inputType: text
360
+ - slug: voice-vocabulary
361
+ label: Vocabulary
362
+ valueType: string
363
+ inputType: textarea
364
+ - slug: voice-example-do
365
+ label: Do
366
+ valueType: string
367
+ inputType: textarea
368
+ - slug: voice-example-dont
369
+ label: Don't
370
+ valueType: string
371
+ inputType: textarea
372
+ - slug: voice-source-ids
373
+ label: Source IDs
374
+ valueType: string
375
+ inputType: textarea
376
+
377
+ - slug: brand-rule
378
+ displayName: Brand Rule
379
+ icon: shield-check
380
+ color: red
381
+ description: Usage constraints, accessibility requirements, do/don't examples, and generation guidance.
382
+ semanticSlug: brand.rule
383
+ properties:
384
+ - slug: rule-kind
385
+ label: Kind
386
+ valueType: string
387
+ inputType: select
388
+ enumValues: [visual, voice, legal, accessibility, sizing, clearance, color-usage, typography-usage, do, dont, generation, other]
389
+ - slug: rule-subject
390
+ label: Subject
391
+ valueType: string
392
+ inputType: select
393
+ enumValues: [logo, color, typography, pattern, asset, voice, general, digital, print, packaging]
394
+ - slug: rule-severity
395
+ label: Severity
396
+ valueType: string
397
+ inputType: select
398
+ enumValues: [guideline, important, mandatory]
399
+ constraints: { defaultValue: important }
400
+ - slug: rule-content
401
+ label: Rule
402
+ valueType: string
403
+ inputType: textarea
404
+ - slug: rule-example
405
+ label: Example
406
+ valueType: string
407
+ inputType: textarea
408
+ - slug: rule-source-ids
409
+ label: Source IDs
410
+ valueType: string
411
+ inputType: textarea
412
+
413
+ - slug: brand-template
414
+ displayName: Brand Template
415
+ icon: layout-template
416
+ color: pink
417
+ description: Reusable output template for artboards, decks, carousels, banners, documents, or generated HTML.
418
+ semanticSlug: brand.template
419
+ properties:
420
+ - slug: template-kind
421
+ label: Kind
422
+ valueType: string
423
+ inputType: select
424
+ enumValues: [artboard, deck, carousel, banner, document, html, social, other]
425
+ - slug: template-status
426
+ label: Status
427
+ valueType: string
428
+ inputType: select
429
+ enumValues: [draft, approved, deprecated]
430
+ constraints: { defaultValue: approved }
431
+ - slug: template-format
432
+ label: Format
433
+ valueType: string
434
+ inputType: select
435
+ enumValues: [tldraw, html, json, markdown, image, mixed]
436
+ - slug: template-config
437
+ label: Config JSON
438
+ valueType: string
439
+ inputType: textarea
440
+ - slug: template-usage
441
+ label: Usage notes
442
+ valueType: string
443
+ inputType: textarea
444
+
445
+ - slug: brand-component
446
+ displayName: Brand Component
447
+ icon: component
448
+ color: green
449
+ description: "Reusable branded UI or content component: hero, CTA, card, quote, banner, section, or HTML snippet."
450
+ semanticSlug: brand.component
451
+ properties:
452
+ - slug: component-kind
453
+ label: Kind
454
+ valueType: string
455
+ inputType: select
456
+ enumValues: [hero, card, cta, quote, banner, section, layout, html, other]
457
+ - slug: component-status
458
+ label: Status
459
+ valueType: string
460
+ inputType: select
461
+ enumValues: [draft, approved, deprecated]
462
+ constraints: { defaultValue: approved }
463
+ - slug: component-html
464
+ label: HTML
465
+ valueType: string
466
+ inputType: textarea
467
+ - slug: component-props
468
+ label: Props JSON
469
+ valueType: string
470
+ inputType: textarea
471
+ - slug: component-usage
472
+ label: Usage notes
473
+ valueType: string
474
+ inputType: textarea
475
+
476
+ # ═══════════════════════════════════════════════════════════════════════════
477
+ # NARRATIVE KINDS — verbatim from foundation.yaml
478
+ # (Communication owns the narrative ARTIFACTS: positioning, story arc,
479
+ # audiences, and differentiators — NOT mission/vision/values.)
480
+ # ═══════════════════════════════════════════════════════════════════════════
481
+ - slug: positioning
482
+ displayName: Positioning
483
+ icon: crosshair
484
+ color: cyan
485
+ description: "Market category, who we stand against, and why we win."
486
+ properties:
487
+ - slug: category
488
+ label: Category
489
+ valueType: string
490
+ inputType: text
491
+ - slug: against
492
+ label: Against
493
+ valueType: string
494
+ inputType: textarea
495
+ - slug: because
496
+ label: Because
497
+ valueType: string
498
+ inputType: textarea
499
+
500
+ - slug: narrative
501
+ displayName: Narrative
502
+ icon: book-open
503
+ color: amber
504
+ description: "The origin -> insight -> mission story arc."
505
+ properties:
506
+ - slug: arc
507
+ label: Story arc
508
+ valueType: string
509
+ inputType: textarea
510
+ - slug: status
511
+ label: Status
512
+ valueType: string
513
+ inputType: select
514
+ enumValues: [draft, active, archived]
515
+ constraints: { defaultValue: active }
516
+
517
+ - slug: audience
518
+ displayName: Audience
519
+ icon: users
520
+ color: blue
521
+ description: "An ideal customer profile — who we are built for."
522
+ properties:
523
+ - slug: segment
524
+ label: Segment
525
+ valueType: string
526
+ inputType: text
527
+ - slug: persona
528
+ label: Persona
529
+ valueType: string
530
+ inputType: textarea
531
+ - slug: jobs-to-be-done
532
+ label: Jobs to be done
533
+ valueType: string
534
+ inputType: textarea
535
+ - slug: traits
536
+ label: Traits
537
+ valueType: array
538
+ inputType: text
539
+
540
+ - slug: differentiator
541
+ displayName: Differentiator
542
+ icon: sparkles
543
+ color: green
544
+ description: "One thing only we do, believe, or refuse."
545
+ properties:
546
+ - slug: statement
547
+ label: Statement
548
+ valueType: string
549
+ inputType: textarea
550
+ - slug: proof
551
+ label: Proof
552
+ valueType: string
553
+ inputType: textarea
554
+
555
+ # CURATED views — not one per profile
556
+ views:
557
+ - name: Brand Identity
558
+ slug: brand-identities
559
+ type: table
560
+ scopeProfileSlug: brand-identity
561
+ description: Root brand context and active identities.
562
+ defaultView: true
563
+ - name: Voice & Rules
564
+ slug: voice-rules
565
+ type: list
566
+ scopeProfileSlug: brand-voice-guide
567
+ description: Voice guides — tone, personality, vocabulary, and do/don't examples per context.
568
+ - name: Assets
569
+ slug: brand-assets
570
+ type: grid
571
+ scopeProfileSlug: brand-asset
572
+ description: Logos, media, documents, and visual references.
573
+ - name: Narrative
574
+ slug: narrative
575
+ type: table
576
+ scopeProfileSlug: positioning
577
+ description: Positioning, audiences, and the differentiators that anchor the message.
578
+
579
+ onboarding:
580
+ goal: >
581
+ Capture the real brand and narrative — the visual + verbal identity, the
582
+ voice rules that keep everything on-brand, the sharp positioning, and who
583
+ it's aimed at — so every downstream domain (Content, Marketing, Social)
584
+ inherits one on-brand, on-message source of truth instead of guessing.
585
+ framing: >
586
+ THE BRAND & COMMS LEAD: Act as the person who owns how this company sounds and
587
+ what story it tells. You are protective of the voice and relentless about the
588
+ narrative. Push for a real, sharp positioning — a category and a wedge, not a
589
+ vague "we help companies with X" — and for documented voice rules (testable
590
+ do/don't pairs), never a pile of adjectives. Translate fuzzy vibes into
591
+ concrete voice guides, rules, and a positioning a stranger could repeat.
592
+ expertise:
593
+ starters:
594
+ - >
595
+ Adjectives don't define a voice — "friendly, bold, human" describes every
596
+ brand and constrains none. Propose voice as a small set of DO / DON'T pairs
597
+ instead ("say 'you', not 'users'"; "short declaratives, never hedged
598
+ qualifiers"). Pairs are testable; adjectives are decoration.
599
+ - >
600
+ Positioning is sharpest as ONE sentence — "the <X> for <who>" or "the only
601
+ <category> that <wedge>". If they give you a vague "we help companies with
602
+ Y", propose a crisp category+wedge framing from what they've told you and
603
+ let them sharpen it — never file the vague version.
604
+ - >
605
+ A voice guide is only real if it survives a sentence test. Take one actual
606
+ line from their site or a competitor's and rewrite it in the proposed voice
607
+ on the spot — if the rewrite looks identical to the original, the voice isn't
608
+ differentiated yet. Push until the two versions are visibly different.
609
+ blindSpots:
610
+ - >
611
+ "Brand = logo" is the classic trap. The logo is the least-used, most-argued
612
+ asset; the voice, the positioning, and the do/don't rules drive 90% of what
613
+ anyone actually ships. If they lead with the logo, redirect to how the brand
614
+ SOUNDS and what story it tells in a paragraph of copy.
615
+ - >
616
+ Rules with no severity are ignored. A pile of equally-weighted "guidelines"
617
+ gives an AI or a teammate nothing to obey — mark each as mandatory,
618
+ important, or guideline so the non-negotiables (forbidden words, contrast,
619
+ clearspace) actually hold under pressure.
620
+ - >
621
+ Positioning that's really a feature list isn't positioning. If "why we win"
622
+ is a bullet list of capabilities, name it — push for the ONE wedge a
623
+ competitor can't easily claim, tied to a specific audience.
624
+ bar: >
625
+ A stranger handed the voice pairs, the positioning sentence, and the audience
626
+ could write a new paragraph that reads unmistakably as THIS brand AND explain
627
+ who it's for and why it wins — every voice rule testable on a real sentence,
628
+ the positioning repeatable in one breath.
629
+ collect:
630
+ - profileSlug: brand-voice-guide
631
+ what: Voice guides — tone, personality traits, vocabulary, and do/don't examples per context.
632
+ cardinality: few
633
+ keyFields: [voice-personality-traits, voice-tone-descriptors, voice-example-do, voice-example-dont]
634
+ - profileSlug: brand-rule
635
+ what: Usage and voice rules (mandatory / important / guideline).
636
+ cardinality: several
637
+ keyFields: [rule-kind, rule-severity, rule-content]
638
+ - profileSlug: positioning
639
+ what: The market category, who we stand against, and why we win.
640
+ cardinality: few
641
+ keyFields: [category, against, because]
642
+ - profileSlug: audience
643
+ what: The ideal audiences the message is aimed at.
644
+ cardinality: several
645
+ keyFields: [segment, jobs-to-be-done]
646
+ openingQuestions:
647
+ - "In three words, how should the brand sound — and what's one thing it must never say?"
648
+ - "Who's the message aimed at — which audience does the brand talk to first?"
649
+ - "In one sentence — what category are you in, and why do you win it?"
650
+ doneWhen: at least one voice guide + one positioning + one audience captured.
651
+
652
+ # App reference — no custom app for communication
653
+ app:
654
+ kind: stored
655
+ cellKey: entity-detail
656
+
657
+ # Layout config for browser sidebar
658
+ layout:
659
+ pinnedApps: [dashboard, data]
660
+ defaultView: Brand Identity
661
+ defaultApp: null
662
+ sidebarItems:
663
+ - kind: view
664
+ viewName: Brand Identity
665
+ label: Brand Identity
666
+ icon: fingerprint
667
+ - kind: view
668
+ viewName: Voice & Rules
669
+ label: Voice & Rules
670
+ icon: message-circle
671
+ - kind: view
672
+ viewName: Assets
673
+ label: Assets
674
+ icon: image
675
+ - kind: view
676
+ viewName: Narrative
677
+ label: Narrative
678
+ icon: crosshair
679
+
680
+ # Bento dashboard
681
+ bento:
682
+ viewName: Brand Identity
683
+ blocks:
684
+ - kind: view
685
+ viewName: Voice & Rules
686
+ pos: { x: 0, y: 0, w: 6, h: 5 }
687
+ - kind: view
688
+ viewName: Narrative
689
+ pos: { x: 6, y: 0, w: 6, h: 5 }