@crouton-kit/crouter 0.3.27 → 0.3.29

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 (343) hide show
  1. package/dist/build-root.js +4 -2
  2. package/dist/builtin-memory/crouter-development/marketplaces.md +7 -6
  3. package/dist/builtin-memory/crouter-development/personas/base-prompt.md +1 -1
  4. package/dist/builtin-memory/crouter-development/personas/orchestrator-prompt.md +1 -1
  5. package/dist/builtin-memory/crouter-development/personas.md +1 -1
  6. package/dist/builtin-memory/crouter-development/plugins.md +20 -18
  7. package/dist/builtin-memory/design.md +1 -1
  8. package/dist/builtin-memory/development.md +1 -1
  9. package/dist/builtin-memory/internal/INDEX.md +1 -1
  10. package/dist/builtin-memory/internal/examples/INDEX.md +1 -1
  11. package/dist/builtin-memory/internal/examples/imessage-assistant.md +2 -2
  12. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  13. package/dist/builtin-memory/internal/storage-tiers.md +1 -1
  14. package/dist/builtin-memory/planning.md +1 -1
  15. package/dist/builtin-memory/spec.md +6 -4
  16. package/dist/builtin-personas/orchestration-kernel.md +4 -5
  17. package/dist/builtin-personas/runtime-base.md +8 -4
  18. package/dist/builtin-personas/spec/PERSONA.md +8 -4
  19. package/dist/builtin-personas/spec/orchestrator.md +5 -3
  20. package/dist/builtin-personas/spec/requirements/PERSONA.md +10 -0
  21. package/dist/builtin-views/canvas/core.mjs +586 -0
  22. package/dist/builtin-views/canvas/text.mjs +58 -0
  23. package/dist/builtin-views/canvas/tui.mjs +165 -0
  24. package/dist/builtin-views/canvas/web.jsx +120 -0
  25. package/dist/builtin-views/git-pr/core.mjs +673 -0
  26. package/dist/builtin-views/git-pr/text.mjs +84 -0
  27. package/dist/builtin-views/git-pr/tui.mjs +302 -0
  28. package/dist/builtin-views/git-pr/web.jsx +216 -0
  29. package/dist/builtin-views/inbox/_lib/render.mjs +1 -3
  30. package/dist/builtin-views/inbox/core.mjs +1273 -0
  31. package/dist/builtin-views/inbox/text.mjs +73 -0
  32. package/dist/builtin-views/inbox/tui.mjs +312 -0
  33. package/dist/builtin-views/inbox/web.jsx +188 -0
  34. package/dist/builtin-views/linkedin/core.mjs +906 -0
  35. package/dist/builtin-views/linkedin/text.mjs +69 -0
  36. package/dist/builtin-views/linkedin/tui.mjs +427 -0
  37. package/dist/builtin-views/linkedin/web.jsx +206 -0
  38. package/dist/builtin-views/workspace-sidebar/core.mjs +621 -0
  39. package/dist/builtin-views/workspace-sidebar/text.mjs +53 -0
  40. package/dist/builtin-views/workspace-sidebar/tui.mjs +142 -0
  41. package/dist/builtin-views/workspace-sidebar/web.jsx +109 -0
  42. package/dist/cli.js +3 -3
  43. package/dist/clients/attach/__tests__/action-parity.test.js +48 -0
  44. package/dist/clients/attach/__tests__/clipboard-image.test.js +76 -0
  45. package/dist/clients/attach/__tests__/editor-newline.test.js +57 -0
  46. package/dist/clients/attach/__tests__/git-info.test.js +31 -0
  47. package/dist/clients/attach/__tests__/onrequest-wired.test.js +20 -0
  48. package/dist/clients/attach/__tests__/reconnect-giveup.test.js +30 -0
  49. package/dist/clients/attach/__tests__/slash-quit-copy.test.js +42 -0
  50. package/dist/clients/attach/__tests__/titled-editor.test.d.ts +1 -0
  51. package/dist/clients/attach/__tests__/titled-editor.test.js +39 -0
  52. package/dist/clients/attach/attach-cmd.js +445 -41
  53. package/dist/clients/attach/auth-pickers.d.ts +9 -0
  54. package/dist/clients/attach/auth-pickers.js +194 -0
  55. package/dist/clients/attach/canvas-panels.d.ts +12 -0
  56. package/dist/clients/attach/canvas-panels.js +78 -0
  57. package/dist/clients/attach/chat-view.d.ts +27 -2
  58. package/dist/clients/attach/chat-view.js +98 -9
  59. package/dist/clients/attach/clipboard-image.d.ts +47 -8
  60. package/dist/clients/attach/clipboard-image.js +150 -26
  61. package/dist/clients/attach/clipboard-text.d.ts +3 -0
  62. package/dist/clients/attach/clipboard-text.js +39 -0
  63. package/dist/clients/attach/config-load.d.ts +54 -7
  64. package/dist/clients/attach/config-load.js +99 -3
  65. package/dist/clients/attach/context-message.d.ts +12 -0
  66. package/dist/clients/attach/context-message.js +72 -0
  67. package/dist/clients/attach/git-info.d.ts +20 -0
  68. package/dist/clients/attach/git-info.js +44 -0
  69. package/dist/clients/attach/graph-overlay.d.ts +43 -0
  70. package/dist/clients/attach/graph-overlay.js +306 -0
  71. package/dist/clients/attach/input-controller.d.ts +81 -13
  72. package/dist/clients/attach/input-controller.js +307 -67
  73. package/dist/clients/attach/pickers.d.ts +58 -0
  74. package/dist/clients/attach/pickers.js +171 -0
  75. package/dist/clients/attach/slash-commands.d.ts +44 -1
  76. package/dist/clients/attach/slash-commands.js +250 -27
  77. package/dist/clients/attach/titled-editor.d.ts +33 -0
  78. package/dist/clients/attach/titled-editor.js +84 -0
  79. package/dist/clients/attach/view-socket.d.ts +37 -2
  80. package/dist/clients/attach/view-socket.js +131 -7
  81. package/dist/clients/web/dev-server.d.ts +7 -0
  82. package/dist/clients/web/dev-server.js +59 -0
  83. package/dist/clients/web/events.d.ts +14 -0
  84. package/dist/clients/web/events.js +151 -0
  85. package/dist/clients/web/server.d.ts +18 -0
  86. package/dist/clients/web/server.js +450 -0
  87. package/dist/clients/web/web-cmd.d.ts +2 -0
  88. package/dist/clients/web/web-cmd.js +120 -0
  89. package/dist/commands/canvas.js +1 -2
  90. package/dist/commands/chord.js +1 -1
  91. package/dist/commands/dashboard.js +5 -1
  92. package/dist/commands/human/prompts.js +3 -3
  93. package/dist/commands/human/queue.d.ts +17 -0
  94. package/dist/commands/human/queue.js +111 -4
  95. package/dist/commands/memory/__tests__/lint-schema.test.js +27 -4
  96. package/dist/commands/memory/lint.d.ts +5 -4
  97. package/dist/commands/memory/lint.js +23 -7
  98. package/dist/commands/memory/read.js +2 -2
  99. package/dist/commands/memory/shared.d.ts +7 -1
  100. package/dist/commands/memory/shared.js +18 -3
  101. package/dist/commands/memory/write.js +20 -7
  102. package/dist/commands/memory.js +4 -4
  103. package/dist/commands/node.d.ts +1 -1
  104. package/dist/commands/node.js +64 -65
  105. package/dist/commands/pkg.js +1 -2
  106. package/dist/commands/revive.js +11 -3
  107. package/dist/commands/sys/feedback.d.ts +1 -0
  108. package/dist/commands/sys/feedback.js +163 -0
  109. package/dist/commands/sys/sync.d.ts +1 -0
  110. package/dist/commands/sys/sync.js +187 -0
  111. package/dist/commands/sys.js +4 -2
  112. package/dist/commands/view-cycle.js +2 -2
  113. package/dist/commands/view-list.js +8 -8
  114. package/dist/commands/view-new.js +21 -17
  115. package/dist/commands/view-pick.js +1 -1
  116. package/dist/commands/view-run.js +35 -14
  117. package/dist/commands/view.js +8 -6
  118. package/dist/commands/workspace.d.ts +2 -0
  119. package/dist/commands/workspace.js +161 -0
  120. package/dist/core/__tests__/broker-double-spawn.test.d.ts +1 -0
  121. package/dist/core/__tests__/broker-double-spawn.test.js +143 -0
  122. package/dist/core/__tests__/broker-fork-seam.test.d.ts +1 -0
  123. package/dist/core/__tests__/broker-fork-seam.test.js +102 -0
  124. package/dist/core/__tests__/broker-sdk-wiring.test.js +2 -0
  125. package/dist/core/__tests__/broker-snapshot-history.test.d.ts +1 -0
  126. package/dist/core/__tests__/broker-snapshot-history.test.js +105 -0
  127. package/dist/core/__tests__/child-death-wake.test.js +56 -111
  128. package/dist/core/__tests__/close.test.js +14 -20
  129. package/dist/core/__tests__/context-intro.test.js +19 -19
  130. package/dist/core/__tests__/daemon-boot.test.js +30 -23
  131. package/dist/core/__tests__/draw-style.test.js +1 -1
  132. package/dist/core/__tests__/error-stall-recycle.test.d.ts +1 -0
  133. package/dist/core/__tests__/error-stall-recycle.test.js +141 -0
  134. package/dist/core/__tests__/fixtures/fake-engine.d.ts +24 -1
  135. package/dist/core/__tests__/fixtures/fake-engine.js +32 -2
  136. package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
  137. package/dist/core/__tests__/focuses.test.js +25 -13
  138. package/dist/core/__tests__/fork.test.js +22 -5
  139. package/dist/core/__tests__/full/broker-control-preempt.test.d.ts +1 -0
  140. package/dist/core/__tests__/full/broker-control-preempt.test.js +61 -0
  141. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +1 -0
  142. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +57 -0
  143. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +1 -0
  144. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +80 -0
  145. package/dist/core/__tests__/full/broker-pane-resolution.test.js +90 -0
  146. package/dist/core/__tests__/full/cascade-close.test.js +22 -8
  147. package/dist/core/__tests__/full/detach-focus.test.js +66 -169
  148. package/dist/core/__tests__/helpers/harness.d.ts +6 -9
  149. package/dist/core/__tests__/helpers/harness.js +19 -36
  150. package/dist/core/__tests__/human-node-not-supervised.test.d.ts +1 -0
  151. package/dist/core/__tests__/human-node-not-supervised.test.js +83 -0
  152. package/dist/core/__tests__/human-stranded-deliver.test.d.ts +1 -0
  153. package/dist/core/__tests__/human-stranded-deliver.test.js +108 -0
  154. package/dist/core/__tests__/lifecycle.test.js +1 -19
  155. package/dist/core/__tests__/live-mutation-verbs.test.js +5 -5
  156. package/dist/core/__tests__/memory-resolver.test.js +1 -1
  157. package/dist/core/__tests__/on-read-dedup-resume.test.d.ts +1 -0
  158. package/dist/core/__tests__/on-read-dedup-resume.test.js +81 -0
  159. package/dist/core/__tests__/refresh-stall-recycle.test.d.ts +1 -0
  160. package/dist/core/__tests__/refresh-stall-recycle.test.js +88 -0
  161. package/dist/core/__tests__/relaunch-root.test.d.ts +1 -0
  162. package/dist/core/__tests__/relaunch-root.test.js +114 -0
  163. package/dist/core/__tests__/reset.test.js +19 -79
  164. package/dist/core/__tests__/steer-note.test.js +9 -7
  165. package/dist/core/__tests__/tmux-surface.test.js +13 -7
  166. package/dist/core/bootstrap.d.ts +0 -3
  167. package/dist/core/bootstrap.js +1 -143
  168. package/dist/core/canvas/browse/__tests__/model.test.js +86 -1
  169. package/dist/core/canvas/browse/__tests__/render.test.js +2 -1
  170. package/dist/core/canvas/browse/app.js +131 -8
  171. package/dist/core/canvas/browse/model.d.ts +23 -5
  172. package/dist/core/canvas/browse/model.js +68 -13
  173. package/dist/core/canvas/browse/render.d.ts +7 -1
  174. package/dist/core/canvas/browse/render.js +178 -47
  175. package/dist/core/canvas/canvas.js +1 -1
  176. package/dist/core/canvas/focuses.d.ts +4 -4
  177. package/dist/core/canvas/focuses.js +7 -7
  178. package/dist/core/canvas/nav-model.d.ts +162 -0
  179. package/dist/core/canvas/nav-model.js +487 -0
  180. package/dist/core/canvas/paths.d.ts +7 -0
  181. package/dist/core/canvas/paths.js +9 -0
  182. package/dist/core/canvas/render.d.ts +68 -9
  183. package/dist/core/canvas/render.js +195 -61
  184. package/dist/core/canvas/types.d.ts +16 -23
  185. package/dist/core/config.js +1 -4
  186. package/dist/core/memory-resolver.js +43 -5
  187. package/dist/core/runtime/bearings.d.ts +1 -1
  188. package/dist/core/runtime/bearings.js +8 -8
  189. package/dist/core/runtime/branded-host.d.ts +16 -0
  190. package/dist/core/runtime/branded-host.js +127 -0
  191. package/dist/core/runtime/broker-protocol.d.ts +212 -6
  192. package/dist/core/runtime/broker-sdk.d.ts +0 -12
  193. package/dist/core/runtime/broker-sdk.js +77 -6
  194. package/dist/core/runtime/broker.d.ts +5 -1
  195. package/dist/core/runtime/broker.js +520 -59
  196. package/dist/core/runtime/close.d.ts +12 -2
  197. package/dist/core/runtime/close.js +37 -16
  198. package/dist/core/runtime/front-door.js +14 -7
  199. package/dist/core/runtime/host.d.ts +14 -34
  200. package/dist/core/runtime/host.js +14 -50
  201. package/dist/core/runtime/launch.d.ts +12 -9
  202. package/dist/core/runtime/launch.js +27 -15
  203. package/dist/core/runtime/lifecycle.d.ts +1 -1
  204. package/dist/core/runtime/lifecycle.js +15 -19
  205. package/dist/core/runtime/nodes.d.ts +0 -55
  206. package/dist/core/runtime/nodes.js +6 -74
  207. package/dist/core/runtime/placement.d.ts +91 -334
  208. package/dist/core/runtime/placement.js +262 -828
  209. package/dist/core/runtime/promote.d.ts +2 -0
  210. package/dist/core/runtime/promote.js +24 -6
  211. package/dist/core/runtime/recap.d.ts +8 -0
  212. package/dist/core/runtime/recap.js +107 -0
  213. package/dist/core/runtime/recycle.js +25 -61
  214. package/dist/core/runtime/reset.d.ts +43 -37
  215. package/dist/core/runtime/reset.js +131 -218
  216. package/dist/core/runtime/revive.d.ts +9 -29
  217. package/dist/core/runtime/revive.js +45 -135
  218. package/dist/core/runtime/spawn.d.ts +15 -11
  219. package/dist/core/runtime/spawn.js +168 -136
  220. package/dist/core/runtime/surface-bg.d.ts +11 -0
  221. package/dist/core/runtime/surface-bg.js +68 -0
  222. package/dist/core/runtime/tmux.d.ts +15 -43
  223. package/dist/core/runtime/tmux.js +38 -80
  224. package/dist/core/scope.d.ts +1 -2
  225. package/dist/core/scope.js +1 -5
  226. package/dist/core/skill-sync/__tests__/dry-run-wrote-count.test.d.ts +1 -0
  227. package/dist/core/skill-sync/__tests__/dry-run-wrote-count.test.js +57 -0
  228. package/dist/core/skill-sync/builtins.d.ts +42 -0
  229. package/dist/core/skill-sync/builtins.js +112 -0
  230. package/dist/core/skill-sync/claude-plugins.d.ts +23 -0
  231. package/dist/core/skill-sync/claude-plugins.js +71 -0
  232. package/dist/core/skill-sync/engine.d.ts +42 -0
  233. package/dist/core/skill-sync/engine.js +633 -0
  234. package/dist/core/skill-sync/export.d.ts +23 -0
  235. package/dist/core/skill-sync/export.js +86 -0
  236. package/dist/core/skill-sync/manifest.d.ts +64 -0
  237. package/dist/core/skill-sync/manifest.js +181 -0
  238. package/dist/core/skill-sync/profile.d.ts +76 -0
  239. package/dist/core/skill-sync/profile.js +173 -0
  240. package/dist/core/skill-sync/snapshot.d.ts +57 -0
  241. package/dist/core/skill-sync/snapshot.js +120 -0
  242. package/dist/core/spawn.d.ts +14 -0
  243. package/dist/core/spawn.js +29 -9
  244. package/dist/core/substrate/index.d.ts +2 -2
  245. package/dist/core/substrate/index.js +7 -7
  246. package/dist/core/substrate/injected-store.d.ts +10 -0
  247. package/dist/core/substrate/injected-store.js +55 -0
  248. package/dist/core/substrate/on-read.js +68 -6
  249. package/dist/core/substrate/render.d.ts +8 -11
  250. package/dist/core/substrate/render.js +29 -43
  251. package/dist/core/substrate/schema.d.ts +16 -11
  252. package/dist/core/substrate/schema.js +32 -31
  253. package/dist/core/tui/host.d.ts +12 -4
  254. package/dist/core/tui/host.js +280 -149
  255. package/dist/core/view/bridge.d.ts +10 -0
  256. package/dist/core/view/bridge.js +31 -0
  257. package/dist/core/view/chrome.d.ts +9 -0
  258. package/dist/core/view/chrome.js +22 -0
  259. package/dist/core/view/contract.d.ts +171 -0
  260. package/dist/core/view/contract.js +23 -0
  261. package/dist/core/view/loader.d.ts +31 -0
  262. package/dist/core/view/loader.js +188 -0
  263. package/dist/core/view/transport-local.d.ts +7 -0
  264. package/dist/core/view/transport-local.js +70 -0
  265. package/dist/core/view/transport.d.ts +4 -0
  266. package/dist/core/view/transport.js +15 -0
  267. package/dist/daemon/crtrd.d.ts +38 -27
  268. package/dist/daemon/crtrd.js +303 -376
  269. package/dist/daemon/manage.js +6 -1
  270. package/dist/index.js +1 -1
  271. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +28 -20
  272. package/dist/pi-extensions/canvas-context-intro.js +4 -4
  273. package/dist/pi-extensions/canvas-doc-substrate.js +29 -20
  274. package/dist/pi-extensions/canvas-nav.js +35 -385
  275. package/dist/pi-extensions/canvas-recap.d.ts +37 -0
  276. package/dist/pi-extensions/canvas-recap.js +236 -0
  277. package/dist/pi-extensions/canvas-resume.js +2 -1
  278. package/dist/pi-extensions/canvas-stophook.d.ts +15 -13
  279. package/dist/pi-extensions/canvas-stophook.js +119 -103
  280. package/dist/pi-extensions/canvas-view.js +2 -1
  281. package/dist/pi-extensions/widget-order-bus.d.ts +6 -0
  282. package/dist/pi-extensions/widget-order-bus.js +34 -0
  283. package/dist/prompts/view.d.ts +2 -2
  284. package/dist/prompts/view.js +145 -73
  285. package/dist/types.d.ts +1 -6
  286. package/dist/types.js +1 -3
  287. package/dist/web/ViewChrome.d.ts +7 -0
  288. package/dist/web/ViewChrome.js +28 -0
  289. package/dist/web/ViewPane.d.ts +39 -0
  290. package/dist/web/ViewPane.js +48 -0
  291. package/dist/web/index.d.ts +6 -0
  292. package/dist/web/index.js +16 -0
  293. package/dist/web/runtime.d.ts +39 -0
  294. package/dist/web/runtime.js +133 -0
  295. package/dist/web/states.d.ts +24 -0
  296. package/dist/web/states.js +24 -0
  297. package/dist/web/transport-http.d.ts +5 -0
  298. package/dist/web/transport-http.js +28 -0
  299. package/dist/web-client/assets/index-BUvQb4hR.css +2 -0
  300. package/dist/web-client/assets/index-ClLQXYAE.js +10 -0
  301. package/dist/web-client/index.html +13 -0
  302. package/package.json +20 -6
  303. package/dist/builtin-views/canvas/client.mjs +0 -303
  304. package/dist/builtin-views/canvas/view.mjs +0 -576
  305. package/dist/builtin-views/git-pr/client.mjs +0 -440
  306. package/dist/builtin-views/git-pr/view.mjs +0 -675
  307. package/dist/builtin-views/inbox/sources/gmail.mjs +0 -965
  308. package/dist/builtin-views/inbox/sources/linkedin.mjs +0 -427
  309. package/dist/builtin-views/inbox/view.mjs +0 -889
  310. package/dist/builtin-views/linkedin/client.mjs +0 -610
  311. package/dist/builtin-views/linkedin/view.mjs +0 -1171
  312. package/dist/commands/pkg/bridge.d.ts +0 -1
  313. package/dist/commands/pkg/bridge.js +0 -137
  314. package/dist/commands/skill/author.d.ts +0 -3
  315. package/dist/commands/skill/author.js +0 -140
  316. package/dist/commands/skill/shared.d.ts +0 -3
  317. package/dist/commands/skill/shared.js +0 -19
  318. package/dist/commands/skill.d.ts +0 -2
  319. package/dist/commands/skill.js +0 -21
  320. package/dist/commands/tmux-spread.d.ts +0 -2
  321. package/dist/commands/tmux-spread.js +0 -144
  322. package/dist/core/__tests__/full/daemon-liveness-pane.full.test.js +0 -292
  323. package/dist/core/__tests__/full/placement-focus.test.js +0 -309
  324. package/dist/core/__tests__/full/placement-reconcile.test.js +0 -212
  325. package/dist/core/__tests__/full/placement-revive.test.js +0 -238
  326. package/dist/core/__tests__/full/placement-teardown.test.js +0 -221
  327. package/dist/core/__tests__/home-session.test.js +0 -186
  328. package/dist/core/__tests__/relaunch.test.js +0 -335
  329. package/dist/core/bridge-map.d.ts +0 -19
  330. package/dist/core/bridge-map.js +0 -73
  331. package/dist/core/tui/contract.d.ts +0 -83
  332. package/dist/core/tui/contract.js +0 -8
  333. package/dist/core/tui/loader.d.ts +0 -16
  334. package/dist/core/tui/loader.js +0 -94
  335. package/dist/prompts/skill.d.ts +0 -2
  336. package/dist/prompts/skill.js +0 -650
  337. /package/dist/{core/__tests__/full/daemon-liveness-pane.full.test.d.ts → clients/attach/__tests__/action-parity.test.d.ts} +0 -0
  338. /package/dist/{core/__tests__/full/placement-focus.test.d.ts → clients/attach/__tests__/clipboard-image.test.d.ts} +0 -0
  339. /package/dist/{core/__tests__/full/placement-reconcile.test.d.ts → clients/attach/__tests__/editor-newline.test.d.ts} +0 -0
  340. /package/dist/{core/__tests__/full/placement-revive.test.d.ts → clients/attach/__tests__/git-info.test.d.ts} +0 -0
  341. /package/dist/{core/__tests__/full/placement-teardown.test.d.ts → clients/attach/__tests__/onrequest-wired.test.d.ts} +0 -0
  342. /package/dist/{core/__tests__/home-session.test.d.ts → clients/attach/__tests__/reconnect-giveup.test.d.ts} +0 -0
  343. /package/dist/{core/__tests__/relaunch.test.d.ts → clients/attach/__tests__/slash-quit-copy.test.d.ts} +0 -0
@@ -1,5 +1,4 @@
1
1
  import { defineRoot } from './core/command.js';
2
- import { registerSkill } from './commands/skill.js';
3
2
  import { registerMemory } from './commands/memory.js';
4
3
  import { registerPkg } from './commands/pkg.js';
5
4
  import { registerHuman } from './commands/human.js';
@@ -9,6 +8,8 @@ import { registerNode } from './commands/node.js';
9
8
  import { registerCanvas } from './commands/canvas.js';
10
9
  import { registerView } from './commands/view.js';
11
10
  import { registerAttach } from './clients/attach/attach-cmd.js';
11
+ import { registerWorkspace } from './commands/workspace.js';
12
+ import { registerWeb } from './clients/web/web-cmd.js';
12
13
  /** Assemble the full crtr command tree. Root owns only the tagline; every
13
14
  * subtree declares its own root representation via its rootEntry, and every
14
15
  * branch assembles its child listing from the child defs (each child owns its
@@ -20,7 +21,6 @@ export function buildRoot() {
20
21
  tagline: 'crtr: agentic planning runtime.',
21
22
  globals: [],
22
23
  subtrees: [
23
- registerSkill(),
24
24
  registerMemory(),
25
25
  registerPkg(),
26
26
  registerHuman(),
@@ -31,6 +31,8 @@ export function buildRoot() {
31
31
  registerCanvas(),
32
32
  registerView(),
33
33
  registerAttach(),
34
+ registerWorkspace(),
35
+ registerWeb(),
34
36
  ],
35
37
  });
36
38
  }
@@ -1,5 +1,5 @@
1
1
  ---
2
- kind: skill
2
+ kind: knowledge
3
3
  when-and-why-to-read: When creating a crtr marketplace or contributing plugins
4
4
  to one, this skill should be read.
5
5
  short-form: How to author a crtr marketplace — marketplace.json index, plugin
@@ -36,7 +36,7 @@ If you have one plugin, ship it standalone. Promote to a marketplace later.
36
36
  └── plugins/
37
37
  ├── plugin-a/
38
38
  │ ├── .crouter-plugin/plugin.json
39
- │ └── skills/...
39
+ │ └── memory/...
40
40
  └── plugin-b/
41
41
  └── ...
42
42
  ```
@@ -108,18 +108,19 @@ The crouter-official-marketplace repo's `.github/workflows/auto-bump.yml` is the
108
108
  cd <marketplace-repo>
109
109
 
110
110
  # Create the plugin (see [[crouter-development/plugins]] for plugin layout)
111
- mkdir -p plugins/my-new-plugin/.crouter-plugin plugins/my-new-plugin/skills
111
+ mkdir -p plugins/my-new-plugin/.crouter-plugin plugins/my-new-plugin/memory
112
112
  $EDITOR plugins/my-new-plugin/.crouter-plugin/plugin.json
113
113
 
114
- # Add at least one skill
115
- crtr skill author scaffold my-new-plugin/first-skill --type playbook --description "Use when …"
114
+ # Add at least one doc (`crtr memory write -h` is the authoring + routing guide)
115
+ $EDITOR plugins/my-new-plugin/memory/first-skill.md
116
116
 
117
117
  # Add the plugin to the marketplace index
118
118
  $EDITOR .crouter-marketplace/marketplace.json
119
119
  # (append to plugins[] with name, initial version, source, description)
120
120
 
121
121
  # Validate
122
- crtr sys doctor
122
+ crtr sys doctor # manifest + structure
123
+ crtr memory lint # doc frontmatter
123
124
 
124
125
  # Commit — CI bumps versions if you've wired up auto-bump
125
126
  git add -A
@@ -1,5 +1,5 @@
1
1
  ---
2
- kind: skill
2
+ kind: knowledge
3
3
  when-and-why-to-read: When writing or revising a base persona prompt (a
4
4
  <kind>/PERSONA.md, the system prompt for a single-window worker node), this
5
5
  skill should be read.
@@ -1,5 +1,5 @@
1
1
  ---
2
- kind: skill
2
+ kind: knowledge
3
3
  when-and-why-to-read: When writing or revising an orchestrator persona prompt (a
4
4
  <kind>/orchestrator.md, the system prompt for a resident coordinator node),
5
5
  this skill should be read.
@@ -1,5 +1,5 @@
1
1
  ---
2
- kind: skill
2
+ kind: knowledge
3
3
  when-and-why-to-read: When adding a new `--kind`, overriding a builtin agent, or
4
4
  debugging persona resolution, this skill should be read.
5
5
  short-form: How to define a custom node kind (persona) for crtr — the
@@ -1,5 +1,5 @@
1
1
  ---
2
- kind: skill
2
+ kind: knowledge
3
3
  when-and-why-to-read: When creating a crtr plugin, packaging skills for
4
4
  distribution, or debugging install/resolution, this skill should be read.
5
5
  short-form: How to author a crtr plugin — plugin.json manifest, directory
@@ -7,18 +7,17 @@ short-form: How to author a crtr plugin — plugin.json manifest, directory
7
7
  packaging skills for distribution, or debugging install/resolution.
8
8
  system-prompt-visibility: name
9
9
  file-read-visibility: none
10
- needs-refinement: true
11
10
  ---
12
11
 
13
12
  # Authoring crtr plugins
14
13
 
15
- A **plugin** is a directory shipping skills (and, in future, other artifact types like commands and hooks). Plugins are how you package skills for sharing across machines, projects, and people.
14
+ A **plugin** is a directory shipping substrate docs (knowledge and preferences) and other artifact types like `rules/` and `agents/`. Plugins are how you package that content for sharing across machines, projects, and people.
16
15
 
17
16
  Audience: LLM agents creating or maintaining a crtr plugin.
18
17
 
19
18
  ## When you need a plugin (vs scope-owned skills)
20
19
 
21
- Scope-owned skills live at `~/.crouter/skills/` (user) or `<project>/.crouter/skills/` (project). They're personal and per-machine/per-repo.
20
+ Scope-owned docs live at `~/.crouter/memory/` (user) or `<project>/.crouter/memory/` (project). They're personal and per-machine/per-repo.
22
21
 
23
22
  Reach for a **plugin** when:
24
23
  - You want to share skills across multiple projects or with other people.
@@ -33,12 +32,14 @@ If it's a one-off note for yourself, scope-owned skills are simpler. Promote to
33
32
  <plugin-name>/
34
33
  ├── .crouter-plugin/
35
34
  │ └── plugin.json # manifest — required
36
- └── skills/
37
- └── <skill-name>/
38
- └── SKILL.md
35
+ └── memory/
36
+ ├── <name>.md # a kind:knowledge or kind:preference doc
37
+ └── <area>/
38
+ ├── INDEX.md # optional — a dir surfaces as one entry at its INDEX rung
39
+ └── <name>.md
39
40
  ```
40
41
 
41
- The `<plugin-name>` directory IS the plugin. The manifest's `name` field must match the directory name (install renames if needed). Future artifact types (`commands/`, `hooks/`, etc.) will be sibling dirs to `skills/`.
42
+ The `<plugin-name>` directory IS the plugin. The manifest's `name` field must match the directory name (install renames if needed). Sibling dirs (`rules/`, `agents/`, and future `commands/`, `hooks/`) hold the other artifact types.
42
43
 
43
44
  ## The manifest
44
45
 
@@ -97,20 +98,21 @@ Three ways a plugin lands in a scope:
97
98
  ## Local development loop
98
99
 
99
100
  ```bash
100
- # Scaffold dir + manifest + first skill
101
- mkdir -p my-plugin/.crouter-plugin my-plugin/skills
101
+ # Scaffold dir + manifest + first doc
102
+ mkdir -p my-plugin/.crouter-plugin my-plugin/memory
102
103
  $EDITOR my-plugin/.crouter-plugin/plugin.json # write the manifest
103
104
  cd my-plugin
104
- crtr skill author scaffold my-plugin/my-first-skill --type playbook --description "Use when …"
105
+ $EDITOR my-plugin/memory/my-first-skill.md # author the doc `crtr memory write -h` is the frontmatter + routing guide
105
106
 
106
107
  # Symlink for fast iteration — no clone, edits land immediately
107
108
  ln -s $(pwd) ~/.crouter/plugins/my-plugin
108
109
 
109
110
  # Verify
110
111
  crtr pkg plugin inspect list # my-plugin appears
111
- crtr pkg plugin inspect show my-plugin # lists its skills
112
- crtr memory list --plugin my-plugin # just my-plugin's skills
113
- crtr sys doctor # validates manifest + every skill
112
+ crtr pkg plugin inspect show my-plugin # lists its docs
113
+ crtr memory read my-plugin/my-first-skill # resolve it under the plugin namespace
114
+ crtr sys doctor # validates the manifest
115
+ crtr memory lint # validates doc frontmatter
114
116
  ```
115
117
 
116
118
  When ready to share: push to a git remote; anyone can `crtr pkg plugin manage install <url> --scope user`.
@@ -131,7 +133,7 @@ Standard semver:
131
133
 
132
134
  `crtr pkg plugin manage disable <name>` flips the per-scope config without removing files. Disabled plugins are hidden from `crtr memory list` and don't resolve via `crtr memory read <name>`. Re-enable with `crtr pkg plugin manage enable <name>`.
133
135
 
134
- Individual skills inside an enabled plugin can also be disabled: `crtr skill state disable <plugin>/<skill>`.
136
+ Individual skills inside an enabled plugin are hidden by setting their frontmatter visibility rungs to `none` (or a gate that fails), not by a command — see `crtr memory write -h`.
135
137
 
136
138
  ## What goes in a plugin
137
139
 
@@ -150,11 +152,11 @@ If your skill conceptually depends on another plugin's skill, link via `## Relat
150
152
 
151
153
  ## Validation
152
154
 
153
- `crtr sys doctor` checks every plugin:
155
+ `crtr sys doctor` checks each plugin's manifest:
154
156
  - Manifest exists and is valid JSON.
155
157
  - Manifest `name` matches the directory name.
156
- - Every skill under `skills/` passes the skill-validation contract (frontmatter parses, `name` matches dir path, `type` in enum). Run `crtr skill author guide` for the authoring workflow + SKILL.md format reference.
157
- - Sibling artifact dirs (`commands/`, `hooks/`, etc.) validated by their respective specs as those land.
158
+
159
+ `crtr memory lint` checks the docs under `memory/`: frontmatter parses, valid `kind`, both visibility rungs set. Run `crtr memory write -h` for the authoring + routing guide. Sibling artifact dirs (`rules/`, `agents/`, `commands/`, `hooks/`) are validated by their respective specs as those land.
158
160
 
159
161
  ## Cross-publishing with Claude Code
160
162
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- kind: skill
2
+ kind: knowledge
3
3
  when-and-why-to-read: When shaping a design roadmap or producing an
4
4
  architecture/interface design, this skill should be read.
5
5
  short-form: Use when shaping a design roadmap or producing an
@@ -1,5 +1,5 @@
1
1
  ---
2
- kind: skill
2
+ kind: knowledge
3
3
  when-and-why-to-read: When shaping or reshaping a build roadmap — choosing a
4
4
  development style, selecting a phase skeleton, or setting exit criteria for a
5
5
  software goal — this skill should be read.
@@ -1,5 +1,5 @@
1
1
  ---
2
- kind: reference
2
+ kind: knowledge
3
3
  when-and-why-to-read: When you hit a question about how the crtr runtime itself works — how nodes and the canvas behave, where state lives on disk, or how the primitives compose into real systems — this index should be read because it routes you to the runtime's own operational documentation, so you act from the canonical model instead of inferring it from command help.
4
4
  short-form: internal/ is the runtime's self-documentation — operational guides to nodes/canvas and the storage tiers, plus worked example compositions. Open it when you need to understand how crtr works.
5
5
  system-prompt-visibility: preview
@@ -1,5 +1,5 @@
1
1
  ---
2
- kind: reference
2
+ kind: knowledge
3
3
  when-and-why-to-read: When you want a worked end-to-end composition of crouter primitives — not what one command does but how several combine into a real standing system — open this dir because it holds complete example builds, each verified against the actual runtime and OS mechanics.
4
4
  short-form: Worked examples composing crouter primitives into complete systems (like pi's examples/ dir). Currently — the iMessage assistant node.
5
5
  system-prompt-visibility: name
@@ -1,5 +1,5 @@
1
1
  ---
2
- kind: reference
2
+ kind: knowledge
3
3
  when-and-why-to-read: When you are building a standing assistant node bridged to an external channel — iMessage, email, a chat service — this example should be read because it composes the crouter primitives (resident root node, custom persona, event-driven wake via node msg, project-scope memory) into a working OpenClaw-style design, with the macOS chat.db/osascript mechanics verified.
4
4
  short-form: Worked example — an always-on iMessage assistant built from crouter primitives. Resident root node + launchd watcher → node msg wakes + chat.db reads + osascript sends + substrate memory.
5
5
  system-prompt-visibility: name
@@ -36,7 +36,7 @@ You are the standing iMessage assistant. Initialize: read your persona's wake lo
36
36
  EOF
37
37
  ```
38
38
 
39
- `--root` makes it independent and resident — top-level on the canvas, no parent to report to, never forced to finish. Add `--headless` if it shouldn't occupy a tmux window. Record the returned node id for the watcher.
39
+ `--root` makes it independent and resident — top-level on the canvas, no parent to report to, never forced to finish. Every node runs headless on its own broker and occupies no tmux window until you focus it (which attaches a viewer pane). Record the returned node id for the watcher.
40
40
 
41
41
  ## 3. Wake: event-driven, not polled
42
42
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- kind: reference
2
+ kind: knowledge
3
3
  when-and-why-to-read: When you are operating the canvas — spawning or steering nodes, deciding how work reports up, recovering a dormant or crashed node, or reasoning about the daemon — this reference should be read because it is the operational model of nodes, the spine, lifecycle, and revive, so you drive the runtime correctly instead of inferring it from scattered command help.
4
4
  short-form: Operational model of the agent runtime — nodes on the canvas graph, spawn/delegate, the push/feed spine, lifecycle states, and revive (manual + daemon auto-revive).
5
5
  system-prompt-visibility: name
@@ -1,5 +1,5 @@
1
1
  ---
2
- kind: reference
2
+ kind: knowledge
3
3
  when-and-why-to-read: When you need to know where a piece of crtr state lives on disk — or you are adding a new kind of file and must decide where it belongs — this reference should be read because it names the three storage tiers and their durability/ownership contracts, so you put (or find) the file in the right place instead of scattering state.
4
4
  short-form: The three crtr storage tiers — scope root (durable user/repo content), per-cwd crouter root (per-project working artifacts), and canvas home (node-graph runtime state).
5
5
  system-prompt-visibility: name
@@ -1,5 +1,5 @@
1
1
  ---
2
- kind: skill
2
+ kind: knowledge
3
3
  when-and-why-to-read: When shaping a planning roadmap, deciding plan structure,
4
4
  or fanning out plan-review specialists before declaring a plan ready, this
5
5
  skill should be read.
@@ -1,5 +1,5 @@
1
1
  ---
2
- kind: skill
2
+ kind: knowledge
3
3
  when-and-why-to-read: When running a specification effort, shaping a spec
4
4
  roadmap, or deciding how to stage design and requirements work, this skill
5
5
  should be read.
@@ -19,9 +19,11 @@ A specification effort runs in exactly this order: **SHAPE** → **DESIGN** →
19
19
 
20
20
  ### Stage 1 — Shape
21
21
 
22
- Shape is the only stage that is genuinely interactive. The spec orchestrator works with the human to nail down intent, scope, and non-goals before any design work begins. The deliverable is not an artifact — it is a shared mental model sufficient to write a sharp design brief.
22
+ Shape is the discovery stage the one place this effort is genuinely interactive. You work the human like a **consultant with a client**: draw out intent, scope, and non-goals before any design work begins. The deliverable is not an artifact — it is a shared mental model sufficient to write a sharp design brief.
23
23
 
24
- Run an inquiry loop: name the most important ambiguity, form a provisional take, offer 2–4 concrete options, get a decision. Track these turns carefully. The shape stage is done when: (1) 3–7 named components or functional areas are identified, (2) the user's intent can be restated without correction, and (3) no unresolved contradictions remain between the user's goal and the existing codebase. If after three rounds ambiguity remains, surface it explicitly in the design brief as open questions do not silently assume an answer.
24
+ Run a discovery loop with `crtr human ask`: name the most important open question, form a provisional take, offer 2–4 concrete options, get a decision, repeat. Two rules keep it sharp. **Never ask a question you could answer yourself** first try to settle it by reading the codebase or your references; only genuinely unresolved, judgment-bearing questions reach the human, because a dumb question a little reading would have answered erodes their trust. And **aim discovery where it matters for this task** — the uncertainty that would most damage the spec is itself a per-task judgment you infer (error semantics for one task, screen layout for another, an integration contract for a third). The **behavior of the finished system is the prize** — boundary behavior, error cases, UX — pin it down as precisely as the task allows. The user is technical, so pull them into high-level architectural calls (data and table shapes, major structural choices) but don't make them sign off low-level detail they'd rather you decide.
25
+
26
+ Track these turns carefully. The shape stage is done when: (1) 3–7 named components or functional areas are identified, (2) the user's intent can be restated without correction, and (3) no unresolved contradictions remain between the user's goal and the existing codebase. If after several rounds an ambiguity remains genuinely unresolvable, surface it explicitly in the design brief as an open question — do not silently assume an answer.
25
27
 
26
28
  Gate: human confirms readiness to proceed to design.
27
29
 
@@ -37,7 +39,7 @@ Gate: human approves the rendered design artifact.
37
39
 
38
40
  Requirements are derived from the finished, approved design. They describe observable system behavior — what a user, caller, or tester sees the system do at its boundary — under what triggers, conditions, and failure modes. Each requirement is written in EARS format (WHEN/WHILE/IF/WHERE + SHALL). Requirements are not the design restated; if a behavior is clear from the design, it belongs as a safe assumption, not a load-bearing requirement.
39
41
 
40
- Delegate requirements writing to a terminal `spec` agent (base lifecycle). Pass it the rendered design text only. Do not include the design conversation, user goals, or your own reasoning — the requirements writer must derive requirements from what is actually documented, not from what was intended.
42
+ Delegate requirements writing to a terminal `spec/requirements` agent — the isolated requirements-writer sub-persona, distinct from the discovery-first base `spec` worker. Pass it the rendered design text only. Do not include the design conversation, user goals, or your own reasoning — the requirements writer must derive requirements from what is actually documented, not from what was intended.
41
43
 
42
44
  Gate: human reviews and approves all load-bearing requirements; no `rejected` or unresolved `draft` items remain.
43
45
 
@@ -48,15 +48,14 @@ Larger artifacts — specs, plans, exploration findings, test recipes — live a
48
48
 
49
49
  ## Your long-term memory
50
50
 
51
- Separate from the roadmap (your live plan and state) you have a persistent document substrate that outlasts any single roadmap: skills you adopt, preferences about how you work, references to external resources, and facts about the human and the project. It lives across **three scoped stores** — user-global, project, and node-local — each a `memory/` directory of substrate documents with typed frontmatter.
51
+ Separate from the roadmap (your live plan and state) you have a persistent document substrate that outlasts any single roadmap: knowledge you consult how to do things, how things work, facts about the human and the project — and preferences about how you work. It lives across **three scoped stores** — user-global, project, and node-local — each a `memory/` directory of substrate documents with typed frontmatter.
52
52
 
53
- **Reading.** At boot, skills and preferences surface in your system prompt automatically (`<skills>`, `<preferences>`). References surface in your `<crtr-context>` block (`<references>`). Each surface is a file tree where a doc shows its full content, a `# read when:` routing line, or just its name. To browse the full inventory: `crtr memory list`. To search by topic: `crtr memory find <query>`. To load a document by name: `crtr memory read <name>`.
53
+ **Reading.** At boot, preferences surface in your system prompt automatically (`<preferences>`). Knowledge surfaces in your `<crtr-context>` block (`<knowledge>`). Each surface is a file tree where a doc shows its full content, a `# read when:` routing line, or just its name. To browse the full inventory: `crtr memory list`. To search by topic: `crtr memory find <query>`. To load a document by name: `crtr memory read <name>`.
54
54
 
55
55
  **Writing.** Use `crtr memory write` to create or update a document. Every document carries `kind` and `when-and-why-to-read` in its frontmatter, plus a body. `when-and-why-to-read` is ONE read-routing sentence — "When <circumstance>, this <kind> should be read <because <payoff>>." — that tells a future reader when to open the doc and why the read is worth it; it is read-routing, never a justification of the content. It becomes the preview line verbatim. The `kind` governs which section it surfaces in at boot and how it loads:
56
56
 
57
- - `skill` — a workflow or methodology to adopt. Surfaces by name in `<skills>`; load with `crtr memory read`.
58
- - `preference` — how you should work. Surfaces with a `# read when:` routing line in `<preferences>` at boot (default `system-prompt-visibility: preview`).
59
- - `reference` — a fact, pointer, or constraint. Surfaces by name in `<references>` only when author-promoted; counted as `[+N more]` and loaded on demand otherwise.
57
+ - `knowledge` — anything you consult: a workflow or methodology to adopt, how something works, a fact, pointer, or constraint. Surfaces in your `<crtr-context>` block (`<knowledge>`) — by name, or counted as `[+N more]` and loaded on demand with `crtr memory read`.
58
+ - `preference` — how you should *behave*: a standing directive you embody rather than look up. Surfaces with a `# read when:` routing line in `<preferences>` at boot (default `system-prompt-visibility: preview`).
60
59
 
61
60
  The scope decides which nodes see the document. `user` scope loads into every orchestrator everywhere. `project` scope loads into orchestrators working in this repo. `node-local` (written directly into the node's memory dir) applies only to this node.
62
61
 
@@ -15,12 +15,16 @@ Don't stall and don't guess at a decision a person should make:
15
15
 
16
16
  crtr human ask "<question>"
17
17
 
18
- ## When your task is too big for one context window
19
- If you discover the job is far larger than one node can hold many phases, or work that won't fit before you run low on context **promote yourself** instead of grinding it out:
18
+ ## When crtr itself misbehaves
19
+ A `crtr` command that errors unexpectedly, hangs, churns, double-spawns, or contradicts its own `-h` is a harness bug don't silently work around it. Run `crtr sys feedback` to report it (`-h` for how), then continue.
20
20
 
21
- crtr node promote --kind <kind> # `crtr node promote -h`: what an orchestrator is, --kind, roadmap, terminal vs resident
21
+ ## When the task outgrows one window promote early, yield when full
22
+ Two different moves; don't conflate them. **Promote** when the *shape* of the job is bigger than one worker — you can see up front it's many phases, or a task that started simple keeps getting extended (more and more asked of it — almost always the signal to stop grinding and own it as phases). Do it *early*, the moment you recognize that shape, not after the window wears down. **Yield** is the other case: your context is just filling but the mandate isn't done. That is not a "become something" decision — yield refreshes you into a clean window against a roadmap, carrying a note to your future self, and for a base node it seeds that roadmap and promotes you transparently, so you never decide to promote — you just keep going.
22
23
 
23
- Don't promote for work that fits one windowfinish it.
24
+ crtr node promote --kind <kind> # `crtr node promote -h`become a long-lived orchestrator now
25
+ crtr node yield # `crtr node yield -h` — refresh into a clean window, carrying a note forward
26
+
27
+ Don't promote or yield for work that fits one window — finish it with `crtr push final`.
24
28
 
25
29
  ## When you are blocked on a future event or time
26
30
  You are not stuck and you are not done — you are waiting. Don't busy-loop or finish: just stop and go dormant, and the runtime wakes you when the thing you wait on happens. See *Waiting* for the details — including the one case where you instead schedule the wake yourself.
@@ -1,10 +1,14 @@
1
1
  ---
2
- whenToUse: Write a specification pin down behavior, non-goals, interfaces, edge cases, and testable acceptance criteria from a goal.
2
+ whenToUse: Collaborate with the user to discover what to build, then write the spec — behavior, non-goals, interfaces, edge cases, testable acceptance criteria.
3
3
  model: opus
4
4
  ---
5
5
 
6
- You are a spec writer. Given a goal or feature request, you produce a specification a planner turns into tasks without guessing your intent that, not emitting a document, is the bar for done.
6
+ You are a spec writer who works like a **consultant with a client**. Given a goal or feature request, you do **discovery** — you draw out what the system must actually *do* — and then write a specification a planner turns into tasks without guessing your intent. Discovery is the job; the document is its record. Done is a spec, grounded in answers you got from the user, that pins down every dimension a downstream reader would otherwise have to guess.
7
7
 
8
- A spec is genuinely done only when it pins down every dimension a downstream reader would otherwise have to guess: the behavior (what the feature does), the non-goals (what it deliberately does not do the boundary is as load-bearing as the behavior), the inputs, outputs, and interfaces, the edge cases, and acceptance criteria written so each is testable — an implementer can check it pass or fail without coming back to ask you. Stay at the level of intent and constraint; include implementation detail only where it is genuinely constraining, and cut anything a planner would rewrite anyway. The cost of a flaw here is asymmetric a planner builds confidently on a wrong premise — so a guessed spec is worse than an admitted gap. Deliver the full spec, complete and self-contained, nothing truncated. The spec states current intent as settled fact, not the path that reached it fold every clarified decision into the section it belongs in and carry no decision log, superseded framing, or already-answered question; surface a question only when it is genuinely unresolved and needs the human.
8
+ **Discover before you write; ask, don't dump.** The user came with a goal, not a finished picture in their headyour work is to pull it into focus with them, not to hand back a wall of text and hope it matched. Run a discovery loop with `crtr human ask`: name the most important open question, form a provisional take, offer 2–4 concrete options, get a decision, repeat. But **never ask a question you could answer yourself** first try to settle it by reading the codebase or your references; only genuinely unresolved, judgment-bearing questions reach the user. A dumb question a little reading would have answered erodes their trust.
9
9
 
10
- Do not invent intent to fill a hole. When the goal is genuinely ambiguous and the code does not settle it, surface the ambiguity rather than papering over it. When intent has to be clarified with the human across staged gates, or the surface is large enough to need its own design pass before requirements can be derived, that is a spec orchestrator's effortpromote rather than emit a confident spec over an unresolved foundation.
10
+ **Aim discovery where it matters for this task.** Spend the user's attention where the uncertainty would most damage the spec and which uncertainty that is, is itself a judgment you infer per task: error semantics for one, screen layout for another, an integration contract for a third. The **behavior of the finished system is the prize** what it does at its boundary, how it fails, what the error cases and the UX are — strive to pin this down as precisely as the task allows; it is what a vague spec most often leaves to chance. The user is technical, so bring them into high-level architectural calls data and table shapes, major structural choices but don't make them sign off low-level detail they'd rather you just decide.
11
+
12
+ A spec is done only when it pins down behavior, non-goals (the boundary is as load-bearing as the behavior), inputs/outputs/interfaces, edge cases, and acceptance criteria written so each is testable without coming back to ask you. Stay at the level of intent and constraint; include implementation detail only where it is genuinely constraining. State current intent as settled fact — fold every clarified decision into the section it belongs in, and carry no decision log or already-answered question. Deliver the spec file path and report via `crtr push final`.
13
+
14
+ When the surface is large enough to need staged human gates and its own design pass before requirements can be derived, that is a spec orchestrator's effort — promote rather than emit a confident spec over an unresolved foundation.
@@ -3,10 +3,12 @@ roadmapSkill: spec
3
3
  model: opus
4
4
  ---
5
5
 
6
- You are a **spec orchestrator** — you own a specification effort and deliver a spec a planner turns into tasks with zero guessing. You reach that through three gated stages: **SHAPE** (clarify intent with the human until the goal is unambiguous), **DESIGN** (produce the blueprint), and **REQUIREMENTS** (derive precise, testable requirements from the finished design). This is one of the few kinds where human engagement is load-bearing Shape is interactive, and the human gates each stage before the next begins. You drive and decide; the human answers questions and signs off the artifact each stage produces.
6
+ You are a **spec orchestrator** — you own a specification effort and deliver a spec a planner turns into tasks with zero guessing. You reach it through three gated stages: **SHAPE** (discover intent with the human until the goal is unambiguous), **DESIGN** (produce the blueprint), and **REQUIREMENTS** (derive precise, testable requirements from the finished design). Human engagement is load-bearing here in a way it is for almost no other kind: you run this like a **consultant with a client** you drive and decide, the human answers questions and gates each stage before the next begins.
7
7
 
8
- Before you shape the roadmap or open any stage, read `crtr memory read spec` for the stage gates, the rule for delegating design to a base vs. orchestrator child, and what a finished spec contains. Delegate the design stage to a `design` child a base node for a bounded surface, a design orchestrator when it spans multiple surfaces or phases.
8
+ **Discover, don't interrogate, and never dump.** Across every stage you refine intent by asking the human real questions through `crtr human` but earn each one. Before you ask, try to answer it yourself by reading the codebase or your references; only genuinely unresolved, judgment-bearing questions reach the human, because a dumb question a little reading would have settled erodes their trust. The user is technical, so pull them into high-level architectural calls — data and table shapes, major structural choices — but don't make them approve low-level detail they'd rather you decide. Aim discovery where the uncertainty would most damage the spec: the **behavior of the finished system is the prize** — its boundary behavior, error semantics, and UX and which discovery matters most is itself a per-task judgment you must infer.
9
9
 
10
- Yield for a fresh window between stages, and derive requirements from the *rendered design text in isolation*, never from the design conversation that produced it a requirements pass that inherits the design's working context reproduces its blind spots instead of testing them. The effort is done only when every stage has cleared its human gate and the requirements are testable enough that a planner needs nothing further from you.
10
+ Before you shape the roadmap or open any stage, read `crtr memory read spec` for the stage gates, the discovery loop, the rule for delegating design to a base vs. orchestrator child, and what a finished spec contains. Delegate the design stage to a `design` child a base node for a bounded surface, a design orchestrator when it spans multiple surfaces or phases. Delegate the requirements stage to a `spec/requirements` child, passing it the **rendered design text alone**.
11
+
12
+ Yield for a fresh window between stages, and derive requirements from the rendered design in isolation, never from the design conversation that produced it — a requirements pass that inherits the design's working context reproduces its blind spots instead of testing them. The effort is done only when every stage has cleared its human gate and the requirements are testable enough that a planner needs nothing further from you.
11
13
 
12
14
  @include orchestration-kernel.md
@@ -0,0 +1,10 @@
1
+ ---
2
+ whenToUse: Derive testable EARS requirements from a finished, approved design — in isolation, from the rendered design text alone.
3
+ model: opus
4
+ ---
5
+
6
+ You are a requirements writer. You are given the **rendered text of a finished design and nothing else** — no design conversation, no user goals, no prior reasoning — and you derive the requirements a planner builds from. The isolation is the point: working only from what the design actually documents, you surface what it left ambiguous as a visible gap instead of silently filling it from intent you were never told.
7
+
8
+ Read the design as a cold reader would. Write each requirement as observable system behavior — what a user, caller, or tester sees at the boundary, under what trigger, condition, and failure mode — in EARS format (WHEN/WHILE/IF/WHERE + SHALL), each testable pass/fail without coming back to ask. A behavior already clear from the design is a safe assumption, not a load-bearing requirement; do not restate the design. Where the design genuinely fails to settle a behavior, record the gap in `agentNotes` rather than inventing an answer — that absence becoming visible is the desired outcome, not a failure to paper over.
9
+
10
+ Deliver the requirements artifact and report via `crtr push final`.