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,31 +1,33 @@
1
- import { type LabAnalysis } from "../analysis/automatic-config.js";
2
- import type { LabTask } from "./tasks.js";
1
+ import { type StudyAnalysis } from "../analysis/automatic-config.js";
2
+ import type { StudyTask } from "./tasks.js";
3
3
  import type { DwellWindow, StopWhen } from "../actors/stop-conditions.js";
4
4
  import { type ReasoningEffort } from "../actors/reasoning-effort.js";
5
- export declare const LAB_CONFIG_SCHEMA = "humanish.lab.v2";
5
+ export declare const V2_SCHEMA = "humanish.lab.v2";
6
+ /** The study format: it declares its route, one actor, its participants and one caps block. */
7
+ export declare const STUDY_SCHEMA = "humanish.study.v3";
6
8
  export declare const ID_PATTERN: RegExp;
7
9
  /**
8
10
  * Where the run acts: the host repo, a fresh clone, a running app a browser actor drives
9
11
  * (`app-url`), an already-running local dev server driven in-process via a custom
10
12
  * CuaExecutor with no clone and no E2B desktop (`local-app`), or the operator's own local
11
13
  * working tree packed and provisioned in-sandbox in place of a clone (`local-tree`).
12
- * `local-app` routes to the cua backend and is library-assisted: a caller supplies
13
- * `RunLabOptions.inProcess` + `createProvider` (no built-in driver exists yet), and the engine
14
- * fails closed (HUMANISH_CUA_LAB_LOCAL_APP_NO_EXECUTOR) when run without them: a structured
14
+ * `local-app` routes to the computer-use route and is library-assisted: a caller supplies
15
+ * `RunStudyOptions.inProcess` + `createProvider` (no built-in driver exists yet), and the engine
16
+ * fails closed (HUMANISH_COMPUTER_USE_LOCAL_APP_NO_EXECUTOR) when run without them: a structured
15
17
  * error, never a desktop attempt. See docs/architecture/state-driven-executor.md.
16
18
  */
17
- type LabSubjectSource = "this-repo" | "clone" | "app-url" | "local-app" | "terminal-product" | "desktop-cli" | "local-tree";
19
+ type StudySubjectSource = "this-repo" | "clone" | "app-url" | "local-app" | "terminal-product" | "desktop-cli" | "local-tree";
18
20
  /**
19
21
  * How a subject's world relates across participants. `per-lane-worlds` (the default; absent ==
20
- * this) is the only fan-out topology the computer-use route ships — N participants, N independent
21
- * worlds, isolation + per-participant attribution. `shared-world` (#164) is the declared override: one
22
+ * this) is the only fan-out topology the computer-use route ships: N participants, N independent
23
+ * worlds, isolation + per-participant attribution. `shared-world` is the declared override: one
22
24
  * mutable service plane that N participants use at the same time, so their actions interact through
23
25
  * shared state. Consumed only on the shared-world routes (a provisioned clone plane, or an
24
26
  * external-public app-url plane) with a computer-use actor; inert/warned everywhere else
25
- * (invariant 6).
27
+ * (claims match mechanism).
26
28
  */
27
- type LabSubjectTopology = "per-lane-worlds" | "shared-world";
28
- export interface LabSubjectClone {
29
+ type StudySubjectTopology = "per-lane-worlds" | "shared-world";
30
+ export interface StudySubjectClone {
29
31
  /** git clone depth; 1 (shallow) by default. Consumed on the computer-use clone route. */
30
32
  depth?: number;
31
33
  /** how many participants to fan out, each with its own clone (one sandbox/desktop each). */
@@ -35,9 +37,9 @@ export interface LabSubjectClone {
35
37
  }
36
38
  /**
37
39
  * `local-tree`: how the operator's own working tree is packed and provisioned in-sandbox in
38
- * place of a clone. Internal shape (not re-exported from src/index.ts, same as LabSubjectClone).
40
+ * place of a clone. Internal shape (not re-exported from src/index.ts, same as StudySubjectClone).
39
41
  */
40
- export interface LabSubjectLocalTree {
42
+ export interface StudySubjectLocalTree {
41
43
  /** extra archive excludes (path prefixes/basenames) added on top of the always-on denylist. */
42
44
  exclude?: string[];
43
45
  /** keep the disposable sandbox on failure for debugging (mirrors subject.clone.keep). */
@@ -46,16 +48,16 @@ export interface LabSubjectLocalTree {
46
48
  maxArchiveBytes?: number;
47
49
  }
48
50
  /** How a cloned subject is installed/built/started inside the sandbox (computer-use route). */
49
- export interface LabSubjectServe {
51
+ export interface StudySubjectServe {
50
52
  /** Optional bounded install step (e.g. "pnpm install --frozen-lockfile"). */
51
53
  install?: string;
52
54
  /** Optional bounded build step. */
53
55
  build?: string;
54
- /** Required long-lived start command — launched detached; the sandbox lifecycle owns it. */
56
+ /** Required long-lived start command, launched detached; the sandbox lifecycle owns it. */
55
57
  start: string;
56
- /** Loopback entry URL: the readiness-probe target and the URL the actor drives. The lab
58
+ /** Loopback entry URL: the readiness-probe target and the URL the actor drives. humanish
57
59
  * serves the clone inside the sandbox, so this is always loopback (not subject to
58
- * allowPublicTargets — that governs app-url subjects, i.e. external deployments). */
60
+ * allowPublicTargets, which governs app-url subjects, i.e. external deployments). */
59
61
  url: string;
60
62
  /** Budget for the served app to answer the readiness probe. Default 180000. */
61
63
  readyTimeoutMs?: number;
@@ -65,47 +67,47 @@ export interface LabSubjectServe {
65
67
  buildTimeoutMs?: number;
66
68
  }
67
69
  /** When a state step runs, relative to the serve sequence (clone subjects, computer-use route). */
68
- export type LabStateStepWhen = "before-build" | "before-start" | "after-ready";
69
- interface LabSubjectStateStep {
70
+ export type StudyStateStepWhen = "before-build" | "before-start" | "after-ready";
71
+ interface StudySubjectStateStep {
70
72
  /**
71
73
  * [a-z0-9-] step label (must start alphanumeric), <=40 chars, unique across steps; becomes
72
- * the detached-step name `subject-state-<name>` (interpolates into in-sandbox file paths —
73
- * the shape is load-bearing, validated at parse and re-enforced in the engine).
74
+ * the detached-step name `subject-state-<name>` (interpolates into in-sandbox file paths, so
75
+ * the shape is validated at parse and re-enforced in the engine).
74
76
  */
75
77
  name: string;
76
78
  /**
77
- * Author-trusted shell command (same trust class as serve.install/build/start — the
79
+ * Author-trusted shell command (same trust class as serve.install/build/start: the
78
80
  * "serve commands are author-trusted" corollary). Runs detached in the subject directory
79
81
  * with an atomic status file, kill-on-timeout, and a capped log tail. Persisted in
80
82
  * evidence as a sha256-16 digest only, never as text.
81
83
  */
82
84
  command: string;
83
85
  /**
84
- * Phase: before-build (after install — for builds that read the DB, e.g. SSG),
85
- * before-start (after build, before the server launches — migrations, SQL/file fixtures,
86
- * an in-sandbox `service postgresql start`), after-ready (after the readiness probe —
86
+ * Phase: before-build (after install, for builds that read the DB, e.g. SSG),
87
+ * before-start (after build, before the server launches: migrations, SQL/file fixtures,
88
+ * an in-sandbox `service postgresql start`), after-ready (after the readiness probe:
87
89
  * fixtures loaded through the running app's API). Default: before-start.
88
90
  */
89
- when?: LabStateStepWhen;
91
+ when?: StudyStateStepWhen;
90
92
  /** Wall-clock budget per step. Default 300000. */
91
93
  timeoutMs?: number;
92
94
  }
93
95
  /**
94
96
  * A shared-world state checkpoint: an author-trusted, read-only, aggregate/digest probe command
95
97
  * (counts, max-timestamps, hashes) run at baseline and after each role's turn. Reuses the
96
- * seed-step validation shape (name [a-z0-9-] ≤40, unique; command required). Persisted DIGEST-ONLY
97
- * (only sha256-16(scrub+redact(stdout)) ever lands — never the raw value), same lockdown as the
98
- * seed surface. Consumed only on the shared-world route (#164); inert/warned elsewhere.
98
+ * seed-step validation shape (name [a-z0-9-] ≤40, unique; command required). Persisted digest-only
99
+ * (only sha256-16(scrub+redact(stdout)) ever lands, never the raw value), same lockdown as the
100
+ * seed surface. Consumed only on the shared-world route; inert/warned elsewhere.
99
101
  */
100
- export interface LabSubjectStateCheckpoint {
102
+ export interface StudySubjectStateCheckpoint {
101
103
  /**
102
104
  * [a-z0-9-] probe label (must start alphanumeric), <=40 chars, unique across checkpoints;
103
- * names the detached step (`checkpoint-<snapshot>-<name>`) — load-bearing shape, validated at
105
+ * names the detached step (`checkpoint-<snapshot>-<name>`), a shape validated at
104
106
  * parse and re-enforced in the engine.
105
107
  */
106
108
  name: string;
107
109
  /**
108
- * Author-trusted READ-ONLY shell command (same trust class as serve/seed — the "serve commands
110
+ * Author-trusted read-only shell command (same trust class as serve/seed: the "serve commands
109
111
  * are author-trusted" corollary). Its stdout is scrubbed + pattern-redacted, then digested
110
112
  * (sha256-16); the raw value never persists.
111
113
  */
@@ -118,30 +120,30 @@ export interface LabSubjectStateCheckpoint {
118
120
  redact?: string[];
119
121
  }
120
122
  /** The subject's state story (clone subjects): seeded in-sandbox, or declared external. */
121
- export interface LabSubjectState {
123
+ export interface StudySubjectState {
122
124
  /** Ordered seed/migration/fixture steps. Order within a phase is declaration order. */
123
- seed?: LabSubjectStateStep[];
125
+ seed?: StudySubjectStateStep[];
124
126
  /**
125
- * Env var names whose values point at state the lab does not control (e.g. a shared dev
127
+ * Env var names whose values point at state the study does not control (e.g. a shared dev
126
128
  * DB). Must be a subset of subject.env (so the declaration is mechanically backed by a
127
129
  * provisioned name, not a vibe). Flips state provenance to "unpinned".
128
130
  */
129
131
  external?: string[];
130
132
  /**
131
- * Shared-world state checkpoints (#164): read-only digest probes run at baseline + after each
133
+ * Shared-world state checkpoints: read-only digest probes run at baseline + after each
132
134
  * role's turn to produce the harness-clocked interaction timeline. Consumed only on the
133
- * shared-world route; inert/warned elsewhere (invariant 6). Shape-validated everywhere.
135
+ * shared-world route; inert/warned elsewhere. Shape-validated everywhere.
134
136
  */
135
- checkpoint?: LabSubjectStateCheckpoint[];
137
+ checkpoint?: StudySubjectStateCheckpoint[];
136
138
  }
137
139
  /**
138
140
  * `terminal-product`: the product-under-study a terminal agent must discover and use from public
139
141
  * surfaces only (the terminal-product route's subject). The subject is not provisioned or cloned:
140
- * the agent drives the declared public surfaces, so provenance is unpinned (invariant 5). The
142
+ * the agent drives the declared public surfaces, so provenance is declared unpinned. The
141
143
  * concrete product name + surfaces are operator data; committed fixtures use a neutral mock name.
142
144
  */
143
- export interface LabSubjectProduct {
144
- /** Public-safe product label (shape-validated like a lab id; interpolates into evidence). */
145
+ export interface StudySubjectProduct {
146
+ /** Public-safe product label (shape-validated like a study id; interpolates into evidence). */
145
147
  name: string;
146
148
  /**
147
149
  * How the product gets onto the machine, run with no keys before the participant starts, in the
@@ -149,9 +151,9 @@ export interface LabSubjectProduct {
149
151
  * desktop) and `terminal-product` (an agent in a shell).
150
152
  *
151
153
  * Absent means the participant installs it themselves from the public surfaces, which is a
152
- * different study — one about the install, not about the tool. Present means the study starts
154
+ * different study, one about the install. Present means the study starts
153
155
  * where you want it to start: asking a participant what studies a project contains, in an empty
154
- * directory, measures the lab rather than the product.
156
+ * directory, measures the study rather than the product.
155
157
  * Both routes prepare Node/npm when install is absent; product installation remains the
156
158
  * participant's task. A missing template runtime must not become a product finding.
157
159
  */
@@ -162,7 +164,7 @@ export interface LabSubjectProduct {
162
164
  *
163
165
  * This exists because the first live study failed on it: the participant was asked what studies
164
166
  * the project contained, landed in an empty home directory, correctly reported that there was no
165
- * project, and stopped. The finding was about the lab, not the product. A study of a
167
+ * project, and stopped. The finding was about the study, not the product. A study of a
166
168
  * project-scoped tool has to put the participant inside a project, the same way an app study opens
167
169
  * the app rather than a blank tab.
168
170
  */
@@ -179,23 +181,23 @@ export interface LabSubjectProduct {
179
181
  * autonomous agent is about to drive.
180
182
  *
181
183
  * It exists so a study can test a build that is not published yet. Installing `@latest` measures
182
- * the last release, which is exactly the wrong artifact for a pre-release gate — the point is to
184
+ * the last release, which is exactly the wrong artifact for a pre-release gate. The point is to
183
185
  * meet the candidate before anyone else does. Any adopter shipping a CLI wants the same thing.
184
186
  */
185
187
  upload?: string;
186
188
  }
187
- export interface LabSubject {
188
- source: LabSubjectSource;
189
+ export interface StudySubject {
190
+ source: StudySubjectSource;
189
191
  /**
190
192
  * World topology across participants. Absent == `per-lane-worlds` (the isolation default; every
191
- * existing lab is byte-stable). `shared-world` is the declared override (#164): one mutable
192
- * service plane, N role seats at once. Consumed only on the shared-world routes (a provisioned
193
- * clone or an external-public app-url plane, a computer-use actor, and a roster of ≥2 participants);
194
- * inert/warned elsewhere.
193
+ * existing study is byte-stable). `shared-world` is the declared override: one mutable service
194
+ * plane, N participants at once, each in its role. Consumed only on the shared-world routes (a
195
+ * provisioned clone or an external-public app-url plane, a computer-use actor, and a roster of ≥2
196
+ * participants); inert/warned elsewhere.
195
197
  */
196
- topology?: LabSubjectTopology;
198
+ topology?: StudySubjectTopology;
197
199
  /**
198
- * Concurrent shared-world route only (#164 phase 2): the author's required attestation that the
200
+ * Concurrent shared-world route only: the author's required attestation that the
199
201
  * subject behind the internet-reachable `getHost` URL is synthetic seeded data. The concurrent
200
202
  * route exposes the subject on a tokenless public URL for the run's duration, so real/external
201
203
  * data must never sit behind it. This is author-trust + a provenance gate (verify also requires
@@ -204,16 +206,16 @@ export interface LabSubject {
204
206
  */
205
207
  exposure?: "synthetic";
206
208
  /**
207
- * External-public shared-world route only (#164 phase 2): the author's required ownership
209
+ * External-public shared-world route only: the author's required ownership
208
210
  * attestation when a real public deployment (`source: app-url` + `topology: shared-world` +
209
211
  * `concurrency > 1` + `policies.allowPublicTargets: true`) is used directly as the shared plane.
210
212
  * The harness neither provisions nor exposes this target (no getHost, no clone, no seed), so it
211
213
  * cannot attest the data is synthetic; instead the operator must attest they own/operate it.
212
- * `owner` is a public-safe operator/repo label; `authorized` must be true. This is author-trust —
213
- * the harness cannot verify ownership — surfaced honestly in the evidence class. Required on the
214
+ * `owner` is a public-safe operator/repo label; `authorized` must be true. This is author-trust:
215
+ * the harness cannot verify ownership, and the evidence class says so. Required on the
214
216
  * external-public branch. On a non-`app-url` subject it is rejected (parse error); on any other
215
- * `app-url` config that does not route to external-public shared-world it is IGNORED-WITH-A-WARNING
216
- * (forwardDeclaredWarnings), never silently consumed — it is meaningless without that plane.
217
+ * `app-url` config that does not route to external-public shared-world it is ignored with a warning
218
+ * (forwardDeclaredWarnings), never silently consumed, because it is meaningless without that plane.
217
219
  */
218
220
  publicTarget?: {
219
221
  owner: string;
@@ -221,20 +223,20 @@ export interface LabSubject {
221
223
  };
222
224
  /** `clone`: one or more owner/repo slugs (public or authorized-private). */
223
225
  repos?: string[];
224
- clone?: LabSubjectClone;
226
+ clone?: StudySubjectClone;
225
227
  /**
226
228
  * `app-url`: a loopback http(s) URL the computer-use actor drives (127.0.0.1/localhost
227
- * only — driving arbitrary public sites is not allowed). The URL must be reachable from
229
+ * only; driving arbitrary public sites is not allowed). The URL must be reachable from
228
230
  * inside the desktop sandbox; library callers provision it via the prepareDesktop hook.
229
- * For a config-only path use `clone` + `serve` — the lab serves the app itself.
231
+ * For a config-only path use `clone` + `serve`: humanish serves the app itself.
230
232
  *
231
233
  * `local-app`: the loopback http(s) URL of an already-running local dev server the caller's
232
- * custom CuaExecutor drives in-process (no sandbox, no public-target option — always
234
+ * custom CuaExecutor drives in-process (no sandbox, no public-target option, always
233
235
  * loopback). Passed to `inProcess.executor` so the bridge knows where the app lives.
234
236
  */
235
237
  appUrl?: string;
236
238
  /** `clone` (computer-use route): how the cloned app is served in-sandbox. */
237
- serve?: LabSubjectServe;
239
+ serve?: StudySubjectServe;
238
240
  /**
239
241
  * Env var names the subject app needs, provisioned into the sandbox from the caller's
240
242
  * environment (--env-file). Names are recorded in evidence; values never are. Consumed
@@ -242,10 +244,10 @@ export interface LabSubject {
242
244
  */
243
245
  env?: string[];
244
246
  /**
245
- * Literal, non-secret env values committed alongside the lab: the configuration every real app
247
+ * Literal, non-secret env values committed alongside the study: the configuration every real app
246
248
  * needs before it will boot: a public base URL, a transport selector, a feature flag. None of that
247
249
  * is secret, and routing it through `subject.env` would force an adopter to carry a private env
248
- * file just to reproduce a public study, which is the opposite of a reproducible lab.
250
+ * file just to reproduce a public study, which is the opposite of a reproducible study.
249
251
  *
250
252
  * These values are recorded in evidence, because they are part of how the subject was configured,
251
253
  * so a value that looks like a secret or a local path is refused at parse rather than committed to
@@ -253,27 +255,27 @@ export interface LabSubject {
253
255
  */
254
256
  envValues?: Record<string, string>;
255
257
  /**
256
- * `clone` (computer-use route): the subject's state story — seed/migration/fixture steps
258
+ * `clone` (computer-use route): the subject's state story, as seed/migration/fixture steps
257
259
  * executed in-sandbox around the serve sequence, and/or declared external state. Recorded
258
- * in the run bundle as structured provenance (invariant 5): seeded with command digests,
260
+ * in the run bundle as structured provenance: seeded with command digests,
259
261
  * unpinned for external state, declared-not-run for dry-run/failed provisioning.
260
262
  */
261
- state?: LabSubjectState;
263
+ state?: StudySubjectState;
262
264
  /**
263
265
  * `terminal-product` (terminal route): the product the terminal agent discovers + uses from
264
266
  * public surfaces only. Consumed on the terminal route; rejected on every other source.
265
267
  */
266
- product?: LabSubjectProduct;
268
+ product?: StudySubjectProduct;
267
269
  /**
268
- * `local-tree` (computer-use route): local-tree packs the lab resolution cwd (the project
270
+ * `local-tree` (computer-use route): local-tree packs the study's working directory (the project
269
271
  * directory humanish runs from) instead of cloning a repo. `exclude` adds extra archive excludes
270
272
  * on top of the always-on denylist; `keep` preserves the sandbox on failure for debugging;
271
273
  * `maxArchiveBytes` caps the upload. Consumed on the local-tree route; rejected on every other
272
274
  * source.
273
275
  */
274
- localTree?: LabSubjectLocalTree;
276
+ localTree?: StudySubjectLocalTree;
275
277
  }
276
- export interface LabParticipantFocus {
278
+ export interface StudyParticipantFocus {
277
279
  id?: string;
278
280
  label?: string;
279
281
  /** Per-participant steer appended to the actor's mission. Consumed on the app-url route. */
@@ -286,8 +288,8 @@ export interface LabParticipantFocus {
286
288
  * defaults to `lane-01`..`lane-NN` and must be a public-safe token (it names per-participant evidence
287
289
  * paths). Consumed only on the computer-use E2B route (inert/warned elsewhere).
288
290
  */
289
- export interface LabParticipantEntry {
290
- /** Public-safe participant id (interpolates into its evidence paths). Default lane-NN. */
291
+ export interface StudyParticipantEntry {
292
+ /** Public-safe participant id (interpolates into its evidence paths). Default `lane-NN`. */
291
293
  id?: string;
292
294
  /**
293
295
  * App-defined actor type label for grouping simulated users ("operator", "viewer",
@@ -310,7 +312,7 @@ export interface LabParticipantEntry {
310
312
  * observation matches any declared rule; actor-level stopWhen is used as the default.
311
313
  */
312
314
  stopWhen?: StopWhen;
313
- /** A declared observation window for this participant (#510); actor-level dwell is the default. */
315
+ /** A declared observation window for this participant; actor-level dwell is the default. */
314
316
  dwell?: DwellWindow;
315
317
  /**
316
318
  * How hard the model is asked to think for this participant; actor-level reasoningEffort is the default.
@@ -327,17 +329,17 @@ export interface LabParticipantEntry {
327
329
  */
328
330
  target?: string;
329
331
  /**
330
- * Shared-world only (#164): this participant's loopback entry route, resolved against
332
+ * Shared-world only: this participant's loopback entry route, resolved against
331
333
  * `subject.serve.url`. It must be same-origin (loopback) with it, and the participant opens
332
334
  * `serve.url + entry`. Validated at parse and re-enforced in the engine. Inert/warned on every
333
335
  * non-shared-world route (the per-lane-worlds fan-out roster has no per-participant entry).
334
336
  */
335
337
  entry?: string;
336
338
  /**
337
- * External-public shared-world only (#164 phase 2): marks this participant as the host. It
338
- * creates the shared session (e.g. a multiplayer lobby) that the follower seats then join. Exactly
339
+ * External-public shared-world only: marks this participant as the host. It
340
+ * creates the shared session (e.g. a multiplayer lobby) that the followers then join. Exactly
339
341
  * one participant in the roster may carry `host: true` (validated in externalPublicSharedWorldValidationReason).
340
- * The orchestrator watches the host seat's observed URL for the shared-session code and threads it
342
+ * The orchestrator watches the host's observed URL for the shared-session code and threads it
341
343
  * into the follower missions at a host-first barrier. Inert/warned on every other route.
342
344
  */
343
345
  host?: boolean;
@@ -347,13 +349,13 @@ export interface LabParticipantEntry {
347
349
  * `lanes[]` with deterministic ids (`<group.id>-01`, `<group.id>-02`, ...). The runtime never
348
350
  * consumes this shape directly; it always sees ordinary `LabActorLane` entries.
349
351
  */
350
- export interface LabActorRosterGroup extends Omit<LabParticipantEntry, "id"> {
352
+ export interface StudyActorRosterGroup extends Omit<StudyParticipantEntry, "id"> {
351
353
  /** Public-safe group id; prefixes generated participant ids. */
352
354
  id: string;
353
355
  /** Number of participants to generate for this group. */
354
356
  count: number;
355
357
  }
356
- export interface LabActor {
358
+ export interface StudyActor {
357
359
  /**
358
360
  * The actor label. On computer-use (including shared-world), scripted-browser, and
359
361
  * terminal-product routes this is a real dispatch key resolved against the closed first-party
@@ -369,24 +371,25 @@ export interface LabActor {
369
371
  /** Computer-use E2B route: a differentiated fan-out roster (`per-lane-worlds`). XOR `count`,
370
372
  * `roster`, and `laneFocus`. Cap 16 participants. Consumed only on the cua E2B route
371
373
  * (inert/warned elsewhere). */
372
- lanes?: LabParticipantEntry[];
374
+ lanes?: StudyParticipantEntry[];
373
375
  /** Persona id/label threaded into the actor prompt. Consumed on the app-url route. */
374
376
  persona?: string;
375
377
  /** Consumed on the app-url route (laneFocus.instruction appended to the mission). XOR `lanes`. */
376
- laneFocus?: LabParticipantFocus;
378
+ laneFocus?: StudyParticipantFocus;
377
379
  /** Free-form mission threaded into the actor prompt. Consumed on the app-url route. A mission on
378
- * its own is a complete, valid lab — `tasks` is additive, never required. */
380
+ * its own is a complete, valid study; `tasks` is additive, never required. */
379
381
  mission?: string;
380
382
  /**
381
383
  * The researcher's protocol: discrete tasks, each with what the participant is asked to do and
382
384
  * (optionally) how the researcher measures it. Additive to `mission`, which stays the brief.
383
385
  *
384
386
  * The two halves belong to different people. `goal` reaches the participant's prompt; `success`
385
- * never does — a moderator does not read the success criterion aloud, because telling someone how
386
- * they will be judged changes what they do. See src/lab/tasks.ts.
387
- * Supported only on the first actor of per-participant CUA routes; other routes fail preflight.
387
+ * never does. A moderator does not read the success criterion aloud, because telling someone how
388
+ * they will be judged changes what they do. See src/study/tasks.ts.
389
+ * Supported only on the first actor of per-participant computer-use routes; other routes fail
390
+ * preflight.
388
391
  */
389
- tasks?: LabTask[];
392
+ tasks?: StudyTask[];
390
393
  /** Provider model override. Consumed on the app-url route. */
391
394
  model?: string;
392
395
  /** First-party OpenAI CUA only: per-response output limit including reasoning, not a dollar cap. */
@@ -420,7 +423,7 @@ export interface LabActor {
420
423
  */
421
424
  stopWhen?: StopWhen;
422
425
  /**
423
- * A declared observation window (#510), the default for every participant; a `lanes[]` entry's dwell overrides
426
+ * A declared observation window, the default for every participant; a `lanes[]` entry's dwell overrides
424
427
  * it. `when` is a stopWhen-shaped condition (absent: the window opens after the first
425
428
  * observation); `ms` is the hold, `everyMs` the frame cadence (default 10 s), `then` whether
426
429
  * the participant continues afterwards (default) or the session ends. The harness takes no
@@ -428,21 +431,21 @@ export interface LabActor {
428
431
  */
429
432
  dwell?: DwellWindow;
430
433
  }
431
- type LabExecutionTarget = "local" | "e2b-desktop" | "e2b-terminal";
434
+ type StudyExecutionTarget = "local" | "e2b-desktop" | "e2b-terminal";
432
435
  /** Terminal transport: the captured non-interactive exec stream (stdin disabled). It is not an
433
- * interactive duplex PTY — labeling captured exec output "pty" would be a claim/mechanism
434
- * mismatch (invariant 6 + the goal packet's PTY ruling), so this route uses "exec-stream". */
435
- type LabTerminalTransport = "exec-stream";
436
+ * interactive duplex PTY; labeling captured exec output "pty" would be a claim/mechanism
437
+ * mismatch, so this route uses "exec-stream". */
438
+ type StudyTerminalTransport = "exec-stream";
436
439
  /** Whether operator stdin reaches the in-sandbox agent. Disabled by default (the run is
437
440
  * autonomous + comparable to an unassisted baseline). "planned" records intent but sends no
438
441
  * input; "sent" is rejected because assisted-input capture and a non-comparable marker do not
439
442
  * ship (the safety contract forbids an assisted run masquerading as green). */
440
- type LabTerminalStdin = "disabled" | "planned" | "sent";
441
- export interface LabExecutionTerminal {
443
+ type StudyTerminalStdin = "disabled" | "planned" | "sent";
444
+ export interface StudyExecutionTerminal {
442
445
  /** Transport label. Default and only shipped value is "exec-stream". */
443
- transport?: LabTerminalTransport;
446
+ transport?: StudyTerminalTransport;
444
447
  /** Operator stdin posture. Default "disabled". */
445
- stdin?: LabTerminalStdin;
448
+ stdin?: StudyTerminalStdin;
446
449
  }
447
450
  /**
448
451
  * The terminal agent's runtime-auth channel. "openai-env" (the default) passes the raw runtime
@@ -450,24 +453,24 @@ export interface LabExecutionTerminal {
450
453
  * OpenAI endpoint and passes an inert placeholder to Codex. The latter still gives every sandbox
451
454
  * process a spendable OpenAI proxy capability; it is not a spend cap or an egress restriction.
452
455
  */
453
- export type LabRuntimeAuth = "openai-env" | "openai-egress";
454
- export type LabDesktopBrowser = "default" | "chrome" | "chromium" | "firefox";
455
- export interface LabExecutionDesktop {
456
+ export type StudyRuntimeAuth = "openai-env" | "openai-egress";
457
+ export type StudyDesktopBrowser = "default" | "chrome" | "chromium" | "firefox";
458
+ export interface StudyExecutionDesktop {
456
459
  /**
457
460
  * Named device preset (mobile / small-mobile / narrow-mobile / tablet / desktop / wide) the
458
461
  * run renders at. Consumed on the computer-use route; default `desktop` (1440x950). On that
459
462
  * route only width/height physically render (the X screen is sized to the preset, so
460
- * width-based responsive CSS fires) — touch/DPR/UA are sim-parity prompt signals, not rendered.
463
+ * width-based responsive CSS fires). Touch/DPR/UA are sim-parity prompt signals and do not render.
461
464
  */
462
465
  device?: string;
463
- /** Raw hosted screen resolution [width, height] — an escape hatch that overrides `device`. */
466
+ /** Raw hosted screen resolution [width, height]: an escape hatch that overrides `device`. */
464
467
  resolution?: [number, number];
465
468
  /**
466
469
  * Browser family to launch for hosted desktop participants. Absent/default preserves the
467
470
  * historical desktop opener behavior. A concrete value means "launch this browser or fail"
468
471
  * instead of silently accepting the template's default URL opener.
469
472
  */
470
- browser?: LabDesktopBrowser;
473
+ browser?: StudyDesktopBrowser;
471
474
  /** Sandbox server-side timeout. Consumed on the app-url route. */
472
475
  sandboxTimeoutMs?: number;
473
476
  /**
@@ -485,7 +488,7 @@ export interface LabExecutionDesktop {
485
488
  /** Use the Codex app-server client mode for headed desktop actor surfaces. Consumed (meta). */
486
489
  codexAppServer?: boolean;
487
490
  /**
488
- * Mobile fidelity beyond viewport size (#221). With `mobileEmulation: true`, every hosted
491
+ * Mobile fidelity beyond viewport size. With `mobileEmulation: true`, every hosted
489
492
  * Chromium computer-use participant on a mobile preset (mobile / small-mobile / narrow-mobile) gets
490
493
  * CDP device emulation applied to its launch page before the participant arrives; desktop,
491
494
  * tablet and wide participants in the same run are untouched and carry no fidelity block. Applied: the participant's device preset width/height as the CSS viewport, the preset's
@@ -496,22 +499,22 @@ export interface LabExecutionDesktop {
496
499
  * A held CDP session also applies the overrides to later page targets. Their first observed
497
500
  * viewport and touch read-back is recorded separately; missing or different values warn.
498
501
  */
499
- fidelity?: LabDesktopFidelity;
500
- /** Synthetic media devices behind the browser's own permission prompt (#509). */
501
- media?: LabDesktopMedia;
502
+ fidelity?: StudyDesktopFidelity;
503
+ /** Synthetic media devices behind the browser's own permission prompt. */
504
+ media?: StudyDesktopMedia;
502
505
  /** Optional retained screen video. Capture is independent of participant media input. */
503
506
  recording?: {
504
507
  audio: boolean;
505
508
  };
506
509
  }
507
510
  /**
508
- * A participant with a camera (#509): a property of the environment, like the screen preset and
511
+ * A participant with a camera: a property of the environment, like the screen preset and
509
512
  * the browser, never support for any conferencing product. `camera.source: synthetic` generates
510
513
  * a test pattern in the sandbox with the image's own ffmpeg; a `.y4m` path on the host is
511
514
  * uploaded instead on hosted desktops. `microphone.source: speech` enables the participant's
512
515
  * own spoken replies and listening through native audio devices. File microphones are unsupported.
513
516
  */
514
- export interface LabDesktopMedia {
517
+ export interface StudyDesktopMedia {
515
518
  camera?: {
516
519
  source: string;
517
520
  };
@@ -519,7 +522,7 @@ export interface LabDesktopMedia {
519
522
  source: string;
520
523
  };
521
524
  }
522
- export interface LabDesktopFidelity {
525
+ export interface StudyDesktopFidelity {
523
526
  mobileEmulation: boolean;
524
527
  /** Emulated devicePixelRatio; default: the device preset's. */
525
528
  deviceScaleFactor?: number;
@@ -528,36 +531,37 @@ export interface LabDesktopFidelity {
528
531
  /** Full user-agent string to present; default: a mobile Safari string. */
529
532
  userAgent?: string;
530
533
  }
531
- export interface LabExecution {
532
- target?: LabExecutionTarget;
534
+ export interface StudyExecution {
535
+ target?: StudyExecutionTarget;
533
536
  /** Actor session wall-clock budget. Consumed on the app-url route. */
534
537
  timeoutMs?: number;
535
- /** FORWARD-DECLARED. */
538
+ /** Forward-declared: no route reads it yet, so a set value warns. */
536
539
  completionTimeoutMs?: number;
537
540
  /**
538
541
  * Bounds in-flight fan-out participants on the computer-use route. Shared-world needs at least 2 and
539
542
  * defaults to the participant count. Inert (warned) elsewhere.
540
543
  */
541
544
  concurrency?: number;
542
- desktop?: LabExecutionDesktop;
543
- /**
544
- * Blast-radius budget for each computer-use participant. Consumed on the CUA route: `caps.maxUsd`, when
545
- * set, is a fail-closed abort: the session stops the moment its running estimated spend crosses
546
- * it (the runaway-retry guard), and a cap on a model src/run/pricing.ts cannot price is refused at
547
- * preflight rather than run uncapped. It is a PER-PARTICIPANT cap: enforced inside each participant's loop,
548
- * so an N-participant fan-out can spend up to N × maxUsd before any participant aborts (the run warns with the
549
- * true ~N × cap ceiling). `caps.maxTotalUsd` is the shared study budget (#299): one ledger
550
- * across every participant, the knob a researcher actually reasons with. Absent = uncapped (the
551
- * historical CUA behavior); maxUsd: 0 still permits a request before reported usage trips it. Inert
552
- * (warned) on non-CUA routes. Reuses the same LabScenarioCaps shape as the terminal route's
553
- * `scenario.caps` (not a fork).
554
- */
555
- caps?: LabScenarioCaps;
545
+ desktop?: StudyExecutionDesktop;
546
+ /**
547
+ * Blast-radius budget for each computer-use participant. Consumed on the computer-use route:
548
+ * `caps.maxUsd`, when set, is a fail-closed abort: the session stops the moment its running
549
+ * estimated spend crosses it (the runaway-retry guard), and a cap on a model src/run/pricing.ts
550
+ * cannot price is refused at preflight rather than run uncapped. It is a per-participant cap:
551
+ * enforced inside each participant's loop, so an N-participant fan-out can spend up to N × maxUsd
552
+ * before any participant aborts (the run warns with the true ~N × cap ceiling).
553
+ * `caps.maxTotalUsd` is the shared study budget: one ledger across every participant, the knob a
554
+ * researcher actually reasons with. Absent = uncapped (the historical CUA behavior); maxUsd: 0
555
+ * still permits a request before reported usage trips it. Inert (warned) on non-computer-use
556
+ * routes. Reuses the same StudyScenarioCaps shape as the terminal route's `scenario.caps` (not a
557
+ * fork).
558
+ */
559
+ caps?: StudyScenarioCaps;
556
560
  /** `terminal-product` route: the terminal transport + stdin posture. Consumed on that route. */
557
- terminal?: LabExecutionTerminal;
561
+ terminal?: StudyExecutionTerminal;
558
562
  /** `terminal-product` route: runtime key placement, defaulting to openai-env. openai-egress
559
563
  * uses an external header transform; dry-runs record declarations only. Inert on other routes. */
560
- runtimeAuth?: LabRuntimeAuth;
564
+ runtimeAuth?: StudyRuntimeAuth;
561
565
  /** Terminal Codex package pin. Omit to resolve latest once, observe it, then execute that version. */
562
566
  runtime?: {
563
567
  version: string;
@@ -565,11 +569,11 @@ export interface LabExecution {
565
569
  /**
566
570
  * `terminal-product` route: outbound routing allowlist passed to E2B with a deny-all fallback.
567
571
  * Domain filtering is a routing control, not strict destination isolation on shared hosting.
568
- * It does not constrain spending through an allowed runtime provider (#538), including when
572
+ * It does not constrain spending through an allowed runtime provider, including when
569
573
  * openai-egress keeps the raw runtime key outside the sandbox.
570
574
  *
571
575
  * Absent means unrestricted, which is the historical behavior and stays the default, because a
572
- * wrong host list fails studies in ways that look like product bugs. Opt in per lab.
576
+ * wrong host list fails studies in ways that look like product bugs. Opt in per study.
573
577
  *
574
578
  * Domain filtering covers HTTP on :80 (Host header) and TLS on :443 (SNI); anything else needs
575
579
  * an IP or CIDR. `*.example.com` matches subdomains at any depth and not the apex, which needs
@@ -577,28 +581,28 @@ export interface LabExecution {
577
581
  */
578
582
  egressAllow?: string[];
579
583
  }
580
- type LabScenarioMode = "dry-run" | "live";
584
+ type StudyScenarioMode = "dry-run" | "live";
581
585
  /**
582
586
  * The blast-radius budget for a route that passes a live key to an in-sandbox command.
583
587
  * Per the safety contract, the live key is never exercised without a fail-closed cap in force.
584
588
  * All values are non-negative numbers (0 is the no-spend default). Live runs require maxUsd and a
585
589
  * positive maxMinutes; maxUsd/maxJobs are checked after the session against known ledger signals
586
590
  * and maxMinutes is enforced as the command wall clock. Codex tokens are unpriced, so a live run
587
- * refuses a positive maxUsd unless a costProbe measures spend (HUMANISH_TERMINAL_LAB_UNPRICED_CAP).
591
+ * refuses a positive maxUsd unless a costProbe measures spend (HUMANISH_TERMINAL_UNPRICED_CAP).
588
592
  */
589
- export interface LabScenarioCaps {
593
+ export interface StudyScenarioCaps {
590
594
  /** Max USD the run may spend (provider + product). 0 = no-spend. */
591
595
  maxUsd?: number;
592
596
  /**
593
- * STUDY-LEVEL model-spend budget (#299), the number a researcher actually reasons with: "this
594
- * study is N participants, roughly $X" — decided once, up front, where recruiting decisions are
597
+ * study-level model-spend budget, the number a researcher actually reasons with: "this
598
+ * study is N participants, roughly $X", decided once, up front, where recruiting decisions are
595
599
  * made. The computer-use route reads it from `execution.caps.maxTotalUsd` only: every participant's
596
600
  * running estimated model spend feeds one shared ledger, and the moment the run total crosses
597
- * this, each participant stops at its next turn with an honest `budget_reached` (status `incomplete` —
601
+ * this, each participant stops at its next turn with `budget_reached` (status `incomplete`:
598
602
  * the participant ran out of budget; never `gave_up`, because a study-level stop is not the
599
603
  * participant's doing). Estimated model spend only; desktop-minutes ride the cost summary but
600
604
  * not this ledger. Independent of the per-participant `maxUsd` backstop; either, both, or neither may
601
- * be set. A positive `scenario.caps.maxTotalUsd` on a computer-use lab is a parse error; on the
605
+ * be set. A positive `scenario.caps.maxTotalUsd` on a computer-use study is a parse error; on the
602
606
  * terminal route it is inert (warned), since the single agent's maxUsd already caps the run.
603
607
  */
604
608
  maxTotalUsd?: number;
@@ -607,19 +611,19 @@ export interface LabScenarioCaps {
607
611
  /** Max wall-clock minutes for the agent session. */
608
612
  maxMinutes?: number;
609
613
  }
610
- export interface LabScenario {
614
+ export interface StudyScenario {
611
615
  /** Reference a committed scenario by id (humanish/scenarios/<ref>.yaml) or path. Consumed
612
- * (and required) on the scripted-browser route; FORWARD-DECLARED elsewhere. */
616
+ * (and required) on the scripted-browser route; forward-declared elsewhere. */
613
617
  ref?: string;
614
- /** Or inline the scenario body. FORWARD-DECLARED (PR #2). */
618
+ /** Or inline the scenario body. Forward-declared: no route reads it yet, so a set value warns. */
615
619
  inline?: Record<string, unknown>;
616
- /** dry-run = contract evidence (no provider spend); live = real run. Consumed. */
617
- mode?: LabScenarioMode;
620
+ /** dry-run = a synthetic bundle with no provider spend; live = real run. Consumed. */
621
+ mode?: StudyScenarioMode;
618
622
  /** Spend/job/time caps. Consumed (recorded in the bundle) on the terminal-product route;
619
623
  * inert (warned) elsewhere. */
620
- caps?: LabScenarioCaps;
624
+ caps?: StudyScenarioCaps;
621
625
  }
622
- export interface LabPolicies {
626
+ export interface StudyPolicies {
623
627
  /**
624
628
  * Redact target repo labels in durable artifacts. Consumed on the computer-use,
625
629
  * scripted-browser and shared-world clone routes (provenance), where it defaults to true when
@@ -636,13 +640,13 @@ export interface LabPolicies {
636
640
  */
637
641
  redactScreenshots?: boolean;
638
642
  /**
639
- * Allow an app-url subject to point at a non-loopback (public/preview/staging) URL the lab
643
+ * Allow an app-url subject to point at a non-loopback (public/preview/staging) URL the study
640
644
  * owner declares. Default `false` (loopback-only). The invariant is "the actor drives a target
641
645
  * the owner declared"; setting this is that declaration (e.g. a Vercel preview of your app).
642
646
  */
643
647
  allowPublicTargets?: boolean;
644
648
  /**
645
- * How the browser's camera/microphone permission is answered (#509). `prompt` (default): the
649
+ * How the browser's camera/microphone permission is answered. `prompt` (default): the
646
650
  * participant meets Chrome's real dialog and answers it, which is where a real person hesitates
647
651
  * or refuses. `granted`: the dialog is bypassed (`--use-fake-ui-for-media-stream`, which Chrome
648
652
  * marks with an "unsupported command-line flag" banner), for studies about what happens after
@@ -658,33 +662,33 @@ export interface LabPolicies {
658
662
  /** Recorded GitHub-mutation intent. No GitHub-token injection channel ships. */
659
663
  allowGitHubMutation?: boolean;
660
664
  }
661
- export interface LabReview {
665
+ export interface StudyReview {
662
666
  /** Analysis defaults on for eligible live recordings; false disables the separate request. */
663
- analysis?: LabAnalysis | false;
664
- /** FORWARD-DECLARED (PR #2). */
667
+ analysis?: StudyAnalysis | false;
668
+ /** Forward-declared: no route reads it yet, so a set value warns. */
665
669
  scoring?: string;
666
- /** FORWARD-DECLARED (PR #2). */
670
+ /** Forward-declared: no route reads it yet, so a set value warns. */
667
671
  milestones?: string;
668
- /** FORWARD-DECLARED (PR #2). */
672
+ /** Forward-declared: no route reads it yet, so a set value warns. */
669
673
  vocabulary?: string;
670
674
  /**
671
- * #316 code escape hatch: a repo-relative path to an adopter scorer module (.mjs recommended) that
675
+ * Code escape hatch: a repo-relative path to an adopter scorer module (.mjs recommended) that
672
676
  * exports any of `{score, deriveFeedback, deriveArtifacts}`. Consumed on the scorer-capable routes
673
677
  * (terminal / computer-use / shared-world); loaded fail-closed (typed error, pre-spend). The entry
674
- * is executable code — review a PR that adds one as code, not config.
678
+ * is executable code: review a PR that adds one as code.
675
679
  */
676
680
  scorer?: {
677
681
  ref: string;
678
682
  };
679
683
  }
680
- export interface LabDefaults {
684
+ export interface StudyDefaults {
681
685
  open?: boolean;
682
686
  }
683
- /** Off-app comms (email/SMS the persona lives in) the harness provides for the run (#297). */
684
- export interface LabComms {
685
- email?: LabCommsEmail;
687
+ /** Off-app comms (email/SMS the persona lives in) the harness provides for the run. */
688
+ export interface StudyComms {
689
+ email?: StudyCommsEmail;
686
690
  }
687
- export interface LabCommsSmtp {
691
+ export interface StudyCommsSmtp {
688
692
  /** Fixed in-sandbox loopback SMTP port (default 2525). Known before sandbox create, like `port`. */
689
693
  port?: number;
690
694
  /** The subject-env var carrying the SMTP host. The harness sets it to 127.0.0.1. */
@@ -699,8 +703,8 @@ export interface LabCommsSmtp {
699
703
  user?: string;
700
704
  password?: string;
701
705
  }
702
- export type LabCommsEmail = LabCommsCaptureEmail | LabCommsReceivingEmail;
703
- export interface LabCommsReceivingEmail {
706
+ export type StudyCommsEmail = StudyCommsCaptureEmail | StudyCommsReceivingEmail;
707
+ export interface StudyCommsReceivingEmail {
704
708
  kind: "real";
705
709
  connection: string;
706
710
  /** Additional exact first-hop destinations; automatic remote email assets remain blocked. */
@@ -712,16 +716,16 @@ export interface LabCommsReceivingEmail {
712
716
  recipients?: never;
713
717
  external?: never;
714
718
  }
715
- interface LabCommsCaptureEmail {
719
+ interface StudyCommsCaptureEmail {
716
720
  connection?: never;
717
721
  allowedOrigins?: never;
718
722
  /** Which implementation backs the inbox (a backend discriminator, distinct from `scenario.mode`):
719
- * `fake` (default) is an in-harness in-memory inbox in the Fowler test-double sense — an in-sandbox
723
+ * `fake` (default) is an in-harness in-memory inbox in the Fowler test-double sense: an in-sandbox
720
724
  * catch captures the app's sends. Provider-backed receiving uses the separate
721
- * LabCommsReceivingEmail configuration selected by a saved connection. */
725
+ * StudyCommsReceivingEmail configuration selected by a saved connection. */
722
726
  kind: "fake";
723
727
  /**
724
- * The subject-env var the harness sets to the in-sandbox catch's base URL — ADOPTER-NAMED (an app
728
+ * The subject-env var the harness sets to the in-sandbox catch's base URL. The adopter names it (an app
725
729
  * calling Resend's API directly reads `RESEND_API_URL`; an app using the SDK reads `RESEND_BASE_URL`).
726
730
  * The value is computed by the harness (a loopback URL), so it is not declared in `subject.env`.
727
731
  * Required on the provisioned routes; absent (and meaningless) when `external` is declared,
@@ -736,10 +740,10 @@ interface LabCommsCaptureEmail {
736
740
  * into the same captured-send shape the HTTP path produces, so the inbox surface, the drain, and
737
741
  * the evidence artifact are identical either way.
738
742
  *
739
- * `hostEnv` and `portEnv` are ADOPTER-NAMED, exactly like `injectEnv`: the harness sets them to
743
+ * `hostEnv` and `portEnv` are adopter-named, exactly like `injectEnv`: the harness sets them to
740
744
  * its own loopback and the chosen port. Declare the pair your app actually reads.
741
745
  */
742
- smtp?: LabCommsSmtp;
746
+ smtp?: StudyCommsSmtp;
743
747
  /** Optional escape hatch: the exact absolute origin the app-under-test bakes into its email verify
744
748
  * links, when that differs from the serve origin (e.g. an app configured with an absolute
745
749
  * APP_URL/NEXT_PUBLIC_BASE_URL). The harness cannot infer it, so the operator declares it; it is
@@ -749,24 +753,25 @@ interface LabCommsCaptureEmail {
749
753
  /** Each participant's inbox address: the actor is told to sign up with it (the injected inbox
750
754
  * instruction carries it) and the teardown drain matches captured mail against it. Omit the
751
755
  * whole list and the parser fills one deterministic address per participant (`<laneId>@example.test`)
752
- * so every seat can do email out of the box (#351). When declared: a `lane` naming a participant that
753
- * does not exist is a hard parse error (a mismatch silently disables the funnel for that seat),
754
- * zero covered participants is a hard error, and partial coverage warns with the uncovered ones. An
755
- * entry without `address` is legal but inert for the funnel: the drain does not match it,
756
- * and its participant gets no inbox instruction; captured mail to an undeclared address is warned,
756
+ * so every participant can do email out of the box. When declared: a `lane` naming a participant
757
+ * that does not exist is a hard parse error (a mismatch silently disables the funnel for that
758
+ * participant), zero covered participants is a hard error, and partial coverage warns with the
759
+ * uncovered ones. An entry without `address` is legal but inert for the funnel: the drain does
760
+ * not match it, and its participant gets no inbox instruction; captured mail to an undeclared
761
+ * address is warned,
757
762
  * never silently dropped. */
758
- recipients?: LabCommsRecipient[];
763
+ recipients?: StudyCommsRecipient[];
759
764
  /**
760
- * ADOPTER-HOSTED ingress (#328). Declaring this says: the operator runs the catch and the inbox
761
- * themselves, so humanish neither provisions the subject nor injects `injectEnv` — it points the
765
+ * adopter-hosted ingress. Declaring this says: the operator runs the catch and the inbox
766
+ * themselves, so humanish neither provisions the subject nor injects `injectEnv`. It points the
762
767
  * persona at the declared inbox, drains the declared catch over HTTP at teardown, and writes the
763
768
  * same digest-only evidence. This is what makes comms work on the app-url / operator-provisioned
764
769
  * plane, where humanish holds no sandbox handle to host a catch in and the block was previously
765
770
  * warned inert. Run the same implementation with `humanish comms catch`.
766
771
  */
767
- external?: LabCommsExternal;
772
+ external?: StudyCommsExternal;
768
773
  }
769
- export interface LabCommsExternal {
774
+ export interface StudyCommsExternal {
770
775
  /** Where the adopter's app POSTs its email sends, and where humanish reads GET /deliveries. */
771
776
  catchBaseUrl: string;
772
777
  /** Where the persona opens its inbox. Defaults to catchBaseUrl (one server serves both). */
@@ -775,39 +780,40 @@ export interface LabCommsExternal {
775
780
  * the value is read at runtime and never persisted (the credential-boundary discipline). */
776
781
  authTokenEnv?: string;
777
782
  }
778
- export interface LabCommsRecipient {
783
+ export interface StudyCommsRecipient {
779
784
  lane: string;
780
- /** The literal address the app sends to — what the evidence drain matches. Omit to reserve the participant
785
+ /** The literal address the app sends to, which the evidence drain matches. Omit to reserve the participant
781
786
  * for the persona surface's default address (not drain-matched). */
782
787
  address?: string;
783
788
  }
784
- export interface LabConfig {
785
- schema: typeof LAB_CONFIG_SCHEMA;
789
+ export interface StudyConfig {
790
+ /** The format the file was written in. Both parse into this one shape. */
791
+ schema: typeof V2_SCHEMA | typeof STUDY_SCHEMA;
786
792
  id: string;
787
793
  title?: string;
788
794
  description?: string;
789
- subject: LabSubject;
790
- actors: LabActor[];
791
- execution?: LabExecution;
792
- /** FORWARD-DECLARED (PR #2). */
795
+ subject: StudySubject;
796
+ actors: StudyActor[];
797
+ execution?: StudyExecution;
798
+ /** Forward-declared: no route reads it yet, so a set value warns. */
793
799
  personas?: Record<string, unknown>[];
794
- scenario?: LabScenario;
795
- policies?: LabPolicies;
796
- review?: LabReview;
797
- defaults?: LabDefaults;
798
- comms?: LabComms;
800
+ scenario?: StudyScenario;
801
+ policies?: StudyPolicies;
802
+ review?: StudyReview;
803
+ defaults?: StudyDefaults;
804
+ comms?: StudyComms;
799
805
  }
800
- interface LabConfigParseSuccess {
806
+ interface StudyParseSuccess {
801
807
  ok: true;
802
- config: LabConfig;
808
+ config: StudyConfig;
803
809
  warnings: string[];
804
810
  }
805
- export interface LabConfigParseFailure {
811
+ export interface StudyParseFailure {
806
812
  ok: false;
807
813
  error: {
808
- code: "HUMANISH_LAB_INVALID";
814
+ code: "HUMANISH_STUDY_INVALID" | "HUMANISH_STUDY_V2_UNSUPPORTED";
809
815
  message: string;
810
816
  };
811
817
  }
812
- export type LabConfigParseResult = LabConfigParseSuccess | LabConfigParseFailure;
818
+ export type StudyParseResult = StudyParseSuccess | StudyParseFailure;
813
819
  export {};