humanish 0.107.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (671) hide show
  1. package/ARCHITECTURE.md +73 -69
  2. package/CHANGELOG.md +27 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +148 -175
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-trace.js +2 -1
  14. package/dist/actors/codex/app-server-ui.js +1 -1
  15. package/dist/actors/codex/codex-admission.d.ts +91 -0
  16. package/dist/actors/codex/codex-admission.js +150 -0
  17. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  18. package/dist/actors/codex/restricted-executable.js +8 -8
  19. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  20. package/dist/actors/codex/restricted-launch.js +1 -1
  21. package/dist/actors/codex/restricted-participant.js +20 -18
  22. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  23. package/dist/actors/codex/restricted-policy.js +2 -2
  24. package/dist/actors/codex/restricted-session.d.ts +3 -3
  25. package/dist/actors/codex/restricted-session.js +10 -5
  26. package/dist/actors/computer-use/actor.d.ts +18 -18
  27. package/dist/actors/computer-use/actor.js +4 -4
  28. package/dist/actors/computer-use/admission-limit.d.ts +3 -3
  29. package/dist/actors/computer-use/admission-limit.js +4 -4
  30. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  31. package/dist/actors/computer-use/executor-error.js +3 -3
  32. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  33. package/dist/actors/computer-use/loop/actions.js +15 -15
  34. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  35. package/dist/actors/computer-use/loop/backstop.js +14 -12
  36. package/dist/actors/computer-use/loop/debrief.js +2 -2
  37. package/dist/actors/computer-use/loop/ending.d.ts +6 -6
  38. package/dist/actors/computer-use/loop/ending.js +18 -17
  39. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  40. package/dist/actors/computer-use/loop/observation.js +15 -14
  41. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  42. package/dist/actors/computer-use/loop/provider-call.js +12 -12
  43. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  44. package/dist/actors/computer-use/loop/session.js +4 -4
  45. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  46. package/dist/actors/computer-use/loop/spend.js +1 -1
  47. package/dist/actors/computer-use/loop/trace.js +11 -9
  48. package/dist/actors/computer-use/loop/types.d.ts +47 -45
  49. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  50. package/dist/actors/computer-use/loop/usage.js +2 -2
  51. package/dist/actors/computer-use/loop.d.ts +6 -1
  52. package/dist/actors/computer-use/loop.js +26 -4
  53. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  54. package/dist/actors/computer-use/openai-context.js +214 -0
  55. package/dist/actors/computer-use/openai-provider.d.ts +13 -10
  56. package/dist/actors/computer-use/openai-provider.js +52 -41
  57. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  58. package/dist/actors/computer-use/openai-requests.js +82 -15
  59. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  60. package/dist/actors/computer-use/openai-wire.js +36 -34
  61. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  62. package/dist/actors/computer-use/provider-error.js +6 -6
  63. package/dist/actors/contract.d.ts +82 -47
  64. package/dist/actors/contract.js +30 -24
  65. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  66. package/dist/actors/local-agent/claude-session.js +13 -12
  67. package/dist/actors/local-agent/cli.d.ts +9 -7
  68. package/dist/actors/local-agent/cli.js +24 -28
  69. package/dist/actors/local-agent/readiness.d.ts +2 -2
  70. package/dist/actors/local-agent/readiness.js +4 -4
  71. package/dist/actors/reasoning-effort.js +8 -8
  72. package/dist/actors/registry.d.ts +12 -12
  73. package/dist/actors/registry.js +21 -20
  74. package/dist/actors/scripted-browser/actor.d.ts +10 -10
  75. package/dist/actors/scripted-browser/actor.js +17 -17
  76. package/dist/actors/scripted-browser/browser-command.js +1 -1
  77. package/dist/actors/scripted-browser/steps.js +1 -1
  78. package/dist/actors/scripted-browser/types.d.ts +1 -1
  79. package/dist/actors/stop-conditions.d.ts +1 -1
  80. package/dist/analysis/automatic-completion.d.ts +7 -7
  81. package/dist/analysis/automatic-completion.js +1 -1
  82. package/dist/analysis/automatic-config.d.ts +6 -6
  83. package/dist/analysis/automatic-config.js +1 -1
  84. package/dist/analysis/codex-config.d.ts +6 -2
  85. package/dist/analysis/codex-config.js +22 -14
  86. package/dist/analysis/execute.d.ts +1 -1
  87. package/dist/analysis/execute.js +1 -1
  88. package/dist/analysis/service.js +5 -5
  89. package/dist/analysis/types.d.ts +6 -0
  90. package/dist/browser-control/client.js +16 -16
  91. package/dist/browser-control/dispatcher.js +4 -4
  92. package/dist/browser-control/protocol.js +14 -14
  93. package/dist/browser-control/recording-transfer.js +4 -4
  94. package/dist/browser-control/transport.js +7 -7
  95. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  96. package/dist/cli/commands/analyze.js +19 -16
  97. package/dist/cli/commands/codex.js +9 -9
  98. package/dist/cli/commands/comms.js +48 -35
  99. package/dist/cli/commands/feedback.js +20 -21
  100. package/dist/cli/commands/migrate.d.ts +4 -0
  101. package/dist/cli/commands/migrate.js +65 -0
  102. package/dist/cli/commands/observe.d.ts +0 -1
  103. package/dist/cli/commands/observe.js +136 -112
  104. package/dist/cli/commands/run-command.d.ts +10 -0
  105. package/dist/cli/commands/run-command.js +85 -0
  106. package/dist/cli/commands/runs.js +136 -139
  107. package/dist/cli/commands/setup.d.ts +2 -2
  108. package/dist/cli/commands/setup.js +27 -24
  109. package/dist/cli/commands/study-format.d.ts +9 -0
  110. package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
  111. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  112. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
  113. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  114. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  115. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  116. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
  117. package/dist/cli/commands/study-route-run.d.ts +19 -0
  118. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  119. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  120. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  121. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  122. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
  123. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  124. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  125. package/dist/cli/commands/study-run.d.ts +9 -0
  126. package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
  127. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
  128. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
  129. package/dist/cli/commands/study.d.ts +3 -0
  130. package/dist/cli/commands/study.js +146 -0
  131. package/dist/cli/commands/tui.d.ts +4 -4
  132. package/dist/cli/commands/tui.js +31 -31
  133. package/dist/cli/commands/watch.js +71 -121
  134. package/dist/cli/deprecations.d.ts +6 -0
  135. package/dist/cli/deprecations.js +18 -0
  136. package/dist/cli/doctor.d.ts +18 -8
  137. package/dist/cli/doctor.js +114 -59
  138. package/dist/cli/first-run-path.d.ts +15 -13
  139. package/dist/cli/first-run-path.js +35 -33
  140. package/dist/cli/io.d.ts +44 -9
  141. package/dist/cli/io.js +98 -23
  142. package/dist/cli/observer-follow.d.ts +3 -3
  143. package/dist/cli/observer-follow.js +6 -7
  144. package/dist/cli/orientation.d.ts +10 -7
  145. package/dist/cli/orientation.js +89 -47
  146. package/dist/cli/product-sentence.d.ts +6 -0
  147. package/dist/cli/product-sentence.js +6 -0
  148. package/dist/cli/program.d.ts +6 -1
  149. package/dist/cli/program.js +111 -43
  150. package/dist/cli/telemetry.d.ts +16 -16
  151. package/dist/cli/telemetry.js +46 -44
  152. package/dist/cli.js +1 -1
  153. package/dist/comms/capture-surface.d.ts +13 -12
  154. package/dist/comms/capture-surface.js +23 -22
  155. package/dist/comms/catch-host.d.ts +7 -7
  156. package/dist/comms/catch-host.js +17 -17
  157. package/dist/comms/connections.d.ts +1 -1
  158. package/dist/comms/connections.js +2 -2
  159. package/dist/comms/email-catch.d.ts +3 -3
  160. package/dist/comms/email-catch.js +8 -8
  161. package/dist/comms/external-evidence.d.ts +5 -5
  162. package/dist/comms/external-evidence.js +5 -4
  163. package/dist/comms/extract.js +2 -2
  164. package/dist/comms/fake-inbox.d.ts +3 -3
  165. package/dist/comms/fake-inbox.js +3 -3
  166. package/dist/comms/receiving-render.d.ts +1 -1
  167. package/dist/comms/receiving-render.js +2 -2
  168. package/dist/comms/receiving-runtime.d.ts +4 -4
  169. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  170. package/dist/comms/sandbox-catch-script.js +6 -6
  171. package/dist/comms/sandbox-catch.d.ts +38 -39
  172. package/dist/comms/sandbox-catch.js +36 -37
  173. package/dist/comms/setup.d.ts +2 -2
  174. package/dist/comms/setup.js +56 -25
  175. package/dist/comms/thread-evidence.d.ts +1 -1
  176. package/dist/comms/thread-evidence.js +6 -6
  177. package/dist/comms/types.d.ts +6 -6
  178. package/dist/comms/types.js +3 -3
  179. package/dist/evidence/frame-signature.d.ts +1 -1
  180. package/dist/evidence/frame-signature.js +4 -4
  181. package/dist/evidence/redaction.d.ts +3 -3
  182. package/dist/evidence/redaction.js +4 -4
  183. package/dist/feedback/draft.js +38 -80
  184. package/dist/feedback/export-bundle.js +1 -1
  185. package/dist/feedback/export.d.ts +5 -1
  186. package/dist/feedback/export.js +10 -10
  187. package/dist/feedback/feedback.d.ts +2 -2
  188. package/dist/feedback/feedback.js +21 -3
  189. package/dist/feedback/proof.d.ts +1 -1
  190. package/dist/feedback/proof.js +2 -2
  191. package/dist/guest/bootstrap.js +6 -6
  192. package/dist/guest/browser-tools.js +8 -8
  193. package/dist/guest/chromium-text.js +19 -19
  194. package/dist/guest/desktop-executor.d.ts +2 -2
  195. package/dist/guest/desktop-executor.js +20 -20
  196. package/dist/guest/desktop-keys.js +4 -4
  197. package/dist/guest/desktop-media.d.ts +2 -2
  198. package/dist/guest/desktop-media.js +16 -16
  199. package/dist/guest/desktop-native.d.ts +1 -1
  200. package/dist/guest/desktop-native.js +10 -10
  201. package/dist/guest/runtime-desktop.js +2 -2
  202. package/dist/guest/runtime-processes.d.ts +2 -2
  203. package/dist/guest/runtime-processes.js +2 -2
  204. package/dist/guest/runtime.js +6 -6
  205. package/dist/index.d.ts +14 -14
  206. package/dist/index.js +8 -8
  207. package/dist/keys/key-resolution.d.ts +5 -5
  208. package/dist/keys/key-resolution.js +23 -23
  209. package/dist/observer/artifact.d.ts +2 -2
  210. package/dist/observer/artifact.js +7 -7
  211. package/dist/observer/data.d.ts +6 -6
  212. package/dist/observer/data.js +5 -4
  213. package/dist/observer/exposure.d.ts +1 -1
  214. package/dist/observer/exposure.js +11 -11
  215. package/dist/observer/http.js +1 -1
  216. package/dist/observer/library.d.ts +3 -1
  217. package/dist/observer/library.js +8 -3
  218. package/dist/observer/listen.js +5 -4
  219. package/dist/observer/render.d.ts +1 -1
  220. package/dist/observer/render.js +17 -6
  221. package/dist/observer/run-routes.d.ts +4 -3
  222. package/dist/observer/run-routes.js +38 -13
  223. package/dist/observer/serve.d.ts +1 -1
  224. package/dist/observer/serve.js +7 -3
  225. package/dist/observer/tunnel.js +1 -1
  226. package/dist/observer-app.html +4 -4
  227. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  228. package/dist/routes/computer-use/bundle-parts.js +18 -17
  229. package/dist/routes/computer-use/bundle.d.ts +2 -2
  230. package/dist/routes/computer-use/bundle.js +10 -9
  231. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
  232. package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
  233. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  234. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
  235. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  236. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
  238. package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
  239. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  240. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
  241. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  242. package/dist/routes/computer-use/external-comms.js +1 -1
  243. package/dist/routes/computer-use/fanout-bundle.js +27 -26
  244. package/dist/routes/computer-use/fanout-records.js +12 -13
  245. package/dist/routes/computer-use/live-flush.d.ts +4 -4
  246. package/dist/routes/computer-use/live-flush.js +6 -6
  247. package/dist/routes/computer-use/live-phase.d.ts +5 -4
  248. package/dist/routes/computer-use/live-phase.js +8 -8
  249. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  250. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  251. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  252. package/dist/routes/computer-use/local-vm.js +3 -3
  253. package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
  254. package/dist/routes/computer-use/participant-desktop.js +5 -5
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +10 -10
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +33 -15
  259. package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
  260. package/dist/routes/computer-use/participant-prompt.js +9 -9
  261. package/dist/routes/computer-use/participant-runs.d.ts +16 -16
  262. package/dist/routes/computer-use/participant-runs.js +26 -25
  263. package/dist/routes/computer-use/plan.d.ts +12 -12
  264. package/dist/routes/computer-use/plan.js +42 -42
  265. package/dist/routes/computer-use/preflight.d.ts +5 -5
  266. package/dist/routes/computer-use/preflight.js +25 -25
  267. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  268. package/dist/routes/computer-use/rerun-selection.js +4 -3
  269. package/dist/routes/computer-use/result.d.ts +4 -4
  270. package/dist/routes/computer-use/result.js +22 -21
  271. package/dist/routes/computer-use/route.d.ts +12 -11
  272. package/dist/routes/computer-use/route.js +31 -30
  273. package/dist/routes/computer-use/self-report.d.ts +7 -7
  274. package/dist/routes/computer-use/self-report.js +32 -32
  275. package/dist/routes/computer-use/setup.d.ts +23 -23
  276. package/dist/routes/computer-use/setup.js +28 -29
  277. package/dist/routes/computer-use/single-bundle.d.ts +11 -11
  278. package/dist/routes/computer-use/single-bundle.js +40 -41
  279. package/dist/routes/computer-use/subject-projection.d.ts +4 -4
  280. package/dist/routes/computer-use/subject-projection.js +6 -6
  281. package/dist/routes/computer-use/types.d.ts +71 -73
  282. package/dist/routes/computer-use/types.js +12 -12
  283. package/dist/routes/preview.d.ts +13 -7
  284. package/dist/routes/preview.js +11 -7
  285. package/dist/routes/scripted/bundle.d.ts +7 -7
  286. package/dist/routes/scripted/bundle.js +20 -18
  287. package/dist/routes/scripted/plan.d.ts +8 -8
  288. package/dist/routes/scripted/plan.js +13 -13
  289. package/dist/routes/scripted/result.d.ts +3 -3
  290. package/dist/routes/scripted/result.js +13 -13
  291. package/dist/routes/scripted/route.d.ts +9 -9
  292. package/dist/routes/scripted/route.js +15 -16
  293. package/dist/routes/scripted/scenario.d.ts +1 -1
  294. package/dist/routes/scripted/scenario.js +5 -5
  295. package/dist/routes/scripted/setup.d.ts +6 -6
  296. package/dist/routes/scripted/setup.js +8 -8
  297. package/dist/routes/scripted/subject.d.ts +5 -5
  298. package/dist/routes/scripted/subject.js +4 -4
  299. package/dist/routes/scripted/surface-records.d.ts +1 -1
  300. package/dist/routes/scripted/surface-records.js +4 -4
  301. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  302. package/dist/routes/scripted/types.d.ts +18 -20
  303. package/dist/routes/scripted/types.js +2 -2
  304. package/dist/routes/shared-world/bundle-records.js +11 -10
  305. package/dist/routes/shared-world/bundle.d.ts +5 -5
  306. package/dist/routes/shared-world/bundle.js +46 -43
  307. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  308. package/dist/routes/shared-world/checkpoints.js +2 -2
  309. package/dist/routes/shared-world/comms.d.ts +14 -14
  310. package/dist/routes/shared-world/comms.js +19 -18
  311. package/dist/routes/shared-world/external-public.d.ts +4 -3
  312. package/dist/routes/shared-world/external-public.js +16 -12
  313. package/dist/routes/shared-world/handoff.d.ts +7 -6
  314. package/dist/routes/shared-world/handoff.js +65 -57
  315. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  316. package/dist/routes/shared-world/lobby-code.js +9 -9
  317. package/dist/routes/shared-world/participant-specs.d.ts +10 -9
  318. package/dist/routes/shared-world/participant-specs.js +38 -31
  319. package/dist/routes/shared-world/plan.d.ts +9 -9
  320. package/dist/routes/shared-world/plan.js +16 -16
  321. package/dist/routes/shared-world/provenance.d.ts +2 -2
  322. package/dist/routes/shared-world/provenance.js +2 -2
  323. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  324. package/dist/routes/shared-world/provisioned.js +18 -17
  325. package/dist/routes/shared-world/result.d.ts +6 -6
  326. package/dist/routes/shared-world/result.js +29 -29
  327. package/dist/routes/shared-world/route.d.ts +11 -11
  328. package/dist/routes/shared-world/route.js +40 -39
  329. package/dist/routes/shared-world/setup.d.ts +16 -16
  330. package/dist/routes/shared-world/setup.js +23 -23
  331. package/dist/routes/shared-world/types.d.ts +55 -53
  332. package/dist/routes/shared-world/types.js +4 -4
  333. package/dist/routes/terminal/adapter.d.ts +5 -5
  334. package/dist/routes/terminal/adapter.js +9 -9
  335. package/dist/routes/terminal/bundle.d.ts +13 -13
  336. package/dist/routes/terminal/bundle.js +28 -27
  337. package/dist/routes/terminal/credentials.d.ts +8 -8
  338. package/dist/routes/terminal/credentials.js +12 -12
  339. package/dist/routes/terminal/dry-run.d.ts +4 -4
  340. package/dist/routes/terminal/dry-run.js +12 -12
  341. package/dist/routes/terminal/encoding.js +2 -2
  342. package/dist/routes/terminal/ledger.d.ts +5 -5
  343. package/dist/routes/terminal/ledger.js +14 -14
  344. package/dist/routes/terminal/lifetime.d.ts +1 -1
  345. package/dist/routes/terminal/lifetime.js +1 -1
  346. package/dist/routes/terminal/live-finish.d.ts +2 -2
  347. package/dist/routes/terminal/live-finish.js +10 -10
  348. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  349. package/dist/routes/terminal/live-sandbox.js +15 -15
  350. package/dist/routes/terminal/participant-text.js +2 -1
  351. package/dist/routes/terminal/persona.d.ts +2 -2
  352. package/dist/routes/terminal/persona.js +3 -3
  353. package/dist/routes/terminal/plan.d.ts +7 -7
  354. package/dist/routes/terminal/plan.js +15 -15
  355. package/dist/routes/terminal/recorder.js +2 -2
  356. package/dist/routes/terminal/result.d.ts +5 -5
  357. package/dist/routes/terminal/result.js +14 -14
  358. package/dist/routes/terminal/route.d.ts +9 -9
  359. package/dist/routes/terminal/route.js +19 -20
  360. package/dist/routes/terminal/sandbox.d.ts +1 -1
  361. package/dist/routes/terminal/sandbox.js +1 -1
  362. package/dist/routes/terminal/session.d.ts +5 -5
  363. package/dist/routes/terminal/session.js +14 -13
  364. package/dist/routes/terminal/token-usage.d.ts +1 -1
  365. package/dist/routes/terminal/token-usage.js +7 -8
  366. package/dist/routes/terminal/trace.d.ts +4 -4
  367. package/dist/routes/terminal/trace.js +2 -2
  368. package/dist/routes/terminal/types.d.ts +48 -50
  369. package/dist/routes/terminal/types.js +5 -5
  370. package/dist/run/bundle-shape.js +3 -3
  371. package/dist/run/bundle.d.ts +49 -49
  372. package/dist/run/bundle.js +3 -2
  373. package/dist/run/cost-summary.js +3 -3
  374. package/dist/run/costs.d.ts +23 -0
  375. package/dist/run/costs.js +79 -44
  376. package/dist/run/detail.d.ts +6 -6
  377. package/dist/run/detail.js +4 -4
  378. package/dist/run/dry-run-inputs.d.ts +1 -1
  379. package/dist/run/dry-run-inputs.js +2 -2
  380. package/dist/run/dry-run.js +20 -20
  381. package/dist/run/judge.d.ts +19 -13
  382. package/dist/run/judge.js +18 -8
  383. package/dist/run/outcomes.d.ts +1 -1
  384. package/dist/run/participant.d.ts +1 -1
  385. package/dist/run/paths.d.ts +1 -1
  386. package/dist/run/paths.js +1 -1
  387. package/dist/run/preflight-receipts.js +1 -1
  388. package/dist/run/pricing.d.ts +11 -6
  389. package/dist/run/pricing.js +22 -15
  390. package/dist/run/projection.d.ts +46 -46
  391. package/dist/run/projection.js +57 -57
  392. package/dist/run/reclaim.d.ts +1 -1
  393. package/dist/run/reclaim.js +3 -3
  394. package/dist/run/results.d.ts +5 -5
  395. package/dist/run/run-cost.d.ts +53 -0
  396. package/dist/run/run-cost.js +105 -0
  397. package/dist/run/run-index-analysis.d.ts +15 -0
  398. package/dist/run/run-index-analysis.js +77 -0
  399. package/dist/run/run-index.d.ts +19 -7
  400. package/dist/run/run-index.js +77 -64
  401. package/dist/run/run-not-found.d.ts +5 -0
  402. package/dist/run/run-not-found.js +15 -0
  403. package/dist/run/run.d.ts +6 -5
  404. package/dist/run/run.js +3 -3
  405. package/dist/run/sandbox-receipts.d.ts +2 -2
  406. package/dist/run/sandbox-receipts.js +3 -3
  407. package/dist/run/shared-world-evidence.d.ts +37 -36
  408. package/dist/run/shared-world-evidence.js +4 -4
  409. package/dist/run/shared-world-shape.d.ts +1 -1
  410. package/dist/run/shared-world-shape.js +7 -7
  411. package/dist/run/stats.d.ts +14 -8
  412. package/dist/run/stats.js +121 -63
  413. package/dist/run/status.d.ts +16 -29
  414. package/dist/run/status.js +10 -29
  415. package/dist/run/stored-runs.js +2 -1
  416. package/dist/run/stream-shape.js +1 -1
  417. package/dist/run/streams.d.ts +7 -7
  418. package/dist/run/study-provenance.d.ts +49 -0
  419. package/dist/run/study-provenance.js +66 -0
  420. package/dist/run/study-result.d.ts +11 -0
  421. package/dist/run/study-result.js +9 -0
  422. package/dist/run/text.d.ts +2 -0
  423. package/dist/run/text.js +4 -0
  424. package/dist/run-study.d.ts +112 -0
  425. package/dist/{run-lab.js → run-study.js} +52 -47
  426. package/dist/{lab → study}/adapter-extension.d.ts +15 -27
  427. package/dist/{lab → study}/adapter-extension.js +10 -45
  428. package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
  429. package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
  430. package/dist/study/composition-rules.d.ts +7 -0
  431. package/dist/{lab → study}/composition-rules.js +53 -53
  432. package/dist/study/config.d.ts +15 -0
  433. package/dist/{lab → study}/config.js +98 -41
  434. package/dist/study/convert.d.ts +33 -0
  435. package/dist/study/convert.js +432 -0
  436. package/dist/{lab → study}/device-presets.d.ts +10 -10
  437. package/dist/{lab → study}/device-presets.js +11 -11
  438. package/dist/study/discover.d.ts +75 -0
  439. package/dist/{lab → study}/discover.js +134 -95
  440. package/dist/{lab → study}/doctor.d.ts +19 -12
  441. package/dist/{lab → study}/doctor.js +58 -20
  442. package/dist/study/field-paths.d.ts +12 -0
  443. package/dist/study/field-paths.js +126 -0
  444. package/dist/study/files.d.ts +26 -0
  445. package/dist/study/files.js +44 -0
  446. package/dist/{lab → study}/init-templates.d.ts +2 -2
  447. package/dist/study/init-templates.js +421 -0
  448. package/dist/{lab → study}/init.d.ts +2 -2
  449. package/dist/{lab → study}/init.js +46 -11
  450. package/dist/study/keys.d.ts +4 -0
  451. package/dist/{lab → study}/keys.js +46 -12
  452. package/dist/study/migrate.d.ts +48 -0
  453. package/dist/study/migrate.js +408 -0
  454. package/dist/study/owned-files.d.ts +38 -0
  455. package/dist/study/owned-files.js +182 -0
  456. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  457. package/dist/{lab → study}/parse/actors.js +14 -14
  458. package/dist/study/parse/comms.d.ts +12 -0
  459. package/dist/{lab → study}/parse/comms.js +5 -5
  460. package/dist/study/parse/execution.d.ts +19 -0
  461. package/dist/{lab → study}/parse/execution.js +13 -13
  462. package/dist/study/parse/study-v3.d.ts +21 -0
  463. package/dist/study/parse/study-v3.js +259 -0
  464. package/dist/study/parse/subject-state.d.ts +30 -0
  465. package/dist/{lab → study}/parse/subject-state.js +19 -19
  466. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  467. package/dist/{lab → study}/parse/subject.js +34 -34
  468. package/dist/{lab → study}/parse/values.d.ts +3 -3
  469. package/dist/{lab → study}/parse/values.js +3 -3
  470. package/dist/{lab → study}/persona-resolve.d.ts +8 -8
  471. package/dist/{lab → study}/persona-resolve.js +6 -6
  472. package/dist/{lab → study}/plan-base.d.ts +7 -7
  473. package/dist/{lab → study}/plan-base.js +1 -1
  474. package/dist/{lab → study}/plan-participants.d.ts +12 -12
  475. package/dist/{lab → study}/plan-participants.js +4 -4
  476. package/dist/{lab → study}/plan-types.d.ts +31 -31
  477. package/dist/{lab → study}/plan-types.js +2 -2
  478. package/dist/study/plan.d.ts +13 -0
  479. package/dist/study/plan.js +101 -0
  480. package/dist/study/preflight-probes.d.ts +3 -0
  481. package/dist/{lab → study}/preflight-probes.js +20 -19
  482. package/dist/study/preflight-result.d.ts +8 -0
  483. package/dist/{lab → study}/preflight-result.js +5 -4
  484. package/dist/study/preflight.d.ts +94 -0
  485. package/dist/{lab → study}/preflight.js +12 -12
  486. package/dist/{lab → study}/requirements.d.ts +3 -3
  487. package/dist/{lab → study}/requirements.js +1 -1
  488. package/dist/study/route-inputs.d.ts +28 -0
  489. package/dist/{lab → study}/route-inputs.js +1 -1
  490. package/dist/{lab → study}/routing.d.ts +39 -33
  491. package/dist/{lab → study}/routing.js +60 -29
  492. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
  493. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
  494. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
  495. package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
  496. package/dist/study/run-study-options.d.ts +28 -0
  497. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
  498. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
  499. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  500. package/dist/{lab → study}/summary.d.ts +16 -15
  501. package/dist/{lab → study}/summary.js +21 -21
  502. package/dist/{lab → study}/tasks.d.ts +18 -18
  503. package/dist/{lab → study}/tasks.js +14 -14
  504. package/dist/{lab → study}/types.d.ts +202 -196
  505. package/dist/{lab → study}/types.js +3 -1
  506. package/dist/{lab → study}/validation.d.ts +27 -27
  507. package/dist/{lab → study}/validation.js +53 -51
  508. package/dist/study/warnings.d.ts +12 -0
  509. package/dist/{lab → study}/warnings.js +62 -34
  510. package/dist/subject/clone.d.ts +7 -7
  511. package/dist/subject/clone.js +2 -2
  512. package/dist/subject/desktop-cli.d.ts +1 -1
  513. package/dist/subject/desktop-cli.js +2 -2
  514. package/dist/subject/local-tree-archive.d.ts +2 -2
  515. package/dist/subject/local-tree-archive.js +4 -4
  516. package/dist/subject/local-tree.d.ts +4 -4
  517. package/dist/subject/node-bootstrap.js +1 -1
  518. package/dist/subject/runtime.js +9 -10
  519. package/dist/subject/serve.d.ts +5 -5
  520. package/dist/subject/serve.js +3 -3
  521. package/dist/subject/state.d.ts +4 -4
  522. package/dist/subject/state.js +1 -1
  523. package/dist/subject/steps.d.ts +6 -6
  524. package/dist/subject/steps.js +5 -5
  525. package/dist/substrates/command-failure.d.ts +3 -3
  526. package/dist/substrates/command-failure.js +3 -3
  527. package/dist/substrates/desktop-session.js +2 -2
  528. package/dist/substrates/detached.d.ts +6 -6
  529. package/dist/substrates/detached.js +7 -7
  530. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  531. package/dist/substrates/e2b/cdp-probe.js +14 -17
  532. package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
  533. package/dist/substrates/e2b/desktop-browser.js +9 -9
  534. package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
  535. package/dist/substrates/e2b/desktop-cdp.js +9 -9
  536. package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
  537. package/dist/substrates/e2b/desktop-executor.js +13 -13
  538. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  539. package/dist/substrates/e2b/desktop-geometry.js +8 -8
  540. package/dist/substrates/e2b/desktop-media.d.ts +4 -4
  541. package/dist/substrates/e2b/desktop-media.js +1 -1
  542. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  543. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  544. package/dist/substrates/e2b/lifetime.js +1 -1
  545. package/dist/substrates/e2b/sandbox.d.ts +4 -4
  546. package/dist/substrates/e2b/sandbox.js +2 -2
  547. package/dist/substrates/e2b/sdk.d.ts +12 -12
  548. package/dist/substrates/e2b/sdk.js +7 -7
  549. package/dist/substrates/local/runtime-config.d.ts +4 -4
  550. package/dist/substrates/local/runtime-config.js +4 -4
  551. package/dist/tui/actions.d.ts +1 -1
  552. package/dist/tui/actions.js +13 -13
  553. package/dist/tui/contract.d.ts +23 -23
  554. package/dist/tui/contract.js +11 -11
  555. package/dist/tui/launch.d.ts +7 -7
  556. package/dist/tui/launch.js +36 -31
  557. package/dist/tui/project.js +5 -5
  558. package/dist/tui-app.js +139 -139
  559. package/dist/verify/actor.d.ts +8 -8
  560. package/dist/verify/actor.js +36 -36
  561. package/dist/verify/artifacts.d.ts +2 -2
  562. package/dist/verify/artifacts.js +3 -3
  563. package/dist/verify/context-growth.d.ts +9 -0
  564. package/dist/verify/context-growth.js +62 -0
  565. package/dist/verify/costs.d.ts +6 -6
  566. package/dist/verify/costs.js +8 -8
  567. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  568. package/dist/verify/shared-world-concurrent.js +79 -76
  569. package/dist/verify/shared-world.d.ts +2 -2
  570. package/dist/verify/shared-world.js +16 -16
  571. package/dist/verify/subject.d.ts +5 -5
  572. package/dist/verify/subject.js +19 -19
  573. package/dist/verify/verify.js +94 -44
  574. package/docs/README.md +25 -32
  575. package/docs/architecture/actor-contract.md +60 -91
  576. package/docs/architecture/browser-control.md +1 -1
  577. package/docs/architecture/desktop-sessions.md +7 -7
  578. package/docs/architecture/external-public-shared-world.md +68 -65
  579. package/docs/architecture/github-feedback-loop.md +2 -5
  580. package/docs/architecture/guest-desktop.md +2 -2
  581. package/docs/architecture/observer.md +34 -34
  582. package/docs/architecture/restricted-codex-analysis.md +34 -28
  583. package/docs/architecture/serve.md +34 -37
  584. package/docs/architecture/state-driven-executor.md +55 -58
  585. package/docs/architecture/task-protocol-support.md +6 -6
  586. package/docs/architecture/terminal-product-route.md +70 -110
  587. package/docs/contracts/README.md +24 -0
  588. package/docs/contracts/adapter-admission.md +3 -3
  589. package/docs/contracts/adapter-fixtures.md +4 -7
  590. package/docs/contracts/core.md +1 -3
  591. package/docs/contracts/errors.md +62 -0
  592. package/docs/contracts/feedback.md +8 -9
  593. package/docs/contracts/policy.md +7 -12
  594. package/docs/contracts/run-bundle.md +42 -44
  595. package/docs/contracts/schemas.md +446 -368
  596. package/docs/contracts/study-analysis.md +7 -4
  597. package/docs/contracts/study-costs.md +28 -9
  598. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  599. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  600. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  601. package/docs/principles/actor-fidelity.md +4 -4
  602. package/docs/principles/engineering.md +3 -3
  603. package/docs/principles/invariants-and-defaults.md +38 -38
  604. package/docs/principles/self-driving-harness.md +1 -5
  605. package/docs/principles/three-roles.md +1 -1
  606. package/docs/product/automatic-analysis.md +7 -7
  607. package/examples/README.md +1 -1
  608. package/examples/participant/README.md +5 -5
  609. package/examples/participant/run.mjs +11 -10
  610. package/examples/scorer/README.md +3 -3
  611. package/examples/scorer/run.mjs +11 -12
  612. package/examples/scorer/scorer.mjs +3 -3
  613. package/package.json +16 -17
  614. package/skills/humanish/SKILL.md +64 -60
  615. package/skills/humanish/agents/openai.yaml +1 -1
  616. package/AGENTS.md +0 -99
  617. package/CONTRIBUTING.md +0 -148
  618. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  619. package/dist/actors/codex/qualified-versions.js +0 -132
  620. package/dist/cli/commands/lab-format.d.ts +0 -8
  621. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  622. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  623. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  624. package/dist/cli/commands/lab-run.d.ts +0 -9
  625. package/dist/cli/commands/lab.d.ts +0 -3
  626. package/dist/cli/commands/lab.js +0 -199
  627. package/dist/cli/renamed-options.d.ts +0 -11
  628. package/dist/cli/renamed-options.js +0 -18
  629. package/dist/lab/composition-rules.d.ts +0 -7
  630. package/dist/lab/config.d.ts +0 -7
  631. package/dist/lab/discover.d.ts +0 -65
  632. package/dist/lab/init-templates.js +0 -416
  633. package/dist/lab/keys.d.ts +0 -2
  634. package/dist/lab/parse/comms.d.ts +0 -12
  635. package/dist/lab/parse/execution.d.ts +0 -19
  636. package/dist/lab/parse/subject-state.d.ts +0 -30
  637. package/dist/lab/plan.d.ts +0 -19
  638. package/dist/lab/plan.js +0 -132
  639. package/dist/lab/preflight-probes.d.ts +0 -3
  640. package/dist/lab/preflight-result.d.ts +0 -7
  641. package/dist/lab/preflight.d.ts +0 -92
  642. package/dist/lab/route-inputs.d.ts +0 -28
  643. package/dist/lab/run-lab-options.d.ts +0 -28
  644. package/dist/lab/warnings.d.ts +0 -2
  645. package/dist/observer/static.d.ts +0 -39
  646. package/dist/observer/static.js +0 -369
  647. package/dist/run-lab.d.ts +0 -112
  648. package/docs/architecture/comms-inbox.md +0 -122
  649. package/docs/architecture/desktop-recording.md +0 -80
  650. package/docs/architecture/local-browser-runtime.md +0 -178
  651. package/docs/architecture/observer-review.md +0 -144
  652. package/docs/architecture/participant-media.md +0 -90
  653. package/docs/architecture/project-layout.md +0 -62
  654. package/docs/architecture/real-email-receiving.md +0 -136
  655. package/docs/assets/humanish-drawdb-hero.png +0 -0
  656. package/docs/assets/humanish-observer-hero.png +0 -0
  657. package/docs/goals/current.md +0 -207
  658. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  659. package/docs/product/open-source-install-experience.md +0 -240
  660. package/docs/ramp/README.md +0 -295
  661. package/docs/release/open-source-readiness.md +0 -222
  662. package/docs/release/public-readiness-standard.md +0 -210
  663. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  664. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  665. /package/dist/{lab → study}/init-paths.js +0 -0
  666. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  667. /package/dist/{lab → study}/init-plan.js +0 -0
  668. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  669. /package/dist/{lab → study}/participant-assignment.js +0 -0
  670. /package/dist/{lab → study}/persona.d.ts +0 -0
  671. /package/dist/{lab → study}/persona.js +0 -0
@@ -1,18 +1,20 @@
1
- // Assemble the scripted-browser lab's run bundle from its sessions, and the review summary and
1
+ // Assemble the scripted-browser study's run bundle from its sessions, and the review summary and
2
2
  // markdown that ship with it.
3
+ import { verdictText } from "../../run/judge.js";
3
4
  import { redactText } from "../../evidence/redaction.js";
4
5
  import { buildRunCostSummary, desktopSpanToMinutes, spendFreeCostSummary, } from "../../run/cost-summary.js";
5
6
  import { REVIEW_SCHEMA, bundleArtifacts, bundleHead, } from "../../run/bundle.js";
6
7
  import {} from "../../run/streams.js";
7
8
  import { participantEvent, recordIdOf } from "../../run/participant-records.js";
8
9
  import { scriptedSurfaceIds, scriptedSurfaceRecords } from "./surface-records.js";
10
+ import { plural } from "../../run/text.js";
9
11
  /**
10
- * Project the scripted lab run into a humanish.run-bundle.v1 (no schema change — a new
11
- * producer only). The load-bearing line is `stream.actor = result.trace`: the provider-neutral
12
+ * Project the scripted run into a humanish.run-bundle.v1 (no schema change: a new
13
+ * producer only). The key line is `stream.actor = result.trace`: the provider-neutral
12
14
  * ActorTrace seam the Observer renders and verifyRun's engagement check reads. Exported for
13
15
  * the bundle-builder tests.
14
16
  */
15
- export function buildScriptedLabBundle(args) {
17
+ export function buildScriptedStudyBundle(args) {
16
18
  const resultBySurface = new Map(args.sessionResults.map((result) => [result.capture.surface.id, result]));
17
19
  // Each surface's records are stamped with the run's start.
18
20
  const context = { ...args, createdAt: args.run.createdAt };
@@ -26,7 +28,7 @@ export function buildScriptedLabBundle(args) {
26
28
  persona: {
27
29
  id: args.persona.id,
28
30
  name: `Scripted journey persona (${args.persona.id})`,
29
- source: `lab:${args.labId}`,
31
+ source: `study:${args.studyId}`,
30
32
  sourceDigest: args.persona.promptDigest,
31
33
  },
32
34
  scenario: {
@@ -40,7 +42,7 @@ export function buildScriptedLabBundle(args) {
40
42
  {
41
43
  at: args.run.createdAt,
42
44
  event: "scripted-lab.run.created",
43
- message: `Created scripted-browser lab run with ${args.surfaces.length} surface${args.surfaces.length === 1 ? "" : "s"} (actor ${args.actorId}).`,
45
+ message: `Created a scripted-browser run with ${args.surfaces.length} surface${args.surfaces.length === 1 ? "" : "s"} (actor ${args.actorId}).`,
44
46
  },
45
47
  ],
46
48
  simulations: records.map((record) => record.simulation),
@@ -49,8 +51,8 @@ export function buildScriptedLabBundle(args) {
49
51
  redaction: {
50
52
  status: "passed",
51
53
  notes: ranLive
52
- ? "Scripted step URLs are sanitized to loopback origin+path (query/hash redacted) and step text passes text redaction. Screenshots are FULL-FIDELITY (raw), retained for local use in gitignored .humanish — NOT redacted for publishing; policies.redactScreenshots is not yet supported on this route."
53
- : "Dry-run contract bundle: no browser ran and no screenshots were captured. The scenario contract is digest-pinned; live step text passes text redaction when a session runs.",
54
+ ? "Scripted step URLs are reduced to loopback origin and path (query and hash removed), and step text passes text redaction. Screenshots are unblurred and kept for local use in the gitignored .humanish/ folder; they are not redacted for publishing, and policies.redactScreenshots is not supported on this route yet."
55
+ : "Dry-run bundle: no browser ran and no screenshots were captured. The scenario is digest-pinned; live step text passes text redaction when a session runs.",
54
56
  },
55
57
  artifacts: bundleArtifacts(),
56
58
  review,
@@ -68,18 +70,18 @@ function scriptedEvents(args) {
68
70
  at: args.run.createdAt,
69
71
  level: "info",
70
72
  type: "scripted-lab.run.created",
71
- message: `Created scripted-browser lab run for ${args.labId} (actor ${args.actorId}, ${args.surfaces.length} surface${args.surfaces.length === 1 ? "" : "s"}).`,
73
+ message: `Created a scripted-browser run for ${args.studyId} (actor ${args.actorId}, ${args.surfaces.length} surface${args.surfaces.length === 1 ? "" : "s"}).`,
72
74
  },
73
75
  {
74
76
  id: "event-001-subject",
75
77
  at: args.run.createdAt,
76
78
  level: "info",
77
79
  type: "scripted-lab.subject.declared",
78
- // Invariant 5: provenance recorded or its absence declared. The lab did not provision
80
+ // Provenance is recorded or its absence declared. humanish did not provision
79
81
  // this subject on app-url routes; clone routes carry structured subject provenance below.
80
82
  message: args.subject
81
83
  ? `Provisioned synthetic subject: clone of ${args.subject.repo}${args.subject.commit ? `@${args.subject.commit}` : ""}, served + getHost-exposed in-sandbox; env names: ${args.subject.envNames?.join(", ") || "none"} (values never persisted); state provenance: ${args.subject.state.provenance}; evidence host digest: ${args.hostDigest ?? "dry-run"}.`
82
- : `Subject app declared at ${args.appUrl}; the lab did not provision it — subject build/commit provenance is UNPINNED; evidence binds to the scenario digest ${args.scenarioSourceDigest}.`,
84
+ : `Subject app declared at ${args.appUrl}; humanish did not provision it, so its build and commit are unpinned. The evidence is tied to the scenario digest ${args.scenarioSourceDigest}.`,
83
85
  },
84
86
  {
85
87
  id: "event-002-spend",
@@ -98,7 +100,7 @@ function scriptedEvents(args) {
98
100
  at: result.capture.capturedAt,
99
101
  level: result.status === "passed" ? "info" : "warn",
100
102
  type: `scripted-lab.session.${result.completionReason}`,
101
- message: `${result.capture.surface.id}: ${result.status} — ${result.reason}`,
103
+ message: `${result.capture.surface.id}: ${result.status} (${result.reason})`,
102
104
  }));
103
105
  }
104
106
  }
@@ -117,7 +119,7 @@ function scriptedEvents(args) {
117
119
  at: args.run.createdAt,
118
120
  level: "info",
119
121
  type: "scripted-lab.contract.ready",
120
- message: `Dry-run contract bundle ready: scenario ${args.journey.scenarioId} @ ${args.scenarioSourceDigest} (${args.scenarioSource}, ${args.journey.steps.length} step${args.journey.steps.length === 1 ? "" : "s"}) parsed and digest-pinned; switch scenario.mode to live to actuate a real browser.`,
122
+ message: `Dry-run bundle ready: scenario ${args.journey.scenarioId} @ ${args.scenarioSourceDigest} (${args.scenarioSource}, ${args.journey.steps.length} step${args.journey.steps.length === 1 ? "" : "s"}) parsed and digest-pinned; switch scenario.mode to live to actuate a real browser.`,
121
123
  });
122
124
  }
123
125
  return events;
@@ -143,7 +145,7 @@ function buildScriptedReview(args) {
143
145
  return {
144
146
  schema: REVIEW_SCHEMA,
145
147
  verdict: args.verdict,
146
- summary: `Scripted lab failed before a terminal session verdict: ${args.sessionError}`,
148
+ summary: `The scripted run failed before a terminal session verdict: ${args.sessionError}`,
147
149
  gaps: [],
148
150
  };
149
151
  }
@@ -151,8 +153,8 @@ function buildScriptedReview(args) {
151
153
  return {
152
154
  schema: REVIEW_SCHEMA,
153
155
  verdict: args.verdict,
154
- summary: `Dry-run contract for scenario ${args.journey.scenarioId} (${args.scenarioSource}, ${args.journey.steps.length} steps) against ${args.appUrl}: composition and scenario contract proven at $0; no browser ran.`,
155
- gaps: ["Live scripted session not yet run (dry-run contract only)."],
156
+ summary: `Dry run of scenario ${args.journey.scenarioId} (${args.scenarioSource}, ${args.journey.steps.length} steps) against ${args.appUrl}: composition and scenario checked at $0; no browser ran.`,
157
+ gaps: ["Live scripted session not yet run (dry run only)."],
156
158
  };
157
159
  }
158
160
  const passed = args.sessionResults.filter((result) => result.status === "passed").length;
@@ -176,12 +178,12 @@ export function renderScriptedReviewMarkdown(bundle) {
176
178
  "",
177
179
  `- run: ${bundle.runId}`,
178
180
  `- mode: ${bundle.mode}`,
179
- `- verdict: ${bundle.review.verdict}`,
181
+ `- verdict: ${verdictText(bundle.review.verdict, bundle.mode)}`,
180
182
  `- summary: ${bundle.review.summary}`,
181
183
  `- scenario: ${bundle.scenario.id} @ ${bundle.scenario.sourceDigest} (${bundle.scenario.source})`,
182
184
  ...(subject ? [`- subject: ${subject.message}`] : []),
183
185
  ...(spend ? [`- spend: ${spend.message}`] : []),
184
- ...traces.map(({ stream, trace }) => `- ${recordIdOf(stream)}: ${trace.provider} (${trace.lane}/${trace.protocol}) ${trace.status} (${trace.completionReason}); ${trace.counts.actions ?? 0} step action(s), ${trace.counts.screenshots ?? 0} raw screenshot(s)`),
186
+ ...traces.map(({ stream, trace }) => `- ${recordIdOf(stream)}: ${trace.provider} (${trace.lane}/${trace.protocol}) ${trace.status} (${trace.completionReason}); ${plural(trace.counts.actions ?? 0, "step action")}, ${plural(trace.counts.screenshots ?? 0, "raw screenshot")}`),
185
187
  ...(bundle.review.gaps.length > 0
186
188
  ? ["", "## Gaps", ...bundle.review.gaps.map((gap) => `- ${gap}`)]
187
189
  : []),
@@ -1,8 +1,8 @@
1
- import type { LabDeps } from "../../lab/lab-deps.js";
2
- import type { RoutePlanResult, RouteRefusal, ScriptedPlan } from "../../lab/plan-types.js";
3
- import type { LabConfig } from "../../lab/types.js";
4
- /** The error a scripted lab returns before a run starts. */
5
- export interface ScriptedRefusal extends RouteRefusal<"scripted", "HUMANISH_LAB_ANALYSIS_INVALID" | "HUMANISH_LAB_TASKS_UNSUPPORTED" | "HUMANISH_SCRIPTED_LAB_ACTOR_UNSUPPORTED" | "HUMANISH_SCRIPTED_LAB_SCENARIO_INVALID" | "HUMANISH_SCRIPTED_LAB_SUBJECT_UNSAFE"> {
1
+ import type { StudyDeps } from "../../study/study-deps.js";
2
+ import type { RoutePlanResult, RouteRefusal, ScriptedPlan } from "../../study/plan-types.js";
3
+ import type { StudyConfig } from "../../study/types.js";
4
+ /** The error a scripted study returns before a run starts. */
5
+ export interface ScriptedRefusal extends RouteRefusal<"scripted", "HUMANISH_STUDY_ANALYSIS_INVALID" | "HUMANISH_STUDY_TASKS_UNSUPPORTED" | "HUMANISH_SCRIPTED_ACTOR_UNSUPPORTED" | "HUMANISH_SCRIPTED_SCENARIO_INVALID" | "HUMANISH_SCRIPTED_SUBJECT_UNSAFE"> {
6
6
  /**
7
7
  * Set on the receiving, analysis and tasks refusals. The route returns those before it opens its
8
8
  * run scope, so their result has its own field order and no automatic-analysis record.
@@ -16,12 +16,12 @@ export type ScriptedPlanResult = RoutePlanResult<ScriptedPlan, ScriptedRefusal>;
16
16
  /** The app URL a run's evidence names: a provisioned subject's getHost URL is never persisted. */
17
17
  export declare function evidenceAppUrlOf(subject: ScriptedPlan["subject"]): string;
18
18
  /** Whether a test injected the browser, so a live run needs no host browser. */
19
- export declare function injectedBrowser(deps: LabDeps | undefined): boolean;
19
+ export declare function injectedBrowser(deps: StudyDeps | undefined): boolean;
20
20
  /**
21
- * Plan a scripted-browser lab. It is called for any config handed to the scripted runner, not only
21
+ * Plan a scripted-browser study. It is called for any config handed to the scripted runner, not only
22
22
  * one routeOf sends here, so a config for another route gets this route's refusal.
23
23
  */
24
- export declare function planScriptedLab(config: LabConfig, input: {
24
+ export declare function planScriptedStudy(config: StudyConfig, input: {
25
25
  readonly dryRun: boolean;
26
26
  /** A test's injected browser means a live run needs no host browser. */
27
27
  readonly injectedBrowser?: boolean;
@@ -5,8 +5,8 @@ import { actorRegistry, isScriptedBrowserActorDescriptor } from "../../actors/re
5
5
  import { normalizeLocalAppUrl } from "../../actors/scripted-browser/steps.js";
6
6
  import { browserSurfaces } from "../../actors/scripted-browser/types.js";
7
7
  import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
8
- import { isNonEmpty, planBase, provisionedSubject } from "../../lab/plan-base.js";
9
- import { cloneTargetValidationReason, desktopMediaValidationReason, taskProtocolValidationReason, } from "../../lab/validation.js";
8
+ import { isNonEmpty, planBase, provisionedSubject } from "../../study/plan-base.js";
9
+ import { cloneTargetValidationReason, desktopMediaValidationReason, taskProtocolValidationReason, } from "../../study/validation.js";
10
10
  // Default surface roster is 1 (desktop only): the defaults-table single-participant row governs;
11
11
  // `count: 2` is the declared override that adds the mobile surface.
12
12
  const DEFAULT_SURFACE_COUNT = 1;
@@ -19,33 +19,33 @@ export function injectedBrowser(deps) {
19
19
  return Boolean(deps?.launchBrowser || deps?.browserCommand);
20
20
  }
21
21
  /**
22
- * Plan a scripted-browser lab. It is called for any config handed to the scripted runner, not only
22
+ * Plan a scripted-browser study. It is called for any config handed to the scripted runner, not only
23
23
  * one routeOf sends here, so a config for another route gets this route's refusal.
24
24
  */
25
- export function planScriptedLab(config, input) {
25
+ export function planScriptedStudy(config, input) {
26
26
  const refuse = (code, message, extras = {}) => ({
27
27
  ok: false,
28
28
  refusal: { route: "scripted", code, message, ...extras },
29
29
  });
30
30
  const beforeScope = { beforeScope: true };
31
31
  if (String(config.comms?.email?.kind) === "real")
32
- return refuse("HUMANISH_SCRIPTED_LAB_SCENARIO_INVALID", "Real email receiving is unsupported on the scripted route. Use a supported hosted computer-use browser lab.", beforeScope);
32
+ return refuse("HUMANISH_SCRIPTED_SCENARIO_INVALID", "Real email receiving is unsupported on the scripted route. Use a supported hosted computer-use browser study.", beforeScope);
33
33
  const analysis = resolveAutomaticAnalysis(config.review?.analysis);
34
34
  if (!analysis.ok)
35
- return refuse("HUMANISH_LAB_ANALYSIS_INVALID", analysis.message, beforeScope);
35
+ return refuse("HUMANISH_STUDY_ANALYSIS_INVALID", analysis.message, beforeScope);
36
36
  const tasksReason = taskProtocolValidationReason(config, false);
37
37
  if (tasksReason)
38
- return refuse("HUMANISH_LAB_TASKS_UNSUPPORTED", tasksReason, beforeScope);
38
+ return refuse("HUMANISH_STUDY_TASKS_UNSUPPORTED", tasksReason, beforeScope);
39
39
  const mediaReason = desktopMediaValidationReason(config);
40
40
  if (mediaReason)
41
- return refuse("HUMANISH_SCRIPTED_LAB_SCENARIO_INVALID", mediaReason);
41
+ return refuse("HUMANISH_SCRIPTED_SCENARIO_INVALID", mediaReason);
42
42
  const cloneTargetReason = cloneTargetValidationReason(config);
43
43
  if (cloneTargetReason)
44
- return refuse("HUMANISH_SCRIPTED_LAB_SUBJECT_UNSAFE", cloneTargetReason);
44
+ return refuse("HUMANISH_SCRIPTED_SUBJECT_UNSAFE", cloneTargetReason);
45
45
  const actorType = config.actors[0]?.type ?? "";
46
46
  const descriptor = actorRegistry[actorType];
47
47
  if (!descriptor || !isScriptedBrowserActorDescriptor(descriptor))
48
- return refuse("HUMANISH_SCRIPTED_LAB_ACTOR_UNSUPPORTED", `actors[0].type "${actorType}" is not a registered scripted-browser actor.`);
48
+ return refuse("HUMANISH_SCRIPTED_ACTOR_UNSUPPORTED", `actors[0].type "${actorType}" is not a registered scripted-browser actor.`);
49
49
  const actor = descriptor.id;
50
50
  // The parser checks the loopback entry too; a library caller skips the parser. A clone's URL is
51
51
  // minted by getHost during the run, and its evidence names only the placeholder.
@@ -53,19 +53,19 @@ export function planScriptedLab(config, input) {
53
53
  if (config.subject.source === "clone") {
54
54
  const provisioned = provisionedSubject(config);
55
55
  if (provisioned?.kind !== "clone" || !provisioned.repo)
56
- return refuse("HUMANISH_SCRIPTED_LAB_SUBJECT_UNSAFE", "clone scripted-browser labs require one subject repo plus subject.serve; parseLabConfig should have rejected this config.", { actor, appUrl: "[provisioned-subject]" });
56
+ return refuse("HUMANISH_SCRIPTED_SUBJECT_UNSAFE", "clone scripted-browser studies require one subject repo plus subject.serve; parseStudy should have rejected this config.", { actor, appUrl: "[provisioned-subject]" });
57
57
  subject = provisioned;
58
58
  }
59
59
  else {
60
60
  const appUrl = normalizeLocalAppUrl(config.subject.appUrl ?? "");
61
61
  if (!appUrl)
62
- return refuse("HUMANISH_SCRIPTED_LAB_SUBJECT_UNSAFE", "subject.appUrl must be a loopback http(s) URL (127.0.0.1 or localhost) on the scripted-browser route.", { actor });
62
+ return refuse("HUMANISH_SCRIPTED_SUBJECT_UNSAFE", "subject.appUrl must be a loopback http(s) URL (127.0.0.1 or localhost) on the scripted-browser route.", { actor });
63
63
  subject = { kind: "loopback", appUrl };
64
64
  }
65
65
  // The steps are the actor, so there is no built-in journey to fall back on.
66
66
  const scenarioRef = config.scenario?.ref;
67
67
  if (!scenarioRef?.trim())
68
- return refuse("HUMANISH_SCRIPTED_LAB_SCENARIO_INVALID", "scripted-browser labs require `scenario.ref` — the committed scenario's browser steps are what this actor executes.", { actor, appUrl: evidenceAppUrlOf(subject) });
68
+ return refuse("HUMANISH_SCRIPTED_SCENARIO_INVALID", "A scripted-browser study needs `scenario.ref`: the actor runs the browser steps in that scenario file.", { actor, appUrl: evidenceAppUrlOf(subject) });
69
69
  const requirements = [];
70
70
  if (!input.dryRun && subject.kind === "clone") {
71
71
  requirements.push({ kind: "key", name: "E2B_API_KEY" });
@@ -1,13 +1,13 @@
1
1
  import type { ActorPersonaRef } from "../../actors/contract.js";
2
2
  import type { ScriptedBrowserSessionResult } from "../../actors/scripted-browser/actor.js";
3
3
  import type { BrowserPersonaJourney } from "../../actors/scripted-browser/types.js";
4
- import type { ScriptedPlan } from "../../lab/plan-types.js";
4
+ import type { ScriptedPlan } from "../../study/plan-types.js";
5
5
  import type { RunBundle } from "../../run/bundle.js";
6
6
  import type { RunScope } from "../../run/run.js";
7
7
  import { type ExecutionFailure } from "../../run/judge.js";
8
8
  import type { ObserverResult } from "../../observer/render.js";
9
9
  import type { ScriptedSubject } from "./subject.js";
10
- import { type ScriptedBrowserLabResult } from "./types.js";
10
+ import { type ScriptedBrowserStudyResult } from "./types.js";
11
11
  /** What the finish reads from the run. */
12
12
  export interface ScriptedFinishInputs {
13
13
  plan: ScriptedPlan;
@@ -48,4 +48,4 @@ export declare function scriptedExecutionFailures(args: {
48
48
  subject: Pick<ScriptedSubject, "sandboxId" | "killed" | "releaseWarning"> | undefined;
49
49
  observer: Pick<ObserverResult, "ok" | "error">;
50
50
  }): ExecutionFailure[];
51
- export declare function finishScriptedRun(inputs: ScriptedFinishInputs): Promise<ScriptedBrowserLabResult>;
51
+ export declare function finishScriptedRun(inputs: ScriptedFinishInputs): Promise<ScriptedBrowserStudyResult>;
@@ -1,9 +1,10 @@
1
1
  import { judgeExecution, sandboxCleanupFailure, judgeScripted, OUTCOME_POLICIES, resultOk, } from "../../run/judge.js";
2
2
  import { validatePreparedRunArtifactPaths } from "../../run/paths.js";
3
3
  import { resolveSubjectState } from "../computer-use/subject-projection.js";
4
- import { buildScriptedLabBundle } from "./bundle.js";
4
+ import { buildScriptedStudyBundle } from "./bundle.js";
5
5
  import { existingScreenshots } from "./session-result.js";
6
- import { SCRIPTED_BROWSER_LAB_SCHEMA } from "./types.js";
6
+ import {} from "./types.js";
7
+ import { studyResultIdentity } from "../../run/study-result.js";
7
8
  /** What judgeScripted reads from one surface's session. Scripted has no engagement or blocker rule. */
8
9
  function scriptedSurfaceFacts(result) {
9
10
  return {
@@ -36,7 +37,7 @@ export function scriptedExecutionFailures(args) {
36
37
  ? [
37
38
  {
38
39
  kind: "harness",
39
- message: "Scripted lab did not produce terminal sessions for every surface.",
40
+ message: "The scripted run did not produce terminal sessions for every surface.",
40
41
  },
41
42
  ]
42
43
  : []),
@@ -48,7 +49,7 @@ export function scriptedExecutionFailures(args) {
48
49
  : [
49
50
  {
50
51
  kind: "evidence",
51
- message: observer.error?.message ?? "Observer failed for the scripted lab run.",
52
+ message: observer.error?.message ?? "Observer failed for the scripted run.",
52
53
  },
53
54
  ]),
54
55
  ];
@@ -89,14 +90,14 @@ export async function finishScriptedRun(inputs) {
89
90
  expected: surfaces.length,
90
91
  surfaces: sessionResults.map(scriptedSurfaceFacts),
91
92
  });
92
- const bundle = buildScriptedLabBundle({
93
+ const bundle = buildScriptedStudyBundle({
93
94
  run,
94
95
  actorId: actor,
95
96
  appUrl: evidenceAppUrl,
96
97
  dryRun,
97
98
  journey,
98
- labId: plan.labId,
99
- ...(plan.title ? { labTitle: plan.title } : {}),
99
+ studyId: plan.studyId,
100
+ ...(plan.title ? { studyTitle: plan.title } : {}),
100
101
  persona,
101
102
  scenarioSource: scenario.source,
102
103
  scenarioSourceDigest: scenario.sourceDigest,
@@ -116,7 +117,7 @@ export async function finishScriptedRun(inputs) {
116
117
  const finished = await run.finish(bundle);
117
118
  // Surface the local-fidelity posture so the operator knows the bundle is not publish-safe as-is.
118
119
  if (sessionResults.some((result) => result.trace.redaction.screenshots === "raw")) {
119
- warnings.push("Screenshots are full-fidelity (raw) for local use — the bundle stays in gitignored .humanish and nothing scans these pixels; review them before sharing anywhere. policies.redactScreenshots is not yet supported on the scripted route.");
120
+ warnings.push("Screenshots are unblurred for local use: the bundle stays in the gitignored .humanish/ folder and nothing scans these pixels, so review them before sharing. policies.redactScreenshots is not supported on the scripted route yet.");
120
121
  }
121
122
  const observer = await finished.renderObserver();
122
123
  await validatePreparedRunArtifactPaths(runPaths);
@@ -135,10 +136,9 @@ export async function finishScriptedRun(inputs) {
135
136
  await finished.recordOutcome({ ok, execution });
136
137
  const harnessErrorSession = sessionResults.find((result) => result.completionReason === "harness_error");
137
138
  return {
138
- schema: SCRIPTED_BROWSER_LAB_SCHEMA,
139
+ ...studyResultIdentity("scripted", plan.studyId),
139
140
  ok,
140
141
  cwd,
141
- labId: plan.labId,
142
142
  actor,
143
143
  appUrl: evidenceAppUrl,
144
144
  dryRun,
@@ -167,13 +167,13 @@ export async function finishScriptedRun(inputs) {
167
167
  ? {}
168
168
  : {
169
169
  error: {
170
- code: "HUMANISH_SCRIPTED_LAB_FAILED",
170
+ code: "HUMANISH_SCRIPTED_FAILED",
171
171
  message: sessionError ??
172
172
  (observer.ok
173
173
  ? harnessErrorSession
174
174
  ? `Scripted session ended with a harness error: ${harnessErrorSession.reason}`
175
- : "Scripted lab did not produce terminal sessions for every surface."
176
- : (observer.error?.message ?? "Observer failed for the scripted lab run.")),
175
+ : "The scripted run did not produce terminal sessions for every surface."
176
+ : (observer.error?.message ?? "Observer failed for the scripted run.")),
177
177
  },
178
178
  }),
179
179
  };
@@ -1,28 +1,28 @@
1
- import type { ScriptedPlan } from "../../lab/plan-types.js";
2
- import type { AdmittedPlan } from "../../run-lab.js";
1
+ import type { ScriptedPlan } from "../../study/plan-types.js";
2
+ import type { AdmittedPlan } from "../../run-study.js";
3
3
  import { type ScriptedRefusal } from "./plan.js";
4
- import { type RunScriptedBrowserLabOptions, type ScriptedBrowserLabResult, type ScriptedRunInput } from "./types.js";
4
+ import { type RunScriptedBrowserStudyOptions, type ScriptedBrowserStudyResult, type ScriptedRunInput } from "./types.js";
5
5
  /**
6
6
  * The config-taking entry point. It plans, returns a refusal with the envelope the route has always
7
7
  * returned at that refusal's stage, and otherwise runs the plan.
8
8
  */
9
- export declare function runScriptedBrowserLab(options: RunScriptedBrowserLabOptions): Promise<ScriptedBrowserLabResult>;
9
+ export declare function runScriptedBrowserStudy(options: RunScriptedBrowserStudyOptions): Promise<ScriptedBrowserStudyResult>;
10
10
  /**
11
- * A refused scripted lab's result, at the refusal's stage: a before-scope refusal has its own field
11
+ * A refused scripted study's result, at the refusal's stage: a before-scope refusal has its own field
12
12
  * order and no analysis record; the others come after the output directory checks.
13
13
  */
14
- export declare function scriptedLabRefusal(options: RunScriptedBrowserLabOptions, refusal: ScriptedRefusal): Promise<ScriptedBrowserLabResult>;
14
+ export declare function scriptedStudyRefusal(options: RunScriptedBrowserStudyOptions, refusal: ScriptedRefusal): Promise<ScriptedBrowserStudyResult>;
15
15
  /**
16
- * runLab's step for a scripted plan. It takes no scorer, and its local checks (keys, a browser)
16
+ * runStudyWith's step for a scripted plan. It takes no scorer, and its local checks (keys, a browser)
17
17
  * run inside the run, so it returns the run.
18
18
  */
19
19
  export declare function admitScriptedPlan(plan: ScriptedPlan, input: ScriptedRunInput): AdmittedPlan<"scripted">;
20
20
  /**
21
21
  * Run a scripted plan. The run scope gives a direct library caller the same status-record lifetime
22
22
  * the CLI gets: returning from this function finalizes any record the run opened, whichever of its
23
- * fail-closed exits it took. Each route opens its own scope; `runLab` opens none. Without this a
23
+ * fail-closed exits it took. Each route opens its own scope; `runStudyWith` opens none. Without this a
24
24
  * test or an adopter calling the route directly leaves
25
25
  * the 5s cadence ticking into a directory something else is deleting, which surfaces as an
26
26
  * unrelated ENOTEMPTY.
27
27
  */
28
- export declare function runScriptedPlan(plan: ScriptedPlan, input: ScriptedRunInput): Promise<ScriptedBrowserLabResult>;
28
+ export declare function runScriptedPlan(plan: ScriptedPlan, input: ScriptedRunInput): Promise<ScriptedBrowserStudyResult>;
@@ -10,7 +10,7 @@
10
10
  // against a real app (it fills forms and clicks buttons). A dry run parses and digest-pins the
11
11
  // scenario and writes the contract bundle without touching anything.
12
12
  //
13
- // Subject provenance (invariant 5): an app-url run declares that the lab did not provision the
13
+ // Subject provenance: an app-url run declares that humanish did not provision the
14
14
  // subject, so its build provenance is unpinned and the evidence binds to the scenario digest. A
15
15
  // clone run records commit, env names, state provenance and a host digest, never the raw getHost
16
16
  // URL or a secret value.
@@ -24,42 +24,42 @@ import { buildRunSource } from "../../run/bundle.js";
24
24
  import { prepareSelectedOutputDirectory } from "../../run/contained-output.js";
25
25
  import { runScope } from "../../run/run.js";
26
26
  import { renderScriptedReviewMarkdown } from "./bundle.js";
27
- import { injectedBrowser, planScriptedLab } from "./plan.js";
27
+ import { injectedBrowser, planScriptedStudy } from "./plan.js";
28
28
  import { finishScriptedRun } from "./result.js";
29
29
  import { UnsafeScriptedSessionResultError } from "./session-result.js";
30
30
  import { prepareScriptedRun } from "./setup.js";
31
31
  import { ScriptedSubject } from "./subject.js";
32
32
  import { runScriptedSessions, writeSurfaceTraces } from "./surface-sessions.js";
33
- import { SCRIPTED_BROWSER_LAB_SCHEMA, } from "./types.js";
33
+ import {} from "./types.js";
34
+ import { studyResultIdentity } from "../../run/study-result.js";
34
35
  /**
35
36
  * The config-taking entry point. It plans, returns a refusal with the envelope the route has always
36
37
  * returned at that refusal's stage, and otherwise runs the plan.
37
38
  */
38
- export async function runScriptedBrowserLab(options) {
39
+ export async function runScriptedBrowserStudy(options) {
39
40
  const { config, dryRun, ...input } = options;
40
- // planScriptedLab makes every configuration refusal, in the order this route always has.
41
- const planned = planScriptedLab(config, {
41
+ // planScriptedStudy makes every configuration refusal, in the order this route always has.
42
+ const planned = planScriptedStudy(config, {
42
43
  dryRun,
43
44
  injectedBrowser: injectedBrowser(input.deps),
44
45
  });
45
46
  if (planned.ok)
46
47
  return runScriptedPlan(planned.plan, input);
47
- return scriptedLabRefusal(options, planned.refusal);
48
+ return scriptedStudyRefusal(options, planned.refusal);
48
49
  }
49
50
  /**
50
- * A refused scripted lab's result, at the refusal's stage: a before-scope refusal has its own field
51
+ * A refused scripted study's result, at the refusal's stage: a before-scope refusal has its own field
51
52
  * order and no analysis record; the others come after the output directory checks.
52
53
  */
53
- export async function scriptedLabRefusal(options, refusal) {
54
+ export async function scriptedStudyRefusal(options, refusal) {
54
55
  const { config, dryRun } = options;
55
56
  const cwd = path.resolve(options.cwd);
56
57
  const actorType = config.actors[0]?.type ?? "";
57
58
  if (refusal.beforeScope)
58
59
  return {
59
- schema: SCRIPTED_BROWSER_LAB_SCHEMA,
60
+ ...studyResultIdentity("scripted", config.id),
60
61
  ok: false,
61
62
  cwd,
62
- labId: config.id,
63
63
  actor: actorType,
64
64
  dryRun,
65
65
  runId: options.runId ?? "not-created",
@@ -72,10 +72,9 @@ export async function scriptedLabRefusal(options, refusal) {
72
72
  const physicalCwd = await realpath(cwd);
73
73
  await prepareSelectedOutputDirectory(path.dirname(physicalCwd), physicalCwd);
74
74
  const refused = {
75
- schema: SCRIPTED_BROWSER_LAB_SCHEMA,
75
+ ...studyResultIdentity("scripted", config.id),
76
76
  ok: false,
77
77
  cwd,
78
- labId: config.id,
79
78
  actor: refusal.actor ?? actorType,
80
79
  appUrl: refusal.appUrl ?? config.subject.appUrl ?? "",
81
80
  dryRun,
@@ -88,7 +87,7 @@ export async function scriptedLabRefusal(options, refusal) {
88
87
  return completeAutomaticAnalysis(refused, undefined, analysis.ok ? analysis.config : undefined, options, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
89
88
  }
90
89
  /**
91
- * runLab's step for a scripted plan. It takes no scorer, and its local checks (keys, a browser)
90
+ * runStudyWith's step for a scripted plan. It takes no scorer, and its local checks (keys, a browser)
92
91
  * run inside the run, so it returns the run.
93
92
  */
94
93
  export function admitScriptedPlan(plan, input) {
@@ -103,7 +102,7 @@ export function admitScriptedPlan(plan, input) {
103
102
  /**
104
103
  * Run a scripted plan. The run scope gives a direct library caller the same status-record lifetime
105
104
  * the CLI gets: returning from this function finalizes any record the run opened, whichever of its
106
- * fail-closed exits it took. Each route opens its own scope; `runLab` opens none. Without this a
105
+ * fail-closed exits it took. Each route opens its own scope; `runStudyWith` opens none. Without this a
107
106
  * test or an adopter calling the route directly leaves
108
107
  * the 5s cadence ticking into a directory something else is deleting, which surfaces as an
109
108
  * unrelated ENOTEMPTY.
@@ -126,7 +125,7 @@ async function runScriptedPlanInScope(plan, input, scope) {
126
125
  runId: input.runId,
127
126
  mintRunId: makeScriptedRunId,
128
127
  mode: dryRun ? "dry-run" : "live",
129
- lab: plan.lab,
128
+ study: plan.study,
130
129
  renderReview: renderScriptedReviewMarkdown,
131
130
  observer: { open: input.open === true, render: setup.deps.renderObserver },
132
131
  });
@@ -11,7 +11,7 @@ interface ResolvedScriptedScenario {
11
11
  * Resolve and consume `scenario.ref`. Path-style refs (contain a separator or end .yaml/.yml)
12
12
  * resolve against cwd and are clamped inside it: a ../../ escape is rejected, never recorded
13
13
  * as repo-relative provenance. Id-style refs must be public-safe tokens and resolve to
14
- * humanish/scenarios/<ref>.yaml (then .yml). Every failure mode is fail-closed. planScriptedLab
14
+ * humanish/scenarios/<ref>.yaml (then .yml). Every failure mode is fail-closed. planScriptedStudy
15
15
  * has already refused a missing or blank ref.
16
16
  */
17
17
  export declare function resolveScriptedScenario(projectRoot: PreparedSelectedOutputDirectory, ref: string): Promise<ResolvedScriptedScenario | {
@@ -1,4 +1,4 @@
1
- // Resolve a scripted-browser lab's `scenario.ref` to a committed scenario file and parse its
1
+ // Resolve a scripted-browser study's `scenario.ref` to a committed scenario file and parse its
2
2
  // `browser.steps` into the journey the actor runs. The ref is an id or a repo-relative path that must
3
3
  // stay inside the project; provenance records it repo-relative with the scenario's digest.
4
4
  import { parse as parseYaml } from "yaml";
@@ -6,14 +6,14 @@ import path from "node:path";
6
6
  import { parseBrowserPersonaJourneyFromScenario } from "../../actors/scripted-browser/journey.js";
7
7
  import { digestText } from "../../evidence/redaction.js";
8
8
  import { readContainedRegularFile, } from "../../run/contained-output.js";
9
- // Same public-safe token shape the lab id uses; an id-style scenario.ref must match it before
9
+ // Same public-safe token shape the study id uses; an id-style scenario.ref must match it before
10
10
  // it is interpolated into a repo path.
11
11
  const SCENARIO_REF_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.-]*$/;
12
12
  /**
13
13
  * Resolve and consume `scenario.ref`. Path-style refs (contain a separator or end .yaml/.yml)
14
14
  * resolve against cwd and are clamped inside it: a ../../ escape is rejected, never recorded
15
15
  * as repo-relative provenance. Id-style refs must be public-safe tokens and resolve to
16
- * humanish/scenarios/<ref>.yaml (then .yml). Every failure mode is fail-closed. planScriptedLab
16
+ * humanish/scenarios/<ref>.yaml (then .yml). Every failure mode is fail-closed. planScriptedStudy
17
17
  * has already refused a missing or blank ref.
18
18
  */
19
19
  export async function resolveScriptedScenario(projectRoot, ref) {
@@ -26,7 +26,7 @@ export async function resolveScriptedScenario(projectRoot, ref) {
26
26
  if (!relative || relative.startsWith("..") || path.isAbsolute(relative)) {
27
27
  return {
28
28
  ok: false,
29
- message: `scenario.ref path must stay inside the target cwd (got "${trimmed}") — provenance is recorded repo-relative and an escaping path cannot be.`,
29
+ message: `scenario.ref must stay inside the project directory, and "${trimmed}" does not: the run records it relative to the project.`,
30
30
  };
31
31
  }
32
32
  source = relative.split(path.sep).join("/");
@@ -80,7 +80,7 @@ export async function resolveScriptedScenario(projectRoot, ref) {
80
80
  if (!parsed.journey) {
81
81
  return {
82
82
  ok: false,
83
- message: `${source} declares no executable browser steps — the scripted-browser actor needs a scenario with browser.steps.`,
83
+ message: `${source} declares no browser steps, and the scripted-browser actor needs a scenario with browser.steps.`,
84
84
  };
85
85
  }
86
86
  return { ok: true, journey: parsed.journey, source, sourceDigest };
@@ -1,15 +1,15 @@
1
1
  import type { ActorPersonaRef } from "../../actors/contract.js";
2
2
  import type { BrowserPersonaJourney, ScriptedBrowserEvidenceUrlPolicy } from "../../actors/scripted-browser/types.js";
3
- import type { ScriptedPlan } from "../../lab/plan-types.js";
4
- import { type ScriptedBrowserLabResult, type ScriptedRunInput } from "./types.js";
5
- import type { LabDeps } from "../../lab/lab-deps.js";
3
+ import type { ScriptedPlan } from "../../study/plan-types.js";
4
+ import { type ScriptedBrowserStudyResult, type ScriptedRunInput } from "./types.js";
5
+ import type { StudyDeps } from "../../study/study-deps.js";
6
6
  /** What setup hands the run: the plan's subject and scenario, keys and the browser to launch. */
7
7
  export interface ScriptedRunSetup {
8
8
  cwd: string;
9
9
  physicalCwd: string;
10
- deps: LabDeps;
10
+ deps: StudyDeps;
11
11
  warnings: string[];
12
- failed: (code: NonNullable<ScriptedBrowserLabResult["error"]>["code"], message: string) => ScriptedBrowserLabResult;
12
+ failed: (code: NonNullable<ScriptedBrowserStudyResult["error"]>["code"], message: string) => ScriptedBrowserStudyResult;
13
13
  clone: Extract<ScriptedPlan["subject"], {
14
14
  readonly kind: "clone";
15
15
  }> | undefined;
@@ -39,7 +39,7 @@ export interface ScriptedRunSetup {
39
39
  */
40
40
  export declare function prepareScriptedRun(plan: ScriptedPlan, input: ScriptedRunInput): Promise<{
41
41
  ok: false;
42
- result: ScriptedBrowserLabResult;
42
+ result: ScriptedBrowserStudyResult;
43
43
  } | {
44
44
  ok: true;
45
45
  setup: ScriptedRunSetup;