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
@@ -132,12 +132,12 @@ export async function runCuaParticipant(spec, deps) {
132
132
  }
133
133
  /**
134
134
  * Run N>1 E2B participants with bounded concurrency, a pipeline gate (the first provisions
135
- * before the rest start), and session fail-fast on HARNESS errors only (queued participants
135
+ * before the rest start), and session fail-fast on harness errors only (queued participants
136
136
  * become `blocked` with a pinned reason + a fail-fast event; mission verdicts never trip it).
137
- * Each participant tears down ITS OWN sandbox by id; nothing here ever enumerates.
137
+ * Each participant tears down its own sandbox by id; nothing here ever enumerates.
138
138
  *
139
- * Exported for the #342 total-runner tests: the injectable runner lets a test make one participant
140
- * THROW (the exact class the guard exists for) without a live sandbox. Production always uses
139
+ * Exported for the total-runner tests: the injectable runner lets a test make one participant
140
+ * throw (the exact class the guard exists for) without a live sandbox. Production always uses
141
141
  * the default.
142
142
  */
143
143
  export async function runCuaParticipants(runs, deps, concurrency, runParticipant = runCuaParticipant) {
@@ -164,10 +164,10 @@ export async function runCuaParticipants(runs, deps, concurrency, runParticipant
164
164
  if (failFast.tripped) {
165
165
  return skippedOutcome(spec, `skipped: ${failFast.reason}`);
166
166
  }
167
- // The participant runner is TOTAL (#342): every exit path returns a recorded outcome. Without this
167
+ // The participant runner is total: every exit path returns a recorded outcome. Without this
168
168
  // guard, one participant's late throw (e.g. its trace write hitting ENOSPC after its own sandbox was
169
169
  // already torn down) rejected the whole map while sibling workers kept launching sandboxes
170
- // nobody would ever record — the run spent money and then reported nothing.
170
+ // nobody would ever record, so the run spent money and then reported nothing.
171
171
  let outcome;
172
172
  try {
173
173
  outcome = await runParticipant(spec, {
@@ -187,7 +187,7 @@ export async function runCuaParticipants(runs, deps, concurrency, runParticipant
187
187
  });
188
188
  }
189
189
  catch (error) {
190
- // The first participant may have thrown before signaling the provisioning gate — release the followers as
190
+ // The first participant may have thrown before signaling the provisioning gate; release the followers as
191
191
  // blocked rather than leaving them awaiting a gate that will never settle.
192
192
  if (index === 0)
193
193
  rejectGate?.();
@@ -247,7 +247,7 @@ export function toParticipantResult(spec, outcome, subject, dryRun) {
247
247
  ok: false,
248
248
  diagnostics: cuaParticipantDiagnostics({ dryRun, skipped: true }),
249
249
  skippedReason: outcome.skippedReason,
250
- error: { code: "HUMANISH_CUA_LAB_FAILED", message: outcome.skippedReason },
250
+ error: { code: "HUMANISH_COMPUTER_USE_FAILED", message: outcome.skippedReason },
251
251
  };
252
252
  }
253
253
  const session = outcome.session;
@@ -299,7 +299,7 @@ export function toParticipantResult(spec, outcome, subject, dryRun) {
299
299
  ? {}
300
300
  : {
301
301
  error: {
302
- code: outcome.failureCode ?? "HUMANISH_CUA_LAB_FAILED",
302
+ code: outcome.failureCode ?? "HUMANISH_COMPUTER_USE_FAILED",
303
303
  message: outcome.sessionError ??
304
304
  (outcome.noEngagement
305
305
  ? "Actor took no actions and produced no message (likely a blank/still-loading screen); not a credible goal_satisfied."
@@ -309,7 +309,7 @@ export function toParticipantResult(spec, outcome, subject, dryRun) {
309
309
  ? `Computer-use session ended with a harness error: ${session.reason}`
310
310
  : session?.status !== "passed"
311
311
  ? `Computer-use session ended with ${session?.status ?? "unknown"}: ${session?.reason ?? "no terminal reason"}`
312
- : "Computer-use lab did not produce a terminal session."),
312
+ : "The computer-use run did not produce a terminal session."),
313
313
  },
314
314
  }),
315
315
  };
@@ -1,4 +1,5 @@
1
1
  import type { CuaExecutor, CuaLoopResult, CuaProvider } from "../../actors/computer-use/loop.js";
2
+ import type { ActorConversation } from "../../actors/contract.js";
2
3
  import type { CuaActorSessionOptions } from "../../actors/computer-use/actor.js";
3
4
  import { startClaudeSession } from "../../actors/local-agent/claude-session.js";
4
5
  import { createRestrictedCodexParticipant, type ParticipantProviderCloseResult } from "../../actors/codex/restricted-participant.js";
@@ -29,6 +30,11 @@ export declare function closeParticipantModel(model: ParticipantModel, warnings:
29
30
  }>;
30
31
  /** Prices the finished session's tokens onto its trace, writes the trace, and warns on raw screenshots. */
31
32
  export declare function recordParticipantTrace(spec: DesktopParticipantRun, deps: ParticipantModelDeps, session: CuaLoopResult, warnings: string[]): Promise<void>;
33
+ /**
34
+ * The run warning for a participant whose provider kept no conversation server-side, so humanish
35
+ * carried it on every request. It says why, and how many early turns became a text summary.
36
+ */
37
+ export declare function explicitContextWarning(conversation: ActorConversation): string;
32
38
  /** The checks that keep a goal_satisfied session from counting as a pass, with their warnings. */
33
39
  export declare function judgeParticipantSession(session: CuaLoopResult | undefined, deps: ParticipantModelDeps, warnings: string[]): {
34
40
  noEngagement: boolean;
@@ -3,7 +3,7 @@
3
3
  // finished session. The desktop side stays with the participant runner.
4
4
  import { startClaudeSession } from "../../actors/local-agent/claude-session.js";
5
5
  import { createLocalAgentProvider } from "../../actors/local-agent/cli.js";
6
- import { pricedModel } from "../../lab/plan-base.js";
6
+ import { pricedModel } from "../../study/plan-base.js";
7
7
  import { estimateActorCostForExecution, round6 } from "../../run/pricing.js";
8
8
  import { redactText } from "../../evidence/redaction.js";
9
9
  import { createRestrictedCodexParticipant, } from "../../actors/codex/restricted-participant.js";
@@ -49,12 +49,12 @@ export async function startParticipantModel(spec, deps, executor) {
49
49
  return { provider: codexParticipant.provider, codexParticipant };
50
50
  }
51
51
  if (localAgent === "claude") {
52
- // One session for the whole run, like the codex thread above (#520). The one-shot
52
+ // One session for the whole run, like the codex thread above. The one-shot
53
53
  // provider (createLocalAgentProvider) spawned `claude -p` per turn, and every turn
54
54
  // started with no memory of the last. HUMANISH_LOCAL_AGENT_ONE_SHOT=1 keeps that path
55
- // reachable as a MEASUREMENT switch: MemTrapBench (2026-08) reports memory frameworks
55
+ // reachable as a measurement switch: MemTrapBench (2026-08) reports memory frameworks
56
56
  // degrading agent performance by 10-40% on some tasks, so "remembers" has to be measured
57
- // against "does not" on the same lab, not assumed. The trace records which one ran.
57
+ // against "does not" on the same study, not assumed. The trace records which one ran.
58
58
  const oneShot = env.HUMANISH_LOCAL_AGENT_ONE_SHOT !== undefined &&
59
59
  env.HUMANISH_LOCAL_AGENT_ONE_SHOT !== "" &&
60
60
  env.HUMANISH_LOCAL_AGENT_ONE_SHOT !== "0";
@@ -82,7 +82,7 @@ export async function startParticipantModel(spec, deps, executor) {
82
82
  /** The options the participant's session runs with: prompt, model settings, spend caps and callbacks. */
83
83
  export function participantSessionOptions(spec, deps, ready, provider, writeScreenshot) {
84
84
  const { executor, inbox } = ready;
85
- // The FAIL-CLOSED spend cap (execution.caps.maxUsd) is wired into the loop as maxUsd + an
85
+ // The fail-closed spend cap (execution.caps.maxUsd) is wired into the loop as maxUsd + an
86
86
  // injected pure per-turn estimator keyed on the resolved model. Preflight already refused a
87
87
  // cap on an unpriced model, so the estimate is measurable whenever a cap is in force. The
88
88
  // model id here matches provider.version (openai-responses-cu resolves the default when unset).
@@ -95,7 +95,7 @@ export function participantSessionOptions(spec, deps, ready, provider, writeScre
95
95
  persona: spec.persona,
96
96
  timeoutMs: deps.timeoutMs,
97
97
  // The brain is either a keyed API client or a CLI the operator is already signed in to.
98
- // Everything below this line — loop, executor, trace, affordances — is identical either
98
+ // Everything below this line (loop, executor, trace, affordances) is identical either
99
99
  // way, which is what makes a local-agent run comparable to an API one.
100
100
  ...(provider === undefined ? {} : { provider: provider }),
101
101
  openai: {
@@ -129,8 +129,8 @@ export function participantSessionOptions(spec, deps, ready, provider, writeScre
129
129
  : { stopWhen: spec.planned.limits.stopWhen }),
130
130
  ...(spec.planned.limits.dwell === undefined ? {} : { dwell: spec.planned.limits.dwell }),
131
131
  ...(spec.planned.tasks === undefined ? {} : { tasks: spec.planned.tasks }),
132
- // The STUDY budget (#299): this participant notes its own running estimate on the shared
133
- // ledger and stops when the RUN total crosses the cap — independent of the per-participant
132
+ // The study budget: this participant notes its own running estimate on the shared
133
+ // ledger and stops when the run total crosses the cap, independent of the per-participant
134
134
  // maxUsd above.
135
135
  ...(deps.runBudget === undefined
136
136
  ? {}
@@ -149,8 +149,8 @@ export function participantSessionOptions(spec, deps, ready, provider, writeScre
149
149
  ...(deps.onTrace === undefined
150
150
  ? {}
151
151
  : {
152
- // Forwards the RUNNING usage as well: the participant runner is where both are known, and usage
153
- // without it never reaches the flush — which is how the live cost stayed unknown.
152
+ // Forwards the running usage as well: the participant runner is where both are known, and usage
153
+ // without it never reaches the flush, which is how the live cost stayed unknown.
154
154
  onTrace: (items, usage, metadata) => deps.onTrace?.(spec.planned.id, items, usage, metadata),
155
155
  }),
156
156
  };
@@ -207,27 +207,45 @@ export async function closeParticipantModel(model, warnings) {
207
207
  }
208
208
  /** Prices the finished session's tokens onto its trace, writes the trace, and warns on raw screenshots. */
209
209
  export async function recordParticipantTrace(spec, deps, session, warnings) {
210
- // Per-participant model-token cost ESTIMATE, attached to the trace before it is persisted (the model
211
- // id is authoritative here — provider.version). Kept at the lab boundary so the pure loop
210
+ // Per-participant model-token cost estimate, attached to the trace before it is persisted (the model
211
+ // id is authoritative here: provider.version). Kept at the study boundary so the pure loop
212
212
  // never depends on the operator rate table. estimateActorCost declares absent (null) for an
213
213
  // unknown rate / missing usage rather than guessing.
214
214
  session.trace.estimatedCost = estimateActorCostForExecution(session.trace.tokenUsage, session.trace.ids.model, session.trace.executionProfile);
215
215
  await writeContainedOutputFile(deps.artifactRoot, spec.traceArtifactPath, `${JSON.stringify(session.trace, null, 2)}\n`, "utf8");
216
+ const conversation = session.trace.conversation;
217
+ if (conversation?.mode === "explicit_context")
218
+ warnings.push(explicitContextWarning(conversation));
216
219
  if (session.trace.redaction.screenshots === "raw") {
217
- warnings.push("Screenshots are full-fidelity (raw) for local use — the bundle stays in gitignored .humanish and nothing scans these pixels; review them before sharing anywhere. Set policies.redactScreenshots: true to blur a share-as-is bundle.");
220
+ warnings.push("Screenshots are unblurred for local use: the bundle stays in the gitignored .humanish/ folder and nothing scans these pixels, so review them before sharing. Set policies.redactScreenshots: true to blur screenshots in a bundle you plan to share.");
218
221
  }
219
222
  }
223
+ /**
224
+ * The run warning for a participant whose provider kept no conversation server-side, so humanish
225
+ * carried it on every request. It says why, and how many early turns became a text summary.
226
+ */
227
+ export function explicitContextWarning(conversation) {
228
+ const why = conversation.explicitReason === "zdr_rejection"
229
+ ? `The OpenAI organization rejected server-side conversation state (zero data retention)${conversation.switchedAtRequest === undefined
230
+ ? ""
231
+ : ` on request ${conversation.switchedAtRequest}`}`
232
+ : "zeroDataRetention is set";
233
+ const summarized = conversation.summarizedTurns === 0
234
+ ? ""
235
+ : ` To stay within its token budget it summarized the ${conversation.summarizedTurns} oldest turns as text and dropped their screenshots.`;
236
+ return `${why}, so humanish carried this participant's conversation itself (explicit_context).${summarized} The trace's conversation record has each request's carried context.`;
237
+ }
220
238
  /** The checks that keep a goal_satisfied session from counting as a pass, with their warnings. */
221
239
  export function judgeParticipantSession(session, deps, warnings) {
222
240
  const noEngagement = session !== undefined && hollowCompletion(sessionEnding(session));
223
241
  if (noEngagement) {
224
- warnings.push("Actor returned goal_satisfied with ZERO actions and ZERO messages — it likely saw a blank or still-loading screen and stopped without engaging. NOT counted as a pass. Check the screenshot; raise execution.timeoutMs or confirm the subject painted before the first turn.");
242
+ warnings.push("The participant returned goal_satisfied with no actions and no messages, so it likely saw a blank or loading screen and stopped. This does not count as a pass. Check the screenshot, and raise execution.timeoutMs or confirm the app had rendered before the first turn.");
225
243
  }
226
244
  const blockerReason = resolveSelfReportedBlocker(session);
227
245
  const selfReportedBlocker = blockerReason !== undefined;
228
246
  const reportedFriction = resolveSelfReportedFriction(session) !== undefined;
229
247
  if (selfReportedBlocker) {
230
- warnings.push(`Actor returned goal_satisfied while its final message describes a blocker or asks for missing instructions — NOT counted as a pass: ${redactText(deps.scrubKnownValues(blockerReason))}`);
248
+ warnings.push(`The participant returned goal_satisfied, but its final message describes a blocker or asks for missing instructions, so this does not count as a pass: ${redactText(deps.scrubKnownValues(blockerReason))}`);
231
249
  }
232
250
  return { noEngagement, selfReportedBlocker, reportedFriction };
233
251
  }
@@ -1,11 +1,11 @@
1
1
  import type { ActorPersonaRef } from "../../actors/contract.js";
2
- import type { DevicePreset } from "../../lab/device-presets.js";
3
- import { type ResolvedPersona } from "../../lab/persona.js";
4
- import { type LabTask } from "../../lab/tasks.js";
2
+ import type { DevicePreset } from "../../study/device-presets.js";
3
+ import { type ResolvedPersona } from "../../study/persona.js";
4
+ import { type StudyTask } from "../../study/tasks.js";
5
5
  import type { DesktopParticipantRun } from "./types.js";
6
6
  export declare const DEFAULT_MISSION = "You are testing a web application. The browser is already open at the subject URL. Explore it, accomplish what the scenario asks, and stop when done.";
7
7
  /**
8
- * The participant's outcome as ONE fixed first line of its last message (#570, second half). The
8
+ * The participant's outcome as one fixed first line of its last message. The
9
9
  * free-text computer-use provider has no schema to fill; a fixed line is the next best thing, and
10
10
  * the loop reads it into the trace's declaredOutcome. Prompt-only control is weak in general, so
11
11
  * adherence is measured (declaredOutcome present or absent on the trace) and the regex over the
@@ -21,24 +21,24 @@ export declare function composeParticipantInstructions(args: {
21
21
  mission: string;
22
22
  persona?: string;
23
23
  instruction?: string;
24
- /** The lab's declared protocol (#414). Only the participant-facing `goal` halves are rendered
24
+ /** The study's declared protocol. Only the participant-facing `goal` halves are rendered
25
25
  * into the prompt; the `success` criteria never appear here. */
26
- tasks?: readonly LabTask[];
26
+ tasks?: readonly StudyTask[];
27
27
  device: {
28
28
  name: string;
29
29
  preset: DevicePreset;
30
30
  };
31
- /** The COMPILED persona for `args.persona`, when its committed file resolved (#381). Supplying it
32
- * makes the persona shape behavior — its traits become directives in the prompt and land in
33
- * traitsApplied — instead of appearing as a bare `Persona: <id>.` label. Absent (unsafe id,
34
- * no committed file, unparseable YAML) keeps the honest fallback: the bare line and an EMPTY
31
+ /** The compiled persona for `args.persona`, when its committed file resolved. Supplying it
32
+ * makes the persona shape behavior: its traits become directives in the prompt and land in
33
+ * traitsApplied, instead of appearing as a bare `Persona: <id>.` label. Absent (unsafe id,
34
+ * no committed file, unparseable YAML) keeps the fallback: the bare line and an empty
35
35
  * traitsApplied, never fabricated traits. Resolved by the caller so this stays pure. */
36
36
  resolvedPersona?: ResolvedPersona;
37
37
  /**
38
- * desktop-cli (#495): the surface under study is a terminal window, not a page. Said plainly
39
- * because a participant whose every prior world was a browser will look for one — and because a
38
+ * desktop-cli: the surface under study is a terminal window, not a page. Said plainly
39
+ * because a participant whose every prior world was a browser will look for one, and because a
40
40
  * capability nobody declares is one the recording cannot later be read against. It states that a
41
- * terminal is open and NOT what to type in it: naming commands would answer the question the
41
+ * terminal is open and does not say what to type in it: naming commands would answer the question the
42
42
  * study is asking.
43
43
  */
44
44
  surface?: "desktop-cli";
@@ -46,8 +46,8 @@ export declare function composeParticipantInstructions(args: {
46
46
  instructions: string;
47
47
  persona: ActorPersonaRef;
48
48
  };
49
- /** Runtime-inject the persona inbox instruction into a participant's prompt (#297 slice B). The inbox URL is a
50
- * runtime loopback/getHost address (not secret), so — mirroring the lobby-code runtime injection — this
49
+ /** Runtime-inject the persona inbox instruction into a participant's prompt. The inbox URL is a
50
+ * runtime loopback/getHost address (not secret), so, mirroring the lobby-code runtime injection, this
51
51
  * augments only the instructions the model receives; the authored prompt + its digest are unchanged.
52
52
  * Returns a new spec (never mutates). Shared by the CUA + concurrent shared-world routes. */
53
53
  export declare function withInboxMission(spec: DesktopParticipantRun, inboxUrl: string, address?: string, receiving?: boolean): DesktopParticipantRun;
@@ -3,11 +3,11 @@
3
3
  // the email inbox at run time. Shared by the computer-use and concurrent shared-world routes.
4
4
  import { recipientInboxUrl } from "../../comms/capture-surface.js";
5
5
  import { digestText } from "../../evidence/redaction.js";
6
- import { personaBrief, personaToDirectives, renderPersonaPromptSection, } from "../../lab/persona.js";
7
- import { renderTaskPrompt } from "../../lab/tasks.js";
6
+ import { personaBrief, personaToDirectives, renderPersonaPromptSection, } from "../../study/persona.js";
7
+ import { renderTaskPrompt } from "../../study/tasks.js";
8
8
  export const DEFAULT_MISSION = "You are testing a web application. The browser is already open at the subject URL. Explore it, accomplish what the scenario asks, and stop when done.";
9
9
  /**
10
- * The participant's outcome as ONE fixed first line of its last message (#570, second half). The
10
+ * The participant's outcome as one fixed first line of its last message. The
11
11
  * free-text computer-use provider has no schema to fill; a fixed line is the next best thing, and
12
12
  * the loop reads it into the trace's declaredOutcome. Prompt-only control is weak in general, so
13
13
  * adherence is measured (declaredOutcome present or absent on the trace) and the regex over the
@@ -26,12 +26,12 @@ export function composeParticipantInstructions(args) {
26
26
  const deviceLine = preset.isMobile
27
27
  ? `You are a mobile user on a ${name} device (${preset.width}x${preset.height} @${preset.deviceScaleFactor}x). Expect a mobile/touch layout.`
28
28
  : `You are a desktop user (${name}, ${preset.width}x${preset.height}).`;
29
- // The protocol as the PARTICIPANT reads it: numbered goals, nothing else. The success criteria
30
- // are the researcher's instrument and must never reach this prompt — a persona told how it will
31
- // be measured optimizes for the measurement instead of using the product (src/lab/tasks.ts).
29
+ // The protocol as the participant reads it: numbered goals, nothing else. The success criteria
30
+ // are the researcher's instrument and must never reach this prompt: a persona told how it will
31
+ // be measured optimizes for the measurement instead of using the product (src/study/tasks.ts).
32
32
  const taskLines = renderTaskPrompt(args.tasks ?? []);
33
33
  // A resolved persona contributes its compiled directives (friction tolerance, skill bias,
34
- // accessibility behavior, constraints) through the SAME persona.ts compiler the terminal route
34
+ // accessibility behavior, constraints) through the same persona.ts compiler the terminal route
35
35
  // uses, so one persona file means one behavior across every route.
36
36
  const personaLine = args.resolvedPersona
37
37
  ? renderPersonaPromptSection(args.resolvedPersona)
@@ -64,8 +64,8 @@ export function composeParticipantInstructions(args) {
64
64
  },
65
65
  };
66
66
  }
67
- /** Runtime-inject the persona inbox instruction into a participant's prompt (#297 slice B). The inbox URL is a
68
- * runtime loopback/getHost address (not secret), so — mirroring the lobby-code runtime injection — this
67
+ /** Runtime-inject the persona inbox instruction into a participant's prompt. The inbox URL is a
68
+ * runtime loopback/getHost address (not secret), so, mirroring the lobby-code runtime injection, this
69
69
  * augments only the instructions the model receives; the authored prompt + its digest are unchanged.
70
70
  * Returns a new spec (never mutates). Shared by the CUA + concurrent shared-world routes. */
71
71
  export function withInboxMission(spec, inboxUrl, address, receiving = false) {
@@ -1,40 +1,40 @@
1
- import type { ComputerUsePlan } from "../../lab/plan-types.js";
2
- import { type LabConfig } from "../../lab/types.js";
3
- import { type ResolvedPersona } from "../../lab/persona.js";
1
+ import type { ComputerUsePlan } from "../../study/plan-types.js";
2
+ import { type StudyConfig } from "../../study/types.js";
3
+ import { type ResolvedPersona } from "../../study/persona.js";
4
4
  import { type RunRerunLineage } from "../../run/bundle.js";
5
5
  import type { PreparedSelectedOutputDirectory } from "../../run/contained-output.js";
6
- import { type CuaActorLabErrorCode, type CuaParticipantPlan, type CuaParticipantPlanEntry, type DesktopParticipantRun } from "./types.js";
7
- export declare function defaultSessionTimeoutMs(config: LabConfig): number;
6
+ import { type CuaActorStudyErrorCode, type CuaParticipantPlan, type CuaParticipantPlanEntry, type DesktopParticipantRun } from "./types.js";
7
+ export declare function defaultSessionTimeoutMs(config: StudyConfig): number;
8
8
  /** Per-participant sandbox deadline (each one owns its own desktop). Mirrors the
9
9
  * single-participant formula verbatim so N=1 stays byte-stable: explicit sandboxTimeoutMs, else session budget + (clone
10
10
  * or local-tree: provision budget + Σ state-step budgets) + the server-side
11
11
  * reclamation buffer. Local-tree shares the clone route's provisioning budget: it swaps a
12
12
  * git clone for an upload+extract, but the shared install/build/state/start/probe pipeline
13
13
  * costs the same wall-clock room either way. */
14
- export declare function resolveParticipantSandboxMs(config: LabConfig): number;
14
+ export declare function resolveParticipantSandboxMs(config: StudyConfig): number;
15
15
  /**
16
- * The in-flight participant bound a lab declares. Defaults to the participant count — every
16
+ * The in-flight participant bound a study declares. Defaults to the participant count: every
17
17
  * declared participant runs at once, because a throttle nobody asked for silently turns "N actors
18
- * live" into waves (#350); total session count and spend are the same either way, only wall-clock
19
- * and simultaneity differ. A declared execution.concurrency is a CAP, clamped to [1, participants].
18
+ * live" into waves; total session count and spend are the same either way, only wall-clock
19
+ * and simultaneity differ. A declared execution.concurrency is a cap, clamped to [1, participants].
20
20
  * The planner records it; the route may only lower it from the environment.
21
21
  */
22
22
  export declare function boundedConcurrency(declared: number | undefined, participantCount: number): number;
23
23
  /**
24
- * Pure pre-flight plan resolver (runs in dry-run AND live). Returns the participant table, the
24
+ * Pure pre-flight plan resolver (runs in dry-run and live). Returns the participant table, the
25
25
  * effective concurrency, the wave count, the per-participant session budget, and the worst-case total
26
- * sandbox-minutes — BEFORE any sandbox or provider call. The same plan appears in dry-run,
26
+ * sandbox-minutes, before any sandbox or provider call. The same plan appears in dry-run,
27
27
  * marked $0 (dryRun: true).
28
28
  */
29
- export declare function resolveCuaParticipantPlan(config: LabConfig, opts?: {
29
+ export declare function resolveCuaParticipantPlan(config: StudyConfig, opts?: {
30
30
  countOverride?: number;
31
31
  env?: Record<string, string | undefined>;
32
32
  dryRun?: boolean;
33
33
  personas?: Map<string, ResolvedPersona>;
34
34
  }): CuaParticipantPlan;
35
- /** Print the participant plan to stderr BEFORE any sandbox/provider call (public-safe: ids, devices,
36
- * digests, and budgets only — no prompt text, no secrets). */
37
- export declare function emitPreflightPlan(participantPlan: CuaParticipantPlan, labId: string): void;
35
+ /** Print the participant plan to stderr before any sandbox/provider call (public-safe: ids, devices,
36
+ * digests, and budgets only; no prompt text, no secrets). */
37
+ export declare function emitPreflightPlan(participantPlan: CuaParticipantPlan, studyId: string): void;
38
38
  export declare function formatParticipantPlanEntry(entry: CuaParticipantPlanEntry): string;
39
39
  /**
40
40
  * Compile the committed persona files the participants use, printing a warning for each one that
@@ -60,7 +60,7 @@ export declare function loadCuaParticipants(args: {
60
60
  rerunLineage?: RunRerunLineage;
61
61
  } | {
62
62
  ok: false;
63
- code: CuaActorLabErrorCode;
63
+ code: CuaActorStudyErrorCode;
64
64
  message: string;
65
65
  }>;
66
66
  /** Scrub known secret values from each participant's declarative snapshot before any bundle uses it. */
@@ -1,23 +1,24 @@
1
- // The participant runs a computer-use lab drives, built before anything is created: the sandbox
1
+ // The participant runs a computer-use study drives, built before anything is created: the sandbox
2
2
  // and session budgets, the concurrency bound, each participant's prompt, bundle ids and artifact
3
3
  // paths, and the public plan printed before any sandbox or provider call. loadCuaParticipants
4
4
  // compiles the committed personas first and narrows a rerun to its selected participants.
5
- import { isLocalBrowserLab, LOCAL_BROWSER_LIFETIME_MS, } from "../../substrates/local/runtime-config.js";
5
+ import { isLocalBrowserStudy, LOCAL_BROWSER_LIFETIME_MS, } from "../../substrates/local/runtime-config.js";
6
6
  import { DEFAULT_STATE_STEP_TIMEOUT_MS } from "../../subject/state.js";
7
- import { computerUseParticipants, } from "../../lab/plan-participants.js";
7
+ import { computerUseParticipants, } from "../../study/plan-participants.js";
8
8
  import { resolveParticipant } from "../../run/participant.js";
9
- import {} from "../../lab/types.js";
10
- import { scrubPersonaBrief } from "../../lab/persona.js";
9
+ import {} from "../../study/types.js";
10
+ import { scrubPersonaBrief } from "../../study/persona.js";
11
11
  import { redactText } from "../../evidence/redaction.js";
12
12
  import {} from "../../run/bundle.js";
13
- import { participantAssignment } from "../../lab/participant-assignment.js";
14
- import { resolveCommittedPersonas } from "../../lab/persona-resolve.js";
13
+ import { participantAssignment } from "../../study/participant-assignment.js";
14
+ import { resolveCommittedPersonas } from "../../study/persona-resolve.js";
15
15
  import { CUA_FANOUT_STRATEGY, CUA_MAX_CONCURRENCY_ENV, DEFAULT_APP_URL_SESSION_TIMEOUT_MS, MIN_DERIVED_SESSION_TIMEOUT_MS, } from "./types.js";
16
16
  import { MAX_SANDBOX_MS, SANDBOX_TIMEOUT_BUFFER_MS, SUBJECT_PROVISION_BUDGET_MS, } from "../../substrates/e2b/lifetime.js";
17
- import { readPositiveInt } from "../../lab/parse/values.js";
17
+ import { readPositiveInt } from "../../study/parse/values.js";
18
18
  import { digestUrl } from "./bundle-parts.js";
19
19
  import { composeParticipantInstructions, DEFAULT_MISSION } from "./participant-prompt.js";
20
20
  import { resolveCuaRerunSelection } from "./rerun-selection.js";
21
+ import { plural } from "../../run/text.js";
21
22
  export function defaultSessionTimeoutMs(config) {
22
23
  const provisionedRoute = config.subject.source === "clone" || config.subject.source === "local-tree";
23
24
  if (!provisionedRoute)
@@ -33,7 +34,7 @@ export function defaultSessionTimeoutMs(config) {
33
34
  * git clone for an upload+extract, but the shared install/build/state/start/probe pipeline
34
35
  * costs the same wall-clock room either way. */
35
36
  export function resolveParticipantSandboxMs(config) {
36
- if (isLocalBrowserLab(config))
37
+ if (isLocalBrowserStudy(config))
37
38
  return LOCAL_BROWSER_LIFETIME_MS;
38
39
  const timeoutMs = config.execution?.timeoutMs ?? defaultSessionTimeoutMs(config);
39
40
  const provisionedRoute = config.subject.source === "clone" || config.subject.source === "local-tree";
@@ -46,18 +47,18 @@ export function resolveParticipantSandboxMs(config) {
46
47
  SANDBOX_TIMEOUT_BUFFER_MS);
47
48
  }
48
49
  /**
49
- * The in-flight participant bound a lab declares. Defaults to the participant count — every
50
+ * The in-flight participant bound a study declares. Defaults to the participant count: every
50
51
  * declared participant runs at once, because a throttle nobody asked for silently turns "N actors
51
- * live" into waves (#350); total session count and spend are the same either way, only wall-clock
52
- * and simultaneity differ. A declared execution.concurrency is a CAP, clamped to [1, participants].
52
+ * live" into waves; total session count and spend are the same either way, only wall-clock
53
+ * and simultaneity differ. A declared execution.concurrency is a cap, clamped to [1, participants].
53
54
  * The planner records it; the route may only lower it from the environment.
54
55
  */
55
56
  export function boundedConcurrency(declared, participantCount) {
56
57
  return Math.max(1, declared === undefined ? participantCount : Math.min(Math.max(1, declared), participantCount));
57
58
  }
58
59
  /**
59
- * The planned bound, lowered by the env override. The override may only LOWER it (never raise
60
- * concurrent paid desktops — invariant 3), and a lowering is reported via envLoweredFrom so the
60
+ * The planned bound, lowered by the env override. The override may only lower it (never raise
61
+ * concurrent paid desktops), and a lowering is reported via envLoweredFrom so the
61
62
  * plan never silently disagrees with the manifest.
62
63
  */
63
64
  function envLoweredConcurrency(planned, participantCount, env) {
@@ -81,7 +82,7 @@ function plannedParticipantsOf(config, countOverride) {
81
82
  desktopCli: config.subject.source === "desktop-cli",
82
83
  };
83
84
  }
84
- /** Build the participant runs AND the public plan from the planned participants (pure). */
85
+ /** Build the participant runs and the public plan from the planned participants (pure). */
85
86
  function participantRunsAndPlan(planned, opts = {}) {
86
87
  const env = opts.env ?? {};
87
88
  // Who each participant is (id, persona, focus, device, limits) comes from the plan; this adds
@@ -162,20 +163,20 @@ function participantRunsAndPlan(planned, opts = {}) {
162
163
  return { runs, participantPlan };
163
164
  }
164
165
  /**
165
- * Pure pre-flight plan resolver (runs in dry-run AND live). Returns the participant table, the
166
+ * Pure pre-flight plan resolver (runs in dry-run and live). Returns the participant table, the
166
167
  * effective concurrency, the wave count, the per-participant session budget, and the worst-case total
167
- * sandbox-minutes — BEFORE any sandbox or provider call. The same plan appears in dry-run,
168
+ * sandbox-minutes, before any sandbox or provider call. The same plan appears in dry-run,
168
169
  * marked $0 (dryRun: true).
169
170
  */
170
171
  export function resolveCuaParticipantPlan(config, opts = {}) {
171
172
  const { countOverride, ...rest } = opts;
172
173
  return participantRunsAndPlan(plannedParticipantsOf(config, countOverride), rest).participantPlan;
173
174
  }
174
- /** Print the participant plan to stderr BEFORE any sandbox/provider call (public-safe: ids, devices,
175
- * digests, and budgets only — no prompt text, no secrets). */
176
- export function emitPreflightPlan(participantPlan, labId) {
175
+ /** Print the participant plan to stderr before any sandbox/provider call (public-safe: ids, devices,
176
+ * digests, and budgets only; no prompt text, no secrets). */
177
+ export function emitPreflightPlan(participantPlan, studyId) {
177
178
  const lines = [];
178
- lines.push(`humanish computer-use fan-out plan (${labId}): ${participantPlan.laneCount} participant(s), strategy ${participantPlan.strategy}, concurrency ${participantPlan.concurrency}${participantPlan.envLoweredConcurrencyFrom === undefined ? "" : ` (lowered from ${participantPlan.envLoweredConcurrencyFrom} by ${CUA_MAX_CONCURRENCY_ENV})`}, ${participantPlan.waves} wave(s).`);
179
+ lines.push(`humanish computer-use fan-out plan (${studyId}): ${plural(participantPlan.laneCount, "participant")}, strategy ${participantPlan.strategy}, concurrency ${participantPlan.concurrency}${participantPlan.envLoweredConcurrencyFrom === undefined ? "" : ` (lowered from ${participantPlan.envLoweredConcurrencyFrom} by ${CUA_MAX_CONCURRENCY_ENV})`}, ${plural(participantPlan.waves, "wave")}.`);
179
180
  lines.push(` session budget ${Math.round(participantPlan.perLaneSessionBudgetMs / 1000)}s per participant; worst-case ~${participantPlan.worstCaseSandboxMinutes} sandbox-minutes total${participantPlan.dryRun ? " (dry-run: $0)" : ""}.`);
180
181
  for (const entry of participantPlan.lanes) {
181
182
  lines.push(` - ${formatParticipantPlanEntry(entry)}`);
@@ -212,8 +213,8 @@ export async function compileParticipantPersonas(projectRoot, personaIds) {
212
213
  export async function loadCuaParticipants(args) {
213
214
  const { plan } = args;
214
215
  const { participants } = plan.runner;
215
- // Compile any committed personas BEFORE planning, so the plan builder stays pure and each participant's
216
- // prompt carries real behavioral directives rather than a bare `Persona: <id>.` label (#381).
216
+ // Compile any committed personas before planning, so the plan builder stays pure and each participant's
217
+ // prompt carries real behavioral directives rather than a bare `Persona: <id>.` label.
217
218
  const personas = await compileParticipantPersonas(args.projectRoot, participants.map((participant) => participant.personaId));
218
219
  const { runs: participantRuns, participantPlan } = participantRunsAndPlan({
219
220
  participants,
@@ -227,7 +228,7 @@ export async function loadCuaParticipants(args) {
227
228
  return { ok: true, participantRuns, participantPlan };
228
229
  const selected = await resolveCuaRerunSelection({
229
230
  cwd: args.cwd,
230
- labId: plan.labId,
231
+ studyId: plan.studyId,
231
232
  sandboxMs: plan.sandboxMs,
232
233
  sourceRunId: rerun.sourceRunId,
233
234
  ...(rerun.participantIds === undefined ? {} : { participantIds: [...rerun.participantIds] }),
@@ -235,7 +236,7 @@ export async function loadCuaParticipants(args) {
235
236
  participantPlan,
236
237
  });
237
238
  if (!selected.ok) {
238
- return { ok: false, code: "HUMANISH_CUA_LAB_RERUN_INVALID", message: selected.message };
239
+ return { ok: false, code: "HUMANISH_COMPUTER_USE_RERUN_INVALID", message: selected.message };
239
240
  }
240
241
  return {
241
242
  ok: true,
@@ -1,9 +1,9 @@
1
1
  import { type CuaActorDescriptor } from "../../actors/registry.js";
2
- import type { ComputerUsePlan, ComputerUseRunner, RoutePlanResult, RouteRefusal } from "../../lab/plan-types.js";
3
- import type { LabConfig, LabSubjectState } from "../../lab/types.js";
4
- import { type CuaActorLabErrorCode, type RunCuaActorLabOptions } from "./types.js";
5
- /** The error a computer-use lab returns before a run starts. */
6
- export interface ComputerUseRefusal extends RouteRefusal<"computer-use", CuaActorLabErrorCode> {
2
+ import type { ComputerUsePlan, ComputerUseRunner, RoutePlanResult, RouteRefusal } from "../../study/plan-types.js";
3
+ import type { StudyConfig, StudySubjectState } from "../../study/types.js";
4
+ import { type CuaActorStudyErrorCode, type RunCuaActorStudyOptions } from "./types.js";
5
+ /** The error a computer-use study returns before a run starts. */
6
+ export interface ComputerUseRefusal extends RouteRefusal<"computer-use", CuaActorStudyErrorCode> {
7
7
  /**
8
8
  * Where the route returns it. "before-scope": analysis and tasks, returned before the run scope
9
9
  * with no automatic-analysis record. "in-scope": after the cwd checks. "after-personas": after
@@ -15,7 +15,7 @@ export interface ComputerUseRefusal extends RouteRefusal<"computer-use", CuaActo
15
15
  readonly actor?: string;
16
16
  }
17
17
  export type ComputerUsePlanResult = RoutePlanResult<ComputerUsePlan, ComputerUseRefusal>;
18
- /** The registered descriptor for a planned actor id; planComputerUseLab checked the registry. */
18
+ /** The registered descriptor for a planned actor id; planComputerUseStudy checked the registry. */
19
19
  export declare function cuaDescriptorOf(actor: string): CuaActorDescriptor;
20
20
  /** Which of the caller's driving homes, createProvider and inProcess, a run has. */
21
21
  export interface CallerDriving {
@@ -28,21 +28,21 @@ export declare function callerDrivingOf(options: {
28
28
  readonly createProvider?: unknown;
29
29
  }): CallerDriving;
30
30
  /** The state a planned run's provisioned subject declares. Other subjects declare none. */
31
- export declare function cuaDeclaredState(plan: ComputerUsePlan): LabSubjectState | undefined;
32
- /** The URL a refused lab's result names, from its declaration: a provisioned subject's serve URL. */
33
- export declare function declaredAppUrl(config: LabConfig): string;
31
+ export declare function cuaDeclaredState(plan: ComputerUsePlan): StudySubjectState | undefined;
32
+ /** The URL a refused study's result names, from its declaration: a provisioned subject's serve URL. */
33
+ export declare function declaredAppUrl(config: StudyConfig): string;
34
34
  /** The URL a planned run's participants open: a provisioned subject's served URL, else its own. */
35
35
  export declare function plannedAppUrl(subject: ComputerUseRunner["subject"]): string;
36
36
  /**
37
- * Plan a computer-use lab. It is called for any config handed to the computer-use runner, not only
37
+ * Plan a computer-use study. It is called for any config handed to the computer-use runner, not only
38
38
  * one routeOf sends here, so a config for another route gets this route's refusal.
39
39
  */
40
- export declare function planComputerUseLab(config: LabConfig, input: {
40
+ export declare function planComputerUseStudy(config: StudyConfig, input: {
41
41
  readonly dryRun: boolean;
42
42
  /** Whether deps.runSession is set: a caller's session runner cannot enforce maxOutputTokens. */
43
43
  readonly hasRunSession?: boolean;
44
44
  /** Which of the caller's driving homes are set; neither when absent. */
45
45
  readonly driving?: CallerDriving;
46
46
  readonly countOverride?: number;
47
- readonly rerun?: RunCuaActorLabOptions["rerun"];
47
+ readonly rerun?: RunCuaActorStudyOptions["rerun"];
48
48
  }): ComputerUsePlanResult;