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,27 +1,27 @@
1
1
  // The state and env channels of a served subject (clone or local-tree): `subject.envValues`,
2
2
  // the structural parse of `subject.state`, and subjectStateInvalidReason, the semantic check
3
- // parseLabConfig and the computer-use route share.
3
+ // parseStudy and the computer-use route share.
4
4
  import { containsSensitive } from "../../evidence/redaction.js";
5
5
  import { ENV_NAME_PATTERN, invalid, posInt, str, strList } from "./values.js";
6
6
  import { isRecord } from "../../run/type-guards.js";
7
7
  /**
8
- * LITERAL non-secret subject env. Real apps need configuration before they will boot — a public base
9
- * URL, a transport selector, a feature flag — and none of that is secret. Routing it through
8
+ * Literal non-secret subject env. Real apps need configuration before they will boot: a public base
9
+ * URL, a transport selector, a feature flag, and none of that is secret. Routing it through
10
10
  * `subject.env` would force an adopter to carry a private env file just to reproduce a public study.
11
11
  *
12
- * These values ARE recorded in evidence (they are part of how the subject was configured), so a
12
+ * These values are recorded in evidence (they are part of how the subject was configured), so a
13
13
  * value that looks like a credential is refused here rather than committed to a public repo.
14
14
  */
15
15
  export function parseEnvValues(raw) {
16
16
  if (raw === undefined)
17
17
  return { ok: true };
18
18
  if (!isRecord(raw)) {
19
- return invalid("`subject.envValues` must be a mapping of env var NAME to a literal non-secret value.");
19
+ return invalid("`subject.envValues` must map environment variable names to literal values that are not secret.");
20
20
  }
21
21
  const envValues = {};
22
22
  for (const [name, rawValue] of Object.entries(raw)) {
23
23
  if (!ENV_NAME_PATTERN.test(name)) {
24
- return invalid(`subject.envValues keys must be env var NAMES like NEXT_PUBLIC_APP_URL (got "${name}").`);
24
+ return invalid(`subject.envValues keys must be environment variable names like NEXT_PUBLIC_APP_URL, and "${name}" is not one.`);
25
25
  }
26
26
  const value = typeof rawValue === "number" || typeof rawValue === "boolean"
27
27
  ? String(rawValue)
@@ -30,19 +30,19 @@ export function parseEnvValues(raw) {
30
30
  return invalid(`\`subject.envValues.${name}\` must be a string, number, or boolean.`);
31
31
  }
32
32
  // Reuse the redaction module's own detector rather than inventing a second opinion about what
33
- // a secret looks like — the two must never disagree about the same string.
33
+ // a secret looks like; the two must never disagree about the same string.
34
34
  if (containsSensitive(value)) {
35
- return invalid(`\`subject.envValues.${name}\` looks like a secret or a local path, and these values are committed with the lab and recorded in evidence. Declare the NAME in \`subject.env\` instead — those values come from the caller's environment and never persist.`);
35
+ return invalid(`\`subject.envValues.${name}\` looks like a secret or a local path, and envValues are committed with the study and recorded in evidence. List the name in \`subject.env\` instead: its value then comes from your environment and is never stored.`);
36
36
  }
37
37
  envValues[name] = value;
38
38
  }
39
39
  return { ok: true, value: envValues };
40
40
  }
41
41
  /**
42
- * Structural parse of `subject.state` into a candidate LabSubjectState. Deliberately keeps
42
+ * Structural parse of `subject.state` into a candidate StudySubjectState. Deliberately keeps
43
43
  * unrecognized `when`/`timeoutMs` values in the candidate (instead of silently dropping
44
- * them) so subjectStateInvalidReason rejects them — a state declaration that silently does
45
- * less than it says would violate invariant 6.
44
+ * them) so subjectStateInvalidReason rejects them: a state declaration that silently does
45
+ * less than it says would claim more than its mechanism does.
46
46
  */
47
47
  export function parseState(raw) {
48
48
  if (raw === undefined) {
@@ -68,7 +68,7 @@ export function parseState(raw) {
68
68
  if (raw.external !== undefined) {
69
69
  const external = strList(raw.external);
70
70
  if (!external) {
71
- return invalid("`subject.state.external` must be a non-empty list of env var NAMES when set.");
71
+ return invalid("`subject.state.external` must be a non-empty list of environment variable names when it is set.");
72
72
  }
73
73
  state.external = external;
74
74
  }
@@ -79,7 +79,7 @@ export function parseState(raw) {
79
79
  state.checkpoint = raw.checkpoint.map((probe) => ({
80
80
  name: typeof probe.name === "string" ? probe.name.trim() : "",
81
81
  command: typeof probe.command === "string" ? probe.command.trim() : "",
82
- // Preserve the redact list verbatim (literal secret values may contain commas, so do NOT
82
+ // Preserve the redact list verbatim (literal secret values may contain commas, so do not
83
83
  // run it through the comma-splitting strList); subjectStateInvalidReason validates the shape.
84
84
  ...(probe.redact === undefined ? {} : { redact: probe.redact }),
85
85
  }));
@@ -87,7 +87,7 @@ export function parseState(raw) {
87
87
  return { ok: true, value: state };
88
88
  }
89
89
  // The step name interpolates into in-sandbox script/status/log paths (`subject-state-<name>`);
90
- // the strict shape is load-bearing, exactly like the repo slug.
90
+ // so the shape is strict, exactly like the repo slug.
91
91
  const STATE_STEP_NAME_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
92
92
  const STATE_STEP_NAME_MAX_CHARS = 40;
93
93
  const STATE_STEP_WHENS = [
@@ -96,10 +96,10 @@ const STATE_STEP_WHENS = [
96
96
  "after-ready",
97
97
  ];
98
98
  /**
99
- * Semantic validation for `subject.state`, shared by parseLabConfig and the engine
100
- * (runCuaActorLab re-enforces it on configs that arrive through the library API). Returns
99
+ * Semantic validation for `subject.state`, shared by parseStudy and the engine
100
+ * (the route re-enforces it on configs that arrive through runStudyWith). Returns
101
101
  * the failure message, or null when the declaration is valid. Reads the candidate
102
- * defensively — library callers can hand the engine arbitrarily-shaped objects.
102
+ * defensively: library callers can hand the engine arbitrarily-shaped objects.
103
103
  */
104
104
  export function subjectStateInvalidReason(state, env) {
105
105
  const seed = state.seed;
@@ -140,11 +140,11 @@ export function subjectStateInvalidReason(state, env) {
140
140
  }
141
141
  if (external !== undefined) {
142
142
  if (!Array.isArray(external) || external.length === 0) {
143
- return "`subject.state.external` must be a non-empty list of env var NAMES when set.";
143
+ return "`subject.state.external` must be a non-empty list of environment variable names when it is set.";
144
144
  }
145
145
  for (const name of external) {
146
146
  if (typeof name !== "string" || !ENV_NAME_PATTERN.test(name)) {
147
- return "subject.state.external entries must be env var NAMES like DATABASE_URL; values come from the caller's environment and are never persisted.";
147
+ return "subject.state.external entries must be environment variable names like DATABASE_URL. Their values come from your environment and are never stored.";
148
148
  }
149
149
  if (!env?.includes(name)) {
150
150
  return "subject.state.external names must also be declared in subject.env (the declaration must name a provisioned channel).";
@@ -1,8 +1,8 @@
1
- import type { LabConfigParseFailure, LabSubject } from "../types.js";
1
+ import type { StudyParseFailure, StudySubject } from "../types.js";
2
2
  export declare function parseSubject(raw: unknown): {
3
3
  ok: true;
4
- value: LabSubject;
5
- } | LabConfigParseFailure;
4
+ value: StudySubject;
5
+ } | StudyParseFailure;
6
6
  export declare const PUBLIC_TARGET_OWNER_PATTERN: RegExp;
7
7
  export declare function isLoopbackUrl(value: string): boolean;
8
8
  /** A well-formed http(s) URL (any host). Shape gate before the loopback/public-target policy. */
@@ -4,7 +4,7 @@ import { parseEnvValues, parseState, subjectStateInvalidReason } from "./subject
4
4
  import { isRecord } from "../../run/type-guards.js";
5
5
  export function parseSubject(raw) {
6
6
  if (!isRecord(raw)) {
7
- return invalid("Lab `subject` is required and must be an object.");
7
+ return invalid("`subject` is required and must be an object.");
8
8
  }
9
9
  const source = str(raw.source);
10
10
  if (source !== "this-repo" &&
@@ -17,9 +17,9 @@ export function parseSubject(raw) {
17
17
  return invalid("`subject.source` must be one of: this-repo, clone, app-url, local-app, terminal-product, desktop-cli, local-tree.");
18
18
  }
19
19
  const subject = { source };
20
- // topology is enum-validated everywhere; its SEMANTICS (shared-world requires clone × e2b-desktop
20
+ // topology is enum-validated everywhere; its semantics (shared-world requires clone × e2b-desktop
21
21
  // × a ≥2 roster) are enforced in the shared-world cross-validation below, and a set-but-unconsumed
22
- // topology warns as inert off the shared-world route (invariant 6).
22
+ // topology warns as inert off the shared-world route.
23
23
  if (raw.topology !== undefined) {
24
24
  const topology = str(raw.topology);
25
25
  if (topology !== "per-lane-worlds" && topology !== "shared-world") {
@@ -27,12 +27,12 @@ export function parseSubject(raw) {
27
27
  }
28
28
  subject.topology = topology;
29
29
  }
30
- // exposure is enum-validated everywhere; it is REQUIRED on the concurrent shared-world route (the
30
+ // exposure is enum-validated everywhere; it is required on the concurrent shared-world route (the
31
31
  // getHost synthetic-subject attestation) and warns inert elsewhere.
32
32
  if (raw.exposure !== undefined) {
33
33
  const exposure = str(raw.exposure);
34
34
  if (exposure !== "synthetic") {
35
- return invalid("`subject.exposure` must be `synthetic` (the author attestation that the getHost-exposed subject is synthetic seeded data).");
35
+ return invalid("`subject.exposure` must be `synthetic`: your statement that the subject served on a public sandbox URL holds only synthetic seeded data.");
36
36
  }
37
37
  subject.exposure = exposure;
38
38
  }
@@ -57,51 +57,51 @@ export function parseSubject(raw) {
57
57
  }
58
58
  /** The first field set on a source it cannot act on, in the order parseSubject has always checked. */
59
59
  function misplacedFieldFailure(source, raw) {
60
- // `product` is terminal-product-only; reject it elsewhere (invariant 6: a field that cannot act
61
- // on this route is an honest parse error, not silently dropped).
60
+ // `product` is terminal-product-only; reject it elsewhere. A field that cannot act on this
61
+ // route is a parse error and is never silently dropped.
62
62
  if (source !== "terminal-product" && source !== "desktop-cli" && raw.product !== undefined) {
63
63
  return invalid("`subject.product` applies only to terminal-product and desktop-cli subjects (the CLI a participant studies from public surfaces).");
64
64
  }
65
- // appUrl is app-url/local-app-only; a terminal-product subject drives PUBLIC surfaces, not a
66
- // single loopback app — reject appUrl on it.
65
+ // appUrl is app-url/local-app-only; a terminal-product subject drives public surfaces instead of a
66
+ // single loopback app, so reject appUrl on it.
67
67
  if (source === "terminal-product" && raw.appUrl !== undefined) {
68
- return invalid("`subject.appUrl` does not apply to terminal-product subjects — declare `subject.product.publicSurfaces` (the agent works from public surfaces, not one loopback app).");
68
+ return invalid("`subject.appUrl` does not apply to a terminal-product subject: its agent works from the product's public pages. List them in `subject.product.publicSurfaces` instead.");
69
69
  }
70
70
  // serve/env/state are shared between clone (cloned app) and local-tree (packed working
71
71
  // tree): both routes serve a subject in-sandbox with the same install/build/start/url +
72
72
  // env-name + seed/external/checkpoint shapes.
73
73
  if (source !== "clone" && source !== "local-tree" && raw.serve !== undefined) {
74
- return invalid("`subject.serve` applies only to clone subjects or local-tree subjects (the lab serves the cloned/packed app in-sandbox).");
74
+ return invalid("`subject.serve` applies only to clone subjects or local-tree subjects (humanish serves the cloned or packed app in the sandbox).");
75
75
  }
76
76
  if (source !== "clone" && source !== "local-tree" && raw.env !== undefined) {
77
77
  return invalid("`subject.env` applies only to clone subjects or local-tree subjects (the served app's environment channel).");
78
78
  }
79
79
  if (source !== "clone" && source !== "local-tree" && raw.state !== undefined) {
80
- return invalid("`subject.state` applies only to clone subjects or local-tree subjects (the lab seeds the state it serves).");
80
+ return invalid("`subject.state` applies only to clone subjects or local-tree subjects (humanish seeds the state it serves).");
81
81
  }
82
- // repos/clone are clone-ONLY (a fresh-clone subject's git inputs). local-tree packs the
82
+ // repos/clone are clone-only (a fresh-clone subject's git inputs). local-tree packs the
83
83
  // resolution cwd itself, so it has no repo slug to clone and gets its own precise reasons
84
84
  // rather than falling through to the generic clone-only message below.
85
85
  if (source === "local-tree" && raw.repos !== undefined) {
86
- return invalid("`subject.repos` does not apply to local-tree subjects. The local-tree route packs the lab resolution cwd itself; there is no owner/repo slug to clone.");
86
+ return invalid("`subject.repos` does not apply to local-tree subjects. The local-tree route packs the study's working directory itself; there is no owner/repo slug to clone.");
87
87
  }
88
88
  if (source === "local-tree" && raw.clone !== undefined) {
89
89
  return invalid("`subject.clone` does not apply to local-tree subjects. Declare `subject.localTree` instead (keep/exclude/maxArchiveBytes).");
90
90
  }
91
91
  // Rejected, never silently dropped, on app-url/local-app/this-repo/terminal-product subjects
92
- // too (invariant 6: a field that cannot act on this route is an honest parse error).
92
+ // too: a field that cannot act on this route is a parse error.
93
93
  if (source !== "clone" && raw.repos !== undefined) {
94
94
  return invalid("`subject.repos` applies only to clone subjects (the owner/repo slugs to clone).");
95
95
  }
96
96
  if (source !== "clone" && raw.clone !== undefined) {
97
97
  return invalid("`subject.clone` applies only to clone subjects (clone depth/fanout/keep).");
98
98
  }
99
- // localTree is local-tree-ONLY (pack/upload knobs for the packed working tree).
99
+ // localTree is local-tree-only (pack/upload knobs for the packed working tree).
100
100
  if (source !== "local-tree" && raw.localTree !== undefined) {
101
101
  return invalid("`subject.localTree` applies only to local-tree subjects (keep/exclude/maxArchiveBytes for packing the working tree).");
102
102
  }
103
- // publicTarget is app-url-ONLY (the external-public shared-world ownership attestation). It is
104
- // meaningless without a real public deployment as the plane — reject it elsewhere (invariant 6).
103
+ // publicTarget is app-url-only (the external-public shared-world ownership attestation). It is
104
+ // meaningless without a real public deployment as the plane, so reject it elsewhere.
105
105
  if (source !== "app-url" && raw.publicTarget !== undefined) {
106
106
  return invalid("`subject.publicTarget` applies only to app-url subjects on the external-public shared-world route (the operator's ownership attestation for a real public deployment used directly as the shared plane).");
107
107
  }
@@ -125,8 +125,8 @@ function parseCloneSubject(raw, subject) {
125
125
  }
126
126
  function parseLocalTreeSubject(raw, subject) {
127
127
  // A local-tree subject exists to be packed and served; there is no other way to boot it, so
128
- // serve is REQUIRED here. Clone subjects get the same requirement from each route's checks in
129
- // parseLabConfig.
128
+ // serve is required here. Clone subjects get the same requirement from each route's checks in
129
+ // parseStudy.
130
130
  if (raw.serve === undefined) {
131
131
  return invalid("`subject.serve` is required when source is local-tree: a local-tree subject exists to be packed and served, so declare install/build/start/url exactly like the clone route.");
132
132
  }
@@ -157,11 +157,11 @@ function parseServedApp(raw, subject) {
157
157
  if (raw.env !== undefined) {
158
158
  const env = strList(raw.env);
159
159
  if (!env || env.length === 0) {
160
- return invalid("`subject.env` must be a non-empty list of env var NAMES when set.");
160
+ return invalid("`subject.env` must be a non-empty list of environment variable names when it is set.");
161
161
  }
162
162
  const badName = env.find((name) => !ENV_NAME_PATTERN.test(name));
163
163
  if (badName) {
164
- return invalid(`subject.env entries must be env var NAMES like DATABASE_URL (got "${badName}"); values come from the caller's environment and are never persisted.`);
164
+ return invalid(`subject.env entries must be environment variable names like DATABASE_URL, and "${badName}" is not one. Their values come from your environment and are never stored.`);
165
165
  }
166
166
  subject.env = env;
167
167
  }
@@ -175,7 +175,7 @@ function parseServedApp(raw, subject) {
175
175
  return stateResult;
176
176
  }
177
177
  if (stateResult.value) {
178
- // Semantic validation is shared with the engine (runCuaActorLab re-enforces it for
178
+ // Semantic validation is shared with the engine (runCuaActorStudy re-enforces it for
179
179
  // configs that arrive through the library API without the parser).
180
180
  const reason = subjectStateInvalidReason(stateResult.value, subject.env);
181
181
  if (reason) {
@@ -192,11 +192,11 @@ function parseAppSubject(raw, source, subject) {
192
192
  }
193
193
  // app-url: shape-only here; the loopback-vs-public-target gate is applied in the
194
194
  // cross-validation block below, where policies.allowPublicTargets is available.
195
- // local-app: an in-process local dev server — ALWAYS loopback (no public-target option),
195
+ // local-app: an in-process local dev server, always loopback (no public-target option),
196
196
  // so the loopback wall is enforced right here at parse.
197
197
  if (source === "local-app") {
198
198
  if (!isLoopbackUrl(appUrl)) {
199
- return invalid("`subject.appUrl` must be a loopback URL (127.0.0.1/localhost) on a local-app subject — it drives an already-running LOCAL dev server in-process; public targets are not supported on this route.");
199
+ return invalid("`subject.appUrl` must be a loopback URL (127.0.0.1 or localhost) on a local-app subject: humanish drives your running dev server from this process, so it cannot reach a public URL.");
200
200
  }
201
201
  }
202
202
  else if (!isHttpUrl(appUrl)) {
@@ -204,7 +204,7 @@ function parseAppSubject(raw, source, subject) {
204
204
  }
205
205
  subject.appUrl = appUrl;
206
206
  // publicTarget (external-public shared-world ownership attestation) is app-url-only. Shape it
207
- // here; its REQUIRED-on-that-route semantics live in externalPublicSharedWorldValidationReason.
207
+ // here; its required-on-that-route semantics live in externalPublicSharedWorldValidationReason.
208
208
  if (source === "app-url" && raw.publicTarget !== undefined) {
209
209
  const publicTargetResult = parsePublicTarget(raw.publicTarget);
210
210
  if (!publicTargetResult.ok) {
@@ -226,22 +226,22 @@ function parseProductSubject(raw, subject) {
226
226
  // "example-operator/lobby-trivia" or a bare org name). Slash allowed for the owner/repo convention.
227
227
  export const PUBLIC_TARGET_OWNER_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_./-]*$/;
228
228
  /** Parse the external-public shared-world ownership attestation ({ owner, authorized: true }). The
229
- * harness cannot verify ownership — this is author-trust, surfaced honestly in the evidence class. */
229
+ * harness cannot verify ownership: this is author-trust, and the evidence class says so. */
230
230
  function parsePublicTarget(raw) {
231
231
  if (!isRecord(raw)) {
232
- return invalid("`subject.publicTarget` must be an object ({ owner, authorized: true }) — the operator's ownership attestation for the external-public shared plane.");
232
+ return invalid("`subject.publicTarget` must be an object, `{ owner, authorized: true }`, declaring that you own or operate the public deployment.");
233
233
  }
234
234
  const owner = str(raw.owner);
235
235
  if (!owner || !PUBLIC_TARGET_OWNER_PATTERN.test(owner)) {
236
236
  return invalid("`subject.publicTarget.owner` must be a public-safe operator/repo label (e.g. owner/repo); it is recorded in evidence, so it must carry no secret.");
237
237
  }
238
238
  if (raw.authorized !== true) {
239
- return invalid("`subject.publicTarget.authorized` must be true — you must attest you own/operate the public deployment used as the shared plane (author-trust; the harness cannot verify ownership).");
239
+ return invalid("`subject.publicTarget.authorized` must be true to declare that you own or operate the public deployment. humanish cannot check ownership, so the study states it.");
240
240
  }
241
241
  return { ok: true, value: { owner, authorized: true } };
242
242
  }
243
243
  // The product name interpolates into evidence labels and the composed prompt; the public-safe
244
- // token shape is the same load-bearing constraint as a lab id.
244
+ // token shape is the same strict constraint as a study id.
245
245
  const PRODUCT_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.-]*$/;
246
246
  function parseProduct(raw) {
247
247
  if (!isRecord(raw)) {
@@ -263,7 +263,7 @@ function parseProduct(raw) {
263
263
  if (upload.startsWith("/") ||
264
264
  /^[A-Za-z]:/.test(upload) ||
265
265
  upload.split(/[\\/]/).includes("..")) {
266
- return invalid("`subject.product.upload` must stay inside the project — no absolute paths and no `..` segments.");
266
+ return invalid("`subject.product.upload` must stay inside the project: use a relative path with no `..` segments.");
267
267
  }
268
268
  }
269
269
  const install = str(raw.install);
@@ -289,7 +289,7 @@ function parseProduct(raw) {
289
289
  },
290
290
  };
291
291
  }
292
- // Public-safe stance: a computer-use actor's ENTRY URL is always an app the lab owner runs on
292
+ // Public-safe stance: a computer-use actor's entry URL is always an app the study owner runs on
293
293
  // loopback (inside the sandbox), never an arbitrary public site. (The constraint binds the
294
294
  // entry point; a navigation watchdog for mid-session escapes is a later slice.) Exported so
295
295
  // the engine re-enforces the same boundary on configs that arrive through the library API.
@@ -330,7 +330,7 @@ function parseServe(raw) {
330
330
  }
331
331
  const url = str(raw.url);
332
332
  if (!url || !isLoopbackUrl(url)) {
333
- return invalid("`subject.serve.url` must be a loopback http(s) URL (127.0.0.1 or localhost) — the app is served INSIDE the sandbox.");
333
+ return invalid("`subject.serve.url` must be a loopback http(s) URL (127.0.0.1 or localhost), because the app runs inside the sandbox.");
334
334
  }
335
335
  const serve = { start, url };
336
336
  const install = str(raw.install);
@@ -368,7 +368,7 @@ function parseClone(raw) {
368
368
  /**
369
369
  * Structural parse of `subject.localTree`, mirroring parseClone. Unlike parseClone (which
370
370
  * silently drops an out-of-range depth/fanout), an invalid exclude/maxArchiveBytes value is
371
- * REJECTED, never silently dropped: a caller who typed an empty exclude entry or a non-positive
371
+ * rejected, never silently dropped: a caller who typed an empty exclude entry or a non-positive
372
372
  * maxArchiveBytes almost certainly meant something, and the archive-size cap is a safety knob,
373
373
  * not a cosmetic default.
374
374
  */
@@ -1,7 +1,7 @@
1
- import type { LabConfigParseFailure } from "../types.js";
1
+ import type { StudyParseFailure } from "../types.js";
2
2
  export declare const REPO_SLUG_PATTERN: RegExp;
3
3
  export declare const ENV_NAME_PATTERN: RegExp;
4
- export declare function invalid(message: string): LabConfigParseFailure;
4
+ export declare function invalid(message: string): StudyParseFailure;
5
5
  export declare function str(value: unknown): string | undefined;
6
6
  export declare function optionalStr(key: string, value: unknown): Record<string, string>;
7
7
  export declare function strList(value: unknown): string[] | undefined;
@@ -11,6 +11,6 @@ export declare function strList(value: unknown): string[] | undefined;
11
11
  */
12
12
  export declare function readPositiveInt(value: string | undefined, fallback: number): number;
13
13
  export declare function posInt(value: unknown): number | undefined;
14
- /** A non-negative finite number (0 allowed — caps default to 0 = no-spend). Accepts a numeric
14
+ /** A non-negative finite number (0 allowed; caps default to 0 = no-spend). Accepts a numeric
15
15
  * string too, since YAML scalars can arrive as strings. */
16
16
  export declare function nonNegNumber(value: unknown): number | undefined;
@@ -1,8 +1,8 @@
1
- // The slug interpolates into an in-sandbox shell command; the strict shape is load-bearing.
1
+ // The slug interpolates into an in-sandbox shell command, so its shape is strict.
2
2
  export const REPO_SLUG_PATTERN = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;
3
3
  export const ENV_NAME_PATTERN = /^[A-Z][A-Z0-9_]*$/;
4
4
  export function invalid(message) {
5
- return { ok: false, error: { code: "HUMANISH_LAB_INVALID", message } };
5
+ return { ok: false, error: { code: "HUMANISH_STUDY_INVALID", message } };
6
6
  }
7
7
  export function str(value) {
8
8
  return typeof value === "string" && value.trim() ? value.trim() : undefined;
@@ -48,7 +48,7 @@ export function posInt(value) {
48
48
  }
49
49
  return undefined;
50
50
  }
51
- /** A non-negative finite number (0 allowed — caps default to 0 = no-spend). Accepts a numeric
51
+ /** A non-negative finite number (0 allowed; caps default to 0 = no-spend). Accepts a numeric
52
52
  * string too, since YAML scalars can arrive as strings. */
53
53
  export function nonNegNumber(value) {
54
54
  if (typeof value === "number" && Number.isFinite(value) && value >= 0) {
@@ -1,10 +1,10 @@
1
1
  import { type ResolvedPersona } from "./persona.js";
2
2
  import { type PreparedSelectedOutputDirectory } from "../run/contained-output.js";
3
- import type { LabActor } from "./types.js";
3
+ import type { StudyActor } from "./types.js";
4
4
  /** Title-case an id for the fallback display name (`skeptical-power-user` -> `Skeptical Power User`). */
5
5
  export declare function personaTitleFromId(personaId: string): string;
6
6
  /**
7
- * Resolve ONE persona from `humanish/personas/`, then the ignored `.humanish/local/personas/`.
7
+ * Resolve one persona from `humanish/personas/`, then the ignored `.humanish/local/personas/`.
8
8
  * Returns `null` with a warning when the id is unsafe or no file exists. Invalid rich backgrounds
9
9
  * reject the study before execution.
10
10
  */
@@ -14,7 +14,7 @@ export declare function resolveCommittedPersona(projectRoot: PreparedSelectedOut
14
14
  }>;
15
15
  /**
16
16
  * Resolve every distinct persona id a run will use, once, before participant specs are built. Returning a
17
- * map keeps the plan builder PURE (it is exported npm surface and asserted pure by tests): the
17
+ * map keeps the plan builder pure (it is exported npm surface and asserted pure by tests): the
18
18
  * async file reads happen here, and the composer only does a lookup.
19
19
  */
20
20
  export declare function resolveCommittedPersonas(projectRoot: PreparedSelectedOutputDirectory, personaIds: readonly (string | undefined)[]): Promise<{
@@ -22,16 +22,16 @@ export declare function resolveCommittedPersonas(projectRoot: PreparedSelectedOu
22
22
  warnings: string[];
23
23
  }>;
24
24
  /**
25
- * Every persona id a lab config could put on a browser participant: the roster when one is
25
+ * Every persona id a study config could put on a browser participant: the roster when one is
26
26
  * declared, otherwise the actor-level persona that every fan-out participant inherits.
27
27
  */
28
- export declare function labPersonaIds(config: {
29
- actors?: readonly Pick<LabActor, "persona" | "lanes">[];
28
+ export declare function studyPersonaIds(config: {
29
+ actors?: readonly Pick<StudyActor, "persona" | "lanes">[];
30
30
  }): string[];
31
31
  /**
32
32
  * Same resolution from a plain cwd, for the labs that carry a directory string rather than an
33
- * already-prepared root. Realpath-then-prepare mirrors the cua lab so a symlinked cwd still reads
34
- * personas from the physical project.
33
+ * already-prepared root. Realpath-then-prepare mirrors the computer-use route so a symlinked cwd
34
+ * still reads personas from the physical project.
35
35
  */
36
36
  export declare function resolveCommittedPersonasForCwd(cwd: string, personaIds: readonly (string | undefined)[]): Promise<{
37
37
  personas: Map<string, ResolvedPersona>;
@@ -22,7 +22,7 @@ const PERSONA_DIRECTORIES = [
22
22
  path.posix.join(".humanish", "local", "personas"),
23
23
  ];
24
24
  /**
25
- * Resolve ONE persona from `humanish/personas/`, then the ignored `.humanish/local/personas/`.
25
+ * Resolve one persona from `humanish/personas/`, then the ignored `.humanish/local/personas/`.
26
26
  * Returns `null` with a warning when the id is unsafe or no file exists. Invalid rich backgrounds
27
27
  * reject the study before execution.
28
28
  */
@@ -66,7 +66,7 @@ export async function resolveCommittedPersona(projectRoot, personaId) {
66
66
  }
67
67
  /**
68
68
  * Resolve every distinct persona id a run will use, once, before participant specs are built. Returning a
69
- * map keeps the plan builder PURE (it is exported npm surface and asserted pure by tests): the
69
+ * map keeps the plan builder pure (it is exported npm surface and asserted pure by tests): the
70
70
  * async file reads happen here, and the composer only does a lookup.
71
71
  */
72
72
  export async function resolveCommittedPersonas(projectRoot, personaIds) {
@@ -81,10 +81,10 @@ export async function resolveCommittedPersonas(projectRoot, personaIds) {
81
81
  return { personas, warnings };
82
82
  }
83
83
  /**
84
- * Every persona id a lab config could put on a browser participant: the roster when one is
84
+ * Every persona id a study config could put on a browser participant: the roster when one is
85
85
  * declared, otherwise the actor-level persona that every fan-out participant inherits.
86
86
  */
87
- export function labPersonaIds(config) {
87
+ export function studyPersonaIds(config) {
88
88
  const ids = [];
89
89
  for (const actor of config.actors ?? []) {
90
90
  if (actor.persona)
@@ -98,8 +98,8 @@ export function labPersonaIds(config) {
98
98
  }
99
99
  /**
100
100
  * Same resolution from a plain cwd, for the labs that carry a directory string rather than an
101
- * already-prepared root. Realpath-then-prepare mirrors the cua lab so a symlinked cwd still reads
102
- * personas from the physical project.
101
+ * already-prepared root. Realpath-then-prepare mirrors the computer-use route so a symlinked cwd
102
+ * still reads personas from the physical project.
103
103
  */
104
104
  export async function resolveCommittedPersonasForCwd(cwd, personaIds) {
105
105
  try {
@@ -1,25 +1,25 @@
1
1
  import type { Brain, ComputerUsePlan, NonEmpty, PlannedAnalysis, ProvisionedSubject, Requirement } from "./plan-types.js";
2
- import type { LabConfig } from "./types.js";
2
+ import type { StudyConfig } from "./types.js";
3
3
  export type Base = Omit<ComputerUsePlan, "route" | "actor" | "runner" | "concurrency" | "sessionBudgetMs" | "sandboxMs" | "caps" | "rerun">;
4
4
  export declare function isNonEmpty<T>(values: readonly T[]): values is NonEmpty<T>;
5
- export declare function capsOf(config: LabConfig): ComputerUsePlan["caps"];
6
- export declare function provisionedSubject(config: LabConfig): ProvisionedSubject | undefined;
5
+ export declare function capsOf(config: StudyConfig): ComputerUsePlan["caps"];
6
+ export declare function provisionedSubject(config: StudyConfig): ProvisionedSubject | undefined;
7
7
  /** Keys, env and local tools a live run checks right before it acquires anything. */
8
- export declare function desktopRequirements(config: LabConfig, args: {
8
+ export declare function desktopRequirements(config: StudyConfig, args: {
9
9
  e2b: boolean;
10
10
  brain: Brain;
11
11
  localVm: boolean;
12
12
  externalCatch: boolean;
13
13
  }): Requirement[];
14
- export declare function brainOf(config: LabConfig, callerProvider: boolean): Brain;
14
+ export declare function brainOf(config: StudyConfig, callerProvider: boolean): Brain;
15
15
  /** The brain of a run whose provider the library caller supplies. */
16
- export declare function callerBrainOf(config: LabConfig): Extract<Brain, {
16
+ export declare function callerBrainOf(config: StudyConfig): Extract<Brain, {
17
17
  kind: "caller";
18
18
  }>;
19
19
  /** The model a participant's spend is priced at when its provider reports none. */
20
20
  export declare function pricedModel(brain: Brain): string;
21
21
  /** The fields every plan shares, from a config whose analysis already resolved. */
22
- export declare function planBase(config: LabConfig, input: {
22
+ export declare function planBase(config: StudyConfig, input: {
23
23
  readonly dryRun: boolean;
24
24
  readonly analysis?: {
25
25
  readonly config?: PlannedAnalysis["config"] | undefined;
@@ -110,7 +110,7 @@ export function pricedModel(brain) {
110
110
  export function planBase(config, input) {
111
111
  const analysis = input.analysis?.config;
112
112
  return {
113
- labId: config.id,
113
+ studyId: config.id,
114
114
  ...(config.title === undefined ? {} : { title: config.title }),
115
115
  residual: residualOf(config),
116
116
  dryRun: input.dryRun,
@@ -1,8 +1,8 @@
1
1
  import type { DwellWindow, StopWhen } from "../actors/stop-conditions.js";
2
2
  import type { ReasoningEffort } from "../actors/reasoning-effort.js";
3
3
  import { type DevicePreset } from "./device-presets.js";
4
- import type { LabTask } from "./tasks.js";
5
- import type { LabConfig } from "./types.js";
4
+ import type { StudyTask } from "./tasks.js";
5
+ import type { StudyConfig } from "./types.js";
6
6
  /** Who one participant is. Every route with participants carries this record. */
7
7
  export interface Participant {
8
8
  /** Declared roster id, else `lane-NN` (independent participants) or `role-NN` (shared-world participants). */
@@ -40,18 +40,18 @@ interface DesktopParticipant extends Participant {
40
40
  }
41
41
  /** Only independent computer-use participants consume a task protocol and their own target. */
42
42
  export interface ComputerUseParticipant extends DesktopParticipant {
43
- readonly tasks?: readonly LabTask[];
43
+ readonly tasks?: readonly StudyTask[];
44
44
  /** app-url fan-out only: this participant's own entry URL; absent means the subject URL. */
45
45
  readonly targetUrl?: string;
46
46
  }
47
- /** A seat on a provisioned plane: an optional same-origin path under `serve.url`. */
47
+ /** A participant on a provisioned plane: an optional same-origin path under `serve.url`. */
48
48
  export interface ProvisionedParticipant extends DesktopParticipant {
49
49
  readonly entry?: string;
50
50
  readonly host?: never;
51
51
  readonly tasks?: never;
52
52
  readonly targetUrl?: never;
53
53
  }
54
- /** A seat on an external public plane: exactly one seat hosts the shared session. */
54
+ /** A participant on an external public plane: exactly one participant hosts the shared session. */
55
55
  export interface ExternalPublicParticipant extends DesktopParticipant {
56
56
  readonly host: boolean;
57
57
  readonly entry?: never;
@@ -68,14 +68,14 @@ export type SharedWorldRoster = {
68
68
  /** One shared-world participant on either plane. */
69
69
  export type SharedWorldParticipant = ProvisionedParticipant | ExternalPublicParticipant;
70
70
  /**
71
- * The participants of a computer-use lab: the declared roster, else `count` identical ones. A count
71
+ * The participants of a computer-use study: the declared roster, else `count` identical ones. A count
72
72
  * override (`--count`) applies only when no roster is declared.
73
73
  */
74
- export declare function computerUseParticipants(config: LabConfig, countOverride?: number): ComputerUseParticipant[];
75
- /** The participants of a shared-world lab, one per roster entry, typed by the plane they share. */
76
- export declare function sharedWorldParticipants(config: LabConfig): SharedWorldRoster;
77
- /** The ids of the participants a computer-use or shared-world lab runs, in roster order. */
78
- export declare function declaredParticipantIds(config: LabConfig): string[];
74
+ export declare function computerUseParticipants(config: StudyConfig, countOverride?: number): ComputerUseParticipant[];
75
+ /** The participants of a shared-world study, one per roster entry, typed by the plane they share. */
76
+ export declare function sharedWorldParticipants(config: StudyConfig): SharedWorldRoster;
77
+ /** The ids of the participants a computer-use or shared-world study runs, in roster order. */
78
+ export declare function declaredParticipantIds(config: StudyConfig): string[];
79
79
  /** The entry URLs roster entries declare in place of the subject URL (computer use, app-url). */
80
- export declare function declaredTargets(config: LabConfig): string[];
80
+ export declare function declaredTargets(config: StudyConfig): string[];
81
81
  export {};
@@ -1,4 +1,4 @@
1
- // Who takes part in a lab: one record per participant, built from the declared roster or a count.
1
+ // Who takes part in a study: one record per participant, built from the declared roster or a count.
2
2
  // Computer-use and shared-world participants share the desktop fields; each kind adds its own.
3
3
  import { resolveParticipantDevice } from "./device-presets.js";
4
4
  import { isSharedWorldComposition, participantIdAt } from "./routing.js";
@@ -35,7 +35,7 @@ function desktopParticipant(config, entry, index, kind, focus) {
35
35
  };
36
36
  }
37
37
  /**
38
- * The participants of a computer-use lab: the declared roster, else `count` identical ones. A count
38
+ * The participants of a computer-use study: the declared roster, else `count` identical ones. A count
39
39
  * override (`--count`) applies only when no roster is declared.
40
40
  */
41
41
  export function computerUseParticipants(config, countOverride) {
@@ -52,7 +52,7 @@ export function computerUseParticipants(config, countOverride) {
52
52
  };
53
53
  });
54
54
  }
55
- /** The participants of a shared-world lab, one per roster entry, typed by the plane they share. */
55
+ /** The participants of a shared-world study, one per roster entry, typed by the plane they share. */
56
56
  export function sharedWorldParticipants(config) {
57
57
  const roster = rosterOf(config.actors[0]) ?? [];
58
58
  const participantAt = (entry, index) => desktopParticipant(config, entry, index, "seat", entry.instruction);
@@ -73,7 +73,7 @@ export function sharedWorldParticipants(config) {
73
73
  })),
74
74
  };
75
75
  }
76
- /** The ids of the participants a computer-use or shared-world lab runs, in roster order. */
76
+ /** The ids of the participants a computer-use or shared-world study runs, in roster order. */
77
77
  export function declaredParticipantIds(config) {
78
78
  const actor = config.actors[0];
79
79
  const roster = rosterOf(actor);