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,8 +1,8 @@
1
- import type { LabCommsEmail, LabCommsExternal } from "../../lab/types.js";
1
+ import type { StudyCommsEmail, StudyCommsExternal } from "../../study/types.js";
2
2
  import type { PreparedRunArtifactPaths } from "../../run/paths.js";
3
3
  import type { DesktopParticipantRun, ParticipantRunOutcome } from "./types.js";
4
4
  /**
5
- * Adopter-hosted drain (#380): once per RUN, after every participant finished — the catch is one
5
+ * Adopter-hosted drain: once per run, after every participant finished, because the catch is one
6
6
  * shared external endpoint, not a per-sandbox file. Same routing and digest-only artifact as
7
7
  * the in-sandbox drain; the artifact is registered on every participant that declared a recipient
8
8
  * address, since the thread carries each inbox's mail. A drain failure never fails the run.
@@ -10,8 +10,8 @@ import type { DesktopParticipantRun, ParticipantRunOutcome } from "./types.js";
10
10
  * Returns the warnings the drain produced; participants that received mail get `commsArtifactPath`.
11
11
  */
12
12
  export declare function drainExternalComms(args: {
13
- externalCommsConfig: LabCommsExternal;
14
- externalCommsEmail: LabCommsEmail;
13
+ externalCommsConfig: StudyCommsExternal;
14
+ externalCommsEmail: StudyCommsEmail;
15
15
  env: Record<string, string | undefined>;
16
16
  runPaths: PreparedRunArtifactPaths;
17
17
  participantRuns: readonly DesktopParticipantRun[];
@@ -1,7 +1,7 @@
1
1
  import { collectExternalCommsEvidence } from "../../comms/external-evidence.js";
2
2
  import { participantHasInboxRecipient } from "./participant-desktop.js";
3
3
  /**
4
- * Adopter-hosted drain (#380): once per RUN, after every participant finished — the catch is one
4
+ * Adopter-hosted drain: once per run, after every participant finished, because the catch is one
5
5
  * shared external endpoint, not a per-sandbox file. Same routing and digest-only artifact as
6
6
  * the in-sandbox drain; the artifact is registered on every participant that declared a recipient
7
7
  * address, since the thread carries each inbox's mail. A drain failure never fails the run.
@@ -10,6 +10,7 @@ import { participantPassed, participantStatus } from "../../run/judge.js";
10
10
  import { buildRunCostSummary, desktopSpanToMinutes } from "../../run/cost-summary.js";
11
11
  import { formatParticipantPlanEntry } from "./participant-runs.js";
12
12
  import { fanoutParticipantRecords } from "./fanout-records.js";
13
+ import { plural } from "../../run/text.js";
13
14
  /** The run's first two events: its creation and the fan-out plan. */
14
15
  function fanoutPlanEvents(args) {
15
16
  const { specs, plan } = args;
@@ -19,14 +20,14 @@ function fanoutPlanEvents(args) {
19
20
  at: args.run.createdAt,
20
21
  level: "info",
21
22
  type: "cua-lab.run.created",
22
- message: `Created computer-use fan-out run for ${plan.labId} (actor ${args.descriptor.id}, ${specs.length} participants, one world each).`,
23
+ message: `Created computer-use fan-out run for ${plan.studyId} (actor ${args.descriptor.id}, ${specs.length} participants, one world each).`,
23
24
  });
24
25
  events.push({
25
26
  id: "event-001-fanout-plan",
26
27
  at: args.run.createdAt,
27
28
  level: "info",
28
29
  type: "cua-lab.fanout.plan",
29
- message: `Fan-out plan: ${args.participantPlan.laneCount} participant(s) (${args.participantPlan.strategy}), concurrency ${args.participantPlan.concurrency}, ${args.participantPlan.waves} wave(s); session budget ${Math.round(args.participantPlan.perLaneSessionBudgetMs / 1000)}s per participant; worst-case ~${args.participantPlan.worstCaseSandboxMinutes} sandbox-minutes${args.dryRun ? " (dry-run: $0)" : ""}. Participants: ${args.participantPlan.lanes.map(formatParticipantPlanEntry).join(", ")}.`,
30
+ message: `Fan-out plan: ${plural(args.participantPlan.laneCount, "participant")} (${args.participantPlan.strategy}), concurrency ${args.participantPlan.concurrency}, ${plural(args.participantPlan.waves, "wave")}; session budget ${Math.round(args.participantPlan.perLaneSessionBudgetMs / 1000)}s per participant; worst-case ~${args.participantPlan.worstCaseSandboxMinutes} sandbox-minutes${args.dryRun ? " (dry-run: $0)" : ""}. Participants: ${args.participantPlan.lanes.map(formatParticipantPlanEntry).join(", ")}.`,
30
31
  });
31
32
  return events;
32
33
  }
@@ -35,26 +36,26 @@ function fanoutReview(args, streams) {
35
36
  // The judge's verdict: live fan-out must prove every participant (judgeParticipants).
36
37
  const verdict = args.verdict;
37
38
  const passedParticipants = (outcomes ?? []).filter((outcome) => participantPassed(participantFactsOf(outcome))).length;
38
- // What happened to the PARTICIPANTS, with the denominator attached. The verdict above has to
39
+ // What happened to the participants, with the denominator attached. The verdict above has to
39
40
  // collapse the run to one word; this does not (docs/principles/three-roles.md).
40
41
  const terminalOutcomes = (outcomes ?? []).filter((outcome) => outcome?.session?.status !== undefined);
41
42
  const participants = terminalOutcomes.length > 0
42
43
  ? tallyParticipantOutcomes(
43
- // A NO-ENGAGEMENT participant is not one who reached the goal. It said "done" having
44
+ // A no-engagement participant is not one who reached the goal. It said "done" having
44
45
  // taken zero actions and said nothing, and `passedParticipants` above already refuses to
45
- // count it — but `reachedGoal` was reading the trace status directly, so one run could be both
46
- // "not a passed participant" AND "1/1 reached the goal". The headline number a researcher reads
46
+ // count it, but `reachedGoal` was reading the trace status directly, so one run could be both
47
+ // "not a passed participant" and "1/1 reached the goal". The headline number a researcher reads
47
48
  // first was the dishonest one. Found by a provider bug that ended a study on turn one.
48
49
  terminalOutcomes.map((outcome) => participantStatus(outcome.session.status, {
49
50
  noEngagement: outcome.noEngagement === true,
50
51
  selfReportedBlocker: outcome.selfReportedBlocker === true,
51
52
  })),
52
- // A participant who reached the goal AND told you the road there was broken is the most
53
+ // A participant who reached the goal and told you the road there was broken is the most
53
54
  // useful result a study produces; reporting only the outcome would bury it.
54
55
  terminalOutcomes.map((outcome) => outcome.reportedFriction === true))
55
56
  : undefined;
56
57
  // The study funnel: per-task completion rates across every session that measured one. This is
57
- // "where did people get stuck" as data, next to WHO got stuck (participants) above.
58
+ // "where did people get stuck" as data, next to who got stuck (participants) above.
58
59
  const participantFunnels = (outcomes ?? [])
59
60
  .map((outcome) => outcome?.session?.trace.taskFunnel)
60
61
  .filter((funnel) => funnel !== undefined);
@@ -74,12 +75,12 @@ function fanoutReview(args, streams) {
74
75
  summary: args.inProgress === true
75
76
  ? `Live computer-use fan-out is running (${specs.length} participants, one world each); terminal participant evidence has not been written yet.`
76
77
  : args.dryRun
77
- ? `${args.rerun ? `Rerun contract from ${args.rerun.sourceRunId}: ` : ""}Dry-run fan-out contract: ${specs.length} participants composed for ${args.descriptor.id} against ${args.appUrl}, one world each; no desktops launched, $0 spend.`
78
- : `${args.rerun ? `Rerun from ${args.rerun.sourceRunId}: ` : ""}Computer-use fan-out (${specs.length} participants, one world each): ${passedParticipants}/${specs.length} participant(s) reached a terminal, engaged verdict${participants ? `: ${formatParticipantOutcomes(participants, participantEndings)}` : ""}${runTasks ? `; tasks: ${formatRunTaskFunnel(runTasks)}` : ""}.`,
78
+ ? `${args.rerun ? `Rerun from ${args.rerun.sourceRunId}: ` : ""}Dry-run fan-out: ${specs.length} participants composed for ${args.descriptor.id} against ${args.appUrl}, one world each; no desktops launched, $0 spend.`
79
+ : `${args.rerun ? `Rerun from ${args.rerun.sourceRunId}: ` : ""}Computer-use fan-out (${specs.length} participants, one world each): ${passedParticipants}/${plural(specs.length, "participant")} reached a terminal, engaged verdict${participants ? `: ${formatParticipantOutcomes(participants, participantEndings)}` : ""}${runTasks ? `; tasks: ${formatRunTaskFunnel(runTasks)}` : ""}.`,
79
80
  gaps: args.inProgress === true
80
81
  ? ["Live fan-out session is still running."]
81
82
  : args.dryRun
82
- ? ["Live fan-out session not yet run (dry-run contract only)."]
83
+ ? ["Live fan-out session not yet run (dry run only)."]
83
84
  : specs
84
85
  .map((spec, index) => ({ spec, outcome: outcomes?.[index] }))
85
86
  .filter(({ outcome }) => outcome === undefined ||
@@ -112,7 +113,7 @@ function fanoutDesktopBrowser(args) {
112
113
  }
113
114
  function fanoutCost(args) {
114
115
  const { specs, outcomes } = args;
115
- // Run-level cost ESTIMATE: one model-token line per participant that ran a session (from its persisted
116
+ // Run-level cost estimate: one model-token line per participant that ran a session (from its persisted
116
117
  // trace.estimatedCost) + a desktop line per owned allocation, priced at its observed resources.
117
118
  // `per-lane-worlds` participants have no shared provisioning to double-count. Omitted on a pure dry-run.
118
119
  const costTraces = specs
@@ -136,8 +137,8 @@ function fanoutFeedbackCandidates(args) {
136
137
  ? []
137
138
  : participantFeedbackCandidates({
138
139
  runId: args.run.runId,
139
- scenarioId: `cua-${plan.labId}`,
140
- adapterId: plan.labId,
140
+ scenarioId: `cua-${plan.studyId}`,
141
+ adapterId: plan.studyId,
141
142
  goal: redactText(specs[0].evidenceInstructions ?? specs[0].instructions),
142
143
  substrate: plan.residual.execution?.target === "local" ? "local-desktop" : "e2b-desktop",
143
144
  participants: specs.map((spec, index) => {
@@ -179,7 +180,7 @@ export function buildCuaFanoutBundle(args) {
179
180
  at: args.run.createdAt,
180
181
  level: "info",
181
182
  type: "cua-lab.fanout.rerun",
182
- message: `Rerun selected ${args.rerun.selectedLaneIds.length} participant(s) from ${args.rerun.sourceRunId}: ${args.rerun.previous.map((prior) => `${prior.laneId} was ${prior.status}${prior.completionReason ? `/${prior.completionReason}` : ""}`).join(", ")}. This is a new linked run; the source run verdict is unchanged.`,
183
+ message: `Rerun selected ${plural(args.rerun.selectedLaneIds.length, "participant")} from ${args.rerun.sourceRunId}: ${args.rerun.previous.map((prior) => `${prior.laneId} was ${prior.status}${prior.completionReason ? `/${prior.completionReason}` : ""}`).join(", ")}. This is a new linked run; the source run verdict is unchanged.`,
183
184
  });
184
185
  }
185
186
  specs.forEach((spec, index) => {
@@ -218,22 +219,22 @@ export function buildCuaFanoutBundle(args) {
218
219
  persona: {
219
220
  id: specs[0].persona.id,
220
221
  name: `Computer-use fan-out (${specs.length} participants)`,
221
- source: `lab:${plan.labId}`,
222
+ source: `study:${plan.studyId}`,
222
223
  sourceDigest: specs[0].persona.promptDigest,
223
224
  },
224
225
  scenario: {
225
- id: `cua-${plan.labId}`,
226
- title: plan.title ?? `Computer-use fan-out: ${plan.labId}`,
227
- // Redacted at WRITE time, like every other raw-text surface in the bundle. Participant records are
228
- // digest-only by design, but scenario.goal keeps one participant's composed instructions verbatim —
226
+ id: `cua-${plan.studyId}`,
227
+ title: plan.title ?? `Computer-use fan-out: ${plan.studyId}`,
228
+ // Redacted at write time, like every other raw-text surface in the bundle. Participant records are
229
+ // digest-only by design, but scenario.goal keeps one participant's composed instructions verbatim,
229
230
  // and an adopter whose authored participant text must name a runtime world URL (an inbox on a route
230
231
  // where the harness does not inject one) put an *.e2b.app address in it. That landed raw here
231
232
  // and in observer-data.json, the sensitive-text scanner matched it, and verify failed a bundle
232
- // this writer produced. The only adopter-side workaround was scanner evasion (#412).
233
+ // this writer produced. The only adopter-side workaround was scanner evasion.
233
234
  //
234
235
  // The instructions the model actually receives are untouched; only the persisted copy changes.
235
236
  goal: redactText(specs[0].evidenceInstructions ?? specs[0].instructions),
236
- source: `lab:${plan.labId}`,
237
+ source: `study:${plan.studyId}`,
237
238
  sourceDigest: specs[0].persona.promptDigest,
238
239
  },
239
240
  lifecycle: [
@@ -251,14 +252,14 @@ export function buildCuaFanoutBundle(args) {
251
252
  status: "passed",
252
253
  notes: ranLive
253
254
  ? anyRaw
254
- ? "Typed text recorded as length only and reasoning/messages pass through text redaction. Some participants captured FULL-FIDELITY (raw) screenshots, retained for local use and NOT redacted for publishing; set policies.redactScreenshots: true to blur a share-as-is bundle."
255
+ ? "Typed text is recorded as its length only, and reasoning and messages pass through text redaction. Some participants captured unblurred screenshots, kept for local use and not redacted for publishing. Set policies.redactScreenshots: true to blur screenshots in a bundle you plan to share."
255
256
  : "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."
256
- : "Dry-run fan-out contract bundle: no desktops launched and no screenshots captured. Typed text is recorded as length only and reasoning/messages pass through text redaction whenever a session runs.",
257
+ : "Dry-run fan-out bundle: no desktops launched and no screenshots captured. Typed text is recorded as length only and reasoning/messages pass through text redaction whenever a session runs.",
257
258
  },
258
259
  artifacts: bundleArtifacts(),
259
260
  review,
260
- // What the participants reported, when any reported anything (#392). Dry-run and in-progress
261
- // bundles carry none — there is no participant yet to quote.
261
+ // What the participants reported, when any reported anything. Dry-run and in-progress
262
+ // bundles carry none: there is no participant yet to quote.
262
263
  feedbackCandidates: fanoutFeedbackCandidates(args),
263
264
  // Selected hosted image, including the optional speech default; omitted on the stock desktop.
264
265
  ...(desktopTemplate === undefined ? {} : { desktopTemplate }),
@@ -1,6 +1,6 @@
1
1
  // Each participant's records in a computer-use fan-out bundle: its simulation, its stream, its
2
2
  // subject provenance event and the events of its outcome (session, geometry warnings, phase trail).
3
- import { participantAssignment } from "../../lab/participant-assignment.js";
3
+ import { participantAssignment } from "../../study/participant-assignment.js";
4
4
  import { participantEvent, participantRecord, participantStream, } from "../../run/participant-records.js";
5
5
  import { declaredScreenForRender } from "../../substrates/e2b/desktop-geometry.js";
6
6
  import { describeSubjectState, phaseEventIdSuffix, publicSafeAppUrlLabel } from "./bundle-parts.js";
@@ -41,7 +41,7 @@ function fanoutParticipantView(args, spec, index) {
41
41
  : (outcome?.skippedReason ??
42
42
  session?.reason ??
43
43
  outcome?.sessionError ??
44
- "Contract bundle only: dry-run produced the evidence shape without launching a desktop or spending provider tokens.");
44
+ "Dry run: the evidence shape was written without launching a desktop or spending provider tokens.");
45
45
  const traceScreenshotMode = session?.trace.redaction.screenshots;
46
46
  const screenshotMode = traceScreenshotMode === "raw" || traceScreenshotMode === "blurred"
47
47
  ? traceScreenshotMode
@@ -66,7 +66,7 @@ function fanoutParticipantRecord(args, spec, index, view) {
66
66
  const { outcome, publicTargetUrl, session, status, reason } = view;
67
67
  return participantRecord(spec, index + 1, {
68
68
  personaId: spec.persona.id,
69
- scenarioId: `cua-${plan.labId}`,
69
+ scenarioId: `cua-${plan.studyId}`,
70
70
  status,
71
71
  streamKind: "browser",
72
72
  mode: "browser-sim",
@@ -80,13 +80,12 @@ function fanoutParticipantRecord(args, spec, index, view) {
80
80
  ? `Participant ${spec.planned.id} ${outcome.skippedReason}.`
81
81
  : outcome?.sessionError !== undefined
82
82
  ? `Participant ${spec.planned.id} failed before a terminal session verdict: ${outcome.sessionError}`
83
- : `Contract participant ${spec.planned.id} (${spec.persona.id}/${spec.planned.device.name}) for ${args.descriptor.id} against ${publicTargetUrl}.`,
83
+ : `Participant ${spec.planned.id} (${spec.persona.id}/${spec.planned.device.name}) for ${args.descriptor.id} against ${publicTargetUrl}; no session ran.`,
84
84
  startedAt: args.run.createdAt,
85
85
  updatedAt: args.run.createdAt,
86
86
  });
87
87
  }
88
88
  function fanoutParticipantStream(args, spec, view) {
89
- const { plan } = args;
90
89
  const { outcome, publicTargetUrl, session, desktopGeometry, screenshots } = view;
91
90
  const { lastScreenshot, status, reason, screenshotMode } = view;
92
91
  const judged = outcome === undefined ? undefined : judgedStatus(participantFactsOf(outcome));
@@ -104,7 +103,7 @@ function fanoutParticipantStream(args, spec, view) {
104
103
  ? {}
105
104
  : { caseGroup: spec.planned.labels.caseGroup }),
106
105
  kind: "browser",
107
- label: `CUA participant ${spec.planned.id}: ${plan.labId}`,
106
+ label: `${spec.planned.id} · browser`,
108
107
  status,
109
108
  ...(judged === undefined ? {} : { judgedStatus: judged }),
110
109
  transport: "snapshot",
@@ -113,9 +112,9 @@ function fanoutParticipantStream(args, spec, view) {
113
112
  ? {
114
113
  kind: "screenshot",
115
114
  url: lastScreenshot,
116
- title: `CUA desktop ${spec.planned.id} (${screenshotMode})`,
115
+ title: `Desktop (${screenshotMode})`,
117
116
  }
118
- : { kind: "placeholder", title: `CUA desktop ${spec.planned.id}` },
117
+ : { kind: "placeholder", title: "Desktop" },
119
118
  ...(desktopGeometry.viewport === undefined
120
119
  ? {}
121
120
  : {
@@ -180,7 +179,7 @@ function fanoutSubjectEvents(ctx, spec, view) {
180
179
  const { publicTargetUrl, subject, session } = view;
181
180
  const events = [];
182
181
  const record = (event) => events.push(participantEvent(spec, event));
183
- // Per-participant subject provenance (invariant 5).
182
+ // Per-participant subject provenance.
184
183
  if (args.plan.runner.subject.kind === "clone" && args.publicRepo) {
185
184
  record({
186
185
  id: nextEventId(`subject-${spec.planned.id}`),
@@ -188,7 +187,7 @@ function fanoutSubjectEvents(ctx, spec, view) {
188
187
  level: "info",
189
188
  type: "cua-lab.subject.provenance",
190
189
  message: `Participant ${spec.planned.id}: ${args.dryRun
191
- ? `subject declared: clone of ${args.publicRepo}, served at ${publicTargetUrl} in-sandbox (dry-run contract; nothing cloned)`
190
+ ? `subject declared: clone of ${args.publicRepo}, served at ${publicTargetUrl} in-sandbox (dry run; nothing cloned)`
192
191
  : subject.commit
193
192
  ? session
194
193
  ? `subject cloned from ${args.publicRepo}@${subject.commit} and served at ${publicTargetUrl} in-sandbox`
@@ -203,7 +202,7 @@ function fanoutSubjectEvents(ctx, spec, view) {
203
202
  level: "info",
204
203
  type: "cua-lab.subject.provenance",
205
204
  message: `Participant ${spec.planned.id}: ${args.dryRun
206
- ? `subject declared: local working tree, to be packed and served at ${publicTargetUrl} in-sandbox (dry-run contract; nothing packed)`
205
+ ? `subject declared: local working tree, to be packed and served at ${publicTargetUrl} in-sandbox (dry run; nothing packed)`
207
206
  : subject.archiveSha256
208
207
  ? session
209
208
  ? `subject packed (archiveSha256 ${subject.archiveSha256}${subject.dirty === true ? ", dirty working tree" : subject.dirty === false ? ", clean working tree" : ""}) and served at ${publicTargetUrl} in-sandbox`
@@ -270,7 +269,7 @@ function fanoutOutcomeEvents(ctx, spec, view) {
270
269
  at: args.run.createdAt,
271
270
  level: "info",
272
271
  type: "cua-lab.contract.ready",
273
- message: `Participant ${spec.planned.id}: dry-run contract participant ready; switch scenario.mode to live for a real desktop session.`,
272
+ message: `Participant ${spec.planned.id}: dry-run participant ready; switch scenario.mode to live for a real desktop session.`,
274
273
  });
275
274
  }
276
275
  for (const warning of desktopGeometry.warnings ?? []) {
@@ -282,7 +281,7 @@ function fanoutOutcomeEvents(ctx, spec, view) {
282
281
  message: warning,
283
282
  });
284
283
  }
285
- // Persisted per-participant phase trail (real boot timing): one RunEvent per COMPLETED phase
284
+ // Persisted per-participant phase trail (real boot timing): one RunEvent per completed phase
286
285
  // boundary this participant recorded (started events never persist here; they carry no durationMs).
287
286
  for (const phase of outcome?.phaseRecords ?? []) {
288
287
  record({
@@ -2,7 +2,7 @@ import type { ActorTokenUsage, ActorTraceItem } from "../../actors/contract.js";
2
2
  import type { CuaLiveMetadata } from "../../actors/computer-use/loop.js";
3
3
  import { type ObserverResult } from "../../observer/render.js";
4
4
  import type { RunBundle } from "../../run/bundle.js";
5
- import type { RunLabHomes } from "../../lab/run-lab-homes.js";
5
+ import type { RunStudyHomes } from "../../study/run-study-homes.js";
6
6
  import type { DesktopParticipantRun } from "./types.js";
7
7
  export interface LiveTraceFlush {
8
8
  /** Record a participant's recorded-so-far items; the bundle rewrite follows on the flush
@@ -12,7 +12,7 @@ export interface LiveTraceFlush {
12
12
  stop: () => Promise<void>;
13
13
  }
14
14
  /**
15
- * Incremental live flush (#441): as each participant's loop reports its recorded-so-far items,
15
+ * Incremental live flush: as each participant's loop reports its recorded-so-far items,
16
16
  * rewrite the in-progress bundle with per-stream `liveActor` partials so the attached
17
17
  * Observer's 5s poll sees the timeline grow. Throttled (one write per interval, trailing
18
18
  * write guaranteed). `write` is the run's `writeSnapshot`, which serializes writes and refuses
@@ -32,9 +32,9 @@ export declare function startLiveTraceFlush(args: {
32
32
  * the run. The URLs carry auth, so they live in memory and on the Observer result, never in run
33
33
  * artifacts.
34
34
  */
35
- export declare function trackRuntimeStreams(onStream: RunLabHomes["onStream"] | undefined): {
35
+ export declare function trackRuntimeStreams(onStream: RunStudyHomes["onStream"] | undefined): {
36
36
  /** Records each stream for the Observer, after the caller's onStream. */
37
- onStream: NonNullable<RunLabHomes["onStream"]>;
37
+ onStream: NonNullable<RunStudyHomes["onStream"]>;
38
38
  /** From now on, keep this live Observer's stream list current. */
39
39
  showIn: (observer: ObserverResult & {
40
40
  ok: true;
@@ -1,7 +1,7 @@
1
1
  import { attachObserverRuntimeStreamUrls } from "../../observer/render.js";
2
2
  import {} from "../../observer/run-routes.js";
3
3
  /**
4
- * Incremental live flush (#441): as each participant's loop reports its recorded-so-far items,
4
+ * Incremental live flush: as each participant's loop reports its recorded-so-far items,
5
5
  * rewrite the in-progress bundle with per-stream `liveActor` partials so the attached
6
6
  * Observer's 5s poll sees the timeline grow. Throttled (one write per interval, trailing
7
7
  * write guaranteed). `write` is the run's `writeSnapshot`, which serializes writes and refuses
@@ -42,9 +42,9 @@ export function startLiveTraceFlush(args) {
42
42
  liveActor: {
43
43
  schema: "humanish.live-actor.v1",
44
44
  updatedAt,
45
- // WHO this participant is, carried while the run is live. Without it a
46
- // surface watching a live run can only name the participant id, and "CUA browser — observer-live-
47
- // check" is the harness talking about itself where the participant should be.
45
+ // Who this participant is, carried while the run is live. Without it a
46
+ // surface watching a live run can only name the participant id and the stream
47
+ // label (`<participant id> · browser`), which describe the harness, not the participant.
48
48
  ...(personaByStream.get(stream.id) === undefined
49
49
  ? {}
50
50
  : { persona: { id: personaByStream.get(stream.id) } }),
@@ -125,8 +125,8 @@ export function trackRuntimeStreams(onStream) {
125
125
  await onStream?.(event);
126
126
  if (event.type === "ready")
127
127
  urls.push({ streamId: event.streamId, url: event.url });
128
- // Mark, never remove: the tile needs to KNOW the live view ended (and say so) rather than
129
- // have the stream silently vanish from the overlay (#357).
128
+ // Mark, never remove: the tile needs to know the live view ended (and say so) rather than
129
+ // have the stream silently vanish from the overlay.
130
130
  else
131
131
  for (const entry of urls)
132
132
  if (entry.streamId === event.streamId)
@@ -5,15 +5,16 @@ import type { CuaParticipantsSetup, CuaRunSetup } from "./setup.js";
5
5
  * Runs the participants (a dry run runs none). Returns the refusal when real email setup fails, or
6
6
  * the participant outcomes and the warnings the finish records.
7
7
  */
8
- export declare function runLabParticipants(setup: CuaRunSetup, participants: CuaParticipantsSetup): Promise<{
8
+ export declare function runStudyParticipants(setup: CuaRunSetup, participants: CuaParticipantsSetup): Promise<{
9
9
  ok: false;
10
10
  result: {
11
11
  automaticAnalysis?: import("../../analysis/job.js").AutomaticAnalysisOutcome;
12
12
  automaticAnalysisTrigger?: "default" | "explicit";
13
- schema: typeof import("./types.js").CUA_ACTOR_LAB_SCHEMA;
13
+ schema: typeof import("../../run/study-result.js").STUDY_RESULT_SCHEMA;
14
+ route: "computer-use";
15
+ studyId: string;
14
16
  ok: boolean;
15
17
  cwd: string;
16
- labId: string;
17
18
  actor: string;
18
19
  appUrl: string;
19
20
  dryRun: boolean;
@@ -38,7 +39,7 @@ export declare function runLabParticipants(setup: CuaRunSetup, participants: Cua
38
39
  diagnostics?: import("./diagnostics.js").CuaDiagnostics;
39
40
  warnings: string[];
40
41
  error?: {
41
- code: import("./types.js").CuaActorLabErrorCode;
42
+ code: import("./types.js").CuaActorStudyErrorCode;
42
43
  message: string;
43
44
  };
44
45
  runId: string;
@@ -2,7 +2,7 @@
2
2
  // receiving, the participants themselves, and the drain of an operator-hosted inbox.
3
3
  import { prepareReceivingRun } from "../../comms/receiving-runtime.js";
4
4
  import { liveObserverResult } from "../../observer/live.js";
5
- import { pricedModel } from "../../lab/plan-base.js";
5
+ import { pricedModel } from "../../study/plan-base.js";
6
6
  import { runAllCuaParticipants } from "./participant-execution.js";
7
7
  import { startLiveTraceFlush } from "./live-flush.js";
8
8
  import { drainExternalComms } from "./external-comms.js";
@@ -12,7 +12,7 @@ import { participantSubjectEnv } from "./types.js";
12
12
  * Runs the participants (a dry run runs none). Returns the refusal when real email setup fails, or
13
13
  * the participant outcomes and the warnings the finish records.
14
14
  */
15
- export async function runLabParticipants(setup, participants) {
15
+ export async function runStudyParticipants(setup, participants) {
16
16
  const { plan, input, cwd, streams, descriptor, run } = setup;
17
17
  const { participantRuns, participantPlan, bundleBase } = setup;
18
18
  const { env, knownSecretValues, deps, liveTrace, externalComms, inProgress, fail } = participants;
@@ -20,10 +20,10 @@ export async function runLabParticipants(setup, participants) {
20
20
  const inProcess = plan.runner.desktop === "in-process";
21
21
  const subjectEnvNames = [...participantSubjectEnv(plan.runner.subject)];
22
22
  const { runId, paths: runPaths } = run;
23
- // A live run writes what it is doing AS IT DOES IT, whether or not anyone is currently watching.
24
- // This used to be gated on `options.onObserverReady` — the interactive Observer callback — so a
25
- // run launched by an agent (`lab run --json`), detached, or from the terminal surface recorded
26
- // nothing at all until it completed, and anything asking "what is this participant doing right
23
+ // A live run writes what it is doing as it does it, whether or not anyone is currently watching.
24
+ // This is not gated on `options.onObserverReady` (the interactive Observer callback): gated, a
25
+ // run launched by an agent (`run --json`), detached, or from the terminal surface records
26
+ // nothing at all until it completes, and anything asking "what is this participant doing right
27
27
  // now" got silence for the whole run. Who reads the evidence is not the run's business; the
28
28
  // callback below stays conditional, the writing does not.
29
29
  if (!dryRun) {
@@ -47,7 +47,7 @@ export async function runLabParticipants(setup, participants) {
47
47
  streams.showIn(liveObserver);
48
48
  if (input.onObserverReady)
49
49
  await input.onObserverReady(liveObserver);
50
- // Incremental live flush (#441): as each participant's loop reports its recorded-so-far items,
50
+ // Incremental live flush: as each participant's loop reports its recorded-so-far items,
51
51
  // rewrite the in-progress bundle with per-stream `liveActor` partials so the attached
52
52
  // Observer's 5s poll sees the timeline grow. The run refuses any snapshot once the final
53
53
  // write began; the route stops the flush timer on every exit below.
@@ -91,7 +91,7 @@ export async function runLabParticipants(setup, participants) {
91
91
  return {
92
92
  ok: false,
93
93
  result: {
94
- ...fail("HUMANISH_CUA_LAB_SUBJECT_INVALID", "Real email setup failed before desktop allocation. Run humanish comms check --online and humanish comms recover to inspect authentication and pending cleanup.", descriptor.id),
94
+ ...fail("HUMANISH_COMPUTER_USE_SUBJECT_INVALID", "Real email setup failed before desktop allocation. Run humanish comms check --online and humanish comms recover to inspect authentication and pending cleanup.", descriptor.id),
95
95
  runId,
96
96
  },
97
97
  };
@@ -1,12 +1,12 @@
1
- import type { LabConfig } from "../../lab/types.js";
1
+ import type { StudyConfig } from "../../study/types.js";
2
2
  import { type LocalTreeArchive } from "../../subject/local-tree-archive.js";
3
- import type { LabDeps } from "../../lab/lab-deps.js";
3
+ import type { StudyDeps } from "../../study/study-deps.js";
4
4
  /**
5
5
  * Pack the working tree for a local-tree run and report what left the host on stderr, by counts
6
6
  * and digest only, never paths or file names.
7
7
  */
8
- export declare function packRunLocalTree(deps: LabDeps, config: {
9
- readonly subject: Pick<LabConfig["subject"], "localTree">;
8
+ export declare function packRunLocalTree(deps: StudyDeps, config: {
9
+ readonly subject: Pick<StudyConfig["subject"], "localTree">;
10
10
  }, cwd: string): Promise<{
11
11
  archive: LocalTreeArchive;
12
12
  buffer: ArrayBuffer;
@@ -14,7 +14,7 @@ export declare function packRunLocalTree(deps: LabDeps, config: {
14
14
  /**
15
15
  * Default local-tree packing implementation: createLocalTreeArchive(root, opts) on the host,
16
16
  * then a single read of the produced archive file into an ArrayBuffer for upload. The DI seam
17
- * (LabDeps.packLocalTree) overrides this in deterministic tests so they never require
17
+ * (StudyDeps.packLocalTree) overrides this in deterministic tests so they never require
18
18
  * tar/git.
19
19
  */
20
20
  export declare function defaultPackLocalTree(args: {
@@ -24,7 +24,7 @@ export async function packRunLocalTree(deps, config, cwd) {
24
24
  /**
25
25
  * Default local-tree packing implementation: createLocalTreeArchive(root, opts) on the host,
26
26
  * then a single read of the produced archive file into an ArrayBuffer for upload. The DI seam
27
- * (LabDeps.packLocalTree) overrides this in deterministic tests so they never require
27
+ * (StudyDeps.packLocalTree) overrides this in deterministic tests so they never require
28
28
  * tar/git.
29
29
  */
30
30
  export async function defaultPackLocalTree(args) {
@@ -1,23 +1,23 @@
1
- import type { InternalRunLabOptions } from "../../run-lab.js";
2
- import type { LabConfig } from "../../lab/types.js";
1
+ import type { InternalRunStudyOptions } from "../../run-study.js";
2
+ import type { StudyConfig } from "../../study/types.js";
3
3
  import type { LocalVmInput } from "./types.js";
4
4
  import { type LocalFirecrackerAssets } from "../../substrates/local/firecracker-desktop.js";
5
- type LocalVmRunOptions = InternalRunLabOptions & {
6
- config: LabConfig;
5
+ type LocalVmRunOptions = InternalRunStudyOptions & {
6
+ config: StudyConfig;
7
7
  assets?: LocalFirecrackerAssets;
8
8
  signal?: AbortSignal;
9
9
  };
10
10
  /** A local browser study's bindings, and the cleanup of what its participants started. */
11
11
  export interface LocalVmRun {
12
- /** The caller's runLab options, with the account provider when the study runs one. */
13
- readonly options: InternalRunLabOptions;
12
+ /** The caller's runStudyWith options, with the account provider when the study runs one. */
13
+ readonly options: InternalRunStudyOptions;
14
14
  /** The desktop, the analysis gate and the abort signal the computer-use run takes. */
15
15
  readonly localVm: LocalVmInput;
16
16
  close(): Promise<void>;
17
17
  }
18
18
  /**
19
- * Local desktop/provider composition: the options the lab is planned and run with. It throws before
20
- * anything starts on a lab the local study cannot run.
19
+ * Local desktop/provider composition: the options the study is planned and run with. It throws before
20
+ * anything starts on a study the local VM cannot run.
21
21
  */
22
22
  export declare function prepareLocalVmRun(options: LocalVmRunOptions): LocalVmRun;
23
23
  export {};
@@ -26,7 +26,7 @@ function guestAssets(options, account, needsMedia) {
26
26
  if (account) {
27
27
  const readiness = await checkRestrictedCodexAnalysisReadiness({ timeoutMs: 5000 });
28
28
  if (!readiness.ready)
29
- throw new Error(`Codex account is not ready (${readiness.errorCode}). Run humanish doctor --lab <lab> before starting a local study.`);
29
+ throw new Error(`Codex account is not ready (${readiness.errorCode}). Run humanish doctor --study <study> before starting a local study.`);
30
30
  }
31
31
  return (options.assets ??
32
32
  (await prepareLocalRuntime({
@@ -152,8 +152,8 @@ function accountProvider(state) {
152
152
  };
153
153
  }
154
154
  /**
155
- * Local desktop/provider composition: the options the lab is planned and run with. It throws before
156
- * anything starts on a lab the local study cannot run.
155
+ * Local desktop/provider composition: the options the study is planned and run with. It throws before
156
+ * anything starts on a study the local VM cannot run.
157
157
  */
158
158
  export function prepareLocalVmRun(options) {
159
159
  const config = localBrowserDefaults(options.config);
@@ -1,6 +1,6 @@
1
1
  import type { CuaExecutor } from "../../actors/computer-use/loop.js";
2
2
  import type { DesktopParticipantRun, ParticipantRunOutcome } from "./types.js";
3
- import type { LabCommsEmail, LabCommsRecipient } from "../../lab/types.js";
3
+ import type { StudyCommsEmail, StudyCommsRecipient } from "../../study/types.js";
4
4
  import type { PreparedOutputRoot } from "../../run/contained-output.js";
5
5
  /** A prepared desktop supplies only participant input/observation and its inbox location. */
6
6
  export interface ReadyParticipantDesktop {
@@ -38,11 +38,11 @@ export interface ParticipantDesktop {
38
38
  }
39
39
  /** Builds one participant's desktop. The factory must not acquire anything; prepare does. */
40
40
  export type ParticipantDesktopFactory = (run: DesktopParticipantRun, warnings: string[], artifactRoot: PreparedOutputRoot) => ParticipantDesktop;
41
- /** The participant's addressed comms recipient, when one exists — the gate AND the address source for the
42
- * inbox instruction (#351). A participant told to check an inbox it can never receive into would stall,
41
+ /** The participant's addressed comms recipient, when one exists: the gate and the address source for the
42
+ * inbox instruction. A participant told to check an inbox it can never receive into would stall,
43
43
  * so no addressed recipient means no instruction. */
44
- export declare function inboxRecipientFor(commsEmail: LabCommsEmail, participantId: string): LabCommsRecipient | undefined;
45
- /** True when a participant has a declared comms recipient WITH an address, so the drain can actually match the
44
+ export declare function inboxRecipientFor(commsEmail: StudyCommsEmail, participantId: string): StudyCommsRecipient | undefined;
45
+ /** True when a participant has a declared comms recipient with an address, so the drain can actually match the
46
46
  * mail the persona will be told to read. Gates the inbox instruction to participants that can receive
47
- * mail — a participant told to check an inbox it can never receive into would just stall. */
48
- export declare function participantHasInboxRecipient(commsEmail: LabCommsEmail, participantId: string): boolean;
47
+ * mail; a participant told to check an inbox it can never receive into would just stall. */
48
+ export declare function participantHasInboxRecipient(commsEmail: StudyCommsEmail, participantId: string): boolean;
@@ -1,13 +1,13 @@
1
- import { recipientParticipantId } from "../../lab/parse/comms.js";
2
- /** The participant's addressed comms recipient, when one exists — the gate AND the address source for the
3
- * inbox instruction (#351). A participant told to check an inbox it can never receive into would stall,
1
+ import { recipientParticipantId } from "../../study/parse/comms.js";
2
+ /** The participant's addressed comms recipient, when one exists: the gate and the address source for the
3
+ * inbox instruction. A participant told to check an inbox it can never receive into would stall,
4
4
  * so no addressed recipient means no instruction. */
5
5
  export function inboxRecipientFor(commsEmail, participantId) {
6
6
  return (commsEmail.recipients ?? []).find((recipient) => recipientParticipantId(recipient) === participantId && recipient.address !== undefined);
7
7
  }
8
- /** True when a participant has a declared comms recipient WITH an address, so the drain can actually match the
8
+ /** True when a participant has a declared comms recipient with an address, so the drain can actually match the
9
9
  * mail the persona will be told to read. Gates the inbox instruction to participants that can receive
10
- * mail — a participant told to check an inbox it can never receive into would just stall. */
10
+ * mail; a participant told to check an inbox it can never receive into would just stall. */
11
11
  export function participantHasInboxRecipient(commsEmail, participantId) {
12
12
  return inboxRecipientFor(commsEmail, participantId) !== undefined;
13
13
  }
@@ -11,12 +11,12 @@ export declare function makeParticipantWriteScreenshot(artifactRoot: PreparedOut
11
11
  export declare function runCuaParticipant(spec: DesktopParticipantRun, deps: CuaParticipantDeps): Promise<ParticipantRunOutcome>;
12
12
  /**
13
13
  * Run N>1 E2B participants with bounded concurrency, a pipeline gate (the first provisions
14
- * before the rest start), and session fail-fast on HARNESS errors only (queued participants
14
+ * before the rest start), and session fail-fast on harness errors only (queued participants
15
15
  * become `blocked` with a pinned reason + a fail-fast event; mission verdicts never trip it).
16
- * Each participant tears down ITS OWN sandbox by id; nothing here ever enumerates.
16
+ * Each participant tears down its own sandbox by id; nothing here ever enumerates.
17
17
  *
18
- * Exported for the #342 total-runner tests: the injectable runner lets a test make one participant
19
- * THROW (the exact class the guard exists for) without a live sandbox. Production always uses
18
+ * Exported for the total-runner tests: the injectable runner lets a test make one participant
19
+ * throw (the exact class the guard exists for) without a live sandbox. Production always uses
20
20
  * the default.
21
21
  */
22
22
  export declare function runCuaParticipants(runs: DesktopParticipantRun[], deps: Omit<CuaParticipantDeps, "signalProvisioned">, concurrency: number, runParticipant?: typeof runCuaParticipant): Promise<{