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,27 +1,28 @@
1
1
  import { redactText } from "../../evidence/redaction.js";
2
- import { participantAssignment } from "../../lab/participant-assignment.js";
2
+ import { participantAssignment } from "../../study/participant-assignment.js";
3
3
  import { REVIEW_SCHEMA, bundleArtifacts, bundleHead, } from "../../run/bundle.js";
4
+ import { verdictText } from "../../run/judge.js";
4
5
  import {} from "../../run/streams.js";
5
6
  import { participantEvent, participantIds, participantRecord, participantStream, } from "../../run/participant-records.js";
6
7
  import { TERMINAL_EVENTS_ARTIFACT, TERMINAL_LEDGERS_ARTIFACT, TERMINAL_TRANSCRIPT_ARTIFACT, } from "../../run/terminal-contract.js";
7
8
  import { describeMeasuredSpend, noSpendLineMeasured, noSpendNotEstablished } from "./ledger.js";
8
9
  /**
9
- * Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change — a new
10
- * producer only). DRY-RUN: a contract bundle. The terminal stream is a contract placeholder
10
+ * Project the terminal-product run into a humanish.run-bundle.v1 (no schema change: a new
11
+ * producer only). Dry run: a contract bundle. The terminal stream is a contract placeholder
11
12
  * (stdin disabled, no captured tail, because nothing ran), the subject is declared unpinned, and
12
13
  * the caps/policies/runtime-auth declarations are recorded without pretending that live ledgers
13
14
  * exist. The shipped live builder fills the same evidence contract. Exported for tests.
14
15
  */
15
16
  export function buildTerminalProductBundle(args) {
16
- const reason = "Contract bundle only: dry-run declared the terminal-product study contract without creating an E2B sandbox, injecting any key, or spending. This run did not execute an agent or prove live behavior.";
17
+ const reason = "Dry run: the terminal-product study was declared without creating an E2B sandbox, injecting any key, or spending. This run did not execute an agent or prove live behavior.";
17
18
  // The terminal stream is a contract placeholder on the dry-run path: stdin is disabled and no
18
19
  // exec output was captured, so the tail is empty and transport stays "snapshot", never "pty"
19
- // (captured non-interactive exec output is never an interactive PTY; invariant 6 + the PTY
20
- // ruling). The shipped live builder fills terminal.tail from redacted exec-stream capture.
20
+ // (captured non-interactive exec output is never an interactive PTY). The shipped live builder
21
+ // fills terminal.tail from redacted exec-stream capture.
21
22
  const { simulation, stream } = terminalParticipant(args, {
22
23
  status: "contract_proof_only",
23
24
  reason,
24
- summary: `Contract participant for the terminal agent (${args.actorId}) studying ${args.productName} from public surfaces.`,
25
+ summary: `Dry-run participant for the terminal agent (${args.actorId}) studying ${args.productName} from public surfaces.`,
25
26
  updatedAt: args.run.createdAt,
26
27
  stdin: args.stdin,
27
28
  tail: "",
@@ -38,24 +39,24 @@ export function buildTerminalProductBundle(args) {
38
39
  at: args.run.createdAt,
39
40
  level: "info",
40
41
  type: "terminal-lab.run.created",
41
- message: `Created terminal-product lab run for ${args.labId} (actor ${args.actorId}, product ${args.productName}).`,
42
+ message: `Created a terminal-product run for ${args.studyId} (actor ${args.actorId}, product ${args.productName}).`,
42
43
  },
43
44
  participantEvent(TERMINAL_IDS, {
44
45
  id: "event-001-subject",
45
46
  at: args.run.createdAt,
46
47
  level: "info",
47
48
  type: "terminal-lab.subject.declared",
48
- // Invariant 5: provenance recorded or its absence declared. The agent drives public surfaces
49
+ // Provenance is recorded or its absence declared. The agent drives public surfaces
49
50
  // and nothing is cloned, so the subject provenance is explicitly unpinned; evidence binds to the
50
51
  // composed-prompt digest. Public surfaces are recorded (they are public by declaration).
51
- message: `Subject product declared: ${args.productName}; public surfaces: ${args.publicSurfaces.join(", ")}. The lab did not provision/clone the product — subject provenance is UNPINNED (a public-surface study cannot be commit-pinned); evidence binds to the composed-prompt digest ${args.persona.promptDigest}.`,
52
+ message: `Subject product declared: ${args.productName}; public surfaces: ${args.publicSurfaces.join(", ")}. humanish did not provision or clone the product, so its provenance is unpinned: a study of public pages has no commit to pin. The evidence is tied to the prompt digest ${args.persona.promptDigest}.`,
52
53
  }),
53
54
  participantEvent(TERMINAL_IDS, {
54
55
  id: "event-002-credentials",
55
56
  at: args.run.createdAt,
56
57
  level: "info",
57
58
  type: "terminal-lab.credentials.declared",
58
- // Names-only evidence (invariant 1): the runtime-auth channel is declared; no value is ever
59
+ // Names-only evidence: the runtime-auth channel is declared; no value is ever
59
60
  // recorded. The deny-by-default policies are recorded so the credential posture is auditable.
60
61
  message: `Runtime auth channel: ${args.runtimeAuth ?? "none declared"} (names only; values never persist; the live engine applies the selected key placement, while this dry-run performs no injection). Credential policies (deny-by-default): allowPrivateRepoAccess=${args.policies.allowPrivateRepoAccess}, allowProviderCredentials=${args.policies.allowProviderCredentials}, allowPaymentCredentials=${args.policies.allowPaymentCredentials}, allowGitHubMutation=${args.policies.allowGitHubMutation}.`,
61
62
  }),
@@ -64,14 +65,14 @@ export function buildTerminalProductBundle(args) {
64
65
  at: args.run.createdAt,
65
66
  level: "info",
66
67
  type: "terminal-lab.caps.declared",
67
- message: `Spend/job/time caps: ${capsText}. A live run never exercises the runtime key without a fail-closed cap; its no-spend proof is derived from the persisted cost ledger. This dry-run spends $0 by mechanism.`,
68
+ message: `Spend, job and time caps: ${capsText}. A live run uses the runtime key only while a cap is in force, and derives its no-spend proof from the recorded cost ledger. This dry run spends $0: it makes no model request.`,
68
69
  }),
69
70
  participantEvent(TERMINAL_IDS, {
70
71
  id: "event-004-contract",
71
72
  at: args.run.createdAt,
72
73
  level: "info",
73
74
  type: "terminal-lab.contract.ready",
74
- message: "Dry-run contract bundle ready. Switch scenario.mode to live with the required runtime auth and caps to exercise the in-sandbox agent route, captured exec stream, and declared runtime-auth placement.",
75
+ message: "Dry-run bundle ready. Switch scenario.mode to live with the required runtime auth and caps to exercise the in-sandbox agent route, captured exec stream, and declared runtime-auth placement.",
75
76
  }),
76
77
  ];
77
78
  const review = {
@@ -79,7 +80,7 @@ export function buildTerminalProductBundle(args) {
79
80
  verdict: args.verdict,
80
81
  summary: reason,
81
82
  gaps: [
82
- "This dry-run did not execute the live in-sandbox agent route; it proves contract shape only, not live behavior, scale, or adoption.",
83
+ "This dry run did not execute the live in-sandbox agent route; it checks the evidence shape only, not live behavior, scale, or adoption.",
83
84
  "No exec-stream, transcript, substrate, cost, or cleanup artifacts were produced because no live session ran; live verification requires those artifacts.",
84
85
  ],
85
86
  };
@@ -88,13 +89,13 @@ export function buildTerminalProductBundle(args) {
88
89
  {
89
90
  at: args.run.createdAt,
90
91
  event: "terminal-lab.run.created",
91
- message: `Created terminal-product lab run with one in-sandbox agent participant (actor ${args.actorId}, product ${args.productName}).`,
92
+ message: `Created a terminal-product run with one in-sandbox agent participant (actor ${args.actorId}, product ${args.productName}).`,
92
93
  },
93
94
  ],
94
95
  simulation,
95
96
  stream,
96
97
  events,
97
- redactionNotes: "Dry-run contract bundle: no sandbox ran, no key was injected, no exec output was captured. The author mission is public-safe committed lab text (redacted defensively); the composed prompt is bound by digest. The shipped live path applies scrubKnownValues then redactText at the capture source before persistence.",
98
+ redactionNotes: "Dry-run bundle: no sandbox ran, no key was injected, no exec output was captured. The author mission is public-safe committed study text (redacted defensively); the composed prompt is bound by digest. The shipped live path applies scrubKnownValues then redactText at the capture source before persistence.",
98
99
  review,
99
100
  });
100
101
  }
@@ -167,8 +168,8 @@ export function buildLiveTerminalProductBundle(args) {
167
168
  ? []
168
169
  : [`Agent session ended ${args.trace.status}: ${args.sessionReason}`]),
169
170
  ...(args.capFailure === undefined ? [] : [args.capFailure]),
170
- // Honesty gap: the no-spend proof always declares which spend lines it could not measure, so a
171
- // green run never silently over-claims a fully-proven $0.
171
+ // Measurement gap: the no-spend proof always declares which spend lines it could not measure,
172
+ // so a green run never silently over-claims a fully-proven $0.
172
173
  ...(noSpend.unmeasuredLines.length > 0
173
174
  ? [
174
175
  `${noSpendLineMeasured(noSpend) ? noSpendNotEstablished(noSpend.maxUsd ?? 0) : "No-spend proof is partial."} ${describeMeasuredSpend(args.ledgers.cost, args.trace.tokenUsage)} An adapter may supply the missing signals through costProbe.`,
@@ -185,7 +186,7 @@ export function buildLiveTerminalProductBundle(args) {
185
186
  simulation,
186
187
  stream,
187
188
  events: lifecycleEvents,
188
- redactionNotes: `Live terminal-product run: the in-sandbox agent's output was captured via commands.run onStdout/onStderr and scrubbed (literal known values incl. the runtime key) THEN redacted (shape patterns) AT THE SOURCE before persisting. ${args.runtimeAuth === "openai-egress" ? `Runtime auth openai-egress: the raw key from ${args.runtimeAuthKeyName} is reserved for E2B's external api.openai.com HTTPS header transform. ${args.ledgers.commandLog.some((command) => command.label === "codex-exec") ? "Codex received an inert CODEX_API_KEY placeholder." : "Codex was not launched."} Any created sandbox retains a spendable OpenAI proxy capability until teardown; additional provider calls may not appear in the Codex usage ledger.` : `Runtime auth openai-env: the runtime key (${args.runtimeAuthKeyName}) was injected ONLY into the command-scoped codex invocation, never sandbox-global env or metadata; only its NAME appears in evidence.`} Subject provenance is UNPINNED (public-surface study).`,
189
+ redactionNotes: `Live terminal-product run: the in-sandbox agent's output was captured via commands.run onStdout/onStderr and had known values (including the runtime key) scrubbed, then shape patterns redacted, before anything was stored. ${args.runtimeAuth === "openai-egress" ? `Runtime auth openai-egress: the raw key from ${args.runtimeAuthKeyName} is reserved for E2B's external api.openai.com HTTPS header transform. ${args.ledgers.commandLog.some((command) => command.label === "codex-exec") ? "Codex received an inert CODEX_API_KEY placeholder." : "Codex was not launched."} Any created sandbox retains a spendable OpenAI proxy capability until teardown; additional provider calls may not appear in the Codex usage ledger.` : `Runtime auth openai-env: the runtime key (${args.runtimeAuthKeyName}) was passed only to the codex command, never to sandbox-wide environment variables or metadata; only its name appears in evidence.`} Subject provenance is unpinned (a study of public pages).`,
189
190
  review,
190
191
  ...(args.cost === undefined ? {} : { cost: args.cost }),
191
192
  });
@@ -196,7 +197,7 @@ const TERMINAL_IDS = participantIds(0);
196
197
  function terminalParticipant(args, session) {
197
198
  const simulation = participantRecord(TERMINAL_IDS, 1, {
198
199
  personaId: args.persona.id,
199
- scenarioId: `terminal-${args.labId}`,
200
+ scenarioId: `terminal-${args.studyId}`,
200
201
  status: session.status,
201
202
  streamKind: "terminal",
202
203
  mode: "cli-sim",
@@ -209,7 +210,7 @@ function terminalParticipant(args, session) {
209
210
  const stream = participantStream(TERMINAL_IDS, {
210
211
  assignment: participantAssignment({ mission: args.mission }),
211
212
  kind: "terminal",
212
- label: `Terminal agent — ${args.labId}`,
213
+ label: `Terminal agent · ${args.studyId}`,
213
214
  status: session.status,
214
215
  transport: "snapshot",
215
216
  updatedAt: session.updatedAt,
@@ -236,17 +237,17 @@ function terminalRunBundle(args, parts) {
236
237
  persona: {
237
238
  id: args.persona.id,
238
239
  name: `Autonomous terminal agent (${args.persona.id})`,
239
- source: `lab:${args.labId}`,
240
+ source: `study:${args.studyId}`,
240
241
  sourceDigest: args.persona.promptDigest,
241
242
  },
242
243
  scenario: {
243
- id: `terminal-${args.labId}`,
244
- title: args.labTitle ?? `Terminal-product lab: ${args.labId}`,
245
- // The author mission is public-safe committed lab text — recorded plaintext as the goal,
244
+ id: `terminal-${args.studyId}`,
245
+ title: args.studyTitle ?? `Terminal-product run: ${args.studyId}`,
246
+ // The author mission is public-safe committed study text. It is recorded plaintext as the goal,
246
247
  // redacted defensively before persisting (it never carries a secret, but the harness never
247
248
  // trusts that). The full composed prompt is bound by digest, not text.
248
249
  goal: redactText(args.mission),
249
- source: `lab:${args.labId}`,
250
+ source: `study:${args.studyId}`,
250
251
  sourceDigest: args.persona.promptDigest,
251
252
  },
252
253
  lifecycle: parts.lifecycle,
@@ -281,7 +282,7 @@ export function renderTerminalReviewMarkdown(bundle) {
281
282
  "",
282
283
  `- run: ${bundle.runId}`,
283
284
  `- mode: ${bundle.mode}`,
284
- `- verdict: ${bundle.review.verdict}`,
285
+ `- verdict: ${verdictText(bundle.review.verdict, bundle.mode)}`,
285
286
  `- summary: ${bundle.review.summary}`,
286
287
  `- mission: ${bundle.scenario.goal}`,
287
288
  ...(subject ? [`- subject: ${subject.message}`] : []),
@@ -1,4 +1,4 @@
1
- import type { LabRuntimeAuth } from "../../lab/types.js";
1
+ import type { StudyRuntimeAuth } from "../../study/types.js";
2
2
  /**
3
3
  * Resolve the runtime key on the host. Legacy openai-env passes it command-scoped; openai-egress
4
4
  * returns an inert command env while retaining the actual value for the external transform and
@@ -7,28 +7,28 @@ import type { LabRuntimeAuth } from "../../lab/types.js";
7
7
  */
8
8
  export declare function buildRuntimeAuth(args: {
9
9
  /** Undefined retains the historical openai-env default. */
10
- runtimeAuth: LabRuntimeAuth | undefined;
10
+ runtimeAuth: StudyRuntimeAuth | undefined;
11
11
  /** The operator environment the key value is read from (process.env or a test fake). */
12
12
  env: Record<string, string | undefined>;
13
13
  }): {
14
14
  ok: true;
15
- mode: LabRuntimeAuth;
15
+ mode: StudyRuntimeAuth;
16
16
  envs: Record<string, string>;
17
17
  keyName: string;
18
18
  keyValue: string;
19
19
  } | {
20
20
  ok: false;
21
- code: "HUMANISH_TERMINAL_LAB_RUNTIME_AUTH_MISSING" | "HUMANISH_TERMINAL_LAB_CREDENTIAL_DENIED";
21
+ code: "HUMANISH_TERMINAL_RUNTIME_AUTH_MISSING" | "HUMANISH_TERMINAL_CREDENTIAL_DENIED";
22
22
  message: string;
23
23
  };
24
24
  /**
25
- * Build the sandbox metadata from a positive allowlist (safety contract item 6). This is the only
26
- * way metadata is set on the terminal route — it carries solely non-secret labels and rejects any
25
+ * Build the sandbox metadata from a positive allowlist. This is the only
26
+ * way metadata is set on the terminal route. It carries solely non-secret labels and rejects any
27
27
  * value that is not a plain short label. A verifier check asserts the persisted metadata has no
28
28
  * prompt/token/secret shapes; this builder makes that true by construction.
29
29
  */
30
30
  export declare function buildSandboxMetadata(allowlist: {
31
- labId: string;
32
- simId: string;
31
+ studyId: string;
32
+ recordId: string;
33
33
  runId: string;
34
34
  }): Record<string, string>;
@@ -1,5 +1,5 @@
1
1
  import { E2B_SYSTEM_CA_BUNDLE, OPENAI_EGRESS_PLACEHOLDER } from "./runtime-auth.js";
2
- import { TERMINAL_PRODUCT_LAB_PROVIDER_METADATA } from "./types.js";
2
+ import { TERMINAL_PRODUCT_STUDY_PROVIDER_METADATA } from "./types.js";
3
3
  /**
4
4
  * Resolve the runtime key on the host. Legacy openai-env passes it command-scoped; openai-egress
5
5
  * returns an inert command env while retaining the actual value for the external transform and
@@ -12,13 +12,13 @@ export function buildRuntimeAuth(args) {
12
12
  // (developers.openai.com/codex/noninteractive) document it as the channel for a single codex exec
13
13
  // invocation, which is exactly this route's shape (no persisted auth.json/CODEX_HOME, per-command
14
14
  // envs only). A dated in-repo receipt
15
- // (docs/goals/humanish-recursive-proof-critical-point/receipts/actor-required-attempt.md) shows a
15
+ // (docs/history/goals/humanish-recursive-proof-critical-point/receipts/actor-required-attempt.md) shows a
16
16
  // job-wide OPENAI_API_KEY alone failing bearer auth for this same pinned-exec pattern. When the
17
17
  // operator only exported OPENAI_API_KEY, its value is also injected under CODEX_API_KEY below, so
18
18
  // the documented exec auth channel is always populated regardless of which name the operator
19
19
  // used. The allowlist is exactly these two names; everything else is denied by construction.
20
20
  const ALLOWED_RUNTIME_KEY_NAMES = ["CODEX_API_KEY", "OPENAI_API_KEY"];
21
- // Tripwire (safety contract item 4): if a future widening of ALLOWED_RUNTIME_KEY_NAMES ever
21
+ // Tripwire (deny-by-default credentials): if a future widening of ALLOWED_RUNTIME_KEY_NAMES ever
22
22
  // added a clearly-non-runtime credential (a GitHub/payment/deploy/db secret), fail closed. The
23
23
  // generic `*_KEY` shape is deliberately left out of the tripwire, since a runtime key legitimately
24
24
  // ends in _KEY (CODEX_API_KEY/OPENAI_API_KEY), so testing it against the generic shape would
@@ -29,7 +29,7 @@ export function buildRuntimeAuth(args) {
29
29
  if (ALLOWED_RUNTIME_KEY_NAMES.some((name) => isNonRuntimeCredentialName(name))) {
30
30
  return {
31
31
  ok: false,
32
- code: "HUMANISH_TERMINAL_LAB_CREDENTIAL_DENIED",
32
+ code: "HUMANISH_TERMINAL_CREDENTIAL_DENIED",
33
33
  message: "Internal invariant violated: a runtime-key allowlist entry is a non-runtime credential (GitHub/payment/deploy/db).",
34
34
  };
35
35
  }
@@ -37,8 +37,8 @@ export function buildRuntimeAuth(args) {
37
37
  if (!keyName) {
38
38
  return {
39
39
  ok: false,
40
- code: "HUMANISH_TERMINAL_LAB_RUNTIME_AUTH_MISSING",
41
- message: `Live terminal-product labs declare runtimeAuth "${String(args.runtimeAuth)}" and need ${ALLOWED_RUNTIME_KEY_NAMES.join(" or ")} in the environment (pass via --env-file; the selected auth mode places the value in command-scoped env or an external E2B header transform; the value is never persisted).`,
40
+ code: "HUMANISH_TERMINAL_RUNTIME_AUTH_MISSING",
41
+ message: `Live terminal-product studies declare runtimeAuth "${String(args.runtimeAuth)}" and need ${ALLOWED_RUNTIME_KEY_NAMES.join(" or ")} in the environment (pass via --env-file; the selected auth mode places the value in command-scoped env or an external E2B header transform; the value is never persisted).`,
42
42
  };
43
43
  }
44
44
  const keyValue = args.env[keyName];
@@ -84,18 +84,18 @@ function isNonRuntimeCredentialName(name) {
84
84
  return NON_RUNTIME_CREDENTIAL_NAME_PATTERNS.some((pattern) => pattern.test(name));
85
85
  }
86
86
  /**
87
- * Build the sandbox metadata from a positive allowlist (safety contract item 6). This is the only
88
- * way metadata is set on the terminal route — it carries solely non-secret labels and rejects any
87
+ * Build the sandbox metadata from a positive allowlist. This is the only
88
+ * way metadata is set on the terminal route. It carries solely non-secret labels and rejects any
89
89
  * value that is not a plain short label. A verifier check asserts the persisted metadata has no
90
90
  * prompt/token/secret shapes; this builder makes that true by construction.
91
91
  */
92
92
  export function buildSandboxMetadata(allowlist) {
93
93
  return {
94
- mode: TERMINAL_PRODUCT_LAB_PROVIDER_METADATA.mode,
95
- tool: TERMINAL_PRODUCT_LAB_PROVIDER_METADATA.tool,
94
+ mode: TERMINAL_PRODUCT_STUDY_PROVIDER_METADATA.mode,
95
+ tool: TERMINAL_PRODUCT_STUDY_PROVIDER_METADATA.tool,
96
96
  provider: "codex",
97
- labId: allowlist.labId,
98
- simId: allowlist.simId,
97
+ labId: allowlist.studyId,
98
+ recordId: allowlist.recordId,
99
99
  // The run id is a harness-minted token (terminal-<ts>-<hex>), not user data.
100
100
  runId: allowlist.runId,
101
101
  };
@@ -1,11 +1,11 @@
1
- import type { TerminalPlan } from "../../lab/plan-types.js";
1
+ import type { TerminalPlan } from "../../study/plan-types.js";
2
2
  import type { RunScope } from "../../run/run.js";
3
- import { type RunLiveTerminalSessionArgs, type TerminalProductLabResult, type TerminalRunInput } from "./types.js";
3
+ import { type RunLiveTerminalSessionArgs, type TerminalProductStudyResult, type TerminalRunInput } from "./types.js";
4
4
  /**
5
5
  * The dry-run path: a contract bundle with the persona and prompt digest bound, published through
6
6
  * the run scope with no sandbox, key or spend.
7
7
  */
8
- export declare function runDryTerminalLab(args: {
8
+ export declare function runDryTerminalStudy(args: {
9
9
  plan: Extract<TerminalPlan, {
10
10
  readonly dryRun: true;
11
11
  }>;
@@ -14,7 +14,7 @@ export declare function runDryTerminalLab(args: {
14
14
  warnings: string[];
15
15
  failed: RunLiveTerminalSessionArgs["failed"];
16
16
  scope: RunScope;
17
- }): Promise<TerminalProductLabResult>;
17
+ }): Promise<TerminalProductStudyResult>;
18
18
  /** Compose the full prompt the agent would run. Bound to evidence by digest only. */
19
19
  export declare function composePrompt(args: {
20
20
  mission: string;
@@ -1,7 +1,7 @@
1
1
  // The terminal route's dry run: a contract-only bundle with the persona and prompt digest bound,
2
2
  // published through the run scope with no sandbox, key or spend. session.ts holds the live path.
3
3
  import { digestText, redactText, scrubLiterals } from "../../evidence/redaction.js";
4
- import { participantAssignment } from "../../lab/participant-assignment.js";
4
+ import { participantAssignment } from "../../study/participant-assignment.js";
5
5
  import { buildRunSource } from "../../run/bundle.js";
6
6
  import { judgeExecution, judgeTerminal, OUTCOME_POLICIES, resultOk } from "../../run/judge.js";
7
7
  import { validatePreparedRunArtifactPaths } from "../../run/paths.js";
@@ -9,12 +9,13 @@ import { buildTerminalProductBundle, renderTerminalReviewMarkdown } from "./bund
9
9
  import { resolveTerminalPersona, terminalPersonaRef } from "./persona.js";
10
10
  import { declaredRuntimeProvenance } from "./runtime.js";
11
11
  import { defaultMission, makeTerminalRunId } from "./session.js";
12
- import { TERMINAL_PRODUCT_LAB_SCHEMA, } from "./types.js";
12
+ import {} from "./types.js";
13
+ import { studyResultIdentity } from "../../run/study-result.js";
13
14
  /**
14
15
  * The dry-run path: a contract bundle with the persona and prompt digest bound, published through
15
16
  * the run scope with no sandbox, key or spend.
16
17
  */
17
- export async function runDryTerminalLab(args) {
18
+ export async function runDryTerminalStudy(args) {
18
19
  const { plan, input, cwd, warnings, failed, scope } = args;
19
20
  const { product } = plan;
20
21
  const { evidenceMission, physicalCwd, persona } = await prepareDryPersona({
@@ -28,7 +29,7 @@ export async function runDryTerminalLab(args) {
28
29
  runId: input.runId,
29
30
  mintRunId: makeTerminalRunId,
30
31
  mode: "dry-run",
31
- lab: plan.lab,
32
+ study: plan.study,
32
33
  renderReview: renderTerminalReviewMarkdown,
33
34
  observer: { open: input.open === true, render: input.deps?.renderObserver },
34
35
  });
@@ -48,8 +49,8 @@ export async function runDryTerminalLab(args) {
48
49
  run,
49
50
  actorId: plan.actor,
50
51
  dryRun: true,
51
- labId: plan.labId,
52
- ...(plan.title ? { labTitle: plan.title } : {}),
52
+ studyId: plan.studyId,
53
+ ...(plan.title ? { studyTitle: plan.title } : {}),
53
54
  mission: evidenceMission,
54
55
  persona,
55
56
  productName: product.name,
@@ -76,16 +77,15 @@ export async function runDryTerminalLab(args) {
76
77
  : [
77
78
  {
78
79
  kind: "evidence",
79
- message: observer.error?.message ?? "Observer failed for the terminal-product lab run.",
80
+ message: observer.error?.message ?? "Observer failed for the terminal-product run.",
80
81
  },
81
82
  ], policy);
82
83
  const ok = resultOk({ judgment, execution, scorerFailures: [], policy });
83
84
  await finished.recordOutcome({ ok, execution });
84
85
  return {
85
- schema: TERMINAL_PRODUCT_LAB_SCHEMA,
86
+ ...studyResultIdentity("terminal", plan.studyId),
86
87
  ok,
87
88
  cwd,
88
- labId: plan.labId,
89
89
  actor: plan.actor,
90
90
  product: product.name,
91
91
  dryRun: true,
@@ -96,8 +96,8 @@ export async function runDryTerminalLab(args) {
96
96
  ? {}
97
97
  : {
98
98
  error: {
99
- code: "HUMANISH_TERMINAL_LAB_FAILED",
100
- message: observer.error?.message ?? "Observer failed for the terminal-product lab run.",
99
+ code: "HUMANISH_TERMINAL_FAILED",
100
+ message: observer.error?.message ?? "Observer failed for the terminal-product run.",
101
101
  },
102
102
  }),
103
103
  };
@@ -116,7 +116,7 @@ async function prepareDryPersona(args) {
116
116
  const evidenceMission = participantAssignment({ mission }, scrubLiterals(knownSecretValues)).mission;
117
117
  const terminalPersona = await resolveTerminalPersona({ plan, cwd, warnings });
118
118
  // The composed prompt = mission + persona + public-surface manifest. Only the author mission
119
- // goes plaintext into evidence (it is public-safe committed lab text); the full composed prompt
119
+ // goes plaintext into evidence (it is public-safe committed study text); the full composed prompt
120
120
  // is recorded as a digest (the safety contract's mission ruling).
121
121
  const composedPrompt = composePrompt({
122
122
  mission,
@@ -6,7 +6,7 @@
6
6
  // as a replacement glyph. Every ASCII character on the same screen was fine, which is exactly the
7
7
  // signature.
8
8
  //
9
- // The honest fix is not "stop using em dashes" — it is to ask what the terminal can render and mean
9
+ // The fix is not "stop using em dashes". It is to ask what the terminal can render and mean
10
10
  // it. A surface that emits characters its own terminal cannot decode is not being expressive, it is
11
11
  // producing garbage that reads as a bug in the tool.
12
12
  const UTF8 = /utf-?8/i;
@@ -23,7 +23,7 @@ export function terminalRendersUnicode(env = process.env) {
23
23
  const declared = env.LC_ALL ?? env.LC_CTYPE ?? env.LANG;
24
24
  if (declared === undefined || declared.trim().length === 0) {
25
25
  // Nothing declared at all. A bare login shell on a stock image lands here, and that is the
26
- // case the participant hit — assume it cannot, because the failure is silent and ugly while
26
+ // case the participant hit. Assume it cannot, because the failure is silent and ugly while
27
27
  // the fallback is merely plainer.
28
28
  return false;
29
29
  }
@@ -1,9 +1,9 @@
1
1
  import type { ActorTokenUsage } from "../../actors/contract.js";
2
- import type { LabScenarioCaps } from "../../lab/types.js";
2
+ import type { StudyScenarioCaps } from "../../study/types.js";
3
3
  import { type CostCategory } from "../../run/terminal-contract.js";
4
4
  import type { CostLine, NoSpendProof, TerminalCostLedger } from "./types.js";
5
5
  /**
6
- * Build the spend ledger from the captured session. The null discipline (issue #154):
6
+ * Build the spend ledger from the captured session. The null discipline:
7
7
  * - The `provider` line is populated from the actor trace's tokenUsage.costUsd when the trace
8
8
  * carries it (a measured value, incl. a measured 0). When the trace carries no costUsd, the
9
9
  * provider line is `null` = not measured (never guessed to 0 just because no-spend was intended).
@@ -14,7 +14,7 @@ import type { CostLine, NoSpendProof, TerminalCostLedger } from "./types.js";
14
14
  */
15
15
  export declare function buildCostLedger(args: {
16
16
  tokenCostUsd?: number;
17
- /** Measured token counts, when the run produced them but no rate could price them (#531). */
17
+ /** Measured token counts, when the run produced them but no rate could price them. */
18
18
  tokenUsage?: ActorTokenUsage;
19
19
  injectedLines?: Partial<Record<CostCategory, CostLine>>;
20
20
  }): TerminalCostLedger;
@@ -32,7 +32,7 @@ export declare function noSpendNotEstablished(maxUsd: number): string;
32
32
  */
33
33
  export declare function describeMeasuredSpend(ledger: TerminalCostLedger, tokenUsage?: ActorTokenUsage): string;
34
34
  /** Derive the no-spend proof from the ledger. It vouches for known-zero lines and
35
- * explicitly lists the unmeasured (null) lines it cannot vouch for — never claiming zero on null. */
35
+ * explicitly lists the unmeasured (null) lines it cannot vouch for. It never claims zero on null. */
36
36
  export declare function buildNoSpendProof(ledger: TerminalCostLedger, maxUsd: number | null, tokenUsage?: ActorTokenUsage): NoSpendProof;
37
37
  /**
38
38
  * Fail-closed caps enforcement. Returns a structured violation when a known
@@ -41,7 +41,7 @@ export declare function buildNoSpendProof(ledger: TerminalCostLedger, maxUsd: nu
41
41
  * grant a green pass: the no-spend proof reports them as unmeasured. maxMinutes is wall-clock and is
42
42
  * enforced separately (runWithWallClock); it is not a ledger-derived cap.
43
43
  */
44
- export declare function evaluateCapsAgainstLedger(ledger: TerminalCostLedger, caps: LabScenarioCaps): {
44
+ export declare function evaluateCapsAgainstLedger(ledger: TerminalCostLedger, caps: StudyScenarioCaps): {
45
45
  ok: true;
46
46
  } | {
47
47
  ok: false;
@@ -2,7 +2,7 @@ import { describeTokenUsage } from "./token-usage.js";
2
2
  import { round6 } from "../../run/pricing.js";
3
3
  import { COST_CATEGORIES } from "../../run/terminal-contract.js";
4
4
  /**
5
- * Build the spend ledger from the captured session. The null discipline (issue #154):
5
+ * Build the spend ledger from the captured session. The null discipline:
6
6
  * - The `provider` line is populated from the actor trace's tokenUsage.costUsd when the trace
7
7
  * carries it (a measured value, incl. a measured 0). When the trace carries no costUsd, the
8
8
  * provider line is `null` = not measured (never guessed to 0 just because no-spend was intended).
@@ -22,24 +22,24 @@ export function buildCostLedger(args) {
22
22
  ? {
23
23
  // Tokens counted, no rate to price them. This stays `usd: null` because a guessed
24
24
  // dollar figure would be worse than none, but the note carries the measured fact so a
25
- // reader never mistakes "no charge recorded" for "nothing was consumed" (#531).
25
+ // reader never mistakes "no charge recorded" for "nothing was consumed".
26
26
  usd: null,
27
27
  source: "unpriced-token-usage",
28
- note: `Provider spend UNPRICED: the run consumed ${describeTokenUsage(args.tokenUsage)}, ` +
29
- "but the terminal participant records the model as `codex` and src/run/pricing.ts carries no " +
30
- "rate for it, so no dollar figure is claimed. Tokens are a MEASURED fact here; the " +
31
- "price is the unknown. Recorded null (never guessed to 0).",
28
+ note: `Provider spend unpriced: the run consumed ${describeTokenUsage(args.tokenUsage)}, ` +
29
+ "but the terminal participant records the model as `codex` and humanish has no rate " +
30
+ "for it, so no dollar figure is given. The token count is measured; the price is " +
31
+ "not known. Recorded as null, never guessed as 0.",
32
32
  }
33
33
  : {
34
34
  usd: null,
35
35
  source: "unmeasured",
36
- note: "Provider spend NOT MEASURED: the actor trace carried no tokenUsage.costUsd this run. Recorded null (not guessed to 0).",
36
+ note: "Provider spend not measured: the actor trace carried no tokenUsage.costUsd in this run, so it is recorded as null and not guessed as 0.",
37
37
  };
38
38
  const unmeasured = (category) => ({
39
39
  usd: null,
40
40
  count: null,
41
41
  source: "unmeasured",
42
- note: `${category} spend NOT MEASURED: core has no ${category}-spend signal for this run; an adapter may supply one through costProbe. Recorded null (never guessed to 0).`,
42
+ note: `${category} spend not measured: humanish has no ${category} spend signal for this run, and an adapter may supply one through costProbe. Recorded as null, never guessed as 0.`,
43
43
  });
44
44
  const lines = {
45
45
  product: args.injectedLines?.product ?? unmeasured("product"),
@@ -99,7 +99,7 @@ export function describeMeasuredSpend(ledger, tokenUsage) {
99
99
  .join(" ");
100
100
  }
101
101
  /** Derive the no-spend proof from the ledger. It vouches for known-zero lines and
102
- * explicitly lists the unmeasured (null) lines it cannot vouch for — never claiming zero on null. */
102
+ * explicitly lists the unmeasured (null) lines it cannot vouch for. It never claims zero on null. */
103
103
  export function buildNoSpendProof(ledger, maxUsd, tokenUsage) {
104
104
  const knownZeroLines = [];
105
105
  const knownNonZeroLines = [];
@@ -115,14 +115,14 @@ export function buildNoSpendProof(ledger, maxUsd, tokenUsage) {
115
115
  }
116
116
  // satisfied only when every known line is within the cap (for a no-spend run, maxUsd 0 => every
117
117
  // known line must be exactly 0). Unmeasured lines never make it satisfied; they are reported
118
- // separately as the proof's honest blind spot.
118
+ // separately as the proof's blind spot.
119
119
  const cap = maxUsd ?? 0;
120
120
  const satisfied = knownNonZeroLines.length === 0 && ledger.knownTotalUsd <= cap;
121
121
  const verdict = !satisfied
122
- ? `No-spend proof NOT satisfied for maxUsd=${cap}: known spend total ${ledger.knownTotalUsd} USD${knownNonZeroLines.length > 0 ? ` (non-zero: ${knownNonZeroLines.join(", ")})` : ""}.`
122
+ ? `No-spend proof not satisfied for maxUsd=${cap}: known spend total ${ledger.knownTotalUsd} USD${knownNonZeroLines.length > 0 ? ` (non-zero: ${knownNonZeroLines.join(", ")})` : ""}.`
123
123
  : noSpendLineMeasured({ knownZeroLines, knownNonZeroLines })
124
124
  ? noSpendNotEstablished(cap)
125
- : `No-spend proof SATISFIED for maxUsd=${cap} on the measured lines (known total ${ledger.knownTotalUsd} USD).`;
125
+ : `No-spend proof satisfied for maxUsd=${cap} on the measured lines (known total ${ledger.knownTotalUsd} USD).`;
126
126
  const statement = [verdict, describeMeasuredSpend(ledger, tokenUsage)]
127
127
  .filter((part) => part.length > 0)
128
128
  .join(" ");
@@ -149,7 +149,7 @@ export function evaluateCapsAgainstLedger(ledger, caps) {
149
149
  const overLines = COST_CATEGORIES.filter((c) => ledger.lines[c].usd !== null && ledger.lines[c].usd > 0);
150
150
  return {
151
151
  ok: false,
152
- message: `Observed KNOWN spend ${ledger.knownTotalUsd} USD exceeds scenario.caps.maxUsd=${caps.maxUsd}${overLines.length > 0 ? ` (non-zero lines: ${overLines.join(", ")})` : ""}. The run fails closed: the cap is a fail-closed mechanism, not an advisory.`,
152
+ message: `Stopped: measured spend ${ledger.knownTotalUsd} USD passed scenario.caps.maxUsd=${caps.maxUsd}${overLines.length > 0 ? ` (non-zero lines: ${overLines.join(", ")})` : ""}. The cap stops the run; it is not a warning.`,
153
153
  };
154
154
  }
155
155
  if (caps.maxJobs !== undefined) {
@@ -162,7 +162,7 @@ export function evaluateCapsAgainstLedger(ledger, caps) {
162
162
  if (knownJobs > caps.maxJobs) {
163
163
  return {
164
164
  ok: false,
165
- message: `Observed KNOWN billable-job count ${knownJobs} exceeds scenario.caps.maxJobs=${caps.maxJobs}. The run fails closed.`,
165
+ message: `Stopped: ${knownJobs} measured billable jobs passed scenario.caps.maxJobs=${caps.maxJobs}.`,
166
166
  };
167
167
  }
168
168
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * The most the sandbox runs before the codex command starts: the Node bootstrap, the runtime
3
- * version check and, when the lab declares `subject.product.install`, the product setup.
3
+ * version check and, when the study declares `subject.product.install`, the product setup.
4
4
  */
5
5
  export declare function terminalPreExecBudgetMs(productInstall: boolean): number;
6
6
  /** The terminal sandbox's server-side timeout for a codex command bounded at `maxMinutes`. */
@@ -7,7 +7,7 @@ import { TERMINAL_RUNTIME_VERSION_TIMEOUT_MS } from "./runtime.js";
7
7
  import { PRODUCT_SETUP_TIMEOUT_MS, TERMINAL_SANDBOX_TIMEOUT_BUFFER_MS } from "./types.js";
8
8
  /**
9
9
  * The most the sandbox runs before the codex command starts: the Node bootstrap, the runtime
10
- * version check and, when the lab declares `subject.product.install`, the product setup.
10
+ * version check and, when the study declares `subject.product.install`, the product setup.
11
11
  */
12
12
  export function terminalPreExecBudgetMs(productInstall) {
13
13
  return (NODE_BOOTSTRAP_TIMEOUT_MS +
@@ -2,7 +2,7 @@ import type { ActorPersonaRef } from "../../actors/contract.js";
2
2
  import type { RunBundle } from "../../run/bundle.js";
3
3
  import type { RunScope } from "../../run/run.js";
4
4
  import type { LiveSandboxInputs, LiveTerminalSandbox } from "./live-sandbox.js";
5
- import type { RunLiveTerminalSessionArgs, TerminalProductLabResult } from "./types.js";
5
+ import type { RunLiveTerminalSessionArgs, TerminalProductStudyResult } from "./types.js";
6
6
  type StartedRun = Extract<Awaited<ReturnType<RunScope["startRun"]>>, {
7
7
  ok: true;
8
8
  }>["run"];
@@ -26,5 +26,5 @@ export interface LiveFinishInputs {
26
26
  /** The session's outcome; a blown cap overrides it. */
27
27
  session: LiveTerminalSandbox;
28
28
  }
29
- export declare function finishLiveTerminalSession(inputs: LiveFinishInputs): Promise<TerminalProductLabResult>;
29
+ export declare function finishLiveTerminalSession(inputs: LiveFinishInputs): Promise<TerminalProductStudyResult>;
30
30
  export {};