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
@@ -105,9 +105,9 @@ export function publicPathForTrace(value, rootCwd) {
105
105
  // or a logged-in third-party UI. A raw frame must never reach a public artifact.
106
106
  // redactScreenshot is the fail-closed primitive that gates that surface. It
107
107
  // always returns a freshly re-encoded, downscaled, box-blurred thumbnail (or a
108
- // neutral placeholder), and NEVER the source pixels. The "too coarse to read"
108
+ // neutral placeholder), and never the source pixels. The "too coarse to read"
109
109
  // invariant is enforced in code, not by defaults: the emitted width is hard-
110
- // capped (a caller may request a SMALLER thumbnail but never a larger one), and
110
+ // capped (a caller may request a smaller thumbnail but never a larger one), and
111
111
  // the blur radius is computed internally with a floor, so neither a caller
112
112
  // option nor a natively small frame can widen the output back into legibility.
113
113
  // On any uncertainty (non-PNG input, an oversized or unreadable PNG, or any
@@ -241,7 +241,7 @@ export function tailText(value, maxChars) {
241
241
  }
242
242
  /**
243
243
  * A redacted, ellipsis-prefixed tail of captured output for a (public-bound)
244
- * message field. Pattern-redacts the FULL text BEFORE truncating: slicing a tail
244
+ * message field. Pattern-redacts the full text before truncating: slicing a tail
245
245
  * first could cut through a secret's prefix (e.g. drop "sk-proj-") and defeat the
246
246
  * pattern matcher on the remainder. Callers should literal-scrub known
247
247
  * provisioned values first; this is the pattern pass. Empty output -> "(no output)".
@@ -321,7 +321,7 @@ export function scrubLiterals(values) {
321
321
  /**
322
322
  * Coerce an unknown thrown value to its message string. Prefer this over the
323
323
  * inline `error instanceof Error ? error.message : String(error)` so error
324
- * stringification stays uniform. Note: this does NOT redact -- sites that emit
324
+ * stringification stays uniform. Note: this does not redact; sites that emit
325
325
  * to public-bound artifacts must run the result through `redactText` first.
326
326
  */
327
327
  export function toErrorMessage(error) {
@@ -49,95 +49,55 @@ export function buildDraft(bundle, bundlePath, candidateId) {
49
49
  acceptance_proof: projectFeedbackAcceptanceProof(bundle, candidate),
50
50
  };
51
51
  }
52
- // #392: the fallback below is DRY-RUN-shaped, and it used to be the fallback for every bundle
53
- // without a candidate — so a live run whose route filed no participant report got a draft
54
- // claiming "no browser behavior was exercised" over 15 screenshots of browser behavior. A live
55
- // bundle now gets a draft that describes the run that happened, built from the same review lines
56
- // the stakeholder surfaces show (participants and tasks keep their denominators).
57
- if (bundle.mode === "live") {
58
- const participantEndings = participantOutcomeDetails(bundle.streams);
59
- const review = withCuaReviewProvenance(bundle.review, bundle.streams);
60
- const actualLines = [
61
- review.summary,
62
- ...(bundle.review.participants === undefined
63
- ? []
64
- : [
65
- `Participants: ${formatParticipantOutcomes(bundle.review.participants, participantEndings)}.`,
66
- ]),
67
- ...(bundle.review.tasks === undefined
68
- ? []
69
- : [`Tasks: ${formatRunTaskFunnel(bundle.review.tasks)}.`]),
70
- ];
71
- return {
72
- schema: FEEDBACK_SCHEMA,
73
- run_id: bundle.runId,
74
- adapter_id: bundle.source.packageName ?? bundle.scenario.id,
75
- scenario_id: bundle.scenario.id,
76
- persona_id: bundle.persona.id,
77
- actor: (bundle.streams ?? []).some((stream) => stream.actor?.lane === "computer-use")
78
- ? "computer-use"
79
- : "unknown",
80
- substrate: "unknown",
81
- failure_owner: "unknown",
82
- summary: "Live study completed without a participant-reported finding",
83
- expected: bundle.scenario.goal,
84
- actual: actualLines.join(" "),
85
- source_bundle: bundlePath,
86
- evidence: [
87
- {
88
- path: bundlePath,
89
- kind: "state",
90
- note: "Source run bundle.",
91
- },
92
- {
93
- path: path.join(path.dirname(bundlePath), "review.md"),
94
- kind: "review",
95
- note: "The run's review: verdict, participants, and gaps.",
96
- },
97
- ],
98
- redaction: {
99
- status: "passed",
100
- notes: bundle.redaction.notes,
101
- },
102
- idempotency_key: `humanish:${bundle.runId}:live-run-summary`,
103
- proposed_next_state: "study-quality-review",
104
- acceptance_proof: [
105
- feedbackProofCommands(bundle.runId).verify,
106
- feedbackProofCommands(bundle.runId).watch,
107
- ],
108
- };
109
- }
52
+ // A bundle without a candidate gets a draft that describes the run that happened, built from the
53
+ // same review lines the stakeholder surfaces show (participants and tasks keep their
54
+ // denominators). Feedback refuses a dry run before it gets here.
55
+ const participantEndings = participantOutcomeDetails(bundle.streams);
56
+ const review = withCuaReviewProvenance(bundle.review, bundle.streams);
57
+ const actualLines = [
58
+ review.summary,
59
+ ...(bundle.review.participants === undefined
60
+ ? []
61
+ : [
62
+ `Participants: ${formatParticipantOutcomes(bundle.review.participants, participantEndings)}.`,
63
+ ]),
64
+ ...(bundle.review.tasks === undefined
65
+ ? []
66
+ : [`Tasks: ${formatRunTaskFunnel(bundle.review.tasks)}.`]),
67
+ ];
110
68
  return {
111
69
  schema: FEEDBACK_SCHEMA,
112
70
  run_id: bundle.runId,
113
- adapter_id: bundle.source.packageName ?? "synthetic-app",
71
+ adapter_id: bundle.source.packageName ?? bundle.scenario.id,
114
72
  scenario_id: bundle.scenario.id,
115
73
  persona_id: bundle.persona.id,
116
- actor: "synthetic-dry-run",
117
- substrate: "local-filesystem",
118
- failure_owner: "harness",
119
- summary: "Dry-run contract proof needs product-evidence follow-up",
120
- expected: "humanish should produce verified, public-safe evidence before product claims are filed.",
121
- actual: "This dry-run produced a contract-proof bundle only; no browser or product behavior was exercised.",
74
+ actor: (bundle.streams ?? []).some((stream) => stream.actor?.lane === "computer-use")
75
+ ? "computer-use"
76
+ : "unknown",
77
+ substrate: "unknown",
78
+ failure_owner: "unknown",
79
+ summary: "Live study completed without a participant-reported finding",
80
+ expected: bundle.scenario.goal,
81
+ actual: actualLines.join(" "),
122
82
  source_bundle: bundlePath,
123
83
  evidence: [
124
84
  {
125
85
  path: bundlePath,
126
86
  kind: "state",
127
- note: "Synthetic run bundle.",
87
+ note: "Source run bundle.",
128
88
  },
129
89
  {
130
90
  path: path.join(path.dirname(bundlePath), "review.md"),
131
91
  kind: "review",
132
- note: "Review skeleton labels this as contract proof only.",
92
+ note: "The run's review: verdict, participants, and gaps.",
133
93
  },
134
94
  ],
135
95
  redaction: {
136
96
  status: "passed",
137
97
  notes: bundle.redaction.notes,
138
98
  },
139
- idempotency_key: `humanish:${bundle.runId}:dry-run-contract-proof`,
140
- proposed_next_state: "watch",
99
+ idempotency_key: `humanish:${bundle.runId}:live-run-summary`,
100
+ proposed_next_state: "study-quality-review",
141
101
  acceptance_proof: [
142
102
  feedbackProofCommands(bundle.runId).verify,
143
103
  feedbackProofCommands(bundle.runId).watch,
@@ -254,11 +214,14 @@ export function isUsableFeedbackCandidate(candidate) {
254
214
  !item.path.includes("://") &&
255
215
  !item.path.includes(".."));
256
216
  }
217
+ /** An evidence path inside the run directory, as "run.json" or "screenshots/step-003.png". */
218
+ function runRelative(draft, evidencePath) {
219
+ const relative = path.relative(path.dirname(draft.source_bundle), evidencePath);
220
+ return relative === "" || relative.startsWith("..") ? evidencePath : relative;
221
+ }
257
222
  export function renderMarkdown(draft, repo) {
258
223
  return `This issue was drafted by humanish from a verified humanish run bundle.
259
224
 
260
- It contributes to public-safe simulation harness coverage. The feedback command did not mutate GitHub, commit code, or claim unobserved product behavior.
261
-
262
225
  ## Summary
263
226
 
264
227
  ${draft.summary}
@@ -273,14 +236,9 @@ ${draft.actual}
273
236
 
274
237
  ## Evidence
275
238
 
276
- ${draft.evidence.map((item) => `- ${item.kind}: \`${item.path}\` - ${item.note}`).join("\n")}
277
-
278
- ## Filing Notes
239
+ ${draft.evidence.map((item) => `- ${item.kind} ${runRelative(draft, item.path)}: ${item.note}`).join("\n")}
279
240
 
280
- - Repository: ${repo}
281
- - GitHub mutation: not performed
282
- - Substrate: ${draft.substrate}
283
- - Production data: not used
241
+ Repository: ${repo}
284
242
 
285
243
  \`\`\`yaml
286
244
  humanish_feedback:
@@ -1,4 +1,4 @@
1
- // The publish boundary for existing raw runs (#136). A derivative is an isolated
1
+ // The publish boundary for existing raw runs. A derivative is an isolated
2
2
  // workspace, never a new run in the source history. No provider APIs are involved.
3
3
  import { createHash } from "node:crypto";
4
4
  import { lstat, mkdir, mkdtemp, readdir, realpath, rename, rm, rmdir } from "node:fs/promises";
@@ -46,5 +46,9 @@ export interface ExportDeps {
46
46
  /** The banner a --local-only export carries. Plain HTML, before the app root, so it renders with JS off. */
47
47
  export declare function localOnlyBanner(reasons: string[]): string;
48
48
  export declare function exportRun(cwdInput: string, runInput: string, options?: ExportOptions, deps?: ExportDeps): Promise<ExportResult | ExportFailure>;
49
- export declare function formatExportHuman(result: ExportResult | ExportFailure): string;
49
+ /** Human output; a failure is an error the CLI prints on stderr (HumanOutput in src/cli/io.ts). */
50
+ export declare function formatExportHuman(result: ExportResult): string;
51
+ export declare function formatExportHuman(result: ExportResult | ExportFailure): string | {
52
+ error: ExportFailure["error"];
53
+ };
50
54
  export {};
@@ -1,4 +1,4 @@
1
- // `humanish export`: one file a coworker can open (#471).
1
+ // `humanish export`: one file a coworker can open.
2
2
  //
3
3
  // A run is a directory. Sharing it meant a tunnel (`serve --expose`) or a hand-zipped bundle,
4
4
  // neither of which is "send one thing". The Observer is already a single-file artifact with the
@@ -40,7 +40,7 @@ const IMAGE_MIME = {
40
40
  export function localOnlyBanner(reasons) {
41
41
  const why = reasons.length === 0 ? "" : ` (${reasons.join(", ")})`;
42
42
  return (`<div id="humanish-local-only" role="alert" tabindex="0" style="position:sticky;top:0;z-index:2147483647;max-height:40vh;overflow:auto;background:#7a1f1f;color:#fff;font:600 14px/1.4 system-ui,sans-serif;padding:10px 16px;text-align:center">` +
43
- `LOCAL ONLY. This export was made from a bundle that is not share-safe${why}. Do not forward it outside the team that owns the run.` +
43
+ `Local only. This export was made from a bundle that is not share-safe${why}. Do not forward it outside the team that owns the run.` +
44
44
  `</div>`);
45
45
  }
46
46
  async function isInside(root, candidate) {
@@ -146,9 +146,8 @@ async function readObserverSlot(cwd, runInput, runRoot, runId, verified, deps, w
146
146
  html = await readFile(observerPath, "utf8");
147
147
  }
148
148
  catch {
149
- // `run` writes observer-data.json and no index.html; `watch` writes both (#597). The
150
- // 0.72.0 dogfood participant hit this on its first export. Render it here, from the same
151
- // artifact watch uses, so what produced the run never decides whether it can be sent.
149
+ // `run` writes observer-data.json and no index.html; `watch` writes both. Render it here, from
150
+ // the same artifact watch uses, so what produced the run never decides whether it can be sent.
152
151
  const rendered = await (deps.render ?? ((c, r) => renderObserver(c, r, { open: false })))(cwd, runInput).catch(() => ({ ok: false }));
153
152
  try {
154
153
  if (!rendered.ok)
@@ -281,7 +280,7 @@ function makePortable(inlined, verified) {
281
280
  }
282
281
  }
283
282
  }
284
- // What verify said, in the file, so the chrome can agree with the result envelope (#584).
283
+ // What verify said, in the file, so the chrome can agree with the result envelope.
285
284
  const publicSafety = (inlined.publicSafety ?? {});
286
285
  inlined.publicSafety = {
287
286
  ...publicSafety,
@@ -358,7 +357,7 @@ function renderExportHtml(inlined, analysis, assets, verified, watermarked, omit
358
357
  }
359
358
  export function formatExportHuman(result) {
360
359
  if (!result.ok)
361
- return `${result.error.code}: ${result.error.message}\n`;
360
+ return { error: result.error };
362
361
  if (result.format === "bundle") {
363
362
  return [
364
363
  `humanish export ${result.runId}`,
@@ -373,7 +372,7 @@ export function formatExportHuman(result) {
373
372
  const lines = [
374
373
  `humanish export ${result.runId}`,
375
374
  `file: ${result.path} (${(result.bytes / 1024).toFixed(0)} KB, ${result.embeddedImages} image(s) embedded)`,
376
- `share safety: ${result.shareSafety.status}${result.watermarked ? " — WATERMARKED LOCAL ONLY" : ""}`,
375
+ `share safety: ${result.shareSafety.status}${result.watermarked ? " (watermarked: local only)" : ""}`,
377
376
  ...result.warnings.map((warning) => `warning: ${warning}`),
378
377
  ];
379
378
  return `${lines.join("\n")}\n`;
@@ -13,11 +13,11 @@ export interface FeedbackResult {
13
13
  issueUrl?: string;
14
14
  draft?: FeedbackDraft;
15
15
  /** Every usable candidate on the bundle, so a multi-participant study's second and third findings can be
16
- * chosen with `--candidate` instead of being invisible behind the first (#609). */
16
+ * chosen with `--candidate` instead of being invisible behind the first. */
17
17
  candidates?: FeedbackCandidateSummary[];
18
18
  shareSafety?: VerifyResult["shareSafety"];
19
19
  error?: {
20
- code: "HUMANISH_RUN_NOT_FOUND" | "HUMANISH_INVALID_RUN_BUNDLE" | "HUMANISH_INVALID_FEEDBACK_DRAFT" | "HUMANISH_FEEDBACK_SHARE_SAFETY_BLOCKED" | "HUMANISH_FEEDBACK_CANDIDATE_NOT_FOUND";
20
+ code: "HUMANISH_RUN_NOT_FOUND" | "HUMANISH_INVALID_RUN_BUNDLE" | "HUMANISH_INVALID_FEEDBACK_DRAFT" | "HUMANISH_FEEDBACK_SHARE_SAFETY_BLOCKED" | "HUMANISH_FEEDBACK_CANDIDATE_NOT_FOUND" | "HUMANISH_FEEDBACK_REQUIRES_LIVE_RUN";
21
21
  message: string;
22
22
  };
23
23
  }
@@ -1,6 +1,7 @@
1
1
  // The feedback commands: resolve a run, draft a feedback issue from it, verify the draft, render it
2
2
  // as an issue body or URL, and list a run's candidates. What a draft contains is in draft.ts.
3
3
  import { realpath } from "node:fs/promises";
4
+ import { runNotFoundMessage } from "../run/run-not-found.js";
4
5
  import path from "node:path";
5
6
  import { bindExistingRunArtifactPaths, isSafeRunIdSegment, resolveLatestRunDirectory, validatePreparedRunArtifactPaths, } from "../run/paths.js";
6
7
  import { bindExistingManagedHumanishOutputDirectory, readContainedRegularFile, writeContainedOutputFile, } from "../run/contained-output.js";
@@ -34,7 +35,24 @@ async function draftFeedbackBound(cwdInput, runInput, options = {}) {
34
35
  run: runInput,
35
36
  error: {
36
37
  code: "HUMANISH_RUN_NOT_FOUND",
37
- message: `Run not found: ${runInput}`,
38
+ message: await runNotFoundMessage(cwd, runInput),
39
+ },
40
+ },
41
+ };
42
+ }
43
+ // A dry run exercised no product, so it has nothing to report upstream; analyze refuses it the
44
+ // same way (ANALYSIS_REQUIRES_LIVE_RUN).
45
+ if (context.loaded.bundle.mode !== "live") {
46
+ return {
47
+ context,
48
+ result: {
49
+ schema: FEEDBACK_RESULT_SCHEMA,
50
+ ok: false,
51
+ cwd,
52
+ run: runInput,
53
+ error: {
54
+ code: "HUMANISH_FEEDBACK_REQUIRES_LIVE_RUN",
55
+ message: `Run ${context.storedRunId} is a dry run, which tests no product behavior. Feedback drafts need a live run.`,
38
56
  },
39
57
  },
40
58
  };
@@ -204,7 +222,7 @@ export async function listFeedback(cwdInput, runInput) {
204
222
  run: runInput,
205
223
  error: {
206
224
  code: "HUMANISH_RUN_NOT_FOUND",
207
- message: `Run not found: ${runInput}`,
225
+ message: await runNotFoundMessage(cwd, runInput),
208
226
  },
209
227
  };
210
228
  }
@@ -218,7 +236,7 @@ export async function listFeedback(cwdInput, runInput) {
218
236
  run: runInput,
219
237
  ...(draft ? { draftPath, draft } : {}),
220
238
  // The choice set for `draft --candidate`: a three-participant study has up to three findings,
221
- // and until #609 only the first ever reached a draft.
239
+ // and each can reach a draft.
222
240
  candidates: summarizeCandidates(context.loaded.bundle),
223
241
  };
224
242
  }
@@ -220,7 +220,7 @@ async function probeElement(op, session, contextId, expression) {
220
220
  /**
221
221
  * Preparation: the owner check, a CDP session (recorded on the handle as soon as it exists, so
222
222
  * disposal detaches a partial acquisition), the owned top frame, an isolated world, and the
223
- * PREPARE probe.
223
+ * `PREPARE` probe.
224
224
  */
225
225
  async function acquireIsolatedWorld(settings, state, detach, prepared, op) {
226
226
  await assertOwnerReady(settings, op);
@@ -267,7 +267,7 @@ function disposePrepared(state, detach, prepared, self) {
267
267
  return prepared.disposal;
268
268
  }
269
269
  /**
270
- * The handle for one preparation. paste inserts the text once: owner check, RECHECK probe, owner
270
+ * The handle for one preparation. paste inserts the text once: owner check, `RECHECK` probe, owner
271
271
  * check, check, then insertText. close is the handle's disposal.
272
272
  */
273
273
  function preparedHandle(settings, state, prepared, dispose) {
@@ -9,6 +9,6 @@ export declare function createGuestDesktopNativeTools(options: {
9
9
  display: string;
10
10
  /** An owner-created private directory inside the disposable guest. */
11
11
  temporaryDirectory: string;
12
- /** Owner-created cookie file; never inherit an operator's XAUTHORITY. */
12
+ /** Owner-created cookie file; never inherit an operator's `XAUTHORITY`. */
13
13
  xauthority: string;
14
14
  }): GuestDesktopNativeTools;
@@ -105,7 +105,7 @@ export async function runGuestRuntime(options) {
105
105
  isAuthorized: () => !authority.aborted,
106
106
  ...(desktop.finishRecording ? { finishRecording: desktop.finishRecording } : {}),
107
107
  });
108
- // No await in this handoff: an immediate HELLO already has its sole receiver.
108
+ // No await in this handoff: an immediate hello already has its sole receiver.
109
109
  options.transport.write(encodeGuestBootstrap(identity, true), (error) => {
110
110
  if (error)
111
111
  terminal();
package/dist/index.d.ts CHANGED
@@ -1,12 +1,12 @@
1
- export { runPackageLab as runLab } from "./run-lab.js";
2
- export type { LabOutcome, LabResult, RunLabOptions } from "./run-lab.js";
3
- export type { LabEvent } from "./lab/run-lab-events.js";
1
+ export { runPackageLab as runStudy } from "./run-lab.js";
2
+ export type { LabOutcome as StudyOutcome, LabResult as StudyResult, RunLabOptions as RunStudyOptions, } from "./run-lab.js";
3
+ export type { LabEvent as StudyEvent } from "./lab/run-lab-events.js";
4
4
  export type { ProviderContext } from "./lab/run-lab-homes.js";
5
5
  export { routeOf } from "./lab/plan.js";
6
- export type { LabRoute } from "./lab/plan.js";
7
- export { parseLabConfig } from "./lab/config.js";
8
- export { LAB_CONFIG_SCHEMA } from "./lab/types.js";
9
- export type { LabConfig } from "./lab/types.js";
6
+ export type { LabRoute as StudyRoute } from "./lab/plan.js";
7
+ export { parseLabConfig as parseStudy } from "./lab/config.js";
8
+ export { STUDY_SCHEMA } from "./lab/types.js";
9
+ export type { LabConfig as StudyConfig } from "./lab/types.js";
10
10
  export { verifyRun } from "./verify/verify.js";
11
11
  export type { VerifyResult } from "./verify/verify.js";
12
12
  export { renderObserver } from "./observer/render.js";
@@ -14,16 +14,18 @@ export type { ObserverResult } from "./observer/render.js";
14
14
  export type { RunBundle, RunFeedbackCandidate } from "./run/bundle.js";
15
15
  export type { ActorTrace } from "./actors/contract.js";
16
16
  export { runComputerUseLoop, stableProgressKey } from "./actors/computer-use/loop.js";
17
- export type { CuaAction, CuaExecutor, CuaLoopOptions, CuaLoopResult, CuaObservation, CuaProvider, CuaSafetyCheck, CuaTurn, CuaTurnRequest, } from "./actors/computer-use/loop.js";
17
+ export type { CuaAction as ComputerUseAction, CuaExecutor as ComputerUseExecutor, CuaLoopOptions as ComputerUseLoopOptions, CuaLoopResult as ComputerUseLoopResult, CuaObservation as ComputerUseObservation, CuaProvider as ComputerUseProvider, CuaSafetyCheck as ComputerUseSafetyCheck, CuaTurn as ComputerUseTurn, CuaTurnRequest as ComputerUseTurnRequest, } from "./actors/computer-use/loop.js";
18
18
  export type { ActorCapabilities } from "./actors/contract.js";
19
19
  export { createOpenAiResponsesProvider } from "./actors/computer-use/openai-provider.js";
20
20
  export type { OpenAiResponsesProviderOptions } from "./actors/computer-use/openai-provider.js";
21
- export { CuaAdmissionLimitError } from "./actors/computer-use/admission-limit.js";
21
+ export { CuaAdmissionLimitError as ComputerUseAdmissionLimitError } from "./actors/computer-use/admission-limit.js";
22
22
  export { defaultRedactionHooks } from "./evidence/redaction.js";
23
23
  export type { RedactionHooks } from "./evidence/redaction.js";
24
24
  export type { E2BDesktopSandbox } from "./substrates/e2b/sdk.js";
25
25
  export { browserScorer, terminalScorer } from "./lab/adapter-scorer-loader.js";
26
26
  export type { AdapterScorerModule, AdapterScoringContext } from "./lab/adapter-scorer-loader.js";
27
- export type { BrowserLabScoringContext } from "./lab/adapter-extension.js";
27
+ export type { BrowserLabScoringContext as BrowserScoringContext } from "./lab/adapter-extension.js";
28
28
  export type { TerminalProductScoringContext } from "./routes/terminal/types.js";
29
29
  export type { RunAdapterArtifact, RunAdapterScore } from "./run/bundle.js";
30
+ export { CuaAdmissionLimitError, LAB_CONFIG_SCHEMA, parseLabConfig, runLab, } from "./library-aliases.js";
31
+ export type { BrowserLabScoringContext, CuaAction, CuaExecutor, CuaLoopOptions, CuaLoopResult, CuaObservation, CuaProvider, CuaSafetyCheck, CuaTurn, CuaTurnRequest, LabConfig, LabEvent, LabOutcome, LabResult, LabRoute, RunLabOptions, } from "./library-aliases.js";
package/dist/index.js CHANGED
@@ -1,18 +1,20 @@
1
- // The library surface: what an adopter needs to run a lab, read a run, bring a participant or
1
+ // The library surface: what an adopter needs to run a study, read a run, bring a participant or
2
2
  // score a run. Everything else is internal and reached through the `humanish` bin. See
3
3
  // docs/contracts/schemas.md, "Library options", and the site's library page.
4
- // Run a lab.
5
- export { runPackageLab as runLab } from "./run-lab.js";
4
+ // Run a study.
5
+ export { runPackageLab as runStudy } from "./run-lab.js";
6
6
  export { routeOf } from "./lab/plan.js";
7
- export { parseLabConfig } from "./lab/config.js";
8
- export { LAB_CONFIG_SCHEMA } from "./lab/types.js";
7
+ export { parseLabConfig as parseStudy } from "./lab/config.js";
8
+ export { STUDY_SCHEMA } from "./lab/types.js";
9
9
  // Read a run.
10
10
  export { verifyRun } from "./verify/verify.js";
11
11
  export { renderObserver } from "./observer/render.js";
12
12
  // Bring a participant.
13
13
  export { runComputerUseLoop, stableProgressKey } from "./actors/computer-use/loop.js";
14
14
  export { createOpenAiResponsesProvider } from "./actors/computer-use/openai-provider.js";
15
- export { CuaAdmissionLimitError } from "./actors/computer-use/admission-limit.js";
15
+ export { CuaAdmissionLimitError as ComputerUseAdmissionLimitError } from "./actors/computer-use/admission-limit.js";
16
16
  export { defaultRedactionHooks } from "./evidence/redaction.js";
17
17
  // Score a run.
18
18
  export { browserScorer, terminalScorer } from "./lab/adapter-scorer-loader.js";
19
+ // The 0.107 names, deprecated until 0.109 removes them. Each is its new name's value or type.
20
+ export { CuaAdmissionLimitError, LAB_CONFIG_SCHEMA, parseLabConfig, runLab, } from "./library-aliases.js";
@@ -1,6 +1,6 @@
1
1
  export interface ResolvedKeyFill {
2
2
  name: string;
3
- /** Human-readable source label (a path or command name) — never a value. */
3
+ /** Human-readable source label (a path or command name), never a value. */
4
4
  source: string;
5
5
  }
6
6
  export interface KeyResolutionDeps {
@@ -29,8 +29,8 @@ export interface KeySourceProbe {
29
29
  /** The command/path that would fill it when missing. */
30
30
  hint: string;
31
31
  }
32
- /** The nearest fill instruction for a missing key — used by doctor rows and appended to
33
- * *_KEYS_MISSING errors so the failure names the fix, not just the absence (#436). */
32
+ /** The nearest fill instruction for a missing key. Doctor rows use it, and it is appended to
33
+ * *_KEYS_MISSING errors so the failure names the fix. */
34
34
  export declare function missingKeyHint(name: string): string;
35
35
  /** One shared suffix for *_KEYS_MISSING messages: where discovery looked, and what fills each
36
36
  * missing key. Pure text; never values. */
@@ -47,10 +47,10 @@ export declare function probeKeySources(names: readonly string[], args: {
47
47
  /** Resolve a `humanish keys set` target: a vendor alias or a raw env name. Null = invalid. */
48
48
  export declare function resolveKeyName(vendorOrName: string): string | null;
49
49
  /** Write one key into the user store (0700 dir, 0600 file). Only allowlisted provider names
50
- * are storable (the store feeds implicit discovery — an arbitrary-name store would be an env
50
+ * are storable (the store feeds implicit discovery, so an arbitrary-name store would be an env
51
51
  * injection vector with extra steps). The value must be a single non-empty line that
52
52
  * round-trips the store's own parser byte-identically, and the write refuses symlinks at the
53
- * file and its parent directory (red-team findings). */
53
+ * file and its parent directory. */
54
54
  export declare function setUserKey(name: string, value: string, env: NodeJS.ProcessEnv, deps?: KeyResolutionDeps): {
55
55
  path: string;
56
56
  };
@@ -1,21 +1,21 @@
1
- // Provider-key discovery (#436): resolve the keys a live run needs through each vendor's
1
+ // Provider-key discovery: resolve the keys a live run needs through each vendor's
2
2
  // native chain instead of demanding a per-repo --env-file that operators hand-copy keys into.
3
3
  //
4
- // The chain, per key, FILL-ONLY (a rung never overrides anything already present):
5
- // 1. process env — including whatever --env-file just loaded (explicit always wins);
6
- // 2. `.humanish/local/provider.env` — the project-local overlay this CLI's own --help
4
+ // The chain, per key, fill-only (a rung never overrides anything already present):
5
+ // 1. process env, including whatever --env-file just loaded (explicit always wins);
6
+ // 2. `.humanish/local/provider.env`, the project-local overlay this CLI's own --help
7
7
  // examples document;
8
8
  // 3. the owning vendor's native store, where one exists:
9
9
  // E2B_API_KEY <- ~/.e2b/config.json (written by `e2b auth login`);
10
10
  // GH_TOKEN <- `gh auth token` (the gh CLI's credential chain);
11
11
  // 4. the humanish user-level store `$XDG_CONFIG_HOME/humanish/keys.env`, written only by
12
- // `humanish keys set` (0600, prompted or --stdin) — the fallback for vendors that ship
12
+ // `humanish keys set` (0600, prompted or --stdin), the fallback for vendors that ship
13
13
  // no machine chain of their own (OpenAI, Anthropic).
14
14
  //
15
15
  // Every fill is announced by key name + source, never by value. The subject app's own
16
16
  // `.env`/`.env.local` are never read: those hold product credentials, a different class
17
- // (#11); this module only reads humanish-owned files and vendor-owned stores.
18
- // `HUMANISH_STRICT_KEYS=1` disables every rung below process env (the pre-#436 behavior).
17
+ // of secret; this module only reads humanish-owned files and vendor-owned stores.
18
+ // `HUMANISH_STRICT_KEYS=1` disables every rung below process env.
19
19
  import { spawn } from "node:child_process";
20
20
  import { chmodSync, closeSync, constants as fsConstants, existsSync, ftruncateSync, lstatSync, mkdirSync, openSync, readFileSync, writeSync, } from "node:fs";
21
21
  import { homedir } from "node:os";
@@ -24,7 +24,7 @@ import { loadEnvFile } from "./env-file.js";
24
24
  /** The only names implicit discovery may fill (and `humanish keys set` may store). Everything
25
25
  * else in an overlay/store file is ignored-and-named: a repo-planted NODE_OPTIONS/LD_PRELOAD
26
26
  * must never enter process env off a file the operator did not explicitly pass (an explicit
27
- * --env-file remains the operator's own full-file load). Red-team finding, #436. */
27
+ * --env-file remains the operator's own full-file load). */
28
28
  const KNOWN_PROVIDER_KEYS = [
29
29
  "OPENAI_API_KEY",
30
30
  "ANTHROPIC_API_KEY",
@@ -52,7 +52,7 @@ export function userKeyStorePath(env, deps = {}) {
52
52
  const home = deps.homeDir ?? homedir();
53
53
  const declared = env.XDG_CONFIG_HOME?.trim();
54
54
  // The XDG spec: a relative XDG_CONFIG_HOME must be ignored. Honoring one would make the
55
- // key store cwd-relative — `humanish keys set` would write a secret into the current repo.
55
+ // key store cwd-relative: `humanish keys set` would write a secret into the current repo.
56
56
  const configHome = declared !== undefined && declared !== "" && path.isAbsolute(declared)
57
57
  ? declared
58
58
  : path.join(home, ".config");
@@ -151,16 +151,16 @@ export async function discoverProviderKeys(args) {
151
151
  const fills = [];
152
152
  const ignored = [];
153
153
  // Fill-only means presence wins, including an explicitly-set empty value: an operator who
154
- // exported OPENAI_API_KEY="" said "off", and a rung that "fixes" that has overridden them
155
- // (red-team finding). Only a truly-unset name is fillable.
154
+ // exported OPENAI_API_KEY="" said "off", and a rung that "fixes" that has overridden them.
155
+ // Only a truly-unset name is fillable.
156
156
  const fillable = (name) => env[name] === undefined;
157
157
  const fill = (name, value, source) => {
158
158
  env[name] = value;
159
159
  fills.push({ name, source });
160
160
  };
161
161
  // Rung 2: the documented project-local overlay. Parsed atomically against a scratch env so a
162
- // file loadEnvFile rejects can never half-apply (red-team finding: earlier lines used to land
163
- // in env unannounced before the parse error aborted). Only allowlisted provider names cross
162
+ // file loadEnvFile rejects can never half-apply: otherwise lines before the parse error would
163
+ // land in env unannounced. Only allowlisted provider names cross
164
164
  // from the file into the real env.
165
165
  const overlayPath = path.resolve(cwd, PROJECT_OVERLAY_RELATIVE);
166
166
  if (isRegularFile(overlayPath) && !dirIsSymlink(overlayPath)) {
@@ -196,7 +196,7 @@ export async function discoverProviderKeys(args) {
196
196
  }
197
197
  // Rung 4: the humanish user-level store, read with the same lenient parser `keys set`/`list`
198
198
  // use, so one hand-mangled line degrades to that line alone instead of silently voiding the
199
- // whole store (red-team finding: the strict parser disagreed with the store's own reader).
199
+ // whole store, as the strict parser would.
200
200
  const storePath = userKeyStorePath(env, deps);
201
201
  if (isRegularFile(storePath) && !dirIsSymlink(storePath)) {
202
202
  for (const [name, value] of readStoreEntries(storePath)) {
@@ -213,11 +213,11 @@ export async function discoverProviderKeys(args) {
213
213
  if (announced === undefined || announced.has(fill_.name))
214
214
  announce(`humanish keys: ${fill_.name} from ${fill_.source}`);
215
215
  for (const name of ignored)
216
- announce(`humanish keys: ignored non-provider name ${name} — implicit discovery fills provider keys only; pass the file via --env-file to load everything in it`);
216
+ announce(`humanish keys: ignored ${name}, which is not a provider key. Discovery loads provider keys only; pass the file with --env-file to load every name in it.`);
217
217
  return fills;
218
218
  }
219
219
  /** True when the file's parent directory is (or traverses) a symlink at its last component:
220
- * the dir-level retarget that defeats a file-level lstat check (red-team finding). */
220
+ * the dir-level retarget that defeats a file-level lstat check. */
221
221
  function dirIsSymlink(filePath) {
222
222
  try {
223
223
  return lstatSync(path.dirname(filePath)).isSymbolicLink();
@@ -230,8 +230,8 @@ function storeLabel(env, deps) {
230
230
  const home = deps.homeDir ?? homedir();
231
231
  return userKeyStorePath(env, deps).replace(home, "~");
232
232
  }
233
- /** The nearest fill instruction for a missing key — used by doctor rows and appended to
234
- * *_KEYS_MISSING errors so the failure names the fix, not just the absence (#436). */
233
+ /** The nearest fill instruction for a missing key. Doctor rows use it, and it is appended to
234
+ * *_KEYS_MISSING errors so the failure names the fix. */
235
235
  export function missingKeyHint(name) {
236
236
  switch (name) {
237
237
  case "E2B_API_KEY":
@@ -273,7 +273,7 @@ export async function probeKeySources(names, args) {
273
273
  return names.map((name) => {
274
274
  const inEnv = args.env[name] !== undefined && args.env[name]?.trim() !== "";
275
275
  // GH_TOKEN and GITHUB_TOKEN are one credential with two spellings; a doctor row that says
276
- // "missing" while GITHUB_TOKEN sits in the env would be wrong (red-team nit).
276
+ // "missing" while GITHUB_TOKEN sits in the env would be wrong.
277
277
  const aliasInEnv = name === "GH_TOKEN" &&
278
278
  args.env.GITHUB_TOKEN !== undefined &&
279
279
  args.env.GITHUB_TOKEN.trim() !== "";
@@ -294,10 +294,10 @@ export function resolveKeyName(vendorOrName) {
294
294
  return ENV_NAME.test(vendorOrName) ? vendorOrName : null;
295
295
  }
296
296
  /** Write one key into the user store (0700 dir, 0600 file). Only allowlisted provider names
297
- * are storable (the store feeds implicit discovery — an arbitrary-name store would be an env
297
+ * are storable (the store feeds implicit discovery, so an arbitrary-name store would be an env
298
298
  * injection vector with extra steps). The value must be a single non-empty line that
299
299
  * round-trips the store's own parser byte-identically, and the write refuses symlinks at the
300
- * file and its parent directory (red-team findings). */
300
+ * file and its parent directory. */
301
301
  export function setUserKey(name, value, env, deps = {}) {
302
302
  const trimmed = value.trim();
303
303
  if (trimmed.length === 0 || /[\u0000-\u001f\u007f]/.test(trimmed)) {
@@ -363,8 +363,8 @@ function readStoreEntries(storePath) {
363
363
  function writeStore(storePath, entries) {
364
364
  const body = [...entries.entries()].map(([name, value]) => `${name}=${value}`).join("\n");
365
365
  const text = body.length > 0 ? `${body}\n` : "";
366
- // O_NOFOLLOW: a symlinked keys.env must never carry the write to its target (red-team
367
- // reproduced writing a secret through the link into an attacker-chosen file).
366
+ // O_NOFOLLOW: a symlinked keys.env must never carry the write to its target, which would put a
367
+ // secret into an attacker-chosen file.
368
368
  const fd = openSync(storePath, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_NOFOLLOW, 0o600);
369
369
  try {
370
370
  ftruncateSync(fd, 0);