humanish 0.107.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (671) hide show
  1. package/ARCHITECTURE.md +73 -69
  2. package/CHANGELOG.md +27 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +148 -175
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-trace.js +2 -1
  14. package/dist/actors/codex/app-server-ui.js +1 -1
  15. package/dist/actors/codex/codex-admission.d.ts +91 -0
  16. package/dist/actors/codex/codex-admission.js +150 -0
  17. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  18. package/dist/actors/codex/restricted-executable.js +8 -8
  19. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  20. package/dist/actors/codex/restricted-launch.js +1 -1
  21. package/dist/actors/codex/restricted-participant.js +20 -18
  22. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  23. package/dist/actors/codex/restricted-policy.js +2 -2
  24. package/dist/actors/codex/restricted-session.d.ts +3 -3
  25. package/dist/actors/codex/restricted-session.js +10 -5
  26. package/dist/actors/computer-use/actor.d.ts +18 -18
  27. package/dist/actors/computer-use/actor.js +4 -4
  28. package/dist/actors/computer-use/admission-limit.d.ts +3 -3
  29. package/dist/actors/computer-use/admission-limit.js +4 -4
  30. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  31. package/dist/actors/computer-use/executor-error.js +3 -3
  32. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  33. package/dist/actors/computer-use/loop/actions.js +15 -15
  34. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  35. package/dist/actors/computer-use/loop/backstop.js +14 -12
  36. package/dist/actors/computer-use/loop/debrief.js +2 -2
  37. package/dist/actors/computer-use/loop/ending.d.ts +6 -6
  38. package/dist/actors/computer-use/loop/ending.js +18 -17
  39. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  40. package/dist/actors/computer-use/loop/observation.js +15 -14
  41. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  42. package/dist/actors/computer-use/loop/provider-call.js +12 -12
  43. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  44. package/dist/actors/computer-use/loop/session.js +4 -4
  45. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  46. package/dist/actors/computer-use/loop/spend.js +1 -1
  47. package/dist/actors/computer-use/loop/trace.js +11 -9
  48. package/dist/actors/computer-use/loop/types.d.ts +47 -45
  49. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  50. package/dist/actors/computer-use/loop/usage.js +2 -2
  51. package/dist/actors/computer-use/loop.d.ts +6 -1
  52. package/dist/actors/computer-use/loop.js +26 -4
  53. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  54. package/dist/actors/computer-use/openai-context.js +214 -0
  55. package/dist/actors/computer-use/openai-provider.d.ts +13 -10
  56. package/dist/actors/computer-use/openai-provider.js +52 -41
  57. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  58. package/dist/actors/computer-use/openai-requests.js +82 -15
  59. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  60. package/dist/actors/computer-use/openai-wire.js +36 -34
  61. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  62. package/dist/actors/computer-use/provider-error.js +6 -6
  63. package/dist/actors/contract.d.ts +82 -47
  64. package/dist/actors/contract.js +30 -24
  65. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  66. package/dist/actors/local-agent/claude-session.js +13 -12
  67. package/dist/actors/local-agent/cli.d.ts +9 -7
  68. package/dist/actors/local-agent/cli.js +24 -28
  69. package/dist/actors/local-agent/readiness.d.ts +2 -2
  70. package/dist/actors/local-agent/readiness.js +4 -4
  71. package/dist/actors/reasoning-effort.js +8 -8
  72. package/dist/actors/registry.d.ts +12 -12
  73. package/dist/actors/registry.js +21 -20
  74. package/dist/actors/scripted-browser/actor.d.ts +10 -10
  75. package/dist/actors/scripted-browser/actor.js +17 -17
  76. package/dist/actors/scripted-browser/browser-command.js +1 -1
  77. package/dist/actors/scripted-browser/steps.js +1 -1
  78. package/dist/actors/scripted-browser/types.d.ts +1 -1
  79. package/dist/actors/stop-conditions.d.ts +1 -1
  80. package/dist/analysis/automatic-completion.d.ts +7 -7
  81. package/dist/analysis/automatic-completion.js +1 -1
  82. package/dist/analysis/automatic-config.d.ts +6 -6
  83. package/dist/analysis/automatic-config.js +1 -1
  84. package/dist/analysis/codex-config.d.ts +6 -2
  85. package/dist/analysis/codex-config.js +22 -14
  86. package/dist/analysis/execute.d.ts +1 -1
  87. package/dist/analysis/execute.js +1 -1
  88. package/dist/analysis/service.js +5 -5
  89. package/dist/analysis/types.d.ts +6 -0
  90. package/dist/browser-control/client.js +16 -16
  91. package/dist/browser-control/dispatcher.js +4 -4
  92. package/dist/browser-control/protocol.js +14 -14
  93. package/dist/browser-control/recording-transfer.js +4 -4
  94. package/dist/browser-control/transport.js +7 -7
  95. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  96. package/dist/cli/commands/analyze.js +19 -16
  97. package/dist/cli/commands/codex.js +9 -9
  98. package/dist/cli/commands/comms.js +48 -35
  99. package/dist/cli/commands/feedback.js +20 -21
  100. package/dist/cli/commands/migrate.d.ts +4 -0
  101. package/dist/cli/commands/migrate.js +65 -0
  102. package/dist/cli/commands/observe.d.ts +0 -1
  103. package/dist/cli/commands/observe.js +136 -112
  104. package/dist/cli/commands/run-command.d.ts +10 -0
  105. package/dist/cli/commands/run-command.js +85 -0
  106. package/dist/cli/commands/runs.js +136 -139
  107. package/dist/cli/commands/setup.d.ts +2 -2
  108. package/dist/cli/commands/setup.js +27 -24
  109. package/dist/cli/commands/study-format.d.ts +9 -0
  110. package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
  111. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  112. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
  113. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  114. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  115. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  116. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
  117. package/dist/cli/commands/study-route-run.d.ts +19 -0
  118. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  119. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  120. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  121. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  122. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
  123. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  124. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  125. package/dist/cli/commands/study-run.d.ts +9 -0
  126. package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
  127. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
  128. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
  129. package/dist/cli/commands/study.d.ts +3 -0
  130. package/dist/cli/commands/study.js +146 -0
  131. package/dist/cli/commands/tui.d.ts +4 -4
  132. package/dist/cli/commands/tui.js +31 -31
  133. package/dist/cli/commands/watch.js +71 -121
  134. package/dist/cli/deprecations.d.ts +6 -0
  135. package/dist/cli/deprecations.js +18 -0
  136. package/dist/cli/doctor.d.ts +18 -8
  137. package/dist/cli/doctor.js +114 -59
  138. package/dist/cli/first-run-path.d.ts +15 -13
  139. package/dist/cli/first-run-path.js +35 -33
  140. package/dist/cli/io.d.ts +44 -9
  141. package/dist/cli/io.js +98 -23
  142. package/dist/cli/observer-follow.d.ts +3 -3
  143. package/dist/cli/observer-follow.js +6 -7
  144. package/dist/cli/orientation.d.ts +10 -7
  145. package/dist/cli/orientation.js +89 -47
  146. package/dist/cli/product-sentence.d.ts +6 -0
  147. package/dist/cli/product-sentence.js +6 -0
  148. package/dist/cli/program.d.ts +6 -1
  149. package/dist/cli/program.js +111 -43
  150. package/dist/cli/telemetry.d.ts +16 -16
  151. package/dist/cli/telemetry.js +46 -44
  152. package/dist/cli.js +1 -1
  153. package/dist/comms/capture-surface.d.ts +13 -12
  154. package/dist/comms/capture-surface.js +23 -22
  155. package/dist/comms/catch-host.d.ts +7 -7
  156. package/dist/comms/catch-host.js +17 -17
  157. package/dist/comms/connections.d.ts +1 -1
  158. package/dist/comms/connections.js +2 -2
  159. package/dist/comms/email-catch.d.ts +3 -3
  160. package/dist/comms/email-catch.js +8 -8
  161. package/dist/comms/external-evidence.d.ts +5 -5
  162. package/dist/comms/external-evidence.js +5 -4
  163. package/dist/comms/extract.js +2 -2
  164. package/dist/comms/fake-inbox.d.ts +3 -3
  165. package/dist/comms/fake-inbox.js +3 -3
  166. package/dist/comms/receiving-render.d.ts +1 -1
  167. package/dist/comms/receiving-render.js +2 -2
  168. package/dist/comms/receiving-runtime.d.ts +4 -4
  169. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  170. package/dist/comms/sandbox-catch-script.js +6 -6
  171. package/dist/comms/sandbox-catch.d.ts +38 -39
  172. package/dist/comms/sandbox-catch.js +36 -37
  173. package/dist/comms/setup.d.ts +2 -2
  174. package/dist/comms/setup.js +56 -25
  175. package/dist/comms/thread-evidence.d.ts +1 -1
  176. package/dist/comms/thread-evidence.js +6 -6
  177. package/dist/comms/types.d.ts +6 -6
  178. package/dist/comms/types.js +3 -3
  179. package/dist/evidence/frame-signature.d.ts +1 -1
  180. package/dist/evidence/frame-signature.js +4 -4
  181. package/dist/evidence/redaction.d.ts +3 -3
  182. package/dist/evidence/redaction.js +4 -4
  183. package/dist/feedback/draft.js +38 -80
  184. package/dist/feedback/export-bundle.js +1 -1
  185. package/dist/feedback/export.d.ts +5 -1
  186. package/dist/feedback/export.js +10 -10
  187. package/dist/feedback/feedback.d.ts +2 -2
  188. package/dist/feedback/feedback.js +21 -3
  189. package/dist/feedback/proof.d.ts +1 -1
  190. package/dist/feedback/proof.js +2 -2
  191. package/dist/guest/bootstrap.js +6 -6
  192. package/dist/guest/browser-tools.js +8 -8
  193. package/dist/guest/chromium-text.js +19 -19
  194. package/dist/guest/desktop-executor.d.ts +2 -2
  195. package/dist/guest/desktop-executor.js +20 -20
  196. package/dist/guest/desktop-keys.js +4 -4
  197. package/dist/guest/desktop-media.d.ts +2 -2
  198. package/dist/guest/desktop-media.js +16 -16
  199. package/dist/guest/desktop-native.d.ts +1 -1
  200. package/dist/guest/desktop-native.js +10 -10
  201. package/dist/guest/runtime-desktop.js +2 -2
  202. package/dist/guest/runtime-processes.d.ts +2 -2
  203. package/dist/guest/runtime-processes.js +2 -2
  204. package/dist/guest/runtime.js +6 -6
  205. package/dist/index.d.ts +14 -14
  206. package/dist/index.js +8 -8
  207. package/dist/keys/key-resolution.d.ts +5 -5
  208. package/dist/keys/key-resolution.js +23 -23
  209. package/dist/observer/artifact.d.ts +2 -2
  210. package/dist/observer/artifact.js +7 -7
  211. package/dist/observer/data.d.ts +6 -6
  212. package/dist/observer/data.js +5 -4
  213. package/dist/observer/exposure.d.ts +1 -1
  214. package/dist/observer/exposure.js +11 -11
  215. package/dist/observer/http.js +1 -1
  216. package/dist/observer/library.d.ts +3 -1
  217. package/dist/observer/library.js +8 -3
  218. package/dist/observer/listen.js +5 -4
  219. package/dist/observer/render.d.ts +1 -1
  220. package/dist/observer/render.js +17 -6
  221. package/dist/observer/run-routes.d.ts +4 -3
  222. package/dist/observer/run-routes.js +38 -13
  223. package/dist/observer/serve.d.ts +1 -1
  224. package/dist/observer/serve.js +7 -3
  225. package/dist/observer/tunnel.js +1 -1
  226. package/dist/observer-app.html +4 -4
  227. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  228. package/dist/routes/computer-use/bundle-parts.js +18 -17
  229. package/dist/routes/computer-use/bundle.d.ts +2 -2
  230. package/dist/routes/computer-use/bundle.js +10 -9
  231. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
  232. package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
  233. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  234. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
  235. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  236. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
  238. package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
  239. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  240. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
  241. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  242. package/dist/routes/computer-use/external-comms.js +1 -1
  243. package/dist/routes/computer-use/fanout-bundle.js +27 -26
  244. package/dist/routes/computer-use/fanout-records.js +12 -13
  245. package/dist/routes/computer-use/live-flush.d.ts +4 -4
  246. package/dist/routes/computer-use/live-flush.js +6 -6
  247. package/dist/routes/computer-use/live-phase.d.ts +5 -4
  248. package/dist/routes/computer-use/live-phase.js +8 -8
  249. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  250. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  251. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  252. package/dist/routes/computer-use/local-vm.js +3 -3
  253. package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
  254. package/dist/routes/computer-use/participant-desktop.js +5 -5
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +10 -10
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +33 -15
  259. package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
  260. package/dist/routes/computer-use/participant-prompt.js +9 -9
  261. package/dist/routes/computer-use/participant-runs.d.ts +16 -16
  262. package/dist/routes/computer-use/participant-runs.js +26 -25
  263. package/dist/routes/computer-use/plan.d.ts +12 -12
  264. package/dist/routes/computer-use/plan.js +42 -42
  265. package/dist/routes/computer-use/preflight.d.ts +5 -5
  266. package/dist/routes/computer-use/preflight.js +25 -25
  267. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  268. package/dist/routes/computer-use/rerun-selection.js +4 -3
  269. package/dist/routes/computer-use/result.d.ts +4 -4
  270. package/dist/routes/computer-use/result.js +22 -21
  271. package/dist/routes/computer-use/route.d.ts +12 -11
  272. package/dist/routes/computer-use/route.js +31 -30
  273. package/dist/routes/computer-use/self-report.d.ts +7 -7
  274. package/dist/routes/computer-use/self-report.js +32 -32
  275. package/dist/routes/computer-use/setup.d.ts +23 -23
  276. package/dist/routes/computer-use/setup.js +28 -29
  277. package/dist/routes/computer-use/single-bundle.d.ts +11 -11
  278. package/dist/routes/computer-use/single-bundle.js +40 -41
  279. package/dist/routes/computer-use/subject-projection.d.ts +4 -4
  280. package/dist/routes/computer-use/subject-projection.js +6 -6
  281. package/dist/routes/computer-use/types.d.ts +71 -73
  282. package/dist/routes/computer-use/types.js +12 -12
  283. package/dist/routes/preview.d.ts +13 -7
  284. package/dist/routes/preview.js +11 -7
  285. package/dist/routes/scripted/bundle.d.ts +7 -7
  286. package/dist/routes/scripted/bundle.js +20 -18
  287. package/dist/routes/scripted/plan.d.ts +8 -8
  288. package/dist/routes/scripted/plan.js +13 -13
  289. package/dist/routes/scripted/result.d.ts +3 -3
  290. package/dist/routes/scripted/result.js +13 -13
  291. package/dist/routes/scripted/route.d.ts +9 -9
  292. package/dist/routes/scripted/route.js +15 -16
  293. package/dist/routes/scripted/scenario.d.ts +1 -1
  294. package/dist/routes/scripted/scenario.js +5 -5
  295. package/dist/routes/scripted/setup.d.ts +6 -6
  296. package/dist/routes/scripted/setup.js +8 -8
  297. package/dist/routes/scripted/subject.d.ts +5 -5
  298. package/dist/routes/scripted/subject.js +4 -4
  299. package/dist/routes/scripted/surface-records.d.ts +1 -1
  300. package/dist/routes/scripted/surface-records.js +4 -4
  301. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  302. package/dist/routes/scripted/types.d.ts +18 -20
  303. package/dist/routes/scripted/types.js +2 -2
  304. package/dist/routes/shared-world/bundle-records.js +11 -10
  305. package/dist/routes/shared-world/bundle.d.ts +5 -5
  306. package/dist/routes/shared-world/bundle.js +46 -43
  307. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  308. package/dist/routes/shared-world/checkpoints.js +2 -2
  309. package/dist/routes/shared-world/comms.d.ts +14 -14
  310. package/dist/routes/shared-world/comms.js +19 -18
  311. package/dist/routes/shared-world/external-public.d.ts +4 -3
  312. package/dist/routes/shared-world/external-public.js +16 -12
  313. package/dist/routes/shared-world/handoff.d.ts +7 -6
  314. package/dist/routes/shared-world/handoff.js +65 -57
  315. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  316. package/dist/routes/shared-world/lobby-code.js +9 -9
  317. package/dist/routes/shared-world/participant-specs.d.ts +10 -9
  318. package/dist/routes/shared-world/participant-specs.js +38 -31
  319. package/dist/routes/shared-world/plan.d.ts +9 -9
  320. package/dist/routes/shared-world/plan.js +16 -16
  321. package/dist/routes/shared-world/provenance.d.ts +2 -2
  322. package/dist/routes/shared-world/provenance.js +2 -2
  323. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  324. package/dist/routes/shared-world/provisioned.js +18 -17
  325. package/dist/routes/shared-world/result.d.ts +6 -6
  326. package/dist/routes/shared-world/result.js +29 -29
  327. package/dist/routes/shared-world/route.d.ts +11 -11
  328. package/dist/routes/shared-world/route.js +40 -39
  329. package/dist/routes/shared-world/setup.d.ts +16 -16
  330. package/dist/routes/shared-world/setup.js +23 -23
  331. package/dist/routes/shared-world/types.d.ts +55 -53
  332. package/dist/routes/shared-world/types.js +4 -4
  333. package/dist/routes/terminal/adapter.d.ts +5 -5
  334. package/dist/routes/terminal/adapter.js +9 -9
  335. package/dist/routes/terminal/bundle.d.ts +13 -13
  336. package/dist/routes/terminal/bundle.js +28 -27
  337. package/dist/routes/terminal/credentials.d.ts +8 -8
  338. package/dist/routes/terminal/credentials.js +12 -12
  339. package/dist/routes/terminal/dry-run.d.ts +4 -4
  340. package/dist/routes/terminal/dry-run.js +12 -12
  341. package/dist/routes/terminal/encoding.js +2 -2
  342. package/dist/routes/terminal/ledger.d.ts +5 -5
  343. package/dist/routes/terminal/ledger.js +14 -14
  344. package/dist/routes/terminal/lifetime.d.ts +1 -1
  345. package/dist/routes/terminal/lifetime.js +1 -1
  346. package/dist/routes/terminal/live-finish.d.ts +2 -2
  347. package/dist/routes/terminal/live-finish.js +10 -10
  348. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  349. package/dist/routes/terminal/live-sandbox.js +15 -15
  350. package/dist/routes/terminal/participant-text.js +2 -1
  351. package/dist/routes/terminal/persona.d.ts +2 -2
  352. package/dist/routes/terminal/persona.js +3 -3
  353. package/dist/routes/terminal/plan.d.ts +7 -7
  354. package/dist/routes/terminal/plan.js +15 -15
  355. package/dist/routes/terminal/recorder.js +2 -2
  356. package/dist/routes/terminal/result.d.ts +5 -5
  357. package/dist/routes/terminal/result.js +14 -14
  358. package/dist/routes/terminal/route.d.ts +9 -9
  359. package/dist/routes/terminal/route.js +19 -20
  360. package/dist/routes/terminal/sandbox.d.ts +1 -1
  361. package/dist/routes/terminal/sandbox.js +1 -1
  362. package/dist/routes/terminal/session.d.ts +5 -5
  363. package/dist/routes/terminal/session.js +14 -13
  364. package/dist/routes/terminal/token-usage.d.ts +1 -1
  365. package/dist/routes/terminal/token-usage.js +7 -8
  366. package/dist/routes/terminal/trace.d.ts +4 -4
  367. package/dist/routes/terminal/trace.js +2 -2
  368. package/dist/routes/terminal/types.d.ts +48 -50
  369. package/dist/routes/terminal/types.js +5 -5
  370. package/dist/run/bundle-shape.js +3 -3
  371. package/dist/run/bundle.d.ts +49 -49
  372. package/dist/run/bundle.js +3 -2
  373. package/dist/run/cost-summary.js +3 -3
  374. package/dist/run/costs.d.ts +23 -0
  375. package/dist/run/costs.js +79 -44
  376. package/dist/run/detail.d.ts +6 -6
  377. package/dist/run/detail.js +4 -4
  378. package/dist/run/dry-run-inputs.d.ts +1 -1
  379. package/dist/run/dry-run-inputs.js +2 -2
  380. package/dist/run/dry-run.js +20 -20
  381. package/dist/run/judge.d.ts +19 -13
  382. package/dist/run/judge.js +18 -8
  383. package/dist/run/outcomes.d.ts +1 -1
  384. package/dist/run/participant.d.ts +1 -1
  385. package/dist/run/paths.d.ts +1 -1
  386. package/dist/run/paths.js +1 -1
  387. package/dist/run/preflight-receipts.js +1 -1
  388. package/dist/run/pricing.d.ts +11 -6
  389. package/dist/run/pricing.js +22 -15
  390. package/dist/run/projection.d.ts +46 -46
  391. package/dist/run/projection.js +57 -57
  392. package/dist/run/reclaim.d.ts +1 -1
  393. package/dist/run/reclaim.js +3 -3
  394. package/dist/run/results.d.ts +5 -5
  395. package/dist/run/run-cost.d.ts +53 -0
  396. package/dist/run/run-cost.js +105 -0
  397. package/dist/run/run-index-analysis.d.ts +15 -0
  398. package/dist/run/run-index-analysis.js +77 -0
  399. package/dist/run/run-index.d.ts +19 -7
  400. package/dist/run/run-index.js +77 -64
  401. package/dist/run/run-not-found.d.ts +5 -0
  402. package/dist/run/run-not-found.js +15 -0
  403. package/dist/run/run.d.ts +6 -5
  404. package/dist/run/run.js +3 -3
  405. package/dist/run/sandbox-receipts.d.ts +2 -2
  406. package/dist/run/sandbox-receipts.js +3 -3
  407. package/dist/run/shared-world-evidence.d.ts +37 -36
  408. package/dist/run/shared-world-evidence.js +4 -4
  409. package/dist/run/shared-world-shape.d.ts +1 -1
  410. package/dist/run/shared-world-shape.js +7 -7
  411. package/dist/run/stats.d.ts +14 -8
  412. package/dist/run/stats.js +121 -63
  413. package/dist/run/status.d.ts +16 -29
  414. package/dist/run/status.js +10 -29
  415. package/dist/run/stored-runs.js +2 -1
  416. package/dist/run/stream-shape.js +1 -1
  417. package/dist/run/streams.d.ts +7 -7
  418. package/dist/run/study-provenance.d.ts +49 -0
  419. package/dist/run/study-provenance.js +66 -0
  420. package/dist/run/study-result.d.ts +11 -0
  421. package/dist/run/study-result.js +9 -0
  422. package/dist/run/text.d.ts +2 -0
  423. package/dist/run/text.js +4 -0
  424. package/dist/run-study.d.ts +112 -0
  425. package/dist/{run-lab.js → run-study.js} +52 -47
  426. package/dist/{lab → study}/adapter-extension.d.ts +15 -27
  427. package/dist/{lab → study}/adapter-extension.js +10 -45
  428. package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
  429. package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
  430. package/dist/study/composition-rules.d.ts +7 -0
  431. package/dist/{lab → study}/composition-rules.js +53 -53
  432. package/dist/study/config.d.ts +15 -0
  433. package/dist/{lab → study}/config.js +98 -41
  434. package/dist/study/convert.d.ts +33 -0
  435. package/dist/study/convert.js +432 -0
  436. package/dist/{lab → study}/device-presets.d.ts +10 -10
  437. package/dist/{lab → study}/device-presets.js +11 -11
  438. package/dist/study/discover.d.ts +75 -0
  439. package/dist/{lab → study}/discover.js +134 -95
  440. package/dist/{lab → study}/doctor.d.ts +19 -12
  441. package/dist/{lab → study}/doctor.js +58 -20
  442. package/dist/study/field-paths.d.ts +12 -0
  443. package/dist/study/field-paths.js +126 -0
  444. package/dist/study/files.d.ts +26 -0
  445. package/dist/study/files.js +44 -0
  446. package/dist/{lab → study}/init-templates.d.ts +2 -2
  447. package/dist/study/init-templates.js +421 -0
  448. package/dist/{lab → study}/init.d.ts +2 -2
  449. package/dist/{lab → study}/init.js +46 -11
  450. package/dist/study/keys.d.ts +4 -0
  451. package/dist/{lab → study}/keys.js +46 -12
  452. package/dist/study/migrate.d.ts +48 -0
  453. package/dist/study/migrate.js +408 -0
  454. package/dist/study/owned-files.d.ts +38 -0
  455. package/dist/study/owned-files.js +182 -0
  456. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  457. package/dist/{lab → study}/parse/actors.js +14 -14
  458. package/dist/study/parse/comms.d.ts +12 -0
  459. package/dist/{lab → study}/parse/comms.js +5 -5
  460. package/dist/study/parse/execution.d.ts +19 -0
  461. package/dist/{lab → study}/parse/execution.js +13 -13
  462. package/dist/study/parse/study-v3.d.ts +21 -0
  463. package/dist/study/parse/study-v3.js +259 -0
  464. package/dist/study/parse/subject-state.d.ts +30 -0
  465. package/dist/{lab → study}/parse/subject-state.js +19 -19
  466. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  467. package/dist/{lab → study}/parse/subject.js +34 -34
  468. package/dist/{lab → study}/parse/values.d.ts +3 -3
  469. package/dist/{lab → study}/parse/values.js +3 -3
  470. package/dist/{lab → study}/persona-resolve.d.ts +8 -8
  471. package/dist/{lab → study}/persona-resolve.js +6 -6
  472. package/dist/{lab → study}/plan-base.d.ts +7 -7
  473. package/dist/{lab → study}/plan-base.js +1 -1
  474. package/dist/{lab → study}/plan-participants.d.ts +12 -12
  475. package/dist/{lab → study}/plan-participants.js +4 -4
  476. package/dist/{lab → study}/plan-types.d.ts +31 -31
  477. package/dist/{lab → study}/plan-types.js +2 -2
  478. package/dist/study/plan.d.ts +13 -0
  479. package/dist/study/plan.js +101 -0
  480. package/dist/study/preflight-probes.d.ts +3 -0
  481. package/dist/{lab → study}/preflight-probes.js +20 -19
  482. package/dist/study/preflight-result.d.ts +8 -0
  483. package/dist/{lab → study}/preflight-result.js +5 -4
  484. package/dist/study/preflight.d.ts +94 -0
  485. package/dist/{lab → study}/preflight.js +12 -12
  486. package/dist/{lab → study}/requirements.d.ts +3 -3
  487. package/dist/{lab → study}/requirements.js +1 -1
  488. package/dist/study/route-inputs.d.ts +28 -0
  489. package/dist/{lab → study}/route-inputs.js +1 -1
  490. package/dist/{lab → study}/routing.d.ts +39 -33
  491. package/dist/{lab → study}/routing.js +60 -29
  492. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
  493. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
  494. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
  495. package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
  496. package/dist/study/run-study-options.d.ts +28 -0
  497. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
  498. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
  499. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  500. package/dist/{lab → study}/summary.d.ts +16 -15
  501. package/dist/{lab → study}/summary.js +21 -21
  502. package/dist/{lab → study}/tasks.d.ts +18 -18
  503. package/dist/{lab → study}/tasks.js +14 -14
  504. package/dist/{lab → study}/types.d.ts +202 -196
  505. package/dist/{lab → study}/types.js +3 -1
  506. package/dist/{lab → study}/validation.d.ts +27 -27
  507. package/dist/{lab → study}/validation.js +53 -51
  508. package/dist/study/warnings.d.ts +12 -0
  509. package/dist/{lab → study}/warnings.js +62 -34
  510. package/dist/subject/clone.d.ts +7 -7
  511. package/dist/subject/clone.js +2 -2
  512. package/dist/subject/desktop-cli.d.ts +1 -1
  513. package/dist/subject/desktop-cli.js +2 -2
  514. package/dist/subject/local-tree-archive.d.ts +2 -2
  515. package/dist/subject/local-tree-archive.js +4 -4
  516. package/dist/subject/local-tree.d.ts +4 -4
  517. package/dist/subject/node-bootstrap.js +1 -1
  518. package/dist/subject/runtime.js +9 -10
  519. package/dist/subject/serve.d.ts +5 -5
  520. package/dist/subject/serve.js +3 -3
  521. package/dist/subject/state.d.ts +4 -4
  522. package/dist/subject/state.js +1 -1
  523. package/dist/subject/steps.d.ts +6 -6
  524. package/dist/subject/steps.js +5 -5
  525. package/dist/substrates/command-failure.d.ts +3 -3
  526. package/dist/substrates/command-failure.js +3 -3
  527. package/dist/substrates/desktop-session.js +2 -2
  528. package/dist/substrates/detached.d.ts +6 -6
  529. package/dist/substrates/detached.js +7 -7
  530. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  531. package/dist/substrates/e2b/cdp-probe.js +14 -17
  532. package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
  533. package/dist/substrates/e2b/desktop-browser.js +9 -9
  534. package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
  535. package/dist/substrates/e2b/desktop-cdp.js +9 -9
  536. package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
  537. package/dist/substrates/e2b/desktop-executor.js +13 -13
  538. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  539. package/dist/substrates/e2b/desktop-geometry.js +8 -8
  540. package/dist/substrates/e2b/desktop-media.d.ts +4 -4
  541. package/dist/substrates/e2b/desktop-media.js +1 -1
  542. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  543. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  544. package/dist/substrates/e2b/lifetime.js +1 -1
  545. package/dist/substrates/e2b/sandbox.d.ts +4 -4
  546. package/dist/substrates/e2b/sandbox.js +2 -2
  547. package/dist/substrates/e2b/sdk.d.ts +12 -12
  548. package/dist/substrates/e2b/sdk.js +7 -7
  549. package/dist/substrates/local/runtime-config.d.ts +4 -4
  550. package/dist/substrates/local/runtime-config.js +4 -4
  551. package/dist/tui/actions.d.ts +1 -1
  552. package/dist/tui/actions.js +13 -13
  553. package/dist/tui/contract.d.ts +23 -23
  554. package/dist/tui/contract.js +11 -11
  555. package/dist/tui/launch.d.ts +7 -7
  556. package/dist/tui/launch.js +36 -31
  557. package/dist/tui/project.js +5 -5
  558. package/dist/tui-app.js +139 -139
  559. package/dist/verify/actor.d.ts +8 -8
  560. package/dist/verify/actor.js +36 -36
  561. package/dist/verify/artifacts.d.ts +2 -2
  562. package/dist/verify/artifacts.js +3 -3
  563. package/dist/verify/context-growth.d.ts +9 -0
  564. package/dist/verify/context-growth.js +62 -0
  565. package/dist/verify/costs.d.ts +6 -6
  566. package/dist/verify/costs.js +8 -8
  567. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  568. package/dist/verify/shared-world-concurrent.js +79 -76
  569. package/dist/verify/shared-world.d.ts +2 -2
  570. package/dist/verify/shared-world.js +16 -16
  571. package/dist/verify/subject.d.ts +5 -5
  572. package/dist/verify/subject.js +19 -19
  573. package/dist/verify/verify.js +94 -44
  574. package/docs/README.md +25 -32
  575. package/docs/architecture/actor-contract.md +60 -91
  576. package/docs/architecture/browser-control.md +1 -1
  577. package/docs/architecture/desktop-sessions.md +7 -7
  578. package/docs/architecture/external-public-shared-world.md +68 -65
  579. package/docs/architecture/github-feedback-loop.md +2 -5
  580. package/docs/architecture/guest-desktop.md +2 -2
  581. package/docs/architecture/observer.md +34 -34
  582. package/docs/architecture/restricted-codex-analysis.md +34 -28
  583. package/docs/architecture/serve.md +34 -37
  584. package/docs/architecture/state-driven-executor.md +55 -58
  585. package/docs/architecture/task-protocol-support.md +6 -6
  586. package/docs/architecture/terminal-product-route.md +70 -110
  587. package/docs/contracts/README.md +24 -0
  588. package/docs/contracts/adapter-admission.md +3 -3
  589. package/docs/contracts/adapter-fixtures.md +4 -7
  590. package/docs/contracts/core.md +1 -3
  591. package/docs/contracts/errors.md +62 -0
  592. package/docs/contracts/feedback.md +8 -9
  593. package/docs/contracts/policy.md +7 -12
  594. package/docs/contracts/run-bundle.md +42 -44
  595. package/docs/contracts/schemas.md +446 -368
  596. package/docs/contracts/study-analysis.md +7 -4
  597. package/docs/contracts/study-costs.md +28 -9
  598. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  599. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  600. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  601. package/docs/principles/actor-fidelity.md +4 -4
  602. package/docs/principles/engineering.md +3 -3
  603. package/docs/principles/invariants-and-defaults.md +38 -38
  604. package/docs/principles/self-driving-harness.md +1 -5
  605. package/docs/principles/three-roles.md +1 -1
  606. package/docs/product/automatic-analysis.md +7 -7
  607. package/examples/README.md +1 -1
  608. package/examples/participant/README.md +5 -5
  609. package/examples/participant/run.mjs +11 -10
  610. package/examples/scorer/README.md +3 -3
  611. package/examples/scorer/run.mjs +11 -12
  612. package/examples/scorer/scorer.mjs +3 -3
  613. package/package.json +16 -17
  614. package/skills/humanish/SKILL.md +64 -60
  615. package/skills/humanish/agents/openai.yaml +1 -1
  616. package/AGENTS.md +0 -99
  617. package/CONTRIBUTING.md +0 -148
  618. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  619. package/dist/actors/codex/qualified-versions.js +0 -132
  620. package/dist/cli/commands/lab-format.d.ts +0 -8
  621. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  622. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  623. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  624. package/dist/cli/commands/lab-run.d.ts +0 -9
  625. package/dist/cli/commands/lab.d.ts +0 -3
  626. package/dist/cli/commands/lab.js +0 -199
  627. package/dist/cli/renamed-options.d.ts +0 -11
  628. package/dist/cli/renamed-options.js +0 -18
  629. package/dist/lab/composition-rules.d.ts +0 -7
  630. package/dist/lab/config.d.ts +0 -7
  631. package/dist/lab/discover.d.ts +0 -65
  632. package/dist/lab/init-templates.js +0 -416
  633. package/dist/lab/keys.d.ts +0 -2
  634. package/dist/lab/parse/comms.d.ts +0 -12
  635. package/dist/lab/parse/execution.d.ts +0 -19
  636. package/dist/lab/parse/subject-state.d.ts +0 -30
  637. package/dist/lab/plan.d.ts +0 -19
  638. package/dist/lab/plan.js +0 -132
  639. package/dist/lab/preflight-probes.d.ts +0 -3
  640. package/dist/lab/preflight-result.d.ts +0 -7
  641. package/dist/lab/preflight.d.ts +0 -92
  642. package/dist/lab/route-inputs.d.ts +0 -28
  643. package/dist/lab/run-lab-options.d.ts +0 -28
  644. package/dist/lab/warnings.d.ts +0 -2
  645. package/dist/observer/static.d.ts +0 -39
  646. package/dist/observer/static.js +0 -369
  647. package/dist/run-lab.d.ts +0 -112
  648. package/docs/architecture/comms-inbox.md +0 -122
  649. package/docs/architecture/desktop-recording.md +0 -80
  650. package/docs/architecture/local-browser-runtime.md +0 -178
  651. package/docs/architecture/observer-review.md +0 -144
  652. package/docs/architecture/participant-media.md +0 -90
  653. package/docs/architecture/project-layout.md +0 -62
  654. package/docs/architecture/real-email-receiving.md +0 -136
  655. package/docs/assets/humanish-drawdb-hero.png +0 -0
  656. package/docs/assets/humanish-observer-hero.png +0 -0
  657. package/docs/goals/current.md +0 -207
  658. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  659. package/docs/product/open-source-install-experience.md +0 -240
  660. package/docs/ramp/README.md +0 -295
  661. package/docs/release/open-source-readiness.md +0 -222
  662. package/docs/release/public-readiness-standard.md +0 -210
  663. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  664. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  665. /package/dist/{lab → study}/init-paths.js +0 -0
  666. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  667. /package/dist/{lab → study}/init-plan.js +0 -0
  668. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  669. /package/dist/{lab → study}/participant-assignment.js +0 -0
  670. /package/dist/{lab → study}/persona.d.ts +0 -0
  671. /package/dist/{lab → study}/persona.js +0 -0
@@ -1,74 +1,79 @@
1
- // runLab runs one lab. It normalizes the caller's options, binds a local browser study's desktop
2
- // and provider, and plans the lab once with planLab. A refused plan returns the route's own result
1
+ // runStudyWith runs one study. It normalizes the caller's options, binds a local browser study's desktop
2
+ // and provider, and plans the study once with planStudy. A refused plan returns the route's own result
3
3
  // envelope before anything starts. One switch on plan.route then calls the route's admit function,
4
4
  // which runs the route's local checks that need no scorer (keys, subject env, the local agent) and
5
- // returns the route's run. prepareLab is the same path in two steps, so the CLI can present either
5
+ // returns the route's run. prepareStudy is the same path in two steps, so the CLI can present either
6
6
  // refusal before it loads a declared review scorer.
7
- import { computerUseInput, scriptedInput, sharedWorldInput, terminalInput, } from "./lab/route-inputs.js";
8
- import { planLab, resolveLabDryRun, routeOf } from "./lab/plan.js";
9
- import { normalizeRunLabOptions, optionRefusalOutcome, removedOptionRefusal, } from "./lab/run-lab-options.js";
10
- import {} from "./lab/types.js";
11
- import { admitComputerUsePlan, computerUseLabRefusal } from "./routes/computer-use/route.js";
7
+ import { computerUseInput, scriptedInput, sharedWorldInput, terminalInput, } from "./study/route-inputs.js";
8
+ import { planStudy, resolveStudyDryRun, routeOf } from "./study/plan.js";
9
+ import { normalizeRunStudyOptions, optionRefusalOutcome, removedOptionRefusal, } from "./study/run-study-options.js";
10
+ import { V2_SCHEMA } from "./study/types.js";
11
+ import { V2_UNSUPPORTED_MESSAGE } from "./study/config.js";
12
+ import { admitComputerUsePlan, computerUseStudyRefusal } from "./routes/computer-use/route.js";
12
13
  import {} from "./routes/computer-use/types.js";
13
- import { admitPreviewPlan, previewLabRefusal } from "./routes/preview.js";
14
- import { admitScriptedPlan, scriptedLabRefusal } from "./routes/scripted/route.js";
14
+ import { admitPreviewPlan, previewStudyRefusal, } from "./routes/preview.js";
15
+ import { admitScriptedPlan, scriptedStudyRefusal } from "./routes/scripted/route.js";
15
16
  import {} from "./routes/scripted/types.js";
16
- import { admitSharedWorldPlan, sharedWorldLabRefusal } from "./routes/shared-world/route.js";
17
+ import { admitSharedWorldPlan, sharedWorldStudyRefusal } from "./routes/shared-world/route.js";
17
18
  import {} from "./routes/shared-world/types.js";
18
- import { admitTerminalPlan, terminalLabRefusal } from "./routes/terminal/route.js";
19
+ import { admitTerminalPlan, terminalStudyRefusal } from "./routes/terminal/route.js";
19
20
  import {} from "./routes/terminal/types.js";
20
21
  import {} from "./run/bundle.js";
21
- import {} from "./run/results.js";
22
- import {} from "./run/status.js";
23
- import { isLocalBrowserLab, localBrowserDefaults } from "./substrates/local/runtime-config.js";
22
+ import { isLocalBrowserStudy, localBrowserDefaults } from "./substrates/local/runtime-config.js";
24
23
  /**
25
- * Runs a lab on its route. The options are checked against the route and mapped into the route's
24
+ * Runs a study on its route. The options are checked against the route and mapped into the route's
26
25
  * hook bags before anything runs. Each route closes the run it started on every exit through its
27
26
  * own run scope (`src/run/run.ts`).
28
27
  */
29
- export async function runLab(config, options, deps = {}) {
30
- const prepared = await prepareLab(config, options, deps);
28
+ export async function runStudyWith(config, options, deps = {}) {
29
+ const prepared = await prepareStudy(config, options, deps);
31
30
  return prepared.ok ? prepared.run() : prepared.outcome;
32
31
  }
33
32
  /**
34
- * runLab as the package exports it (`src/index.ts`): the public options only. A JavaScript caller
35
- * that passes a field RunLabOptions no longer has is refused in the route's own result envelope
36
- * before anything runs.
33
+ * The package's study runner (`src/index.ts`): runStudyWith with the public options only. A
34
+ * JavaScript caller that passes a field RunStudyOptions no longer has, or a humanish.lab.v2 config,
35
+ * is refused in the route's own result envelope before anything runs.
37
36
  */
38
- export async function runPackageLab(config, options) {
39
- const removed = removedOptionRefusal(options);
40
- if (removed === undefined)
41
- return runLab(config, options);
42
- const lab = localBrowserDefaults(config);
43
- return optionRefusalOutcome(lab, routeOf(lab), options, removed);
37
+ export async function runStudy(config, options) {
38
+ const refusal = config.schema === V2_SCHEMA
39
+ ? {
40
+ ok: false,
41
+ code: "HUMANISH_STUDY_V2_UNSUPPORTED",
42
+ message: V2_UNSUPPORTED_MESSAGE,
43
+ }
44
+ : removedOptionRefusal(options);
45
+ if (refusal === undefined)
46
+ return runStudyWith(config, options);
47
+ const study = localBrowserDefaults(config);
48
+ return optionRefusalOutcome(study, routeOf(study), options, refusal);
44
49
  }
45
50
  /**
46
- * Normalizes the options and plans the lab once, so a caller can present a refusal before it loads
51
+ * Normalizes the options and plans the study once, so a caller can present a refusal before it loads
47
52
  * anything the run needs. A local browser study's provider is bound first, so the plan is made with
48
53
  * it, and its desktop goes to the computer-use run as `localVm`; with inProcess the caller drives
49
54
  * the app in process and needs no desktop.
50
55
  */
51
- export async function prepareLab(config, options, deps = {}) {
52
- const lab = localBrowserDefaults(config);
53
- const route = routeOf(lab);
54
- const normalized = normalizeRunLabOptions(lab, route, options);
56
+ export async function prepareStudy(config, options, deps = {}) {
57
+ const study = localBrowserDefaults(config);
58
+ const route = routeOf(study);
59
+ const normalized = normalizeRunStudyOptions(study, route, options);
55
60
  if (!normalized.ok)
56
- return { ok: false, outcome: optionRefusalOutcome(lab, route, options, normalized) };
61
+ return { ok: false, outcome: optionRefusalOutcome(study, route, options, normalized) };
57
62
  // An in-process executor needs no desktop, and a caller that already prepared the study passes
58
63
  // its localVm, which a second study would replace.
59
- const prepareLocalVm = isLocalBrowserLab(lab) && options.inProcess === undefined && options.localVm === undefined
64
+ const prepareLocalVm = isLocalBrowserStudy(study) && options.inProcess === undefined && options.localVm === undefined
60
65
  ? (await import("./routes/computer-use/local-vm.js")).prepareLocalVmRun
61
66
  : undefined;
62
- const vm = prepareLocalVm?.({ ...normalized.options, config: lab });
67
+ const vm = prepareLocalVm?.({ ...normalized.options, config: study });
63
68
  const planning = vm === undefined ? normalized.options : { ...vm.options, localVm: vm.localVm };
64
- const planned = planLab(lab, planning, deps);
69
+ const planned = planStudy(study, planning, deps);
65
70
  if (!planned.ok) {
66
71
  await vm?.close();
67
- const outcome = await refusalOutcome(lab, planning, planned.refusal, deps, normalized.emit);
72
+ const outcome = await refusalOutcome(study, planning, planned.refusal, deps, normalized.emit);
68
73
  outcome.result.warnings.push(...normalized.warnings);
69
74
  return { ok: false, outcome };
70
75
  }
71
- const admitted = await admitPlan(lab, planning, planned.planned.plan, deps, normalized.emit);
76
+ const admitted = await admitPlan(study, planning, planned.planned.plan, deps, normalized.emit);
72
77
  if (!admitted.ok) {
73
78
  await vm?.close();
74
79
  admitted.outcome.result.warnings.push(...normalized.warnings);
@@ -83,9 +88,9 @@ export async function prepareLab(config, options, deps = {}) {
83
88
  if (scorer !== undefined) {
84
89
  // Checks the scorer against the route and the caller's options, as if passed up front.
85
90
  // Only its refusal is used; its options and warnings array are not.
86
- const withScorer = normalizeRunLabOptions(lab, route, { ...options, ...scorer });
91
+ const withScorer = normalizeRunStudyOptions(study, route, { ...options, ...scorer });
87
92
  if (!withScorer.ok) {
88
- const outcome = optionRefusalOutcome(lab, route, options, withScorer);
93
+ const outcome = optionRefusalOutcome(study, route, options, withScorer);
89
94
  outcome.result.warnings.push(...normalized.warnings);
90
95
  return outcome;
91
96
  }
@@ -120,33 +125,33 @@ async function admitPlan(config, options, plan, deps, emit) {
120
125
  }
121
126
  /** The refused route's own result, with the envelope and analysis record its runner returns. */
122
127
  async function refusalOutcome(config, options, refusal, deps, emit) {
123
- // Spend-safe default: a lab goes live only when the config (or CLI) says so.
124
- const dryRun = resolveLabDryRun(config, options.dryRun, true) ?? true;
128
+ // Spend-safe default: a study goes live only when the config (or CLI) says so.
129
+ const dryRun = resolveStudyDryRun(config, options.dryRun, true) ?? true;
125
130
  switch (refusal.route) {
126
131
  case "preview":
127
132
  return {
128
133
  route: "preview",
129
- result: previewLabRefusal(options.cwd, refusal),
134
+ result: previewStudyRefusal(options.cwd, config.id, refusal),
130
135
  };
131
136
  case "computer-use":
132
137
  return {
133
138
  route: "computer-use",
134
- result: await computerUseLabRefusal({ ...computerUseInput(options, deps, emit), config, dryRun }, refusal),
139
+ result: await computerUseStudyRefusal({ ...computerUseInput(options, deps, emit), config, dryRun }, refusal),
135
140
  };
136
141
  case "scripted":
137
142
  return {
138
143
  route: "scripted",
139
- result: await scriptedLabRefusal({ ...scriptedInput(options, deps, emit), config, dryRun }, refusal),
144
+ result: await scriptedStudyRefusal({ ...scriptedInput(options, deps, emit), config, dryRun }, refusal),
140
145
  };
141
146
  case "terminal":
142
147
  return {
143
148
  route: "terminal",
144
- result: await terminalLabRefusal({ ...terminalInput(options, deps, emit), config, dryRun }, refusal),
149
+ result: await terminalStudyRefusal({ ...terminalInput(options, deps, emit), config, dryRun }, refusal),
145
150
  };
146
151
  case "shared-world":
147
152
  return {
148
153
  route: "shared-world",
149
- result: await sharedWorldLabRefusal({ ...sharedWorldInput(options, deps, emit), config, dryRun }, refusal),
154
+ result: await sharedWorldStudyRefusal({ ...sharedWorldInput(options, deps, emit), config, dryRun }, refusal),
150
155
  };
151
156
  }
152
157
  }
@@ -1,5 +1,4 @@
1
1
  import type { RunAdapterArtifact, RunAdapterScore, RunBundle, RunFeedbackCandidate, RunScorerProvenance } from "../run/bundle.js";
2
- type BrowserAdapterBackend = "cua" | "shared-world" | "concurrent-shared-world";
3
2
  /** The routes that call a browser scorer. */
4
3
  type BrowserScorerRoute = "computer-use" | "shared-world";
5
4
  /**
@@ -7,7 +6,7 @@ type BrowserScorerRoute = "computer-use" | "shared-world";
7
6
  * evidence/rubrics stay in the adopter's repo; core provides the assembled bundle
8
7
  * plus stable run identifiers and never learns product nouns.
9
8
  */
10
- export interface BrowserLabScoringContext {
9
+ export interface BrowserScoringContext {
11
10
  bundle: RunBundle;
12
11
  /**
13
12
  * Absolute path to the ignored run directory. Adapter hooks may write their
@@ -15,68 +14,57 @@ export interface BrowserLabScoringContext {
15
14
  * `deriveArtifacts`. This path is runtime-only and must never be persisted.
16
15
  */
17
16
  runDir: string;
18
- labId: string;
17
+ /** The study id. */
18
+ studyId: string;
19
19
  runId: string;
20
20
  actor: string;
21
21
  /** The route that ran the participants. */
22
22
  route: BrowserScorerRoute;
23
- /**
24
- * @deprecated Use `route`. `cua` is `computer-use` and `concurrent-shared-world` is
25
- * `shared-world`. Reading it warns once per process; the next minor removes it.
26
- */
27
- backend: BrowserAdapterBackend;
28
23
  dryRun: boolean;
29
24
  /** How many participants the run had. */
30
25
  participantCount: number;
31
- /**
32
- * @deprecated Use `participantCount`, which has the same value. Reading it warns once per
33
- * process; the next minor removes it.
34
- */
35
- laneCount: number;
36
26
  }
37
- /** The context a route passes to applyBrowserScorer; the deprecated fields derive from it. */
38
- type BrowserScoringFacts = Omit<BrowserLabScoringContext, "backend" | "laneCount">;
39
- /** The scorer functions a computer-use or shared-world run calls: `RunLabOptions.scorer`. */
27
+ /** The scorer functions a computer-use or shared-world run calls: `RunStudyOptions.scorer`. */
40
28
  export interface BrowserScorer {
41
29
  /**
42
- * Browser-route extension seam (#165): a thin adapter may score the assembled
30
+ * Browser-route extension seam: a thin adapter may score the assembled
43
31
  * browser/shared-world evidence without forking core. The score is stored as
44
32
  * namespaced `bundle.adapterScore`; product-specific component detail belongs
45
33
  * in `data`, not in core enums or review text.
46
34
  */
47
- score?: (ctx: BrowserLabScoringContext) => RunAdapterScore | Promise<RunAdapterScore>;
35
+ score?: (ctx: BrowserScoringContext) => RunAdapterScore | Promise<RunAdapterScore>;
48
36
  /**
49
37
  * Companion seam for public-safe, adapter-namespaced feedback candidates.
50
38
  * Malformed candidates are dropped before bundle persistence so core remains
51
39
  * verifiable even when an adapter misbehaves.
52
40
  */
53
- deriveFeedback?: (ctx: BrowserLabScoringContext) => RunFeedbackCandidate[] | Promise<RunFeedbackCandidate[]>;
41
+ deriveFeedback?: (ctx: BrowserScoringContext) => RunFeedbackCandidate[] | Promise<RunFeedbackCandidate[]>;
54
42
  /**
55
43
  * Optional product/state proof artifact references. The adapter writes files
56
44
  * under `ctx.runDir` and returns local relative paths. Core stores only the
57
45
  * namespaced references and `verify` fails closed if referenced files are
58
46
  * missing or nonlocal.
59
47
  */
60
- deriveArtifacts?: (ctx: BrowserLabScoringContext) => RunAdapterArtifact[] | Promise<RunAdapterArtifact[]>;
48
+ deriveArtifacts?: (ctx: BrowserScoringContext) => RunAdapterArtifact[] | Promise<RunAdapterArtifact[]>;
61
49
  }
62
50
  /** What a scorer found against the run, for the route's final review fold (foldScorerFailures). */
63
51
  export interface ScorerOutcome {
64
52
  /** Why the scorer failed the run, in order; empty when it did not. */
65
53
  failures: string[];
66
54
  }
67
- /** A DECLARED scorer that returned a malformed value never rendered a verdict. */
55
+ /** A declared scorer that returned a malformed value never rendered a verdict. */
68
56
  export declare const DECLARED_SCORER_MALFORMED = "Declared product scorer returned a malformed value instead of a verdict; a declared gate that cannot render a pass is recorded as a fail, never a silent pass.";
69
- /** A DECLARED scorer that threw never rendered a verdict. `detail` is already sanitized. */
57
+ /** A declared scorer that threw never rendered a verdict. `detail` is already sanitized. */
70
58
  export declare function declaredScorerThrew(detail: string): string;
71
59
  export declare function applyBrowserScorer(args: {
72
60
  scorer: BrowserScorer | undefined;
73
- context: BrowserScoringFacts;
61
+ context: BrowserScoringContext;
74
62
  bundle: RunBundle;
75
63
  sanitize: (text: string) => string;
76
64
  warnings: string[];
77
- /** Present only when the scorer was CONFIG-DECLARED (#316); core-stamped onto the bundle as
65
+ /** Present only when the scorer was config-declared; core-stamped onto the bundle as
78
66
  * evidence of which out-of-tree module was loaded. Absent for library callers. Its presence also
79
- * makes a THROWING or MALFORMED scorer a failure — a declared gate that cannot render a pass is
67
+ * makes a throwing or malformed scorer a failure: a declared gate that cannot render a pass is
80
68
  * a fail, never a silent green. */
81
69
  scorerProvenance?: RunScorerProvenance;
82
70
  }): Promise<ScorerOutcome>;
@@ -88,10 +76,10 @@ export declare function applyBrowserScorer(args: {
88
76
  export declare function isAdapterFeedbackCandidate(value: unknown): value is RunFeedbackCandidate;
89
77
  export declare function adapterScoreFailureMessage(bundle: RunBundle): string | undefined;
90
78
  /**
91
- * Deep-freeze a structured clone so a loaded scorer sees a READ-ONLY bundle: it cannot mutate
79
+ * Deep-freeze a structured clone so a loaded scorer sees a read-only bundle: it cannot mutate
92
80
  * noSpend/cost/review in place to launder a verdict (which would defeat the costProbe-not-loadable
93
81
  * guarantee). A tamper attempt throws in the scorer's strict-mode ESM and is caught as a hook failure.
94
- * Legitimate read-only scoring is unaffected. The seam always stamps the REAL bundle, never this view.
82
+ * Legitimate read-only scoring is unaffected. The seam always stamps the real bundle, never this view.
95
83
  */
96
84
  export declare function frozenBundleView(bundle: RunBundle): RunBundle;
97
85
  export {};
@@ -2,44 +2,9 @@ import path from "node:path";
2
2
  import { isRunAdapterScore } from "../run/bundle-shape.js";
3
3
  import { isRunFeedbackCandidate } from "../run/feedback-shape.js";
4
4
  import { isRecord } from "../run/type-guards.js";
5
- const OLDER_BACKEND = {
6
- "computer-use": "cua",
7
- "shared-world": "concurrent-shared-world",
8
- };
9
- const warnedFields = new Set();
10
- function warnOlderField(name, replacement) {
11
- if (warnedFields.has(name))
12
- return;
13
- warnedFields.add(name);
14
- process.emitWarning(`BrowserLabScoringContext.${name} is deprecated and is removed in the next minor. Use ${replacement}.`, { type: "DeprecationWarning", code: "HUMANISH_SCORING_CONTEXT_FIELD_DEPRECATED" });
15
- }
16
- /**
17
- * The scorer's context: the facts, plus the older `backend` and `laneCount` as getters that warn
18
- * once when a scorer reads them. They are not enumerable, so a spread, `Object.assign`,
19
- * `JSON.stringify` or `structuredClone` of the context skips them and warns about no field the
20
- * code never named. `"backend" in ctx` still finds them. Core never reads them.
21
- */
22
- function scorerContext(facts) {
23
- return Object.defineProperties({ ...facts }, {
24
- backend: {
25
- enumerable: false,
26
- get: () => {
27
- warnOlderField("backend", "route");
28
- return OLDER_BACKEND[facts.route];
29
- },
30
- },
31
- laneCount: {
32
- enumerable: false,
33
- get: () => {
34
- warnOlderField("laneCount", "participantCount");
35
- return facts.participantCount;
36
- },
37
- },
38
- });
39
- }
40
- /** A DECLARED scorer that returned a malformed value never rendered a verdict. */
5
+ /** A declared scorer that returned a malformed value never rendered a verdict. */
41
6
  export const DECLARED_SCORER_MALFORMED = "Declared product scorer returned a malformed value instead of a verdict; a declared gate that cannot render a pass is recorded as a fail, never a silent pass.";
42
- /** A DECLARED scorer that threw never rendered a verdict. `detail` is already sanitized. */
7
+ /** A declared scorer that threw never rendered a verdict. `detail` is already sanitized. */
43
8
  export function declaredScorerThrew(detail) {
44
9
  return `Declared product scorer threw before returning a verdict (${detail}); a crashed declared gate is recorded as a fail, never a silent pass.`;
45
10
  }
@@ -49,17 +14,17 @@ export async function applyBrowserScorer(args) {
49
14
  return { failures: [] };
50
15
  const declared = scorerProvenance !== undefined;
51
16
  // Record the loaded scorer's identity regardless of hook outcome (a throwing/invalid scorer was
52
- // still loaded and attempted). A VALID status:"fail" is a failure (library + declared, the
53
- // pre-#316 (#165) path); a DECLARED scorer that THROWS or returns MALFORMED is one too (below).
17
+ // still loaded and attempted). A valid status:"fail" is a failure (library + declared, the
18
+ // original path); a declared scorer that throws or returns a malformed value is one too (below).
54
19
  if (scorerProvenance)
55
20
  bundle.scorerProvenance = scorerProvenance;
56
- // The scorer sees a READ-ONLY view of the bundle: it cannot mutate noSpend/cost/review in place to
21
+ // The scorer sees a read-only view of the bundle: it cannot mutate noSpend/cost/review in place to
57
22
  // launder a verdict (a tamper attempt throws in the scorer's strict-mode ESM and is caught below as
58
- // a hook failure). The seam still stamps the REAL bundle.
59
- const scoringContext = scorerContext({
23
+ // a hook failure). The seam still stamps the real bundle.
24
+ const scoringContext = {
60
25
  ...context,
61
26
  bundle: frozenBundleView(context.bundle),
62
- });
27
+ };
63
28
  const scrubValue = (value) => {
64
29
  const encoded = JSON.stringify(value);
65
30
  return encoded === undefined ? value : JSON.parse(sanitize(encoded));
@@ -142,10 +107,10 @@ export function adapterScoreFailureMessage(bundle) {
142
107
  : undefined;
143
108
  }
144
109
  /**
145
- * Deep-freeze a structured clone so a loaded scorer sees a READ-ONLY bundle: it cannot mutate
110
+ * Deep-freeze a structured clone so a loaded scorer sees a read-only bundle: it cannot mutate
146
111
  * noSpend/cost/review in place to launder a verdict (which would defeat the costProbe-not-loadable
147
112
  * guarantee). A tamper attempt throws in the scorer's strict-mode ESM and is caught as a hook failure.
148
- * Legitimate read-only scoring is unaffected. The seam always stamps the REAL bundle, never this view.
113
+ * Legitimate read-only scoring is unaffected. The seam always stamps the real bundle, never this view.
149
114
  */
150
115
  export function frozenBundleView(bundle) {
151
116
  const clone = structuredClone(bundle);
@@ -1,17 +1,17 @@
1
- import type { BrowserLabScoringContext } from "./adapter-extension.js";
1
+ import type { BrowserScoringContext } from "./adapter-extension.js";
2
2
  import type { TerminalProductScoringContext } from "../routes/terminal/types.js";
3
- import type { LabRoute } from "./plan.js";
3
+ import type { StudyRoute } from "./plan.js";
4
4
  import type { RunAdapterArtifact, RunAdapterScore, RunFeedbackCandidate, RunScorerProvenance } from "../run/bundle.js";
5
- /** The read-model context a loaded scorer sees — the terminal or browser scoring context. The module
5
+ /** The read-model context a loaded scorer sees: the terminal or browser scoring context. The module
6
6
  * narrows it at runtime (`"product" in ctx` ⇒ terminal; `"route" in ctx` ⇒ browser). */
7
- export type AdapterScoringContext = TerminalProductScoringContext | BrowserLabScoringContext;
7
+ export type AdapterScoringContext = TerminalProductScoringContext | BrowserScoringContext;
8
8
  /**
9
- * The adopter-facing scorer module contract (#316). Export any subset of these from a `.mjs` (or a
10
- * `.js`/`.cjs` whose package.json type matches) — named exports OR a single default object. The
11
- * loader wires ONLY these three; an exported `executor`/`env`/`provisionSubject`/`costProbe` is never
12
- * picked up (the whitelist is the scope guard). A module exporting NONE of them is a hard load error.
9
+ * The adopter-facing scorer module contract. Export any subset of these from a `.mjs` (or a
10
+ * `.js`/`.cjs` whose package.json type matches): named exports or a single default object. The
11
+ * loader wires only these three; an exported `executor`/`env`/`provisionSubject`/`costProbe` is never
12
+ * picked up (the whitelist is the scope guard). A module exporting none of them is a hard load error.
13
13
  *
14
- * `C` is the context `score` and `deriveFeedback` read: `BrowserLabScoringContext` for a scorer
14
+ * `C` is the context `score` and `deriveFeedback` read: `BrowserScoringContext` for a scorer
15
15
  * written for computer use and shared world, `TerminalProductScoringContext` for one written for
16
16
  * terminal runs, or the default union for one that narrows at runtime.
17
17
  */
@@ -19,25 +19,25 @@ export interface AdapterScorerModule<C extends AdapterScoringContext = AdapterSc
19
19
  score?: (ctx: C) => RunAdapterScore | Promise<RunAdapterScore>;
20
20
  deriveFeedback?: (ctx: C) => RunFeedbackCandidate[] | Promise<RunFeedbackCandidate[]>;
21
21
  /** Browser-route only; inert on the terminal route, whose TerminalScorer has no artifacts seam. */
22
- deriveArtifacts?: (ctx: BrowserLabScoringContext) => RunAdapterArtifact[] | Promise<RunAdapterArtifact[]>;
22
+ deriveArtifacts?: (ctx: BrowserScoringContext) => RunAdapterArtifact[] | Promise<RunAdapterArtifact[]>;
23
23
  }
24
24
  /**
25
- * A scorer written for computer use and shared world, as `RunLabOptions.scorer` takes it. Those
25
+ * A scorer written for computer use and shared world, as `RunStudyOptions.scorer` takes it. Those
26
26
  * routes pass the browser context; another route that calls it passes a context it was not written
27
27
  * for. The call states the kind, so the module itself needs no cast.
28
28
  */
29
- export declare function browserScorer(scorer: AdapterScorerModule<BrowserLabScoringContext>): AdapterScorerModule;
30
- /** A scorer written for terminal runs, as `RunLabOptions.scorer` takes it (see browserScorer). */
29
+ export declare function browserScorer(scorer: AdapterScorerModule<BrowserScoringContext>): AdapterScorerModule;
30
+ /** A scorer written for terminal runs, as `RunStudyOptions.scorer` takes it (see browserScorer). */
31
31
  export declare function terminalScorer(scorer: AdapterScorerModule<TerminalProductScoringContext>): AdapterScorerModule;
32
32
  /**
33
33
  * The scorer as a computer-use or shared-world run calls it, with the browser context. The caller
34
34
  * chose the context it wrote the scorer for; only the route knows which context it passes, so the
35
35
  * narrowing is here. A terminal-typed scorer on a browser route reads fields the context lacks.
36
36
  */
37
- export declare function browserRouteScorer(scorer: AdapterScorerModule): AdapterScorerModule<BrowserLabScoringContext>;
37
+ export declare function browserRouteScorer(scorer: AdapterScorerModule): AdapterScorerModule<BrowserScoringContext>;
38
38
  /** The scorer as a terminal run calls it, with the terminal context (see browserRouteScorer). */
39
39
  export declare function terminalRouteScorer(scorer: AdapterScorerModule): AdapterScorerModule<TerminalProductScoringContext>;
40
- type AdapterScorerLoadErrorCode = "HUMANISH_LAB_SCORER_BAD_REF" | "HUMANISH_LAB_SCORER_NOT_FOUND" | "HUMANISH_LAB_SCORER_LOAD_FAILED" | "HUMANISH_LAB_SCORER_NO_HOOKS" | "HUMANISH_LAB_SCORER_UNSUPPORTED_BACKEND";
40
+ type AdapterScorerLoadErrorCode = "HUMANISH_STUDY_SCORER_BAD_REF" | "HUMANISH_STUDY_SCORER_NOT_FOUND" | "HUMANISH_STUDY_SCORER_LOAD_FAILED" | "HUMANISH_STUDY_SCORER_NO_HOOKS" | "HUMANISH_STUDY_SCORER_UNSUPPORTED_BACKEND";
41
41
  export type AdapterScorerLoadResult = {
42
42
  ok: true;
43
43
  hooks: AdapterScorerModule;
@@ -52,12 +52,12 @@ export type AdapterScorerLoadResult = {
52
52
  /**
53
53
  * Resolve + load a config-declared scorer module. Resolution clones scenario.ref exactly
54
54
  * (prepareSelectedOutputDirectory → cwd-clamp → readContainedRegularFile), then `import()`s the
55
- * entry file in a BROAD try/catch. The digest is over the readContainedRegularFile ENTRY bytes.
55
+ * entry file in a broad try/catch. The digest is over the readContainedRegularFile entry bytes.
56
56
  */
57
57
  export declare function loadAdapterScorer(args: {
58
58
  cwd: string;
59
59
  ref: string;
60
- route: LabRoute;
60
+ route: StudyRoute;
61
61
  source: "manifest" | "cli-flag";
62
62
  }): Promise<AdapterScorerLoadResult>;
63
63
  export {};
@@ -1,18 +1,18 @@
1
- // #316 — CLI-loadable adopter scorer. Resolve `review.scorer.ref` / `--scorer` to an out-of-tree
2
- // scorer module, load it fail-closed (typed error + exit 2, PRE-SPEND), and pick off ONLY the
1
+ // CLI-loadable adopter scorer. Resolve `review.scorer.ref` / `--scorer` to an out-of-tree
2
+ // scorer module, load it fail-closed (typed error + exit 2, before any spend), and pick off only the
3
3
  // whitelisted read-model hooks {score, deriveFeedback, deriveArtifacts}. `costProbe` is deliberately
4
- // NOT loadable — an injected provider cost line overwrites the core-measured one and can forge a
4
+ // not loadable: an injected provider cost line overwrites the core-measured one and can forge a
5
5
  // satisfied no-spend proof, so it stays library-only.
6
6
  //
7
- // TRUST MODEL (stated plainly, no overclaims): the party who writes `review.scorer.ref` is the party
8
- // who runs `humanish lab run` in their own checkout — identical trust to humanish.lab.yml or a
9
- // package.json script. #316 adds ZERO new execution capability; it relocates WHERE the reference is
10
- // declared. Containment is ENTRY-FILE-ONLY: `readContainedRegularFile` blocks abs/`..`/symlink/
7
+ // Trust model: the party who writes `review.scorer.ref` is the party
8
+ // who runs `humanish run` in their own checkout: identical trust to humanish.lab.yml or a
9
+ // package.json script. The loader adds no new execution capability; it relocates where the reference is
10
+ // declared. Containment is entry-file-only: `readContainedRegularFile` blocks abs/`..`/symlink/
11
11
  // hardlink/realpath-escape/TOCTOU on the entry module, but `import()` then executes the transitive
12
12
  // graph + npm deps with no clamp, and `import()` runs top-level module code before any whitelist
13
- // check. The whitelist bounds the WIRED HOOK SURFACE, not arbitrary import-time code; the
13
+ // check. The whitelist bounds the wired hook surface and does not cover import-time code; the
14
14
  // trusted-in-process boundary is the actual safety carrier. The seam's output re-scrub is a
15
- // best-effort denylist, NOT containment. `review.scorer.ref` entries are executable code — review a
15
+ // best-effort denylist that provides no containment. `review.scorer.ref` entries are executable code, so review a
16
16
  // PR that adds one as code, not config.
17
17
  import { realpath } from "node:fs/promises";
18
18
  import path from "node:path";
@@ -20,14 +20,14 @@ import { pathToFileURL } from "node:url";
20
20
  import { digestText, redactText } from "../evidence/redaction.js";
21
21
  import { prepareSelectedOutputDirectory, readContainedRegularFile, } from "../run/contained-output.js";
22
22
  /**
23
- * A scorer written for computer use and shared world, as `RunLabOptions.scorer` takes it. Those
23
+ * A scorer written for computer use and shared world, as `RunStudyOptions.scorer` takes it. Those
24
24
  * routes pass the browser context; another route that calls it passes a context it was not written
25
25
  * for. The call states the kind, so the module itself needs no cast.
26
26
  */
27
27
  export function browserScorer(scorer) {
28
28
  return scorer;
29
29
  }
30
- /** A scorer written for terminal runs, as `RunLabOptions.scorer` takes it (see browserScorer). */
30
+ /** A scorer written for terminal runs, as `RunStudyOptions.scorer` takes it (see browserScorer). */
31
31
  export function terminalScorer(scorer) {
32
32
  return scorer;
33
33
  }
@@ -43,20 +43,20 @@ export function browserRouteScorer(scorer) {
43
43
  export function terminalRouteScorer(scorer) {
44
44
  return scorer;
45
45
  }
46
- /** The routes whose hooks bag can carry the loaded scorer. A declared scorer on ANY other route
47
- * (scripted or preview) aborts at load — a gate that cannot run must never green-pass. */
46
+ /** The routes that can run the loaded scorer. A declared scorer on any other route
47
+ * (scripted or preview) aborts at load: a gate that cannot run must never green-pass. */
48
48
  const SCORER_CAPABLE_ROUTES = new Set([
49
49
  "terminal",
50
50
  "computer-use",
51
51
  "shared-world",
52
52
  ]);
53
- /** `.mjs` is required-canonical; `.js`/`.cjs` accepted but the module system is the adopter repo's
54
- * package.json `type`. `.ts` is rejected — the compiled `dist/` CLI ships no TypeScript loader. */
53
+ /** `.mjs` is the recommended extension; `.js`/`.cjs` accepted but the module system is the adopter repo's
54
+ * package.json `type`. `.ts` is rejected: the compiled `dist/` CLI ships no TypeScript loader. */
55
55
  const SCORER_EXTENSIONS = new Set([".mjs", ".js", ".cjs"]);
56
56
  /**
57
57
  * Resolve + load a config-declared scorer module. Resolution clones scenario.ref exactly
58
58
  * (prepareSelectedOutputDirectory → cwd-clamp → readContainedRegularFile), then `import()`s the
59
- * entry file in a BROAD try/catch. The digest is over the readContainedRegularFile ENTRY bytes.
59
+ * entry file in a broad try/catch. The digest is over the readContainedRegularFile entry bytes.
60
60
  */
61
61
  export async function loadAdapterScorer(args) {
62
62
  const { route, source } = args;
@@ -64,25 +64,25 @@ export async function loadAdapterScorer(args) {
64
64
  ok: false,
65
65
  error: { code, message },
66
66
  });
67
- // A declared gate that cannot run on this route must ABORT (never silently green-pass).
67
+ // A declared gate that cannot run on this route must abort (never silently green-pass).
68
68
  if (!SCORER_CAPABLE_ROUTES.has(route)) {
69
- return fail("HUMANISH_LAB_SCORER_UNSUPPORTED_BACKEND", `review.scorer.ref is declared but this lab resolves to the ${route} route, which has no adopter-scorer seam. A declared scorer that cannot run must fail closed rather than pass silently — declare it on a terminal, computer-use or shared-world lab.`);
69
+ return fail("HUMANISH_STUDY_SCORER_UNSUPPORTED_BACKEND", `review.scorer.ref is set, but this study runs on the ${route} route, which cannot run a scorer. The run stops here so the scorer is not silently skipped. Use it with a terminal, computer-use or shared-world study, or remove review.scorer.ref.`);
70
70
  }
71
71
  const trimmed = args.ref.trim();
72
72
  if (!trimmed) {
73
- return fail("HUMANISH_LAB_SCORER_BAD_REF", "review.scorer.ref must be a non-empty repo-relative path ending in .mjs (recommended), .js, or .cjs.");
73
+ return fail("HUMANISH_STUDY_SCORER_BAD_REF", "review.scorer.ref must be a non-empty repo-relative path ending in .mjs (recommended), .js, or .cjs.");
74
74
  }
75
- // Provenance is recorded repo-relative — an absolute ref (even one that happens to land inside cwd)
75
+ // Provenance is recorded repo-relative: an absolute ref (even one that happens to land inside cwd)
76
76
  // is rejected up front rather than silently rewritten to its in-tree relative form.
77
77
  if (path.isAbsolute(trimmed)) {
78
- return fail("HUMANISH_LAB_SCORER_BAD_REF", `review.scorer.ref "${trimmed}" must be a repo-relative path, not absolute — provenance is recorded repo-relative.`);
78
+ return fail("HUMANISH_STUDY_SCORER_BAD_REF", `review.scorer.ref "${trimmed}" must be a path relative to the project, not an absolute path, because the run records it relative to the project.`);
79
79
  }
80
80
  const ext = path.extname(trimmed).toLowerCase();
81
81
  if (ext === ".ts") {
82
- return fail("HUMANISH_LAB_SCORER_BAD_REF", `review.scorer.ref "${trimmed}" ends in .ts, but the shipped CLI runs compiled JS with no TypeScript loader. Precompile to .mjs (recommended) or .js/.cjs.`);
82
+ return fail("HUMANISH_STUDY_SCORER_BAD_REF", `review.scorer.ref "${trimmed}" ends in .ts, but the shipped CLI runs compiled JS with no TypeScript loader. Precompile to .mjs (recommended) or .js/.cjs.`);
83
83
  }
84
84
  if (!SCORER_EXTENSIONS.has(ext)) {
85
- return fail("HUMANISH_LAB_SCORER_BAD_REF", `review.scorer.ref "${trimmed}" must be a repo-relative PATH ending in .mjs (recommended), .js, or .cjs — an id-style ref is not supported.`);
85
+ return fail("HUMANISH_STUDY_SCORER_BAD_REF", `review.scorer.ref "${trimmed}" must be a path relative to the project ending in .mjs (recommended), .js or .cjs.`);
86
86
  }
87
87
  // Root token: realpath(cwd) → prepareSelectedOutputDirectory(dirname, cwd). Mirrors scenario.ref.
88
88
  const physicalCwd = await realpath(path.resolve(args.cwd));
@@ -91,18 +91,18 @@ export async function loadAdapterScorer(args) {
91
91
  const absolutePath = path.resolve(root.physicalPath, trimmed);
92
92
  const relative = path.relative(root.physicalPath, absolutePath);
93
93
  if (!relative || relative.startsWith("..") || path.isAbsolute(relative)) {
94
- return fail("HUMANISH_LAB_SCORER_BAD_REF", `review.scorer.ref "${trimmed}" must stay inside the target cwd — provenance is recorded repo-relative and an escaping/absolute path (a cwd parent, node_modules above cwd, an absolute path) cannot be.`);
94
+ return fail("HUMANISH_STUDY_SCORER_BAD_REF", `review.scorer.ref "${trimmed}" must stay inside the project directory, because the run records it relative to the project; a path into a parent directory cannot be recorded that way.`);
95
95
  }
96
96
  const relPosix = relative.split(path.sep).join("/");
97
- // Fail-closed containment gate on the ENTRY file only: rejects symlink, nlink>1, realpath-escape,
97
+ // Fail-closed containment gate on the entry file only: rejects symlink, nlink>1, realpath-escape,
98
98
  // TOCTOU. Its returned bytes are the digest input.
99
99
  const bytes = await readContainedRegularFile(root, relPosix);
100
100
  if (!bytes) {
101
- return fail("HUMANISH_LAB_SCORER_NOT_FOUND", `review.scorer.ref "${trimmed}" could not be read as a contained regular file (${relPosix}). A scorer must be a regular file inside the target cwd — no symlink, no hardlink, no realpath escape.`);
101
+ return fail("HUMANISH_STUDY_SCORER_NOT_FOUND", `review.scorer.ref "${trimmed}" could not be read as a regular file inside the project (${relPosix}). Use a plain file there: not a symlink or a hard link, and not a path that resolves outside the project.`);
102
102
  }
103
103
  const digest = digestText(bytes.toString("utf8"));
104
- // Import the entry module in a BROAD try/catch (ERR_MODULE_NOT_FOUND / SyntaxError / ERR_REQUIRE_ESM
105
- // / top-level throw). import() executes the transitive graph — the cwd clamp guards only the ENTRY
104
+ // Import the entry module in a broad try/catch (ERR_MODULE_NOT_FOUND / SyntaxError / ERR_REQUIRE_ESM
105
+ // / top-level throw). import() executes the transitive graph, and the cwd clamp guards only the entry
106
106
  // file; out-of-tree/transitive code is acceptable only because of the trust boundary above.
107
107
  let mod;
108
108
  try {
@@ -114,12 +114,12 @@ export async function loadAdapterScorer(args) {
114
114
  const hint = /ERR_REQUIRE_ESM|import statement outside a module|Cannot use import statement|Unexpected (?:token|identifier)|SyntaxError/i.test(detail)
115
115
  ? ' Use a .mjs entry file, or set "type": "module" in the nearest package.json.'
116
116
  : "";
117
- return fail("HUMANISH_LAB_SCORER_LOAD_FAILED", `review.scorer.ref "${trimmed}" failed to load: ${redactText(detail)}.${hint}`);
117
+ return fail("HUMANISH_STUDY_SCORER_LOAD_FAILED", `review.scorer.ref "${trimmed}" failed to load: ${redactText(detail)}.${hint}`);
118
118
  }
119
- // mod.default ?? mod, then pick off ONLY the whitelist. An exported executor/env/costProbe is never
120
- // wired — the whitelist is the scope guard. `exports` records the hooks ACTUALLY WIRED for this
119
+ // mod.default ?? mod, then pick off only the whitelist. An exported executor/env/costProbe is never
120
+ // wired; the whitelist is the scope guard. `exports` records the hooks actually wired for this
121
121
  // backend: deriveArtifacts is browser-only, so on the terminal route it is neither wired nor
122
- // recorded (a scorer that exported ONLY deriveArtifacts there wires nothing and fails closed below,
122
+ // recorded (a scorer that exported only deriveArtifacts there wires nothing and fails closed below,
123
123
  // never a silent no-op).
124
124
  const picked = (mod.default ?? mod);
125
125
  const terminalRoute = route === "terminal";
@@ -139,9 +139,9 @@ export async function loadAdapterScorer(args) {
139
139
  }
140
140
  if (exports.length === 0) {
141
141
  const artifactsOnly = terminalRoute && typeof picked.deriveArtifacts === "function";
142
- return fail("HUMANISH_LAB_SCORER_NO_HOOKS", artifactsOnly
142
+ return fail("HUMANISH_STUDY_SCORER_NO_HOOKS", artifactsOnly
143
143
  ? `review.scorer.ref "${trimmed}" exported only deriveArtifacts, which is browser-only and inert on the terminal route. Export score and/or deriveFeedback for a terminal-product scorer.`
144
- : `review.scorer.ref "${trimmed}" loaded but exported none of the adopter-scorer hooks (score, deriveFeedback, deriveArtifacts). Export at least one (named, or on a single default object). costProbe is intentionally NOT loadable.`);
144
+ : `review.scorer.ref "${trimmed}" loaded but exports none of score, deriveFeedback or deriveArtifacts. Export at least one, as a named export or on a default object. costProbe cannot be loaded from a scorer file.`);
145
145
  }
146
146
  const provenance = {
147
147
  schema: "humanish.scorer-provenance.v1",
@@ -0,0 +1,7 @@
1
+ import type { StudyConfig } from "./types.js";
2
+ /** The first composition rule a config breaks, in the parser's order, or null. */
3
+ export declare function compositionReason(config: StudyConfig): string | null;
4
+ /** Why a this-repo study cannot run live. The parser and the preview planner both refuse with it. */
5
+ export declare const THIS_REPO_DRY_RUN_ONLY = "this-repo studies are dry-run only; use a clone or app-url subject for a live run.";
6
+ /** A desktop-cli subject with no product to study. The computer-use planner checks this too. */
7
+ export declare function desktopCliProductReason(config: StudyConfig): string | null;