@synap-core/workspace-templates 0.7.1 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/index.d.ts +266 -8
  2. package/dist/index.js +2314 -1440
  3. package/dist/index.js.map +1 -1
  4. package/package.json +4 -3
  5. package/src/agent-fleet.yaml +666 -108
  6. package/src/blockchain-ecosystem.yaml +1 -0
  7. package/src/brand-library.yaml +127 -12
  8. package/src/builder.yaml +116 -12
  9. package/src/business-developer.yaml +110 -18
  10. package/src/catalog.test.ts +2 -2
  11. package/src/catalog.ts +13 -3
  12. package/src/communication.yaml +23 -453
  13. package/src/composition-graph.test.ts +28 -2
  14. package/src/concept-guard.test.ts +176 -0
  15. package/src/concept-guard.ts +219 -0
  16. package/src/content-os.yaml +103 -10
  17. package/src/content-studio.yaml +1 -0
  18. package/src/crm.yaml +1 -0
  19. package/src/define.ts +8 -8
  20. package/src/dev-dashboard.yaml +43 -9
  21. package/src/domains.test.ts +117 -0
  22. package/src/domains.ts +102 -0
  23. package/src/ecosystem.yaml +25 -5
  24. package/src/enterprise-os.yaml +1 -0
  25. package/src/finance.yaml +46 -5
  26. package/src/foundation.yaml +13 -1
  27. package/src/generate.d.mts +15 -0
  28. package/src/generate.mjs +86 -0
  29. package/src/grants.yaml +1 -0
  30. package/src/hr.yaml +61 -8
  31. package/src/index.ts +40 -0
  32. package/src/internal-runbook.yaml +36 -5
  33. package/src/legal.yaml +97 -12
  34. package/src/life-os.yaml +188 -27
  35. package/src/marketing.yaml +15 -2
  36. package/src/meetings-knowledge.yaml +143 -23
  37. package/src/operations.yaml +347 -0
  38. package/src/outreach-comms.yaml +11 -3
  39. package/src/project-management.yaml +840 -111
  40. package/src/research-base.yaml +516 -0
  41. package/src/research-decision.yaml +158 -0
  42. package/src/shared-role-ssot.test.ts +268 -0
  43. package/src/social.yaml +105 -37
  44. package/src/templates-freshness.test.ts +55 -0
  45. package/src/templates.ts +4620 -4278
  46. package/src/the-arch.yaml +1 -0
  47. package/src/types.ts +9 -0
  48. package/src/validate.test.ts +81 -0
  49. package/src/validate.ts +561 -0
  50. package/src/personal.yaml +0 -177
package/src/life-os.yaml CHANGED
@@ -6,6 +6,7 @@
6
6
 
7
7
  meta:
8
8
  slug: life-os
9
+ domain: knowledge
9
10
  name: Second Brain — Knowledge OS
10
11
  description: A sovereign personal knowledge management workspace. Capture everything, connect ideas, build your external brain.
11
12
  icon: brain
@@ -229,7 +230,16 @@ profiles:
229
230
  label: Relationship
230
231
  valueType: string
231
232
  inputType: select
232
- enumValues: [mentor, colleague, friend, family, acquaintance, author, collaborator]
233
+ enumValues:
234
+ [
235
+ mentor,
236
+ colleague,
237
+ friend,
238
+ family,
239
+ acquaintance,
240
+ author,
241
+ collaborator,
242
+ ]
233
243
  - slug: last-contact
234
244
  label: Last Contact
235
245
  valueType: date
@@ -806,12 +816,26 @@ views:
806
816
  kind: widget
807
817
  widgetType: entity-count
808
818
  pos: { x: 3, y: 2, w: 3, h: 2 }
809
- config: { profileSlug: note, label: In Inbox, icon: Inbox, filter: { status: inbox }, color: amber }
819
+ config:
820
+ {
821
+ profileSlug: note,
822
+ label: In Inbox,
823
+ icon: Inbox,
824
+ filter: { status: inbox },
825
+ color: amber,
826
+ }
810
827
  - id: nd-b4
811
828
  kind: widget
812
829
  widgetType: entity-count
813
830
  pos: { x: 6, y: 2, w: 3, h: 2 }
814
- config: { profileSlug: note, label: Evergreen, icon: Leaf, filter: { status: evergreen }, color: green }
831
+ config:
832
+ {
833
+ profileSlug: note,
834
+ label: Evergreen,
835
+ icon: Leaf,
836
+ filter: { status: evergreen },
837
+ color: green,
838
+ }
815
839
  - id: nd-b5
816
840
  kind: widget
817
841
  widgetType: entity-count
@@ -835,32 +859,71 @@ views:
835
859
  kind: widget
836
860
  widgetType: entity-count
837
861
  pos: { x: 0, y: 2, w: 3, h: 2 }
838
- config: { profileSlug: book, label: Currently Reading, icon: BookOpen, filter: { status: reading }, color: blue }
862
+ config:
863
+ {
864
+ profileSlug: book,
865
+ label: Currently Reading,
866
+ icon: BookOpen,
867
+ filter: { status: reading },
868
+ color: blue,
869
+ }
839
870
  - id: bd-b3
840
871
  kind: widget
841
872
  widgetType: entity-count
842
873
  pos: { x: 3, y: 2, w: 3, h: 2 }
843
- config: { profileSlug: book, label: Books Read, icon: CheckCircle, filter: { status: completed }, color: green }
874
+ config:
875
+ {
876
+ profileSlug: book,
877
+ label: Books Read,
878
+ icon: CheckCircle,
879
+ filter: { status: completed },
880
+ color: green,
881
+ }
844
882
  - id: bd-b4
845
883
  kind: widget
846
884
  widgetType: entity-count
847
885
  pos: { x: 6, y: 2, w: 3, h: 2 }
848
- config: { profileSlug: book, label: To Read, icon: List, filter: { status: want-to-read }, color: purple }
886
+ config:
887
+ {
888
+ profileSlug: book,
889
+ label: To Read,
890
+ icon: List,
891
+ filter: { status: want-to-read },
892
+ color: purple,
893
+ }
849
894
  - id: bd-b5
850
895
  kind: widget
851
896
  widgetType: entity-count
852
897
  pos: { x: 9, y: 2, w: 3, h: 2 }
853
- config: { profileSlug: highlight, label: Total Highlights, icon: Highlighter }
898
+ config:
899
+ {
900
+ profileSlug: highlight,
901
+ label: Total Highlights,
902
+ icon: Highlighter,
903
+ }
854
904
  - id: bd-b6
855
905
  kind: widget
856
906
  widgetType: entity-gallery
857
907
  pos: { x: 0, y: 4, w: 8, h: 4 }
858
- config: { profileSlug: book, filter: { status: reading }, coverField: cover-url, title: Currently Reading, limit: 8 }
908
+ config:
909
+ {
910
+ profileSlug: book,
911
+ filter: { status: reading },
912
+ coverField: cover-url,
913
+ title: Currently Reading,
914
+ limit: 8,
915
+ }
859
916
  - id: bd-b7
860
917
  kind: widget
861
918
  widgetType: quote-card
862
919
  pos: { x: 8, y: 4, w: 4, h: 4 }
863
- config: { profileSlug: quote, textField: text, authorField: author, seed: daily }
920
+ config:
921
+ {
922
+ profileSlug: quote,
923
+ textField: text,
924
+ authorField: author,
925
+ seed: daily,
926
+ }
864
927
  - id: bd-b8
865
928
  kind: view
866
929
  viewName: Reading List
@@ -884,12 +947,26 @@ views:
884
947
  kind: widget
885
948
  widgetType: entity-count
886
949
  pos: { x: 4, y: 2, w: 4, h: 2 }
887
- config: { profileSlug: concept, label: Evergreen, icon: Leaf, filter: { maturity: evergreen }, color: green }
950
+ config:
951
+ {
952
+ profileSlug: concept,
953
+ label: Evergreen,
954
+ icon: Leaf,
955
+ filter: { maturity: evergreen },
956
+ color: green,
957
+ }
888
958
  - id: cd-b4
889
959
  kind: widget
890
960
  widgetType: entity-count
891
961
  pos: { x: 8, y: 2, w: 4, h: 2 }
892
- config: { profileSlug: concept, label: Seeds, icon: Sprout, filter: { maturity: seed }, color: amber }
962
+ config:
963
+ {
964
+ profileSlug: concept,
965
+ label: Seeds,
966
+ icon: Sprout,
967
+ filter: { maturity: seed },
968
+ color: amber,
969
+ }
893
970
  - id: cd-b5
894
971
  kind: view
895
972
  viewName: All Concepts
@@ -913,12 +990,24 @@ views:
913
990
  kind: widget
914
991
  widgetType: entity-count
915
992
  pos: { x: 4, y: 2, w: 4, h: 2 }
916
- config: { profileSlug: person, label: Mentors, icon: Star, filter: { relationship: mentor } }
993
+ config:
994
+ {
995
+ profileSlug: person,
996
+ label: Mentors,
997
+ icon: Star,
998
+ filter: { relationship: mentor },
999
+ }
917
1000
  - id: pd-b4
918
1001
  kind: widget
919
1002
  widgetType: entity-count
920
1003
  pos: { x: 8, y: 2, w: 4, h: 2 }
921
- config: { profileSlug: person, label: Authors, icon: BookOpen, filter: { relationship: author } }
1004
+ config:
1005
+ {
1006
+ profileSlug: person,
1007
+ label: Authors,
1008
+ icon: BookOpen,
1009
+ filter: { relationship: author },
1010
+ }
922
1011
  - id: pd-b5
923
1012
  kind: view
924
1013
  viewName: People Network
@@ -937,22 +1026,50 @@ views:
937
1026
  kind: widget
938
1027
  widgetType: entity-count
939
1028
  pos: { x: 0, y: 2, w: 3, h: 2 }
940
- config: { profileSlug: project, label: Active, icon: Play, filter: { status: active }, color: green }
1029
+ config:
1030
+ {
1031
+ profileSlug: project,
1032
+ label: Active,
1033
+ icon: Play,
1034
+ filter: { status: active },
1035
+ color: green,
1036
+ }
941
1037
  - id: prd-b3
942
1038
  kind: widget
943
1039
  widgetType: entity-count
944
1040
  pos: { x: 3, y: 2, w: 3, h: 2 }
945
- config: { profileSlug: project, label: Planning, icon: Map, filter: { status: planning }, color: blue }
1041
+ config:
1042
+ {
1043
+ profileSlug: project,
1044
+ label: Planning,
1045
+ icon: Map,
1046
+ filter: { status: planning },
1047
+ color: blue,
1048
+ }
946
1049
  - id: prd-b4
947
1050
  kind: widget
948
1051
  widgetType: entity-count
949
1052
  pos: { x: 6, y: 2, w: 3, h: 2 }
950
- config: { profileSlug: project, label: On Hold, icon: PauseCircle, filter: { status: on-hold }, color: amber }
1053
+ config:
1054
+ {
1055
+ profileSlug: project,
1056
+ label: On Hold,
1057
+ icon: PauseCircle,
1058
+ filter: { status: on-hold },
1059
+ color: amber,
1060
+ }
951
1061
  - id: prd-b5
952
1062
  kind: widget
953
1063
  widgetType: entity-count
954
1064
  pos: { x: 9, y: 2, w: 3, h: 2 }
955
- config: { profileSlug: project, label: Completed, icon: CheckCircle, filter: { status: completed }, color: purple }
1065
+ config:
1066
+ {
1067
+ profileSlug: project,
1068
+ label: Completed,
1069
+ icon: CheckCircle,
1070
+ filter: { status: completed },
1071
+ color: purple,
1072
+ }
956
1073
  - id: prd-b6
957
1074
  kind: view
958
1075
  viewName: Active Projects
@@ -971,12 +1088,24 @@ views:
971
1088
  kind: widget
972
1089
  widgetType: quote-card
973
1090
  pos: { x: 0, y: 2, w: 6, h: 4 }
974
- config: { profileSlug: quote, textField: text, authorField: author, seed: daily }
1091
+ config:
1092
+ {
1093
+ profileSlug: quote,
1094
+ textField: text,
1095
+ authorField: author,
1096
+ seed: daily,
1097
+ }
975
1098
  - id: qd-b3
976
1099
  kind: widget
977
1100
  widgetType: entity-list
978
1101
  pos: { x: 6, y: 2, w: 6, h: 4 }
979
- config: { profileSlug: quote, title: Latest Quotes, limit: 6, sort: { field: created-at, direction: desc } }
1102
+ config:
1103
+ {
1104
+ profileSlug: quote,
1105
+ title: Latest Quotes,
1106
+ limit: 6,
1107
+ sort: { field: created-at, direction: desc },
1108
+ }
980
1109
  - id: qd-b4
981
1110
  kind: view
982
1111
  viewName: All Quotes
@@ -995,12 +1124,19 @@ views:
995
1124
  kind: widget
996
1125
  widgetType: entity-count
997
1126
  pos: { x: 0, y: 2, w: 6, h: 2 }
998
- config: { profileSlug: area, label: Active Areas, icon: Compass, filter: { status: active } }
1127
+ config:
1128
+ {
1129
+ profileSlug: area,
1130
+ label: Active Areas,
1131
+ icon: Compass,
1132
+ filter: { status: active },
1133
+ }
999
1134
  - id: ad-b3
1000
1135
  kind: widget
1001
1136
  widgetType: entity-count
1002
1137
  pos: { x: 6, y: 2, w: 6, h: 2 }
1003
- config: { profileSlug: project, label: Total Projects, icon: FolderOpen }
1138
+ config:
1139
+ { profileSlug: project, label: Total Projects, icon: FolderOpen }
1004
1140
  - id: ad-b4
1005
1141
  kind: view
1006
1142
  viewName: All Areas
@@ -1128,7 +1264,12 @@ bento:
1128
1264
  - kind: widget
1129
1265
  widgetType: welcome-header
1130
1266
  pos: { x: 0, y: 0, w: 12, h: 2 }
1131
- config: { title: "Good morning — Your Second Brain", subtitle: "Everything you know, connected.", showDate: true }
1267
+ config:
1268
+ {
1269
+ title: "Good morning — Your Second Brain",
1270
+ subtitle: "Everything you know, connected.",
1271
+ showDate: true,
1272
+ }
1132
1273
  - kind: widget
1133
1274
  widgetType: entity-count
1134
1275
  pos: { x: 0, y: 2, w: 3, h: 2 }
@@ -1167,14 +1308,16 @@ bento:
1167
1308
  - kind: widget
1168
1309
  widgetType: reading-progress
1169
1310
  pos: { x: 4, y: 8, w: 4, h: 4 }
1170
- config: { profileSlug: book, pageField: current-page, totalPagesField: pages }
1311
+ config:
1312
+ { profileSlug: book, pageField: current-page, totalPagesField: pages }
1171
1313
  - kind: view
1172
1314
  viewName: Inbox Notes
1173
1315
  pos: { x: 8, y: 8, w: 4, h: 4 }
1174
1316
  - kind: widget
1175
1317
  widgetType: entity-spotlight
1176
1318
  pos: { x: 0, y: 12, w: 4, h: 4 }
1177
- config: { profileSlug: note, seed: daily, layout: detail, color: "#6366F1" }
1319
+ config:
1320
+ { profileSlug: note, seed: daily, layout: detail, color: "#6366F1" }
1178
1321
  - kind: widget
1179
1322
  widgetType: random-highlight
1180
1323
  pos: { x: 4, y: 12, w: 4, h: 4 }
@@ -1214,7 +1357,13 @@ profileEntityBentoTemplates:
1214
1357
  kind: widget
1215
1358
  widgetType: reading-progress
1216
1359
  pos: { x: 8, y: 0, w: 4, h: 3 }
1217
- config: { profileSlug: book, pageField: current-page, totalPagesField: pages, label: Progress }
1360
+ config:
1361
+ {
1362
+ profileSlug: book,
1363
+ pageField: current-page,
1364
+ totalPagesField: pages,
1365
+ label: Progress,
1366
+ }
1218
1367
  - id: book-eb-b3
1219
1368
  kind: widget
1220
1369
  widgetType: entity-list
@@ -1302,7 +1451,13 @@ profileEntityBentoTemplates:
1302
1451
  kind: widget
1303
1452
  widgetType: entity-count
1304
1453
  pos: { x: 8, y: 0, w: 4, h: 3 }
1305
- config: { profileSlug: project, label: Projects, icon: FolderOpen, color: green }
1454
+ config:
1455
+ {
1456
+ profileSlug: project,
1457
+ label: Projects,
1458
+ icon: FolderOpen,
1459
+ color: green,
1460
+ }
1306
1461
  - id: area-eb-b3
1307
1462
  kind: widget
1308
1463
  widgetType: entity-list
@@ -1319,7 +1474,13 @@ profileEntityBentoTemplates:
1319
1474
  kind: widget
1320
1475
  widgetType: metrics-summary
1321
1476
  pos: { x: 8, y: 0, w: 4, h: 3 }
1322
- config: { profileSlug: project, property: progress, aggregation: average, title: Avg Project Progress }
1477
+ config:
1478
+ {
1479
+ profileSlug: project,
1480
+ property: progress,
1481
+ aggregation: average,
1482
+ title: Avg Project Progress,
1483
+ }
1323
1484
  - id: goal-eb-b3
1324
1485
  kind: widget
1325
1486
  widgetType: entity-list
@@ -3,6 +3,7 @@
3
3
 
4
4
  meta:
5
5
  slug: marketing-campaign
6
+ domain: revenue
6
7
  name: Marketing Campaigns
7
8
  description: "Track leads, manage campaigns, and let AI help run your outreach. Contacts, pipeline, tasks, and AI briefings — all connected."
8
9
  icon: megaphone
@@ -57,7 +58,8 @@ profiles:
57
58
  label: Channel
58
59
  valueType: string
59
60
  inputType: select
60
- enumValues: [email, social, event, content, partnership, paid, organic, other]
61
+ enumValues:
62
+ [email, social, event, content, partnership, paid, organic, other]
61
63
  - slug: campaign-goal
62
64
  label: Goal
63
65
  valueType: string
@@ -170,7 +172,18 @@ profiles:
170
172
  label: Source
171
173
  valueType: string
172
174
  inputType: select
173
- enumValues: [organic, referral, social, email, event, paid, content, partnership, other]
175
+ enumValues:
176
+ [
177
+ organic,
178
+ referral,
179
+ social,
180
+ email,
181
+ event,
182
+ paid,
183
+ content,
184
+ partnership,
185
+ other,
186
+ ]
174
187
  - slug: lead-email
175
188
  label: Email
176
189
  valueType: string
@@ -6,6 +6,7 @@
6
6
 
7
7
  meta:
8
8
  slug: meetings-knowledge
9
+ domain: knowledge
9
10
  name: Meetings & Knowledge
10
11
  description: Import and summarize meetings — transcripts become notes, action items become tasks, and attendees become tracked people.
11
12
  icon: video
@@ -25,26 +26,92 @@ workspace:
25
26
  meetings: provider
26
27
 
27
28
  profiles:
28
- # ── Meeting (owned here) ─────────────────────────────────────────────────
29
+ # ── Reused pod-wide kinds ────────────────────────────────────────────────
30
+ # Declared minimally because the workspace-definition validator resolves view
31
+ # scopes and entityLink endpoints ONLY against the slugs declared here — a
32
+ # referenced-but-undeclared slug throws at install time, it does not fall
33
+ # through to the pod-wide kind. Kept light on purpose: these kinds are owned
34
+ # pod-wide (identity + full schema live there), this is just the local grant.
35
+ - slug: person
36
+ displayName: Person
37
+ icon: user
38
+ color: amber
39
+ description: A meeting attendee.
40
+ properties:
41
+ - slug: email
42
+ label: Email
43
+ valueType: string
44
+ inputType: email
45
+
46
+ - slug: task
47
+ displayName: Task
48
+ icon: check-square
49
+ color: blue
50
+ description: An action item that came out of a meeting.
51
+ properties:
52
+ # NOTE: the pod-wide `task` already ships `status` and `dueDate`, and the
53
+ # applier SKIPS properties that already exist — so these are not what makes
54
+ # the kanban work. They are restated only so the SLUG is declarable here
55
+ # (the validator resolves view scopes against this template's `profiles`).
56
+ # The enum mirrors the live pod-wide one exactly; diverging would be
57
+ # misleading since the declaration is skipped and the real lanes win.
58
+ - slug: status
59
+ label: Status
60
+ valueType: string
61
+ inputType: select
62
+ enumValues: [todo, in-progress, done, cancelled]
63
+ constraints: { defaultValue: todo }
64
+ - slug: dueDate
65
+ label: Due
66
+ valueType: date
67
+ inputType: date
68
+
69
+ - slug: note
70
+ displayName: Note
71
+ icon: file-text
72
+ color: violet
73
+ description: A note or summary captured from a meeting.
74
+ properties:
75
+ - slug: content
76
+ label: Content
77
+ valueType: string
78
+ inputType: textarea
79
+
80
+ # ── Event (reused pod-wide kind — the meeting's IDENTITY) ────────────────
81
+ # The pod already seeds `event`, and the live Google Calendar sync writes
82
+ # `entities.type = "event"`. A parallel `meeting` KIND would therefore sit
83
+ # empty beside a synced calendar AND mint a second entity for the same
84
+ # real-world meeting. Identity lives here; the meeting-ness is a role below.
85
+ - slug: event
86
+ displayName: Event
87
+ icon: calendar
88
+ color: sky
89
+ description: A calendar event — the thing a meeting actually is.
90
+ properties:
91
+ - slug: startDate
92
+ label: Start
93
+ valueType: date
94
+ inputType: date
95
+
96
+ # ── Meeting (a ROLE the event plays — NOT a second entity) ───────────────
97
+ # Kind-vs-Facets rule: a role an entity PLAYS is a facet attached to the real
98
+ # thing, never its own kind. Date/attendees/location come from the `event`;
99
+ # only these four are genuinely new. The import playbook ATTACHES this role to
100
+ # the already-synced event rather than creating a duplicate.
29
101
  - slug: meeting
30
102
  displayName: Meeting
31
103
  icon: video
32
104
  color: violet
33
- description: A meeting — its date, attendees, and what came out of it.
105
+ scope: shared
106
+ profileKind: role
107
+ applicableKinds: [event]
108
+ description: The meeting hat an event wears — platform, transcript, and what came out of it.
34
109
  properties:
35
- - slug: meetingDate
36
- label: Date
37
- valueType: date
38
- inputType: date
39
110
  - slug: platform
40
111
  label: Platform
41
112
  valueType: string
42
113
  inputType: select
43
114
  enumValues: [zoom, google-meet, teams, in-person, other]
44
- - slug: attendees
45
- label: Attendees
46
- valueType: array
47
- inputType: text
48
115
  - slug: status
49
116
  label: Status
50
117
  valueType: string
@@ -67,13 +134,37 @@ views:
67
134
  scopeProfileSlug: meeting
68
135
  description: Every meeting, its platform, and whether it's been processed.
69
136
  config:
70
- columns: [title, meetingDate, platform, status]
137
+ columns: [title, startDate, platform, status]
138
+ # The workspace's daily question: which meetings happened but haven't been
139
+ # imported+summarized yet. This is the one action the workspace exists to
140
+ # prompt, so it is the landing view — not the full table.
141
+ - name: Needs Processing
142
+ slug: meetings-unprocessed
143
+ type: list
144
+ scopeProfileSlug: meeting
145
+ description: Meetings that happened but haven't been imported and summarized yet.
146
+ config:
147
+ filterBy: { field: status, operator: is, value: completed }
71
148
  defaultView: true
149
+ # Summaries the playbook writes land here — without a view they're invisible.
150
+ - name: Meeting Notes
151
+ slug: meeting-notes
152
+ type: list
153
+ scopeProfileSlug: note
154
+ description: Summaries and notes produced from meetings.
72
155
  - name: Meetings Calendar
73
156
  slug: meetings-calendar
74
157
  type: calendar
75
158
  scopeProfileSlug: meeting
76
159
  description: Meetings on a calendar, keyed on their date.
160
+ # The date comes from the underlying `event` (startDate), not the meeting
161
+ # role. NOTE the `properties.` prefix is REQUIRED: the calendar resolves
162
+ # dateField with a dotted-path walker against the entity, so a bare
163
+ # `startDate` reads `entity.startDate` (undefined) and only renders at all
164
+ # by falling through the hardcoded dueDate→startDate→startTime chain.
165
+ config:
166
+ dateField: properties.startDate
167
+ colorBy: status
77
168
  - name: Action Items
78
169
  slug: meeting-action-items
79
170
  type: kanban
@@ -114,7 +205,12 @@ playbooks:
114
205
  profileSlug: meeting
115
206
  params:
116
207
  - { name: meeting, type: entity, label: Meeting, required: true }
117
- - { name: outputTypes, type: text, label: Outputs, defaultValue: "a summary note, action-item tasks, and updated attendee records" }
208
+ - {
209
+ name: outputTypes,
210
+ type: text,
211
+ label: Outputs,
212
+ defaultValue: "a summary note, action-item tasks, and updated attendee records",
213
+ }
118
214
  executor: is-agent
119
215
  grants:
120
216
  - fireflies_import_last_meeting
@@ -152,20 +248,41 @@ onboarding:
152
248
  Recurring meetings (standups, 1:1s) get skipped because they feel
153
249
  routine — but their action items are exactly what falls through the
154
250
  cracks. Don't let "it's just a standup" excuse skipping capture.
251
+ - >
252
+ "Attendees" as a list of names is not attendee capture — it's a string.
253
+ If the summary says "Sarah will send the deck" and Sarah isn't a tracked
254
+ person linked to that task, the next meeting with Sarah starts from zero
255
+ again. Resolve every attendee to a real person, or say out loud that
256
+ you're choosing not to.
257
+ - >
258
+ A summary nobody re-reads is theatre. The test for a good meeting note is
259
+ whether someone who missed the call could act from it alone — if it needs
260
+ the transcript to make sense, it isn't a summary yet.
155
261
  bar: >
156
- A handful of recent meetings are logged with a real summary and at least
157
- one action item each, so the Import & Summarize playbook has something
158
- concrete to run against.
262
+ The PIPE is live, not the rows: transcript source and calendar connected,
263
+ the Import & Summarize playbook run once end-to-end on a real recent
264
+ meeting, and the output inspected together — a note a human would actually
265
+ keep, tasks that are genuinely actionable, and attendees resolved to
266
+ tracked people rather than name strings. If the first import produces vague
267
+ tasks ("follow up"), fix the extraction bar now, not after fifty meetings.
159
268
  collect:
269
+ # Deliberately NOT a backfill. The import playbook fills date, summary,
270
+ # attendees and action items — asking the human to type them here would
271
+ # invert the product's whole loop (capture → AI structures it). The only
272
+ # thing the agent can't infer is which meetings deserve the pipe.
160
273
  - profileSlug: meeting
161
- what: Recent or upcoming meetings worth tracking.
274
+ what: >
275
+ Which recurring meetings are worth importing every time — the standing
276
+ 1:1s, the weekly ops call. A watchlist, not a backlog.
162
277
  cardinality: few
163
- keyFields: [meetingDate, platform]
278
+ keyFields: [platform]
164
279
  openingQuestions:
165
- - "What meetings do you want tracked — recurring ones, or just the important ones?"
166
- - "Where do your meetings live — Zoom, Google Meet, somewhere else?"
167
- - "Do you already record/transcribe them, or should that start now?"
168
- doneWhen: A few meetings captured with a date and platform, at least one with a summary.
280
+ - "Name a meeting from last week whose outcome you can't remember. What did that cost you?"
281
+ - "When a meeting produces an action item, where does it go today — and does it survive the week?"
282
+ - "Which recurring meeting would you cancel if you could see its action-item completion rate?"
283
+ doneWhen: >
284
+ Transcript source connected and one real meeting imported end-to-end —
285
+ summary note, at least one action item, and attendees resolved to people.
169
286
 
170
287
  app:
171
288
  kind: stored
@@ -174,7 +291,7 @@ app:
174
291
  layout:
175
292
  defaultView: Meetings
176
293
  defaultApp: null
177
- pinnedApps: [dashboard, data]
294
+ pinnedApps: [dashboard, data, chat]
178
295
  sidebarItems:
179
296
  - kind: view
180
297
  viewName: Meetings
@@ -194,7 +311,10 @@ layout:
194
311
  icon: database
195
312
 
196
313
  bento:
197
- viewName: Meetings
314
+ # Distinct from the "Meetings" table it embeds — the bento is created as its
315
+ # OWN view row, so reusing an embedded view's name puts two identically-named
316
+ # views in the switcher and makes layout.defaultView ambiguous.
317
+ viewName: Meetings Home
198
318
  blocks:
199
319
  - kind: view
200
320
  viewName: Meetings