@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
@@ -0,0 +1,516 @@
1
+ # Research workspace template — the agnostic research substrate
2
+ # ============================================================================
3
+ # This is the BASE of the research family: the data model + the knowledge map +
4
+ # the one universal playbook that turns a question into a fully-recorded
5
+ # investigation. It is domain-agnostic on purpose — a physicist, a founder doing
6
+ # market research, and someone learning a subject all use the SAME kinds
7
+ # (field / concept / source / hypothesis / finding) and the SAME graph.
8
+ #
9
+ # The design commitment: store the research PROCESS, not just the answer. Every
10
+ # source the agent considered is kept and ranked (rejected ones carry a reason —
11
+ # nothing is silently dropped); every hypothesis, its supporting AND
12
+ # contradicting evidence, and the reasoning are first-class linked entities. The
13
+ # reasoning-STYLE recipes (decision analysis, literature review, …) ship as thin
14
+ # OVERLAY templates that `compose` onto this base and add their own playbooks —
15
+ # so a user installs the substrate once and adds whichever methods they want.
16
+ #
17
+ # Reuses the pod-wide `question` and `research` kinds so an investigation started
18
+ # here lands where every other workspace already looks.
19
+
20
+ meta:
21
+ slug: research-base
22
+ domain: knowledge
23
+ name: Research
24
+ description: A research substrate — turn a question into a fully-recorded investigation. Sources ranked (nothing dropped), hypotheses weighed, findings mapped onto a living graph of fields and concepts.
25
+ icon: microscope
26
+ color: "#8B5CF6"
27
+ tags: [research, knowledge, graph, sources, evidence, learning]
28
+ isPublic: true
29
+
30
+ workspace:
31
+ name: Research
32
+ description: Turn a question into a fully-recorded investigation — sources ranked, hypotheses weighed, findings mapped onto a living graph of fields and concepts.
33
+ subtype: research-base
34
+ visibility: pod_visible
35
+ capabilities:
36
+ - research.graph
37
+ - research.sources
38
+ sourceRoles:
39
+ research: provider
40
+
41
+ profiles:
42
+ # ── Reused pod-wide kinds (declared minimally so views/links resolve) ───────
43
+ # The pod already seeds `question` and `research` as KINDS (the default); the
44
+ # applier SKIPS properties that already exist, so these declarations exist only
45
+ # to make the SLUG declarable here (the validator resolves view scopes and
46
+ # entityLink endpoints against this template's `profiles`) and to reuse the
47
+ # existing pod-wide row. They MUST be declared as plain kinds to match how the
48
+ # pod seeds them — declaring them as facet-roles conflicts with the existing
49
+ # kind, the resolver SKIPS them on that mismatch, and the views/links scoped to
50
+ # `question`/`research` then throw at provisioning. Enums mirror the live
51
+ # pod-wide ones exactly.
52
+ - slug: question
53
+ displayName: Question
54
+ icon: help-circle
55
+ color: blue
56
+ description: An open question driving an investigation — the thing research answers.
57
+ properties:
58
+ - slug: questionStatus
59
+ label: Status
60
+ valueType: string
61
+ inputType: select
62
+ enumValues: [open, exploring, answered, abandoned]
63
+ constraints: { defaultValue: open }
64
+
65
+ - slug: research
66
+ displayName: Research
67
+ icon: microscope
68
+ color: violet
69
+ description: An investigation — the sources consulted, the findings, the confidence, and the conclusion.
70
+ # A plain kind, same as `question` above — declared to match how the pod seeds it.
71
+ properties:
72
+ - slug: researchStatus
73
+ label: Status
74
+ valueType: string
75
+ inputType: select
76
+ enumValues: [ongoing, concluded, abandoned]
77
+ constraints: { defaultValue: ongoing }
78
+ - slug: conclusion
79
+ label: Conclusion
80
+ valueType: string
81
+ inputType: textarea
82
+ - slug: researchConfidence
83
+ label: Confidence
84
+ valueType: string
85
+ inputType: select
86
+ enumValues: [low, medium, high]
87
+
88
+ # ── The cartography layer — fields & concepts ───────────────────────────────
89
+ # The "big things that overlap and link". A field is a domain (Mathematics, AI,
90
+ # Philosophy); a concept is an atomic idea inside one or more fields. Their
91
+ # edges (part_of / overlaps_with / prerequisite_of) ARE the knowledge map.
92
+ - slug: field
93
+ displayName: Field
94
+ icon: layers
95
+ color: indigo
96
+ description: A domain of knowledge — Mathematics, Physics, AI, Philosophy. Fields overlap and feed each other.
97
+ properties:
98
+ - slug: description
99
+ label: Description
100
+ valueType: string
101
+ inputType: textarea
102
+ - slug: aliases
103
+ label: Also known as
104
+ valueType: array
105
+ inputType: tags
106
+
107
+ - slug: concept
108
+ displayName: Concept
109
+ icon: lightbulb
110
+ color: amber
111
+ description: An atomic idea — Bayesian inference, gradient descent, qualia. Belongs to one or more fields; has prerequisites.
112
+ properties:
113
+ - slug: definition
114
+ label: Definition
115
+ valueType: string
116
+ inputType: textarea
117
+ - slug: aliases
118
+ label: Also known as
119
+ valueType: array
120
+ inputType: tags
121
+
122
+ # ── The evidence layer — sources, hypotheses, findings ──────────────────────
123
+ # `source` is the "rank by quality, lose nothing" primitive: every artifact the
124
+ # agent consulted is kept, banded for credibility, and marked cited / considered
125
+ # / rejected (rejected carries a reason). The rejected pile is part of the work.
126
+ - slug: source
127
+ displayName: Source
128
+ icon: file-text
129
+ color: cyan
130
+ description: Anything consulted — a paper, article, dataset, or post. Ranked by credibility and NEVER discarded; rejected sources are kept with a reason.
131
+ properties:
132
+ - slug: url
133
+ label: URL
134
+ valueType: string
135
+ inputType: url
136
+ - slug: author
137
+ label: Author
138
+ valueType: string
139
+ inputType: text
140
+ - slug: publishedAt
141
+ label: Published
142
+ valueType: date
143
+ inputType: date
144
+ - slug: sourceType
145
+ label: Type
146
+ valueType: string
147
+ inputType: select
148
+ enumValues: [paper, article, book, dataset, blog, video, forum, other]
149
+ constraints: { defaultValue: article }
150
+ - slug: credibilityBand
151
+ label: Credibility
152
+ valueType: string
153
+ inputType: select
154
+ enumValues: [high, medium, low, unknown]
155
+ constraints: { defaultValue: unknown }
156
+ - slug: qualityScore
157
+ label: Quality (0–100)
158
+ valueType: number
159
+ inputType: number
160
+ constraints: { min: 0, max: 100 }
161
+ - slug: status
162
+ label: Status
163
+ valueType: string
164
+ inputType: select
165
+ enumValues: [cited, considered, rejected]
166
+ constraints: { defaultValue: considered }
167
+ - slug: whyRejected
168
+ label: Why rejected
169
+ valueType: string
170
+ inputType: textarea
171
+ - slug: retrievedAt
172
+ label: Retrieved
173
+ valueType: date
174
+ inputType: date
175
+
176
+ - slug: hypothesis
177
+ displayName: Hypothesis
178
+ icon: git-branch
179
+ color: violet
180
+ description: A candidate theory or answer under test — argued for and against by sources.
181
+ properties:
182
+ - slug: statement
183
+ label: Statement
184
+ valueType: string
185
+ inputType: textarea
186
+ - slug: stance
187
+ label: Stance
188
+ valueType: string
189
+ inputType: select
190
+ enumValues: [proposed, supported, contested, refuted, superseded]
191
+ constraints: { defaultValue: proposed }
192
+ - slug: confidence
193
+ label: Confidence
194
+ valueType: string
195
+ inputType: select
196
+ enumValues: [low, medium, high]
197
+ - slug: reasoning
198
+ label: Reasoning
199
+ valueType: string
200
+ inputType: textarea
201
+
202
+ - slug: finding
203
+ displayName: Finding
204
+ icon: check-circle
205
+ color: "#10B981"
206
+ description: A validated fact — the thing established between the question, the sources, and the reasoning. Carries calibrated confidence and links to its evidence.
207
+ properties:
208
+ - slug: claim
209
+ label: Claim
210
+ valueType: string
211
+ inputType: textarea
212
+ - slug: confidence
213
+ label: Confidence (0–1)
214
+ valueType: number
215
+ inputType: number
216
+ constraints: { min: 0, max: 1 }
217
+ - slug: evidenceSummary
218
+ label: Evidence summary
219
+ valueType: string
220
+ inputType: textarea
221
+ - slug: status
222
+ label: Status
223
+ valueType: string
224
+ inputType: select
225
+ enumValues: [validated, provisional, retracted]
226
+ constraints: { defaultValue: provisional }
227
+
228
+ views:
229
+ # The signature view — the living knowledge map. Fields and concepts and what
230
+ # we've established about them, as one navigable graph.
231
+ - name: Knowledge Map
232
+ slug: research-knowledge-map
233
+ type: graph
234
+ scopeProfileSlugs: [field, concept, finding]
235
+ description: The cartography — fields and concepts, their overlaps and prerequisites, and the findings attached to them.
236
+ defaultView: true
237
+ config:
238
+ layout: force
239
+ showRelations: true
240
+ # The daily driver — what still needs answering.
241
+ - name: Open Questions
242
+ slug: research-open-questions
243
+ type: list
244
+ scopeProfileSlug: question
245
+ description: Questions still open — the research backlog.
246
+ config:
247
+ filterBy: { field: questionStatus, operator: is, value: open }
248
+ # The evidence surface, ranked. Nothing is hidden — rejected sources show here
249
+ # too, with their reason.
250
+ - name: Sources
251
+ slug: research-sources
252
+ type: table
253
+ scopeProfileSlug: source
254
+ description: Every source consulted, ranked by credibility — including the ones that were considered and rejected.
255
+ config:
256
+ columns: [title, sourceType, credibilityBand, qualityScore, status]
257
+ - name: Hypotheses
258
+ slug: research-hypotheses
259
+ type: kanban
260
+ scopeProfileSlug: hypothesis
261
+ groupBy: stance
262
+ description: Candidate theories, grouped by where the evidence has left them.
263
+ config:
264
+ groupBy: stance
265
+ - name: Findings
266
+ slug: research-findings
267
+ type: table
268
+ scopeProfileSlug: finding
269
+ description: What's been established, with its confidence.
270
+ config:
271
+ columns: [title, confidence, status]
272
+ - name: Research Log
273
+ slug: research-log
274
+ type: table
275
+ scopeProfileSlug: research
276
+ description: Every investigation and where it stands.
277
+ config:
278
+ columns: [title, researchStatus, researchConfidence]
279
+
280
+ # Schema-level relations — the epistemic predicates. Novel `type`s auto-create
281
+ # their relation-defs on provisioning, so the graph and the relation picker have
282
+ # domain-specific edges from day one.
283
+ entityLinks:
284
+ # Cartography edges
285
+ - {
286
+ sourceProfileSlug: field,
287
+ targetProfileSlug: field,
288
+ type: overlaps_with,
289
+ label: Overlaps with,
290
+ }
291
+ - {
292
+ sourceProfileSlug: concept,
293
+ targetProfileSlug: field,
294
+ type: part_of,
295
+ label: Part of,
296
+ }
297
+ - {
298
+ sourceProfileSlug: concept,
299
+ targetProfileSlug: concept,
300
+ type: prerequisite_of,
301
+ label: Prerequisite of,
302
+ }
303
+ - {
304
+ sourceProfileSlug: concept,
305
+ targetProfileSlug: concept,
306
+ type: relates_to,
307
+ label: Relates to,
308
+ }
309
+ # Investigation edges
310
+ - {
311
+ sourceProfileSlug: research,
312
+ targetProfileSlug: question,
313
+ type: investigates,
314
+ label: Investigates,
315
+ }
316
+ - {
317
+ sourceProfileSlug: hypothesis,
318
+ targetProfileSlug: question,
319
+ type: answers,
320
+ label: Answers,
321
+ }
322
+ - {
323
+ sourceProfileSlug: research,
324
+ targetProfileSlug: source,
325
+ type: explored,
326
+ label: Explored,
327
+ }
328
+ - {
329
+ sourceProfileSlug: research,
330
+ targetProfileSlug: finding,
331
+ type: concluded,
332
+ label: Concluded,
333
+ }
334
+ # Evidence edges
335
+ - {
336
+ sourceProfileSlug: source,
337
+ targetProfileSlug: hypothesis,
338
+ type: supports,
339
+ label: Supports,
340
+ }
341
+ - {
342
+ sourceProfileSlug: source,
343
+ targetProfileSlug: hypothesis,
344
+ type: contradicts,
345
+ label: Contradicts,
346
+ }
347
+ - {
348
+ sourceProfileSlug: source,
349
+ targetProfileSlug: source,
350
+ type: cites,
351
+ label: Cites,
352
+ }
353
+ - {
354
+ sourceProfileSlug: finding,
355
+ targetProfileSlug: research,
356
+ type: derived_from,
357
+ label: Derived from,
358
+ }
359
+ - {
360
+ sourceProfileSlug: finding,
361
+ targetProfileSlug: source,
362
+ type: supported_by,
363
+ label: Supported by,
364
+ }
365
+ - {
366
+ sourceProfileSlug: finding,
367
+ targetProfileSlug: concept,
368
+ type: about,
369
+ label: About,
370
+ }
371
+
372
+ # The one universal playbook — bound to `question`, so any question can launch it
373
+ # from its detail page (see actionPlacements) or auto-match as a session. It runs
374
+ # the full method: gather + rank sources (keep the rejects), form and weigh
375
+ # hypotheses, emit findings with honest confidence, and place them on the map.
376
+ playbooks:
377
+ - name: Research a Question
378
+ description: Investigate a question end-to-end — gather and rank sources (keeping the rejected ones), weigh hypotheses, emit findings with calibrated confidence, and map them onto the knowledge graph.
379
+ goalTemplate: >-
380
+ Investigate the question {question} and record the WHOLE investigation, not
381
+ just the answer. Steps: (1) Use the source-triage skill to gather sources
382
+ widely via web search, classify each by type and credibility, and create a
383
+ `source` entity for every one — including the ones you rejected, marked
384
+ rejected with a reason (never silently drop a source). (2) Form the
385
+ candidate answers as `hypothesis` entities and link each to the question;
386
+ link every source that bears on a hypothesis with `supports` or
387
+ `contradicts`. (3) Use the evidence-synthesis skill to weigh the supporting
388
+ vs contradicting sources and emit `finding` entities with honestly
389
+ calibrated confidence, each `supported_by` its sources and `derived_from`
390
+ this research. (4) Use the concept-cartography skill to place the findings
391
+ onto the knowledge map — resolve or create the `field`/`concept` entities
392
+ and wire `about` / `part_of` / `overlaps_with` / `prerequisite_of` edges,
393
+ deduping against what already exists. (5) Create the `research` entity that
394
+ `investigates` the question and `explored` the sources, write its
395
+ conclusion and confidence, and set the question's status to answered. Every
396
+ write is proposal-gated and reviewable.
397
+ subjectProfile:
398
+ profileSlug: question
399
+ params:
400
+ - { name: question, type: entity, label: Question, required: true }
401
+ executor: is-agent
402
+ grants:
403
+ - source-triage
404
+ - evidence-synthesis
405
+ - concept-cartography
406
+ - exa_search
407
+ - entity.create
408
+ status: active
409
+
410
+ # A "Research this" action on every question's detail page — the entity is the
411
+ # starter of the flow, exactly as designed.
412
+ actionPlacements:
413
+ - profileSlug: question
414
+ surface: entity-detail
415
+ kind: playbook
416
+ ref: "Research a Question"
417
+ label: "Research this"
418
+
419
+ # Web search via Exa (source gathering) + the research method skills. The user
420
+ # connects Exa once on install; a missing key fails gracefully — the agent can
421
+ # still reason over provided/pod sources.
422
+ integrations:
423
+ - templateKey: research-methods
424
+ - templateKey: exa
425
+
426
+ onboarding:
427
+ goal: >
428
+ Seed the workspace with the first real questions worth researching and the
429
+ fields they live in — so the agent has something concrete to investigate, not
430
+ a blank graph.
431
+ framing: |
432
+ THE RESEARCH LEAD: Act as a sharp research lead who cares about the QUESTION
433
+ being well-formed and the EVIDENCE being honest. A vague question ("learn
434
+ about AI") produces vague research; push for a question with a real edge — one
435
+ a good answer would actually change. And insist the work keeps its
436
+ counter-evidence: research that only kept what agreed with it isn't research.
437
+ expertise:
438
+ starters:
439
+ - >
440
+ A researchable question names what would count as an answer. "Is X better
441
+ than Y for Z?" beats "tell me about X" — the first has a shape the
442
+ evidence can fill; the second is a topic, not a question.
443
+ - >
444
+ Name the field(s) the question lives in up front — even roughly. It's the
445
+ first anchor on the map, and it's what lets the system later surface the
446
+ neighbouring field you didn't think to look in.
447
+ blindSpots:
448
+ - >
449
+ The most valuable sources are often the ones that DISAGREE. If the founder
450
+ only wants confirmation, say plainly that a one-sided answer is a weaker
451
+ answer — the method keeps both sides on purpose.
452
+ - >
453
+ "I already know the answer" is where research quietly stops being
454
+ research. If the conclusion is decided before the sources are gathered,
455
+ flag it — the point is to be able to be wrong.
456
+ collect:
457
+ - profileSlug: question
458
+ what: The first real questions worth investigating — each with a genuine edge, not a topic.
459
+ cardinality: few
460
+ keyFields: [questionStatus]
461
+ - profileSlug: field
462
+ what: The fields these questions live in — the first anchors on the knowledge map.
463
+ cardinality: few
464
+ keyFields: [description]
465
+ openingQuestions:
466
+ - "What's a question you actually want a well-evidenced answer to — one where a good answer would change what you do?"
467
+ - "Which field(s) does it sit in — and is there a neighbouring field it might borrow from?"
468
+ - "What would count as a convincing answer, and what would change your mind?"
469
+ doneWhen: >
470
+ At least one well-formed question captured with its field(s) anchored on the
471
+ map, ready for the Research a Question playbook to run against.
472
+
473
+ app:
474
+ kind: stored
475
+ cellKey: entity-detail
476
+
477
+ layout:
478
+ defaultView: Knowledge Map
479
+ defaultApp: null
480
+ pinnedApps: [dashboard, data, chat]
481
+ sidebarItems:
482
+ - kind: view
483
+ viewName: Knowledge Map
484
+ label: Map
485
+ icon: layers
486
+ - kind: view
487
+ viewName: Open Questions
488
+ label: Questions
489
+ icon: help-circle
490
+ - kind: view
491
+ viewName: Sources
492
+ label: Sources
493
+ icon: file-text
494
+ - kind: view
495
+ viewName: Findings
496
+ label: Findings
497
+ icon: check-circle
498
+ - kind: app
499
+ appId: data
500
+ label: Data
501
+ icon: database
502
+
503
+ bento:
504
+ # Its own view row (distinct name from the embedded views, per the
505
+ # meetings-knowledge note — a shared name collides in the switcher).
506
+ viewName: Research Home
507
+ blocks:
508
+ - kind: view
509
+ viewName: Knowledge Map
510
+ pos: { x: 0, y: 0, w: 8, h: 6 }
511
+ - kind: view
512
+ viewName: Open Questions
513
+ pos: { x: 8, y: 0, w: 4, h: 3 }
514
+ - kind: view
515
+ viewName: Findings
516
+ pos: { x: 8, y: 3, w: 4, h: 3 }
@@ -0,0 +1,158 @@
1
+ # Decision Analysis overlay — a reasoning-STYLE that composes onto research-base
2
+ # ============================================================================
3
+ # One reasoning model, shipped as a thin overlay: IBIS (Issue → Positions →
4
+ # Arguments). It adds the "Decision Analysis" playbook + the decision-specific
5
+ # links to the SAME research substrate — it does NOT create a second workspace.
6
+ # `dependencies: [{ slug: research-base, relation: compose }]` layers this
7
+ # additively onto the research-base workspace (installing base first if absent).
8
+ #
9
+ # This is the pattern for the whole reasoning-model family: make each style its
10
+ # own overlay file (decision, literature-review/Toulmin, competitive scan,
11
+ # study-a-subject) and let the user compose whichever ones they want onto the one
12
+ # base. Here we ship the decision style — the one that fits "weigh option A vs B
13
+ # with the evidence, and keep why the loser lost".
14
+
15
+ meta:
16
+ slug: research-decision
17
+ domain: knowledge
18
+ name: Decision Analysis
19
+ description: Turn an open question into a decision — options weighed with evidence, and the roads-not-taken preserved with the reasons they lost. Composes onto the Research substrate.
20
+ icon: scale
21
+ color: "#F59E0B"
22
+ tags: [research, decision, ibis, analysis, evidence]
23
+ isPublic: true
24
+
25
+ workspace:
26
+ name: Research
27
+ description: Adds the IBIS decision-analysis method to the Research substrate — weigh options with evidence and record the decision, not just the winner.
28
+ subtype: research-base
29
+
30
+ # Layer additively onto the research-base workspace (no second workspace).
31
+ dependencies:
32
+ - slug: research-base
33
+ relation: compose
34
+ reason: Decision Analysis is a research method — it needs the Research substrate (question / source / hypothesis / finding) to work over.
35
+
36
+ profiles:
37
+ # Slugs this overlay references in its links / views / playbook must be
38
+ # declared here for the per-file validator (base owns their full schema; the
39
+ # applier skips already-existing properties). Enums mirror the pod-wide defs.
40
+ - slug: question
41
+ displayName: Question
42
+ icon: help-circle
43
+ color: blue
44
+ description: The open question being decided.
45
+ # Pod-wide `question` is a first-class KIND (Decision 1 — the manifest retired
46
+ # w4.convert.question to a keep no-op). Declared as a plain kind to match the
47
+ # seed + research-base and reuse the existing pod-wide row.
48
+ properties:
49
+ - slug: questionStatus
50
+ label: Status
51
+ valueType: string
52
+ inputType: select
53
+ enumValues: [open, exploring, answered, abandoned]
54
+ constraints: { defaultValue: open }
55
+
56
+ - slug: hypothesis
57
+ displayName: Option
58
+ icon: git-branch
59
+ color: violet
60
+ description: A candidate option under consideration — argued for and against by sources.
61
+ properties:
62
+ - slug: stance
63
+ label: Stance
64
+ valueType: string
65
+ inputType: select
66
+ enumValues: [proposed, supported, contested, refuted, superseded]
67
+ constraints: { defaultValue: proposed }
68
+
69
+ - slug: decision
70
+ displayName: Decision
71
+ icon: scale
72
+ color: amber
73
+ description: A resolved decision — the recommendation, why it won, and the alternatives that lost (and why).
74
+ # Pod-wide `decision` is a first-class KIND (Decision 1 — w4.convert.decision
75
+ # retired to a keep no-op). Declared as a plain kind to match the seed; the
76
+ # `resolves` / `considered_in` links resolve against the reused pod-wide row.
77
+ properties:
78
+ - slug: summary
79
+ label: Summary
80
+ valueType: string
81
+ inputType: text
82
+ - slug: rationale
83
+ label: Rationale
84
+ valueType: string
85
+ inputType: textarea
86
+ - slug: alternatives
87
+ label: Alternatives considered
88
+ valueType: string
89
+ inputType: textarea
90
+ - slug: decisionStatus
91
+ label: Status
92
+ valueType: string
93
+ inputType: select
94
+ enumValues: [proposed, accepted, superseded, rejected]
95
+ constraints: { defaultValue: proposed }
96
+
97
+ views:
98
+ - name: Decisions
99
+ slug: research-decisions
100
+ type: table
101
+ scopeProfileSlug: decision
102
+ description: Every decision reached, its recommendation, and where it stands.
103
+ config:
104
+ columns: [title, summary, decisionStatus]
105
+
106
+ entityLinks:
107
+ - {
108
+ sourceProfileSlug: decision,
109
+ targetProfileSlug: question,
110
+ type: resolves,
111
+ label: Resolves,
112
+ }
113
+ - {
114
+ sourceProfileSlug: hypothesis,
115
+ targetProfileSlug: decision,
116
+ type: considered_in,
117
+ label: Considered in,
118
+ }
119
+
120
+ playbooks:
121
+ - name: Decision Analysis
122
+ description: Structure an open question as a decision via IBIS — enumerate the options, argue each with evidence (keeping the rejected sources), weigh against explicit criteria, and record the decision with its roads-not-taken.
123
+ goalTemplate: >-
124
+ Analyze the question {question} as a DECISION and record the reasoning, not
125
+ just the verdict, using the ibis-decision-analysis skill. Steps: (1) State
126
+ the issue sharply so the options are genuinely mutually exclusive. (2)
127
+ Enumerate the real options — including the status-quo — as `hypothesis`
128
+ entities linked to the question, and to the resulting decision via
129
+ `considered_in`. (3) For each option, gather the sources that `supports` and
130
+ those that `contradicts` it (use source gathering; KEEP the rejected
131
+ sources with a reason — never drop the counter-evidence). (4) Weigh the
132
+ options against explicit, named criteria (cost, reversibility, risk, time,
133
+ evidence strength). (5) Record the recommendation as a `decision` entity
134
+ that `resolves` the question — its rationale explains why it won, and its
135
+ `alternatives` field preserves the options that lost and WHY. (6) Note what
136
+ evidence would change the decision. Every write is proposal-gated.
137
+ subjectProfile:
138
+ profileSlug: question
139
+ params:
140
+ - { name: question, type: entity, label: Question, required: true }
141
+ executor: is-agent
142
+ grants:
143
+ - ibis-decision-analysis
144
+ - source-triage
145
+ - exa_search
146
+ - entity.create
147
+ status: active
148
+
149
+ actionPlacements:
150
+ - profileSlug: question
151
+ surface: entity-detail
152
+ kind: playbook
153
+ ref: "Decision Analysis"
154
+ label: "Analyze as decision"
155
+
156
+ integrations:
157
+ - templateKey: research-methods
158
+ - templateKey: exa