humanish 0.108.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/ARCHITECTURE.md +58 -59
  2. package/CHANGELOG.md +13 -0
  3. package/CONTEXT.md +44 -44
  4. package/README.md +3 -3
  5. package/TELEMETRY.md +2 -2
  6. package/dist/actors/codex/app-server-trace.js +2 -1
  7. package/dist/actors/codex/restricted-participant.js +12 -12
  8. package/dist/actors/codex/restricted-session.d.ts +2 -2
  9. package/dist/actors/computer-use/actor.d.ts +6 -6
  10. package/dist/actors/computer-use/actor.js +2 -2
  11. package/dist/actors/computer-use/admission-limit.d.ts +2 -2
  12. package/dist/actors/computer-use/admission-limit.js +3 -3
  13. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  14. package/dist/actors/computer-use/executor-error.js +3 -3
  15. package/dist/actors/computer-use/loop/actions.js +5 -5
  16. package/dist/actors/computer-use/loop/debrief.js +2 -2
  17. package/dist/actors/computer-use/loop/ending.d.ts +1 -1
  18. package/dist/actors/computer-use/loop/ending.js +12 -11
  19. package/dist/actors/computer-use/loop/observation.js +6 -5
  20. package/dist/actors/computer-use/loop/provider-call.js +11 -11
  21. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  22. package/dist/actors/computer-use/loop/session.js +2 -2
  23. package/dist/actors/computer-use/loop/trace.js +3 -2
  24. package/dist/actors/computer-use/loop/types.d.ts +24 -24
  25. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  26. package/dist/actors/computer-use/loop.d.ts +6 -1
  27. package/dist/actors/computer-use/loop.js +26 -4
  28. package/dist/actors/computer-use/openai-provider.d.ts +2 -2
  29. package/dist/actors/computer-use/openai-provider.js +8 -8
  30. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  31. package/dist/actors/computer-use/provider-error.js +6 -6
  32. package/dist/actors/contract.d.ts +4 -4
  33. package/dist/actors/contract.js +1 -1
  34. package/dist/actors/local-agent/claude-session.js +3 -3
  35. package/dist/actors/local-agent/cli.d.ts +1 -1
  36. package/dist/actors/local-agent/cli.js +1 -1
  37. package/dist/actors/reasoning-effort.js +3 -3
  38. package/dist/actors/registry.d.ts +2 -2
  39. package/dist/actors/registry.js +3 -3
  40. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  41. package/dist/actors/scripted-browser/actor.js +1 -1
  42. package/dist/analysis/automatic-completion.d.ts +7 -7
  43. package/dist/analysis/automatic-completion.js +1 -1
  44. package/dist/analysis/automatic-config.d.ts +6 -6
  45. package/dist/analysis/automatic-config.js +1 -1
  46. package/dist/analysis/execute.d.ts +1 -1
  47. package/dist/analysis/execute.js +1 -1
  48. package/dist/analysis/types.d.ts +6 -0
  49. package/dist/browser-control/client.js +16 -16
  50. package/dist/browser-control/dispatcher.js +4 -4
  51. package/dist/browser-control/protocol.js +14 -14
  52. package/dist/browser-control/recording-transfer.js +4 -4
  53. package/dist/browser-control/transport.js +7 -7
  54. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  55. package/dist/cli/commands/comms.js +14 -22
  56. package/dist/cli/commands/observe.d.ts +0 -1
  57. package/dist/cli/commands/observe.js +0 -15
  58. package/dist/cli/commands/run-command.d.ts +2 -2
  59. package/dist/cli/commands/run-command.js +3 -3
  60. package/dist/cli/commands/runs.js +3 -5
  61. package/dist/cli/commands/setup.js +5 -7
  62. package/dist/cli/commands/study-format.d.ts +9 -0
  63. package/dist/cli/commands/{lab-format.js → study-format.js} +5 -5
  64. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  65. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +12 -12
  66. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  67. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  68. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  69. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +3 -3
  70. package/dist/cli/commands/study-route-run.d.ts +19 -0
  71. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  72. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  73. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  74. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  75. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +7 -7
  76. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  77. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  78. package/dist/cli/commands/study-run.d.ts +9 -0
  79. package/dist/cli/commands/{lab-run.js → study-run.js} +34 -34
  80. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +5 -5
  81. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +1 -1
  82. package/dist/cli/commands/study.js +13 -49
  83. package/dist/cli/commands/tui.js +12 -12
  84. package/dist/cli/commands/watch.js +30 -65
  85. package/dist/cli/deprecations.d.ts +1 -13
  86. package/dist/cli/deprecations.js +0 -30
  87. package/dist/cli/doctor.d.ts +3 -3
  88. package/dist/cli/doctor.js +16 -16
  89. package/dist/cli/first-run-path.d.ts +4 -4
  90. package/dist/cli/first-run-path.js +7 -7
  91. package/dist/cli/io.d.ts +3 -3
  92. package/dist/cli/io.js +2 -2
  93. package/dist/cli/observer-follow.d.ts +2 -2
  94. package/dist/cli/observer-follow.js +2 -2
  95. package/dist/cli/orientation.d.ts +4 -4
  96. package/dist/cli/orientation.js +58 -20
  97. package/dist/cli/program.js +3 -4
  98. package/dist/cli/telemetry.d.ts +1 -1
  99. package/dist/cli/telemetry.js +14 -20
  100. package/dist/comms/catch-host.d.ts +1 -1
  101. package/dist/comms/catch-host.js +3 -3
  102. package/dist/comms/connections.d.ts +1 -1
  103. package/dist/comms/connections.js +2 -2
  104. package/dist/comms/external-evidence.d.ts +5 -5
  105. package/dist/comms/external-evidence.js +4 -3
  106. package/dist/comms/fake-inbox.d.ts +2 -2
  107. package/dist/comms/fake-inbox.js +2 -2
  108. package/dist/comms/receiving-runtime.d.ts +4 -4
  109. package/dist/comms/sandbox-catch.d.ts +2 -2
  110. package/dist/comms/sandbox-catch.js +2 -2
  111. package/dist/comms/setup.d.ts +2 -2
  112. package/dist/comms/setup.js +29 -32
  113. package/dist/feedback/draft.js +2 -2
  114. package/dist/feedback/export.js +3 -2
  115. package/dist/feedback/proof.d.ts +1 -1
  116. package/dist/feedback/proof.js +2 -2
  117. package/dist/guest/bootstrap.js +6 -6
  118. package/dist/guest/browser-tools.js +8 -8
  119. package/dist/guest/chromium-text.js +17 -17
  120. package/dist/guest/desktop-executor.d.ts +2 -2
  121. package/dist/guest/desktop-executor.js +20 -20
  122. package/dist/guest/desktop-keys.js +4 -4
  123. package/dist/guest/desktop-media.d.ts +2 -2
  124. package/dist/guest/desktop-media.js +16 -16
  125. package/dist/guest/desktop-native.js +10 -10
  126. package/dist/guest/runtime-desktop.js +2 -2
  127. package/dist/guest/runtime-processes.d.ts +2 -2
  128. package/dist/guest/runtime-processes.js +2 -2
  129. package/dist/guest/runtime.js +5 -5
  130. package/dist/index.d.ts +13 -15
  131. package/dist/index.js +6 -8
  132. package/dist/observer/artifact.d.ts +1 -1
  133. package/dist/observer/artifact.js +1 -1
  134. package/dist/observer/data.d.ts +1 -1
  135. package/dist/observer/library.d.ts +2 -0
  136. package/dist/observer/library.js +4 -1
  137. package/dist/observer/render.js +7 -1
  138. package/dist/observer/run-routes.d.ts +1 -0
  139. package/dist/observer/run-routes.js +37 -12
  140. package/dist/observer/serve.d.ts +1 -1
  141. package/dist/observer-app.html +1 -1
  142. package/dist/routes/computer-use/bundle-parts.js +3 -2
  143. package/dist/routes/computer-use/bundle.d.ts +2 -2
  144. package/dist/routes/computer-use/bundle.js +7 -6
  145. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +5 -5
  146. package/dist/routes/computer-use/e2b-desktop/comms.js +5 -4
  147. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +1 -1
  148. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  149. package/dist/routes/computer-use/e2b-desktop/prepare.js +3 -3
  150. package/dist/routes/computer-use/e2b-desktop/start.js +3 -4
  151. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  152. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -3
  153. package/dist/routes/computer-use/external-comms.d.ts +3 -3
  154. package/dist/routes/computer-use/fanout-bundle.js +11 -10
  155. package/dist/routes/computer-use/fanout-records.js +2 -2
  156. package/dist/routes/computer-use/live-flush.d.ts +3 -3
  157. package/dist/routes/computer-use/live-phase.d.ts +2 -3
  158. package/dist/routes/computer-use/live-phase.js +3 -3
  159. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  160. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  161. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  162. package/dist/routes/computer-use/local-vm.js +2 -2
  163. package/dist/routes/computer-use/participant-desktop.d.ts +3 -3
  164. package/dist/routes/computer-use/participant-desktop.js +1 -1
  165. package/dist/routes/computer-use/participant-execution.js +1 -1
  166. package/dist/routes/computer-use/participant-model.js +3 -3
  167. package/dist/routes/computer-use/participant-prompt.d.ts +5 -5
  168. package/dist/routes/computer-use/participant-prompt.js +3 -3
  169. package/dist/routes/computer-use/participant-runs.d.ts +10 -10
  170. package/dist/routes/computer-use/participant-runs.js +14 -13
  171. package/dist/routes/computer-use/plan.d.ts +12 -12
  172. package/dist/routes/computer-use/plan.js +24 -24
  173. package/dist/routes/computer-use/preflight.d.ts +5 -5
  174. package/dist/routes/computer-use/preflight.js +5 -5
  175. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  176. package/dist/routes/computer-use/rerun-selection.js +3 -2
  177. package/dist/routes/computer-use/result.d.ts +4 -4
  178. package/dist/routes/computer-use/result.js +13 -12
  179. package/dist/routes/computer-use/route.d.ts +12 -12
  180. package/dist/routes/computer-use/route.js +19 -19
  181. package/dist/routes/computer-use/self-report.js +1 -1
  182. package/dist/routes/computer-use/setup.d.ts +22 -22
  183. package/dist/routes/computer-use/setup.js +15 -15
  184. package/dist/routes/computer-use/single-bundle.d.ts +4 -4
  185. package/dist/routes/computer-use/single-bundle.js +14 -13
  186. package/dist/routes/computer-use/subject-projection.d.ts +3 -3
  187. package/dist/routes/computer-use/types.d.ts +34 -34
  188. package/dist/routes/computer-use/types.js +3 -3
  189. package/dist/routes/preview.d.ts +6 -6
  190. package/dist/routes/preview.js +5 -5
  191. package/dist/routes/scripted/bundle.d.ts +6 -6
  192. package/dist/routes/scripted/bundle.js +10 -9
  193. package/dist/routes/scripted/plan.d.ts +7 -7
  194. package/dist/routes/scripted/plan.js +6 -6
  195. package/dist/routes/scripted/result.d.ts +3 -3
  196. package/dist/routes/scripted/result.js +9 -9
  197. package/dist/routes/scripted/route.d.ts +9 -9
  198. package/dist/routes/scripted/route.js +11 -11
  199. package/dist/routes/scripted/scenario.d.ts +1 -1
  200. package/dist/routes/scripted/scenario.js +3 -3
  201. package/dist/routes/scripted/setup.d.ts +6 -6
  202. package/dist/routes/scripted/setup.js +4 -4
  203. package/dist/routes/scripted/subject.d.ts +5 -5
  204. package/dist/routes/scripted/subject.js +3 -3
  205. package/dist/routes/scripted/surface-records.d.ts +1 -1
  206. package/dist/routes/scripted/surface-records.js +2 -2
  207. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  208. package/dist/routes/scripted/types.d.ts +17 -17
  209. package/dist/routes/scripted/types.js +1 -1
  210. package/dist/routes/shared-world/bundle-records.js +3 -3
  211. package/dist/routes/shared-world/bundle.js +15 -14
  212. package/dist/routes/shared-world/checkpoints.d.ts +3 -3
  213. package/dist/routes/shared-world/checkpoints.js +1 -1
  214. package/dist/routes/shared-world/comms.d.ts +9 -9
  215. package/dist/routes/shared-world/comms.js +6 -5
  216. package/dist/routes/shared-world/participant-specs.d.ts +3 -3
  217. package/dist/routes/shared-world/participant-specs.js +7 -7
  218. package/dist/routes/shared-world/plan.d.ts +9 -9
  219. package/dist/routes/shared-world/plan.js +9 -9
  220. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  221. package/dist/routes/shared-world/provisioned.js +4 -4
  222. package/dist/routes/shared-world/result.d.ts +6 -6
  223. package/dist/routes/shared-world/result.js +11 -10
  224. package/dist/routes/shared-world/route.d.ts +11 -11
  225. package/dist/routes/shared-world/route.js +19 -19
  226. package/dist/routes/shared-world/setup.d.ts +13 -13
  227. package/dist/routes/shared-world/setup.js +19 -19
  228. package/dist/routes/shared-world/types.d.ts +27 -27
  229. package/dist/routes/terminal/adapter.d.ts +2 -2
  230. package/dist/routes/terminal/adapter.js +4 -4
  231. package/dist/routes/terminal/bundle.d.ts +11 -11
  232. package/dist/routes/terminal/bundle.js +12 -12
  233. package/dist/routes/terminal/credentials.d.ts +4 -4
  234. package/dist/routes/terminal/credentials.js +5 -5
  235. package/dist/routes/terminal/dry-run.d.ts +4 -4
  236. package/dist/routes/terminal/dry-run.js +9 -9
  237. package/dist/routes/terminal/ledger.d.ts +2 -2
  238. package/dist/routes/terminal/lifetime.d.ts +1 -1
  239. package/dist/routes/terminal/lifetime.js +1 -1
  240. package/dist/routes/terminal/live-finish.d.ts +2 -2
  241. package/dist/routes/terminal/live-finish.js +7 -7
  242. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  243. package/dist/routes/terminal/live-sandbox.js +3 -2
  244. package/dist/routes/terminal/participant-text.js +2 -1
  245. package/dist/routes/terminal/persona.d.ts +2 -2
  246. package/dist/routes/terminal/persona.js +2 -2
  247. package/dist/routes/terminal/plan.d.ts +7 -7
  248. package/dist/routes/terminal/plan.js +5 -5
  249. package/dist/routes/terminal/result.d.ts +5 -5
  250. package/dist/routes/terminal/result.js +7 -7
  251. package/dist/routes/terminal/route.d.ts +9 -9
  252. package/dist/routes/terminal/route.js +14 -14
  253. package/dist/routes/terminal/session.d.ts +5 -5
  254. package/dist/routes/terminal/session.js +7 -7
  255. package/dist/routes/terminal/trace.d.ts +2 -2
  256. package/dist/routes/terminal/types.d.ts +24 -24
  257. package/dist/routes/terminal/types.js +2 -2
  258. package/dist/run/bundle.d.ts +7 -7
  259. package/dist/run/bundle.js +2 -2
  260. package/dist/run/costs.d.ts +23 -0
  261. package/dist/run/costs.js +72 -43
  262. package/dist/run/dry-run-inputs.d.ts +1 -1
  263. package/dist/run/dry-run-inputs.js +1 -1
  264. package/dist/run/dry-run.js +2 -2
  265. package/dist/run/outcomes.d.ts +1 -1
  266. package/dist/run/participant.d.ts +1 -1
  267. package/dist/run/preflight-receipts.js +1 -1
  268. package/dist/run/pricing.js +2 -2
  269. package/dist/run/projection.d.ts +32 -32
  270. package/dist/run/projection.js +44 -44
  271. package/dist/run/reclaim.d.ts +1 -1
  272. package/dist/run/reclaim.js +1 -1
  273. package/dist/run/results.d.ts +2 -2
  274. package/dist/run/run-cost.d.ts +53 -0
  275. package/dist/run/run-cost.js +105 -0
  276. package/dist/run/run-index-analysis.d.ts +15 -0
  277. package/dist/run/run-index-analysis.js +77 -0
  278. package/dist/run/run-index.d.ts +11 -1
  279. package/dist/run/run-index.js +63 -49
  280. package/dist/run/run.d.ts +3 -3
  281. package/dist/run/run.js +2 -2
  282. package/dist/run/shared-world-evidence.d.ts +1 -1
  283. package/dist/run/shared-world-shape.js +1 -1
  284. package/dist/run/stats.d.ts +3 -3
  285. package/dist/run/stats.js +14 -14
  286. package/dist/run/status.d.ts +10 -2
  287. package/dist/run/status.js +6 -3
  288. package/dist/run/streams.d.ts +2 -2
  289. package/dist/run/study-provenance.d.ts +4 -2
  290. package/dist/run/study-provenance.js +7 -4
  291. package/dist/run/study-result.d.ts +0 -5
  292. package/dist/run/study-result.js +1 -1
  293. package/dist/run-study.d.ts +112 -0
  294. package/dist/{run-lab.js → run-study.js} +52 -45
  295. package/dist/{lab → study}/adapter-extension.d.ts +8 -20
  296. package/dist/{lab → study}/adapter-extension.js +2 -14
  297. package/dist/{lab → study}/adapter-scorer-loader.d.ts +10 -10
  298. package/dist/{lab → study}/adapter-scorer-loader.js +3 -3
  299. package/dist/study/composition-rules.d.ts +7 -0
  300. package/dist/{lab → study}/composition-rules.js +12 -12
  301. package/dist/study/config.d.ts +15 -0
  302. package/dist/{lab → study}/config.js +37 -20
  303. package/dist/study/convert.d.ts +1 -1
  304. package/dist/study/convert.js +15 -15
  305. package/dist/{lab → study}/device-presets.d.ts +2 -2
  306. package/dist/{lab → study}/discover.d.ts +29 -23
  307. package/dist/{lab → study}/discover.js +97 -118
  308. package/dist/{lab → study}/doctor.d.ts +11 -11
  309. package/dist/{lab → study}/doctor.js +18 -18
  310. package/dist/study/files.d.ts +2 -2
  311. package/dist/study/files.js +6 -5
  312. package/dist/{lab → study}/init-templates.d.ts +2 -2
  313. package/dist/{lab → study}/init-templates.js +16 -11
  314. package/dist/{lab → study}/init.d.ts +1 -1
  315. package/dist/{lab → study}/init.js +7 -4
  316. package/dist/{lab → study}/keys.d.ts +2 -2
  317. package/dist/{lab → study}/keys.js +10 -10
  318. package/dist/study/migrate.d.ts +1 -1
  319. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  320. package/dist/{lab → study}/parse/actors.js +5 -5
  321. package/dist/study/parse/comms.d.ts +12 -0
  322. package/dist/study/parse/execution.d.ts +19 -0
  323. package/dist/{lab → study}/parse/study-v3.d.ts +3 -5
  324. package/dist/{lab → study}/parse/study-v3.js +3 -3
  325. package/dist/{lab → study}/parse/subject-state.d.ts +8 -8
  326. package/dist/{lab → study}/parse/subject-state.js +4 -4
  327. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  328. package/dist/{lab → study}/parse/subject.js +8 -8
  329. package/dist/{lab → study}/parse/values.d.ts +2 -2
  330. package/dist/{lab → study}/persona-resolve.d.ts +4 -4
  331. package/dist/{lab → study}/persona-resolve.js +2 -2
  332. package/dist/{lab → study}/plan-base.d.ts +7 -7
  333. package/dist/{lab → study}/plan-base.js +1 -1
  334. package/dist/{lab → study}/plan-participants.d.ts +10 -10
  335. package/dist/{lab → study}/plan-participants.js +4 -4
  336. package/dist/{lab → study}/plan-types.d.ts +28 -28
  337. package/dist/{lab → study}/plan-types.js +2 -2
  338. package/dist/study/plan.d.ts +13 -0
  339. package/dist/{lab → study}/plan.js +20 -20
  340. package/dist/study/preflight-probes.d.ts +3 -0
  341. package/dist/{lab → study}/preflight-probes.js +9 -8
  342. package/dist/study/preflight-result.d.ts +8 -0
  343. package/dist/{lab → study}/preflight-result.js +3 -3
  344. package/dist/{lab → study}/preflight.d.ts +31 -31
  345. package/dist/{lab → study}/preflight.js +8 -8
  346. package/dist/{lab → study}/requirements.d.ts +3 -3
  347. package/dist/{lab → study}/requirements.js +1 -1
  348. package/dist/study/route-inputs.d.ts +28 -0
  349. package/dist/{lab → study}/route-inputs.js +1 -1
  350. package/dist/{lab → study}/routing.d.ts +12 -12
  351. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -10
  352. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -3
  353. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +8 -17
  354. package/dist/study/run-study-homes.js +3 -0
  355. package/dist/study/run-study-options.d.ts +28 -0
  356. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +13 -12
  357. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +2 -2
  358. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  359. package/dist/{lab → study}/summary.d.ts +10 -10
  360. package/dist/{lab → study}/summary.js +15 -15
  361. package/dist/{lab → study}/tasks.d.ts +3 -3
  362. package/dist/{lab → study}/tasks.js +1 -1
  363. package/dist/{lab → study}/types.d.ts +104 -104
  364. package/dist/{lab → study}/types.js +1 -1
  365. package/dist/{lab → study}/validation.d.ts +19 -19
  366. package/dist/{lab → study}/validation.js +13 -13
  367. package/dist/{lab → study}/warnings.d.ts +4 -4
  368. package/dist/{lab → study}/warnings.js +1 -1
  369. package/dist/subject/clone.d.ts +6 -6
  370. package/dist/subject/clone.js +2 -2
  371. package/dist/subject/local-tree-archive.d.ts +2 -2
  372. package/dist/subject/local-tree-archive.js +3 -3
  373. package/dist/subject/local-tree.d.ts +3 -3
  374. package/dist/subject/runtime.js +2 -2
  375. package/dist/subject/serve.d.ts +4 -4
  376. package/dist/subject/state.d.ts +3 -3
  377. package/dist/subject/state.js +1 -1
  378. package/dist/subject/steps.d.ts +1 -1
  379. package/dist/subject/steps.js +1 -1
  380. package/dist/substrates/desktop-session.js +2 -2
  381. package/dist/substrates/detached.d.ts +1 -1
  382. package/dist/substrates/e2b/desktop-browser.d.ts +4 -4
  383. package/dist/substrates/e2b/desktop-browser.js +1 -1
  384. package/dist/substrates/e2b/desktop-cdp.d.ts +1 -1
  385. package/dist/substrates/e2b/desktop-cdp.js +1 -1
  386. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  387. package/dist/substrates/e2b/desktop-executor.js +12 -12
  388. package/dist/substrates/e2b/desktop-geometry.d.ts +1 -1
  389. package/dist/substrates/e2b/desktop-geometry.js +1 -1
  390. package/dist/substrates/e2b/desktop-media.d.ts +3 -3
  391. package/dist/substrates/e2b/lifetime.js +1 -1
  392. package/dist/substrates/e2b/sandbox.d.ts +3 -3
  393. package/dist/substrates/e2b/sandbox.js +1 -1
  394. package/dist/substrates/e2b/sdk.d.ts +1 -1
  395. package/dist/substrates/e2b/sdk.js +1 -1
  396. package/dist/substrates/local/runtime-config.d.ts +4 -4
  397. package/dist/substrates/local/runtime-config.js +4 -4
  398. package/dist/tui/contract.d.ts +8 -8
  399. package/dist/tui/contract.js +2 -2
  400. package/dist/tui/launch.d.ts +3 -3
  401. package/dist/tui/launch.js +22 -16
  402. package/dist/tui-app.js +139 -139
  403. package/dist/verify/subject.d.ts +1 -1
  404. package/dist/verify/subject.js +1 -1
  405. package/dist/verify/verify.js +2 -1
  406. package/docs/architecture/actor-contract.md +5 -5
  407. package/docs/architecture/browser-control.md +1 -1
  408. package/docs/architecture/external-public-shared-world.md +8 -7
  409. package/docs/architecture/github-feedback-loop.md +1 -1
  410. package/docs/architecture/task-protocol-support.md +1 -1
  411. package/docs/architecture/terminal-product-route.md +18 -18
  412. package/docs/contracts/adapter-fixtures.md +2 -2
  413. package/docs/contracts/errors.md +8 -8
  414. package/docs/contracts/run-bundle.md +1 -4
  415. package/docs/contracts/schemas.md +61 -42
  416. package/docs/contracts/study-analysis.md +4 -1
  417. package/docs/contracts/study-costs.md +17 -2
  418. package/examples/README.md +1 -1
  419. package/examples/scorer/scorer.mjs +3 -3
  420. package/package.json +1 -1
  421. package/skills/humanish/SKILL.md +8 -6
  422. package/skills/humanish/agents/openai.yaml +1 -1
  423. package/dist/cli/commands/lab-format.d.ts +0 -9
  424. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  425. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  426. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  427. package/dist/cli/commands/lab-run.d.ts +0 -9
  428. package/dist/lab/composition-rules.d.ts +0 -7
  429. package/dist/lab/config.d.ts +0 -7
  430. package/dist/lab/deprecated-fields.d.ts +0 -10
  431. package/dist/lab/deprecated-fields.js +0 -24
  432. package/dist/lab/parse/comms.d.ts +0 -12
  433. package/dist/lab/parse/execution.d.ts +0 -19
  434. package/dist/lab/plan.d.ts +0 -13
  435. package/dist/lab/preflight-probes.d.ts +0 -3
  436. package/dist/lab/preflight-result.d.ts +0 -8
  437. package/dist/lab/route-inputs.d.ts +0 -28
  438. package/dist/lab/run-lab-homes.js +0 -7
  439. package/dist/lab/run-lab-options.d.ts +0 -28
  440. package/dist/library-aliases.d.ts +0 -56
  441. package/dist/library-aliases.js +0 -22
  442. package/dist/run-lab.d.ts +0 -112
  443. /package/dist/{lab → study}/device-presets.js +0 -0
  444. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  445. /package/dist/{lab → study}/init-paths.js +0 -0
  446. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  447. /package/dist/{lab → study}/init-plan.js +0 -0
  448. /package/dist/{lab → study}/parse/comms.js +0 -0
  449. /package/dist/{lab → study}/parse/execution.js +0 -0
  450. /package/dist/{lab → study}/parse/values.js +0 -0
  451. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  452. /package/dist/{lab → study}/participant-assignment.js +0 -0
  453. /package/dist/{lab → study}/persona.d.ts +0 -0
  454. /package/dist/{lab → study}/persona.js +0 -0
  455. /package/dist/{lab → study}/routing.js +0 -0
@@ -1,73 +1,67 @@
1
- import { labPersonaIds, resolveCommittedPersonasForCwd } from "./persona-resolve.js";
1
+ import { studyPersonaIds, resolveCommittedPersonasForCwd } from "./persona-resolve.js";
2
2
  import { personaBrief, PersonaConfigError } from "./persona.js";
3
3
  import { constants } from "node:fs";
4
4
  import { lstat, open, readdir, realpath } from "node:fs/promises";
5
5
  import path from "node:path";
6
6
  import { parse } from "yaml";
7
- import { parseLabConfig } from "./config.js";
8
- import { STUDY_SCHEMA } from "./types.js";
7
+ import { parseStudy } from "./config.js";
8
+ import { V2_SCHEMA } from "./types.js";
9
9
  import { assertPreparedSelectedOutputDirectory, assertSafeOutputPathSegment, prepareSelectedOutputDirectory, readContainedRegularFile, } from "../run/contained-output.js";
10
10
  import { isNodeError } from "../run/type-guards.js";
11
- import { studyFileCandidates, studyFileStem, STUDY_DIRECTORIES } from "../study/files.js";
11
+ import { studyFileCandidates, STUDY_DIRECTORIES } from "./files.js";
12
12
  const STUDY_LIST_SCHEMA = "humanish.study-list.v1";
13
13
  const STUDY_SHOW_SCHEMA = "humanish.study-show.v1";
14
- export async function resolveLabManifest(cwd, lab) {
14
+ export async function resolveStudyManifest(cwd, study) {
15
15
  const resolvedCwd = path.resolve(cwd);
16
16
  const warnings = [];
17
17
  const projectRoot = await bindProjectRoot(resolvedCwd);
18
18
  if (!projectRoot) {
19
- return invalidLab({ cwd: resolvedCwd, lab, warnings }, "Project root failed containment validation.");
19
+ return invalidStudy({ cwd: resolvedCwd, study, warnings }, "Project root failed containment validation.");
20
20
  }
21
- if (labLooksLikePath(lab)) {
22
- const requestedPath = path.resolve(resolvedCwd, lab);
21
+ if (studyLooksLikePath(study)) {
22
+ const requestedPath = path.resolve(resolvedCwd, study);
23
23
  const read = await readExplicitManifest(projectRoot, requestedPath);
24
24
  if (read.status === "missing") {
25
- return labNotFound(resolvedCwd, lab, warnings);
25
+ return studyNotFound(resolvedCwd, study, warnings);
26
26
  }
27
27
  if (read.status === "unsafe") {
28
- return invalidLab({ cwd: resolvedCwd, lab, warnings }, read.message);
28
+ return invalidStudy({ cwd: resolvedCwd, study, warnings }, read.message);
29
29
  }
30
- return parseResolvedLab({
30
+ return parseResolvedStudy({
31
31
  cwd: resolvedCwd,
32
- lab,
32
+ study,
33
33
  origin: "explicit",
34
34
  path: requestedPath,
35
35
  warnings,
36
36
  contents: read.contents,
37
37
  });
38
38
  }
39
- // A studies/ file wins over every labs/ file. The same stem under both families is an error, so
40
- // neither file silently shadows the other.
41
- const candidates = studyFileCandidates(lab);
42
- for (const candidate of candidates) {
39
+ // The studies/ directories are read in order. A name found only under a labs/ directory is
40
+ // refused with what to do about it, so the user is not told the study does not exist.
41
+ for (const candidate of studyFileCandidates(study)) {
43
42
  const read = await readManagedManifest(projectRoot, candidate.relativePath);
44
43
  if (read.status === "missing") {
45
44
  continue;
46
45
  }
47
46
  if (read.status === "unsafe") {
48
- return invalidLab({ cwd: resolvedCwd, lab, warnings }, read.message);
47
+ return invalidStudy({ cwd: resolvedCwd, study, warnings }, read.message);
49
48
  }
50
- if (candidate.directory.family === "studies") {
51
- for (const other of candidates.filter((entry) => entry.directory.family === "labs")) {
52
- const present = await inspectManagedPath(projectRoot, other.relativePath, "file");
53
- if (present.status !== "missing")
54
- return ambiguousStudy(resolvedCwd, lab, [candidate.relativePath, other.relativePath], warnings);
55
- }
56
- }
57
- return parseResolvedLab({
49
+ return parseResolvedStudy({
58
50
  cwd: resolvedCwd,
59
- lab,
51
+ study,
60
52
  origin: candidate.directory.origin,
61
53
  path: path.join(resolvedCwd, candidate.relativePath),
62
54
  warnings,
63
55
  contents: read.contents,
56
+ retiredDirectory: candidate.directory.family === "labs",
64
57
  });
65
58
  }
66
- return labNotFound(resolvedCwd, lab, warnings);
59
+ return studyNotFound(resolvedCwd, study, warnings);
67
60
  }
68
- export async function listLabManifests(cwd) {
61
+ export async function listStudyManifests(cwd) {
69
62
  const resolvedCwd = path.resolve(cwd);
70
63
  const warnings = [];
64
+ const retired = [];
71
65
  const listed = new Map();
72
66
  const projectRoot = await bindProjectRoot(resolvedCwd);
73
67
  if (!projectRoot) {
@@ -76,12 +70,10 @@ export async function listLabManifests(cwd) {
76
70
  ok: true,
77
71
  cwd: resolvedCwd,
78
72
  studies: [],
73
+ retired: [],
79
74
  warnings: ["Project root failed containment validation; study files were skipped."],
80
75
  };
81
76
  }
82
- let legacyFiles = 0;
83
- // Each stem's files by directory family, to mark the stems that name a file in both.
84
- const stems = new Map();
85
77
  for (const entry of STUDY_DIRECTORIES) {
86
78
  const directory = await bindManagedDirectory(projectRoot, entry.relativeDir);
87
79
  if (directory.status === "missing") {
@@ -97,7 +89,7 @@ export async function listLabManifests(cwd) {
97
89
  await assertManagedDirectoryBinding(projectRoot, entry.relativeDir, directory.binding);
98
90
  }
99
91
  catch {
100
- warnings.push(`${entry.relativeDir}: unsafe managed lab directory; skipped.`);
92
+ warnings.push(`${entry.relativeDir}: unsafe managed study directory; skipped.`);
101
93
  continue;
102
94
  }
103
95
  for (const name of names.filter((value) => value.endsWith(".yaml") || value.endsWith(".yml"))) {
@@ -110,30 +102,35 @@ export async function listLabManifests(cwd) {
110
102
  warnings.push(`${entry.relativeDir}: unsafe study file name; skipped.`);
111
103
  continue;
112
104
  }
113
- const stem = stemSlot(stems, studyFileStem(name) ?? name);
114
- stem[entry.family === "studies" ? "studies" : "legacy"] ??= relativeToCwd(resolvedCwd, path.join(resolvedCwd, relativePath));
115
105
  const requestedPath = path.join(resolvedCwd, relativePath);
116
106
  const read = await readManagedManifest(projectRoot, relativePath);
117
107
  if (read.status !== "ok") {
118
- warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${read.status === "unsafe" ? read.message : "manifest changed while it was listed; skipped."}`);
108
+ warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${read.status === "unsafe" ? read.message : "study file changed while it was listed; skipped."}`);
119
109
  continue;
120
110
  }
121
- const parsed = parseResolvedLab({
111
+ const parsed = parseResolvedStudy({
122
112
  cwd: resolvedCwd,
123
- lab: name.replace(/\.(?:ya?ml)$/i, ""),
113
+ study: name.replace(/\.(?:ya?ml)$/i, ""),
124
114
  origin: entry.origin,
125
115
  path: requestedPath,
126
116
  warnings: [],
127
117
  contents: read.contents,
118
+ retiredDirectory: entry.family === "labs",
128
119
  });
129
120
  if (!parsed.ok) {
130
- warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${parsed.error.message}`);
121
+ const { code, message } = parsed.error;
122
+ if (code === "HUMANISH_STUDY_V2_UNSUPPORTED" ||
123
+ code === "HUMANISH_STUDY_RETIRED_DIRECTORY") {
124
+ // The message already starts with the file's path.
125
+ retired.push({ path: relativeToCwd(resolvedCwd, requestedPath), code, message });
126
+ warnings.push(message);
127
+ }
128
+ else {
129
+ warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${message}`);
130
+ }
131
131
  continue;
132
132
  }
133
- if (legacyStudyWarning(parsed.path, parsed.config.schema) !== undefined)
134
- legacyFiles += 1;
135
133
  const key = `${parsed.config.id}:${entry.origin}:${relativeToCwd(resolvedCwd, requestedPath)}`;
136
- stem.keys.push(key);
137
134
  listed.set(key, {
138
135
  id: parsed.config.id,
139
136
  source: parsed.config.subject.source,
@@ -147,42 +144,30 @@ export async function listLabManifests(cwd) {
147
144
  });
148
145
  }
149
146
  }
150
- if (legacyFiles > 0) {
151
- warnings.push(`${legacyFiles === 1 ? "One study file uses" : `${legacyFiles} study files use`} humanish.lab.v2 or a labs/ directory, which 0.109 stops reading. humanish migrate converts and moves the v2 files; humanish study show names the fix for each file.`);
152
- }
153
- for (const [name, stem] of stems) {
154
- if (stem.studies === undefined || stem.legacy === undefined)
155
- continue;
156
- const error = `${name} names two files, ${stem.studies} and ${stem.legacy}; running it by name fails until you delete one (humanish migrate moves a kept labs/ file).`;
157
- for (const key of stem.keys) {
158
- const entry = listed.get(key);
159
- if (entry)
160
- entry.error = error;
161
- }
162
- }
163
147
  return {
164
148
  schema: STUDY_LIST_SCHEMA,
165
149
  ok: true,
166
150
  cwd: resolvedCwd,
167
151
  studies: [...listed.values()].sort((left, right) => `${left.origin}:${left.id}`.localeCompare(`${right.origin}:${right.id}`)),
152
+ retired,
168
153
  warnings,
169
154
  };
170
155
  }
171
- export async function inspectLabManifest(cwd, lab) {
172
- const resolved = await resolveLabManifest(cwd, lab);
156
+ export async function inspectStudyManifest(cwd, study) {
157
+ const resolved = await resolveStudyManifest(cwd, study);
173
158
  if (!resolved.ok) {
174
159
  return {
175
160
  schema: STUDY_SHOW_SCHEMA,
176
161
  ok: false,
177
162
  cwd: resolved.cwd,
178
- study: lab,
163
+ study,
179
164
  error: resolved.error,
180
165
  warnings: resolved.warnings,
181
166
  };
182
167
  }
183
168
  let personaResolution;
184
169
  try {
185
- personaResolution = await resolveCommittedPersonasForCwd(cwd, labPersonaIds(resolved.config));
170
+ personaResolution = await resolveCommittedPersonasForCwd(cwd, studyPersonaIds(resolved.config));
186
171
  }
187
172
  catch (error) {
188
173
  if (!(error instanceof PersonaConfigError))
@@ -191,44 +176,45 @@ export async function inspectLabManifest(cwd, lab) {
191
176
  schema: STUDY_SHOW_SCHEMA,
192
177
  ok: false,
193
178
  cwd: path.resolve(cwd),
194
- study: lab,
179
+ study,
195
180
  error: { code: "HUMANISH_STUDY_INVALID", message: error.message },
196
181
  warnings: resolved.warnings,
197
182
  };
198
183
  }
199
184
  return {
200
185
  schema: STUDY_SHOW_SCHEMA,
201
- personas: labPersonaIds(resolved.config).map((id) => {
186
+ personas: studyPersonaIds(resolved.config).map((id) => {
202
187
  const persona = personaResolution.personas.get(id);
203
188
  return { id, resolved: !!persona, ...(persona ? { brief: personaBrief(persona) } : {}) };
204
189
  }),
205
190
  ok: true,
206
191
  cwd: path.resolve(cwd),
207
- study: lab,
192
+ study,
208
193
  config: resolved.config,
209
194
  origin: resolved.origin,
210
195
  path: resolved.path,
211
196
  warnings: [...resolved.warnings, ...personaResolution.warnings],
212
197
  };
213
198
  }
214
- function parseResolvedLab(args) {
199
+ function parseResolvedStudy(args) {
215
200
  let raw;
216
201
  try {
217
202
  raw = parse(args.contents);
218
203
  }
219
204
  catch (error) {
220
- return invalidLab(args, error instanceof Error ? error.message : "The study file's YAML could not be parsed.");
205
+ return invalidStudy(args, error instanceof Error ? error.message : "The study file's YAML could not be parsed.");
206
+ }
207
+ const refusal = retiredStudyRefusal(relativeToCwd(args.cwd, args.path).replace(/\\/g, "/"), raw, args.retiredDirectory === true);
208
+ if (refusal !== undefined) {
209
+ return { ok: false, cwd: args.cwd, study: args.study, error: refusal, warnings: args.warnings };
221
210
  }
222
- const parsed = parseLabConfig(raw);
211
+ const parsed = parseStudy(raw);
223
212
  if (!parsed.ok) {
224
- return invalidLab(args, parsed.error.message);
213
+ return invalidStudy(args, parsed.error.message);
225
214
  }
226
215
  const warnings = [...args.warnings, ...parsed.warnings];
227
- const legacy = legacyStudyWarning(relativeToCwd(args.cwd, args.path), parsed.config.schema);
228
- if (legacy !== undefined)
229
- warnings.push(legacy);
230
216
  if (args.path.endsWith(".yml")) {
231
- warnings.push("Prefer .yaml for humanish-authored lab source; .yml is accepted for compatibility only.");
217
+ warnings.push("Prefer .yaml for study files; .yml is accepted for compatibility only.");
232
218
  }
233
219
  return {
234
220
  ok: true,
@@ -239,22 +225,37 @@ function parseResolvedLab(args) {
239
225
  };
240
226
  }
241
227
  /**
242
- * What 0.109 stops reading in this file: the humanish.lab.v2 format, a labs/ directory, or both, and
243
- * what to run about it. Undefined for a v3 file outside the labs/ directories.
228
+ * Why humanish refuses this file, or undefined. A humanish.lab.v2 file is refused wherever it is,
229
+ * and `humanish migrate` converts it (and moves it out of a labs/ directory). A v3 file is refused
230
+ * only when it was found by name in a labs/ directory; an explicit path to it still runs.
244
231
  */
245
- function legacyStudyWarning(relativePath, schema) {
246
- const retiredDirectory = STUDY_DIRECTORIES.find((directory) => directory.family === "labs" && path.dirname(relativePath) === directory.relativeDir);
247
- // A file discovery parsed has one of two schemas, so not v3 is v2.
248
- const v2 = schema !== STUDY_SCHEMA;
249
- if (retiredDirectory !== undefined) {
250
- const studies = retiredDirectory.relativeDir.replace(/labs$/, "studies");
251
- return v2
252
- ? `${relativePath} is a humanish.lab.v2 file in ${retiredDirectory.relativeDir}/, and 0.109 reads neither. Run humanish migrate to convert it and move it to ${studies}/.`
253
- : `${relativePath} is in ${retiredDirectory.relativeDir}/, which 0.109 stops reading. Move it to ${studies}/.`;
254
- }
255
- return v2
256
- ? `${relativePath} is a humanish.lab.v2 file, which 0.109 stops reading. Run humanish migrate ${relativePath} to convert it.`
257
- : undefined;
232
+ function retiredStudyRefusal(relativePath, raw, retiredDirectory) {
233
+ const directory = path.posix.dirname(relativePath);
234
+ const studies = directory.replace(/labs$/, "studies");
235
+ // migrate moves a v2 file out of a labs/ directory however the file was named.
236
+ const inStudies = STUDY_DIRECTORIES.some((entry) => entry.family === "labs" && entry.relativeDir.replace(/\\/g, "/") === directory);
237
+ // migrate refuses a path outside its --cwd, so a file outside the project gets its own directory.
238
+ const migrate = path.isAbsolute(relativePath)
239
+ ? `humanish migrate --cwd ${shellPath(path.dirname(relativePath))} ${shellPath(path.basename(relativePath))}`
240
+ : `humanish migrate ${shellPath(relativePath)}`;
241
+ if (typeof raw === "object" && raw !== null && raw.schema === V2_SCHEMA)
242
+ return {
243
+ code: "HUMANISH_STUDY_V2_UNSUPPORTED",
244
+ message: inStudies
245
+ ? `${relativePath} is a humanish.lab.v2 file in ${directory}/, which humanish no longer reads. Run ${migrate} to convert it and move it to ${studies}/.`
246
+ : `${relativePath} is a humanish.lab.v2 file, which humanish no longer reads. Run ${migrate} to convert it.`,
247
+ };
248
+ if (retiredDirectory)
249
+ return {
250
+ code: "HUMANISH_STUDY_RETIRED_DIRECTORY",
251
+ message: `${relativePath} is in ${directory}/, which humanish no longer reads. Move it to ${studies}/.`,
252
+ };
253
+ return undefined;
254
+ }
255
+ /** A path as one shell argument: quoted when the shell would split or expand it, never an option. */
256
+ function shellPath(value) {
257
+ const arg = value.startsWith("-") ? `./${value}` : value;
258
+ return /^[\w@%+=:,./-]+$/.test(arg) ? arg : `'${arg.replace(/'/g, "'\\''")}'`;
258
259
  }
259
260
  async function bindProjectRoot(cwd) {
260
261
  try {
@@ -418,14 +419,14 @@ async function assertManagedDirectoryBinding(projectRoot, relativePath, binding)
418
419
  current.birthtimeNs !== binding.birthtimeNs ||
419
420
  current.dev !== binding.dev ||
420
421
  current.ino !== binding.ino) {
421
- throw new Error("Managed lab directory identity changed after it was bound.");
422
+ throw new Error("Managed study directory identity changed after it was bound.");
422
423
  }
423
424
  }
424
- function invalidLab(args, message) {
425
+ function invalidStudy(args, message) {
425
426
  return {
426
427
  ok: false,
427
428
  cwd: args.cwd,
428
- study: args.lab,
429
+ study: args.study,
429
430
  error: {
430
431
  code: "HUMANISH_STUDY_INVALID",
431
432
  message,
@@ -433,46 +434,24 @@ function invalidLab(args, message) {
433
434
  warnings: args.warnings,
434
435
  };
435
436
  }
436
- function stemSlot(stems, name) {
437
- let slot = stems.get(name);
438
- if (slot === undefined) {
439
- slot = { keys: [] };
440
- stems.set(name, slot);
441
- }
442
- return slot;
443
- }
444
- /** The same stem under a studies/ and a labs/ directory: discovery reads neither. */
445
- function ambiguousStudy(cwd, name, paths, warnings) {
446
- const [studiesPath, labsPath] = paths.map((entry) => entry.replace(/\\/g, "/"));
447
- return {
448
- ok: false,
449
- cwd,
450
- study: name,
451
- error: {
452
- code: "HUMANISH_STUDY_AMBIGUOUS",
453
- message: `${name} names two files, ${studiesPath} and ${labsPath}. Delete the one you do not want; if you keep ${labsPath}, run humanish migrate to move it. Or pass the path of the one to run.`,
454
- },
455
- warnings,
456
- };
457
- }
458
- function labNotFound(cwd, lab, warnings) {
437
+ function studyNotFound(cwd, study, warnings) {
459
438
  return {
460
439
  ok: false,
461
440
  cwd,
462
- study: lab,
441
+ study,
463
442
  error: {
464
443
  code: "HUMANISH_STUDY_NOT_FOUND",
465
- message: `Study not found: ${lab}. Look in humanish/studies/ or humanish/labs/, or pass a .yaml path.`,
444
+ message: `Study not found: ${study}. Look in humanish/studies/, or pass a .yaml path.`,
466
445
  },
467
446
  warnings,
468
447
  };
469
448
  }
470
- function labLooksLikePath(lab) {
471
- return (lab.endsWith(".yaml") ||
472
- lab.endsWith(".yml") ||
473
- lab.includes("/") ||
474
- lab.includes("\\") ||
475
- lab.startsWith("."));
449
+ function studyLooksLikePath(study) {
450
+ return (study.endsWith(".yaml") ||
451
+ study.endsWith(".yml") ||
452
+ study.includes("/") ||
453
+ study.includes("\\") ||
454
+ study.startsWith("."));
476
455
  }
477
456
  function relativeToCwd(cwd, filePath) {
478
457
  const relative = path.relative(cwd, filePath);
@@ -1,5 +1,5 @@
1
1
  import { type LocalRuntimeStatus } from "../substrates/local/runtime.js";
2
- import type { LabConfig } from "./types.js";
2
+ import type { StudyConfig } from "./types.js";
3
3
  import type { PlanResult } from "./plan-types.js";
4
4
  import type { DetectedLocalAgent } from "../actors/local-agent/cli.js";
5
5
  import type { ReasoningEffort } from "../actors/reasoning-effort.js";
@@ -31,7 +31,7 @@ type HostedCodexReadiness = CodexReadiness & {
31
31
  };
32
32
  /**
33
33
  * The hosted participant check: the operator-auth launch to an ephemeral thread, with no turn,
34
- * using the lab's declared model and reasoning effort as a run would.
34
+ * using the study's declared model and reasoning effort as a run would.
35
35
  */
36
36
  declare function hostedCodexReadiness(env: NodeJS.ProcessEnv, actor: {
37
37
  model?: string;
@@ -42,9 +42,9 @@ export declare function localCodexParticipantCheck(args: {
42
42
  env: NodeJS.ProcessEnv;
43
43
  readiness?: (env: NodeJS.ProcessEnv) => Promise<CodexReadiness>;
44
44
  }): Promise<Check>;
45
- export interface LabSetupCheckArgs {
45
+ export interface StudySetupCheckArgs {
46
46
  cwd: string;
47
- lab: string;
47
+ study: string;
48
48
  env: NodeJS.ProcessEnv;
49
49
  agents: DetectedLocalAgent[];
50
50
  keyPresent: (name: string) => boolean;
@@ -56,11 +56,11 @@ export interface LabSetupCheckArgs {
56
56
  }
57
57
  /**
58
58
  * Setup checks only: no model turn, browser or desktop creation. CLI startup may use the network.
59
- * `keys` are the keys a live run requires. `reads` are the provider keys the lab is known to read,
60
- * required or not; it is undefined when that is unknown: the lab does not plan, or a declared
59
+ * `keys` are the keys a live run requires. `reads` are the provider keys the study is known to read,
60
+ * required or not; it is undefined when that is unknown: the study does not plan, or a declared
61
61
  * scorer's host code may read any key.
62
62
  */
63
- export declare function labSetupChecks(args: LabSetupCheckArgs): Promise<{
63
+ export declare function studySetupChecks(args: StudySetupCheckArgs): Promise<{
64
64
  desktop: boolean;
65
65
  keys: string[];
66
66
  reads?: ReadonlySet<string>;
@@ -68,14 +68,14 @@ export declare function labSetupChecks(args: LabSetupCheckArgs): Promise<{
68
68
  }>;
69
69
  /**
70
70
  * The ids of the project's labs that need each provider key for a live run, from the same plan
71
- * `doctor --lab` reads. Each listed manifest resolves by its path, since a file name need not match
72
- * the id inside. A lab that runs dry, that the plain CLI cannot run, or that does not plan needs
71
+ * `doctor --study` reads. Each listed manifest resolves by its path, since a file name need not match
72
+ * the id inside. A study that runs dry, that the plain CLI cannot run, or that does not plan needs
73
73
  * none.
74
74
  */
75
75
  export declare function studiesByRequiredKey(cwd: string, keyPresent: (name: string) => boolean): Promise<Map<string, string[]>>;
76
76
  /**
77
- * The lab planned with no run options, so its own scenario mode decides dry or live. Doctor and the
77
+ * The study planned with no run options, so its own scenario mode decides dry or live. Doctor and the
78
78
  * TUI read a live run's keys and subject env from this plan's requirements.
79
79
  */
80
- export declare function planCliRun(config: LabConfig, cwd: string): Promise<PlanResult>;
80
+ export declare function planCliRun(config: StudyConfig, cwd: string): Promise<PlanResult>;
81
81
  export {};
@@ -1,5 +1,5 @@
1
1
  import path from "node:path";
2
- import { isLocalBrowserLab } from "../substrates/local/runtime-config.js";
2
+ import { isLocalBrowserStudy } from "../substrates/local/runtime-config.js";
3
3
  import { localRuntimeStatus } from "../substrates/local/runtime.js";
4
4
  import { keyNamesOf, requiredKeys, requiredSubjectEnv } from "./requirements.js";
5
5
  import { protocolAdditionsWarning, protocolIncompatibilityMessage, } from "../actors/codex/protocol-compat.js";
@@ -40,7 +40,7 @@ async function codexAccountReadiness(env) {
40
40
  }
41
41
  /**
42
42
  * The hosted participant check: the operator-auth launch to an ephemeral thread, with no turn,
43
- * using the lab's declared model and reasoning effort as a run would.
43
+ * using the study's declared model and reasoning effort as a run would.
44
44
  */
45
45
  async function hostedCodexReadiness(env, actor) {
46
46
  const { checkRestrictedCodexParticipantReadiness } = await import("../actors/codex/restricted-participant.js");
@@ -116,38 +116,38 @@ export async function localCodexParticipantCheck(args) {
116
116
  }
117
117
  /**
118
118
  * The discovery and planning functions doctor's study checks use, loaded on first use as
119
- * labSetupChecks always loaded them, so they stay out of this module's static imports.
119
+ * studySetupChecks always loaded them, so they stay out of this module's static imports.
120
120
  */
121
121
  async function studyLoaders() {
122
122
  const discover = await import("./discover.js");
123
123
  const plan = await import("./plan.js");
124
124
  return {
125
- listStudies: discover.listLabManifests,
126
- resolveStudy: discover.resolveLabManifest,
127
- resolveDryRun: plan.resolveLabDryRun,
125
+ listStudies: discover.listStudyManifests,
126
+ resolveStudy: discover.resolveStudyManifest,
127
+ resolveDryRun: plan.resolveStudyDryRun,
128
128
  routeOf: plan.routeOf,
129
129
  };
130
130
  }
131
131
  /**
132
132
  * Setup checks only: no model turn, browser or desktop creation. CLI startup may use the network.
133
- * `keys` are the keys a live run requires. `reads` are the provider keys the lab is known to read,
134
- * required or not; it is undefined when that is unknown: the lab does not plan, or a declared
133
+ * `keys` are the keys a live run requires. `reads` are the provider keys the study is known to read,
134
+ * required or not; it is undefined when that is unknown: the study does not plan, or a declared
135
135
  * scorer's host code may read any key.
136
136
  */
137
- export async function labSetupChecks(args) {
137
+ export async function studySetupChecks(args) {
138
138
  const { resolveStudy, resolveDryRun, routeOf } = await studyLoaders();
139
- const resolved = await resolveStudy(args.cwd, args.lab);
139
+ const resolved = await resolveStudy(args.cwd, args.study);
140
140
  if (!resolved.ok)
141
141
  return {
142
142
  desktop: false,
143
143
  keys: [],
144
- checks: [{ name: "lab", ok: false, message: resolved.error.message }],
144
+ checks: [{ name: "study", ok: false, message: resolved.error.message }],
145
145
  };
146
146
  const config = resolved.config, route = routeOf(config);
147
147
  const dryRun = resolveDryRun(config, undefined, true) === true;
148
148
  const checks = [
149
149
  {
150
- name: "lab route",
150
+ name: "study route",
151
151
  ok: true,
152
152
  message: `${config.id}: ${config.actors[0]?.type ?? "synthetic"} / ${route} / ${dryRun ? "dry-run (no live participant)" : "live"}`,
153
153
  },
@@ -172,7 +172,7 @@ export async function labSetupChecks(args) {
172
172
  const keys = requiredKeys(requirements, args.keyPresent);
173
173
  // This flag controls the hosted desktop SDK check as well as its API key.
174
174
  const desktop = keys.includes("E2B_API_KEY");
175
- const local = isLocalBrowserLab(config);
175
+ const local = isLocalBrowserStudy(config);
176
176
  // One account check, shared by the local participant row and the Codex analysis row.
177
177
  let accountReadiness;
178
178
  const checkAccount = () => (accountReadiness ??= (args.codexAnalysisReadiness ?? codexAccountReadiness)(args.env).catch(() => ({ ready: false, errorCode: "codex_unavailable" })));
@@ -342,8 +342,8 @@ function checkScope(analysis) {
342
342
  }
343
343
  /**
344
344
  * The ids of the project's labs that need each provider key for a live run, from the same plan
345
- * `doctor --lab` reads. Each listed manifest resolves by its path, since a file name need not match
346
- * the id inside. A lab that runs dry, that the plain CLI cannot run, or that does not plan needs
345
+ * `doctor --study` reads. Each listed manifest resolves by its path, since a file name need not match
346
+ * the id inside. A study that runs dry, that the plain CLI cannot run, or that does not plan needs
347
347
  * none.
348
348
  */
349
349
  export async function studiesByRequiredKey(cwd, keyPresent) {
@@ -364,16 +364,16 @@ export async function studiesByRequiredKey(cwd, keyPresent) {
364
364
  return new Map([...users].map(([key, ids]) => [key, [...ids]]));
365
365
  }
366
366
  /**
367
- * The lab planned with no run options, so its own scenario mode decides dry or live. Doctor and the
367
+ * The study planned with no run options, so its own scenario mode decides dry or live. Doctor and the
368
368
  * TUI read a live run's keys and subject env from this plan's requirements.
369
369
  */
370
370
  export async function planCliRun(config, cwd) {
371
- return (await import("./plan.js")).planLab(config, { cwd });
371
+ return (await import("./plan.js")).planStudy(config, { cwd });
372
372
  }
373
373
  function unsupportedCliRoute(config, route) {
374
374
  if (config.subject.source === "local-app")
375
375
  return "local-app needs a caller-supplied executor and provider through the library API; the plain CLI cannot run it.";
376
376
  if (route === "preview")
377
- return "This route only creates synthetic evidence. Use first-run in dry-run mode or a supported live lab.";
377
+ return "This route only creates synthetic evidence. Use first-run in dry-run mode or a supported live study.";
378
378
  return undefined;
379
379
  }
@@ -20,7 +20,7 @@ export declare function studyFileStem(name: string): string | undefined;
20
20
  /**
21
21
  * The files that already use `stem` in any of the six directories, other than `except`, which is
22
22
  * the file the writer is about to replace. `exists` reads through the writer's own contained
23
- * filesystem checks. A writer skips or refuses when the result is not empty, so no write creates
24
- * the collision discovery reports.
23
+ * filesystem checks. A writer skips or refuses when the result is not empty, so no write leaves
24
+ * two files for one study name.
25
25
  */
26
26
  export declare function otherStudyFiles(stem: string, exists: (relativePath: string) => Promise<boolean>, except?: string): Promise<string[]>;
@@ -1,6 +1,7 @@
1
- // Where study files live. Discovery reads the three studies/ directories first, then the three labs/
2
- // directories they replace. A name may live in one family or the other, never both, so every writer
3
- // checks a name against all six directories before it writes.
1
+ // Where study files live. Discovery reads the three studies/ directories, and looks in the three
2
+ // labs/ directories they replace only to refuse a file there with its fix. migrate reads all six.
3
+ // Every writer checks a name against all six before it writes, so a new file never shadows another
4
+ // study or takes the name migrate needs to move a labs/ file.
4
5
  import path from "node:path";
5
6
  /** The six directories, in resolution order. */
6
7
  export const STUDY_DIRECTORIES = [
@@ -28,8 +29,8 @@ export function studyFileStem(name) {
28
29
  /**
29
30
  * The files that already use `stem` in any of the six directories, other than `except`, which is
30
31
  * the file the writer is about to replace. `exists` reads through the writer's own contained
31
- * filesystem checks. A writer skips or refuses when the result is not empty, so no write creates
32
- * the collision discovery reports.
32
+ * filesystem checks. A writer skips or refuses when the result is not empty, so no write leaves
33
+ * two files for one study name.
33
34
  */
34
35
  export async function otherStudyFiles(stem, exists, except) {
35
36
  const found = [];
@@ -18,9 +18,9 @@ export declare const starterFiles: StarterFile[];
18
18
  export declare const runtimeDirectories: RuntimeDirectory[];
19
19
  export declare const humanishScripts: Record<string, string>;
20
20
  /**
21
- * The starter files, with the live lab written for the brain this machine can use.
21
+ * The starter files, with the live study written for the brain this machine can use.
22
22
  *
23
- * `local-agent` is not a variant of the lab so much as a different participant: on a machine with
23
+ * `local-agent` is not a variant of the study so much as a different participant: on a machine with
24
24
  * a signed-in Codex and no provider key, the study runs with the operator's own agent and needs
25
25
  * only E2B. Writing the other one there would hand someone homework instead of a first run.
26
26
  */