humanish 0.108.0 → 0.109.1

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 (461) hide show
  1. package/ARCHITECTURE.md +58 -59
  2. package/CHANGELOG.md +22 -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/migrate.js +15 -4
  57. package/dist/cli/commands/observe.d.ts +0 -1
  58. package/dist/cli/commands/observe.js +0 -15
  59. package/dist/cli/commands/run-command.d.ts +2 -2
  60. package/dist/cli/commands/run-command.js +3 -3
  61. package/dist/cli/commands/runs.js +9 -7
  62. package/dist/cli/commands/setup.js +5 -7
  63. package/dist/cli/commands/study-format.d.ts +9 -0
  64. package/dist/cli/commands/{lab-format.js → study-format.js} +5 -5
  65. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  66. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +12 -12
  67. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  68. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  69. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  70. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +3 -3
  71. package/dist/cli/commands/study-route-run.d.ts +19 -0
  72. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  73. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  74. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  75. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  76. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +7 -7
  77. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  78. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  79. package/dist/cli/commands/study-run.d.ts +9 -0
  80. package/dist/cli/commands/{lab-run.js → study-run.js} +34 -34
  81. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +5 -5
  82. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +1 -1
  83. package/dist/cli/commands/study.js +13 -49
  84. package/dist/cli/commands/tui.js +12 -12
  85. package/dist/cli/commands/watch.js +30 -65
  86. package/dist/cli/deprecations.d.ts +1 -13
  87. package/dist/cli/deprecations.js +0 -30
  88. package/dist/cli/doctor.d.ts +3 -3
  89. package/dist/cli/doctor.js +16 -16
  90. package/dist/cli/first-run-path.d.ts +4 -4
  91. package/dist/cli/first-run-path.js +7 -7
  92. package/dist/cli/io.d.ts +3 -3
  93. package/dist/cli/io.js +2 -2
  94. package/dist/cli/observer-follow.d.ts +2 -2
  95. package/dist/cli/observer-follow.js +2 -2
  96. package/dist/cli/orientation.d.ts +4 -4
  97. package/dist/cli/orientation.js +58 -20
  98. package/dist/cli/program.js +3 -4
  99. package/dist/cli/telemetry.d.ts +1 -1
  100. package/dist/cli/telemetry.js +14 -20
  101. package/dist/comms/catch-host.d.ts +1 -1
  102. package/dist/comms/catch-host.js +3 -3
  103. package/dist/comms/connections.d.ts +1 -1
  104. package/dist/comms/connections.js +2 -2
  105. package/dist/comms/external-evidence.d.ts +5 -5
  106. package/dist/comms/external-evidence.js +4 -3
  107. package/dist/comms/fake-inbox.d.ts +2 -2
  108. package/dist/comms/fake-inbox.js +2 -2
  109. package/dist/comms/receiving-runtime.d.ts +4 -4
  110. package/dist/comms/sandbox-catch.d.ts +2 -2
  111. package/dist/comms/sandbox-catch.js +2 -2
  112. package/dist/comms/setup.d.ts +2 -2
  113. package/dist/comms/setup.js +29 -32
  114. package/dist/evidence/redaction.d.ts +11 -0
  115. package/dist/evidence/redaction.js +43 -0
  116. package/dist/feedback/draft.js +2 -2
  117. package/dist/feedback/export-bundle.js +5 -4
  118. package/dist/feedback/export.js +3 -2
  119. package/dist/feedback/proof.d.ts +1 -1
  120. package/dist/feedback/proof.js +2 -2
  121. package/dist/guest/bootstrap.js +6 -6
  122. package/dist/guest/browser-tools.js +8 -8
  123. package/dist/guest/chromium-text.js +17 -17
  124. package/dist/guest/desktop-executor.d.ts +2 -2
  125. package/dist/guest/desktop-executor.js +20 -20
  126. package/dist/guest/desktop-keys.js +4 -4
  127. package/dist/guest/desktop-media.d.ts +2 -2
  128. package/dist/guest/desktop-media.js +16 -16
  129. package/dist/guest/desktop-native.js +10 -10
  130. package/dist/guest/runtime-desktop.js +2 -2
  131. package/dist/guest/runtime-processes.d.ts +2 -2
  132. package/dist/guest/runtime-processes.js +2 -2
  133. package/dist/guest/runtime.js +5 -5
  134. package/dist/index.d.ts +13 -15
  135. package/dist/index.js +6 -8
  136. package/dist/observer/artifact.d.ts +1 -1
  137. package/dist/observer/artifact.js +1 -1
  138. package/dist/observer/data.d.ts +1 -1
  139. package/dist/observer/library.d.ts +2 -0
  140. package/dist/observer/library.js +4 -1
  141. package/dist/observer/render.js +7 -1
  142. package/dist/observer/run-routes.d.ts +1 -0
  143. package/dist/observer/run-routes.js +37 -12
  144. package/dist/observer/serve.d.ts +1 -1
  145. package/dist/observer-app.html +1 -1
  146. package/dist/routes/computer-use/bundle-parts.js +3 -2
  147. package/dist/routes/computer-use/bundle.d.ts +2 -2
  148. package/dist/routes/computer-use/bundle.js +7 -6
  149. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +5 -5
  150. package/dist/routes/computer-use/e2b-desktop/comms.js +5 -4
  151. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +1 -1
  152. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  153. package/dist/routes/computer-use/e2b-desktop/prepare.js +3 -3
  154. package/dist/routes/computer-use/e2b-desktop/start.js +3 -4
  155. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  156. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -3
  157. package/dist/routes/computer-use/external-comms.d.ts +3 -3
  158. package/dist/routes/computer-use/fanout-bundle.js +11 -10
  159. package/dist/routes/computer-use/fanout-records.js +2 -2
  160. package/dist/routes/computer-use/in-process-desktop.js +1 -1
  161. package/dist/routes/computer-use/live-flush.d.ts +3 -3
  162. package/dist/routes/computer-use/live-phase.d.ts +2 -3
  163. package/dist/routes/computer-use/live-phase.js +3 -3
  164. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  165. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  166. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  167. package/dist/routes/computer-use/local-vm.js +2 -2
  168. package/dist/routes/computer-use/participant-desktop.d.ts +3 -3
  169. package/dist/routes/computer-use/participant-desktop.js +1 -1
  170. package/dist/routes/computer-use/participant-execution.js +1 -1
  171. package/dist/routes/computer-use/participant-model.js +3 -3
  172. package/dist/routes/computer-use/participant-prompt.d.ts +5 -5
  173. package/dist/routes/computer-use/participant-prompt.js +3 -3
  174. package/dist/routes/computer-use/participant-runs.d.ts +10 -10
  175. package/dist/routes/computer-use/participant-runs.js +14 -13
  176. package/dist/routes/computer-use/plan.d.ts +12 -12
  177. package/dist/routes/computer-use/plan.js +27 -27
  178. package/dist/routes/computer-use/preflight.d.ts +5 -5
  179. package/dist/routes/computer-use/preflight.js +5 -5
  180. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  181. package/dist/routes/computer-use/rerun-selection.js +3 -2
  182. package/dist/routes/computer-use/result.d.ts +4 -4
  183. package/dist/routes/computer-use/result.js +13 -12
  184. package/dist/routes/computer-use/route.d.ts +12 -12
  185. package/dist/routes/computer-use/route.js +19 -19
  186. package/dist/routes/computer-use/self-report.js +1 -1
  187. package/dist/routes/computer-use/setup.d.ts +22 -22
  188. package/dist/routes/computer-use/setup.js +15 -15
  189. package/dist/routes/computer-use/single-bundle.d.ts +4 -4
  190. package/dist/routes/computer-use/single-bundle.js +14 -13
  191. package/dist/routes/computer-use/subject-projection.d.ts +3 -3
  192. package/dist/routes/computer-use/types.d.ts +34 -34
  193. package/dist/routes/computer-use/types.js +3 -3
  194. package/dist/routes/preview.d.ts +6 -6
  195. package/dist/routes/preview.js +5 -5
  196. package/dist/routes/scripted/bundle.d.ts +6 -6
  197. package/dist/routes/scripted/bundle.js +10 -9
  198. package/dist/routes/scripted/plan.d.ts +7 -7
  199. package/dist/routes/scripted/plan.js +6 -6
  200. package/dist/routes/scripted/result.d.ts +3 -3
  201. package/dist/routes/scripted/result.js +9 -9
  202. package/dist/routes/scripted/route.d.ts +9 -9
  203. package/dist/routes/scripted/route.js +11 -11
  204. package/dist/routes/scripted/scenario.d.ts +1 -1
  205. package/dist/routes/scripted/scenario.js +3 -3
  206. package/dist/routes/scripted/setup.d.ts +6 -6
  207. package/dist/routes/scripted/setup.js +4 -4
  208. package/dist/routes/scripted/subject.d.ts +5 -5
  209. package/dist/routes/scripted/subject.js +3 -3
  210. package/dist/routes/scripted/surface-records.d.ts +1 -1
  211. package/dist/routes/scripted/surface-records.js +2 -2
  212. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  213. package/dist/routes/scripted/types.d.ts +17 -17
  214. package/dist/routes/scripted/types.js +1 -1
  215. package/dist/routes/shared-world/bundle-records.js +3 -3
  216. package/dist/routes/shared-world/bundle.js +15 -14
  217. package/dist/routes/shared-world/checkpoints.d.ts +3 -3
  218. package/dist/routes/shared-world/checkpoints.js +1 -1
  219. package/dist/routes/shared-world/comms.d.ts +9 -9
  220. package/dist/routes/shared-world/comms.js +6 -5
  221. package/dist/routes/shared-world/participant-specs.d.ts +3 -3
  222. package/dist/routes/shared-world/participant-specs.js +7 -7
  223. package/dist/routes/shared-world/plan.d.ts +9 -9
  224. package/dist/routes/shared-world/plan.js +9 -9
  225. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  226. package/dist/routes/shared-world/provisioned.js +4 -4
  227. package/dist/routes/shared-world/result.d.ts +6 -6
  228. package/dist/routes/shared-world/result.js +11 -10
  229. package/dist/routes/shared-world/route.d.ts +11 -11
  230. package/dist/routes/shared-world/route.js +19 -19
  231. package/dist/routes/shared-world/setup.d.ts +13 -13
  232. package/dist/routes/shared-world/setup.js +19 -19
  233. package/dist/routes/shared-world/types.d.ts +27 -27
  234. package/dist/routes/terminal/adapter.d.ts +2 -2
  235. package/dist/routes/terminal/adapter.js +4 -4
  236. package/dist/routes/terminal/bundle.d.ts +11 -11
  237. package/dist/routes/terminal/bundle.js +12 -12
  238. package/dist/routes/terminal/credentials.d.ts +4 -4
  239. package/dist/routes/terminal/credentials.js +5 -5
  240. package/dist/routes/terminal/dry-run.d.ts +4 -4
  241. package/dist/routes/terminal/dry-run.js +9 -9
  242. package/dist/routes/terminal/ledger.d.ts +2 -2
  243. package/dist/routes/terminal/lifetime.d.ts +1 -1
  244. package/dist/routes/terminal/lifetime.js +1 -1
  245. package/dist/routes/terminal/live-finish.d.ts +2 -2
  246. package/dist/routes/terminal/live-finish.js +7 -7
  247. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  248. package/dist/routes/terminal/live-sandbox.js +3 -2
  249. package/dist/routes/terminal/participant-text.js +2 -1
  250. package/dist/routes/terminal/persona.d.ts +2 -2
  251. package/dist/routes/terminal/persona.js +2 -2
  252. package/dist/routes/terminal/plan.d.ts +7 -7
  253. package/dist/routes/terminal/plan.js +5 -5
  254. package/dist/routes/terminal/result.d.ts +5 -5
  255. package/dist/routes/terminal/result.js +7 -7
  256. package/dist/routes/terminal/route.d.ts +9 -9
  257. package/dist/routes/terminal/route.js +14 -14
  258. package/dist/routes/terminal/session.d.ts +5 -5
  259. package/dist/routes/terminal/session.js +7 -7
  260. package/dist/routes/terminal/trace.d.ts +2 -2
  261. package/dist/routes/terminal/types.d.ts +24 -24
  262. package/dist/routes/terminal/types.js +2 -2
  263. package/dist/run/bundle.d.ts +7 -7
  264. package/dist/run/bundle.js +2 -2
  265. package/dist/run/costs.d.ts +23 -0
  266. package/dist/run/costs.js +72 -43
  267. package/dist/run/dry-run-inputs.d.ts +1 -1
  268. package/dist/run/dry-run-inputs.js +1 -1
  269. package/dist/run/dry-run.js +2 -2
  270. package/dist/run/outcomes.d.ts +1 -1
  271. package/dist/run/participant.d.ts +1 -1
  272. package/dist/run/preflight-receipts.js +1 -1
  273. package/dist/run/pricing.js +2 -2
  274. package/dist/run/projection.d.ts +32 -32
  275. package/dist/run/projection.js +44 -44
  276. package/dist/run/reclaim.d.ts +1 -1
  277. package/dist/run/reclaim.js +1 -1
  278. package/dist/run/results.d.ts +2 -2
  279. package/dist/run/run-cost.d.ts +53 -0
  280. package/dist/run/run-cost.js +105 -0
  281. package/dist/run/run-index-analysis.d.ts +15 -0
  282. package/dist/run/run-index-analysis.js +77 -0
  283. package/dist/run/run-index.d.ts +11 -1
  284. package/dist/run/run-index.js +63 -49
  285. package/dist/run/run.d.ts +3 -3
  286. package/dist/run/run.js +2 -2
  287. package/dist/run/shared-world-evidence.d.ts +1 -1
  288. package/dist/run/shared-world-shape.js +1 -1
  289. package/dist/run/stats.d.ts +3 -3
  290. package/dist/run/stats.js +14 -14
  291. package/dist/run/status.d.ts +10 -2
  292. package/dist/run/status.js +6 -3
  293. package/dist/run/streams.d.ts +2 -2
  294. package/dist/run/study-provenance.d.ts +4 -2
  295. package/dist/run/study-provenance.js +7 -4
  296. package/dist/run/study-result.d.ts +0 -5
  297. package/dist/run/study-result.js +1 -1
  298. package/dist/run-study.d.ts +112 -0
  299. package/dist/{run-lab.js → run-study.js} +52 -45
  300. package/dist/{lab → study}/adapter-extension.d.ts +8 -20
  301. package/dist/{lab → study}/adapter-extension.js +2 -14
  302. package/dist/{lab → study}/adapter-scorer-loader.d.ts +10 -10
  303. package/dist/{lab → study}/adapter-scorer-loader.js +3 -3
  304. package/dist/study/composition-rules.d.ts +7 -0
  305. package/dist/{lab → study}/composition-rules.js +12 -12
  306. package/dist/study/config.d.ts +15 -0
  307. package/dist/{lab → study}/config.js +37 -20
  308. package/dist/study/convert.d.ts +1 -1
  309. package/dist/study/convert.js +15 -15
  310. package/dist/{lab → study}/device-presets.d.ts +2 -2
  311. package/dist/{lab → study}/discover.d.ts +29 -23
  312. package/dist/{lab → study}/discover.js +97 -118
  313. package/dist/{lab → study}/doctor.d.ts +11 -11
  314. package/dist/{lab → study}/doctor.js +18 -18
  315. package/dist/study/files.d.ts +2 -2
  316. package/dist/study/files.js +6 -5
  317. package/dist/{lab → study}/init-templates.d.ts +2 -2
  318. package/dist/{lab → study}/init-templates.js +16 -11
  319. package/dist/{lab → study}/init.d.ts +1 -1
  320. package/dist/{lab → study}/init.js +7 -4
  321. package/dist/{lab → study}/keys.d.ts +2 -2
  322. package/dist/{lab → study}/keys.js +10 -10
  323. package/dist/study/migrate.d.ts +8 -3
  324. package/dist/study/migrate.js +60 -4
  325. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  326. package/dist/{lab → study}/parse/actors.js +5 -5
  327. package/dist/study/parse/comms.d.ts +12 -0
  328. package/dist/study/parse/execution.d.ts +19 -0
  329. package/dist/{lab → study}/parse/study-v3.d.ts +3 -5
  330. package/dist/{lab → study}/parse/study-v3.js +3 -3
  331. package/dist/{lab → study}/parse/subject-state.d.ts +8 -8
  332. package/dist/{lab → study}/parse/subject-state.js +4 -4
  333. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  334. package/dist/{lab → study}/parse/subject.js +8 -8
  335. package/dist/{lab → study}/parse/values.d.ts +2 -2
  336. package/dist/{lab → study}/persona-resolve.d.ts +4 -4
  337. package/dist/{lab → study}/persona-resolve.js +2 -2
  338. package/dist/{lab → study}/plan-base.d.ts +7 -7
  339. package/dist/{lab → study}/plan-base.js +1 -1
  340. package/dist/{lab → study}/plan-participants.d.ts +10 -10
  341. package/dist/{lab → study}/plan-participants.js +4 -4
  342. package/dist/{lab → study}/plan-types.d.ts +28 -28
  343. package/dist/{lab → study}/plan-types.js +2 -2
  344. package/dist/study/plan.d.ts +13 -0
  345. package/dist/{lab → study}/plan.js +20 -20
  346. package/dist/study/preflight-probes.d.ts +3 -0
  347. package/dist/{lab → study}/preflight-probes.js +9 -8
  348. package/dist/study/preflight-result.d.ts +8 -0
  349. package/dist/{lab → study}/preflight-result.js +3 -3
  350. package/dist/{lab → study}/preflight.d.ts +31 -31
  351. package/dist/{lab → study}/preflight.js +8 -8
  352. package/dist/{lab → study}/requirements.d.ts +3 -3
  353. package/dist/{lab → study}/requirements.js +1 -1
  354. package/dist/study/route-inputs.d.ts +28 -0
  355. package/dist/{lab → study}/route-inputs.js +1 -1
  356. package/dist/{lab → study}/routing.d.ts +12 -12
  357. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -10
  358. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +4 -4
  359. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +8 -17
  360. package/dist/study/run-study-homes.js +3 -0
  361. package/dist/study/run-study-options.d.ts +28 -0
  362. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +16 -15
  363. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +2 -2
  364. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  365. package/dist/{lab → study}/summary.d.ts +10 -10
  366. package/dist/{lab → study}/summary.js +15 -15
  367. package/dist/{lab → study}/tasks.d.ts +3 -3
  368. package/dist/{lab → study}/tasks.js +1 -1
  369. package/dist/{lab → study}/types.d.ts +104 -104
  370. package/dist/{lab → study}/types.js +1 -1
  371. package/dist/{lab → study}/validation.d.ts +19 -19
  372. package/dist/{lab → study}/validation.js +13 -13
  373. package/dist/{lab → study}/warnings.d.ts +4 -4
  374. package/dist/{lab → study}/warnings.js +1 -1
  375. package/dist/subject/clone.d.ts +6 -6
  376. package/dist/subject/clone.js +2 -2
  377. package/dist/subject/local-tree-archive.d.ts +2 -2
  378. package/dist/subject/local-tree-archive.js +3 -3
  379. package/dist/subject/local-tree.d.ts +3 -3
  380. package/dist/subject/runtime.js +2 -2
  381. package/dist/subject/serve.d.ts +4 -4
  382. package/dist/subject/state.d.ts +3 -3
  383. package/dist/subject/state.js +1 -1
  384. package/dist/subject/steps.d.ts +1 -1
  385. package/dist/subject/steps.js +1 -1
  386. package/dist/substrates/desktop-session.js +2 -2
  387. package/dist/substrates/detached.d.ts +1 -1
  388. package/dist/substrates/e2b/desktop-browser.d.ts +4 -4
  389. package/dist/substrates/e2b/desktop-browser.js +1 -1
  390. package/dist/substrates/e2b/desktop-cdp.d.ts +1 -1
  391. package/dist/substrates/e2b/desktop-cdp.js +1 -1
  392. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  393. package/dist/substrates/e2b/desktop-executor.js +12 -12
  394. package/dist/substrates/e2b/desktop-geometry.d.ts +1 -1
  395. package/dist/substrates/e2b/desktop-geometry.js +1 -1
  396. package/dist/substrates/e2b/desktop-media.d.ts +3 -3
  397. package/dist/substrates/e2b/lifetime.js +1 -1
  398. package/dist/substrates/e2b/sandbox.d.ts +3 -3
  399. package/dist/substrates/e2b/sandbox.js +1 -1
  400. package/dist/substrates/e2b/sdk.d.ts +1 -1
  401. package/dist/substrates/e2b/sdk.js +1 -1
  402. package/dist/substrates/local/runtime-config.d.ts +4 -4
  403. package/dist/substrates/local/runtime-config.js +4 -4
  404. package/dist/tui/contract.d.ts +8 -8
  405. package/dist/tui/contract.js +2 -2
  406. package/dist/tui/launch.d.ts +3 -3
  407. package/dist/tui/launch.js +22 -16
  408. package/dist/tui-app.js +139 -139
  409. package/dist/verify/subject.d.ts +1 -1
  410. package/dist/verify/subject.js +1 -1
  411. package/dist/verify/verify.js +2 -1
  412. package/docs/architecture/actor-contract.md +5 -5
  413. package/docs/architecture/browser-control.md +1 -1
  414. package/docs/architecture/external-public-shared-world.md +8 -7
  415. package/docs/architecture/github-feedback-loop.md +1 -1
  416. package/docs/architecture/task-protocol-support.md +1 -1
  417. package/docs/architecture/terminal-product-route.md +18 -18
  418. package/docs/contracts/adapter-fixtures.md +2 -2
  419. package/docs/contracts/errors.md +8 -8
  420. package/docs/contracts/run-bundle.md +6 -4
  421. package/docs/contracts/schemas.md +61 -42
  422. package/docs/contracts/study-analysis.md +4 -1
  423. package/docs/contracts/study-costs.md +17 -2
  424. package/examples/README.md +1 -1
  425. package/examples/scorer/scorer.mjs +3 -3
  426. package/package.json +2 -1
  427. package/skills/humanish/SKILL.md +8 -6
  428. package/skills/humanish/agents/openai.yaml +1 -1
  429. package/dist/cli/commands/lab-format.d.ts +0 -9
  430. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  431. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  432. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  433. package/dist/cli/commands/lab-run.d.ts +0 -9
  434. package/dist/lab/composition-rules.d.ts +0 -7
  435. package/dist/lab/config.d.ts +0 -7
  436. package/dist/lab/deprecated-fields.d.ts +0 -10
  437. package/dist/lab/deprecated-fields.js +0 -24
  438. package/dist/lab/parse/comms.d.ts +0 -12
  439. package/dist/lab/parse/execution.d.ts +0 -19
  440. package/dist/lab/plan.d.ts +0 -13
  441. package/dist/lab/preflight-probes.d.ts +0 -3
  442. package/dist/lab/preflight-result.d.ts +0 -8
  443. package/dist/lab/route-inputs.d.ts +0 -28
  444. package/dist/lab/run-lab-homes.js +0 -7
  445. package/dist/lab/run-lab-options.d.ts +0 -28
  446. package/dist/library-aliases.d.ts +0 -56
  447. package/dist/library-aliases.js +0 -22
  448. package/dist/run-lab.d.ts +0 -112
  449. /package/dist/{lab → study}/device-presets.js +0 -0
  450. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  451. /package/dist/{lab → study}/init-paths.js +0 -0
  452. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  453. /package/dist/{lab → study}/init-plan.js +0 -0
  454. /package/dist/{lab → study}/parse/comms.js +0 -0
  455. /package/dist/{lab → study}/parse/execution.js +0 -0
  456. /package/dist/{lab → study}/parse/values.js +0 -0
  457. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  458. /package/dist/{lab → study}/participant-assignment.js +0 -0
  459. /package/dist/{lab → study}/persona.d.ts +0 -0
  460. /package/dist/{lab → study}/persona.js +0 -0
  461. /package/dist/{lab → study}/routing.js +0 -0
@@ -4,7 +4,7 @@ import path from "node:path";
4
4
  import { probeKeySources, } from "../keys/key-resolution.js";
5
5
  import { nodeSupportsTui, terminalSurfaceMessage, TUI_BUNDLE_URL } from "../tui/contract.js";
6
6
  import { detectLocalAgents, localAgentDoctorMessage, NO_LOCAL_AGENT_MESSAGE, } from "../actors/local-agent/cli.js";
7
- import { labSetupChecks, studiesByRequiredKey } from "../lab/doctor.js";
7
+ import { studySetupChecks, studiesByRequiredKey, } from "../study/doctor.js";
8
8
  import { prepareSelectedOutputDirectory, } from "../run/contained-output.js";
9
9
  import { implicitProjectDirectoryExists, readImplicitProjectFile, validateCwd, } from "../run/project.js";
10
10
  const DOCTOR_SCHEMA = "humanish.doctor-result.v1";
@@ -65,12 +65,12 @@ export async function doctor(cwdInput, options = {}) {
65
65
  }
66
66
  const env = options.env ?? process.env;
67
67
  const agents = await detectLocalAgents({ ...options.localAgents, env });
68
- const { probes, receivingKey } = await probeDoctorKeys(cwd, env, options.lab, options.keyDeps);
68
+ const { probes, receivingKey } = await probeDoctorKeys(cwd, env, options.study, options.keyDeps);
69
69
  const keyPresent = (name) => probes.some((probe) => probe.name === name && probe.source !== null);
70
- const setup = options.lab
71
- ? await labSetupChecks({
70
+ const setup = options.study
71
+ ? await studySetupChecks({
72
72
  cwd,
73
- lab: options.lab,
73
+ study: options.study,
74
74
  env,
75
75
  agents,
76
76
  keyPresent,
@@ -79,7 +79,7 @@ export async function doctor(cwdInput, options = {}) {
79
79
  : { codexParticipantReadiness: options.codexParticipantReadiness }),
80
80
  })
81
81
  : undefined;
82
- // Without --lab, each key row names the labs that need it instead of failing.
82
+ // Without --study, each key row names the studies that need it instead of failing.
83
83
  const keyUsers = setup ? undefined : await studiesByRequiredKey(cwd, keyPresent);
84
84
  const checks = [
85
85
  ...(await projectChecks(projectRoot)),
@@ -195,7 +195,7 @@ async function desktopSdkCheck(setup) {
195
195
  });
196
196
  const version = present ? await installedDesktopSdkVersion() : undefined;
197
197
  const advisory = desktopSdkAdvisory(version);
198
- // Without --lab nothing selects a desktop route yet, so an absent SDK is advisory.
198
+ // Without --study nothing selects a desktop route yet, so an absent SDK is advisory.
199
199
  const advisoryOnly = !present && setup === undefined;
200
200
  return {
201
201
  name: "e2b desktop sdk",
@@ -236,13 +236,13 @@ function terminalSurfaceCheck() {
236
236
  }),
237
237
  };
238
238
  }
239
- /** Probes the live-run keys, plus the receiving-email key a real-comms lab names. */
240
- async function probeDoctorKeys(cwd, env, lab, keyDeps) {
239
+ /** Probes the live-run keys, plus the receiving-email key a real-comms study names. */
240
+ async function probeDoctorKeys(cwd, env, study, keyDeps) {
241
241
  const keyNames = new Set(["OPENAI_API_KEY", "E2B_API_KEY", "GH_TOKEN", "CODEX_API_KEY"]);
242
242
  let receivingKey = null;
243
- if (lab) {
244
- const { resolveLabManifest } = await import("../lab/discover.js");
245
- const resolved = await resolveLabManifest(cwd, lab);
243
+ if (study) {
244
+ const { resolveStudyManifest } = await import("../study/discover.js");
245
+ const resolved = await resolveStudyManifest(cwd, study);
246
246
  if (resolved.ok && resolved.config.comms?.email?.kind === "real") {
247
247
  const { receivingRequiredKey } = await import("../comms/setup.js");
248
248
  receivingKey = await receivingRequiredKey(cwd, resolved.config.comms.email.connection);
@@ -284,7 +284,7 @@ function studyList(studies) {
284
284
  * chain a live command resolves (env/--env-file, project overlay, vendor stores, the
285
285
  * humanish user store). Values never appear; sources and fill commands do.
286
286
  *
287
- * With --lab, a key the selected route requires fails when missing. Without it, `keyUsers` maps
287
+ * With --study, a key the selected route requires fails when missing. Without it, `keyUsers` maps
288
288
  * each key to the project's labs that need it, and a key row never fails: a missing key one of
289
289
  * them needs is a note.
290
290
  */
@@ -303,12 +303,12 @@ function keyChecks(probes, receivingKey, setup, keyUsers) {
303
303
  ...(present || usedBy === undefined ? {} : { status: "note" }),
304
304
  message: present
305
305
  ? `supplied by ${probe.source}; presence only, validity not tested${usedBy ? `; ${usedBy}` : ""}`
306
- : `missing; ${usedBy ?? "not used by any lab in this project"}; ${hint}`,
306
+ : `missing; ${usedBy ?? "not used by any study in this project"}; ${hint}`,
307
307
  };
308
308
  }
309
309
  // GH_TOKEN is needed only for private clone subjects, so its absence is informational.
310
310
  const required = setup.keys.includes(probe.name);
311
- // A key the lab is known not to read says so, so a present but unused key does not read as
311
+ // A key the study is known not to read says so, so a present but unused key does not read as
312
312
  // one the run will use.
313
313
  const unused = setup.reads !== undefined && !setup.reads.has(probe.name);
314
314
  return {
@@ -316,7 +316,7 @@ function keyChecks(probes, receivingKey, setup, keyUsers) {
316
316
  ok: present || !required,
317
317
  message: present
318
318
  ? unused
319
- ? `present (${probe.source}), not used by this lab`
319
+ ? `present (${probe.source}), not used by this study`
320
320
  : `supplied by ${probe.source}; presence only, validity not tested`
321
321
  : required
322
322
  ? `missing from every source; ${hint}`
@@ -30,17 +30,17 @@ export interface FirstRunEnvironment {
30
30
  }
31
31
  export type FirstRunActor = "openai-computer-use" | "local-agent";
32
32
  /**
33
- * Which brain the starter live lab should be written for. A machine with a signed-in coding agent
34
- * and no provider key can still do a real live run; writing the lab for the credential the
33
+ * Which brain the starter live study should be written for. A machine with a signed-in coding agent
34
+ * and no provider key can still do a real live run; writing the study for the credential the
35
35
  * operator doesn't have is how a starter file becomes homework.
36
36
  */
37
37
  export declare function starterActorFor(env: FirstRunEnvironment): FirstRunActor;
38
38
  /**
39
- * The `localAgent` a local-agent starter lab names. Left out, the lab would default to Codex and
39
+ * The `localAgent` a local-agent starter study names. Left out, the study would default to Codex and
40
40
  * refuse to run on a machine where only Claude Code is signed in.
41
41
  */
42
42
  export declare function starterLocalAgentFor(env: FirstRunEnvironment): LocalAgentId | undefined;
43
- /** Hosts the local browser lab runs on: Linux x64 and Apple Silicon Macs. */
43
+ /** Hosts that run local browser studies: Linux x64 and Apple Silicon Macs. */
44
44
  export declare function supportsLocalBrowser(platform: NodeJS.Platform | undefined, arch: string | undefined): boolean;
45
45
  export interface FirstRunStep {
46
46
  /** The exact command to run. */
@@ -1,6 +1,6 @@
1
1
  // What a person, or the coding agent setting humanish up for them, should do next.
2
2
  //
3
- // Why: `humanish init` wrote twenty files and stopped. The only lab that could actually run was a
3
+ // Why: `humanish init` wrote twenty files and stopped. The only study that could actually run was a
4
4
  // $0 dry run; the two live ones were templates with `your-org/your-app` in them, so the first live
5
5
  // run a newcomer tried could not succeed no matter what credentials they had. Three independent
6
6
  // sources reached the same place: a participant in our own TUI study walked to the Start row and
@@ -13,8 +13,8 @@
13
13
  // command, and names the one that will actually work on this machine, because a next step that
14
14
  // fails is worse than none.
15
15
  /**
16
- * Which brain the starter live lab should be written for. A machine with a signed-in coding agent
17
- * and no provider key can still do a real live run; writing the lab for the credential the
16
+ * Which brain the starter live study should be written for. A machine with a signed-in coding agent
17
+ * and no provider key can still do a real live run; writing the study for the credential the
18
18
  * operator doesn't have is how a starter file becomes homework.
19
19
  */
20
20
  export function starterActorFor(env) {
@@ -27,7 +27,7 @@ function preferredAgent(env) {
27
27
  return env.localAgents.find((agent) => agent.id === "codex") ?? env.localAgents[0];
28
28
  }
29
29
  /**
30
- * The `localAgent` a local-agent starter lab names. Left out, the lab would default to Codex and
30
+ * The `localAgent` a local-agent starter study names. Left out, the study would default to Codex and
31
31
  * refuse to run on a machine where only Claude Code is signed in.
32
32
  */
33
33
  export function starterLocalAgentFor(env) {
@@ -38,7 +38,7 @@ export function starterLocalAgentFor(env) {
38
38
  * a dev-dependency install puts no \`humanish\` on \`PATH\`, so a bare name can reach a stale global one.
39
39
  */
40
40
  const HUMANISH = "npx humanish";
41
- /** Hosts the local browser lab runs on: Linux x64 and Apple Silicon Macs. */
41
+ /** Hosts that run local browser studies: Linux x64 and Apple Silicon Macs. */
42
42
  export function supportsLocalBrowser(platform, arch) {
43
43
  return (platform === "linux" && arch === "x64") || (platform === "darwin" && arch === "arm64");
44
44
  }
@@ -99,7 +99,7 @@ export function firstRunSteps(env) {
99
99
  }
100
100
  steps.push({
101
101
  command: `${HUMANISH} keys set openai`,
102
- why: "openai-computer-use needs an API key; to use a Codex or Claude Code login instead, sign in and change the lab to actors[0].type: local-agent" +
102
+ why: "openai-computer-use needs an API key; to use a Codex or Claude Code login instead, sign in and change the study to actors[0].type: local-agent" +
103
103
  localUnavailable,
104
104
  });
105
105
  return steps;
@@ -144,7 +144,7 @@ export function agentsSection() {
144
144
  " bundles into an issue; `humanish feedback issue` writes a redacted, share-safe draft.",
145
145
  "- `humanish tui` is for people and refuses to run in an agent session. Use the `--json`",
146
146
  " commands above instead, and tell the person you are working for that `humanish tui` exists.",
147
- "- A live run spends money. `execution.caps.maxUsd` in each lab caps estimated model spend: the run",
147
+ "- A live run spends money. `execution.caps.maxUsd` in each study caps estimated model spend: the run",
148
148
  " stops before its next request once the estimate passes it, so the last request can go over, and",
149
149
  " hosted desktop time is billed on top. Do not raise it without asking the person you are working for.",
150
150
  "",
package/dist/cli/io.d.ts CHANGED
@@ -17,7 +17,7 @@ export declare const ENV_FILE_OPTION_DESCRIPTION = "Load unset variables from th
17
17
  export declare const PORT_OPTION_DESCRIPTION = "Port to listen on at 127.0.0.1.";
18
18
  /** `--port` for a loopback server whose default, 0, lets the OS pick a free port. */
19
19
  export declare function freePortOption(): Option;
20
- export interface LabCommandOptions {
20
+ export interface StudyCommandOptions {
21
21
  count?: string | undefined;
22
22
  cwd: string;
23
23
  detach?: boolean | undefined;
@@ -50,7 +50,7 @@ export declare function applyEnvFileOption(args: {
50
50
  io: CliIo;
51
51
  env?: NodeJS.ProcessEnv;
52
52
  onDiscovered?: (names: string[]) => void;
53
- /** False for the lab-running commands, which discover only once the lab resolves to live. */
53
+ /** False for the study-running commands, which discover only once the study resolves to live. */
54
54
  discoverKeys?: boolean;
55
55
  }): Promise<boolean>;
56
56
  /**
@@ -67,7 +67,7 @@ export declare function discoverCliKeys(args: {
67
67
  /** Announce only the fills of these names; every key is still filled. Undefined announces all. */
68
68
  announced?: ReadonlySet<string>;
69
69
  }): Promise<void>;
70
- export declare function parseLabCount(value: string | undefined, fallback: number): number | null;
70
+ export declare function parseStudyCount(value: string | undefined, fallback: number): number | null;
71
71
  export declare function parseParticipantIds(value: string | undefined): string[];
72
72
  /** An error as a result carries it. A result with only a message, such as keys or comms, has no code. */
73
73
  export interface CliError {
package/dist/cli/io.js CHANGED
@@ -106,7 +106,7 @@ export async function discoverCliKeys(args) {
106
106
  // Discovery must never break a command; a rung that fails to read is a miss, not an error.
107
107
  }
108
108
  }
109
- export function parseLabCount(value, fallback) {
109
+ export function parseStudyCount(value, fallback) {
110
110
  return value === undefined ? fallback : parsePositiveInteger(value);
111
111
  }
112
112
  export function parseParticipantIds(value) {
@@ -126,7 +126,7 @@ export function parseParticipantIds(value) {
126
126
  }
127
127
  /**
128
128
  * The command to run next, by code. A code is listed only when its messages do not already name a
129
- * command: the run-not-found and lab-less run messages do.
129
+ * command: the run-not-found and missing-study messages do.
130
130
  */
131
131
  const NEXT_COMMAND = {
132
132
  HUMANISH_STUDY_NOT_FOUND: "humanish study list",
@@ -1,7 +1,7 @@
1
1
  import { Command } from "commander";
2
2
  import type { ObserverResult, ObserverServer } from "../observer/render.js";
3
3
  import type { ExposureRequest } from "../observer/exposure.js";
4
- import { type CliIo, type LabCommandOptions, type HumanOutput } from "./io.js";
4
+ import { type CliIo, type StudyCommandOptions, type HumanOutput } from "./io.js";
5
5
  /** How a command shows an Observer, decided before the run it shows starts. */
6
6
  export interface ObserverPlan {
7
7
  port: number;
@@ -52,5 +52,5 @@ export declare function watchExposeRequested(o: {
52
52
  allowDomain?: string[] | undefined;
53
53
  publicUrl?: string | undefined;
54
54
  }): boolean;
55
- export declare function exposureRequestFromOptions(options: LabCommandOptions): ExposureRequest;
55
+ export declare function exposureRequestFromOptions(options: StudyCommandOptions): ExposureRequest;
56
56
  export {};
@@ -133,7 +133,7 @@ export function exitCodeForSignal(signal) {
133
133
  }
134
134
  }
135
135
  // True when any tunnel-edge exposure flag is present (not --safe, which is an orthogonal filter).
136
- // Callers refuse exposure with it on the non-lab watch path and on non-computer-use routes, where
136
+ // Callers refuse exposure with it on the watch path without a study and on non-computer-use routes, where
137
137
  // there is no live desktop to stream.
138
138
  export function watchExposeRequested(o) {
139
139
  return (o.expose === true ||
@@ -144,7 +144,7 @@ export function watchExposeRequested(o) {
144
144
  (o.allowDomain?.length ?? 0) > 0 ||
145
145
  o.publicUrl !== undefined);
146
146
  }
147
- // Map LabCommandOptions onto the shared exposure validator input.
147
+ // Map StudyCommandOptions onto the shared exposure validator input.
148
148
  export function exposureRequestFromOptions(options) {
149
149
  return {
150
150
  expose: options.expose === true,
@@ -3,10 +3,10 @@ export interface OrientationState {
3
3
  schema: typeof ORIENTATION_SCHEMA;
4
4
  /** Whether this project has a committed `humanish/` source plane. */
5
5
  initialized: boolean;
6
- /** Committed + gitignored lab manifests discovered in this project. */
7
- labCount: number;
8
- /** Ids of a few labs worth naming in a suggestion. */
9
- labIds: string[];
6
+ /** Committed and gitignored study files found in this project. */
7
+ studyCount: number;
8
+ /** Ids of a few studies worth naming in a suggestion. */
9
+ studyIds: string[];
10
10
  /** Runs already on disk, and the most recent one if there is one. */
11
11
  runCount: number;
12
12
  latestRunId?: string;
@@ -12,8 +12,9 @@
12
12
  // Both audiences are served by the same data (docs/principles/three-roles.md). A human on a
13
13
  // terminal gets prose and an offer to set things up; an agent gets the same facts as stable text,
14
14
  // or as JSON with `--json`. Neither is a special case of the other bolted on afterwards.
15
- import { listLabManifests } from "../lab/discover.js";
15
+ import { listStudyManifests } from "../study/discover.js";
16
16
  import { listRuns } from "../run/stored-runs.js";
17
+ import { plural } from "../run/text.js";
17
18
  import { supportsLocalBrowser } from "./first-run-path.js";
18
19
  import { PRODUCT_SENTENCE } from "./product-sentence.js";
19
20
  export const ORIENTATION_SCHEMA = "humanish.orientation.v1";
@@ -22,26 +23,39 @@ export const ORIENTATION_SCHEMA = "humanish.orientation.v1";
22
23
  * a provider: bare invocation must not be able to spend money or mutate a repo.
23
24
  */
24
25
  export async function readOrientation(cwd, host = process) {
25
- const [labs, runs] = await Promise.all([
26
- listLabManifests(cwd).catch(() => undefined),
26
+ const [found, runs] = await Promise.all([
27
+ listStudyManifests(cwd).catch(() => undefined),
27
28
  listRuns(cwd).catch(() => undefined),
28
29
  ]);
29
- const labIds = (labs?.studies ?? [])
30
- .map((lab) => lab.id)
30
+ const studyIds = (found?.studies ?? [])
31
+ .map((study) => study.id)
31
32
  .filter((id) => typeof id === "string");
32
33
  const runIds = (runs?.runs ?? [])
33
34
  .map((run) => run.runId)
34
35
  .filter((id) => typeof id === "string");
35
36
  const latest = typeof runs?.latest === "string" ? runs.latest : runIds[0];
36
- const initialized = (labs?.studies ?? []).some((lab) => lab.origin === "committed") || labIds.length > 0;
37
+ const retiredFiles = found?.retired ?? [];
38
+ const retired = {
39
+ v2: retiredFiles.filter((file) => file.code === "HUMANISH_STUDY_V2_UNSUPPORTED").length,
40
+ moved: retiredFiles.filter((file) => file.code === "HUMANISH_STUDY_RETIRED_DIRECTORY").length,
41
+ };
42
+ const initialized = (found?.studies ?? []).some((study) => study.origin === "committed") ||
43
+ studyIds.length > 0 ||
44
+ retiredFiles.length > 0;
37
45
  return {
38
46
  schema: ORIENTATION_SCHEMA,
39
47
  initialized,
40
- labCount: labIds.length,
41
- labIds: labIds.slice(0, 3),
48
+ studyCount: studyIds.length,
49
+ studyIds: studyIds.slice(0, 3),
42
50
  runCount: runIds.length,
43
51
  ...(latest === undefined ? {} : { latestRunId: latest }),
44
- nextCommands: nextCommandsFor({ initialized, labIds, hasRun: runIds.length > 0, host }),
52
+ nextCommands: nextCommandsFor({
53
+ initialized,
54
+ studyIds,
55
+ retired,
56
+ hasRun: runIds.length > 0,
57
+ host,
58
+ }),
45
59
  };
46
60
  }
47
61
  /**
@@ -49,6 +63,30 @@ export async function readOrientation(cwd, host = process) {
49
63
  * is commander's help, which nobody reads.
50
64
  */
51
65
  function nextCommandsFor(args) {
66
+ const { v2, moved } = args.retired;
67
+ const fixes = [
68
+ ...(v2 === 0
69
+ ? []
70
+ : [
71
+ {
72
+ command: "humanish migrate --dry-run",
73
+ why: `${plural(v2, "study file")} ${v2 === 1 ? "uses" : "use"} humanish.lab.v2, which humanish no longer reads; this lists the conversion, and humanish migrate writes it`,
74
+ },
75
+ ]),
76
+ ...(moved === 0
77
+ ? []
78
+ : [
79
+ {
80
+ command: "humanish study list",
81
+ why: `${plural(moved, "study file")} ${moved === 1 ? "is" : "are"} in a labs/ directory, which humanish no longer reads; this names each one and the studies/ directory to move it to`,
82
+ },
83
+ ]),
84
+ ];
85
+ // A fix that is already `humanish study list` replaces the plain suggestion of the same command.
86
+ const named = new Set(fixes.map((fix) => fix.command));
87
+ return [...fixes, ...nextCommandsForStudies(args).filter((next) => !named.has(next.command))];
88
+ }
89
+ function nextCommandsForStudies(args) {
52
90
  const dryRun = {
53
91
  command: "humanish run first-run",
54
92
  why: "a dry run: no browser or model runs, no keys, no spend",
@@ -57,31 +95,31 @@ function nextCommandsFor(args) {
57
95
  return [
58
96
  {
59
97
  command: "humanish init --yes",
60
- why: "write starter labs, personas and an AGENTS.md (--dry-run lists every file first)",
98
+ why: "write starter studies, personas and an AGENTS.md (--dry-run lists every file first)",
61
99
  },
62
100
  dryRun,
63
101
  ];
64
102
  }
65
- // The starter live lab this host can run. The other starter labs are templates whose subject
103
+ // The starter live study this host can run. The other starter studies are templates whose subject
66
104
  // still names your-org/your-app, so they are never suggested.
67
- const liveLab = (supportsLocalBrowser(args.host.platform, args.host.arch)
105
+ const liveStudy = (supportsLocalBrowser(args.host.platform, args.host.arch)
68
106
  ? ["local-browser", "try-live"]
69
- : ["try-live"]).find((id) => args.labIds.includes(id));
107
+ : ["try-live"]).find((id) => args.studyIds.includes(id));
70
108
  if (!args.hasRun) {
71
109
  return [
72
110
  dryRun,
73
- liveLab === undefined
111
+ liveStudy === undefined
74
112
  ? { command: "humanish study list", why: "see the studies this project declares" }
75
113
  : {
76
- command: `humanish doctor --study ${liveLab}`,
77
- why: `check what the ${liveLab} study still needs before a live run`,
114
+ command: `humanish doctor --study ${liveStudy}`,
115
+ why: `check what the ${liveStudy} study still needs before a live run`,
78
116
  },
79
117
  ];
80
118
  }
81
119
  return [
82
- ...(liveLab === undefined
120
+ ...(liveStudy === undefined
83
121
  ? []
84
- : [{ command: `humanish run ${liveLab}`, why: "run a real participant against an app" }]),
122
+ : [{ command: `humanish run ${liveStudy}`, why: "run a real participant against an app" }]),
85
123
  {
86
124
  command: "humanish verify --run latest",
87
125
  why: "check the last run's evidence and public-safety gates",
@@ -99,13 +137,13 @@ export function formatOrientationHuman(state) {
99
137
  lines.push("This project is not set up yet.");
100
138
  }
101
139
  else {
102
- const labs = state.labCount === 1 ? "1 lab" : `${state.labCount} labs`;
140
+ const studies = state.studyCount === 1 ? "1 study" : `${state.studyCount} studies`;
103
141
  const runs = state.runCount === 0
104
142
  ? "no runs yet"
105
143
  : state.runCount === 1
106
144
  ? "1 run"
107
145
  : `${state.runCount} runs`;
108
- lines.push(`This project has ${labs} and ${runs}${state.latestRunId ? ` (latest: ${state.latestRunId})` : ""}.`);
146
+ lines.push(`This project has ${studies} and ${runs}${state.latestRunId ? ` (latest: ${state.latestRunId})` : ""}.`);
109
147
  }
110
148
  lines.push("");
111
149
  for (const next of state.nextCommands) {
@@ -12,7 +12,7 @@ import { registerCommsCommands } from "./commands/comms.js";
12
12
  import { registerFeedbackCommands } from "./commands/feedback.js";
13
13
  import { registerStudyCommands } from "./commands/study.js";
14
14
  import { registerMigrateCommand } from "./commands/migrate.js";
15
- import { registerObserveCommand, registerServeCommand } from "./commands/observe.js";
15
+ import { registerObserveCommand } from "./commands/observe.js";
16
16
  import { registerCleanupCommand, registerExportCommand, registerReclaimCommand, registerReviewCommand, registerRunCommand, registerRunsCommand, registerRuntimeCommands, registerStatsCommand, registerVerifyCommand, } from "./commands/runs.js";
17
17
  import { registerDoctorCommand, registerInitCommand, registerKeysCommand, registerTelemetryCommand, } from "./commands/setup.js";
18
18
  import { defaultTuiRuntime, registerTuiCommand } from "./commands/tui.js";
@@ -73,7 +73,7 @@ async function recordCommandTelemetry(command, ok, durationMs, exitCode) {
73
73
  event: "cli_command",
74
74
  anonymousId: state.anonymousId,
75
75
  version: CLI_VERSION,
76
- // The study facts (mode, outcome, starter lab, brain, our own error code) were read off the
76
+ // The study facts (mode, outcome, starter study, brain, our own error code) were read off the
77
77
  // result document when it was written; see writeResult. Without them every `run` event
78
78
  // looked the same whether it was a dry run or the first live study that ever worked.
79
79
  properties: {
@@ -116,7 +116,7 @@ function reportActiveHandles(command, io) {
116
116
  io.writeErr(`humanish debug: active resources after \`${commandPath(command) || "humanish"}\` settled: ${summary}\n`);
117
117
  }).unref?.();
118
118
  }
119
- /** `lab run`, not `run`, so the two are distinguishable, and nothing else from the invocation. */
119
+ /** `study show`, not `show`, so subcommands are distinguishable, and nothing else from the invocation. */
120
120
  function commandPath(command) {
121
121
  const parts = [];
122
122
  let current = command;
@@ -370,7 +370,6 @@ export function createProgram(io = {}) {
370
370
  registerCleanupCommand(program, cliIo);
371
371
  registerKeysCommand(program, cliIo);
372
372
  registerTelemetryCommand(program, cliIo);
373
- registerServeCommand(program, cliIo);
374
373
  registerTuiCommand(program, cliIo, { ...defaultTuiRuntime, ...io.tuiRuntime });
375
374
  registerCodexCommands(program, cliIo);
376
375
  // Only the root takes a stray word, so the action above can name the command it meant. Set after
@@ -78,7 +78,7 @@ export declare function buildPayload(args: {
78
78
  nodeVersion?: string;
79
79
  }): TelemetryPayload;
80
80
  /**
81
- * Read the study facts off a command's result document: mode, outcome, starter lab, brain route,
81
+ * Read the study facts off a command's result document: mode, outcome, starter study, brain route,
82
82
  * and our own error code. Duck-typed over every result shape the CLI writes, because the point is
83
83
  * one derivation at the one seam every command already passes through (writeResult), so that a
84
84
  * backend added later cannot forget to report. Returns {} for results that carry no study.
@@ -5,9 +5,9 @@
5
5
  // working first run". A tool that cannot see its own activation is guessing.
6
6
  //
7
7
  // What it will never send, and this is stricter than the convention because of what humanish is:
8
- // no paths, no cwd, no repo names, no URLs, no lab titles or ids that are not our own starter labs,
8
+ // no paths, no cwd, no repo names, no URLs, no study titles or ids that are not our own starter studies,
9
9
  // no persona or mission text, no run ids, no evidence, no key values, no key names. A study's
10
- // subject is the adopter's product and often unannounced; leaking a lab id would leak a roadmap.
10
+ // subject is the adopter's product and often unannounced; leaking a study id would leak a roadmap.
11
11
  // The allowlist below is the whole vocabulary: anything not on it cannot be sent by construction.
12
12
  import { isCuaDiagnosticCategory, isCuaDiagnosticStopCause, } from "../routes/computer-use/diagnostics.js";
13
13
  import { randomUUID } from "node:crypto";
@@ -175,12 +175,8 @@ export function buildPayload(args) {
175
175
  const given = args.properties ?? {};
176
176
  if (given.command !== undefined)
177
177
  properties.command = given.command;
178
- if (given.study !== undefined) {
178
+ if (given.study !== undefined)
179
179
  properties.study = given.study;
180
- // Removed in 0.109.0: `lab`, the property's 0.107 name, carries the same value until then, so
181
- // a dashboard that filters on `lab` keeps reading 0.108 events while older clients send `lab`.
182
- properties.lab = given.study;
183
- }
184
180
  if (given.mode !== undefined)
185
181
  properties.mode = given.mode;
186
182
  if (given.outcome !== undefined)
@@ -236,7 +232,7 @@ function asRecord(value) {
236
232
  : undefined;
237
233
  }
238
234
  /**
239
- * Read the study facts off a command's result document: mode, outcome, starter lab, brain route,
235
+ * Read the study facts off a command's result document: mode, outcome, starter study, brain route,
240
236
  * and our own error code. Duck-typed over every result shape the CLI writes, because the point is
241
237
  * one derivation at the one seam every command already passes through (writeResult), so that a
242
238
  * backend added later cannot forget to report. Returns {} for results that carry no study.
@@ -257,18 +253,16 @@ export function deriveRunFacts(result) {
257
253
  else if (r.mode === "dry-run" || r.mode === "live")
258
254
  facts.mode = r.mode;
259
255
  const studyRecord = asRecord(r.study) ?? asRecord(r.lab);
260
- const labId = typeof r.studyId === "string"
256
+ const studyId = typeof r.studyId === "string"
261
257
  ? r.studyId
262
- : typeof r.labId === "string"
263
- ? r.labId
264
- : typeof studyRecord?.id === "string"
265
- ? studyRecord.id
266
- : typeof r.study === "string"
267
- ? r.study
268
- : typeof r.lab === "string"
269
- ? r.lab
270
- : undefined;
271
- const study = safeStudyId(labId);
258
+ : typeof studyRecord?.id === "string"
259
+ ? studyRecord.id
260
+ : typeof r.study === "string"
261
+ ? r.study
262
+ : typeof r.lab === "string"
263
+ ? r.lab
264
+ : undefined;
265
+ const study = safeStudyId(studyId);
272
266
  if (study !== undefined)
273
267
  facts.study = study;
274
268
  const error = asRecord(r.error);
@@ -323,7 +317,7 @@ export function deriveRunFacts(result) {
323
317
  /** The notice, shown once, before anything is sent. */
324
318
  export const TELEMETRY_NOTICE = [
325
319
  "humanish collects anonymous usage data (which command ran, whether it worked, how long it took).",
326
- "It never sends your labs, subjects, personas, paths, or evidence. Opt out any time:",
320
+ "It never sends your studies, subjects, personas, paths, or evidence. Opt out any time:",
327
321
  " humanish telemetry disable (or set DO_NOT_TRACK=1)",
328
322
  " humanish telemetry status shows exactly what is collected",
329
323
  ].join("\n");
@@ -15,7 +15,7 @@ export interface CommsCatchHostOptions {
15
15
  /** Optional loopback SMTP listener sharing the HTTP capture and inbox pipeline. */
16
16
  smtpPort?: number;
17
17
  /** Restrict the rendered inbox to these addresses. Omit to render whatever the app actually mailed;
18
- * a standalone catch has no lab roster to read recipients from, and an operator who forgets to
18
+ * a standalone catch has no study roster to read recipients from, and an operator who forgets to
19
19
  * name one should not get a healthy catch that renders an empty inbox forever. */
20
20
  recipients?: string[];
21
21
  /** Inbox re-render cadence in ms (test seam). */
@@ -11,7 +11,7 @@
11
11
  // Shipping it as a command rather than a spec matters: the adopter runs the identical
12
12
  // implementation humanish deploys in-sandbox, so the capture shape, the inbox surface, and the
13
13
  // drain contract cannot drift between the two planes. Point the app's email-API base URL at this
14
- // server and point the lab's `catchBaseUrl` at it too.
14
+ // server and point the study's `catchBaseUrl` at it too.
15
15
  //
16
16
  // Runtime: the catch is a python3 stdlib server with no dependencies (that was the 0.29.0 lesson:
17
17
  // a co-located catcher must use a runtime the environment guarantees). This command writes the
@@ -135,11 +135,11 @@ export async function runCommsCatchHost(options, io) {
135
135
  ]),
136
136
  ` POST /emails <- point your app's email-API base URL here`,
137
137
  ` GET /inbox <- shared operator inbox${inboxPort === undefined ? " (loopback only without --inbox-port)" : ""}`,
138
- ` GET /inbox/for/... <- assigned participant inbox (linked by the lab)`,
138
+ ` GET /inbox/for/... <- assigned participant inbox (linked by the study)`,
139
139
  ` GET /deliveries <- humanish drains this${options.token ? " (bearer token required)" : ""}`,
140
140
  ` GET /health <- readiness marker humanish probes before a run`,
141
141
  ``,
142
- `Declare it in the lab:`,
142
+ `Declare it in the study:`,
143
143
  ` comms:`,
144
144
  ` email:`,
145
145
  ` external:`,
@@ -16,5 +16,5 @@ export interface CommsSetupResult {
16
16
  }
17
17
  /** Offline and non-mutating. Unsafe storage is an error, never an empty configuration. */
18
18
  export declare function readCommsConnections(cwd: string): Promise<CommsConnections>;
19
- /** Add one exact profile. No lab mutation, network, provider resources or credential values. */
19
+ /** Add one exact profile. No study mutation, network, provider resources or credential values. */
20
20
  export declare function saveCommsConnection(cwd: string, name?: string, apiKeyEnv?: string): Promise<CommsSetupResult>;
@@ -65,7 +65,7 @@ export async function readCommsConnections(cwd) {
65
65
  throw new Error("Invalid connection configuration.");
66
66
  }
67
67
  }
68
- /** Add one exact profile. No lab mutation, network, provider resources or credential values. */
68
+ /** Add one exact profile. No study mutation, network, provider resources or credential values. */
69
69
  export async function saveCommsConnection(cwd, name = DEFAULT_COMMS_PROVIDER.id, apiKeyEnv = DEFAULT_COMMS_PROVIDER.keyEnv) {
70
70
  const provider = DEFAULT_COMMS_PROVIDER.id;
71
71
  try {
@@ -94,7 +94,7 @@ export async function saveCommsConnection(cwd, name = DEFAULT_COMMS_PROVIDER.id,
94
94
  await writeContainedOutputFile(root, "comms.yaml", stringify(config), "utf8");
95
95
  return {
96
96
  ok: true,
97
- message: "Connection saved for this project. Select it in a supported lab to use fresh real inboxes.",
97
+ message: "Connection saved for this project. Select it in a supported study to use fresh real inboxes.",
98
98
  };
99
99
  }
100
100
  finally {
@@ -1,4 +1,4 @@
1
- import type { LabCommsEmail, LabCommsExternal } from "../lab/types.js";
1
+ import type { StudyCommsEmail, StudyCommsExternal } from "../study/types.js";
2
2
  import type { PreparedRunArtifactPaths } from "../run/paths.js";
3
3
  /**
4
4
  * Why a catch token cannot be used, or undefined when it can. An unset or empty token is none. A
@@ -6,8 +6,8 @@ import type { PreparedRunArtifactPaths } from "../run/paths.js";
6
6
  * refused with the short ones.
7
7
  */
8
8
  export declare function catchTokenRefusal(token: string | undefined): string | undefined;
9
- /** The catch token the run sends: the value of `authTokenEnv`, when the lab names one. */
10
- export declare function catchTokenOf(external: LabCommsExternal, env: Record<string, string | undefined>): string | undefined;
9
+ /** The catch token the run sends: the value of `authTokenEnv`, when the study names one. */
10
+ export declare function catchTokenOf(external: StudyCommsExternal, env: Record<string, string | undefined>): string | undefined;
11
11
  /**
12
12
  * Drains the catch, routes its sends to the declared recipients' inboxes and writes the thread to
13
13
  * `comms/thread.json`. Returns that path when a message matched, and the warnings to add to the
@@ -15,8 +15,8 @@ export declare function catchTokenOf(external: LabCommsExternal, env: Record<str
15
15
  * throws: the run continues without comms evidence.
16
16
  */
17
17
  export declare function collectExternalCommsEvidence(args: {
18
- external: LabCommsExternal;
19
- email: LabCommsEmail;
18
+ external: StudyCommsExternal;
19
+ email: StudyCommsEmail;
20
20
  env: Record<string, string | undefined>;
21
21
  runPaths: PreparedRunArtifactPaths;
22
22
  /** The run's known secret values. The route may add to it until the drain runs. */