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
@@ -5,16 +5,16 @@ import { type CuaSubjectProvenanceArg, type ParticipantRunOutcome } from "./type
5
5
  /** The human-readable state story appended to the provenance event (and review.md via it). */
6
6
  export declare function describeSubjectState(state: RunSubjectProvenance["state"], dryRun: boolean): string;
7
7
  /**
8
- * Feedback candidates derived from what LIVE participants actually reported (#392).
8
+ * Feedback candidates derived from what live participants actually reported.
9
9
  *
10
- * A live run's feedback draft used to fall through to a dry-run template, because no browser route
11
- * ever built a candidate. The candidate worth filing is the one the study produced: a participant
10
+ * A live run's feedback draft comes from these candidates, never from a dry-run template. The
11
+ * candidate worth filing is the one the study produced: a participant
12
12
  * who reported friction on the way (the most valuable thing a run captures), or one who stopped
13
- * trying. A clean pass files nothing here — feedback exists to carry findings, and a run without
14
- * any falls back to an honest live summary in the draft layer instead of a template.
13
+ * trying. A clean pass files nothing here: feedback exists to carry findings, and a run without
14
+ * any falls back to a live summary in the draft layer instead of a template.
15
15
  *
16
- * Everything quoted is already scrub+redacted — participant messages and `session.reason` pass
17
- * through redactNarration in the loop — and passes redactText again here as defense-in-depth.
16
+ * Everything quoted is already scrub+redacted (participant messages and `session.reason` pass
17
+ * through redactNarration in the loop) and passes redactText again here as defense-in-depth.
18
18
  */
19
19
  export declare function participantFeedbackCandidates(args: {
20
20
  runId: string;
@@ -34,8 +34,8 @@ export declare function participantFeedbackCandidates(args: {
34
34
  commsArtifactPath?: string;
35
35
  }>;
36
36
  }): RunFeedbackCandidate[];
37
- /** Human-readable provenance line for the single-participant subject.provenance event (invariant 5):
38
- * claims "cloned/packed and served" ONLY when it actually happened. */
37
+ /** Human-readable provenance line for the single-participant subject.provenance event:
38
+ * claims "cloned/packed and served" only when it actually happened. */
39
39
  export declare function subjectProvenanceMessage(provenance: CuaSubjectProvenanceArg, publicAppUrl: string, dryRun: boolean, hasSession: boolean): string;
40
40
  export declare function providerResourcesForOutcome(args: {
41
41
  outcome: ParticipantRunOutcome | undefined;
@@ -8,15 +8,16 @@ import {} from "../../run/bundle.js";
8
8
  import { participantResourceIds } from "../../run/participant-records.js";
9
9
  import { resolveSelfReportedFriction } from "./self-report.js";
10
10
  import {} from "./types.js";
11
+ import { plural } from "../../run/text.js";
11
12
  /** The human-readable state story appended to the provenance event (and review.md via it). */
12
13
  export function describeSubjectState(state, dryRun) {
13
14
  switch (state.provenance) {
14
15
  case "seeded":
15
- return `seeded (${state.seed?.length ?? 0} step(s): ${(state.seed ?? []).map((record) => record.name).join(", ")})`;
16
+ return `seeded (${plural(state.seed?.length ?? 0, "step")}: ${(state.seed ?? []).map((record) => record.name).join(", ")})`;
16
17
  case "unpinned":
17
- return `UNPINNED (external: ${(state.externalEnvNames ?? []).join(", ")})`;
18
+ return `unpinned (external: ${(state.externalEnvNames ?? []).join(", ")})`;
18
19
  case "declared-not-run":
19
- return `declared, not run (${dryRun ? "dry-run contract" : "provisioning did not complete"})`;
20
+ return `declared, not run (${dryRun ? "dry run" : "provisioning did not complete"})`;
20
21
  case "undeclared":
21
22
  return "undeclared";
22
23
  case "external-public":
@@ -24,16 +25,16 @@ export function describeSubjectState(state, dryRun) {
24
25
  }
25
26
  }
26
27
  /**
27
- * Feedback candidates derived from what LIVE participants actually reported (#392).
28
+ * Feedback candidates derived from what live participants actually reported.
28
29
  *
29
- * A live run's feedback draft used to fall through to a dry-run template, because no browser route
30
- * ever built a candidate. The candidate worth filing is the one the study produced: a participant
30
+ * A live run's feedback draft comes from these candidates, never from a dry-run template. The
31
+ * candidate worth filing is the one the study produced: a participant
31
32
  * who reported friction on the way (the most valuable thing a run captures), or one who stopped
32
- * trying. A clean pass files nothing here — feedback exists to carry findings, and a run without
33
- * any falls back to an honest live summary in the draft layer instead of a template.
33
+ * trying. A clean pass files nothing here: feedback exists to carry findings, and a run without
34
+ * any falls back to a live summary in the draft layer instead of a template.
34
35
  *
35
- * Everything quoted is already scrub+redacted — participant messages and `session.reason` pass
36
- * through redactNarration in the loop — and passes redactText again here as defense-in-depth.
36
+ * Everything quoted is already scrub+redacted (participant messages and `session.reason` pass
37
+ * through redactNarration in the loop) and passes redactText again here as defense-in-depth.
37
38
  */
38
39
  export function participantFeedbackCandidates(args) {
39
40
  const candidates = [];
@@ -59,8 +60,8 @@ export function participantFeedbackCandidates(args) {
59
60
  persona_id: participant.personaId,
60
61
  actor: "computer-use",
61
62
  substrate: args.substrate,
62
- // The participant is reporting on the PRODUCT: friction and abandonment are target-app
63
- // findings by the three-roles rule. A harness failure never reaches this builder — it is
63
+ // The participant is reporting on the product: friction and abandonment are target-app
64
+ // findings by the three-roles rule. A harness failure never reaches this builder; it is
64
65
  // not a participant report.
65
66
  failure_owner: "target-app",
66
67
  summary,
@@ -103,18 +104,18 @@ export function participantFeedbackCandidates(args) {
103
104
  proposed_next_state: "study-quality-review",
104
105
  acceptance_proof: [
105
106
  feedbackProofCommands(args.runId).verify,
106
- feedbackProofCommands(args.runId).watch,
107
+ feedbackProofCommands(args.runId).observe,
107
108
  ],
108
109
  });
109
110
  }
110
111
  return candidates;
111
112
  }
112
- /** Human-readable provenance line for the single-participant subject.provenance event (invariant 5):
113
- * claims "cloned/packed and served" ONLY when it actually happened. */
113
+ /** Human-readable provenance line for the single-participant subject.provenance event:
114
+ * claims "cloned/packed and served" only when it actually happened. */
114
115
  export function subjectProvenanceMessage(provenance, publicAppUrl, dryRun, hasSession) {
115
116
  if (provenance.source === "clone") {
116
117
  if (dryRun) {
117
- return `Subject declared: clone of ${provenance.repo}, to be served at ${publicAppUrl} in-sandbox (dry-run contract; nothing cloned)`;
118
+ return `Subject declared: clone of ${provenance.repo}, to be served at ${publicAppUrl} in-sandbox (dry run; nothing cloned)`;
118
119
  }
119
120
  if (provenance.commit) {
120
121
  return hasSession
@@ -124,7 +125,7 @@ export function subjectProvenanceMessage(provenance, publicAppUrl, dryRun, hasSe
124
125
  return `Subject clone attempted from ${provenance.repo}; commit unresolved (provisioning failed before resolution)`;
125
126
  }
126
127
  if (dryRun) {
127
- return `Subject declared: local working tree, to be packed and served at ${publicAppUrl} in-sandbox (dry-run contract; nothing packed)`;
128
+ return `Subject declared: local working tree, to be packed and served at ${publicAppUrl} in-sandbox (dry run; nothing packed)`;
128
129
  }
129
130
  if (provenance.archiveSha256) {
130
131
  const dirtyLabel = provenance.dirty === true
@@ -1,5 +1,5 @@
1
1
  import type { CuaActorDescriptor } from "../../actors/registry.js";
2
- import type { ComputerUsePlan } from "../../lab/plan-types.js";
2
+ import type { ComputerUsePlan } from "../../study/plan-types.js";
3
3
  import type { BundleRun, RunBundle, RunRerunLineage } from "../../run/bundle.js";
4
4
  import { type Judgment } from "../../run/judge.js";
5
5
  import type { CuaParticipantPlan, DesktopParticipantRun, CuaSubjectProjection, CuaSubjectProvenanceArg, ParticipantRunOutcome } from "./types.js";
@@ -20,7 +20,7 @@ export interface CuaRunBundleBase {
20
20
  /**
21
21
  * The judgment for the current state of a computer-use run, by the rule for its shape: one
22
22
  * participant (its tallied status is the verdict) or several (every participant must pass). The bundle's
23
- * verdict and the lab result's ok both come from it.
23
+ * verdict and the study result's ok both come from it.
24
24
  */
25
25
  export declare function judgeComputerUseRun(base: Pick<CuaRunBundleBase, "participantRuns" | "rerun">, state: {
26
26
  dryRun: boolean;
@@ -2,13 +2,14 @@
2
2
  // and buildCuaRunBundle sends it to the single-participant or the fan-out builder with that
3
3
  // shape's arguments. renderCuaReviewMarkdown writes review.md. shared-world/bundle.ts holds the
4
4
  // same for that route.
5
- import { judgeOneParticipant, judgeParticipants } from "../../run/judge.js";
5
+ import { judgeOneParticipant, judgeParticipants, verdictText, } from "../../run/judge.js";
6
6
  import { desktopSpanToMinutes } from "../../run/cost-summary.js";
7
7
  import { e2bDesktopTemplate } from "../../substrates/e2b/sandbox.js";
8
8
  import { providerResourcesForOutcome } from "./bundle-parts.js";
9
9
  import { participantFactsOf } from "./participant-facts.js";
10
10
  import { buildCuaFanoutBundle } from "./fanout-bundle.js";
11
11
  import { buildSingleParticipantBundle } from "./single-bundle.js";
12
+ import { plural } from "../../run/text.js";
12
13
  /** One participant without a rerun keeps the single-participant bundle shape and its rule. */
13
14
  function isOneParticipantRun(base) {
14
15
  return base.participantRuns.length === 1 && base.rerun === undefined;
@@ -16,7 +17,7 @@ function isOneParticipantRun(base) {
16
17
  /**
17
18
  * The judgment for the current state of a computer-use run, by the rule for its shape: one
18
19
  * participant (its tallied status is the verdict) or several (every participant must pass). The bundle's
19
- * verdict and the lab result's ok both come from it.
20
+ * verdict and the study result's ok both come from it.
20
21
  */
21
22
  export function judgeComputerUseRun(base, state) {
22
23
  const inProgress = state.inProgress === true;
@@ -84,8 +85,8 @@ function singleParticipantArgs(base, state) {
84
85
  ? {}
85
86
  : { caseGroup: spec.planned.labels.caseGroup }),
86
87
  dryRun: state.dryRun,
87
- labId: plan.labId,
88
- ...(plan.title ? { labTitle: plan.title } : {}),
88
+ studyId: plan.studyId,
89
+ ...(plan.title ? { studyTitle: plan.title } : {}),
89
90
  mission: spec.evidenceInstructions ?? spec.instructions,
90
91
  ...(spec.evidenceAssignment === undefined ? {} : { assignment: spec.evidenceAssignment }),
91
92
  persona: spec.persona,
@@ -157,17 +158,17 @@ export function renderCuaReviewMarkdown(bundle) {
157
158
  "",
158
159
  `- run: ${bundle.runId}`,
159
160
  `- mode: ${bundle.mode}`,
160
- `- run gate: ${bundle.review.verdict}`,
161
+ `- run gate: ${verdictText(bundle.review.verdict, bundle.mode)}`,
161
162
  `- summary: ${bundle.review.summary}`,
162
163
  ...(provenance ? [`- subject: ${provenance.message}`] : []),
163
164
  ...(trace
164
165
  ? [
165
166
  `- actor: ${trace.provider} (${trace.lane}/${trace.protocol})`,
166
- // Honest count: name the trace's actual screenshot mode ("raw" | "blurred"); say
167
+ // Name the trace's actual screenshot mode ("raw" | "blurred"); say
167
168
  // nothing when no frames exist ("n/a") rather than claim a redaction that never ran.
168
- `- evidence: ${trace.items.length} trace item(s), ${trace.counts.screenshots ?? 0} ${trace.redaction.screenshots === "raw" || trace.redaction.screenshots === "blurred"
169
- ? `${trace.redaction.screenshots} screenshot(s)`
170
- : "screenshot(s)"}`,
169
+ `- evidence: ${plural(trace.items.length, "trace item")}, ${plural(trace.counts.screenshots ?? 0, trace.redaction.screenshots === "raw" || trace.redaction.screenshots === "blurred"
170
+ ? `${trace.redaction.screenshots} screenshot`
171
+ : "screenshot")}`,
171
172
  ]
172
173
  : []),
173
174
  ...(bundle.review.gaps.length > 0
@@ -1,12 +1,12 @@
1
1
  import { type OriginMap } from "../../../comms/capture-surface.js";
2
2
  import { type DeployedCommsCatch } from "../../../comms/sandbox-catch.js";
3
- import type { LabCommsEmail, LabConfig } from "../../../lab/types.js";
3
+ import type { StudyCommsEmail, StudyConfig } from "../../../study/types.js";
4
4
  import type { Shell } from "../../../substrates/shell.js";
5
5
  import type { ReadyParticipantDesktop } from "../participant-desktop.js";
6
6
  import { type E2BDesktopDeps, type DesktopParticipantRun } from "../types.js";
7
7
  /** A participant's captured-email wiring, decided from config before the sandbox exists. */
8
8
  export interface ParticipantComms {
9
- readonly email: LabCommsEmail;
9
+ readonly email: StudyCommsEmail;
10
10
  readonly port: number;
11
11
  readonly smtpPort: number | undefined;
12
12
  /** The loopback URL the persona opens to read captured mail. */
@@ -19,10 +19,10 @@ export interface ParticipantComms {
19
19
  }
20
20
  /**
21
21
  * On an in-sandbox subject route, redirect the app's email-API sends into an in-sandbox catch
22
- * (loopback) so its verification mail is CAPTURED, not sent to the internet. Undefined when the
23
- * lab declares no fake email, which leaves the participant unchanged.
22
+ * (loopback) so its verification mail is captured instead of sent to the internet. Undefined when the
23
+ * study declares no fake email, which leaves the participant unchanged.
24
24
  */
25
- export declare function planParticipantComms(comms: LabConfig["comms"], serveUrl: string | undefined, targetUrl: string, inSandboxSubject: boolean): ParticipantComms | undefined;
25
+ export declare function planParticipantComms(comms: StudyConfig["comms"], serveUrl: string | undefined, targetUrl: string, inSandboxSubject: boolean): ParticipantComms | undefined;
26
26
  /** The env the subject app reads to reach the catch, injected at sandbox create so it boots with it. */
27
27
  export declare function participantCommsEnv(comms: ParticipantComms | undefined): Record<string, string>;
28
28
  /** A started catch and the stop for its inbox-surface loop. */
@@ -33,7 +33,7 @@ export interface RunningCommsCatch {
33
33
  }
34
34
  /**
35
35
  * Start the in-sandbox email catch before the subject serve, so the app's send-API base URL
36
- * resolves the moment it boots. A comms-declared lab that cannot stand the catch up fails closed
36
+ * resolves the moment it boots. A comms-declared study that cannot stand the catch up fails closed
37
37
  * rather than silently sending real mail.
38
38
  */
39
39
  export declare function startCommsCatch(shell: Shell, comms: ParticipantComms, requestTimeoutMs: number): Promise<RunningCommsCatch>;
@@ -1,4 +1,4 @@
1
- // Off-app email for one E2B desktop participant (#297): the in-sandbox catch the subject app sends to, the
1
+ // Off-app email for one E2B desktop participant: the in-sandbox catch the subject app sends to, the
2
2
  // persona's inbox surface, the real-email receiving surface, and the evidence drained at teardown.
3
3
  import { setTimeout as delay } from "node:timers/promises";
4
4
  import { buildOriginMap } from "../../../comms/capture-surface.js";
@@ -9,14 +9,15 @@ import { redactText, toErrorMessage } from "../../../evidence/redaction.js";
9
9
  import { writeContainedOutputFile } from "../../../run/contained-output.js";
10
10
  import { inboxRecipientFor, participantHasInboxRecipient } from "../participant-desktop.js";
11
11
  import { participantServeUrl } from "../types.js";
12
- import { addressedRecipients } from "../../../lab/parse/comms.js";
12
+ import { addressedRecipients } from "../../../study/parse/comms.js";
13
+ import { plural } from "../../../run/text.js";
13
14
  /** Mid-run inbox-surface render cadence (ms). Coarse enough that the per-tick `cat` + file writes stay
14
15
  * cheap; fine enough that a verification email is visible seconds after the app sends it. */
15
16
  const INBOX_SURFACE_CADENCE_MS = 2500;
16
17
  /**
17
18
  * On an in-sandbox subject route, redirect the app's email-API sends into an in-sandbox catch
18
- * (loopback) so its verification mail is CAPTURED, not sent to the internet. Undefined when the
19
- * lab declares no fake email, which leaves the participant unchanged.
19
+ * (loopback) so its verification mail is captured instead of sent to the internet. Undefined when the
20
+ * study declares no fake email, which leaves the participant unchanged.
20
21
  */
21
22
  export function planParticipantComms(comms, serveUrl, targetUrl, inSandboxSubject) {
22
23
  const email = inSandboxSubject && comms?.email?.kind === "fake" ? comms.email : undefined;
@@ -42,7 +43,7 @@ export function planParticipantComms(comms, serveUrl, targetUrl, inSandboxSubjec
42
43
  export function participantCommsEnv(comms) {
43
44
  if (comms === undefined)
44
45
  return {};
45
- // injectEnv is absent on an adopter-hosted plane (#328): there is no subject env to inject
46
+ // injectEnv is absent on an adopter-hosted plane: there is no subject env to inject
46
47
  // because the operator points their own app at their own catch.
47
48
  const env = comms.email.injectEnv === undefined
48
49
  ? {}
@@ -63,7 +64,7 @@ export function participantCommsEnv(comms) {
63
64
  }
64
65
  /**
65
66
  * Start the in-sandbox email catch before the subject serve, so the app's send-API base URL
66
- * resolves the moment it boots. A comms-declared lab that cannot stand the catch up fails closed
67
+ * resolves the moment it boots. A comms-declared study that cannot stand the catch up fails closed
67
68
  * rather than silently sending real mail.
68
69
  */
69
70
  export async function startCommsCatch(shell, comms, requestTimeoutMs) {
@@ -75,23 +76,23 @@ export async function startCommsCatch(shell, comms, requestTimeoutMs) {
75
76
  if (!deployed.ready) {
76
77
  throw new Error(`comms email catch did not become ready on 127.0.0.1:${comms.port} in the subject sandbox`);
77
78
  }
78
- // Write the EMPTY inbox once up front so the persona's /inbox always resolves to the "No messages
79
- // yet." page — never a bare 404 — the instant it navigates there, even before any mail arrives OR if
79
+ // Write the empty inbox once up front so the persona's /inbox always resolves to the "No messages
80
+ // yet." page (never a bare 404) the instant it navigates there, even before any mail arrives or if
80
81
  // the app sends to an address no declared recipient matches (the loop only re-renders on new mail).
81
82
  await writeInboxSurface(shell, deployed.surfaceDir, [], {
82
83
  originMap: comms.originMap,
83
84
  requestTimeoutMs,
84
85
  });
85
- // The surface uses its OWN FakeInbox + cursor, independent of the teardown evidence drain (two
86
- // readers of the append-only NDJSON — no double-count).
86
+ // The surface uses its own FakeInbox + cursor, independent of the teardown evidence drain (two
87
+ // readers of the append-only NDJSON, so no double-count).
87
88
  const stop = new AbortController();
88
89
  let renderedCount = 0;
89
90
  const loop = (async () => {
90
91
  // Render-first (so even a short session gets a populated inbox), then refresh on a cadence. The
91
- // cadence uses a REAL timer, NOT the injected instant clock: this loop is unbounded, so an instant
92
+ // cadence uses a real timer instead of the injected instant clock: this loop is unbounded, so an instant
92
93
  // sleep would busy-spin and starve the session's own timers. `stop` interrupts the wait
93
94
  // (and clears the timer) so teardown never blocks for a full cadence. Each refresh
94
- // is a full, idempotent rebuild; `renderedCount` only advances on a SUCCESSFUL render so a
95
+ // is a full, idempotent rebuild; `renderedCount` only advances on a successful render so a
95
96
  // transient failure retries cleanly (no duplicate emails).
96
97
  for (;;) {
97
98
  try {
@@ -200,19 +201,19 @@ export async function drainCommsEvidence(args) {
200
201
  return path;
201
202
  }
202
203
  if (collected.captured > 0) {
203
- // Captured mail that matched no declared recipient must not vanish silently (invariant 6:
204
- // honest signals): tell the operator to declare comms.email.recipients[].address to match
204
+ // Captured mail that matched no declared recipient must not vanish silently: tell the
205
+ // operator to declare comms.email.recipients[].address to match
205
206
  // the address the app actually sends to (e.g. the one the persona surface will sign up with).
206
- warnings.push(`Comms catch captured ${collected.captured} email send(s) but none matched a declared recipient inbox — no comms evidence written. Declare comms.email.recipients[].address to match the address the app sends to.`);
207
+ warnings.push(`The email catch captured ${plural(collected.captured, "email send")}, but none matched a declared recipient inbox, so no email evidence was written. Set comms.email.recipients[].address to the address the app sends to.`);
207
208
  }
208
209
  else {
209
- // Zero captures is the silent-broken shape (#351): the app never posted to the catch at
210
+ // Zero captures is the silent-broken shape: the app never posted to the catch at
210
211
  // all, so the personas stared at an empty inbox. Most common cause: the app does not
211
212
  // actually read the declared injectEnv var for its email API base URL.
212
213
  const transportHint = comms.email.smtp
213
214
  ? `Verify the app reads ${comms.email.smtp.hostEnv}/${comms.email.smtp.portEnv} for its SMTP host and port`
214
215
  : `Verify the app reads ${comms.email.injectEnv} for its email API base URL (an SDK that ignores it sends real mail or throws)`;
215
- warnings.push(`Comms catch captured ZERO email sends — the app never delivered mail through the catch. ${transportHint} and that the flow reached an email step.`);
216
+ warnings.push(`The email catch captured no email sends: the app never delivered mail through it. ${transportHint} and that the flow reached an email step.`);
216
217
  }
217
218
  }
218
219
  catch (error) {
@@ -15,7 +15,7 @@ export function createE2BParticipantDesktop(spec, deps, warnings) {
15
15
  warnings,
16
16
  targetUrl,
17
17
  desktopCliRoute: deps.subject.kind === "desktop-cli",
18
- // Off-app comms (#297): gated entirely on config.comms; no comms declared, no change.
18
+ // Off-app comms: gated entirely on config.comms; no comms declared, no change.
19
19
  comms: planParticipantComms(deps.residual.comms, participantServeUrl(deps.subject), targetUrl, deps.subject.kind === "clone" || deps.subject.kind === "local-tree"),
20
20
  // The default or injected sink sees every event, started and completed alike, so an operator
21
21
  // watching stderr sees both halves of each phase; the state keeps only completed ones.
@@ -23,9 +23,9 @@ export function createE2BParticipantDesktop(spec, deps, warnings) {
23
23
  if (event.ok !== undefined)
24
24
  state.phaseRecords.push(event);
25
25
  deps.reportSubjectPhase(event, {
26
- laneId: spec.planned.id,
27
- laneIndex: spec.planned.index,
28
- laneCount: deps.participantCount,
26
+ id: spec.planned.id,
27
+ index: spec.planned.index,
28
+ count: deps.participantCount,
29
29
  });
30
30
  },
31
31
  };
@@ -1,4 +1,4 @@
1
- import type { ResidualConfig } from "../../../lab/plan-types.js";
1
+ import type { ResidualConfig } from "../../../study/plan-types.js";
2
2
  import type { RunDesktopGeometry } from "../../../run/streams.js";
3
3
  import type { DesktopBrowserFamily, DesktopBrowserLaunchIdentity } from "../../../substrates/e2b/desktop-browser.js";
4
4
  import { makeChromeBrowserStateObserver } from "../../../substrates/e2b/desktop-cdp.js";
@@ -19,7 +19,8 @@ export declare function mobileLaunchFlags(residual: Readonly<ResidualConfig>, sp
19
19
  * observation. A request that cannot be applied fails the participant closed with the reason. Only
20
20
  * participants on a mobile preset are emulated: a run-wide flag must not hand a desktop or tablet
21
21
  * participant an iPhone user agent (the first live proof did exactly that to the desktop newcomer
22
- * beside the phone participant). Those participants carry no fidelity block, which is honest.
22
+ * beside the phone participant). Those participants carry no fidelity block, since nothing was
23
+ * emulated.
23
24
  */
24
25
  export declare function applyParticipantMobileFidelity(args: {
25
26
  desktop: E2BDesktopSandbox;
@@ -44,8 +45,8 @@ export declare function participantBrowserStateObserver(args: {
44
45
  }): ReturnType<typeof makeChromeBrowserStateObserver>;
45
46
  /**
46
47
  * The participant's final browser geometry, measured while the sandbox is alive. A final capture that
47
- * measured EITHER field wins whole, so a partial final capture omits fields the launch-time capture
48
- * had (honest omission); only a final capture that measured NOTHING falls back to the launch-time
48
+ * measured either field wins whole, so a partial final capture omits fields the launch-time capture
49
+ * had; only a final capture that measured nothing falls back to the launch-time
49
50
  * capture. Also reads the emulation holder's log into the fidelity block.
50
51
  */
51
52
  export declare function finalParticipantGeometry(args: {
@@ -1,5 +1,5 @@
1
- // Device fidelity for one E2B desktop participant: mobile emulation beyond viewport size (#221), the
2
- // browser-state observer that watches it for drift (#623), and the final browser geometry.
1
+ // Device fidelity for one E2B desktop participant: mobile emulation beyond viewport size, the
2
+ // browser-state observer that watches it for drift, and the final browser geometry.
3
3
  import { redactText, toErrorMessage } from "../../../evidence/redaction.js";
4
4
  import { readDetachedLog } from "../../../substrates/detached.js";
5
5
  import { applyMobileEmulation, DEFAULT_MOBILE_USER_AGENT, makeChromeBrowserStateObserver, } from "../../../substrates/e2b/desktop-cdp.js";
@@ -28,7 +28,8 @@ function cdpEndpoint(identity, targetUrl) {
28
28
  * observation. A request that cannot be applied fails the participant closed with the reason. Only
29
29
  * participants on a mobile preset are emulated: a run-wide flag must not hand a desktop or tablet
30
30
  * participant an iPhone user agent (the first live proof did exactly that to the desktop newcomer
31
- * beside the phone participant). Those participants carry no fidelity block, which is honest.
31
+ * beside the phone participant). Those participants carry no fidelity block, since nothing was
32
+ * emulated.
32
33
  */
33
34
  export async function applyParticipantMobileFidelity(args) {
34
35
  const { spec, deps } = args;
@@ -63,10 +64,10 @@ export function participantBrowserStateObserver(args) {
63
64
  return makeChromeBrowserStateObserver(args.desktop, deps.requestTimeoutMs, cdpEndpoint(args.launchIdentity, args.targetUrl), {
64
65
  targetId: args.targetId,
65
66
  // Once per participant: a dark observation channel is a gap in the instrument, and the
66
- // funnel's NEVER MEASURED count needs this line to explain itself (#514).
67
+ // funnel's "never measured" count needs this line to explain itself.
67
68
  onUnavailable: (reason) => {
68
69
  warnings.push(`Browser-state observer unavailable for participant ${spec.planned.id} (${redactText(deps.scrubKnownValues(reason))}); ` +
69
- "urlIncludes/urlPathEquals/textIncludes stop conditions and task criteria are NOT being measured this session.");
70
+ "urlIncludes, urlPathEquals and textIncludes stop conditions and task criteria are not measured in this session.");
70
71
  },
71
72
  drift: fidelity.emulatedTargetId === undefined
72
73
  ? undefined
@@ -75,11 +76,11 @@ export function participantBrowserStateObserver(args) {
75
76
  expectedWidth: spec.planned.device.preset.width,
76
77
  expectTouch: fidelity.applied?.requested.touch === true,
77
78
  onDrift: (reason) => {
78
- warnings.push(`Mobile emulation drift for participant ${spec.planned.id}: ${reason} (#623).`);
79
+ warnings.push(`Mobile emulation drift for participant ${spec.planned.id}: ${reason}.`);
79
80
  },
80
81
  onCovered: (coveredTargetId, read) => {
81
82
  // A later tab the page itself reported at the phone width: evidence that
82
- // the emulation followed the participant (#623), kept on the bundle.
83
+ // the emulation followed the participant, kept on the bundle.
83
84
  if (fidelity.applied === undefined)
84
85
  return;
85
86
  fidelity.applied = {
@@ -95,8 +96,8 @@ export function participantBrowserStateObserver(args) {
95
96
  }
96
97
  /**
97
98
  * The participant's final browser geometry, measured while the sandbox is alive. A final capture that
98
- * measured EITHER field wins whole, so a partial final capture omits fields the launch-time capture
99
- * had (honest omission); only a final capture that measured NOTHING falls back to the launch-time
99
+ * measured either field wins whole, so a partial final capture omits fields the launch-time capture
100
+ * had; only a final capture that measured nothing falls back to the launch-time
100
101
  * capture. Also reads the emulation holder's log into the fidelity block.
101
102
  */
102
103
  export async function finalParticipantGeometry(args) {
@@ -126,7 +127,7 @@ export async function finalParticipantGeometry(args) {
126
127
  ];
127
128
  warnings.push(...geometryWarnings);
128
129
  // The emulation holder's own log, after its announce line: which later targets it
129
- // attached to, what it sent, and any reply that came back as an error (#623). Read while
130
+ // attached to, what it sent, and any reply that came back as an error. Read while
130
131
  // the sandbox is alive; the first live proof had no way to say what the holder did.
131
132
  if (fidelity.applied !== undefined && fidelity.holderName !== undefined) {
132
133
  const holderLog = await readDetachedLog(e2bShell(desktop), fidelity.holderName, deps.requestTimeoutMs).catch(() => "");
@@ -1,6 +1,6 @@
1
1
  import { type E2BDesktopSandbox } from "../../../substrates/e2b/sdk.js";
2
2
  import type { E2BParticipantContext, E2BParticipantState } from "./state.js";
3
- export declare const CUA_ACTOR_LAB_PROVIDER_METADATA: {
3
+ export declare const CUA_ACTOR_STUDY_PROVIDER_METADATA: {
4
4
  readonly mode: "cua-actor-lab";
5
5
  readonly tool: "humanish";
6
6
  };
@@ -11,7 +11,7 @@ import { loadE2BDesktopModule } from "../../../substrates/e2b/sdk.js";
11
11
  import { e2bShell } from "../../../substrates/e2b/shell.js";
12
12
  import { attachReceivingInbox, participantCommsEnv, startCommsCatch } from "./comms.js";
13
13
  import { participantSubjectEnv } from "../types.js";
14
- export const CUA_ACTOR_LAB_PROVIDER_METADATA = {
14
+ export const CUA_ACTOR_STUDY_PROVIDER_METADATA = {
15
15
  mode: "cua-actor-lab",
16
16
  tool: "humanish",
17
17
  };
@@ -24,7 +24,7 @@ export async function acquireParticipantDesktop(ctx, state) {
24
24
  const { residual, env } = deps;
25
25
  const subjectEnvNames = participantSubjectEnv(deps.subject);
26
26
  const subjectEnvValues = residual.subject.envValues ?? {};
27
- // Off-app comms (#297): the base-URL env is injected at sandbox create, so the app reads it at
27
+ // Off-app comms: the base-URL env is injected at sandbox create, so the app reads it at
28
28
  // boot; the catch starts right after create.
29
29
  const commsEnv = participantCommsEnv(ctx.comms);
30
30
  const desktopModule = await (deps.desktopModule ?? loadE2BDesktopModule)();
@@ -37,12 +37,12 @@ export async function acquireParticipantDesktop(ctx, state) {
37
37
  requestTimeoutMs: deps.requestTimeoutMs,
38
38
  timeoutMs: deps.sandboxMs,
39
39
  metadata: {
40
- ...CUA_ACTOR_LAB_PROVIDER_METADATA,
41
- labId: deps.labId,
42
- simId: spec.recordId,
43
- laneId: spec.planned.id,
44
- laneIndex: String(spec.planned.index),
45
- laneCount: String(deps.participantCount),
40
+ ...CUA_ACTOR_STUDY_PROVIDER_METADATA,
41
+ labId: deps.studyId,
42
+ recordId: spec.recordId,
43
+ participantId: spec.planned.id,
44
+ participantIndex: String(spec.planned.index),
45
+ participantCount: String(deps.participantCount),
46
46
  },
47
47
  // The participant's model key never enters the sandbox (the model drives from outside).
48
48
  // The subject's declared env names are provisioned here on the clone route.
@@ -129,7 +129,7 @@ export async function verifyParticipantScreen(ctx, state, desktop) {
129
129
  state.desktopGeometry = { ...state.desktopGeometry, warnings: [screenGeometry.warning] };
130
130
  }
131
131
  if (screenGeometry.error && deps.screenMismatchPolicy !== "record-evidence") {
132
- state.failureCode = "HUMANISH_CUA_LAB_DEVICE_GEOMETRY";
132
+ state.failureCode = "HUMANISH_COMPUTER_USE_DEVICE_GEOMETRY";
133
133
  throw new Error(screenGeometry.error);
134
134
  }
135
135
  if (screenGeometry.error && screenGeometry.verified) {
@@ -149,7 +149,7 @@ export async function provisionParticipantSubject(ctx, state, desktop) {
149
149
  const { residual, subject } = deps;
150
150
  const shell = e2bShell(desktop);
151
151
  if (subject.kind === "desktop-cli") {
152
- // Prepare the runtime and any declared product install, UNKEYED. With install omitted,
152
+ // Prepare the runtime and any declared product install, with no keys. With install omitted,
153
153
  // the participant discovers and installs the product from its public surfaces.
154
154
  await provisionDesktopCli(shell, {
155
155
  product: subject.product.name,
@@ -47,17 +47,17 @@ export async function openParticipantSurface(ctx, state, desktop) {
47
47
  if (subject.kind === "desktop-cli") {
48
48
  // A terminal window, opened the way the browser is opened on every other route: the
49
49
  // participant arrives at a desktop with the thing they were asked to use already in front
50
- // of them. They can still open another from the dock — that is the point of a desktop.
50
+ // of them. They can still open another from the dock; that is the point of a desktop.
51
51
  await openDesktopTerminal(desktop, deps.requestTimeoutMs, subject.product.workdir);
52
52
  await desktop.wait(DESKTOP_SETTLE_MS).catch(() => undefined);
53
53
  return;
54
54
  }
55
55
  const requestedMedia = residual.execution?.desktop?.media;
56
- // A declared camera (#509) is in place before the browser starts: the feed is generated or
56
+ // A declared camera is in place before the browser starts: the feed is generated or
57
57
  // uploaded first, and a feed that cannot be produced fails the participant closed here.
58
58
  const mediaEvidence = requestedMedia === undefined
59
59
  ? undefined
60
- : await prepareDesktopMedia(desktop, requestedMedia, residual.policies?.mediaPermission ?? "prompt", deps.labCwd, deps.requestTimeoutMs);
60
+ : await prepareDesktopMedia(desktop, requestedMedia, residual.policies?.mediaPermission ?? "prompt", deps.studyCwd, deps.requestTimeoutMs);
61
61
  const emulationFlags = mobileLaunchFlags(residual, spec);
62
62
  const browserLaunch = await openDesktopBrowserTarget(desktop, targetUrl, deps.requestTimeoutMs, residual.execution?.desktop?.browser, [...emulationFlags, ...(mediaEvidence?.flags ?? [])], state.speech?.env ?? state.recording?.env);
63
63
  state.desktopBrowser =
@@ -76,7 +76,7 @@ export async function openParticipantSurface(ctx, state, desktop) {
76
76
  state.browserLaunched = true;
77
77
  noteDevToolsReadiness(ctx, browserLaunch.devTools, emulationFlags.length > 0);
78
78
  await desktop.wait(DESKTOP_SETTLE_MS).catch(() => undefined);
79
- // Mobile fidelity (#221) is applied outside startParticipantStream's best-effort catch, so a request
79
+ // Mobile fidelity is applied outside startParticipantStream's best-effort catch, so a request
80
80
  // that cannot be applied fails the participant closed.
81
81
  state.fidelity = await applyParticipantMobileFidelity({
82
82
  desktop,
@@ -91,7 +91,7 @@ export async function openParticipantSurface(ctx, state, desktop) {
91
91
  }
92
92
  /**
93
93
  * DevTools answering later than this after launch is recorded as a warning on the participant. Six live
94
- * launches answered in 4.8-7.7 s; the reads this wait now guards used to give up at about 11 s.
94
+ * launches answered in 4.8-7.7 s; without this wait the reads it guards give up at about 11 s.
95
95
  */
96
96
  const SLOW_DEVTOOLS_MS = 10_000;
97
97
  /**
@@ -172,7 +172,7 @@ export async function startParticipantStream(ctx, state, desktop) {
172
172
  type: "ready",
173
173
  participantId: spec.planned.id,
174
174
  sandboxId: desktop.sandboxId,
175
- simId: spec.recordId,
175
+ recordId: spec.recordId,
176
176
  streamId: spec.streamId,
177
177
  url: candidateStreamUrl,
178
178
  });
@@ -188,7 +188,7 @@ export async function startParticipantStream(ctx, state, desktop) {
188
188
  // never a participant finding about missing controls. Both computer-use and shared-world participants
189
189
  // use this route.
190
190
  if (state.initialBrowserGeometry?.unusable !== undefined) {
191
- state.failureCode = "HUMANISH_CUA_LAB_DEVICE_GEOMETRY";
191
+ state.failureCode = "HUMANISH_COMPUTER_USE_DEVICE_GEOMETRY";
192
192
  throw new Error(`${state.failureCode}: ${state.initialBrowserGeometry.unusable} Participant actions were not started.`);
193
193
  }
194
194
  }
@@ -12,7 +12,7 @@ import type { E2BDesktopSandbox } from "../../../substrates/e2b/sdk.js";
12
12
  import type { ParticipantDesktopEvidence } from "../participant-desktop.js";
13
13
  import type { ParticipantComms, RunningCommsCatch } from "./comms.js";
14
14
  import type { ParticipantFidelity } from "./fidelity.js";
15
- import type { CuaActorLabErrorCode, E2BDesktopDeps, DesktopParticipantRun, SandboxReleaseFact } from "../types.js";
15
+ import type { CuaActorStudyErrorCode, E2BDesktopDeps, DesktopParticipantRun, SandboxReleaseFact } from "../types.js";
16
16
  /** What every step of one participant reads: its spec, the run's dependencies and where it points. */
17
17
  export interface E2BParticipantContext {
18
18
  readonly spec: DesktopParticipantRun;
@@ -38,7 +38,7 @@ export interface E2BParticipantState {
38
38
  desktopResources: DesktopResourceObservation | undefined;
39
39
  released: boolean;
40
40
  sandboxRelease: SandboxReleaseFact | undefined;
41
- failureCode: CuaActorLabErrorCode | undefined;
41
+ failureCode: CuaActorStudyErrorCode | undefined;
42
42
  commsCatch: RunningCommsCatch | undefined;
43
43
  commsArtifactPath: string | undefined;
44
44
  receivingInboxUrl: string | undefined;
@@ -145,14 +145,14 @@ export async function finishE2BDesktop(ctx, state, failed) {
145
145
  state.sandboxTornDownAtMs = deps.now();
146
146
  // The participant's live stream is now a dead page whichever teardown path ran (released, kept, or
147
147
  // release-failed-awaiting-TTL); tell the watch overlay so the tile falls back to recorded
148
- // evidence instead of "sandbox not found" (#357). Guarded: a viewer callback must never
148
+ // evidence instead of "sandbox not found". Guarded: a viewer callback must never
149
149
  // break teardown.
150
150
  if (state.streamUrl !== undefined) {
151
151
  try {
152
152
  await deps.onStream({
153
153
  type: "ended",
154
154
  participantId: spec.planned.id,
155
- simId: spec.recordId,
155
+ recordId: spec.recordId,
156
156
  streamId: spec.streamId,
157
157
  });
158
158
  }