humanish 0.108.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/ARCHITECTURE.md +58 -59
  2. package/CHANGELOG.md +13 -0
  3. package/CONTEXT.md +44 -44
  4. package/README.md +3 -3
  5. package/TELEMETRY.md +2 -2
  6. package/dist/actors/codex/app-server-trace.js +2 -1
  7. package/dist/actors/codex/restricted-participant.js +12 -12
  8. package/dist/actors/codex/restricted-session.d.ts +2 -2
  9. package/dist/actors/computer-use/actor.d.ts +6 -6
  10. package/dist/actors/computer-use/actor.js +2 -2
  11. package/dist/actors/computer-use/admission-limit.d.ts +2 -2
  12. package/dist/actors/computer-use/admission-limit.js +3 -3
  13. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  14. package/dist/actors/computer-use/executor-error.js +3 -3
  15. package/dist/actors/computer-use/loop/actions.js +5 -5
  16. package/dist/actors/computer-use/loop/debrief.js +2 -2
  17. package/dist/actors/computer-use/loop/ending.d.ts +1 -1
  18. package/dist/actors/computer-use/loop/ending.js +12 -11
  19. package/dist/actors/computer-use/loop/observation.js +6 -5
  20. package/dist/actors/computer-use/loop/provider-call.js +11 -11
  21. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  22. package/dist/actors/computer-use/loop/session.js +2 -2
  23. package/dist/actors/computer-use/loop/trace.js +3 -2
  24. package/dist/actors/computer-use/loop/types.d.ts +24 -24
  25. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  26. package/dist/actors/computer-use/loop.d.ts +6 -1
  27. package/dist/actors/computer-use/loop.js +26 -4
  28. package/dist/actors/computer-use/openai-provider.d.ts +2 -2
  29. package/dist/actors/computer-use/openai-provider.js +8 -8
  30. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  31. package/dist/actors/computer-use/provider-error.js +6 -6
  32. package/dist/actors/contract.d.ts +4 -4
  33. package/dist/actors/contract.js +1 -1
  34. package/dist/actors/local-agent/claude-session.js +3 -3
  35. package/dist/actors/local-agent/cli.d.ts +1 -1
  36. package/dist/actors/local-agent/cli.js +1 -1
  37. package/dist/actors/reasoning-effort.js +3 -3
  38. package/dist/actors/registry.d.ts +2 -2
  39. package/dist/actors/registry.js +3 -3
  40. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  41. package/dist/actors/scripted-browser/actor.js +1 -1
  42. package/dist/analysis/automatic-completion.d.ts +7 -7
  43. package/dist/analysis/automatic-completion.js +1 -1
  44. package/dist/analysis/automatic-config.d.ts +6 -6
  45. package/dist/analysis/automatic-config.js +1 -1
  46. package/dist/analysis/execute.d.ts +1 -1
  47. package/dist/analysis/execute.js +1 -1
  48. package/dist/analysis/types.d.ts +6 -0
  49. package/dist/browser-control/client.js +16 -16
  50. package/dist/browser-control/dispatcher.js +4 -4
  51. package/dist/browser-control/protocol.js +14 -14
  52. package/dist/browser-control/recording-transfer.js +4 -4
  53. package/dist/browser-control/transport.js +7 -7
  54. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  55. package/dist/cli/commands/comms.js +14 -22
  56. package/dist/cli/commands/observe.d.ts +0 -1
  57. package/dist/cli/commands/observe.js +0 -15
  58. package/dist/cli/commands/run-command.d.ts +2 -2
  59. package/dist/cli/commands/run-command.js +3 -3
  60. package/dist/cli/commands/runs.js +3 -5
  61. package/dist/cli/commands/setup.js +5 -7
  62. package/dist/cli/commands/study-format.d.ts +9 -0
  63. package/dist/cli/commands/{lab-format.js → study-format.js} +5 -5
  64. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  65. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +12 -12
  66. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  67. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  68. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  69. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +3 -3
  70. package/dist/cli/commands/study-route-run.d.ts +19 -0
  71. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  72. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  73. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  74. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  75. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +7 -7
  76. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  77. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  78. package/dist/cli/commands/study-run.d.ts +9 -0
  79. package/dist/cli/commands/{lab-run.js → study-run.js} +34 -34
  80. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +5 -5
  81. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +1 -1
  82. package/dist/cli/commands/study.js +13 -49
  83. package/dist/cli/commands/tui.js +12 -12
  84. package/dist/cli/commands/watch.js +30 -65
  85. package/dist/cli/deprecations.d.ts +1 -13
  86. package/dist/cli/deprecations.js +0 -30
  87. package/dist/cli/doctor.d.ts +3 -3
  88. package/dist/cli/doctor.js +16 -16
  89. package/dist/cli/first-run-path.d.ts +4 -4
  90. package/dist/cli/first-run-path.js +7 -7
  91. package/dist/cli/io.d.ts +3 -3
  92. package/dist/cli/io.js +2 -2
  93. package/dist/cli/observer-follow.d.ts +2 -2
  94. package/dist/cli/observer-follow.js +2 -2
  95. package/dist/cli/orientation.d.ts +4 -4
  96. package/dist/cli/orientation.js +58 -20
  97. package/dist/cli/program.js +3 -4
  98. package/dist/cli/telemetry.d.ts +1 -1
  99. package/dist/cli/telemetry.js +14 -20
  100. package/dist/comms/catch-host.d.ts +1 -1
  101. package/dist/comms/catch-host.js +3 -3
  102. package/dist/comms/connections.d.ts +1 -1
  103. package/dist/comms/connections.js +2 -2
  104. package/dist/comms/external-evidence.d.ts +5 -5
  105. package/dist/comms/external-evidence.js +4 -3
  106. package/dist/comms/fake-inbox.d.ts +2 -2
  107. package/dist/comms/fake-inbox.js +2 -2
  108. package/dist/comms/receiving-runtime.d.ts +4 -4
  109. package/dist/comms/sandbox-catch.d.ts +2 -2
  110. package/dist/comms/sandbox-catch.js +2 -2
  111. package/dist/comms/setup.d.ts +2 -2
  112. package/dist/comms/setup.js +29 -32
  113. package/dist/feedback/draft.js +2 -2
  114. package/dist/feedback/export.js +3 -2
  115. package/dist/feedback/proof.d.ts +1 -1
  116. package/dist/feedback/proof.js +2 -2
  117. package/dist/guest/bootstrap.js +6 -6
  118. package/dist/guest/browser-tools.js +8 -8
  119. package/dist/guest/chromium-text.js +17 -17
  120. package/dist/guest/desktop-executor.d.ts +2 -2
  121. package/dist/guest/desktop-executor.js +20 -20
  122. package/dist/guest/desktop-keys.js +4 -4
  123. package/dist/guest/desktop-media.d.ts +2 -2
  124. package/dist/guest/desktop-media.js +16 -16
  125. package/dist/guest/desktop-native.js +10 -10
  126. package/dist/guest/runtime-desktop.js +2 -2
  127. package/dist/guest/runtime-processes.d.ts +2 -2
  128. package/dist/guest/runtime-processes.js +2 -2
  129. package/dist/guest/runtime.js +5 -5
  130. package/dist/index.d.ts +13 -15
  131. package/dist/index.js +6 -8
  132. package/dist/observer/artifact.d.ts +1 -1
  133. package/dist/observer/artifact.js +1 -1
  134. package/dist/observer/data.d.ts +1 -1
  135. package/dist/observer/library.d.ts +2 -0
  136. package/dist/observer/library.js +4 -1
  137. package/dist/observer/render.js +7 -1
  138. package/dist/observer/run-routes.d.ts +1 -0
  139. package/dist/observer/run-routes.js +37 -12
  140. package/dist/observer/serve.d.ts +1 -1
  141. package/dist/observer-app.html +1 -1
  142. package/dist/routes/computer-use/bundle-parts.js +3 -2
  143. package/dist/routes/computer-use/bundle.d.ts +2 -2
  144. package/dist/routes/computer-use/bundle.js +7 -6
  145. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +5 -5
  146. package/dist/routes/computer-use/e2b-desktop/comms.js +5 -4
  147. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +1 -1
  148. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  149. package/dist/routes/computer-use/e2b-desktop/prepare.js +3 -3
  150. package/dist/routes/computer-use/e2b-desktop/start.js +3 -4
  151. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  152. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -3
  153. package/dist/routes/computer-use/external-comms.d.ts +3 -3
  154. package/dist/routes/computer-use/fanout-bundle.js +11 -10
  155. package/dist/routes/computer-use/fanout-records.js +2 -2
  156. package/dist/routes/computer-use/live-flush.d.ts +3 -3
  157. package/dist/routes/computer-use/live-phase.d.ts +2 -3
  158. package/dist/routes/computer-use/live-phase.js +3 -3
  159. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  160. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  161. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  162. package/dist/routes/computer-use/local-vm.js +2 -2
  163. package/dist/routes/computer-use/participant-desktop.d.ts +3 -3
  164. package/dist/routes/computer-use/participant-desktop.js +1 -1
  165. package/dist/routes/computer-use/participant-execution.js +1 -1
  166. package/dist/routes/computer-use/participant-model.js +3 -3
  167. package/dist/routes/computer-use/participant-prompt.d.ts +5 -5
  168. package/dist/routes/computer-use/participant-prompt.js +3 -3
  169. package/dist/routes/computer-use/participant-runs.d.ts +10 -10
  170. package/dist/routes/computer-use/participant-runs.js +14 -13
  171. package/dist/routes/computer-use/plan.d.ts +12 -12
  172. package/dist/routes/computer-use/plan.js +24 -24
  173. package/dist/routes/computer-use/preflight.d.ts +5 -5
  174. package/dist/routes/computer-use/preflight.js +5 -5
  175. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  176. package/dist/routes/computer-use/rerun-selection.js +3 -2
  177. package/dist/routes/computer-use/result.d.ts +4 -4
  178. package/dist/routes/computer-use/result.js +13 -12
  179. package/dist/routes/computer-use/route.d.ts +12 -12
  180. package/dist/routes/computer-use/route.js +19 -19
  181. package/dist/routes/computer-use/self-report.js +1 -1
  182. package/dist/routes/computer-use/setup.d.ts +22 -22
  183. package/dist/routes/computer-use/setup.js +15 -15
  184. package/dist/routes/computer-use/single-bundle.d.ts +4 -4
  185. package/dist/routes/computer-use/single-bundle.js +14 -13
  186. package/dist/routes/computer-use/subject-projection.d.ts +3 -3
  187. package/dist/routes/computer-use/types.d.ts +34 -34
  188. package/dist/routes/computer-use/types.js +3 -3
  189. package/dist/routes/preview.d.ts +6 -6
  190. package/dist/routes/preview.js +5 -5
  191. package/dist/routes/scripted/bundle.d.ts +6 -6
  192. package/dist/routes/scripted/bundle.js +10 -9
  193. package/dist/routes/scripted/plan.d.ts +7 -7
  194. package/dist/routes/scripted/plan.js +6 -6
  195. package/dist/routes/scripted/result.d.ts +3 -3
  196. package/dist/routes/scripted/result.js +9 -9
  197. package/dist/routes/scripted/route.d.ts +9 -9
  198. package/dist/routes/scripted/route.js +11 -11
  199. package/dist/routes/scripted/scenario.d.ts +1 -1
  200. package/dist/routes/scripted/scenario.js +3 -3
  201. package/dist/routes/scripted/setup.d.ts +6 -6
  202. package/dist/routes/scripted/setup.js +4 -4
  203. package/dist/routes/scripted/subject.d.ts +5 -5
  204. package/dist/routes/scripted/subject.js +3 -3
  205. package/dist/routes/scripted/surface-records.d.ts +1 -1
  206. package/dist/routes/scripted/surface-records.js +2 -2
  207. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  208. package/dist/routes/scripted/types.d.ts +17 -17
  209. package/dist/routes/scripted/types.js +1 -1
  210. package/dist/routes/shared-world/bundle-records.js +3 -3
  211. package/dist/routes/shared-world/bundle.js +15 -14
  212. package/dist/routes/shared-world/checkpoints.d.ts +3 -3
  213. package/dist/routes/shared-world/checkpoints.js +1 -1
  214. package/dist/routes/shared-world/comms.d.ts +9 -9
  215. package/dist/routes/shared-world/comms.js +6 -5
  216. package/dist/routes/shared-world/participant-specs.d.ts +3 -3
  217. package/dist/routes/shared-world/participant-specs.js +7 -7
  218. package/dist/routes/shared-world/plan.d.ts +9 -9
  219. package/dist/routes/shared-world/plan.js +9 -9
  220. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  221. package/dist/routes/shared-world/provisioned.js +4 -4
  222. package/dist/routes/shared-world/result.d.ts +6 -6
  223. package/dist/routes/shared-world/result.js +11 -10
  224. package/dist/routes/shared-world/route.d.ts +11 -11
  225. package/dist/routes/shared-world/route.js +19 -19
  226. package/dist/routes/shared-world/setup.d.ts +13 -13
  227. package/dist/routes/shared-world/setup.js +19 -19
  228. package/dist/routes/shared-world/types.d.ts +27 -27
  229. package/dist/routes/terminal/adapter.d.ts +2 -2
  230. package/dist/routes/terminal/adapter.js +4 -4
  231. package/dist/routes/terminal/bundle.d.ts +11 -11
  232. package/dist/routes/terminal/bundle.js +12 -12
  233. package/dist/routes/terminal/credentials.d.ts +4 -4
  234. package/dist/routes/terminal/credentials.js +5 -5
  235. package/dist/routes/terminal/dry-run.d.ts +4 -4
  236. package/dist/routes/terminal/dry-run.js +9 -9
  237. package/dist/routes/terminal/ledger.d.ts +2 -2
  238. package/dist/routes/terminal/lifetime.d.ts +1 -1
  239. package/dist/routes/terminal/lifetime.js +1 -1
  240. package/dist/routes/terminal/live-finish.d.ts +2 -2
  241. package/dist/routes/terminal/live-finish.js +7 -7
  242. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  243. package/dist/routes/terminal/live-sandbox.js +3 -2
  244. package/dist/routes/terminal/participant-text.js +2 -1
  245. package/dist/routes/terminal/persona.d.ts +2 -2
  246. package/dist/routes/terminal/persona.js +2 -2
  247. package/dist/routes/terminal/plan.d.ts +7 -7
  248. package/dist/routes/terminal/plan.js +5 -5
  249. package/dist/routes/terminal/result.d.ts +5 -5
  250. package/dist/routes/terminal/result.js +7 -7
  251. package/dist/routes/terminal/route.d.ts +9 -9
  252. package/dist/routes/terminal/route.js +14 -14
  253. package/dist/routes/terminal/session.d.ts +5 -5
  254. package/dist/routes/terminal/session.js +7 -7
  255. package/dist/routes/terminal/trace.d.ts +2 -2
  256. package/dist/routes/terminal/types.d.ts +24 -24
  257. package/dist/routes/terminal/types.js +2 -2
  258. package/dist/run/bundle.d.ts +7 -7
  259. package/dist/run/bundle.js +2 -2
  260. package/dist/run/costs.d.ts +23 -0
  261. package/dist/run/costs.js +72 -43
  262. package/dist/run/dry-run-inputs.d.ts +1 -1
  263. package/dist/run/dry-run-inputs.js +1 -1
  264. package/dist/run/dry-run.js +2 -2
  265. package/dist/run/outcomes.d.ts +1 -1
  266. package/dist/run/participant.d.ts +1 -1
  267. package/dist/run/preflight-receipts.js +1 -1
  268. package/dist/run/pricing.js +2 -2
  269. package/dist/run/projection.d.ts +32 -32
  270. package/dist/run/projection.js +44 -44
  271. package/dist/run/reclaim.d.ts +1 -1
  272. package/dist/run/reclaim.js +1 -1
  273. package/dist/run/results.d.ts +2 -2
  274. package/dist/run/run-cost.d.ts +53 -0
  275. package/dist/run/run-cost.js +105 -0
  276. package/dist/run/run-index-analysis.d.ts +15 -0
  277. package/dist/run/run-index-analysis.js +77 -0
  278. package/dist/run/run-index.d.ts +11 -1
  279. package/dist/run/run-index.js +63 -49
  280. package/dist/run/run.d.ts +3 -3
  281. package/dist/run/run.js +2 -2
  282. package/dist/run/shared-world-evidence.d.ts +1 -1
  283. package/dist/run/shared-world-shape.js +1 -1
  284. package/dist/run/stats.d.ts +3 -3
  285. package/dist/run/stats.js +14 -14
  286. package/dist/run/status.d.ts +10 -2
  287. package/dist/run/status.js +6 -3
  288. package/dist/run/streams.d.ts +2 -2
  289. package/dist/run/study-provenance.d.ts +4 -2
  290. package/dist/run/study-provenance.js +7 -4
  291. package/dist/run/study-result.d.ts +0 -5
  292. package/dist/run/study-result.js +1 -1
  293. package/dist/run-study.d.ts +112 -0
  294. package/dist/{run-lab.js → run-study.js} +52 -45
  295. package/dist/{lab → study}/adapter-extension.d.ts +8 -20
  296. package/dist/{lab → study}/adapter-extension.js +2 -14
  297. package/dist/{lab → study}/adapter-scorer-loader.d.ts +10 -10
  298. package/dist/{lab → study}/adapter-scorer-loader.js +3 -3
  299. package/dist/study/composition-rules.d.ts +7 -0
  300. package/dist/{lab → study}/composition-rules.js +12 -12
  301. package/dist/study/config.d.ts +15 -0
  302. package/dist/{lab → study}/config.js +37 -20
  303. package/dist/study/convert.d.ts +1 -1
  304. package/dist/study/convert.js +15 -15
  305. package/dist/{lab → study}/device-presets.d.ts +2 -2
  306. package/dist/{lab → study}/discover.d.ts +29 -23
  307. package/dist/{lab → study}/discover.js +97 -118
  308. package/dist/{lab → study}/doctor.d.ts +11 -11
  309. package/dist/{lab → study}/doctor.js +18 -18
  310. package/dist/study/files.d.ts +2 -2
  311. package/dist/study/files.js +6 -5
  312. package/dist/{lab → study}/init-templates.d.ts +2 -2
  313. package/dist/{lab → study}/init-templates.js +16 -11
  314. package/dist/{lab → study}/init.d.ts +1 -1
  315. package/dist/{lab → study}/init.js +7 -4
  316. package/dist/{lab → study}/keys.d.ts +2 -2
  317. package/dist/{lab → study}/keys.js +10 -10
  318. package/dist/study/migrate.d.ts +1 -1
  319. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  320. package/dist/{lab → study}/parse/actors.js +5 -5
  321. package/dist/study/parse/comms.d.ts +12 -0
  322. package/dist/study/parse/execution.d.ts +19 -0
  323. package/dist/{lab → study}/parse/study-v3.d.ts +3 -5
  324. package/dist/{lab → study}/parse/study-v3.js +3 -3
  325. package/dist/{lab → study}/parse/subject-state.d.ts +8 -8
  326. package/dist/{lab → study}/parse/subject-state.js +4 -4
  327. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  328. package/dist/{lab → study}/parse/subject.js +8 -8
  329. package/dist/{lab → study}/parse/values.d.ts +2 -2
  330. package/dist/{lab → study}/persona-resolve.d.ts +4 -4
  331. package/dist/{lab → study}/persona-resolve.js +2 -2
  332. package/dist/{lab → study}/plan-base.d.ts +7 -7
  333. package/dist/{lab → study}/plan-base.js +1 -1
  334. package/dist/{lab → study}/plan-participants.d.ts +10 -10
  335. package/dist/{lab → study}/plan-participants.js +4 -4
  336. package/dist/{lab → study}/plan-types.d.ts +28 -28
  337. package/dist/{lab → study}/plan-types.js +2 -2
  338. package/dist/study/plan.d.ts +13 -0
  339. package/dist/{lab → study}/plan.js +20 -20
  340. package/dist/study/preflight-probes.d.ts +3 -0
  341. package/dist/{lab → study}/preflight-probes.js +9 -8
  342. package/dist/study/preflight-result.d.ts +8 -0
  343. package/dist/{lab → study}/preflight-result.js +3 -3
  344. package/dist/{lab → study}/preflight.d.ts +31 -31
  345. package/dist/{lab → study}/preflight.js +8 -8
  346. package/dist/{lab → study}/requirements.d.ts +3 -3
  347. package/dist/{lab → study}/requirements.js +1 -1
  348. package/dist/study/route-inputs.d.ts +28 -0
  349. package/dist/{lab → study}/route-inputs.js +1 -1
  350. package/dist/{lab → study}/routing.d.ts +12 -12
  351. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -10
  352. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -3
  353. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +8 -17
  354. package/dist/study/run-study-homes.js +3 -0
  355. package/dist/study/run-study-options.d.ts +28 -0
  356. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +13 -12
  357. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +2 -2
  358. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  359. package/dist/{lab → study}/summary.d.ts +10 -10
  360. package/dist/{lab → study}/summary.js +15 -15
  361. package/dist/{lab → study}/tasks.d.ts +3 -3
  362. package/dist/{lab → study}/tasks.js +1 -1
  363. package/dist/{lab → study}/types.d.ts +104 -104
  364. package/dist/{lab → study}/types.js +1 -1
  365. package/dist/{lab → study}/validation.d.ts +19 -19
  366. package/dist/{lab → study}/validation.js +13 -13
  367. package/dist/{lab → study}/warnings.d.ts +4 -4
  368. package/dist/{lab → study}/warnings.js +1 -1
  369. package/dist/subject/clone.d.ts +6 -6
  370. package/dist/subject/clone.js +2 -2
  371. package/dist/subject/local-tree-archive.d.ts +2 -2
  372. package/dist/subject/local-tree-archive.js +3 -3
  373. package/dist/subject/local-tree.d.ts +3 -3
  374. package/dist/subject/runtime.js +2 -2
  375. package/dist/subject/serve.d.ts +4 -4
  376. package/dist/subject/state.d.ts +3 -3
  377. package/dist/subject/state.js +1 -1
  378. package/dist/subject/steps.d.ts +1 -1
  379. package/dist/subject/steps.js +1 -1
  380. package/dist/substrates/desktop-session.js +2 -2
  381. package/dist/substrates/detached.d.ts +1 -1
  382. package/dist/substrates/e2b/desktop-browser.d.ts +4 -4
  383. package/dist/substrates/e2b/desktop-browser.js +1 -1
  384. package/dist/substrates/e2b/desktop-cdp.d.ts +1 -1
  385. package/dist/substrates/e2b/desktop-cdp.js +1 -1
  386. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  387. package/dist/substrates/e2b/desktop-executor.js +12 -12
  388. package/dist/substrates/e2b/desktop-geometry.d.ts +1 -1
  389. package/dist/substrates/e2b/desktop-geometry.js +1 -1
  390. package/dist/substrates/e2b/desktop-media.d.ts +3 -3
  391. package/dist/substrates/e2b/lifetime.js +1 -1
  392. package/dist/substrates/e2b/sandbox.d.ts +3 -3
  393. package/dist/substrates/e2b/sandbox.js +1 -1
  394. package/dist/substrates/e2b/sdk.d.ts +1 -1
  395. package/dist/substrates/e2b/sdk.js +1 -1
  396. package/dist/substrates/local/runtime-config.d.ts +4 -4
  397. package/dist/substrates/local/runtime-config.js +4 -4
  398. package/dist/tui/contract.d.ts +8 -8
  399. package/dist/tui/contract.js +2 -2
  400. package/dist/tui/launch.d.ts +3 -3
  401. package/dist/tui/launch.js +22 -16
  402. package/dist/tui-app.js +139 -139
  403. package/dist/verify/subject.d.ts +1 -1
  404. package/dist/verify/subject.js +1 -1
  405. package/dist/verify/verify.js +2 -1
  406. package/docs/architecture/actor-contract.md +5 -5
  407. package/docs/architecture/browser-control.md +1 -1
  408. package/docs/architecture/external-public-shared-world.md +8 -7
  409. package/docs/architecture/github-feedback-loop.md +1 -1
  410. package/docs/architecture/task-protocol-support.md +1 -1
  411. package/docs/architecture/terminal-product-route.md +18 -18
  412. package/docs/contracts/adapter-fixtures.md +2 -2
  413. package/docs/contracts/errors.md +8 -8
  414. package/docs/contracts/run-bundle.md +1 -4
  415. package/docs/contracts/schemas.md +61 -42
  416. package/docs/contracts/study-analysis.md +4 -1
  417. package/docs/contracts/study-costs.md +17 -2
  418. package/examples/README.md +1 -1
  419. package/examples/scorer/scorer.mjs +3 -3
  420. package/package.json +1 -1
  421. package/skills/humanish/SKILL.md +8 -6
  422. package/skills/humanish/agents/openai.yaml +1 -1
  423. package/dist/cli/commands/lab-format.d.ts +0 -9
  424. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  425. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  426. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  427. package/dist/cli/commands/lab-run.d.ts +0 -9
  428. package/dist/lab/composition-rules.d.ts +0 -7
  429. package/dist/lab/config.d.ts +0 -7
  430. package/dist/lab/deprecated-fields.d.ts +0 -10
  431. package/dist/lab/deprecated-fields.js +0 -24
  432. package/dist/lab/parse/comms.d.ts +0 -12
  433. package/dist/lab/parse/execution.d.ts +0 -19
  434. package/dist/lab/plan.d.ts +0 -13
  435. package/dist/lab/preflight-probes.d.ts +0 -3
  436. package/dist/lab/preflight-result.d.ts +0 -8
  437. package/dist/lab/route-inputs.d.ts +0 -28
  438. package/dist/lab/run-lab-homes.js +0 -7
  439. package/dist/lab/run-lab-options.d.ts +0 -28
  440. package/dist/library-aliases.d.ts +0 -56
  441. package/dist/library-aliases.js +0 -22
  442. package/dist/run-lab.d.ts +0 -112
  443. /package/dist/{lab → study}/device-presets.js +0 -0
  444. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  445. /package/dist/{lab → study}/init-paths.js +0 -0
  446. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  447. /package/dist/{lab → study}/init-plan.js +0 -0
  448. /package/dist/{lab → study}/parse/comms.js +0 -0
  449. /package/dist/{lab → study}/parse/execution.js +0 -0
  450. /package/dist/{lab → study}/parse/values.js +0 -0
  451. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  452. /package/dist/{lab → study}/participant-assignment.js +0 -0
  453. /package/dist/{lab → study}/persona.d.ts +0 -0
  454. /package/dist/{lab → study}/persona.js +0 -0
  455. /package/dist/{lab → study}/routing.js +0 -0
@@ -32,6 +32,11 @@ interface RunStatusOutcome {
32
32
  };
33
33
  /** The run-level estimate, `null` when declared absent (never coerced to 0). */
34
34
  estimatedCostUsd?: number | null;
35
+ /**
36
+ * `cost.fullyEstimated`: false when some participant or desktop usage has no price, so the
37
+ * estimate is a lower bound. Absent means unknown, as in every record written before 0.109.
38
+ */
39
+ estimatedCostComplete?: boolean;
35
40
  durationMs?: number;
36
41
  }
37
42
  /** The outcome a finalized status record carries, read from the bundle that was just written. */
@@ -43,7 +48,10 @@ export interface RunStatusRecord {
43
48
  mode: "dry-run" | "live";
44
49
  /** Absent when the run did not come from a study file (a library caller, a bare `run`). */
45
50
  study?: RunStudyProvenance;
46
- /** `study`'s value, written beside it until 0.109. Read either through studyProvenanceOf. */
51
+ /**
52
+ * `study`'s value, as runs saved by 0.108 and earlier wrote it. humanish no longer writes it.
53
+ * Read either through studyProvenanceOf.
54
+ */
47
55
  lab?: RunStudyProvenance;
48
56
  /** The pid that owns the run, for local liveness checks. */
49
57
  pid: number;
@@ -79,7 +87,7 @@ export interface RunStatusHandle {
79
87
  export interface BeginRunStatusOptions {
80
88
  runId: string;
81
89
  mode: "dry-run" | "live";
82
- lab?: RunStudyProvenance | undefined;
90
+ study?: RunStudyProvenance | undefined;
83
91
  }
84
92
  /**
85
93
  * Start a run's status record and keep it fresh. Fire-and-forget by design: a status write that
@@ -1,12 +1,12 @@
1
1
  // Run identity and liveness on disk: one small record per run, written by every backend, that says
2
- // which lab the run belongs to and whether it is still alive. A reader can list and classify runs
2
+ // which study the run belongs to and whether it is still alive. A reader can list and classify runs
3
3
  // from it without parsing every bundle, and can tell a live run from an abandoned one.
4
4
  //
5
5
  // run.json remains the evidence of record. This file is a derived index and liveness record:
6
6
  // `verify` never gates on it, nothing here is a claim about what a participant did, and when the
7
7
  // two disagree run.json wins and this file can be rebuilt from it.
8
8
  //
9
- // Public safety: it holds only the run id, the lab id/path/origin (the strings `humanish lab list`
9
+ // Public safety: it holds only the run id, the study id/path/origin (the strings `humanish study list`
10
10
  // prints), the mode, a local pid and timestamps. It holds no hostname or user/path identity: an
11
11
  // operator may share the run directory, so a share-safety gate must have nothing to strip here.
12
12
  import { isProvenanceField, studyFields } from "./study-provenance.js";
@@ -42,6 +42,9 @@ export function runStatusOutcome(bundle) {
42
42
  ...(bundle.cost?.estimatedTotalUsd === undefined
43
43
  ? {}
44
44
  : { estimatedCostUsd: bundle.cost.estimatedTotalUsd }),
45
+ ...(typeof bundle.cost?.fullyEstimated === "boolean"
46
+ ? { estimatedCostComplete: bundle.cost.fullyEstimated }
47
+ : {}),
45
48
  };
46
49
  }
47
50
  /**
@@ -57,7 +60,7 @@ export function beginRunStatus(runPaths, options) {
57
60
  runId: options.runId,
58
61
  state: "running",
59
62
  mode: options.mode,
60
- ...studyFields(options.lab),
63
+ ...studyFields(options.study),
61
64
  pid: process.pid,
62
65
  startedAt,
63
66
  updatedAt: startedAt,
@@ -64,7 +64,7 @@ export interface RunDesktopGeometry {
64
64
  source: "xdpyinfo";
65
65
  };
66
66
  /**
67
- * The device preset as declared by the lab, present only when it differs from `requested`
67
+ * The device preset as declared by the study, present only when it differs from `requested`
68
68
  * because the rendered width was floored to MIN_DESKTOP_RENDER_WIDTH.
69
69
  *
70
70
  * Without this, a floored run is indistinguishable from a faithful one: `verified` compares
@@ -96,7 +96,7 @@ export interface RunDesktopGeometry {
96
96
  source: "cdp";
97
97
  };
98
98
  /**
99
- * Mobile fidelity beyond viewport size, present only when the lab asked for it. `requested`
99
+ * Mobile fidelity beyond viewport size, present only when the study asked for it. `requested`
100
100
  * is what was applied through CDP; `resolved` is what the page reported about itself afterwards
101
101
  * and is the proof, never copied from the request. A run without this block is a
102
102
  * responsive-viewport study, whatever its preset is named.
@@ -26,10 +26,12 @@ export declare function studyProvenanceOf(record: {
26
26
  source?: unknown;
27
27
  };
28
28
  }): RunStudyProvenance | undefined;
29
- /** `study` and `lab` with the same value, as run.json and status.json write them until 0.109. */
29
+ /**
30
+ * `study`, as run.json and status.json write it. 0.108 wrote `lab` beside it with the same value;
31
+ * 0.109 stopped, and studyProvenanceOf still reads `lab` from those runs.
32
+ */
30
33
  export declare function studyFields(study: RunStudyProvenance | undefined): {
31
34
  study?: RunStudyProvenance;
32
- lab?: RunStudyProvenance;
33
35
  };
34
36
  /**
35
37
  * The study id a run names by the `study:<id>` or `lab:<id>` convention on its persona or scenario
@@ -1,5 +1,5 @@
1
- // Which study a saved run came from. run.json and status.json write it as `study`, and as `lab`
2
- // with the same value until 0.109 drops `lab`. Every reader goes through
1
+ // Which study a saved run came from. run.json and status.json write it as `study`; runs saved by
2
+ // 0.108 and earlier also carry `lab` with the same value. Every reader goes through
3
3
  // studyProvenanceOf, which also reads a run older than both fields by the `study:<id>` or
4
4
  // `lab:<id>` convention on its persona and scenario sources.
5
5
  const ORIGINS = ["committed", "ignored", "explicit"];
@@ -38,9 +38,12 @@ export function studyProvenanceOf(record) {
38
38
  const id = inferLegacyStudyId(record);
39
39
  return id === undefined ? undefined : { id };
40
40
  }
41
- /** `study` and `lab` with the same value, as run.json and status.json write them until 0.109. */
41
+ /**
42
+ * `study`, as run.json and status.json write it. 0.108 wrote `lab` beside it with the same value;
43
+ * 0.109 stopped, and studyProvenanceOf still reads `lab` from those runs.
44
+ */
42
45
  export function studyFields(study) {
43
- return study === undefined ? {} : { study, lab: study };
46
+ return study === undefined ? {} : { study };
44
47
  }
45
48
  /**
46
49
  * The study id a run names by the `study:<id>` or `lab:<id>` convention on its persona or scenario
@@ -6,11 +6,6 @@ export interface StudyResultIdentity<R extends string> {
6
6
  route: R;
7
7
  /** The study's `id`. */
8
8
  studyId: string;
9
- /**
10
- * The study's `id`, the same value as `studyId`.
11
- * @deprecated Read `studyId`. The next minor removes it.
12
- */
13
- labId: string;
14
9
  }
15
10
  /** The identity fields for a result of route `route` from the study `studyId`. */
16
11
  export declare function studyResultIdentity<R extends string>(route: R, studyId: string): StudyResultIdentity<R>;
@@ -5,5 +5,5 @@
5
5
  export const STUDY_RESULT_SCHEMA = "humanish.study-result.v1";
6
6
  /** The identity fields for a result of route `route` from the study `studyId`. */
7
7
  export function studyResultIdentity(route, studyId) {
8
- return { schema: STUDY_RESULT_SCHEMA, route, studyId, labId: studyId };
8
+ return { schema: STUDY_RESULT_SCHEMA, route, studyId };
9
9
  }
@@ -0,0 +1,112 @@
1
+ import type { LocalVmInput } from "./routes/computer-use/types.js";
2
+ import { type LateScorer } from "./study/route-inputs.js";
3
+ import { type StudyRoute } from "./study/plan.js";
4
+ import type { StudyDeps } from "./study/study-deps.js";
5
+ import type { RunStudyDriving, RunStudyHomes } from "./study/run-study-homes.js";
6
+ import { type StudyConfig } from "./study/types.js";
7
+ import type { ObserverResult } from "./observer/render.js";
8
+ import { type CuaActorStudyResult } from "./routes/computer-use/types.js";
9
+ import { type PreviewStudyResult } from "./routes/preview.js";
10
+ import { type ScriptedBrowserStudyResult } from "./routes/scripted/types.js";
11
+ import { type ConcurrentSharedWorldStudyResult } from "./routes/shared-world/types.js";
12
+ import { type TerminalProductStudyResult } from "./routes/terminal/types.js";
13
+ import { type RunScorerProvenance } from "./run/bundle.js";
14
+ import type { RunStudyProvenance } from "./run/study-provenance.js";
15
+ /**
16
+ * Runs a study on its route. The options are checked against the route and mapped into the route's
17
+ * hook bags before anything runs. Each route closes the run it started on every exit through its
18
+ * own run scope (`src/run/run.ts`).
19
+ */
20
+ export declare function runStudyWith(config: StudyConfig, options: InternalRunStudyOptions, deps?: StudyDeps): Promise<StudyOutcome>;
21
+ /**
22
+ * The package's study runner (`src/index.ts`): runStudyWith with the public options only. A
23
+ * JavaScript caller that passes a field RunStudyOptions no longer has, or a humanish.lab.v2 config,
24
+ * is refused in the route's own result envelope before anything runs.
25
+ */
26
+ export declare function runStudy(config: StudyConfig, options: RunStudyOptions): Promise<StudyOutcome>;
27
+ /** A study planned once: the route's refusal, or the run of its plan. */
28
+ export type PreparedStudy = {
29
+ readonly ok: false;
30
+ readonly outcome: StudyOutcome;
31
+ } | {
32
+ readonly ok: true;
33
+ /** Runs the plan. A scorer loaded after planning joins the run's hooks; it changes no plan. */
34
+ run(scorer?: LateScorer): Promise<StudyOutcome>;
35
+ };
36
+ /**
37
+ * Normalizes the options and plans the study once, so a caller can present a refusal before it loads
38
+ * anything the run needs. A local browser study's provider is bound first, so the plan is made with
39
+ * it, and its desktop goes to the computer-use run as `localVm`; with inProcess the caller drives
40
+ * the app in process and needs no desktop.
41
+ */
42
+ export declare function prepareStudy(config: StudyConfig, options: InternalRunStudyOptions, deps?: StudyDeps): Promise<PreparedStudy>;
43
+ /**
44
+ * What a package caller passes to runStudy: the run's settings and the typed homes (`RunStudyHomes`,
45
+ * `RunStudyDriving`). Each wins over the config when provided.
46
+ */
47
+ export type RunStudyOptions = RunStudyBase & RunStudyHomes & RunStudyDriving;
48
+ interface RunStudyBase {
49
+ cwd: string;
50
+ runId?: string;
51
+ dryRun?: boolean;
52
+ open?: boolean;
53
+ /** Participant count override: preview participants or computer-use desktops. */
54
+ count?: number;
55
+ /** CUA fan-out only: create a new run for failed/selected participants from a prior run. */
56
+ rerun?: {
57
+ sourceRunId: string;
58
+ participantIds?: string[];
59
+ };
60
+ onObserverReady?: (observer: ObserverResult & {
61
+ ok: true;
62
+ }) => Promise<void> | void;
63
+ }
64
+ /** runStudyWith's options inside the package: the public ones plus what only the CLI and tests set. */
65
+ export type InternalRunStudyOptions = RunStudyOptions & RunStudyInternals;
66
+ interface RunStudyInternals {
67
+ /**
68
+ * Which manifest this run came from. planStudy puts it on the plan, and the route reads
69
+ * plan.study for the run's status record and bundle. Absent for a library caller that passes a
70
+ * StudyConfig directly; that run records no study.
71
+ */
72
+ study?: RunStudyProvenance;
73
+ /**
74
+ * Config-declared scorer provenance, forwarded alongside the
75
+ * loaded scorer. Its presence is the "declared" marker the terminal route reads to flip a
76
+ * status:"fail" verdict; the browser routes stamp it as evidence (they already flip). Core-computed
77
+ * (path + digest), never adopter-supplied; absent for library callers.
78
+ */
79
+ scorerProvenance?: RunScorerProvenance;
80
+ /** The local VM study's desktop, analysis gate and signal, for a local browser study. */
81
+ localVm?: LocalVmInput;
82
+ }
83
+ /** A run's result and the route it ran on. */
84
+ interface RouteOutcome<R extends StudyRoute, T> {
85
+ route: R;
86
+ result: T;
87
+ }
88
+ export type StudyOutcome = RouteOutcome<"preview", PreviewStudyResult> | RouteOutcome<"computer-use", CuaActorStudyResult> | RouteOutcome<"scripted", ScriptedBrowserStudyResult> | RouteOutcome<"terminal", TerminalProductStudyResult> | RouteOutcome<"shared-world", ConcurrentSharedWorldStudyResult>;
89
+ /**
90
+ * A plan past its route's local checks that need no scorer: the refusal they returned, or the
91
+ * route's run, which takes a scorer loaded after them.
92
+ */
93
+ export type AdmittedPlan<R extends StudyRoute = StudyRoute> = {
94
+ readonly ok: false;
95
+ readonly outcome: Extract<StudyOutcome, {
96
+ route: R;
97
+ }>;
98
+ } | {
99
+ readonly ok: true;
100
+ run(scorer?: LateScorer): Promise<Extract<StudyOutcome, {
101
+ route: R;
102
+ }>>;
103
+ };
104
+ /** The result of a run on route `R`, the `result` of that route's `StudyOutcome`. */
105
+ export type StudyResult<R extends StudyRoute = StudyRoute> = {
106
+ preview: PreviewStudyResult;
107
+ "computer-use": CuaActorStudyResult;
108
+ scripted: ScriptedBrowserStudyResult;
109
+ terminal: TerminalProductStudyResult;
110
+ "shared-world": ConcurrentSharedWorldStudyResult;
111
+ }[R];
112
+ export {};
@@ -1,72 +1,79 @@
1
- // runLab runs one lab. It normalizes the caller's options, binds a local browser study's desktop
2
- // and provider, and plans the lab once with planLab. A refused plan returns the route's own result
1
+ // runStudyWith runs one study. It normalizes the caller's options, binds a local browser study's desktop
2
+ // and provider, and plans the study once with planStudy. A refused plan returns the route's own result
3
3
  // envelope before anything starts. One switch on plan.route then calls the route's admit function,
4
4
  // which runs the route's local checks that need no scorer (keys, subject env, the local agent) and
5
- // returns the route's run. prepareLab is the same path in two steps, so the CLI can present either
5
+ // returns the route's run. prepareStudy is the same path in two steps, so the CLI can present either
6
6
  // refusal before it loads a declared review scorer.
7
- import { computerUseInput, scriptedInput, sharedWorldInput, terminalInput, } from "./lab/route-inputs.js";
8
- import { planLab, resolveLabDryRun, routeOf } from "./lab/plan.js";
9
- import { normalizeRunLabOptions, optionRefusalOutcome, removedOptionRefusal, } from "./lab/run-lab-options.js";
10
- import {} from "./lab/types.js";
11
- import { admitComputerUsePlan, computerUseLabRefusal } from "./routes/computer-use/route.js";
7
+ import { computerUseInput, scriptedInput, sharedWorldInput, terminalInput, } from "./study/route-inputs.js";
8
+ import { planStudy, resolveStudyDryRun, routeOf } from "./study/plan.js";
9
+ import { normalizeRunStudyOptions, optionRefusalOutcome, removedOptionRefusal, } from "./study/run-study-options.js";
10
+ import { V2_SCHEMA } from "./study/types.js";
11
+ import { V2_UNSUPPORTED_MESSAGE } from "./study/config.js";
12
+ import { admitComputerUsePlan, computerUseStudyRefusal } from "./routes/computer-use/route.js";
12
13
  import {} from "./routes/computer-use/types.js";
13
- import { admitPreviewPlan, previewLabRefusal } from "./routes/preview.js";
14
- import { admitScriptedPlan, scriptedLabRefusal } from "./routes/scripted/route.js";
14
+ import { admitPreviewPlan, previewStudyRefusal, } from "./routes/preview.js";
15
+ import { admitScriptedPlan, scriptedStudyRefusal } from "./routes/scripted/route.js";
15
16
  import {} from "./routes/scripted/types.js";
16
- import { admitSharedWorldPlan, sharedWorldLabRefusal } from "./routes/shared-world/route.js";
17
+ import { admitSharedWorldPlan, sharedWorldStudyRefusal } from "./routes/shared-world/route.js";
17
18
  import {} from "./routes/shared-world/types.js";
18
- import { admitTerminalPlan, terminalLabRefusal } from "./routes/terminal/route.js";
19
+ import { admitTerminalPlan, terminalStudyRefusal } from "./routes/terminal/route.js";
19
20
  import {} from "./routes/terminal/types.js";
20
21
  import {} from "./run/bundle.js";
21
- import { isLocalBrowserLab, localBrowserDefaults } from "./substrates/local/runtime-config.js";
22
+ import { isLocalBrowserStudy, localBrowserDefaults } from "./substrates/local/runtime-config.js";
22
23
  /**
23
- * Runs a lab on its route. The options are checked against the route and mapped into the route's
24
+ * Runs a study on its route. The options are checked against the route and mapped into the route's
24
25
  * hook bags before anything runs. Each route closes the run it started on every exit through its
25
26
  * own run scope (`src/run/run.ts`).
26
27
  */
27
- export async function runLab(config, options, deps = {}) {
28
- const prepared = await prepareLab(config, options, deps);
28
+ export async function runStudyWith(config, options, deps = {}) {
29
+ const prepared = await prepareStudy(config, options, deps);
29
30
  return prepared.ok ? prepared.run() : prepared.outcome;
30
31
  }
31
32
  /**
32
- * runLab as the package exports it (`src/index.ts`): the public options only. A JavaScript caller
33
- * that passes a field RunLabOptions no longer has is refused in the route's own result envelope
34
- * before anything runs.
33
+ * The package's study runner (`src/index.ts`): runStudyWith with the public options only. A
34
+ * JavaScript caller that passes a field RunStudyOptions no longer has, or a humanish.lab.v2 config,
35
+ * is refused in the route's own result envelope before anything runs.
35
36
  */
36
- export async function runPackageLab(config, options) {
37
- const removed = removedOptionRefusal(options);
38
- if (removed === undefined)
39
- return runLab(config, options);
40
- const lab = localBrowserDefaults(config);
41
- return optionRefusalOutcome(lab, routeOf(lab), options, removed);
37
+ export async function runStudy(config, options) {
38
+ const refusal = config.schema === V2_SCHEMA
39
+ ? {
40
+ ok: false,
41
+ code: "HUMANISH_STUDY_V2_UNSUPPORTED",
42
+ message: V2_UNSUPPORTED_MESSAGE,
43
+ }
44
+ : removedOptionRefusal(options);
45
+ if (refusal === undefined)
46
+ return runStudyWith(config, options);
47
+ const study = localBrowserDefaults(config);
48
+ return optionRefusalOutcome(study, routeOf(study), options, refusal);
42
49
  }
43
50
  /**
44
- * Normalizes the options and plans the lab once, so a caller can present a refusal before it loads
51
+ * Normalizes the options and plans the study once, so a caller can present a refusal before it loads
45
52
  * anything the run needs. A local browser study's provider is bound first, so the plan is made with
46
53
  * it, and its desktop goes to the computer-use run as `localVm`; with inProcess the caller drives
47
54
  * the app in process and needs no desktop.
48
55
  */
49
- export async function prepareLab(config, options, deps = {}) {
50
- const lab = localBrowserDefaults(config);
51
- const route = routeOf(lab);
52
- const normalized = normalizeRunLabOptions(lab, route, options);
56
+ export async function prepareStudy(config, options, deps = {}) {
57
+ const study = localBrowserDefaults(config);
58
+ const route = routeOf(study);
59
+ const normalized = normalizeRunStudyOptions(study, route, options);
53
60
  if (!normalized.ok)
54
- return { ok: false, outcome: optionRefusalOutcome(lab, route, options, normalized) };
61
+ return { ok: false, outcome: optionRefusalOutcome(study, route, options, normalized) };
55
62
  // An in-process executor needs no desktop, and a caller that already prepared the study passes
56
63
  // its localVm, which a second study would replace.
57
- const prepareLocalVm = isLocalBrowserLab(lab) && options.inProcess === undefined && options.localVm === undefined
64
+ const prepareLocalVm = isLocalBrowserStudy(study) && options.inProcess === undefined && options.localVm === undefined
58
65
  ? (await import("./routes/computer-use/local-vm.js")).prepareLocalVmRun
59
66
  : undefined;
60
- const vm = prepareLocalVm?.({ ...normalized.options, config: lab });
67
+ const vm = prepareLocalVm?.({ ...normalized.options, config: study });
61
68
  const planning = vm === undefined ? normalized.options : { ...vm.options, localVm: vm.localVm };
62
- const planned = planLab(lab, planning, deps);
69
+ const planned = planStudy(study, planning, deps);
63
70
  if (!planned.ok) {
64
71
  await vm?.close();
65
- const outcome = await refusalOutcome(lab, planning, planned.refusal, deps, normalized.emit);
72
+ const outcome = await refusalOutcome(study, planning, planned.refusal, deps, normalized.emit);
66
73
  outcome.result.warnings.push(...normalized.warnings);
67
74
  return { ok: false, outcome };
68
75
  }
69
- const admitted = await admitPlan(lab, planning, planned.planned.plan, deps, normalized.emit);
76
+ const admitted = await admitPlan(study, planning, planned.planned.plan, deps, normalized.emit);
70
77
  if (!admitted.ok) {
71
78
  await vm?.close();
72
79
  admitted.outcome.result.warnings.push(...normalized.warnings);
@@ -81,9 +88,9 @@ export async function prepareLab(config, options, deps = {}) {
81
88
  if (scorer !== undefined) {
82
89
  // Checks the scorer against the route and the caller's options, as if passed up front.
83
90
  // Only its refusal is used; its options and warnings array are not.
84
- const withScorer = normalizeRunLabOptions(lab, route, { ...options, ...scorer });
91
+ const withScorer = normalizeRunStudyOptions(study, route, { ...options, ...scorer });
85
92
  if (!withScorer.ok) {
86
- const outcome = optionRefusalOutcome(lab, route, options, withScorer);
93
+ const outcome = optionRefusalOutcome(study, route, options, withScorer);
87
94
  outcome.result.warnings.push(...normalized.warnings);
88
95
  return outcome;
89
96
  }
@@ -118,33 +125,33 @@ async function admitPlan(config, options, plan, deps, emit) {
118
125
  }
119
126
  /** The refused route's own result, with the envelope and analysis record its runner returns. */
120
127
  async function refusalOutcome(config, options, refusal, deps, emit) {
121
- // Spend-safe default: a lab goes live only when the config (or CLI) says so.
122
- const dryRun = resolveLabDryRun(config, options.dryRun, true) ?? true;
128
+ // Spend-safe default: a study goes live only when the config (or CLI) says so.
129
+ const dryRun = resolveStudyDryRun(config, options.dryRun, true) ?? true;
123
130
  switch (refusal.route) {
124
131
  case "preview":
125
132
  return {
126
133
  route: "preview",
127
- result: previewLabRefusal(options.cwd, config.id, refusal),
134
+ result: previewStudyRefusal(options.cwd, config.id, refusal),
128
135
  };
129
136
  case "computer-use":
130
137
  return {
131
138
  route: "computer-use",
132
- result: await computerUseLabRefusal({ ...computerUseInput(options, deps, emit), config, dryRun }, refusal),
139
+ result: await computerUseStudyRefusal({ ...computerUseInput(options, deps, emit), config, dryRun }, refusal),
133
140
  };
134
141
  case "scripted":
135
142
  return {
136
143
  route: "scripted",
137
- result: await scriptedLabRefusal({ ...scriptedInput(options, deps, emit), config, dryRun }, refusal),
144
+ result: await scriptedStudyRefusal({ ...scriptedInput(options, deps, emit), config, dryRun }, refusal),
138
145
  };
139
146
  case "terminal":
140
147
  return {
141
148
  route: "terminal",
142
- result: await terminalLabRefusal({ ...terminalInput(options, deps, emit), config, dryRun }, refusal),
149
+ result: await terminalStudyRefusal({ ...terminalInput(options, deps, emit), config, dryRun }, refusal),
143
150
  };
144
151
  case "shared-world":
145
152
  return {
146
153
  route: "shared-world",
147
- result: await sharedWorldLabRefusal({ ...sharedWorldInput(options, deps, emit), config, dryRun }, refusal),
154
+ result: await sharedWorldStudyRefusal({ ...sharedWorldInput(options, deps, emit), config, dryRun }, refusal),
148
155
  };
149
156
  }
150
157
  }
@@ -1,5 +1,4 @@
1
1
  import type { RunAdapterArtifact, RunAdapterScore, RunBundle, RunFeedbackCandidate, RunScorerProvenance } from "../run/bundle.js";
2
- type BrowserAdapterBackend = "cua" | "shared-world" | "concurrent-shared-world";
3
2
  /** The routes that call a browser scorer. */
4
3
  type BrowserScorerRoute = "computer-use" | "shared-world";
5
4
  /**
@@ -7,7 +6,7 @@ type BrowserScorerRoute = "computer-use" | "shared-world";
7
6
  * evidence/rubrics stay in the adopter's repo; core provides the assembled bundle
8
7
  * plus stable run identifiers and never learns product nouns.
9
8
  */
10
- export interface BrowserLabScoringContext {
9
+ export interface BrowserScoringContext {
11
10
  bundle: RunBundle;
12
11
  /**
13
12
  * Absolute path to the ignored run directory. Adapter hooks may write their
@@ -15,28 +14,17 @@ export interface BrowserLabScoringContext {
15
14
  * `deriveArtifacts`. This path is runtime-only and must never be persisted.
16
15
  */
17
16
  runDir: string;
18
- labId: string;
17
+ /** The study id. */
18
+ studyId: string;
19
19
  runId: string;
20
20
  actor: string;
21
21
  /** The route that ran the participants. */
22
22
  route: BrowserScorerRoute;
23
- /**
24
- * @deprecated Use `route`. `cua` is `computer-use` and `concurrent-shared-world` is
25
- * `shared-world`. Reading it warns once per process; the next minor removes it.
26
- */
27
- backend: BrowserAdapterBackend;
28
23
  dryRun: boolean;
29
24
  /** How many participants the run had. */
30
25
  participantCount: number;
31
- /**
32
- * @deprecated Use `participantCount`, which has the same value. Reading it warns once per
33
- * process; the next minor removes it.
34
- */
35
- laneCount: number;
36
26
  }
37
- /** The context a route passes to applyBrowserScorer; the deprecated fields derive from it. */
38
- type BrowserScoringFacts = Omit<BrowserLabScoringContext, "backend" | "laneCount">;
39
- /** The scorer functions a computer-use or shared-world run calls: `RunLabOptions.scorer`. */
27
+ /** The scorer functions a computer-use or shared-world run calls: `RunStudyOptions.scorer`. */
40
28
  export interface BrowserScorer {
41
29
  /**
42
30
  * Browser-route extension seam: a thin adapter may score the assembled
@@ -44,20 +32,20 @@ export interface BrowserScorer {
44
32
  * namespaced `bundle.adapterScore`; product-specific component detail belongs
45
33
  * in `data`, not in core enums or review text.
46
34
  */
47
- score?: (ctx: BrowserLabScoringContext) => RunAdapterScore | Promise<RunAdapterScore>;
35
+ score?: (ctx: BrowserScoringContext) => RunAdapterScore | Promise<RunAdapterScore>;
48
36
  /**
49
37
  * Companion seam for public-safe, adapter-namespaced feedback candidates.
50
38
  * Malformed candidates are dropped before bundle persistence so core remains
51
39
  * verifiable even when an adapter misbehaves.
52
40
  */
53
- deriveFeedback?: (ctx: BrowserLabScoringContext) => RunFeedbackCandidate[] | Promise<RunFeedbackCandidate[]>;
41
+ deriveFeedback?: (ctx: BrowserScoringContext) => RunFeedbackCandidate[] | Promise<RunFeedbackCandidate[]>;
54
42
  /**
55
43
  * Optional product/state proof artifact references. The adapter writes files
56
44
  * under `ctx.runDir` and returns local relative paths. Core stores only the
57
45
  * namespaced references and `verify` fails closed if referenced files are
58
46
  * missing or nonlocal.
59
47
  */
60
- deriveArtifacts?: (ctx: BrowserLabScoringContext) => RunAdapterArtifact[] | Promise<RunAdapterArtifact[]>;
48
+ deriveArtifacts?: (ctx: BrowserScoringContext) => RunAdapterArtifact[] | Promise<RunAdapterArtifact[]>;
61
49
  }
62
50
  /** What a scorer found against the run, for the route's final review fold (foldScorerFailures). */
63
51
  export interface ScorerOutcome {
@@ -70,7 +58,7 @@ export declare const DECLARED_SCORER_MALFORMED = "Declared product scorer return
70
58
  export declare function declaredScorerThrew(detail: string): string;
71
59
  export declare function applyBrowserScorer(args: {
72
60
  scorer: BrowserScorer | undefined;
73
- context: BrowserScoringFacts;
61
+ context: BrowserScoringContext;
74
62
  bundle: RunBundle;
75
63
  sanitize: (text: string) => string;
76
64
  warnings: string[];
@@ -1,19 +1,7 @@
1
1
  import path from "node:path";
2
2
  import { isRunAdapterScore } from "../run/bundle-shape.js";
3
- import { withDeprecatedFields } from "./deprecated-fields.js";
4
3
  import { isRunFeedbackCandidate } from "../run/feedback-shape.js";
5
4
  import { isRecord } from "../run/type-guards.js";
6
- const OLDER_BACKEND = {
7
- "computer-use": "cua",
8
- "shared-world": "concurrent-shared-world",
9
- };
10
- /** The scorer's context: the facts, plus the older `backend` and `laneCount` (deprecated-fields.ts). */
11
- function scorerContext(facts) {
12
- return withDeprecatedFields({ ...facts }, { name: "BrowserLabScoringContext", code: "HUMANISH_SCORING_CONTEXT_FIELD_DEPRECATED" }, {
13
- backend: { replacement: "route", read: () => OLDER_BACKEND[facts.route] },
14
- laneCount: { replacement: "participantCount", read: () => facts.participantCount },
15
- });
16
- }
17
5
  /** A declared scorer that returned a malformed value never rendered a verdict. */
18
6
  export const DECLARED_SCORER_MALFORMED = "Declared product scorer returned a malformed value instead of a verdict; a declared gate that cannot render a pass is recorded as a fail, never a silent pass.";
19
7
  /** A declared scorer that threw never rendered a verdict. `detail` is already sanitized. */
@@ -33,10 +21,10 @@ export async function applyBrowserScorer(args) {
33
21
  // The scorer sees a read-only view of the bundle: it cannot mutate noSpend/cost/review in place to
34
22
  // launder a verdict (a tamper attempt throws in the scorer's strict-mode ESM and is caught below as
35
23
  // a hook failure). The seam still stamps the real bundle.
36
- const scoringContext = scorerContext({
24
+ const scoringContext = {
37
25
  ...context,
38
26
  bundle: frozenBundleView(context.bundle),
39
- });
27
+ };
40
28
  const scrubValue = (value) => {
41
29
  const encoded = JSON.stringify(value);
42
30
  return encoded === undefined ? value : JSON.parse(sanitize(encoded));
@@ -1,17 +1,17 @@
1
- import type { BrowserLabScoringContext } from "./adapter-extension.js";
1
+ import type { BrowserScoringContext } from "./adapter-extension.js";
2
2
  import type { TerminalProductScoringContext } from "../routes/terminal/types.js";
3
- import type { LabRoute } from "./plan.js";
3
+ import type { StudyRoute } from "./plan.js";
4
4
  import type { RunAdapterArtifact, RunAdapterScore, RunFeedbackCandidate, RunScorerProvenance } from "../run/bundle.js";
5
5
  /** The read-model context a loaded scorer sees: the terminal or browser scoring context. The module
6
6
  * narrows it at runtime (`"product" in ctx` ⇒ terminal; `"route" in ctx` ⇒ browser). */
7
- export type AdapterScoringContext = TerminalProductScoringContext | BrowserLabScoringContext;
7
+ export type AdapterScoringContext = TerminalProductScoringContext | BrowserScoringContext;
8
8
  /**
9
9
  * The adopter-facing scorer module contract. Export any subset of these from a `.mjs` (or a
10
10
  * `.js`/`.cjs` whose package.json type matches): named exports or a single default object. The
11
11
  * loader wires only these three; an exported `executor`/`env`/`provisionSubject`/`costProbe` is never
12
12
  * picked up (the whitelist is the scope guard). A module exporting none of them is a hard load error.
13
13
  *
14
- * `C` is the context `score` and `deriveFeedback` read: `BrowserLabScoringContext` for a scorer
14
+ * `C` is the context `score` and `deriveFeedback` read: `BrowserScoringContext` for a scorer
15
15
  * written for computer use and shared world, `TerminalProductScoringContext` for one written for
16
16
  * terminal runs, or the default union for one that narrows at runtime.
17
17
  */
@@ -19,22 +19,22 @@ export interface AdapterScorerModule<C extends AdapterScoringContext = AdapterSc
19
19
  score?: (ctx: C) => RunAdapterScore | Promise<RunAdapterScore>;
20
20
  deriveFeedback?: (ctx: C) => RunFeedbackCandidate[] | Promise<RunFeedbackCandidate[]>;
21
21
  /** Browser-route only; inert on the terminal route, whose TerminalScorer has no artifacts seam. */
22
- deriveArtifacts?: (ctx: BrowserLabScoringContext) => RunAdapterArtifact[] | Promise<RunAdapterArtifact[]>;
22
+ deriveArtifacts?: (ctx: BrowserScoringContext) => RunAdapterArtifact[] | Promise<RunAdapterArtifact[]>;
23
23
  }
24
24
  /**
25
- * A scorer written for computer use and shared world, as `RunLabOptions.scorer` takes it. Those
25
+ * A scorer written for computer use and shared world, as `RunStudyOptions.scorer` takes it. Those
26
26
  * routes pass the browser context; another route that calls it passes a context it was not written
27
27
  * for. The call states the kind, so the module itself needs no cast.
28
28
  */
29
- export declare function browserScorer(scorer: AdapterScorerModule<BrowserLabScoringContext>): AdapterScorerModule;
30
- /** A scorer written for terminal runs, as `RunLabOptions.scorer` takes it (see browserScorer). */
29
+ export declare function browserScorer(scorer: AdapterScorerModule<BrowserScoringContext>): AdapterScorerModule;
30
+ /** A scorer written for terminal runs, as `RunStudyOptions.scorer` takes it (see browserScorer). */
31
31
  export declare function terminalScorer(scorer: AdapterScorerModule<TerminalProductScoringContext>): AdapterScorerModule;
32
32
  /**
33
33
  * The scorer as a computer-use or shared-world run calls it, with the browser context. The caller
34
34
  * chose the context it wrote the scorer for; only the route knows which context it passes, so the
35
35
  * narrowing is here. A terminal-typed scorer on a browser route reads fields the context lacks.
36
36
  */
37
- export declare function browserRouteScorer(scorer: AdapterScorerModule): AdapterScorerModule<BrowserLabScoringContext>;
37
+ export declare function browserRouteScorer(scorer: AdapterScorerModule): AdapterScorerModule<BrowserScoringContext>;
38
38
  /** The scorer as a terminal run calls it, with the terminal context (see browserRouteScorer). */
39
39
  export declare function terminalRouteScorer(scorer: AdapterScorerModule): AdapterScorerModule<TerminalProductScoringContext>;
40
40
  type AdapterScorerLoadErrorCode = "HUMANISH_STUDY_SCORER_BAD_REF" | "HUMANISH_STUDY_SCORER_NOT_FOUND" | "HUMANISH_STUDY_SCORER_LOAD_FAILED" | "HUMANISH_STUDY_SCORER_NO_HOOKS" | "HUMANISH_STUDY_SCORER_UNSUPPORTED_BACKEND";
@@ -57,7 +57,7 @@ export type AdapterScorerLoadResult = {
57
57
  export declare function loadAdapterScorer(args: {
58
58
  cwd: string;
59
59
  ref: string;
60
- route: LabRoute;
60
+ route: StudyRoute;
61
61
  source: "manifest" | "cli-flag";
62
62
  }): Promise<AdapterScorerLoadResult>;
63
63
  export {};
@@ -5,7 +5,7 @@
5
5
  // satisfied no-spend proof, so it stays library-only.
6
6
  //
7
7
  // Trust model: the party who writes `review.scorer.ref` is the party
8
- // who runs `humanish lab run` in their own checkout: identical trust to humanish.lab.yml or a
8
+ // who runs `humanish run` in their own checkout: identical trust to humanish.lab.yml or a
9
9
  // package.json script. The loader adds no new execution capability; it relocates where the reference is
10
10
  // declared. Containment is entry-file-only: `readContainedRegularFile` blocks abs/`..`/symlink/
11
11
  // hardlink/realpath-escape/TOCTOU on the entry module, but `import()` then executes the transitive
@@ -20,14 +20,14 @@ import { pathToFileURL } from "node:url";
20
20
  import { digestText, redactText } from "../evidence/redaction.js";
21
21
  import { prepareSelectedOutputDirectory, readContainedRegularFile, } from "../run/contained-output.js";
22
22
  /**
23
- * A scorer written for computer use and shared world, as `RunLabOptions.scorer` takes it. Those
23
+ * A scorer written for computer use and shared world, as `RunStudyOptions.scorer` takes it. Those
24
24
  * routes pass the browser context; another route that calls it passes a context it was not written
25
25
  * for. The call states the kind, so the module itself needs no cast.
26
26
  */
27
27
  export function browserScorer(scorer) {
28
28
  return scorer;
29
29
  }
30
- /** A scorer written for terminal runs, as `RunLabOptions.scorer` takes it (see browserScorer). */
30
+ /** A scorer written for terminal runs, as `RunStudyOptions.scorer` takes it (see browserScorer). */
31
31
  export function terminalScorer(scorer) {
32
32
  return scorer;
33
33
  }
@@ -0,0 +1,7 @@
1
+ import type { StudyConfig } from "./types.js";
2
+ /** The first composition rule a config breaks, in the parser's order, or null. */
3
+ export declare function compositionReason(config: StudyConfig): string | null;
4
+ /** Why a this-repo study cannot run live. The parser and the preview planner both refuse with it. */
5
+ export declare const THIS_REPO_DRY_RUN_ONLY = "this-repo studies are dry-run only; use a clone or app-url subject for a live run.";
6
+ /** A desktop-cli subject with no product to study. The computer-use planner checks this too. */
7
+ export declare function desktopCliProductReason(config: StudyConfig): string | null;