@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,478 @@
1
+ ---
2
+ title: Agents and Turns
3
+ description: What an Agent is, what one Turn of an Agent holds, how a Turn ends, and what jr2 does when a Turn fails.
4
+ ---
5
+
6
+ # Agents and Turns
7
+
8
+ An [Agent](../reference/glossary.md#agent) is a model with instructions, which a
9
+ [Machine](../reference/glossary.md#machine) invokes to do the work of a state. Its definition tells who it is: its
10
+ model, its instructions, and what it can do to the [Workspace](../reference/glossary.md#workspace). A
11
+ [Turn](../reference/glossary.md#turn) is one answer of the Agent to one state. It holds the prompt of the state, the
12
+ work of the Agent, and its pick from its [Menu](../reference/glossary.md#menu). This page tells what a definition holds,
13
+ what a state sets for one Turn, and how a Turn ends.
14
+
15
+ ## Why the work is in Turns
16
+
17
+ A long conversation in which a model decides all the work is difficult to review and difficult to control. In jr2, each
18
+ state of the Machine asks the Agent for one thing. The Agent does that thing, then picks an event. The Machine decides
19
+ where the run goes next. Thus the Agent does one thing at a time, and the [Console](../reference/glossary.md#console)
20
+ shows the state of each Turn.
21
+
22
+ A model cannot correctly control some parts of a Turn, so jr2 controls them. jr2 sets where the Agent works and how its
23
+ Turn ends. It also decides what to do when a Turn does not end. You do not write that code, so you cannot forget it.
24
+
25
+ ## The definition
26
+
27
+ An Agent is an [`agent()`](../reference/authoring-surface/agent.md) under `actors` in
28
+ [`jr2Setup`](../reference/authoring-surface/jr2setup.md): `actors: { coder: agent({ … }) }`. The key is the name of the
29
+ Agent. A state invokes it with `src: "coder"`. The definition is plain data, and it has these fields:
30
+
31
+ | Field | What it tells |
32
+ | --------------- | -------------------------------------------------------------------------------------- |
33
+ | `model` | The model, as `<provider>/<model id>`. It is required. |
34
+ | `instructions` | Who the Agent is and how it works. The model reads them on each Turn. |
35
+ | `workspace` | What the Agent can do to the Workspace: `"write"` (the default), `"read"` or `"none"`. |
36
+ | `thinkingLevel` | How hard the model thinks, when the state sets no other level. The default is `"off"`. |
37
+ | `description` | A short text for the people who read the Machine. The model does not read it. |
38
+
39
+ [`AgentDefinition`](../reference/authoring-surface/type-agentdefinition.md) gives each field.
40
+
41
+ An Agent belongs to the Machine that holds it. Two Machines in one run can each hold an Agent named `coder`, and the two
42
+ are different Agents. A Machine that you get from a package can leave its model
43
+ [`open`](../reference/authoring-surface/open.md), for you to bind with
44
+ [`customize()`](../reference/authoring-surface/customize.md). [Composition](composition.md) tells how.
45
+
46
+ `instructions` and `workspace` are the identity of the Agent. Only the definition sets them. A state cannot change them
47
+ for one Turn, because then the name of the Agent would not tell what it is.
48
+
49
+ ## The Working tools
50
+
51
+ The [Working tools](../reference/glossary.md#working-tools) are the file and shell tools of an Agent: read, write, edit,
52
+ bash, grep and glob. The [Harness](../reference/glossary.md#harness) runs them in its own container. Each program that
53
+ they start, and the file I/O of read, write and edit, runs confined with Landlock. It can do all that the user of the
54
+ container can do, but it cannot read what the Harness holds. [Secrets and trust](secrets-and-trust.md) tells why. The
55
+ `workspace` field selects the Working tools:
56
+
57
+ - `"write"` gives all the Working tools.
58
+ - `"read"` gives no write tool and no edit tool. The Agent keeps bash, so a command can still write a file. A review
59
+ Turn whose `cwd` is the review [Worktree](../reference/glossary.md#worktree) cannot move the branch with a change.
60
+ [Workspaces](workspaces.md) tells how.
61
+ - `"none"` gives no Working tools. The Agent reads its prompt and picks from its Menu. This is a Menu-only Agent.
62
+
63
+ The field also tells where the Turn runs. An Agent with `"write"` or `"read"` works in the
64
+ [Sandbox](../reference/glossary.md#sandbox) of a Workspace, so a state invokes it in the body of a
65
+ [`workspace()`](../reference/authoring-surface/workspace.md). A Menu-only Agent has no Sandbox. Its Turn runs on the
66
+ [Instance Harness](../reference/glossary.md#instance-harness), also when a `workspace()` holds it.
67
+ [Architecture](architecture.md) shows where each Harness runs.
68
+
69
+ ## What a state sets for one Turn
70
+
71
+ The `input` of the invoke is the Turn. It has five keys, and no other:
72
+
73
+ - **The [Frame](../reference/glossary.md#frame): `prompt` and `cwd`.** The prompt tells what this Turn is about. `cwd`
74
+ is the directory where the Working tools work. A definition cannot hold a `cwd`, because a Worktree exists only after
75
+ a run cuts it. Under a Workspace with [Repo Slots](../reference/glossary.md#repo-slot), a Turn of an Agent with
76
+ Working tools states its `cwd`. A Turn that wants `/work` states it too. There is no default, because a search in
77
+ `/work` hits `default/`, and a relative write lands outside each Worktree.
78
+ - **The [Dials](../reference/glossary.md#dials): `model` and `thinkingLevel`.** They tell how hard the Agent works on
79
+ this Turn, and they replace the values of the definition for this Turn only. The Agent stays the same Agent.
80
+ - **`continue`.** It tells if the Turn continues the conversation of the Agent. See
81
+ [Continue a conversation](#continue-a-conversation).
82
+
83
+ The state writes the input as a function of its context. Thus each Turn can have its own prompt and its own directory.
84
+
85
+ ## An example
86
+
87
+ In this [Workflow](../reference/glossary.md#workflow), a coder fixes the tests of a
88
+ [Repo](../reference/glossary.md#repo), and a Menu-only checker reads the coder's summary. When the checker asks for
89
+ changes, the coder continues its conversation and thinks harder on that Turn:
90
+
91
+ **Anthropic**
92
+
93
+ ```ts
94
+ import { z } from "zod";
95
+ import { assign } from "xstate";
96
+ import { agent, defineEvent, fail, isReady, jr2Setup, workspace, worktree, type Workspaced } from "@jr2/orchestrator";
97
+
98
+ const finish = defineEvent({
99
+ name: "finish",
100
+ description: "Call this when `node --test` passes and you committed the fix. Say what you changed.",
101
+ input: z.object({ summary: z.string() }),
102
+ });
103
+ const approve = defineEvent({
104
+ name: "approve",
105
+ description: "Call this when the summary shows a complete fix.",
106
+ input: z.object({}),
107
+ });
108
+ const requestChanges = defineEvent({
109
+ name: "request_changes",
110
+ description: "Call this when the fix is not complete. Say what is missing.",
111
+ input: z.object({ notes: z.string() }),
112
+ });
113
+
114
+ const runInput = z.object({ branch: z.string() });
115
+ type BodyInput = Workspaced<z.infer<typeof runInput>, "app">;
116
+ type Context = BodyInput & { summary: string; notes: string };
117
+
118
+ // The Worktree of each Turn of the coder.
119
+ const fixTree = (context: BodyInput) => `${context.workspace.repos.app}/fix` as const;
120
+
121
+ const body = jr2Setup({
122
+ types: {} as { input: BodyInput; context: Context },
123
+ events: [finish, approve, requestChanges],
124
+ actors: {
125
+ // The definition: who the Agent is. It is the same on every Turn.
126
+ coder: agent({
127
+ model: "anthropic/claude-haiku-5-5",
128
+ instructions: "You fix failing tests. You change no test.",
129
+ }),
130
+ // A Menu-only Agent: no Working tools. It reads its prompt and picks.
131
+ checker: agent({
132
+ model: "anthropic/claude-haiku-5-5",
133
+ instructions: "You read the summary of a fix, and you decide if the fix is complete.",
134
+ workspace: "none",
135
+ thinkingLevel: "low",
136
+ }),
137
+ cut: worktree(),
138
+ fail: fail(),
139
+ },
140
+ }).createMachine({
141
+ id: "fix",
142
+ context: ({ input }) => ({ ...input, summary: "", notes: "" }),
143
+ on: { "workspace.lost": ".lost", "agent.fault": ".failed" },
144
+ initial: "cutting",
145
+ states: {
146
+ // The Workspace only clones. The Machine cuts the Worktree that the Agent works in.
147
+ cutting: {
148
+ invoke: {
149
+ src: "cut",
150
+ input: ({ context }) => ({ path: fixTree(context), branch: context.branch }),
151
+ onDone: [{ guard: ({ event }) => isReady(event.output), target: "coding" }, { target: "notCut" }],
152
+ },
153
+ },
154
+ coding: {
155
+ invoke: {
156
+ src: "coder",
157
+ // The Frame (prompt and cwd) and continue. This Turn starts the coder's conversation.
158
+ input: ({ context }) => ({
159
+ prompt: "Make `node --test` pass, then commit.",
160
+ cwd: fixTree(context),
161
+ continue: true,
162
+ }),
163
+ },
164
+ on: { finish: { target: "checking", actions: assign({ summary: ({ event }) => event.summary }) } },
165
+ },
166
+ checking: {
167
+ invoke: { src: "checker", input: ({ context }) => ({ prompt: `Is this fix complete?\n\n${context.summary}` }) },
168
+ on: {
169
+ approve: "done",
170
+ request_changes: { target: "fixing", actions: assign({ notes: ({ event }) => event.notes }) },
171
+ },
172
+ },
173
+ fixing: {
174
+ invoke: {
175
+ src: "coder",
176
+ // The same conversation as in coding, with a Dial: the coder thinks harder on this Turn.
177
+ input: ({ context }) => ({
178
+ prompt: `The fix is not complete: ${context.notes}\nFix it, then commit.`,
179
+ cwd: fixTree(context),
180
+ continue: true,
181
+ thinkingLevel: "high",
182
+ }),
183
+ },
184
+ on: { finish: { target: "checking", actions: assign({ summary: ({ event }) => event.summary }) } },
185
+ },
186
+ done: { type: "final" },
187
+ notCut: { invoke: { src: "fail", input: { reason: "the Worktree was not cut" } } },
188
+ failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
189
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
190
+ },
191
+ });
192
+
193
+ export const machine = workspace(body, {
194
+ input: runInput,
195
+ repos: { app: "https://github.com/you/app.git" },
196
+ });
197
+ ```
198
+
199
+ **Local**
200
+
201
+ ```ts
202
+ import { z } from "zod";
203
+ import { assign } from "xstate";
204
+ import { agent, defineEvent, fail, isReady, jr2Setup, workspace, worktree, type Workspaced } from "@jr2/orchestrator";
205
+
206
+ const finish = defineEvent({
207
+ name: "finish",
208
+ description: "Call this when `node --test` passes and you committed the fix. Say what you changed.",
209
+ input: z.object({ summary: z.string() }),
210
+ });
211
+ const approve = defineEvent({
212
+ name: "approve",
213
+ description: "Call this when the summary shows a complete fix.",
214
+ input: z.object({}),
215
+ });
216
+ const requestChanges = defineEvent({
217
+ name: "request_changes",
218
+ description: "Call this when the fix is not complete. Say what is missing.",
219
+ input: z.object({ notes: z.string() }),
220
+ });
221
+
222
+ const runInput = z.object({ branch: z.string() });
223
+ type BodyInput = Workspaced<z.infer<typeof runInput>, "app">;
224
+ type Context = BodyInput & { summary: string; notes: string };
225
+
226
+ // The Worktree of each Turn of the coder.
227
+ const fixTree = (context: BodyInput) => `${context.workspace.repos.app}/fix` as const;
228
+
229
+ const body = jr2Setup({
230
+ types: {} as { input: BodyInput; context: Context },
231
+ events: [finish, approve, requestChanges],
232
+ actors: {
233
+ // The definition: who the Agent is. It is the same on every Turn.
234
+ coder: agent({
235
+ model: "local/qwen3.6-35b-a3b",
236
+ instructions: "You fix failing tests. You change no test.",
237
+ }),
238
+ // A Menu-only Agent: no Working tools. It reads its prompt and picks.
239
+ checker: agent({
240
+ model: "local/qwen3.6-35b-a3b",
241
+ instructions: "You read the summary of a fix, and you decide if the fix is complete.",
242
+ workspace: "none",
243
+ thinkingLevel: "low",
244
+ }),
245
+ cut: worktree(),
246
+ fail: fail(),
247
+ },
248
+ }).createMachine({
249
+ id: "fix",
250
+ context: ({ input }) => ({ ...input, summary: "", notes: "" }),
251
+ on: { "workspace.lost": ".lost", "agent.fault": ".failed" },
252
+ initial: "cutting",
253
+ states: {
254
+ // The Workspace only clones. The Machine cuts the Worktree that the Agent works in.
255
+ cutting: {
256
+ invoke: {
257
+ src: "cut",
258
+ input: ({ context }) => ({ path: fixTree(context), branch: context.branch }),
259
+ onDone: [{ guard: ({ event }) => isReady(event.output), target: "coding" }, { target: "notCut" }],
260
+ },
261
+ },
262
+ coding: {
263
+ invoke: {
264
+ src: "coder",
265
+ // The Frame (prompt and cwd) and continue. This Turn starts the coder's conversation.
266
+ input: ({ context }) => ({
267
+ prompt: "Make `node --test` pass, then commit.",
268
+ cwd: fixTree(context),
269
+ continue: true,
270
+ }),
271
+ },
272
+ on: { finish: { target: "checking", actions: assign({ summary: ({ event }) => event.summary }) } },
273
+ },
274
+ checking: {
275
+ invoke: { src: "checker", input: ({ context }) => ({ prompt: `Is this fix complete?\n\n${context.summary}` }) },
276
+ on: {
277
+ approve: "done",
278
+ request_changes: { target: "fixing", actions: assign({ notes: ({ event }) => event.notes }) },
279
+ },
280
+ },
281
+ fixing: {
282
+ invoke: {
283
+ src: "coder",
284
+ // The same conversation as in coding, with a Dial: the coder thinks harder on this Turn.
285
+ input: ({ context }) => ({
286
+ prompt: `The fix is not complete: ${context.notes}\nFix it, then commit.`,
287
+ cwd: fixTree(context),
288
+ continue: true,
289
+ thinkingLevel: "high",
290
+ }),
291
+ },
292
+ on: { finish: { target: "checking", actions: assign({ summary: ({ event }) => event.summary }) } },
293
+ },
294
+ done: { type: "final" },
295
+ notCut: { invoke: { src: "fail", input: { reason: "the Worktree was not cut" } } },
296
+ failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
297
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
298
+ },
299
+ });
300
+
301
+ export const machine = workspace(body, {
302
+ input: runInput,
303
+ repos: { app: "https://github.com/you/app.git" },
304
+ });
305
+ ```
306
+
307
+ The two Agents use the model of the tab. The `coding` and `fixing` states invoke the same Agent with different prompts,
308
+ and only `fixing` sets a Dial. The checker's Turn has no `cwd`, because it has no Working tools.
309
+
310
+ ## One Turn
311
+
312
+ **One Turn, from the state that invokes the Agent to the answer to its pick**
313
+
314
+ - **Orchestrator**: the state that invokes the Agent
315
+ - **Harness**: runs the Turn
316
+ - **model provider**: the model of the Agent
317
+ - Orchestrator → Harness: the definition, the Frame and the Dials
318
+ - Harness → model provider: the instructions, the prompt and the Briefing
319
+ - zero or more times
320
+ - model provider → Harness: a Working tool call
321
+ - Harness → model provider: its result
322
+ - model provider → Harness: a pick from the Menu
323
+ - Harness → Orchestrator: the pick, as an event
324
+ - Orchestrator → Harness: the answer to the pick
325
+ - Harness → model provider: the answer
326
+
327
+ The [Briefing](../reference/glossary.md#briefing) is the text that jr2 itself adds. The loop can run zero times: a
328
+ Menu-only Agent has no Working tools. The answer to the pick tells the model if its Turn is over.
329
+
330
+ ## How a Turn ends
331
+
332
+ A Turn belongs to the state that invoked the Agent. When that state exits, the Turn is over, for any cause: a pick of
333
+ the Agent, a [Gate](../reference/glossary.md#gate), a timer, or a `CANCEL`. jr2 then stops the work of the Agent on that
334
+ Turn, and it does not prompt that Turn again.
335
+
336
+ Usually, a pick of the Agent moves the Machine out of the state, and that ends the Turn. A pick whose target stays in
337
+ the state does not end the Turn. Then the Agent can pick again, one pick at a time. [The Menu](the-menu.md) tells which
338
+ picks an Agent can make, and when.
339
+
340
+ An `agent()` actor never finishes, so an `onDone` on its invoke never runs. Give the Agent a pick, such as `finish`, and
341
+ route on it.
342
+
343
+ ## Continue a conversation
344
+
345
+ Without `continue`, each Turn starts a new conversation. The model knows only the instructions, the prompt and the
346
+ Briefing. Thus the prompt must give all that the Agent needs to know.
347
+
348
+ With `continue: true`, the Turn continues the one conversation of this Agent in this Machine instance. Each state of the
349
+ Machine that invokes the Agent with `continue: true` uses the same conversation. A Turn without `continue` does not join
350
+ it. Thus, in the example, `coding` sets `continue: true` too, so that `fixing` continues the conversation of `coding`.
351
+
352
+ A Turn can join only a conversation that an earlier Turn started with `continue: true`. Thus, in a retry loop, put
353
+ `continue: true` on each Turn, also on the first. If the first Turn has no `continue`, attempt 2 does not see attempt 1.
354
+ A first Turn with `continue: true` gets no second start on a Runaway (see [When a Turn fails](#when-a-turn-fails)). jr2
355
+ accepts this, so that attempt 2 sees attempt 1.
356
+
357
+ `continue` is the literal `true`, not a `boolean`, so `continue: context.attempts > 0` is a type error. A state that
358
+ always starts a clean conversation leaves `continue` off. Spread it into the input only when a state must start a clean
359
+ conversation on some Turns only: `...(context.clean ? {} : { continue: true as const })`. A clean Turn does not start
360
+ the continued conversation again: the next Turn with `continue: true` joins the earlier one.
361
+
362
+ The conversation has no name that you write. jr2 makes its id from the run, the Machine instance and the Agent. Thus two
363
+ Agents never share a conversation. Two workers of a [Pool](../reference/glossary.md#pool) never share one either,
364
+ because each worker is a Machine instance of its own.
365
+
366
+ When jr2 sends [`agent.fault`](../reference/mechanism-events.md#agent-fault) for a continued conversation, it does not
367
+ continue that conversation again. The next Turn with `continue: true` starts a new one. Its prompt must then give the
368
+ full task again, because jr2 cannot write that prompt for you. A Harness restart is the only exception: the restarted
369
+ Harness keeps the conversation, so the next Turn continues it.
370
+
371
+ ## The Briefing
372
+
373
+ The Briefing is the text that jr2 itself gives the model. It tells facts that a correct Agent needs and cannot find for
374
+ itself. It tells nothing about the task: the prompt tells the task. It has two parts:
375
+
376
+ - **The standing part** comes after the instructions, and it is the same on each Turn. It tells how the Agent acts on
377
+ the run: with a pick from its Menu. It also tells the CPUs and the [Size](../reference/glossary.md#size) of the
378
+ Sandbox, or that a Menu-only Agent has no Working tools.
379
+ - **The Turn part** comes after the prompt. It tells the directory of the Turn, its
380
+ [Allowed picks](../reference/glossary.md#allowed-picks), and the notices. [The Menu](the-menu.md) tells what the
381
+ Allowed picks are. When they change during the Turn, the Harness tells them to the model again. When an Allowed pick
382
+ carries a [Chart](../reference/glossary.md#chart), the Turn part also tells how a Chart runs (see
383
+ [Charts](charts.md)).
384
+
385
+ A notice tells a Turn what happened before it. For example: the conversation is new and the earlier context is gone, or
386
+ the processes of the Sandbox stopped at its memory limit. A notice about a conversation goes to the next Turn of that
387
+ conversation. A notice about the Workspace goes to each conversation that was in the Workspace when the processes
388
+ stopped:
389
+
390
+ - A Turn that is open hears it before its next model request.
391
+ - A continued conversation hears it at its next Turn.
392
+ - The next Turn of the Agent whose Turn the stop cut hears it, also when that Turn is fresh.
393
+
394
+ A conversation hears each notice one time. A conversation whose own bash call already told it about the stop does not
395
+ hear the notice. A conversation that starts after the stop does not hear it, except the next Turn of the Agent whose
396
+ Turn the stop cut.
397
+
398
+ You cannot turn the Briefing off. It contains only facts that make the Agent work better. An `instructions` that tells
399
+ the same fact again does no harm.
400
+
401
+ ## When a Turn fails
402
+
403
+ jr2 tries to recover a Turn before it tells the Machine. When it cannot recover the Turn, it sends one event,
404
+ `agent.fault`, to the Machine. The Machine decides what to do next: the state that invokes the Agent, or a state above
405
+ it, routes `agent.fault`. `jr2 check` refuses a Machine without that route. In a [Chart](charts.md) the route is
406
+ optional. jr2 recovers from these failures:
407
+
408
+ - **The Harness or the model provider fails.** The Harness tries the model provider again during the Turn. When the Turn
409
+ still fails, jr2 sends `agent.fault`. When a Harness restarts while the state is busy, jr2 starts the Turn again on
410
+ the same conversation, and it sends no fault. If the restarted Harness cannot read the conversation, the Turn starts a
411
+ new one, and the Briefing tells the model.
412
+ - **The Agent stops with no pick.** When the model stops and its Turn can still make a pick, jr2 prompts it again. It
413
+ does this two times at most. Then it sends `agent.fault`.
414
+ - **The Turn is a [Runaway](../reference/glossary.md#runaway).**
415
+
416
+ A Runaway is a Turn that does not end by itself. The Harness ends a Turn when it makes the same tool call four times in
417
+ sequence, with the same arguments. It also ends a Turn of more than 256 [steps](../reference/glossary.md#step) on one
418
+ prompt. A step is one tool call that starts while the Turn is live: a call of a Working tool, or a pick. A call that
419
+ does not run is a step too, for example a call of a tool that does not exist. A call after a pick that ended the Turn is
420
+ not a step. Then jr2 starts the Turn again one time, with the same prompt, on a new conversation. When that Turn is also
421
+ a Runaway, jr2 sends `agent.fault`. jr2 does not start the Turn again when it continues a conversation, or when the
422
+ Agent already made a pick in it. Then it sends `agent.fault` immediately.
423
+
424
+ You cannot change these limits. They are a part of jr2.
425
+
426
+ ## Compaction
427
+
428
+ A long Turn can fill the context window of the model. Then the model cannot answer, and the Turn fails. To prevent this,
429
+ the Harness takes a [Compaction](../reference/glossary.md#compaction) during the Turn. Before it sends the conversation
430
+ to the model, it examines the size of the context. When the context is near its limit, the Harness replaces the earlier
431
+ part of the conversation with a summary. The recent part stays. The Turn continues with the smaller context.
432
+
433
+ The summary comes from the model and the thinking level of the Turn. A Compaction changes only what the model sees. The
434
+ history of the conversation keeps all that was said.
435
+
436
+ You do not set when a Compaction occurs. jr2 calculates it from the context window and the output limit of the model. A
437
+ model of a catalog provider, such as `anthropic`, has a known context window. A custom provider gets it from
438
+ [`harness.provider.contextWindow`](../reference/config.md#harness-provider-contextwindow) or from the `contextWindow` of
439
+ the model in `models`. A model with no context window gets no Compaction.
440
+
441
+ ## Rules
442
+
443
+ - `model` is required in each definition. `jr2 up` refuses a model that is still `open`.
444
+ - The input of a Turn has only `prompt`, `cwd`, `model`, `thinkingLevel` and `continue`. jr2 refuses a Turn with a
445
+ different key.
446
+ - A Turn cannot set `instructions` or `workspace`.
447
+ - `cwd` is an absolute path. The Harness refuses a Turn with a relative `cwd`.
448
+ - Under a Workspace with Repo Slots, each Turn of an Agent with Working tools sets `cwd`. jr2 refuses the Turn without
449
+ it.
450
+ - An Agent with `"write"` or `"read"` runs in the body of a `workspace()`. jr2 refuses its Turn outside one.
451
+ - `jr2 up` sees only the models of the definitions. It cannot see a model that a Turn sets as a Dial. The Harness
452
+ refuses a model that it cannot find when the Turn starts.
453
+ - A Turn ends when the state that invoked the Agent exits.
454
+ - After `agent.fault` for a conversation, jr2 does not continue it, except after a Harness restart.
455
+
456
+ [Set an Agent's access and Dials](../guides/set-an-agents-access-and-dials.md) gives the exact text of each refusal.
457
+
458
+ ## Read next
459
+
460
+ - [Set an Agent's access and Dials](../guides/set-an-agents-access-and-dials.md)
461
+ - [The Menu](the-menu.md), [Workspaces](workspaces.md) and [Architecture](architecture.md)
462
+ - Reference: [`agent`](../reference/authoring-surface/agent.md),
463
+ [`AgentDefinition`](../reference/authoring-surface/type-agentdefinition.md),
464
+ [`ThinkingLevel`](../reference/authoring-surface/type-thinkinglevel.md),
465
+ [`agent.fault`](../reference/mechanism-events.md#agent-fault) and
466
+ [`harness.provider`](../reference/config.md#harness-provider)
467
+ - [ADR-0018](../reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md): an Agent is a
468
+ definition, and a Turn can set its Dials
469
+ - [ADR-0028](../reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md): what an
470
+ Agent can do to the Workspace is a part of its definition
471
+ - [ADR-0057](../reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md): a Turn is its
472
+ Frame, its Dials, and `continue`
473
+ - [ADR-0024](../reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md): a Turn ends with the
474
+ state that asked for it
475
+ - [ADR-0016](../reference/decisions/0016-agent-turn-mechanics-are-internal.md): jr2 owns the mechanics of a Turn
476
+ - [ADR-0062](../reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md): the Briefing
477
+ - [ADR-0035](../reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md): a Runaway
478
+ - [ADR-0036](../reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md): Compaction