@synap-core/cli 1.10.0 → 1.12.2

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 (461) hide show
  1. package/README.md +23 -198
  2. package/dist/build-info.json +6 -0
  3. package/dist/commands/agent-run.js +3 -2
  4. package/dist/commands/agent-run.js.map +1 -1
  5. package/dist/commands/agents.d.ts +33 -17
  6. package/dist/commands/agents.js +203 -237
  7. package/dist/commands/agents.js.map +1 -1
  8. package/dist/commands/app.d.ts +143 -0
  9. package/dist/commands/app.js +523 -0
  10. package/dist/commands/app.js.map +1 -0
  11. package/dist/commands/automate.d.ts +21 -0
  12. package/dist/commands/automate.js +42 -0
  13. package/dist/commands/automate.js.map +1 -0
  14. package/dist/commands/automation-schema.test.d.ts +16 -0
  15. package/dist/commands/automation-schema.test.js +77 -0
  16. package/dist/commands/automation-schema.test.js.map +1 -0
  17. package/dist/commands/automation.d.ts +12 -0
  18. package/dist/commands/automation.js +80 -35
  19. package/dist/commands/automation.js.map +1 -1
  20. package/dist/commands/bridge-setup.d.ts +14 -1
  21. package/dist/commands/bridge-setup.js +392 -128
  22. package/dist/commands/bridge-setup.js.map +1 -1
  23. package/dist/commands/cap-connections.d.ts +4 -4
  24. package/dist/commands/cap-connections.js +14 -14
  25. package/dist/commands/cap-connections.js.map +1 -1
  26. package/dist/commands/capability.d.ts +2 -0
  27. package/dist/commands/capability.js +297 -176
  28. package/dist/commands/capability.js.map +1 -1
  29. package/dist/commands/catalog.d.ts +275 -0
  30. package/dist/commands/catalog.js +481 -0
  31. package/dist/commands/catalog.js.map +1 -0
  32. package/dist/commands/cell.d.ts +155 -8
  33. package/dist/commands/cell.js +416 -40
  34. package/dist/commands/cell.js.map +1 -1
  35. package/dist/commands/centrality.js +3 -14
  36. package/dist/commands/centrality.js.map +1 -1
  37. package/dist/commands/connect.d.ts +38 -13
  38. package/dist/commands/connect.js +68 -167
  39. package/dist/commands/connect.js.map +1 -1
  40. package/dist/commands/connections.d.ts +3 -2
  41. package/dist/commands/connections.js +95 -25
  42. package/dist/commands/connections.js.map +1 -1
  43. package/dist/commands/context.js +9 -2
  44. package/dist/commands/context.js.map +1 -1
  45. package/dist/commands/data-extra.d.ts +34 -0
  46. package/dist/commands/data-extra.js +198 -25
  47. package/dist/commands/data-extra.js.map +1 -1
  48. package/dist/commands/data.d.ts +120 -2
  49. package/dist/commands/data.js +307 -24
  50. package/dist/commands/data.js.map +1 -1
  51. package/dist/commands/diagnose.d.ts +66 -4
  52. package/dist/commands/diagnose.js +329 -29
  53. package/dist/commands/diagnose.js.map +1 -1
  54. package/dist/commands/digest.js +2 -1
  55. package/dist/commands/digest.js.map +1 -1
  56. package/dist/commands/doc.d.ts +25 -4
  57. package/dist/commands/doc.js +100 -18
  58. package/dist/commands/doc.js.map +1 -1
  59. package/dist/commands/doctor.d.ts +130 -0
  60. package/dist/commands/doctor.js +814 -0
  61. package/dist/commands/doctor.js.map +1 -0
  62. package/dist/commands/events.js +3 -1
  63. package/dist/commands/events.js.map +1 -1
  64. package/dist/commands/explain.js +5 -5
  65. package/dist/commands/explain.js.map +1 -1
  66. package/dist/commands/graph.js +5 -3
  67. package/dist/commands/graph.js.map +1 -1
  68. package/dist/commands/import.d.ts +368 -13
  69. package/dist/commands/import.js +1096 -55
  70. package/dist/commands/import.js.map +1 -1
  71. package/dist/commands/init.d.ts +20 -9
  72. package/dist/commands/init.js +433 -973
  73. package/dist/commands/init.js.map +1 -1
  74. package/dist/commands/keys.d.ts +1 -0
  75. package/dist/commands/keys.js +15 -2
  76. package/dist/commands/keys.js.map +1 -1
  77. package/dist/commands/knowledge.d.ts +28 -6
  78. package/dist/commands/knowledge.js +358 -73
  79. package/dist/commands/knowledge.js.map +1 -1
  80. package/dist/commands/launch.js +2 -2
  81. package/dist/commands/launch.js.map +1 -1
  82. package/dist/commands/lens.d.ts +37 -1
  83. package/dist/commands/lens.js +193 -72
  84. package/dist/commands/lens.js.map +1 -1
  85. package/dist/commands/market-authoring.d.ts +72 -0
  86. package/dist/commands/market-authoring.js +566 -0
  87. package/dist/commands/market-authoring.js.map +1 -0
  88. package/dist/commands/market-official.d.ts +58 -0
  89. package/dist/commands/market-official.js +84 -0
  90. package/dist/commands/market-official.js.map +1 -0
  91. package/dist/commands/market.d.ts +419 -20
  92. package/dist/commands/market.js +2124 -193
  93. package/dist/commands/market.js.map +1 -1
  94. package/dist/commands/mcp.d.ts +70 -13
  95. package/dist/commands/mcp.js +308 -40
  96. package/dist/commands/mcp.js.map +1 -1
  97. package/dist/commands/open.d.ts +39 -9
  98. package/dist/commands/open.js +80 -25
  99. package/dist/commands/open.js.map +1 -1
  100. package/dist/commands/playbook.d.ts +42 -0
  101. package/dist/commands/playbook.js +162 -0
  102. package/dist/commands/playbook.js.map +1 -0
  103. package/dist/commands/pod.js +1 -1
  104. package/dist/commands/pod.js.map +1 -1
  105. package/dist/commands/pods.d.ts +19 -0
  106. package/dist/commands/pods.js +220 -85
  107. package/dist/commands/pods.js.map +1 -1
  108. package/dist/commands/proposals-actions.d.ts +62 -0
  109. package/dist/commands/proposals-actions.js +146 -8
  110. package/dist/commands/proposals-actions.js.map +1 -1
  111. package/dist/commands/proposals-await.d.ts +68 -0
  112. package/dist/commands/proposals-await.js +248 -0
  113. package/dist/commands/proposals-await.js.map +1 -0
  114. package/dist/commands/proton-setup.d.ts +73 -0
  115. package/dist/commands/proton-setup.js +577 -0
  116. package/dist/commands/proton-setup.js.map +1 -0
  117. package/dist/commands/providers.d.ts +23 -0
  118. package/dist/commands/providers.js +126 -1
  119. package/dist/commands/providers.js.map +1 -1
  120. package/dist/commands/raycast.js +6 -2
  121. package/dist/commands/raycast.js.map +1 -1
  122. package/dist/commands/rule.d.ts +150 -0
  123. package/dist/commands/rule.js +447 -0
  124. package/dist/commands/rule.js.map +1 -0
  125. package/dist/commands/session-wait.d.ts +111 -0
  126. package/dist/commands/session-wait.js +209 -0
  127. package/dist/commands/session-wait.js.map +1 -0
  128. package/dist/commands/sessions.d.ts +52 -0
  129. package/dist/commands/sessions.js +479 -58
  130. package/dist/commands/sessions.js.map +1 -1
  131. package/dist/commands/skill-manage.d.ts +21 -0
  132. package/dist/commands/skill-manage.js +136 -19
  133. package/dist/commands/skill-manage.js.map +1 -1
  134. package/dist/commands/skills.js +19 -1
  135. package/dist/commands/skills.js.map +1 -1
  136. package/dist/commands/status.d.ts +1 -4
  137. package/dist/commands/status.js +5 -34
  138. package/dist/commands/status.js.map +1 -1
  139. package/dist/commands/statusline.backoff.test.d.ts +13 -0
  140. package/dist/commands/statusline.backoff.test.js +100 -0
  141. package/dist/commands/statusline.backoff.test.js.map +1 -0
  142. package/dist/commands/statusline.js +16 -9
  143. package/dist/commands/statusline.js.map +1 -1
  144. package/dist/commands/sync-status.d.ts +12 -0
  145. package/dist/commands/sync-status.js +125 -0
  146. package/dist/commands/sync-status.js.map +1 -0
  147. package/dist/commands/templates-retire.d.ts +34 -0
  148. package/dist/commands/templates-retire.js +192 -0
  149. package/dist/commands/templates-retire.js.map +1 -0
  150. package/dist/commands/tools.js +6 -21
  151. package/dist/commands/tools.js.map +1 -1
  152. package/dist/commands/tracks.d.ts +51 -0
  153. package/dist/commands/tracks.js +291 -0
  154. package/dist/commands/tracks.js.map +1 -0
  155. package/dist/commands/update.d.ts +3 -11
  156. package/dist/commands/update.js +5 -134
  157. package/dist/commands/update.js.map +1 -1
  158. package/dist/commands/upload.d.ts +68 -0
  159. package/dist/commands/upload.js +257 -0
  160. package/dist/commands/upload.js.map +1 -0
  161. package/dist/commands/vendor.d.ts +28 -0
  162. package/dist/commands/vendor.js +110 -0
  163. package/dist/commands/vendor.js.map +1 -0
  164. package/dist/commands/versions.js +6 -0
  165. package/dist/commands/versions.js.map +1 -1
  166. package/dist/commands/view.js +10 -5
  167. package/dist/commands/view.js.map +1 -1
  168. package/dist/commands/whoami.d.ts +23 -3
  169. package/dist/commands/whoami.js +169 -23
  170. package/dist/commands/whoami.js.map +1 -1
  171. package/dist/commands/worker.d.ts +122 -0
  172. package/dist/commands/worker.js +435 -0
  173. package/dist/commands/worker.js.map +1 -0
  174. package/dist/commands/worker.test.d.ts +1 -0
  175. package/dist/commands/worker.test.js +116 -0
  176. package/dist/commands/worker.test.js.map +1 -0
  177. package/dist/commands/workspace-ops.d.ts +35 -0
  178. package/dist/commands/workspace-ops.js +153 -0
  179. package/dist/commands/workspace-ops.js.map +1 -0
  180. package/dist/index.d.ts +6 -6
  181. package/dist/index.js +1009 -171
  182. package/dist/index.js.map +1 -1
  183. package/dist/lib/agent-connections.d.ts +31 -0
  184. package/dist/lib/agent-connections.js +33 -0
  185. package/dist/lib/agent-connections.js.map +1 -0
  186. package/dist/lib/agent-detect.d.ts +27 -0
  187. package/dist/lib/agent-detect.js +71 -0
  188. package/dist/lib/agent-detect.js.map +1 -0
  189. package/dist/lib/agent-door.d.ts +138 -0
  190. package/dist/lib/agent-door.js +426 -0
  191. package/dist/lib/agent-door.js.map +1 -0
  192. package/dist/lib/agents-config.d.ts +2 -0
  193. package/dist/lib/agents-config.js +4 -9
  194. package/dist/lib/agents-config.js.map +1 -1
  195. package/dist/lib/approval-poll.d.ts +31 -2
  196. package/dist/lib/approval-poll.js +20 -7
  197. package/dist/lib/approval-poll.js.map +1 -1
  198. package/dist/lib/atomic-file.d.ts +48 -0
  199. package/dist/lib/atomic-file.js +129 -0
  200. package/dist/lib/atomic-file.js.map +1 -0
  201. package/dist/lib/auth.d.ts +14 -9
  202. package/dist/lib/auth.js +44 -61
  203. package/dist/lib/auth.js.map +1 -1
  204. package/dist/lib/batch-approval.d.ts +85 -0
  205. package/dist/lib/batch-approval.js +170 -0
  206. package/dist/lib/batch-approval.js.map +1 -0
  207. package/dist/lib/capture-lane.d.ts +6 -5
  208. package/dist/lib/capture-lane.js +11 -8
  209. package/dist/lib/capture-lane.js.map +1 -1
  210. package/dist/lib/capture-structure.d.ts +342 -0
  211. package/dist/lib/capture-structure.js +295 -0
  212. package/dist/lib/capture-structure.js.map +1 -0
  213. package/dist/lib/catalog-templates.d.ts +59 -0
  214. package/dist/lib/catalog-templates.js +126 -0
  215. package/dist/lib/catalog-templates.js.map +1 -0
  216. package/dist/lib/cli-build.d.ts +19 -0
  217. package/dist/lib/cli-build.js +37 -0
  218. package/dist/lib/cli-build.js.map +1 -0
  219. package/dist/lib/conversation-headers.d.ts +18 -0
  220. package/dist/lib/conversation-headers.js +32 -0
  221. package/dist/lib/conversation-headers.js.map +1 -0
  222. package/dist/lib/cp-packages.d.ts +216 -4
  223. package/dist/lib/cp-packages.js +414 -11
  224. package/dist/lib/cp-packages.js.map +1 -1
  225. package/dist/lib/credential-class.d.ts +117 -0
  226. package/dist/lib/credential-class.js +116 -0
  227. package/dist/lib/credential-class.js.map +1 -0
  228. package/dist/lib/describe-lens.d.ts +35 -0
  229. package/dist/lib/describe-lens.js +40 -0
  230. package/dist/lib/describe-lens.js.map +1 -1
  231. package/dist/lib/device-connect.d.ts +125 -0
  232. package/dist/lib/device-connect.js +256 -0
  233. package/dist/lib/device-connect.js.map +1 -0
  234. package/dist/lib/directory-lens.d.ts +99 -0
  235. package/dist/lib/directory-lens.js +187 -0
  236. package/dist/lib/directory-lens.js.map +1 -0
  237. package/dist/lib/exporter-coverage.d.ts +71 -0
  238. package/dist/lib/exporter-coverage.js +97 -0
  239. package/dist/lib/exporter-coverage.js.map +1 -0
  240. package/dist/lib/hub-client.d.ts +43 -9
  241. package/dist/lib/hub-client.js +429 -65
  242. package/dist/lib/hub-client.js.map +1 -1
  243. package/dist/lib/id.d.ts +23 -0
  244. package/dist/lib/id.js +35 -0
  245. package/dist/lib/id.js.map +1 -0
  246. package/dist/lib/init-connect.d.ts +41 -0
  247. package/dist/lib/init-connect.js +75 -0
  248. package/dist/lib/init-connect.js.map +1 -0
  249. package/dist/lib/init-exit.d.ts +24 -0
  250. package/dist/lib/init-exit.js +41 -0
  251. package/dist/lib/init-exit.js.map +1 -0
  252. package/dist/lib/init-flow.d.ts +25 -0
  253. package/dist/lib/init-flow.js +40 -0
  254. package/dist/lib/init-flow.js.map +1 -0
  255. package/dist/lib/init-handoff.d.ts +16 -0
  256. package/dist/lib/init-handoff.js +19 -0
  257. package/dist/lib/init-handoff.js.map +1 -0
  258. package/dist/lib/init-output.d.ts +18 -0
  259. package/dist/lib/init-output.js +43 -0
  260. package/dist/lib/init-output.js.map +1 -0
  261. package/dist/lib/init-pod.d.ts +45 -0
  262. package/dist/lib/init-pod.js +36 -0
  263. package/dist/lib/init-pod.js.map +1 -0
  264. package/dist/lib/installed.d.ts +210 -11
  265. package/dist/lib/installed.js +234 -36
  266. package/dist/lib/installed.js.map +1 -1
  267. package/dist/lib/key-approval.d.ts +57 -0
  268. package/dist/lib/key-approval.js +117 -0
  269. package/dist/lib/key-approval.js.map +1 -0
  270. package/dist/lib/key-diagnosis.d.ts +56 -0
  271. package/dist/lib/key-diagnosis.js +227 -0
  272. package/dist/lib/key-diagnosis.js.map +1 -0
  273. package/dist/lib/key-doctor.d.ts +136 -0
  274. package/dist/lib/key-doctor.js +286 -0
  275. package/dist/lib/key-doctor.js.map +1 -0
  276. package/dist/lib/key-locations.d.ts +120 -0
  277. package/dist/lib/key-locations.js +326 -0
  278. package/dist/lib/key-locations.js.map +1 -0
  279. package/dist/lib/key-source.d.ts +66 -0
  280. package/dist/lib/key-source.js +106 -0
  281. package/dist/lib/key-source.js.map +1 -0
  282. package/dist/lib/key-state.d.ts +70 -0
  283. package/dist/lib/key-state.js +115 -0
  284. package/dist/lib/key-state.js.map +1 -0
  285. package/dist/lib/kind-package.d.ts +181 -0
  286. package/dist/lib/kind-package.js +679 -0
  287. package/dist/lib/kind-package.js.map +1 -0
  288. package/dist/lib/knowledge-title.d.ts +24 -0
  289. package/dist/lib/knowledge-title.js +46 -0
  290. package/dist/lib/knowledge-title.js.map +1 -0
  291. package/dist/lib/knowledge-title.test.d.ts +1 -0
  292. package/dist/lib/knowledge-title.test.js +34 -0
  293. package/dist/lib/knowledge-title.test.js.map +1 -0
  294. package/dist/lib/machine-instance.d.ts +64 -0
  295. package/dist/lib/machine-instance.js +142 -0
  296. package/dist/lib/machine-instance.js.map +1 -0
  297. package/dist/lib/mcp-bridge.d.ts +42 -0
  298. package/dist/lib/mcp-bridge.js +147 -0
  299. package/dist/lib/mcp-bridge.js.map +1 -0
  300. package/dist/lib/mcp-bridge.test.d.ts +1 -0
  301. package/dist/lib/mcp-bridge.test.js +90 -0
  302. package/dist/lib/mcp-bridge.test.js.map +1 -0
  303. package/dist/lib/mcp-call.d.ts +30 -0
  304. package/dist/lib/mcp-call.js +107 -0
  305. package/dist/lib/mcp-call.js.map +1 -0
  306. package/dist/lib/mcp-snippets.d.ts +53 -0
  307. package/dist/lib/mcp-snippets.js +82 -0
  308. package/dist/lib/mcp-snippets.js.map +1 -0
  309. package/dist/lib/next-steps.d.ts +8 -0
  310. package/dist/lib/next-steps.js +31 -1
  311. package/dist/lib/next-steps.js.map +1 -1
  312. package/dist/lib/package-wire.d.ts +179 -0
  313. package/dist/lib/package-wire.js +68 -0
  314. package/dist/lib/package-wire.js.map +1 -0
  315. package/dist/lib/pair-link.d.ts +38 -0
  316. package/dist/lib/pair-link.js +68 -0
  317. package/dist/lib/pair-link.js.map +1 -0
  318. package/dist/lib/pod-wide.d.ts +40 -0
  319. package/dist/lib/pod-wide.js +46 -0
  320. package/dist/lib/pod-wide.js.map +1 -0
  321. package/dist/lib/pod.d.ts +119 -115
  322. package/dist/lib/pod.js +206 -412
  323. package/dist/lib/pod.js.map +1 -1
  324. package/dist/lib/project-ref.d.ts +9 -3
  325. package/dist/lib/project-ref.js +10 -4
  326. package/dist/lib/project-ref.js.map +1 -1
  327. package/dist/lib/review-credential.d.ts +119 -0
  328. package/dist/lib/review-credential.js +147 -0
  329. package/dist/lib/review-credential.js.map +1 -0
  330. package/dist/lib/safe-open.d.ts +49 -0
  331. package/dist/lib/safe-open.js +119 -0
  332. package/dist/lib/safe-open.js.map +1 -0
  333. package/dist/lib/session-lens.d.ts +40 -1
  334. package/dist/lib/session-lens.js +54 -4
  335. package/dist/lib/session-lens.js.map +1 -1
  336. package/dist/lib/superwhisper-import.d.ts +8 -0
  337. package/dist/lib/superwhisper-import.js +14 -7
  338. package/dist/lib/superwhisper-import.js.map +1 -1
  339. package/dist/lib/superwhisper-title.test.d.ts +1 -0
  340. package/dist/lib/superwhisper-title.test.js +18 -0
  341. package/dist/lib/superwhisper-title.test.js.map +1 -0
  342. package/dist/lib/targets.d.ts +134 -10
  343. package/dist/lib/targets.js +962 -258
  344. package/dist/lib/targets.js.map +1 -1
  345. package/dist/lib/template-file.d.ts +78 -0
  346. package/dist/lib/template-file.js +140 -0
  347. package/dist/lib/template-file.js.map +1 -0
  348. package/dist/lib/template-lifecycle.d.ts +217 -0
  349. package/dist/lib/template-lifecycle.js +433 -0
  350. package/dist/lib/template-lifecycle.js.map +1 -0
  351. package/dist/lib/template-steps.d.ts +88 -0
  352. package/dist/lib/template-steps.js +118 -0
  353. package/dist/lib/template-steps.js.map +1 -0
  354. package/dist/lib/time-ago.d.ts +2 -0
  355. package/dist/lib/time-ago.js +15 -0
  356. package/dist/lib/time-ago.js.map +1 -0
  357. package/dist/utils/logger.js +5 -2
  358. package/dist/utils/logger.js.map +1 -1
  359. package/package.json +25 -18
  360. package/skills/README.md +12 -10
  361. package/skills/agent-os/SKILL.md +220 -99
  362. package/skills/manifest.json +2 -2
  363. package/skills/onboard/SKILL.md +61 -25
  364. package/skills/synap/README.md +5 -8
  365. package/skills/synap/SKILL.md +1185 -301
  366. package/skills/synap/_order.txt +7 -0
  367. package/skills/synap/_skill.yaml +1 -1
  368. package/skills/synap/automations.md +15 -0
  369. package/skills/synap/capture.md +54 -151
  370. package/skills/synap/cli-operations.md +24 -18
  371. package/skills/synap/common-mistakes.md +1 -0
  372. package/skills/synap/concepts.md +28 -0
  373. package/skills/synap/content-os.md +92 -0
  374. package/skills/synap/creative-loop.md +15 -10
  375. package/skills/synap/crm.md +21 -52
  376. package/skills/synap/digesting-a-channel.md +25 -0
  377. package/skills/synap/document-embeds.md +141 -47
  378. package/skills/synap/escalation-ladder.md +20 -10
  379. package/skills/synap/focus-sessions.md +47 -21
  380. package/skills/synap/from-intent.md +142 -0
  381. package/skills/synap/governance-rules.md +4 -4
  382. package/skills/synap/governance.md +10 -7
  383. package/skills/synap/hand-off.md +33 -0
  384. package/skills/synap/inline-patterns.md +15 -7
  385. package/skills/synap/lenses.md +33 -15
  386. package/skills/synap/linking.md +41 -40
  387. package/skills/synap/mcp-remote-servers.md +64 -0
  388. package/skills/synap/mental-model.md +24 -22
  389. package/skills/synap/multi-entity-capture.md +6 -4
  390. package/skills/synap/operating-mode-rules.md +1 -1
  391. package/skills/synap/processes.md +118 -0
  392. package/skills/synap/quick-reference.md +5 -1
  393. package/skills/synap/reading.md +3 -1
  394. package/skills/synap/reflexes.md +12 -42
  395. package/skills/synap/viewframe-cells.md +38 -5
  396. package/skills/synap/work-flow.md +1 -1
  397. package/skills/synap/work-model.md +96 -0
  398. package/skills/synap/worked-examples.md +21 -1
  399. package/skills/synap/workspace-design.md +14 -10
  400. package/skills/synap/writes.md +165 -35
  401. package/skills/synap/writing-titles.md +63 -0
  402. package/skills/synap-app/SKILL.md +319 -0
  403. package/skills/synap-app/_order.txt +5 -0
  404. package/skills/synap-app/_skill.yaml +20 -0
  405. package/skills/synap-app/creating-the-base-app.md +64 -0
  406. package/skills/synap-app/governance.md +42 -0
  407. package/skills/synap-app/install-commands.md +55 -0
  408. package/skills/synap-app/overview.md +50 -0
  409. package/skills/synap-app/using-the-sdk.md +73 -0
  410. package/skills/synap-design/SKILL.md +474 -0
  411. package/skills/synap-design/_order.txt +4 -0
  412. package/skills/synap-design/_skill.yaml +21 -0
  413. package/skills/synap-design/loop.md +134 -0
  414. package/skills/synap-design/overview.md +44 -0
  415. package/skills/synap-design/principles.md +130 -0
  416. package/skills/synap-design/system.md +133 -0
  417. package/skills/synap-market/SKILL.md +625 -0
  418. package/skills/synap-market/_order.txt +5 -0
  419. package/skills/synap-market/_skill.yaml +24 -0
  420. package/skills/synap-market/author-and-publish.md +212 -0
  421. package/skills/synap-market/discover-and-fetch.md +59 -0
  422. package/skills/synap-market/governance-and-catalog.md +63 -0
  423. package/skills/synap-market/install.md +133 -0
  424. package/skills/synap-market/overview.md +119 -0
  425. package/skills/synap-schema/SKILL.md +172 -10
  426. package/skills/synap-schema/_order.txt +2 -0
  427. package/skills/synap-schema/_skill.yaml +4 -2
  428. package/skills/synap-schema/common-mistakes.md +4 -2
  429. package/skills/synap-schema/discover-profiles.md +1 -1
  430. package/skills/synap-schema/entity-scope.md +15 -3
  431. package/skills/synap-schema/extend-first.md +29 -0
  432. package/skills/synap-schema/extend-vs-create.md +1 -1
  433. package/skills/synap-schema/intent-vocabulary-ssot.md +111 -0
  434. package/skills/synap-schema/property-types.md +1 -1
  435. package/skills/synap-schema/relations.md +1 -1
  436. package/skills/synap-ui/SKILL.md +19 -12
  437. package/skills/synap-ui/_skill.yaml +1 -1
  438. package/skills/synap-ui/ai-companion.md +1 -1
  439. package/skills/synap-ui/arranging-bento.md +2 -0
  440. package/skills/synap-ui/bento-layouts.md +10 -10
  441. package/skills/synap-ui/bento-recipes.md +313 -543
  442. package/skills/synap-ui/four-builds.md +5 -0
  443. package/skills/synap-ui/view-types.md +2 -2
  444. package/skills/synap-ui/widget-catalog.md +22 -278
  445. package/templates/automations/bookmark-enrichment.automation.json +290 -13
  446. package/templates/automations/url-bookmark-capture.automation.json +73 -11
  447. package/templates/skills/authoring-playbooks/SKILL.md +6 -3
  448. package/templates/skills/authoring-playbooks/reference/stages-contract.md +15 -0
  449. package/templates/skills/authoring-playbooks/reference/worked-example.md +3 -0
  450. package/dist/commands/infra.d.ts +0 -21
  451. package/dist/commands/infra.js +0 -262
  452. package/dist/commands/infra.js.map +0 -1
  453. package/dist/lib/browser-auth.d.ts +0 -35
  454. package/dist/lib/browser-auth.js +0 -170
  455. package/dist/lib/browser-auth.js.map +0 -1
  456. package/dist/lib/openclaw.d.ts +0 -32
  457. package/dist/lib/openclaw.js +0 -164
  458. package/dist/lib/openclaw.js.map +0 -1
  459. package/dist/lib/seed.d.ts +0 -13
  460. package/dist/lib/seed.js +0 -135
  461. package/dist/lib/seed.js.map +0 -1
@@ -1,6 +1,8 @@
1
1
  ## Workspace design — is this concern a WORKSPACE, or something smaller?
2
2
 
3
- Before you create a workspace, run the decision rule. A workspace (an operational **domain**) is the heaviest structure in the pod — it owns kinds, confers roles, carries its own team and automations. Most new concerns are NOT domains; they are a **hat**, an **initiative**, or a **stage**. Creating a workspace for one of those is the anti-pattern that fragments the graph. Decide first, then create.
3
+ Before you create a workspace, run the decision rule. A workspace (an operational **domain**) is the heaviest structure in the pod — it owns kinds, confers roles, carries its own team and automations. Most new concerns are NOT domains; they are a **hat**, an **initiative**, a **lasting goal** (track), or a **status**. Creating a workspace for one of those is the anti-pattern that fragments the graph. Decide first, then create. What each word means: `concepts` (the one glossary).
4
+
5
+ **One space per domain:** A space is a domain, installed once (Content, Brand, CRM…). A project is a filter across spaces. To make something “for project X”: file it into X inside the domain's space (`file_into_project`), and link X to the space (`project_use_workspace`). Never create a space named after a project, a brand or a client.
4
6
 
5
7
  ## The decision rule — a concern earns a workspace ONLY if ALL FOUR hold
6
8
 
@@ -11,20 +13,22 @@ Before you create a workspace, run the decision rule. A workspace (an operationa
11
13
 
12
14
  **All four, or it is not a workspace.** Then fork it to the right lighter structure:
13
15
 
14
- | If the concern is… | It is a… | Substrate | Example |
15
- | ----------------------------------------------------------- | -------------- | -------------------------------------- | ------------------------------------------- |
16
- | a **role/hat** an existing entity wears in a domain | **Facet** | `attach_facet` (`profileKind: "role"`) | `client`, `sponsor`, `prospect`, `investor` |
17
- | a **cross-cutting, time-bound initiative** spanning domains | **Project** | `create_project` (a lens) | a campaign, an engagement, a launch |
18
- | a **stage/filter WITHIN a domain** | **State/View** | a `status` property def + a view | pipeline stage, "active"/"archived" |
16
+ | If the concern is… | It is a… | Substrate | Example |
17
+ | ----------------------------------------------------------- | ----------- | -------------------------------------- | ------------------------------------------- |
18
+ | a **role/hat** an existing entity wears in a domain | **Facet** | `attach_facet` (`profileKind: "role"`) | `client`, `sponsor`, `prospect`, `investor` |
19
+ | a **cross-cutting, time-bound initiative** spanning domains | **Project** | `create_project` (a lens) | a campaign, an engagement, a launch |
20
+ | a **lasting goal** a project pursues (worked in sessions) | **Track** | `start_track` (no method needed) | grow the newsletter, win ten clients |
21
+ | a **stage/filter WITHIN a domain** | **Status** | an option of the kind's lifecycle | pipeline stage, "active"/"archived" |
19
22
 
20
23
  ## The decision procedure (follow in order)
21
24
 
22
25
  1. **Name the source-of-truth noun.** What kind would this workspace _own_ that no existing workspace owns? Run `list_profiles` — if the noun already lives in another domain, you have a facet or a project, not a domain. STOP.
23
26
  2. **Test all four conditions.** Owns kinds AND own team AND native automations AND stable. Any one fails → fork below.
24
- 3. **If it's a hat** (a status/role on an entity that already exists elsewhere) → resolve the entity, `attach_facet`. Never a workspace, never a second entity.
27
+ 3. **If it's a hat** (a status/role on an entity that already exists elsewhere) → resolve the entity, `attach_facet`. Never a workspace, never a second entity. One role per name, pod-wide: a role several workspaces use is ONE role, each workspace adding properties by overlay — never a per-workspace twin (`concepts`).
25
28
  4. **If it's time-bound work across domains** → `create_project` and set it as the lens; the work files into it from whatever workspace holds the data. **A project is a COMMITMENT WITH GRAVITY** — a real initiative that ties work together (a campaign, an engagement, a client, a launch). Tasks, plans, repos, themes, and topics are **entities**, never projects. Before you create one: (a) **search existing projects first** (`synap orient` / `GET /api/hub/projects`) and prefer **linking into an existing project** via `belongs_to_project` — near-duplicate names are rejected with the existing candidates; (b) an agent-created project must cite **≥5 existing entities** that would belong to it as `evidenceEntityIds` — the backend rejects a project with no gravity and tells you to store it as an entity or reuse an existing project instead; (c) **never create a project for the pod owner's own company** — the company _is_ the pod, not a project inside it.
26
- 5. **If it's a stage inside a domain** → add a `status` property def (`create_property_def`) and a view; don't split the stage into its own space.
27
- 6. **Only if all four held** → **template first** (escalation ladder L3):
29
+ 5. **If it's a lasting goal a project pursues** ("keep the content side of the launch going") → a **track**: `list_tracks`, else `start_track` (`name`, `direction`); work in it with `start_session` + `trackId`. Never a workspace, never a twin project.
30
+ 6. **If it's a stage inside a domain** → it is an option of the kind's or role's declared lifecycle, never a role and never a space. Its pipeline is computed from the lifecycle: open it, don't build one. A kind with no lifecycle yet gets a `status` property def (`create_property_def`).
31
+ 7. **Only if all four held** → **template first** (escalation ladder L3):
28
32
  `market.search({query, kind: "template"})` and propose install of a matching
29
33
  template before freehand `create_workspace`. Freehand create is last resort
30
34
  and always proposed — a deliberate move, offer it to the user (see
@@ -32,7 +36,7 @@ Before you create a workspace, run the decision rule. A workspace (an operationa
32
36
 
33
37
  ## The CRM corollary — the load-bearing example
34
38
 
35
- Operational state — **prospect → client → delivered** — is a **FLOW across domains**, expressed as **facets + a triggered project**, NEVER as workspaces and NEVER by bolting delivery onto the identity domain.
39
+ Operational state — **prospect → client → delivered** — is a **FLOW across domains**, expressed as **facets + an engagement project** (its delivery runs as a track), NEVER as workspaces and NEVER by bolting delivery onto the identity domain.
36
40
 
37
41
  - CRM = **who** (owns `person`/`company`, confers the `lead`/`client` facets).
38
42
  - Operations = **what we do for them** (owns `engagement`/`contract`/`deliverable`).
@@ -1,6 +1,30 @@
1
1
  ## Core writes
2
2
 
3
- ### Create an entity (schema-first, complete intent)
3
+ > **Scope of this page.** It covers writes that produce ENTITY-shaped data.
4
+ > There are ~30 other write tools (sessions, capabilities, automations, cells,
5
+ > playbooks, views, channels…) that this page does not orient across — reach for
6
+ > `synap_list_capabilities` / the escalation ladder for those. If you are about
7
+ > to pick a tool and the choice feels ambiguous, that ambiguity is real: the
8
+ > tools below differ in ATOMICITY and COLLISION policy, not just in shape.
9
+
10
+ **Two entity-write doors, one gradient.** `create_entity` is for exactly ONE
11
+ fully-structured, typed entity you already have. For anything unstructured,
12
+ several entities, or a graph — or **when in doubt** — use the capture door
13
+ (`synap_capture`, see `capture.md`): precision comes from sending more structure
14
+ in the SAME call, never from picking a different tool or a second commit step.
15
+
16
+ The difference that is NOT visible in either tool's description: `create_entity`
17
+ writes one entity with per-entity governance and REJECTS a name collision unless
18
+ `forceCreate`; capture-with-`entities[]` files ONE atomic proposal for the whole
19
+ graph and DEDUP-MERGES instead of rejecting. Pick by whether you want a partial
20
+ write to be possible, not by how structured your data feels.
21
+
22
+ **Every title is linted.** Both doors return `titleLint` in the receipt when a
23
+ title breaks the rubric (too long, cut off, status words, ids, a placeholder…);
24
+ the title is stored as sent, so rewrite it. Over 200 characters the write is
25
+ refused. Title rules and what counts as knowledge: `writing-titles.md`.
26
+
27
+ ### Create an entity (one exact typed entity)
4
28
 
5
29
  Before this call, use `/discover?userId=…&profileSlugs=<kind>` to read the
6
30
  real fields, required/default values, constraints and reference targets. Omit
@@ -22,15 +46,28 @@ POST /api/hub/entities
22
46
  ```
23
47
 
24
48
  The response has legacy `status`/`id` fields plus `writeReceipt`:
25
- `pending` means a proposal exists and no entity is live; `applied` means the
26
- reported direct write completed; `partial` means a follow-up (for example a
27
- facet) failed after the entity applied. Never claim completion from `pending`,
28
- and only enrich again when the receipt identifies a real missing fact.
49
+ `pending`/`proposed` means a proposal exists and no entity is live yet;
50
+ `applied` means the reported direct write completed; `partial` means a follow-up
51
+ (for example a facet) failed after the entity applied. **A `proposed`/`pending`
52
+ receipt is a governed success, not an error** — you MUST surface its
53
+ `reviewUrl` as a clickable markdown link in the same reply (see
54
+ `inline-patterns.md`), never claim completion, and only enrich again when the
55
+ receipt identifies a real missing fact.
29
56
 
30
57
  For several entities, creation-time roles/facets, or relations that need one
31
- review, submit one `POST /api/hub/capture/graph` plan instead of sequencing
32
- independent creates. It returns a pending receipt and materializes on human
33
- approval.
58
+ review, send the whole graph through the capture door (`synap_capture` with
59
+ `entities[]` + `relations[]`) instead of sequencing independent creates. It is
60
+ ONE governed call: policy auto-applies when every op is safe, otherwise the
61
+ whole graph is proposed (atomic). There is no separate commit step.
62
+
63
+ **Name-refs, not UUIDs.** Reference an existing project by name — the server
64
+ resolves it against the caller's own projects (exact match files there; no match
65
+ proposes, never mis-files). Never ask the user for a UUID.
66
+
67
+ **Dedup is advisory across kinds.** Strong signals (`email`/`phone`/`website` —
68
+ not a bare `url`) dedup within a kind; a same-title hit in a _different_ kind
69
+ comes back as an advisory candidate, never an auto-merge. "No exact match" is not
70
+ "safe to create" when advisory candidates are returned — review them first.
34
71
 
35
72
  ### Update an entity
36
73
 
@@ -41,6 +78,70 @@ PATCH /api/hub/entities/{entityId}
41
78
 
42
79
  **Properties are deep-merged — send only the keys you want to change.** An update with `{ "status": "done" }` leaves all other properties untouched. You never need to re-send the full properties object.
43
80
 
81
+ **Many changes → ONE call: `synap_update_entities`** (up to 500 items
82
+ `{id, patch, expected?}`; Hub: `POST /api/hub/entities/batch-update`). Never
83
+ script a loop of single updates, and never apply a change set over Hub REST with
84
+ a user key. Governance is per item: some apply now, the rest ride ONE review for
85
+ the person; the answer lists `applied` / `proposed` / `denied` / `skipped` — a
86
+ partial result is normal. Send `validate: true` first to see each verdict without
87
+ writing, and an `idempotencyKey` so a retry never acts twice.
88
+
89
+ **A write blocked on a space join is KEPT.** When you write into a space your
90
+ agent has not joined (`synap_orient` marks it `joined: false`), the answer is
91
+ `proposed` with `proposalType: "join"`, `deferred: true` and a `ref`: the write
92
+ rides the join request and is replayed for you once it is approved. Do not
93
+ resend it, and do not retry it into another space.
94
+
95
+ **Moving, not recreating.** A session into another space:
96
+ `synap_update_session` with `moveToWorkspaceId` (never `workspaceId` — that is
97
+ the connection's lens). A kind another space needs: `synap_change_kind_scope`
98
+ (`scope: "shared"` + `allowedWorkspaceIds`), never a twin kind. Records:
99
+ `synap_move_entities`. All three are reviewed.
100
+
101
+ ### Authored text is content, not a `file`
102
+
103
+ Something **you** author — a pitch deck, a strategic plan, a note body — is
104
+ **never** a `file`- or `document`-kind entity. Create it as the right CONTENT
105
+ kind (`note`, `knowledge`, or a fitting domain kind) with `content` set to the
106
+ Markdown body; Synap **auto-materializes** that `content` into a real
107
+ versioned document behind the scenes (`entities WHERE documentId = ?`) — no
108
+ upload step needed. `file` is reserved for real uploaded bytes you actually
109
+ have (`synap_store_file`; over 10MB `synap_request_upload`) — authored text
110
+ never becomes a `file`. Reach for `synap_create_document` /
111
+ `POST /api/hub/documents` directly only for a standalone rich document that
112
+ isn't itself a title-worthy entity (see below) — never as a substitute for an
113
+ entity's `content`.
114
+
115
+ ### "I want to add a real FILE" — the decision tree
116
+
117
+ You CAN store content you **hold** — you send it inline. Pick by what you have:
118
+
119
+ | You have… | Do this | Result |
120
+ | ------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
121
+ | **Content in hand** — a report/CSV/image/PDF/etc. you generated or received (text or bytes) | **`synap_store_file`** (`content` for text, `contentBase64` for binary) + `mimeType`/`filename` | a `file` entity, content stored **as-is, never read** (≤10MB inline) |
122
+ | Text you're **authoring as a note/idea** (not "a file") — a plan, a thought | `synap_create_entity` with `content` (a content kind) | body auto-becomes a document — NOT a `file` |
123
+ | Only a **URL/link** (no bytes) — a Google Doc, a PDF url, an article | `synap_create_document` with **`url`**, or attach via `entityId` | an external **reference** document (no bytes) |
124
+ | A **large file** (over 10MB, up to 500MB video) | `synap_request_upload` → PUT the bytes to `uploadUrl` → `synap_store_file({ uploadToken })` | a `file` entity backed by stored bytes |
125
+ | Only a file's **name**, nothing else | you **cannot** invent it — ask the human/client to provide the content or a link | — |
126
+
127
+ **A typed thing with a file → the KIND first, the bytes on it.** When a kind
128
+ exists for the thing (a logo is a `brand-asset`, not a `file`; check the space
129
+ brief or `synap_list_profiles`): (1) resolve-or-create that entity
130
+ (`synap_ask`, then `synap_create_entity`); (2) `synap_store_file` with
131
+ `attachToEntityId` = its id (`content` for SVG/text, `contentBase64` for
132
+ binary, ≤10MB inline; larger: `synap_request_upload`, then `uploadToken`); (3) link it /
133
+ `synap_file_into_project` if asked. A `proposed` create has no live id yet —
134
+ attach after approval. A bare `file` is only for bytes with no kind.
135
+
136
+ **Store ≠ analyze.** `synap_store_file` / `synap_create_document` store content
137
+ **deterministically — the file is NEVER read by an LLM.** Only fetch a document
138
+ and reason over it when the user explicitly says "read/analyze this file."
139
+
140
+ **Do NOT over-structure a file request.** "Store this file" / "how do I add this
141
+ file" is ONE intent → at most one stored file (plus, only if asked, a linking
142
+ relation). Never inflate it into a task + note + placeholder-file scaffold, and
143
+ never dump the request text into a note and call it done.
144
+
44
145
  ### Create a document (attach to an entity)
45
146
 
46
147
  ```json
@@ -53,11 +154,19 @@ POST /api/hub/documents
53
154
  "type": "markdown", // "markdown" | "html" | "text" | "code"
54
155
  "entityId": "ent_event_..." // attach to an entity for context
55
156
  }
157
+ // → { "id": "doc_abc", "documentId": "doc_abc", "status": "created", "ackState": "applied",
158
+ // "attached": { "entityId": "ent_event_...", "documentId": "doc_abc", "status": "updated" } }
56
159
  ```
57
160
 
161
+ `attached` reports the attach outcome: it is a governed entity update, so it can
162
+ be `proposed`, and it is `skipped` (with a `reason`) while the document itself is
163
+ awaiting review. Other optional fields: `url` (an https link — creates a reference
164
+ document with no stored bytes), `idempotencyKey` (a retry with the same key returns
165
+ the prior document), `expectedLabel` (the session-output slot it fulfils).
166
+
58
167
  `type: "html"` stores self-contained HTML. The browser renders it via the `html-doc` cell in a sandboxed iframe. Use for AI-generated reports, rich visualisations, custom charts, or anything beyond markdown.
59
168
 
60
- **Full HTML cell workflow** (AI → visible custom UI in any bento):
169
+ **HTML document workflow:**
61
170
 
62
171
  ```json
63
172
  // 1. Create the HTML document
@@ -66,53 +175,72 @@ POST /api/hub/documents
66
175
  "title": "Q2 Revenue Report", "type": "html",
67
176
  "content": "<!DOCTYPE html><html>…</html>",
68
177
  "entityId": "ent_project_..." }
69
- // → { "document": { "id": "doc_abc" }, ... }
70
-
71
- // 2. Place the html-doc cell in any bento view
72
- POST /api/hub/views/{bentoViewId}/arrange
73
- { "userId": "{userId}", "workspaceId": "{workspaceId}",
74
- "widgets": [
75
- { "id": "b1", "kind": "html-doc", "config": { "documentId": "doc_abc" },
76
- "layout": { "x": 0, "y": 0, "w": 8, "h": 6 } }
77
- ] }
178
+ // → { "id": "doc_abc", "documentId": "doc_abc", "status": "created", ... }
78
179
 
79
- // 3. Update the HTML (cell auto-refreshes)
180
+ // 2. Replace the HTML (read it first: GET → `revision`)
80
181
  PATCH /api/hub/documents/doc_abc
81
- { "userId": "{userId}", "content": "<!DOCTYPE html>…updated…</html>" }
182
+ { "userId": "{userId}", "content": "<!DOCTYPE html>…updated…</html>", "baseRevision": 3 }
183
+ // → a pending proposal; readers see the new HTML only once it is approved
82
184
  ```
83
185
 
186
+ `html-doc` is **not** an agent-placeable bento widget: `arrange` rejects it. The
187
+ document renders where it is opened (the Files app, or the entity it is attached
188
+ to). For HTML you want to embed elsewhere, create an HTML cell instance
189
+ (`POST /api/hub/cell-instances/html`) and embed it by `instanceId`.
190
+
84
191
  The iframe uses `sandbox="allow-scripts"` — scripts run but have no same-origin access to the parent app. The HTML is fully isolated.
85
192
 
86
- ### Update a document (title and/or content)
193
+ ### Update a document's content (a patch, reviewed)
194
+
195
+ Change the part you mean, not the whole body. Read it first —
196
+ `GET /api/hub/documents/{id}?userId={userId}` → `content`, `revision`,
197
+ `sections` (id + owner) — then:
87
198
 
88
199
  ```json
89
- PATCH /api/hub/documents/{documentId}
200
+ POST /api/hub/documents/{documentId}/patch
90
201
  {
91
202
  "userId": "{userId}",
92
- "title": "Updated title", // optional
93
- "content": "# Full replacement\n…" // full string — not a diff
203
+ "baseRevision": 3,
204
+ "ops": [
205
+ { "op": "replace_text", "old": "ships on Friday", "new": "ships on Monday" },
206
+ { "op": "upsert_section", "id": "risks", "title": "Risks", "body": "None yet." }
207
+ ]
94
208
  }
95
209
  ```
96
210
 
97
- Content is a **full replacement**, not a patch. Fetch the current content first if you want to append: `GET /api/hub/documents/{id}?userId={userId}` → `.content`, append, then PATCH.
211
+ Ops: `upsert_section {id, title, body}` (one section by id), `replace_text {old,
212
+ new}` (`old` must match **exactly once**, else 400 with the count), `append
213
+ {body}`, `replace_all {content}`. An agent's edit is filed as a proposal (a
214
+ governance rule may apply it directly); a person's section (`owner="human"`) is
215
+ never changed and an embed is never dropped unless you pass
216
+ `"allowRemovingEmbeds": true` (403 otherwise). A moved document answers 409 and
217
+ nothing is written: read again. An applied or approved edit reaches open editors
218
+ (`document:content-replaced`), so they reload instead of overwriting it. `PATCH /api/hub/documents/{id}` with `content` is the same door with
219
+ one `replace_all` — it cannot rename (a `title` is refused with 400; to rename an
220
+ entity's document, update the entity's title). MCP: `synap_update_document`;
221
+ full syntax in `document-embeds.md`.
98
222
 
99
223
  The reverse lookup is `entities WHERE documentId = ?`. Always attach the document to a meaningful entity (the meeting event, the project, the person) — a floating document is another orphan.
100
224
 
101
- ### Store a fact (memory) — use sparingly
225
+ ### Remember a fact about the user — use sparingly
102
226
 
103
- ```json
104
- POST /api/hub/memory
105
- { "userId": "{userId}", "fact": "User prefers async communication over meetings" }
106
- ```
227
+ A fact _about the user_ goes through `remember_fact` (CLI: `synap capture --type
228
+ observation`). It writes a governed `user_observation` — not an ungoverned
229
+ throwaway row: a fact the user explicitly stated auto-approves; a fact you
230
+ inferred returns `proposed` (normal — surface the review link). Because it's a
231
+ real entity it's addressable, linkable and revertible.
107
232
 
108
- Always auto-approved. **Memory is for loose, unstructured, hard-to-title facts only.** The seductive thing about memory is it has zero friction — no dedup, no linking, no proposals. That makes it easy to misuse.
233
+ **Use it only for loose, unstructured, hard-to-title facts about the user** — a
234
+ stated preference, a throwaway detail. Everything with a title-worthy noun or
235
+ something to link to is an ENTITY through the capture door, not an observation.
109
236
 
110
- **The test:** if the user later asked "show me all X," can memory answer? Memory can only keyword-match — it has no structure. So:
237
+ **The test:** if the user later asked "show me all X," could a loose observation
238
+ answer? It can only keyword-match — it has no structure. So:
111
239
 
112
240
  | Input | Use |
113
241
  | ------------------------------------------------------- | --------------------------------------------------------------- |
114
- | "User prefers async communication" | memory — it's a preference |
115
- | "Garage code is 4321" | memory — throwaway fact |
242
+ | "User prefers async communication" | observation — it's a preference |
243
+ | "Garage code is 4321" | observation — throwaway fact |
116
244
  | "Should we use LangGraph or CrewAI for Eve?" | **entity `question`** — substantive inquiry, start of flow |
117
245
  | "Here's what I found comparing LangGraph and CrewAI…" | **entity `research`** — investigation with sources + conclusion |
118
246
  | "We decided to use LangGraph over OpenClaude's native…" | **entity `decision`** — has title, rationale, project |
@@ -122,7 +250,7 @@ Always auto-approved. **Memory is for loose, unstructured, hard-to-title facts o
122
250
  | "Action item from meeting: ship MVP by Friday" | **entity `task`** linked to the `event` (meeting) |
123
251
  | "Agreed with Sarah: we'll split backend & frontend" | **entity `decision`** linked to Sarah + the project |
124
252
 
125
- **Rule of thumb:** if it has a title-worthy noun OR context to link to (a project, a person, a meeting) OR a lifecycle (status/supersession) — it's an entity, not memory. Memory is the fallback, not the default.
253
+ **Rule of thumb:** if it has a title-worthy noun OR context to link to (a project, a person, a meeting) OR a lifecycle (status/supersession) — it's an entity through the capture door, not an observation. A user observation is the fallback, not the default.
126
254
 
127
255
  **For decisions specifically** — use the `decision` system profile:
128
256
 
@@ -145,6 +273,8 @@ POST /api/hub/entities
145
273
 
146
274
  This creates a first-class decision entity linked to Project Eve. It shows up in traversals, can be superseded later (`supersededBy: newDecisionId`), and survives governance. Memory can't do any of that.
147
275
 
276
+ **A decision the PERSON must make** — create it with `decisionStatus: "proposed"` and the pod asks them for you: pass `decisionOptions` (≤8 of `{label, value?, description?}`) and `recommendedOption` (an option's `value`, else its `label`); set `sourceSessionId` to keep the question in your session. Their answer UPDATES that decision — never create a second one. Every answered `confirm`/`choose` ask already files its decision (`slot.decisionId`): don't create one for it. A person-owned slot blocked on a decision is ANSWERED by them (Yes/No or a choice) — it is never closed by marking it done. **Before you recommend**, recall the user's past decisions (`synap_ask`, or find `decision` entities) so your pick follows their past choices.
277
+
148
278
  ### Post to the user's personal channel
149
279
 
150
280
  ```
@@ -0,0 +1,63 @@
1
+ ## Writing titles and knowledge
2
+
3
+ Every write receipt runs the title rubric and returns `titleLint` when a title
4
+ breaks it. The title is stored as you sent it — **rewrite it** (update the
5
+ title) instead of leaving it. The pod never shortens a title for you, and over
6
+ 200 characters it refuses the write.
7
+
8
+ ### Title rules (every kind, every pod)
9
+
10
+ 1. **One complete phrase, 80 characters at most** (aim for 40–70; a question
11
+ may take 110). If it does not fit, rewrite it — never cut it, never end it
12
+ with "…".
13
+ 2. **Name the lasting thing, not the event.** No SHIPPED, LIVE, FIXED, DONE,
14
+ VERIFIED, CORRECTION, no emoji. Status goes in a status property; the date
15
+ is already on the record.
16
+ 3. **No machinery in the title:** no hashes, ids, file paths, line numbers,
17
+ markdown, URLs. They go in the body as evidence.
18
+ 4. **Do not repeat the kind** ("Lesson:", "Decision:", "Caution:", "Finding:").
19
+ The kind and `knowledgeForm` already say it.
20
+ 5. **Plain words.** A code is allowed only when the pod's glossary has it;
21
+ plan codes (T1, D3, W4, Wave A) are replaced by words.
22
+ 6. **Same language as the body.**
23
+ 7. **Search before you create** (`synap_ask`) and keep a title stable on
24
+ update. A superseded decision gets a title that says what replaced it.
25
+ 8. **Never empty, never a placeholder** ("Untitled", "Test", a URL, the first
26
+ words of a transcript).
27
+
28
+ | Kind | Title shape | Example |
29
+ | --- | --- | --- |
30
+ | Knowledge | The claim as a short sentence | Space skills are linked by the brief, not by a row |
31
+ | Decision | What was decided, as a fact | Connection data lives in one package: @synap-core/integrations |
32
+ | Question | A real question ending in ? | Should Grida replace or complement the tldraw whiteboard? |
33
+ | Task | Verb + object (+ who/when) | Send signed agreement to Harbor Goods |
34
+ | Research | Subject + what was assessed | Excalidraw evaluated as a Synap capability |
35
+ | Issue | The problem as a statement | Capture reads the URL but never feeds it to the structurer |
36
+ | Note | What it is about | Farm-to-Client Market — idea brief |
37
+ | Work session | The outcome, short | Frontend package consolidation: 4 layer packages |
38
+ | Run | Run name + instance | Daily client briefing — 12 Oct |
39
+ | Report | Scope + period | Builder weekly report — week of 5 Oct |
40
+
41
+ ### What counts as knowledge
42
+
43
+ Knowledge is something that will **still be true and useful in three months**,
44
+ whenever it was learned. It takes one `knowledgeForm`:
45
+
46
+ - `fact` — how something works.
47
+ - `caution` — a pitfall and how to avoid it.
48
+ - `convention` — how we do things here.
49
+
50
+ The full sentence goes in `ek_claim`; the title is its short handle, never the
51
+ claim cut off. Everything else goes elsewhere:
52
+
53
+ | It is really… | File it as |
54
+ | --- | --- |
55
+ | progress, "shipped", "verified", "done" | the session's outcome or report — not a lasting entity |
56
+ | a choice that was made | `decision` |
57
+ | an open bug or problem | `issue` |
58
+ | a plan, an idea, a hypothesis | `note` (or `question` if it is one) |
59
+ | steps to follow | a skill |
60
+ | a fact about an outside tool, vendor or market | `research` |
61
+
62
+ When unsure, ask: "will this still help someone in three months, and is it a
63
+ fact, a pitfall or a rule?" If not, it is not knowledge.