humanish 0.107.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (671) hide show
  1. package/ARCHITECTURE.md +73 -69
  2. package/CHANGELOG.md +27 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +148 -175
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-trace.js +2 -1
  14. package/dist/actors/codex/app-server-ui.js +1 -1
  15. package/dist/actors/codex/codex-admission.d.ts +91 -0
  16. package/dist/actors/codex/codex-admission.js +150 -0
  17. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  18. package/dist/actors/codex/restricted-executable.js +8 -8
  19. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  20. package/dist/actors/codex/restricted-launch.js +1 -1
  21. package/dist/actors/codex/restricted-participant.js +20 -18
  22. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  23. package/dist/actors/codex/restricted-policy.js +2 -2
  24. package/dist/actors/codex/restricted-session.d.ts +3 -3
  25. package/dist/actors/codex/restricted-session.js +10 -5
  26. package/dist/actors/computer-use/actor.d.ts +18 -18
  27. package/dist/actors/computer-use/actor.js +4 -4
  28. package/dist/actors/computer-use/admission-limit.d.ts +3 -3
  29. package/dist/actors/computer-use/admission-limit.js +4 -4
  30. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  31. package/dist/actors/computer-use/executor-error.js +3 -3
  32. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  33. package/dist/actors/computer-use/loop/actions.js +15 -15
  34. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  35. package/dist/actors/computer-use/loop/backstop.js +14 -12
  36. package/dist/actors/computer-use/loop/debrief.js +2 -2
  37. package/dist/actors/computer-use/loop/ending.d.ts +6 -6
  38. package/dist/actors/computer-use/loop/ending.js +18 -17
  39. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  40. package/dist/actors/computer-use/loop/observation.js +15 -14
  41. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  42. package/dist/actors/computer-use/loop/provider-call.js +12 -12
  43. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  44. package/dist/actors/computer-use/loop/session.js +4 -4
  45. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  46. package/dist/actors/computer-use/loop/spend.js +1 -1
  47. package/dist/actors/computer-use/loop/trace.js +11 -9
  48. package/dist/actors/computer-use/loop/types.d.ts +47 -45
  49. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  50. package/dist/actors/computer-use/loop/usage.js +2 -2
  51. package/dist/actors/computer-use/loop.d.ts +6 -1
  52. package/dist/actors/computer-use/loop.js +26 -4
  53. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  54. package/dist/actors/computer-use/openai-context.js +214 -0
  55. package/dist/actors/computer-use/openai-provider.d.ts +13 -10
  56. package/dist/actors/computer-use/openai-provider.js +52 -41
  57. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  58. package/dist/actors/computer-use/openai-requests.js +82 -15
  59. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  60. package/dist/actors/computer-use/openai-wire.js +36 -34
  61. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  62. package/dist/actors/computer-use/provider-error.js +6 -6
  63. package/dist/actors/contract.d.ts +82 -47
  64. package/dist/actors/contract.js +30 -24
  65. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  66. package/dist/actors/local-agent/claude-session.js +13 -12
  67. package/dist/actors/local-agent/cli.d.ts +9 -7
  68. package/dist/actors/local-agent/cli.js +24 -28
  69. package/dist/actors/local-agent/readiness.d.ts +2 -2
  70. package/dist/actors/local-agent/readiness.js +4 -4
  71. package/dist/actors/reasoning-effort.js +8 -8
  72. package/dist/actors/registry.d.ts +12 -12
  73. package/dist/actors/registry.js +21 -20
  74. package/dist/actors/scripted-browser/actor.d.ts +10 -10
  75. package/dist/actors/scripted-browser/actor.js +17 -17
  76. package/dist/actors/scripted-browser/browser-command.js +1 -1
  77. package/dist/actors/scripted-browser/steps.js +1 -1
  78. package/dist/actors/scripted-browser/types.d.ts +1 -1
  79. package/dist/actors/stop-conditions.d.ts +1 -1
  80. package/dist/analysis/automatic-completion.d.ts +7 -7
  81. package/dist/analysis/automatic-completion.js +1 -1
  82. package/dist/analysis/automatic-config.d.ts +6 -6
  83. package/dist/analysis/automatic-config.js +1 -1
  84. package/dist/analysis/codex-config.d.ts +6 -2
  85. package/dist/analysis/codex-config.js +22 -14
  86. package/dist/analysis/execute.d.ts +1 -1
  87. package/dist/analysis/execute.js +1 -1
  88. package/dist/analysis/service.js +5 -5
  89. package/dist/analysis/types.d.ts +6 -0
  90. package/dist/browser-control/client.js +16 -16
  91. package/dist/browser-control/dispatcher.js +4 -4
  92. package/dist/browser-control/protocol.js +14 -14
  93. package/dist/browser-control/recording-transfer.js +4 -4
  94. package/dist/browser-control/transport.js +7 -7
  95. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  96. package/dist/cli/commands/analyze.js +19 -16
  97. package/dist/cli/commands/codex.js +9 -9
  98. package/dist/cli/commands/comms.js +48 -35
  99. package/dist/cli/commands/feedback.js +20 -21
  100. package/dist/cli/commands/migrate.d.ts +4 -0
  101. package/dist/cli/commands/migrate.js +65 -0
  102. package/dist/cli/commands/observe.d.ts +0 -1
  103. package/dist/cli/commands/observe.js +136 -112
  104. package/dist/cli/commands/run-command.d.ts +10 -0
  105. package/dist/cli/commands/run-command.js +85 -0
  106. package/dist/cli/commands/runs.js +136 -139
  107. package/dist/cli/commands/setup.d.ts +2 -2
  108. package/dist/cli/commands/setup.js +27 -24
  109. package/dist/cli/commands/study-format.d.ts +9 -0
  110. package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
  111. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  112. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
  113. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  114. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  115. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  116. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
  117. package/dist/cli/commands/study-route-run.d.ts +19 -0
  118. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  119. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  120. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  121. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  122. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
  123. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  124. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  125. package/dist/cli/commands/study-run.d.ts +9 -0
  126. package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
  127. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
  128. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
  129. package/dist/cli/commands/study.d.ts +3 -0
  130. package/dist/cli/commands/study.js +146 -0
  131. package/dist/cli/commands/tui.d.ts +4 -4
  132. package/dist/cli/commands/tui.js +31 -31
  133. package/dist/cli/commands/watch.js +71 -121
  134. package/dist/cli/deprecations.d.ts +6 -0
  135. package/dist/cli/deprecations.js +18 -0
  136. package/dist/cli/doctor.d.ts +18 -8
  137. package/dist/cli/doctor.js +114 -59
  138. package/dist/cli/first-run-path.d.ts +15 -13
  139. package/dist/cli/first-run-path.js +35 -33
  140. package/dist/cli/io.d.ts +44 -9
  141. package/dist/cli/io.js +98 -23
  142. package/dist/cli/observer-follow.d.ts +3 -3
  143. package/dist/cli/observer-follow.js +6 -7
  144. package/dist/cli/orientation.d.ts +10 -7
  145. package/dist/cli/orientation.js +89 -47
  146. package/dist/cli/product-sentence.d.ts +6 -0
  147. package/dist/cli/product-sentence.js +6 -0
  148. package/dist/cli/program.d.ts +6 -1
  149. package/dist/cli/program.js +111 -43
  150. package/dist/cli/telemetry.d.ts +16 -16
  151. package/dist/cli/telemetry.js +46 -44
  152. package/dist/cli.js +1 -1
  153. package/dist/comms/capture-surface.d.ts +13 -12
  154. package/dist/comms/capture-surface.js +23 -22
  155. package/dist/comms/catch-host.d.ts +7 -7
  156. package/dist/comms/catch-host.js +17 -17
  157. package/dist/comms/connections.d.ts +1 -1
  158. package/dist/comms/connections.js +2 -2
  159. package/dist/comms/email-catch.d.ts +3 -3
  160. package/dist/comms/email-catch.js +8 -8
  161. package/dist/comms/external-evidence.d.ts +5 -5
  162. package/dist/comms/external-evidence.js +5 -4
  163. package/dist/comms/extract.js +2 -2
  164. package/dist/comms/fake-inbox.d.ts +3 -3
  165. package/dist/comms/fake-inbox.js +3 -3
  166. package/dist/comms/receiving-render.d.ts +1 -1
  167. package/dist/comms/receiving-render.js +2 -2
  168. package/dist/comms/receiving-runtime.d.ts +4 -4
  169. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  170. package/dist/comms/sandbox-catch-script.js +6 -6
  171. package/dist/comms/sandbox-catch.d.ts +38 -39
  172. package/dist/comms/sandbox-catch.js +36 -37
  173. package/dist/comms/setup.d.ts +2 -2
  174. package/dist/comms/setup.js +56 -25
  175. package/dist/comms/thread-evidence.d.ts +1 -1
  176. package/dist/comms/thread-evidence.js +6 -6
  177. package/dist/comms/types.d.ts +6 -6
  178. package/dist/comms/types.js +3 -3
  179. package/dist/evidence/frame-signature.d.ts +1 -1
  180. package/dist/evidence/frame-signature.js +4 -4
  181. package/dist/evidence/redaction.d.ts +3 -3
  182. package/dist/evidence/redaction.js +4 -4
  183. package/dist/feedback/draft.js +38 -80
  184. package/dist/feedback/export-bundle.js +1 -1
  185. package/dist/feedback/export.d.ts +5 -1
  186. package/dist/feedback/export.js +10 -10
  187. package/dist/feedback/feedback.d.ts +2 -2
  188. package/dist/feedback/feedback.js +21 -3
  189. package/dist/feedback/proof.d.ts +1 -1
  190. package/dist/feedback/proof.js +2 -2
  191. package/dist/guest/bootstrap.js +6 -6
  192. package/dist/guest/browser-tools.js +8 -8
  193. package/dist/guest/chromium-text.js +19 -19
  194. package/dist/guest/desktop-executor.d.ts +2 -2
  195. package/dist/guest/desktop-executor.js +20 -20
  196. package/dist/guest/desktop-keys.js +4 -4
  197. package/dist/guest/desktop-media.d.ts +2 -2
  198. package/dist/guest/desktop-media.js +16 -16
  199. package/dist/guest/desktop-native.d.ts +1 -1
  200. package/dist/guest/desktop-native.js +10 -10
  201. package/dist/guest/runtime-desktop.js +2 -2
  202. package/dist/guest/runtime-processes.d.ts +2 -2
  203. package/dist/guest/runtime-processes.js +2 -2
  204. package/dist/guest/runtime.js +6 -6
  205. package/dist/index.d.ts +14 -14
  206. package/dist/index.js +8 -8
  207. package/dist/keys/key-resolution.d.ts +5 -5
  208. package/dist/keys/key-resolution.js +23 -23
  209. package/dist/observer/artifact.d.ts +2 -2
  210. package/dist/observer/artifact.js +7 -7
  211. package/dist/observer/data.d.ts +6 -6
  212. package/dist/observer/data.js +5 -4
  213. package/dist/observer/exposure.d.ts +1 -1
  214. package/dist/observer/exposure.js +11 -11
  215. package/dist/observer/http.js +1 -1
  216. package/dist/observer/library.d.ts +3 -1
  217. package/dist/observer/library.js +8 -3
  218. package/dist/observer/listen.js +5 -4
  219. package/dist/observer/render.d.ts +1 -1
  220. package/dist/observer/render.js +17 -6
  221. package/dist/observer/run-routes.d.ts +4 -3
  222. package/dist/observer/run-routes.js +38 -13
  223. package/dist/observer/serve.d.ts +1 -1
  224. package/dist/observer/serve.js +7 -3
  225. package/dist/observer/tunnel.js +1 -1
  226. package/dist/observer-app.html +4 -4
  227. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  228. package/dist/routes/computer-use/bundle-parts.js +18 -17
  229. package/dist/routes/computer-use/bundle.d.ts +2 -2
  230. package/dist/routes/computer-use/bundle.js +10 -9
  231. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
  232. package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
  233. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  234. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
  235. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  236. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
  238. package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
  239. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  240. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
  241. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  242. package/dist/routes/computer-use/external-comms.js +1 -1
  243. package/dist/routes/computer-use/fanout-bundle.js +27 -26
  244. package/dist/routes/computer-use/fanout-records.js +12 -13
  245. package/dist/routes/computer-use/live-flush.d.ts +4 -4
  246. package/dist/routes/computer-use/live-flush.js +6 -6
  247. package/dist/routes/computer-use/live-phase.d.ts +5 -4
  248. package/dist/routes/computer-use/live-phase.js +8 -8
  249. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  250. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  251. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  252. package/dist/routes/computer-use/local-vm.js +3 -3
  253. package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
  254. package/dist/routes/computer-use/participant-desktop.js +5 -5
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +10 -10
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +33 -15
  259. package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
  260. package/dist/routes/computer-use/participant-prompt.js +9 -9
  261. package/dist/routes/computer-use/participant-runs.d.ts +16 -16
  262. package/dist/routes/computer-use/participant-runs.js +26 -25
  263. package/dist/routes/computer-use/plan.d.ts +12 -12
  264. package/dist/routes/computer-use/plan.js +42 -42
  265. package/dist/routes/computer-use/preflight.d.ts +5 -5
  266. package/dist/routes/computer-use/preflight.js +25 -25
  267. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  268. package/dist/routes/computer-use/rerun-selection.js +4 -3
  269. package/dist/routes/computer-use/result.d.ts +4 -4
  270. package/dist/routes/computer-use/result.js +22 -21
  271. package/dist/routes/computer-use/route.d.ts +12 -11
  272. package/dist/routes/computer-use/route.js +31 -30
  273. package/dist/routes/computer-use/self-report.d.ts +7 -7
  274. package/dist/routes/computer-use/self-report.js +32 -32
  275. package/dist/routes/computer-use/setup.d.ts +23 -23
  276. package/dist/routes/computer-use/setup.js +28 -29
  277. package/dist/routes/computer-use/single-bundle.d.ts +11 -11
  278. package/dist/routes/computer-use/single-bundle.js +40 -41
  279. package/dist/routes/computer-use/subject-projection.d.ts +4 -4
  280. package/dist/routes/computer-use/subject-projection.js +6 -6
  281. package/dist/routes/computer-use/types.d.ts +71 -73
  282. package/dist/routes/computer-use/types.js +12 -12
  283. package/dist/routes/preview.d.ts +13 -7
  284. package/dist/routes/preview.js +11 -7
  285. package/dist/routes/scripted/bundle.d.ts +7 -7
  286. package/dist/routes/scripted/bundle.js +20 -18
  287. package/dist/routes/scripted/plan.d.ts +8 -8
  288. package/dist/routes/scripted/plan.js +13 -13
  289. package/dist/routes/scripted/result.d.ts +3 -3
  290. package/dist/routes/scripted/result.js +13 -13
  291. package/dist/routes/scripted/route.d.ts +9 -9
  292. package/dist/routes/scripted/route.js +15 -16
  293. package/dist/routes/scripted/scenario.d.ts +1 -1
  294. package/dist/routes/scripted/scenario.js +5 -5
  295. package/dist/routes/scripted/setup.d.ts +6 -6
  296. package/dist/routes/scripted/setup.js +8 -8
  297. package/dist/routes/scripted/subject.d.ts +5 -5
  298. package/dist/routes/scripted/subject.js +4 -4
  299. package/dist/routes/scripted/surface-records.d.ts +1 -1
  300. package/dist/routes/scripted/surface-records.js +4 -4
  301. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  302. package/dist/routes/scripted/types.d.ts +18 -20
  303. package/dist/routes/scripted/types.js +2 -2
  304. package/dist/routes/shared-world/bundle-records.js +11 -10
  305. package/dist/routes/shared-world/bundle.d.ts +5 -5
  306. package/dist/routes/shared-world/bundle.js +46 -43
  307. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  308. package/dist/routes/shared-world/checkpoints.js +2 -2
  309. package/dist/routes/shared-world/comms.d.ts +14 -14
  310. package/dist/routes/shared-world/comms.js +19 -18
  311. package/dist/routes/shared-world/external-public.d.ts +4 -3
  312. package/dist/routes/shared-world/external-public.js +16 -12
  313. package/dist/routes/shared-world/handoff.d.ts +7 -6
  314. package/dist/routes/shared-world/handoff.js +65 -57
  315. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  316. package/dist/routes/shared-world/lobby-code.js +9 -9
  317. package/dist/routes/shared-world/participant-specs.d.ts +10 -9
  318. package/dist/routes/shared-world/participant-specs.js +38 -31
  319. package/dist/routes/shared-world/plan.d.ts +9 -9
  320. package/dist/routes/shared-world/plan.js +16 -16
  321. package/dist/routes/shared-world/provenance.d.ts +2 -2
  322. package/dist/routes/shared-world/provenance.js +2 -2
  323. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  324. package/dist/routes/shared-world/provisioned.js +18 -17
  325. package/dist/routes/shared-world/result.d.ts +6 -6
  326. package/dist/routes/shared-world/result.js +29 -29
  327. package/dist/routes/shared-world/route.d.ts +11 -11
  328. package/dist/routes/shared-world/route.js +40 -39
  329. package/dist/routes/shared-world/setup.d.ts +16 -16
  330. package/dist/routes/shared-world/setup.js +23 -23
  331. package/dist/routes/shared-world/types.d.ts +55 -53
  332. package/dist/routes/shared-world/types.js +4 -4
  333. package/dist/routes/terminal/adapter.d.ts +5 -5
  334. package/dist/routes/terminal/adapter.js +9 -9
  335. package/dist/routes/terminal/bundle.d.ts +13 -13
  336. package/dist/routes/terminal/bundle.js +28 -27
  337. package/dist/routes/terminal/credentials.d.ts +8 -8
  338. package/dist/routes/terminal/credentials.js +12 -12
  339. package/dist/routes/terminal/dry-run.d.ts +4 -4
  340. package/dist/routes/terminal/dry-run.js +12 -12
  341. package/dist/routes/terminal/encoding.js +2 -2
  342. package/dist/routes/terminal/ledger.d.ts +5 -5
  343. package/dist/routes/terminal/ledger.js +14 -14
  344. package/dist/routes/terminal/lifetime.d.ts +1 -1
  345. package/dist/routes/terminal/lifetime.js +1 -1
  346. package/dist/routes/terminal/live-finish.d.ts +2 -2
  347. package/dist/routes/terminal/live-finish.js +10 -10
  348. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  349. package/dist/routes/terminal/live-sandbox.js +15 -15
  350. package/dist/routes/terminal/participant-text.js +2 -1
  351. package/dist/routes/terminal/persona.d.ts +2 -2
  352. package/dist/routes/terminal/persona.js +3 -3
  353. package/dist/routes/terminal/plan.d.ts +7 -7
  354. package/dist/routes/terminal/plan.js +15 -15
  355. package/dist/routes/terminal/recorder.js +2 -2
  356. package/dist/routes/terminal/result.d.ts +5 -5
  357. package/dist/routes/terminal/result.js +14 -14
  358. package/dist/routes/terminal/route.d.ts +9 -9
  359. package/dist/routes/terminal/route.js +19 -20
  360. package/dist/routes/terminal/sandbox.d.ts +1 -1
  361. package/dist/routes/terminal/sandbox.js +1 -1
  362. package/dist/routes/terminal/session.d.ts +5 -5
  363. package/dist/routes/terminal/session.js +14 -13
  364. package/dist/routes/terminal/token-usage.d.ts +1 -1
  365. package/dist/routes/terminal/token-usage.js +7 -8
  366. package/dist/routes/terminal/trace.d.ts +4 -4
  367. package/dist/routes/terminal/trace.js +2 -2
  368. package/dist/routes/terminal/types.d.ts +48 -50
  369. package/dist/routes/terminal/types.js +5 -5
  370. package/dist/run/bundle-shape.js +3 -3
  371. package/dist/run/bundle.d.ts +49 -49
  372. package/dist/run/bundle.js +3 -2
  373. package/dist/run/cost-summary.js +3 -3
  374. package/dist/run/costs.d.ts +23 -0
  375. package/dist/run/costs.js +79 -44
  376. package/dist/run/detail.d.ts +6 -6
  377. package/dist/run/detail.js +4 -4
  378. package/dist/run/dry-run-inputs.d.ts +1 -1
  379. package/dist/run/dry-run-inputs.js +2 -2
  380. package/dist/run/dry-run.js +20 -20
  381. package/dist/run/judge.d.ts +19 -13
  382. package/dist/run/judge.js +18 -8
  383. package/dist/run/outcomes.d.ts +1 -1
  384. package/dist/run/participant.d.ts +1 -1
  385. package/dist/run/paths.d.ts +1 -1
  386. package/dist/run/paths.js +1 -1
  387. package/dist/run/preflight-receipts.js +1 -1
  388. package/dist/run/pricing.d.ts +11 -6
  389. package/dist/run/pricing.js +22 -15
  390. package/dist/run/projection.d.ts +46 -46
  391. package/dist/run/projection.js +57 -57
  392. package/dist/run/reclaim.d.ts +1 -1
  393. package/dist/run/reclaim.js +3 -3
  394. package/dist/run/results.d.ts +5 -5
  395. package/dist/run/run-cost.d.ts +53 -0
  396. package/dist/run/run-cost.js +105 -0
  397. package/dist/run/run-index-analysis.d.ts +15 -0
  398. package/dist/run/run-index-analysis.js +77 -0
  399. package/dist/run/run-index.d.ts +19 -7
  400. package/dist/run/run-index.js +77 -64
  401. package/dist/run/run-not-found.d.ts +5 -0
  402. package/dist/run/run-not-found.js +15 -0
  403. package/dist/run/run.d.ts +6 -5
  404. package/dist/run/run.js +3 -3
  405. package/dist/run/sandbox-receipts.d.ts +2 -2
  406. package/dist/run/sandbox-receipts.js +3 -3
  407. package/dist/run/shared-world-evidence.d.ts +37 -36
  408. package/dist/run/shared-world-evidence.js +4 -4
  409. package/dist/run/shared-world-shape.d.ts +1 -1
  410. package/dist/run/shared-world-shape.js +7 -7
  411. package/dist/run/stats.d.ts +14 -8
  412. package/dist/run/stats.js +121 -63
  413. package/dist/run/status.d.ts +16 -29
  414. package/dist/run/status.js +10 -29
  415. package/dist/run/stored-runs.js +2 -1
  416. package/dist/run/stream-shape.js +1 -1
  417. package/dist/run/streams.d.ts +7 -7
  418. package/dist/run/study-provenance.d.ts +49 -0
  419. package/dist/run/study-provenance.js +66 -0
  420. package/dist/run/study-result.d.ts +11 -0
  421. package/dist/run/study-result.js +9 -0
  422. package/dist/run/text.d.ts +2 -0
  423. package/dist/run/text.js +4 -0
  424. package/dist/run-study.d.ts +112 -0
  425. package/dist/{run-lab.js → run-study.js} +52 -47
  426. package/dist/{lab → study}/adapter-extension.d.ts +15 -27
  427. package/dist/{lab → study}/adapter-extension.js +10 -45
  428. package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
  429. package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
  430. package/dist/study/composition-rules.d.ts +7 -0
  431. package/dist/{lab → study}/composition-rules.js +53 -53
  432. package/dist/study/config.d.ts +15 -0
  433. package/dist/{lab → study}/config.js +98 -41
  434. package/dist/study/convert.d.ts +33 -0
  435. package/dist/study/convert.js +432 -0
  436. package/dist/{lab → study}/device-presets.d.ts +10 -10
  437. package/dist/{lab → study}/device-presets.js +11 -11
  438. package/dist/study/discover.d.ts +75 -0
  439. package/dist/{lab → study}/discover.js +134 -95
  440. package/dist/{lab → study}/doctor.d.ts +19 -12
  441. package/dist/{lab → study}/doctor.js +58 -20
  442. package/dist/study/field-paths.d.ts +12 -0
  443. package/dist/study/field-paths.js +126 -0
  444. package/dist/study/files.d.ts +26 -0
  445. package/dist/study/files.js +44 -0
  446. package/dist/{lab → study}/init-templates.d.ts +2 -2
  447. package/dist/study/init-templates.js +421 -0
  448. package/dist/{lab → study}/init.d.ts +2 -2
  449. package/dist/{lab → study}/init.js +46 -11
  450. package/dist/study/keys.d.ts +4 -0
  451. package/dist/{lab → study}/keys.js +46 -12
  452. package/dist/study/migrate.d.ts +48 -0
  453. package/dist/study/migrate.js +408 -0
  454. package/dist/study/owned-files.d.ts +38 -0
  455. package/dist/study/owned-files.js +182 -0
  456. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  457. package/dist/{lab → study}/parse/actors.js +14 -14
  458. package/dist/study/parse/comms.d.ts +12 -0
  459. package/dist/{lab → study}/parse/comms.js +5 -5
  460. package/dist/study/parse/execution.d.ts +19 -0
  461. package/dist/{lab → study}/parse/execution.js +13 -13
  462. package/dist/study/parse/study-v3.d.ts +21 -0
  463. package/dist/study/parse/study-v3.js +259 -0
  464. package/dist/study/parse/subject-state.d.ts +30 -0
  465. package/dist/{lab → study}/parse/subject-state.js +19 -19
  466. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  467. package/dist/{lab → study}/parse/subject.js +34 -34
  468. package/dist/{lab → study}/parse/values.d.ts +3 -3
  469. package/dist/{lab → study}/parse/values.js +3 -3
  470. package/dist/{lab → study}/persona-resolve.d.ts +8 -8
  471. package/dist/{lab → study}/persona-resolve.js +6 -6
  472. package/dist/{lab → study}/plan-base.d.ts +7 -7
  473. package/dist/{lab → study}/plan-base.js +1 -1
  474. package/dist/{lab → study}/plan-participants.d.ts +12 -12
  475. package/dist/{lab → study}/plan-participants.js +4 -4
  476. package/dist/{lab → study}/plan-types.d.ts +31 -31
  477. package/dist/{lab → study}/plan-types.js +2 -2
  478. package/dist/study/plan.d.ts +13 -0
  479. package/dist/study/plan.js +101 -0
  480. package/dist/study/preflight-probes.d.ts +3 -0
  481. package/dist/{lab → study}/preflight-probes.js +20 -19
  482. package/dist/study/preflight-result.d.ts +8 -0
  483. package/dist/{lab → study}/preflight-result.js +5 -4
  484. package/dist/study/preflight.d.ts +94 -0
  485. package/dist/{lab → study}/preflight.js +12 -12
  486. package/dist/{lab → study}/requirements.d.ts +3 -3
  487. package/dist/{lab → study}/requirements.js +1 -1
  488. package/dist/study/route-inputs.d.ts +28 -0
  489. package/dist/{lab → study}/route-inputs.js +1 -1
  490. package/dist/{lab → study}/routing.d.ts +39 -33
  491. package/dist/{lab → study}/routing.js +60 -29
  492. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
  493. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
  494. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
  495. package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
  496. package/dist/study/run-study-options.d.ts +28 -0
  497. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
  498. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
  499. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  500. package/dist/{lab → study}/summary.d.ts +16 -15
  501. package/dist/{lab → study}/summary.js +21 -21
  502. package/dist/{lab → study}/tasks.d.ts +18 -18
  503. package/dist/{lab → study}/tasks.js +14 -14
  504. package/dist/{lab → study}/types.d.ts +202 -196
  505. package/dist/{lab → study}/types.js +3 -1
  506. package/dist/{lab → study}/validation.d.ts +27 -27
  507. package/dist/{lab → study}/validation.js +53 -51
  508. package/dist/study/warnings.d.ts +12 -0
  509. package/dist/{lab → study}/warnings.js +62 -34
  510. package/dist/subject/clone.d.ts +7 -7
  511. package/dist/subject/clone.js +2 -2
  512. package/dist/subject/desktop-cli.d.ts +1 -1
  513. package/dist/subject/desktop-cli.js +2 -2
  514. package/dist/subject/local-tree-archive.d.ts +2 -2
  515. package/dist/subject/local-tree-archive.js +4 -4
  516. package/dist/subject/local-tree.d.ts +4 -4
  517. package/dist/subject/node-bootstrap.js +1 -1
  518. package/dist/subject/runtime.js +9 -10
  519. package/dist/subject/serve.d.ts +5 -5
  520. package/dist/subject/serve.js +3 -3
  521. package/dist/subject/state.d.ts +4 -4
  522. package/dist/subject/state.js +1 -1
  523. package/dist/subject/steps.d.ts +6 -6
  524. package/dist/subject/steps.js +5 -5
  525. package/dist/substrates/command-failure.d.ts +3 -3
  526. package/dist/substrates/command-failure.js +3 -3
  527. package/dist/substrates/desktop-session.js +2 -2
  528. package/dist/substrates/detached.d.ts +6 -6
  529. package/dist/substrates/detached.js +7 -7
  530. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  531. package/dist/substrates/e2b/cdp-probe.js +14 -17
  532. package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
  533. package/dist/substrates/e2b/desktop-browser.js +9 -9
  534. package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
  535. package/dist/substrates/e2b/desktop-cdp.js +9 -9
  536. package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
  537. package/dist/substrates/e2b/desktop-executor.js +13 -13
  538. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  539. package/dist/substrates/e2b/desktop-geometry.js +8 -8
  540. package/dist/substrates/e2b/desktop-media.d.ts +4 -4
  541. package/dist/substrates/e2b/desktop-media.js +1 -1
  542. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  543. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  544. package/dist/substrates/e2b/lifetime.js +1 -1
  545. package/dist/substrates/e2b/sandbox.d.ts +4 -4
  546. package/dist/substrates/e2b/sandbox.js +2 -2
  547. package/dist/substrates/e2b/sdk.d.ts +12 -12
  548. package/dist/substrates/e2b/sdk.js +7 -7
  549. package/dist/substrates/local/runtime-config.d.ts +4 -4
  550. package/dist/substrates/local/runtime-config.js +4 -4
  551. package/dist/tui/actions.d.ts +1 -1
  552. package/dist/tui/actions.js +13 -13
  553. package/dist/tui/contract.d.ts +23 -23
  554. package/dist/tui/contract.js +11 -11
  555. package/dist/tui/launch.d.ts +7 -7
  556. package/dist/tui/launch.js +36 -31
  557. package/dist/tui/project.js +5 -5
  558. package/dist/tui-app.js +139 -139
  559. package/dist/verify/actor.d.ts +8 -8
  560. package/dist/verify/actor.js +36 -36
  561. package/dist/verify/artifacts.d.ts +2 -2
  562. package/dist/verify/artifacts.js +3 -3
  563. package/dist/verify/context-growth.d.ts +9 -0
  564. package/dist/verify/context-growth.js +62 -0
  565. package/dist/verify/costs.d.ts +6 -6
  566. package/dist/verify/costs.js +8 -8
  567. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  568. package/dist/verify/shared-world-concurrent.js +79 -76
  569. package/dist/verify/shared-world.d.ts +2 -2
  570. package/dist/verify/shared-world.js +16 -16
  571. package/dist/verify/subject.d.ts +5 -5
  572. package/dist/verify/subject.js +19 -19
  573. package/dist/verify/verify.js +94 -44
  574. package/docs/README.md +25 -32
  575. package/docs/architecture/actor-contract.md +60 -91
  576. package/docs/architecture/browser-control.md +1 -1
  577. package/docs/architecture/desktop-sessions.md +7 -7
  578. package/docs/architecture/external-public-shared-world.md +68 -65
  579. package/docs/architecture/github-feedback-loop.md +2 -5
  580. package/docs/architecture/guest-desktop.md +2 -2
  581. package/docs/architecture/observer.md +34 -34
  582. package/docs/architecture/restricted-codex-analysis.md +34 -28
  583. package/docs/architecture/serve.md +34 -37
  584. package/docs/architecture/state-driven-executor.md +55 -58
  585. package/docs/architecture/task-protocol-support.md +6 -6
  586. package/docs/architecture/terminal-product-route.md +70 -110
  587. package/docs/contracts/README.md +24 -0
  588. package/docs/contracts/adapter-admission.md +3 -3
  589. package/docs/contracts/adapter-fixtures.md +4 -7
  590. package/docs/contracts/core.md +1 -3
  591. package/docs/contracts/errors.md +62 -0
  592. package/docs/contracts/feedback.md +8 -9
  593. package/docs/contracts/policy.md +7 -12
  594. package/docs/contracts/run-bundle.md +42 -44
  595. package/docs/contracts/schemas.md +446 -368
  596. package/docs/contracts/study-analysis.md +7 -4
  597. package/docs/contracts/study-costs.md +28 -9
  598. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  599. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  600. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  601. package/docs/principles/actor-fidelity.md +4 -4
  602. package/docs/principles/engineering.md +3 -3
  603. package/docs/principles/invariants-and-defaults.md +38 -38
  604. package/docs/principles/self-driving-harness.md +1 -5
  605. package/docs/principles/three-roles.md +1 -1
  606. package/docs/product/automatic-analysis.md +7 -7
  607. package/examples/README.md +1 -1
  608. package/examples/participant/README.md +5 -5
  609. package/examples/participant/run.mjs +11 -10
  610. package/examples/scorer/README.md +3 -3
  611. package/examples/scorer/run.mjs +11 -12
  612. package/examples/scorer/scorer.mjs +3 -3
  613. package/package.json +16 -17
  614. package/skills/humanish/SKILL.md +64 -60
  615. package/skills/humanish/agents/openai.yaml +1 -1
  616. package/AGENTS.md +0 -99
  617. package/CONTRIBUTING.md +0 -148
  618. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  619. package/dist/actors/codex/qualified-versions.js +0 -132
  620. package/dist/cli/commands/lab-format.d.ts +0 -8
  621. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  622. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  623. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  624. package/dist/cli/commands/lab-run.d.ts +0 -9
  625. package/dist/cli/commands/lab.d.ts +0 -3
  626. package/dist/cli/commands/lab.js +0 -199
  627. package/dist/cli/renamed-options.d.ts +0 -11
  628. package/dist/cli/renamed-options.js +0 -18
  629. package/dist/lab/composition-rules.d.ts +0 -7
  630. package/dist/lab/config.d.ts +0 -7
  631. package/dist/lab/discover.d.ts +0 -65
  632. package/dist/lab/init-templates.js +0 -416
  633. package/dist/lab/keys.d.ts +0 -2
  634. package/dist/lab/parse/comms.d.ts +0 -12
  635. package/dist/lab/parse/execution.d.ts +0 -19
  636. package/dist/lab/parse/subject-state.d.ts +0 -30
  637. package/dist/lab/plan.d.ts +0 -19
  638. package/dist/lab/plan.js +0 -132
  639. package/dist/lab/preflight-probes.d.ts +0 -3
  640. package/dist/lab/preflight-result.d.ts +0 -7
  641. package/dist/lab/preflight.d.ts +0 -92
  642. package/dist/lab/route-inputs.d.ts +0 -28
  643. package/dist/lab/run-lab-options.d.ts +0 -28
  644. package/dist/lab/warnings.d.ts +0 -2
  645. package/dist/observer/static.d.ts +0 -39
  646. package/dist/observer/static.js +0 -369
  647. package/dist/run-lab.d.ts +0 -112
  648. package/docs/architecture/comms-inbox.md +0 -122
  649. package/docs/architecture/desktop-recording.md +0 -80
  650. package/docs/architecture/local-browser-runtime.md +0 -178
  651. package/docs/architecture/observer-review.md +0 -144
  652. package/docs/architecture/participant-media.md +0 -90
  653. package/docs/architecture/project-layout.md +0 -62
  654. package/docs/architecture/real-email-receiving.md +0 -136
  655. package/docs/assets/humanish-drawdb-hero.png +0 -0
  656. package/docs/assets/humanish-observer-hero.png +0 -0
  657. package/docs/goals/current.md +0 -207
  658. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  659. package/docs/product/open-source-install-experience.md +0 -240
  660. package/docs/ramp/README.md +0 -295
  661. package/docs/release/open-source-readiness.md +0 -222
  662. package/docs/release/public-readiness-standard.md +0 -210
  663. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  664. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  665. /package/dist/{lab → study}/init-paths.js +0 -0
  666. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  667. /package/dist/{lab → study}/init-plan.js +0 -0
  668. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  669. /package/dist/{lab → study}/participant-assignment.js +0 -0
  670. /package/dist/{lab → study}/persona.d.ts +0 -0
  671. /package/dist/{lab → study}/persona.js +0 -0
@@ -1,47 +1,49 @@
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
3
- // hosted E2B desktop. This is the path that makes `actors[].type` load-bearing — the
4
- // descriptor returned by the registry runs the session; the lab provisions the desktop and
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
+ // hosted E2B desktop. On this path `actors[].type` selects the actor: the
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:
8
8
  // - The desktop is created via the shared loader in src/substrates/e2b/sdk.ts with
9
9
  // kill-on-timeout lifecycle, so a dead host process can never orphan a sandbox past its
10
10
  // server-side deadline.
11
- // - Env placement follows the doctrine (docs/principles/invariants-and-defaults.md): the
12
- // ACTOR's key never enters the sandbox (the model drives from outside via the provider API);
13
- // the SUBJECT's declared env NAMES are provisioned in on the clone route — values come from
11
+ // - Env placement follows the placement rule (docs/principles/invariants-and-defaults.md): the
12
+ // actor's key never enters the sandbox (the model drives from outside via the provider API);
13
+ // the subject's declared env names are provisioned in on the clone route; values come from
14
14
  // the caller's environment and are never logged or persisted.
15
15
  // - The live stream URL is runtime-only (carries an auth key) and is never persisted into run
16
- // artifacts — only its presence is recorded.
16
+ // artifacts; only its presence is recorded.
17
17
  // - Evidence redaction is mode-aware (docs/principles/invariants-and-defaults.md, the
18
- // capture-vs-publish rule): screenshots persist RAW (full fidelity) by default into gitignored
18
+ // capture-vs-publish rule): screenshots persist raw (full fidelity) by default into gitignored
19
19
  // .humanish/; `policies.redactScreenshots: true` opts into blur-at-capture for a share-as-is
20
- // bundle. Length-only typed text and text redaction of reasoning/messages are UNCONDITIONAL;
21
- // harness errors are redacted at THIS boundary; the bundle's `stream.actor` carries the
20
+ // bundle. Length-only typed text and text redaction of reasoning/messages are unconditional;
21
+ // harness errors are redacted at this boundary; the bundle's `stream.actor` carries the
22
22
  // conformant humanish.actor-trace.v1 projection, whose `redaction.screenshots` records the
23
- // run's actual mode ("raw" | "blurred" | "n/a") — every label downstream derives from it.
23
+ // run's actual mode ("raw" | "blurred" | "n/a"), and every label downstream derives from it.
24
24
  import { withTransientCommsSecrets } from "../../run/transient-comms-secrets.js";
25
25
  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";
35
- import { CUA_ACTOR_LAB_SCHEMA, } from "./types.js";
33
+ import { runStudyParticipants } from "./live-phase.js";
34
+ import { admitCuaRun, refuseCuaStudy, startCuaRun } from "./setup.js";
35
+ import {} from "./types.js";
36
+ import { studyResultIdentity } from "../../run/study-result.js";
36
37
  /**
37
- * The library entry for a computer-use lab. 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
38
40
  * the plan with runComputerUsePlan, whose run scope and withTransientCommsSecrets wrapper cover the
39
41
  * run and its analysis.
40
42
  */
41
- export async function runCuaActorLab(options) {
43
+ export async function runCuaActorStudy(options) {
42
44
  const { config, dryRun, ...input } = options;
43
- // planComputerUseLab makes every configuration refusal, in the order this route always has.
44
- const planned = planComputerUseLab(config, {
45
+ // planComputerUseStudy makes every configuration refusal, in the order this route always has.
46
+ const planned = planComputerUseStudy(config, {
45
47
  dryRun,
46
48
  hasRunSession: input.deps?.runSession !== undefined,
47
49
  driving: callerDrivingOf(input),
@@ -50,21 +52,20 @@ export async function runCuaActorLab(options) {
50
52
  });
51
53
  if (planned.ok)
52
54
  return runComputerUsePlan(planned.plan, input, config);
53
- return computerUseLabRefusal(options, planned.refusal);
55
+ return computerUseStudyRefusal(options, planned.refusal);
54
56
  }
55
57
  /**
56
- * 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
57
59
  * envelope and no analysis record; the others come after the cwd checks, and the participant cap after
58
60
  * the personas are read.
59
61
  */
60
- export async function computerUseLabRefusal(options, refusal) {
62
+ export async function computerUseStudyRefusal(options, refusal) {
61
63
  const { config, dryRun } = options;
62
64
  if (refusal.stage === "before-scope")
63
65
  return {
64
- schema: CUA_ACTOR_LAB_SCHEMA,
66
+ ...studyResultIdentity("computer-use", config.id),
65
67
  ok: false,
66
68
  cwd: path.resolve(options.cwd),
67
- labId: config.id,
68
69
  actor: config.actors[0]?.type ?? "",
69
70
  dryRun,
70
71
  runId: options.runId ?? "not-created",
@@ -75,10 +76,10 @@ export async function computerUseLabRefusal(options, refusal) {
75
76
  };
76
77
  // The other refusals come after the cwd checks, and the participant cap after the personas are read.
77
78
  const analysis = resolveAutomaticAnalysis(config.review?.analysis);
78
- 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" });
79
80
  }
80
81
  /**
81
- * 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
82
83
  * participants, the preflight plan, the keys, the local agent, subject env and caps, and the
83
84
  * local-tree archive) before any run scope opens, so the CLI can present their refusal before it
84
85
  * loads a declared scorer, and returns the run that continues from them with that scorer.
@@ -140,7 +141,7 @@ async function runPlanInScope(plan, input, admitted, scope) {
140
141
  const prepared = await startCuaRun(plan, input, admitted, scope);
141
142
  if (!prepared.ok)
142
143
  return prepared.result;
143
- const ran = await runLabParticipants(prepared.setup, prepared.participants);
144
+ const ran = await runStudyParticipants(prepared.setup, prepared.participants);
144
145
  if (!ran.ok)
145
146
  return ran.result;
146
147
  return finishCuaRun(prepared.setup, prepared.finish, ran);
@@ -1,21 +1,21 @@
1
1
  import type { CuaLoopResult } from "../../actors/computer-use/loop.js";
2
2
  import { type SessionEnding } from "../../run/judge.js";
3
3
  /**
4
- * A goal_satisfied participant counts as a self-reported blocker ONLY when its final narrative contradicts
5
- * the goal AND the run's own stop predicate did NOT fire. A matched stopWhen is independent,
6
- * structured completion evidence, so it overrides a text scan of the free-form narrative — which can
7
- * otherwise trip on the subject app's OWN quoted copy (e.g. a relayed "cannot be undone" banner).
8
- * Resolved-arc segments never block the verdict (#453). Returns the offending reason, or undefined
4
+ * A goal_satisfied participant counts as a self-reported blocker only when its final narrative contradicts
5
+ * the goal and the run's own stop predicate did not fire. A matched stopWhen is independent,
6
+ * structured completion evidence, so it overrides a text scan of the free-form narrative, which can
7
+ * otherwise trip on the subject app's own quoted copy (e.g. a relayed "cannot be undone" banner).
8
+ * Resolved-arc segments never block the verdict. Returns the offending reason, or undefined
9
9
  * when the participant is a clean pass. Exported for testing.
10
10
  */
11
11
  export declare function resolveSelfReportedBlocker(session: CuaLoopResult | undefined): string | undefined;
12
12
  /** A session's ending, reduced to what the judge's engagement and blocker rules read. */
13
13
  export declare function sessionEnding(session: CuaLoopResult): SessionEnding;
14
14
  /**
15
- * Friction is independent of how a completed session ended (#657). Read the participant's
15
+ * Friction is independent of how a completed session ended. Read the participant's
16
16
  * redacted messages, including earlier reports, rather than the harness-owned reason that
17
17
  * stopWhen/dwell writes. Reasoning, observations, and notices are not participant reports.
18
- * Resolved arcs still count (#453); quoted copy and negated reports still do not. This read
18
+ * Resolved arcs still count; quoted copy and negated reports still do not. This read
19
19
  * never changes the verdict. Exported for testing.
20
20
  */
21
21
  export declare function resolveSelfReportedFriction(session: CuaLoopResult | undefined): string | undefined;
@@ -1,12 +1,12 @@
1
1
  import { selfReportedBlocker } from "../../run/judge.js";
2
- // "can't" followed by a PERCEPTION verb describes what the screen showed, not an inability to
2
+ // "can't" followed by a perception verb describes what the screen showed, not an inability to
3
3
  // proceed: "the canvas truncates it so you can't even read the whole thing", "I can't tell from
4
4
  // the screen whether the rename is persisted", "so I could not read its full description". Five
5
5
  // of five completed live runs on 2026-09-01 (two on drawDB, three on the planted benchmark app)
6
6
  // were refused as "not a credible pass" on exactly these sentences, every one a defect report
7
- // written AFTER the participant reached the goal. The more precisely a participant describes a
8
- // display defect, the more likely the scan was to refuse the run — the incentive inversion #453
9
- // fixed for resolved arcs, back in a new shape. "could not complete", "could not connect",
7
+ // written after the participant reached the goal. The more precisely a participant describes a
8
+ // display defect, the more likely the scan was to refuse the run: the incentive inversion the
9
+ // resolved-arc rule fixed, back in a new shape. "could not complete", "could not connect",
10
10
  // "unable to get focus" still count: those name an inability to act.
11
11
  const PERCEPTION_AFTER_MODAL = /\b(can'?t|cannot|could ?not|couldn'?t|unable to|wasn'?t able to)\s+(even\s+|quite\s+|really\s+|fully\s+)?(read|see|tell|view|make out|verify|confirm|be sure|be certain|judge|know)\b/g;
12
12
  function hasBlockerLanguage(text) {
@@ -15,17 +15,17 @@ function hasBlockerLanguage(text) {
15
15
  /\berror[:.]/.test(text) ||
16
16
  /what would you like me to do|please tell me|need (the )?(task|credentials|instructions)/.test(text));
17
17
  }
18
- /** The friction scan (inclusive): does the narrative report ANY blocker-shaped language,
18
+ /** The friction scan (inclusive): does the narrative report any blocker-shaped language,
19
19
  * resolved or not? Feeds the participants `reportedFriction` tally and feedback candidates. */
20
- // Report-shaped language: what a participant writes when it finished AND has something to say.
20
+ // Report-shaped language: what a participant writes when it finished and has something to say.
21
21
  // Every one of the day's eleven drawDB reports (2026-09-01) opened a section "What confused me"
22
22
  // or "Accessibility defects:"; none contained a blocker word, so none became a feedback candidate
23
23
  // and a participant that had just replicated a keyboard-accessibility defect three times drafted "Live
24
- // study completed without a participant-reported finding". Friction is the INCLUSIVE scan; a
24
+ // study completed without a participant-reported finding". Friction is the inclusive scan; a
25
25
  // false positive here adds a candidate a person then reads, which is the cheap direction.
26
26
  const REPORTED_DEFECT_LANGUAGE = /\b(defects?|bugs?|accessibilit(y|ies)|inaccessible|not (keyboard|screen.?reader)[- ]?accessible|confus(ed|ing)|hesitat(ed|ion)|unexpected(ly)?|unclear|hard to (find|tell|see|read|reach)|no (visible )?focus|overlap(ped|ping|s)?|truncat(ed|es|ion)|cut off|did nothing|nothing happened|no effect)\b/;
27
- // The friction scan's own negations (#614). "Nothing was confusing", "no defects", "not unclear"
28
- // are what a participant writes when it has NOTHING to report, and until 2026-09-03 each of them
27
+ // The friction scan's own negations. "Nothing was confusing", "no defects", "not unclear"
28
+ // are what a participant writes when it has nothing to report, and until 2026-09-03 each of them
29
29
  // counted as reported friction and became a feedback candidate whose "actual" was a sentence
30
30
  // reporting no problem. Only the report-shaped adjectives are negatable here: "no visible focus",
31
31
  // "not keyboard-accessible" and "did nothing" are defects and stay.
@@ -80,25 +80,25 @@ function interimMessageReportsFriction(message) {
80
80
  });
81
81
  }
82
82
  /** The verdict scan (strict): like the friction scan, but resolved-arc segments are stripped
83
- * first — failure narration the participant itself reports as overcome is friction on the
84
- * road, not a blocker at the destination (#453). */
83
+ * first: failure narration the participant itself reports as overcome counts as friction and
84
+ * never as a blocker. */
85
85
  function completionReasonBlocksVerdict(reason) {
86
- // Perception phrases are stripped for the VERDICT only: "I could not read the full description"
86
+ // Perception phrases are stripped for the verdict only: "I could not read the full description"
87
87
  // is friction worth a tally count and a feedback candidate (the friction scan above keeps it),
88
88
  // and it is not a reason to refuse the pass.
89
89
  return hasBlockerLanguage(stripResolvedArcSegments(stripQuotedSpans(stripNegatedNonBlockerPhrases(reason.toLowerCase()))).replace(PERCEPTION_AFTER_MODAL, ""));
90
90
  }
91
91
  // A failure segment counts as a resolved arc when the recovery is self-reported either in the
92
- // SAME segment ("the import failed but then went through") or — the common report shape — in the
93
- // immediately FOLLOWING segment as a retry/alternative that succeeded ("my first import failed
92
+ // same segment ("the import failed but then went through") or, in the common report shape, in the
93
+ // immediately following segment as a retry/alternative that succeeded ("my first import failed
94
94
  // with a parser error. A simpler SQL import succeeded."). The lookahead demands the retry flavor
95
95
  // on purpose: unrelated praise ("Separately, the search box worked") must never launder an
96
96
  // unresolved failure. "Login failed so I gave up" has no recovery anywhere and stays a blocker.
97
- // (#453 — the run-1 false negative: a defect report after demonstrated success failed the participant,
97
+ // (Without this, a defect report after demonstrated success failed the participant:
98
98
  // an incentive inversion against exactly the participant behavior a study wants most.)
99
99
  const RESOLUTION_TERMS = /\b(succeed(?:ed|s)?|success(?:ful|fully)?|worked|works around|then worked|now works?|resolved|fixed|recovered|got it working|went through)\b/;
100
100
  const RETRY_RESOLUTION = /\b(simpler|simplified|retry(?:ing)?|retried|second (?:attempt|try)|another (?:attempt|try|approach)|different (?:approach|way|route)|instead|then|eventually|after that)\b[^.!?\n]{0,80}\b(succeed(?:ed|s)?|success(?:ful|fully)?|worked|went through|completed|passed)\b/;
101
- /** Drop sentence/bullet segments whose failure language is part of a self-reported RESOLVED arc. */
101
+ /** Drop sentence/bullet segments whose failure language is part of a self-reported resolved arc. */
102
102
  function stripResolvedArcSegments(text) {
103
103
  const segments = text.split(/(?<=[.!?])\s+|\n+/);
104
104
  return segments
@@ -112,20 +112,20 @@ function stripResolvedArcSegments(text) {
112
112
  })
113
113
  .join(" ");
114
114
  }
115
- // Negations that DESCRIBE a defect rather than deny one. Kept out of every clause drop below.
115
+ // Negations that describe a defect rather than deny one. Kept out of every clause drop below.
116
116
  const DEFECT_SHAPED_NEGATION = /\bno\s+(?:visible\s+)?focus\b|\bno\s+(?:keyboard|screen.?reader)[- ]?(?:access|path|route|way|alternative|equivalent)|\bnot\s+(?:keyboard|screen.?reader)[- ]?accessible\b|\bno\s+(?:effect|feedback|response)\b|\b(?:did|does)\s+nothing\b|\bnothing\s+happened\b/;
117
117
  function stripNegatedNonBlockerPhrases(text) {
118
118
  return (text
119
- // FIRST, before the narrower rules eat the "no blockers" and leave "encountered ... error"
119
+ // First, before the narrower rules eat the "no blockers" and leave "encountered ... error"
120
120
  // behind: "I encountered no blockers or unclear error output." refused a clean passing run on
121
121
  // 2026-09-01. A verb of encounter followed by "no" negates the whole clause, so drop the clause.
122
- // ... unless the clause names a DEFECT: "the delete control had no visible focus" is a
123
- // finding, and the verb it happens to use must not decide whether it counts (#622).
122
+ // ... unless the clause names a defect: "the delete control had no visible focus" is a
123
+ // finding, and the verb it happens to use must not decide whether it counts.
124
124
  .replace(/\b(?:encountered|hit|saw|found|met|had|got|ran into)\s+no\s+[^.!?\n]*/g, (clause) => (DEFECT_SHAPED_NEGATION.test(clause) ? clause : " "))
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.
@@ -134,9 +134,9 @@ function stripNegatedNonBlockerPhrases(text) {
134
134
  }
135
135
  /**
136
136
  * Remove double-quoted spans and markdown blockquote lines before the blocker scan, so a persona
137
- * that faithfully QUOTES the subject app's own copy (e.g. a banner reading "cannot be undone") is
138
- * not misread as the actor reporting its OWN blocker. Only double quotes (straight and smart) and
139
- * `>` blockquotes are stripped — never single quotes, which would mangle contractions like `can't`.
137
+ * that faithfully quotes the subject app's own copy (e.g. a banner reading "cannot be undone") is
138
+ * not misread as the actor reporting its own blocker. Only double quotes (straight and smart) and
139
+ * `>` blockquotes are stripped, never single quotes, which would mangle contractions like `can't`.
140
140
  */
141
141
  function stripQuotedSpans(text) {
142
142
  return text
@@ -148,15 +148,15 @@ function traceHasStopWhenMatch(session) {
148
148
  return session.trace.items.some((item) => item.kind === "notice" &&
149
149
  item.status === "matched" &&
150
150
  // A dwell window that ended the session (then: stop) is the same class of harness-owned,
151
- // structured completion as a matched stopWhen (#510).
151
+ // structured completion as a matched stopWhen.
152
152
  (item.title.startsWith("stopWhen matched") || item.title === "dwell window complete"));
153
153
  }
154
154
  /**
155
- * A goal_satisfied participant counts as a self-reported blocker ONLY when its final narrative contradicts
156
- * the goal AND the run's own stop predicate did NOT fire. A matched stopWhen is independent,
157
- * structured completion evidence, so it overrides a text scan of the free-form narrative — which can
158
- * otherwise trip on the subject app's OWN quoted copy (e.g. a relayed "cannot be undone" banner).
159
- * Resolved-arc segments never block the verdict (#453). Returns the offending reason, or undefined
155
+ * A goal_satisfied participant counts as a self-reported blocker only when its final narrative contradicts
156
+ * the goal and the run's own stop predicate did not fire. A matched stopWhen is independent,
157
+ * structured completion evidence, so it overrides a text scan of the free-form narrative, which can
158
+ * otherwise trip on the subject app's own quoted copy (e.g. a relayed "cannot be undone" banner).
159
+ * Resolved-arc segments never block the verdict. Returns the offending reason, or undefined
160
160
  * when the participant is a clean pass. Exported for testing.
161
161
  */
162
162
  export function resolveSelfReportedBlocker(session) {
@@ -187,10 +187,10 @@ export function sessionEnding(session) {
187
187
  };
188
188
  }
189
189
  /**
190
- * Friction is independent of how a completed session ended (#657). Read the participant's
190
+ * Friction is independent of how a completed session ended. Read the participant's
191
191
  * redacted messages, including earlier reports, rather than the harness-owned reason that
192
192
  * stopWhen/dwell writes. Reasoning, observations, and notices are not participant reports.
193
- * Resolved arcs still count (#453); quoted copy and negated reports still do not. This read
193
+ * Resolved arcs still count; quoted copy and negated reports still do not. This read
194
194
  * never changes the verdict. Exported for testing.
195
195
  */
196
196
  export function resolveSelfReportedFriction(session) {
@@ -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
- runSession: (options: import("../../actors/computer-use/actor.js").CuaActorSessionOptions) => Promise<import("../../index.js").CuaLoopResult>;
110
- externalCommsConfig: LabCommsExternal | undefined;
111
- externalCommsEmail: LabCommsEmail | undefined;
109
+ runSession: (options: import("../../actors/computer-use/actor.js").CuaActorSessionOptions) => Promise<import("../../index.js").ComputerUseLoopResult>;
110
+ externalCommsConfig: StudyCommsExternal | undefined;
111
+ externalCommsEmail: StudyCommsEmail | undefined;
112
112
  participantRuns: DesktopParticipantRun[];
113
113
  participantPlan: CuaParticipantPlan;
114
114
  rerunLineage: RunRerunLineage | undefined;
@@ -17,13 +17,14 @@ 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 { participantOf, 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
- import { CUA_ACTOR_LAB_SCHEMA, participantSubjectEnv, } from "./types.js";
26
- import { labPersonaIds } from "../../lab/persona-resolve.js";
25
+ import { participantSubjectEnv, } from "./types.js";
26
+ import { studyPersonaIds } from "../../study/persona-resolve.js";
27
+ import { studyResultIdentity } from "../../run/study-result.js";
27
28
  /** The physical project, bound before any caller hook runs. */
28
29
  async function bindProject(cwd) {
29
30
  // Capture the physical project before reading or invoking any caller hook. A supported
@@ -36,17 +37,16 @@ async function bindProject(cwd) {
36
37
  * The envelope of a refusal the plan left for after the cwd checks. The participant cap and
37
38
  * in-process fan-out refusals come after the committed personas are read, so a persona-file error still wins.
38
39
  */
39
- export async function refuseCuaLab(options, refusal) {
40
+ export async function refuseCuaStudy(options, refusal) {
40
41
  const { config, dryRun } = options;
41
42
  const projectRoot = await bindProject(options.cwd);
42
43
  // The committed personas are read before the refusal returns, so a persona-file error wins.
43
44
  if (refusal.stage === "after-personas")
44
- await compileParticipantPersonas(projectRoot, labPersonaIds(config));
45
+ await compileParticipantPersonas(projectRoot, studyPersonaIds(config));
45
46
  return {
46
- schema: CUA_ACTOR_LAB_SCHEMA,
47
+ ...studyResultIdentity("computer-use", config.id),
47
48
  ok: false,
48
49
  cwd: projectRoot.physicalPath,
49
- labId: config.id,
50
50
  actor: refusal.actor ?? config.actors[0]?.type ?? "",
51
51
  appUrl: declaredAppUrl(config),
52
52
  dryRun,
@@ -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,10 +74,9 @@ 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
- schema: CUA_ACTOR_LAB_SCHEMA,
77
+ ...studyResultIdentity("computer-use", plan.studyId),
78
78
  ok: false,
79
79
  cwd,
80
- labId: plan.labId,
81
80
  actor: actorLabel ?? plan.actor,
82
81
  appUrl,
83
82
  dryRun,
@@ -90,13 +89,13 @@ export async function admitCuaRun(plan, input, config) {
90
89
  ok: false,
91
90
  result: fail(...args),
92
91
  });
93
- // runLab's local VM study supplies a local-target app-url lab's desktop; a direct route call or
94
- // 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
95
94
  // did: a library config the parser never saw can plan to an app-url subject from another source.
96
95
  if (config.subject.source === "app-url" &&
97
96
  config.execution?.target === "local" &&
98
97
  input.localVm === undefined)
99
- return refuse("HUMANISH_CUA_LAB_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.");
100
99
  const descriptor = cuaDescriptorOf(plan.actor);
101
100
  const baseRunSession = seams.runSession ?? descriptor.runSession;
102
101
  // A local VM study's sessions abort on its signal.
@@ -104,11 +103,11 @@ export async function admitCuaRun(plan, input, config) {
104
103
  const runSession = localVmSignal === undefined
105
104
  ? baseRunSession
106
105
  : (options) => baseRunSession({ ...options, signal: localVmSignal });
107
- // Adopter-hosted comms plane on the app-url route (#380): humanish provisions no subject here,
108
- // so it cannot host a catch — the OPERATOR runs one, and humanish still does every other part
106
+ // Adopter-hosted comms plane on the app-url route: humanish provisions no subject here,
107
+ // so it cannot host a catch. The operator runs one, and humanish still does every other part
109
108
  // of the funnel: tells each persona its address and inbox URL, drains the catch over HTTP after
110
109
  // the participants, and writes the same digest-only evidence. Declaring `external` previously did
111
- // nothing on this route (and, per #387, on every other) while its docs said otherwise.
110
+ // nothing on this route (or on any other) while its docs said otherwise.
112
111
  const comms = plan.residual.comms;
113
112
  const externalCommsConfig = subject.kind !== "clone" && subject.kind !== "local-tree" && !inProcess
114
113
  ? comms?.email?.external
@@ -120,11 +119,11 @@ export async function admitCuaRun(plan, input, config) {
120
119
  }
121
120
  const { participantRuns, participantPlan, rerunLineage } = participants;
122
121
  const participantCount = participantRuns.length;
123
- // Pre-flight plan: BEFORE any sandbox or provider call (dry-run AND live). onEvent gets it for
122
+ // Pre-flight plan: before any sandbox or provider call (dry-run and live). onEvent gets it for
124
123
  // every N; the stderr table prints for fan-out (N>1) so single-participant runs stay as quiet as they
125
124
  // always were.
126
125
  if (participantCount > 1) {
127
- emitPreflightPlan(participantPlan, plan.labId);
126
+ emitPreflightPlan(participantPlan, plan.studyId);
128
127
  }
129
128
  input.emit?.(planEvent(participantPlan));
130
129
  await assertPreparedSelectedOutputDirectory(projectRoot);
@@ -141,7 +140,7 @@ export async function admitCuaRun(plan, input, config) {
141
140
  sanitizeParticipantRuns(participantRuns, scrubKnownValues);
142
141
  const redactRepoLabel = plan.residual.policies?.redactRepos ?? subjectEnvNames.includes("GITHUB_TOKEN");
143
142
  const publicRepo = subject.kind === "clone" ? (redactRepoLabel ? "repo-01" : subject.repo) : undefined;
144
- // Key-gating is route-aware: the in-process route uses the caller's OWN model + executor, and
143
+ // Key-gating is route-aware: the in-process route uses the caller's own model + executor, and
145
144
  // the local-agent route uses a CLI the operator has already signed in to.
146
145
  if (!dryRun && !inProcess) {
147
146
  const rejection = await liveCuaRejection({
@@ -154,8 +153,8 @@ export async function admitCuaRun(plan, input, config) {
154
153
  if (rejection)
155
154
  return refuse(rejection.code, rejection.message, descriptor.id);
156
155
  }
157
- // Pack the working tree ONCE per run, on the host, BEFORE any sandbox or provider call: every
158
- // fan-out participant below uploads this SAME archive, so one archiveSha256 describes every
156
+ // Pack the working tree once per run, on the host, before any sandbox or provider call: every
157
+ // fan-out participant below uploads this same archive, so one archiveSha256 describes every
159
158
  // participant's digest. Dry-run packs nothing (no fs side effects; the contract bundle carries no
160
159
  // archiveSha256). A packing failure fails the run closed here, before any sandbox is
161
160
  // created and before the run directory exists.
@@ -168,7 +167,7 @@ export async function admitCuaRun(plan, input, config) {
168
167
  localTreeArchiveBuffer = packed.buffer;
169
168
  }
170
169
  catch (error) {
171
- return refuse("HUMANISH_CUA_LAB_SUBJECT_INVALID", `local-tree packing failed: ${redactText(scrubKnownValues(toErrorMessage(error)))}`, descriptor.id);
170
+ return refuse("HUMANISH_COMPUTER_USE_SUBJECT_INVALID", `local-tree packing failed: ${redactText(scrubKnownValues(toErrorMessage(error)))}`, descriptor.id);
172
171
  }
173
172
  }
174
173
  return {
@@ -206,14 +205,14 @@ export async function startCuaRun(plan, input, admitted, scope) {
206
205
  const { dryRun, cwd, seams, descriptor, participantRuns, participantPlan, publicRepo } = admitted;
207
206
  const { appUrl } = admitted;
208
207
  // The run's status record exists from here on, so anything watching the runs directory can
209
- // 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
210
209
  // with no outcome when the scope closes; a crash leaves it stale, which reads as interrupted.
211
210
  const started = await scope.startRun({
212
211
  cwd,
213
212
  runId: input.runId,
214
213
  mintRunId: makeCuaRunId,
215
214
  mode: dryRun ? "dry-run" : "live",
216
- lab: plan.lab,
215
+ study: plan.study,
217
216
  renderReview: renderCuaReviewMarkdown,
218
217
  observer: { open: input.open === true, render: seams.renderObserver },
219
218
  });
@@ -229,7 +228,7 @@ export async function startCuaRun(plan, input, admitted, scope) {
229
228
  humanishSource: "present",
230
229
  packageName: "humanish",
231
230
  });
232
- // Live-trace flush seam (#441): 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
233
232
  // to grow; participants call it through deps.onTrace. It exists before deps so deps can reference it as
234
233
  // a stable indirection.
235
234
  const liveTrace = {};
@@ -316,7 +315,7 @@ function cuaParticipantDeps(plan, input, admitted, run) {
316
315
  onTrace: (participantId, items, usage, metadata) => liveTrace.flush?.(participantId, items, usage, metadata),
317
316
  ...callerDriving(input, config),
318
317
  residual: plan.residual,
319
- labId: plan.labId,
318
+ studyId: plan.studyId,
320
319
  caps: plan.caps,
321
320
  appUrl,
322
321
  brain: plan.runner.brain,
@@ -330,11 +329,11 @@ function cuaParticipantDeps(plan, input, admitted, run) {
330
329
  timeoutMs,
331
330
  participantCount,
332
331
  artifactRoot: runPaths,
333
- labCwd: input.cwd,
332
+ studyCwd: input.cwd,
334
333
  redactScreenshots,
335
334
  scrubKnownValues,
336
335
  runSession,
337
- // The study-level ledger exists once per RUN, shared by every participant (#299). Dry runs never
336
+ // The study-level ledger exists once per run, shared by every participant. Dry runs never
338
337
  // spend, so they carry none.
339
338
  ...(dryRun || plan.caps.maxTotalUsd === undefined
340
339
  ? {}
@@ -374,7 +373,7 @@ function subjectPhaseReporter(input) {
374
373
  const sink = input.deps?.subjectPhaseSink ?? defaultSubjectPhaseSink;
375
374
  return (event, participant) => {
376
375
  sink(event, participant);
377
- input.emit?.(phaseEvent(event, { kind: "participant", participant: participantOf(participant) }));
376
+ input.emit?.(phaseEvent(event, { kind: "participant", participant }));
378
377
  };
379
378
  }
380
379
  function makeCuaRunId() {