@synap-core/workspace-templates 0.2.2 → 0.4.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.
@@ -0,0 +1,485 @@
1
+ # Finance workspace template
2
+ # A pragmatic startup CFO's operating model: cash, receivables, spend, revenue,
3
+ # budgets, and the vital signs (runway / burn / MRR). Provider of the `finance`
4
+ # domain; consumes `strategy` from Foundation for pricing/positioning context.
5
+
6
+ meta:
7
+ slug: finance
8
+ name: Finance
9
+ description: The company's money model — accounts, receivables, spend, revenue streams, budgets, and runway.
10
+ icon: banknote
11
+ color: "#16A34A"
12
+ tags: [finance, accounting, revenue]
13
+ isPublic: true
14
+
15
+ workspace:
16
+ name: Finance
17
+ description: Startup finance workspace — bank/ledger accounts, invoices (AR), expenses (AP), revenue streams, budgets, and the runway/burn/MRR metrics that keep the company alive.
18
+ proposalId: finance-v1
19
+ subtype: finance
20
+ visibility: members
21
+ workspaceType: operational
22
+ capabilities:
23
+ - finance.accounts
24
+ - finance.revenue
25
+ - finance.expenses
26
+ # Finance PROVIDES the finance domain, and CONSUMES strategy (Foundation) so
27
+ # pricing/positioning context informs revenue modeling. The concrete provider
28
+ # workspaceId for `strategy` is resolved at runtime (defaultSources), so it is
29
+ # expressed here declaratively via the consumer source role.
30
+ sourceRoles:
31
+ finance: provider
32
+ strategy: consumer
33
+
34
+ profiles:
35
+ - slug: account
36
+ displayName: Account
37
+ icon: landmark
38
+ color: green
39
+ description: A bank, credit, or ledger account holding company cash.
40
+ properties:
41
+ - slug: account-type
42
+ label: Type
43
+ valueType: string
44
+ inputType: select
45
+ enumValues: [checking, savings, credit-card, ledger, investment, other]
46
+ constraints: { defaultValue: checking }
47
+ - slug: institution
48
+ label: Institution
49
+ valueType: string
50
+ inputType: text
51
+ placeholder: e.g. Mercury, Chase
52
+ - slug: balance
53
+ label: Current Balance
54
+ valueType: number
55
+ inputType: number
56
+ - slug: currency
57
+ label: Currency
58
+ valueType: string
59
+ inputType: select
60
+ enumValues: [USD, EUR, GBP, other]
61
+ constraints: { defaultValue: USD }
62
+ - slug: status
63
+ label: Status
64
+ valueType: string
65
+ inputType: select
66
+ enumValues: [active, dormant, closed]
67
+ constraints: { defaultValue: active }
68
+ - slug: last-four
69
+ label: Account (last 4)
70
+ valueType: string
71
+ inputType: text
72
+
73
+ - slug: invoice
74
+ displayName: Invoice
75
+ icon: receipt
76
+ color: blue
77
+ description: An accounts-receivable invoice — money customers owe us.
78
+ properties:
79
+ - slug: invoice-number
80
+ label: Invoice #
81
+ valueType: string
82
+ inputType: text
83
+ - slug: status
84
+ label: Status
85
+ valueType: string
86
+ inputType: select
87
+ enumValues: [draft, sent, paid, overdue, void]
88
+ constraints: { defaultValue: draft }
89
+ - slug: amount
90
+ label: Amount
91
+ valueType: number
92
+ inputType: number
93
+ - slug: currency
94
+ label: Currency
95
+ valueType: string
96
+ inputType: select
97
+ enumValues: [USD, EUR, GBP, other]
98
+ constraints: { defaultValue: USD }
99
+ - slug: customer
100
+ label: Customer
101
+ valueType: string
102
+ inputType: text
103
+ - slug: issue-date
104
+ label: Issue Date
105
+ valueType: date
106
+ inputType: date
107
+ - slug: due-date
108
+ label: Due Date
109
+ valueType: date
110
+ inputType: date
111
+ - slug: paid-date
112
+ label: Paid Date
113
+ valueType: date
114
+ inputType: date
115
+
116
+ - slug: expense
117
+ displayName: Expense
118
+ icon: credit-card
119
+ color: orange
120
+ description: An accounts-payable expense or spend commitment.
121
+ properties:
122
+ - slug: category
123
+ label: Category
124
+ valueType: string
125
+ inputType: select
126
+ enumValues: [payroll, software, marketing, rent, travel, contractors, taxes, other]
127
+ constraints: { defaultValue: other }
128
+ - slug: status
129
+ label: Status
130
+ valueType: string
131
+ inputType: select
132
+ enumValues: [pending, approved, paid, reimbursed, rejected]
133
+ constraints: { defaultValue: pending }
134
+ - slug: amount
135
+ label: Amount
136
+ valueType: number
137
+ inputType: number
138
+ - slug: vendor
139
+ label: Vendor
140
+ valueType: string
141
+ inputType: text
142
+ - slug: expense-date
143
+ label: Date
144
+ valueType: date
145
+ inputType: date
146
+ - slug: recurring
147
+ label: Recurring
148
+ valueType: boolean
149
+ inputType: checkbox
150
+ - slug: payment-method
151
+ label: Payment Method
152
+ valueType: string
153
+ inputType: text
154
+
155
+ - slug: revenue-stream
156
+ displayName: Revenue Stream
157
+ icon: trending-up
158
+ color: teal
159
+ description: A source of revenue — recurring subscription, services, or one-off.
160
+ properties:
161
+ - slug: stream-type
162
+ label: Type
163
+ valueType: string
164
+ inputType: select
165
+ enumValues: [subscription, usage, services, one-off, licensing, other]
166
+ constraints: { defaultValue: subscription }
167
+ - slug: status
168
+ label: Status
169
+ valueType: string
170
+ inputType: select
171
+ enumValues: [active, paused, churned, planned]
172
+ constraints: { defaultValue: active }
173
+ - slug: mrr
174
+ label: MRR
175
+ valueType: number
176
+ inputType: number
177
+ - slug: arr
178
+ label: ARR
179
+ valueType: number
180
+ inputType: number
181
+ - slug: billing-cadence
182
+ label: Billing Cadence
183
+ valueType: string
184
+ inputType: select
185
+ enumValues: [monthly, quarterly, annual, one-time]
186
+ constraints: { defaultValue: monthly }
187
+ - slug: customer-segment
188
+ label: Customer Segment
189
+ valueType: string
190
+ inputType: text
191
+ - slug: start-date
192
+ label: Start Date
193
+ valueType: date
194
+ inputType: date
195
+
196
+ - slug: budget
197
+ displayName: Budget
198
+ icon: pie-chart
199
+ color: violet
200
+ description: A planned spend allocation for a category and period, tracked vs actual.
201
+ properties:
202
+ - slug: category
203
+ label: Category
204
+ valueType: string
205
+ inputType: select
206
+ enumValues: [payroll, marketing, product, sales, ops, g-and-a, other]
207
+ constraints: { defaultValue: other }
208
+ - slug: period
209
+ label: Period
210
+ valueType: string
211
+ inputType: select
212
+ enumValues: [monthly, quarterly, annual]
213
+ constraints: { defaultValue: quarterly }
214
+ - slug: fiscal-year
215
+ label: Fiscal Year
216
+ valueType: string
217
+ inputType: text
218
+ placeholder: e.g. FY2026
219
+ - slug: budgeted-amount
220
+ label: Budgeted
221
+ valueType: number
222
+ inputType: number
223
+ - slug: actual-amount
224
+ label: Actual
225
+ valueType: number
226
+ inputType: number
227
+ - slug: status
228
+ label: Status
229
+ valueType: string
230
+ inputType: select
231
+ enumValues: [on-track, at-risk, over-budget]
232
+ constraints: { defaultValue: on-track }
233
+ - slug: owner
234
+ label: Owner
235
+ valueType: string
236
+ inputType: text
237
+
238
+ - slug: financial-metric
239
+ displayName: Financial Metric
240
+ icon: gauge
241
+ color: amber
242
+ description: A tracked vital sign — runway, burn rate, MRR, cash balance, margin.
243
+ properties:
244
+ - slug: metric-type
245
+ label: Metric
246
+ valueType: string
247
+ inputType: select
248
+ enumValues: [runway, burn-rate, mrr, arr, cash-balance, gross-margin, cac, ltv, other]
249
+ constraints: { defaultValue: runway }
250
+ - slug: value
251
+ label: Value
252
+ valueType: number
253
+ inputType: number
254
+ - slug: unit
255
+ label: Unit
256
+ valueType: string
257
+ inputType: select
258
+ enumValues: [months, currency, percent, ratio]
259
+ constraints: { defaultValue: months }
260
+ - slug: as-of-date
261
+ label: As Of
262
+ valueType: date
263
+ inputType: date
264
+ - slug: period
265
+ label: Period
266
+ valueType: string
267
+ inputType: select
268
+ enumValues: [point-in-time, monthly, quarterly, annual]
269
+ constraints: { defaultValue: point-in-time }
270
+ - slug: target
271
+ label: Target
272
+ valueType: number
273
+ inputType: number
274
+ - slug: trend
275
+ label: Trend
276
+ valueType: string
277
+ inputType: select
278
+ enumValues: [up, flat, down]
279
+
280
+ views:
281
+ - name: Accounts
282
+ slug: accounts
283
+ type: table
284
+ scopeProfileSlug: account
285
+ description: All cash, credit, and ledger accounts with balances.
286
+ config:
287
+ columns: [title, account-type, institution, balance, currency, status]
288
+ - name: Invoices
289
+ slug: invoices
290
+ type: table
291
+ scopeProfileSlug: invoice
292
+ defaultView: true
293
+ description: Accounts receivable — who owes us, how much, and when it's due.
294
+ config:
295
+ columns: [title, invoice-number, status, amount, customer, due-date, paid-date]
296
+ defaultSort:
297
+ field: due-date
298
+ direction: asc
299
+ - name: Expenses
300
+ slug: expenses
301
+ type: kanban
302
+ scopeProfileSlug: expense
303
+ groupBy: status
304
+ description: Accounts payable and spend, grouped by approval/payment status.
305
+ config:
306
+ groupBy: status
307
+ cardFields: [category, amount, vendor, expense-date]
308
+ - name: Revenue
309
+ slug: revenue
310
+ type: table
311
+ scopeProfileSlug: revenue-stream
312
+ description: Revenue streams with MRR/ARR and billing cadence.
313
+ config:
314
+ columns: [title, stream-type, status, mrr, arr, billing-cadence, customer-segment]
315
+ defaultSort:
316
+ field: mrr
317
+ direction: desc
318
+ - name: Budget vs Actual
319
+ slug: budget-vs-actual
320
+ type: table
321
+ scopeProfileSlug: budget
322
+ description: Planned spend against actuals, by category and period.
323
+ config:
324
+ columns: [title, category, period, fiscal-year, budgeted-amount, actual-amount, status]
325
+ - name: Runway & Metrics
326
+ slug: runway-metrics
327
+ type: table
328
+ scopeProfileSlug: financial-metric
329
+ description: The vital signs — runway, burn, MRR, cash balance — vs target.
330
+ config:
331
+ columns: [title, metric-type, value, unit, target, trend, as-of-date]
332
+ defaultSort:
333
+ field: as-of-date
334
+ direction: desc
335
+
336
+ # Schema-level links — give the finance graph and relation picker sensible
337
+ # domain edges from day one.
338
+ entityLinks:
339
+ - sourceProfileSlug: invoice
340
+ targetProfileSlug: account
341
+ type: deposited_to
342
+ label: Deposited to
343
+ - sourceProfileSlug: expense
344
+ targetProfileSlug: budget
345
+ type: counts_against
346
+ label: Counts against
347
+ - sourceProfileSlug: expense
348
+ targetProfileSlug: account
349
+ type: paid_from
350
+ label: Paid from
351
+ - sourceProfileSlug: revenue-stream
352
+ targetProfileSlug: account
353
+ type: deposits_to
354
+ label: Deposits to
355
+
356
+ onboarding:
357
+ goal: Capture the company's real money model — where cash sits, what revenue comes in, what it burns on, and its current runway — so the workspace reflects the actual financial position, not a generic ledger.
358
+ framing: >
359
+ THE CFO: Act as a pragmatic, numerate startup CFO. Get to the truth of the
360
+ company's finances fast: how much cash is in the bank, what's coming in and
361
+ from where, what it burns each month, and how many months of runway that
362
+ leaves. Push for real numbers over estimates, flag anything that doesn't add
363
+ up, and tie revenue back to the company's positioning and pricing (from
364
+ Foundation) so the model is grounded in strategy, not spreadsheets.
365
+ expertise:
366
+ starters:
367
+ - >
368
+ Don't reconstruct a full P&L on day one — default the model to the three
369
+ numbers that keep a startup alive: cash in bank, monthly net burn, and
370
+ runway (cash ÷ burn, in months). Propose those first and layer detail later;
371
+ a founder who knows their runway to the month is ahead of one with a
372
+ beautiful chart of accounts.
373
+ - >
374
+ Add a small set of unit economics, not a whole finance stack: gross margin,
375
+ CAC, and LTV (or at minimum LTV:CAC ratio). Propose sensible defaults —
376
+ payback under ~12 months, LTV:CAC above ~3:1 — as reference points to react
377
+ to, rather than asking them to define metrics from scratch.
378
+ - >
379
+ Model cash on a timing basis, not an accrual one. When they give you revenue,
380
+ ask when the cash actually LANDS — Net-30/60 invoices, annual prepay,
381
+ Stripe payout lag — and capture that gap explicitly, because a profitable
382
+ month can still run the account dry.
383
+ blindSpots:
384
+ - >
385
+ Revenue ≠ cash. Founders book an annual contract and feel rich, but the cash
386
+ arrives monthly or after Net-60 — meanwhile payroll is due Friday. If they
387
+ conflate the two, separate signed bookings from collected cash before
388
+ computing anything.
389
+ - >
390
+ Runway is THE number that predicts survival, and it's the one most often
391
+ stale. If there's no current runway figure — or it hasn't been recomputed
392
+ since the last big hire or price change — that's the first gap to close.
393
+ Everything else is secondary to "how many months of oxygen is left".
394
+ - >
395
+ Bookings, revenue, and cash are three different numbers and founders routinely
396
+ merge them. A signed deal (booking), revenue recognized over its term, and
397
+ the money in the account are rarely equal in any given month. Name which one
398
+ each figure is, or the whole model lies.
399
+ bar: >
400
+ A stranger could open the workspace and answer three questions in ten seconds:
401
+ how much cash is in the bank, how much it burns a month, and how many months of
402
+ runway that leaves — with revenue captured on a cash-timing basis, bookings kept
403
+ distinct from collected cash, and at least a rough gross margin and LTV:CAC in view.
404
+ collect:
405
+ - profileSlug: account
406
+ what: The bank and credit accounts holding company cash, with current balances.
407
+ cardinality: few
408
+ keyFields: [title, account-type, balance]
409
+ - profileSlug: revenue-stream
410
+ what: How the company makes money — each recurring or one-off revenue stream and its MRR/ARR.
411
+ cardinality: several
412
+ keyFields: [title, stream-type, mrr]
413
+ - profileSlug: expense
414
+ what: The biggest recurring and one-off costs — payroll, software, contractors, rent.
415
+ cardinality: several
416
+ keyFields: [title, category, amount]
417
+ - profileSlug: financial-metric
418
+ what: The current vital signs, above all RUNWAY (months of cash left) plus burn rate and MRR.
419
+ cardinality: few
420
+ keyFields: [metric-type, value, unit]
421
+ openingQuestions:
422
+ - How much cash is in the bank right now, and across which accounts?
423
+ - Where does revenue come from today, and roughly what's the monthly recurring amount?
424
+ - What do you burn in a typical month — and how many months of runway does that leave?
425
+ doneWhen: At least one account with a balance, the main revenue streams, the largest expenses, and a runway metric are all captured with real numbers.
426
+
427
+ app:
428
+ kind: stored
429
+ cellKey: entity-detail
430
+
431
+ layout:
432
+ defaultView: Invoices
433
+ defaultApp: null
434
+ pinnedApps: [dashboard, data, intelligence]
435
+ sidebarItems:
436
+ - kind: view
437
+ viewName: Runway & Metrics
438
+ label: Runway & Metrics
439
+ icon: gauge
440
+ - kind: view
441
+ viewName: Accounts
442
+ label: Accounts
443
+ icon: landmark
444
+ - kind: view
445
+ viewName: Invoices
446
+ label: Invoices
447
+ icon: receipt
448
+ - kind: view
449
+ viewName: Expenses
450
+ label: Expenses
451
+ icon: credit-card
452
+ - kind: view
453
+ viewName: Revenue
454
+ label: Revenue
455
+ icon: trending-up
456
+ - kind: view
457
+ viewName: Budget vs Actual
458
+ label: Budget vs Actual
459
+ icon: pie-chart
460
+ - kind: app
461
+ appId: data
462
+ label: All Data
463
+ icon: database
464
+
465
+ bento:
466
+ viewName: Finance Command Center
467
+ blocks:
468
+ - kind: view
469
+ viewName: Runway & Metrics
470
+ pos: { x: 0, y: 0, w: 8, h: 4 }
471
+ - kind: view
472
+ viewName: Accounts
473
+ pos: { x: 8, y: 0, w: 4, h: 4 }
474
+ - kind: view
475
+ viewName: Invoices
476
+ pos: { x: 0, y: 4, w: 6, h: 4 }
477
+ - kind: view
478
+ viewName: Expenses
479
+ pos: { x: 6, y: 4, w: 6, h: 4 }
480
+ - kind: view
481
+ viewName: Revenue
482
+ pos: { x: 0, y: 8, w: 6, h: 4 }
483
+ - kind: view
484
+ viewName: Budget vs Actual
485
+ pos: { x: 6, y: 8, w: 6, h: 4 }
@@ -254,6 +254,40 @@ onboarding:
254
254
  THE COFOUNDER: Act as a sharp, skeptical co-founder. Pressure-test why-now, why-you, and
255
255
  why-this. Refuse fuzzy answers; push for specifics and evidence. Be
256
256
  respectful but direct — a vague mission helps no one.
257
+ expertise:
258
+ starters:
259
+ - >
260
+ A mission is a CHANGE in the world, not a description of the product
261
+ ("make complex products understandable", not "we make explainer videos").
262
+ If they describe the deliverable, reflect the underlying change back and
263
+ propose THAT as the mission.
264
+ - >
265
+ Positioning is sharpest as ONE sentence — "the <X> for <who>" or "the only
266
+ <category> that <wedge>". If they give you a vague "we help companies with
267
+ Y", propose a crisp category+wedge framing from what they've told you and
268
+ let them sharpen it — never file the vague version.
269
+ - >
270
+ Audience is a SPECIFIC buyer at a specific stage ("Head of Product
271
+ Marketing at Series A–B technical SaaS"), not a market ("SaaS companies").
272
+ Push from the market to the person who actually signs off.
273
+ blindSpots:
274
+ - >
275
+ Founders skip the NON-goal — what they deliberately DON'T do. A company
276
+ with no "no" has no focus. If they haven't named boundaries, ask what they
277
+ turn down.
278
+ - >
279
+ A differentiator that's just "we're better / faster / care more" isn't
280
+ defensible. Push for a structural moat a competitor can't easily copy — and
281
+ if it's founder-dependent (bus-factor), capture that honestly rather than
282
+ dressing it up.
283
+ - >
284
+ The #1 tells of fuzzy strategy: a mission that's really a deliverable, and
285
+ positioning that's really a feature list. When you see either, name it and
286
+ dig.
287
+ bar: >
288
+ A stranger could read the mission, audience, and positioning and instantly
289
+ explain WHO this is for, WHAT changes for them, and WHY this company over the
290
+ alternatives — in one breath, with no fluff.
257
291
  collect:
258
292
  - profileSlug: mission
259
293
  what: The one mission that anchors the company — what we serve, what we change, why now.
@@ -334,11 +368,3 @@ bento:
334
368
  - kind: view
335
369
  viewName: Pain Points
336
370
  pos: { x: 6, y: 4, w: 6, h: 4 }
337
-
338
- seedEntities:
339
- - profileSlug: mission
340
- title: Example Mission
341
- properties:
342
- statement: "Example — replace this: we help [audience] [change] so they can [outcome], starting now because [why now]."
343
- time-horizon: 3 years
344
- status: active