@synap-core/workspace-templates 0.28.0 → 0.30.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synap-core/workspace-templates",
3
- "version": "0.28.0",
3
+ "version": "0.30.0",
4
4
  "type": "module",
5
5
  "description": "Canonical workspace definitions — YAML source + typed exports for browser, backend, CLI, and marketplace",
6
6
  "repository": {
package/src/builder.yaml CHANGED
@@ -1062,6 +1062,77 @@ profiles:
1062
1062
  inputType: textarea
1063
1063
  constraints: { maxLength: 5000 }
1064
1064
 
1065
+ # A problem with our own product or process, worked by "Fix a finding" below.
1066
+ # Declared as the founder's pod holds it (pod-local profile 0f1eb707, founder
1067
+ # decision on card catalog-home, session 7416a988, 7 Nov 2026): pod-wide rows,
1068
+ # so a finding filed from any space is one list. Property slugs are the live
1069
+ # ones (`supersededby` included) so a reconcile onto that pod adds nothing. Two
1070
+ # differences, both from the catalog's coverage rules: `wont_fix` and
1071
+ # `superseded` are humanOnly (an agent's move into a lost option proposes
1072
+ # anyway), and the unlabelled legacy `ek-claim` is left out. Not research-base's `finding` (a validated fact with a claim and a
1073
+ # confidence): that slug clash is plan b38e5e64 decision 5, a rename of the
1074
+ # Research kind that waits on a data conversion.
1075
+ - slug: finding
1076
+ displayName: Finding
1077
+ icon: bug
1078
+ color: "#F97316"
1079
+ description: A problem report or feedback item, with a severity, raised against our own product or process. Moves open → fixing → fixed → verified, or won't fix / superseded.
1080
+ scope: shared
1081
+ entityScope: pod
1082
+ profileKind: kind
1083
+ lifecycle:
1084
+ property: status
1085
+ options:
1086
+ - { key: open, category: open }
1087
+ - { key: fixing, category: active }
1088
+ - { key: fixed, category: done }
1089
+ - { key: verified, category: done }
1090
+ - { key: wont_fix, category: lost, humanOnly: true }
1091
+ - { key: superseded, category: lost, humanOnly: true }
1092
+ properties:
1093
+ - slug: status
1094
+ label: Status
1095
+ valueType: string
1096
+ inputType: select
1097
+ enumValues: [open, fixing, fixed, verified, wont_fix, superseded]
1098
+ constraints: { defaultValue: open }
1099
+ - slug: severity
1100
+ label: Severity
1101
+ valueType: string
1102
+ inputType: select
1103
+ enumValues: [low, medium, high, critical]
1104
+ - slug: area
1105
+ label: Product area
1106
+ valueType: string
1107
+ inputType: text
1108
+ description: "Where it hurts: pod, mcp, bridge, cli, relay, browser, pod-admin, control-plane, governance, infra, process."
1109
+ - slug: evidence
1110
+ label: Evidence
1111
+ valueType: string
1112
+ inputType: textarea
1113
+ constraints: { maxLength: 2000 }
1114
+ description: Proposal, session, file:line, log line or URL that shows it.
1115
+ - slug: summary
1116
+ label: Summary
1117
+ valueType: string
1118
+ inputType: text
1119
+ constraints: { maxLength: 500 }
1120
+ - slug: description
1121
+ label: Description
1122
+ valueType: string
1123
+ inputType: textarea
1124
+ constraints: { maxLength: 5000 }
1125
+ - slug: content
1126
+ label: Content
1127
+ valueType: string
1128
+ inputType: textarea
1129
+ constraints: { maxLength: 50000 }
1130
+ - slug: supersededby
1131
+ label: Superseded by
1132
+ valueType: entity_id
1133
+ inputType: entity_select
1134
+ description: "The record that replaced this finding: the canonical finding it duplicates, or the correct diagnosis when this one was wrong. Recall leaves a superseded finding out."
1135
+
1065
1136
  - slug: skill
1066
1137
  displayName: Skill
1067
1138
  icon: zap
@@ -2853,6 +2924,47 @@ playbooks:
2853
2924
  statement: Every criterion of the session is graded with its evidence, and nothing unverified is reported as verified.
2854
2925
  description: 'Shared land stage. Never report unverified work as verified. File the lesson, decision or finding the work produced (engineering-memory skill, rule dogfood-journal). Close what you opened: asks answered or withdrawn, worktree removed once merged, then synap_complete_session. Tools: synap_update_session, synap_capture, synap_complete_session. Gate: none. Model tier: quick (advisory until a tier field exists).'
2855
2926
 
2927
+ # Founder's pod playbook 18abd1ea, as it runs since 6 Nov 2026: no onEnd
2928
+ # (decision f06dc507: a cancelled or failed session leaves its finding where it
2929
+ # is) and no statusProperty (it follows the kind's lifecycle, backend#853).
2930
+ # The two pod automations that move it (PR merged → merged, deployed →
2931
+ # verified) are not shipped: their session_update step scopes on
2932
+ # `whenPlaybookId`, a pod uuid, and there is no catalog-stable reference yet.
2933
+ - name: Fix a finding
2934
+ description: "Work one finding (a problem with Synap itself) until its fix is live. The session's stages move the finding: fixing while the work runs, fixed when the fix is merged, verified once it runs on the pod. A cancelled or failed session leaves the finding where it is."
2935
+ goalTemplate: Fix the finding and see the fix live
2936
+ scope: session
2937
+ subjectProfile:
2938
+ profileSlug: finding
2939
+ statusProperty: status
2940
+ # The options no stage owns (catalog lifecycle coverage): `open` is where a
2941
+ # finding starts, `wont_fix` and `superseded` are a call made outside the fix.
2942
+ # With no onEnd nothing moves a finding into them, and a finding in them has
2943
+ # no stage to bind a session to anyway.
2944
+ humanOnlyStatuses:
2945
+ - open
2946
+ - wont_fix
2947
+ - superseded
2948
+ params: []
2949
+ executor: is-agent
2950
+ status: active
2951
+ stages:
2952
+ - key: fix
2953
+ name: Fix it
2954
+ goal: Find the root cause and ship the fix as a gated PR or commit
2955
+ category: started
2956
+ subjectStatus: fixing
2957
+ - key: merged
2958
+ name: Fix merged
2959
+ goal: The fix is on main (a merged PR or a gated commit)
2960
+ category: started
2961
+ subjectStatus: fixed
2962
+ - key: verified
2963
+ name: Live and verified
2964
+ goal: The fix runs on the pod (its build contains the fix) and the finding no longer happens
2965
+ category: completed
2966
+ subjectStatus: verified
2967
+
2856
2968
  onboarding:
2857
2969
  goal: Capture the real engineering surface — the apps that are shipped, where their code lives, what runs behind them, where they deploy, and what's in flight — so the workspace mirrors what the team actually builds and runs, not a generic template.
2858
2970
  framing: >
@@ -147,7 +147,7 @@ describe("meta.intent — the catalog", () => {
147
147
  expect(table["operations"]).toEqual(["Delivery", "engagement", "deliverable"]);
148
148
  expect(table["content-os"]).toEqual(["Content", "post", "newsletter", "campaign"]);
149
149
  expect(table["finance"]).toEqual(["Finance", "invoice", "expense"]);
150
- expect(table["research-base"]).toEqual(["Research", "hypothesis", "finding"]);
150
+ expect(table["research-base"]).toEqual(["Research", "hypothesis", "research-finding"]);
151
151
  });
152
152
 
153
153
  it("libraries carry a label only; overlays and packs carry none", () => {
@@ -31,7 +31,7 @@ meta:
31
31
  label: Research
32
32
  produces:
33
33
  - profile: hypothesis
34
- - profile: finding
34
+ - profile: research-finding
35
35
 
36
36
  workspace:
37
37
  name: Research
@@ -214,7 +214,7 @@ profiles:
214
214
  valueType: string
215
215
  inputType: textarea
216
216
 
217
- - slug: finding
217
+ - slug: research-finding
218
218
  displayName: Finding
219
219
  icon: check-circle
220
220
  color: "#10B981"
@@ -253,7 +253,7 @@ views:
253
253
  - name: Knowledge Map
254
254
  slug: research-knowledge-map
255
255
  type: graph
256
- scopeProfileSlugs: [field, concept, finding]
256
+ scopeProfileSlugs: [field, concept, research-finding]
257
257
  description: The cartography — fields and concepts, their overlaps and prerequisites, and the findings attached to them.
258
258
  defaultView: true
259
259
  config:
@@ -287,7 +287,7 @@ views:
287
287
  - name: Findings
288
288
  slug: research-findings
289
289
  type: table
290
- scopeProfileSlug: finding
290
+ scopeProfileSlug: research-finding
291
291
  description: What's been established, with its confidence.
292
292
  config:
293
293
  columns: [title, confidence, status]
@@ -349,7 +349,7 @@ entityLinks:
349
349
  }
350
350
  - {
351
351
  sourceProfileSlug: research,
352
- targetProfileSlug: finding,
352
+ targetProfileSlug: research-finding,
353
353
  type: concluded,
354
354
  label: Concluded,
355
355
  }
@@ -373,19 +373,19 @@ entityLinks:
373
373
  label: Cites,
374
374
  }
375
375
  - {
376
- sourceProfileSlug: finding,
376
+ sourceProfileSlug: research-finding,
377
377
  targetProfileSlug: research,
378
378
  type: derived_from,
379
379
  label: Derived from,
380
380
  }
381
381
  - {
382
- sourceProfileSlug: finding,
382
+ sourceProfileSlug: research-finding,
383
383
  targetProfileSlug: source,
384
384
  type: supported_by,
385
385
  label: Supported by,
386
386
  }
387
387
  - {
388
- sourceProfileSlug: finding,
388
+ sourceProfileSlug: research-finding,
389
389
  targetProfileSlug: concept,
390
390
  type: about,
391
391
  label: About,
@@ -410,7 +410,7 @@ playbooks:
410
410
  rejected with a reason (never silently drop a source). WEIGH: form the
411
411
  candidate answers as `hypothesis` entities that answer the question; link
412
412
  every source that bears on a hypothesis with `supports` or
413
- `contradicts`; use the evidence-synthesis skill to emit `finding`
413
+ `contradicts`; use the evidence-synthesis skill to emit `research-finding`
414
414
  entities with honestly calibrated confidence, each `supported_by` its
415
415
  sources and `derived_from` this research; use the concept-cartography
416
416
  skill to place the findings onto the knowledge map. ANSWER: create the
@@ -486,7 +486,7 @@ playbooks:
486
486
  and link each one derived_from the finding. Quote only what the sources
487
487
  support.
488
488
  subjectProfile:
489
- profileSlug: finding
489
+ profileSlug: research-finding
490
490
  statusProperty: status
491
491
  activators:
492
492
  - { on: enters_status, status: validated, mode: propose }
package/src/templates.ts CHANGED
@@ -5212,6 +5212,129 @@ const DATA = {
5212
5212
  }
5213
5213
  ]
5214
5214
  },
5215
+ {
5216
+ "slug": "finding",
5217
+ "displayName": "Finding",
5218
+ "icon": "bug",
5219
+ "color": "#F97316",
5220
+ "description": "A problem report or feedback item, with a severity, raised against our own product or process. Moves open → fixing → fixed → verified, or won't fix / superseded.",
5221
+ "scope": "shared",
5222
+ "entityScope": "pod",
5223
+ "profileKind": "kind",
5224
+ "lifecycle": {
5225
+ "property": "status",
5226
+ "options": [
5227
+ {
5228
+ "key": "open",
5229
+ "category": "open"
5230
+ },
5231
+ {
5232
+ "key": "fixing",
5233
+ "category": "active"
5234
+ },
5235
+ {
5236
+ "key": "fixed",
5237
+ "category": "done"
5238
+ },
5239
+ {
5240
+ "key": "verified",
5241
+ "category": "done"
5242
+ },
5243
+ {
5244
+ "key": "wont_fix",
5245
+ "category": "lost",
5246
+ "humanOnly": true
5247
+ },
5248
+ {
5249
+ "key": "superseded",
5250
+ "category": "lost",
5251
+ "humanOnly": true
5252
+ }
5253
+ ]
5254
+ },
5255
+ "properties": [
5256
+ {
5257
+ "slug": "status",
5258
+ "label": "Status",
5259
+ "valueType": "string",
5260
+ "inputType": "select",
5261
+ "enumValues": [
5262
+ "open",
5263
+ "fixing",
5264
+ "fixed",
5265
+ "verified",
5266
+ "wont_fix",
5267
+ "superseded"
5268
+ ],
5269
+ "constraints": {
5270
+ "defaultValue": "open"
5271
+ }
5272
+ },
5273
+ {
5274
+ "slug": "severity",
5275
+ "label": "Severity",
5276
+ "valueType": "string",
5277
+ "inputType": "select",
5278
+ "enumValues": [
5279
+ "low",
5280
+ "medium",
5281
+ "high",
5282
+ "critical"
5283
+ ]
5284
+ },
5285
+ {
5286
+ "slug": "area",
5287
+ "label": "Product area",
5288
+ "valueType": "string",
5289
+ "inputType": "text",
5290
+ "description": "Where it hurts: pod, mcp, bridge, cli, relay, browser, pod-admin, control-plane, governance, infra, process."
5291
+ },
5292
+ {
5293
+ "slug": "evidence",
5294
+ "label": "Evidence",
5295
+ "valueType": "string",
5296
+ "inputType": "textarea",
5297
+ "constraints": {
5298
+ "maxLength": 2000
5299
+ },
5300
+ "description": "Proposal, session, file:line, log line or URL that shows it."
5301
+ },
5302
+ {
5303
+ "slug": "summary",
5304
+ "label": "Summary",
5305
+ "valueType": "string",
5306
+ "inputType": "text",
5307
+ "constraints": {
5308
+ "maxLength": 500
5309
+ }
5310
+ },
5311
+ {
5312
+ "slug": "description",
5313
+ "label": "Description",
5314
+ "valueType": "string",
5315
+ "inputType": "textarea",
5316
+ "constraints": {
5317
+ "maxLength": 5000
5318
+ }
5319
+ },
5320
+ {
5321
+ "slug": "content",
5322
+ "label": "Content",
5323
+ "valueType": "string",
5324
+ "inputType": "textarea",
5325
+ "constraints": {
5326
+ "maxLength": 50000
5327
+ }
5328
+ },
5329
+ {
5330
+ "slug": "supersededby",
5331
+ "label": "Superseded by",
5332
+ "valueType": "entity_id",
5333
+ "inputType": "entity_select",
5334
+ "description": "The record that replaced this finding: the canonical finding it duplicates, or the correct diagnosis when this one was wrong. Recall leaves a superseded finding out."
5335
+ }
5336
+ ]
5337
+ },
5215
5338
  {
5216
5339
  "slug": "skill",
5217
5340
  "displayName": "Skill",
@@ -7890,6 +8013,47 @@ const DATA = {
7890
8013
  "description": "Shared land stage. Never report unverified work as verified. File the lesson, decision or finding the work produced (engineering-memory skill, rule dogfood-journal). Close what you opened: asks answered or withdrawn, worktree removed once merged, then synap_complete_session. Tools: synap_update_session, synap_capture, synap_complete_session. Gate: none. Model tier: quick (advisory until a tier field exists)."
7891
8014
  }
7892
8015
  ]
8016
+ },
8017
+ {
8018
+ "name": "Fix a finding",
8019
+ "description": "Work one finding (a problem with Synap itself) until its fix is live. The session's stages move the finding: fixing while the work runs, fixed when the fix is merged, verified once it runs on the pod. A cancelled or failed session leaves the finding where it is.",
8020
+ "goalTemplate": "Fix the finding and see the fix live",
8021
+ "scope": "session",
8022
+ "subjectProfile": {
8023
+ "profileSlug": "finding",
8024
+ "statusProperty": "status"
8025
+ },
8026
+ "humanOnlyStatuses": [
8027
+ "open",
8028
+ "wont_fix",
8029
+ "superseded"
8030
+ ],
8031
+ "params": [],
8032
+ "executor": "is-agent",
8033
+ "status": "active",
8034
+ "stages": [
8035
+ {
8036
+ "key": "fix",
8037
+ "name": "Fix it",
8038
+ "goal": "Find the root cause and ship the fix as a gated PR or commit",
8039
+ "category": "started",
8040
+ "subjectStatus": "fixing"
8041
+ },
8042
+ {
8043
+ "key": "merged",
8044
+ "name": "Fix merged",
8045
+ "goal": "The fix is on main (a merged PR or a gated commit)",
8046
+ "category": "started",
8047
+ "subjectStatus": "fixed"
8048
+ },
8049
+ {
8050
+ "key": "verified",
8051
+ "name": "Live and verified",
8052
+ "goal": "The fix runs on the pod (its build contains the fix) and the finding no longer happens",
8053
+ "category": "completed",
8054
+ "subjectStatus": "verified"
8055
+ }
8056
+ ]
7893
8057
  }
7894
8058
  ],
7895
8059
  "onboarding": {
@@ -30073,7 +30237,7 @@ const DATA = {
30073
30237
  "profile": "hypothesis"
30074
30238
  },
30075
30239
  {
30076
- "profile": "finding"
30240
+ "profile": "research-finding"
30077
30241
  }
30078
30242
  ]
30079
30243
  }
@@ -30369,7 +30533,7 @@ const DATA = {
30369
30533
  ]
30370
30534
  },
30371
30535
  {
30372
- "slug": "finding",
30536
+ "slug": "research-finding",
30373
30537
  "displayName": "Finding",
30374
30538
  "icon": "check-circle",
30375
30539
  "color": "#10B981",
@@ -30439,7 +30603,7 @@ const DATA = {
30439
30603
  "scopeProfileSlugs": [
30440
30604
  "field",
30441
30605
  "concept",
30442
- "finding"
30606
+ "research-finding"
30443
30607
  ],
30444
30608
  "description": "The cartography — fields and concepts, their overlaps and prerequisites, and the findings attached to them.",
30445
30609
  "defaultView": true,
@@ -30493,7 +30657,7 @@ const DATA = {
30493
30657
  "name": "Findings",
30494
30658
  "slug": "research-findings",
30495
30659
  "type": "table",
30496
- "scopeProfileSlug": "finding",
30660
+ "scopeProfileSlug": "research-finding",
30497
30661
  "description": "What's been established, with its confidence.",
30498
30662
  "config": {
30499
30663
  "columns": [
@@ -30563,7 +30727,7 @@ const DATA = {
30563
30727
  },
30564
30728
  {
30565
30729
  "sourceProfileSlug": "research",
30566
- "targetProfileSlug": "finding",
30730
+ "targetProfileSlug": "research-finding",
30567
30731
  "type": "concluded",
30568
30732
  "label": "Concluded"
30569
30733
  },
@@ -30586,19 +30750,19 @@ const DATA = {
30586
30750
  "label": "Cites"
30587
30751
  },
30588
30752
  {
30589
- "sourceProfileSlug": "finding",
30753
+ "sourceProfileSlug": "research-finding",
30590
30754
  "targetProfileSlug": "research",
30591
30755
  "type": "derived_from",
30592
30756
  "label": "Derived from"
30593
30757
  },
30594
30758
  {
30595
- "sourceProfileSlug": "finding",
30759
+ "sourceProfileSlug": "research-finding",
30596
30760
  "targetProfileSlug": "source",
30597
30761
  "type": "supported_by",
30598
30762
  "label": "Supported by"
30599
30763
  },
30600
30764
  {
30601
- "sourceProfileSlug": "finding",
30765
+ "sourceProfileSlug": "research-finding",
30602
30766
  "targetProfileSlug": "concept",
30603
30767
  "type": "about",
30604
30768
  "label": "About"
@@ -30608,7 +30772,7 @@ const DATA = {
30608
30772
  {
30609
30773
  "name": "Research a Question",
30610
30774
  "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.",
30611
- "goalTemplate": "Investigate the question {question} and record the WHOLE investigation, not just the answer; each stage moves the question's status. FRAME: restate the question so it can be answered, and say what evidence would answer it. GATHER: use the source-triage skill to gather sources widely via web search, classify each by type and credibility, and create a `source` entity for every one — including the ones you rejected, marked rejected with a reason (never silently drop a source). WEIGH: form the candidate answers as `hypothesis` entities that answer the question; link every source that bears on a hypothesis with `supports` or `contradicts`; use the evidence-synthesis skill to emit `finding` entities with honestly calibrated confidence, each `supported_by` its sources and `derived_from` this research; use the concept-cartography skill to place the findings onto the knowledge map. ANSWER: create the `research` entity that `investigates` the question and `explored` the sources, write its conclusion and confidence, and set the question to answered. Abandoning a question is a person's call. Every write is proposal-gated and reviewable.",
30775
+ "goalTemplate": "Investigate the question {question} and record the WHOLE investigation, not just the answer; each stage moves the question's status. FRAME: restate the question so it can be answered, and say what evidence would answer it. GATHER: use the source-triage skill to gather sources widely via web search, classify each by type and credibility, and create a `source` entity for every one — including the ones you rejected, marked rejected with a reason (never silently drop a source). WEIGH: form the candidate answers as `hypothesis` entities that answer the question; link every source that bears on a hypothesis with `supports` or `contradicts`; use the evidence-synthesis skill to emit `research-finding` entities with honestly calibrated confidence, each `supported_by` its sources and `derived_from` this research; use the concept-cartography skill to place the findings onto the knowledge map. ANSWER: create the `research` entity that `investigates` the question and `explored` the sources, write its conclusion and confidence, and set the question to answered. Abandoning a question is a person's call. Every write is proposal-gated and reviewable.",
30612
30776
  "subjectProfile": {
30613
30777
  "profileSlug": "question",
30614
30778
  "statusProperty": "questionStatus"
@@ -30729,7 +30893,7 @@ const DATA = {
30729
30893
  "description": "When a finding is validated, propose the posts that would share it, each linked to the finding.",
30730
30894
  "goalTemplate": "Turn this validated finding ({finding}) into content. Read the finding, its sources and the research it came from. Propose one to three posts that share it with the audience — each created at the Idea status, on the pillar it fits, with its hook and the reason it is worth making — and link each one derived_from the finding. Quote only what the sources support.",
30731
30895
  "subjectProfile": {
30732
- "profileSlug": "finding",
30896
+ "profileSlug": "research-finding",
30733
30897
  "statusProperty": "status"
30734
30898
  },
30735
30899
  "activators": [