humanish 0.107.0 → 0.108.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 (521) hide show
  1. package/ARCHITECTURE.md +22 -17
  2. package/CHANGELOG.md +14 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +145 -172
  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-ui.js +1 -1
  14. package/dist/actors/codex/codex-admission.d.ts +91 -0
  15. package/dist/actors/codex/codex-admission.js +150 -0
  16. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  17. package/dist/actors/codex/restricted-executable.js +8 -8
  18. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  19. package/dist/actors/codex/restricted-launch.js +1 -1
  20. package/dist/actors/codex/restricted-participant.js +8 -6
  21. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  22. package/dist/actors/codex/restricted-policy.js +2 -2
  23. package/dist/actors/codex/restricted-session.d.ts +2 -2
  24. package/dist/actors/codex/restricted-session.js +10 -5
  25. package/dist/actors/computer-use/actor.d.ts +16 -16
  26. package/dist/actors/computer-use/actor.js +2 -2
  27. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  28. package/dist/actors/computer-use/admission-limit.js +1 -1
  29. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  30. package/dist/actors/computer-use/loop/actions.js +10 -10
  31. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  32. package/dist/actors/computer-use/loop/backstop.js +14 -12
  33. package/dist/actors/computer-use/loop/ending.d.ts +5 -5
  34. package/dist/actors/computer-use/loop/ending.js +7 -7
  35. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  36. package/dist/actors/computer-use/loop/observation.js +9 -9
  37. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  38. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  39. package/dist/actors/computer-use/loop/session.js +3 -3
  40. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  41. package/dist/actors/computer-use/loop/spend.js +1 -1
  42. package/dist/actors/computer-use/loop/trace.js +9 -8
  43. package/dist/actors/computer-use/loop/types.d.ts +25 -23
  44. package/dist/actors/computer-use/loop/usage.js +2 -2
  45. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  46. package/dist/actors/computer-use/openai-context.js +214 -0
  47. package/dist/actors/computer-use/openai-provider.d.ts +11 -8
  48. package/dist/actors/computer-use/openai-provider.js +45 -34
  49. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  50. package/dist/actors/computer-use/openai-requests.js +82 -15
  51. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  52. package/dist/actors/computer-use/openai-wire.js +36 -34
  53. package/dist/actors/contract.d.ts +78 -43
  54. package/dist/actors/contract.js +29 -23
  55. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  56. package/dist/actors/local-agent/claude-session.js +10 -9
  57. package/dist/actors/local-agent/cli.d.ts +8 -6
  58. package/dist/actors/local-agent/cli.js +24 -28
  59. package/dist/actors/local-agent/readiness.d.ts +2 -2
  60. package/dist/actors/local-agent/readiness.js +4 -4
  61. package/dist/actors/reasoning-effort.js +6 -6
  62. package/dist/actors/registry.d.ts +10 -10
  63. package/dist/actors/registry.js +18 -17
  64. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  65. package/dist/actors/scripted-browser/actor.js +16 -16
  66. package/dist/actors/scripted-browser/browser-command.js +1 -1
  67. package/dist/actors/scripted-browser/steps.js +1 -1
  68. package/dist/actors/scripted-browser/types.d.ts +1 -1
  69. package/dist/actors/stop-conditions.d.ts +1 -1
  70. package/dist/analysis/codex-config.d.ts +6 -2
  71. package/dist/analysis/codex-config.js +22 -14
  72. package/dist/analysis/service.js +5 -5
  73. package/dist/cli/commands/analyze.js +19 -16
  74. package/dist/cli/commands/codex.js +9 -9
  75. package/dist/cli/commands/comms.js +54 -33
  76. package/dist/cli/commands/feedback.js +20 -21
  77. package/dist/cli/commands/lab-format.d.ts +5 -4
  78. package/dist/cli/commands/lab-format.js +35 -23
  79. package/dist/cli/commands/lab-route-computer-use.js +6 -7
  80. package/dist/cli/commands/lab-route-preview.js +4 -3
  81. package/dist/cli/commands/lab-route-shared-world.js +3 -3
  82. package/dist/cli/commands/lab-run.js +10 -11
  83. package/dist/cli/commands/lab-scorer.d.ts +2 -2
  84. package/dist/cli/commands/lab-scorer.js +1 -1
  85. package/dist/cli/commands/migrate.d.ts +4 -0
  86. package/dist/cli/commands/migrate.js +65 -0
  87. package/dist/cli/commands/observe.js +147 -108
  88. package/dist/cli/commands/run-command.d.ts +10 -0
  89. package/dist/cli/commands/run-command.js +85 -0
  90. package/dist/cli/commands/runs.js +137 -138
  91. package/dist/cli/commands/setup.d.ts +2 -2
  92. package/dist/cli/commands/setup.js +26 -21
  93. package/dist/cli/commands/study.d.ts +3 -0
  94. package/dist/cli/commands/study.js +182 -0
  95. package/dist/cli/commands/tui.d.ts +4 -4
  96. package/dist/cli/commands/tui.js +21 -21
  97. package/dist/cli/commands/watch.js +60 -75
  98. package/dist/cli/deprecations.d.ts +18 -0
  99. package/dist/cli/deprecations.js +48 -0
  100. package/dist/cli/doctor.d.ts +15 -5
  101. package/dist/cli/doctor.js +103 -48
  102. package/dist/cli/first-run-path.d.ts +12 -10
  103. package/dist/cli/first-run-path.js +30 -28
  104. package/dist/cli/io.d.ts +41 -6
  105. package/dist/cli/io.js +97 -22
  106. package/dist/cli/observer-follow.d.ts +2 -2
  107. package/dist/cli/observer-follow.js +5 -6
  108. package/dist/cli/orientation.d.ts +6 -3
  109. package/dist/cli/orientation.js +43 -39
  110. package/dist/cli/product-sentence.d.ts +6 -0
  111. package/dist/cli/product-sentence.js +6 -0
  112. package/dist/cli/program.d.ts +6 -1
  113. package/dist/cli/program.js +109 -40
  114. package/dist/cli/telemetry.d.ts +15 -15
  115. package/dist/cli/telemetry.js +48 -40
  116. package/dist/cli.js +1 -1
  117. package/dist/comms/capture-surface.d.ts +13 -12
  118. package/dist/comms/capture-surface.js +23 -22
  119. package/dist/comms/catch-host.d.ts +7 -7
  120. package/dist/comms/catch-host.js +14 -14
  121. package/dist/comms/email-catch.d.ts +3 -3
  122. package/dist/comms/email-catch.js +8 -8
  123. package/dist/comms/external-evidence.js +2 -2
  124. package/dist/comms/extract.js +2 -2
  125. package/dist/comms/fake-inbox.d.ts +2 -2
  126. package/dist/comms/fake-inbox.js +2 -2
  127. package/dist/comms/receiving-render.d.ts +1 -1
  128. package/dist/comms/receiving-render.js +2 -2
  129. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  130. package/dist/comms/sandbox-catch-script.js +6 -6
  131. package/dist/comms/sandbox-catch.d.ts +36 -37
  132. package/dist/comms/sandbox-catch.js +34 -35
  133. package/dist/comms/setup.js +42 -8
  134. package/dist/comms/thread-evidence.d.ts +1 -1
  135. package/dist/comms/thread-evidence.js +6 -6
  136. package/dist/comms/types.d.ts +6 -6
  137. package/dist/comms/types.js +3 -3
  138. package/dist/evidence/frame-signature.d.ts +1 -1
  139. package/dist/evidence/frame-signature.js +4 -4
  140. package/dist/evidence/redaction.d.ts +3 -3
  141. package/dist/evidence/redaction.js +4 -4
  142. package/dist/feedback/draft.js +36 -78
  143. package/dist/feedback/export-bundle.js +1 -1
  144. package/dist/feedback/export.d.ts +5 -1
  145. package/dist/feedback/export.js +7 -8
  146. package/dist/feedback/feedback.d.ts +2 -2
  147. package/dist/feedback/feedback.js +21 -3
  148. package/dist/guest/chromium-text.js +2 -2
  149. package/dist/guest/desktop-native.d.ts +1 -1
  150. package/dist/guest/runtime.js +1 -1
  151. package/dist/index.d.ts +12 -10
  152. package/dist/index.js +8 -6
  153. package/dist/keys/key-resolution.d.ts +5 -5
  154. package/dist/keys/key-resolution.js +23 -23
  155. package/dist/lab/adapter-extension.d.ts +7 -7
  156. package/dist/lab/adapter-extension.js +13 -36
  157. package/dist/lab/adapter-scorer-loader.d.ts +7 -7
  158. package/dist/lab/adapter-scorer-loader.js +32 -32
  159. package/dist/lab/composition-rules.js +42 -42
  160. package/dist/lab/config.js +65 -25
  161. package/dist/lab/deprecated-fields.d.ts +10 -0
  162. package/dist/lab/deprecated-fields.js +24 -0
  163. package/dist/lab/device-presets.d.ts +8 -8
  164. package/dist/lab/device-presets.js +11 -11
  165. package/dist/lab/discover.d.ts +13 -9
  166. package/dist/lab/discover.js +117 -57
  167. package/dist/lab/doctor.d.ts +10 -3
  168. package/dist/lab/doctor.js +47 -9
  169. package/dist/lab/init-templates.js +147 -147
  170. package/dist/lab/init.d.ts +1 -1
  171. package/dist/lab/init.js +41 -9
  172. package/dist/lab/keys.d.ts +2 -0
  173. package/dist/lab/keys.js +42 -8
  174. package/dist/lab/lab-deps.d.ts +7 -12
  175. package/dist/lab/parse/actors.js +9 -9
  176. package/dist/lab/parse/comms.js +5 -5
  177. package/dist/lab/parse/execution.js +13 -13
  178. package/dist/lab/parse/study-v3.d.ts +23 -0
  179. package/dist/lab/parse/study-v3.js +259 -0
  180. package/dist/lab/parse/subject-state.d.ts +7 -7
  181. package/dist/lab/parse/subject-state.js +16 -16
  182. package/dist/lab/parse/subject.js +28 -28
  183. package/dist/lab/parse/values.d.ts +1 -1
  184. package/dist/lab/parse/values.js +3 -3
  185. package/dist/lab/persona-resolve.d.ts +4 -4
  186. package/dist/lab/persona-resolve.js +4 -4
  187. package/dist/lab/plan-participants.d.ts +2 -2
  188. package/dist/lab/plan-types.d.ts +4 -4
  189. package/dist/lab/plan.d.ts +1 -7
  190. package/dist/lab/plan.js +10 -41
  191. package/dist/lab/preflight-probes.js +11 -11
  192. package/dist/lab/preflight-result.d.ts +2 -1
  193. package/dist/lab/preflight-result.js +5 -4
  194. package/dist/lab/preflight.d.ts +7 -5
  195. package/dist/lab/preflight.js +5 -5
  196. package/dist/lab/routing.d.ts +31 -25
  197. package/dist/lab/routing.js +60 -29
  198. package/dist/lab/run-lab-events.d.ts +0 -3
  199. package/dist/lab/run-lab-events.js +0 -6
  200. package/dist/lab/run-lab-homes.d.ts +22 -10
  201. package/dist/lab/run-lab-homes.js +5 -1
  202. package/dist/lab/run-lab-options.d.ts +1 -1
  203. package/dist/lab/run-lab-options.js +16 -13
  204. package/dist/lab/summary.d.ts +7 -6
  205. package/dist/lab/summary.js +10 -10
  206. package/dist/lab/tasks.d.ts +15 -15
  207. package/dist/lab/tasks.js +14 -14
  208. package/dist/lab/types.d.ts +101 -95
  209. package/dist/lab/types.js +2 -0
  210. package/dist/lab/validation.d.ts +13 -13
  211. package/dist/lab/validation.js +44 -42
  212. package/dist/lab/warnings.d.ts +10 -0
  213. package/dist/lab/warnings.js +61 -33
  214. package/dist/library-aliases.d.ts +56 -0
  215. package/dist/library-aliases.js +22 -0
  216. package/dist/observer/artifact.d.ts +1 -1
  217. package/dist/observer/artifact.js +6 -6
  218. package/dist/observer/data.d.ts +6 -6
  219. package/dist/observer/data.js +5 -4
  220. package/dist/observer/exposure.d.ts +1 -1
  221. package/dist/observer/exposure.js +11 -11
  222. package/dist/observer/http.js +1 -1
  223. package/dist/observer/library.d.ts +1 -1
  224. package/dist/observer/library.js +4 -2
  225. package/dist/observer/listen.js +5 -4
  226. package/dist/observer/render.d.ts +1 -1
  227. package/dist/observer/render.js +10 -5
  228. package/dist/observer/run-routes.d.ts +3 -3
  229. package/dist/observer/run-routes.js +1 -1
  230. package/dist/observer/serve.js +7 -3
  231. package/dist/observer/tunnel.js +1 -1
  232. package/dist/observer-app.html +4 -4
  233. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  234. package/dist/routes/computer-use/bundle-parts.js +15 -15
  235. package/dist/routes/computer-use/bundle.js +3 -3
  236. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
  238. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  239. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
  240. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  241. package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
  242. package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
  243. package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
  244. package/dist/routes/computer-use/external-comms.d.ts +1 -1
  245. package/dist/routes/computer-use/external-comms.js +1 -1
  246. package/dist/routes/computer-use/fanout-bundle.js +18 -18
  247. package/dist/routes/computer-use/fanout-records.js +10 -11
  248. package/dist/routes/computer-use/live-flush.d.ts +1 -1
  249. package/dist/routes/computer-use/live-flush.js +6 -6
  250. package/dist/routes/computer-use/live-phase.d.ts +4 -2
  251. package/dist/routes/computer-use/live-phase.js +6 -6
  252. package/dist/routes/computer-use/local-vm.js +1 -1
  253. package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
  254. package/dist/routes/computer-use/participant-desktop.js +4 -4
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +9 -9
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +31 -13
  259. package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
  260. package/dist/routes/computer-use/participant-prompt.js +6 -6
  261. package/dist/routes/computer-use/participant-runs.d.ts +7 -7
  262. package/dist/routes/computer-use/participant-runs.js +13 -13
  263. package/dist/routes/computer-use/plan.js +22 -22
  264. package/dist/routes/computer-use/preflight.js +21 -21
  265. package/dist/routes/computer-use/rerun-selection.js +1 -1
  266. package/dist/routes/computer-use/result.js +11 -11
  267. package/dist/routes/computer-use/route.d.ts +2 -1
  268. package/dist/routes/computer-use/route.js +15 -14
  269. package/dist/routes/computer-use/self-report.d.ts +7 -7
  270. package/dist/routes/computer-use/self-report.js +31 -31
  271. package/dist/routes/computer-use/setup.d.ts +1 -1
  272. package/dist/routes/computer-use/setup.js +17 -18
  273. package/dist/routes/computer-use/single-bundle.d.ts +7 -7
  274. package/dist/routes/computer-use/single-bundle.js +28 -30
  275. package/dist/routes/computer-use/subject-projection.d.ts +1 -1
  276. package/dist/routes/computer-use/subject-projection.js +6 -6
  277. package/dist/routes/computer-use/types.d.ts +40 -42
  278. package/dist/routes/computer-use/types.js +10 -10
  279. package/dist/routes/preview.d.ts +8 -2
  280. package/dist/routes/preview.js +8 -4
  281. package/dist/routes/scripted/bundle.d.ts +2 -2
  282. package/dist/routes/scripted/bundle.js +13 -12
  283. package/dist/routes/scripted/plan.d.ts +1 -1
  284. package/dist/routes/scripted/plan.js +9 -9
  285. package/dist/routes/scripted/result.js +5 -5
  286. package/dist/routes/scripted/route.js +5 -6
  287. package/dist/routes/scripted/scenario.js +2 -2
  288. package/dist/routes/scripted/setup.js +7 -7
  289. package/dist/routes/scripted/subject.js +1 -1
  290. package/dist/routes/scripted/surface-records.js +3 -3
  291. package/dist/routes/scripted/types.d.ts +3 -5
  292. package/dist/routes/scripted/types.js +1 -1
  293. package/dist/routes/shared-world/bundle-records.js +9 -8
  294. package/dist/routes/shared-world/bundle.d.ts +5 -5
  295. package/dist/routes/shared-world/bundle.js +40 -38
  296. package/dist/routes/shared-world/checkpoints.d.ts +1 -1
  297. package/dist/routes/shared-world/checkpoints.js +1 -1
  298. package/dist/routes/shared-world/comms.d.ts +5 -5
  299. package/dist/routes/shared-world/comms.js +14 -14
  300. package/dist/routes/shared-world/external-public.d.ts +4 -3
  301. package/dist/routes/shared-world/external-public.js +16 -12
  302. package/dist/routes/shared-world/handoff.d.ts +7 -6
  303. package/dist/routes/shared-world/handoff.js +65 -57
  304. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  305. package/dist/routes/shared-world/lobby-code.js +9 -9
  306. package/dist/routes/shared-world/participant-specs.d.ts +7 -6
  307. package/dist/routes/shared-world/participant-specs.js +31 -24
  308. package/dist/routes/shared-world/plan.js +7 -7
  309. package/dist/routes/shared-world/provenance.d.ts +2 -2
  310. package/dist/routes/shared-world/provenance.js +2 -2
  311. package/dist/routes/shared-world/provisioned.js +14 -13
  312. package/dist/routes/shared-world/result.js +20 -21
  313. package/dist/routes/shared-world/route.js +23 -22
  314. package/dist/routes/shared-world/setup.d.ts +3 -3
  315. package/dist/routes/shared-world/setup.js +4 -4
  316. package/dist/routes/shared-world/types.d.ts +30 -28
  317. package/dist/routes/shared-world/types.js +4 -4
  318. package/dist/routes/terminal/adapter.d.ts +3 -3
  319. package/dist/routes/terminal/adapter.js +5 -5
  320. package/dist/routes/terminal/bundle.d.ts +3 -3
  321. package/dist/routes/terminal/bundle.js +22 -21
  322. package/dist/routes/terminal/credentials.d.ts +4 -4
  323. package/dist/routes/terminal/credentials.js +7 -7
  324. package/dist/routes/terminal/dry-run.js +4 -4
  325. package/dist/routes/terminal/encoding.js +2 -2
  326. package/dist/routes/terminal/ledger.d.ts +3 -3
  327. package/dist/routes/terminal/ledger.js +14 -14
  328. package/dist/routes/terminal/live-finish.js +3 -3
  329. package/dist/routes/terminal/live-sandbox.js +12 -13
  330. package/dist/routes/terminal/persona.js +1 -1
  331. package/dist/routes/terminal/plan.js +11 -11
  332. package/dist/routes/terminal/recorder.js +2 -2
  333. package/dist/routes/terminal/result.js +8 -8
  334. package/dist/routes/terminal/route.js +6 -7
  335. package/dist/routes/terminal/sandbox.d.ts +1 -1
  336. package/dist/routes/terminal/sandbox.js +1 -1
  337. package/dist/routes/terminal/session.js +8 -7
  338. package/dist/routes/terminal/token-usage.d.ts +1 -1
  339. package/dist/routes/terminal/token-usage.js +7 -8
  340. package/dist/routes/terminal/trace.d.ts +2 -2
  341. package/dist/routes/terminal/trace.js +2 -2
  342. package/dist/routes/terminal/types.d.ts +26 -28
  343. package/dist/routes/terminal/types.js +3 -3
  344. package/dist/run/bundle-shape.js +3 -3
  345. package/dist/run/bundle.d.ts +46 -46
  346. package/dist/run/bundle.js +2 -1
  347. package/dist/run/cost-summary.js +3 -3
  348. package/dist/run/costs.js +7 -1
  349. package/dist/run/detail.d.ts +6 -6
  350. package/dist/run/detail.js +4 -4
  351. package/dist/run/dry-run-inputs.js +1 -1
  352. package/dist/run/dry-run.js +18 -18
  353. package/dist/run/judge.d.ts +19 -13
  354. package/dist/run/judge.js +18 -8
  355. package/dist/run/paths.d.ts +1 -1
  356. package/dist/run/paths.js +1 -1
  357. package/dist/run/pricing.d.ts +11 -6
  358. package/dist/run/pricing.js +20 -13
  359. package/dist/run/projection.d.ts +14 -14
  360. package/dist/run/projection.js +15 -15
  361. package/dist/run/reclaim.js +2 -2
  362. package/dist/run/results.d.ts +5 -5
  363. package/dist/run/run-index.d.ts +8 -6
  364. package/dist/run/run-index.js +15 -16
  365. package/dist/run/run-not-found.d.ts +5 -0
  366. package/dist/run/run-not-found.js +15 -0
  367. package/dist/run/run.d.ts +5 -4
  368. package/dist/run/run.js +1 -1
  369. package/dist/run/sandbox-receipts.d.ts +2 -2
  370. package/dist/run/sandbox-receipts.js +3 -3
  371. package/dist/run/shared-world-evidence.d.ts +36 -35
  372. package/dist/run/shared-world-evidence.js +4 -4
  373. package/dist/run/shared-world-shape.d.ts +1 -1
  374. package/dist/run/shared-world-shape.js +6 -6
  375. package/dist/run/stats.d.ts +12 -6
  376. package/dist/run/stats.js +116 -58
  377. package/dist/run/status.d.ts +8 -29
  378. package/dist/run/status.js +5 -27
  379. package/dist/run/stored-runs.js +2 -1
  380. package/dist/run/stream-shape.js +1 -1
  381. package/dist/run/streams.d.ts +6 -6
  382. package/dist/run/study-provenance.d.ts +47 -0
  383. package/dist/run/study-provenance.js +63 -0
  384. package/dist/run/study-result.d.ts +16 -0
  385. package/dist/run/study-result.js +9 -0
  386. package/dist/run/text.d.ts +2 -0
  387. package/dist/run/text.js +4 -0
  388. package/dist/run-lab.d.ts +7 -7
  389. package/dist/run-lab.js +1 -3
  390. package/dist/study/convert.d.ts +33 -0
  391. package/dist/study/convert.js +432 -0
  392. package/dist/study/field-paths.d.ts +12 -0
  393. package/dist/study/field-paths.js +126 -0
  394. package/dist/study/files.d.ts +26 -0
  395. package/dist/study/files.js +43 -0
  396. package/dist/study/migrate.d.ts +48 -0
  397. package/dist/study/migrate.js +408 -0
  398. package/dist/study/owned-files.d.ts +38 -0
  399. package/dist/study/owned-files.js +182 -0
  400. package/dist/subject/clone.d.ts +1 -1
  401. package/dist/subject/desktop-cli.d.ts +1 -1
  402. package/dist/subject/desktop-cli.js +2 -2
  403. package/dist/subject/local-tree-archive.js +1 -1
  404. package/dist/subject/local-tree.d.ts +1 -1
  405. package/dist/subject/node-bootstrap.js +1 -1
  406. package/dist/subject/runtime.js +8 -9
  407. package/dist/subject/serve.d.ts +1 -1
  408. package/dist/subject/serve.js +3 -3
  409. package/dist/subject/state.d.ts +1 -1
  410. package/dist/subject/steps.d.ts +5 -5
  411. package/dist/subject/steps.js +4 -4
  412. package/dist/substrates/command-failure.d.ts +3 -3
  413. package/dist/substrates/command-failure.js +3 -3
  414. package/dist/substrates/detached.d.ts +6 -6
  415. package/dist/substrates/detached.js +7 -7
  416. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  417. package/dist/substrates/e2b/cdp-probe.js +14 -17
  418. package/dist/substrates/e2b/desktop-browser.d.ts +2 -2
  419. package/dist/substrates/e2b/desktop-browser.js +8 -8
  420. package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
  421. package/dist/substrates/e2b/desktop-cdp.js +8 -8
  422. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  423. package/dist/substrates/e2b/desktop-executor.js +1 -1
  424. package/dist/substrates/e2b/desktop-geometry.d.ts +3 -3
  425. package/dist/substrates/e2b/desktop-geometry.js +7 -7
  426. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  427. package/dist/substrates/e2b/desktop-media.js +1 -1
  428. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  429. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  430. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  431. package/dist/substrates/e2b/sandbox.js +1 -1
  432. package/dist/substrates/e2b/sdk.d.ts +11 -11
  433. package/dist/substrates/e2b/sdk.js +6 -6
  434. package/dist/tui/actions.d.ts +1 -1
  435. package/dist/tui/actions.js +13 -13
  436. package/dist/tui/contract.d.ts +16 -16
  437. package/dist/tui/contract.js +10 -10
  438. package/dist/tui/launch.d.ts +4 -4
  439. package/dist/tui/launch.js +18 -19
  440. package/dist/tui/project.js +5 -5
  441. package/dist/tui-app.js +82 -82
  442. package/dist/verify/actor.d.ts +8 -8
  443. package/dist/verify/actor.js +36 -36
  444. package/dist/verify/artifacts.d.ts +2 -2
  445. package/dist/verify/artifacts.js +3 -3
  446. package/dist/verify/context-growth.d.ts +9 -0
  447. package/dist/verify/context-growth.js +62 -0
  448. package/dist/verify/costs.d.ts +6 -6
  449. package/dist/verify/costs.js +8 -8
  450. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  451. package/dist/verify/shared-world-concurrent.js +79 -76
  452. package/dist/verify/shared-world.d.ts +2 -2
  453. package/dist/verify/shared-world.js +16 -16
  454. package/dist/verify/subject.d.ts +4 -4
  455. package/dist/verify/subject.js +18 -18
  456. package/dist/verify/verify.js +92 -43
  457. package/docs/README.md +25 -32
  458. package/docs/architecture/actor-contract.md +56 -87
  459. package/docs/architecture/desktop-sessions.md +7 -7
  460. package/docs/architecture/external-public-shared-world.md +61 -59
  461. package/docs/architecture/github-feedback-loop.md +1 -4
  462. package/docs/architecture/guest-desktop.md +2 -2
  463. package/docs/architecture/observer.md +34 -34
  464. package/docs/architecture/restricted-codex-analysis.md +34 -28
  465. package/docs/architecture/serve.md +34 -37
  466. package/docs/architecture/state-driven-executor.md +55 -58
  467. package/docs/architecture/task-protocol-support.md +5 -5
  468. package/docs/architecture/terminal-product-route.md +67 -107
  469. package/docs/contracts/README.md +24 -0
  470. package/docs/contracts/adapter-admission.md +3 -3
  471. package/docs/contracts/adapter-fixtures.md +2 -5
  472. package/docs/contracts/core.md +1 -3
  473. package/docs/contracts/errors.md +62 -0
  474. package/docs/contracts/feedback.md +8 -9
  475. package/docs/contracts/policy.md +7 -12
  476. package/docs/contracts/run-bundle.md +45 -44
  477. package/docs/contracts/schemas.md +421 -362
  478. package/docs/contracts/study-analysis.md +3 -3
  479. package/docs/contracts/study-costs.md +11 -7
  480. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  481. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  482. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  483. package/docs/principles/actor-fidelity.md +4 -4
  484. package/docs/principles/engineering.md +3 -3
  485. package/docs/principles/invariants-and-defaults.md +38 -38
  486. package/docs/principles/self-driving-harness.md +1 -5
  487. package/docs/principles/three-roles.md +1 -1
  488. package/docs/product/automatic-analysis.md +7 -7
  489. package/examples/participant/README.md +5 -5
  490. package/examples/participant/run.mjs +11 -10
  491. package/examples/scorer/README.md +3 -3
  492. package/examples/scorer/run.mjs +11 -12
  493. package/package.json +16 -17
  494. package/skills/humanish/SKILL.md +60 -58
  495. package/skills/humanish/agents/openai.yaml +1 -1
  496. package/AGENTS.md +0 -99
  497. package/CONTRIBUTING.md +0 -148
  498. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  499. package/dist/actors/codex/qualified-versions.js +0 -132
  500. package/dist/cli/commands/lab.d.ts +0 -3
  501. package/dist/cli/commands/lab.js +0 -199
  502. package/dist/cli/renamed-options.d.ts +0 -11
  503. package/dist/cli/renamed-options.js +0 -18
  504. package/dist/observer/static.d.ts +0 -39
  505. package/dist/observer/static.js +0 -369
  506. package/docs/architecture/comms-inbox.md +0 -122
  507. package/docs/architecture/desktop-recording.md +0 -80
  508. package/docs/architecture/local-browser-runtime.md +0 -178
  509. package/docs/architecture/observer-review.md +0 -144
  510. package/docs/architecture/participant-media.md +0 -90
  511. package/docs/architecture/project-layout.md +0 -62
  512. package/docs/architecture/real-email-receiving.md +0 -136
  513. package/docs/assets/humanish-drawdb-hero.png +0 -0
  514. package/docs/assets/humanish-observer-hero.png +0 -0
  515. package/docs/goals/current.md +0 -207
  516. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  517. package/docs/product/open-source-install-experience.md +0 -240
  518. package/docs/ramp/README.md +0 -295
  519. package/docs/release/open-source-readiness.md +0 -222
  520. package/docs/release/public-readiness-standard.md +0 -210
  521. package/docs/roadmap/world-class-open-source-v0.md +0 -311
@@ -46,18 +46,18 @@ export function resolveParticipantSandboxMs(config) {
46
46
  SANDBOX_TIMEOUT_BUFFER_MS);
47
47
  }
48
48
  /**
49
- * The in-flight participant bound a lab declares. Defaults to the participant count — every
49
+ * The in-flight participant bound a lab declares. Defaults to the participant count: every
50
50
  * declared participant runs at once, because a throttle nobody asked for silently turns "N actors
51
- * live" into waves (#350); total session count and spend are the same either way, only wall-clock
52
- * and simultaneity differ. A declared execution.concurrency is a CAP, clamped to [1, participants].
51
+ * live" into waves; total session count and spend are the same either way, only wall-clock
52
+ * and simultaneity differ. A declared execution.concurrency is a cap, clamped to [1, participants].
53
53
  * The planner records it; the route may only lower it from the environment.
54
54
  */
55
55
  export function boundedConcurrency(declared, participantCount) {
56
56
  return Math.max(1, declared === undefined ? participantCount : Math.min(Math.max(1, declared), participantCount));
57
57
  }
58
58
  /**
59
- * The planned bound, lowered by the env override. The override may only LOWER it (never raise
60
- * concurrent paid desktops — invariant 3), and a lowering is reported via envLoweredFrom so the
59
+ * The planned bound, lowered by the env override. The override may only lower it (never raise
60
+ * concurrent paid desktops), and a lowering is reported via envLoweredFrom so the
61
61
  * plan never silently disagrees with the manifest.
62
62
  */
63
63
  function envLoweredConcurrency(planned, participantCount, env) {
@@ -81,7 +81,7 @@ function plannedParticipantsOf(config, countOverride) {
81
81
  desktopCli: config.subject.source === "desktop-cli",
82
82
  };
83
83
  }
84
- /** Build the participant runs AND the public plan from the planned participants (pure). */
84
+ /** Build the participant runs and the public plan from the planned participants (pure). */
85
85
  function participantRunsAndPlan(planned, opts = {}) {
86
86
  const env = opts.env ?? {};
87
87
  // Who each participant is (id, persona, focus, device, limits) comes from the plan; this adds
@@ -162,17 +162,17 @@ function participantRunsAndPlan(planned, opts = {}) {
162
162
  return { runs, participantPlan };
163
163
  }
164
164
  /**
165
- * Pure pre-flight plan resolver (runs in dry-run AND live). Returns the participant table, the
165
+ * Pure pre-flight plan resolver (runs in dry-run and live). Returns the participant table, the
166
166
  * effective concurrency, the wave count, the per-participant session budget, and the worst-case total
167
- * sandbox-minutes — BEFORE any sandbox or provider call. The same plan appears in dry-run,
167
+ * sandbox-minutes, before any sandbox or provider call. The same plan appears in dry-run,
168
168
  * marked $0 (dryRun: true).
169
169
  */
170
170
  export function resolveCuaParticipantPlan(config, opts = {}) {
171
171
  const { countOverride, ...rest } = opts;
172
172
  return participantRunsAndPlan(plannedParticipantsOf(config, countOverride), rest).participantPlan;
173
173
  }
174
- /** Print the participant plan to stderr BEFORE any sandbox/provider call (public-safe: ids, devices,
175
- * digests, and budgets only — no prompt text, no secrets). */
174
+ /** Print the participant plan to stderr before any sandbox/provider call (public-safe: ids, devices,
175
+ * digests, and budgets only; no prompt text, no secrets). */
176
176
  export function emitPreflightPlan(participantPlan, labId) {
177
177
  const lines = [];
178
178
  lines.push(`humanish computer-use fan-out plan (${labId}): ${participantPlan.laneCount} participant(s), strategy ${participantPlan.strategy}, concurrency ${participantPlan.concurrency}${participantPlan.envLoweredConcurrencyFrom === undefined ? "" : ` (lowered from ${participantPlan.envLoweredConcurrencyFrom} by ${CUA_MAX_CONCURRENCY_ENV})`}, ${participantPlan.waves} wave(s).`);
@@ -212,8 +212,8 @@ export async function compileParticipantPersonas(projectRoot, personaIds) {
212
212
  export async function loadCuaParticipants(args) {
213
213
  const { plan } = args;
214
214
  const { participants } = plan.runner;
215
- // Compile any committed personas BEFORE planning, so the plan builder stays pure and each participant's
216
- // prompt carries real behavioral directives rather than a bare `Persona: <id>.` label (#381).
215
+ // Compile any committed personas before planning, so the plan builder stays pure and each participant's
216
+ // prompt carries real behavioral directives rather than a bare `Persona: <id>.` label.
217
217
  const personas = await compileParticipantPersonas(args.projectRoot, participants.map((participant) => participant.personaId));
218
218
  const { runs: participantRuns, participantPlan } = participantRunsAndPlan({
219
219
  participants,
@@ -235,7 +235,7 @@ export async function loadCuaParticipants(args) {
235
235
  participantPlan,
236
236
  });
237
237
  if (!selected.ok) {
238
- return { ok: false, code: "HUMANISH_CUA_LAB_RERUN_INVALID", message: selected.message };
238
+ return { ok: false, code: "HUMANISH_COMPUTER_USE_RERUN_INVALID", message: selected.message };
239
239
  }
240
240
  return {
241
241
  ok: true,
@@ -8,8 +8,8 @@ import { isHttpUrl, isLoopbackUrl } from "../../lab/parse/subject.js";
8
8
  import { subjectStateInvalidReason } from "../../lab/parse/subject-state.js";
9
9
  import { brainOf, callerBrainOf, capsOf, desktopRequirements, planBase, provisionedSubject, } from "../../lab/plan-base.js";
10
10
  import { computerUseParticipants, declaredTargets } from "../../lab/plan-participants.js";
11
- import { MAX_CUA_LANES } from "../../lab/routing.js";
12
- import { cloneTargetValidationReason, cuaLaneValidationReason, desktopMediaValidationReason, outputTokenLimitValidationReason, receivingEmailValidationReason, scenarioCapsValidationReason, taskProtocolValidationReason, } from "../../lab/validation.js";
11
+ import { MAX_COMPUTER_USE_PARTICIPANTS } from "../../lab/routing.js";
12
+ import { cloneTargetValidationReason, computerUseValidationReason, desktopMediaValidationReason, outputTokenLimitValidationReason, receivingEmailValidationReason, scenarioCapsValidationReason, taskProtocolValidationReason, } from "../../lab/validation.js";
13
13
  import { desktopCliProductReason } from "../../lab/composition-rules.js";
14
14
  import { isLocalBrowserLab } from "../../substrates/local/runtime-config.js";
15
15
  import { boundedConcurrency, defaultSessionTimeoutMs, resolveParticipantSandboxMs, } from "./participant-runs.js";
@@ -65,7 +65,7 @@ export function plannedAppUrl(subject) {
65
65
  return "appUrl" in subject ? subject.appUrl : "";
66
66
  }
67
67
  const invalid = (message) => ({
68
- code: "HUMANISH_CUA_LAB_SUBJECT_INVALID",
68
+ code: "HUMANISH_COMPUTER_USE_SUBJECT_INVALID",
69
69
  message,
70
70
  });
71
71
  /**
@@ -110,7 +110,7 @@ function subjectStructureReason(config, subjectRoute) {
110
110
  if (cloneRoute &&
111
111
  (!serve || !subjectRepo || !/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(subjectRepo)))
112
112
  return invalid(!serve
113
- ? "clone subjects on the computer-use route require `subject.serve` (start + url) — the lab serves the app in-sandbox."
113
+ ? "A clone subject on the computer-use route needs `subject.serve` (start and url): humanish starts the app in the sandbox before the participant opens it."
114
114
  : `subject.repos[0] must be an owner/repo slug (got "${subjectRepo ?? ""}").`);
115
115
  // A library caller that skips parseLabConfig gets the same fail-closed shape the parser
116
116
  // enforces, naming which requirement is missing.
@@ -146,7 +146,7 @@ function entryTargetReason(config, subjectRoute) {
146
146
  if (entryTargetSafe)
147
147
  return undefined;
148
148
  return {
149
- code: "HUMANISH_CUA_LAB_SUBJECT_UNSAFE",
149
+ code: "HUMANISH_COMPUTER_USE_SUBJECT_UNSAFE",
150
150
  message: provisionedRoute || localAppSubject || !allowPublicTargets
151
151
  ? "subject.appUrl and any actors[0].lanes[].target entries must be loopback (127.0.0.1 or localhost) unless policies.allowPublicTargets is set for an app-url subject."
152
152
  : "subject.appUrl and actors[0].lanes[].target entries must be valid http(s) URLs.",
@@ -158,13 +158,13 @@ function driverReason(driving, { localAppSubject, inProcessRoute }) {
158
158
  // and would fail closed against an executor that returns no screenshot.
159
159
  if (driving.inProcess && !driving.createProvider)
160
160
  return {
161
- code: "HUMANISH_CUA_LAB_EXECUTOR_NO_PROVIDER",
162
- message: "RunLabOptions.inProcess requires RunLabOptions.createProvider — a state-driven executor returns no screenshot, so it must be paired with a NON-vision provider (the default OpenAI computer-use provider is vision-based and would fail closed).",
161
+ code: "HUMANISH_COMPUTER_USE_EXECUTOR_NO_PROVIDER",
162
+ message: "RunLabOptions.inProcess needs RunLabOptions.createProvider: an in-process executor returns no screenshot, so it needs a provider that does not read images. The default OpenAI computer-use provider reads screenshots and would stop the session.",
163
163
  };
164
164
  // There is no built-in in-process driver for a local app.
165
165
  if (localAppSubject && !inProcessRoute)
166
166
  return {
167
- code: "HUMANISH_CUA_LAB_LOCAL_APP_NO_EXECUTOR",
167
+ code: "HUMANISH_COMPUTER_USE_LOCAL_APP_NO_EXECUTOR",
168
168
  message: "subject.source: local-app has no built-in driver. Supply one through runLab(config, { inProcess: { executor }, createProvider }); a state-driven executor needs a non-vision provider.",
169
169
  };
170
170
  return undefined;
@@ -173,9 +173,9 @@ function driverReason(driving, { localAppSubject, inProcessRoute }) {
173
173
  function rosterShapeReason(config) {
174
174
  // `lanes` XOR `count`/`laneFocus`, device XOR raw resolution, cap, unique ids,
175
175
  // allowPublicTargets with more than one participant, clone.fanout.
176
- const fanoutReason = cuaLaneValidationReason(config);
176
+ const fanoutReason = computerUseValidationReason(config);
177
177
  if (fanoutReason)
178
- return { code: "HUMANISH_CUA_LAB_FANOUT_INVALID", message: fanoutReason };
178
+ return { code: "HUMANISH_COMPUTER_USE_FANOUT_INVALID", message: fanoutReason };
179
179
  // The sandbox deadline is derived from the session budget, so a lab can ask for a session that
180
180
  // cannot legally be provisioned. Show the arithmetic: the provider's own error names a limit
181
181
  // but not which knob produced it.
@@ -210,40 +210,40 @@ export function planComputerUseLab(config, input) {
210
210
  });
211
211
  const analysis = resolveAutomaticAnalysis(config.review?.analysis);
212
212
  if (!analysis.ok)
213
- return refuse("before-scope", "HUMANISH_LAB_ANALYSIS_INVALID", analysis.message);
213
+ return refuse("before-scope", "HUMANISH_STUDY_ANALYSIS_INVALID", analysis.message);
214
214
  const tasksReason = taskProtocolValidationReason(config, true);
215
215
  if (tasksReason)
216
- return refuse("before-scope", "HUMANISH_LAB_TASKS_UNSUPPORTED", tasksReason);
216
+ return refuse("before-scope", "HUMANISH_STUDY_TASKS_UNSUPPORTED", tasksReason);
217
217
  // The parser checks the actor too; a library caller skips the parser.
218
218
  const actorType = config.actors[0]?.type ?? "";
219
219
  const descriptor = actorRegistry[actorType];
220
220
  if (!descriptor || !isCuaActorDescriptor(descriptor))
221
- return refuse("in-scope", "HUMANISH_CUA_LAB_ACTOR_UNSUPPORTED", `actors[0].type "${actorType}" is not a registered computer-use actor.`);
221
+ return refuse("in-scope", "HUMANISH_COMPUTER_USE_ACTOR_UNSUPPORTED", `actors[0].type "${actorType}" is not a registered computer-use actor.`);
222
222
  const actor = descriptor.id;
223
223
  const rejection = cuaLabRejection(config, hasRunSession, driving, declaredSubjectRoute(config, driving));
224
224
  if (rejection)
225
225
  return refuse("in-scope", rejection.code, rejection.message, actor);
226
- // A shared world runs every seat against one app; this route would run them as separate participants.
227
- // It comes after the rules above, so a shared-world config that breaks one of them, which runLab
228
- // sends here, still gets that rule's message.
226
+ // A shared world runs every participant against one app; this route would run them as separate
227
+ // participants. It comes after the rules above, so a shared-world config that breaks one of them,
228
+ // which runLab sends here, still gets that rule's message.
229
229
  if (config.subject.topology === "shared-world")
230
- return refuse("in-scope", "HUMANISH_CUA_LAB_SUBJECT_INVALID", "subject.topology: shared-world labs run every participant against one shared app on the shared-world route; runCuaActorLab runs independent participants. Run the lab with runLab or runConcurrentSharedWorld.", actor);
230
+ return refuse("in-scope", "HUMANISH_COMPUTER_USE_SUBJECT_INVALID", "subject.topology: shared-world labs run every participant against one shared app on the shared-world route; runCuaActorLab runs independent participants. Run the lab with runLab or runConcurrentSharedWorld.", actor);
231
231
  // The in-process route drives subject.appUrl on this machine and creates no desktop, so it would
232
232
  // skip the subject a clone, local-tree or desktop-cli lab declares.
233
233
  const source = config.subject.source;
234
234
  if (driving.inProcess &&
235
235
  (source === "clone" || source === "local-tree" || source === "desktop-cli"))
236
- return refuse("in-scope", "HUMANISH_CUA_LAB_SUBJECT_INVALID", `RunLabOptions.inProcess drives subject.appUrl in this process, and a ${source} subject needs the hosted desktop the in-process route never creates. Use an app-url or local-app subject with inProcess, or remove inProcess to run on a hosted desktop.`, actor);
236
+ return refuse("in-scope", "HUMANISH_COMPUTER_USE_SUBJECT_INVALID", `RunLabOptions.inProcess drives subject.appUrl in this process, and a ${source} subject needs the hosted desktop the in-process route never creates. Use an app-url or local-app subject with inProcess, or remove inProcess to run on a hosted desktop.`, actor);
237
237
  // The parser's rule; without a product the desktop study fails later.
238
238
  const productReason = desktopCliProductReason(config);
239
239
  if (productReason)
240
- return refuse("in-scope", "HUMANISH_CUA_LAB_SUBJECT_INVALID", productReason, actor);
240
+ return refuse("in-scope", "HUMANISH_COMPUTER_USE_SUBJECT_INVALID", productReason, actor);
241
241
  const participants = computerUseParticipants(config, input.countOverride);
242
- if (participants.length > MAX_CUA_LANES)
243
- return refuse("after-personas", "HUMANISH_CUA_LAB_FANOUT_INVALID", `Computer-use fan-out is capped at ${MAX_CUA_LANES} participants (resolved ${participants.length}); N concurrent paid desktops is real spend.`, actor);
242
+ if (participants.length > MAX_COMPUTER_USE_PARTICIPANTS)
243
+ return refuse("after-personas", "HUMANISH_COMPUTER_USE_FANOUT_INVALID", `Computer-use fan-out is capped at ${MAX_COMPUTER_USE_PARTICIPANTS} participants (resolved ${participants.length}); N concurrent paid desktops is real spend.`, actor);
244
244
  const [first, ...rest] = participants;
245
245
  if (driving.inProcess && rest.length > 0)
246
- return refuse("after-personas", "HUMANISH_CUA_LAB_FANOUT_INVALID", "Fan-out to more than one participant is not supported on the in-process route (RunLabOptions.inProcess): fan-out provisions one independent E2B desktop per participant, which the in-process route deliberately skips. Run a single in-process participant, or fan out on the E2B route.", actor);
246
+ return refuse("after-personas", "HUMANISH_COMPUTER_USE_FANOUT_INVALID", "Fan-out to more than one participant is not supported on the in-process route (RunLabOptions.inProcess): fan-out provisions one independent E2B desktop per participant, which the in-process route deliberately skips. Run a single in-process participant, or fan out on the E2B route.", actor);
247
247
  if (first === undefined)
248
248
  throw new Error("computerUseParticipants returned no participant");
249
249
  const appUrl = config.subject.appUrl ?? "";
@@ -5,13 +5,13 @@ import { localAgentRefusal } from "../../actors/local-agent/readiness.js";
5
5
  import { describeMissingKeys } from "../../keys/key-resolution.js";
6
6
  import { catchTokenOf, catchTokenRefusal } from "../../comms/external-evidence.js";
7
7
  import { externalCatchHealthy } from "../../comms/sandbox-catch.js";
8
- import { MODEL_RATES } from "../../run/pricing.js";
8
+ import { MODEL_RATES, unpricedCapMessage } from "../../run/pricing.js";
9
9
  /** The computer-use code for each local-agent refusal; shared-world keeps the same kinds. */
10
10
  const LOCAL_AGENT_REFUSAL_CODES = {
11
- "agent-missing": "HUMANISH_CUA_LAB_AGENT_MISSING",
12
- "signin-required": "HUMANISH_CUA_LAB_AGENT_SIGNIN_REQUIRED",
13
- unsupported: "HUMANISH_CUA_LAB_ACTOR_UNSUPPORTED",
14
- "unpriced-cap": "HUMANISH_CUA_LAB_UNPRICED_CAP",
11
+ "agent-missing": "HUMANISH_COMPUTER_USE_AGENT_MISSING",
12
+ "signin-required": "HUMANISH_COMPUTER_USE_AGENT_SIGNIN_REQUIRED",
13
+ unsupported: "HUMANISH_COMPUTER_USE_ACTOR_UNSUPPORTED",
14
+ "unpriced-cap": "HUMANISH_COMPUTER_USE_UNPRICED_CAP",
15
15
  };
16
16
  /**
17
17
  * The first reason a live computer-use run cannot start on this machine: missing keys, a missing
@@ -27,7 +27,7 @@ export async function liveCuaRejection(args) {
27
27
  const missing = missingKeys(requirements, env);
28
28
  if (missing.length > 0) {
29
29
  // The moment someone new actually hits the wall. If a signed-in coding agent is sitting
30
- // right there, say so HERE rather than making them go and find an API key — that detour is
30
+ // right there, say so here rather than making them go and find an API key; that detour is
31
31
  // where most people trying humanish stop.
32
32
  const suggestion = missing.includes("OPENAI_API_KEY")
33
33
  ? await (async () => {
@@ -35,17 +35,17 @@ export async function liveCuaRejection(args) {
35
35
  return ready.length === 0
36
36
  ? ""
37
37
  : ` ${ready.map((agent) => agent.label).join(" and ")} reports authenticated on this machine` +
38
- ` — set actors[0].type: local-agent to use ${ready.length === 1 ? "it" : "one"} instead of a key.`;
38
+ `. Set actors[0].type: local-agent to use ${ready.length === 1 ? "it" : "one"} instead of a key.`;
39
39
  })()
40
40
  : "";
41
41
  return {
42
- code: "HUMANISH_CUA_LAB_KEYS_MISSING",
42
+ code: "HUMANISH_COMPUTER_USE_KEYS_MISSING",
43
43
  message: `Live computer-use labs need ${missing.join(" and ")} in the environment (values are never persisted). ${describeMissingKeys(missing, env)}${suggestion}`,
44
44
  };
45
45
  }
46
46
  // A caller's createProvider makes the brain `caller`, so only the lab's own local agent is checked.
47
47
  if (localAgent) {
48
- // Refuse HERE, before a sandbox exists. "codex is not installed" discovered after the
48
+ // Refuse here, before a sandbox exists. "codex is not installed" discovered after the
49
49
  // machine is paid for is the same information delivered at the worst possible moment.
50
50
  const refusal = await localAgentRefusal({ agent: localAgent, env, caps });
51
51
  if (refusal)
@@ -54,38 +54,38 @@ export async function liveCuaRejection(args) {
54
54
  const unsetSubjectEnv = missingSubjectEnv(requirements, env);
55
55
  if (unsetSubjectEnv.length > 0) {
56
56
  return {
57
- code: "HUMANISH_CUA_LAB_SUBJECT_ENV_MISSING",
57
+ code: "HUMANISH_COMPUTER_USE_SUBJECT_ENV_MISSING",
58
58
  message: `subject.env declares ${unsetSubjectEnv.join(", ")} but the environment does not provide ${unsetSubjectEnv.length === 1 ? "it" : "them"} (pass via --env-file; values are never persisted).`,
59
59
  };
60
60
  }
61
- // FAIL-CLOSED CAP TENSION (discipline #3): a maxUsd cap needs a MEASURABLE per-turn estimate.
61
+ // Fail-closed cap: a maxUsd cap needs a measurable per-turn estimate.
62
62
  // If the operator set execution.caps.maxUsd but src/run/pricing.ts has no rate for the resolved
63
- // model, the loop could not enforce the cap — and silently running uncapped would break the
64
- // runaway-retry protection. Refuse at PREFLIGHT (before any sandbox/spend) rather than run
65
- // uncapped: an unenforceable cap is more dangerous than none. The operator adds a rate to
66
- // src/run/pricing.ts (the honest place) or removes the cap.
63
+ // model, the loop could not enforce the cap, and silently running uncapped would break the
64
+ // runaway-retry protection. Refuse at preflight (before any sandbox/spend) rather than run
65
+ // uncapped: an unenforceable cap is more dangerous than none. The operator picks a priced model
66
+ // or removes the cap; a source checkout can also add a rate to src/run/pricing.ts.
67
67
  if (caps.maxUsd !== undefined || caps.maxTotalUsd !== undefined) {
68
68
  const model = pricedModel(brain);
69
69
  const capModelId = model.trim().toLowerCase();
70
70
  if (!MODEL_RATES[capModelId]) {
71
71
  return {
72
- code: "HUMANISH_CUA_LAB_UNPRICED_CAP",
73
- message: `execution.caps declares a spend cap (maxUsd/maxTotalUsd) but src/run/pricing.ts has no rate for model "${model}"; add a rate or remove the cap — an unenforceable cap is refused rather than run uncapped.`,
72
+ code: "HUMANISH_COMPUTER_USE_UNPRICED_CAP",
73
+ message: unpricedCapMessage(model),
74
74
  };
75
75
  }
76
76
  }
77
- // Adopter-hosted comms catch (#380): fail closed BEFORE any sandbox is created — a comms lab
77
+ // Adopter-hosted comms catch: fail closed before any sandbox is created, because a comms lab
78
78
  // whose catch is unreachable collects nothing while every participant still spends. The probe asserts
79
- // OUR service marker in /health, so an adopter's proxy answering 200 for everything cannot
79
+ // humanish's own service marker in /health, so an adopter's proxy answering 200 for everything cannot
80
80
  // pass for a catch.
81
81
  const tokenRefusal = externalCommsConfig === undefined
82
82
  ? undefined
83
83
  : catchTokenRefusal(catchTokenOf(externalCommsConfig, env));
84
84
  if (tokenRefusal !== undefined)
85
- return { code: "HUMANISH_CUA_LAB_COMMS_TOKEN_INVALID", message: tokenRefusal };
85
+ return { code: "HUMANISH_COMPUTER_USE_COMMS_TOKEN_INVALID", message: tokenRefusal };
86
86
  if (externalCommsConfig && !(await externalCatchHealthy(externalCommsConfig))) {
87
87
  return {
88
- code: "HUMANISH_CUA_LAB_COMMS_CATCH_UNREACHABLE",
88
+ code: "HUMANISH_COMPUTER_USE_COMMS_CATCH_UNREACHABLE",
89
89
  message: "The external comms catch or inbox is unreachable or incompatible (GET /health must identify humanish-comms-catch and advertise recipient-inbox-v1). Update humanish on the catch host and restart it with `humanish comms catch` on that host, or drop comms.email to run without the inbox funnel.",
90
90
  };
91
91
  }
@@ -36,7 +36,7 @@ export async function resolveCuaRerunSelection(args) {
36
36
  if (selectedIds.length === 0) {
37
37
  return {
38
38
  ok: false,
39
- message: `source run ${bundle.runId} has no failed, blocked, timed-out, or hollow participants to rerun.`,
39
+ message: `source run ${bundle.runId} has no participant to rerun: none failed, was blocked, timed out or ended without engaging.`,
40
40
  };
41
41
  }
42
42
  const missingPrior = selectedIds.filter((id) => !priorById.has(id));
@@ -7,8 +7,9 @@ import { summarizeCuaDiagnostics } from "./diagnostics.js";
7
7
  import { toParticipantResult } from "./participant-execution.js";
8
8
  import { buildCuaRunBundle, judgeComputerUseRun } from "./bundle.js";
9
9
  import { aggregateCuaSubject, projectParticipantSubjects, subjectProvenanceArg, } from "./subject-projection.js";
10
- import { CUA_ACTOR_LAB_SCHEMA, CUA_FANOUT_STRATEGY, participantSubjectEnv, } from "./types.js";
10
+ import { CUA_FANOUT_STRATEGY, participantSubjectEnv, } from "./types.js";
11
11
  import { plannedAppUrl } from "./plan.js";
12
+ import { studyResultIdentity } from "../../run/study-result.js";
12
13
  /** Aggregate participant counts for the result projection. */
13
14
  function buildParticipantSummary(outcomes, participantCount, participantPlan, dryRun) {
14
15
  if (dryRun || !outcomes) {
@@ -83,19 +84,19 @@ function cuaLabResult(args) {
83
84
  if (ok)
84
85
  return undefined;
85
86
  if (adapterFailure !== undefined) {
86
- return { code: "HUMANISH_CUA_LAB_FAILED", message: adapterFailure };
87
+ return { code: "HUMANISH_COMPUTER_USE_FAILED", message: adapterFailure };
87
88
  }
88
89
  if (participantCount === 1) {
89
90
  const outcome = firstOutcome;
90
91
  return {
91
- code: outcome?.failureCode ?? "HUMANISH_CUA_LAB_FAILED",
92
+ code: outcome?.failureCode ?? "HUMANISH_COMPUTER_USE_FAILED",
92
93
  message: outcome?.sessionError ??
93
94
  outcome?.providerCleanupError ??
94
95
  outcome?.providerPolicyError ??
95
96
  (outcome?.noEngagement
96
97
  ? "Actor took no actions and produced no message (likely a blank/still-loading screen); not a credible goal_satisfied."
97
98
  : // The participant result (toParticipantResult) named this refusal; the N=1 envelope fell through to
98
- // "did not produce a terminal session", which is false — it produced one and refused it.
99
+ // "did not produce a terminal session", which is false: it produced one and refused it.
99
100
  outcome?.selfReportedBlocker
100
101
  ? "Actor reported goal_satisfied while its final message described a blocker or asked for missing instructions; not a credible pass."
101
102
  : observer.ok
@@ -108,20 +109,19 @@ function cuaLabResult(args) {
108
109
  };
109
110
  }
110
111
  const failing = (outcomes ?? []).find((outcome) => !participantOk(outcome));
111
- const geometryFailure = (outcomes ?? []).find((outcome) => outcome.failureCode === "HUMANISH_CUA_LAB_DEVICE_GEOMETRY");
112
- const code = geometryFailure?.failureCode ?? "HUMANISH_CUA_LAB_FAILED";
112
+ const geometryFailure = (outcomes ?? []).find((outcome) => outcome.failureCode === "HUMANISH_COMPUTER_USE_DEVICE_GEOMETRY");
113
+ const code = geometryFailure?.failureCode ?? "HUMANISH_COMPUTER_USE_FAILED";
113
114
  return {
114
115
  code,
115
116
  message: observer.ok
116
- ? `Fan-out run failed: ${summary.passed}/${participantCount} participant(s) passed (${summary.skipped} skipped, ${summary.harnessErrors} harness error(s), ${summary.hollow} hollow)${failing?.sessionError !== undefined ? `; first failure: ${failing.sessionError}` : failing === undefined && args.execution.failures[0] !== undefined ? `; ${args.execution.failures[0].message}` : ""}.`
117
+ ? `Fan-out run failed: ${summary.passed}/${participantCount} participant(s) passed (${summary.skipped} skipped, ${summary.harnessErrors} harness error(s), ${summary.hollow} without engagement)${failing?.sessionError !== undefined ? `; first failure: ${failing.sessionError}` : failing === undefined && args.execution.failures[0] !== undefined ? `; ${args.execution.failures[0].message}` : ""}.`
117
118
  : (observer.error?.message ?? "Observer failed for the computer-use fan-out run."),
118
119
  };
119
120
  })();
120
121
  return {
121
- schema: CUA_ACTOR_LAB_SCHEMA,
122
+ ...studyResultIdentity("computer-use", labId),
122
123
  ok,
123
124
  cwd,
124
- labId,
125
125
  actor: args.actorId,
126
126
  appUrl,
127
127
  dryRun,
@@ -214,7 +214,7 @@ function participantCapWarning(caps, participantCount) {
214
214
  return undefined;
215
215
  if (caps.maxTotalUsd !== undefined)
216
216
  return undefined;
217
- return `execution.caps.maxUsd ($${capUsd}) is a PER-PARTICIPANT cap; ${participantCount} participants may spend up to ${participantCount} × $${capUsd} (~$${round6(capUsd * participantCount)} total) before any participant aborts. Set execution.caps.maxTotalUsd for a shared study budget.`;
217
+ return `execution.caps.maxUsd ($${capUsd}) caps each participant, so ${participantCount} participants may spend up to ${participantCount} × $${capUsd} (about $${round6(capUsd * participantCount)}) before any of them stops. Set execution.caps.maxTotalUsd for one budget across the study.`;
218
218
  }
219
219
  /** Builds and publishes the final bundle, runs the adapter hooks, renders the Observer and returns the result. */
220
220
  export async function finishCuaRun(setup, finish, ran) {
@@ -227,7 +227,7 @@ export async function finishCuaRun(setup, finish, ran) {
227
227
  const { runId } = run;
228
228
  const participantCount = participantRuns.length;
229
229
  const { outcomes, failFastReason, receiving, receivingWarnings, externalCommsWarnings } = ran;
230
- // Per-participant subject projections (invariant 5).
230
+ // Per-participant subject projections.
231
231
  const subjects = projectParticipantSubjects({ ...subjectArgs, outcomes, dryRun });
232
232
  const aggregate = aggregateCuaSubject({ subjects, outcomes, participantCount, dryRun });
233
233
  const aggregateSubject = aggregate.subject;
@@ -4,7 +4,8 @@ import type { LabConfig } from "../../lab/types.js";
4
4
  import { type ComputerUseRefusal } from "./plan.js";
5
5
  import { type ComputerUseRunInput, type CuaActorLabResult, type RunCuaActorLabOptions } from "./types.js";
6
6
  /**
7
- * The library entry for a computer-use lab. It plans the config with planComputerUseLab and runs
7
+ * Plans and runs a computer-use lab in one call. It is not exported from src/index.ts; tests call
8
+ * it. It plans the config with planComputerUseLab and runs
8
9
  * the plan with runComputerUsePlan, whose run scope and withTransientCommsSecrets wrapper cover the
9
10
  * run and its analysis.
10
11
  */
@@ -1,6 +1,6 @@
1
1
  // The computer-use lab backend: a subject (an app-url the caller provisioned, or a repo the
2
- // lab clones AND serves in-sandbox) driven by a REGISTRY-RESOLVED computer-use actor inside a
3
- // hosted E2B desktop. This is the path that makes `actors[].type` load-bearing — the
2
+ // lab clones and serves in-sandbox) driven by a registry-resolved computer-use actor inside a
3
+ // hosted E2B desktop. On this path `actors[].type` selects the actor: the
4
4
  // descriptor returned by the registry runs the session; the lab provisions the desktop and
5
5
  // subject, composes the prompt from config, persists the evidence bundle, and tears down.
6
6
  //
@@ -8,19 +8,19 @@
8
8
  // - The desktop is created via the shared loader in src/substrates/e2b/sdk.ts with
9
9
  // kill-on-timeout lifecycle, so a dead host process can never orphan a sandbox past its
10
10
  // server-side deadline.
11
- // - Env placement follows the doctrine (docs/principles/invariants-and-defaults.md): the
12
- // ACTOR's key never enters the sandbox (the model drives from outside via the provider API);
13
- // the SUBJECT's declared env NAMES are provisioned in on the clone route — values come from
11
+ // - Env placement follows the placement rule (docs/principles/invariants-and-defaults.md): the
12
+ // actor's key never enters the sandbox (the model drives from outside via the provider API);
13
+ // the subject's declared env names are provisioned in on the clone route; values come from
14
14
  // the caller's environment and are never logged or persisted.
15
15
  // - The live stream URL is runtime-only (carries an auth key) and is never persisted into run
16
- // artifacts — only its presence is recorded.
16
+ // artifacts; only its presence is recorded.
17
17
  // - Evidence redaction is mode-aware (docs/principles/invariants-and-defaults.md, the
18
- // capture-vs-publish rule): screenshots persist RAW (full fidelity) by default into gitignored
18
+ // capture-vs-publish rule): screenshots persist raw (full fidelity) by default into gitignored
19
19
  // .humanish/; `policies.redactScreenshots: true` opts into blur-at-capture for a share-as-is
20
- // bundle. Length-only typed text and text redaction of reasoning/messages are UNCONDITIONAL;
21
- // harness errors are redacted at THIS boundary; the bundle's `stream.actor` carries the
20
+ // bundle. Length-only typed text and text redaction of reasoning/messages are unconditional;
21
+ // harness errors are redacted at this boundary; the bundle's `stream.actor` carries the
22
22
  // conformant humanish.actor-trace.v1 projection, whose `redaction.screenshots` records the
23
- // run's actual mode ("raw" | "blurred" | "n/a") — every label downstream derives from it.
23
+ // run's actual mode ("raw" | "blurred" | "n/a"), and every label downstream derives from it.
24
24
  import { withTransientCommsSecrets } from "../../run/transient-comms-secrets.js";
25
25
  import path from "node:path";
26
26
  import { completeAutomaticAnalysis } from "../../analysis/automatic-completion.js";
@@ -32,9 +32,11 @@ import { callerDrivingOf, planComputerUseLab } from "./plan.js";
32
32
  import { finishCuaRun } from "./result.js";
33
33
  import { runLabParticipants } from "./live-phase.js";
34
34
  import { admitCuaRun, refuseCuaLab, startCuaRun } from "./setup.js";
35
- import { CUA_ACTOR_LAB_SCHEMA, } from "./types.js";
35
+ import {} from "./types.js";
36
+ import { studyResultIdentity } from "../../run/study-result.js";
36
37
  /**
37
- * The library entry for a computer-use lab. It plans the config with planComputerUseLab and runs
38
+ * Plans and runs a computer-use lab in one call. It is not exported from src/index.ts; tests call
39
+ * it. It plans the config with planComputerUseLab and runs
38
40
  * the plan with runComputerUsePlan, whose run scope and withTransientCommsSecrets wrapper cover the
39
41
  * run and its analysis.
40
42
  */
@@ -61,10 +63,9 @@ export async function computerUseLabRefusal(options, refusal) {
61
63
  const { config, dryRun } = options;
62
64
  if (refusal.stage === "before-scope")
63
65
  return {
64
- schema: CUA_ACTOR_LAB_SCHEMA,
66
+ ...studyResultIdentity("computer-use", config.id),
65
67
  ok: false,
66
68
  cwd: path.resolve(options.cwd),
67
- labId: config.id,
68
69
  actor: config.actors[0]?.type ?? "",
69
70
  dryRun,
70
71
  runId: options.runId ?? "not-created",
@@ -1,21 +1,21 @@
1
1
  import type { CuaLoopResult } from "../../actors/computer-use/loop.js";
2
2
  import { type SessionEnding } from "../../run/judge.js";
3
3
  /**
4
- * A goal_satisfied participant counts as a self-reported blocker ONLY when its final narrative contradicts
5
- * the goal AND the run's own stop predicate did NOT fire. A matched stopWhen is independent,
6
- * structured completion evidence, so it overrides a text scan of the free-form narrative — which can
7
- * otherwise trip on the subject app's OWN quoted copy (e.g. a relayed "cannot be undone" banner).
8
- * Resolved-arc segments never block the verdict (#453). Returns the offending reason, or undefined
4
+ * A goal_satisfied participant counts as a self-reported blocker only when its final narrative contradicts
5
+ * the goal and the run's own stop predicate did not fire. A matched stopWhen is independent,
6
+ * structured completion evidence, so it overrides a text scan of the free-form narrative, which can
7
+ * otherwise trip on the subject app's own quoted copy (e.g. a relayed "cannot be undone" banner).
8
+ * Resolved-arc segments never block the verdict. Returns the offending reason, or undefined
9
9
  * when the participant is a clean pass. Exported for testing.
10
10
  */
11
11
  export declare function resolveSelfReportedBlocker(session: CuaLoopResult | undefined): string | undefined;
12
12
  /** A session's ending, reduced to what the judge's engagement and blocker rules read. */
13
13
  export declare function sessionEnding(session: CuaLoopResult): SessionEnding;
14
14
  /**
15
- * Friction is independent of how a completed session ended (#657). Read the participant's
15
+ * Friction is independent of how a completed session ended. Read the participant's
16
16
  * redacted messages, including earlier reports, rather than the harness-owned reason that
17
17
  * stopWhen/dwell writes. Reasoning, observations, and notices are not participant reports.
18
- * Resolved arcs still count (#453); quoted copy and negated reports still do not. This read
18
+ * Resolved arcs still count; quoted copy and negated reports still do not. This read
19
19
  * never changes the verdict. Exported for testing.
20
20
  */
21
21
  export declare function resolveSelfReportedFriction(session: CuaLoopResult | undefined): string | undefined;