@jr2/orchestrator 0.4.1 → 0.6.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 (361) hide show
  1. package/README.md +20 -2
  2. package/console/components/app.ts +2 -0
  3. package/console/components/fleet.ts +14 -1
  4. package/console/components/machine-pane.ts +41 -2
  5. package/console/main.ts +13 -1
  6. package/console/store.ts +102 -6
  7. package/console/style.css +21 -0
  8. package/docs/agents-block.md +5 -0
  9. package/docs/concepts/agents-and-turns.md +478 -0
  10. package/docs/concepts/architecture.md +243 -0
  11. package/docs/concepts/charts.md +146 -0
  12. package/docs/concepts/composition.md +357 -0
  13. package/docs/concepts/converge.md +257 -0
  14. package/docs/concepts/durable-runs.md +189 -0
  15. package/docs/concepts/effects.md +658 -0
  16. package/docs/concepts/gates.md +208 -0
  17. package/docs/concepts/machines-and-workflows.md +298 -0
  18. package/docs/concepts/pools-and-sources.md +230 -0
  19. package/docs/concepts/secrets-and-trust.md +306 -0
  20. package/docs/concepts/the-menu.md +381 -0
  21. package/docs/concepts/workspaces.md +756 -0
  22. package/docs/get-started/a-model-decides.md +563 -0
  23. package/docs/get-started/an-agent-in-a-sandbox.md +383 -0
  24. package/docs/get-started/connect-a-model.md +248 -0
  25. package/docs/get-started/create-an-instance.md +194 -0
  26. package/docs/get-started/have-your-assistant-write-a-machine.md +993 -0
  27. package/docs/get-started/install.md +130 -0
  28. package/docs/guides/add-tools-to-the-sandbox.md +308 -0
  29. package/docs/guides/answer-a-gate.md +304 -0
  30. package/docs/guides/bind-open-parts.md +224 -0
  31. package/docs/guides/cancel-a-run.md +146 -0
  32. package/docs/guides/clean-up.md +206 -0
  33. package/docs/guides/cut-a-worktree.md +560 -0
  34. package/docs/guides/fix-a-failed-converge.md +361 -0
  35. package/docs/guides/give-the-cluster-git-credentials.md +222 -0
  36. package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
  37. package/docs/guides/let-an-agent-write-a-chart.md +230 -0
  38. package/docs/guides/look-inside-a-sandbox.md +177 -0
  39. package/docs/guides/mirror-the-kit-images.md +176 -0
  40. package/docs/guides/move-from-kind-to-a-shared-cluster.md +318 -0
  41. package/docs/guides/open-the-console.md +91 -0
  42. package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
  43. package/docs/guides/push-and-sign-a-branch.md +532 -0
  44. package/docs/guides/run-a-chart-by-name.md +270 -0
  45. package/docs/guides/run-a-command-or-call-a-url.md +587 -0
  46. package/docs/guides/run-one-worker-per-item.md +322 -0
  47. package/docs/guides/set-an-agents-access-and-dials.md +420 -0
  48. package/docs/guides/size-a-workspace.md +217 -0
  49. package/docs/guides/start-a-run-from-a-run.md +237 -0
  50. package/docs/guides/start-a-run.md +207 -0
  51. package/docs/guides/upgrade-the-kit-version.md +240 -0
  52. package/docs/guides/use-a-hosted-provider.md +214 -0
  53. package/docs/guides/use-a-local-model.md +313 -0
  54. package/docs/guides/watch-a-run.md +349 -0
  55. package/docs/guides/write-a-workflow.md +318 -0
  56. package/docs/index.md +44 -0
  57. package/docs/llms.txt +237 -0
  58. package/docs/reference/authoring-surface/agent.md +151 -0
  59. package/docs/reference/authoring-surface/answer.md +156 -0
  60. package/docs/reference/authoring-surface/arg.md +82 -0
  61. package/docs/reference/authoring-surface/basic.md +62 -0
  62. package/docs/reference/authoring-surface/bearer.md +53 -0
  63. package/docs/reference/authoring-surface/branchname.md +15 -0
  64. package/docs/reference/authoring-surface/chartschema.md +23 -0
  65. package/docs/reference/authoring-surface/chartschemafor.md +48 -0
  66. package/docs/reference/authoring-surface/command.md +206 -0
  67. package/docs/reference/authoring-surface/customize.md +64 -0
  68. package/docs/reference/authoring-surface/defineconfig.md +41 -0
  69. package/docs/reference/authoring-surface/defineevent.md +114 -0
  70. package/docs/reference/authoring-surface/dispatch.md +126 -0
  71. package/docs/reference/authoring-surface/fail.md +96 -0
  72. package/docs/reference/authoring-surface/file.md +142 -0
  73. package/docs/reference/authoring-surface/frompick.md +277 -0
  74. package/docs/reference/authoring-surface/http.md +259 -0
  75. package/docs/reference/authoring-surface/isfailure.md +58 -0
  76. package/docs/reference/authoring-surface/isready.md +14 -0
  77. package/docs/reference/authoring-surface/jr2setup.md +237 -0
  78. package/docs/reference/authoring-surface/open.md +105 -0
  79. package/docs/reference/authoring-surface/openbody.md +86 -0
  80. package/docs/reference/authoring-surface/paramsof.md +143 -0
  81. package/docs/reference/authoring-surface/pool.md +186 -0
  82. package/docs/reference/authoring-surface/push.md +130 -0
  83. package/docs/reference/authoring-surface/readyof.md +21 -0
  84. package/docs/reference/authoring-surface/secret.md +139 -0
  85. package/docs/reference/authoring-surface/sentby.md +83 -0
  86. package/docs/reference/authoring-surface/source.md +51 -0
  87. package/docs/reference/authoring-surface/text.md +62 -0
  88. package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
  89. package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
  90. package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
  91. package/docs/reference/authoring-surface/type-agentslots.md +15 -0
  92. package/docs/reference/authoring-surface/type-answeraction.md +12 -0
  93. package/docs/reference/authoring-surface/type-anyframepath.md +14 -0
  94. package/docs/reference/authoring-surface/type-anyworktreepath.md +15 -0
  95. package/docs/reference/authoring-surface/type-arg.md +19 -0
  96. package/docs/reference/authoring-surface/type-argnames.md +12 -0
  97. package/docs/reference/authoring-surface/type-bindactors.md +14 -0
  98. package/docs/reference/authoring-surface/type-binding.md +61 -0
  99. package/docs/reference/authoring-surface/type-bindingof.md +12 -0
  100. package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
  101. package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
  102. package/docs/reference/authoring-surface/type-ceilings.md +41 -0
  103. package/docs/reference/authoring-surface/type-chainlink.md +19 -0
  104. package/docs/reference/authoring-surface/type-chartaction.md +46 -0
  105. package/docs/reference/authoring-surface/type-chartagent.md +28 -0
  106. package/docs/reference/authoring-surface/type-chartevent.md +20 -0
  107. package/docs/reference/authoring-surface/type-chartguard.md +20 -0
  108. package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
  109. package/docs/reference/authoring-surface/type-chartjson.md +14 -0
  110. package/docs/reference/authoring-surface/type-chartstate.md +46 -0
  111. package/docs/reference/authoring-surface/type-charttext.md +40 -0
  112. package/docs/reference/authoring-surface/type-charttransition.md +22 -0
  113. package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
  114. package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
  115. package/docs/reference/authoring-surface/type-childat.md +12 -0
  116. package/docs/reference/authoring-surface/type-childslots.md +12 -0
  117. package/docs/reference/authoring-surface/type-commandenv.md +15 -0
  118. package/docs/reference/authoring-surface/type-commandinput.md +20 -0
  119. package/docs/reference/authoring-surface/type-commandoptions.md +56 -0
  120. package/docs/reference/authoring-surface/type-commandoutput.md +122 -0
  121. package/docs/reference/authoring-surface/type-customize.md +111 -0
  122. package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
  123. package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
  124. package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
  125. package/docs/reference/authoring-surface/type-dispatchoutput.md +72 -0
  126. package/docs/reference/authoring-surface/type-doorlessinput.md +19 -0
  127. package/docs/reference/authoring-surface/type-duration.md +15 -0
  128. package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
  129. package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
  130. package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
  131. package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
  132. package/docs/reference/authoring-surface/type-eventdef.md +45 -0
  133. package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
  134. package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
  135. package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
  136. package/docs/reference/authoring-surface/type-failslot.md +14 -0
  137. package/docs/reference/authoring-surface/type-failure.md +19 -0
  138. package/docs/reference/authoring-surface/type-failureinput.md +20 -0
  139. package/docs/reference/authoring-surface/type-filebody.md +37 -0
  140. package/docs/reference/authoring-surface/type-framepath.md +14 -0
  141. package/docs/reference/authoring-surface/type-frominput.md +14 -0
  142. package/docs/reference/authoring-surface/type-hostinjectedinput.md +56 -0
  143. package/docs/reference/authoring-surface/type-httpdefinition.md +104 -0
  144. package/docs/reference/authoring-surface/type-httpfileinput.md +20 -0
  145. package/docs/reference/authoring-surface/type-httpinput.md +12 -0
  146. package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
  147. package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
  148. package/docs/reference/authoring-surface/type-httpoutput.md +95 -0
  149. package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
  150. package/docs/reference/authoring-surface/type-jr2config.md +126 -0
  151. package/docs/reference/authoring-surface/type-lateroutcome.md +21 -0
  152. package/docs/reference/authoring-surface/type-lends.md +38 -0
  153. package/docs/reference/authoring-surface/type-logicat.md +12 -0
  154. package/docs/reference/authoring-surface/type-markedif.md +12 -0
  155. package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
  156. package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
  157. package/docs/reference/authoring-surface/type-namestart.md +77 -0
  158. package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +27 -0
  159. package/docs/reference/authoring-surface/type-notworktreekeys.md +12 -0
  160. package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
  161. package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
  162. package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
  163. package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
  164. package/docs/reference/authoring-surface/type-opencommandinput.md +22 -0
  165. package/docs/reference/authoring-surface/type-openeffect.md +12 -0
  166. package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
  167. package/docs/reference/authoring-surface/type-openof.md +12 -0
  168. package/docs/reference/authoring-surface/type-opensecret.md +23 -0
  169. package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
  170. package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +26 -0
  171. package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +27 -0
  172. package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
  173. package/docs/reference/authoring-surface/type-poolnextinput.md +22 -0
  174. package/docs/reference/authoring-surface/type-poolspec.md +60 -0
  175. package/docs/reference/authoring-surface/type-pushinput.md +34 -0
  176. package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
  177. package/docs/reference/authoring-surface/type-pushoutput.md +149 -0
  178. package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
  179. package/docs/reference/authoring-surface/type-quantity.md +14 -0
  180. package/docs/reference/authoring-surface/type-reached.md +12 -0
  181. package/docs/reference/authoring-surface/type-reposlot.md +70 -0
  182. package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
  183. package/docs/reference/authoring-surface/type-sandboxoptions.md +84 -0
  184. package/docs/reference/authoring-surface/type-secret.md +25 -0
  185. package/docs/reference/authoring-surface/type-sender.md +19 -0
  186. package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
  187. package/docs/reference/authoring-surface/type-size.md +85 -0
  188. package/docs/reference/authoring-surface/type-slothandles.md +24 -0
  189. package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
  190. package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
  191. package/docs/reference/authoring-surface/type-syncstate.md +12 -0
  192. package/docs/reference/authoring-surface/type-text.md +19 -0
  193. package/docs/reference/authoring-surface/type-textpart.md +24 -0
  194. package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
  195. package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
  196. package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
  197. package/docs/reference/authoring-surface/type-unknown.md +21 -0
  198. package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
  199. package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
  200. package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
  201. package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
  202. package/docs/reference/authoring-surface/type-workspaced.md +115 -0
  203. package/docs/reference/authoring-surface/type-workspacehandles.md +22 -0
  204. package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
  205. package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
  206. package/docs/reference/authoring-surface/type-workspaceoptions.md +27 -0
  207. package/docs/reference/authoring-surface/type-worktreefound.md +16 -0
  208. package/docs/reference/authoring-surface/type-worktreeinput.md +56 -0
  209. package/docs/reference/authoring-surface/type-worktreekey.md +14 -0
  210. package/docs/reference/authoring-surface/type-worktreeoptions.md +29 -0
  211. package/docs/reference/authoring-surface/type-worktreeoutput.md +45 -0
  212. package/docs/reference/authoring-surface/type-worktreepath.md +16 -0
  213. package/docs/reference/authoring-surface/type-worktreeready.md +37 -0
  214. package/docs/reference/authoring-surface/type-worktreerefused.md +21 -0
  215. package/docs/reference/authoring-surface/workspace.md +287 -0
  216. package/docs/reference/authoring-surface/worktree.md +71 -0
  217. package/docs/reference/authoring-surface.md +217 -0
  218. package/docs/reference/cli.md +433 -0
  219. package/docs/reference/config.md +765 -0
  220. package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +114 -0
  221. package/docs/reference/decisions/0002-duplex-streaming-actor.md +117 -0
  222. package/docs/reference/decisions/0004-worktree-provisioning-model.md +130 -0
  223. package/docs/reference/decisions/0005-sandbox-pod-composition.md +240 -0
  224. package/docs/reference/decisions/0006-agent-control-surface.md +50 -0
  225. package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
  226. package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
  227. package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
  228. package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
  229. package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
  230. package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
  231. package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +175 -0
  232. package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
  233. package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +271 -0
  234. package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +126 -0
  235. package/docs/reference/decisions/0017-pool-over-a-source-port.md +71 -0
  236. package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
  237. package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +287 -0
  238. package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
  239. package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +101 -0
  240. package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
  241. package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +175 -0
  242. package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +436 -0
  243. package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
  244. package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
  245. package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +245 -0
  246. package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +90 -0
  247. package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
  248. package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
  249. package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +193 -0
  250. package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
  251. package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +126 -0
  252. package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
  253. package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
  254. package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
  255. package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
  256. package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
  257. package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
  258. package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
  259. package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
  260. package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
  261. package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
  262. package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
  263. package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
  264. package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
  265. package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
  266. package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
  267. package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
  268. package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +238 -0
  269. package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +86 -0
  270. package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +123 -0
  271. package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
  272. package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
  273. package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
  274. package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
  275. package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +108 -0
  276. package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +427 -0
  277. package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
  278. package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
  279. package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +239 -0
  280. package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +82 -0
  281. package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
  282. package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
  283. package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +552 -0
  284. package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +458 -0
  285. package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +475 -0
  286. package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
  287. package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +334 -0
  288. package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
  289. package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
  290. package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
  291. package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
  292. package/docs/reference/decisions/0075-a-machine-cuts-a-worktree-and-the-workspace-only-clones.md +295 -0
  293. package/docs/reference/decisions/0076-an-agents-control-credential-lives-only-where-no-workspace-code-runs.md +320 -0
  294. package/docs/reference/decisions/0077-jr2-requires-landlock-on-every-sandbox-node.md +79 -0
  295. package/docs/reference/decisions.md +86 -0
  296. package/docs/reference/glossary.md +687 -0
  297. package/docs/reference/http-api.md +1386 -0
  298. package/docs/reference/machines.md +189 -0
  299. package/docs/reference/mechanism-events.md +72 -0
  300. package/docs/why.md +207 -0
  301. package/package.json +5 -3
  302. package/src/actor.ts +694 -106
  303. package/src/agent.ts +114 -38
  304. package/src/ambient.ts +3 -4
  305. package/src/assembly-checks.ts +189 -7
  306. package/src/cause.ts +234 -0
  307. package/src/chart.ts +345 -46
  308. package/src/charts.ts +43 -8
  309. package/src/config.ts +440 -178
  310. package/src/custodian.lua +17 -5
  311. package/src/custodian.ts +325 -99
  312. package/src/customize.ts +199 -49
  313. package/src/dispatch-effect.ts +945 -0
  314. package/src/door-compat.ts +217 -0
  315. package/src/durability.ts +11 -4
  316. package/src/effect-checks.ts +50 -3
  317. package/src/effect.ts +641 -128
  318. package/src/effector-wire.ts +165 -13
  319. package/src/fail.ts +222 -0
  320. package/src/harness-client.ts +587 -50
  321. package/src/harness-env.ts +33 -0
  322. package/src/held-secrets.ts +125 -16
  323. package/src/holds.ts +3 -0
  324. package/src/http-effect.ts +556 -58
  325. package/src/http.ts +480 -30
  326. package/src/index.ts +74 -82
  327. package/src/instance.ts +68 -8
  328. package/src/internal.ts +85 -0
  329. package/src/kube-client.ts +6 -3
  330. package/src/machine-doc.ts +24 -7
  331. package/src/mechanism-routes.ts +168 -0
  332. package/src/model-keys.generated.ts +53 -0
  333. package/src/model-keys.ts +42 -58
  334. package/src/names.ts +19 -6
  335. package/src/notices.ts +483 -41
  336. package/src/open-body.ts +242 -40
  337. package/src/open-effect.ts +81 -8
  338. package/src/open.ts +90 -6
  339. package/src/parts.ts +213 -30
  340. package/src/party.ts +101 -2
  341. package/src/pick.ts +497 -11
  342. package/src/pool.ts +282 -50
  343. package/src/registration.ts +133 -12
  344. package/src/repo-identity.ts +7 -3
  345. package/src/repos.ts +22 -3
  346. package/src/run-host.ts +665 -45
  347. package/src/run-output.ts +38 -0
  348. package/src/sandbox-effect.ts +457 -71
  349. package/src/sandbox-kube.ts +66 -17
  350. package/src/secret-placement.ts +59 -17
  351. package/src/server.ts +3 -0
  352. package/src/setup.ts +325 -62
  353. package/src/size.ts +121 -9
  354. package/src/snapshot-store.ts +54 -10
  355. package/src/stub-harness.ts +44 -16
  356. package/src/timers.ts +14 -1
  357. package/src/tokens.ts +107 -32
  358. package/src/vocabulary.ts +88 -14
  359. package/src/wire.ts +100 -26
  360. package/src/workspace.ts +771 -238
  361. package/src/worktree.ts +249 -0
@@ -0,0 +1,237 @@
1
+ ---
2
+ title: Start a run from a run
3
+ description: Use a dispatch Effect to start a run of a Workflow from a Machine, in this Instance or in a different one.
4
+ ---
5
+
6
+ # Start a run from a run
7
+
8
+ Start a run of a [Workflow](../reference/glossary.md#workflow) from a [Machine](../reference/glossary.md#machine), with
9
+ a `dispatch` [Effect](../reference/glossary.md#effect).
10
+
11
+ This example is `workflows/intake.ts`. It waits at a [Gate](../reference/glossary.md#gate). For each `report` event, it
12
+ starts one run of `triage`, the Workflow of [A model decides](../get-started/a-model-decides.md). Then it waits for the
13
+ next report:
14
+
15
+ ```ts
16
+ import { assign } from "xstate";
17
+ import { z } from "zod";
18
+ import { defineEvent, dispatch, jr2Setup, type DispatchOutput } from "@jr2/orchestrator";
19
+
20
+ // The run input of the triage Workflow, as this slot claims it. `jr2 up` compares it with the
21
+ // input that triage declares.
22
+ const triageInput = z.object({ request: z.string() });
23
+
24
+ // The Gate takes these events. A person, a script or a webhook reports a request.
25
+ const report = defineEvent({
26
+ name: "report",
27
+ description: "Report a request. A run of triage starts for it.",
28
+ input: triageInput,
29
+ });
30
+ const close = defineEvent({
31
+ name: "close",
32
+ description: "Stop the intake. The runs that it started continue.",
33
+ input: z.object({}),
34
+ });
35
+
36
+ type Context = { request?: string; started: string[]; last?: DispatchOutput };
37
+
38
+ export const machine = jr2Setup({
39
+ types: {} as { context: Context },
40
+ events: [report, close],
41
+ actors: {
42
+ // Each invoke of this slot starts one run of triage. That run is a run of its own.
43
+ triage: dispatch("triage", { input: triageInput }),
44
+ },
45
+ }).createMachine({
46
+ id: "intake",
47
+ context: { started: [] },
48
+ initial: "listening",
49
+ states: {
50
+ listening: {
51
+ invoke: { src: "gate" },
52
+ on: {
53
+ report: { target: "starting", actions: assign({ request: ({ event }) => event.request }) },
54
+ close: "closed",
55
+ },
56
+ },
57
+ starting: {
58
+ invoke: {
59
+ src: "triage",
60
+ input: ({ context }) => ({ request: context.request ?? "" }),
61
+ // Each outcome is output: started, refused, unreachable or unknown.
62
+ onDone: {
63
+ target: "listening",
64
+ actions: assign({
65
+ last: ({ event }) => event.output,
66
+ started: ({ context, event }) =>
67
+ event.output.outcome === "started" ? [...context.started, event.output.run] : context.started,
68
+ }),
69
+ },
70
+ },
71
+ },
72
+ closed: { type: "final" },
73
+ },
74
+ });
75
+ ```
76
+
77
+ The Instance must also have `workflows/triage.ts`. The example does not need a model of its own: the runs of `triage`
78
+ use the model of `triage`.
79
+
80
+ ## Converge it
81
+
82
+ Run [`jr2 up`](../reference/cli.md#up). Its `effects:` lines tell where the Effect runs:
83
+
84
+ ```sh
85
+ jr2 up
86
+ ```
87
+
88
+ ```text
89
+ …
90
+ effects: workflow "intake" — what it runs outside itself (ADR-0067)
91
+ triage: dispatch triage → this Orchestrator — 30s, in the Orchestrator's own process
92
+ …
93
+ converged — `jr2 run <workflow>` when ready
94
+ ```
95
+
96
+ `jr2 up` checks that the [Assembly](../reference/glossary.md#assembly) has a Workflow `triage`. It also compares the
97
+ `input` schema of the slot with the input that `triage` declares. When they do not agree, it stops before it changes the
98
+ cluster.
99
+
100
+ ## Start the runs
101
+
102
+ Start the run of `intake` in one terminal. It stays at its Gate, `listening`, until you send `close`:
103
+
104
+ ```sh
105
+ jr2 run intake
106
+ ```
107
+
108
+ In a second terminal, send a report. `<run id>` is the id that `jr2 run` printed, or its first 4 characters or more:
109
+
110
+ ```sh
111
+ jr2 send <run id> --gate listening --event report --input '{"request":"The greeting looks wrong sometimes."}'
112
+ ```
113
+
114
+ The Effect starts a run of `triage` with the input `{"request":"The greeting looks wrong sometimes."}`. When the
115
+ [Orchestrator](../reference/glossary.md#orchestrator) accepts the run, the Effect ends with `started`, and `intake` goes
116
+ back to `listening`.
117
+
118
+ ## See the runs
119
+
120
+ [`jr2 runs`](../reference/cli.md#runs) lists the two runs. The run of `triage` has `dispatchedBy` after its id:
121
+
122
+ ```sh
123
+ jr2 runs
124
+ ```
125
+
126
+ ```text
127
+ …
128
+ → context kind-jr2 / namespace my-instance
129
+ workflows:
130
+ intake (machine)
131
+ ping (machine)
132
+ triage (machine)
133
+ [{"runId":"91ca85e1-5092-4e10-9ec6-d14e37811ca1","workflow":"intake","instanceId":"e51d124b-88e5-461c-b464-6a3660ee13dc","status":"active","value":"listening","context":{"started":["45b52048-0848-4015-ad56-6ff8ae33d817"],"request":"The greeting looks wrong sometimes.","last":{"outcome":"started","run":"45b52048-0848-4015-ad56-6ff8ae33d817"}},"children":[],"waiting":[],"held":[],"assembly":"3229103a2952","dispatched":[{"slot":"triage","run":"45b52048-0848-4015-ad56-6ff8ae33d817","at":"2026-10-24T06:20:43.465Z"}]},{"runId":"45b52048-0848-4015-ad56-6ff8ae33d817","dispatchedBy":{"run":"91ca85e1-5092-4e10-9ec6-d14e37811ca1","slot":"triage","effect":"08423831-751f-41e5-9d93-1fa063faaf61","depth":1},"workflow":"triage","instanceId":"a2ad6e54-6a52-45c2-81f4-89f408a27d1f","status":"active","value":"triaging","context":{"request":"The greeting looks wrong sometimes.","exchange":[]},"children":[],"waiting":[],"held":[],"assembly":"3229103a2952"}]
134
+ ```
135
+
136
+ The first line, `…`, is the line `→ .env:`, with the keys that the CLI took from `.env`. The lines on stderr list the
137
+ Workflows of the Instance. In `dispatchedBy`, `run` is the run that started it, `slot` is the slot of the Effect, and
138
+ `effect` is the id of that Effect in the record of the run that started it. jr2 uses it as the key of the start, so that
139
+ a start that jr2 sends again starts no second run. `depth` is the number of runs before it in the chain. `dispatched` of
140
+ `intake` lists each run that it started. Your ids, your time and your hash are different.
141
+
142
+ [`jr2 status`](../reference/cli.md#status) prints the link in both directions, on stderr. For the run of `intake`:
143
+
144
+ ```text
145
+ dispatched: 45b52048-0848-4015-ad56-6ff8ae33d817 (triage)
146
+ ```
147
+
148
+ For the run of `triage`:
149
+
150
+ ```text
151
+ dispatched by: 91ca85e1-5092-4e10-9ec6-d14e37811ca1 (triage), depth 1
152
+ ```
153
+
154
+ The two runs are independent. A `CANCEL` of `intake` does not cancel the run of `triage`. Answer the `clarify` Gate of
155
+ each run of `triage` as [Answer a Gate](answer-a-gate.md) tells.
156
+
157
+ ## Wait for the run to end
158
+
159
+ To use the result of the run, add `wait: true` to the definition:
160
+ `dispatch("triage", { input: triageInput, wait: true })`.
161
+
162
+ The Effect then ends when the run of `triage` ends, with `{ outcome: "settled", run, status, output }`. `status` is
163
+ `done`, `failed`, `error`, `cancelled`, `lost` or `drifted`. `output` is the output of the Machine of that run, and for
164
+ `failed` it is the Failure, `{ reason, detail? }`. The default timeout is then 10 minutes. Set a different one with
165
+ `timeout`, such as `timeout: "1h"`. When the timeout comes first, `status` is `live`, and the run continues. On a
166
+ different Orchestrator, the Effect reads the run every 5 seconds. When its last read got no answer, the outcome is
167
+ `unknown`, not `settled`.
168
+
169
+ `wait` is fixed in the definition. A Machine that starts the same Workflow in the two ways has two slots.
170
+
171
+ ## Start a run on a different Instance
172
+
173
+ To start a run on the Orchestrator of a different [Instance](../reference/glossary.md#instance), give a `target` in the
174
+ definition: `target: { url: "https://ops.example.com", token: secret("ops-instance") }`.
175
+
176
+ - `url` is the origin of the other Orchestrator: the scheme, the host and the port. It has no path.
177
+ - `token` names a secret that holds the Instance token of the other Instance. Put the secret in the
178
+ [`secrets`](../reference/config.md#secrets) list of `jr2.config.ts`, as for an `http` Effect. See
179
+ [Run a command or call a URL with an Effect](run-a-command-or-call-a-url.md).
180
+ - The Effect runs in the [Instance Effector](../reference/glossary.md#instance-effector), which holds the token.
181
+ `jr2 up` converges the Instance Effector for it.
182
+ - `jr2 up` asks the other Orchestrator for `GET /workflows/<name>` with no token, and compares its input. Each problem
183
+ is a warning, not a refusal: the other Instance can be down, or you can converge it later.
184
+
185
+ A Machine that you publish as a package can leave the target Open with `target: open`. The composer binds the url and
186
+ the token together:
187
+ `customize(<import>, { effects: { <slot>: { target: { url: "https://<host>", token: secret("<name>") } } } })`. See
188
+ [Bind a shipped Machine's Open parts](bind-open-parts.md).
189
+
190
+ ## Rules
191
+
192
+ - The name of the Workflow is a constant, as `jr2 run` writes it:
193
+ ``dispatch("<name>"): the Workflow is named as `jr2 run` names it — a Machine's filename stem ("review"), or "<wrapper>/<name>" for a named Chart: lowercase letters, digits and "-" (ADR-0071)``
194
+ - `wait` is a boolean: `dispatch("<name>", { wait }): wait is true or false — a slot that needs both declares two`
195
+ - The `input` option is a `z.object()`:
196
+ `dispatch("<name>", { input }): the input is a z.object(...) — the run's body is a JSON object (ADR-0071)`
197
+ - `timeout` is a positive duration:
198
+ `dispatch("<name>"): timeout "<timeout>" is not a positive duration (like "30s", "10m", "1h")`
199
+ - A target is an object with a `url` and a `token`, or `open`:
200
+ `dispatch("<name>", { target }): a target is { url: "https://<host>", token: secret("<name>") }, or open (ADR-0071)`
201
+ - The `url` of a target is an origin. The refusal starts with
202
+ `dispatch("<name>", { target }): "<url>" is not an origin — write the scheme and the host, with a port if it is not the scheme's, and no path, query or userinfo`.
203
+ - The `token` of a target is a secret:
204
+ `dispatch("<name>", { target }): the token is a secret("<name>") holding the target's Instance token (ADR-0071)`
205
+ - An Open target is the whole target, not its secret:
206
+ ``dispatch("<name>", { target }): secret(open) in a target — the target is the Open part, not its secret: leave the whole target Open (`target: open`) and let the composer bind its url and token together (ADR-0071)``
207
+ - With no target, the Assembly must have the Workflow. `jr2 up` stops:
208
+ `refusing: workflow "<workflow>" dispatches "<name>" which no Workflow in the Assembly has — add workflows/<name>.ts, or name one it registers: <workflows> (ADR-0071)`
209
+ - With no target, the `input` schema of the slot must agree with the input that the Workflow declares. `jr2 up` stops,
210
+ with one line for each problem:
211
+ ``refusing: workflow "<workflow>" dispatches "<name>" with input its door does not take: <problem> — align the slot's `input` with the door (derive it from the door's schema, `door.pick({ ... })`) (ADR-0071)``
212
+ - For a named Chart that `jr2 up` cannot see, it warns and continues. A runtime Chart is only on the volume of the
213
+ Orchestrator, and the Orchestrator checks it when `jr2 up` publishes. The warning starts with
214
+ `warning: workflow "<workflow>" dispatches "<wrapper>/<name>": the Assembly has no Chart file workflows/<wrapper>/<name>.chart.json`.
215
+ - For a target, each problem that `jr2 up` finds is a warning. For example, when the other Orchestrator does not answer:
216
+ `warning: dispatch "<name>" at <url>: no answer from this host (<error>) — the other Instance may be down, or reached only from inside its cluster; while no door answers, the dispatch settles "unreachable" (ADR-0071)`
217
+ - When the Orchestrator starts no run, the Effect ends with `refused`, not with an error. `report` holds the lines of
218
+ the refusal, and `status` is its status code:
219
+ - `400`: the Workflow does not take the input.
220
+ - `404`: the current Assembly has no Workflow of that name.
221
+ - `409`: the named Chart cannot run now, or a run of a different Workflow has the key of this start.
222
+ - `413`: the start is larger than the Effector reads.
223
+ - `422`: the door refuses the Chart in the input.
224
+ - `0`: the Effector refused the start before it sent it.
225
+
226
+ ## Read next
227
+
228
+ - [Effects](../concepts/effects.md)
229
+ - [Machines and Workflows](../concepts/machines-and-workflows.md)
230
+ - [Durable runs](../concepts/durable-runs.md): `CANCEL`, and how long jr2 keeps a run.
231
+ - Reference: [`dispatch`](../reference/authoring-surface/dispatch.md),
232
+ [`DispatchOutput`](../reference/authoring-surface/type-dispatchoutput.md),
233
+ [`POST /workflows/:name/runs`](../reference/http-api.md#post-workflows-name-runs)
234
+ - [ADR-0071](../reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md): a run starts a run through a
235
+ `dispatch` Effect.
236
+ - [ADR-0049](../reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md): a Machine inside a run
237
+ is composed by invoke.
@@ -0,0 +1,207 @@
1
+ ---
2
+ title: Start a run
3
+ description: Start a run of a Workflow from the CLI, from the Console, or with a call to the HTTP API.
4
+ ---
5
+
6
+ # Start a run
7
+
8
+ Start a run of a [Workflow](../reference/glossary.md#workflow) from the CLI, from the
9
+ [Console](../reference/glossary.md#console), or with a call to the HTTP API.
10
+
11
+ A Workflow is a [Machine](../reference/glossary.md#machine) that your [Instance](../reference/glossary.md#instance)
12
+ registers. Its name is the name of its file in `workflows/`, without `.ts`. Thus `workflows/ping.ts` is the Workflow
13
+ `ping`. A named [Chart](../reference/glossary.md#chart) is a Workflow too, with the name `<wrapper>/<name>`: start it
14
+ with `jr2 run <wrapper>/<name>`. See [Run a Chart by name](run-a-chart-by-name.md). A run is one execution of that
15
+ Machine. The run input is a JSON object, and the Machine reads it when the run starts.
16
+
17
+ The examples on this page start `ping`, the Workflow that `jr2 init` writes. In the commands, replace `<namespace>` with
18
+ the namespace of your Instance. It is the [`name`](../reference/config.md#name) in `jr2.config.ts`. When `jr2.config.ts`
19
+ sets no `name`, it is the name of the Instance folder.
20
+
21
+ ## Start a run from the CLI
22
+
23
+ Run [`jr2 run`](../reference/cli.md#run) in the Instance folder, with the name of the Workflow. Give the run input in
24
+ `--input`:
25
+
26
+ ```sh
27
+ jr2 run ping --input '{"message":"hi"}'
28
+ ```
29
+
30
+ ```text
31
+ → context <context> / namespace <namespace>
32
+ run e3972b4c-eef9-4e7d-9068-3556332d2ba6 (ping) — attached
33
+ → done "done"
34
+ {"runId":"e3972b4c-eef9-4e7d-9068-3556332d2ba6","workflow":"ping","instanceId":"8e13475a-d325-45d4-bc64-0627086e97ba","status":"done","value":"done","context":{"message":"hi","reply":"pong: hi"},"children":[],"waiting":[],"held":[],"assembly":"16f4181d70d9"}
35
+ ```
36
+
37
+ Your run id, your instance id and your `assembly` hash are different. When your Instance folder has a `.env` file, the
38
+ output starts with one more line, `→ .env:`, with the keys that the CLI took from it.
39
+
40
+ - `jr2 run` finds the [Orchestrator](../reference/glossary.md#orchestrator) in the current kubectl context, in the
41
+ namespace of the Instance. The first line names the two. To use a different context or namespace, add
42
+ `--context <ctx>` or `-n <ns>`.
43
+ - The lines before the last are activity, on stderr. An indented line that starts with `→` is a change of the run's
44
+ status and its state. [Watch a run](watch-a-run.md) gives each kind of activity line.
45
+ - The last line is the result, on stdout: the status of the run when it ends, as one JSON object. Thus
46
+ `jr2 run ping … | jq` gets only the result.
47
+ - `jr2 run` stays attached until the run ends. A run that waits at a [Gate](../reference/glossary.md#gate) does not end,
48
+ so `jr2 run` waits too. To answer the Gate, use a second terminal. See [Answer a Gate](answer-a-gate.md).
49
+ - When you stop `jr2 run`, for example with Ctrl-C, the run continues in the Orchestrator. To attach again, run
50
+ `jr2 logs -f <run id>`.
51
+ - `jr2 run` exits with `0` only when the run ends with the status `done`. It exits with `1` for each other end:
52
+ `failed`, `error`, `cancelled`, `lost` and `drifted`, and also when the run stops before it ends. For a run that ends
53
+ `failed`, the line `failed: <reason>` on stderr gives the reason.
54
+
55
+ ### Start a run and return at once
56
+
57
+ Add `--detach`. `jr2 run` starts the run, prints its run id on stdout, and returns:
58
+
59
+ ```sh
60
+ jr2 run ping --input '{"message":"hi"}' --detach
61
+ ```
62
+
63
+ ```text
64
+ → context <context> / namespace <namespace>
65
+ {"runId":"fc8b82d1-bd73-498d-9057-ef13cf962240"}
66
+ ```
67
+
68
+ Use the run id, or its first 4 characters or more, with `jr2 status`, `jr2 logs` and `jr2 send`.
69
+
70
+ ## Start a run from the Console
71
+
72
+ You need the Instance token to start a run from the Console. [Open the Console](open-the-console.md) tells how to open
73
+ it and how to get the token.
74
+
75
+ 1. Open the Console.
76
+ 2. Type the Instance token in the `instance token` box in the nav.
77
+ 3. Push Enter. The badge beside the box shows `…`, then `live`.
78
+ 4. In the Fleet rail on the left, find the Workflow. Click `start` beside its name.
79
+ 5. Fill in the form. When the Machine declares its input, the form has one field for each property of the input. A field
80
+ that has `*` after its name is necessary. When the Machine declares no input, the form has a box for the run input as
81
+ JSON. An empty box starts the run with `{}`.
82
+ 6. Click `start run`.
83
+
84
+ While the run continues, the number beside the name of the Workflow counts it. To see the run, click the name of the
85
+ Workflow, or click `▸` beside it. When the Orchestrator refuses the input, the form shows the refusal text below the
86
+ `start run` button, and no run starts.
87
+
88
+ The form makes a text field for a property that is an object or an array. Thus the Orchestrator refuses the text,
89
+ because it is a string. For such an input, start the run from the CLI or with the HTTP API.
90
+
91
+ The `start` button shows only while the badge shows `live`. Without the token, the Console shows the runs, but you
92
+ cannot start one.
93
+
94
+ ## Start a run with the HTTP API
95
+
96
+ Send [`POST /workflows/:name/runs`](../reference/http-api.md#post-workflows-name-runs) to the Orchestrator, with the
97
+ Instance token. The body is the run input. A script, a webhook handler or a CI job can start a run this way.
98
+
99
+ `jr2 up` makes the Service `jr2-orchestrator` on port 4000, with no address outside the cluster. Thus a caller outside
100
+ the cluster uses a port forward, or an address that you make for the Service.
101
+
102
+ Forward a port to the Orchestrator. Keep this command open:
103
+
104
+ ```sh
105
+ kubectl -n <namespace> port-forward svc/jr2-orchestrator 4000:4000
106
+ ```
107
+
108
+ In a second terminal, get the Instance token into a variable:
109
+
110
+ ```sh
111
+ TOKEN=$(kubectl -n <namespace> get secret jr2-instance -o jsonpath='{.data.JR2_INSTANCE_TOKEN}' | base64 -d)
112
+ ```
113
+
114
+ Start the run:
115
+
116
+ ```sh
117
+ curl -s -X POST http://localhost:4000/workflows/ping/runs \
118
+ -H "Authorization: Bearer $TOKEN" \
119
+ -H "Content-Type: application/json" \
120
+ -d '{"message":"hi"}'
121
+ ```
122
+
123
+ ```text
124
+ {"runId":"41cfa794-3501-43f3-8b0d-48c83d9fea88","instanceId":"4e334e60-c4ba-4f63-8560-d86d649675f6"}
125
+ ```
126
+
127
+ The status code is `201`. `runId` is the id of the run. `instanceId` is the
128
+ [Instance ID](../reference/glossary.md#instance-id) that the run starts with. It is not the run id.
129
+
130
+ When the Machine declares its input, the run starts with the input as the schema reads it. A `z.object` schema removes a
131
+ property that it does not name, and it adds each default that it sets. When the Machine declares no input, the run
132
+ starts with the JSON object that you send.
133
+
134
+ To find the input that a Workflow takes, send [`GET /workflows/:name`](../reference/http-api.md#get-workflows-name) with
135
+ `Accept: application/json`. This route needs no token. `input` is the input schema of the Machine, as JSON Schema, or
136
+ `null` when the Machine declares no input:
137
+
138
+ ```sh
139
+ curl -s http://localhost:4000/workflows/ping -H "Accept: application/json"
140
+ ```
141
+
142
+ ```text
143
+ {"name":"ping","machineId":"ping","input":null}
144
+ ```
145
+
146
+ [`GET /workflows`](../reference/http-api.md#get-workflows) gives all the Workflows, each with where it comes from, and
147
+ the named Charts of each Chart wrapper. It also needs no token. [`jr2 runs`](../reference/cli.md#runs) prints the same
148
+ list on stderr.
149
+
150
+ ### Use the CLI without the Instance folder
151
+
152
+ The CLI can also speak to an Orchestrator at a URL. Then it does not look for the Instance folder or for a kubectl
153
+ context. Give the URL in `--url`, or in `JR2_URL`. Give the Instance token in `JR2_TOKEN`:
154
+
155
+ ```sh
156
+ JR2_URL=http://localhost:4000 JR2_TOKEN=$TOKEN jr2 run ping --input '{"message":"hi"}' --detach
157
+ ```
158
+
159
+ ```text
160
+ → http://localhost:4000
161
+ {"runId":"d28309a1-f8bc-4e15-b4c6-3f2b1642e826"}
162
+ ```
163
+
164
+ ## Rules
165
+
166
+ - `jr2 run` with no Workflow name starts no run. It prints its usage and exits with `2`:
167
+ `usage: jr2 run <workflow> [--input <json>] [--detach] [--url <u>] [-n <ns>] [--context <ctx>]`
168
+ - The Orchestrator refuses a name that no file in `workflows/` registers, with the status code `404`:
169
+ `no workflow registered as "<workflow>"`. `jr2 run` prints `error: no workflow registered as "<workflow>"` and exits
170
+ with `1`. It also prints the version of the Instance in one more line:
171
+ ``instance: <version> (<hash>) — if it predates this CLI, `jr2 up` converges the cluster to this kit``. `<hash>` is
172
+ the hash of the current [Assembly](../reference/glossary.md#assembly).
173
+ - When the Machine declares its input, the Orchestrator checks each run input against it. It refuses an input that does
174
+ not agree, with the status code `400`: `invalid input for workflow "<workflow>": <issues>`. `<issues>` is the list of
175
+ the problems as JSON. The Console shows the same text below its form.
176
+ - The Console form starts no run when its box holds text that is not a JSON object. It shows `not valid JSON` or
177
+ `the body must be a JSON object`.
178
+ - `jr2 run` starts no run when `--input` is not valid JSON. It prints `error: <message>`, where `<message>` is the
179
+ message of the JSON parser, and exits with `1`.
180
+ - The Orchestrator refuses a start without the Instance token, with the status code `401`: `unauthorized`.
181
+ - The Orchestrator refuses a start with the token of a [Sandbox](../reference/glossary.md#sandbox), with the status code
182
+ `403`: `run state and control need the Instance token — a Sandbox token has neither`. Thus an
183
+ [Agent](../reference/glossary.md#agent) cannot start a run.
184
+ - `jr2 run` outside an Instance folder, with no `--url` and no `JR2_URL`, starts no run:
185
+ `error: not inside a jr2 instance — no jr2.config.ts found walking up from cwd`
186
+ - `jr2 run` starts no run when the namespace holds no Instance:
187
+ ``error: not deployed here — right context? (context <context>, namespace <namespace>; `jr2 up` deploys)``
188
+ - `jr2 run` starts no run when kubectl has no current context:
189
+ ``error: no kube context — `kind create cluster` (or point kubectl at one), then `jr2 up` ``
190
+ - When the connection to the Orchestrator ends before the run ends, for example when the Orchestrator stops, `jr2 run`
191
+ prints `error: <message>` and exits with `1`. The run continues when the Orchestrator starts again. To attach again,
192
+ run `jr2 logs -f <run id>`.
193
+ - When the Orchestrator holds the run but did not continue it, `jr2 run` exits with `1`:
194
+ ``run <run id> is parked: stopped before it settled — `jr2 logs -f <run id>` follows it once restored``
195
+
196
+ ## Read next
197
+
198
+ - [Machines and Workflows](../concepts/machines-and-workflows.md)
199
+ - [ADR-0009](../reference/decisions/0009-cli-and-instance-interface.md): `jr2 run`, its output, and its exit codes.
200
+ - [ADR-0019](../reference/decisions/0019-one-converging-command-against-the-current-context.md): how the CLI finds the
201
+ Orchestrator.
202
+ - [ADR-0033](../reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md): the input that a Machine
203
+ declares.
204
+ - [ADR-0058](../reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md): why only the Instance token
205
+ starts a run.
206
+ - [Answer a Gate](answer-a-gate.md)
207
+ - [Watch a run](watch-a-run.md)