humanish 0.108.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 (455) hide show
  1. package/ARCHITECTURE.md +58 -59
  2. package/CHANGELOG.md +13 -0
  3. package/CONTEXT.md +44 -44
  4. package/README.md +3 -3
  5. package/TELEMETRY.md +2 -2
  6. package/dist/actors/codex/app-server-trace.js +2 -1
  7. package/dist/actors/codex/restricted-participant.js +12 -12
  8. package/dist/actors/codex/restricted-session.d.ts +2 -2
  9. package/dist/actors/computer-use/actor.d.ts +6 -6
  10. package/dist/actors/computer-use/actor.js +2 -2
  11. package/dist/actors/computer-use/admission-limit.d.ts +2 -2
  12. package/dist/actors/computer-use/admission-limit.js +3 -3
  13. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  14. package/dist/actors/computer-use/executor-error.js +3 -3
  15. package/dist/actors/computer-use/loop/actions.js +5 -5
  16. package/dist/actors/computer-use/loop/debrief.js +2 -2
  17. package/dist/actors/computer-use/loop/ending.d.ts +1 -1
  18. package/dist/actors/computer-use/loop/ending.js +12 -11
  19. package/dist/actors/computer-use/loop/observation.js +6 -5
  20. package/dist/actors/computer-use/loop/provider-call.js +11 -11
  21. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  22. package/dist/actors/computer-use/loop/session.js +2 -2
  23. package/dist/actors/computer-use/loop/trace.js +3 -2
  24. package/dist/actors/computer-use/loop/types.d.ts +24 -24
  25. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  26. package/dist/actors/computer-use/loop.d.ts +6 -1
  27. package/dist/actors/computer-use/loop.js +26 -4
  28. package/dist/actors/computer-use/openai-provider.d.ts +2 -2
  29. package/dist/actors/computer-use/openai-provider.js +8 -8
  30. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  31. package/dist/actors/computer-use/provider-error.js +6 -6
  32. package/dist/actors/contract.d.ts +4 -4
  33. package/dist/actors/contract.js +1 -1
  34. package/dist/actors/local-agent/claude-session.js +3 -3
  35. package/dist/actors/local-agent/cli.d.ts +1 -1
  36. package/dist/actors/local-agent/cli.js +1 -1
  37. package/dist/actors/reasoning-effort.js +3 -3
  38. package/dist/actors/registry.d.ts +2 -2
  39. package/dist/actors/registry.js +3 -3
  40. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  41. package/dist/actors/scripted-browser/actor.js +1 -1
  42. package/dist/analysis/automatic-completion.d.ts +7 -7
  43. package/dist/analysis/automatic-completion.js +1 -1
  44. package/dist/analysis/automatic-config.d.ts +6 -6
  45. package/dist/analysis/automatic-config.js +1 -1
  46. package/dist/analysis/execute.d.ts +1 -1
  47. package/dist/analysis/execute.js +1 -1
  48. package/dist/analysis/types.d.ts +6 -0
  49. package/dist/browser-control/client.js +16 -16
  50. package/dist/browser-control/dispatcher.js +4 -4
  51. package/dist/browser-control/protocol.js +14 -14
  52. package/dist/browser-control/recording-transfer.js +4 -4
  53. package/dist/browser-control/transport.js +7 -7
  54. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  55. package/dist/cli/commands/comms.js +14 -22
  56. package/dist/cli/commands/observe.d.ts +0 -1
  57. package/dist/cli/commands/observe.js +0 -15
  58. package/dist/cli/commands/run-command.d.ts +2 -2
  59. package/dist/cli/commands/run-command.js +3 -3
  60. package/dist/cli/commands/runs.js +3 -5
  61. package/dist/cli/commands/setup.js +5 -7
  62. package/dist/cli/commands/study-format.d.ts +9 -0
  63. package/dist/cli/commands/{lab-format.js → study-format.js} +5 -5
  64. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  65. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +12 -12
  66. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  67. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  68. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  69. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +3 -3
  70. package/dist/cli/commands/study-route-run.d.ts +19 -0
  71. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  72. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  73. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  74. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  75. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +7 -7
  76. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  77. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  78. package/dist/cli/commands/study-run.d.ts +9 -0
  79. package/dist/cli/commands/{lab-run.js → study-run.js} +34 -34
  80. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +5 -5
  81. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +1 -1
  82. package/dist/cli/commands/study.js +13 -49
  83. package/dist/cli/commands/tui.js +12 -12
  84. package/dist/cli/commands/watch.js +30 -65
  85. package/dist/cli/deprecations.d.ts +1 -13
  86. package/dist/cli/deprecations.js +0 -30
  87. package/dist/cli/doctor.d.ts +3 -3
  88. package/dist/cli/doctor.js +16 -16
  89. package/dist/cli/first-run-path.d.ts +4 -4
  90. package/dist/cli/first-run-path.js +7 -7
  91. package/dist/cli/io.d.ts +3 -3
  92. package/dist/cli/io.js +2 -2
  93. package/dist/cli/observer-follow.d.ts +2 -2
  94. package/dist/cli/observer-follow.js +2 -2
  95. package/dist/cli/orientation.d.ts +4 -4
  96. package/dist/cli/orientation.js +58 -20
  97. package/dist/cli/program.js +3 -4
  98. package/dist/cli/telemetry.d.ts +1 -1
  99. package/dist/cli/telemetry.js +14 -20
  100. package/dist/comms/catch-host.d.ts +1 -1
  101. package/dist/comms/catch-host.js +3 -3
  102. package/dist/comms/connections.d.ts +1 -1
  103. package/dist/comms/connections.js +2 -2
  104. package/dist/comms/external-evidence.d.ts +5 -5
  105. package/dist/comms/external-evidence.js +4 -3
  106. package/dist/comms/fake-inbox.d.ts +2 -2
  107. package/dist/comms/fake-inbox.js +2 -2
  108. package/dist/comms/receiving-runtime.d.ts +4 -4
  109. package/dist/comms/sandbox-catch.d.ts +2 -2
  110. package/dist/comms/sandbox-catch.js +2 -2
  111. package/dist/comms/setup.d.ts +2 -2
  112. package/dist/comms/setup.js +29 -32
  113. package/dist/feedback/draft.js +2 -2
  114. package/dist/feedback/export.js +3 -2
  115. package/dist/feedback/proof.d.ts +1 -1
  116. package/dist/feedback/proof.js +2 -2
  117. package/dist/guest/bootstrap.js +6 -6
  118. package/dist/guest/browser-tools.js +8 -8
  119. package/dist/guest/chromium-text.js +17 -17
  120. package/dist/guest/desktop-executor.d.ts +2 -2
  121. package/dist/guest/desktop-executor.js +20 -20
  122. package/dist/guest/desktop-keys.js +4 -4
  123. package/dist/guest/desktop-media.d.ts +2 -2
  124. package/dist/guest/desktop-media.js +16 -16
  125. package/dist/guest/desktop-native.js +10 -10
  126. package/dist/guest/runtime-desktop.js +2 -2
  127. package/dist/guest/runtime-processes.d.ts +2 -2
  128. package/dist/guest/runtime-processes.js +2 -2
  129. package/dist/guest/runtime.js +5 -5
  130. package/dist/index.d.ts +13 -15
  131. package/dist/index.js +6 -8
  132. package/dist/observer/artifact.d.ts +1 -1
  133. package/dist/observer/artifact.js +1 -1
  134. package/dist/observer/data.d.ts +1 -1
  135. package/dist/observer/library.d.ts +2 -0
  136. package/dist/observer/library.js +4 -1
  137. package/dist/observer/render.js +7 -1
  138. package/dist/observer/run-routes.d.ts +1 -0
  139. package/dist/observer/run-routes.js +37 -12
  140. package/dist/observer/serve.d.ts +1 -1
  141. package/dist/observer-app.html +1 -1
  142. package/dist/routes/computer-use/bundle-parts.js +3 -2
  143. package/dist/routes/computer-use/bundle.d.ts +2 -2
  144. package/dist/routes/computer-use/bundle.js +7 -6
  145. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +5 -5
  146. package/dist/routes/computer-use/e2b-desktop/comms.js +5 -4
  147. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +1 -1
  148. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  149. package/dist/routes/computer-use/e2b-desktop/prepare.js +3 -3
  150. package/dist/routes/computer-use/e2b-desktop/start.js +3 -4
  151. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  152. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -3
  153. package/dist/routes/computer-use/external-comms.d.ts +3 -3
  154. package/dist/routes/computer-use/fanout-bundle.js +11 -10
  155. package/dist/routes/computer-use/fanout-records.js +2 -2
  156. package/dist/routes/computer-use/live-flush.d.ts +3 -3
  157. package/dist/routes/computer-use/live-phase.d.ts +2 -3
  158. package/dist/routes/computer-use/live-phase.js +3 -3
  159. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  160. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  161. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  162. package/dist/routes/computer-use/local-vm.js +2 -2
  163. package/dist/routes/computer-use/participant-desktop.d.ts +3 -3
  164. package/dist/routes/computer-use/participant-desktop.js +1 -1
  165. package/dist/routes/computer-use/participant-execution.js +1 -1
  166. package/dist/routes/computer-use/participant-model.js +3 -3
  167. package/dist/routes/computer-use/participant-prompt.d.ts +5 -5
  168. package/dist/routes/computer-use/participant-prompt.js +3 -3
  169. package/dist/routes/computer-use/participant-runs.d.ts +10 -10
  170. package/dist/routes/computer-use/participant-runs.js +14 -13
  171. package/dist/routes/computer-use/plan.d.ts +12 -12
  172. package/dist/routes/computer-use/plan.js +24 -24
  173. package/dist/routes/computer-use/preflight.d.ts +5 -5
  174. package/dist/routes/computer-use/preflight.js +5 -5
  175. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  176. package/dist/routes/computer-use/rerun-selection.js +3 -2
  177. package/dist/routes/computer-use/result.d.ts +4 -4
  178. package/dist/routes/computer-use/result.js +13 -12
  179. package/dist/routes/computer-use/route.d.ts +12 -12
  180. package/dist/routes/computer-use/route.js +19 -19
  181. package/dist/routes/computer-use/self-report.js +1 -1
  182. package/dist/routes/computer-use/setup.d.ts +22 -22
  183. package/dist/routes/computer-use/setup.js +15 -15
  184. package/dist/routes/computer-use/single-bundle.d.ts +4 -4
  185. package/dist/routes/computer-use/single-bundle.js +14 -13
  186. package/dist/routes/computer-use/subject-projection.d.ts +3 -3
  187. package/dist/routes/computer-use/types.d.ts +34 -34
  188. package/dist/routes/computer-use/types.js +3 -3
  189. package/dist/routes/preview.d.ts +6 -6
  190. package/dist/routes/preview.js +5 -5
  191. package/dist/routes/scripted/bundle.d.ts +6 -6
  192. package/dist/routes/scripted/bundle.js +10 -9
  193. package/dist/routes/scripted/plan.d.ts +7 -7
  194. package/dist/routes/scripted/plan.js +6 -6
  195. package/dist/routes/scripted/result.d.ts +3 -3
  196. package/dist/routes/scripted/result.js +9 -9
  197. package/dist/routes/scripted/route.d.ts +9 -9
  198. package/dist/routes/scripted/route.js +11 -11
  199. package/dist/routes/scripted/scenario.d.ts +1 -1
  200. package/dist/routes/scripted/scenario.js +3 -3
  201. package/dist/routes/scripted/setup.d.ts +6 -6
  202. package/dist/routes/scripted/setup.js +4 -4
  203. package/dist/routes/scripted/subject.d.ts +5 -5
  204. package/dist/routes/scripted/subject.js +3 -3
  205. package/dist/routes/scripted/surface-records.d.ts +1 -1
  206. package/dist/routes/scripted/surface-records.js +2 -2
  207. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  208. package/dist/routes/scripted/types.d.ts +17 -17
  209. package/dist/routes/scripted/types.js +1 -1
  210. package/dist/routes/shared-world/bundle-records.js +3 -3
  211. package/dist/routes/shared-world/bundle.js +15 -14
  212. package/dist/routes/shared-world/checkpoints.d.ts +3 -3
  213. package/dist/routes/shared-world/checkpoints.js +1 -1
  214. package/dist/routes/shared-world/comms.d.ts +9 -9
  215. package/dist/routes/shared-world/comms.js +6 -5
  216. package/dist/routes/shared-world/participant-specs.d.ts +3 -3
  217. package/dist/routes/shared-world/participant-specs.js +7 -7
  218. package/dist/routes/shared-world/plan.d.ts +9 -9
  219. package/dist/routes/shared-world/plan.js +9 -9
  220. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  221. package/dist/routes/shared-world/provisioned.js +4 -4
  222. package/dist/routes/shared-world/result.d.ts +6 -6
  223. package/dist/routes/shared-world/result.js +11 -10
  224. package/dist/routes/shared-world/route.d.ts +11 -11
  225. package/dist/routes/shared-world/route.js +19 -19
  226. package/dist/routes/shared-world/setup.d.ts +13 -13
  227. package/dist/routes/shared-world/setup.js +19 -19
  228. package/dist/routes/shared-world/types.d.ts +27 -27
  229. package/dist/routes/terminal/adapter.d.ts +2 -2
  230. package/dist/routes/terminal/adapter.js +4 -4
  231. package/dist/routes/terminal/bundle.d.ts +11 -11
  232. package/dist/routes/terminal/bundle.js +12 -12
  233. package/dist/routes/terminal/credentials.d.ts +4 -4
  234. package/dist/routes/terminal/credentials.js +5 -5
  235. package/dist/routes/terminal/dry-run.d.ts +4 -4
  236. package/dist/routes/terminal/dry-run.js +9 -9
  237. package/dist/routes/terminal/ledger.d.ts +2 -2
  238. package/dist/routes/terminal/lifetime.d.ts +1 -1
  239. package/dist/routes/terminal/lifetime.js +1 -1
  240. package/dist/routes/terminal/live-finish.d.ts +2 -2
  241. package/dist/routes/terminal/live-finish.js +7 -7
  242. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  243. package/dist/routes/terminal/live-sandbox.js +3 -2
  244. package/dist/routes/terminal/participant-text.js +2 -1
  245. package/dist/routes/terminal/persona.d.ts +2 -2
  246. package/dist/routes/terminal/persona.js +2 -2
  247. package/dist/routes/terminal/plan.d.ts +7 -7
  248. package/dist/routes/terminal/plan.js +5 -5
  249. package/dist/routes/terminal/result.d.ts +5 -5
  250. package/dist/routes/terminal/result.js +7 -7
  251. package/dist/routes/terminal/route.d.ts +9 -9
  252. package/dist/routes/terminal/route.js +14 -14
  253. package/dist/routes/terminal/session.d.ts +5 -5
  254. package/dist/routes/terminal/session.js +7 -7
  255. package/dist/routes/terminal/trace.d.ts +2 -2
  256. package/dist/routes/terminal/types.d.ts +24 -24
  257. package/dist/routes/terminal/types.js +2 -2
  258. package/dist/run/bundle.d.ts +7 -7
  259. package/dist/run/bundle.js +2 -2
  260. package/dist/run/costs.d.ts +23 -0
  261. package/dist/run/costs.js +72 -43
  262. package/dist/run/dry-run-inputs.d.ts +1 -1
  263. package/dist/run/dry-run-inputs.js +1 -1
  264. package/dist/run/dry-run.js +2 -2
  265. package/dist/run/outcomes.d.ts +1 -1
  266. package/dist/run/participant.d.ts +1 -1
  267. package/dist/run/preflight-receipts.js +1 -1
  268. package/dist/run/pricing.js +2 -2
  269. package/dist/run/projection.d.ts +32 -32
  270. package/dist/run/projection.js +44 -44
  271. package/dist/run/reclaim.d.ts +1 -1
  272. package/dist/run/reclaim.js +1 -1
  273. package/dist/run/results.d.ts +2 -2
  274. package/dist/run/run-cost.d.ts +53 -0
  275. package/dist/run/run-cost.js +105 -0
  276. package/dist/run/run-index-analysis.d.ts +15 -0
  277. package/dist/run/run-index-analysis.js +77 -0
  278. package/dist/run/run-index.d.ts +11 -1
  279. package/dist/run/run-index.js +63 -49
  280. package/dist/run/run.d.ts +3 -3
  281. package/dist/run/run.js +2 -2
  282. package/dist/run/shared-world-evidence.d.ts +1 -1
  283. package/dist/run/shared-world-shape.js +1 -1
  284. package/dist/run/stats.d.ts +3 -3
  285. package/dist/run/stats.js +14 -14
  286. package/dist/run/status.d.ts +10 -2
  287. package/dist/run/status.js +6 -3
  288. package/dist/run/streams.d.ts +2 -2
  289. package/dist/run/study-provenance.d.ts +4 -2
  290. package/dist/run/study-provenance.js +7 -4
  291. package/dist/run/study-result.d.ts +0 -5
  292. package/dist/run/study-result.js +1 -1
  293. package/dist/run-study.d.ts +112 -0
  294. package/dist/{run-lab.js → run-study.js} +52 -45
  295. package/dist/{lab → study}/adapter-extension.d.ts +8 -20
  296. package/dist/{lab → study}/adapter-extension.js +2 -14
  297. package/dist/{lab → study}/adapter-scorer-loader.d.ts +10 -10
  298. package/dist/{lab → study}/adapter-scorer-loader.js +3 -3
  299. package/dist/study/composition-rules.d.ts +7 -0
  300. package/dist/{lab → study}/composition-rules.js +12 -12
  301. package/dist/study/config.d.ts +15 -0
  302. package/dist/{lab → study}/config.js +37 -20
  303. package/dist/study/convert.d.ts +1 -1
  304. package/dist/study/convert.js +15 -15
  305. package/dist/{lab → study}/device-presets.d.ts +2 -2
  306. package/dist/{lab → study}/discover.d.ts +29 -23
  307. package/dist/{lab → study}/discover.js +97 -118
  308. package/dist/{lab → study}/doctor.d.ts +11 -11
  309. package/dist/{lab → study}/doctor.js +18 -18
  310. package/dist/study/files.d.ts +2 -2
  311. package/dist/study/files.js +6 -5
  312. package/dist/{lab → study}/init-templates.d.ts +2 -2
  313. package/dist/{lab → study}/init-templates.js +16 -11
  314. package/dist/{lab → study}/init.d.ts +1 -1
  315. package/dist/{lab → study}/init.js +7 -4
  316. package/dist/{lab → study}/keys.d.ts +2 -2
  317. package/dist/{lab → study}/keys.js +10 -10
  318. package/dist/study/migrate.d.ts +1 -1
  319. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  320. package/dist/{lab → study}/parse/actors.js +5 -5
  321. package/dist/study/parse/comms.d.ts +12 -0
  322. package/dist/study/parse/execution.d.ts +19 -0
  323. package/dist/{lab → study}/parse/study-v3.d.ts +3 -5
  324. package/dist/{lab → study}/parse/study-v3.js +3 -3
  325. package/dist/{lab → study}/parse/subject-state.d.ts +8 -8
  326. package/dist/{lab → study}/parse/subject-state.js +4 -4
  327. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  328. package/dist/{lab → study}/parse/subject.js +8 -8
  329. package/dist/{lab → study}/parse/values.d.ts +2 -2
  330. package/dist/{lab → study}/persona-resolve.d.ts +4 -4
  331. package/dist/{lab → study}/persona-resolve.js +2 -2
  332. package/dist/{lab → study}/plan-base.d.ts +7 -7
  333. package/dist/{lab → study}/plan-base.js +1 -1
  334. package/dist/{lab → study}/plan-participants.d.ts +10 -10
  335. package/dist/{lab → study}/plan-participants.js +4 -4
  336. package/dist/{lab → study}/plan-types.d.ts +28 -28
  337. package/dist/{lab → study}/plan-types.js +2 -2
  338. package/dist/study/plan.d.ts +13 -0
  339. package/dist/{lab → study}/plan.js +20 -20
  340. package/dist/study/preflight-probes.d.ts +3 -0
  341. package/dist/{lab → study}/preflight-probes.js +9 -8
  342. package/dist/study/preflight-result.d.ts +8 -0
  343. package/dist/{lab → study}/preflight-result.js +3 -3
  344. package/dist/{lab → study}/preflight.d.ts +31 -31
  345. package/dist/{lab → study}/preflight.js +8 -8
  346. package/dist/{lab → study}/requirements.d.ts +3 -3
  347. package/dist/{lab → study}/requirements.js +1 -1
  348. package/dist/study/route-inputs.d.ts +28 -0
  349. package/dist/{lab → study}/route-inputs.js +1 -1
  350. package/dist/{lab → study}/routing.d.ts +12 -12
  351. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -10
  352. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -3
  353. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +8 -17
  354. package/dist/study/run-study-homes.js +3 -0
  355. package/dist/study/run-study-options.d.ts +28 -0
  356. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +13 -12
  357. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +2 -2
  358. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  359. package/dist/{lab → study}/summary.d.ts +10 -10
  360. package/dist/{lab → study}/summary.js +15 -15
  361. package/dist/{lab → study}/tasks.d.ts +3 -3
  362. package/dist/{lab → study}/tasks.js +1 -1
  363. package/dist/{lab → study}/types.d.ts +104 -104
  364. package/dist/{lab → study}/types.js +1 -1
  365. package/dist/{lab → study}/validation.d.ts +19 -19
  366. package/dist/{lab → study}/validation.js +13 -13
  367. package/dist/{lab → study}/warnings.d.ts +4 -4
  368. package/dist/{lab → study}/warnings.js +1 -1
  369. package/dist/subject/clone.d.ts +6 -6
  370. package/dist/subject/clone.js +2 -2
  371. package/dist/subject/local-tree-archive.d.ts +2 -2
  372. package/dist/subject/local-tree-archive.js +3 -3
  373. package/dist/subject/local-tree.d.ts +3 -3
  374. package/dist/subject/runtime.js +2 -2
  375. package/dist/subject/serve.d.ts +4 -4
  376. package/dist/subject/state.d.ts +3 -3
  377. package/dist/subject/state.js +1 -1
  378. package/dist/subject/steps.d.ts +1 -1
  379. package/dist/subject/steps.js +1 -1
  380. package/dist/substrates/desktop-session.js +2 -2
  381. package/dist/substrates/detached.d.ts +1 -1
  382. package/dist/substrates/e2b/desktop-browser.d.ts +4 -4
  383. package/dist/substrates/e2b/desktop-browser.js +1 -1
  384. package/dist/substrates/e2b/desktop-cdp.d.ts +1 -1
  385. package/dist/substrates/e2b/desktop-cdp.js +1 -1
  386. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  387. package/dist/substrates/e2b/desktop-executor.js +12 -12
  388. package/dist/substrates/e2b/desktop-geometry.d.ts +1 -1
  389. package/dist/substrates/e2b/desktop-geometry.js +1 -1
  390. package/dist/substrates/e2b/desktop-media.d.ts +3 -3
  391. package/dist/substrates/e2b/lifetime.js +1 -1
  392. package/dist/substrates/e2b/sandbox.d.ts +3 -3
  393. package/dist/substrates/e2b/sandbox.js +1 -1
  394. package/dist/substrates/e2b/sdk.d.ts +1 -1
  395. package/dist/substrates/e2b/sdk.js +1 -1
  396. package/dist/substrates/local/runtime-config.d.ts +4 -4
  397. package/dist/substrates/local/runtime-config.js +4 -4
  398. package/dist/tui/contract.d.ts +8 -8
  399. package/dist/tui/contract.js +2 -2
  400. package/dist/tui/launch.d.ts +3 -3
  401. package/dist/tui/launch.js +22 -16
  402. package/dist/tui-app.js +139 -139
  403. package/dist/verify/subject.d.ts +1 -1
  404. package/dist/verify/subject.js +1 -1
  405. package/dist/verify/verify.js +2 -1
  406. package/docs/architecture/actor-contract.md +5 -5
  407. package/docs/architecture/browser-control.md +1 -1
  408. package/docs/architecture/external-public-shared-world.md +8 -7
  409. package/docs/architecture/github-feedback-loop.md +1 -1
  410. package/docs/architecture/task-protocol-support.md +1 -1
  411. package/docs/architecture/terminal-product-route.md +18 -18
  412. package/docs/contracts/adapter-fixtures.md +2 -2
  413. package/docs/contracts/errors.md +8 -8
  414. package/docs/contracts/run-bundle.md +1 -4
  415. package/docs/contracts/schemas.md +61 -42
  416. package/docs/contracts/study-analysis.md +4 -1
  417. package/docs/contracts/study-costs.md +17 -2
  418. package/examples/README.md +1 -1
  419. package/examples/scorer/scorer.mjs +3 -3
  420. package/package.json +1 -1
  421. package/skills/humanish/SKILL.md +8 -6
  422. package/skills/humanish/agents/openai.yaml +1 -1
  423. package/dist/cli/commands/lab-format.d.ts +0 -9
  424. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  425. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  426. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  427. package/dist/cli/commands/lab-run.d.ts +0 -9
  428. package/dist/lab/composition-rules.d.ts +0 -7
  429. package/dist/lab/config.d.ts +0 -7
  430. package/dist/lab/deprecated-fields.d.ts +0 -10
  431. package/dist/lab/deprecated-fields.js +0 -24
  432. package/dist/lab/parse/comms.d.ts +0 -12
  433. package/dist/lab/parse/execution.d.ts +0 -19
  434. package/dist/lab/plan.d.ts +0 -13
  435. package/dist/lab/preflight-probes.d.ts +0 -3
  436. package/dist/lab/preflight-result.d.ts +0 -8
  437. package/dist/lab/route-inputs.d.ts +0 -28
  438. package/dist/lab/run-lab-homes.js +0 -7
  439. package/dist/lab/run-lab-options.d.ts +0 -28
  440. package/dist/library-aliases.d.ts +0 -56
  441. package/dist/library-aliases.js +0 -22
  442. package/dist/run-lab.d.ts +0 -112
  443. /package/dist/{lab → study}/device-presets.js +0 -0
  444. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  445. /package/dist/{lab → study}/init-paths.js +0 -0
  446. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  447. /package/dist/{lab → study}/init-plan.js +0 -0
  448. /package/dist/{lab → study}/parse/comms.js +0 -0
  449. /package/dist/{lab → study}/parse/execution.js +0 -0
  450. /package/dist/{lab → study}/parse/values.js +0 -0
  451. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  452. /package/dist/{lab → study}/participant-assignment.js +0 -0
  453. /package/dist/{lab → study}/persona.d.ts +0 -0
  454. /package/dist/{lab → study}/persona.js +0 -0
  455. /package/dist/{lab → study}/routing.js +0 -0
@@ -1,7 +1,7 @@
1
- // The computer-use lab backend: a subject (an app-url the caller provisioned, or a repo the
2
- // lab clones and serves in-sandbox) driven by a registry-resolved computer-use actor inside a
1
+ // The computer-use route: a subject (an app-url the caller provisioned, or a repo the
2
+ // humanish clones and serves in the sandbox) driven by a registry-resolved computer-use actor inside a
3
3
  // hosted E2B desktop. On this path `actors[].type` selects the actor: the
4
- // descriptor returned by the registry runs the session; the lab provisions the desktop and
4
+ // descriptor returned by the registry runs the session; the route provisions the desktop and
5
5
  // subject, composes the prompt from config, persists the evidence bundle, and tears down.
6
6
  //
7
7
  // Substrate notes:
@@ -26,24 +26,24 @@ import path from "node:path";
26
26
  import { completeAutomaticAnalysis } from "../../analysis/automatic-completion.js";
27
27
  import { runScope } from "../../run/run.js";
28
28
  import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
29
- import { browserRouteScorer } from "../../lab/adapter-scorer-loader.js";
30
- import { withLateScorer } from "../../lab/route-inputs.js";
31
- import { callerDrivingOf, planComputerUseLab } from "./plan.js";
29
+ import { browserRouteScorer } from "../../study/adapter-scorer-loader.js";
30
+ import { withLateScorer } from "../../study/route-inputs.js";
31
+ import { callerDrivingOf, planComputerUseStudy } from "./plan.js";
32
32
  import { finishCuaRun } from "./result.js";
33
- import { runLabParticipants } from "./live-phase.js";
34
- import { admitCuaRun, refuseCuaLab, startCuaRun } from "./setup.js";
33
+ import { runStudyParticipants } from "./live-phase.js";
34
+ import { admitCuaRun, refuseCuaStudy, startCuaRun } from "./setup.js";
35
35
  import {} from "./types.js";
36
36
  import { studyResultIdentity } from "../../run/study-result.js";
37
37
  /**
38
- * Plans and runs a computer-use lab in one call. It is not exported from src/index.ts; tests call
39
- * it. It plans the config with planComputerUseLab and runs
38
+ * Plans and runs a computer-use study in one call. It is not exported from src/index.ts; tests call
39
+ * it. It plans the config with planComputerUseStudy and runs
40
40
  * the plan with runComputerUsePlan, whose run scope and withTransientCommsSecrets wrapper cover the
41
41
  * run and its analysis.
42
42
  */
43
- export async function runCuaActorLab(options) {
43
+ export async function runCuaActorStudy(options) {
44
44
  const { config, dryRun, ...input } = options;
45
- // planComputerUseLab makes every configuration refusal, in the order this route always has.
46
- const planned = planComputerUseLab(config, {
45
+ // planComputerUseStudy makes every configuration refusal, in the order this route always has.
46
+ const planned = planComputerUseStudy(config, {
47
47
  dryRun,
48
48
  hasRunSession: input.deps?.runSession !== undefined,
49
49
  driving: callerDrivingOf(input),
@@ -52,14 +52,14 @@ export async function runCuaActorLab(options) {
52
52
  });
53
53
  if (planned.ok)
54
54
  return runComputerUsePlan(planned.plan, input, config);
55
- return computerUseLabRefusal(options, planned.refusal);
55
+ return computerUseStudyRefusal(options, planned.refusal);
56
56
  }
57
57
  /**
58
- * A refused computer-use lab's result, at the refusal's stage: a before-scope refusal has its own
58
+ * A refused computer-use study's result, at the refusal's stage: a before-scope refusal has its own
59
59
  * envelope and no analysis record; the others come after the cwd checks, and the participant cap after
60
60
  * the personas are read.
61
61
  */
62
- export async function computerUseLabRefusal(options, refusal) {
62
+ export async function computerUseStudyRefusal(options, refusal) {
63
63
  const { config, dryRun } = options;
64
64
  if (refusal.stage === "before-scope")
65
65
  return {
@@ -76,10 +76,10 @@ export async function computerUseLabRefusal(options, refusal) {
76
76
  };
77
77
  // The other refusals come after the cwd checks, and the participant cap after the personas are read.
78
78
  const analysis = resolveAutomaticAnalysis(config.review?.analysis);
79
- return completeAutomaticAnalysis(await refuseCuaLab(options, refusal), undefined, analysis.ok ? analysis.config : undefined, options, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
79
+ return completeAutomaticAnalysis(await refuseCuaStudy(options, refusal), undefined, analysis.ok ? analysis.config : undefined, options, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
80
80
  }
81
81
  /**
82
- * runLab's step for a computer-use plan. It runs the plan's local checks (admitCuaRun: the
82
+ * runStudyWith's step for a computer-use plan. It runs the plan's local checks (admitCuaRun: the
83
83
  * participants, the preflight plan, the keys, the local agent, subject env and caps, and the
84
84
  * local-tree archive) before any run scope opens, so the CLI can present their refusal before it
85
85
  * loads a declared scorer, and returns the run that continues from them with that scorer.
@@ -141,7 +141,7 @@ async function runPlanInScope(plan, input, admitted, scope) {
141
141
  const prepared = await startCuaRun(plan, input, admitted, scope);
142
142
  if (!prepared.ok)
143
143
  return prepared.result;
144
- const ran = await runLabParticipants(prepared.setup, prepared.participants);
144
+ const ran = await runStudyParticipants(prepared.setup, prepared.participants);
145
145
  if (!ran.ok)
146
146
  return ran.result;
147
147
  return finishCuaRun(prepared.setup, prepared.finish, ran);
@@ -125,7 +125,7 @@ function stripNegatedNonBlockerPhrases(text) {
125
125
  .replace(/\bno\s+(?:real\s+|remaining\s+|actual\s+)?(?:blocker|blockers|blocking issue|blocking issues|error|errors|failure|failures)\s+(?:was\s+|were\s+)?(?:encountered|observed|found|hit|seen|reported|detected)\b/g, "")
126
126
  .replace(/\bwithout\s+(?:a\s+|any\s+)?(?:real\s+|remaining\s+|actual\s+)?(?:blocker|blockers|blocking issue|blocking issues|error|errors|failure|failures)\b/g, "")
127
127
  .replace(/\bnot\s+(?:blocked|a blocker|an error|failed)\b/g, "")
128
- // "No functional failures blocked me" downgraded a clean passing run to a lab failure on
128
+ // "No functional failures blocked me" downgraded a clean passing run to a run failure on
129
129
  // 2026-09-01. The adjective list above is closed (real|remaining|actual), so an ordinary
130
130
  // qualifier like "functional" slipped through and the trailing verb "blocked" tripped the
131
131
  // scan. Allow up to two intervening words, and cover the verb form directly.
@@ -1,26 +1,26 @@
1
1
  import { type RunScope } from "../../run/run.js";
2
2
  import type { CuaActorDescriptor } from "../../actors/registry.js";
3
- import type { LabCommsEmail, LabCommsExternal, LabConfig } from "../../lab/types.js";
3
+ import type { StudyCommsEmail, StudyCommsExternal, StudyConfig } from "../../study/types.js";
4
4
  import { type RunRerunLineage } from "../../run/bundle.js";
5
5
  import { type LocalTreeArchive } from "../../subject/local-tree-archive.js";
6
6
  import { type ComputerUseRefusal } from "./plan.js";
7
- import type { ComputerUsePlan } from "../../lab/plan-types.js";
7
+ import type { ComputerUsePlan } from "../../study/plan-types.js";
8
8
  import { trackRuntimeStreams, type LiveTraceFlush } from "./live-flush.js";
9
9
  import { type CuaRunBundleBase } from "./bundle.js";
10
10
  import { projectParticipantSubjects } from "./subject-projection.js";
11
- import { type CuaActorLabErrorCode, type CuaActorLabResult, type CuaParticipantDeps, type CuaParticipantPlan, type DesktopParticipantRun, type CuaSubjectProjection, type CuaSubjectProvenanceArg, type ComputerUseRunInput, type RunCuaActorLabOptions } from "./types.js";
11
+ import { type CuaActorStudyErrorCode, type CuaActorStudyResult, type CuaParticipantDeps, type CuaParticipantPlan, type DesktopParticipantRun, type CuaSubjectProjection, type CuaSubjectProvenanceArg, type ComputerUseRunInput, type RunCuaActorStudyOptions } from "./types.js";
12
12
  /**
13
13
  * The envelope of a refusal the plan left for after the cwd checks. The participant cap and
14
14
  * in-process fan-out refusals come after the committed personas are read, so a persona-file error still wins.
15
15
  */
16
- export declare function refuseCuaLab(options: RunCuaActorLabOptions, refusal: ComputerUseRefusal): Promise<CuaActorLabResult>;
16
+ export declare function refuseCuaStudy(options: RunCuaActorStudyOptions, refusal: ComputerUseRefusal): Promise<CuaActorStudyResult>;
17
17
  export type AdmittedCuaRun = Extract<Awaited<ReturnType<typeof admitCuaRun>>, {
18
18
  ok: true;
19
19
  }>["admitted"];
20
20
  type StartedRun = Extract<Awaited<ReturnType<RunScope["startRun"]>>, {
21
21
  ok: true;
22
22
  }>["run"];
23
- /** What runLabParticipants and finishCuaRun both read. */
23
+ /** What runStudyParticipants and finishCuaRun both read. */
24
24
  export interface CuaRunSetup {
25
25
  plan: ComputerUsePlan;
26
26
  input: ComputerUseRunInput;
@@ -34,22 +34,22 @@ export interface CuaRunSetup {
34
34
  scrubKnownValues: (text: string) => string;
35
35
  bundleBase: CuaRunBundleBase;
36
36
  }
37
- /** What only runLabParticipants reads. */
37
+ /** What only runStudyParticipants reads. */
38
38
  export interface CuaParticipantsSetup {
39
39
  env: Record<string, string | undefined>;
40
40
  /** The array scrubKnownValues reads at each call. Email receiving appends the values it
41
41
  * provisions before the participants run. */
42
42
  knownSecretValues: string[];
43
43
  deps: Omit<CuaParticipantDeps, "signalProvisioned">;
44
- /** Filled by runLabParticipants on a live run; deps.onTrace reads it. */
44
+ /** Filled by runStudyParticipants on a live run; deps.onTrace reads it. */
45
45
  liveTrace: {
46
46
  flush?: LiveTraceFlush["flush"];
47
47
  stop?: LiveTraceFlush["stop"];
48
48
  };
49
49
  /** The operator-hosted inbox on the app-url route, when declared. */
50
50
  externalComms: {
51
- config: LabCommsExternal;
52
- email: LabCommsEmail;
51
+ config: StudyCommsExternal;
52
+ email: StudyCommsEmail;
53
53
  } | undefined;
54
54
  /** The subjects of the in-progress bundle, written before any participant starts. */
55
55
  inProgress: {
@@ -58,7 +58,7 @@ export interface CuaParticipantsSetup {
58
58
  provenance: CuaSubjectProvenanceArg | undefined;
59
59
  };
60
60
  /** The refusal envelope, for a run that stops before its bundle. */
61
- fail: (code: CuaActorLabErrorCode, message: string, actorLabel?: string) => CuaActorLabResult;
61
+ fail: (code: CuaActorStudyErrorCode, message: string, actorLabel?: string) => CuaActorStudyResult;
62
62
  }
63
63
  /** What only finishCuaRun reads besides the participants' outcomes. */
64
64
  export interface CuaFinishFacts {
@@ -68,7 +68,7 @@ export interface CuaFinishFacts {
68
68
  }
69
69
  type PreparedCuaRun = {
70
70
  ok: false;
71
- result: CuaActorLabResult;
71
+ result: CuaActorStudyResult;
72
72
  } | {
73
73
  ok: true;
74
74
  setup: CuaRunSetup;
@@ -78,21 +78,21 @@ type PreparedCuaRun = {
78
78
  /**
79
79
  * Everything before the run starts: the physical project, the route, the participant plan and
80
80
  * preflight, the key and subject-env scrubber, the live checks that need no sandbox, and the
81
- * local-tree archive. These read files, env and the network, which planLab does not. Returns the
81
+ * local-tree archive. These read files, env and the network, which planStudy does not. Returns the
82
82
  * refusal, or what startCuaRun reads.
83
83
  */
84
- export declare function admitCuaRun(plan: ComputerUsePlan, input: ComputerUseRunInput, config: LabConfig): Promise<{
84
+ export declare function admitCuaRun(plan: ComputerUsePlan, input: ComputerUseRunInput, config: StudyConfig): Promise<{
85
85
  ok: false;
86
- result: CuaActorLabResult;
86
+ result: CuaActorStudyResult;
87
87
  } | {
88
88
  ok: true;
89
89
  admitted: {
90
- config: LabConfig;
90
+ config: StudyConfig;
91
91
  dryRun: boolean;
92
92
  cwd: string;
93
- seams: import("../../lab/lab-deps.js").LabDeps;
93
+ seams: import("../../study/study-deps.js").StudyDeps;
94
94
  streams: {
95
- onStream: NonNullable<import("../../lab/run-lab-homes.js").RunLabHomes["onStream"]>;
95
+ onStream: NonNullable<import("../../study/run-study-homes.js").RunStudyHomes["onStream"]>;
96
96
  showIn: (observer: import("../../index.js").ObserverResult & {
97
97
  ok: true;
98
98
  }) => void;
@@ -100,15 +100,15 @@ export declare function admitCuaRun(plan: ComputerUsePlan, input: ComputerUseRun
100
100
  };
101
101
  env: Record<string, string | undefined>;
102
102
  appUrl: string;
103
- fail: (code: CuaActorLabErrorCode, message: string, actorLabel?: string) => CuaActorLabResult;
104
- refuse: (code: CuaActorLabErrorCode, message: string, actorLabel?: string | undefined) => {
103
+ fail: (code: CuaActorStudyErrorCode, message: string, actorLabel?: string) => CuaActorStudyResult;
104
+ refuse: (code: CuaActorStudyErrorCode, message: string, actorLabel?: string | undefined) => {
105
105
  ok: false;
106
- result: CuaActorLabResult;
106
+ result: CuaActorStudyResult;
107
107
  };
108
108
  descriptor: CuaActorDescriptor;
109
109
  runSession: (options: import("../../actors/computer-use/actor.js").CuaActorSessionOptions) => Promise<import("../../index.js").ComputerUseLoopResult>;
110
- externalCommsConfig: LabCommsExternal | undefined;
111
- externalCommsEmail: LabCommsEmail | undefined;
110
+ externalCommsConfig: StudyCommsExternal | undefined;
111
+ externalCommsEmail: StudyCommsEmail | undefined;
112
112
  participantRuns: DesktopParticipantRun[];
113
113
  participantPlan: CuaParticipantPlan;
114
114
  rerunLineage: RunRerunLineage | undefined;
@@ -17,13 +17,13 @@ import { e2bRequestTimeoutMs } from "../../substrates/e2b/lifetime.js";
17
17
  import { liveCuaRejection } from "./preflight.js";
18
18
  import { cuaDescriptorOf, declaredAppUrl, plannedAppUrl } from "./plan.js";
19
19
  import { trackRuntimeStreams } from "./live-flush.js";
20
- import { phaseEvent, planEvent } from "../../lab/run-lab-events.js";
20
+ import { phaseEvent, planEvent } from "../../study/run-study-events.js";
21
21
  import { defaultSubjectPhaseSink } from "../../subject/steps.js";
22
22
  import {} from "./bundle.js";
23
23
  import { packRunLocalTree } from "./local-tree-pack.js";
24
24
  import { projectParticipantSubjects, subjectProvenanceArg } from "./subject-projection.js";
25
25
  import { participantSubjectEnv, } from "./types.js";
26
- import { labPersonaIds } from "../../lab/persona-resolve.js";
26
+ import { studyPersonaIds } from "../../study/persona-resolve.js";
27
27
  import { studyResultIdentity } from "../../run/study-result.js";
28
28
  /** The physical project, bound before any caller hook runs. */
29
29
  async function bindProject(cwd) {
@@ -37,12 +37,12 @@ async function bindProject(cwd) {
37
37
  * The envelope of a refusal the plan left for after the cwd checks. The participant cap and
38
38
  * in-process fan-out refusals come after the committed personas are read, so a persona-file error still wins.
39
39
  */
40
- export async function refuseCuaLab(options, refusal) {
40
+ export async function refuseCuaStudy(options, refusal) {
41
41
  const { config, dryRun } = options;
42
42
  const projectRoot = await bindProject(options.cwd);
43
43
  // The committed personas are read before the refusal returns, so a persona-file error wins.
44
44
  if (refusal.stage === "after-personas")
45
- await compileParticipantPersonas(projectRoot, labPersonaIds(config));
45
+ await compileParticipantPersonas(projectRoot, studyPersonaIds(config));
46
46
  return {
47
47
  ...studyResultIdentity("computer-use", config.id),
48
48
  ok: false,
@@ -59,7 +59,7 @@ export async function refuseCuaLab(options, refusal) {
59
59
  /**
60
60
  * Everything before the run starts: the physical project, the route, the participant plan and
61
61
  * preflight, the key and subject-env scrubber, the live checks that need no sandbox, and the
62
- * local-tree archive. These read files, env and the network, which planLab does not. Returns the
62
+ * local-tree archive. These read files, env and the network, which planStudy does not. Returns the
63
63
  * refusal, or what startCuaRun reads.
64
64
  */
65
65
  export async function admitCuaRun(plan, input, config) {
@@ -74,7 +74,7 @@ export async function admitCuaRun(plan, input, config) {
74
74
  const appUrl = plannedAppUrl(subject);
75
75
  const subjectEnvNames = [...participantSubjectEnv(subject)];
76
76
  const fail = (code, message, actorLabel) => ({
77
- ...studyResultIdentity("computer-use", plan.labId),
77
+ ...studyResultIdentity("computer-use", plan.studyId),
78
78
  ok: false,
79
79
  cwd,
80
80
  actor: actorLabel ?? plan.actor,
@@ -89,13 +89,13 @@ export async function admitCuaRun(plan, input, config) {
89
89
  ok: false,
90
90
  result: fail(...args),
91
91
  });
92
- // runLab's local VM study supplies a local-target app-url lab's desktop; a direct route call or
93
- // an in-process executor on the same lab has none. It reads the declared source, as the planner
92
+ // runStudyWith's local VM study supplies a local-target app-url study's desktop; a direct route call or
93
+ // an in-process executor on the same study has none. It reads the declared source, as the planner
94
94
  // did: a library config the parser never saw can plan to an app-url subject from another source.
95
95
  if (config.subject.source === "app-url" &&
96
96
  config.execution?.target === "local" &&
97
97
  input.localVm === undefined)
98
- return refuse("HUMANISH_COMPUTER_USE_LOCAL_DESKTOP_MISSING", "An app-url lab with execution.target: local needs a local desktop. runLab starts one; a direct route call or an in-process executor does not.");
98
+ return refuse("HUMANISH_COMPUTER_USE_LOCAL_DESKTOP_MISSING", "An app-url study with execution.target: local needs a local desktop. runStudy starts one; a direct route call or an in-process executor does not.");
99
99
  const descriptor = cuaDescriptorOf(plan.actor);
100
100
  const baseRunSession = seams.runSession ?? descriptor.runSession;
101
101
  // A local VM study's sessions abort on its signal.
@@ -123,7 +123,7 @@ export async function admitCuaRun(plan, input, config) {
123
123
  // every N; the stderr table prints for fan-out (N>1) so single-participant runs stay as quiet as they
124
124
  // always were.
125
125
  if (participantCount > 1) {
126
- emitPreflightPlan(participantPlan, plan.labId);
126
+ emitPreflightPlan(participantPlan, plan.studyId);
127
127
  }
128
128
  input.emit?.(planEvent(participantPlan));
129
129
  await assertPreparedSelectedOutputDirectory(projectRoot);
@@ -205,14 +205,14 @@ export async function startCuaRun(plan, input, admitted, scope) {
205
205
  const { dryRun, cwd, seams, descriptor, participantRuns, participantPlan, publicRepo } = admitted;
206
206
  const { appUrl } = admitted;
207
207
  // The run's status record exists from here on, so anything watching the runs directory can
208
- // tell which lab this is and that it is alive. The fail-closed returns below leave it finished
208
+ // tell which study this is and that it is alive. The fail-closed returns below leave it finished
209
209
  // with no outcome when the scope closes; a crash leaves it stale, which reads as interrupted.
210
210
  const started = await scope.startRun({
211
211
  cwd,
212
212
  runId: input.runId,
213
213
  mintRunId: makeCuaRunId,
214
214
  mode: dryRun ? "dry-run" : "live",
215
- lab: plan.lab,
215
+ study: plan.study,
216
216
  renderReview: renderCuaReviewMarkdown,
217
217
  observer: { open: input.open === true, render: seams.renderObserver },
218
218
  });
@@ -228,7 +228,7 @@ export async function startCuaRun(plan, input, admitted, scope) {
228
228
  humanishSource: "present",
229
229
  packageName: "humanish",
230
230
  });
231
- // Live-trace flush seam: runLabParticipants fills it when a live run has an in-progress bundle
231
+ // Live-trace flush seam: runStudyParticipants fills it when a live run has an in-progress bundle
232
232
  // to grow; participants call it through deps.onTrace. It exists before deps so deps can reference it as
233
233
  // a stable indirection.
234
234
  const liveTrace = {};
@@ -315,7 +315,7 @@ function cuaParticipantDeps(plan, input, admitted, run) {
315
315
  onTrace: (participantId, items, usage, metadata) => liveTrace.flush?.(participantId, items, usage, metadata),
316
316
  ...callerDriving(input, config),
317
317
  residual: plan.residual,
318
- labId: plan.labId,
318
+ studyId: plan.studyId,
319
319
  caps: plan.caps,
320
320
  appUrl,
321
321
  brain: plan.runner.brain,
@@ -329,7 +329,7 @@ function cuaParticipantDeps(plan, input, admitted, run) {
329
329
  timeoutMs,
330
330
  participantCount,
331
331
  artifactRoot: runPaths,
332
- labCwd: input.cwd,
332
+ studyCwd: input.cwd,
333
333
  redactScreenshots,
334
334
  scrubKnownValues,
335
335
  runSession,
@@ -16,7 +16,7 @@ export declare function buildSingleParticipantBundle(args: {
16
16
  /** The run's verdict, from the judge. */
17
17
  verdict: Verdict;
18
18
  realEmail?: boolean;
19
- /** The run this bundle belongs to; the bundle head reads its id, mode, start and lab. */
19
+ /** The run this bundle belongs to; the bundle head reads its id, mode, start and study. */
20
20
  run: BundleRun;
21
21
  actorId: string;
22
22
  appUrl: string;
@@ -26,8 +26,8 @@ export declare function buildSingleParticipantBundle(args: {
26
26
  surface?: string;
27
27
  caseGroup?: string;
28
28
  dryRun: boolean;
29
- labId: string;
30
- labTitle?: string;
29
+ studyId: string;
30
+ studyTitle?: string;
31
31
  mission: string;
32
32
  assignment?: RunStream["assignment"];
33
33
  persona: ActorPersonaRef;
@@ -44,7 +44,7 @@ export declare function buildSingleParticipantBundle(args: {
44
44
  isMobile?: boolean;
45
45
  screenshots: string[];
46
46
  /** Relative run-dir path of the digest-only comms-thread evidence artifact (humanish.comms-thread.v1),
47
- * when a comms lab captured mail; registered as a "log" stream artifact. */
47
+ * when a comms study captured mail; registered as a "log" stream artifact. */
48
48
  commsArtifactPath?: string;
49
49
  /**
50
50
  * Capture-time screenshot policy ("blurred" when policies.redactScreenshots, else "raw").
@@ -1,4 +1,4 @@
1
- import { participantAssignment } from "../../lab/participant-assignment.js";
1
+ import { participantAssignment } from "../../study/participant-assignment.js";
2
2
  import { redactText } from "../../evidence/redaction.js";
3
3
  import { REVIEW_SCHEMA, bundleArtifacts, bundleHead, } from "../../run/bundle.js";
4
4
  import {} from "../../run/streams.js";
@@ -7,6 +7,7 @@ import { describeSubjectState, participantFeedbackCandidates, phaseEventIdSuffix
7
7
  import { participantStatus as participantStatusFor } from "../../run/judge.js";
8
8
  import { buildRunCostSummary } from "../../run/cost-summary.js";
9
9
  import { participantEvent, participantIds, participantRecord, participantStream, } from "../../run/participant-records.js";
10
+ import { plural } from "../../run/text.js";
10
11
  /** The one participant's record and stream ids: sim-001 and stream-001. */
11
12
  const SINGLE = participantIds(0);
12
13
  /** The participant's runner: a hosted E2B desktop, a local VM desktop, or the in-process route. */
@@ -80,7 +81,7 @@ function singleSimulation(args, view) {
80
81
  const { publicAppUrl, status, reason } = view;
81
82
  return participantRecord(SINGLE, 1, {
82
83
  personaId: args.persona.id,
83
- scenarioId: `cua-${args.labId}`,
84
+ scenarioId: `cua-${args.studyId}`,
84
85
  status,
85
86
  streamKind: "browser",
86
87
  mode: "browser-sim",
@@ -91,7 +92,7 @@ function singleSimulation(args, view) {
91
92
  : args.inProgress === true
92
93
  ? `Computer-use actor (${args.actorId}) is driving the subject app ${browserPlace(args)}.`
93
94
  : args.sessionError !== undefined
94
- ? `Computer-use lab failed before a terminal session verdict: ${args.sessionError}`
95
+ ? `The computer-use run failed before a terminal session verdict: ${args.sessionError}`
95
96
  : `Computer-use actor (${args.actorId}) against ${publicAppUrl}; no session ran.`,
96
97
  startedAt: args.run.createdAt,
97
98
  updatedAt: args.run.createdAt,
@@ -133,7 +134,7 @@ function singleStream(args, view) {
133
134
  ...(args.session ? { actorStatus: args.session.status } : {}),
134
135
  ...(lastScreenshot ? { screenshotUrl: lastScreenshot } : {}),
135
136
  },
136
- // The seam this lab exists to fill: the provider-neutral actor evidence projection.
137
+ // The seam this route exists to fill: the provider-neutral actor evidence projection.
137
138
  ...(args.session ? { actor: args.session.trace } : {}),
138
139
  artifacts: [
139
140
  { label: "run bundle", path: "run.json", kind: "bundle" },
@@ -164,7 +165,7 @@ function singleEvents(args, view) {
164
165
  at: args.run.createdAt,
165
166
  level: "info",
166
167
  type: "cua-lab.run.created",
167
- message: `Created computer-use lab run for ${args.labId} (actor ${args.actorId}).`,
168
+ message: `Created a computer-use run for ${args.studyId} (actor ${args.actorId}).`,
168
169
  },
169
170
  args.subjectProvenance
170
171
  ? participantEvent(SINGLE, {
@@ -312,21 +313,21 @@ export function buildSingleParticipantBundle(args) {
312
313
  persona: {
313
314
  id: args.persona.id,
314
315
  name: `Computer-use operator (${args.persona.id})`,
315
- source: `study:${args.labId}`,
316
+ source: `study:${args.studyId}`,
316
317
  sourceDigest: args.persona.promptDigest,
317
318
  },
318
319
  scenario: {
319
- id: `cua-${args.labId}`,
320
- title: args.labTitle ?? `Computer-use lab: ${args.labId}`,
320
+ id: `cua-${args.studyId}`,
321
+ title: args.studyTitle ?? `Computer-use run: ${args.studyId}`,
321
322
  goal: redactText(args.mission),
322
- source: `study:${args.labId}`,
323
+ source: `study:${args.studyId}`,
323
324
  sourceDigest: args.persona.promptDigest,
324
325
  },
325
326
  lifecycle: [
326
327
  {
327
328
  at: args.run.createdAt,
328
329
  event: "cua-lab.run.created",
329
- message: `Created computer-use lab run with one participant in a desktop browser (actor ${args.actorId}).`,
330
+ message: `Created a computer-use run with one participant in a desktop browser (actor ${args.actorId}).`,
330
331
  },
331
332
  ],
332
333
  simulations: [simulation],
@@ -339,7 +340,7 @@ export function buildSingleParticipantBundle(args) {
339
340
  : traceScreenshotMode === "blurred"
340
341
  ? "Typed text recorded as length only and reasoning/messages pass through text redaction. Screenshots are blurred at capture (policies.redactScreenshots: true) for a share-as-is bundle."
341
342
  : args.screenshots.length > 0
342
- ? `Session ended before a trace was recorded; ${args.screenshots.length} already-written frame(s) follow the capture policy (${screenshotMode}). Typed text is recorded as length only and reasoning/messages pass through text redaction.`
343
+ ? `Session ended before a trace was recorded; ${plural(args.screenshots.length, "already-written frame")} ${args.screenshots.length === 1 ? "follows" : "follow"} the capture policy (${screenshotMode}). Typed text is recorded as length only and reasoning/messages pass through text redaction.`
343
344
  : "No screenshots captured. Typed text is recorded as length only and reasoning/messages pass through text redaction whenever a session runs.",
344
345
  },
345
346
  artifacts: bundleArtifacts(),
@@ -350,8 +351,8 @@ export function buildSingleParticipantBundle(args) {
350
351
  ? []
351
352
  : participantFeedbackCandidates({
352
353
  runId: args.run.runId,
353
- scenarioId: `cua-${args.labId}`,
354
- adapterId: args.labId,
354
+ scenarioId: `cua-${args.studyId}`,
355
+ adapterId: args.studyId,
355
356
  goal: redactText(args.mission),
356
357
  substrate: runnerSubstrate(args),
357
358
  participants: [
@@ -1,5 +1,5 @@
1
- import type { ComputerUsePlan } from "../../lab/plan-types.js";
2
- import type { LabSubjectState } from "../../lab/types.js";
1
+ import type { ComputerUsePlan } from "../../study/plan-types.js";
2
+ import type { StudySubjectState } from "../../study/types.js";
3
3
  import { type RunSubjectProvenance, type RunSubjectStateStepRecord } from "../../run/bundle.js";
4
4
  import { type LocalTreeArchive } from "../../subject/local-tree-archive.js";
5
5
  import { type DesktopParticipantRun, type CuaSubjectProjection, type CuaSubjectProvenanceArg, type ParticipantRunOutcome } from "./types.js";
@@ -24,7 +24,7 @@ export declare function projectParticipantSubjects(args: {
24
24
  * contract bundles and failed live provisioning); no declaration → "undeclared".
25
25
  */
26
26
  export declare function resolveSubjectState(args: {
27
- declared: LabSubjectState | undefined;
27
+ declared: StudySubjectState | undefined;
28
28
  dryRun: boolean;
29
29
  executed: RunSubjectStateStepRecord[];
30
30
  }): RunSubjectProvenance["state"];