humanish 0.107.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (671) hide show
  1. package/ARCHITECTURE.md +73 -69
  2. package/CHANGELOG.md +27 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +148 -175
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-trace.js +2 -1
  14. package/dist/actors/codex/app-server-ui.js +1 -1
  15. package/dist/actors/codex/codex-admission.d.ts +91 -0
  16. package/dist/actors/codex/codex-admission.js +150 -0
  17. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  18. package/dist/actors/codex/restricted-executable.js +8 -8
  19. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  20. package/dist/actors/codex/restricted-launch.js +1 -1
  21. package/dist/actors/codex/restricted-participant.js +20 -18
  22. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  23. package/dist/actors/codex/restricted-policy.js +2 -2
  24. package/dist/actors/codex/restricted-session.d.ts +3 -3
  25. package/dist/actors/codex/restricted-session.js +10 -5
  26. package/dist/actors/computer-use/actor.d.ts +18 -18
  27. package/dist/actors/computer-use/actor.js +4 -4
  28. package/dist/actors/computer-use/admission-limit.d.ts +3 -3
  29. package/dist/actors/computer-use/admission-limit.js +4 -4
  30. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  31. package/dist/actors/computer-use/executor-error.js +3 -3
  32. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  33. package/dist/actors/computer-use/loop/actions.js +15 -15
  34. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  35. package/dist/actors/computer-use/loop/backstop.js +14 -12
  36. package/dist/actors/computer-use/loop/debrief.js +2 -2
  37. package/dist/actors/computer-use/loop/ending.d.ts +6 -6
  38. package/dist/actors/computer-use/loop/ending.js +18 -17
  39. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  40. package/dist/actors/computer-use/loop/observation.js +15 -14
  41. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  42. package/dist/actors/computer-use/loop/provider-call.js +12 -12
  43. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  44. package/dist/actors/computer-use/loop/session.js +4 -4
  45. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  46. package/dist/actors/computer-use/loop/spend.js +1 -1
  47. package/dist/actors/computer-use/loop/trace.js +11 -9
  48. package/dist/actors/computer-use/loop/types.d.ts +47 -45
  49. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  50. package/dist/actors/computer-use/loop/usage.js +2 -2
  51. package/dist/actors/computer-use/loop.d.ts +6 -1
  52. package/dist/actors/computer-use/loop.js +26 -4
  53. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  54. package/dist/actors/computer-use/openai-context.js +214 -0
  55. package/dist/actors/computer-use/openai-provider.d.ts +13 -10
  56. package/dist/actors/computer-use/openai-provider.js +52 -41
  57. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  58. package/dist/actors/computer-use/openai-requests.js +82 -15
  59. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  60. package/dist/actors/computer-use/openai-wire.js +36 -34
  61. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  62. package/dist/actors/computer-use/provider-error.js +6 -6
  63. package/dist/actors/contract.d.ts +82 -47
  64. package/dist/actors/contract.js +30 -24
  65. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  66. package/dist/actors/local-agent/claude-session.js +13 -12
  67. package/dist/actors/local-agent/cli.d.ts +9 -7
  68. package/dist/actors/local-agent/cli.js +24 -28
  69. package/dist/actors/local-agent/readiness.d.ts +2 -2
  70. package/dist/actors/local-agent/readiness.js +4 -4
  71. package/dist/actors/reasoning-effort.js +8 -8
  72. package/dist/actors/registry.d.ts +12 -12
  73. package/dist/actors/registry.js +21 -20
  74. package/dist/actors/scripted-browser/actor.d.ts +10 -10
  75. package/dist/actors/scripted-browser/actor.js +17 -17
  76. package/dist/actors/scripted-browser/browser-command.js +1 -1
  77. package/dist/actors/scripted-browser/steps.js +1 -1
  78. package/dist/actors/scripted-browser/types.d.ts +1 -1
  79. package/dist/actors/stop-conditions.d.ts +1 -1
  80. package/dist/analysis/automatic-completion.d.ts +7 -7
  81. package/dist/analysis/automatic-completion.js +1 -1
  82. package/dist/analysis/automatic-config.d.ts +6 -6
  83. package/dist/analysis/automatic-config.js +1 -1
  84. package/dist/analysis/codex-config.d.ts +6 -2
  85. package/dist/analysis/codex-config.js +22 -14
  86. package/dist/analysis/execute.d.ts +1 -1
  87. package/dist/analysis/execute.js +1 -1
  88. package/dist/analysis/service.js +5 -5
  89. package/dist/analysis/types.d.ts +6 -0
  90. package/dist/browser-control/client.js +16 -16
  91. package/dist/browser-control/dispatcher.js +4 -4
  92. package/dist/browser-control/protocol.js +14 -14
  93. package/dist/browser-control/recording-transfer.js +4 -4
  94. package/dist/browser-control/transport.js +7 -7
  95. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  96. package/dist/cli/commands/analyze.js +19 -16
  97. package/dist/cli/commands/codex.js +9 -9
  98. package/dist/cli/commands/comms.js +48 -35
  99. package/dist/cli/commands/feedback.js +20 -21
  100. package/dist/cli/commands/migrate.d.ts +4 -0
  101. package/dist/cli/commands/migrate.js +65 -0
  102. package/dist/cli/commands/observe.d.ts +0 -1
  103. package/dist/cli/commands/observe.js +136 -112
  104. package/dist/cli/commands/run-command.d.ts +10 -0
  105. package/dist/cli/commands/run-command.js +85 -0
  106. package/dist/cli/commands/runs.js +136 -139
  107. package/dist/cli/commands/setup.d.ts +2 -2
  108. package/dist/cli/commands/setup.js +27 -24
  109. package/dist/cli/commands/study-format.d.ts +9 -0
  110. package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
  111. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  112. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
  113. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  114. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  115. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  116. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
  117. package/dist/cli/commands/study-route-run.d.ts +19 -0
  118. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  119. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  120. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  121. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  122. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
  123. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  124. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  125. package/dist/cli/commands/study-run.d.ts +9 -0
  126. package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
  127. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
  128. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
  129. package/dist/cli/commands/study.d.ts +3 -0
  130. package/dist/cli/commands/study.js +146 -0
  131. package/dist/cli/commands/tui.d.ts +4 -4
  132. package/dist/cli/commands/tui.js +31 -31
  133. package/dist/cli/commands/watch.js +71 -121
  134. package/dist/cli/deprecations.d.ts +6 -0
  135. package/dist/cli/deprecations.js +18 -0
  136. package/dist/cli/doctor.d.ts +18 -8
  137. package/dist/cli/doctor.js +114 -59
  138. package/dist/cli/first-run-path.d.ts +15 -13
  139. package/dist/cli/first-run-path.js +35 -33
  140. package/dist/cli/io.d.ts +44 -9
  141. package/dist/cli/io.js +98 -23
  142. package/dist/cli/observer-follow.d.ts +3 -3
  143. package/dist/cli/observer-follow.js +6 -7
  144. package/dist/cli/orientation.d.ts +10 -7
  145. package/dist/cli/orientation.js +89 -47
  146. package/dist/cli/product-sentence.d.ts +6 -0
  147. package/dist/cli/product-sentence.js +6 -0
  148. package/dist/cli/program.d.ts +6 -1
  149. package/dist/cli/program.js +111 -43
  150. package/dist/cli/telemetry.d.ts +16 -16
  151. package/dist/cli/telemetry.js +46 -44
  152. package/dist/cli.js +1 -1
  153. package/dist/comms/capture-surface.d.ts +13 -12
  154. package/dist/comms/capture-surface.js +23 -22
  155. package/dist/comms/catch-host.d.ts +7 -7
  156. package/dist/comms/catch-host.js +17 -17
  157. package/dist/comms/connections.d.ts +1 -1
  158. package/dist/comms/connections.js +2 -2
  159. package/dist/comms/email-catch.d.ts +3 -3
  160. package/dist/comms/email-catch.js +8 -8
  161. package/dist/comms/external-evidence.d.ts +5 -5
  162. package/dist/comms/external-evidence.js +5 -4
  163. package/dist/comms/extract.js +2 -2
  164. package/dist/comms/fake-inbox.d.ts +3 -3
  165. package/dist/comms/fake-inbox.js +3 -3
  166. package/dist/comms/receiving-render.d.ts +1 -1
  167. package/dist/comms/receiving-render.js +2 -2
  168. package/dist/comms/receiving-runtime.d.ts +4 -4
  169. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  170. package/dist/comms/sandbox-catch-script.js +6 -6
  171. package/dist/comms/sandbox-catch.d.ts +38 -39
  172. package/dist/comms/sandbox-catch.js +36 -37
  173. package/dist/comms/setup.d.ts +2 -2
  174. package/dist/comms/setup.js +56 -25
  175. package/dist/comms/thread-evidence.d.ts +1 -1
  176. package/dist/comms/thread-evidence.js +6 -6
  177. package/dist/comms/types.d.ts +6 -6
  178. package/dist/comms/types.js +3 -3
  179. package/dist/evidence/frame-signature.d.ts +1 -1
  180. package/dist/evidence/frame-signature.js +4 -4
  181. package/dist/evidence/redaction.d.ts +3 -3
  182. package/dist/evidence/redaction.js +4 -4
  183. package/dist/feedback/draft.js +38 -80
  184. package/dist/feedback/export-bundle.js +1 -1
  185. package/dist/feedback/export.d.ts +5 -1
  186. package/dist/feedback/export.js +10 -10
  187. package/dist/feedback/feedback.d.ts +2 -2
  188. package/dist/feedback/feedback.js +21 -3
  189. package/dist/feedback/proof.d.ts +1 -1
  190. package/dist/feedback/proof.js +2 -2
  191. package/dist/guest/bootstrap.js +6 -6
  192. package/dist/guest/browser-tools.js +8 -8
  193. package/dist/guest/chromium-text.js +19 -19
  194. package/dist/guest/desktop-executor.d.ts +2 -2
  195. package/dist/guest/desktop-executor.js +20 -20
  196. package/dist/guest/desktop-keys.js +4 -4
  197. package/dist/guest/desktop-media.d.ts +2 -2
  198. package/dist/guest/desktop-media.js +16 -16
  199. package/dist/guest/desktop-native.d.ts +1 -1
  200. package/dist/guest/desktop-native.js +10 -10
  201. package/dist/guest/runtime-desktop.js +2 -2
  202. package/dist/guest/runtime-processes.d.ts +2 -2
  203. package/dist/guest/runtime-processes.js +2 -2
  204. package/dist/guest/runtime.js +6 -6
  205. package/dist/index.d.ts +14 -14
  206. package/dist/index.js +8 -8
  207. package/dist/keys/key-resolution.d.ts +5 -5
  208. package/dist/keys/key-resolution.js +23 -23
  209. package/dist/observer/artifact.d.ts +2 -2
  210. package/dist/observer/artifact.js +7 -7
  211. package/dist/observer/data.d.ts +6 -6
  212. package/dist/observer/data.js +5 -4
  213. package/dist/observer/exposure.d.ts +1 -1
  214. package/dist/observer/exposure.js +11 -11
  215. package/dist/observer/http.js +1 -1
  216. package/dist/observer/library.d.ts +3 -1
  217. package/dist/observer/library.js +8 -3
  218. package/dist/observer/listen.js +5 -4
  219. package/dist/observer/render.d.ts +1 -1
  220. package/dist/observer/render.js +17 -6
  221. package/dist/observer/run-routes.d.ts +4 -3
  222. package/dist/observer/run-routes.js +38 -13
  223. package/dist/observer/serve.d.ts +1 -1
  224. package/dist/observer/serve.js +7 -3
  225. package/dist/observer/tunnel.js +1 -1
  226. package/dist/observer-app.html +4 -4
  227. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  228. package/dist/routes/computer-use/bundle-parts.js +18 -17
  229. package/dist/routes/computer-use/bundle.d.ts +2 -2
  230. package/dist/routes/computer-use/bundle.js +10 -9
  231. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
  232. package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
  233. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  234. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
  235. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  236. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
  238. package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
  239. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  240. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
  241. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  242. package/dist/routes/computer-use/external-comms.js +1 -1
  243. package/dist/routes/computer-use/fanout-bundle.js +27 -26
  244. package/dist/routes/computer-use/fanout-records.js +12 -13
  245. package/dist/routes/computer-use/live-flush.d.ts +4 -4
  246. package/dist/routes/computer-use/live-flush.js +6 -6
  247. package/dist/routes/computer-use/live-phase.d.ts +5 -4
  248. package/dist/routes/computer-use/live-phase.js +8 -8
  249. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  250. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  251. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  252. package/dist/routes/computer-use/local-vm.js +3 -3
  253. package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
  254. package/dist/routes/computer-use/participant-desktop.js +5 -5
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +10 -10
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +33 -15
  259. package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
  260. package/dist/routes/computer-use/participant-prompt.js +9 -9
  261. package/dist/routes/computer-use/participant-runs.d.ts +16 -16
  262. package/dist/routes/computer-use/participant-runs.js +26 -25
  263. package/dist/routes/computer-use/plan.d.ts +12 -12
  264. package/dist/routes/computer-use/plan.js +42 -42
  265. package/dist/routes/computer-use/preflight.d.ts +5 -5
  266. package/dist/routes/computer-use/preflight.js +25 -25
  267. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  268. package/dist/routes/computer-use/rerun-selection.js +4 -3
  269. package/dist/routes/computer-use/result.d.ts +4 -4
  270. package/dist/routes/computer-use/result.js +22 -21
  271. package/dist/routes/computer-use/route.d.ts +12 -11
  272. package/dist/routes/computer-use/route.js +31 -30
  273. package/dist/routes/computer-use/self-report.d.ts +7 -7
  274. package/dist/routes/computer-use/self-report.js +32 -32
  275. package/dist/routes/computer-use/setup.d.ts +23 -23
  276. package/dist/routes/computer-use/setup.js +28 -29
  277. package/dist/routes/computer-use/single-bundle.d.ts +11 -11
  278. package/dist/routes/computer-use/single-bundle.js +40 -41
  279. package/dist/routes/computer-use/subject-projection.d.ts +4 -4
  280. package/dist/routes/computer-use/subject-projection.js +6 -6
  281. package/dist/routes/computer-use/types.d.ts +71 -73
  282. package/dist/routes/computer-use/types.js +12 -12
  283. package/dist/routes/preview.d.ts +13 -7
  284. package/dist/routes/preview.js +11 -7
  285. package/dist/routes/scripted/bundle.d.ts +7 -7
  286. package/dist/routes/scripted/bundle.js +20 -18
  287. package/dist/routes/scripted/plan.d.ts +8 -8
  288. package/dist/routes/scripted/plan.js +13 -13
  289. package/dist/routes/scripted/result.d.ts +3 -3
  290. package/dist/routes/scripted/result.js +13 -13
  291. package/dist/routes/scripted/route.d.ts +9 -9
  292. package/dist/routes/scripted/route.js +15 -16
  293. package/dist/routes/scripted/scenario.d.ts +1 -1
  294. package/dist/routes/scripted/scenario.js +5 -5
  295. package/dist/routes/scripted/setup.d.ts +6 -6
  296. package/dist/routes/scripted/setup.js +8 -8
  297. package/dist/routes/scripted/subject.d.ts +5 -5
  298. package/dist/routes/scripted/subject.js +4 -4
  299. package/dist/routes/scripted/surface-records.d.ts +1 -1
  300. package/dist/routes/scripted/surface-records.js +4 -4
  301. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  302. package/dist/routes/scripted/types.d.ts +18 -20
  303. package/dist/routes/scripted/types.js +2 -2
  304. package/dist/routes/shared-world/bundle-records.js +11 -10
  305. package/dist/routes/shared-world/bundle.d.ts +5 -5
  306. package/dist/routes/shared-world/bundle.js +46 -43
  307. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  308. package/dist/routes/shared-world/checkpoints.js +2 -2
  309. package/dist/routes/shared-world/comms.d.ts +14 -14
  310. package/dist/routes/shared-world/comms.js +19 -18
  311. package/dist/routes/shared-world/external-public.d.ts +4 -3
  312. package/dist/routes/shared-world/external-public.js +16 -12
  313. package/dist/routes/shared-world/handoff.d.ts +7 -6
  314. package/dist/routes/shared-world/handoff.js +65 -57
  315. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  316. package/dist/routes/shared-world/lobby-code.js +9 -9
  317. package/dist/routes/shared-world/participant-specs.d.ts +10 -9
  318. package/dist/routes/shared-world/participant-specs.js +38 -31
  319. package/dist/routes/shared-world/plan.d.ts +9 -9
  320. package/dist/routes/shared-world/plan.js +16 -16
  321. package/dist/routes/shared-world/provenance.d.ts +2 -2
  322. package/dist/routes/shared-world/provenance.js +2 -2
  323. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  324. package/dist/routes/shared-world/provisioned.js +18 -17
  325. package/dist/routes/shared-world/result.d.ts +6 -6
  326. package/dist/routes/shared-world/result.js +29 -29
  327. package/dist/routes/shared-world/route.d.ts +11 -11
  328. package/dist/routes/shared-world/route.js +40 -39
  329. package/dist/routes/shared-world/setup.d.ts +16 -16
  330. package/dist/routes/shared-world/setup.js +23 -23
  331. package/dist/routes/shared-world/types.d.ts +55 -53
  332. package/dist/routes/shared-world/types.js +4 -4
  333. package/dist/routes/terminal/adapter.d.ts +5 -5
  334. package/dist/routes/terminal/adapter.js +9 -9
  335. package/dist/routes/terminal/bundle.d.ts +13 -13
  336. package/dist/routes/terminal/bundle.js +28 -27
  337. package/dist/routes/terminal/credentials.d.ts +8 -8
  338. package/dist/routes/terminal/credentials.js +12 -12
  339. package/dist/routes/terminal/dry-run.d.ts +4 -4
  340. package/dist/routes/terminal/dry-run.js +12 -12
  341. package/dist/routes/terminal/encoding.js +2 -2
  342. package/dist/routes/terminal/ledger.d.ts +5 -5
  343. package/dist/routes/terminal/ledger.js +14 -14
  344. package/dist/routes/terminal/lifetime.d.ts +1 -1
  345. package/dist/routes/terminal/lifetime.js +1 -1
  346. package/dist/routes/terminal/live-finish.d.ts +2 -2
  347. package/dist/routes/terminal/live-finish.js +10 -10
  348. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  349. package/dist/routes/terminal/live-sandbox.js +15 -15
  350. package/dist/routes/terminal/participant-text.js +2 -1
  351. package/dist/routes/terminal/persona.d.ts +2 -2
  352. package/dist/routes/terminal/persona.js +3 -3
  353. package/dist/routes/terminal/plan.d.ts +7 -7
  354. package/dist/routes/terminal/plan.js +15 -15
  355. package/dist/routes/terminal/recorder.js +2 -2
  356. package/dist/routes/terminal/result.d.ts +5 -5
  357. package/dist/routes/terminal/result.js +14 -14
  358. package/dist/routes/terminal/route.d.ts +9 -9
  359. package/dist/routes/terminal/route.js +19 -20
  360. package/dist/routes/terminal/sandbox.d.ts +1 -1
  361. package/dist/routes/terminal/sandbox.js +1 -1
  362. package/dist/routes/terminal/session.d.ts +5 -5
  363. package/dist/routes/terminal/session.js +14 -13
  364. package/dist/routes/terminal/token-usage.d.ts +1 -1
  365. package/dist/routes/terminal/token-usage.js +7 -8
  366. package/dist/routes/terminal/trace.d.ts +4 -4
  367. package/dist/routes/terminal/trace.js +2 -2
  368. package/dist/routes/terminal/types.d.ts +48 -50
  369. package/dist/routes/terminal/types.js +5 -5
  370. package/dist/run/bundle-shape.js +3 -3
  371. package/dist/run/bundle.d.ts +49 -49
  372. package/dist/run/bundle.js +3 -2
  373. package/dist/run/cost-summary.js +3 -3
  374. package/dist/run/costs.d.ts +23 -0
  375. package/dist/run/costs.js +79 -44
  376. package/dist/run/detail.d.ts +6 -6
  377. package/dist/run/detail.js +4 -4
  378. package/dist/run/dry-run-inputs.d.ts +1 -1
  379. package/dist/run/dry-run-inputs.js +2 -2
  380. package/dist/run/dry-run.js +20 -20
  381. package/dist/run/judge.d.ts +19 -13
  382. package/dist/run/judge.js +18 -8
  383. package/dist/run/outcomes.d.ts +1 -1
  384. package/dist/run/participant.d.ts +1 -1
  385. package/dist/run/paths.d.ts +1 -1
  386. package/dist/run/paths.js +1 -1
  387. package/dist/run/preflight-receipts.js +1 -1
  388. package/dist/run/pricing.d.ts +11 -6
  389. package/dist/run/pricing.js +22 -15
  390. package/dist/run/projection.d.ts +46 -46
  391. package/dist/run/projection.js +57 -57
  392. package/dist/run/reclaim.d.ts +1 -1
  393. package/dist/run/reclaim.js +3 -3
  394. package/dist/run/results.d.ts +5 -5
  395. package/dist/run/run-cost.d.ts +53 -0
  396. package/dist/run/run-cost.js +105 -0
  397. package/dist/run/run-index-analysis.d.ts +15 -0
  398. package/dist/run/run-index-analysis.js +77 -0
  399. package/dist/run/run-index.d.ts +19 -7
  400. package/dist/run/run-index.js +77 -64
  401. package/dist/run/run-not-found.d.ts +5 -0
  402. package/dist/run/run-not-found.js +15 -0
  403. package/dist/run/run.d.ts +6 -5
  404. package/dist/run/run.js +3 -3
  405. package/dist/run/sandbox-receipts.d.ts +2 -2
  406. package/dist/run/sandbox-receipts.js +3 -3
  407. package/dist/run/shared-world-evidence.d.ts +37 -36
  408. package/dist/run/shared-world-evidence.js +4 -4
  409. package/dist/run/shared-world-shape.d.ts +1 -1
  410. package/dist/run/shared-world-shape.js +7 -7
  411. package/dist/run/stats.d.ts +14 -8
  412. package/dist/run/stats.js +121 -63
  413. package/dist/run/status.d.ts +16 -29
  414. package/dist/run/status.js +10 -29
  415. package/dist/run/stored-runs.js +2 -1
  416. package/dist/run/stream-shape.js +1 -1
  417. package/dist/run/streams.d.ts +7 -7
  418. package/dist/run/study-provenance.d.ts +49 -0
  419. package/dist/run/study-provenance.js +66 -0
  420. package/dist/run/study-result.d.ts +11 -0
  421. package/dist/run/study-result.js +9 -0
  422. package/dist/run/text.d.ts +2 -0
  423. package/dist/run/text.js +4 -0
  424. package/dist/run-study.d.ts +112 -0
  425. package/dist/{run-lab.js → run-study.js} +52 -47
  426. package/dist/{lab → study}/adapter-extension.d.ts +15 -27
  427. package/dist/{lab → study}/adapter-extension.js +10 -45
  428. package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
  429. package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
  430. package/dist/study/composition-rules.d.ts +7 -0
  431. package/dist/{lab → study}/composition-rules.js +53 -53
  432. package/dist/study/config.d.ts +15 -0
  433. package/dist/{lab → study}/config.js +98 -41
  434. package/dist/study/convert.d.ts +33 -0
  435. package/dist/study/convert.js +432 -0
  436. package/dist/{lab → study}/device-presets.d.ts +10 -10
  437. package/dist/{lab → study}/device-presets.js +11 -11
  438. package/dist/study/discover.d.ts +75 -0
  439. package/dist/{lab → study}/discover.js +134 -95
  440. package/dist/{lab → study}/doctor.d.ts +19 -12
  441. package/dist/{lab → study}/doctor.js +58 -20
  442. package/dist/study/field-paths.d.ts +12 -0
  443. package/dist/study/field-paths.js +126 -0
  444. package/dist/study/files.d.ts +26 -0
  445. package/dist/study/files.js +44 -0
  446. package/dist/{lab → study}/init-templates.d.ts +2 -2
  447. package/dist/study/init-templates.js +421 -0
  448. package/dist/{lab → study}/init.d.ts +2 -2
  449. package/dist/{lab → study}/init.js +46 -11
  450. package/dist/study/keys.d.ts +4 -0
  451. package/dist/{lab → study}/keys.js +46 -12
  452. package/dist/study/migrate.d.ts +48 -0
  453. package/dist/study/migrate.js +408 -0
  454. package/dist/study/owned-files.d.ts +38 -0
  455. package/dist/study/owned-files.js +182 -0
  456. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  457. package/dist/{lab → study}/parse/actors.js +14 -14
  458. package/dist/study/parse/comms.d.ts +12 -0
  459. package/dist/{lab → study}/parse/comms.js +5 -5
  460. package/dist/study/parse/execution.d.ts +19 -0
  461. package/dist/{lab → study}/parse/execution.js +13 -13
  462. package/dist/study/parse/study-v3.d.ts +21 -0
  463. package/dist/study/parse/study-v3.js +259 -0
  464. package/dist/study/parse/subject-state.d.ts +30 -0
  465. package/dist/{lab → study}/parse/subject-state.js +19 -19
  466. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  467. package/dist/{lab → study}/parse/subject.js +34 -34
  468. package/dist/{lab → study}/parse/values.d.ts +3 -3
  469. package/dist/{lab → study}/parse/values.js +3 -3
  470. package/dist/{lab → study}/persona-resolve.d.ts +8 -8
  471. package/dist/{lab → study}/persona-resolve.js +6 -6
  472. package/dist/{lab → study}/plan-base.d.ts +7 -7
  473. package/dist/{lab → study}/plan-base.js +1 -1
  474. package/dist/{lab → study}/plan-participants.d.ts +12 -12
  475. package/dist/{lab → study}/plan-participants.js +4 -4
  476. package/dist/{lab → study}/plan-types.d.ts +31 -31
  477. package/dist/{lab → study}/plan-types.js +2 -2
  478. package/dist/study/plan.d.ts +13 -0
  479. package/dist/study/plan.js +101 -0
  480. package/dist/study/preflight-probes.d.ts +3 -0
  481. package/dist/{lab → study}/preflight-probes.js +20 -19
  482. package/dist/study/preflight-result.d.ts +8 -0
  483. package/dist/{lab → study}/preflight-result.js +5 -4
  484. package/dist/study/preflight.d.ts +94 -0
  485. package/dist/{lab → study}/preflight.js +12 -12
  486. package/dist/{lab → study}/requirements.d.ts +3 -3
  487. package/dist/{lab → study}/requirements.js +1 -1
  488. package/dist/study/route-inputs.d.ts +28 -0
  489. package/dist/{lab → study}/route-inputs.js +1 -1
  490. package/dist/{lab → study}/routing.d.ts +39 -33
  491. package/dist/{lab → study}/routing.js +60 -29
  492. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
  493. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
  494. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
  495. package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
  496. package/dist/study/run-study-options.d.ts +28 -0
  497. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
  498. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
  499. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  500. package/dist/{lab → study}/summary.d.ts +16 -15
  501. package/dist/{lab → study}/summary.js +21 -21
  502. package/dist/{lab → study}/tasks.d.ts +18 -18
  503. package/dist/{lab → study}/tasks.js +14 -14
  504. package/dist/{lab → study}/types.d.ts +202 -196
  505. package/dist/{lab → study}/types.js +3 -1
  506. package/dist/{lab → study}/validation.d.ts +27 -27
  507. package/dist/{lab → study}/validation.js +53 -51
  508. package/dist/study/warnings.d.ts +12 -0
  509. package/dist/{lab → study}/warnings.js +62 -34
  510. package/dist/subject/clone.d.ts +7 -7
  511. package/dist/subject/clone.js +2 -2
  512. package/dist/subject/desktop-cli.d.ts +1 -1
  513. package/dist/subject/desktop-cli.js +2 -2
  514. package/dist/subject/local-tree-archive.d.ts +2 -2
  515. package/dist/subject/local-tree-archive.js +4 -4
  516. package/dist/subject/local-tree.d.ts +4 -4
  517. package/dist/subject/node-bootstrap.js +1 -1
  518. package/dist/subject/runtime.js +9 -10
  519. package/dist/subject/serve.d.ts +5 -5
  520. package/dist/subject/serve.js +3 -3
  521. package/dist/subject/state.d.ts +4 -4
  522. package/dist/subject/state.js +1 -1
  523. package/dist/subject/steps.d.ts +6 -6
  524. package/dist/subject/steps.js +5 -5
  525. package/dist/substrates/command-failure.d.ts +3 -3
  526. package/dist/substrates/command-failure.js +3 -3
  527. package/dist/substrates/desktop-session.js +2 -2
  528. package/dist/substrates/detached.d.ts +6 -6
  529. package/dist/substrates/detached.js +7 -7
  530. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  531. package/dist/substrates/e2b/cdp-probe.js +14 -17
  532. package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
  533. package/dist/substrates/e2b/desktop-browser.js +9 -9
  534. package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
  535. package/dist/substrates/e2b/desktop-cdp.js +9 -9
  536. package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
  537. package/dist/substrates/e2b/desktop-executor.js +13 -13
  538. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  539. package/dist/substrates/e2b/desktop-geometry.js +8 -8
  540. package/dist/substrates/e2b/desktop-media.d.ts +4 -4
  541. package/dist/substrates/e2b/desktop-media.js +1 -1
  542. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  543. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  544. package/dist/substrates/e2b/lifetime.js +1 -1
  545. package/dist/substrates/e2b/sandbox.d.ts +4 -4
  546. package/dist/substrates/e2b/sandbox.js +2 -2
  547. package/dist/substrates/e2b/sdk.d.ts +12 -12
  548. package/dist/substrates/e2b/sdk.js +7 -7
  549. package/dist/substrates/local/runtime-config.d.ts +4 -4
  550. package/dist/substrates/local/runtime-config.js +4 -4
  551. package/dist/tui/actions.d.ts +1 -1
  552. package/dist/tui/actions.js +13 -13
  553. package/dist/tui/contract.d.ts +23 -23
  554. package/dist/tui/contract.js +11 -11
  555. package/dist/tui/launch.d.ts +7 -7
  556. package/dist/tui/launch.js +36 -31
  557. package/dist/tui/project.js +5 -5
  558. package/dist/tui-app.js +139 -139
  559. package/dist/verify/actor.d.ts +8 -8
  560. package/dist/verify/actor.js +36 -36
  561. package/dist/verify/artifacts.d.ts +2 -2
  562. package/dist/verify/artifacts.js +3 -3
  563. package/dist/verify/context-growth.d.ts +9 -0
  564. package/dist/verify/context-growth.js +62 -0
  565. package/dist/verify/costs.d.ts +6 -6
  566. package/dist/verify/costs.js +8 -8
  567. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  568. package/dist/verify/shared-world-concurrent.js +79 -76
  569. package/dist/verify/shared-world.d.ts +2 -2
  570. package/dist/verify/shared-world.js +16 -16
  571. package/dist/verify/subject.d.ts +5 -5
  572. package/dist/verify/subject.js +19 -19
  573. package/dist/verify/verify.js +94 -44
  574. package/docs/README.md +25 -32
  575. package/docs/architecture/actor-contract.md +60 -91
  576. package/docs/architecture/browser-control.md +1 -1
  577. package/docs/architecture/desktop-sessions.md +7 -7
  578. package/docs/architecture/external-public-shared-world.md +68 -65
  579. package/docs/architecture/github-feedback-loop.md +2 -5
  580. package/docs/architecture/guest-desktop.md +2 -2
  581. package/docs/architecture/observer.md +34 -34
  582. package/docs/architecture/restricted-codex-analysis.md +34 -28
  583. package/docs/architecture/serve.md +34 -37
  584. package/docs/architecture/state-driven-executor.md +55 -58
  585. package/docs/architecture/task-protocol-support.md +6 -6
  586. package/docs/architecture/terminal-product-route.md +70 -110
  587. package/docs/contracts/README.md +24 -0
  588. package/docs/contracts/adapter-admission.md +3 -3
  589. package/docs/contracts/adapter-fixtures.md +4 -7
  590. package/docs/contracts/core.md +1 -3
  591. package/docs/contracts/errors.md +62 -0
  592. package/docs/contracts/feedback.md +8 -9
  593. package/docs/contracts/policy.md +7 -12
  594. package/docs/contracts/run-bundle.md +42 -44
  595. package/docs/contracts/schemas.md +446 -368
  596. package/docs/contracts/study-analysis.md +7 -4
  597. package/docs/contracts/study-costs.md +28 -9
  598. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  599. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  600. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  601. package/docs/principles/actor-fidelity.md +4 -4
  602. package/docs/principles/engineering.md +3 -3
  603. package/docs/principles/invariants-and-defaults.md +38 -38
  604. package/docs/principles/self-driving-harness.md +1 -5
  605. package/docs/principles/three-roles.md +1 -1
  606. package/docs/product/automatic-analysis.md +7 -7
  607. package/examples/README.md +1 -1
  608. package/examples/participant/README.md +5 -5
  609. package/examples/participant/run.mjs +11 -10
  610. package/examples/scorer/README.md +3 -3
  611. package/examples/scorer/run.mjs +11 -12
  612. package/examples/scorer/scorer.mjs +3 -3
  613. package/package.json +16 -17
  614. package/skills/humanish/SKILL.md +64 -60
  615. package/skills/humanish/agents/openai.yaml +1 -1
  616. package/AGENTS.md +0 -99
  617. package/CONTRIBUTING.md +0 -148
  618. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  619. package/dist/actors/codex/qualified-versions.js +0 -132
  620. package/dist/cli/commands/lab-format.d.ts +0 -8
  621. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  622. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  623. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  624. package/dist/cli/commands/lab-run.d.ts +0 -9
  625. package/dist/cli/commands/lab.d.ts +0 -3
  626. package/dist/cli/commands/lab.js +0 -199
  627. package/dist/cli/renamed-options.d.ts +0 -11
  628. package/dist/cli/renamed-options.js +0 -18
  629. package/dist/lab/composition-rules.d.ts +0 -7
  630. package/dist/lab/config.d.ts +0 -7
  631. package/dist/lab/discover.d.ts +0 -65
  632. package/dist/lab/init-templates.js +0 -416
  633. package/dist/lab/keys.d.ts +0 -2
  634. package/dist/lab/parse/comms.d.ts +0 -12
  635. package/dist/lab/parse/execution.d.ts +0 -19
  636. package/dist/lab/parse/subject-state.d.ts +0 -30
  637. package/dist/lab/plan.d.ts +0 -19
  638. package/dist/lab/plan.js +0 -132
  639. package/dist/lab/preflight-probes.d.ts +0 -3
  640. package/dist/lab/preflight-result.d.ts +0 -7
  641. package/dist/lab/preflight.d.ts +0 -92
  642. package/dist/lab/route-inputs.d.ts +0 -28
  643. package/dist/lab/run-lab-options.d.ts +0 -28
  644. package/dist/lab/warnings.d.ts +0 -2
  645. package/dist/observer/static.d.ts +0 -39
  646. package/dist/observer/static.js +0 -369
  647. package/dist/run-lab.d.ts +0 -112
  648. package/docs/architecture/comms-inbox.md +0 -122
  649. package/docs/architecture/desktop-recording.md +0 -80
  650. package/docs/architecture/local-browser-runtime.md +0 -178
  651. package/docs/architecture/observer-review.md +0 -144
  652. package/docs/architecture/participant-media.md +0 -90
  653. package/docs/architecture/project-layout.md +0 -62
  654. package/docs/architecture/real-email-receiving.md +0 -136
  655. package/docs/assets/humanish-drawdb-hero.png +0 -0
  656. package/docs/assets/humanish-observer-hero.png +0 -0
  657. package/docs/goals/current.md +0 -207
  658. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  659. package/docs/product/open-source-install-experience.md +0 -240
  660. package/docs/ramp/README.md +0 -295
  661. package/docs/release/open-source-readiness.md +0 -222
  662. package/docs/release/public-readiness-standard.md +0 -210
  663. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  664. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  665. /package/dist/{lab → study}/init-paths.js +0 -0
  666. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  667. /package/dist/{lab → study}/init-plan.js +0 -0
  668. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  669. /package/dist/{lab → study}/participant-assignment.js +0 -0
  670. /package/dist/{lab → study}/persona.d.ts +0 -0
  671. /package/dist/{lab → study}/persona.js +0 -0
@@ -1,4 +1,4 @@
1
- import { type ResolvedPersona } from "../lab/persona.js";
1
+ import { type ResolvedPersona } from "../study/persona.js";
2
2
  import type { PreparedSelectedOutputDirectory } from "./contained-output.js";
3
3
  import type { RunBundle } from "./bundle.js";
4
4
  export declare function loadDryRunInputs(projectRoot: PreparedSelectedOutputDirectory, humanishSource: "present" | "missing"): Promise<{
@@ -1,5 +1,5 @@
1
1
  import { parse as parseYaml } from "yaml";
2
- import { parseResolvedPersona } from "../lab/persona.js";
2
+ import { parseResolvedPersona } from "../study/persona.js";
3
3
  import { digestText } from "../evidence/redaction.js";
4
4
  import { readImplicitProjectFile } from "./project.js";
5
5
  import { escapeRegExp } from "./text.js";
@@ -12,7 +12,7 @@ const builtinPersona = {
12
12
  const builtinScenario = {
13
13
  id: "builtin-first-run-smoke",
14
14
  title: "Built-in First-Run Smoke",
15
- goal: "Create a public-safe dry-run contract bundle from built-in defaults.",
15
+ goal: "Write a public-safe dry-run bundle from built-in defaults.",
16
16
  source: "builtin:first-run-smoke",
17
17
  sourceDigest: "builtin",
18
18
  };
@@ -9,7 +9,7 @@ import {} from "./streams.js";
9
9
  import { participantEvent, participantIdsOf, participantRecord, participantStream, } from "./participant-records.js";
10
10
  import { implicitProjectDirectoryExists, readPackageName, validateCwd } from "./project.js";
11
11
  import { loadDryRunInputs } from "./dry-run-inputs.js";
12
- import { judgeExecution, judgePreview, OUTCOME_POLICIES, resultOk } from "./judge.js";
12
+ import { judgeExecution, judgePreview, OUTCOME_POLICIES, resultOk, verdictText, } from "./judge.js";
13
13
  /**
14
14
  * The preview route's run. The run scope closes the run it started on every exit, including
15
15
  * the fail-closed ones. It renders an Observer only when `options.observer` asks for one.
@@ -33,14 +33,14 @@ async function runDryRunInScope(options, scope) {
33
33
  const warnings = [];
34
34
  if (cwdError)
35
35
  return refused(requestedCwd, warnings, cwdError);
36
- const participants = normalizeParticipantCount(options.simCount);
36
+ const participants = normalizeParticipantCount(options.participantCount);
37
37
  if (participants === null) {
38
38
  return refused(requestedCwd, warnings, {
39
- code: "HUMANISH_INVALID_SIM_COUNT",
39
+ code: "HUMANISH_INVALID_PARTICIPANT_COUNT",
40
40
  message: "--count must be a positive integer.",
41
41
  });
42
42
  }
43
- // Bind the physical project, as the lab routes do: a symlinked cwd retargeted mid-run cannot
43
+ // Bind the physical project, as the routes do: a symlinked cwd retargeted mid-run cannot
44
44
  // redirect source reads or run storage into another project.
45
45
  const physicalCwd = await realpath(requestedCwd);
46
46
  const projectRoot = await prepareSelectedOutputDirectory(path.dirname(physicalCwd), physicalCwd);
@@ -48,7 +48,7 @@ async function runDryRunInScope(options, scope) {
48
48
  if (!options.dryRun) {
49
49
  return refused(requestedCwd, warnings, {
50
50
  code: "HUMANISH_LIVE_RUN_UNIMPLEMENTED",
51
- message: "Only run --dry-run is implemented here. Run a lab for a live study.",
51
+ message: "humanish run needs a study. List studies with humanish study list, or run humanish run --dry-run for a sample bundle.",
52
52
  });
53
53
  }
54
54
  const createdAt = new Date().toISOString();
@@ -64,7 +64,7 @@ async function runDryRunInScope(options, scope) {
64
64
  runId: options.runId,
65
65
  mintRunId: () => `dryrun-${createdAt.replace(/[:.]/g, "-")}-${randomUUID().slice(0, 8)}`,
66
66
  mode: options.dryRun ? "dry-run" : "live",
67
- lab: options.lab,
67
+ study: options.study,
68
68
  renderReview: renderReviewMarkdown,
69
69
  // The run starts at the time its id and source were stamped with.
70
70
  now: () => Date.parse(createdAt),
@@ -94,7 +94,7 @@ async function runDryRunInScope(options, scope) {
94
94
  {
95
95
  at: createdAt,
96
96
  event: "run.created",
97
- message: `Synthetic dry-run contract bundle created with ${participants} simulated participant${participants === 1 ? "" : "s"}.`,
97
+ message: `Synthetic dry-run bundle created with ${participants} simulated participant${participants === 1 ? "" : "s"}.`,
98
98
  },
99
99
  {
100
100
  at: createdAt,
@@ -117,7 +117,7 @@ async function runDryRunInScope(options, scope) {
117
117
  events: observerFixtures.events,
118
118
  redaction: {
119
119
  status: "passed",
120
- notes: "Dry-run bundle contains synthetic contract proof only.",
120
+ notes: "Dry-run bundle: synthetic data only, nothing from a product.",
121
121
  },
122
122
  artifacts: bundleArtifacts(),
123
123
  review: createReviewSummary(judgment.verdict),
@@ -150,14 +150,14 @@ async function runDryRunInScope(options, scope) {
150
150
  };
151
151
  }
152
152
  /**
153
- * The preview's review, with the verdict judgePreview gave it. It claims artifact plumbing only,
154
- * never product behavior.
153
+ * The preview's review, with the verdict judgePreview gave it. It claims only that the run's
154
+ * files were written, never product behavior.
155
155
  */
156
156
  function createReviewSummary(verdict) {
157
157
  return {
158
158
  schema: REVIEW_SCHEMA,
159
159
  verdict,
160
- summary: "Synthetic dry-run bundle was generated. This proves humanish artifact plumbing, not product behavior.",
160
+ summary: "Dry run: humanish wrote a synthetic run bundle. No product behavior was tested.",
161
161
  gaps: [
162
162
  "No browser was launched.",
163
163
  "No product state was verified.",
@@ -173,7 +173,7 @@ Run: ${bundle.runId}
173
173
 
174
174
  Mode: ${bundle.mode}
175
175
 
176
- Verdict: ${bundle.review.verdict}
176
+ Verdict: ${verdictText(bundle.review.verdict, bundle.mode)}
177
177
 
178
178
  ${bundle.review.summary}
179
179
 
@@ -210,7 +210,7 @@ const SYNTHETIC_STREAM_TEMPLATES = [
210
210
  kind: "ui",
211
211
  mode: "browser-sim",
212
212
  label: "UI journey",
213
- currentStep: "Route and viewport contract captured",
213
+ currentStep: "Route and viewport recorded",
214
214
  summary: "Simulated browser participant reserved for VNC playback, screenshots, route state, and interaction trace.",
215
215
  tail: "open target app\nresolve first-run route\ncapture viewport state\nrecord interaction trace",
216
216
  viewport: { width: 1440, height: 960, deviceScaleFactor: 1 },
@@ -219,19 +219,19 @@ const SYNTHETIC_STREAM_TEMPLATES = [
219
219
  kind: "terminal",
220
220
  mode: "cli-sim",
221
221
  label: "CLI actor",
222
- currentStep: "Command transcript contract captured",
222
+ currentStep: "Command transcript recorded",
223
223
  summary: "Simulated CLI participant reserved for command-by-command persona runs with stdout/stderr and artifact links.",
224
224
  // Every command in a shipped sample tail must be one the CLI actually accepts: participants
225
225
  // read and run them. tests/surface/shipped-command-strings.test.ts checks this against the
226
226
  // command table.
227
- tail: "$ humanish doctor\nok target cwd\nok humanish source\n$ humanish run first-run\ncontract proof emitted",
227
+ tail: "$ humanish doctor\nok target cwd\nok humanish source\n$ humanish run first-run\nhumanish run dry-run",
228
228
  viewport: undefined,
229
229
  },
230
230
  {
231
231
  kind: "tui",
232
232
  mode: "tui-sim",
233
233
  label: "TUI actor",
234
- currentStep: "Terminal UI frame contract captured",
234
+ currentStep: "Terminal UI frame recorded",
235
235
  summary: "Simulated TUI participant reserved for PTY bytes, ANSI rendering, focus replay, and optional assisted attach.",
236
236
  tail: "\u001b[2mhumanish TUI frame\u001b[0m\n> persona: skeptical-power-user\n> scenario: onboarding-regression\nstatus: awaiting live PTY transport",
237
237
  viewport: undefined,
@@ -240,9 +240,9 @@ const SYNTHETIC_STREAM_TEMPLATES = [
240
240
  kind: "codex-ui",
241
241
  mode: "codex-app-sim",
242
242
  label: "Codex UI",
243
- currentStep: "App-server embed contract captured",
243
+ currentStep: "App-server embed recorded",
244
244
  summary: "Simulated Codex UI participant reserved for app-server sessions that can be watched beside terminal evidence.",
245
- tail: "codex-app-server session contract\nstate: not_connected\nembed: pending provider URL\nreceipts: planned",
245
+ tail: "codex-app-server session (dry run)\nstate: not_connected\nembed: pending provider URL\nreceipts: planned",
246
246
  viewport: { width: 1280, height: 900, deviceScaleFactor: 1 },
247
247
  },
248
248
  ];
@@ -255,7 +255,7 @@ function buildSyntheticObserverFixtures(args) {
255
255
  at: args.createdAt,
256
256
  level: "info",
257
257
  type: "observer.contract.created",
258
- message: "Created public-safe observer stream contract.",
258
+ message: "Created the public-safe Observer streams.",
259
259
  },
260
260
  ];
261
261
  for (let index = 0; index < args.count; index += 1) {
@@ -324,7 +324,7 @@ function buildSyntheticObserverFixtures(args) {
324
324
  at: args.createdAt,
325
325
  level: "info",
326
326
  type: "sim.contract.ready",
327
- message: `${template.label} stream contract ready.`,
327
+ message: `${template.label} stream ready.`,
328
328
  }), participantEvent(ids, {
329
329
  id: `event-${String(index + 1).padStart(3, "0")}-b`,
330
330
  at: args.createdAt,
@@ -6,7 +6,7 @@ export interface BlockerFacts {
6
6
  completionReason: ActorCompletionReason;
7
7
  /** A harness-owned stop condition ended the session: a matched stopWhen or a completed dwell window. */
8
8
  stopConditionMatched: boolean;
9
- /** What the participant declared in a field, when its provider has one (#570). */
9
+ /** What the participant declared in a field, when its provider has one. */
10
10
  declaredOutcome?: ParticipantDeclaredOutcome;
11
11
  /** The route's reading of the closing report: it describes a blocker or asks for instructions. */
12
12
  closingReportReadsBlocked: boolean;
@@ -23,7 +23,7 @@ export interface SessionEnding extends BlockerFacts {
23
23
  export declare function hollowCompletion(ending: SessionEnding): boolean;
24
24
  /**
25
25
  * The participant said it reached the goal but reported a blocker. A declared outcome is its own
26
- * word and wins (#570). Without one, the closing report is read, unless a stop condition ended the
26
+ * word and wins. Without one, the closing report is read, unless a stop condition ended the
27
27
  * session: a matched stopWhen is structured completion evidence and overrides the text.
28
28
  */
29
29
  export declare function selfReportedBlocker(ending: BlockerFacts): boolean;
@@ -60,12 +60,18 @@ export declare function participantHarnessFailed(participant: ParticipantFacts):
60
60
  * goal_satisfied claim with zero engagement is a session that ran out before anything happened;
61
61
  * one whose final message describes a blocker is a participant who could not proceed and said so.
62
62
  * Both keep their trace status (the claim is evidence); neither is a participant who reached the
63
- * goal. One rule for the single participant and the fan-out roll-up (#476).
63
+ * goal. One rule for the single participant and the fan-out roll-up.
64
64
  */
65
65
  export declare function participantStatus(status: ActorStatus, judgments: {
66
66
  noEngagement: boolean;
67
67
  selfReportedBlocker: boolean;
68
68
  } | undefined): ActorStatus;
69
+ /**
70
+ * A verdict as review.md prints it. The schema keeps `contract_proof_only`, which a dry run always
71
+ * gets and a live run gets while it is in progress or when no participant result came back, so
72
+ * the reader sees "dry run" or "no verdict" by the run's mode.
73
+ */
74
+ export declare function verdictText(verdict: Verdict, mode: "dry-run" | "live"): string;
69
75
  /** The review verdict for one participant's status. */
70
76
  export declare function verdictForStatus(status: ActorStatus): Verdict;
71
77
  declare const judged: unique symbol;
@@ -77,7 +83,7 @@ export interface Judgment {
77
83
  readonly verdict: Verdict;
78
84
  /**
79
85
  * The run met its route's pass rule: every expected participant passed and, on shared-world,
80
- * the seats showed the concurrency verify requires. A dry run passes as a contract.
86
+ * the participants showed the concurrency verify requires. A dry run passes as a contract.
81
87
  */
82
88
  readonly passed: boolean;
83
89
  /** A type-only mark that judgmentOf made this judgment; it does not exist at runtime. */
@@ -126,13 +132,13 @@ export interface OutcomePolicy {
126
132
  export type JudgedRoute = "computer-use" | "shared-world" | "terminal" | "scripted" | "preview";
127
133
  /** Each route's outcome policy, in one place. */
128
134
  export declare const OUTCOME_POLICIES: Readonly<Record<JudgedRoute, OutcomePolicy>>;
129
- /** What a shared-world run observed about its one world, beside how each seat ended. */
135
+ /** What a shared-world run observed about its one world, beside how each participant ended. */
130
136
  export interface SharedWorldFacts {
131
- /** Two or more seats were live at the same time. */
137
+ /** Two or more participants were live at the same time. */
132
138
  overlap: boolean;
133
139
  /** Provisioned plane only: the shared state changed at or after the first overlap started. */
134
140
  stateChangedUnderOverlap?: boolean;
135
- /** External-public plane only: every seat reached one lobby. */
141
+ /** External-public plane only: every participant reached one lobby. */
136
142
  lobbyConvergence?: boolean;
137
143
  }
138
144
  /** A shared-world run's judgment, with the world facts its review and result also report. */
@@ -162,15 +168,15 @@ export declare function judgeParticipants(args: {
162
168
  participants: ParticipantFacts[];
163
169
  }): Judgment;
164
170
  /**
165
- * Why a shared-world run whose seats all passed still fails, or undefined when its world facts
166
- * meet what verify's shared-world check requires of a pass: two seats live at the same time and,
167
- * on the provisioned plane, a shared-state change at or after the first overlap started.
171
+ * Why a shared-world run whose participants all passed still fails, or undefined when its world
172
+ * facts meet what verify's shared-world check requires of a pass: two participants live at the same
173
+ * time and, on the provisioned plane, a shared-state change at or after the first overlap started.
168
174
  */
169
175
  export declare function sharedWorldShortfall(world: SharedWorldFacts): string | undefined;
170
176
  /**
171
- * A shared-world run: it passes only when every expected seat passed and the world facts have no
172
- * shortfall, and otherwise fails (this route has no timed_out verdict). A dry run and a run still
173
- * in progress are contracts. Lobby convergence is recorded but not read.
177
+ * A shared-world run: it passes only when every expected participant passed and the world facts
178
+ * have no shortfall, and otherwise fails (this route has no timed_out verdict). A dry run and a run
179
+ * still in progress are contracts. Lobby convergence is recorded but not read.
174
180
  */
175
181
  export declare function judgeSharedWorld(args: {
176
182
  dryRun: boolean;
package/dist/run/judge.js CHANGED
@@ -24,7 +24,7 @@ export function hollowCompletion(ending) {
24
24
  }
25
25
  /**
26
26
  * The participant said it reached the goal but reported a blocker. A declared outcome is its own
27
- * word and wins (#570). Without one, the closing report is read, unless a stop condition ended the
27
+ * word and wins. Without one, the closing report is read, unless a stop condition ended the
28
28
  * session: a matched stopWhen is structured completion evidence and overrides the text.
29
29
  */
30
30
  export function selfReportedBlocker(ending) {
@@ -65,7 +65,7 @@ export function participantHarnessFailed(participant) {
65
65
  * goal_satisfied claim with zero engagement is a session that ran out before anything happened;
66
66
  * one whose final message describes a blocker is a participant who could not proceed and said so.
67
67
  * Both keep their trace status (the claim is evidence); neither is a participant who reached the
68
- * goal. One rule for the single participant and the fan-out roll-up (#476).
68
+ * goal. One rule for the single participant and the fan-out roll-up.
69
69
  */
70
70
  export function participantStatus(status, judgments) {
71
71
  if (status !== "passed" || judgments === undefined)
@@ -76,6 +76,16 @@ export function participantStatus(status, judgments) {
76
76
  return "blocked";
77
77
  return status;
78
78
  }
79
+ /**
80
+ * A verdict as review.md prints it. The schema keeps `contract_proof_only`, which a dry run always
81
+ * gets and a live run gets while it is in progress or when no participant result came back, so
82
+ * the reader sees "dry run" or "no verdict" by the run's mode.
83
+ */
84
+ export function verdictText(verdict, mode) {
85
+ if (verdict !== "contract_proof_only")
86
+ return verdict;
87
+ return mode === "dry-run" ? "dry run" : "no verdict";
88
+ }
79
89
  /** The review verdict for one participant's status. */
80
90
  export function verdictForStatus(status) {
81
91
  switch (status) {
@@ -148,9 +158,9 @@ export function judgeParticipants(args) {
148
158
  return judgmentOf(verdict, args.dryRun);
149
159
  }
150
160
  /**
151
- * Why a shared-world run whose seats all passed still fails, or undefined when its world facts
152
- * meet what verify's shared-world check requires of a pass: two seats live at the same time and,
153
- * on the provisioned plane, a shared-state change at or after the first overlap started.
161
+ * Why a shared-world run whose participants all passed still fails, or undefined when its world
162
+ * facts meet what verify's shared-world check requires of a pass: two participants live at the same
163
+ * time and, on the provisioned plane, a shared-state change at or after the first overlap started.
154
164
  */
155
165
  export function sharedWorldShortfall(world) {
156
166
  if (!world.overlap) {
@@ -162,9 +172,9 @@ export function sharedWorldShortfall(world) {
162
172
  return undefined;
163
173
  }
164
174
  /**
165
- * A shared-world run: it passes only when every expected seat passed and the world facts have no
166
- * shortfall, and otherwise fails (this route has no timed_out verdict). A dry run and a run still
167
- * in progress are contracts. Lobby convergence is recorded but not read.
175
+ * A shared-world run: it passes only when every expected participant passed and the world facts
176
+ * have no shortfall, and otherwise fails (this route has no timed_out verdict). A dry run and a run
177
+ * still in progress are contracts. Lobby convergence is recorded but not read.
168
178
  */
169
179
  export function judgeSharedWorld(args) {
170
180
  const passed = args.participants.length === args.expected &&
@@ -1,6 +1,6 @@
1
1
  import { type ActorStatus } from "../actors/contract.js";
2
2
  import { type CuaGoalSource } from "../actors/goal-source.js";
3
- import type { TaskFunnel } from "../lab/tasks.js";
3
+ import type { TaskFunnel } from "../study/tasks.js";
4
4
  import type { ParticipantOutcomes, ReviewSummary, RunTaskFunnel } from "./bundle.js";
5
5
  /** Tally participant outcomes from actor statuses. Statuses this does not recognise are counted in
6
6
  * `total` but nowhere else, so the parts can never exceed the whole. */
@@ -1,5 +1,5 @@
1
1
  import type { ActorPersonaRef } from "../actors/contract.js";
2
- import type { Participant } from "../lab/plan-participants.js";
2
+ import type { Participant } from "../study/plan-participants.js";
3
3
  import type { RunParticipantAssignment } from "./streams.js";
4
4
  /**
5
5
  * A planned participant resolved for one run: the plan's record unchanged, plus what the route
@@ -49,7 +49,7 @@ export declare function createRunArtifactPaths(cwdInput: string, runId: string):
49
49
  export declare function validatePreparedRunArtifactPaths(prepared: PreparedRunArtifactPaths): Promise<PreparedRunArtifactPaths>;
50
50
  /**
51
51
  * The physical project directory for a caller's cwd, bound before a run is resolved so a symlinked
52
- * cwd retargeted later cannot move reads or writes to another project (#1012). A cwd that does not
52
+ * cwd retargeted later cannot move reads or writes to another project. A cwd that does not
53
53
  * resolve is returned as given, so the caller still reports it missing.
54
54
  */
55
55
  export declare function resolvePhysicalCwd(cwdInput: string): Promise<string>;
package/dist/run/paths.js CHANGED
@@ -107,7 +107,7 @@ export async function validatePreparedRunArtifactPaths(prepared) {
107
107
  }
108
108
  /**
109
109
  * The physical project directory for a caller's cwd, bound before a run is resolved so a symlinked
110
- * cwd retargeted later cannot move reads or writes to another project (#1012). A cwd that does not
110
+ * cwd retargeted later cannot move reads or writes to another project. A cwd that does not
111
111
  * resolve is returned as given, so the caller still reports it missing.
112
112
  */
113
113
  export async function resolvePhysicalCwd(cwdInput) {
@@ -1,4 +1,4 @@
1
- // Sandbox receipts for `humanish lab preflight`. A probe has no run directory, so it journals its
1
+ // Sandbox receipts for `humanish study check`. A probe has no run directory, so it journals its
2
2
  // sandbox under .humanish/preflight/<probe-id>/ before any work runs in it. A confirmed kill
3
3
  // removes the journal. A journal that stays means the probe's sandbox may still be running, and
4
4
  // `humanish reclaim --preflight` kills it by the recorded id once it is safe to.
@@ -25,7 +25,7 @@ export interface ModelRate {
25
25
  inputMultiplier: number;
26
26
  outputMultiplier: number;
27
27
  };
28
- /** "YYYY-MM-DD" the entry was last checked against `source`. */
28
+ /** The `YYYY-MM-DD` date the entry was last checked against `source`. */
29
29
  asOf: string;
30
30
  /** Public pricing page the number came from (a comment/URL, never a secret). */
31
31
  source: string;
@@ -83,7 +83,7 @@ export interface ActorEstimatedCost {
83
83
  /** Of `inputTokens`, how many were billed at the reduced cached rate. Present only when the
84
84
  * provider reported cache hits and the rate sheet models a cached rate. */
85
85
  cachedInputTokens?: number;
86
- /** Of `inputTokens`, how many were billed at the cache-WRITE rate (OpenAI 5.6+). */
86
+ /** Of `inputTokens`, how many were billed at the cache-write rate (OpenAI 5.6+). */
87
87
  cacheWriteInputTokens?: number;
88
88
  /** How many requests crossed the long-context threshold and were re-tiered. Present only
89
89
  * when per-request `turns` records made exact tiering possible. */
@@ -104,6 +104,11 @@ export interface DesktopCostEstimate {
104
104
  usdPerSecond?: number;
105
105
  }
106
106
  export declare const MODEL_RATES: Record<string, ModelRate>;
107
+ /**
108
+ * The refusal for a spend cap on a model this table cannot price. It names the priced models,
109
+ * since an npm install cannot edit this file.
110
+ */
111
+ export declare function unpricedCapMessage(model: string): string;
107
112
  export declare const DESKTOP_RATE: DesktopRate;
108
113
  export declare function isDesktopResources(value: unknown): value is DesktopResources;
109
114
  /** Price one observed allocation. Missing quantities/rates stay unknown, never a stock guess. */
@@ -113,8 +118,8 @@ export declare function estimateAllocatedDesktopCost(minutes: number | undefined
113
118
  export declare function round6(n: number): number;
114
119
  /**
115
120
  * Estimate one actor trace's model-token cost from its trace tokenUsage + model id. Deterministic;
116
- * the rate table is injectable (tests pass a fake sheet). Returns a DECLARED-ABSENT estimate
117
- * (estimatedCostUsd: null + a reason) for a missing rate or missing usage — never a guessed cost.
121
+ * the rate table is injectable (tests pass a fake sheet). Returns a declared-absent estimate
122
+ * (estimatedCostUsd: null + a reason) for a missing rate or missing usage, never a guessed cost.
118
123
  */
119
124
  export declare function estimateActorCostForExecution(usage: ActorTokenUsage | undefined, modelId: string | undefined, profile?: {
120
125
  billing?: unknown;
@@ -128,7 +133,7 @@ export declare function estimateAggregatedTurnCost(tokenUsage: ActorTokenUsage |
128
133
  export declare function estimateActorCost(tokenUsage: ActorTokenUsage | undefined, modelId: string | undefined, rates?: Record<string, ModelRate>): ActorEstimatedCost;
129
134
  /**
130
135
  * Estimate the E2B desktop-minute cost from a host-side create->teardown span (minutes). The rate
131
- * is injectable. Returns a DECLARED-ABSENT estimate (null + "no_duration") when no duration was
132
- * measured (no sandbox / unmeasurable span) — never a guessed 0.
136
+ * is injectable. Returns a declared-absent estimate (null + "no_duration") when no duration was
137
+ * measured (no sandbox / unmeasurable span), never a guessed 0.
133
138
  */
134
139
  export declare function estimateDesktopCost(minutes: number | undefined, rate?: DesktopRate): DesktopCostEstimate;
@@ -6,10 +6,10 @@
6
6
  // This module is pure (node builtins only, no deps) and deterministic: the estimator functions take
7
7
  // an optional injected rate table/rate so tests drive assertions with a fake sheet and never depend
8
8
  // on the live numbers below. An unknown model/desktop rate yields a declared-absent estimate
9
- // (estimatedCostUsd: null + a reason) and never a guessed or silent-zero cost (invariant 5). A bare
9
+ // (estimatedCostUsd: null + a reason) and never a guessed or silent-zero cost. A bare
10
10
  // `costUsd` elsewhere in the contract means a provider actually billed that amount; the
11
11
  // token-derived estimate here always lives under `estimatedCostUsd` so a reader can never confuse
12
- // an estimate for an authoritative charge (invariant 6).
12
+ // an estimate for an authoritative charge.
13
13
  export const PRICING_SCHEMA = "humanish.pricing.v1";
14
14
  export const ACTOR_ESTIMATED_COST_SCHEMA = "humanish.actor-estimated-cost.v1";
15
15
  // The gpt-5.6 long-context tier: >272K input tokens re-prices the full request at 2x
@@ -44,14 +44,14 @@ const GPT6_ASTRA_AS_OF = "2026-09-03";
44
44
  // case-insensitive on a trimmed id). An id missing here is declared absent, never guessed.
45
45
  export const MODEL_RATES = {
46
46
  // OpenAI computer-use-preview (the classic CUA model). ~$3 / 1M input, ~$12 / 1M output.
47
- // source: openai.com/api/pricing (verify — providers change without notice).
47
+ // source: openai.com/api/pricing (verify: providers change without notice).
48
48
  "computer-use-preview": {
49
49
  inputUsdPerToken: 3e-6,
50
50
  outputUsdPerToken: 12e-6,
51
51
  asOf: "2026-08-01",
52
52
  source: "openai.com/api/pricing (computer-use-preview)",
53
53
  },
54
- // gpt-5.5: the PREVIOUS-generation CUA default, kept so pinned labs and old bundles still
54
+ // gpt-5.5: the previous-generation CUA default, kept so pinned labs and old bundles still
55
55
  // price. Pre-5.6 models bill no cache-write fee (prompt-caching guide) and no long-context
56
56
  // tier was published for it.
57
57
  "gpt-5.5": {
@@ -59,7 +59,7 @@ export const MODEL_RATES = {
59
59
  outputUsdPerToken: 30e-6,
60
60
  cachedInputUsdPerToken: 0.5e-6,
61
61
  asOf: "2026-08-05",
62
- source: "openrouter.ai/openai/gpt-5.5 (gpt-5.5 no longer on openai.com/api/pricing; see #334)",
62
+ source: "openrouter.ai/openai/gpt-5.5 (gpt-5.5 is no longer listed on openai.com/api/pricing)",
63
63
  },
64
64
  // The gpt-5.6 family (live sheet 2026-08-18, standard tier, short-context base rates;
65
65
  // the longContext block prices the >272K re-tier when per-request turns are recorded).
@@ -67,7 +67,7 @@ export const MODEL_RATES = {
67
67
  // cyber = the Daybreak frontier tier.
68
68
  "gpt-5.6-sol": rateWithLongContextTier(4, 0.4, 5, 20, GPT56_SOL_PROMO_AS_OF),
69
69
  // "gpt-5.6" is OpenAI's own alias for gpt-5.6-sol (models index); priced identically so a
70
- // lab configured with the alias never reads as unpriced.
70
+ // study configured with the alias never reads as unpriced.
71
71
  "gpt-5.6": rateWithLongContextTier(4, 0.4, 5, 20, GPT56_SOL_PROMO_AS_OF),
72
72
  "gpt-5.6-terra": rateWithLongContextTier(2, 0.2, 2.5, 12),
73
73
  "gpt-5.6-luna": rateWithLongContextTier(0.2, 0.02, 0.25, 1.2),
@@ -79,7 +79,7 @@ export const MODEL_RATES = {
79
79
  "daybreak-red-latest": rateWithLongContextTier(12.5, 1.25, 15.625, 75),
80
80
  // gpt-6-astra (shipped 2026-09-03; API access announced as rolling out). Same two mechanics
81
81
  // as the 5.6 family on the sheet: writes at 1.25x, >272K re-tiers at 2x input-side / 1.5x
82
- // output ($20 / $2 / $25 / $75 long-context columns). These rates cover explicit lab
82
+ // output ($20 / $2 / $25 / $75 long-context columns). These rates cover explicit study
83
83
  // model choices and the study-analysis default; the computer-use default is separate.
84
84
  "gpt-6-astra": rateWithLongContextTier(10, 1, 12.5, 50, GPT6_ASTRA_AS_OF, GPT6_ASTRA_SOURCE),
85
85
  };
@@ -96,6 +96,13 @@ const DESKTOP_RESOURCE_RATE = {
96
96
  // 2026-09-05 had 8 vCPU / 8 GiB. This is the largest CPU/RAM combination on that public sheet, not
97
97
  // a provider billing ceiling or a claim about custom/enterprise templates. Runtime CUA estimates
98
98
  // use observed allocation resources through estimateAllocatedDesktopCost instead of this fallback.
99
+ /**
100
+ * The refusal for a spend cap on a model this table cannot price. It names the priced models,
101
+ * since an npm install cannot edit this file.
102
+ */
103
+ export function unpricedCapMessage(model) {
104
+ return `execution.caps sets a spend cap (maxUsd or maxTotalUsd), but humanish has no rate for model "${model}", so it cannot enforce the cap and refuses to start. Priced models: ${Object.keys(MODEL_RATES).sort().join(", ")}. Use one of them, or remove maxUsd and maxTotalUsd to run without a cap.`;
105
+ }
99
106
  export const DESKTOP_RATE = {
100
107
  usdPerMinute: 0.00888,
101
108
  asOf: "2026-09-05",
@@ -158,8 +165,8 @@ export function round6(n) {
158
165
  }
159
166
  /**
160
167
  * Estimate one actor trace's model-token cost from its trace tokenUsage + model id. Deterministic;
161
- * the rate table is injectable (tests pass a fake sheet). Returns a DECLARED-ABSENT estimate
162
- * (estimatedCostUsd: null + a reason) for a missing rate or missing usage — never a guessed cost.
168
+ * the rate table is injectable (tests pass a fake sheet). Returns a declared-absent estimate
169
+ * (estimatedCostUsd: null + a reason) for a missing rate or missing usage, never a guessed cost.
163
170
  */
164
171
  export function estimateActorCostForExecution(usage, modelId, profile) {
165
172
  return profile?.billing === "account-unknown"
@@ -207,7 +214,7 @@ export function estimateActorCost(tokenUsage, modelId, rates = MODEL_RATES) {
207
214
  const outTok = tokenUsage.output ?? 0;
208
215
  // Long-context tiering needs to know each request's input size (the provider re-prices whole
209
216
  // requests past the threshold), so it engages only when per-turn usage records exist and their
210
- // input sums to the reported total — a partial turn ledger must not silently price the missing
217
+ // input sums to the reported total, because a partial turn ledger must not silently price the missing
211
218
  // remainder at the wrong tier. Otherwise totals price on the base (short-context) rate, which is
212
219
  // the under-estimate direction and never trips a cap early.
213
220
  const turns = tokenUsage.turns ?? [];
@@ -232,12 +239,12 @@ export function estimateActorCost(tokenUsage, modelId, rates = MODEL_RATES) {
232
239
  // and on a session that threads provider state it is the majority of input, and pricing it at the
233
240
  // full rate overstates real spend by up to ~10x. Cache writes bill at their own rate (1.25x on
234
241
  // OpenAI 5.6+) as the total rate for those tokens; a sheet without a write rate prices writes as
235
- // plain input (pre-5.6: writes are free-of-extra-fee, i.e. plain input). Every piece is honestly
236
- // absent: no reported split means no discount and no surcharge assumed.
242
+ // plain input (pre-5.6: writes are free-of-extra-fee, i.e. plain input). An unreported piece
243
+ // stays absent: no reported split means no discount and no surcharge assumed.
237
244
  const priceRequest = (usage, tierable) => {
238
245
  const reqIn = usage.input ?? 0;
239
246
  const reqOut = usage.output ?? 0;
240
- // Tiering applies only to a real per-REQUEST record: session totals crossing the threshold
247
+ // Tiering applies only to a real per-request record: session totals crossing the threshold
241
248
  // say nothing about any single request, so totals always price on the base tier.
242
249
  const long = tierable && rate.longContext !== undefined && reqIn > rate.longContext.thresholdInputTokens;
243
250
  const inMul = long ? rate.longContext.inputMultiplier : 1;
@@ -293,8 +300,8 @@ export function estimateActorCost(tokenUsage, modelId, rates = MODEL_RATES) {
293
300
  }
294
301
  /**
295
302
  * Estimate the E2B desktop-minute cost from a host-side create->teardown span (minutes). The rate
296
- * is injectable. Returns a DECLARED-ABSENT estimate (null + "no_duration") when no duration was
297
- * measured (no sandbox / unmeasurable span) — never a guessed 0.
303
+ * is injectable. Returns a declared-absent estimate (null + "no_duration") when no duration was
304
+ * measured (no sandbox / unmeasurable span), never a guessed 0.
298
305
  */
299
306
  export function estimateDesktopCost(minutes, rate = DESKTOP_RATE) {
300
307
  if (minutes === undefined || !Number.isFinite(minutes) || minutes < 0) {