@synap-core/cli 1.11.0 → 1.13.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.
Files changed (533) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +40 -198
  3. package/dist/build-info.json +6 -0
  4. package/dist/commands/agent-run.js +3 -2
  5. package/dist/commands/agent-run.js.map +1 -1
  6. package/dist/commands/agents.d.ts +32 -17
  7. package/dist/commands/agents.js +203 -237
  8. package/dist/commands/agents.js.map +1 -1
  9. package/dist/commands/app.d.ts +143 -0
  10. package/dist/commands/app.js +524 -0
  11. package/dist/commands/app.js.map +1 -0
  12. package/dist/commands/automate.d.ts +21 -0
  13. package/dist/commands/automate.js +42 -0
  14. package/dist/commands/automate.js.map +1 -0
  15. package/dist/commands/automation-schema.test.d.ts +16 -0
  16. package/dist/commands/automation-schema.test.js +77 -0
  17. package/dist/commands/automation-schema.test.js.map +1 -0
  18. package/dist/commands/automation.d.ts +12 -0
  19. package/dist/commands/automation.js +116 -66
  20. package/dist/commands/automation.js.map +1 -1
  21. package/dist/commands/box.d.ts +42 -0
  22. package/dist/commands/box.js +89 -0
  23. package/dist/commands/box.js.map +1 -0
  24. package/dist/commands/bridge-setup.d.ts +14 -1
  25. package/dist/commands/bridge-setup.js +395 -129
  26. package/dist/commands/bridge-setup.js.map +1 -1
  27. package/dist/commands/cap-connections.d.ts +4 -4
  28. package/dist/commands/cap-connections.js +14 -14
  29. package/dist/commands/cap-connections.js.map +1 -1
  30. package/dist/commands/capability.d.ts +3 -1
  31. package/dist/commands/capability.js +249 -176
  32. package/dist/commands/capability.js.map +1 -1
  33. package/dist/commands/catalog.d.ts +275 -0
  34. package/dist/commands/catalog.js +481 -0
  35. package/dist/commands/catalog.js.map +1 -0
  36. package/dist/commands/cell.d.ts +155 -8
  37. package/dist/commands/cell.js +416 -40
  38. package/dist/commands/cell.js.map +1 -1
  39. package/dist/commands/centrality.js +1 -13
  40. package/dist/commands/centrality.js.map +1 -1
  41. package/dist/commands/close-questions.d.ts +27 -0
  42. package/dist/commands/close-questions.js +49 -0
  43. package/dist/commands/close-questions.js.map +1 -0
  44. package/dist/commands/close-questions.test.d.ts +1 -0
  45. package/dist/commands/close-questions.test.js +52 -0
  46. package/dist/commands/close-questions.test.js.map +1 -0
  47. package/dist/commands/connect.d.ts +36 -13
  48. package/dist/commands/connect.js +68 -167
  49. package/dist/commands/connect.js.map +1 -1
  50. package/dist/commands/connections.d.ts +3 -2
  51. package/dist/commands/connections.js +95 -25
  52. package/dist/commands/connections.js.map +1 -1
  53. package/dist/commands/context.js +79 -44
  54. package/dist/commands/context.js.map +1 -1
  55. package/dist/commands/data-extra.d.ts +34 -0
  56. package/dist/commands/data-extra.js +203 -25
  57. package/dist/commands/data-extra.js.map +1 -1
  58. package/dist/commands/data.d.ts +120 -2
  59. package/dist/commands/data.js +295 -21
  60. package/dist/commands/data.js.map +1 -1
  61. package/dist/commands/diagnose.d.ts +66 -4
  62. package/dist/commands/diagnose.js +285 -28
  63. package/dist/commands/diagnose.js.map +1 -1
  64. package/dist/commands/doc.d.ts +11 -4
  65. package/dist/commands/doc.js +39 -14
  66. package/dist/commands/doc.js.map +1 -1
  67. package/dist/commands/doctor.d.ts +133 -3
  68. package/dist/commands/doctor.js +761 -41
  69. package/dist/commands/doctor.js.map +1 -1
  70. package/dist/commands/explain.js +5 -5
  71. package/dist/commands/explain.js.map +1 -1
  72. package/dist/commands/hooks.d.ts +19 -0
  73. package/dist/commands/hooks.js +70 -0
  74. package/dist/commands/hooks.js.map +1 -0
  75. package/dist/commands/import.d.ts +393 -13
  76. package/dist/commands/import.js +1150 -54
  77. package/dist/commands/import.js.map +1 -1
  78. package/dist/commands/init.d.ts +34 -9
  79. package/dist/commands/init.js +481 -981
  80. package/dist/commands/init.js.map +1 -1
  81. package/dist/commands/keys.d.ts +1 -0
  82. package/dist/commands/keys.js +15 -2
  83. package/dist/commands/keys.js.map +1 -1
  84. package/dist/commands/knowledge.d.ts +22 -6
  85. package/dist/commands/knowledge.js +121 -57
  86. package/dist/commands/knowledge.js.map +1 -1
  87. package/dist/commands/lens.d.ts +37 -1
  88. package/dist/commands/lens.js +194 -72
  89. package/dist/commands/lens.js.map +1 -1
  90. package/dist/commands/market-authoring.d.ts +29 -2
  91. package/dist/commands/market-authoring.js +348 -7
  92. package/dist/commands/market-authoring.js.map +1 -1
  93. package/dist/commands/market-official.d.ts +58 -0
  94. package/dist/commands/market-official.js +84 -0
  95. package/dist/commands/market-official.js.map +1 -0
  96. package/dist/commands/market.d.ts +400 -16
  97. package/dist/commands/market.js +1802 -146
  98. package/dist/commands/market.js.map +1 -1
  99. package/dist/commands/mcp.d.ts +60 -25
  100. package/dist/commands/mcp.js +251 -64
  101. package/dist/commands/mcp.js.map +1 -1
  102. package/dist/commands/observe.category.test.d.ts +1 -0
  103. package/dist/commands/observe.category.test.js +59 -0
  104. package/dist/commands/observe.category.test.js.map +1 -0
  105. package/dist/commands/observe.d.ts +3 -0
  106. package/dist/commands/observe.js +7 -5
  107. package/dist/commands/observe.js.map +1 -1
  108. package/dist/commands/observe.title.test.d.ts +1 -0
  109. package/dist/commands/observe.title.test.js +37 -0
  110. package/dist/commands/observe.title.test.js.map +1 -0
  111. package/dist/commands/open.d.ts +39 -9
  112. package/dist/commands/open.js +80 -25
  113. package/dist/commands/open.js.map +1 -1
  114. package/dist/commands/playbook.d.ts +42 -0
  115. package/dist/commands/playbook.js +171 -0
  116. package/dist/commands/playbook.js.map +1 -0
  117. package/dist/commands/pod.js +1 -1
  118. package/dist/commands/pod.js.map +1 -1
  119. package/dist/commands/pods.d.ts +11 -1
  120. package/dist/commands/pods.js +129 -131
  121. package/dist/commands/pods.js.map +1 -1
  122. package/dist/commands/proposals-actions.d.ts +62 -0
  123. package/dist/commands/proposals-actions.js +143 -8
  124. package/dist/commands/proposals-actions.js.map +1 -1
  125. package/dist/commands/proposals-await.d.ts +68 -0
  126. package/dist/commands/proposals-await.js +248 -0
  127. package/dist/commands/proposals-await.js.map +1 -0
  128. package/dist/commands/proton-setup.d.ts +73 -0
  129. package/dist/commands/proton-setup.js +579 -0
  130. package/dist/commands/proton-setup.js.map +1 -0
  131. package/dist/commands/providers.d.ts +23 -0
  132. package/dist/commands/providers.js +126 -1
  133. package/dist/commands/providers.js.map +1 -1
  134. package/dist/commands/raycast.js +6 -2
  135. package/dist/commands/raycast.js.map +1 -1
  136. package/dist/commands/rule.d.ts +150 -0
  137. package/dist/commands/rule.js +447 -0
  138. package/dist/commands/rule.js.map +1 -0
  139. package/dist/commands/session-feed-wait.d.ts +48 -0
  140. package/dist/commands/session-feed-wait.js +261 -0
  141. package/dist/commands/session-feed-wait.js.map +1 -0
  142. package/dist/commands/session-post.d.ts +40 -0
  143. package/dist/commands/session-post.js +96 -0
  144. package/dist/commands/session-post.js.map +1 -0
  145. package/dist/commands/session-wait.d.ts +116 -0
  146. package/dist/commands/session-wait.js +224 -0
  147. package/dist/commands/session-wait.js.map +1 -0
  148. package/dist/commands/sessions.d.ts +54 -0
  149. package/dist/commands/sessions.js +501 -58
  150. package/dist/commands/sessions.js.map +1 -1
  151. package/dist/commands/skill-manage.d.ts +21 -0
  152. package/dist/commands/skill-manage.js +136 -19
  153. package/dist/commands/skill-manage.js.map +1 -1
  154. package/dist/commands/skills-commands.d.ts +2 -0
  155. package/dist/commands/skills-commands.js +9 -1
  156. package/dist/commands/skills-commands.js.map +1 -1
  157. package/dist/commands/skills-commands.test.d.ts +1 -0
  158. package/dist/commands/skills-commands.test.js +57 -0
  159. package/dist/commands/skills-commands.test.js.map +1 -0
  160. package/dist/commands/skills.js +16 -0
  161. package/dist/commands/skills.js.map +1 -1
  162. package/dist/commands/status.d.ts +1 -4
  163. package/dist/commands/status.js +6 -35
  164. package/dist/commands/status.js.map +1 -1
  165. package/dist/commands/statusline.backoff.test.d.ts +13 -0
  166. package/dist/commands/statusline.backoff.test.js +100 -0
  167. package/dist/commands/statusline.backoff.test.js.map +1 -0
  168. package/dist/commands/statusline.js +16 -9
  169. package/dist/commands/statusline.js.map +1 -1
  170. package/dist/commands/sync-status.d.ts +12 -0
  171. package/dist/commands/sync-status.js +125 -0
  172. package/dist/commands/sync-status.js.map +1 -0
  173. package/dist/commands/templates-retire.d.ts +34 -0
  174. package/dist/commands/templates-retire.js +192 -0
  175. package/dist/commands/templates-retire.js.map +1 -0
  176. package/dist/commands/tools.js +6 -21
  177. package/dist/commands/tools.js.map +1 -1
  178. package/dist/commands/tracks.d.ts +112 -0
  179. package/dist/commands/tracks.js +543 -0
  180. package/dist/commands/tracks.js.map +1 -0
  181. package/dist/commands/update.d.ts +3 -11
  182. package/dist/commands/update.js +5 -134
  183. package/dist/commands/update.js.map +1 -1
  184. package/dist/commands/upload.d.ts +41 -3
  185. package/dist/commands/upload.js +120 -18
  186. package/dist/commands/upload.js.map +1 -1
  187. package/dist/commands/vendor.d.ts +28 -0
  188. package/dist/commands/vendor.js +110 -0
  189. package/dist/commands/vendor.js.map +1 -0
  190. package/dist/commands/versions.js +6 -0
  191. package/dist/commands/versions.js.map +1 -1
  192. package/dist/commands/view.js +10 -5
  193. package/dist/commands/view.js.map +1 -1
  194. package/dist/commands/whoami.d.ts +30 -3
  195. package/dist/commands/whoami.js +186 -23
  196. package/dist/commands/whoami.js.map +1 -1
  197. package/dist/commands/worker-accounts.d.ts +149 -0
  198. package/dist/commands/worker-accounts.js +339 -0
  199. package/dist/commands/worker-accounts.js.map +1 -0
  200. package/dist/commands/worker-accounts.test.d.ts +1 -0
  201. package/dist/commands/worker-accounts.test.js +224 -0
  202. package/dist/commands/worker-accounts.test.js.map +1 -0
  203. package/dist/commands/worker.d.ts +331 -0
  204. package/dist/commands/worker.js +1067 -0
  205. package/dist/commands/worker.js.map +1 -0
  206. package/dist/commands/worker.test.d.ts +1 -0
  207. package/dist/commands/worker.test.js +427 -0
  208. package/dist/commands/worker.test.js.map +1 -0
  209. package/dist/commands/workspace-ops.d.ts +35 -0
  210. package/dist/commands/workspace-ops.js +153 -0
  211. package/dist/commands/workspace-ops.js.map +1 -0
  212. package/dist/index.d.ts +6 -6
  213. package/dist/index.js +1043 -186
  214. package/dist/index.js.map +1 -1
  215. package/dist/lib/agent-connections.d.ts +31 -0
  216. package/dist/lib/agent-connections.js +33 -0
  217. package/dist/lib/agent-connections.js.map +1 -0
  218. package/dist/lib/agent-detect.d.ts +27 -0
  219. package/dist/lib/agent-detect.js +71 -0
  220. package/dist/lib/agent-detect.js.map +1 -0
  221. package/dist/lib/agent-door.d.ts +136 -0
  222. package/dist/lib/agent-door.js +429 -0
  223. package/dist/lib/agent-door.js.map +1 -0
  224. package/dist/lib/agents-config.d.ts +2 -0
  225. package/dist/lib/agents-config.js +4 -9
  226. package/dist/lib/agents-config.js.map +1 -1
  227. package/dist/lib/approval-poll.d.ts +31 -2
  228. package/dist/lib/approval-poll.js +20 -7
  229. package/dist/lib/approval-poll.js.map +1 -1
  230. package/dist/lib/atomic-file.d.ts +48 -0
  231. package/dist/lib/atomic-file.js +129 -0
  232. package/dist/lib/atomic-file.js.map +1 -0
  233. package/dist/lib/auth.d.ts +17 -11
  234. package/dist/lib/auth.js +47 -64
  235. package/dist/lib/auth.js.map +1 -1
  236. package/dist/lib/batch-approval.d.ts +85 -0
  237. package/dist/lib/batch-approval.js +170 -0
  238. package/dist/lib/batch-approval.js.map +1 -0
  239. package/dist/lib/box/egress.d.ts +82 -0
  240. package/dist/lib/box/egress.js +264 -0
  241. package/dist/lib/box/egress.js.map +1 -0
  242. package/dist/lib/box/evidence.d.ts +86 -0
  243. package/dist/lib/box/evidence.js +121 -0
  244. package/dist/lib/box/evidence.js.map +1 -0
  245. package/dist/lib/box/job-server.d.ts +72 -0
  246. package/dist/lib/box/job-server.js +246 -0
  247. package/dist/lib/box/job-server.js.map +1 -0
  248. package/dist/lib/box/provisioner.d.ts +83 -0
  249. package/dist/lib/box/provisioner.js +312 -0
  250. package/dist/lib/box/provisioner.js.map +1 -0
  251. package/dist/lib/box/proxmox.d.ts +112 -0
  252. package/dist/lib/box/proxmox.js +211 -0
  253. package/dist/lib/box/proxmox.js.map +1 -0
  254. package/dist/lib/box/wire.d.ts +98 -0
  255. package/dist/lib/box/wire.js +70 -0
  256. package/dist/lib/box/wire.js.map +1 -0
  257. package/dist/lib/capture-lane.d.ts +6 -5
  258. package/dist/lib/capture-lane.js +6 -5
  259. package/dist/lib/capture-lane.js.map +1 -1
  260. package/dist/lib/capture-structure.d.ts +230 -11
  261. package/dist/lib/capture-structure.js +251 -13
  262. package/dist/lib/capture-structure.js.map +1 -1
  263. package/dist/lib/catalog-templates.d.ts +59 -0
  264. package/dist/lib/catalog-templates.js +126 -0
  265. package/dist/lib/catalog-templates.js.map +1 -0
  266. package/dist/lib/cli-build.d.ts +19 -0
  267. package/dist/lib/cli-build.js +37 -0
  268. package/dist/lib/cli-build.js.map +1 -0
  269. package/dist/lib/client-header.test.d.ts +1 -0
  270. package/dist/lib/client-header.test.js +85 -0
  271. package/dist/lib/client-header.test.js.map +1 -0
  272. package/dist/lib/conversation-headers.d.ts +33 -0
  273. package/dist/lib/conversation-headers.js +69 -0
  274. package/dist/lib/conversation-headers.js.map +1 -0
  275. package/dist/lib/cp-packages.d.ts +167 -11
  276. package/dist/lib/cp-packages.js +253 -21
  277. package/dist/lib/cp-packages.js.map +1 -1
  278. package/dist/lib/credential-class.d.ts +144 -0
  279. package/dist/lib/credential-class.js +138 -0
  280. package/dist/lib/credential-class.js.map +1 -0
  281. package/dist/lib/describe-lens.d.ts +35 -0
  282. package/dist/lib/describe-lens.js +40 -0
  283. package/dist/lib/describe-lens.js.map +1 -1
  284. package/dist/lib/device-connect.d.ts +125 -0
  285. package/dist/lib/device-connect.js +256 -0
  286. package/dist/lib/device-connect.js.map +1 -0
  287. package/dist/lib/directory-lens.d.ts +99 -0
  288. package/dist/lib/directory-lens.js +187 -0
  289. package/dist/lib/directory-lens.js.map +1 -0
  290. package/dist/lib/exporter-coverage.d.ts +71 -0
  291. package/dist/lib/exporter-coverage.js +97 -0
  292. package/dist/lib/exporter-coverage.js.map +1 -0
  293. package/dist/lib/goal-words.d.ts +38 -0
  294. package/dist/lib/goal-words.js +112 -0
  295. package/dist/lib/goal-words.js.map +1 -0
  296. package/dist/lib/hub-client.d.ts +57 -15
  297. package/dist/lib/hub-client.js +396 -82
  298. package/dist/lib/hub-client.js.map +1 -1
  299. package/dist/lib/init-connect.d.ts +41 -0
  300. package/dist/lib/init-connect.js +75 -0
  301. package/dist/lib/init-connect.js.map +1 -0
  302. package/dist/lib/init-exit.d.ts +24 -0
  303. package/dist/lib/init-exit.js +41 -0
  304. package/dist/lib/init-exit.js.map +1 -0
  305. package/dist/lib/init-flow.d.ts +25 -0
  306. package/dist/lib/init-flow.js +40 -0
  307. package/dist/lib/init-flow.js.map +1 -0
  308. package/dist/lib/init-handoff.d.ts +24 -0
  309. package/dist/lib/init-handoff.js +26 -0
  310. package/dist/lib/init-handoff.js.map +1 -0
  311. package/dist/lib/init-output.d.ts +18 -0
  312. package/dist/lib/init-output.js +43 -0
  313. package/dist/lib/init-output.js.map +1 -0
  314. package/dist/lib/init-pod.d.ts +45 -0
  315. package/dist/lib/init-pod.js +36 -0
  316. package/dist/lib/init-pod.js.map +1 -0
  317. package/dist/lib/installed.d.ts +210 -11
  318. package/dist/lib/installed.js +234 -36
  319. package/dist/lib/installed.js.map +1 -1
  320. package/dist/lib/key-approval.d.ts +57 -0
  321. package/dist/lib/key-approval.js +117 -0
  322. package/dist/lib/key-approval.js.map +1 -0
  323. package/dist/lib/key-diagnosis.d.ts +56 -0
  324. package/dist/lib/key-diagnosis.js +227 -0
  325. package/dist/lib/key-diagnosis.js.map +1 -0
  326. package/dist/lib/key-doctor.d.ts +136 -0
  327. package/dist/lib/key-doctor.js +286 -0
  328. package/dist/lib/key-doctor.js.map +1 -0
  329. package/dist/lib/key-locations.d.ts +120 -0
  330. package/dist/lib/key-locations.js +326 -0
  331. package/dist/lib/key-locations.js.map +1 -0
  332. package/dist/lib/key-source.d.ts +68 -0
  333. package/dist/lib/key-source.js +109 -0
  334. package/dist/lib/key-source.js.map +1 -0
  335. package/dist/lib/key-state.d.ts +70 -0
  336. package/dist/lib/key-state.js +115 -0
  337. package/dist/lib/key-state.js.map +1 -0
  338. package/dist/lib/kind-package.d.ts +181 -0
  339. package/dist/lib/kind-package.js +679 -0
  340. package/dist/lib/kind-package.js.map +1 -0
  341. package/dist/lib/knowledge-title.d.ts +25 -0
  342. package/dist/lib/knowledge-title.js +47 -0
  343. package/dist/lib/knowledge-title.js.map +1 -0
  344. package/dist/lib/knowledge-title.test.d.ts +1 -0
  345. package/dist/lib/knowledge-title.test.js +34 -0
  346. package/dist/lib/knowledge-title.test.js.map +1 -0
  347. package/dist/lib/machine-instance.d.ts +64 -0
  348. package/dist/lib/machine-instance.js +142 -0
  349. package/dist/lib/machine-instance.js.map +1 -0
  350. package/dist/lib/mcp-bridge.d.ts +49 -0
  351. package/dist/lib/mcp-bridge.js +180 -0
  352. package/dist/lib/mcp-bridge.js.map +1 -0
  353. package/dist/lib/mcp-bridge.test.d.ts +1 -0
  354. package/dist/lib/mcp-bridge.test.js +118 -0
  355. package/dist/lib/mcp-bridge.test.js.map +1 -0
  356. package/dist/lib/mcp-call.d.ts +30 -0
  357. package/dist/lib/mcp-call.js +107 -0
  358. package/dist/lib/mcp-call.js.map +1 -0
  359. package/dist/lib/mcp-snippets.d.ts +53 -0
  360. package/dist/lib/mcp-snippets.js +82 -0
  361. package/dist/lib/mcp-snippets.js.map +1 -0
  362. package/dist/lib/next-steps.d.ts +8 -0
  363. package/dist/lib/next-steps.js +31 -1
  364. package/dist/lib/next-steps.js.map +1 -1
  365. package/dist/lib/openclaw.js +3 -2
  366. package/dist/lib/openclaw.js.map +1 -1
  367. package/dist/lib/package-wire.d.ts +179 -0
  368. package/dist/lib/package-wire.js +68 -0
  369. package/dist/lib/package-wire.js.map +1 -0
  370. package/dist/lib/pair-link.d.ts +38 -0
  371. package/dist/lib/pair-link.js +68 -0
  372. package/dist/lib/pair-link.js.map +1 -0
  373. package/dist/lib/pod-moved.d.ts +70 -0
  374. package/dist/lib/pod-moved.js +146 -0
  375. package/dist/lib/pod-moved.js.map +1 -0
  376. package/dist/lib/pod-reach.d.ts +39 -0
  377. package/dist/lib/pod-reach.js +117 -0
  378. package/dist/lib/pod-reach.js.map +1 -0
  379. package/dist/lib/pod-reach.test.d.ts +1 -0
  380. package/dist/lib/pod-reach.test.js +67 -0
  381. package/dist/lib/pod-reach.test.js.map +1 -0
  382. package/dist/lib/pod-wide.d.ts +40 -0
  383. package/dist/lib/pod-wide.js +46 -0
  384. package/dist/lib/pod-wide.js.map +1 -0
  385. package/dist/lib/pod.d.ts +74 -112
  386. package/dist/lib/pod.js +146 -415
  387. package/dist/lib/pod.js.map +1 -1
  388. package/dist/lib/project-ref.d.ts +9 -3
  389. package/dist/lib/project-ref.js +10 -4
  390. package/dist/lib/project-ref.js.map +1 -1
  391. package/dist/lib/register-claude-code-mcp.test.d.ts +1 -0
  392. package/dist/lib/register-claude-code-mcp.test.js +78 -0
  393. package/dist/lib/register-claude-code-mcp.test.js.map +1 -0
  394. package/dist/lib/review-credential.d.ts +119 -0
  395. package/dist/lib/review-credential.js +149 -0
  396. package/dist/lib/review-credential.js.map +1 -0
  397. package/dist/lib/safe-open.d.ts +49 -0
  398. package/dist/lib/safe-open.js +119 -0
  399. package/dist/lib/safe-open.js.map +1 -0
  400. package/dist/lib/session-feed.d.ts +185 -0
  401. package/dist/lib/session-feed.js +257 -0
  402. package/dist/lib/session-feed.js.map +1 -0
  403. package/dist/lib/session-lens.d.ts +40 -1
  404. package/dist/lib/session-lens.js +54 -4
  405. package/dist/lib/session-lens.js.map +1 -1
  406. package/dist/lib/superwhisper-import.d.ts +8 -0
  407. package/dist/lib/superwhisper-import.js +14 -7
  408. package/dist/lib/superwhisper-import.js.map +1 -1
  409. package/dist/lib/superwhisper-title.test.d.ts +1 -0
  410. package/dist/lib/superwhisper-title.test.js +18 -0
  411. package/dist/lib/superwhisper-title.test.js.map +1 -0
  412. package/dist/lib/targets.d.ts +152 -10
  413. package/dist/lib/targets.js +974 -325
  414. package/dist/lib/targets.js.map +1 -1
  415. package/dist/lib/template-file.d.ts +4 -0
  416. package/dist/lib/template-file.js.map +1 -1
  417. package/dist/lib/template-lifecycle.d.ts +217 -0
  418. package/dist/lib/template-lifecycle.js +433 -0
  419. package/dist/lib/template-lifecycle.js.map +1 -0
  420. package/dist/lib/template-steps.d.ts +88 -0
  421. package/dist/lib/template-steps.js +118 -0
  422. package/dist/lib/template-steps.js.map +1 -0
  423. package/dist/lib/time-ago.d.ts +2 -0
  424. package/dist/lib/time-ago.js +15 -0
  425. package/dist/lib/time-ago.js.map +1 -0
  426. package/dist/lib/wake-hook-settings.d.ts +57 -0
  427. package/dist/lib/wake-hook-settings.js +153 -0
  428. package/dist/lib/wake-hook-settings.js.map +1 -0
  429. package/dist/lib/wake-state.d.ts +65 -0
  430. package/dist/lib/wake-state.js +122 -0
  431. package/dist/lib/wake-state.js.map +1 -0
  432. package/dist/utils/logger.js +5 -2
  433. package/dist/utils/logger.js.map +1 -1
  434. package/package.json +26 -17
  435. package/skills/README.md +13 -11
  436. package/skills/agent-os/SKILL.md +214 -99
  437. package/skills/manifest.json +1 -1
  438. package/skills/onboard/SKILL.md +55 -26
  439. package/skills/synap/README.md +5 -8
  440. package/skills/synap/SKILL.md +1149 -289
  441. package/skills/synap/_order.txt +7 -0
  442. package/skills/synap/_skill.yaml +1 -1
  443. package/skills/synap/automations.md +15 -0
  444. package/skills/synap/capture.md +5 -0
  445. package/skills/synap/cli-operations.md +24 -18
  446. package/skills/synap/code-skills.md +70 -0
  447. package/skills/synap/concepts.md +36 -0
  448. package/skills/synap/content-os.md +10 -1
  449. package/skills/synap/creative-loop.md +15 -10
  450. package/skills/synap/crm.md +21 -52
  451. package/skills/synap/document-embeds.md +143 -47
  452. package/skills/synap/escalation-ladder.md +20 -10
  453. package/skills/synap/focus-sessions.md +56 -21
  454. package/skills/synap/from-intent.md +158 -0
  455. package/skills/synap/governance-rules.md +5 -5
  456. package/skills/synap/governance.md +10 -7
  457. package/skills/synap/hand-off.md +33 -0
  458. package/skills/synap/inline-patterns.md +15 -7
  459. package/skills/synap/lenses.md +34 -16
  460. package/skills/synap/linking.md +42 -41
  461. package/skills/synap/mcp-remote-servers.md +64 -0
  462. package/skills/synap/mental-model.md +17 -15
  463. package/skills/synap/operating-mode-rules.md +2 -2
  464. package/skills/synap/processes.md +118 -0
  465. package/skills/synap/quick-reference.md +7 -2
  466. package/skills/synap/reading.md +3 -1
  467. package/skills/synap/reflexes.md +12 -42
  468. package/skills/synap/viewframe-cells.md +38 -5
  469. package/skills/synap/work-flow.md +1 -1
  470. package/skills/synap/work-model.md +110 -0
  471. package/skills/synap/worked-examples.md +4 -5
  472. package/skills/synap/workspace-design.md +15 -11
  473. package/skills/synap/writes.md +105 -25
  474. package/skills/synap/writing-titles.md +63 -0
  475. package/skills/synap-app/SKILL.md +149 -67
  476. package/skills/synap-app/_skill.yaml +1 -1
  477. package/skills/synap-app/creating-the-base-app.md +12 -7
  478. package/skills/synap-app/governance.md +27 -16
  479. package/skills/synap-app/install-commands.md +18 -9
  480. package/skills/synap-app/overview.md +16 -9
  481. package/skills/synap-app/using-the-sdk.md +75 -25
  482. package/skills/synap-design/SKILL.md +474 -0
  483. package/skills/synap-design/_order.txt +4 -0
  484. package/skills/synap-design/_skill.yaml +21 -0
  485. package/skills/synap-design/loop.md +134 -0
  486. package/skills/synap-design/overview.md +44 -0
  487. package/skills/synap-design/principles.md +130 -0
  488. package/skills/synap-design/system.md +133 -0
  489. package/skills/synap-market/SKILL.md +306 -16
  490. package/skills/synap-market/_skill.yaml +1 -1
  491. package/skills/synap-market/author-and-publish.md +145 -8
  492. package/skills/synap-market/governance-and-catalog.md +7 -0
  493. package/skills/synap-market/install.md +79 -1
  494. package/skills/synap-market/overview.md +74 -6
  495. package/skills/synap-schema/SKILL.md +172 -10
  496. package/skills/synap-schema/_order.txt +2 -0
  497. package/skills/synap-schema/_skill.yaml +4 -2
  498. package/skills/synap-schema/common-mistakes.md +4 -2
  499. package/skills/synap-schema/discover-profiles.md +1 -1
  500. package/skills/synap-schema/entity-scope.md +15 -3
  501. package/skills/synap-schema/extend-first.md +29 -0
  502. package/skills/synap-schema/extend-vs-create.md +1 -1
  503. package/skills/synap-schema/intent-vocabulary-ssot.md +111 -0
  504. package/skills/synap-schema/property-types.md +1 -1
  505. package/skills/synap-schema/relations.md +1 -1
  506. package/skills/synap-ui/SKILL.md +19 -12
  507. package/skills/synap-ui/_skill.yaml +1 -1
  508. package/skills/synap-ui/ai-companion.md +1 -1
  509. package/skills/synap-ui/arranging-bento.md +2 -0
  510. package/skills/synap-ui/bento-layouts.md +10 -10
  511. package/skills/synap-ui/bento-recipes.md +313 -543
  512. package/skills/synap-ui/four-builds.md +5 -0
  513. package/skills/synap-ui/view-types.md +2 -2
  514. package/skills/synap-ui/widget-catalog.md +22 -278
  515. package/templates/automations/bookmark-enrichment.automation.json +290 -13
  516. package/templates/automations/url-bookmark-capture.automation.json +73 -11
  517. package/templates/box/runner.py +206 -0
  518. package/templates/skills/authoring-playbooks/SKILL.md +6 -3
  519. package/templates/skills/authoring-playbooks/reference/stages-contract.md +15 -0
  520. package/templates/skills/authoring-playbooks/reference/worked-example.md +3 -0
  521. package/dist/commands/infra.d.ts +0 -21
  522. package/dist/commands/infra.js +0 -262
  523. package/dist/commands/infra.js.map +0 -1
  524. package/node_modules/@synap/hub-rest-client/dist/index.cjs +0 -1261
  525. package/node_modules/@synap/hub-rest-client/dist/index.d.cts +0 -1647
  526. package/node_modules/@synap/hub-rest-client/dist/index.d.ts +0 -1647
  527. package/node_modules/@synap/hub-rest-client/dist/index.js +0 -1231
  528. package/node_modules/@synap/hub-rest-client/package.json +0 -45
  529. package/node_modules/@synap/hub-rest-client/src/client.ts +0 -1631
  530. package/node_modules/@synap/hub-rest-client/src/errors.ts +0 -30
  531. package/node_modules/@synap/hub-rest-client/src/index.ts +0 -153
  532. package/node_modules/@synap/hub-rest-client/src/setup.ts +0 -133
  533. package/node_modules/@synap/hub-rest-client/src/types.ts +0 -1299
@@ -0,0 +1,64 @@
1
+ # Remote MCP servers — how a pod registers, approves and governs them
2
+
3
+ Load this before you suggest connecting an external MCP server to a pod, or when a server's tools do not
4
+ show up. Every claim here is read from the code: the `mcp_servers` table
5
+ (`packages/database/src/schema/mcp-servers.ts`), the settings door (`routers/mcp-servers.ts`), the
6
+ capability installer (`services/capabilities/create-from-definition.ts`) and the IS adapter.
7
+
8
+ ### The row
9
+
10
+ One row per server in `mcp_servers`, scoped to a space (`workspaceId`) or pod-wide (null). `slug` is
11
+ lowercase `a-z0-9-`, unique per space; the IS names each tool `mcp_<slug>_<tool>`, so a space's server
12
+ overrides a pod-wide one with the same slug.
13
+
14
+ | Field | Meaning |
15
+ | ------------ | ------------------------------------------------------------------------------------------ |
16
+ | `transport` | `http` (needs `url`) or `stdio` (needs `command` + `args`, runs on the IS host) |
17
+ | `auth` | http only: `{ credentialRef: "vault://<id>", header: "Authorization", prefix: "Bearer " }` |
18
+ | `toolPolicy` | `{ default: "governed" or "inline", inline: ["tool_a", …] }`; absent = governed |
19
+ | `approved` | false by default; the supply-chain gate |
20
+ | `enabled` | the owner's on/off switch |
21
+
22
+ ### Secrets never sit on the row
23
+
24
+ `auth.credentialRef` points at a vault secret. The pod resolves it server-side on every call (never
25
+ cached), sends it to the IS as a header, and the agent never sees it. If it cannot be resolved for the
26
+ acting user or agent, the server is skipped and its tools simply do not appear: check the vault grant
27
+ before you blame the server.
28
+
29
+ ### Governed by default
30
+
31
+ - A **governed** tool is never called directly: the IS routes it through the pod (`mcp://<slug>`),
32
+ where the capability gate runs it or files a proposal. For an agent, `proposed` is success.
33
+ - An **inline** tool is called directly by the IS. Declare `default: "inline"` only for a server that
34
+ exposes nothing but reads; for a mixed server, list its read tools in `inline`.
35
+ - No policy at all means governed. This is deliberate and fail-closed.
36
+
37
+ ### Approval, and when it resets
38
+
39
+ - Tools reach an agent only when the server is **approved AND enabled** (and, in a channel that keeps
40
+ its own MCP list, only the servers that channel opted into). The list is cached for 30 seconds.
41
+ - In the space settings, tab MCP Servers: a space **owner or admin** adds, edits or deletes a server; only the space
42
+ **owner** approves it; a pod-wide server needs a pod admin to add or edit.
43
+ - Editing `url`, `command`, `args`, `env` or `transport` in the settings **resets approval** (compared by
44
+ value, so a rename or an enabled toggle does not). Re-approve after re-pointing a server.
45
+ - A capability (catalog or `market.install`) may declare `mcpServers[]` with `auth` and `toolPolicy`;
46
+ this is the only door that sets those two today (the settings form does not). Its install is the trust
47
+ decision: it may ship `approved: true`. Re-applying it converges url, auth and policy to the
48
+ template and only ever promotes approval, never revokes it.
49
+
50
+ ### As an agent
51
+
52
+ You have no tool that registers a server. Propose it: a capability that declares the server (installed
53
+ through `market.install`, which files a proposal), or ask the person to add it in the space settings (MCP Servers). Never
54
+ ask for the secret in chat; it goes in the vault.
55
+
56
+ ### Network: who must reach the URL
57
+
58
+ The **IS** opens the connection, not your machine. A `url` must be reachable from where the pod's IS runs.
59
+
60
+ **An unauthenticated dev MCP is never registered on a public URL.** Storybook's `/mcp`
61
+ (`http://localhost:6006/mcp`) and similar dev servers have no auth: reach them only over a private
62
+ network or a tunnel the IS is on (an SSH tunnel to a dev pod), keep them bound to loopback otherwise,
63
+ and prefer a static artifact (Storybook's `/manifests/components.json`) for agents on a remote pod. If
64
+ a server would need to be public to be reached, it needs `auth` first.
@@ -6,15 +6,15 @@ Synap is a typed knowledge graph. **Reading is one verb (`synap ask`) — it rou
6
6
 
7
7
  Ask yourself: _who does this knowledge serve?_ **There is no private AI scratchpad** — structuring knowledge into a real lane IS your job. Never write a `note` (that's the human's raw inbox); always `capture` into a lane.
8
8
 
9
- **Known fields → typed create.** If you already know the profileSlug and the values, use `synap create entity` / `synap_create_entity` (or typed `capture --type` for a knowledge entry). Reach for free-text `capture "…"` only for an unstructured blob you haven't parsed — it runs an AI pipeline that can degrade to one flat `note`. 'Always capture into a lane' means _don't leave it unstructured_, not _always use the free-text pipeline_.
9
+ **Known fields → typed create.** If you already know the profileSlug and values, use `synap create entity` / `synap_create_entity`. Reach for free-text `capture "…"` only for an unstructured blob you haven't parsed — it runs an AI pipeline that can degrade to one flat `note`. 'Always capture into a lane' means _don't leave it unstructured_, not _always use the free-text pipeline_.
10
10
 
11
- | If it… | Lane | Where it goes | Governance |
12
- | ------------------------------------------------------------------------------------------------------------------------------- | -------------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
13
- | **is about the CURRENT WORK** — domain know-how for the project/task you're on (incl. a domain-specific gotcha/lesson/decision) | **Work** _(default)_ | a `knowledge` entity in the **active workspace** (`synap capture --type …`) | proposal-gated (it's the user's real data; the workspace IS the domain — Builder ≠ marketing) |
14
- | **is GLOBAL truth** — a best-practice / runbook / how-to that holds across ALL projects | **Global** | pod-wide procedural `knowledge_keys` (`synap capture --global --type … [--key ns:slug]`) | reviewed for shared truth |
15
- | **is about the USER** — how they work/talk/decide, their preferences, their life | **User** | pod-wide `user_observation` (`synap observe write` / `record_observation` tool) | inferences are **proposed** (you review); explicit "I always X" auto-saves — never model the user silently |
11
+ | If it… | Lane | Where it goes | Governance |
12
+ | --------------------------------------------------------------------------------------------- | -------------------- | ----------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
13
+ | **is about the CURRENT WORK** — a reusable conclusion or caveat in the project/task you're on | **Work** _(default)_ | a `knowledge` entity through server-derived Work placement (pin with `--workspace` only when you know the domain) | proposal-gated (it's the user's real data; the workspace IS the domain — Builder ≠ marketing) |
14
+ | **is GLOBAL truth** — a best-practice / runbook / how-to that holds across ALL projects | **Global** | pod-wide procedural `knowledge_keys` (`synap capture --global --type … [--key ns:slug]`) | reviewed for shared truth |
15
+ | **is about the USER** — how they work/talk/decide, their preferences, their life | **User** | pod-wide `user_observation` (`synap observe write` / `record_observation` tool) | inferences are **proposed** (you review); explicit "I always X" auto-saves — never model the user silently |
16
16
 
17
- > **Why this matters:** writing to the wrong lane degrades the graph. A gotcha you learned about the **current project** is **Work** (the active workspace — its domain). A best-practice that holds **everywhere** is **Global** (`--global`, pod-wide). A fact about **how the user works** is **User** (pod-wide, inferences proposed). `synap capture` echoes which lane + governance it used; check it.
17
+ > **Why this matters:** writing to the wrong lane degrades the graph. A caution you learned about the **current project** is **Work** (let the server route it, or pin the known domain explicitly). A best-practice that holds **everywhere** is **Global** (`--global`, pod-wide). A fact about **how the user works** is **User** (pod-wide, inferences proposed). `synap capture` echoes which lane + governance it used; check it.
18
18
 
19
19
  > **Read the write outcome — it guides your next move (it never blocks you).** Every write (`capture`, `observe`, `create entity`, `create relation`, `note`) reports one of two outcomes (and `--json` carries `"outcome"`):
20
20
  >
@@ -23,6 +23,8 @@ Ask yourself: _who does this knowledge serve?_ **There is no private AI scratchp
23
23
 
24
24
  > **Substrate names (tables under the hood):** _semantic_ = `entities` (the `knowledge` profile, workspace-scoped = domain separation), _episodic_ = `knowledge_facts`, _procedural_ = `knowledge_keys` (pod-wide runbooks). `ask` queries across them so you never pick on read.
25
25
 
26
+ **Facets (roles)** are hats on **any kind** (`applicableKinds`), not only person/company. “This item is an X” is `attach_facet`, not a new kind, until X has its own life. Widen the role when `kind_mismatch`. See `from-intent` + `extend-first`. What role, workspace, project, goal and template mean: `concepts` (the one glossary).
27
+
26
28
  ### Data layers — the graph itself
27
29
 
28
30
  | Layer | What it is | When to use |
@@ -35,11 +37,11 @@ Ask yourself: _who does this knowledge serve?_ **There is no private AI scratchp
35
37
 
36
38
  ### Key profiles for AI use
37
39
 
38
- | Profile slug | Scope | Who writes | Purpose |
39
- | ------------------ | --------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
40
- | `note` | pod | **human only** | The human's raw "dump now, structure later" inbox. **The AI never writes a note** — structuring into a lane is its job; use `capture` instead. |
41
- | `knowledge` | workspace | AI | Validated gotchas/lessons/decisions — the **Work lane** (default `synap capture --type`; ek_type/ek_claim/ek_why). DOMAIN = the workspace (a Builder gotcha ≠ a marketing one). Cross-project runbooks go to `knowledge_keys` via `--global`. |
42
- | `user_observation` | pod | AI only | Durable user model — habits, communication style, preferences |
43
- | `decision` | pod | human + AI | Architectural decisions with rationale |
44
- | `research` | pod | AI | Investigation with sources + conclusion |
45
- | `question` | pod | human + AI | Open inquiry, closed when a decision answers it |
40
+ | Profile slug | Scope | Who writes | Purpose |
41
+ | ------------------ | --------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
42
+ | `note` | pod | **human only** | The human's raw "dump now, structure later" inbox. **The AI never writes a note** — structuring into a lane is its job; use `capture` instead. |
43
+ | `knowledge` | workspace | AI | Reusable **Insights** and **Cautions** — one required `knowledgeForm`; an optional `ek_claim` is only a compact summary and long form belongs in the linked Markdown document. Decisions and sources remain linked first-class entities. DOMAIN = the workspace. Cross-project runbooks go to `knowledge_keys` via `--global`. |
44
+ | `user_observation` | pod | AI only | Durable user model — habits, communication style, preferences |
45
+ | `decision` | pod | human + AI | Architectural decisions with rationale |
46
+ | `research` | pod | AI | Investigation with sources + conclusion |
47
+ | `question` | pod | human + AI | Open inquiry, closed when a decision answers it |
@@ -1,6 +1,6 @@
1
1
  ## Synap-first operating mode
2
2
 
3
- > **MCP clients** (Claude Desktop, Raycast, OpenClaw with MCP): use `synap_*` tool names — they wrap auth and governance automatically. **REST / HTTP clients**: use the endpoints below.
3
+ > **MCP clients** (Claude Desktop, Raycast, any agent with MCP): use `synap_*` tool names — they wrap auth and governance automatically. **REST / HTTP clients**: use the endpoints below.
4
4
 
5
5
  These five rules override default assistant behavior when connected to a Synap pod:
6
6
 
@@ -33,7 +33,7 @@ Before answering any question about the user's projects, tasks, contacts, decisi
33
33
  When the user shares a decision, task, meeting outcome, contact, or any durable information: save it. Don't ask "should I save this?" for obviously important information. Use:
34
34
 
35
35
  - entities for structured data (tasks, people, projects, decisions)
36
- - `remember_fact` / `POST /api/hub/memory` for preferences, context, loose facts
36
+ - `synap_remember_fact` for preferences, context, loose facts (not `POST /api/hub/memory` — that door needs an unrestricted key)
37
37
  - documents for long-form notes (meeting notes, research, writeups)
38
38
 
39
39
  **4. Link everything**
@@ -0,0 +1,118 @@
1
+ # Processes — a playbook that follows a kind's lifecycle
2
+
3
+ <!-- brief:start -->
4
+
5
+ A process = `synap_create_playbook` with `subjectProfileSlug`; it FOLLOWS the
6
+ lifecycle the kind or role declares (omit `statusProperty`, or name that same
7
+ property). Each stage's `subjectStatus` is an EXISTING option of it (read it
8
+ with `synap_list_profiles` first — never invent one); `gate: {kind: 'human'}` at
9
+ every commitment, `onFail: {toStage}` for rework; typed `expectedOutputs`
10
+ (`kind`, `label`, `relationToSubject`); workers = `activators` (`on`, `size`,
11
+ default `mode: 'propose'`). What you create is POD-LOCAL, never an official
12
+ template.
13
+
14
+ <!-- brief:end -->
15
+
16
+ ## Writing a process (a playbook that follows a kind's lifecycle)
17
+
18
+ The status belongs to the **kind or role**, never to a playbook. Its profile declares the lifecycle ONCE, in its
19
+ template:
20
+
21
+ ```yaml
22
+ lifecycle:
23
+ property: post-status
24
+ options:
25
+ - { key: Idea, category: open }
26
+ - { key: Published, category: done }
27
+ - { key: Archived, category: lost, humanOnly: true }
28
+ ```
29
+
30
+ Every option has one category (`open · active · paused · done · lost`); rules read the category, names stay free.
31
+ `humanOnly` marks an option no agent sets; an agent's move into `done` or `lost` proposes. Every move goes through
32
+ the one status door (`moveStatus`; an agent sends `update_entity` with `expectedStatus`).
33
+
34
+ A playbook that works that lifecycle is a **process**: it FOLLOWS it. Its stages name options of it, its workers
35
+ start on it, and a person decides at the moments that commit the business. It never keeps a second status field.
36
+ The reference is Content OS "Produce Content" (`synap-app/packages/workspace-templates/src/content-os.yaml`).
37
+
38
+ **Official vs pod-local.** An official template or capability lives ONLY in the catalog
39
+ (`synap-app/packages/workspace-templates/`, by kind) and is published with
40
+ `synap catalog publish --official` (CI on main). A playbook, kind or automation an agent creates on a pod
41
+ (`synap_create_playbook`, `synap_define_kind`, …) is **pod-local**: it never reaches the catalog. To make it
42
+ official, write it into the catalog file and publish.
43
+
44
+ | Field | Where | Rule |
45
+ | ------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
46
+ | `subjectProfile.profileSlug` | playbook | The kind or role the process works. |
47
+ | `subjectProfile.statusProperty` | playbook | Omit it: the pod follows the profile's declared lifecycle. If you name it, name that same property. A status worker on a role with no declared lifecycle is refused. |
48
+ | `stages[].subjectStatus` | stage | Entering the stage moves the subject to this option, through the door. Must be an **existing option** of the lifecycle — never invent one. |
49
+ | `stages[].gate` | stage | `{kind: human}` at every commitment: send to a client, sign, pay, publish, won/lost, anything irreversible. `{kind: check}` only where the stage's own criteria can be verified. A gated stage writes its status only when the gate passes. A check gate judges the stage being LEFT, so never use it to guard an irreversible status. |
50
+ | `stages[].onFail` | stage | `{toStage: <key>}` — where a rejected gate sends the run (rework loop). |
51
+ | `stages[].criteria` | stage | 2–5 binary statements; `check.kind` evidence (cheapest) · capability · judge · human. |
52
+ | `expectedOutputs[]` | stage or playbook | What the step must produce: `kind` + `label` + `relationToSubject` (an existing relation slug, or `none`). The UI shows what was produced from this. |
53
+ | `activators[]` (workers) | playbook | `on`: `created` · `enters_status` (+ `status`) · `count` (+ `status`, `min` ≥ 2) · `schedule` (+ `cron`, UTC) · `manual`. `size`: `per_thing` (default) · `per_moment` (count and schedule always are). `mode`: `propose` (default) · `run` only when cheap and safe. `maxPendingApprovals` (default 20) throttles. Compiled to a governed rule the owner can pause; it fires once per thing per transition. |
54
+ | `humanOnlyStatuses` | playbook | Legacy: the options no stage owns. Mark a person-only option `humanOnly` on the lifecycle instead; while `statusProperty` is set, `synap catalog validate` still checks that stages and this list cover every option. |
55
+ | `goalTemplate` | playbook | Placeholders are `{paramName}`. Never `@{arg:…}` (read-only legacy). |
56
+ | `params` | playbook | The subject is a `type: entity` param. A required param left unanswered becomes a question owed by the person, not an empty string. |
57
+
58
+ Human moments use an `ask` on an owed slot: `confirm` / `choose` (one `recommended`) / `form` / `act` / `provide`
59
+ (connection, file or secret through the vault). Never ask for a secret in a form.
60
+
61
+ Validation: `synap catalog validate` (process contract, goal grammar, lifecycle coverage ratchet — the count of
62
+ lifecycle kinds with no process may only go down).
63
+
64
+ ## Declaring it over MCP
65
+
66
+ `synap_create_playbook` takes the contract as-is. Before calling it, read the
67
+ subject kind (`synap_list_profiles`) and copy the options of its lifecycle
68
+ property exactly. Over MCP you cannot declare or change a lifecycle; it comes
69
+ with the kind's template.
70
+
71
+ ```json
72
+ {
73
+ "name": "Draft a post",
74
+ "goalTemplate": "Draft {post}",
75
+ "params": [{ "name": "post", "type": "entity", "required": true }],
76
+ "subjectProfileSlug": "post",
77
+ "activators": [
78
+ {
79
+ "on": "enters_status",
80
+ "status": "Briefed",
81
+ "size": "per_thing",
82
+ "mode": "propose"
83
+ }
84
+ ],
85
+ "stages": [
86
+ {
87
+ "key": "draft",
88
+ "name": "Draft",
89
+ "category": "started",
90
+ "subjectStatus": "In Draft",
91
+ "expectedOutputs": [
92
+ {
93
+ "kind": "document",
94
+ "label": "Draft",
95
+ "relationToSubject": "made_for"
96
+ }
97
+ ]
98
+ },
99
+ {
100
+ "key": "review",
101
+ "name": "Review",
102
+ "category": "started",
103
+ "subjectStatus": "Review",
104
+ "gate": { "kind": "human" },
105
+ "onFail": { "toStage": "draft" }
106
+ }
107
+ ]
108
+ }
109
+ ```
110
+
111
+ These are the Content OS post options; use the ones the kind really has. A
112
+ batch worker looks like `{ "on": "schedule", "cron": "0 8 * * 1", "status":
113
+ "Idea", "mode": "propose" }` (one session over every post in Idea, weekly) or
114
+ `{ "on": "count", "status": "Review", "min": 5, "mode": "propose" }`.
115
+ An agent call lands as a proposal (`status: "proposed"` is success). The
116
+ playbook lives on this pod only; to make it an official template, a developer
117
+ writes it into the catalog and publishes it with
118
+ `synap catalog publish --official`.
@@ -8,11 +8,15 @@ synap use <workspace-name-or-id> # focus a workspace (this
8
8
  synap create entity --profile=task --name="…" --props='{"status":"todo","priority":"high"}' --json
9
9
  synap set entity <id> --props='{"status":"done"}' --json # merge-patch (only changed keys)
10
10
  synap ask "your question" --json # THE read verb — routes to the right store(s) + shows which answered
11
- synap capture --type=lesson --claim="…" --json # Work lane (default) — domain knowledge → active workspace
11
+ synap create entity --profile=knowledge --name="…" --props='{"knowledgeForm":"fact|caution|convention","ek_claim":"…"}' --content="…" --json
12
12
  synap capture --global --type=reference --claim="…" --json # Global lane — pod-wide cross-cutting runbook (knowledge_keys)
13
13
  synap observe write "…" --json # User lane — durable user model (inferences proposed)
14
14
  ```
15
15
 
16
+ **Titles:** ≤ 80 characters, the lasting thing, no status words, ids or "…"; the
17
+ receipt's `titleLint` says what to rewrite. Rules + what counts as knowledge:
18
+ `synap_load_skill("system/synap/writing-titles")`.
19
+
16
20
  **The canonical verbs:** `ask` (read) · `capture` (structured write — pick a lane:
17
21
  Work default / `--global` / `observe` for User) · `orient` (bootstrap). `note` exists
18
22
  for the HUMAN's raw "dump now, structure later" inbox — **the AI always `capture`s
@@ -34,10 +38,11 @@ POST /api/hub/relations body: { userId, sourceEntityId, targetEntityId
34
38
  GET /api/hub/entities?q=…&profileSlug=task&workspaceId=…
35
39
  GET /api/hub/entities/{id}/connections?userId=…
36
40
  POST /api/hub/knowledge/ask body: { query, workspaceId?, limit? } ← ONE read door, routes across substrates
37
- POST /api/hub/memory body: { userId, fact }
38
41
  GET /api/hub/memory?userId=…&query=…
39
42
  ```
40
43
 
44
+ A fact about the user: MCP `synap_remember_fact` (a governed write). `POST /api/hub/memory` acts for the whole owner, so it needs an unrestricted key — a restricted agent key (the AI preset) is refused.
45
+
41
46
  **Profile schemas are runtime-discovered — never hardcoded:**
42
47
 
43
48
  ```bash
@@ -7,11 +7,13 @@ the low-level doors below only when you deliberately want a single substrate or
7
7
  specific shape (a graph traversal, a typed-entity filter, an entity's neighborhood).
8
8
 
9
9
  ```
10
- # THE read door — routes across semantic / procedural / episodic, tells you which answered
10
+ # THE read door — routes across semantic / procedural / episodic / library, tells you which answered
11
11
  POST /api/hub/knowledge/ask body: { query, workspaceId?, limit? }
12
12
  → { query, routedTo: [...], primary, answers: [{ substrate, items, status }], degraded, understanding, verdict }
13
13
  ```
14
14
 
15
+ A link the person kept is in their Library: `ask` finds it (a `library` block — title, source URL, a snippet of what was read, who read it; `degraded: ["library"]` means the Library could not be read, never "nothing kept"). To read any URL use the `read_webpage` intent (builtin `web.read`).
16
+
15
17
  Low-level doors (`ask` routes to these — graph-based, not semantic; type filter →
16
18
  relations → neighborhood):
17
19
 
@@ -1,46 +1,16 @@
1
- ## Reflexes — the two habits, every session
1
+ ## Reflexes — what holds on every door
2
2
 
3
- > Canonical source — MCP instructions and other surfaces derive from this file.
3
+ > Canonical source — the MCP `instructions` field is derived from this file and composed with live grounding under ONE 2 KB budget (pinned by `instructions-budget.test.ts`). Most important first. Depth belongs in a skill, never here.
4
4
 
5
- You are connected to the user's Synap pod — their sovereign personal data brain
6
- (the source of truth about their life, work, projects, people, and preferences).
7
- Two reflexes hold on every session, on every door (MCP, IS, CLI, HTTP):
5
+ The user's Synap pod: source of truth. Tool names below are stems; your door may prefix them (`pod__ask`).
8
6
 
9
- - **Recall — BEFORE any non-trivial task.** Before answering anything about the
10
- user's own world, and before creating anything, call `synap_ask` (CLI:
11
- `synap ask`, REST: `POST /api/hub/knowledge/ask`) to recall what the pod
12
- already knows. Prefer it over your own assumptions or training data — asking
13
- first also avoids duplicate creates.
14
- - **Capture — AFTER you learn something durable.** A fact, a decision, a new
15
- person/company/task, a stated preference — call `synap_capture` (CLI:
16
- `synap capture`) to write it back. Don't wait to be asked; this is how the
17
- second brain grows.
7
+ 1. **Recall first.** Before answering or creating, `ask`.
8
+ 2. **Capture after.** A durable fact, decision, person, task: `capture`; about the user: `remember_fact`. No private scratchpad.
9
+ 3. **Orient once.** `orient`: pending review (raise first), open sessions.
10
+ 4. **Work in a session.** `start_session` or resume (playbook `templateId`); goal (TRACK): `list_tracks`, else `start_track`; work in it = `start_session` + `trackId`; 2-5 `criteria`; status moves carry `expectedStatus`; person-only: `owner:'human'` slot + `blockedReason` + `ask` (confirm/choose with 1 `recommended`/form/act/provide), then `wait_for_answer` if listed; post progress, questions and results in its room (`post_message` to `session.channelId`); your own chat may repeat them (`Q-<id8>`); chat answer → `relay_answer`, words verbatim; PR = outcome `pr-<repo>-<n>` (`ref.url`); `evaluate_session`, close open asks, `complete_session`.
11
+ 5. **Never guess a project**: pin only what the user names (`set_*_focus`).
12
+ 6. **`proposed` is success**: keep going, never retry.
13
+ 7. **Discover before inventing**: `list_profiles` / `list_capabilities`; **extend** (facet, overlay, parent), never a twin.
14
+ 8. **One space per domain**; projects filter it (`file_into_project`, `project_use_workspace`).
18
15
 
19
- Run `synap_orient` (CLI: `synap orient`) once per session to see the available
20
- workspaces, projects, and entity types before acting.
21
-
22
- **Writes are governed: a `"proposed"` response is normal, never an error.** It
23
- means the write is queued for the user's review — like a PR, not a failure. Keep
24
- working; see `writes.md` for the full governance contract and `inline-patterns.md`
25
- for how to surface a proposal's review link in a Companion reply.
26
-
27
- **No private scratchpad.** Everything you learn goes into the shared graph, not a hidden note. Capture a proven tool-fact into `knowledge` immediately; PROMOTE it into a curated skill only once it's proven reusable — a skill is a versioned artifact (one capability, when-to-use + do/don't), never an append-anything log.
28
-
29
- ## Escalation ladder (keep in a corner of your head)
30
-
31
- You can always escalate — never dead-end on "I can't." Full detail: `escalation-ladder.md`.
32
-
33
- - **L0 Reflexes** — recall before, capture after, proposed ≠ error
34
- - **L1 OPERATE on data** — capture, create_entity, link, attach KNOWN facets, sessions
35
- - **L2 DISCOVER before invent** — list_profiles, list_capabilities, market.search (capability|template|automation|cell)
36
- - **L3 MUTATE meta-model (proposal-gated)** — only if L2 empty for the need:
37
- define_role, create_property_def/profile, create_view, create_workspace, market.install.
38
- **Template FIRST for new domains:** market.search(kind:template) before freehand create_workspace
39
- - **L4 CRYSTALLIZE after proof** — promote_session_to_playbook, promote_cell_to_renderer, create_playbook.
40
- Never crystallize a one-off that hasn't succeeded once
41
-
42
- **Gates:**
43
-
44
- - Blocked / can't express need → L2 then L3 propose (never dead-end error; never silent invent)
45
- - Success / repeatable pattern → one structural suggestion (question first if speculative)
46
- - Capture placement routes to EXISTING lenses only — never invent a workspace from capture
16
+ Depth: `load_skill` `system/synap/concepts`, `work-model`, `focus-sessions`, `from-intent`, `escalation-ladder`, `writes`.
@@ -10,6 +10,12 @@ ViewFrame is the standard way to create custom data visualizations in Synap. Use
10
10
  | User asks for a specific chart type, map, 3D scene, or custom layout | Generate a ViewFrame widget |
11
11
  | User says "show X as a [funnel / heatmap / treemap / scatter / globe]" | Generate a ViewFrame widget |
12
12
 
13
+ ### Default vs. generated — never the reflex, always the explicit ask
14
+
15
+ Every kind already renders as a familiar, kind-shaped card — its built-in `entity-card` (small block) / `entity-detail` (full page) / `entity-profile` (dashboard) renderer. That built-in is the DEFAULT for everyone, including brand-new user-defined kinds (which get an automatic card built from the schema — no generation needed). **Never generate a frame renderer as a kind's default presentation.** Generate one ONLY when the user explicitly asks for a custom look — a specific chart type, a redesigned card, a bespoke layout — and bind it PER KIND (one profile's one renderer slot), never as a blanket replacement for every kind. The sandbox's egress holes (see Security below) are still open, so treat "generate a view/card" as a deliberate, scoped request, not something to reach for by default.
16
+
17
+ After binding, tell the user where the result lives: **"⋯ → Customize display"** on that kind's page (Renderer Studio itself now lives in Builder mode / Settings, not a designer mode you build). That is the one place a human reverts it or picks something else — never invent a second, agent-only way to switch it back.
18
+
13
19
  ### What ViewFrame Is
14
20
 
15
21
  - A sandboxed iframe that renders **one ES module** that default-exports a React component (or plain JS)
@@ -17,7 +23,7 @@ ViewFrame is the standard way to create custom data visualizations in Synap. Use
17
23
  `deps` map, but the current Hub `cells/define` persistence path does not yet
18
24
  retain that map, so external runtime dependencies are not a reliable contract.
19
25
  - The host injects a `SynapWidget` bridge for data access and shell actions
20
- - Security: `sandbox="allow-scripts allow-modals allow-popups"`, no `allow-same-origin`, no cookies, no pod token
26
+ - Security: `sandbox="allow-scripts allow-modals"` — no `allow-popups`, no `allow-same-origin`, no cookies, no pod token
21
27
 
22
28
  ### Authoring contract
23
29
 
@@ -32,7 +38,7 @@ A ViewFrame cell is **one self-contained ES module** (inline in `rendererSource`
32
38
 
33
39
  **Use `POST /api/hub/cells/define` — this is the canonical Hub Protocol path for AI-generated cells.**
34
40
 
35
- It is idempotent (upserts on typeKey), pod-global by default (no workspaceId needed), and immediately available across all of the user's workspaces without any proposal step.
41
+ It is idempotent (upserts on typeKey) and pod-global by default (no workspaceId needed). **It IS governed for agent callers** — `POST /cells/define` runs `checkPermissionOrPropose({ resource: "cell", action: "define", trustLevel: "generated" })`; a `status: "proposed"` response is the normal outcome for AI-generated renderer source, not an error — surface `reviewUrl` and keep going. Only an operator-initiated define auto-applies.
36
42
 
37
43
  ```
38
44
  POST /api/hub/cells/define
@@ -100,7 +106,7 @@ The cell appears immediately in the side panel with "Q2 Revenue Report" as the t
100
106
 
101
107
  > **Note:** `POST /api/hub/widget-definitions` (tRPC path) still works but is the internal/admin path. Use `POST /api/hub/cells/define` for all agent-generated cells.
102
108
 
103
- ### CLI commands (when running as Claude Code / OpenClaw agent)
109
+ ### CLI commands (when running as Claude Code or another terminal agent)
104
110
 
105
111
  ```bash
106
112
  # Build a multi-file cell source into a single ES module bundle
@@ -120,7 +126,7 @@ synap doc create --title "Q2 Report" --file ./report.md
120
126
  synap doc update <docId> --file ./updated-report.md
121
127
 
122
128
  # Arrange widgets on an existing bento view
123
- synap view arrange <viewId> --blocks '[{"id":"b1","kind":"widget","widgetKind":"generated:my-chart","layout":{"x":0,"y":0,"w":8,"h":6}}]'
129
+ echo '[{"key":"generated:my-chart","x":0,"y":0,"w":8,"h":6}]' | synap view arrange <viewId>
124
130
  ```
125
131
 
126
132
  ### The SynapWidget Bridge (inside the iframe)
@@ -157,6 +163,33 @@ SynapWidget.onInit(async ({ config, context }) => {
157
163
 
158
164
  All `query()` calls return a Promise. Entity shape: `{ id, title, profileSlug, properties, createdAt, … }`.
159
165
 
166
+ #### Intent reads (a kind's pipeline, goal, needs-you, sessions)
167
+
168
+ The same reads a kind's own page makes, so a frame can be that kind's dashboard. The host stamps the lens (the active space and project); a `workspaceId` / `projectId` you pass is ignored. `trackId` narrows to one goal.
169
+
170
+ | Operation | Params | Returns |
171
+ | ---------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
172
+ | `lifecycle.board` | `profileSlug` (required), `trackId`, `windowDays`, `firstN`, `column` + `cursor`, `limit`, `workedBy` | `{ lifecycle: { profileSlug, property, options }, columns: [{ key, category, count, stuck, items: [{ id, name, status, since, stuck, workedBy? }] }], live, total, doneWindowed, lostWindowed, suggestedShape, window, nextCursor }` |
173
+ | `lifecycle.throughput` | `profileSlug`, `trackId`, `bucket` (`day` · `week` · `month`), `count` | `{ bucket, since, buckets: [{ bucketStart, done, lost }] }`, oldest first, zeros included |
174
+ | `attention.needsYou` | `profileSlug`, `trackId`, `limit` | `{ signals: [{ id, kind, title, count, occurredAt, target }] }` |
175
+ | `attention.count` | `profileSlug`, `trackId` | `{ needsYou, decisions, blocked, review, captures, truncated, … }` |
176
+ | `sessions.list` | `profileSlug` (its things) or `entityId` (one thing), `status`, `kind` (default `work`), `limit` | `[{ id, title, goal, status, currentStage, progress, startedAt, … }]` |
177
+
178
+ ```js
179
+ const board = await SynapWidget.query("lifecycle.board", {
180
+ profileSlug: "post",
181
+ firstN: 5,
182
+ });
183
+ if (board?.error) return showError(board.error); // 404 = unknown kind, 412 = no lifecycle
184
+ const month = await SynapWidget.query("lifecycle.throughput", {
185
+ profileSlug: "post",
186
+ bucket: "month",
187
+ count: 1,
188
+ });
189
+ ```
190
+
191
+ A failed read returns `{ error }`. Show it as a failure, never as an empty board. Moves still go through `update_entity` (the lifecycle property), so the status door and governance apply.
192
+
160
193
  #### Mutations (governance-gated — return `{ status: "approved" | "proposed" | "denied" }`)
161
194
 
162
195
  ```js
@@ -182,7 +215,7 @@ await SynapWidget.mutate("delete_entity", { id: "uuid" });
182
215
  await SynapWidget.mutate("create_relation", {
183
216
  sourceEntityId: "uuid-a",
184
217
  targetEntityId: "uuid-b",
185
- type: "related_to",
218
+ type: "relates_to",
186
219
  });
187
220
  ```
188
221
 
@@ -77,7 +77,7 @@ User: _"I'm trying to figure out whether we should build our own orchestrator or
77
77
  } }
78
78
  ```
79
79
 
80
- 4. When the user picks, create a decision linked to the question:
80
+ 4. When the user picked through an answered `confirm`/`choose` ask, the pod ALREADY filed the decision (`slot.decisionId`) — link that one, never create a twin. Picked in plain chat? Create it yourself, linked to the question:
81
81
 
82
82
  ```json
83
83
  POST /api/hub/entities
@@ -0,0 +1,110 @@
1
+ ## Work model — how work is shaped on a pod
2
+
3
+ Load this before you plan, start or run work, or author a process. The long form is the pod document "The Synap work model" (36878a70-6cbb-4122-8bfa-288fdbd65218); the words are in `concepts`.
4
+
5
+ ### Why
6
+
7
+ A process is the life of a **thing**, not a script. A lead, a post or a feature has ONE status. Boards, workers, sessions, goals and history read that status or move it through ONE door. So "when a post enters Review, run the review" is one rule, "how many leads reached Qualified this month" is a count, and a person and an agent can work the same thing without overwriting each other. Before, each playbook kept its own stages and status field, and the same fact lived in three places.
8
+
9
+ ### The nouns
10
+
11
+ | Noun | What it is | Not |
12
+ | ------------------- | --------------------------------------------------------------------------------------------------------------------- | ----------------------------------- |
13
+ | **Project** | a commitment, and a lens across spaces | a method, a domain |
14
+ | **Goal** (optional) | in one project (a _track_ in tools): direction, criteria, the workers it turns on; its judge closes it with a verdict | a list of stages |
15
+ | **Thing** | any entity: one kind, maybe roles, one status per kind or role | a second entity for a hat |
16
+ | **Session** | the unit of work that closes: goal, criteria, room; one thing or a batch | a "run" because it follows a method |
17
+
18
+ Not nouns (nobody manages them as objects): a **pipeline** is a view of a lifecycle; a **worker** is configuration (a method + a trigger + a size); a **method** is a playbook a session may follow; a **check** is a recurring verification.
19
+
20
+ How they relate: a project files things; each kind or role declares one **lifecycle** (its status list); its **pipeline** is computed (columns = the options in order); a status change fires **workers**, which start **sessions** carrying the project, the goal and their **targets**; a session moves each thing's status through the door. **Hand-off is a role:** a won deal makes the party a client (attach the role); nothing is copied.
21
+
22
+ ### Three tenses of a thing
23
+
24
+ - **Past = history.** Every status change is one transition event: from, to, who, which session, why.
25
+ - **Present = status.** One value per kind or role, in its own column.
26
+ - **Future = agenda.** Tasks and events linked to the thing, with an owner. _(Planned, wave 4.)_
27
+
28
+ ### Five categories
29
+
30
+ Every lifecycle option has one fixed category: `open · active · paused · done · lost`. Names are free; rules read the category. An agent moving a thing into `done` or `lost` proposes by default; an option marked `humanOnly` is never set by an agent. A space may ADD options; it never renames, removes or recategorises one.
31
+
32
+ ### The one door
33
+
34
+ Every status change — your call, a board drag, a method's step, a sync — goes through `moveStatus`. As an agent: a kind's status = `update_entity` with the lifecycle property set to the new value AND, over MCP, `expectedStatus` = the status you saw (the in-app `update_entity` has no `expectedStatus` yet; the door still checks the lifecycle); a role's status = `update_facet` `status` where your tools list it (the in-app agent; MCP has no role-status tool yet).
35
+
36
+ - `conflict` (with the current status) is normal: someone moved it; re-read and decide again. A person's move always wins.
37
+ - `proposed` is success (a done/lost move, or governance said review).
38
+ - A refusal naming the valid options means the value is not in the declared lifecycle: pick one of them.
39
+ Never invent a status, never keep your own stage field.
40
+
41
+ ### Session size
42
+
43
+ - **Per thing** when each item needs its own thinking: a post, a feature, a deal in negotiation.
44
+ - **Per batch** when items are interchangeable: one session for "find 10 leads today" or "today's follow-ups".
45
+ - A session's **step is its subject's status**: move the thing, the step follows.
46
+ - **Set the subject.** A session about one thing names it: `subjectEntityId` on `start_session`, or on `update_session` the moment the thing exists (a batch names its things as targets). A session on no thing shows on the homes as "No thing yet · attach one", outside every pipeline.
47
+ - Following a method does not turn your session into a run; it stays your work and still shows in the method's runs.
48
+ - **Targets get a result each**: a worker session holds its things as targets. Your own move of a target marks it `done`; someone else's move marks it `skipped`; targets left at close are `skipped`. Put the outcome on each thing, not only in a summary.
49
+
50
+ ### Workers
51
+
52
+ A worker is a playbook **activator**, declared on the method and owned by the lifecycle: `on` = `created` · `enters_status` (+ `status`) · `count` (+ `status`, `min`: once N things wait) · `schedule` (+ `cron`) · `manual`; `size` = `per_thing` · `per_moment` (a count or schedule is always per batch); `mode` = `propose` (default) · `run`; `maxPendingApprovals` throttles it. It compiles into a governed rule the owner can pause; it fires once per thing per transition. A goal or project **turns it on** for its scope; installs turn it on space-wide. Authoring: `processes`.
53
+
54
+ ### Goals (tracks)
55
+
56
+ A goal is a _track_ in every tool and field name (`start_track`, `trackId`) — say "goal" to the person; a session's one-line `goal` is its **Aim**. A goal holds an owner, a direction, instructions, the workers it turns on, and what done means (criteria, or a number measured as transitions into `done`). It has no stages. A goal can stay open as long as it matters, or finish: a person closes it with a verdict once its criteria are met (`set_track_status` `completed` + `verdict`; dropped = `archived`, with a `verdict` saying why). Your close is a proposal; a closed goal comes back only as a new version. Pause it while nobody should work on it. Work in it = `start_session` + `trackId`. A thing may count for two goals. Solo users may never need one: workers can run space-wide. Legacy: `start_stage_session` and `add_track_stage` serve old goals started from a method; never `advance_track` without the user.
57
+
58
+ **Keep the pod current (every agent, every session)** — three rules, so the next agent picks your step up from the pod alone:
59
+
60
+ 1. **Attach the session to its goal.** `orient`'s `startHere.openGoals` and the start reply's `offers.goals` name the open goals; start with `trackId`, or file an open session with `update_session` `trackId` (a proposal for an agent). No goal fits: say so in the room, never invent one silently.
61
+ 2. **Record your PR as an outcome** the moment you open it: `update_session` `outcomes: [{ key: "pr-<repo>-<n>", kind: "pull_request", label: "<repo>#<n>", ref: { url: "<PR url>" } }]`. With no `sessionId`, the pod files it on the one open session this conversation started, and refuses with the list when there are several.
62
+ 3. **Close when your outcomes are met.** When every outcome is met the `update_session` reply carries `nudges.readyToClose`: grade with `evaluate_session`, then `complete_session`. A merged PR is not always the end of the work: if more remains, declare it instead.
63
+
64
+ **The rest of the goal protocol** (`set_track_participant`, `reopen_track`, `convert_to_goal`, `update_track`):
65
+
66
+ - **A delegate's commitment.** The owner or judge asks someone (`add`, role `delegate`, with a `commitment`). The delegate answers only their own: `accept`, `counter` (text = what they would commit to instead), `decline`, or later `report_impossible` (text = why). A report is not the goal's verdict: the owner or judge `acknowledge`s it and re-plans. Never answer for a person; adding yourself as a delegate commits you.
67
+ - **Claims and the judge.** A session that passes a goal criterion CLAIMS it. Only the judge (the owner unless one is named) accepts or sends back a claim, and only the judge closes the goal. Never accept your own claim.
68
+ - **Reopen = a new version.** A closed or dropped goal never moves back: `reopen_track` starts a new version linked to it, with the same people asked again.
69
+ - **Make it a goal.** A goal, objective or OKR entity becomes a goal once with `convert_to_goal` (its key results become measured criteria). Offer it when the person treats such an entity as live work; never convert one twice.
70
+ - **The loop** is OFF by default. When it is on (`update_track` `loop: { on: true, perWeek? }`), the goal proposes its next session while a required criterion is unmet, and a person approves each one. Your switch-on is always a proposal: the person turns it on. If it stops after two failures on one criterion, ask the owner to re-plan; do not switch it on again yourself.
71
+
72
+ ### The homes: what each space makes, what is moving
73
+
74
+ Home, a space and a project read the work through two reads (the same answer every app shows):
75
+
76
+ - `lifecycle.home` (Hub `GET /api/hub/lifecycle/home?projectId=`): every space you see with its intent and, per kind it produces, the pipeline in one line, needs-you, being-worked and one headline thing.
77
+ - `lifecycle.moving` (Hub `GET /api/hub/lifecycle/moving?workspaceId=&projectId=&limit=`): the things with open work on them, the work under each (asks you first), and `unattached`, the open sessions on no thing.
78
+
79
+ Read them to answer "what is going on" before you list sessions one by one.
80
+
81
+ ### A kind's dashboard
82
+
83
+ A kind with a lifecycle has its own page: the board, Needs you, the sessions on its things. To give it a custom Dashboard ("make this my Posts dashboard"), `create_cell` a frame over the bridge's intent reads (`lifecycle.board`, `lifecycle.throughput`, `attention.needsYou`, `attention.count`, `sessions.list`), then `promote_cell_to_renderer` with `slot: "dashboard"` (the `entity-profile` content kind). Recipe: `synap-ui`; params and shapes: `viewframe-cells`.
84
+
85
+ ### Rules of thumb
86
+
87
+ 1. Find the thing before creating one: resolve identity, then attach a role — never a twin.
88
+ 2. Status changes go through the door, with `expectedStatus`.
89
+ 3. Never invent a status or a second status field; the lifecycle is declared on the profile (`list_profiles`).
90
+ 4. Size the session from the work: per thing or per batch.
91
+ 5. Results go on the things, not only in prose.
92
+ 6. `proposed` is success. Commitments (publish, send, sign, spend) are a person's call.
93
+
94
+ ### Applied: content (Content OS)
95
+
96
+ - Thing = a **post**. Lifecycle `post-status`: Idea (open) · Briefed · Scripted · In Draft · Review · Scheduled (active) · Published (done) · Archived (lost, human-only).
97
+ - Nothing publishes itself: a move to Published is a proposal the person approves on the preview.
98
+ - Pipeline = the Posts board, filtered by project or campaign.
99
+ - Workers: **Draft** (per thing, enters Briefed) · **Review prep** (per thing, enters Review, ends by proposing the publish date) · **Ideas** (per batch, weekly, creates posts at Idea). Today the catalog ships them as Produce Content (enters Briefed), Repurpose (enters Published) and Plan Next Content (weekly, off by default).
100
+ - "The next posts" = read the pipeline: gaps per pillar, posts waiting per status.
101
+
102
+ ### Applied: leads and deals (CRM)
103
+
104
+ - **Lead** = a role for qualification only, `leadStage`: new · researching · outreach (open) · engaged · qualified · nurturing (active) · converted (done) · disqualified (lost, human-only).
105
+ - **Deal** = the sale, `commercialStage`, created only at hand-off. A **won** deal attaches the client role to the party.
106
+ - A Cal.com booking makes the attendee a lead at `engaged` and records the call as an event; it never creates a deal and never moves a lead backwards.
107
+
108
+ ### Point another AI here
109
+
110
+ Every door can load this: `load_skill system/synap/work-model`. To make a space carry it, put a one-line pointer in the space brief (`update_space_brief`, `purpose` or `framing`, 240 characters each): in-app agents and worker sessions read the brief every turn, MCP agents when they `orient`. To steer a session in flight, post the pointer in its room. A document attached to a session reaches an agent as a title only, so it does not teach.