humanish 0.107.0 → 0.109.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 (671) hide show
  1. package/ARCHITECTURE.md +73 -69
  2. package/CHANGELOG.md +27 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +148 -175
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-trace.js +2 -1
  14. package/dist/actors/codex/app-server-ui.js +1 -1
  15. package/dist/actors/codex/codex-admission.d.ts +91 -0
  16. package/dist/actors/codex/codex-admission.js +150 -0
  17. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  18. package/dist/actors/codex/restricted-executable.js +8 -8
  19. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  20. package/dist/actors/codex/restricted-launch.js +1 -1
  21. package/dist/actors/codex/restricted-participant.js +20 -18
  22. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  23. package/dist/actors/codex/restricted-policy.js +2 -2
  24. package/dist/actors/codex/restricted-session.d.ts +3 -3
  25. package/dist/actors/codex/restricted-session.js +10 -5
  26. package/dist/actors/computer-use/actor.d.ts +18 -18
  27. package/dist/actors/computer-use/actor.js +4 -4
  28. package/dist/actors/computer-use/admission-limit.d.ts +3 -3
  29. package/dist/actors/computer-use/admission-limit.js +4 -4
  30. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  31. package/dist/actors/computer-use/executor-error.js +3 -3
  32. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  33. package/dist/actors/computer-use/loop/actions.js +15 -15
  34. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  35. package/dist/actors/computer-use/loop/backstop.js +14 -12
  36. package/dist/actors/computer-use/loop/debrief.js +2 -2
  37. package/dist/actors/computer-use/loop/ending.d.ts +6 -6
  38. package/dist/actors/computer-use/loop/ending.js +18 -17
  39. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  40. package/dist/actors/computer-use/loop/observation.js +15 -14
  41. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  42. package/dist/actors/computer-use/loop/provider-call.js +12 -12
  43. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  44. package/dist/actors/computer-use/loop/session.js +4 -4
  45. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  46. package/dist/actors/computer-use/loop/spend.js +1 -1
  47. package/dist/actors/computer-use/loop/trace.js +11 -9
  48. package/dist/actors/computer-use/loop/types.d.ts +47 -45
  49. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  50. package/dist/actors/computer-use/loop/usage.js +2 -2
  51. package/dist/actors/computer-use/loop.d.ts +6 -1
  52. package/dist/actors/computer-use/loop.js +26 -4
  53. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  54. package/dist/actors/computer-use/openai-context.js +214 -0
  55. package/dist/actors/computer-use/openai-provider.d.ts +13 -10
  56. package/dist/actors/computer-use/openai-provider.js +52 -41
  57. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  58. package/dist/actors/computer-use/openai-requests.js +82 -15
  59. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  60. package/dist/actors/computer-use/openai-wire.js +36 -34
  61. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  62. package/dist/actors/computer-use/provider-error.js +6 -6
  63. package/dist/actors/contract.d.ts +82 -47
  64. package/dist/actors/contract.js +30 -24
  65. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  66. package/dist/actors/local-agent/claude-session.js +13 -12
  67. package/dist/actors/local-agent/cli.d.ts +9 -7
  68. package/dist/actors/local-agent/cli.js +24 -28
  69. package/dist/actors/local-agent/readiness.d.ts +2 -2
  70. package/dist/actors/local-agent/readiness.js +4 -4
  71. package/dist/actors/reasoning-effort.js +8 -8
  72. package/dist/actors/registry.d.ts +12 -12
  73. package/dist/actors/registry.js +21 -20
  74. package/dist/actors/scripted-browser/actor.d.ts +10 -10
  75. package/dist/actors/scripted-browser/actor.js +17 -17
  76. package/dist/actors/scripted-browser/browser-command.js +1 -1
  77. package/dist/actors/scripted-browser/steps.js +1 -1
  78. package/dist/actors/scripted-browser/types.d.ts +1 -1
  79. package/dist/actors/stop-conditions.d.ts +1 -1
  80. package/dist/analysis/automatic-completion.d.ts +7 -7
  81. package/dist/analysis/automatic-completion.js +1 -1
  82. package/dist/analysis/automatic-config.d.ts +6 -6
  83. package/dist/analysis/automatic-config.js +1 -1
  84. package/dist/analysis/codex-config.d.ts +6 -2
  85. package/dist/analysis/codex-config.js +22 -14
  86. package/dist/analysis/execute.d.ts +1 -1
  87. package/dist/analysis/execute.js +1 -1
  88. package/dist/analysis/service.js +5 -5
  89. package/dist/analysis/types.d.ts +6 -0
  90. package/dist/browser-control/client.js +16 -16
  91. package/dist/browser-control/dispatcher.js +4 -4
  92. package/dist/browser-control/protocol.js +14 -14
  93. package/dist/browser-control/recording-transfer.js +4 -4
  94. package/dist/browser-control/transport.js +7 -7
  95. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  96. package/dist/cli/commands/analyze.js +19 -16
  97. package/dist/cli/commands/codex.js +9 -9
  98. package/dist/cli/commands/comms.js +48 -35
  99. package/dist/cli/commands/feedback.js +20 -21
  100. package/dist/cli/commands/migrate.d.ts +4 -0
  101. package/dist/cli/commands/migrate.js +65 -0
  102. package/dist/cli/commands/observe.d.ts +0 -1
  103. package/dist/cli/commands/observe.js +136 -112
  104. package/dist/cli/commands/run-command.d.ts +10 -0
  105. package/dist/cli/commands/run-command.js +85 -0
  106. package/dist/cli/commands/runs.js +136 -139
  107. package/dist/cli/commands/setup.d.ts +2 -2
  108. package/dist/cli/commands/setup.js +27 -24
  109. package/dist/cli/commands/study-format.d.ts +9 -0
  110. package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
  111. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  112. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
  113. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  114. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  115. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  116. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
  117. package/dist/cli/commands/study-route-run.d.ts +19 -0
  118. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  119. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  120. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  121. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  122. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
  123. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  124. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  125. package/dist/cli/commands/study-run.d.ts +9 -0
  126. package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
  127. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
  128. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
  129. package/dist/cli/commands/study.d.ts +3 -0
  130. package/dist/cli/commands/study.js +146 -0
  131. package/dist/cli/commands/tui.d.ts +4 -4
  132. package/dist/cli/commands/tui.js +31 -31
  133. package/dist/cli/commands/watch.js +71 -121
  134. package/dist/cli/deprecations.d.ts +6 -0
  135. package/dist/cli/deprecations.js +18 -0
  136. package/dist/cli/doctor.d.ts +18 -8
  137. package/dist/cli/doctor.js +114 -59
  138. package/dist/cli/first-run-path.d.ts +15 -13
  139. package/dist/cli/first-run-path.js +35 -33
  140. package/dist/cli/io.d.ts +44 -9
  141. package/dist/cli/io.js +98 -23
  142. package/dist/cli/observer-follow.d.ts +3 -3
  143. package/dist/cli/observer-follow.js +6 -7
  144. package/dist/cli/orientation.d.ts +10 -7
  145. package/dist/cli/orientation.js +89 -47
  146. package/dist/cli/product-sentence.d.ts +6 -0
  147. package/dist/cli/product-sentence.js +6 -0
  148. package/dist/cli/program.d.ts +6 -1
  149. package/dist/cli/program.js +111 -43
  150. package/dist/cli/telemetry.d.ts +16 -16
  151. package/dist/cli/telemetry.js +46 -44
  152. package/dist/cli.js +1 -1
  153. package/dist/comms/capture-surface.d.ts +13 -12
  154. package/dist/comms/capture-surface.js +23 -22
  155. package/dist/comms/catch-host.d.ts +7 -7
  156. package/dist/comms/catch-host.js +17 -17
  157. package/dist/comms/connections.d.ts +1 -1
  158. package/dist/comms/connections.js +2 -2
  159. package/dist/comms/email-catch.d.ts +3 -3
  160. package/dist/comms/email-catch.js +8 -8
  161. package/dist/comms/external-evidence.d.ts +5 -5
  162. package/dist/comms/external-evidence.js +5 -4
  163. package/dist/comms/extract.js +2 -2
  164. package/dist/comms/fake-inbox.d.ts +3 -3
  165. package/dist/comms/fake-inbox.js +3 -3
  166. package/dist/comms/receiving-render.d.ts +1 -1
  167. package/dist/comms/receiving-render.js +2 -2
  168. package/dist/comms/receiving-runtime.d.ts +4 -4
  169. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  170. package/dist/comms/sandbox-catch-script.js +6 -6
  171. package/dist/comms/sandbox-catch.d.ts +38 -39
  172. package/dist/comms/sandbox-catch.js +36 -37
  173. package/dist/comms/setup.d.ts +2 -2
  174. package/dist/comms/setup.js +56 -25
  175. package/dist/comms/thread-evidence.d.ts +1 -1
  176. package/dist/comms/thread-evidence.js +6 -6
  177. package/dist/comms/types.d.ts +6 -6
  178. package/dist/comms/types.js +3 -3
  179. package/dist/evidence/frame-signature.d.ts +1 -1
  180. package/dist/evidence/frame-signature.js +4 -4
  181. package/dist/evidence/redaction.d.ts +3 -3
  182. package/dist/evidence/redaction.js +4 -4
  183. package/dist/feedback/draft.js +38 -80
  184. package/dist/feedback/export-bundle.js +1 -1
  185. package/dist/feedback/export.d.ts +5 -1
  186. package/dist/feedback/export.js +10 -10
  187. package/dist/feedback/feedback.d.ts +2 -2
  188. package/dist/feedback/feedback.js +21 -3
  189. package/dist/feedback/proof.d.ts +1 -1
  190. package/dist/feedback/proof.js +2 -2
  191. package/dist/guest/bootstrap.js +6 -6
  192. package/dist/guest/browser-tools.js +8 -8
  193. package/dist/guest/chromium-text.js +19 -19
  194. package/dist/guest/desktop-executor.d.ts +2 -2
  195. package/dist/guest/desktop-executor.js +20 -20
  196. package/dist/guest/desktop-keys.js +4 -4
  197. package/dist/guest/desktop-media.d.ts +2 -2
  198. package/dist/guest/desktop-media.js +16 -16
  199. package/dist/guest/desktop-native.d.ts +1 -1
  200. package/dist/guest/desktop-native.js +10 -10
  201. package/dist/guest/runtime-desktop.js +2 -2
  202. package/dist/guest/runtime-processes.d.ts +2 -2
  203. package/dist/guest/runtime-processes.js +2 -2
  204. package/dist/guest/runtime.js +6 -6
  205. package/dist/index.d.ts +14 -14
  206. package/dist/index.js +8 -8
  207. package/dist/keys/key-resolution.d.ts +5 -5
  208. package/dist/keys/key-resolution.js +23 -23
  209. package/dist/observer/artifact.d.ts +2 -2
  210. package/dist/observer/artifact.js +7 -7
  211. package/dist/observer/data.d.ts +6 -6
  212. package/dist/observer/data.js +5 -4
  213. package/dist/observer/exposure.d.ts +1 -1
  214. package/dist/observer/exposure.js +11 -11
  215. package/dist/observer/http.js +1 -1
  216. package/dist/observer/library.d.ts +3 -1
  217. package/dist/observer/library.js +8 -3
  218. package/dist/observer/listen.js +5 -4
  219. package/dist/observer/render.d.ts +1 -1
  220. package/dist/observer/render.js +17 -6
  221. package/dist/observer/run-routes.d.ts +4 -3
  222. package/dist/observer/run-routes.js +38 -13
  223. package/dist/observer/serve.d.ts +1 -1
  224. package/dist/observer/serve.js +7 -3
  225. package/dist/observer/tunnel.js +1 -1
  226. package/dist/observer-app.html +4 -4
  227. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  228. package/dist/routes/computer-use/bundle-parts.js +18 -17
  229. package/dist/routes/computer-use/bundle.d.ts +2 -2
  230. package/dist/routes/computer-use/bundle.js +10 -9
  231. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
  232. package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
  233. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  234. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
  235. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  236. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
  238. package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
  239. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  240. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
  241. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  242. package/dist/routes/computer-use/external-comms.js +1 -1
  243. package/dist/routes/computer-use/fanout-bundle.js +27 -26
  244. package/dist/routes/computer-use/fanout-records.js +12 -13
  245. package/dist/routes/computer-use/live-flush.d.ts +4 -4
  246. package/dist/routes/computer-use/live-flush.js +6 -6
  247. package/dist/routes/computer-use/live-phase.d.ts +5 -4
  248. package/dist/routes/computer-use/live-phase.js +8 -8
  249. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  250. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  251. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  252. package/dist/routes/computer-use/local-vm.js +3 -3
  253. package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
  254. package/dist/routes/computer-use/participant-desktop.js +5 -5
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +10 -10
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +33 -15
  259. package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
  260. package/dist/routes/computer-use/participant-prompt.js +9 -9
  261. package/dist/routes/computer-use/participant-runs.d.ts +16 -16
  262. package/dist/routes/computer-use/participant-runs.js +26 -25
  263. package/dist/routes/computer-use/plan.d.ts +12 -12
  264. package/dist/routes/computer-use/plan.js +42 -42
  265. package/dist/routes/computer-use/preflight.d.ts +5 -5
  266. package/dist/routes/computer-use/preflight.js +25 -25
  267. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  268. package/dist/routes/computer-use/rerun-selection.js +4 -3
  269. package/dist/routes/computer-use/result.d.ts +4 -4
  270. package/dist/routes/computer-use/result.js +22 -21
  271. package/dist/routes/computer-use/route.d.ts +12 -11
  272. package/dist/routes/computer-use/route.js +31 -30
  273. package/dist/routes/computer-use/self-report.d.ts +7 -7
  274. package/dist/routes/computer-use/self-report.js +32 -32
  275. package/dist/routes/computer-use/setup.d.ts +23 -23
  276. package/dist/routes/computer-use/setup.js +28 -29
  277. package/dist/routes/computer-use/single-bundle.d.ts +11 -11
  278. package/dist/routes/computer-use/single-bundle.js +40 -41
  279. package/dist/routes/computer-use/subject-projection.d.ts +4 -4
  280. package/dist/routes/computer-use/subject-projection.js +6 -6
  281. package/dist/routes/computer-use/types.d.ts +71 -73
  282. package/dist/routes/computer-use/types.js +12 -12
  283. package/dist/routes/preview.d.ts +13 -7
  284. package/dist/routes/preview.js +11 -7
  285. package/dist/routes/scripted/bundle.d.ts +7 -7
  286. package/dist/routes/scripted/bundle.js +20 -18
  287. package/dist/routes/scripted/plan.d.ts +8 -8
  288. package/dist/routes/scripted/plan.js +13 -13
  289. package/dist/routes/scripted/result.d.ts +3 -3
  290. package/dist/routes/scripted/result.js +13 -13
  291. package/dist/routes/scripted/route.d.ts +9 -9
  292. package/dist/routes/scripted/route.js +15 -16
  293. package/dist/routes/scripted/scenario.d.ts +1 -1
  294. package/dist/routes/scripted/scenario.js +5 -5
  295. package/dist/routes/scripted/setup.d.ts +6 -6
  296. package/dist/routes/scripted/setup.js +8 -8
  297. package/dist/routes/scripted/subject.d.ts +5 -5
  298. package/dist/routes/scripted/subject.js +4 -4
  299. package/dist/routes/scripted/surface-records.d.ts +1 -1
  300. package/dist/routes/scripted/surface-records.js +4 -4
  301. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  302. package/dist/routes/scripted/types.d.ts +18 -20
  303. package/dist/routes/scripted/types.js +2 -2
  304. package/dist/routes/shared-world/bundle-records.js +11 -10
  305. package/dist/routes/shared-world/bundle.d.ts +5 -5
  306. package/dist/routes/shared-world/bundle.js +46 -43
  307. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  308. package/dist/routes/shared-world/checkpoints.js +2 -2
  309. package/dist/routes/shared-world/comms.d.ts +14 -14
  310. package/dist/routes/shared-world/comms.js +19 -18
  311. package/dist/routes/shared-world/external-public.d.ts +4 -3
  312. package/dist/routes/shared-world/external-public.js +16 -12
  313. package/dist/routes/shared-world/handoff.d.ts +7 -6
  314. package/dist/routes/shared-world/handoff.js +65 -57
  315. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  316. package/dist/routes/shared-world/lobby-code.js +9 -9
  317. package/dist/routes/shared-world/participant-specs.d.ts +10 -9
  318. package/dist/routes/shared-world/participant-specs.js +38 -31
  319. package/dist/routes/shared-world/plan.d.ts +9 -9
  320. package/dist/routes/shared-world/plan.js +16 -16
  321. package/dist/routes/shared-world/provenance.d.ts +2 -2
  322. package/dist/routes/shared-world/provenance.js +2 -2
  323. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  324. package/dist/routes/shared-world/provisioned.js +18 -17
  325. package/dist/routes/shared-world/result.d.ts +6 -6
  326. package/dist/routes/shared-world/result.js +29 -29
  327. package/dist/routes/shared-world/route.d.ts +11 -11
  328. package/dist/routes/shared-world/route.js +40 -39
  329. package/dist/routes/shared-world/setup.d.ts +16 -16
  330. package/dist/routes/shared-world/setup.js +23 -23
  331. package/dist/routes/shared-world/types.d.ts +55 -53
  332. package/dist/routes/shared-world/types.js +4 -4
  333. package/dist/routes/terminal/adapter.d.ts +5 -5
  334. package/dist/routes/terminal/adapter.js +9 -9
  335. package/dist/routes/terminal/bundle.d.ts +13 -13
  336. package/dist/routes/terminal/bundle.js +28 -27
  337. package/dist/routes/terminal/credentials.d.ts +8 -8
  338. package/dist/routes/terminal/credentials.js +12 -12
  339. package/dist/routes/terminal/dry-run.d.ts +4 -4
  340. package/dist/routes/terminal/dry-run.js +12 -12
  341. package/dist/routes/terminal/encoding.js +2 -2
  342. package/dist/routes/terminal/ledger.d.ts +5 -5
  343. package/dist/routes/terminal/ledger.js +14 -14
  344. package/dist/routes/terminal/lifetime.d.ts +1 -1
  345. package/dist/routes/terminal/lifetime.js +1 -1
  346. package/dist/routes/terminal/live-finish.d.ts +2 -2
  347. package/dist/routes/terminal/live-finish.js +10 -10
  348. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  349. package/dist/routes/terminal/live-sandbox.js +15 -15
  350. package/dist/routes/terminal/participant-text.js +2 -1
  351. package/dist/routes/terminal/persona.d.ts +2 -2
  352. package/dist/routes/terminal/persona.js +3 -3
  353. package/dist/routes/terminal/plan.d.ts +7 -7
  354. package/dist/routes/terminal/plan.js +15 -15
  355. package/dist/routes/terminal/recorder.js +2 -2
  356. package/dist/routes/terminal/result.d.ts +5 -5
  357. package/dist/routes/terminal/result.js +14 -14
  358. package/dist/routes/terminal/route.d.ts +9 -9
  359. package/dist/routes/terminal/route.js +19 -20
  360. package/dist/routes/terminal/sandbox.d.ts +1 -1
  361. package/dist/routes/terminal/sandbox.js +1 -1
  362. package/dist/routes/terminal/session.d.ts +5 -5
  363. package/dist/routes/terminal/session.js +14 -13
  364. package/dist/routes/terminal/token-usage.d.ts +1 -1
  365. package/dist/routes/terminal/token-usage.js +7 -8
  366. package/dist/routes/terminal/trace.d.ts +4 -4
  367. package/dist/routes/terminal/trace.js +2 -2
  368. package/dist/routes/terminal/types.d.ts +48 -50
  369. package/dist/routes/terminal/types.js +5 -5
  370. package/dist/run/bundle-shape.js +3 -3
  371. package/dist/run/bundle.d.ts +49 -49
  372. package/dist/run/bundle.js +3 -2
  373. package/dist/run/cost-summary.js +3 -3
  374. package/dist/run/costs.d.ts +23 -0
  375. package/dist/run/costs.js +79 -44
  376. package/dist/run/detail.d.ts +6 -6
  377. package/dist/run/detail.js +4 -4
  378. package/dist/run/dry-run-inputs.d.ts +1 -1
  379. package/dist/run/dry-run-inputs.js +2 -2
  380. package/dist/run/dry-run.js +20 -20
  381. package/dist/run/judge.d.ts +19 -13
  382. package/dist/run/judge.js +18 -8
  383. package/dist/run/outcomes.d.ts +1 -1
  384. package/dist/run/participant.d.ts +1 -1
  385. package/dist/run/paths.d.ts +1 -1
  386. package/dist/run/paths.js +1 -1
  387. package/dist/run/preflight-receipts.js +1 -1
  388. package/dist/run/pricing.d.ts +11 -6
  389. package/dist/run/pricing.js +22 -15
  390. package/dist/run/projection.d.ts +46 -46
  391. package/dist/run/projection.js +57 -57
  392. package/dist/run/reclaim.d.ts +1 -1
  393. package/dist/run/reclaim.js +3 -3
  394. package/dist/run/results.d.ts +5 -5
  395. package/dist/run/run-cost.d.ts +53 -0
  396. package/dist/run/run-cost.js +105 -0
  397. package/dist/run/run-index-analysis.d.ts +15 -0
  398. package/dist/run/run-index-analysis.js +77 -0
  399. package/dist/run/run-index.d.ts +19 -7
  400. package/dist/run/run-index.js +77 -64
  401. package/dist/run/run-not-found.d.ts +5 -0
  402. package/dist/run/run-not-found.js +15 -0
  403. package/dist/run/run.d.ts +6 -5
  404. package/dist/run/run.js +3 -3
  405. package/dist/run/sandbox-receipts.d.ts +2 -2
  406. package/dist/run/sandbox-receipts.js +3 -3
  407. package/dist/run/shared-world-evidence.d.ts +37 -36
  408. package/dist/run/shared-world-evidence.js +4 -4
  409. package/dist/run/shared-world-shape.d.ts +1 -1
  410. package/dist/run/shared-world-shape.js +7 -7
  411. package/dist/run/stats.d.ts +14 -8
  412. package/dist/run/stats.js +121 -63
  413. package/dist/run/status.d.ts +16 -29
  414. package/dist/run/status.js +10 -29
  415. package/dist/run/stored-runs.js +2 -1
  416. package/dist/run/stream-shape.js +1 -1
  417. package/dist/run/streams.d.ts +7 -7
  418. package/dist/run/study-provenance.d.ts +49 -0
  419. package/dist/run/study-provenance.js +66 -0
  420. package/dist/run/study-result.d.ts +11 -0
  421. package/dist/run/study-result.js +9 -0
  422. package/dist/run/text.d.ts +2 -0
  423. package/dist/run/text.js +4 -0
  424. package/dist/run-study.d.ts +112 -0
  425. package/dist/{run-lab.js → run-study.js} +52 -47
  426. package/dist/{lab → study}/adapter-extension.d.ts +15 -27
  427. package/dist/{lab → study}/adapter-extension.js +10 -45
  428. package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
  429. package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
  430. package/dist/study/composition-rules.d.ts +7 -0
  431. package/dist/{lab → study}/composition-rules.js +53 -53
  432. package/dist/study/config.d.ts +15 -0
  433. package/dist/{lab → study}/config.js +98 -41
  434. package/dist/study/convert.d.ts +33 -0
  435. package/dist/study/convert.js +432 -0
  436. package/dist/{lab → study}/device-presets.d.ts +10 -10
  437. package/dist/{lab → study}/device-presets.js +11 -11
  438. package/dist/study/discover.d.ts +75 -0
  439. package/dist/{lab → study}/discover.js +134 -95
  440. package/dist/{lab → study}/doctor.d.ts +19 -12
  441. package/dist/{lab → study}/doctor.js +58 -20
  442. package/dist/study/field-paths.d.ts +12 -0
  443. package/dist/study/field-paths.js +126 -0
  444. package/dist/study/files.d.ts +26 -0
  445. package/dist/study/files.js +44 -0
  446. package/dist/{lab → study}/init-templates.d.ts +2 -2
  447. package/dist/study/init-templates.js +421 -0
  448. package/dist/{lab → study}/init.d.ts +2 -2
  449. package/dist/{lab → study}/init.js +46 -11
  450. package/dist/study/keys.d.ts +4 -0
  451. package/dist/{lab → study}/keys.js +46 -12
  452. package/dist/study/migrate.d.ts +48 -0
  453. package/dist/study/migrate.js +408 -0
  454. package/dist/study/owned-files.d.ts +38 -0
  455. package/dist/study/owned-files.js +182 -0
  456. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  457. package/dist/{lab → study}/parse/actors.js +14 -14
  458. package/dist/study/parse/comms.d.ts +12 -0
  459. package/dist/{lab → study}/parse/comms.js +5 -5
  460. package/dist/study/parse/execution.d.ts +19 -0
  461. package/dist/{lab → study}/parse/execution.js +13 -13
  462. package/dist/study/parse/study-v3.d.ts +21 -0
  463. package/dist/study/parse/study-v3.js +259 -0
  464. package/dist/study/parse/subject-state.d.ts +30 -0
  465. package/dist/{lab → study}/parse/subject-state.js +19 -19
  466. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  467. package/dist/{lab → study}/parse/subject.js +34 -34
  468. package/dist/{lab → study}/parse/values.d.ts +3 -3
  469. package/dist/{lab → study}/parse/values.js +3 -3
  470. package/dist/{lab → study}/persona-resolve.d.ts +8 -8
  471. package/dist/{lab → study}/persona-resolve.js +6 -6
  472. package/dist/{lab → study}/plan-base.d.ts +7 -7
  473. package/dist/{lab → study}/plan-base.js +1 -1
  474. package/dist/{lab → study}/plan-participants.d.ts +12 -12
  475. package/dist/{lab → study}/plan-participants.js +4 -4
  476. package/dist/{lab → study}/plan-types.d.ts +31 -31
  477. package/dist/{lab → study}/plan-types.js +2 -2
  478. package/dist/study/plan.d.ts +13 -0
  479. package/dist/study/plan.js +101 -0
  480. package/dist/study/preflight-probes.d.ts +3 -0
  481. package/dist/{lab → study}/preflight-probes.js +20 -19
  482. package/dist/study/preflight-result.d.ts +8 -0
  483. package/dist/{lab → study}/preflight-result.js +5 -4
  484. package/dist/study/preflight.d.ts +94 -0
  485. package/dist/{lab → study}/preflight.js +12 -12
  486. package/dist/{lab → study}/requirements.d.ts +3 -3
  487. package/dist/{lab → study}/requirements.js +1 -1
  488. package/dist/study/route-inputs.d.ts +28 -0
  489. package/dist/{lab → study}/route-inputs.js +1 -1
  490. package/dist/{lab → study}/routing.d.ts +39 -33
  491. package/dist/{lab → study}/routing.js +60 -29
  492. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
  493. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
  494. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
  495. package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
  496. package/dist/study/run-study-options.d.ts +28 -0
  497. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
  498. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
  499. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  500. package/dist/{lab → study}/summary.d.ts +16 -15
  501. package/dist/{lab → study}/summary.js +21 -21
  502. package/dist/{lab → study}/tasks.d.ts +18 -18
  503. package/dist/{lab → study}/tasks.js +14 -14
  504. package/dist/{lab → study}/types.d.ts +202 -196
  505. package/dist/{lab → study}/types.js +3 -1
  506. package/dist/{lab → study}/validation.d.ts +27 -27
  507. package/dist/{lab → study}/validation.js +53 -51
  508. package/dist/study/warnings.d.ts +12 -0
  509. package/dist/{lab → study}/warnings.js +62 -34
  510. package/dist/subject/clone.d.ts +7 -7
  511. package/dist/subject/clone.js +2 -2
  512. package/dist/subject/desktop-cli.d.ts +1 -1
  513. package/dist/subject/desktop-cli.js +2 -2
  514. package/dist/subject/local-tree-archive.d.ts +2 -2
  515. package/dist/subject/local-tree-archive.js +4 -4
  516. package/dist/subject/local-tree.d.ts +4 -4
  517. package/dist/subject/node-bootstrap.js +1 -1
  518. package/dist/subject/runtime.js +9 -10
  519. package/dist/subject/serve.d.ts +5 -5
  520. package/dist/subject/serve.js +3 -3
  521. package/dist/subject/state.d.ts +4 -4
  522. package/dist/subject/state.js +1 -1
  523. package/dist/subject/steps.d.ts +6 -6
  524. package/dist/subject/steps.js +5 -5
  525. package/dist/substrates/command-failure.d.ts +3 -3
  526. package/dist/substrates/command-failure.js +3 -3
  527. package/dist/substrates/desktop-session.js +2 -2
  528. package/dist/substrates/detached.d.ts +6 -6
  529. package/dist/substrates/detached.js +7 -7
  530. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  531. package/dist/substrates/e2b/cdp-probe.js +14 -17
  532. package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
  533. package/dist/substrates/e2b/desktop-browser.js +9 -9
  534. package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
  535. package/dist/substrates/e2b/desktop-cdp.js +9 -9
  536. package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
  537. package/dist/substrates/e2b/desktop-executor.js +13 -13
  538. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  539. package/dist/substrates/e2b/desktop-geometry.js +8 -8
  540. package/dist/substrates/e2b/desktop-media.d.ts +4 -4
  541. package/dist/substrates/e2b/desktop-media.js +1 -1
  542. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  543. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  544. package/dist/substrates/e2b/lifetime.js +1 -1
  545. package/dist/substrates/e2b/sandbox.d.ts +4 -4
  546. package/dist/substrates/e2b/sandbox.js +2 -2
  547. package/dist/substrates/e2b/sdk.d.ts +12 -12
  548. package/dist/substrates/e2b/sdk.js +7 -7
  549. package/dist/substrates/local/runtime-config.d.ts +4 -4
  550. package/dist/substrates/local/runtime-config.js +4 -4
  551. package/dist/tui/actions.d.ts +1 -1
  552. package/dist/tui/actions.js +13 -13
  553. package/dist/tui/contract.d.ts +23 -23
  554. package/dist/tui/contract.js +11 -11
  555. package/dist/tui/launch.d.ts +7 -7
  556. package/dist/tui/launch.js +36 -31
  557. package/dist/tui/project.js +5 -5
  558. package/dist/tui-app.js +139 -139
  559. package/dist/verify/actor.d.ts +8 -8
  560. package/dist/verify/actor.js +36 -36
  561. package/dist/verify/artifacts.d.ts +2 -2
  562. package/dist/verify/artifacts.js +3 -3
  563. package/dist/verify/context-growth.d.ts +9 -0
  564. package/dist/verify/context-growth.js +62 -0
  565. package/dist/verify/costs.d.ts +6 -6
  566. package/dist/verify/costs.js +8 -8
  567. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  568. package/dist/verify/shared-world-concurrent.js +79 -76
  569. package/dist/verify/shared-world.d.ts +2 -2
  570. package/dist/verify/shared-world.js +16 -16
  571. package/dist/verify/subject.d.ts +5 -5
  572. package/dist/verify/subject.js +19 -19
  573. package/dist/verify/verify.js +94 -44
  574. package/docs/README.md +25 -32
  575. package/docs/architecture/actor-contract.md +60 -91
  576. package/docs/architecture/browser-control.md +1 -1
  577. package/docs/architecture/desktop-sessions.md +7 -7
  578. package/docs/architecture/external-public-shared-world.md +68 -65
  579. package/docs/architecture/github-feedback-loop.md +2 -5
  580. package/docs/architecture/guest-desktop.md +2 -2
  581. package/docs/architecture/observer.md +34 -34
  582. package/docs/architecture/restricted-codex-analysis.md +34 -28
  583. package/docs/architecture/serve.md +34 -37
  584. package/docs/architecture/state-driven-executor.md +55 -58
  585. package/docs/architecture/task-protocol-support.md +6 -6
  586. package/docs/architecture/terminal-product-route.md +70 -110
  587. package/docs/contracts/README.md +24 -0
  588. package/docs/contracts/adapter-admission.md +3 -3
  589. package/docs/contracts/adapter-fixtures.md +4 -7
  590. package/docs/contracts/core.md +1 -3
  591. package/docs/contracts/errors.md +62 -0
  592. package/docs/contracts/feedback.md +8 -9
  593. package/docs/contracts/policy.md +7 -12
  594. package/docs/contracts/run-bundle.md +42 -44
  595. package/docs/contracts/schemas.md +446 -368
  596. package/docs/contracts/study-analysis.md +7 -4
  597. package/docs/contracts/study-costs.md +28 -9
  598. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  599. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  600. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  601. package/docs/principles/actor-fidelity.md +4 -4
  602. package/docs/principles/engineering.md +3 -3
  603. package/docs/principles/invariants-and-defaults.md +38 -38
  604. package/docs/principles/self-driving-harness.md +1 -5
  605. package/docs/principles/three-roles.md +1 -1
  606. package/docs/product/automatic-analysis.md +7 -7
  607. package/examples/README.md +1 -1
  608. package/examples/participant/README.md +5 -5
  609. package/examples/participant/run.mjs +11 -10
  610. package/examples/scorer/README.md +3 -3
  611. package/examples/scorer/run.mjs +11 -12
  612. package/examples/scorer/scorer.mjs +3 -3
  613. package/package.json +16 -17
  614. package/skills/humanish/SKILL.md +64 -60
  615. package/skills/humanish/agents/openai.yaml +1 -1
  616. package/AGENTS.md +0 -99
  617. package/CONTRIBUTING.md +0 -148
  618. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  619. package/dist/actors/codex/qualified-versions.js +0 -132
  620. package/dist/cli/commands/lab-format.d.ts +0 -8
  621. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  622. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  623. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  624. package/dist/cli/commands/lab-run.d.ts +0 -9
  625. package/dist/cli/commands/lab.d.ts +0 -3
  626. package/dist/cli/commands/lab.js +0 -199
  627. package/dist/cli/renamed-options.d.ts +0 -11
  628. package/dist/cli/renamed-options.js +0 -18
  629. package/dist/lab/composition-rules.d.ts +0 -7
  630. package/dist/lab/config.d.ts +0 -7
  631. package/dist/lab/discover.d.ts +0 -65
  632. package/dist/lab/init-templates.js +0 -416
  633. package/dist/lab/keys.d.ts +0 -2
  634. package/dist/lab/parse/comms.d.ts +0 -12
  635. package/dist/lab/parse/execution.d.ts +0 -19
  636. package/dist/lab/parse/subject-state.d.ts +0 -30
  637. package/dist/lab/plan.d.ts +0 -19
  638. package/dist/lab/plan.js +0 -132
  639. package/dist/lab/preflight-probes.d.ts +0 -3
  640. package/dist/lab/preflight-result.d.ts +0 -7
  641. package/dist/lab/preflight.d.ts +0 -92
  642. package/dist/lab/route-inputs.d.ts +0 -28
  643. package/dist/lab/run-lab-options.d.ts +0 -28
  644. package/dist/lab/warnings.d.ts +0 -2
  645. package/dist/observer/static.d.ts +0 -39
  646. package/dist/observer/static.js +0 -369
  647. package/dist/run-lab.d.ts +0 -112
  648. package/docs/architecture/comms-inbox.md +0 -122
  649. package/docs/architecture/desktop-recording.md +0 -80
  650. package/docs/architecture/local-browser-runtime.md +0 -178
  651. package/docs/architecture/observer-review.md +0 -144
  652. package/docs/architecture/participant-media.md +0 -90
  653. package/docs/architecture/project-layout.md +0 -62
  654. package/docs/architecture/real-email-receiving.md +0 -136
  655. package/docs/assets/humanish-drawdb-hero.png +0 -0
  656. package/docs/assets/humanish-observer-hero.png +0 -0
  657. package/docs/goals/current.md +0 -207
  658. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  659. package/docs/product/open-source-install-experience.md +0 -240
  660. package/docs/ramp/README.md +0 -295
  661. package/docs/release/open-source-readiness.md +0 -222
  662. package/docs/release/public-readiness-standard.md +0 -210
  663. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  664. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  665. /package/dist/{lab → study}/init-paths.js +0 -0
  666. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  667. /package/dist/{lab → study}/init-plan.js +0 -0
  668. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  669. /package/dist/{lab → study}/participant-assignment.js +0 -0
  670. /package/dist/{lab → study}/persona.d.ts +0 -0
  671. /package/dist/{lab → study}/persona.js +0 -0
@@ -1,5 +1,5 @@
1
1
  // Finishing a live terminal session: the actor trace from the captured stream, the spend ledger
2
- // and its caps check, the evidence files, the bundle, and the lab result.
2
+ // and its caps check, the evidence files, the bundle, and the study result.
3
3
  import { buildRunCostSummary } from "../../run/cost-summary.js";
4
4
  import { writeContainedOutputFile } from "../../run/contained-output.js";
5
5
  import { validatePreparedRunArtifactPaths, } from "../../run/paths.js";
@@ -9,7 +9,7 @@ import { applyAdapterExtensionSeam } from "./adapter.js";
9
9
  import { buildLiveTerminalProductBundle } from "./bundle.js";
10
10
  import { buildCostLedger, buildNoSpendProof, describeMeasuredSpend, evaluateCapsAgainstLedger, noSpendLineMeasured, noSpendNotEstablished, } from "./ledger.js";
11
11
  import { foldScorerFailures, judgeExecution, judgeTerminal, OUTCOME_POLICIES, } from "../../run/judge.js";
12
- import { terminalExecutionFailures, terminalLabResult, terminalParticipantFacts, } from "./result.js";
12
+ import { terminalExecutionFailures, terminalStudyResult, terminalParticipantFacts, } from "./result.js";
13
13
  import { parseTerminalTokenUsage } from "./token-usage.js";
14
14
  import { buildTerminalActorTrace, scrubSplitKnownValues, tailOf } from "./trace.js";
15
15
  function buildLiveTrace(inputs) {
@@ -25,7 +25,7 @@ function buildLiveTrace(inputs) {
25
25
  // Build the actor trace first (the cost ledger reads its tokenUsage).
26
26
  const normalizedTranscript = normalizeLocalActorTranscript(terminalEvents.map((e) => e.chunk).join(""));
27
27
  // Parsed from the full stream: usage records arrive once per turn, and the tail
28
- // would drop all but the last (#531).
28
+ // would drop all but the last.
29
29
  const terminalTokenUsage = parseTerminalTokenUsage(normalizedTranscript);
30
30
  const trace = buildTerminalActorTrace({
31
31
  persona,
@@ -71,14 +71,14 @@ async function settleLiveLedgers(inputs, trace, normalizedTranscript) {
71
71
  });
72
72
  const noSpendProof = buildNoSpendProof(cost, maxUsd ?? null, trace.tokenUsage);
73
73
  const proofVerdict = !noSpendProof.satisfied
74
- ? `No-spend proof NOT satisfied for maxUsd=${maxUsd ?? "null"}.`
74
+ ? `No-spend proof not satisfied for maxUsd=${maxUsd ?? "null"}.`
75
75
  : noSpendLineMeasured(noSpendProof)
76
76
  ? noSpendNotEstablished(maxUsd ?? 0)
77
77
  : `No-spend proof satisfied on the measured lines for maxUsd=${maxUsd ?? "null"}.`;
78
78
  const measuredSpend = describeMeasuredSpend(cost, trace.tokenUsage);
79
79
  recordLifecycle("terminal-lab.cost.measured", `Cost ledger: known total ${cost.knownTotalUsd} USD${cost.fullyMeasured ? " (fully measured)" : " (lower bound)"}.${measuredSpend.length > 0 ? ` ${measuredSpend}` : ""} ${proofVerdict}`);
80
80
  // Fail-closed caps enforcement: if a known spend line exceeds maxUsd (or a
81
- // known job count exceeds maxJobs), the run fails closed — never a green result. Unknowns (null)
81
+ // known job count exceeds maxJobs), the run fails closed with no green result. Unknowns (null)
82
82
  // never trip the cap (we cannot claim a violation we did not measure) but never grant a pass
83
83
  // either (the no-spend proof reports them as unmeasured). maxMinutes is already wall-clock-
84
84
  // enforced above. A blown cap is an execution failure: the agent's own status stays the
@@ -125,8 +125,8 @@ export async function finishLiveTerminalSession(inputs) {
125
125
  const bundle = buildLiveTerminalProductBundle({
126
126
  run,
127
127
  actorId: plan.actor,
128
- labId: plan.labId,
129
- ...(plan.title ? { labTitle: plan.title } : {}),
128
+ studyId: plan.studyId,
129
+ ...(plan.title ? { studyTitle: plan.title } : {}),
130
130
  mission: sanitize(mission),
131
131
  persona,
132
132
  productName: product.name,
@@ -161,7 +161,7 @@ export async function finishLiveTerminalSession(inputs) {
161
161
  ledgers,
162
162
  transcript: normalizedTranscript,
163
163
  product: product.name,
164
- labId: plan.labId,
164
+ studyId: plan.studyId,
165
165
  runId,
166
166
  sanitize,
167
167
  warnings,
@@ -182,9 +182,9 @@ export async function finishLiveTerminalSession(inputs) {
182
182
  cleanup: session.cleanup,
183
183
  observer,
184
184
  }), OUTCOME_POLICIES.terminal);
185
- const result = terminalLabResult({
185
+ const result = terminalStudyResult({
186
186
  cwd,
187
- labId: plan.labId,
187
+ studyId: plan.studyId,
188
188
  actorId: plan.actor,
189
189
  productName: product.name,
190
190
  runId,
@@ -5,7 +5,7 @@ import type { buildRuntimeAuth, buildSandboxMetadata } from "./credentials.js";
5
5
  import type { createTerminalRecorder } from "./recorder.js";
6
6
  import { type declaredRuntimeProvenance } from "./runtime.js";
7
7
  import { type LiveTerminalPlan, type TerminalLedgers } from "./types.js";
8
- import type { LabDeps } from "../../lab/lab-deps.js";
8
+ import type { StudyDeps } from "../../study/study-deps.js";
9
9
  type StartedRun = Extract<Awaited<ReturnType<RunScope["startRun"]>>, {
10
10
  ok: true;
11
11
  }>["run"];
@@ -13,7 +13,7 @@ type StartedRun = Extract<Awaited<ReturnType<RunScope["startRun"]>>, {
13
13
  export interface LiveSandboxInputs {
14
14
  plan: LiveTerminalPlan;
15
15
  cwd: string;
16
- deps: LabDeps;
16
+ deps: StudyDeps;
17
17
  now: () => number;
18
18
  nowIso: () => string;
19
19
  sanitize: (text: string) => string;
@@ -18,6 +18,7 @@ import { TERMINAL_RUNTIME_VERSION_TIMEOUT_MS, buildRuntimeExecPrefix, buildRunti
18
18
  import { runWithWallClock, teardownSandbox } from "./sandbox.js";
19
19
  import { DEFAULT_REQUEST_TIMEOUT_MS, PRODUCT_SETUP_TIMEOUT_MS, SANDBOX_WORKDIR, UPLOAD_MAX_BYTES, } from "./types.js";
20
20
  import { terminalSandboxTimeoutMs } from "./lifetime.js";
21
+ import { plural } from "../../run/text.js";
21
22
  export class LiveTerminalSandbox {
22
23
  status = "failed";
23
24
  completionReason = "harness_error";
@@ -56,7 +57,7 @@ export class LiveTerminalSandbox {
56
57
  const { warnings } = this.inputs;
57
58
  const { recordLifecycle } = this.inputs.recorder;
58
59
  const { requestTimeoutMs, sandboxTimeoutMs } = this;
59
- // Declared egress allowlist, or undefined for the historical unrestricted default (#538).
60
+ // Declared egress allowlist, or undefined for the historical unrestricted default.
60
61
  const egressAllow = plan.egressAllow;
61
62
  const sandboxModule = await (deps.desktopModule ?? loadE2BDesktopModule)();
62
63
  this.module = sandboxModule;
@@ -99,7 +100,7 @@ export class LiveTerminalSandbox {
99
100
  this.sandboxId = sandboxId;
100
101
  this.createdAtMs = now();
101
102
  await validatePreparedRunArtifactPaths(runPaths);
102
- recordLifecycle("terminal-lab.sandbox.created", `E2B shell sandbox ${sandboxId} created with positive-allowlist metadata and kill-on-timeout; NO sandbox-global env.`);
103
+ recordLifecycle("terminal-lab.sandbox.created", `E2B shell sandbox ${sandboxId} created with allowlisted metadata and kill-on-timeout, and with no sandbox-wide environment variables.`);
103
104
  const sandboxResources = await observeDesktopResources(sandbox);
104
105
  this.resources = sandboxResources;
105
106
  if ("reason" in sandboxResources) {
@@ -108,8 +109,8 @@ export class LiveTerminalSandbox {
108
109
  // The allowlist is evidence: a reader of the ledger can see exactly what the participant was
109
110
  // able to reach, without the ledger carrying any secret.
110
111
  recordLifecycle("terminal-lab.egress.policy", egressAllow === undefined
111
- ? "Egress UNRESTRICTED (no execution.egressAllow declared)."
112
- : `Egress routing allowlist: ${egressAllow.length} declared host(s): ${egressAllow.join(", ")}; deny-all fallback. Domain routing is not strict destination isolation on shared infrastructure.`);
112
+ ? "Egress is unrestricted (no execution.egressAllow declared)."
113
+ : `Egress routing allowlist: ${plural(egressAllow.length, "declared host")}: ${egressAllow.join(", ")}; deny-all fallback. Domain routing is not strict destination isolation on shared infrastructure.`);
113
114
  recordLifecycle("terminal-lab.runtime-auth", runtimeEnv.mode === "openai-egress"
114
115
  ? "Runtime auth openai-egress: raw key remains outside the sandbox in the api.openai.com HTTPS Authorization transform; Codex receives an inert CODEX_API_KEY placeholder and the default OpenAI endpoint. Every sandbox process, including bootstrap/setup, can spend via this proxy; no added routing restriction or provider spending limit."
115
116
  : `Runtime auth openai-env: raw key from ${runtimeEnv.keyName} is passed command-scoped to Codex and inherited by its child processes.`);
@@ -131,7 +132,7 @@ export class LiveTerminalSandbox {
131
132
  const { requestTimeoutMs } = this;
132
133
  // --- Runtime bootstrap: no runtime env; openai-egress proxy capability is already available. ---
133
134
  // The stock desktop needs Node/npm on `PATH` before npx can run Codex. Reuse a working
134
- // installation or install the pinned official binary after checksum verification (#674).
135
+ // installation or install the pinned official binary after checksum verification.
135
136
  // No raw runtime key touches this step; the egress proxy, when selected, is already available.
136
137
  const bootstrapStartedAt = now();
137
138
  let bootstrapError;
@@ -149,7 +150,7 @@ export class LiveTerminalSandbox {
149
150
  }
150
151
  const bootstrapDurationMs = Math.max(0, now() - bootstrapStartedAt);
151
152
  recordLifecycle("terminal-lab.runtime.bootstrapped", bootstrapError
152
- ? `Runtime bootstrap FAILED after ${bootstrapDurationMs}ms: ${bootstrapError}. codex exec runs via npx and needs Node/npm present; the participant fails closed rather than attempting an exec with no runtime.`
153
+ ? `Runtime bootstrap failed after ${bootstrapDurationMs}ms: ${bootstrapError}. codex exec runs through npx and needs Node and npm, so the participant stops here instead of starting codex with no runtime.`
153
154
  : `Runtime bootstrap ensured Node/npm present in ${bootstrapDurationMs}ms (codex exec runs via npx).`);
154
155
  if (bootstrapError) {
155
156
  // Fail closed as a structured route status (never a raw throw): no codex exec is attempted
@@ -207,7 +208,7 @@ export class LiveTerminalSandbox {
207
208
  // Same channel and same guarantees as the runtime bootstrap above: no runtime key touches it,
208
209
  // and a failure fails the run closed rather than handing the agent a half-built world. It
209
210
  // exists so a study can put the participant in a prepared project: asking an agent what
210
- // studies a project contains, in an empty directory, measures the lab and not the product
211
+ // studies a project contains, in an empty directory, measures the study and not the product
211
212
  // (learned the hard way on the desktop route, labs/tui-self-study.yaml).
212
213
  const install = plan.product.install;
213
214
  if (install === undefined)
@@ -259,7 +260,7 @@ export class LiveTerminalSandbox {
259
260
  const setup = await this.sandbox.commands.run(`${uploadAssignment}cd ${SANDBOX_WORKDIR} && ${install}`, {
260
261
  // The install step may run the product itself (release:dogfood's does: `humanish init
261
262
  // --yes`); on the 0.67.0 dogfood that one command arrived unmarked while the participant's
262
- // nine others carried the marker (#546).
263
+ // nine others carried the marker.
263
264
  envs: { HUMANISH_STUDY_PARTICIPANT: "1" },
264
265
  requestTimeoutMs,
265
266
  timeoutMs: PRODUCT_SETUP_TIMEOUT_MS,
@@ -272,7 +273,7 @@ export class LiveTerminalSandbox {
272
273
  setupError = toErrorMessage(error);
273
274
  }
274
275
  recordLifecycle("terminal-lab.product.prepared", setupError
275
- ? `Product setup FAILED after ${Math.max(0, now() - setupStartedAt)}ms: ${sanitize(setupError)}`
276
+ ? `Product setup failed after ${Math.max(0, now() - setupStartedAt)}ms: ${sanitize(setupError)}`
276
277
  : `Product setup completed in ${Math.max(0, now() - setupStartedAt)}ms (no runtime env; declared egress auth may already be available).`);
277
278
  if (setupError) {
278
279
  this.status = "failed";
@@ -292,8 +293,8 @@ export class LiveTerminalSandbox {
292
293
  const { requestTimeoutMs, wallClockMs } = this;
293
294
  // --- The keyed run: `codex exec --json` non-interactively (stdin disabled). ---
294
295
  // openai-env passes the real key here; openai-egress passes an inert placeholder. stdin is
295
- // never wired (safety contract item 7) — commands.run takes no stdin channel. The command's
296
- // wall-clock is bounded by maxMinutes (safety contract item 2): commands.run timeoutMs +
296
+ // never wired: commands.run takes no stdin channel. The command's
297
+ // wall-clock is bounded by maxMinutes: commands.run timeoutMs +
297
298
  // an injected-clock guard so a mock/real run that exceeds it is killed and fails closed.
298
299
  const codexCommand = buildCodexExecCommand({
299
300
  workdir: SANDBOX_WORKDIR,
@@ -312,8 +313,7 @@ export class LiveTerminalSandbox {
312
313
  const result = await runWithWallClock(this.sandbox.commands.run(codexCommand, {
313
314
  // The selected command env (raw key or inert placeholder). The participant
314
315
  // marker rides the same command: humanish telemetry from inside a study reads as a new
315
- // adopter otherwise. #546 added the flag and nothing set it; the 0.66.0 dogfood
316
- // participant's twelve commands arrived unmarked.
316
+ // adopter otherwise.
317
317
  envs: { ...runtimeEnv.envs, HUMANISH_STUDY_PARTICIPANT: "1" },
318
318
  requestTimeoutMs,
319
319
  timeoutMs: wallClockMs,
@@ -404,7 +404,7 @@ export class LiveTerminalSandbox {
404
404
  const { now, sanitize, warnings } = this.inputs;
405
405
  const { recordLifecycle } = this.inputs.recorder;
406
406
  const { requestTimeoutMs } = this;
407
- // --- Safety contract item 8: proven cleanup, by exact id, never Sandbox.list. ---
407
+ // --- Proven cleanup, by exact id, never Sandbox.list. ---
408
408
  this.cleanup = await teardownSandbox({
409
409
  allocation: this.allocation,
410
410
  sandboxModule: this.module,
@@ -439,7 +439,7 @@ function buildCodexExecCommand(args) {
439
439
  // the prompt rides as the final positional arg, shell-quoted. codex exec --json runs once and
440
440
  // exits (no interactive loop). --skip-git-repo-check: the workdir is a fresh scratch dir.
441
441
  // Pinned via npx (never an ambient/preinstalled `codex` binary, which the stock @e2b/desktop
442
- // image does not ship, per issue #159); npm_config_update_notifier=false silences npx's own
442
+ // image does not ship); npm_config_update_notifier=false silences npx's own
443
443
  // update check so it cannot leak into the captured stdout the scorer/redactor parse.
444
444
  const quotedPrompt = shellQuote(args.prompt);
445
445
  // --dangerously-bypass-approvals-and-sandbox: codex's own inner sandbox is
@@ -1,5 +1,6 @@
1
1
  import { normalizeLocalActorTranscript } from "../../run/terminal-contract.js";
2
2
  import { MESSAGE_CHARS, PENDING_LINE_CHARS, TEXT_ITEMS_BYTES, TEXT_ITEMS_MAX } from "./types.js";
3
+ import { plural } from "../../run/text.js";
3
4
  const itemEvents = new Set(["item.started", "item.updated", "item.completed"]);
4
5
  const nonempty = (value) => typeof value === "string" && value.trim().length > 0;
5
6
  const object = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
@@ -148,7 +149,7 @@ export function createTerminalParticipantReader(sanitize) {
148
149
  if (droppedLines > 0)
149
150
  notices.push([
150
151
  "agent output lines skipped",
151
- `Skipped ${droppedLines} stdout line(s) that ran past ${PENDING_LINE_CHARS} characters without a newline. Items on those lines are not in this trace or its counts.`,
152
+ `Skipped ${plural(droppedLines, "stdout line")} that ran past ${PENDING_LINE_CHARS} characters without a newline. Items on those lines are not in this trace or its counts.`,
152
153
  ]);
153
154
  notices.forEach(([title, text], index) => items.push({
154
155
  id: `notice-${String(index + 1).padStart(3, "0")}`,
@@ -1,6 +1,6 @@
1
1
  import type { ActorPersonaRef } from "../../actors/contract.js";
2
- import { type ResolvedPersona } from "../../lab/persona.js";
3
- import type { TerminalPlan } from "../../lab/plan-types.js";
2
+ import { type ResolvedPersona } from "../../study/persona.js";
3
+ import type { TerminalPlan } from "../../study/plan-types.js";
4
4
  /** A terminal run's persona, resolved against the project's committed persona files. */
5
5
  export interface TerminalPersona {
6
6
  personaId: string;
@@ -3,14 +3,14 @@
3
3
  // record come from one place. Each path keeps its own prompt and its own set of scrubbed secrets.
4
4
  import { realpath } from "node:fs/promises";
5
5
  import path from "node:path";
6
- import { personaBrief, personaToDirectives, renderPersonaPromptSection, } from "../../lab/persona.js";
7
- import { resolveCommittedPersona } from "../../lab/persona-resolve.js";
6
+ import { personaBrief, personaToDirectives, renderPersonaPromptSection, } from "../../study/persona.js";
7
+ import { resolveCommittedPersona } from "../../study/persona-resolve.js";
8
8
  import { prepareSelectedOutputDirectory } from "../../run/contained-output.js";
9
9
  /** Resolves the plan's persona; the resolver's warnings go into `warnings`. */
10
10
  export async function resolveTerminalPersona(args) {
11
11
  const personaId = args.plan.personaId ?? "autonomous-terminal-agent";
12
12
  const physicalCwd = await realpath(args.cwd);
13
- // Resolve the committed persona so its traits actually shape the agent prompt (#308); fail-safe to
13
+ // Resolve the committed persona so its traits actually shape the agent prompt; fail-safe to
14
14
  // the bare persona id (no traits applied) when no persona file is committed.
15
15
  const projectRoot = await prepareSelectedOutputDirectory(path.dirname(physicalCwd), physicalCwd);
16
16
  const { persona, warnings } = await resolveCommittedPersona(projectRoot, personaId);
@@ -1,16 +1,16 @@
1
- import type { RoutePlanResult, RouteRefusal, TerminalPlan } from "../../lab/plan-types.js";
2
- import type { LabConfig } from "../../lab/types.js";
3
- import { type TerminalProductLabResult } from "./types.js";
4
- /** The error a terminal lab returns before a run starts. `actor` names the registered actor. */
5
- export interface TerminalRefusal extends RouteRefusal<"terminal", NonNullable<TerminalProductLabResult["error"]>["code"]> {
1
+ import type { RoutePlanResult, RouteRefusal, TerminalPlan } from "../../study/plan-types.js";
2
+ import type { StudyConfig } from "../../study/types.js";
3
+ import { type TerminalProductStudyResult } from "./types.js";
4
+ /** The error a terminal study returns before a run starts. `actor` names the registered actor. */
5
+ export interface TerminalRefusal extends RouteRefusal<"terminal", NonNullable<TerminalProductStudyResult["error"]>["code"]> {
6
6
  readonly actor?: string;
7
7
  }
8
8
  export type TerminalPlanResult = RoutePlanResult<TerminalPlan, TerminalRefusal>;
9
9
  /**
10
- * Plan a terminal-product lab. It is called for any config handed to the terminal runner, not
10
+ * Plan a terminal-product study. It is called for any config handed to the terminal runner, not
11
11
  * only one routeOf sends here, so a config for another route gets this route's refusal.
12
12
  */
13
- export declare function planTerminalLab(config: LabConfig, input: {
13
+ export declare function planTerminalStudy(config: StudyConfig, input: {
14
14
  readonly dryRun: boolean;
15
15
  /** A test's costProbe can measure spend lines, so a positive maxUsd can trip. */
16
16
  readonly hasCostProbe?: boolean;
@@ -5,48 +5,48 @@ import { DEFAULT_OPENAI_CU_MODEL } from "../../actors/computer-use/openai-provid
5
5
  import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
6
6
  import { isReasoningEffort } from "../../actors/reasoning-effort.js";
7
7
  import { actorRegistry, isTerminalActorDescriptor } from "../../actors/registry.js";
8
- import { isNonEmpty, planBase } from "../../lab/plan-base.js";
9
- import { desktopMediaValidationReason, taskProtocolValidationReason, } from "../../lab/validation.js";
8
+ import { isNonEmpty, planBase } from "../../study/plan-base.js";
9
+ import { desktopMediaValidationReason, taskProtocolValidationReason, } from "../../study/validation.js";
10
10
  import { MAX_SANDBOX_MS } from "../../substrates/e2b/lifetime.js";
11
11
  import { NODE_BOOTSTRAP_TIMEOUT_MS } from "../../subject/node-bootstrap.js";
12
12
  import { terminalSandboxTimeoutMs } from "./lifetime.js";
13
13
  import { isExactRuntimeVersion, TERMINAL_RUNTIME_VERSION_TIMEOUT_MS } from "./runtime.js";
14
14
  import { PRODUCT_SETUP_TIMEOUT_MS, TERMINAL_SANDBOX_TIMEOUT_BUFFER_MS, } from "./types.js";
15
15
  /**
16
- * Plan a terminal-product lab. It is called for any config handed to the terminal runner, not
16
+ * Plan a terminal-product study. It is called for any config handed to the terminal runner, not
17
17
  * only one routeOf sends here, so a config for another route gets this route's refusal.
18
18
  */
19
- export function planTerminalLab(config, input) {
19
+ export function planTerminalStudy(config, input) {
20
20
  const refuse = (code, message, actor) => ({
21
21
  ok: false,
22
22
  refusal: { route: "terminal", code, message, ...(actor === undefined ? {} : { actor }) },
23
23
  });
24
24
  if (String(config.comms?.email?.kind) === "real")
25
- return refuse("HUMANISH_TERMINAL_LAB_SUBJECT_INVALID", "Real email receiving is unsupported on the terminal route. Use a supported hosted computer-use browser lab.");
25
+ return refuse("HUMANISH_TERMINAL_SUBJECT_INVALID", "Real email receiving is unsupported on the terminal route. Use a supported hosted computer-use browser study.");
26
26
  const mediaReason = desktopMediaValidationReason(config);
27
27
  if (mediaReason)
28
- return refuse("HUMANISH_TERMINAL_LAB_SUBJECT_INVALID", mediaReason);
28
+ return refuse("HUMANISH_TERMINAL_SUBJECT_INVALID", mediaReason);
29
29
  const analysis = resolveAutomaticAnalysis(config.review?.analysis);
30
30
  if (!analysis.ok)
31
- return refuse("HUMANISH_LAB_ANALYSIS_INVALID", analysis.message);
31
+ return refuse("HUMANISH_STUDY_ANALYSIS_INVALID", analysis.message);
32
32
  const tasksReason = taskProtocolValidationReason(config, false);
33
33
  if (tasksReason)
34
- return refuse("HUMANISH_LAB_TASKS_UNSUPPORTED", tasksReason);
34
+ return refuse("HUMANISH_STUDY_TASKS_UNSUPPORTED", tasksReason);
35
35
  const actorType = config.actors[0]?.type ?? "";
36
36
  const descriptor = actorRegistry[actorType];
37
37
  if (!descriptor || !isTerminalActorDescriptor(descriptor))
38
- return refuse("HUMANISH_TERMINAL_LAB_ACTOR_UNSUPPORTED", `actors[0].type "${actorType}" is not a registered terminal actor.`);
38
+ return refuse("HUMANISH_TERMINAL_ACTOR_UNSUPPORTED", `actors[0].type "${actorType}" is not a registered terminal actor.`);
39
39
  const runtimeVersion = config.execution?.runtime?.version;
40
40
  const actor = config.actors[0];
41
41
  if ((config.execution?.runtime !== undefined && !isExactRuntimeVersion(runtimeVersion)) ||
42
42
  (actor?.model !== undefined &&
43
43
  (typeof actor.model !== "string" || actor.model.trim().length === 0)) ||
44
44
  (actor?.reasoningEffort !== undefined && !isReasoningEffort(actor.reasoningEffort)))
45
- return refuse("HUMANISH_TERMINAL_LAB_FAILED", "Terminal runtime settings require an exact Codex version, a nonempty model when declared, and a supported reasoning-effort value.");
45
+ return refuse("HUMANISH_TERMINAL_FAILED", "Terminal runtime settings require an exact Codex version, a nonempty model when declared, and a supported reasoning-effort value.");
46
46
  const product = config.subject.product;
47
47
  const surfaces = product?.publicSurfaces ?? [];
48
48
  if (!product || !product.name || !isNonEmpty(surfaces))
49
- return refuse("HUMANISH_TERMINAL_LAB_SUBJECT_INVALID", "terminal-product subjects require `subject.product` with a name and at least one public surface URL.", descriptor.id);
49
+ return refuse("HUMANISH_TERMINAL_SUBJECT_INVALID", "terminal-product subjects require `subject.product` with a name and at least one public surface URL.", descriptor.id);
50
50
  const base = planBase(config, {
51
51
  dryRun: input.dryRun,
52
52
  analysis,
@@ -82,19 +82,19 @@ export function planTerminalLab(config, input) {
82
82
  // that declares that placement may run live.
83
83
  const keyPlacement = descriptor.capabilities.keyPlacement;
84
84
  if (keyPlacement !== "in-sandbox-command-scoped")
85
- return refuse("HUMANISH_TERMINAL_LAB_KEYPLACEMENT_INVALID", `Terminal actor "${descriptor.id}" must declare keyPlacement "in-sandbox-command-scoped" for a live run (got "${String(keyPlacement)}"). The engine requires this registered default before applying the declared runtime-auth mode.`, descriptor.id);
85
+ return refuse("HUMANISH_TERMINAL_KEYPLACEMENT_INVALID", `Terminal actor "${descriptor.id}" must declare keyPlacement "in-sandbox-command-scoped" for a live run (got "${String(keyPlacement)}"). The engine requires this registered default before applying the declared runtime-auth mode.`, descriptor.id);
86
86
  // A live run grants the in-sandbox agent provider access, so a fail-closed cap must be in force.
87
87
  const maxUsd = caps?.maxUsd;
88
88
  const maxMinutes = caps?.maxMinutes;
89
89
  if (caps === undefined || maxUsd === undefined || maxMinutes === undefined || maxMinutes <= 0)
90
- return refuse("HUMANISH_TERMINAL_LAB_CAPS_MISSING", "A live terminal-product run grants provider access to the in-sandbox agent and so REQUIRES a fail-closed cap: scenario.caps with maxUsd (0 = no-spend) and a positive maxMinutes (the codex command's wall-clock kill). The live key is never exercised without a cap in force.", descriptor.id);
90
+ return refuse("HUMANISH_TERMINAL_CAPS_MISSING", "A live terminal-product run gives the agent in the sandbox access to a model provider, so it needs a cap: set scenario.caps with maxUsd (0 means no spend) and a positive maxMinutes (the time limit for the codex command). The key is used only while the cap is in force.", descriptor.id);
91
91
  // maxUsd is checked against the cost ledger after the session, and only known lines can trip it.
92
92
  // The ledger's provider line takes only provider-reported cost, which Codex does not report (the
93
93
  // token estimate in run.json is not a measurement), and core has no product, media or payment
94
94
  // signal, so without a costProbe every line is null and a positive maxUsd could never trip. That
95
95
  // cap would promise a bound nothing enforces, so it is refused; maxMinutes bounds a live run.
96
96
  if (maxUsd > 0 && input.hasCostProbe !== true)
97
- return refuse("HUMANISH_TERMINAL_LAB_UNPRICED_CAP", `scenario.caps.maxUsd=${maxUsd} cannot be enforced: Codex reports no provider cost for the participant (its token cost is only estimated after the run) and no product, media or payment spend is measured, so a positive dollar cap can never trip. Set scenario.caps.maxUsd to 0 and bound the run with scenario.caps.maxMinutes, the codex command's wall-clock kill. No sandbox was created and the runtime key was not used.`, descriptor.id);
97
+ return refuse("HUMANISH_TERMINAL_UNPRICED_CAP", `scenario.caps.maxUsd=${maxUsd} cannot be enforced: Codex reports no provider cost for the participant (its token cost is only estimated after the run) and no product, media or payment spend is measured, so a positive dollar cap can never trip. Set scenario.caps.maxUsd to 0 and bound the run with scenario.caps.maxMinutes, the codex command's wall-clock kill. No sandbox was created and the runtime key was not used.`, descriptor.id);
98
98
  // The sandbox's timeout covers the steps before the codex command, maxMinutes and the teardown
99
99
  // buffer, and E2B refuses a sandbox over an hour. Refuse here, with the arithmetic, rather than
100
100
  // after the plan prints, from a provider 400 that names neither knob.
@@ -102,7 +102,7 @@ export function planTerminalLab(config, input) {
102
102
  const sandboxTimeoutMs = terminalSandboxTimeoutMs({ maxMinutes, productInstall });
103
103
  if (sandboxTimeoutMs > MAX_SANDBOX_MS) {
104
104
  const headroomMinutes = (sandboxTimeoutMs - maxMinutes * 60_000) / 60_000;
105
- return refuse("HUMANISH_TERMINAL_LAB_CAPS_INVALID", `scenario.caps.maxMinutes ${maxMinutes} derives a ${sandboxTimeoutMs / 60_000}m sandbox deadline, and a sandbox may not live longer than ${MAX_SANDBOX_MS / 60_000}m. The deadline is maxMinutes plus ${headroomMinutes}m: the Node bootstrap (${NODE_BOOTSTRAP_TIMEOUT_MS / 60_000}m), the runtime version check (${TERMINAL_RUNTIME_VERSION_TIMEOUT_MS / 60_000}m)${productInstall ? `, the product setup (${PRODUCT_SETUP_TIMEOUT_MS / 60_000}m)` : ""} and the teardown buffer (${TERMINAL_SANDBOX_TIMEOUT_BUFFER_MS / 60_000}m). Lower scenario.caps.maxMinutes to at most ${MAX_SANDBOX_MS / 60_000 - headroomMinutes}. No sandbox was created and the runtime key was not used.`, descriptor.id);
105
+ return refuse("HUMANISH_TERMINAL_CAPS_INVALID", `scenario.caps.maxMinutes ${maxMinutes} derives a ${sandboxTimeoutMs / 60_000}m sandbox deadline, and a sandbox may not live longer than ${MAX_SANDBOX_MS / 60_000}m. The deadline is maxMinutes plus ${headroomMinutes}m: the Node bootstrap (${NODE_BOOTSTRAP_TIMEOUT_MS / 60_000}m), the runtime version check (${TERMINAL_RUNTIME_VERSION_TIMEOUT_MS / 60_000}m)${productInstall ? `, the product setup (${PRODUCT_SETUP_TIMEOUT_MS / 60_000}m)` : ""} and the teardown buffer (${TERMINAL_SANDBOX_TIMEOUT_BUFFER_MS / 60_000}m). Lower scenario.caps.maxMinutes to at most ${MAX_SANDBOX_MS / 60_000 - headroomMinutes}. No sandbox was created and the runtime key was not used.`, descriptor.id);
106
106
  }
107
107
  return {
108
108
  ok: true,
@@ -32,13 +32,13 @@ export function createTerminalRecorder(args) {
32
32
  return;
33
33
  }
34
34
  transcriptBytes += Buffer.byteLength(raw, "utf8");
35
- // Scrub, then redact, at the source (safety contract item 5). Only the participant reader below
35
+ // Scrub, then redact, at the source. Only the participant reader below
36
36
  // sees the raw bytes, and it stores none of them.
37
37
  terminalEvents.push({ at: nowIso(), stream, chunk: sanitize(raw) });
38
38
  if (stream === "stdout")
39
39
  participantText.append(raw);
40
40
  };
41
- // E2B can stream every byte through callbacks and return the same complete output (#667).
41
+ // E2B can stream every byte through callbacks and return the same complete output.
42
42
  // Track transport delivery, independently per stream, rather than deduplicating participant
43
43
  // lines or equal usage records. Hash raw callback bytes before redaction/truncation so the
44
44
  // comparison cannot confuse two values that redact identically or lose capped-away delivery.
@@ -1,7 +1,7 @@
1
1
  import type { ObserverResult } from "../../observer/render.js";
2
2
  import type { ActorCompletionReason, ActorStatus, ActorTrace } from "../../actors/contract.js";
3
3
  import { type ExecutionFailure, type ExecutionOutcome, type Judgment, type ParticipantFacts } from "../../run/judge.js";
4
- import { type NoSpendProof, type TerminalCostLedger, type TerminalLedgers, type TerminalProductLabResult } from "./types.js";
4
+ import { type NoSpendProof, type TerminalCostLedger, type TerminalLedgers, type TerminalProductStudyResult } from "./types.js";
5
5
  /**
6
6
  * What judge.ts reads from a finished terminal session, after a blown cap has overridden it. It has
7
7
  * no engagement or blocker rule: the agent's nonce-verified marker is its declared outcome.
@@ -20,10 +20,10 @@ export declare function terminalExecutionFailures(args: {
20
20
  cleanup: TerminalLedgers["cleanup"];
21
21
  observer: Pick<ObserverResult, "ok" | "error">;
22
22
  }): ExecutionFailure[];
23
- /** The terminal-product lab result for a live run, from its session, cleanup and cost ledger. */
24
- export declare function terminalLabResult(args: {
23
+ /** The terminal-product study result for a live run, from its session, cleanup and cost ledger. */
24
+ export declare function terminalStudyResult(args: {
25
25
  cwd: string;
26
- labId: string;
26
+ studyId: string;
27
27
  actorId: string;
28
28
  productName: string;
29
29
  runId: string;
@@ -44,4 +44,4 @@ export declare function terminalLabResult(args: {
44
44
  execution: ExecutionOutcome;
45
45
  observer: ObserverResult;
46
46
  warnings: string[];
47
- }): TerminalProductLabResult;
47
+ }): TerminalProductStudyResult;
@@ -1,5 +1,6 @@
1
1
  import { OUTCOME_POLICIES, participantHarnessFailed, resultOk, } from "../../run/judge.js";
2
- import { TERMINAL_PRODUCT_LAB_SCHEMA, } from "./types.js";
2
+ import {} from "./types.js";
3
+ import { studyResultIdentity } from "../../run/study-result.js";
3
4
  /**
4
5
  * What judge.ts reads from a finished terminal session, after a blown cap has overridden it. It has
5
6
  * no engagement or blocker rule: the agent's nonce-verified marker is its declared outcome.
@@ -38,21 +39,21 @@ export function terminalExecutionFailures(args) {
38
39
  : [
39
40
  {
40
41
  kind: "evidence",
41
- message: observer.error?.message ?? "Observer failed for the terminal-product lab run.",
42
+ message: observer.error?.message ?? "Observer failed for the terminal-product run.",
42
43
  },
43
44
  ]),
44
45
  ];
45
46
  }
46
- /** The terminal-product lab result for a live run, from its session, cleanup and cost ledger. */
47
- export function terminalLabResult(args) {
48
- const { cwd, labId, actorId, productName, runId, sessionStatus, completionReason, sessionReason, sessionError, sandboxId, cleanup, cost, noSpendProof, capFailure, declaredScorerFailure, judgment, execution, observer, warnings, } = args;
49
- // The lab's exit code: verified evidence, no harness error and proven cleanup. A blocked/
47
+ /** The terminal-product study result for a live run, from its session, cleanup and cost ledger. */
48
+ export function terminalStudyResult(args) {
49
+ const { cwd, studyId, actorId, productName, runId, sessionStatus, completionReason, sessionReason, sessionError, sandboxId, cleanup, cost, noSpendProof, capFailure, declaredScorerFailure, judgment, execution, observer, warnings, } = args;
50
+ // The run's exit code: verified evidence, no harness error and proven cleanup. A blocked/
50
51
  // timed-out agent run is still ok-as-evidence at the bundle level (the failure is the evidence),
51
- // but the lab result surfaces ok:false on a harness error or unproven teardown (fail-closed).
52
+ // but the study result surfaces ok:false on a harness error or unproven teardown (fail-closed).
52
53
  // remaining===0 is the by-id-confirmed-reclaimed state; remaining===1 (still present) and
53
54
  // remaining===-1 (kill(id) itself failed) are both unproven by design.
54
55
  const cleanupProven = cleanup.killed && cleanup.remaining === 0;
55
- // A CONFIG-DECLARED scorer that failed to render a pass (status:"fail" / malformed / throw) fails the
56
+ // A config-declared scorer that failed to render a pass (status:"fail" / malformed / throw) fails the
56
57
  // run result as well as the persisted verdict: the keystone route's declared rubric is a gate, so
57
58
  // its fail must drive exit code. Library callers never set this (additive, back-compat).
58
59
  const ok = resultOk({
@@ -62,10 +63,9 @@ export function terminalLabResult(args) {
62
63
  policy: OUTCOME_POLICIES.terminal,
63
64
  });
64
65
  return {
65
- schema: TERMINAL_PRODUCT_LAB_SCHEMA,
66
+ ...studyResultIdentity("terminal", studyId),
66
67
  ok,
67
68
  cwd,
68
- labId,
69
69
  actor: actorId,
70
70
  product: productName,
71
71
  dryRun: false,
@@ -97,12 +97,12 @@ export function terminalLabResult(args) {
97
97
  : {
98
98
  error: {
99
99
  code: (!cleanupProven
100
- ? "HUMANISH_TERMINAL_LAB_CLEANUP_UNPROVEN"
100
+ ? "HUMANISH_TERMINAL_CLEANUP_UNPROVEN"
101
101
  : capFailure !== undefined
102
- ? "HUMANISH_TERMINAL_LAB_CAPS_EXCEEDED"
103
- : "HUMANISH_TERMINAL_LAB_FAILED"),
102
+ ? "HUMANISH_TERMINAL_CAPS_EXCEEDED"
103
+ : "HUMANISH_TERMINAL_FAILED"),
104
104
  message: !cleanupProven
105
- ? `Live terminal-product run could not prove sandbox teardown (killed=${cleanup.killed}, remaining=${cleanup.remaining}): ${cleanup.reason}. A run that cannot prove teardown fails closed.${sessionError !== undefined ? ` Session failure: ${sessionError}` : ""}`
105
+ ? `Live terminal-product run could not prove sandbox teardown (killed=${cleanup.killed}, remaining=${cleanup.remaining}): ${cleanup.reason}. A run that cannot prove its sandbox was removed does not pass.${sessionError !== undefined ? ` Session failure: ${sessionError}` : ""}`
106
106
  : (declaredScorerFailure ??
107
107
  capFailure ??
108
108
  sessionError ??
@@ -1,22 +1,22 @@
1
1
  import { type TerminalRefusal } from "./plan.js";
2
- import type { TerminalPlan } from "../../lab/plan-types.js";
3
- import type { AdmittedPlan } from "../../run-lab.js";
4
- import { type RunTerminalProductLabOptions, type TerminalProductLabResult, type TerminalRunInput } from "./types.js";
2
+ import type { TerminalPlan } from "../../study/plan-types.js";
3
+ import type { AdmittedPlan } from "../../run-study.js";
4
+ import { type RunTerminalProductStudyOptions, type TerminalProductStudyResult, type TerminalRunInput } from "./types.js";
5
5
  /**
6
6
  * The config-taking entry point. It plans, returns a refusal with the same envelope and analysis
7
7
  * record the route has always returned, and otherwise runs the plan.
8
8
  */
9
- export declare function runTerminalProductLab(options: RunTerminalProductLabOptions): Promise<TerminalProductLabResult>;
10
- /** A refused terminal lab's result: the route's envelope, and the analysis record a refusal gets. */
11
- export declare function terminalLabRefusal(options: RunTerminalProductLabOptions, refusal: TerminalRefusal): Promise<TerminalProductLabResult>;
9
+ export declare function runTerminalProductStudy(options: RunTerminalProductStudyOptions): Promise<TerminalProductStudyResult>;
10
+ /** A refused terminal study's result: the route's envelope, and the analysis record a refusal gets. */
11
+ export declare function terminalStudyRefusal(options: RunTerminalProductStudyOptions, refusal: TerminalRefusal): Promise<TerminalProductStudyResult>;
12
12
  /**
13
13
  * Run a terminal plan. The run scope gives a direct library caller the same run lifetime the CLI
14
- * gets: whichever of its fail-closed exits the lab takes, the run it started is closed, and only a
14
+ * gets: whichever of its fail-closed exits the run takes, the run it started is closed, and only a
15
15
  * run that published its final bundle reaches automatic analysis.
16
16
  */
17
- export declare function runTerminalPlan(plan: TerminalPlan, input: TerminalRunInput): Promise<TerminalProductLabResult>;
17
+ export declare function runTerminalPlan(plan: TerminalPlan, input: TerminalRunInput): Promise<TerminalProductStudyResult>;
18
18
  /**
19
- * runLab's step for a terminal plan. It runs a live plan's local checks (checkLiveTerminalMachine)
19
+ * runStudyWith's step for a terminal plan. It runs a live plan's local checks (checkLiveTerminalMachine)
20
20
  * before any run scope opens, so the CLI can present their refusal before it loads a declared
21
21
  * scorer, and returns the run that continues from them with that scorer.
22
22
  */