humanish 0.107.0 → 0.108.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 (521) hide show
  1. package/ARCHITECTURE.md +22 -17
  2. package/CHANGELOG.md +14 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +145 -172
  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-ui.js +1 -1
  14. package/dist/actors/codex/codex-admission.d.ts +91 -0
  15. package/dist/actors/codex/codex-admission.js +150 -0
  16. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  17. package/dist/actors/codex/restricted-executable.js +8 -8
  18. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  19. package/dist/actors/codex/restricted-launch.js +1 -1
  20. package/dist/actors/codex/restricted-participant.js +8 -6
  21. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  22. package/dist/actors/codex/restricted-policy.js +2 -2
  23. package/dist/actors/codex/restricted-session.d.ts +2 -2
  24. package/dist/actors/codex/restricted-session.js +10 -5
  25. package/dist/actors/computer-use/actor.d.ts +16 -16
  26. package/dist/actors/computer-use/actor.js +2 -2
  27. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  28. package/dist/actors/computer-use/admission-limit.js +1 -1
  29. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  30. package/dist/actors/computer-use/loop/actions.js +10 -10
  31. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  32. package/dist/actors/computer-use/loop/backstop.js +14 -12
  33. package/dist/actors/computer-use/loop/ending.d.ts +5 -5
  34. package/dist/actors/computer-use/loop/ending.js +7 -7
  35. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  36. package/dist/actors/computer-use/loop/observation.js +9 -9
  37. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  38. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  39. package/dist/actors/computer-use/loop/session.js +3 -3
  40. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  41. package/dist/actors/computer-use/loop/spend.js +1 -1
  42. package/dist/actors/computer-use/loop/trace.js +9 -8
  43. package/dist/actors/computer-use/loop/types.d.ts +25 -23
  44. package/dist/actors/computer-use/loop/usage.js +2 -2
  45. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  46. package/dist/actors/computer-use/openai-context.js +214 -0
  47. package/dist/actors/computer-use/openai-provider.d.ts +11 -8
  48. package/dist/actors/computer-use/openai-provider.js +45 -34
  49. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  50. package/dist/actors/computer-use/openai-requests.js +82 -15
  51. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  52. package/dist/actors/computer-use/openai-wire.js +36 -34
  53. package/dist/actors/contract.d.ts +78 -43
  54. package/dist/actors/contract.js +29 -23
  55. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  56. package/dist/actors/local-agent/claude-session.js +10 -9
  57. package/dist/actors/local-agent/cli.d.ts +8 -6
  58. package/dist/actors/local-agent/cli.js +24 -28
  59. package/dist/actors/local-agent/readiness.d.ts +2 -2
  60. package/dist/actors/local-agent/readiness.js +4 -4
  61. package/dist/actors/reasoning-effort.js +6 -6
  62. package/dist/actors/registry.d.ts +10 -10
  63. package/dist/actors/registry.js +18 -17
  64. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  65. package/dist/actors/scripted-browser/actor.js +16 -16
  66. package/dist/actors/scripted-browser/browser-command.js +1 -1
  67. package/dist/actors/scripted-browser/steps.js +1 -1
  68. package/dist/actors/scripted-browser/types.d.ts +1 -1
  69. package/dist/actors/stop-conditions.d.ts +1 -1
  70. package/dist/analysis/codex-config.d.ts +6 -2
  71. package/dist/analysis/codex-config.js +22 -14
  72. package/dist/analysis/service.js +5 -5
  73. package/dist/cli/commands/analyze.js +19 -16
  74. package/dist/cli/commands/codex.js +9 -9
  75. package/dist/cli/commands/comms.js +54 -33
  76. package/dist/cli/commands/feedback.js +20 -21
  77. package/dist/cli/commands/lab-format.d.ts +5 -4
  78. package/dist/cli/commands/lab-format.js +35 -23
  79. package/dist/cli/commands/lab-route-computer-use.js +6 -7
  80. package/dist/cli/commands/lab-route-preview.js +4 -3
  81. package/dist/cli/commands/lab-route-shared-world.js +3 -3
  82. package/dist/cli/commands/lab-run.js +10 -11
  83. package/dist/cli/commands/lab-scorer.d.ts +2 -2
  84. package/dist/cli/commands/lab-scorer.js +1 -1
  85. package/dist/cli/commands/migrate.d.ts +4 -0
  86. package/dist/cli/commands/migrate.js +65 -0
  87. package/dist/cli/commands/observe.js +147 -108
  88. package/dist/cli/commands/run-command.d.ts +10 -0
  89. package/dist/cli/commands/run-command.js +85 -0
  90. package/dist/cli/commands/runs.js +137 -138
  91. package/dist/cli/commands/setup.d.ts +2 -2
  92. package/dist/cli/commands/setup.js +26 -21
  93. package/dist/cli/commands/study.d.ts +3 -0
  94. package/dist/cli/commands/study.js +182 -0
  95. package/dist/cli/commands/tui.d.ts +4 -4
  96. package/dist/cli/commands/tui.js +21 -21
  97. package/dist/cli/commands/watch.js +60 -75
  98. package/dist/cli/deprecations.d.ts +18 -0
  99. package/dist/cli/deprecations.js +48 -0
  100. package/dist/cli/doctor.d.ts +15 -5
  101. package/dist/cli/doctor.js +103 -48
  102. package/dist/cli/first-run-path.d.ts +12 -10
  103. package/dist/cli/first-run-path.js +30 -28
  104. package/dist/cli/io.d.ts +41 -6
  105. package/dist/cli/io.js +97 -22
  106. package/dist/cli/observer-follow.d.ts +2 -2
  107. package/dist/cli/observer-follow.js +5 -6
  108. package/dist/cli/orientation.d.ts +6 -3
  109. package/dist/cli/orientation.js +43 -39
  110. package/dist/cli/product-sentence.d.ts +6 -0
  111. package/dist/cli/product-sentence.js +6 -0
  112. package/dist/cli/program.d.ts +6 -1
  113. package/dist/cli/program.js +109 -40
  114. package/dist/cli/telemetry.d.ts +15 -15
  115. package/dist/cli/telemetry.js +48 -40
  116. package/dist/cli.js +1 -1
  117. package/dist/comms/capture-surface.d.ts +13 -12
  118. package/dist/comms/capture-surface.js +23 -22
  119. package/dist/comms/catch-host.d.ts +7 -7
  120. package/dist/comms/catch-host.js +14 -14
  121. package/dist/comms/email-catch.d.ts +3 -3
  122. package/dist/comms/email-catch.js +8 -8
  123. package/dist/comms/external-evidence.js +2 -2
  124. package/dist/comms/extract.js +2 -2
  125. package/dist/comms/fake-inbox.d.ts +2 -2
  126. package/dist/comms/fake-inbox.js +2 -2
  127. package/dist/comms/receiving-render.d.ts +1 -1
  128. package/dist/comms/receiving-render.js +2 -2
  129. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  130. package/dist/comms/sandbox-catch-script.js +6 -6
  131. package/dist/comms/sandbox-catch.d.ts +36 -37
  132. package/dist/comms/sandbox-catch.js +34 -35
  133. package/dist/comms/setup.js +42 -8
  134. package/dist/comms/thread-evidence.d.ts +1 -1
  135. package/dist/comms/thread-evidence.js +6 -6
  136. package/dist/comms/types.d.ts +6 -6
  137. package/dist/comms/types.js +3 -3
  138. package/dist/evidence/frame-signature.d.ts +1 -1
  139. package/dist/evidence/frame-signature.js +4 -4
  140. package/dist/evidence/redaction.d.ts +3 -3
  141. package/dist/evidence/redaction.js +4 -4
  142. package/dist/feedback/draft.js +36 -78
  143. package/dist/feedback/export-bundle.js +1 -1
  144. package/dist/feedback/export.d.ts +5 -1
  145. package/dist/feedback/export.js +7 -8
  146. package/dist/feedback/feedback.d.ts +2 -2
  147. package/dist/feedback/feedback.js +21 -3
  148. package/dist/guest/chromium-text.js +2 -2
  149. package/dist/guest/desktop-native.d.ts +1 -1
  150. package/dist/guest/runtime.js +1 -1
  151. package/dist/index.d.ts +12 -10
  152. package/dist/index.js +8 -6
  153. package/dist/keys/key-resolution.d.ts +5 -5
  154. package/dist/keys/key-resolution.js +23 -23
  155. package/dist/lab/adapter-extension.d.ts +7 -7
  156. package/dist/lab/adapter-extension.js +13 -36
  157. package/dist/lab/adapter-scorer-loader.d.ts +7 -7
  158. package/dist/lab/adapter-scorer-loader.js +32 -32
  159. package/dist/lab/composition-rules.js +42 -42
  160. package/dist/lab/config.js +65 -25
  161. package/dist/lab/deprecated-fields.d.ts +10 -0
  162. package/dist/lab/deprecated-fields.js +24 -0
  163. package/dist/lab/device-presets.d.ts +8 -8
  164. package/dist/lab/device-presets.js +11 -11
  165. package/dist/lab/discover.d.ts +13 -9
  166. package/dist/lab/discover.js +117 -57
  167. package/dist/lab/doctor.d.ts +10 -3
  168. package/dist/lab/doctor.js +47 -9
  169. package/dist/lab/init-templates.js +147 -147
  170. package/dist/lab/init.d.ts +1 -1
  171. package/dist/lab/init.js +41 -9
  172. package/dist/lab/keys.d.ts +2 -0
  173. package/dist/lab/keys.js +42 -8
  174. package/dist/lab/lab-deps.d.ts +7 -12
  175. package/dist/lab/parse/actors.js +9 -9
  176. package/dist/lab/parse/comms.js +5 -5
  177. package/dist/lab/parse/execution.js +13 -13
  178. package/dist/lab/parse/study-v3.d.ts +23 -0
  179. package/dist/lab/parse/study-v3.js +259 -0
  180. package/dist/lab/parse/subject-state.d.ts +7 -7
  181. package/dist/lab/parse/subject-state.js +16 -16
  182. package/dist/lab/parse/subject.js +28 -28
  183. package/dist/lab/parse/values.d.ts +1 -1
  184. package/dist/lab/parse/values.js +3 -3
  185. package/dist/lab/persona-resolve.d.ts +4 -4
  186. package/dist/lab/persona-resolve.js +4 -4
  187. package/dist/lab/plan-participants.d.ts +2 -2
  188. package/dist/lab/plan-types.d.ts +4 -4
  189. package/dist/lab/plan.d.ts +1 -7
  190. package/dist/lab/plan.js +10 -41
  191. package/dist/lab/preflight-probes.js +11 -11
  192. package/dist/lab/preflight-result.d.ts +2 -1
  193. package/dist/lab/preflight-result.js +5 -4
  194. package/dist/lab/preflight.d.ts +7 -5
  195. package/dist/lab/preflight.js +5 -5
  196. package/dist/lab/routing.d.ts +31 -25
  197. package/dist/lab/routing.js +60 -29
  198. package/dist/lab/run-lab-events.d.ts +0 -3
  199. package/dist/lab/run-lab-events.js +0 -6
  200. package/dist/lab/run-lab-homes.d.ts +22 -10
  201. package/dist/lab/run-lab-homes.js +5 -1
  202. package/dist/lab/run-lab-options.d.ts +1 -1
  203. package/dist/lab/run-lab-options.js +16 -13
  204. package/dist/lab/summary.d.ts +7 -6
  205. package/dist/lab/summary.js +10 -10
  206. package/dist/lab/tasks.d.ts +15 -15
  207. package/dist/lab/tasks.js +14 -14
  208. package/dist/lab/types.d.ts +101 -95
  209. package/dist/lab/types.js +2 -0
  210. package/dist/lab/validation.d.ts +13 -13
  211. package/dist/lab/validation.js +44 -42
  212. package/dist/lab/warnings.d.ts +10 -0
  213. package/dist/lab/warnings.js +61 -33
  214. package/dist/library-aliases.d.ts +56 -0
  215. package/dist/library-aliases.js +22 -0
  216. package/dist/observer/artifact.d.ts +1 -1
  217. package/dist/observer/artifact.js +6 -6
  218. package/dist/observer/data.d.ts +6 -6
  219. package/dist/observer/data.js +5 -4
  220. package/dist/observer/exposure.d.ts +1 -1
  221. package/dist/observer/exposure.js +11 -11
  222. package/dist/observer/http.js +1 -1
  223. package/dist/observer/library.d.ts +1 -1
  224. package/dist/observer/library.js +4 -2
  225. package/dist/observer/listen.js +5 -4
  226. package/dist/observer/render.d.ts +1 -1
  227. package/dist/observer/render.js +10 -5
  228. package/dist/observer/run-routes.d.ts +3 -3
  229. package/dist/observer/run-routes.js +1 -1
  230. package/dist/observer/serve.js +7 -3
  231. package/dist/observer/tunnel.js +1 -1
  232. package/dist/observer-app.html +4 -4
  233. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  234. package/dist/routes/computer-use/bundle-parts.js +15 -15
  235. package/dist/routes/computer-use/bundle.js +3 -3
  236. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
  238. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  239. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
  240. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  241. package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
  242. package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
  243. package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
  244. package/dist/routes/computer-use/external-comms.d.ts +1 -1
  245. package/dist/routes/computer-use/external-comms.js +1 -1
  246. package/dist/routes/computer-use/fanout-bundle.js +18 -18
  247. package/dist/routes/computer-use/fanout-records.js +10 -11
  248. package/dist/routes/computer-use/live-flush.d.ts +1 -1
  249. package/dist/routes/computer-use/live-flush.js +6 -6
  250. package/dist/routes/computer-use/live-phase.d.ts +4 -2
  251. package/dist/routes/computer-use/live-phase.js +6 -6
  252. package/dist/routes/computer-use/local-vm.js +1 -1
  253. package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
  254. package/dist/routes/computer-use/participant-desktop.js +4 -4
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +9 -9
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +31 -13
  259. package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
  260. package/dist/routes/computer-use/participant-prompt.js +6 -6
  261. package/dist/routes/computer-use/participant-runs.d.ts +7 -7
  262. package/dist/routes/computer-use/participant-runs.js +13 -13
  263. package/dist/routes/computer-use/plan.js +22 -22
  264. package/dist/routes/computer-use/preflight.js +21 -21
  265. package/dist/routes/computer-use/rerun-selection.js +1 -1
  266. package/dist/routes/computer-use/result.js +11 -11
  267. package/dist/routes/computer-use/route.d.ts +2 -1
  268. package/dist/routes/computer-use/route.js +15 -14
  269. package/dist/routes/computer-use/self-report.d.ts +7 -7
  270. package/dist/routes/computer-use/self-report.js +31 -31
  271. package/dist/routes/computer-use/setup.d.ts +1 -1
  272. package/dist/routes/computer-use/setup.js +17 -18
  273. package/dist/routes/computer-use/single-bundle.d.ts +7 -7
  274. package/dist/routes/computer-use/single-bundle.js +28 -30
  275. package/dist/routes/computer-use/subject-projection.d.ts +1 -1
  276. package/dist/routes/computer-use/subject-projection.js +6 -6
  277. package/dist/routes/computer-use/types.d.ts +40 -42
  278. package/dist/routes/computer-use/types.js +10 -10
  279. package/dist/routes/preview.d.ts +8 -2
  280. package/dist/routes/preview.js +8 -4
  281. package/dist/routes/scripted/bundle.d.ts +2 -2
  282. package/dist/routes/scripted/bundle.js +13 -12
  283. package/dist/routes/scripted/plan.d.ts +1 -1
  284. package/dist/routes/scripted/plan.js +9 -9
  285. package/dist/routes/scripted/result.js +5 -5
  286. package/dist/routes/scripted/route.js +5 -6
  287. package/dist/routes/scripted/scenario.js +2 -2
  288. package/dist/routes/scripted/setup.js +7 -7
  289. package/dist/routes/scripted/subject.js +1 -1
  290. package/dist/routes/scripted/surface-records.js +3 -3
  291. package/dist/routes/scripted/types.d.ts +3 -5
  292. package/dist/routes/scripted/types.js +1 -1
  293. package/dist/routes/shared-world/bundle-records.js +9 -8
  294. package/dist/routes/shared-world/bundle.d.ts +5 -5
  295. package/dist/routes/shared-world/bundle.js +40 -38
  296. package/dist/routes/shared-world/checkpoints.d.ts +1 -1
  297. package/dist/routes/shared-world/checkpoints.js +1 -1
  298. package/dist/routes/shared-world/comms.d.ts +5 -5
  299. package/dist/routes/shared-world/comms.js +14 -14
  300. package/dist/routes/shared-world/external-public.d.ts +4 -3
  301. package/dist/routes/shared-world/external-public.js +16 -12
  302. package/dist/routes/shared-world/handoff.d.ts +7 -6
  303. package/dist/routes/shared-world/handoff.js +65 -57
  304. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  305. package/dist/routes/shared-world/lobby-code.js +9 -9
  306. package/dist/routes/shared-world/participant-specs.d.ts +7 -6
  307. package/dist/routes/shared-world/participant-specs.js +31 -24
  308. package/dist/routes/shared-world/plan.js +7 -7
  309. package/dist/routes/shared-world/provenance.d.ts +2 -2
  310. package/dist/routes/shared-world/provenance.js +2 -2
  311. package/dist/routes/shared-world/provisioned.js +14 -13
  312. package/dist/routes/shared-world/result.js +20 -21
  313. package/dist/routes/shared-world/route.js +23 -22
  314. package/dist/routes/shared-world/setup.d.ts +3 -3
  315. package/dist/routes/shared-world/setup.js +4 -4
  316. package/dist/routes/shared-world/types.d.ts +30 -28
  317. package/dist/routes/shared-world/types.js +4 -4
  318. package/dist/routes/terminal/adapter.d.ts +3 -3
  319. package/dist/routes/terminal/adapter.js +5 -5
  320. package/dist/routes/terminal/bundle.d.ts +3 -3
  321. package/dist/routes/terminal/bundle.js +22 -21
  322. package/dist/routes/terminal/credentials.d.ts +4 -4
  323. package/dist/routes/terminal/credentials.js +7 -7
  324. package/dist/routes/terminal/dry-run.js +4 -4
  325. package/dist/routes/terminal/encoding.js +2 -2
  326. package/dist/routes/terminal/ledger.d.ts +3 -3
  327. package/dist/routes/terminal/ledger.js +14 -14
  328. package/dist/routes/terminal/live-finish.js +3 -3
  329. package/dist/routes/terminal/live-sandbox.js +12 -13
  330. package/dist/routes/terminal/persona.js +1 -1
  331. package/dist/routes/terminal/plan.js +11 -11
  332. package/dist/routes/terminal/recorder.js +2 -2
  333. package/dist/routes/terminal/result.js +8 -8
  334. package/dist/routes/terminal/route.js +6 -7
  335. package/dist/routes/terminal/sandbox.d.ts +1 -1
  336. package/dist/routes/terminal/sandbox.js +1 -1
  337. package/dist/routes/terminal/session.js +8 -7
  338. package/dist/routes/terminal/token-usage.d.ts +1 -1
  339. package/dist/routes/terminal/token-usage.js +7 -8
  340. package/dist/routes/terminal/trace.d.ts +2 -2
  341. package/dist/routes/terminal/trace.js +2 -2
  342. package/dist/routes/terminal/types.d.ts +26 -28
  343. package/dist/routes/terminal/types.js +3 -3
  344. package/dist/run/bundle-shape.js +3 -3
  345. package/dist/run/bundle.d.ts +46 -46
  346. package/dist/run/bundle.js +2 -1
  347. package/dist/run/cost-summary.js +3 -3
  348. package/dist/run/costs.js +7 -1
  349. package/dist/run/detail.d.ts +6 -6
  350. package/dist/run/detail.js +4 -4
  351. package/dist/run/dry-run-inputs.js +1 -1
  352. package/dist/run/dry-run.js +18 -18
  353. package/dist/run/judge.d.ts +19 -13
  354. package/dist/run/judge.js +18 -8
  355. package/dist/run/paths.d.ts +1 -1
  356. package/dist/run/paths.js +1 -1
  357. package/dist/run/pricing.d.ts +11 -6
  358. package/dist/run/pricing.js +20 -13
  359. package/dist/run/projection.d.ts +14 -14
  360. package/dist/run/projection.js +15 -15
  361. package/dist/run/reclaim.js +2 -2
  362. package/dist/run/results.d.ts +5 -5
  363. package/dist/run/run-index.d.ts +8 -6
  364. package/dist/run/run-index.js +15 -16
  365. package/dist/run/run-not-found.d.ts +5 -0
  366. package/dist/run/run-not-found.js +15 -0
  367. package/dist/run/run.d.ts +5 -4
  368. package/dist/run/run.js +1 -1
  369. package/dist/run/sandbox-receipts.d.ts +2 -2
  370. package/dist/run/sandbox-receipts.js +3 -3
  371. package/dist/run/shared-world-evidence.d.ts +36 -35
  372. package/dist/run/shared-world-evidence.js +4 -4
  373. package/dist/run/shared-world-shape.d.ts +1 -1
  374. package/dist/run/shared-world-shape.js +6 -6
  375. package/dist/run/stats.d.ts +12 -6
  376. package/dist/run/stats.js +116 -58
  377. package/dist/run/status.d.ts +8 -29
  378. package/dist/run/status.js +5 -27
  379. package/dist/run/stored-runs.js +2 -1
  380. package/dist/run/stream-shape.js +1 -1
  381. package/dist/run/streams.d.ts +6 -6
  382. package/dist/run/study-provenance.d.ts +47 -0
  383. package/dist/run/study-provenance.js +63 -0
  384. package/dist/run/study-result.d.ts +16 -0
  385. package/dist/run/study-result.js +9 -0
  386. package/dist/run/text.d.ts +2 -0
  387. package/dist/run/text.js +4 -0
  388. package/dist/run-lab.d.ts +7 -7
  389. package/dist/run-lab.js +1 -3
  390. package/dist/study/convert.d.ts +33 -0
  391. package/dist/study/convert.js +432 -0
  392. package/dist/study/field-paths.d.ts +12 -0
  393. package/dist/study/field-paths.js +126 -0
  394. package/dist/study/files.d.ts +26 -0
  395. package/dist/study/files.js +43 -0
  396. package/dist/study/migrate.d.ts +48 -0
  397. package/dist/study/migrate.js +408 -0
  398. package/dist/study/owned-files.d.ts +38 -0
  399. package/dist/study/owned-files.js +182 -0
  400. package/dist/subject/clone.d.ts +1 -1
  401. package/dist/subject/desktop-cli.d.ts +1 -1
  402. package/dist/subject/desktop-cli.js +2 -2
  403. package/dist/subject/local-tree-archive.js +1 -1
  404. package/dist/subject/local-tree.d.ts +1 -1
  405. package/dist/subject/node-bootstrap.js +1 -1
  406. package/dist/subject/runtime.js +8 -9
  407. package/dist/subject/serve.d.ts +1 -1
  408. package/dist/subject/serve.js +3 -3
  409. package/dist/subject/state.d.ts +1 -1
  410. package/dist/subject/steps.d.ts +5 -5
  411. package/dist/subject/steps.js +4 -4
  412. package/dist/substrates/command-failure.d.ts +3 -3
  413. package/dist/substrates/command-failure.js +3 -3
  414. package/dist/substrates/detached.d.ts +6 -6
  415. package/dist/substrates/detached.js +7 -7
  416. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  417. package/dist/substrates/e2b/cdp-probe.js +14 -17
  418. package/dist/substrates/e2b/desktop-browser.d.ts +2 -2
  419. package/dist/substrates/e2b/desktop-browser.js +8 -8
  420. package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
  421. package/dist/substrates/e2b/desktop-cdp.js +8 -8
  422. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  423. package/dist/substrates/e2b/desktop-executor.js +1 -1
  424. package/dist/substrates/e2b/desktop-geometry.d.ts +3 -3
  425. package/dist/substrates/e2b/desktop-geometry.js +7 -7
  426. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  427. package/dist/substrates/e2b/desktop-media.js +1 -1
  428. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  429. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  430. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  431. package/dist/substrates/e2b/sandbox.js +1 -1
  432. package/dist/substrates/e2b/sdk.d.ts +11 -11
  433. package/dist/substrates/e2b/sdk.js +6 -6
  434. package/dist/tui/actions.d.ts +1 -1
  435. package/dist/tui/actions.js +13 -13
  436. package/dist/tui/contract.d.ts +16 -16
  437. package/dist/tui/contract.js +10 -10
  438. package/dist/tui/launch.d.ts +4 -4
  439. package/dist/tui/launch.js +18 -19
  440. package/dist/tui/project.js +5 -5
  441. package/dist/tui-app.js +82 -82
  442. package/dist/verify/actor.d.ts +8 -8
  443. package/dist/verify/actor.js +36 -36
  444. package/dist/verify/artifacts.d.ts +2 -2
  445. package/dist/verify/artifacts.js +3 -3
  446. package/dist/verify/context-growth.d.ts +9 -0
  447. package/dist/verify/context-growth.js +62 -0
  448. package/dist/verify/costs.d.ts +6 -6
  449. package/dist/verify/costs.js +8 -8
  450. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  451. package/dist/verify/shared-world-concurrent.js +79 -76
  452. package/dist/verify/shared-world.d.ts +2 -2
  453. package/dist/verify/shared-world.js +16 -16
  454. package/dist/verify/subject.d.ts +4 -4
  455. package/dist/verify/subject.js +18 -18
  456. package/dist/verify/verify.js +92 -43
  457. package/docs/README.md +25 -32
  458. package/docs/architecture/actor-contract.md +56 -87
  459. package/docs/architecture/desktop-sessions.md +7 -7
  460. package/docs/architecture/external-public-shared-world.md +61 -59
  461. package/docs/architecture/github-feedback-loop.md +1 -4
  462. package/docs/architecture/guest-desktop.md +2 -2
  463. package/docs/architecture/observer.md +34 -34
  464. package/docs/architecture/restricted-codex-analysis.md +34 -28
  465. package/docs/architecture/serve.md +34 -37
  466. package/docs/architecture/state-driven-executor.md +55 -58
  467. package/docs/architecture/task-protocol-support.md +5 -5
  468. package/docs/architecture/terminal-product-route.md +67 -107
  469. package/docs/contracts/README.md +24 -0
  470. package/docs/contracts/adapter-admission.md +3 -3
  471. package/docs/contracts/adapter-fixtures.md +2 -5
  472. package/docs/contracts/core.md +1 -3
  473. package/docs/contracts/errors.md +62 -0
  474. package/docs/contracts/feedback.md +8 -9
  475. package/docs/contracts/policy.md +7 -12
  476. package/docs/contracts/run-bundle.md +45 -44
  477. package/docs/contracts/schemas.md +421 -362
  478. package/docs/contracts/study-analysis.md +3 -3
  479. package/docs/contracts/study-costs.md +11 -7
  480. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  481. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  482. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  483. package/docs/principles/actor-fidelity.md +4 -4
  484. package/docs/principles/engineering.md +3 -3
  485. package/docs/principles/invariants-and-defaults.md +38 -38
  486. package/docs/principles/self-driving-harness.md +1 -5
  487. package/docs/principles/three-roles.md +1 -1
  488. package/docs/product/automatic-analysis.md +7 -7
  489. package/examples/participant/README.md +5 -5
  490. package/examples/participant/run.mjs +11 -10
  491. package/examples/scorer/README.md +3 -3
  492. package/examples/scorer/run.mjs +11 -12
  493. package/package.json +16 -17
  494. package/skills/humanish/SKILL.md +60 -58
  495. package/skills/humanish/agents/openai.yaml +1 -1
  496. package/AGENTS.md +0 -99
  497. package/CONTRIBUTING.md +0 -148
  498. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  499. package/dist/actors/codex/qualified-versions.js +0 -132
  500. package/dist/cli/commands/lab.d.ts +0 -3
  501. package/dist/cli/commands/lab.js +0 -199
  502. package/dist/cli/renamed-options.d.ts +0 -11
  503. package/dist/cli/renamed-options.js +0 -18
  504. package/dist/observer/static.d.ts +0 -39
  505. package/dist/observer/static.js +0 -369
  506. package/docs/architecture/comms-inbox.md +0 -122
  507. package/docs/architecture/desktop-recording.md +0 -80
  508. package/docs/architecture/local-browser-runtime.md +0 -178
  509. package/docs/architecture/observer-review.md +0 -144
  510. package/docs/architecture/participant-media.md +0 -90
  511. package/docs/architecture/project-layout.md +0 -62
  512. package/docs/architecture/real-email-receiving.md +0 -136
  513. package/docs/assets/humanish-drawdb-hero.png +0 -0
  514. package/docs/assets/humanish-observer-hero.png +0 -0
  515. package/docs/goals/current.md +0 -207
  516. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  517. package/docs/product/open-source-install-experience.md +0 -240
  518. package/docs/ramp/README.md +0 -295
  519. package/docs/release/open-source-readiness.md +0 -222
  520. package/docs/release/public-readiness-standard.md +0 -210
  521. package/docs/roadmap/world-class-open-source-v0.md +0 -311
@@ -7,14 +7,15 @@ import { checkCommsConnection, configureCommsLab } from "../../comms/setup.js";
7
7
  import { inspectCommsRecovery, recoverCommsReceiving } from "../../comms/receiving-recovery.js";
8
8
  import { resolveReceivingConnection } from "../../comms/receiving-runtime.js";
9
9
  import { resolveLabManifest } from "../../lab/discover.js";
10
+ import { oldStudyOption, studyOptionValue } from "../deprecations.js";
10
11
  import { runCommsCatchHost } from "../../comms/catch-host.js";
11
12
  import { DEFAULT_SANDBOX_CATCH_PORT } from "../../comms/sandbox-catch.js";
12
- import { applyEnvFileOption, JSON_OPTION_DESCRIPTION, writeResult } from "../io.js";
13
+ import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, PORT_OPTION_DESCRIPTION, writeResult, messageOutput, } from "../io.js";
13
14
  export function registerCommsCommands(parent, io) {
14
15
  const comms = parent
15
16
  .command("comms")
16
17
  .description("Local email capture, real receiving connections, checks and cleanup recovery.")
17
- .summary("Off-app comms surfaces.");
18
+ .summary("Catch the email an app sends, for email-gated flows.");
18
19
  comms
19
20
  .command("providers")
20
21
  .description("List installed communication provider capabilities. No network requests.")
@@ -22,61 +23,70 @@ export function registerCommsCommands(parent, io) {
22
23
  .action((_options, command) => handleCommsProviders(io, _options, command));
23
24
  const connections = comms
24
25
  .command("connections")
25
- .description("Manage project-local non-secret connection profiles. A lab explicitly selects its receiving connection.");
26
+ .description("Manage project-local non-secret connection profiles. A study explicitly selects its receiving connection.");
26
27
  connections
27
28
  .command("list")
28
29
  .description("Show saved connections and local credential status; does not authenticate with a provider.")
29
- .option("--cwd <path>", "Target project directory.", ".")
30
- .option("--env-file <path>", "Load credentials for local status without printing values.")
30
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
31
+ .option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
31
32
  .option("--json", JSON_OPTION_DESCRIPTION)
32
33
  .action((options, command) => handleCommsList(io, options, command));
33
34
  connections
34
35
  .command("add")
35
36
  .argument("[name]", "Project connection name.", "agentmail")
36
- .description("Save an AgentMail connection profile. Does not write a key, alter a lab or contact the provider.")
37
- .option("--cwd <path>", "Target project directory.", ".")
37
+ .description("Save an AgentMail connection profile. Does not write a key, alter a study or contact the provider.")
38
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
38
39
  .option("--provider <id>", "Installed provider id.", "agentmail")
39
- .option("--api-key-env <name>", "Environment variable NAME, never its value.", "AGENTMAIL_API_KEY")
40
+ .option("--api-key-env <name>", "The name of an environment variable, never its value.", "AGENTMAIL_API_KEY")
40
41
  .option("--json", JSON_OPTION_DESCRIPTION)
41
42
  .action((name, options, command) => handleCommsAdd(io, name, options, command));
42
43
  comms
43
44
  .command("check")
44
45
  .description("Check connection and credential presence; --online authenticates without creating inboxes.")
45
- .option("--cwd <path>", "Target project directory.", ".")
46
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
46
47
  .option("--connection <name>", "Saved connection name.", "agentmail")
47
- .option("--lab <path>", "Check the connection selected by this exact lab.")
48
+ .option("--study <path>", "Check the connection this study selects.")
49
+ .addOption(oldStudyOption("path"))
48
50
  .option("--online", "Make a read-only provider authentication request.")
49
- .option("--env-file <path>", "Load credentials without printing values.")
51
+ .option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
50
52
  .option("--json", JSON_OPTION_DESCRIPTION)
51
53
  .action((options, command) => handleCommsCheck(io, options, command));
52
54
  comms
53
55
  .command("configure")
54
- .description("Preview or save a local receiving-enabled copy of a supported lab. No provider requests.")
55
- .requiredOption("--lab <path>", "Exact source lab path or handle.")
56
- .option("--cwd <path>", "Target project directory.", ".")
56
+ .description("Preview or save a local receiving-enabled copy of a supported study. No provider requests.")
57
+ // Required, but checked in the action, so --lab still works for one minor.
58
+ .option("--study <path>", "Source study path or name. Required.")
59
+ .addOption(oldStudyOption("path"))
60
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
57
61
  .option("--connection <name>", "Saved connection name.", "agentmail")
58
- .option("--apply", "Save the local copy; original lab remains unchanged.")
62
+ .option("--apply", "Save the local copy; the source study stays unchanged.")
59
63
  .option("--plan-token <digest>", "Require the source and destination to match a previous preview.")
60
64
  .option("--json", JSON_OPTION_DESCRIPTION)
65
+ .hook("preAction", (command) => {
66
+ const options = command.opts();
67
+ // The message commander gives a missing required option.
68
+ if (options.study === undefined && options.lab === undefined)
69
+ command.error("error: required option '--study <path>' not specified");
70
+ })
61
71
  .action((options, command) => handleCommsConfigure(io, options, command));
62
72
  comms
63
73
  .command("recover")
64
74
  .description("Inspect interrupted email leases; --apply deletes only privately recorded resources owned by this project and account.")
65
- .option("--cwd <path>", "Target project directory.", ".")
75
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
66
76
  .option("--run <id>", "One run to inspect or recover.")
67
77
  .option("--apply", "Recover the selected inactive run and verify mailbox deletion.")
68
- .option("--env-file <path>", "Load credentials without printing values.")
78
+ .option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
69
79
  .option("--json", JSON_OPTION_DESCRIPTION)
70
80
  .action((options, command) => handleCommsRecover(io, options, command));
71
81
  comms
72
82
  .command("catch")
73
- .description("Run the email catch on this host so humanish can study an app it does not provision. Your app posts its email sends here; the persona opens /inbox; humanish drains GET /deliveries and writes digest-only evidence. Point your lab's comms.email.external.catchBaseUrl at this server.")
74
- .summary("Run the adopter-hosted email catch.")
75
- .option("--port <port>", "Port for capture + inbox (default 8025).", String(DEFAULT_SANDBOX_CATCH_PORT))
83
+ .description("Run the email catch on this host so humanish can study an app it does not provision. Your app posts its email sends here; the persona opens /inbox; humanish drains GET /deliveries and writes digest-only evidence. Point your study's comms.email.external.catchBaseUrl at this server.")
84
+ .summary("Run the email catch on this host.")
85
+ .option("--port <port>", PORT_OPTION_DESCRIPTION, String(DEFAULT_SANDBOX_CATCH_PORT))
76
86
  .option("--dir <path>", "Directory for the deliveries log and rendered inbox.", ".humanish/comms-catch")
77
87
  .option("--token <value>", "Require this bearer token, at least 16 characters, on GET /deliveries (recommended when reachable off-host).")
78
88
  .option("--smtp-port <port>", "Also capture SMTP mail on 127.0.0.1:<port>. Point your app's SMTP transport here.")
79
- .option("--inbox-port <port>", "Also serve a READ-ONLY inbox listener on 0.0.0.0:<port>, so a persona on another machine can open /inbox. Without it the catch stays loopback-only.")
89
+ .option("--inbox-port <port>", "Also serve a read-only inbox listener on 0.0.0.0:<port>, so a persona on another machine can open /inbox. Without it the catch stays loopback-only.")
80
90
  .option("--recipient <address>", "Only render mail sent to this address (repeatable). Default: render whatever the app actually mailed.", (value, previous) => [...(previous ?? []), value])
81
91
  .action((options) => handleCommsCatch(io, options));
82
92
  }
@@ -102,25 +112,26 @@ async function handleCommsAdd(io, name, options, command) {
102
112
  ? await saveCommsConnection(resolve(options.cwd), name, options.apiKeyEnv)
103
113
  : { ok: false, message: "Only AgentMail connection setup is currently available." }),
104
114
  };
105
- writeResult(command, io, result, (value) => `${value.message}\n`);
115
+ writeResult(command, io, result, messageOutput);
106
116
  io.setExitCode(result.ok ? 0 : 2);
107
117
  }
108
118
  async function handleCommsCheck(io, options, command) {
109
119
  if (!(await applyEnvFileOption({ command, cwd: options.cwd, envFile: options.envFile, io })))
110
120
  return;
111
121
  let connection = options.connection;
112
- if (options.lab) {
113
- const lab = await resolveLabManifest(options.cwd, options.lab);
114
- if (!lab.ok || lab.config.comms?.email?.kind !== "real") {
122
+ const study = studyOptionValue(command, io, options);
123
+ if (study) {
124
+ const resolved = await resolveLabManifest(options.cwd, study);
125
+ if (!resolved.ok || resolved.config.comms?.email?.kind !== "real") {
115
126
  const result = {
116
127
  ok: false,
117
- message: "This lab does not select a real email connection.",
128
+ message: "This study does not select a real email connection.",
118
129
  };
119
- writeResult(command, io, result, (value) => `${value.message}\n`);
130
+ writeResult(command, io, result, messageOutput);
120
131
  io.setExitCode(2);
121
132
  return;
122
133
  }
123
- connection = lab.config.comms.email.connection;
134
+ connection = resolved.config.comms.email.connection;
124
135
  }
125
136
  const result = await checkCommsConnection({
126
137
  cwd: resolve(options.cwd),
@@ -128,12 +139,22 @@ async function handleCommsCheck(io, options, command) {
128
139
  env: process.env,
129
140
  online: options.online === true,
130
141
  });
131
- writeResult(command, io, result, (value) => `${value.message}\n`);
142
+ writeResult(command, io, result, messageOutput);
132
143
  io.setExitCode(result.ok ? 0 : 2);
133
144
  }
134
145
  async function handleCommsConfigure(io, options, command) {
135
- const result = await configureCommsLab({ ...options, cwd: resolve(options.cwd) });
136
- writeResult(command, io, result, (value) => `${value.message}\n`);
146
+ const study = studyOptionValue(command, io, options);
147
+ // The preAction hook refuses a call without either option.
148
+ if (study === undefined)
149
+ return;
150
+ const result = await configureCommsLab({
151
+ cwd: resolve(options.cwd),
152
+ lab: study,
153
+ connection: options.connection,
154
+ ...(options.apply === undefined ? {} : { apply: options.apply }),
155
+ ...(options.planToken === undefined ? {} : { planToken: options.planToken }),
156
+ });
157
+ writeResult(command, io, result, messageOutput);
137
158
  io.setExitCode(result.ok ? 0 : 2);
138
159
  }
139
160
  async function handleCommsRecover(io, options, command) {
@@ -165,7 +186,7 @@ async function handleCommsRecover(io, options, command) {
165
186
  adapter,
166
187
  })),
167
188
  };
168
- writeResult(command, io, result, (value) => `${value.message}\n`);
189
+ writeResult(command, io, result, messageOutput);
169
190
  io.setExitCode(result.ok ? 0 : 2);
170
191
  }
171
192
  catch {
@@ -174,7 +195,7 @@ async function handleCommsRecover(io, options, command) {
174
195
  ok: false,
175
196
  message: "Recovery could not complete. Select one recorded run with --run, check its connection, and retry. No unrecorded resources are eligible.",
176
197
  };
177
- writeResult(command, io, result, (value) => `${value.message}\n`);
198
+ writeResult(command, io, result, messageOutput);
178
199
  io.setExitCode(2);
179
200
  }
180
201
  }
@@ -1,24 +1,24 @@
1
1
  import { Command } from "commander";
2
2
  import { draftFeedback, listFeedback, renderIssueMarkdown, renderIssueUrl, verifyFeedback, } from "../../feedback/feedback.js";
3
- import { candidateOption, JSON_OPTION_DESCRIPTION, wantsJson, writeResult, } from "../io.js";
3
+ import { candidateOption, CWD_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, RUN_OPTION_DESCRIPTION, wantsJson, writeResult, humanError, writeHuman, } from "../io.js";
4
4
  export function registerFeedbackCommands(parent, io) {
5
5
  const feedback = parent
6
6
  .command("feedback")
7
- .description("Create public-safe feedback drafts without GitHub API mutation.")
8
- .summary("Create public-safe feedback drafts, no GitHub API.");
7
+ .description("Draft public-safe feedback issues from a run. humanish never calls the GitHub API.")
8
+ .summary("Draft public-safe feedback issues from a run.");
9
9
  feedback
10
10
  .command("list")
11
11
  .description("List recorded feedback candidates and any saved draft.")
12
- .addHelpText("after", "\nWith no candidates, feedback draft and feedback issue can generate a run-summary follow-up. Public drafting still requires share_ready verification.\n")
13
- .option("--run <id>", "Run id or latest pointer.", "latest")
14
- .option("--cwd <path>", "Target project directory.", ".")
12
+ .addHelpText("after", "\nWith no candidates, feedback draft and feedback issue write a run-summary follow-up for a live run that verifies share_ready. A dry run gets no draft.\n")
13
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
14
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
15
15
  .option("--json", JSON_OPTION_DESCRIPTION)
16
16
  .action((options, command) => handleFeedbackList(io, options, command));
17
17
  feedback
18
18
  .command("draft")
19
19
  .description("Generate a public-safe feedback draft from verified evidence.")
20
- .option("--run <id>", "Run id or latest pointer.", "latest")
21
- .option("--cwd <path>", "Target project directory.", ".")
20
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
21
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
22
22
  .option("--analysis <id>", "Independent analysis version; use with --finding.")
23
23
  .option("--finding <id>", "Finding within --analysis, separate from participant candidates.")
24
24
  .option("--candidate <id>", "Which finding to draft (ids from `feedback list`); default: the first.")
@@ -27,8 +27,8 @@ export function registerFeedbackCommands(parent, io) {
27
27
  feedback
28
28
  .command("verify")
29
29
  .description("Verify the feedback draft for public issue eligibility.")
30
- .option("--run <id>", "Run id or latest pointer.", "latest")
31
- .option("--cwd <path>", "Target project directory.", ".")
30
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
31
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
32
32
  .option("--analysis <id>", "Independent analysis version; use with --finding.")
33
33
  .option("--finding <id>", "Finding within --analysis, separate from participant candidates.")
34
34
  .option("--candidate <id>", "Which finding to verify (ids from `feedback list`); default: the first.")
@@ -37,8 +37,8 @@ export function registerFeedbackCommands(parent, io) {
37
37
  feedback
38
38
  .command("issue")
39
39
  .description("Print Markdown for a public GitHub issue. Does not mutate GitHub.")
40
- .option("--run <id>", "Run id or latest pointer.", "latest")
41
- .option("--cwd <path>", "Target project directory.", ".")
40
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
41
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
42
42
  .requiredOption("--repo <owner/repo>", "Repository slug used in rendered filing instructions.")
43
43
  .option("--format <format>", "Output format.", "markdown")
44
44
  .option("--analysis <id>", "Independent analysis version; use with --finding.")
@@ -49,8 +49,8 @@ export function registerFeedbackCommands(parent, io) {
49
49
  feedback
50
50
  .command("issue-url")
51
51
  .description("Print a prefilled public issue URL. Does not mutate GitHub.")
52
- .option("--run <id>", "Run id or latest pointer.", "latest")
53
- .option("--cwd <path>", "Target project directory.", ".")
52
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
53
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
54
54
  .requiredOption("--repo <owner/repo>", "Repository slug used in the generated URL.")
55
55
  .option("--analysis <id>", "Independent analysis version; use with --finding.")
56
56
  .option("--finding <id>", "Finding within --analysis, separate from participant candidates.")
@@ -87,7 +87,7 @@ async function handleFeedbackIssue(io, options, command) {
87
87
  io.writeOut(result.issueMarkdown);
88
88
  }
89
89
  else {
90
- io.writeErr(formatFeedbackHuman(result));
90
+ writeHuman(command, io, formatFeedbackHuman(result));
91
91
  }
92
92
  io.setExitCode(result.ok ? 0 : 2);
93
93
  }
@@ -100,14 +100,13 @@ async function handleFeedbackIssueUrl(io, options, command) {
100
100
  io.writeOut(`${result.issueUrl}\n`);
101
101
  }
102
102
  else {
103
- io.writeErr(formatFeedbackHuman(result));
103
+ writeHuman(command, io, formatFeedbackHuman(result));
104
104
  }
105
105
  io.setExitCode(result.ok ? 0 : 2);
106
106
  }
107
107
  function formatFeedbackHuman(result) {
108
- if (!result.ok) {
109
- return `${result.error?.code}: ${result.error?.message}\n`;
110
- }
108
+ if (!result.ok)
109
+ return humanError(result.error);
111
110
  const candidates = result.candidates ?? [];
112
111
  const noCandidates = result.candidates !== undefined && candidates.length === 0;
113
112
  return ([
@@ -123,11 +122,11 @@ function formatFeedbackHuman(result) {
123
122
  ...(noCandidates
124
123
  ? [
125
124
  "candidates: none recorded",
126
- "With no candidates, feedback draft and feedback issue can generate a run-summary follow-up after share_ready verification.",
125
+ "With no candidates, feedback draft and feedback issue write a run-summary follow-up for a live run that verifies share_ready.",
127
126
  ...(result.draft ? [`summary: ${result.draft.summary}`] : []),
128
127
  ]
129
128
  : []),
130
- // Every finding the run produced, so the second and third are one flag away (#609).
129
+ // Every finding the run produced, so the second and third are one flag away.
131
130
  ...(candidates.length > 1 || (candidates.length === 1 && result.draft === undefined)
132
131
  ? [
133
132
  `candidates (${candidates.length}; choose one with --candidate <id>):`,
@@ -1,8 +1,9 @@
1
+ import type { HumanOutput } from "../io.js";
1
2
  import type { CuaActorLabResult } from "../../routes/computer-use/types.js";
2
3
  import type { ScriptedBrowserLabResult } from "../../routes/scripted/types.js";
3
4
  import type { TerminalProductLabResult } from "../../routes/terminal/types.js";
4
5
  import type { ConcurrentSharedWorldLabResult } from "../../routes/shared-world/types.js";
5
- export declare function formatConcurrentSharedWorldLabHuman(result: ConcurrentSharedWorldLabResult): string;
6
- export declare function formatTerminalLabHuman(result: TerminalProductLabResult): string;
7
- export declare function formatScriptedLabHuman(result: ScriptedBrowserLabResult): string;
8
- export declare function formatCuaLabHuman(result: CuaActorLabResult): string;
6
+ export declare function formatConcurrentSharedWorldLabHuman(result: ConcurrentSharedWorldLabResult): HumanOutput;
7
+ export declare function formatTerminalLabHuman(result: TerminalProductLabResult): HumanOutput;
8
+ export declare function formatScriptedLabHuman(result: ScriptedBrowserLabResult): HumanOutput;
9
+ export declare function formatCuaLabHuman(result: CuaActorLabResult): HumanOutput;
@@ -1,10 +1,28 @@
1
1
  import { formatCuaDiagnostics, formatCuaStopCause } from "../../routes/computer-use/diagnostics.js";
2
+ /** A lab run's first lines: the command that ran, whether it was a dry run, how it ended, and its route. */
3
+ function runHeader(result, route) {
4
+ const kind = result.dryRun === true ? "dry run" : result.dryRun === false ? "live run" : "run";
5
+ return [
6
+ `humanish run ${result.studyId}: ${kind} ${result.ok ? "finished" : "failed"}`,
7
+ `route: ${route}`,
8
+ ];
9
+ }
10
+ /**
11
+ * A run's human output: its lines on stdout and, when it failed with an error, that error on
12
+ * stderr through formatCliError.
13
+ */
14
+ function withError(error, lines) {
15
+ const stdout = `${lines.join("\n")}\n`;
16
+ return error === undefined ? stdout : { stdout, error };
17
+ }
18
+ /** A participant's status in words: a dry run's placeholder status says that nothing ran live. */
19
+ function participantStatus(status) {
20
+ return status === "contract_proof_only" ? "dry run, nothing ran live" : status;
21
+ }
2
22
  export function formatConcurrentSharedWorldLabHuman(result) {
3
- return ([
4
- `humanish lab concurrent-shared-world ${result.ok ? (result.dryRun ? "dry-run" : "live") : "failed"}`,
5
- ...(result.error ? [`${result.error.code}: ${result.error.message}`] : []),
23
+ return withError(result.error, [
24
+ ...runHeader(result, "shared-world"),
6
25
  `run: ${result.runId}`,
7
- `lab: ${result.labId}`,
8
26
  `actor: ${result.actor}`,
9
27
  `topology: ${result.topology}/${result.topologyMode} (${result.roleCount} persona${result.roleCount === 1 ? "" : "s"}, concurrency ${result.concurrency})`,
10
28
  ...(result.host ? [`host: ${result.host}`] : []),
@@ -16,7 +34,7 @@ export function formatConcurrentSharedWorldLabHuman(result) {
16
34
  : [
17
35
  `overlap: ${result.overlapProven ? "proven" : "not observed"} (this run only; no scale or adoption claim)`,
18
36
  ]),
19
- ...result.roles.map((participant) => `persona ${participant.id} (${participant.persona}): ${participant.status}${participant.session ? ` (${participant.session.completionReason})` : ""} ${participant.ok ? "ok" : "not-ok"}`),
37
+ ...result.roles.map((participant) => `persona ${participant.id} (${participant.persona}): ${participantStatus(participant.status)}${participant.session ? ` (${participant.session.completionReason})` : ""}${participant.ok ? "" : ", not ok"}`),
20
38
  ...(result.subjectSandbox
21
39
  ? [
22
40
  `subject sandbox: ${result.subjectSandbox.sandboxId} killed=${result.subjectSandbox.killed ? "yes" : "no"}`,
@@ -27,14 +45,12 @@ export function formatConcurrentSharedWorldLabHuman(result) {
27
45
  ? []
28
46
  : [`opened: ${result.observer.opened ? "yes" : "no"}`]),
29
47
  ...result.warnings.map((warning) => `warning: ${warning}`),
30
- ].join("\n") + "\n");
48
+ ]);
31
49
  }
32
50
  export function formatTerminalLabHuman(result) {
33
- return ([
34
- `humanish lab terminal ${result.ok ? (result.dryRun ? "dry-run" : "live") : "failed"}`,
35
- ...(result.error ? [`${result.error.code}: ${result.error.message}`] : []),
51
+ return withError(result.error, [
52
+ ...runHeader(result, "terminal"),
36
53
  `run: ${result.runId}`,
37
- `lab: ${result.labId}`,
38
54
  `actor: ${result.actor}`,
39
55
  `product: ${result.product}`,
40
56
  ...(result.observer?.observerPath ? [`observer: ${result.observer.observerPath}`] : []),
@@ -42,14 +58,12 @@ export function formatTerminalLabHuman(result) {
42
58
  ? []
43
59
  : [`opened: ${result.observer.opened ? "yes" : "no"}`]),
44
60
  ...result.warnings.map((warning) => `warning: ${warning}`),
45
- ].join("\n") + "\n");
61
+ ]);
46
62
  }
47
63
  export function formatScriptedLabHuman(result) {
48
- return ([
49
- `humanish lab scripted ${result.ok ? (result.dryRun ? "dry-run" : "live") : "failed"}`,
50
- ...(result.error ? [`${result.error.code}: ${result.error.message}`] : []),
64
+ return withError(result.error, [
65
+ ...runHeader(result, "scripted"),
51
66
  `run: ${result.runId}`,
52
- `lab: ${result.labId}`,
53
67
  `actor: ${result.actor}`,
54
68
  `subject: ${result.appUrl}`,
55
69
  ...(result.scenario
@@ -63,14 +77,12 @@ export function formatScriptedLabHuman(result) {
63
77
  ? []
64
78
  : [`opened: ${result.observer.opened ? "yes" : "no"}`]),
65
79
  ...result.warnings.map((warning) => `warning: ${warning}`),
66
- ].join("\n") + "\n");
80
+ ]);
67
81
  }
68
82
  export function formatCuaLabHuman(result) {
69
- return ([
70
- `humanish lab cua ${result.ok ? (result.dryRun ? "dry-run" : "live") : "failed"}`,
71
- ...(result.error ? [`${result.error.code}: ${result.error.message}`] : []),
83
+ return withError(result.error, [
84
+ ...runHeader(result, "computer-use"),
72
85
  `run: ${result.runId}`,
73
- `lab: ${result.labId}`,
74
86
  `actor: ${result.actor}`,
75
87
  `subject: ${result.appUrl}`,
76
88
  ...(result.subject?.source === "clone"
@@ -83,11 +95,11 @@ export function formatCuaLabHuman(result) {
83
95
  : []),
84
96
  ...(result.diagnostics ? [`diagnostic: ${formatCuaDiagnostics(result.diagnostics)}`] : []),
85
97
  ...((result.lanes?.length ?? 0) > 1
86
- ? result.lanes.map((participant) => `participant ${participant.id}: ${participant.status}${participant.session ? ` (${participant.session.completionReason})` : ""}${participant.diagnostics ? ` · ${formatCuaDiagnostics(participant.diagnostics)}` : ""}${participant.session ? ` · ${participant.session.reason}` : ""}`)
98
+ ? result.lanes.map((participant) => `participant ${participant.id}: ${participantStatus(participant.status)}${participant.session ? ` (${participant.session.completionReason})` : ""}${participant.diagnostics ? ` · ${formatCuaDiagnostics(participant.diagnostics)}` : ""}${participant.session ? ` · ${participant.session.reason}` : ""}`)
87
99
  : []),
88
100
  ...(result.session && (result.lanes?.length ?? 0) <= 1
89
101
  ? [
90
- `session: ${result.session.status} (${result.session.completionReason})${result.session.stopCause ? ` · ${formatCuaStopCause(result.session.stopCause)}` : ""} · ${result.session.reason}`,
102
+ `session: ${participantStatus(result.session.status)} (${result.session.completionReason})${result.session.stopCause ? ` · ${formatCuaStopCause(result.session.stopCause)}` : ""} · ${result.session.reason}`,
91
103
  `screenshots: ${result.session.screenshots}`,
92
104
  ]
93
105
  : []),
@@ -101,5 +113,5 @@ export function formatCuaLabHuman(result) {
101
113
  ? []
102
114
  : [`opened: ${result.observer.opened ? "yes" : "no"}`]),
103
115
  ...result.warnings.map((warning) => `warning: ${warning}`),
104
- ].join("\n") + "\n");
116
+ ]);
105
117
  }
@@ -2,7 +2,6 @@ import { automaticAnalysisSucceeded } from "../../analysis/automatic-completion.
2
2
  import { Command } from "commander";
3
3
  import {} from "../../run-lab.js";
4
4
  import { resolveLabDryRun } from "../../lab/plan.js";
5
- import { CUA_ACTOR_LAB_SCHEMA } from "../../routes/computer-use/types.js";
6
5
  import { serveObserver } from "../../observer/render.js";
7
6
  import { startExposedObserver, validateExposure } from "../../observer/exposure.js";
8
7
  import { ServeTunnelError } from "../../observer/tunnel.js";
@@ -12,6 +11,7 @@ import { parseLabCount, parseParticipantIds, parseObserverPort, wantsJson, write
12
11
  import { exposureRequestFromOptions, followObserver, planObserver, showObserver, staticObserverOpen, withObserverServer, } from "../observer-follow.js";
13
12
  import { formatCuaLabHuman } from "./lab-format.js";
14
13
  import { resolveRouteShouldOpen } from "./lab-route-open.js";
14
+ import { studyResultIdentity } from "../../run/study-result.js";
15
15
  /**
16
16
  * The computer-use route's CLI setup: its settings, the watch and exposure plan, the runLab options
17
17
  * with the live Observer hook, and how it presents the outcome or a run error. Undefined when
@@ -50,10 +50,9 @@ export function computerUseRouteRun(args) {
50
50
  }
51
51
  function refuseCua(args, dryRun, code, message) {
52
52
  const result = {
53
- schema: CUA_ACTOR_LAB_SCHEMA,
53
+ ...studyResultIdentity("computer-use", args.config.id),
54
54
  ok: false,
55
55
  cwd: args.options.cwd,
56
- labId: args.config.id,
57
56
  actor: args.config.actors[0]?.type ?? "",
58
57
  appUrl: "",
59
58
  dryRun,
@@ -97,7 +96,7 @@ function resolveCuaSettings(args) {
97
96
  /** Validates exposure and plans the finished-run Observer, or returns undefined after refusing. */
98
97
  function prepareCuaWatch(args, settings) {
99
98
  // Validate exposure up front (fail-closed matrix), before any run/spend. A live CUA watch is the
100
- // one surface that serves runtime E2B stream URLs, so it MUST sit behind edge auth.
99
+ // one surface that serves runtime E2B stream URLs, so it must sit behind edge auth.
101
100
  const exposeValidation = validateExposure("watch", exposureRequestFromOptions(args.options), {
102
101
  dryRun: settings.dryRun,
103
102
  detach: args.options.detach === true,
@@ -141,7 +140,7 @@ function cuaRunOptions(args, settings, prepared, live) {
141
140
  dryRun: settings.dryRun,
142
141
  ...(settings.wantsFollow
143
142
  ? {
144
- // Fires INSIDE runLab, before the actor loop and before sandbox creation, so a
143
+ // Fires inside runLab, before the actor loop and before sandbox creation, so a
145
144
  // tunnel-auth failure aborts before any spend and leaves no orphaned sandbox.
146
145
  onObserverReady: (observer) => attachLiveObserver(args.io, settings, prepared.exposure, live, observer),
147
146
  }
@@ -214,7 +213,7 @@ async function attachLiveObserver(io, settings, exposure, live, observer) {
214
213
  async function reportCuaRun(args, prepared, result, live) {
215
214
  const { server, observer: attachedObserver } = live;
216
215
  const exposeRequested = prepared.exposure.exposed;
217
- // Serving is NOT gated on result.ok: a timed_out, incomplete or failed run still comes up so the
216
+ // Serving is not gated on result.ok: a timed_out, incomplete or failed run still comes up so the
218
217
  // operator can inspect its evidence live (and, under --expose, from a phone).
219
218
  let output = result;
220
219
  if (server && attachedObserver) {
@@ -224,7 +223,7 @@ async function reportCuaRun(args, prepared, result, live) {
224
223
  observer: withObserverServer(attachedResult, server),
225
224
  warnings: [
226
225
  ...result.warnings,
227
- "Live CUA server is polling observer-data.json with no-store caching.",
226
+ "The live computer-use server polls observer-data.json with no-store caching.",
228
227
  ...(exposeRequested
229
228
  ? [
230
229
  `Exposed live desktop stream URLs to an edge-authenticated remote viewer${live.tunnel ? ` via ${live.tunnel.url.replace(/\/$/, "")}` : ""}.`,
@@ -1,4 +1,5 @@
1
1
  import { Command } from "commander";
2
+ import { studyResultIdentity } from "../../run/study-result.js";
2
3
  import { formatRunHuman, parseLabCount, writeResult, } from "../io.js";
3
4
  import { planObserver, showObserver, staticObserverOpen } from "../observer-follow.js";
4
5
  /**
@@ -9,12 +10,12 @@ export function previewRouteRun(args) {
9
10
  const participantCount = parseLabCount(args.options.count, args.config.actors[0]?.count ?? 4);
10
11
  if (participantCount === null) {
11
12
  const result = {
12
- schema: "humanish.run-result.v1",
13
+ ...studyResultIdentity("preview", args.config.id),
13
14
  ok: false,
14
15
  cwd: args.options.cwd,
15
16
  warnings: [],
16
17
  error: {
17
- code: "HUMANISH_INVALID_SIM_COUNT",
18
+ code: "HUMANISH_INVALID_PARTICIPANT_COUNT",
18
19
  message: "--count must be a positive integer.",
19
20
  },
20
21
  };
@@ -23,7 +24,7 @@ export function previewRouteRun(args) {
23
24
  return undefined;
24
25
  }
25
26
  // `run` renders the Observer too, so `run` and `watch` write the same bundle and the first
26
- // `export` of a run bundle finds observer/index.html (#597). A render failure is a warning on the
27
+ // `export` of a run bundle finds observer/index.html. A render failure is a warning on the
27
28
  // result, never a failed run. The preview renders through its finished run, so the page shown is
28
29
  // the run just written, never a directory swapped in under its id.
29
30
  const openOverride = args.options.open ?? args.config.defaults?.open;
@@ -9,6 +9,7 @@ import { followObserver, showObserver, staticObserverOpen, withObserverServer, }
9
9
  import { formatConcurrentSharedWorldLabHuman } from "./lab-format.js";
10
10
  import { resolveRouteShouldOpen, watchFinishedPlan } from "./lab-route-open.js";
11
11
  import { rosterOf } from "../../lab/parse/actors.js";
12
+ import { studyResultIdentity } from "../../run/study-result.js";
12
13
  /**
13
14
  * The shared-world route's CLI setup: dry run, open and follow semantics, the live Observer server
14
15
  * the run attaches, and how it presents the outcome. Undefined when setup has already written its
@@ -27,10 +28,9 @@ export function sharedWorldRouteRun(args) {
27
28
  const port = parseObserverPort(args.options.port ?? "0");
28
29
  const failConcurrent = (message, runId) => {
29
30
  const result = {
30
- schema: "humanish.concurrent-shared-world-lab-result.v1",
31
+ ...studyResultIdentity("shared-world", args.config.id),
31
32
  ok: false,
32
33
  cwd: args.options.cwd,
33
- labId: args.config.id,
34
34
  actor: args.config.actors[0]?.type ?? "",
35
35
  topology: "shared-world",
36
36
  topologyMode: "concurrent",
@@ -40,7 +40,7 @@ export function sharedWorldRouteRun(args) {
40
40
  runId: runId ?? args.options.runId ?? "not-created",
41
41
  roles: [],
42
42
  warnings: [],
43
- error: { code: "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_FAILED", message },
43
+ error: { code: "HUMANISH_SHARED_WORLD_FAILED", message },
44
44
  };
45
45
  writeResult(args.command, args.io, result, formatConcurrentSharedWorldLabHuman);
46
46
  args.io.setExitCode(2);
@@ -3,6 +3,7 @@ import { resolve } from "node:path";
3
3
  import { Command } from "commander";
4
4
  import { deriveRunFacts } from "../telemetry.js";
5
5
  import { resolveLabManifest } from "../../lab/discover.js";
6
+ import { warnAndQueue } from "../deprecations.js";
6
7
  import { planLab, resolveLabDryRun } from "../../lab/plan.js";
7
8
  import { keyNamesOf } from "../../lab/requirements.js";
8
9
  import { routeOf } from "../../lab/plan.js";
@@ -26,12 +27,12 @@ export async function runLabCommand(args) {
26
27
  }
27
28
  // Surface forward-declared-field + .yml warnings on run/watch too, not only on inspect.
28
29
  // Otherwise a setting that does nothing is silently swallowed on the path users actually run.
29
- for (const warning of resolved.warnings) {
30
- args.io.writeErr(`warning: ${warning}\n`);
31
- }
30
+ // Each also goes into the JSON result's warnings[], so a --json caller sees it.
31
+ for (const warning of resolved.warnings)
32
+ warnAndQueue(args.command, args.io, warning);
32
33
  const config = resolved.config;
33
- // The run's identity (#455): which manifest, where it lives, and whether it is committed, a
34
- // local overlay, or an explicit path. Resolved once here — the only place that knows all three —
34
+ // The run's identity: which manifest, where it lives, and whether it is committed, a
35
+ // local overlay, or an explicit path. Resolved once here (the only place that knows all three)
35
36
  // and carried into the run's status record and bundle so the filesystem can answer "which lab
36
37
  // produced this run" without the old `persona.source = "lab:<id>"` string convention.
37
38
  const lab = { id: config.id, path: resolved.path, origin: resolved.origin };
@@ -101,7 +102,7 @@ export async function runLabCommand(args) {
101
102
  // From here a signal marks the run interrupted and reclaims its sandboxes (run-signals.ts).
102
103
  const signals = beginRunSignalPhase(args.io);
103
104
  try {
104
- // #316: resolve + load a config-declared/CLI-flagged adopter scorer FAIL-CLOSED, before any
105
+ // Resolve + load a config-declared/CLI-flagged adopter scorer fail-closed, before any
105
106
  // spend, and only for a plan that will run. A declared gate that cannot load (bad ref, not
106
107
  // found, load failure, no hooks, unsupported route) aborts with exit 2 rather than green-passing.
107
108
  await runRoute(config, run, async () => {
@@ -127,7 +128,7 @@ export async function runLabCommand(args) {
127
128
  if (scorer) {
128
129
  // Cross-repo guardrail: `humanish lab run` now import()s host JS named in the manifest.
129
130
  // Surface it so the invoker (who may not be the manifest author) knows executable code ran.
130
- args.io.writeErr(`warning: review scorer ${scorer.provenance.ref} (${scorer.provenance.source}) is executable host code loaded and run in-process — review it as code, not config.\n`);
131
+ args.io.writeErr(`warning: review scorer ${scorer.provenance.ref} (${scorer.provenance.source}) is code that humanish loaded and ran in this process. Review it as you would any code you run.\n`);
131
132
  }
132
133
  const analysisBudget = automaticAnalysisBudget(config.review?.analysis, route);
133
134
  if (analysisBudget && resolveLabDryRun(config, args.options.dryRun, true) === false) {
@@ -190,8 +191,6 @@ function writeUnsupportedRerunFlagsResult(args, route) {
190
191
  args.io.setExitCode(2);
191
192
  }
192
193
  function formatLabResolveFailureHuman(result) {
193
- return ([
194
- `${result.error.code}: ${result.error.message}`,
195
- ...result.warnings.map((warning) => `warning: ${warning}`),
196
- ].join("\n") + "\n");
194
+ const warnings = result.warnings.map((warning) => `warning: ${warning}\n`).join("");
195
+ return { ...(warnings ? { stdout: warnings } : {}), error: result.error };
197
196
  }
@@ -3,14 +3,14 @@ import type { LabRoute } from "../../lab/plan.js";
3
3
  import type { RunScorerProvenance } from "../../run/bundle.js";
4
4
  import type { LabConfig } from "../../lab/types.js";
5
5
  import type { RunResult } from "../../run/results.js";
6
- /** A CONFIG-DECLARED scorer that resolved + loaded fail-closed, ready to thread into a backend. */
6
+ /** A config-declared scorer that resolved + loaded fail-closed, ready to thread into a backend. */
7
7
  export interface LoadedAdapterScorer {
8
8
  hooks: AdapterScorerModule;
9
9
  provenance: RunScorerProvenance;
10
10
  }
11
11
  /**
12
12
  * Resolve `review.scorer.ref` (or the `--scorer` override) to a loaded adopter scorer, fail-closed
13
- * (typed error) PRE-SPEND. Precedence: CLI `--scorer` overrides the manifest; `source` records which
13
+ * (typed error) pre-spend. Precedence: CLI `--scorer` overrides the manifest; `source` records which
14
14
  * won. No scorer declared → `{ ok: true }` with no scorer. A declared scorer on an unsupported
15
15
  * backend, or a bad/unreadable/broken ref, → `{ ok: false }` so the caller aborts with exit 2.
16
16
  */