@jr2/orchestrator 0.4.1 → 0.5.1

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 (327) 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 +442 -0
  10. package/docs/concepts/architecture.md +230 -0
  11. package/docs/concepts/charts.md +143 -0
  12. package/docs/concepts/composition.md +357 -0
  13. package/docs/concepts/converge.md +254 -0
  14. package/docs/concepts/durable-runs.md +189 -0
  15. package/docs/concepts/effects.md +603 -0
  16. package/docs/concepts/gates.md +208 -0
  17. package/docs/concepts/machines-and-workflows.md +289 -0
  18. package/docs/concepts/pools-and-sources.md +230 -0
  19. package/docs/concepts/secrets-and-trust.md +222 -0
  20. package/docs/concepts/the-menu.md +378 -0
  21. package/docs/concepts/workspaces.md +678 -0
  22. package/docs/get-started/a-model-decides.md +563 -0
  23. package/docs/get-started/an-agent-in-a-sandbox.md +381 -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 +922 -0
  27. package/docs/get-started/install.md +126 -0
  28. package/docs/guides/add-tools-to-the-sandbox.md +295 -0
  29. package/docs/guides/answer-a-gate.md +304 -0
  30. package/docs/guides/bind-open-parts.md +223 -0
  31. package/docs/guides/cancel-a-run.md +146 -0
  32. package/docs/guides/clean-up.md +206 -0
  33. package/docs/guides/fix-a-failed-converge.md +361 -0
  34. package/docs/guides/give-the-cluster-git-credentials.md +222 -0
  35. package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
  36. package/docs/guides/let-an-agent-write-a-chart.md +226 -0
  37. package/docs/guides/look-inside-a-sandbox.md +174 -0
  38. package/docs/guides/mirror-the-kit-images.md +176 -0
  39. package/docs/guides/move-from-kind-to-a-shared-cluster.md +302 -0
  40. package/docs/guides/open-the-console.md +91 -0
  41. package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
  42. package/docs/guides/push-and-sign-a-branch.md +486 -0
  43. package/docs/guides/run-a-chart-by-name.md +270 -0
  44. package/docs/guides/run-a-command-or-call-a-url.md +544 -0
  45. package/docs/guides/run-one-worker-per-item.md +321 -0
  46. package/docs/guides/set-an-agents-access-and-dials.md +375 -0
  47. package/docs/guides/size-a-workspace.md +204 -0
  48. package/docs/guides/start-a-run-from-a-run.md +237 -0
  49. package/docs/guides/start-a-run.md +207 -0
  50. package/docs/guides/upgrade-the-kit-version.md +240 -0
  51. package/docs/guides/use-a-hosted-provider.md +208 -0
  52. package/docs/guides/use-a-local-model.md +313 -0
  53. package/docs/guides/watch-a-run.md +326 -0
  54. package/docs/guides/write-a-workflow.md +318 -0
  55. package/docs/index.md +44 -0
  56. package/docs/llms.txt +216 -0
  57. package/docs/reference/authoring-surface/agent.md +128 -0
  58. package/docs/reference/authoring-surface/answer.md +140 -0
  59. package/docs/reference/authoring-surface/arg.md +60 -0
  60. package/docs/reference/authoring-surface/basic.md +62 -0
  61. package/docs/reference/authoring-surface/bearer.md +53 -0
  62. package/docs/reference/authoring-surface/chartschema.md +23 -0
  63. package/docs/reference/authoring-surface/chartschemafor.md +48 -0
  64. package/docs/reference/authoring-surface/command.md +191 -0
  65. package/docs/reference/authoring-surface/customize.md +64 -0
  66. package/docs/reference/authoring-surface/defineconfig.md +41 -0
  67. package/docs/reference/authoring-surface/defineevent.md +114 -0
  68. package/docs/reference/authoring-surface/dispatch.md +126 -0
  69. package/docs/reference/authoring-surface/fail.md +83 -0
  70. package/docs/reference/authoring-surface/file.md +122 -0
  71. package/docs/reference/authoring-surface/frompick.md +277 -0
  72. package/docs/reference/authoring-surface/http.md +159 -0
  73. package/docs/reference/authoring-surface/isfailure.md +58 -0
  74. package/docs/reference/authoring-surface/jr2setup.md +237 -0
  75. package/docs/reference/authoring-surface/open.md +74 -0
  76. package/docs/reference/authoring-surface/openbody.md +86 -0
  77. package/docs/reference/authoring-surface/paramsof.md +125 -0
  78. package/docs/reference/authoring-surface/pool.md +186 -0
  79. package/docs/reference/authoring-surface/push.md +112 -0
  80. package/docs/reference/authoring-surface/secret.md +118 -0
  81. package/docs/reference/authoring-surface/sentby.md +83 -0
  82. package/docs/reference/authoring-surface/source.md +51 -0
  83. package/docs/reference/authoring-surface/text.md +62 -0
  84. package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
  85. package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
  86. package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
  87. package/docs/reference/authoring-surface/type-agentslots.md +12 -0
  88. package/docs/reference/authoring-surface/type-answeraction.md +12 -0
  89. package/docs/reference/authoring-surface/type-arg.md +19 -0
  90. package/docs/reference/authoring-surface/type-argnames.md +12 -0
  91. package/docs/reference/authoring-surface/type-binding.md +62 -0
  92. package/docs/reference/authoring-surface/type-bindingof.md +12 -0
  93. package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
  94. package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
  95. package/docs/reference/authoring-surface/type-ceilings.md +41 -0
  96. package/docs/reference/authoring-surface/type-chainlink.md +19 -0
  97. package/docs/reference/authoring-surface/type-chartaction.md +46 -0
  98. package/docs/reference/authoring-surface/type-chartagent.md +28 -0
  99. package/docs/reference/authoring-surface/type-chartevent.md +20 -0
  100. package/docs/reference/authoring-surface/type-chartguard.md +20 -0
  101. package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
  102. package/docs/reference/authoring-surface/type-chartjson.md +14 -0
  103. package/docs/reference/authoring-surface/type-chartstate.md +46 -0
  104. package/docs/reference/authoring-surface/type-charttext.md +40 -0
  105. package/docs/reference/authoring-surface/type-charttransition.md +22 -0
  106. package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
  107. package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
  108. package/docs/reference/authoring-surface/type-childat.md +12 -0
  109. package/docs/reference/authoring-surface/type-childslots.md +12 -0
  110. package/docs/reference/authoring-surface/type-commandenv.md +15 -0
  111. package/docs/reference/authoring-surface/type-commandinput.md +19 -0
  112. package/docs/reference/authoring-surface/type-commandoptions.md +78 -0
  113. package/docs/reference/authoring-surface/type-commandoutput.md +104 -0
  114. package/docs/reference/authoring-surface/type-customize.md +109 -0
  115. package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
  116. package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
  117. package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
  118. package/docs/reference/authoring-surface/type-dispatchoutput.md +65 -0
  119. package/docs/reference/authoring-surface/type-duration.md +15 -0
  120. package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
  121. package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
  122. package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
  123. package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
  124. package/docs/reference/authoring-surface/type-eventdef.md +45 -0
  125. package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
  126. package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
  127. package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
  128. package/docs/reference/authoring-surface/type-failslot.md +14 -0
  129. package/docs/reference/authoring-surface/type-failure.md +19 -0
  130. package/docs/reference/authoring-surface/type-failureinput.md +20 -0
  131. package/docs/reference/authoring-surface/type-filebody.md +41 -0
  132. package/docs/reference/authoring-surface/type-frominput.md +14 -0
  133. package/docs/reference/authoring-surface/type-hostinjectedinput.md +58 -0
  134. package/docs/reference/authoring-surface/type-httpdefinition.md +101 -0
  135. package/docs/reference/authoring-surface/type-httpinput.md +12 -0
  136. package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
  137. package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
  138. package/docs/reference/authoring-surface/type-httpoutput.md +89 -0
  139. package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
  140. package/docs/reference/authoring-surface/type-jr2config.md +126 -0
  141. package/docs/reference/authoring-surface/type-lends.md +38 -0
  142. package/docs/reference/authoring-surface/type-logicat.md +12 -0
  143. package/docs/reference/authoring-surface/type-markedif.md +12 -0
  144. package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
  145. package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
  146. package/docs/reference/authoring-surface/type-noslotspec.md +26 -0
  147. package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +32 -0
  148. package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
  149. package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
  150. package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
  151. package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
  152. package/docs/reference/authoring-surface/type-opencommandinput.md +17 -0
  153. package/docs/reference/authoring-surface/type-openeffect.md +12 -0
  154. package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
  155. package/docs/reference/authoring-surface/type-openof.md +12 -0
  156. package/docs/reference/authoring-surface/type-opensecret.md +23 -0
  157. package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
  158. package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +31 -0
  159. package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +32 -0
  160. package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
  161. package/docs/reference/authoring-surface/type-poolspec.md +60 -0
  162. package/docs/reference/authoring-surface/type-pushinput.md +15 -0
  163. package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
  164. package/docs/reference/authoring-surface/type-pushoutput.md +124 -0
  165. package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
  166. package/docs/reference/authoring-surface/type-quantity.md +14 -0
  167. package/docs/reference/authoring-surface/type-reached.md +12 -0
  168. package/docs/reference/authoring-surface/type-reposlot.md +70 -0
  169. package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
  170. package/docs/reference/authoring-surface/type-sandboxoptions.md +77 -0
  171. package/docs/reference/authoring-surface/type-secret.md +25 -0
  172. package/docs/reference/authoring-surface/type-sender.md +19 -0
  173. package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
  174. package/docs/reference/authoring-surface/type-size.md +85 -0
  175. package/docs/reference/authoring-surface/type-slothandles.md +32 -0
  176. package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
  177. package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
  178. package/docs/reference/authoring-surface/type-syncstate.md +12 -0
  179. package/docs/reference/authoring-surface/type-text.md +19 -0
  180. package/docs/reference/authoring-surface/type-textpart.md +24 -0
  181. package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
  182. package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
  183. package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
  184. package/docs/reference/authoring-surface/type-unknown.md +21 -0
  185. package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
  186. package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
  187. package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
  188. package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
  189. package/docs/reference/authoring-surface/type-workspaced.md +94 -0
  190. package/docs/reference/authoring-surface/type-workspacehandles.md +23 -0
  191. package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
  192. package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
  193. package/docs/reference/authoring-surface/type-workspaceoptions.md +39 -0
  194. package/docs/reference/authoring-surface/type-workspacespec.md +37 -0
  195. package/docs/reference/authoring-surface/workspace.md +259 -0
  196. package/docs/reference/authoring-surface.md +197 -0
  197. package/docs/reference/cli.md +433 -0
  198. package/docs/reference/config.md +756 -0
  199. package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +113 -0
  200. package/docs/reference/decisions/0002-duplex-streaming-actor.md +110 -0
  201. package/docs/reference/decisions/0004-worktree-provisioning-model.md +124 -0
  202. package/docs/reference/decisions/0005-sandbox-pod-composition.md +230 -0
  203. package/docs/reference/decisions/0006-agent-control-surface.md +47 -0
  204. package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
  205. package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
  206. package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
  207. package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
  208. package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
  209. package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
  210. package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +157 -0
  211. package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
  212. package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +265 -0
  213. package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +124 -0
  214. package/docs/reference/decisions/0017-pool-over-a-source-port.md +69 -0
  215. package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
  216. package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +275 -0
  217. package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
  218. package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +100 -0
  219. package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
  220. package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +176 -0
  221. package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +439 -0
  222. package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
  223. package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
  224. package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +237 -0
  225. package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +89 -0
  226. package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
  227. package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
  228. package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +190 -0
  229. package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
  230. package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +127 -0
  231. package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
  232. package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
  233. package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
  234. package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
  235. package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
  236. package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
  237. package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
  238. package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
  239. package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
  240. package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
  241. package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
  242. package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
  243. package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
  244. package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
  245. package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
  246. package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
  247. package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +227 -0
  248. package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +81 -0
  249. package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +111 -0
  250. package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
  251. package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
  252. package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
  253. package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
  254. package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +106 -0
  255. package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +384 -0
  256. package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
  257. package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
  258. package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +212 -0
  259. package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +83 -0
  260. package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
  261. package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
  262. package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +550 -0
  263. package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +430 -0
  264. package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +464 -0
  265. package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
  266. package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +323 -0
  267. package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
  268. package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
  269. package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
  270. package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
  271. package/docs/reference/decisions.md +83 -0
  272. package/docs/reference/glossary.md +648 -0
  273. package/docs/reference/http-api.md +1348 -0
  274. package/docs/reference/machines.md +190 -0
  275. package/docs/reference/mechanism-events.md +72 -0
  276. package/docs/why.md +206 -0
  277. package/package.json +5 -3
  278. package/src/actor.ts +541 -79
  279. package/src/agent.ts +114 -38
  280. package/src/ambient.ts +2 -1
  281. package/src/assembly-checks.ts +189 -7
  282. package/src/cause.ts +234 -0
  283. package/src/chart.ts +169 -37
  284. package/src/charts.ts +34 -6
  285. package/src/config.ts +430 -178
  286. package/src/custodian.ts +74 -22
  287. package/src/customize.ts +188 -46
  288. package/src/dispatch-effect.ts +945 -0
  289. package/src/door-compat.ts +217 -0
  290. package/src/durability.ts +11 -4
  291. package/src/effect.ts +341 -44
  292. package/src/effector-wire.ts +160 -11
  293. package/src/fail.ts +209 -0
  294. package/src/harness-client.ts +541 -47
  295. package/src/http-effect.ts +495 -53
  296. package/src/http.ts +427 -16
  297. package/src/index.ts +60 -82
  298. package/src/instance.ts +68 -8
  299. package/src/internal.ts +84 -0
  300. package/src/machine-doc.ts +21 -3
  301. package/src/mechanism-routes.ts +168 -0
  302. package/src/model-keys.generated.ts +53 -0
  303. package/src/model-keys.ts +18 -58
  304. package/src/notices.ts +66 -13
  305. package/src/open-body.ts +159 -23
  306. package/src/open-effect.ts +81 -8
  307. package/src/open.ts +59 -6
  308. package/src/parts.ts +184 -13
  309. package/src/party.ts +68 -2
  310. package/src/pick.ts +463 -11
  311. package/src/pool.ts +247 -36
  312. package/src/registration.ts +83 -4
  313. package/src/repos.ts +2 -1
  314. package/src/run-host.ts +565 -31
  315. package/src/run-output.ts +38 -0
  316. package/src/sandbox-effect.ts +273 -38
  317. package/src/sandbox-kube.ts +3 -1
  318. package/src/secret-placement.ts +52 -17
  319. package/src/server.ts +3 -0
  320. package/src/setup.ts +239 -56
  321. package/src/size.ts +121 -9
  322. package/src/snapshot-store.ts +54 -10
  323. package/src/stub-harness.ts +44 -16
  324. package/src/timers.ts +14 -1
  325. package/src/vocabulary.ts +69 -14
  326. package/src/wire.ts +90 -16
  327. package/src/workspace.ts +697 -175
@@ -0,0 +1,442 @@
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. The `workspace`
53
+ field selects them:
54
+
55
+ - `"write"` gives all the Working tools.
56
+ - `"read"` gives no write tool and no edit tool. The Agent keeps bash, so a command can still write a file. A review
57
+ Turn whose `cwd` is the review [Worktree](../reference/glossary.md#worktree) cannot move the branch with a change.
58
+ [Workspaces](workspaces.md) tells how.
59
+ - `"none"` gives no Working tools. The Agent reads its prompt and picks from its Menu. This is a Menu-only Agent.
60
+
61
+ The field also tells where the Turn runs. An Agent with `"write"` or `"read"` works in the
62
+ [Sandbox](../reference/glossary.md#sandbox) of a Workspace, so a state invokes it in the body of a
63
+ [`workspace()`](../reference/authoring-surface/workspace.md). A Menu-only Agent has no Sandbox. Its Turn runs on the
64
+ [Instance Harness](../reference/glossary.md#instance-harness), also when a `workspace()` holds it.
65
+ [Architecture](architecture.md) shows where each Harness runs.
66
+
67
+ ## What a state sets for one Turn
68
+
69
+ The `input` of the invoke is the Turn. It has five keys, and no other:
70
+
71
+ - **The [Frame](../reference/glossary.md#frame): `prompt` and `cwd`.** The prompt tells what this Turn is about. `cwd`
72
+ is the directory where the Working tools work. A definition cannot hold a `cwd`, because the Worktree of a run exists
73
+ only when the run starts. Under a Workspace with one [Repo Slot](../reference/glossary.md#repo-slot), the default
74
+ `cwd` is the Worktree of that slot.
75
+ - **The [Dials](../reference/glossary.md#dials): `model` and `thinkingLevel`.** They tell how hard the Agent works on
76
+ this Turn, and they replace the values of the definition for this Turn only. The Agent stays the same Agent.
77
+ - **`continue`.** It tells if the Turn continues the conversation of the Agent. See
78
+ [Continue a conversation](#continue-a-conversation).
79
+
80
+ The state writes the input as a function of its context. Thus each Turn can have its own prompt and its own directory.
81
+
82
+ ## An example
83
+
84
+ In this [Workflow](../reference/glossary.md#workflow), a coder fixes the tests of a
85
+ [Repo](../reference/glossary.md#repo), and a Menu-only checker reads the coder's summary. When the checker asks for
86
+ changes, the coder continues its conversation and thinks harder on that Turn:
87
+
88
+ **Anthropic**
89
+
90
+ ```ts
91
+ import { z } from "zod";
92
+ import { assign } from "xstate";
93
+ import { agent, defineEvent, fail, jr2Setup, workspace, type Workspaced } from "@jr2/orchestrator";
94
+
95
+ const finish = defineEvent({
96
+ name: "finish",
97
+ description: "Call this when `node --test` passes and you committed the fix. Say what you changed.",
98
+ input: z.object({ summary: z.string() }),
99
+ });
100
+ const approve = defineEvent({
101
+ name: "approve",
102
+ description: "Call this when the summary shows a complete fix.",
103
+ input: z.object({}),
104
+ });
105
+ const requestChanges = defineEvent({
106
+ name: "request_changes",
107
+ description: "Call this when the fix is not complete. Say what is missing.",
108
+ input: z.object({ notes: z.string() }),
109
+ });
110
+
111
+ const runInput = z.object({ branch: z.string() });
112
+ type BodyInput = Workspaced<z.infer<typeof runInput>, "app">;
113
+ type Context = BodyInput & { summary: string; notes: string };
114
+
115
+ const body = jr2Setup({
116
+ types: {} as { input: BodyInput; context: Context },
117
+ events: [finish, approve, requestChanges],
118
+ actors: {
119
+ // The definition: who the Agent is. It is the same on every Turn.
120
+ coder: agent({
121
+ model: "anthropic/claude-haiku-5-5",
122
+ instructions: "You fix failing tests. You change no test.",
123
+ }),
124
+ // A Menu-only Agent: no Working tools. It reads its prompt and picks.
125
+ checker: agent({
126
+ model: "anthropic/claude-haiku-5-5",
127
+ instructions: "You read the summary of a fix, and you decide if the fix is complete.",
128
+ workspace: "none",
129
+ thinkingLevel: "low",
130
+ }),
131
+ fail: fail(),
132
+ },
133
+ }).createMachine({
134
+ id: "fix",
135
+ context: ({ input }) => ({ ...input, summary: "", notes: "" }),
136
+ on: { "workspace.lost": ".lost", "agent.fault": ".failed" },
137
+ initial: "coding",
138
+ states: {
139
+ coding: {
140
+ invoke: {
141
+ src: "coder",
142
+ // The Frame (prompt and cwd) and continue. This Turn starts the coder's conversation.
143
+ input: ({ context }) => ({
144
+ prompt: "Make `node --test` pass, then commit.",
145
+ cwd: context.workspace.repos.app,
146
+ continue: true,
147
+ }),
148
+ },
149
+ on: { finish: { target: "checking", actions: assign({ summary: ({ event }) => event.summary }) } },
150
+ },
151
+ checking: {
152
+ invoke: { src: "checker", input: ({ context }) => ({ prompt: `Is this fix complete?\n\n${context.summary}` }) },
153
+ on: {
154
+ approve: "done",
155
+ request_changes: { target: "fixing", actions: assign({ notes: ({ event }) => event.notes }) },
156
+ },
157
+ },
158
+ fixing: {
159
+ invoke: {
160
+ src: "coder",
161
+ // The same conversation as in coding, with a Dial: the coder thinks harder on this Turn.
162
+ input: ({ context }) => ({
163
+ prompt: `The fix is not complete: ${context.notes}\nFix it, then commit.`,
164
+ cwd: context.workspace.repos.app,
165
+ continue: true,
166
+ thinkingLevel: "high",
167
+ }),
168
+ },
169
+ on: { finish: { target: "checking", actions: assign({ summary: ({ event }) => event.summary }) } },
170
+ },
171
+ done: { type: "final" },
172
+ failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
173
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
174
+ },
175
+ });
176
+
177
+ export const machine = workspace(body, {
178
+ input: runInput,
179
+ repos: { app: "https://github.com/you/app.git" },
180
+ spec: ({ input }) => ({ branch: input.branch }),
181
+ });
182
+ ```
183
+
184
+ **Local**
185
+
186
+ ```ts
187
+ import { z } from "zod";
188
+ import { assign } from "xstate";
189
+ import { agent, defineEvent, fail, jr2Setup, workspace, type Workspaced } from "@jr2/orchestrator";
190
+
191
+ const finish = defineEvent({
192
+ name: "finish",
193
+ description: "Call this when `node --test` passes and you committed the fix. Say what you changed.",
194
+ input: z.object({ summary: z.string() }),
195
+ });
196
+ const approve = defineEvent({
197
+ name: "approve",
198
+ description: "Call this when the summary shows a complete fix.",
199
+ input: z.object({}),
200
+ });
201
+ const requestChanges = defineEvent({
202
+ name: "request_changes",
203
+ description: "Call this when the fix is not complete. Say what is missing.",
204
+ input: z.object({ notes: z.string() }),
205
+ });
206
+
207
+ const runInput = z.object({ branch: z.string() });
208
+ type BodyInput = Workspaced<z.infer<typeof runInput>, "app">;
209
+ type Context = BodyInput & { summary: string; notes: string };
210
+
211
+ const body = jr2Setup({
212
+ types: {} as { input: BodyInput; context: Context },
213
+ events: [finish, approve, requestChanges],
214
+ actors: {
215
+ // The definition: who the Agent is. It is the same on every Turn.
216
+ coder: agent({
217
+ model: "local/qwen3.6-35b-a3b",
218
+ instructions: "You fix failing tests. You change no test.",
219
+ }),
220
+ // A Menu-only Agent: no Working tools. It reads its prompt and picks.
221
+ checker: agent({
222
+ model: "local/qwen3.6-35b-a3b",
223
+ instructions: "You read the summary of a fix, and you decide if the fix is complete.",
224
+ workspace: "none",
225
+ thinkingLevel: "low",
226
+ }),
227
+ fail: fail(),
228
+ },
229
+ }).createMachine({
230
+ id: "fix",
231
+ context: ({ input }) => ({ ...input, summary: "", notes: "" }),
232
+ on: { "workspace.lost": ".lost", "agent.fault": ".failed" },
233
+ initial: "coding",
234
+ states: {
235
+ coding: {
236
+ invoke: {
237
+ src: "coder",
238
+ // The Frame (prompt and cwd) and continue. This Turn starts the coder's conversation.
239
+ input: ({ context }) => ({
240
+ prompt: "Make `node --test` pass, then commit.",
241
+ cwd: context.workspace.repos.app,
242
+ continue: true,
243
+ }),
244
+ },
245
+ on: { finish: { target: "checking", actions: assign({ summary: ({ event }) => event.summary }) } },
246
+ },
247
+ checking: {
248
+ invoke: { src: "checker", input: ({ context }) => ({ prompt: `Is this fix complete?\n\n${context.summary}` }) },
249
+ on: {
250
+ approve: "done",
251
+ request_changes: { target: "fixing", actions: assign({ notes: ({ event }) => event.notes }) },
252
+ },
253
+ },
254
+ fixing: {
255
+ invoke: {
256
+ src: "coder",
257
+ // The same conversation as in coding, with a Dial: the coder thinks harder on this Turn.
258
+ input: ({ context }) => ({
259
+ prompt: `The fix is not complete: ${context.notes}\nFix it, then commit.`,
260
+ cwd: context.workspace.repos.app,
261
+ continue: true,
262
+ thinkingLevel: "high",
263
+ }),
264
+ },
265
+ on: { finish: { target: "checking", actions: assign({ summary: ({ event }) => event.summary }) } },
266
+ },
267
+ done: { type: "final" },
268
+ failed: { invoke: { src: "fail", input: { reason: "the Agent's Turn could not go on" } } },
269
+ lost: { invoke: { src: "fail", input: { reason: "the Sandbox is gone" } } },
270
+ },
271
+ });
272
+
273
+ export const machine = workspace(body, {
274
+ input: runInput,
275
+ repos: { app: "https://github.com/you/app.git" },
276
+ spec: ({ input }) => ({ branch: input.branch }),
277
+ });
278
+ ```
279
+
280
+ The two Agents use the model of the tab. The `coding` and `fixing` states invoke the same Agent with different prompts,
281
+ and only `fixing` sets a Dial. The checker's Turn has no `cwd`, because it has no Working tools.
282
+
283
+ ## One Turn
284
+
285
+ **One Turn, from the state that invokes the Agent to the answer to its pick**
286
+
287
+ - **Orchestrator**: the state that invokes the Agent
288
+ - **Harness**: runs the Turn
289
+ - **model provider**: the model of the Agent
290
+ - Orchestrator → Harness: the definition, the Frame and the Dials
291
+ - Harness → model provider: the instructions, the prompt and the Briefing
292
+ - zero or more times
293
+ - model provider → Harness: a Working tool call
294
+ - Harness → model provider: its result
295
+ - model provider → Harness: a pick from the Menu
296
+ - Harness → Orchestrator: the pick, as an event
297
+ - Orchestrator → Harness: the answer to the pick
298
+ - Harness → model provider: the answer
299
+
300
+ The [Briefing](../reference/glossary.md#briefing) is the text that jr2 itself adds. The loop can run zero times: a
301
+ Menu-only Agent has no Working tools. The answer to the pick tells the model if its Turn is over.
302
+
303
+ ## How a Turn ends
304
+
305
+ A Turn belongs to the state that invoked the Agent. When that state exits, the Turn is over, for any cause: a pick of
306
+ the Agent, a [Gate](../reference/glossary.md#gate), a timer, or a `CANCEL`. jr2 then stops the work of the Agent on that
307
+ Turn, and it does not prompt that Turn again.
308
+
309
+ Usually, a pick of the Agent moves the Machine out of the state, and that ends the Turn. A pick whose target stays in
310
+ 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
311
+ picks an Agent can make, and when.
312
+
313
+ An `agent()` actor never finishes, so an `onDone` on its invoke never runs. Give the Agent a pick, such as `finish`, and
314
+ route on it.
315
+
316
+ ## Continue a conversation
317
+
318
+ Without `continue`, each Turn starts a new conversation. The model knows only the instructions, the prompt and the
319
+ Briefing. Thus the prompt must give all that the Agent needs to know.
320
+
321
+ With `continue: true`, the Turn continues the one conversation of this Agent in this Machine instance. Each state of the
322
+ Machine that invokes the Agent with `continue: true` uses the same conversation. A Turn without `continue` does not join
323
+ it. Thus, in the example, `coding` sets `continue: true` too, so that `fixing` continues the conversation of `coding`.
324
+
325
+ A Turn can join only a conversation that an earlier Turn started with `continue: true`. Thus, in a retry loop, put
326
+ `continue: true` on each Turn, also on the first. If the first Turn has no `continue`, attempt 2 does not see attempt 1.
327
+ A first Turn with `continue: true` gets no second start on a Runaway (see [When a Turn fails](#when-a-turn-fails)). jr2
328
+ accepts this, so that attempt 2 sees attempt 1.
329
+
330
+ `continue` is the literal `true`, not a `boolean`, so `continue: context.attempts > 0` is a type error. A state that
331
+ always starts a clean conversation leaves `continue` off. Spread it into the input only when a state must start a clean
332
+ conversation on some Turns only: `...(context.clean ? {} : { continue: true as const })`. A clean Turn does not start
333
+ the continued conversation again: the next Turn with `continue: true` joins the earlier one.
334
+
335
+ The conversation has no name that you write. jr2 makes its id from the run, the Machine instance and the Agent. Thus two
336
+ Agents never share a conversation. Two workers of a [Pool](../reference/glossary.md#pool) never share one either,
337
+ because each worker is a Machine instance of its own.
338
+
339
+ When jr2 sends [`agent.fault`](../reference/mechanism-events.md#agent-fault) for a continued conversation, it does not
340
+ continue that conversation again. The next Turn with `continue: true` starts a new one. Its prompt must then give the
341
+ full task again, because jr2 cannot write that prompt for you. A Harness restart is the only exception: the restarted
342
+ Harness keeps the conversation, so the next Turn continues it.
343
+
344
+ ## The Briefing
345
+
346
+ The Briefing is the text that jr2 itself gives the model. It tells facts that a correct Agent needs and cannot find for
347
+ itself. It tells nothing about the task: the prompt tells the task. It has two parts:
348
+
349
+ - **The standing part** comes after the instructions, and it is the same on each Turn. It tells how the Agent acts on
350
+ the run: with a pick from its Menu. It also tells the CPUs and the [Size](../reference/glossary.md#size) of the
351
+ Sandbox, or that a Menu-only Agent has no Working tools.
352
+ - **The Turn part** comes after the prompt. It tells the directory of the Turn, its
353
+ [Allowed picks](../reference/glossary.md#allowed-picks), and the notices. [The Menu](the-menu.md) tells what the
354
+ Allowed picks are. When they change during the Turn, the Harness tells them to the model again. When an Allowed pick
355
+ carries a [Chart](../reference/glossary.md#chart), the Turn part also tells how a Chart runs (see
356
+ [Charts](charts.md)).
357
+
358
+ A notice tells the next Turn what happened before it. For example: the conversation is new and the earlier context is
359
+ gone, or the processes of the Sandbox stopped at its memory limit. jr2 gives each notice one time, to the next Turn that
360
+ it is for.
361
+
362
+ You cannot turn the Briefing off. It contains only facts that make the Agent work better. An `instructions` that tells
363
+ the same fact again does no harm.
364
+
365
+ ## When a Turn fails
366
+
367
+ jr2 tries to recover a Turn before it tells the Machine. When it cannot recover the Turn, it sends one event,
368
+ `agent.fault`, to the Machine. The Machine decides what to do next: the state that invokes the Agent, or a state above
369
+ it, routes `agent.fault`. `jr2 check` refuses a Machine without that route. In a [Chart](charts.md) the route is
370
+ optional. jr2 recovers from these failures:
371
+
372
+ - **The Harness or the model provider fails.** The Harness tries the model provider again during the Turn. When the Turn
373
+ still fails, jr2 sends `agent.fault`. When a Harness restarts while the state is busy, jr2 starts the Turn again on
374
+ the same conversation, and it sends no fault. If the restarted Harness cannot read the conversation, the Turn starts a
375
+ new one, and the Briefing tells the model.
376
+ - **The Agent stops with no pick.** When the model stops and its Turn can still make a pick, jr2 prompts it again. It
377
+ does this two times at most. Then it sends `agent.fault`.
378
+ - **The Turn is a [Runaway](../reference/glossary.md#runaway).**
379
+
380
+ 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
381
+ sequence, with the same arguments. It also ends a Turn of more than 256 [steps](../reference/glossary.md#step) on one
382
+ 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
383
+ 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
384
+ not a step. Then jr2 starts the Turn again one time, with the same prompt, on a new conversation. When that Turn is also
385
+ a Runaway, jr2 sends `agent.fault`. jr2 does not start the Turn again when it continues a conversation, or when the
386
+ Agent already made a pick in it. Then it sends `agent.fault` immediately.
387
+
388
+ You cannot change these limits. They are a part of jr2.
389
+
390
+ ## Compaction
391
+
392
+ A long Turn can fill the context window of the model. Then the model cannot answer, and the Turn fails. To prevent this,
393
+ the Harness takes a [Compaction](../reference/glossary.md#compaction) during the Turn. Before it sends the conversation
394
+ to the model, it examines the size of the context. When the context is near its limit, the Harness replaces the earlier
395
+ part of the conversation with a summary. The recent part stays. The Turn continues with the smaller context.
396
+
397
+ The summary comes from the model and the thinking level of the Turn. A Compaction changes only what the model sees. The
398
+ history of the conversation keeps all that was said.
399
+
400
+ You do not set when a Compaction occurs. jr2 calculates it from the context window and the output limit of the model. A
401
+ model of a catalog provider, such as `anthropic`, has a known context window. A custom provider gets it from
402
+ [`harness.provider.contextWindow`](../reference/config.md#harness-provider-contextwindow) or from the `contextWindow` of
403
+ the model in `models`. A model with no context window gets no Compaction.
404
+
405
+ ## Rules
406
+
407
+ - `model` is required in each definition. `jr2 up` refuses a model that is still `open`.
408
+ - The input of a Turn has only `prompt`, `cwd`, `model`, `thinkingLevel` and `continue`. jr2 refuses a Turn with a
409
+ different key.
410
+ - A Turn cannot set `instructions` or `workspace`.
411
+ - `cwd` is an absolute path. The Harness refuses a Turn with a relative `cwd`.
412
+ - Under a Workspace with more than one Repo Slot, each Turn of an Agent with Working tools sets `cwd`. jr2 refuses the
413
+ Turn without it.
414
+ - An Agent with `"write"` or `"read"` runs in the body of a `workspace()`. jr2 refuses its Turn outside one.
415
+ - `jr2 up` sees only the models of the definitions. It cannot see a model that a Turn sets as a Dial. The Harness
416
+ refuses a model that it cannot find when the Turn starts.
417
+ - A Turn ends when the state that invoked the Agent exits.
418
+ - After `agent.fault` for a conversation, jr2 does not continue it, except after a Harness restart.
419
+
420
+ [Set an Agent's access and Dials](../guides/set-an-agents-access-and-dials.md) gives the exact text of each refusal.
421
+
422
+ ## Read next
423
+
424
+ - [Set an Agent's access and Dials](../guides/set-an-agents-access-and-dials.md)
425
+ - [The Menu](the-menu.md), [Workspaces](workspaces.md) and [Architecture](architecture.md)
426
+ - Reference: [`agent`](../reference/authoring-surface/agent.md),
427
+ [`AgentDefinition`](../reference/authoring-surface/type-agentdefinition.md),
428
+ [`ThinkingLevel`](../reference/authoring-surface/type-thinkinglevel.md),
429
+ [`agent.fault`](../reference/mechanism-events.md#agent-fault) and
430
+ [`harness.provider`](../reference/config.md#harness-provider)
431
+ - [ADR-0018](../reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md): an Agent is a
432
+ definition, and a Turn can set its Dials
433
+ - [ADR-0028](../reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md): what an
434
+ Agent can do to the Workspace is a part of its definition
435
+ - [ADR-0057](../reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md): a Turn is its
436
+ Frame, its Dials, and `continue`
437
+ - [ADR-0024](../reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md): a Turn ends with the
438
+ state that asked for it
439
+ - [ADR-0016](../reference/decisions/0016-agent-turn-mechanics-are-internal.md): jr2 owns the mechanics of a Turn
440
+ - [ADR-0062](../reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md): the Briefing
441
+ - [ADR-0035](../reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md): a Runaway
442
+ - [ADR-0036](../reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md): Compaction