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,8 +1,8 @@
1
- // Which subject, target and actor compositions a lab may declare. Each rule returns the refusal
1
+ // Which subject, target and actor compositions a study may declare. Each rule returns the refusal
2
2
  // message for the first thing its composition gets wrong, or null. compositionReason runs them in
3
- // the parser's order, and only parseLabConfig calls it. planLab does not: each route planner checks
3
+ // the parser's order, and only parseStudy calls it. planStudy does not: each route planner checks
4
4
  // a library caller's config itself, under its route's error codes. The planners call the shared
5
- // checks in lab/validation.ts and desktopCliProductReason below. The other subject rules here have
5
+ // checks in study/validation.ts and desktopCliProductReason below. The other subject rules here have
6
6
  // planner counterparts whose conditions and wording differ (clone serve and repo, local-tree
7
7
  // target, in-process fan-out, loopback targets, scripted scenario.ref).
8
8
  import { isLoopbackUrl } from "./parse/subject.js";
@@ -30,14 +30,14 @@ export function compositionReason(config) {
30
30
  terminalValidationReason(config) ??
31
31
  cloneActorValidationReason(config));
32
32
  }
33
- /** Why a this-repo lab cannot run live. The parser and the preview planner both refuse with it. */
34
- export const THIS_REPO_DRY_RUN_ONLY = "this-repo labs are dry-run only; use a clone or app-url subject for a live run.";
33
+ /** Why a this-repo study cannot run live. The parser and the preview planner both refuse with it. */
34
+ export const THIS_REPO_DRY_RUN_ONLY = "this-repo studies are dry-run only; use a clone or app-url subject for a live run.";
35
35
  // this-repo subjects run locally and dry-run only: there is no live execution target for the
36
36
  // host repo (clone/app-url provide that). Reject the mis-configs rather than silently mishandle.
37
37
  function thisRepoValidationReason(config) {
38
38
  if (config.subject.source === "this-repo") {
39
39
  if (config.execution?.target) {
40
- return "`execution.target` applies only to clone/app-url/local-app subjects; this-repo labs run locally.";
40
+ return "`execution.target` applies only to clone/app-url/local-app subjects; this-repo studies run locally.";
41
41
  }
42
42
  if (config.scenario?.mode === "live") {
43
43
  return THIS_REPO_DRY_RUN_ONLY;
@@ -51,7 +51,7 @@ function thisRepoValidationReason(config) {
51
51
  // desktop), and no public-target policy (it is always loopback; the loopback shape was already
52
52
  // enforced in parseSubject). The actual "no inProcess executor supplied" case is inherently an
53
53
  // engine-time decision (the parser cannot know whether a library caller will pass one), so
54
- // it fails closed in runCuaActorLab with HUMANISH_COMPUTER_USE_LOCAL_APP_NO_EXECUTOR.
54
+ // it fails closed in runCuaActorStudy with HUMANISH_COMPUTER_USE_LOCAL_APP_NO_EXECUTOR.
55
55
  function localAppValidationReason(config) {
56
56
  if (config.subject.source === "local-app") {
57
57
  const type = config.actors[0]?.type ?? "";
@@ -106,7 +106,7 @@ function appUrlValidationReason(config) {
106
106
  return "app-url computer-use subjects require `execution.target: local` or `e2b-desktop`.";
107
107
  }
108
108
  if (!actorResolvesToComputerUse(type)) {
109
- return `actors[0].type must be a registered computer-use actor for app-url × e2b-desktop labs (one of: ${registeredComputerUseActors().join(", ")}); for local scripted execution use a registered scripted-browser actor (${registeredScriptedBrowserActors().join(", ")}). Got "${type}".`;
109
+ return `actors[0].type must be a registered computer-use actor for app-url × e2b-desktop studies (one of: ${registeredComputerUseActors().join(", ")}); for local scripted execution use a registered scripted-browser actor (${registeredScriptedBrowserActors().join(", ")}). Got "${type}".`;
110
110
  }
111
111
  // Multi-participant fan-out is consumed on this route (`per-lane-worlds`; the shared cua
112
112
  // cross-validation below enforces `lanes`/`count` XOR rules, the 16 cap, and the
@@ -136,7 +136,7 @@ function scriptedBrowserValidationReason(config) {
136
136
  return "A clone subject with a scripted-browser actor needs `subject.serve` (start and url): humanish starts the app in the sandbox before the browser steps run.";
137
137
  }
138
138
  if ((config.subject.repos?.length ?? 0) !== 1) {
139
- return "clone scripted-browser labs require exactly one repo in subject.repos.";
139
+ return "clone scripted-browser studies require exactly one repo in subject.repos.";
140
140
  }
141
141
  const repo = config.subject.repos?.[0] ?? "";
142
142
  if (!REPO_SLUG_PATTERN.test(repo)) {
@@ -188,7 +188,7 @@ function cloneComputerUseValidationReason(config) {
188
188
  return "A clone subject on the computer-use route needs `subject.serve` (start and url): humanish starts the app in the sandbox before the participant opens it.";
189
189
  }
190
190
  if ((config.subject.repos?.length ?? 0) !== 1) {
191
- return "computer-use clone labs serve one repo; declare exactly one repo in subject.repos.";
191
+ return "computer-use clone studies serve one repo; declare exactly one repo in subject.repos.";
192
192
  }
193
193
  const repo = config.subject.repos?.[0] ?? "";
194
194
  if (!REPO_SLUG_PATTERN.test(repo)) {
@@ -278,14 +278,14 @@ function terminalValidationReason(config) {
278
278
  }
279
279
  return null;
280
280
  }
281
- // A clone lab is served in-sandbox for a participant to drive, so only a computer-use or a
281
+ // A clone study is served in-sandbox for a participant to drive, so only a computer-use or a
282
282
  // scripted-browser actor can run it. Any other actor would parse and then fail at run start.
283
283
  // Terminal actors were already refused above with their own message.
284
284
  function cloneActorValidationReason(config) {
285
285
  if (config.subject.source === "clone") {
286
286
  const type = config.actors[0]?.type ?? "";
287
287
  if (!actorResolvesToComputerUse(type) && !actorResolvesToScriptedBrowser(type)) {
288
- return `clone subjects need a registered computer-use actor (one of: ${registeredComputerUseActors().join(", ")}) or scripted-browser actor (one of: ${registeredScriptedBrowserActors().join(", ")}); the lab clones and serves the app for that participant to drive. Got "${type}".`;
288
+ return `clone subjects need a registered computer-use actor (one of: ${registeredComputerUseActors().join(", ")}) or scripted-browser actor (one of: ${registeredScriptedBrowserActors().join(", ")}); humanish clones and serves the app for that participant to drive. Got "${type}".`;
289
289
  }
290
290
  }
291
291
  return null;
@@ -0,0 +1,15 @@
1
+ import { type StudyParseResult } from "./types.js";
2
+ /** The message for a humanish.lab.v2 document, which the package and the CLI no longer run. */
3
+ export declare const V2_UNSUPPORTED_MESSAGE = "This is a humanish.lab.v2 study, which humanish no longer reads. Convert its file with humanish migrate <path>.";
4
+ /**
5
+ * The package's study parser (src/index.ts) and the one discovery uses: a humanish.study.v3
6
+ * document. It refuses a humanish.lab.v2 one with HUMANISH_STUDY_V2_UNSUPPORTED.
7
+ */
8
+ export declare function parseStudy(raw: unknown): StudyParseResult;
9
+ /**
10
+ * Validate a parsed YAML object, humanish.study.v3 or humanish.lab.v2, into a StudyConfig. Pure:
11
+ * the caller owns file IO. Structural validation only. Fields the engine does not yet consume are
12
+ * accepted but reported in `warnings` so `study show` never silently swallows a setting that does
13
+ * nothing. migrate's conversion (convert.ts) calls it directly, since it reads v2 files.
14
+ */
15
+ export declare function parseStudyDocument(raw: unknown): StudyParseResult;
@@ -1,4 +1,5 @@
1
- // humanish.lab.v2: a lab is a composition over code primitives. There is no hardcoded lab kind.
1
+ // The normalized config, in the humanish.lab.v2 spelling: a study composes code primitives, with no
2
+ // hardcoded study kind.
2
3
  // A humanish.study.v3 file is rewritten into this spelling first (parse/study-v3.ts), and then must
3
4
  // take the route it declares and set no field that route does not read.
4
5
  //
@@ -24,7 +25,7 @@
24
25
  // presets belong to the computer-use route; scripted surfaces are the driver's own desktop/mobile
25
26
  // viewports where isMobile/DSF genuinely render via playwright emulation).
26
27
  // On the other routes those fields remain forward-declared and are not yet consumed:
27
- // parseLabConfig emits a warning listing any such field that is set, so `lab inspect` shows
28
+ // parseStudy emits a warning listing any such field that is set, so `study show` shows
28
29
  // the truth.
29
30
  //
30
31
  // NOTE on actors[0].count: it carries route-specific meanings. Preview route: simCount;
@@ -49,10 +50,10 @@
49
50
  //
50
51
  // There is deliberately no v1 compatibility: v1 had zero real users. Breaking schema changes
51
52
  // bump the version.
52
- import { isLocalBrowserLab, localBrowserDefaults, localBrowserUnsupportedReason, } from "../substrates/local/runtime-config.js";
53
+ import { isLocalBrowserStudy, localBrowserDefaults, localBrowserUnsupportedReason, } from "../substrates/local/runtime-config.js";
53
54
  import { isRecord } from "../run/type-guards.js";
54
55
  import { compositionReason } from "./composition-rules.js";
55
- import { findUnknownLabKey } from "./keys.js";
56
+ import { findUnknownV2Key } from "./keys.js";
56
57
  import { parseActors, rosterOf } from "./parse/actors.js";
57
58
  import { parseComms, recipientParticipantId } from "./parse/comms.js";
58
59
  import { parseDefaults, parseExecution, parsePersonas, parsePolicies, parseReview, parseScenario, } from "./parse/execution.js";
@@ -61,22 +62,38 @@ import { parseSubject } from "./parse/subject.js";
61
62
  import { invalid, optionalStr, str } from "./parse/values.js";
62
63
  import { isComputerUseComposition, isSharedWorldComposition, routeOf } from "./routing.js";
63
64
  import { declaredParticipantIds } from "./plan-participants.js";
64
- import { ID_PATTERN, LAB_CONFIG_SCHEMA, STUDY_SCHEMA, } from "./types.js";
65
+ import { ID_PATTERN, V2_SCHEMA, STUDY_SCHEMA, } from "./types.js";
65
66
  import { automaticAnalysisRouteReason, desktopMediaValidationReason, outputTokenLimitValidationReason, receivingEmailValidationReason, scenarioCapsValidationReason, taskProtocolValidationReason, } from "./validation.js";
66
67
  import { forwardDeclaredWarnings, inertFieldLabels } from "./warnings.js";
68
+ import { plural } from "../run/text.js";
69
+ /** The message for a humanish.lab.v2 document, which the package and the CLI no longer run. */
70
+ export const V2_UNSUPPORTED_MESSAGE = "This is a humanish.lab.v2 study, which humanish no longer reads. Convert its file with humanish migrate <path>.";
67
71
  /**
68
- * Validate a parsed YAML object into a LabConfig. Pure: the caller owns file IO. Structural
69
- * validation only. Fields the engine does not yet consume are accepted but reported in
70
- * `warnings` so `lab inspect` never silently swallows a setting that does nothing.
72
+ * The package's study parser (src/index.ts) and the one discovery uses: a humanish.study.v3
73
+ * document. It refuses a humanish.lab.v2 one with HUMANISH_STUDY_V2_UNSUPPORTED.
71
74
  */
72
- export function parseLabConfig(raw) {
75
+ export function parseStudy(raw) {
76
+ if (isRecord(raw) && raw.schema === V2_SCHEMA)
77
+ return {
78
+ ok: false,
79
+ error: { code: "HUMANISH_STUDY_V2_UNSUPPORTED", message: V2_UNSUPPORTED_MESSAGE },
80
+ };
81
+ return parseStudyDocument(raw);
82
+ }
83
+ /**
84
+ * Validate a parsed YAML object, humanish.study.v3 or humanish.lab.v2, into a StudyConfig. Pure:
85
+ * the caller owns file IO. Structural validation only. Fields the engine does not yet consume are
86
+ * accepted but reported in `warnings` so `study show` never silently swallows a setting that does
87
+ * nothing. migrate's conversion (convert.ts) calls it directly, since it reads v2 files.
88
+ */
89
+ export function parseStudyDocument(raw) {
73
90
  if (!isRecord(raw)) {
74
- return invalid("Lab manifest must be a YAML object.");
91
+ return invalid("A study file must be a YAML object.");
75
92
  }
76
93
  if (raw.schema === STUDY_SCHEMA)
77
- return parseStudy(raw);
78
- if (raw.schema !== LAB_CONFIG_SCHEMA) {
79
- return invalid(`Lab schema must be ${STUDY_SCHEMA} or ${LAB_CONFIG_SCHEMA}.`);
94
+ return parseV3(raw);
95
+ if (raw.schema !== V2_SCHEMA) {
96
+ return invalid(`The study schema must be ${STUDY_SCHEMA} or ${V2_SCHEMA}.`);
80
97
  }
81
98
  return parseV2(raw);
82
99
  }
@@ -84,7 +101,7 @@ export function parseLabConfig(raw) {
84
101
  * A v3 study parses through the v2 parser, then must take the route it declares and set no field
85
102
  * that route does not read. A v2 file gets those fields as a warning instead.
86
103
  */
87
- function parseStudy(raw) {
104
+ function parseV3(raw) {
88
105
  const document = studyToV2(raw);
89
106
  if (!document.ok)
90
107
  return document;
@@ -108,12 +125,12 @@ function parseStudy(raw) {
108
125
  };
109
126
  }
110
127
  function parseV2(raw) {
111
- const unknownKey = findUnknownLabKey(raw);
128
+ const unknownKey = findUnknownV2Key(raw);
112
129
  if (unknownKey)
113
130
  return invalid(unknownKey);
114
131
  const id = str(raw.id);
115
132
  if (!id || !ID_PATTERN.test(id)) {
116
- return invalid("Lab id must be a public-safe token starting with a letter or digit (/^[A-Za-z0-9][A-Za-z0-9_.-]*$/).");
133
+ return invalid("The study id must be a public-safe token starting with a letter or digit (/^[A-Za-z0-9][A-Za-z0-9_.-]*$/).");
117
134
  }
118
135
  const subjectResult = parseSubject(raw.subject);
119
136
  if (!subjectResult.ok) {
@@ -128,7 +145,7 @@ function parseV2(raw) {
128
145
  return executionResult;
129
146
  }
130
147
  const config = {
131
- schema: LAB_CONFIG_SCHEMA,
148
+ schema: V2_SCHEMA,
132
149
  id,
133
150
  ...optionalStr("title", raw.title),
134
151
  ...optionalStr("description", raw.description),
@@ -174,7 +191,7 @@ function parseV2(raw) {
174
191
  if (commsResult.value)
175
192
  config.comms = commsResult.value;
176
193
  if (config.comms?.email?.smtp && config.subject.topology === "shared-world") {
177
- return invalid("SMTP capture is not yet wired for shared-world labs. Use the default per-lane-worlds topology for SMTP, or configure supported HTTP email capture for concurrent shared-world labs.");
194
+ return invalid("SMTP capture is not supported yet for shared-world studies. Use the default per-lane-worlds topology for SMTP, or configure supported HTTP email capture for concurrent shared-world studies.");
178
195
  }
179
196
  const mediaReason = desktopMediaValidationReason(config);
180
197
  if (mediaReason)
@@ -220,7 +237,7 @@ function parseV2(raw) {
220
237
  else {
221
238
  const unknown = email.recipients.filter((recipient) => !participantIds.includes(recipientParticipantId(recipient)));
222
239
  if (unknown.length > 0) {
223
- return invalid(`comms.email.recipients name participant(s) that do not exist: ${unknown.map((r) => `"${recipientParticipantId(r)}"`).join(", ")}. This lab's participant ids are: ${participantIds.join(", ")}. A recipient's \`lane\` must match one of them exactly: the inbox instruction is injected per participant, and a mismatch disables the email funnel for that participant.`);
240
+ return invalid(`comms.email.recipients name ${plural(unknown.length, "participant")} that ${unknown.length === 1 ? "does" : "do"} not exist: ${unknown.map((r) => `"${recipientParticipantId(r)}"`).join(", ")}. This study's participant ids are: ${participantIds.join(", ")}. A recipient's \`lane\` must match one of them exactly: the inbox instruction is injected per participant, and a mismatch disables the email funnel for that participant.`);
224
241
  }
225
242
  if (!email.recipients.some((recipient) => recipient.address !== undefined)) {
226
243
  return invalid("comms.email.recipients cover no participant with an address, so no actor would be told an inbox exists and no captured mail could match. Give at least one recipient an address, or omit `recipients` entirely (every participant then gets a deterministic address automatically).");
@@ -237,7 +254,7 @@ function parseV2(raw) {
237
254
  if (analysisReason)
238
255
  return invalid(analysisReason);
239
256
  const normalized = localBrowserDefaults(config);
240
- if (isLocalBrowserLab(normalized)) {
257
+ if (isLocalBrowserStudy(normalized)) {
241
258
  const reason = localBrowserUnsupportedReason(normalized);
242
259
  if (reason)
243
260
  return invalid(reason);
@@ -1,4 +1,4 @@
1
- import type { StudyRoute } from "../lab/parse/study-v3.js";
1
+ import { type StudyRoute } from "./routing.js";
2
2
  /** A key the conversion moved, by its v2 path and its v3 path. */
3
3
  export interface MovedKey {
4
4
  readonly from: string;
@@ -3,13 +3,13 @@
3
3
  // every key it moved and every key it dropped. It refuses a file whose v3 form would parse or plan
4
4
  // differently from the v2 source with the dropped keys removed.
5
5
  import { isAlias, isMap, isScalar, isSeq, LineCounter, Pair, parseDocument, Scalar, visit, YAMLMap, YAMLSeq, } from "yaml";
6
- import { parseLabConfig } from "../lab/config.js";
7
- import { focusOf } from "../lab/parse/actors.js";
8
- import { posInt } from "../lab/parse/values.js";
9
- import { planLab } from "../lab/plan.js";
10
- import { routeOf } from "../lab/routing.js";
11
- import { LAB_CONFIG_SCHEMA, STUDY_SCHEMA } from "../lab/types.js";
12
- import { inertFieldPaths } from "../lab/warnings.js";
6
+ import { parseStudyDocument } from "./config.js";
7
+ import { focusOf } from "./parse/actors.js";
8
+ import { posInt } from "./parse/values.js";
9
+ import { planStudy } from "./plan.js";
10
+ import { routeOf } from "./routing.js";
11
+ import { V2_SCHEMA, STUDY_SCHEMA } from "./types.js";
12
+ import { inertFieldPaths } from "./warnings.js";
13
13
  import { deleteNodeFieldPath, deletePlainFieldPath, pairIndex, readFieldPath, } from "./field-paths.js";
14
14
  function isPlainRecord(value) {
15
15
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -34,9 +34,9 @@ export function convertStudyText(text, cwd) {
34
34
  const raw = doc.toJS();
35
35
  if (!isPlainRecord(raw) || !isMap(doc.contents))
36
36
  return refuse("it is not a YAML mapping.");
37
- if (raw.schema !== LAB_CONFIG_SCHEMA)
38
- return refuse(`its schema is not ${LAB_CONFIG_SCHEMA}.`);
39
- const source = parseLabConfig(raw);
37
+ if (raw.schema !== V2_SCHEMA)
38
+ return refuse(`its schema is not ${V2_SCHEMA}.`);
39
+ const source = parseStudyDocument(raw);
40
40
  if (!source.ok)
41
41
  return refuse(`it does not parse: ${source.error.message}`);
42
42
  const route = routeOf(source.config);
@@ -410,20 +410,20 @@ function samePlans(raw, dropped, text, cwd) {
410
410
  const projected = structuredClone(raw);
411
411
  for (const path of dropped)
412
412
  deletePlainFieldPath(projected, path);
413
- const before = parseLabConfig(projected);
413
+ const before = parseStudyDocument(projected);
414
414
  if (!before.ok) {
415
415
  return refuse(`it does not parse once the unread keys are dropped: ${before.error.message}`);
416
416
  }
417
- const after = parseLabConfig(parseDocument(text).toJS());
417
+ const after = parseStudyDocument(parseDocument(text).toJS());
418
418
  if (!after.ok)
419
419
  return refuse(`its v3 form does not parse: ${after.error.message}`);
420
- if (JSON.stringify(plain({ ...after.config, schema: LAB_CONFIG_SCHEMA })) !==
420
+ if (JSON.stringify(plain({ ...after.config, schema: V2_SCHEMA })) !==
421
421
  JSON.stringify(plain(before.config))) {
422
422
  return refuse("its v3 form parses to a different study.");
423
423
  }
424
424
  for (const dryRun of [true, false]) {
425
- const v2 = plain(planLab(before.config, { cwd, dryRun }));
426
- const v3 = plain(planLab(after.config, { cwd, dryRun }));
425
+ const v2 = plain(planStudy(before.config, { cwd, dryRun }));
426
+ const v3 = plain(planStudy(after.config, { cwd, dryRun }));
427
427
  if (JSON.stringify(v2) !== JSON.stringify(v3)) {
428
428
  return refuse(`its v3 form plans a different ${dryRun ? "dry" : "live"} run.`);
429
429
  }
@@ -1,4 +1,4 @@
1
- import type { LabConfig } from "./types.js";
1
+ import type { StudyConfig } from "./types.js";
2
2
  export interface DevicePreset {
3
3
  /** Requested device width; the hosted physical screen may be widened to its minimum. */
4
4
  width: number;
@@ -88,7 +88,7 @@ export declare function floorRenderResolution(resolution: readonly [number, numb
88
88
  * `resolution` is floored to MIN_DESKTOP_RENDER_WIDTH so the browser window fits its X screen (no clip);
89
89
  * `preset` keeps the declared device identity (a mobile preset stays 414/isMobile for the prompt).
90
90
  */
91
- export declare function resolveParticipantDevice(config: LabConfig,
91
+ export declare function resolveParticipantDevice(config: StudyConfig,
92
92
  /** The device the participant's roster entry names, if any. */
93
93
  device: string | undefined): {
94
94
  name: string;
@@ -1,32 +1,32 @@
1
1
  import type { ActorPersonaRef } from "../actors/contract.js";
2
- import { type LabConfig } from "./types.js";
2
+ import { type StudyConfig } from "./types.js";
3
3
  declare const STUDY_LIST_SCHEMA = "humanish.study-list.v1";
4
4
  declare const STUDY_SHOW_SCHEMA = "humanish.study-show.v1";
5
- type LabOrigin = "committed" | "ignored" | "explicit";
6
- interface ResolvedLabConfig {
7
- config: LabConfig;
8
- origin: LabOrigin;
5
+ type StudyOrigin = "committed" | "ignored" | "explicit";
6
+ interface ResolvedStudyConfig {
7
+ config: StudyConfig;
8
+ origin: StudyOrigin;
9
9
  path: string;
10
10
  warnings: string[];
11
11
  }
12
- export interface LabResolveFailure {
12
+ export interface StudyResolveFailure {
13
13
  ok: false;
14
14
  cwd: string;
15
15
  /** The study the caller asked for, as given. */
16
16
  study: string;
17
17
  error: {
18
- code: "HUMANISH_STUDY_NOT_FOUND" | "HUMANISH_STUDY_INVALID" | "HUMANISH_STUDY_AMBIGUOUS";
18
+ code: "HUMANISH_STUDY_NOT_FOUND" | "HUMANISH_STUDY_INVALID" | "HUMANISH_STUDY_V2_UNSUPPORTED" | "HUMANISH_STUDY_RETIRED_DIRECTORY";
19
19
  message: string;
20
20
  };
21
21
  warnings: string[];
22
22
  }
23
- export type LabResolveResult = ({
23
+ export type StudyResolveResult = ({
24
24
  ok: true;
25
- } & ResolvedLabConfig) | LabResolveFailure;
26
- export interface LabListEntry {
25
+ } & ResolvedStudyConfig) | StudyResolveFailure;
26
+ export interface StudyListEntry {
27
27
  id: string;
28
- source: LabConfig["subject"]["source"];
29
- origin: LabOrigin;
28
+ source: StudyConfig["subject"]["source"];
29
+ origin: StudyOrigin;
30
30
  path: string;
31
31
  title?: string;
32
32
  /**
@@ -35,17 +35,23 @@ export interface LabListEntry {
35
35
  * stakeholder feedback that added this was, verbatim, "so i know wtf they are".
36
36
  */
37
37
  description?: string;
38
- /** Why `run` refuses this file by name: its stem also names a file in the other directory family. */
39
- error?: string;
40
38
  }
41
- export interface LabListResult {
39
+ /** A file in a study directory that humanish no longer reads, with what to do about it. */
40
+ interface RetiredStudyFile {
41
+ path: string;
42
+ code: "HUMANISH_STUDY_V2_UNSUPPORTED" | "HUMANISH_STUDY_RETIRED_DIRECTORY";
43
+ message: string;
44
+ }
45
+ export interface StudyListResult {
42
46
  schema: typeof STUDY_LIST_SCHEMA;
43
47
  ok: true;
44
48
  cwd: string;
45
- studies: LabListEntry[];
49
+ studies: StudyListEntry[];
50
+ /** Each also has its message in `warnings`. */
51
+ retired: RetiredStudyFile[];
46
52
  warnings: string[];
47
53
  }
48
- export interface LabInspectResult {
54
+ export interface StudyInspectResult {
49
55
  /** Persona context only, before route instructions and runtime grants. */
50
56
  personas?: Array<{
51
57
  id: string;
@@ -57,13 +63,13 @@ export interface LabInspectResult {
57
63
  cwd: string;
58
64
  /** The study the caller asked for, as given. */
59
65
  study: string;
60
- config?: LabConfig;
61
- origin?: LabOrigin;
66
+ config?: StudyConfig;
67
+ origin?: StudyOrigin;
62
68
  path?: string;
63
- error?: LabResolveFailure["error"];
69
+ error?: StudyResolveFailure["error"];
64
70
  warnings: string[];
65
71
  }
66
- export declare function resolveLabManifest(cwd: string, lab: string): Promise<LabResolveResult>;
67
- export declare function listLabManifests(cwd: string): Promise<LabListResult>;
68
- export declare function inspectLabManifest(cwd: string, lab: string): Promise<LabInspectResult>;
72
+ export declare function resolveStudyManifest(cwd: string, study: string): Promise<StudyResolveResult>;
73
+ export declare function listStudyManifests(cwd: string): Promise<StudyListResult>;
74
+ export declare function inspectStudyManifest(cwd: string, study: string): Promise<StudyInspectResult>;
69
75
  export {};