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
@@ -1,7 +1,7 @@
1
1
  import type { CommsReceivingEvidence } from "../comms/receiving-types.js";
2
2
  import { type CapturedGitState } from "./git-state.js";
3
3
  import type { SharedWorldEvidence } from "./shared-world-evidence.js";
4
- import type { RunLabProvenance } from "./status.js";
4
+ import { type RunStudyProvenance } from "./study-provenance.js";
5
5
  import type { RunSimulationStatus, RunStream, RunStreamKind } from "./streams.js";
6
6
  export declare const RUN_BUNDLE_SCHEMA = "humanish.run-bundle.v1";
7
7
  /** The run bundle file, relative to the run directory. */
@@ -10,8 +10,8 @@ export declare const REVIEW_SCHEMA = "humanish.review.v1";
10
10
  export declare const PUBLIC_TARGET_CWD = "[target-cwd]";
11
11
  /**
12
12
  * A namespaced, product-agnostic score a thin adapter attaches to the bundle via a route's `score`
13
- * hook, on terminal-product or a browser route (the layer-6 extension seam, issue #154 acceptance
14
- * #8). Core never reads its `data` and knows none of the adopter's nouns — the `namespace` (e.g.
13
+ * hook, on terminal-product or a browser route (the adapter extension seam).
14
+ * Core never reads its `data` and knows none of the adopter's nouns: the `namespace` (e.g.
15
15
  * `"acme-pixelforge"`) scopes the whole record so core schemas stay product-agnostic and a future
16
16
  * inert-field audit does not misfire on a noun core never owned. The adopter's real scorecard
17
17
  * (component weights, product rubric) lives in the adopter's repo and is summarized into the generic
@@ -20,7 +20,7 @@ export declare const PUBLIC_TARGET_CWD = "[target-cwd]";
20
20
  */
21
21
  export interface RunAdapterScore {
22
22
  schema: "humanish.adapter-score.v1";
23
- /** The adapter's namespace — non-core, product-scoped (e.g. an adopter slug). Required + non-empty. */
23
+ /** The adapter's namespace: non-core, product-scoped (e.g. an adopter slug). Required + non-empty. */
24
24
  namespace: string;
25
25
  status: "pass" | "partial" | "fail";
26
26
  /** A 0-100 summary the adapter derived from its own (off-core) rubric. */
@@ -56,9 +56,8 @@ export interface RunFeedbackCandidate {
56
56
  proposed_next_state: "watch" | "adapter-hardening" | "target-app-setup" | "actor-auth" | "setup-quality-review" | "study-quality-review";
57
57
  acceptance_proof: string[];
58
58
  /**
59
- * Optional, adapter-namespaced product-noun block (the layer-6 extension seam, issue #154
60
- * acceptance #8 + the "record product-specific concepts as NON-core nouns" list). A thin adapter
61
- * records product-specific concepts — public CLI/product command observed, hosted product
59
+ * Optional, adapter-namespaced product-noun block (the adapter extension seam). A thin adapter
60
+ * records product-specific concepts: public CLI/product command observed, hosted product
62
61
  * success-or-blocker, feedback id/draft observed, media/job/asset ids, explicit
63
62
  * no-media/no-provider-spend proof, defection/friction risk, without making any of them core
64
63
  * primitives. They ride under a single namespaced field so core's feedback enums
@@ -69,7 +68,7 @@ export interface RunFeedbackCandidate {
69
68
  adapter?: {
70
69
  /** Non-core, product-scoped namespace (e.g. an adopter slug). Required + non-empty. */
71
70
  namespace: string;
72
- /** The adapter's product nouns. Core never reads these keys — it stays product-agnostic. */
71
+ /** The adapter's product nouns. Core never reads these keys, so it stays product-agnostic. */
73
72
  data: Record<string, unknown>;
74
73
  };
75
74
  }
@@ -87,11 +86,11 @@ export interface RunAdapterArtifact {
87
86
  note: string;
88
87
  }
89
88
  /**
90
- * Provenance for a CONFIG-DECLARED adopter scorer (#316): the repo-relative entry path and a digest
91
- * of its ENTRY-MODULE bytes, recorded so a `review.scorer.ref`/`--scorer` run honestly states which
89
+ * Provenance for a config-declared adopter scorer: the repo-relative entry path and a digest
90
+ * of its entry-module bytes, recorded so a `review.scorer.ref`/`--scorer` run states which
92
91
  * out-of-tree judgment it attached. Core-computed (path + digest), never adopter-supplied. A library
93
92
  * caller (hooks passed directly through RunLabOptions) has implicit provenance, because its code is its
94
- * provenance, so this block is absent there and every pre-#316 bundle stays byte-stable + verifiable.
93
+ * provenance, so this block is absent there and every older bundle stays byte-stable + verifiable.
95
94
  *
96
95
  * The digest pins the entry file's identity only; modules it loads are outside it: a `export { score } from
97
96
  * "../outside.mjs"` re-export is not captured, and `import()` re-opens the path (a benign same-author
@@ -151,7 +150,7 @@ export interface RunSubjectStateStepRecord {
151
150
  durationMs?: number;
152
151
  }
153
152
  /**
154
- * Structured subject provenance (invariant 5): what the subject was, as a code pin (repo/commit,
153
+ * Structured subject provenance: what the subject was, as a code pin (repo/commit,
155
154
  * or a local-tree archive digest) and state story. Optional additive field on
156
155
  * humanish.run-bundle.v1; absent on bundles from backends that have not adopted it (and on all
157
156
  * pre-existing bundles).
@@ -179,16 +178,16 @@ export interface RunSubjectProvenance {
179
178
  state: {
180
179
  /**
181
180
  * seeded: live run, steps declared, all ran ok, no external state declared.
182
- * unpinned: external state declared (seed records, if any, still attached — migrating
181
+ * unpinned: external state declared (seed records, if any, still attached; migrating
183
182
  * an external DB is still unpinned overall).
184
- * declared-not-run: steps declared but not (all) executed ok — dry-run contract bundles
183
+ * declared-not-run: steps declared but not (all) executed ok: dry-run contract bundles
185
184
  * and failed live provisioning.
186
- * undeclared: no subject.state block (stateless apps, app-url subjects) — the explicit
187
- * "absence declared" marker invariant 5 requires.
188
- * external-public: (#164 phase 2) an operator-DECLARED, operator-OWNED public deployment used
189
- * directly as the shared plane — humanish neither provisioned nor seeded it (no getHost, no
185
+ * undeclared: no subject.state block (stateless apps, app-url subjects), the explicit
186
+ * "absence declared" marker that provenance requires when there is none.
187
+ * external-public: an operator-declared, operator-owned public deployment used
188
+ * directly as the shared plane; humanish neither provisioned nor seeded it (no getHost, no
190
189
  * clone, no in-sandbox filesystem). It is not "seeded" (nothing was seeded) and not "unpinned" (this is
191
- * an owned target, not an uncontrolled external DB). The honest marker for the external-public
190
+ * an owned target, not an uncontrolled external DB). The marker for the external-public
192
191
  * plane class; verify asserts it in place of the getHost seeded gate.
193
192
  */
194
193
  provenance: "seeded" | "unpinned" | "declared-not-run" | "undeclared" | "external-public";
@@ -197,7 +196,7 @@ export interface RunSubjectProvenance {
197
196
  };
198
197
  }
199
198
  /**
200
- * How well a run attributed interaction between actors: a separate honesty axis, orthogonal to the
199
+ * How well a run attributed interaction between actors: a separate evidence axis, orthogonal to the
201
200
  * persona-sampling evidence classes (which answer "how representative is the actor?"). Absent ==
202
201
  * `isolated` (every existing bundle byte-stable). `shared-world` means N participants drove one
203
202
  * mutable plane and their per-participant attribution is weaker (its ceiling is pinned in `sharedWorld.attributionLimits`).
@@ -254,7 +253,7 @@ export interface RunBundle {
254
253
  };
255
254
  review: ReviewSummary;
256
255
  feedbackCandidates: RunFeedbackCandidate[];
257
- /** Structured subject provenance (invariant 5). Optional and additive: emitted by the
256
+ /** Structured subject provenance. Optional and additive: emitted by the
258
257
  * computer-use and shared-world backends and the clone scripted-browser route; tolerated absent
259
258
  * everywhere else. */
260
259
  subject?: RunSubjectProvenance;
@@ -275,7 +274,7 @@ export interface RunBundle {
275
274
  requested: "default" | "chrome" | "chromium" | "firefox";
276
275
  resolved?: string;
277
276
  /**
278
- * Synthetic media devices the browser was launched with (#509): the camera feed's origin and
277
+ * Synthetic media devices the browser was launched with: the camera feed's origin and
279
278
  * in-sandbox path, how the permission dialog is answered, and the exact flags.
280
279
  */
281
280
  media?: {
@@ -297,7 +296,7 @@ export interface RunBundle {
297
296
  */
298
297
  rerun?: RunRerunLineage;
299
298
  /**
300
- * The interaction-attribution honesty axis (#164). Absent == `isolated` (every existing bundle
299
+ * The interaction-attribution evidence axis. Absent == `isolated` (every existing bundle
301
300
  * byte-stable). Set to `shared-world` by the shared-world backend, paired with `sharedWorld`.
302
301
  */
303
302
  attributionClass?: RunAttributionClass;
@@ -307,15 +306,15 @@ export interface RunBundle {
307
306
  */
308
307
  sharedWorld?: SharedWorldEvidence;
309
308
  /**
310
- * Optional, adapter-namespaced product score (the layer-6 extension seam, issue #154 acceptance
311
- * #8). A thin adapter's `score` hook returns a `RunAdapterScore`; the route attaches it here
309
+ * Optional, adapter-namespaced product score (the adapter extension seam).
310
+ * A thin adapter's `score` hook returns a `RunAdapterScore`; the route attaches it here
312
311
  * without core knowing any product noun (the score is namespaced + its breakdown lives in `data`).
313
312
  * The default mission-based verdict (`review`) is unchanged when no scorer hook is given.
314
313
  */
315
314
  adapterScore?: RunAdapterScore;
316
315
  /**
317
- * Optional provenance for a config-declared scorer (#316). Present only when the scorer was loaded
318
- * from `review.scorer.ref` / `--scorer`; absent for library callers and every pre-#316 bundle
316
+ * Optional provenance for a config-declared scorer. Present only when the scorer was loaded
317
+ * from `review.scorer.ref` / `--scorer`; absent for library callers and every older bundle
319
318
  * (tolerated-absent in isRunBundle so those still verify). Evidence, not a gate.
320
319
  */
321
320
  scorerProvenance?: RunScorerProvenance;
@@ -332,12 +331,13 @@ export interface RunBundle {
332
331
  */
333
332
  providerResources?: RunProviderResource[];
334
333
  /**
335
- * Which lab manifest produced this run (#455). Optional + additive: absent on every bundle
336
- * written before this contract and on library callers who pass a LabConfig directly (the run is
337
- * then honestly lab-less rather than guessed). For older bundles a reader may fall back to
338
- * `inferLegacyLabId`, which reads only the historical `persona.source = "lab:<id>"` convention.
334
+ * Which study file produced this run. Absent on a bundle written before this field and on a
335
+ * library caller's run (the run then has no study id rather than a guessed one). Read it, and
336
+ * `lab` and the source convention of older bundles, through studyProvenanceOf.
339
337
  */
340
- lab?: RunLabProvenance;
338
+ study?: RunStudyProvenance;
339
+ /** `study`'s value, written beside it until 0.109. */
340
+ lab?: RunStudyProvenance;
341
341
  /**
342
342
  * Optional, additive run-level cost estimate (humanish.run-cost-summary.v1): the sum of every
343
343
  * participant's model-token estimate plus the E2B desktop-minute estimate, carrying the same
@@ -350,7 +350,7 @@ export interface RunBundle {
350
350
  /**
351
351
  * One contributing cost line of a RunCostSummary. A line is present even when it cannot be priced
352
352
  * (it records that we tried and could not): an unpriceable line carries estimatedCostUsd: null + a
353
- * `reason` and contributes nothing to the summary total (invariant 5). `estimatedCostUsd` is never
353
+ * `reason` and contributes nothing to the summary total. `estimatedCostUsd` is never
354
354
  * coerced to 0.
355
355
  */
356
356
  export interface RunCostLine {
@@ -406,7 +406,7 @@ export interface RunCostSummary {
406
406
  };
407
407
  /** Host-side create->teardown span in minutes; null when no sandbox was created. */
408
408
  desktopMinutes: number | null;
409
- /** Honest "estimated; <x> unmeasured" statement. */
409
+ /** The "estimated; <x> unmeasured" statement. */
410
410
  note: string;
411
411
  }
412
412
  export interface RunProviderResource {
@@ -440,7 +440,7 @@ export interface RunRerunLineage {
440
440
  /**
441
441
  * What happened to the participants in a study, with the denominator attached.
442
442
  *
443
- * A stakeholder watching through the glass forms conclusions from vivid moments — that is the
443
+ * A stakeholder watching through the glass forms conclusions from vivid moments. That is the
444
444
  * classic failure of the viewing room, and it is why researchers synthesize rather than letting the
445
445
  * room decide. So anything shown to a stakeholder carries its count, or it becomes a machine for
446
446
  * manufacturing certainty from n=1 (docs/principles/three-roles.md).
@@ -450,7 +450,7 @@ export interface RunRerunLineage {
450
450
  * product, is what went wrong.
451
451
  */
452
452
  export interface ParticipantOutcomes {
453
- /** Participants whose sessions reached a terminal state — the denominator for every count below. */
453
+ /** Participants whose sessions reached a terminal state: the denominator for every count below. */
454
454
  total: number;
455
455
  /** Recorded successful sessions; completion provenance depends on the actor and its evidence. */
456
456
  reachedGoal: number;
@@ -482,14 +482,14 @@ export interface ReviewSummary {
482
482
  * The study result, separate from the verdict above.
483
483
  *
484
484
  * `verdict` answers a gate-shaped question and has to collapse a run to one word. This answers
485
- * the research question — what happened to the people in the study — and does not collapse: a run
485
+ * the research question (what happened to the people in the study) and does not collapse: a run
486
486
  * where two of three participants finished is not usefully "fail", and a run where the harness
487
487
  * broke is a different thing from one where a persona gave up. Absent on a dry-run contract
488
488
  * bundle, which has no participants.
489
489
  */
490
490
  participants?: ParticipantOutcomes;
491
491
  /**
492
- * The study's per-task completion rates (#414) — present only when the lab declared a protocol
492
+ * The study's per-task completion rates, present only when the lab declared a protocol
493
493
  * and at least one session produced a funnel. Absent means no protocol was measured, never that
494
494
  * everyone finished.
495
495
  */
@@ -497,27 +497,27 @@ export interface ReviewSummary {
497
497
  }
498
498
  /**
499
499
  * The study's task funnel: for each declared task, how many participants completed it, out of how
500
- * many sessions produced a funnel. This is "where did people get stuck" as data — the number a
501
- * researcher reads first — where the per-participant funnels answer it one journey at a time.
500
+ * many sessions produced a funnel. This is "where did people get stuck" as data, the number a
501
+ * researcher reads first, where the per-participant funnels answer it one journey at a time.
502
502
  *
503
503
  * Aggregated by task id in declaration order. Every participant in a run shares the actor's protocol, so
504
504
  * ids line up across participants; a funnel missing a task id (a future mixed-protocol route)
505
505
  * simply does not count toward that task's denominator.
506
506
  */
507
507
  export interface RunTaskFunnel {
508
- /** Sessions that produced a funnel — the denominator for every count below. */
508
+ /** Sessions that produced a funnel: the denominator for every count below. */
509
509
  sessions: number;
510
510
  tasks: Array<{
511
511
  id: string;
512
512
  /** Participants whose sessions corroborated this task complete. */
513
513
  completed: number;
514
- /** Sessions whose protocol declared this task — its denominator. */
514
+ /** Sessions whose protocol declared this task: its denominator. */
515
515
  sessions: number;
516
516
  /** False when the task declared no success criterion: asked for, never measurable. */
517
517
  observable: boolean;
518
518
  /** Sessions where this task's criteria were never evaluated, because the observations they
519
519
  * read never arrived. Counted apart from failures: "0/3 completed" with 3 unmeasured is a
520
- * statement about our instrument, not about the participants (#514). */
520
+ * statement about our instrument, not about the participants. */
521
521
  unmeasured: number;
522
522
  }>;
523
523
  }
@@ -526,8 +526,8 @@ export interface BundleRun {
526
526
  readonly runId: string;
527
527
  readonly mode: RunBundle["mode"];
528
528
  readonly createdAt: string;
529
- /** The manifest the run came from (#455), as the plan carried it to startRun. */
530
- readonly lab?: RunLabProvenance | undefined;
529
+ /** The manifest the run came from, as the plan carried it to startRun. */
530
+ readonly lab?: RunStudyProvenance | undefined;
531
531
  }
532
532
  /**
533
533
  * The fields every run bundle starts with, in the saved order. The run supplies its id, mode,
@@ -541,7 +541,7 @@ export declare function bundleHead(run: BundleRun, args: {
541
541
  cwd?: string;
542
542
  artifactRoot?: string;
543
543
  source: RunBundle["source"];
544
- }): Pick<RunBundle, "schema" | "publication" | "runId" | "mode" | "simCount" | "createdAt" | "cwd" | "artifactRoot" | "lab" | "source">;
544
+ }): Pick<RunBundle, "schema" | "publication" | "runId" | "mode" | "simCount" | "createdAt" | "cwd" | "artifactRoot" | "study" | "lab" | "source">;
545
545
  /** The files every run directory holds, as the bundle names them. */
546
546
  export declare function bundleArtifacts(): RunBundle["artifacts"];
547
547
  export declare function buildRunSource(args: {
@@ -1,5 +1,6 @@
1
1
  import path from "node:path";
2
2
  import { captureGitState } from "./git-state.js";
3
+ import { studyFields } from "./study-provenance.js";
3
4
  export const RUN_BUNDLE_SCHEMA = "humanish.run-bundle.v1";
4
5
  /** The run bundle file, relative to the run directory. */
5
6
  export const RUN_BUNDLE_FILE = "run.json";
@@ -20,7 +21,7 @@ export function bundleHead(run, args) {
20
21
  createdAt: run.createdAt,
21
22
  cwd: args.cwd ?? PUBLIC_TARGET_CWD,
22
23
  artifactRoot: args.artifactRoot ?? path.join(".humanish", "runs", run.runId),
23
- ...(run.lab === undefined ? {} : { lab: run.lab }),
24
+ ...studyFields(run.lab),
24
25
  source: args.source,
25
26
  };
26
27
  }
@@ -152,8 +152,8 @@ function costTotals(breakdown) {
152
152
  function costNote(args, totals) {
153
153
  const { estimatedTotalUsd, anyNull, placeholder, minRatesAsOf } = totals;
154
154
  const estimateNote = estimatedTotalUsd === null
155
- ? `No priced spend lines this run — every cost line is DECLARED ABSENT (unknown rate / no usage / no duration); nothing is guessed. ${args.participants.some((participant) => participant.trace.executionProfile?.billing === "account-unknown") ? "Account billing remains unknown; API prices do not measure account spend." : "Add a rate to src/run/pricing.ts to estimate this model."}`
156
- : `Estimated ${estimatedTotalUsd} USD total${anyNull ? " (LOWER BOUND — some lines unmeasured/unpriced)" : ""}${placeholder ? "; includes PLACEHOLDER rate(s) — confirm before trusting the magnitude" : ""}. Every figure is an ESTIMATE (rates as of ${minRatesAsOf} — the OLDEST contributing rate, since an aggregate is only as fresh as its stalest input), a rate-table multiply, NOT an authoritative provider charge.`;
155
+ ? `No cost line in this run has a price: each lacks a rate, usage or a duration, and none is guessed. ${args.participants.some((participant) => participant.trace.executionProfile?.billing === "account-unknown") ? "Account billing remains unknown; API prices do not measure account spend." : "Each line's reason says what is missing."}`
156
+ : `Estimated ${estimatedTotalUsd} USD total${anyNull ? " (a lower bound: some lines are unmeasured or unpriced)" : ""}${placeholder ? "; it uses a placeholder rate, so confirm the rate before relying on the amount" : ""}. Every figure multiplies usage by a rate table (rates as of ${minRatesAsOf}, the oldest rate used), so it is an estimate and not the provider's charge.`;
157
157
  return (estimateNote +
158
158
  ((args.desktops?.length ?? 0) > 0
159
159
  ? args.desktops.some((usage) => usage.observation !== undefined && "resources" in usage.observation)
@@ -205,7 +205,7 @@ export function spendFreeCostSummary() {
205
205
  breakdown: [],
206
206
  tokenUsage: { input: 0, output: 0, total: 0 },
207
207
  desktopMinutes: null,
208
- note: "No model request and no hosted desktop: this run spent $0 by construction.",
208
+ note: "This run made no model request and used no hosted desktop, so it cost $0.",
209
209
  };
210
210
  }
211
211
  // Convert a host-side desktop span (ms) into billed minutes, or undefined when no sandbox ran.
package/dist/run/costs.js CHANGED
@@ -47,7 +47,13 @@ export async function readCostTotals(cwd, entry) {
47
47
  // uncertain, whatever a run-cost warning is named.
48
48
  const runWarnings = [];
49
49
  const analysisWarnings = [];
50
- costs.runEstimatedUsd = isKnownUsd(entry.estimatedCostUsd) ? entry.estimatedCostUsd : null;
50
+ // A dry run makes no model request and creates no desktop, so with no figure it costs $0. A
51
+ // recorded unknown (null) figure stays unknown.
52
+ costs.runEstimatedUsd = isKnownUsd(entry.estimatedCostUsd)
53
+ ? entry.estimatedCostUsd
54
+ : entry.estimatedCostUsd === undefined && entry.mode === "dry-run"
55
+ ? 0
56
+ : null;
51
57
  try {
52
58
  const prepared = await bindExistingRunArtifactPaths(cwd, entry.runId);
53
59
  const bytes = await readBoundedFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes);
@@ -9,7 +9,7 @@ interface RunThought {
9
9
  at?: string;
10
10
  }
11
11
  export interface RunParticipant {
12
- /** Stream id — stable within a run, and what distinguishes participants of one study. */
12
+ /** Stream id: stable within a run, and what distinguishes participants of one study. */
13
13
  id: string;
14
14
  /** What to call them on screen: the participant's own label, else the persona id. */
15
15
  label: string;
@@ -17,11 +17,11 @@ export interface RunParticipant {
17
17
  personaId?: string;
18
18
  /**
19
19
  * The persona's declared traits (`patience:medium`, `skill:medium`, …). This is the abbreviated
20
- * persona a reader actually wants beside a live thought — it says who is struggling, which a
20
+ * persona a reader actually wants beside a live thought. It says who is struggling, which a
21
21
  * name alone does not.
22
22
  */
23
23
  traits: string[];
24
- /** `running`, `passed`, `failed`, `contract_proof_only` — the participant's own word for itself. */
24
+ /** `running`, `passed`, `failed`, `contract_proof_only`: the participant's own word for itself. */
25
25
  status?: string;
26
26
  /** Why the actor stopped, when it has. */
27
27
  completionReason?: string;
@@ -30,7 +30,7 @@ export interface RunParticipant {
30
30
  actions?: number;
31
31
  /**
32
32
  * Thoughts recorded so far. The mid-run flush carries the trace items but not the `counts` block,
33
- * so a live participant has no turn count to show — but the thoughts can be counted directly, and
33
+ * so a live participant has no turn count to show, but the thoughts can be counted directly, and
34
34
  * "8 thoughts" is a true statement about progress rather than an inferred turn number.
35
35
  */
36
36
  thoughts?: number;
@@ -49,13 +49,13 @@ export interface RunDetail {
49
49
  observerPath?: string;
50
50
  }
51
51
  /**
52
- * Read one run's participants. Returns null when the run has no readable bundle yet — an ordinary
52
+ * Read one run's participants. Returns null when the run has no readable bundle yet, an ordinary
53
53
  * state for a run that has just started, not a failure.
54
54
  *
55
55
  * Reads the bundle narrowly rather than through `loadRunBundle`, which applies the strict
56
56
  * evidence-of-record guard. That guard is right for verification and wrong here: a mid-run flush is
57
57
  * a partial document by definition, so validating it as a complete bundle would make the live view
58
- * — the only view that needs this — the one case that never renders. Nothing read here is treated
58
+ * (the only view that needs this) the one case that never renders. Nothing read here is treated
59
59
  * as a claim about what a participant did; it is what to put on a screen.
60
60
  */
61
61
  export declare function readRunDetail(cwdInput: string, runId: string): Promise<RunDetail | null>;
@@ -20,7 +20,7 @@ const RUN_DETAIL_SCHEMA = "humanish.run-detail.v1";
20
20
  *
21
21
  * Takes the last reasoning item rather than the newest by timestamp: the trace is append-ordered by
22
22
  * construction, and half of a live flush may not carry `at` yet. An item still in flight is skipped
23
- * — a partial thought read mid-write would be quoted as though the participant had finished it.
23
+ * because a partial thought read mid-write would be quoted as though the participant had finished it.
24
24
  */
25
25
  function latestThought(trace) {
26
26
  const items = trace.items ?? [];
@@ -70,7 +70,7 @@ function participantFrom(stream, index) {
70
70
  *
71
71
  * A finished trace carries its own `estimatedCost`. A live one carries the running usage and the
72
72
  * model it prices at, so the same estimator gives a figure mid-run instead of the screen reporting
73
- * the cost as unknown until the moment the run ends — which is the half of a run where knowing what
73
+ * the cost as unknown until the moment the run ends. That is the half of a run where knowing what
74
74
  * it is costing actually changes what you do.
75
75
  */
76
76
  function costOf(trace) {
@@ -95,13 +95,13 @@ function costOf(trace) {
95
95
  }
96
96
  }
97
97
  /**
98
- * Read one run's participants. Returns null when the run has no readable bundle yet — an ordinary
98
+ * Read one run's participants. Returns null when the run has no readable bundle yet, an ordinary
99
99
  * state for a run that has just started, not a failure.
100
100
  *
101
101
  * Reads the bundle narrowly rather than through `loadRunBundle`, which applies the strict
102
102
  * evidence-of-record guard. That guard is right for verification and wrong here: a mid-run flush is
103
103
  * a partial document by definition, so validating it as a complete bundle would make the live view
104
- * — the only view that needs this — the one case that never renders. Nothing read here is treated
104
+ * (the only view that needs this) the one case that never renders. Nothing read here is treated
105
105
  * as a claim about what a participant did; it is what to put on a screen.
106
106
  */
107
107
  export async function readRunDetail(cwdInput, runId) {
@@ -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,10 +33,10 @@ 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
  }
@@ -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();
@@ -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,