@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,130 @@
1
+ ---
2
+ title: Install
3
+ description: Install the tools that jr2 needs and the jr2 CLI, and make a kind cluster on your computer.
4
+ ---
5
+
6
+ # Install
7
+
8
+ At the end of this page, you have the [jr2 CLI](../reference/glossary.md#jr2-cli) and a kind cluster on your computer.
9
+ The next pages use them to make an [Instance](../reference/glossary.md#instance) and run it.
10
+
11
+ ## Before you start
12
+
13
+ This is the first page of the tutorial. You need a computer with these tools:
14
+
15
+ - [Node.js](https://nodejs.org/) 24 or later. Node.js includes npm.
16
+ - [Docker](https://docs.docker.com/get-started/get-docker/). Make sure that the Docker daemon runs.
17
+ - [kind](https://kind.sigs.k8s.io/docs/user/quick-start/#installation), which runs a Kubernetes cluster in Docker.
18
+ - [kubectl](https://kubernetes.io/docs/tasks/tools/), which speaks to the cluster.
19
+
20
+ kind makes the cluster from Docker containers. `jr2 up` builds an image with Docker and loads it into the kind cluster.
21
+ kubectl is the tool that `jr2 up`, `jr2 run` and the other commands use to speak to the cluster.
22
+
23
+ The kind cluster uses the Linux kernel of Docker: the kernel of your computer, or on macOS and Windows, the kernel of
24
+ the virtual machine of Docker. jr2 needs Landlock in that kernel: Linux 6.2 or later, with `landlock` in its list of
25
+ security modules. `jr2 up` refuses to converge without Landlock.
26
+
27
+ ## Check Node.js
28
+
29
+ Run:
30
+
31
+ ```sh
32
+ node --version
33
+ ```
34
+
35
+ The version must be `v24` or later:
36
+
37
+ ```text
38
+ v24.18.0
39
+ ```
40
+
41
+ Your version can be different.
42
+
43
+ ## Install the jr2 CLI
44
+
45
+ Run:
46
+
47
+ ```sh
48
+ npm i -g @jr2/cli
49
+ ```
50
+
51
+ npm installs the `jr2` command and the `@jr2/orchestrator` package that it uses. npm prints its progress and a summary
52
+ of the packages that it added. This page does not show that output. The next step checks the install.
53
+
54
+ ## Check the jr2 CLI
55
+
56
+ Run:
57
+
58
+ ```sh
59
+ jr2 --version
60
+ ```
61
+
62
+ The CLI shows its version, its folder and the version of Node.js. Outside an Instance, it shows no Instance:
63
+
64
+ ```text
65
+ cli: <version> /tmp/jr2-dist/npm-global/lib/node_modules/@jr2/cli
66
+ instance: none — no jr2.config.ts walking up from cwd
67
+ node: v24.18.0
68
+ ```
69
+
70
+ `<version>` is the version of jr2 that you installed, such as `0.4.1`. The folder is in the global folder of your npm,
71
+ so it can be different.
72
+
73
+ ## Make the kind cluster
74
+
75
+ Run:
76
+
77
+ ```sh
78
+ kind create cluster --name jr2
79
+ ```
80
+
81
+ kind makes a cluster with one node. It sets your current kubectl context to the new cluster:
82
+
83
+ ```text
84
+ Creating cluster "jr2" ...
85
+ …
86
+ Set kubectl context to "kind-jr2"
87
+ …
88
+ ```
89
+
90
+ The context of the cluster is `kind-jr2`. `jr2 up` converges into the current kubectl context, so the next pages use
91
+ this cluster.
92
+
93
+ ## Check the Kubernetes version
94
+
95
+ Run:
96
+
97
+ ```sh
98
+ kubectl version
99
+ ```
100
+
101
+ The `Server Version` must be `v1.35` or later:
102
+
103
+ ```text
104
+ Client Version: v1.35.7
105
+ Kustomize Version: v5.7.1
106
+ Server Version: v1.36.1
107
+ ```
108
+
109
+ Your versions can be different. If the server version is earlier than `v1.35`, delete the cluster with
110
+ `kind delete cluster --name jr2`. Then install a newer kind release. Make the cluster again. `jr2 up` refuses an older
111
+ cluster with this message, where `<server version>` is the `Server Version` of the cluster:
112
+
113
+ ```text
114
+ refusing: kind-jr2 runs Kubernetes <server version>; jr2 needs Kubernetes 1.35 or newer (every Sandbox mounts jr2's runtime as an image volume, ADR-0037). Nothing was applied.
115
+ ```
116
+
117
+ ## What happened
118
+
119
+ You installed the jr2 CLI globally. It is the command that you use for each step of this tutorial. Each Instance also
120
+ installs its own copy of `@jr2/cli`. In an Instance folder, the global `jr2` gives the command to that copy. Thus the
121
+ version that runs is the version that the Instance pins. The glossary calls this a
122
+ [Handoff](../reference/glossary.md#handoff).
123
+
124
+ You also made a kind cluster. jr2 needs no setup in the cluster other than Kubernetes 1.35 or later. `jr2 up` puts in it
125
+ all that an Instance needs. [Converge](../concepts/converge.md) explains what `jr2 up` makes. The
126
+ [CLI reference](../reference/cli.md) gives each command and its options.
127
+
128
+ ## Next
129
+
130
+ [Create an Instance](create-an-instance.md).
@@ -0,0 +1,308 @@
1
+ ---
2
+ title: Add tools to the Sandbox
3
+ description: Put the programs that your Agents use into the Sandbox Image, or run a service in a User Container.
4
+ ---
5
+
6
+ # Add tools to the Sandbox
7
+
8
+ Put the programs that your [Agents](../reference/glossary.md#agent) and
9
+ [`command`](../reference/authoring-surface/command.md) [Effects](../reference/glossary.md#effect) use into the
10
+ [Sandbox Image](../reference/glossary.md#sandbox-image).
11
+
12
+ A [Workspace](../reference/glossary.md#workspace) runs its body in a [Sandbox](../reference/glossary.md#sandbox): a pod
13
+ of its own. The Sandbox Image is the image of the pod's `harness` container. The Agent's
14
+ [Working tools](../reference/glossary.md#working-tools) run in that container, and so do the `command` Effects and the
15
+ shell that you get with `kubectl exec`. Thus a program that is in the image is a program that they can run.
16
+
17
+ Use this table to choose:
18
+
19
+ | You want | Do this |
20
+ | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
21
+ | The same tools for each Workspace | Change `images/default/Dockerfile`. |
22
+ | Different tools for the Workspaces of one file | Put a docker context beside the workflow module, and name it in the `image` option. |
23
+ | An image that you build and push yourself | Write its registry ref in the `image` option. |
24
+ | A service that runs beside the Agent | Name its image in the `user` option. It runs in the [User Container](../reference/glossary.md#user-container). |
25
+
26
+ ## Add a tool to the default image
27
+
28
+ `jr2 init` writes `images/default/Dockerfile`. Each Workspace that names no `image` in
29
+ [`workspace()`](../reference/authoring-surface/workspace.md) uses it. This example adds pnpm to the file that `jr2 init`
30
+ wrote:
31
+
32
+ ```dockerfile
33
+ FROM node:24-slim
34
+
35
+ RUN apt-get update \
36
+ && apt-get install -y --no-install-recommends git ca-certificates \
37
+ && rm -rf /var/lib/apt/lists/*
38
+
39
+ # Your agents' toolchain goes here — compilers, CLIs, language servers, dotfiles.
40
+
41
+ # pnpm on the system PATH, at a fixed version, so that each Sandbox gets the same pnpm.
42
+ RUN npm install -g pnpm@10.9.0
43
+ ```
44
+
45
+ The example does not show the comments at the start of the file. Keep them in your file.
46
+
47
+ Install a tool at a fixed version, as the example does. Then each build of the image gets the same version.
48
+
49
+ Run [`jr2 up`](../reference/cli.md#up). It builds the image. Then it loads the image into kind, or pushes it to the
50
+ [`registry`](../reference/config.md#registry) of `jr2.config.ts`:
51
+
52
+ ```sh
53
+ jr2 up
54
+ ```
55
+
56
+ ```text
57
+ …
58
+ sandbox image "default": building jr2-sandbox-my-instance-default:fce23ddc3cce-amd64
59
+ no USER declared — the pod's uid-1000 fallback applies
60
+ kind load → cluster "jr2"
61
+ …
62
+ ```
63
+
64
+ - The tag is the hash of the files in the folder, then the architecture of the nodes. Your hash is different. A change
65
+ to a file in the folder changes it. The architecture is such as `amd64`.
66
+ - On kind, `jr2 up` loads the image into the cluster. The next line names the cluster.
67
+ - When no file in the folder changed, `jr2 up` does not build the image again. The line then ends with
68
+ `(fresh — build skipped; --force to rebuild anyway)`.
69
+ - `jr2 up` builds the Sandbox Images only when a registered [Machine](../reference/glossary.md#machine) has a
70
+ `workspace()`. Otherwise it prints `sandbox images: skipped (no registered Machine composes a Sandbox)`.
71
+
72
+ A Sandbox that runs now keeps its image. The next Sandbox gets the new image. `jr2 up` removes the old image at the end
73
+ of a later converge, when no Sandbox uses it. On a kind node, it keeps the old image for one more converge. It does not
74
+ remove an image from a registry. [`jr2 gc`](../reference/cli.md#gc) does the same work when you ask for it (see
75
+ [Clean up](clean-up.md)).
76
+
77
+ To see the tool, open a shell in a Sandbox (see [Look inside a Sandbox](look-inside-a-sandbox.md)), and run it:
78
+
79
+ ```sh
80
+ pnpm --version
81
+ ```
82
+
83
+ ```text
84
+ 10.9.0
85
+ ```
86
+
87
+ ## What the image must have
88
+
89
+ The image is yours. jr2 adds no layer to it, and does not read the Dockerfile. When the pod starts, jr2 mounts its own
90
+ runtime at `/opt/jr2`, and starts the [Harness](../reference/glossary.md#harness) from there. Thus:
91
+
92
+ - The `ENTRYPOINT` and the `CMD` of the image do not run. To run a process all the time, use a User Container (see
93
+ [Run a service beside the Agent](#run-a-service-beside-the-agent)).
94
+ - jr2 adds `/opt/jr2/bin` at the end of `PATH`. Thus a tool of the same name in your image comes first.
95
+ - The `USER` and the `HOME` of the image stay as you set them. When an image that `jr2 up` built sets no `USER`, the pod
96
+ runs as uid 1000, with `HOME=/home/jr2`.
97
+
98
+ The image must have these, or the Sandbox does not start:
99
+
100
+ - A glibc base no older than the glibc of jr2's node, such as a current Debian or Ubuntu. An Alpine base has musl, and
101
+ jr2's runtime does not run on it.
102
+ - `git` on the system `PATH`. The Harness clones, makes the [Worktrees](../reference/glossary.md#worktree) and commits
103
+ with it.
104
+ - A `HOME` that the image's `USER` can write.
105
+ - A `USER` that is a number and is not `0`, such as `USER 1000`. An image that `jr2 up` builds can also have no `USER`.
106
+ The `harness` container does not run as root.
107
+ - Nothing at `/opt/jr2` or `/work`, and nothing that listens on port `8080`.
108
+
109
+ The image does not need a git author. When the image sets none, a commit in the `harness` container has the author
110
+ `jr2 Agent <agent@jr2.invalid>`. jr2 puts this default at git's system level, under the image's own `/etc/gitconfig`, so
111
+ each git author that the image sets is used in its place: in `/etc/gitconfig`, in the `HOME` of its `USER`, or in
112
+ `GIT_AUTHOR_NAME` and `GIT_AUTHOR_EMAIL`. When the image sets `GIT_CONFIG_SYSTEM` or `GIT_CONFIG_NOSYSTEM`, or its git
113
+ reads another system file than `/etc/gitconfig`, jr2 does not set the default.
114
+
115
+ Before the Harness starts, a `preflight` step in the pod checks the image. When the check fails, the run faults. Read
116
+ the log of the step with `kubectl -n <namespace> logs <sandbox> -c preflight`. `<namespace>` is the namespace of the
117
+ Instance, such as `my-instance`. [Look inside a Sandbox](look-inside-a-sandbox.md) tells how to find `<sandbox>`.
118
+
119
+ ## Give one Workflow its own image
120
+
121
+ Put a docker context in a folder beside the workflow module. Name the folder in the `image` option of `workspace()`. In
122
+ this example, `workflows/pytest.ts` runs the tests of a Python [Repo](../reference/glossary.md#repo), with the image in
123
+ `workflows/python/`:
124
+
125
+ ```dockerfile
126
+ # A Sandbox Image for a Python project. The build context is this folder.
127
+ FROM python:3.13-slim
128
+
129
+ # git is part of the floor: the Harness clones, makes the Worktrees and commits with it.
130
+ RUN apt-get update \
131
+ && apt-get install -y --no-install-recommends git ca-certificates \
132
+ && rm -rf /var/lib/apt/lists/*
133
+
134
+ # The tools of the project.
135
+ RUN pip install --no-cache-dir pytest ruff
136
+ ```
137
+
138
+ ```ts
139
+ import { z } from "zod";
140
+ import { command, fail, isReady, jr2Setup, workspace, worktree, type Workspaced } from "@jr2/orchestrator";
141
+
142
+ const runInput = z.object({ branch: z.string() });
143
+ type BodyInput = Workspaced<z.infer<typeof runInput>, "app">;
144
+
145
+ // The Worktree that the tests run in.
146
+ const testTree = (context: BodyInput) => `${context.workspace.repos.app}/test` as const;
147
+
148
+ const body = jr2Setup({
149
+ types: {} as { input: BodyInput; context: BodyInput },
150
+ actors: {
151
+ cut: worktree(),
152
+ // python and pytest come from the Sandbox Image in ./python.
153
+ tests: command(["python", "-m", "pytest"], { timeout: "15m" }),
154
+ fail: fail(),
155
+ },
156
+ }).createMachine({
157
+ id: "pytest",
158
+ context: ({ input }) => input,
159
+ on: { "workspace.lost": ".lost" },
160
+ initial: "cutting",
161
+ states: {
162
+ cutting: {
163
+ invoke: {
164
+ src: "cut",
165
+ input: ({ context }) => ({ path: testTree(context), branch: context.branch }),
166
+ onDone: [{ guard: ({ event }) => isReady(event.output), target: "testing" }, { target: "notCut" }],
167
+ },
168
+ },
169
+ testing: {
170
+ invoke: {
171
+ src: "tests",
172
+ input: ({ context }) => ({ worktree: testTree(context) }),
173
+ onDone: [
174
+ {
175
+ guard: ({ event }) => event.output.outcome === "exited" && event.output.code === 0,
176
+ target: "passed",
177
+ },
178
+ { target: "failed" },
179
+ ],
180
+ },
181
+ },
182
+ passed: { type: "final" },
183
+ // Not final states: each one fails the run, and the run ends `failed`.
184
+ failed: { invoke: { src: "fail", input: { reason: "pytest did not pass" } } },
185
+ notCut: { invoke: { src: "fail", input: { reason: "the Worktree was not cut" } } },
186
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox was lost" } } },
187
+ },
188
+ });
189
+
190
+ export const machine = workspace(body, {
191
+ input: runInput,
192
+ // The docker context in the folder beside this file. jr2 up builds it.
193
+ image: import.meta.resolve("./python"),
194
+ repos: { app: "https://github.com/you/app.git" },
195
+ });
196
+ ```
197
+
198
+ - `import.meta.resolve("./python")` gives a `file:` URL to the folder. The folder is the build context. A `COPY` in the
199
+ Dockerfile reads from it.
200
+ - jr2 reads only the `.ts` files in `workflows/` as [Workflows](../reference/glossary.md#workflow). A folder there is
201
+ not a Workflow.
202
+ - An Agent in the body gets the same tools. Its Working tools run in the same container as the `command`.
203
+ - `jr2 up` finds the folder from the registered Machines, and builds it. Its line is
204
+ `sandbox image "python": building jr2-sandbox-my-instance-python:<hash>-<arch>`. The name of the folder is the name in
205
+ the tag.
206
+
207
+ A Machine that you register from a package, such as `task` from [`@jr2/machines`](../reference/machines.md), takes an
208
+ image from [`customize()`](../reference/authoring-surface/customize.md): `customize(task, { image })`. The value has the
209
+ same two forms, and it replaces the image of the Machine's `workspace()`. See
210
+ [Bind a shipped Machine's Open parts](bind-open-parts.md).
211
+
212
+ A Machine that you publish as an npm package carries its docker context in the package. See
213
+ [Publish a Machine as an npm package](publish-a-machine-as-an-npm-package.md).
214
+
215
+ ## Use an image from a registry
216
+
217
+ When you build and push the image yourself, write its ref in place of the `file:` URL:
218
+ `image: "registry.example.com/python-sandbox:1.0"`. A value that does not start with `file:` is a registry ref.
219
+
220
+ - jr2 does not build the image, does not read it, and does not remove it.
221
+ - The nodes of the cluster pull it. jr2 gives the pod no pull credential.
222
+ - The image must be for the architecture of the nodes.
223
+ - The image must have each item in [What the image must have](#what-the-image-must-have). jr2 does not supply uid 1000
224
+ for a registry image: an image with no `USER` runs as root, and the pod does not start.
225
+ - For each change, push a new tag. Then change the `image` value to the new tag. A node that has a tag does not pull it
226
+ again, unless the tag is `latest`.
227
+
228
+ ## Run a service beside the Agent
229
+
230
+ The User Container is a third container in the Sandbox pod. Use it for a process that must run without an Agent, such as
231
+ an sshd for a person. This image gives a person a shell beside the Agent:
232
+
233
+ ```dockerfile
234
+ # A User Container: a shell for a person, beside the Agent, on the same Worktrees.
235
+ FROM alpine:3.21
236
+
237
+ RUN apk add --no-cache git
238
+
239
+ # The Worktrees under /work belong to a different user. Tell git to trust them.
240
+ RUN git config --system --add safe.directory '*'
241
+
242
+ # jr2 does not replace this command. It must keep running: when it ends, the pod is not ready.
243
+ CMD ["sh", "-c", "while true; do sleep 3600; done"]
244
+ ```
245
+
246
+ Save it as `workflows/shell/Dockerfile`. Name it in the `workspace()` options with
247
+ `user: import.meta.resolve("./shell")`. `user` takes the same two forms as `image`, and `jr2 up` builds a `file:`
248
+ context in the same way. Open the shell with `kubectl -n <namespace> exec -it <sandbox> -c user -- sh`.
249
+
250
+ The User Container is not a second Sandbox Image:
251
+
252
+ - Its own `ENTRYPOINT` and `CMD` run. Its process must keep running: when it ends, the pod is not ready.
253
+ - jr2 gives it `/work`, which it can write, and `/repos` and `/opt/jr2`, which it can only read. jr2 gives it no other
254
+ mount, no environment variable and no command.
255
+ - It has no floor: an Alpine base is correct here. It runs as the `USER` of its image, and root is permitted.
256
+ - Its user can be different from the user that owns the Worktrees, for example root. Thus an image that runs git needs
257
+ `git config --system --add safe.directory '*'`, as the example has.
258
+ - The pod has one network. The User Container cannot listen on the ports of jr2's containers: `8080`, `8082` and
259
+ `15021`, and `8081` and `15001` on loopback.
260
+ - To give it a part of the [Size](../reference/glossary.md#size), write `user: { image, resources }`. See
261
+ [Size a Workspace](size-a-workspace.md).
262
+
263
+ A `push`, an `http` Effect whose body is a Worktree file, and a `command` that names an Effect secret run in a different
264
+ container, the [Sandbox Effector](../reference/glossary.md#sandbox-effector). By default it uses the Sandbox Image. The
265
+ `effector` option gives it an image of its own. See
266
+ [Run a command or call a URL with an Effect](run-a-command-or-call-a-url.md) and
267
+ [Push and sign a branch](push-and-sign-a-branch.md).
268
+
269
+ ## Rules
270
+
271
+ - `workspace()` refuses an `image` that is empty or not a string:
272
+ ``workspace(): `image` must be a non-empty string (got <value>) — either a `file:` URL to a docker context this module ships (`import.meta.resolve("./image")`) or a registry ref (ADR-0037).``
273
+ - `workspace()` and `customize()` refuse a `user` that is not an image or `{ image, resources? }`. `<where>` is
274
+ `workspace()` or `customize()`:
275
+ ``<where>: `user` must be a non-empty string (an image), or { image, resources? } (got <value>) — either a `file:` URL to a docker context this module ships (`import.meta.resolve("./image")`) or a registry ref (ADR-0037, ADR-0060).``
276
+ and `<where>: user.<key> is not accepted — the User Container is { image, resources? } (ADR-0005, ADR-0060)`.
277
+ - `customize()` refuses `image` or `user` for a Machine that has no `workspace()`:
278
+ ``customize(): `image`/`user` say what a SANDBOX is made of, how big it is and which Repos it attaches, and machine "<id>" composes none — only a workspace() wrapper carries those seats, that Size and those slots (ADR-0049, ADR-0037, ADR-0051, ADR-0060).``
279
+ - `jr2 up` refuses a `file:` URL to a folder that does not exist. `<path>` is the folder:
280
+ ``the Sandbox Image context <path> cannot be read (<code>) — a `workspace()` names its image with `import.meta.resolve("./<dir>")`, so that directory must exist beside the Machine's own module (ADR-0037/0049).``
281
+ - `jr2 up` refuses an `images/default` folder that has no `Dockerfile`:
282
+ ``the Instance's `images/default` has no Dockerfile (<path>) — that directory IS a build context (ADR-0037), and it is the Sandbox Image every `workspace()` that names none falls back to.``
283
+ - An image that `jr2 up` built, with a `USER` that is not a number or is `0`, faults the run before the pod is made.
284
+ `<image>` is the `image` value, or `default`:
285
+ ``the Sandbox Image "<image>" declares `USER <user>`, which cannot run a jr2 seat: every jr2-owned container is `runAsNonRoot` with no `runAsUser`, so the kubelet needs a NUMERIC non-zero uid it can check without reading the image (ADR-0005). Change the Dockerfile's last `USER` to that uid (e.g. `USER 1000`, or drop the line entirely and jr2 supplies uid 1000 with a writable HOME — ADR-0037), then re-run `jr2 up`.``
286
+ - A registry image that runs as root faults the run. The text starts with
287
+ `Sandbox "<sandbox>" cannot start: its image runs as ROOT, and every jr2-owned seat is hardened with runAsNonRoot (ADR-0005).`
288
+ - An image that does not have the floor stops the `preflight` step. Its log says:
289
+ `jr2: this Sandbox Image does not meet the floor (ADR-0037): a glibc base no older than jr2's node (musl is out entirely), git on the system PATH, a writable HOME for the image's USER, and /opt/jr2 + /work + :8080 unclaimed. jr2 vendors the rest.`
290
+ The run faults with a text that starts with
291
+ ``Sandbox "<sandbox>" never reached Ready (last phase: <phase>) — if its Sandbox Image is new, check the preflight: `kubectl logs <sandbox> -c preflight` ``.
292
+ - The [Orchestrator](../reference/glossary.md#orchestrator) refuses a `file:` image that the last `jr2 up` did not
293
+ build. Run `jr2 up` again:
294
+ ``no Sandbox Image for <url> (context digest <digest>) — this instance's last converge built <n> image(s), none of them this one. Re-run `jr2 up`: it walks the registered Machines and builds every `file:` context they carry (ADR-0037/0049).``
295
+
296
+ ## Read next
297
+
298
+ - [Workspaces](../concepts/workspaces.md): the pod, the Sandbox Image and the User Container.
299
+ - [Converge](../concepts/converge.md): how `jr2 up` builds and loads the images.
300
+ - [Look inside a Sandbox](look-inside-a-sandbox.md)
301
+ - Reference: [`workspace`](../reference/authoring-surface/workspace.md),
302
+ [`SandboxOptions`](../reference/authoring-surface/type-sandboxoptions.md),
303
+ [`UserContainer`](../reference/authoring-surface/type-usercontainer.md), [`jr2 up`](../reference/cli.md#up)
304
+ - [ADR-0037](../reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md): the Instance
305
+ builds its Sandbox Images, and jr2 injects the Harness.
306
+ - [ADR-0005](../reference/decisions/0005-sandbox-pod-composition.md): the containers of the Sandbox pod.
307
+ - [ADR-0049](../reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md): a Machine carries its
308
+ images.