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,6 +1,6 @@
1
1
  // The terminal-product route: a real autonomous agent (Codex) studies a CLI or product from its
2
2
  // public surfaces only, inside an E2B shell. The flow:
3
- // 1. admit: planTerminalLab refuses what the plan cannot hold, then a live plan's machine checks
3
+ // 1. admit: planTerminalStudy refuses what the plan cannot hold, then a live plan's machine checks
4
4
  // (checkLiveTerminalMachine) run before any run scope opens, so the CLI can refuse before it
5
5
  // loads a declared scorer;
6
6
  // 2. open the run scope;
@@ -8,7 +8,7 @@
8
8
  // live-sandbox.ts and live-finish.ts); a dry plan publishes its contract bundle (dry-run.ts);
9
9
  // 4. automatic analysis of a run that published its final bundle.
10
10
  //
11
- // The safety contract (`docs/goals/terminal-product-lane/goal.md`) is enforced by construction in
11
+ // The safety contract (`docs/history/goals/terminal-product-lane/goal.md`) is enforced by construction in
12
12
  // the files each item names, and checked by the verifier (verify/actor.ts
13
13
  // validateTerminalProductEvidence):
14
14
  // 1. Explicit key placement. openai-env (default) injects the raw runtime key command-scoped,
@@ -20,7 +20,7 @@
20
20
  // (default/require 0 = no-spend) + maxMinutes (wall-clock kill of the codex command).
21
21
  // Enforced in plan.ts (caps required), live-sandbox.ts and lifetime.ts (the wall clock).
22
22
  // 3. Public surfaces only. The mission references only subject.product.publicSurfaces + the
23
- // author mission. No clone, no private-source access — nothing is git-cloned on this route.
23
+ // author mission. No clone and no private-source access: nothing is git-cloned on this route.
24
24
  // Enforced in session.ts, which composes the prompt.
25
25
  // 4. Deny-by-default credentials. The command envs are built from an allowlist holding only the
26
26
  // declared runtime key; GITHUB_TOKEN/GH_TOKEN/payment/deploy/db/media keys are excluded by
@@ -47,34 +47,34 @@ import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
47
47
  import { completeAutomaticAnalysis } from "../../analysis/automatic-completion.js";
48
48
  import path from "node:path";
49
49
  import { runScope } from "../../run/run.js";
50
- import { planTerminalLab } from "./plan.js";
51
- import { runDryTerminalLab } from "./dry-run.js";
50
+ import { planTerminalStudy } from "./plan.js";
51
+ import { runDryTerminalStudy } from "./dry-run.js";
52
52
  import { checkLiveTerminalMachine, runLiveTerminalSession } from "./session.js";
53
- import { terminalRouteScorer } from "../../lab/adapter-scorer-loader.js";
54
- import { withLateScorer } from "../../lab/route-inputs.js";
55
- import { TERMINAL_PRODUCT_LAB_SCHEMA, } from "./types.js";
53
+ import { terminalRouteScorer } from "../../study/adapter-scorer-loader.js";
54
+ import { withLateScorer } from "../../study/route-inputs.js";
55
+ import {} from "./types.js";
56
+ import { studyResultIdentity } from "../../run/study-result.js";
56
57
  /**
57
58
  * The config-taking entry point. It plans, returns a refusal with the same envelope and analysis
58
59
  * record the route has always returned, and otherwise runs the plan.
59
60
  */
60
- export async function runTerminalProductLab(options) {
61
+ export async function runTerminalProductStudy(options) {
61
62
  const { config, dryRun, ...input } = options;
62
- const planned = planTerminalLab(config, {
63
+ const planned = planTerminalStudy(config, {
63
64
  dryRun,
64
65
  hasCostProbe: input.deps?.costProbe !== undefined,
65
66
  });
66
67
  if (planned.ok)
67
68
  return runTerminalPlan(planned.plan, input);
68
- return terminalLabRefusal(options, planned.refusal);
69
+ return terminalStudyRefusal(options, planned.refusal);
69
70
  }
70
- /** A refused terminal lab's result: the route's envelope, and the analysis record a refusal gets. */
71
- export function terminalLabRefusal(options, refusal) {
71
+ /** A refused terminal study's result: the route's envelope, and the analysis record a refusal gets. */
72
+ export function terminalStudyRefusal(options, refusal) {
72
73
  const { config, dryRun } = options;
73
74
  const refused = {
74
- schema: TERMINAL_PRODUCT_LAB_SCHEMA,
75
+ ...studyResultIdentity("terminal", config.id),
75
76
  ok: false,
76
77
  cwd: path.resolve(options.cwd),
77
- labId: config.id,
78
78
  actor: refusal.actor ?? config.actors[0]?.type ?? "",
79
79
  product: config.subject.product?.name ?? "",
80
80
  dryRun,
@@ -88,7 +88,7 @@ export function terminalLabRefusal(options, refusal) {
88
88
  }
89
89
  /**
90
90
  * Run a terminal plan. The run scope gives a direct library caller the same run lifetime the CLI
91
- * gets: whichever of its fail-closed exits the lab takes, the run it started is closed, and only a
91
+ * gets: whichever of its fail-closed exits the run takes, the run it started is closed, and only a
92
92
  * run that published its final bundle reaches automatic analysis.
93
93
  */
94
94
  export async function runTerminalPlan(plan, input) {
@@ -96,7 +96,7 @@ export async function runTerminalPlan(plan, input) {
96
96
  return admission.ok ? runAdmittedTerminalRun(admission.admitted, input) : admission.result;
97
97
  }
98
98
  /**
99
- * runLab's step for a terminal plan. It runs a live plan's local checks (checkLiveTerminalMachine)
99
+ * runStudyWith's step for a terminal plan. It runs a live plan's local checks (checkLiveTerminalMachine)
100
100
  * before any run scope opens, so the CLI can present their refusal before it loads a declared
101
101
  * scorer, and returns the run that continues from them with that scorer.
102
102
  */
@@ -141,10 +141,9 @@ function completeTerminalAnalysis(plan, input, result, finished) {
141
141
  function terminalFailure(plan, input, warnings) {
142
142
  const cwd = path.resolve(input.cwd);
143
143
  return (code, message) => ({
144
- schema: TERMINAL_PRODUCT_LAB_SCHEMA,
144
+ ...studyResultIdentity("terminal", plan.studyId),
145
145
  ok: false,
146
146
  cwd,
147
- labId: plan.labId,
148
147
  actor: plan.actor,
149
148
  product: plan.product.name,
150
149
  dryRun: plan.dryRun,
@@ -166,5 +165,5 @@ async function runTerminalPlanInScope(admitted, input, scope) {
166
165
  const { plan, runtimeEnv } = admitted;
167
166
  return runLiveTerminalSession({ plan, input, cwd, warnings, failed, scope, runtimeEnv });
168
167
  }
169
- return runDryTerminalLab({ plan: admitted.plan, input, cwd, warnings, failed, scope });
168
+ return runDryTerminalStudy({ plan: admitted.plan, input, cwd, warnings, failed, scope });
170
169
  }
@@ -25,7 +25,7 @@ export declare function teardownSandbox(args: {
25
25
  warnings: string[];
26
26
  }): Promise<TerminalLedgers["cleanup"]>;
27
27
  /**
28
- * Race a commands.run promise against the maxMinutes wall-clock (safety contract item 2). The E2B
28
+ * Race a commands.run promise against the maxMinutes wall-clock. The E2B
29
29
  * commands.run timeoutMs is the primary kill; this injected-clock guard is the belt-and-suspenders
30
30
  * backstop so a mock CLI (which ignores timeoutMs) is still bounded and fails closed in CI.
31
31
  */
@@ -98,7 +98,7 @@ export async function teardownSandbox(args) {
98
98
  }
99
99
  }
100
100
  /**
101
- * Race a commands.run promise against the maxMinutes wall-clock (safety contract item 2). The E2B
101
+ * Race a commands.run promise against the maxMinutes wall-clock. The E2B
102
102
  * commands.run timeoutMs is the primary kill; this injected-clock guard is the belt-and-suspenders
103
103
  * backstop so a mock CLI (which ignores timeoutMs) is still bounded and fails closed in CI.
104
104
  */
@@ -1,4 +1,4 @@
1
- import type { LiveTerminalAuth, LiveTerminalPlan, RunLiveTerminalSessionArgs, TerminalProductLabErrorCode, TerminalProductLabResult, TerminalRunInput } from "./types.js";
1
+ import type { LiveTerminalAuth, LiveTerminalPlan, RunLiveTerminalSessionArgs, TerminalProductStudyErrorCode, TerminalProductStudyResult, TerminalRunInput } from "./types.js";
2
2
  /**
3
3
  * The checks of this machine a live run makes before its run starts: the runtime key and
4
4
  * E2B_API_KEY. They read only the plan and the environment, so the CLI makes them before it loads
@@ -9,17 +9,17 @@ export declare function checkLiveTerminalMachine(plan: LiveTerminalPlan, input:
9
9
  readonly runtimeEnv: LiveTerminalAuth;
10
10
  } | {
11
11
  readonly ok: false;
12
- readonly code: TerminalProductLabErrorCode;
12
+ readonly code: TerminalProductStudyErrorCode;
13
13
  readonly message: string;
14
14
  };
15
15
  /**
16
- * The live in-sandbox agent session orchestrator (mirror of runCuaActorLab's E2B branch). Enforces
16
+ * The live in-sandbox agent session orchestrator (mirror of runCuaActorStudy's E2B branch). Enforces
17
17
  * the 8-point safety contract by construction; fails closed before any sandbox/key/spend on any
18
18
  * precondition miss. Persists the substrate-lifecycle/command-log/interventions/cleanup ledgers,
19
19
  * the redacted terminal event stream + normalized transcript, the agent report, and the
20
20
  * provider-neutral actor trace; tears the sandbox down in a finally and proves the teardown.
21
21
  */
22
- export declare function runLiveTerminalSession(args: RunLiveTerminalSessionArgs): Promise<TerminalProductLabResult>;
23
- /** The default mission when the lab omits one. Public-safe, product-neutral author text. */
22
+ export declare function runLiveTerminalSession(args: RunLiveTerminalSessionArgs): Promise<TerminalProductStudyResult>;
23
+ /** The default mission when the study omits one. Public-safe, product-neutral author text. */
24
24
  export declare function defaultMission(productName: string): string;
25
25
  export declare function makeTerminalRunId(): string;
@@ -1,5 +1,5 @@
1
1
  import { randomBytes, randomUUID } from "node:crypto";
2
- import { missingKeys } from "../../lab/requirements.js";
2
+ import { missingKeys } from "../../study/requirements.js";
3
3
  import { declaredRuntimeProvenance } from "./runtime.js";
4
4
  import { digestText, redactText, scrubLiterals } from "../../evidence/redaction.js";
5
5
  import { describeMissingKeys } from "../../keys/key-resolution.js";
@@ -18,11 +18,11 @@ import { finishLiveTerminalSession } from "./live-finish.js";
18
18
  export function checkLiveTerminalMachine(plan, input, warnings) {
19
19
  const env = input.env ?? process.env;
20
20
  const { maxUsd } = plan.caps;
21
- // planTerminalLab refuses a positive maxUsd without a costProbe, so one is present here.
21
+ // planTerminalStudy refuses a positive maxUsd without a costProbe, so one is present here.
22
22
  if (maxUsd > 0) {
23
23
  warnings.push(`scenario.caps.maxUsd=${maxUsd} is checked after the session against the lines the costProbe measures; lines it leaves null (unmeasured) never trip it. scenario.caps.maxMinutes bounds the run while it runs.`);
24
24
  }
25
- // --- Safety contract item 4: deny-by-default credentials; build the command-scoped allowlist. ---
25
+ // --- Deny-by-default credentials: build the command-scoped allowlist. ---
26
26
  const runtimeEnv = buildRuntimeAuth({ runtimeAuth: plan.runtime.auth, env });
27
27
  if (!runtimeEnv.ok)
28
28
  return runtimeEnv;
@@ -31,14 +31,14 @@ export function checkLiveTerminalMachine(plan, input, warnings) {
31
31
  if (missingKeys(plan.requirements, env).length > 0) {
32
32
  return {
33
33
  ok: false,
34
- code: "HUMANISH_TERMINAL_LAB_KEYS_MISSING",
35
- message: `Live terminal-product labs need E2B_API_KEY in the environment (values are never persisted). ${describeMissingKeys(["E2B_API_KEY"], env)}`,
34
+ code: "HUMANISH_TERMINAL_KEYS_MISSING",
35
+ message: `Live terminal-product studies need E2B_API_KEY in the environment (values are never persisted). ${describeMissingKeys(["E2B_API_KEY"], env)}`,
36
36
  };
37
37
  }
38
38
  return { ok: true, runtimeEnv };
39
39
  }
40
40
  /**
41
- * The live in-sandbox agent session orchestrator (mirror of runCuaActorLab's E2B branch). Enforces
41
+ * The live in-sandbox agent session orchestrator (mirror of runCuaActorStudy's E2B branch). Enforces
42
42
  * the 8-point safety contract by construction; fails closed before any sandbox/key/spend on any
43
43
  * precondition miss. Persists the substrate-lifecycle/command-log/interventions/cleanup ledgers,
44
44
  * the redacted terminal event stream + normalized transcript, the agent report, and the
@@ -61,7 +61,7 @@ export async function runLiveTerminalSession(args) {
61
61
  mintRunId: makeTerminalRunId,
62
62
  // This entry point is the live terminal route; its dry-run sibling is a separate function.
63
63
  mode: "live",
64
- lab: plan.lab,
64
+ study: plan.study,
65
65
  renderReview: renderTerminalReviewMarkdown,
66
66
  observer: { open: input.open === true, render: deps.renderObserver },
67
67
  now,
@@ -86,7 +86,7 @@ export async function runLiveTerminalSession(args) {
86
86
  modelSource,
87
87
  ...(reasoningEffort === undefined ? {} : { reasoningEffort }),
88
88
  });
89
- recorder.recordLifecycle("terminal-lab.run.created", `Created live terminal-product run ${runId} (actor ${actor}, product ${product.name}). Caps: maxUsd=${maxUsd}, maxMinutes=${maxMinutes}. Subject provenance UNPINNED (public surfaces only).`);
89
+ recorder.recordLifecycle("terminal-lab.run.created", `Created live terminal-product run ${runId} (actor ${actor}, product ${product.name}). Caps: maxUsd=${maxUsd}, maxMinutes=${maxMinutes}. Subject provenance: unpinned (public pages only).`);
90
90
  const session = new LiveTerminalSandbox({
91
91
  plan,
92
92
  cwd,
@@ -101,7 +101,7 @@ export async function runLiveTerminalSession(args) {
101
101
  maxMinutes,
102
102
  e2bApiKey,
103
103
  runPaths,
104
- metadata: buildSandboxMetadata({ labId: plan.labId, simId: "sim-001", runId }),
104
+ metadata: buildSandboxMetadata({ studyId: plan.studyId, recordId: "sim-001", runId }),
105
105
  warnings,
106
106
  recorder,
107
107
  });
@@ -146,7 +146,7 @@ export async function runLiveTerminalSession(args) {
146
146
  async function prepareLivePrompt(args) {
147
147
  const { plan, cwd, runtimeEnv, env, warnings } = args;
148
148
  const { product } = plan;
149
- // Compose the prompt from public surfaces and the author mission alone (safety contract item 3).
149
+ // Compose the prompt from public surfaces and the author mission alone.
150
150
  // Inject a per-run verdict nonce: the agent echoes HUMANISH_ACTOR_VERDICT=<status>
151
151
  // HUMANISH_ACTOR_NONCE=<nonce>; the scorer verifies the nonce so replayed text cannot forge it.
152
152
  const mission = plan.mission ?? defaultMission(product.name);
@@ -160,10 +160,10 @@ async function prepareLivePrompt(args) {
160
160
  verdictNonce,
161
161
  });
162
162
  const promptDigest = digestText(composedPrompt);
163
- // --- Safety contract item 5: literal-scrub every known value, then pattern-redact, at the source. ---
163
+ // --- Literal-scrub every known value, then pattern-redact, at the source. ---
164
164
  // The runtime key value (+ any other provisioned value) is scrubbed by literal match before
165
165
  // anything persists (a key has no detectable "shape" if it is an arbitrary token); redactText is
166
- // the second pass for secret-SHAPED content. Applied PRE-truncation so a cut can never split a
166
+ // the second pass for secret-shaped content. Applied pre-truncation so a cut can never split a
167
167
  // value past the scrubber.
168
168
  const knownSecretValues = [runtimeEnv.keyValue, env.E2B_API_KEY?.trim() ?? ""].filter((v) => v.length >= 4);
169
169
  const scrubKnownValues = scrubLiterals(knownSecretValues);
@@ -181,6 +181,7 @@ async function prepareLivePrompt(args) {
181
181
  }
182
182
  /** Compose the live prompt: public surfaces + author mission + the verdict-nonce marker contract. */
183
183
  function composeLivePrompt(args) {
184
+ // prose-check: model prompt (the terminal agent reads this, not a person)
184
185
  return [
185
186
  args.personaLine,
186
187
  `product: ${args.productName}`,
@@ -191,7 +192,7 @@ function composeLivePrompt(args) {
191
192
  `When finished, print exactly one final machine-readable line in this format: HUMANISH_ACTOR_VERDICT=<status> HUMANISH_ACTOR_NONCE=${args.verdictNonce} where <status> is passed, blocked, or failed.`,
192
193
  ].join("\n");
193
194
  }
194
- /** The default mission when the lab omits one. Public-safe, product-neutral author text. */
195
+ /** The default mission when the study omits one. Public-safe, product-neutral author text. */
195
196
  export function defaultMission(productName) {
196
197
  return `You are an autonomous agent. Discover ${productName} from its public surfaces and determine whether it can help with a durable real task. Stay within the declared no-spend caps. Leave feedback if the workflow is confusing.`;
197
198
  }
@@ -3,7 +3,7 @@ import type { ActorTokenUsage } from "../../actors/contract.js";
3
3
  * Accumulate runtime-turn usage from a captured `codex exec --json` stream. A Codex turn may
4
4
  * include multiple provider requests; these records cannot establish per-request pricing tiers.
5
5
  *
6
- * Returns undefined when the stream carried no usage record at all, which is the honest "no
6
+ * Returns undefined when the stream carried no usage record at all, which is the "no
7
7
  * signal" case and must stay distinguishable from a measured zero. Per-turn records are preserved
8
8
  * in `turns` because long-context pricing can only be computed from per-request sizes
9
9
  * (src/run/pricing.ts), and totals cannot say which requests crossed a threshold.
@@ -1,10 +1,9 @@
1
- // Provider token accounting for the terminal route (#531).
1
+ // Provider token accounting for the terminal route.
2
2
  //
3
- // The gap this closes: a live terminal run reported `cost.lines.provider = null` with source
4
- // "unmeasured", and the no-spend proof then read `satisfied: true` for `maxUsd: 0` on a run that
5
- // had demonstrably consumed hundreds of thousands of provider tokens. The statement was honest
6
- // (it listed provider as unmeasured) but it conflated two very different states: having no signal
7
- // at all, and knowing exactly how many tokens were spent while lacking a rate to price them.
3
+ // Without these counts, a provider line of `null` with source "unmeasured" would let the no-spend
4
+ // proof read `satisfied: true` for `maxUsd: 0` on a run that consumed hundreds of thousands of
5
+ // provider tokens, conflating two different states: having no signal at all, and knowing exactly
6
+ // how many tokens were spent while lacking a rate to price them.
8
7
  //
9
8
  // The counts were already in the bundle. `codex exec --json` emits one usage record per turn:
10
9
  // {"type":"turn.completed","usage":{"input_tokens":201536,"cached_input_tokens":170558,
@@ -12,7 +11,7 @@
12
11
  //
13
12
  // So the route can record a measured token fact even when it cannot record a priced one. Rates stay
14
13
  // out of this module deliberately: pricing lives in src/run/pricing.ts, and the terminal route has no
15
- // real model id to price against (it records `model: "codex"`), so the honest output is
14
+ // real model id to price against (it records `model: "codex"`), so the output is
16
15
  // tokens-known-rate-unknown rather than a guessed dollar figure.
17
16
  // Bounded to a single line on purpose. `[^}]*` would run past a truncated record's missing brace
18
17
  // and swallow the next, valid record's body, silently dropping a real turn from the count.
@@ -24,7 +23,7 @@ function num(value) {
24
23
  * Accumulate runtime-turn usage from a captured `codex exec --json` stream. A Codex turn may
25
24
  * include multiple provider requests; these records cannot establish per-request pricing tiers.
26
25
  *
27
- * Returns undefined when the stream carried no usage record at all, which is the honest "no
26
+ * Returns undefined when the stream carried no usage record at all, which is the "no
28
27
  * signal" case and must stay distinguishable from a measured zero. Per-turn records are preserved
29
28
  * in `turns` because long-context pricing can only be computed from per-request sizes
30
29
  * (src/run/pricing.ts), and totals cannot say which requests crossed a threshold.
@@ -1,5 +1,5 @@
1
1
  import type { ActorCompletionReason, ActorPersonaRef, ActorRuntimeProvenance, ActorStatus, ActorTokenUsage, ActorTrace } from "../../actors/contract.js";
2
- import type { LabRuntimeAuth } from "../../lab/types.js";
2
+ import type { StudyRuntimeAuth } from "../../study/types.js";
3
3
  import type { TerminalParticipantText } from "./participant-text.js";
4
4
  import { type CommandLogRecord, type TerminalEventRecord } from "./types.js";
5
5
  /**
@@ -12,7 +12,7 @@ export declare function scrubSplitKnownValues(events: TerminalEventRecord[], kno
12
12
  export declare function tailOf(text: string): string;
13
13
  /**
14
14
  * Project the live terminal session into the provider-neutral humanish.actor-trace.v1 (`lane`
15
- * "terminal", protocol "terminal-exec"). counts.actions/messages drive the no-engagement honesty
15
+ * "terminal", protocol "terminal-exec"). counts.actions/messages drive the no-engagement
16
16
  * guard (a real run bumps them; a no-op is caught). No screenshots on this route.
17
17
  */
18
18
  export declare function buildTerminalActorTrace(args: {
@@ -27,9 +27,9 @@ export declare function buildTerminalActorTrace(args: {
27
27
  terminalEvents: TerminalEventRecord[];
28
28
  commandLog: CommandLogRecord[];
29
29
  transcriptTail: string;
30
- runtimeAuth: LabRuntimeAuth;
30
+ runtimeAuth: StudyRuntimeAuth;
31
31
  runtime: ActorRuntimeProvenance;
32
- /** Runtime-turn aggregate usage parsed from the exec stream (#531). Absent when the stream
32
+ /** Runtime-turn aggregate usage parsed from the exec stream. Absent when the stream
33
33
  * carried no usage record, which stays distinct from a measured zero. */
34
34
  tokenUsage?: ActorTokenUsage;
35
35
  /** The agent's own text and activity, read from the raw stdout as it arrived. */
@@ -57,7 +57,7 @@ export function tailOf(text) {
57
57
  }
58
58
  /**
59
59
  * Project the live terminal session into the provider-neutral humanish.actor-trace.v1 (`lane`
60
- * "terminal", protocol "terminal-exec"). counts.actions/messages drive the no-engagement honesty
60
+ * "terminal", protocol "terminal-exec"). counts.actions/messages drive the no-engagement
61
61
  * guard (a real run bumps them; a no-op is caught). No screenshots on this route.
62
62
  */
63
63
  export function buildTerminalActorTrace(args) {
@@ -88,7 +88,7 @@ export function buildTerminalActorTrace(args) {
88
88
  redaction: {
89
89
  status: "passed",
90
90
  screenshots: "n/a",
91
- notes: "Terminal exec output captured via commands.run onStdout/onStderr, scrubbed (literal known values) then redacted (shape patterns) AT THE SOURCE before persisting; no screenshots on this lane.",
91
+ notes: "Terminal output captured through commands.run onStdout and onStderr; known values are scrubbed and shape patterns redacted before anything is stored. This route takes no screenshots.",
92
92
  },
93
93
  startedAt: args.createdAt,
94
94
  completedAt: args.completedAt,
@@ -1,16 +1,17 @@
1
- import type { LabEvent } from "../../lab/run-lab-events.js";
1
+ import type { StudyEvent } from "../../study/run-study-events.js";
2
2
  import { type AutomaticAnalysisResult } from "../../analysis/automatic-completion.js";
3
3
  import type { ActorCompletionReason, ActorRuntimeProvenance, ActorStatus, ActorTrace } from "../../actors/contract.js";
4
4
  import type { CostCategory } from "../../run/terminal-contract.js";
5
5
  import type { RunScope } from "../../run/run.js";
6
6
  import type { buildRuntimeAuth } from "./credentials.js";
7
- import type { TerminalPlan } from "../../lab/plan-types.js";
8
- import type { LabDeps } from "../../lab/lab-deps.js";
9
- import type { LabConfig } from "../../lab/types.js";
7
+ import type { TerminalPlan } from "../../study/plan-types.js";
8
+ import type { StudyDeps } from "../../study/study-deps.js";
9
+ import type { StudyConfig } from "../../study/types.js";
10
10
  import type { ObserverResult } from "../../observer/render.js";
11
11
  import { type RunAdapterScore, type RunBundle, type RunFeedbackCandidate, type RunScorerProvenance } from "../../run/bundle.js";
12
- /** Provider-neutral metadata constant: the route's non-secret tag (mirrors CUA_ACTOR_LAB_PROVIDER_METADATA). */
13
- export declare const TERMINAL_PRODUCT_LAB_PROVIDER_METADATA: {
12
+ import { type StudyResultIdentity } from "../../run/study-result.js";
13
+ /** Provider-neutral metadata constant: the route's non-secret tag (mirrors CUA_ACTOR_STUDY_PROVIDER_METADATA). */
14
+ export declare const TERMINAL_PRODUCT_STUDY_PROVIDER_METADATA: {
14
15
  readonly mode: "terminal-product-lab";
15
16
  readonly tool: "humanish";
16
17
  };
@@ -22,7 +23,7 @@ export declare const UPLOAD_MAX_BYTES: number;
22
23
  /**
23
24
  * Server-side reclamation buffer past the codex command's own wall-clock (caps.maxMinutes) kill.
24
25
  * Shorter than the desktop routes' SANDBOX_TIMEOUT_BUFFER_MS (src/substrates/e2b/lifetime.ts):
25
- * when #158 set it, the terminal sandbox ran nothing but the codex command, and after its kill only
26
+ * when this buffer was set, the terminal sandbox ran nothing but the codex command, and after its kill only
26
27
  * teardown remained.
27
28
  */
28
29
  export declare const TERMINAL_SANDBOX_TIMEOUT_BUFFER_MS: number;
@@ -34,13 +35,12 @@ export declare const TEXT_ITEMS_MAX = 200;
34
35
  export declare const TEXT_ITEMS_BYTES: number;
35
36
  export declare const PENDING_LINE_CHARS: number;
36
37
  export declare const MAX_TRANSCRIPT_BYTES: number;
37
- export declare const TERMINAL_PRODUCT_LAB_SCHEMA = "humanish.terminal-lab-result.v1";
38
38
  /**
39
- * The read-only evidence a thin adapter's scorer/feedback hook sees (the layer-6 extension seam,
40
- * issue #154 acceptance #8). It is the FULLY-ASSEMBLED, redacted, verifiable evidence — the live run
39
+ * The read-only evidence a thin adapter's scorer/feedback hook sees (the adapter extension seam).
40
+ * It is the fully assembled, redacted, verifiable evidence: the live run
41
41
  * bundle, the provider-neutral actor trace, and the persisted ledgers (substrate/command/
42
42
  * interventions/cleanup/cost/no-spend). Every member is an exported public type, so a thin adapter
43
- * types against `import("humanish")` alone — never a deep `src/` import. The adapter reads this
43
+ * types against `import("humanish")` alone and never needs a deep `src/` import. The adapter reads this
44
44
  * to score the product attempt and derive feedback; it cannot mutate core's evidence (the route
45
45
  * attaches only the namespaced `RunAdapterScore` it returns + the feedback candidates it derives).
46
46
  */
@@ -56,30 +56,30 @@ export interface TerminalProductScoringContext {
56
56
  * values) then redacted (shape patterns) at the source, capped at MAX_TRANSCRIPT_BYTES, and
57
57
  * byte-identical to the persisted terminal-transcript.txt artifact. The trace's transcriptTail
58
58
  * is a ~2KB projection of this; a scorer needs the whole session so a rubric can find
59
- * command-tier evidence anywhere in it, not only in the tail window (#341).
59
+ * command-tier evidence anywhere in it.
60
60
  */
61
61
  transcript: string;
62
62
  /** The studied product name (public-safe). */
63
63
  product: string;
64
- /** The lab id (the run's scenario scope). */
65
- labId: string;
64
+ /** The study id (the run's scenario scope). */
65
+ studyId: string;
66
66
  /** The run id (for building namespaced idempotency keys + evidence pointers). */
67
67
  runId: string;
68
68
  }
69
69
  /**
70
70
  * Known spend lines for the terminal cost ledger. Core has no product, media or payment spend
71
71
  * signal, so it fills only the provider line from trace tokenUsage when present. A test injects
72
- * known lines through `LabDeps.costProbe`; absent signals keep the null-discipline default.
72
+ * known lines through `StudyDeps.costProbe`; absent signals keep the null-discipline default.
73
73
  */
74
74
  export type TerminalCostProbe = (context: {
75
75
  tokenCostUsd?: number;
76
76
  }) => Partial<Record<"product" | "media" | "payment" | "provider", CostLine>> | undefined;
77
- /** The scorer functions a terminal run calls: `RunLabOptions.scorer` without `deriveArtifacts`. */
77
+ /** The scorer functions a terminal run calls: `RunStudyOptions.scorer` without `deriveArtifacts`. */
78
78
  export interface TerminalScorer {
79
79
  /**
80
- * The layer-6 extension seam (issue #154 acceptance #8: "product-adapter hooks without forking
81
- * core"). A thin in-repo/out-of-tree adapter registers a product scorer here. The route calls it
82
- * (when provided) over the fully-assembled evidence and attaches the returned, ADAPTER-NAMESPACED
80
+ * The adapter extension seam: product-adapter hooks without forking
81
+ * core. A thin in-repo/out-of-tree adapter registers a product scorer here. The route calls it
82
+ * (when provided) over the fully-assembled evidence and attaches the returned, adapter-namespaced
83
83
  * `RunAdapterScore` to `bundle.adapterScore` without core knowing any product noun (the score is
84
84
  * namespaced + its component breakdown rides in `data`). When no scorer is given, the default
85
85
  * mission-based verdict (`review`) is unchanged. The adopter's scorecard plugs in here; product
@@ -90,20 +90,20 @@ export interface TerminalScorer {
90
90
  * Companion seam: derive product-feedback candidates from the same assembled evidence. The route
91
91
  * appends the returned candidates to `bundle.feedbackCandidates`. The adapter records its
92
92
  * product-specific concepts (public CLI command observed, hosted success-or-blocker, feedback id,
93
- * media/job ids, no-spend proof, defection/friction risk) under each candidate's ADAPTER-NAMESPACED
94
- * `adapter` block — never as core enums (issue #154's "record product-specific concepts as
95
- * NON-core nouns" list). The candidates must still satisfy core's feedback-candidate shape (which
93
+ * media/job ids, no-spend proof, defection/friction risk) under each candidate's adapter-namespaced
94
+ * `adapter` block and never as core enums.
95
+ * The candidates must still satisfy core's feedback-candidate shape (which
96
96
  * the bundle verifier enforces), so a malformed adapter candidate fails closed.
97
97
  */
98
98
  deriveFeedback?: (ctx: TerminalProductScoringContext) => RunFeedbackCandidate[] | Promise<RunFeedbackCandidate[]>;
99
99
  }
100
- export interface RunTerminalProductLabOptions {
100
+ export interface RunTerminalProductStudyOptions {
101
101
  /** Cancels post-run analysis only. */
102
102
  analysisSignal?: AbortSignal;
103
- /** Reports the analysis window to onEvent; built by normalizeRunLabOptions. */
104
- emit?: (event: LabEvent) => void;
103
+ /** Reports the analysis window to onEvent; built by normalizeRunStudyOptions. */
104
+ emit?: (event: StudyEvent) => void;
105
105
  cwd: string;
106
- config: LabConfig;
106
+ config: StudyConfig;
107
107
  /** Resolved upstream (scenario.mode + CLI override); defaults safe (dry-run). */
108
108
  dryRun: boolean;
109
109
  open?: boolean;
@@ -117,9 +117,9 @@ export interface RunTerminalProductLabOptions {
117
117
  env?: Readonly<Record<string, string | undefined>>;
118
118
  scorer?: TerminalScorer;
119
119
  /** Test seams: the E2B module, the Observer renderer, the clock and the cost probe. */
120
- deps?: LabDeps;
120
+ deps?: StudyDeps;
121
121
  /**
122
- * Present only when the scorer was config-declared and loaded by the CLI (#316). Its presence
122
+ * Present only when the scorer was config-declared and loaded by the CLI. Its presence
123
123
  * is the "declared" marker: a config-declared terminal scorer returning status:"fail" flips
124
124
  * bundle.review.verdict (like the browser routes), and one that throws becomes a visible review.gaps
125
125
  * entry. A library caller passing `scorer` leaves this absent and keeps today's purely
@@ -127,14 +127,12 @@ export interface RunTerminalProductLabOptions {
127
127
  */
128
128
  scorerProvenance?: RunScorerProvenance;
129
129
  }
130
- export interface TerminalProductLabResult extends AutomaticAnalysisResult {
131
- schema: typeof TERMINAL_PRODUCT_LAB_SCHEMA;
130
+ export interface TerminalProductStudyResult extends AutomaticAnalysisResult, StudyResultIdentity<"terminal"> {
132
131
  /** True when the bundle verified and (dry-run, or the live session reached a terminal verdict
133
132
  * without a harness error + cleanup was proven). The agent's pass/fail is evidence, not the
134
- * lab's exit code. */
133
+ * run's exit code. */
135
134
  ok: boolean;
136
135
  cwd: string;
137
- labId: string;
138
136
  /** The registry-resolved actor id that ran (or would run) the session. */
139
137
  actor: string;
140
138
  /** The studied product name (public-safe). */
@@ -151,11 +149,11 @@ export interface TerminalProductLabResult extends AutomaticAnalysisResult {
151
149
  sandbox?: {
152
150
  sandboxId: string;
153
151
  killed: boolean;
154
- /** BY-ID proof (never a re-list): 0 = confirmed reclaimed, 1 = still present (unconfirmed),
152
+ /** By-id proof (never a re-list): 0 = confirmed reclaimed, 1 = still present (unconfirmed),
155
153
  * -1 = kill(id) itself failed or was unavailable. See TerminalLedgers["cleanup"]. */
156
154
  remaining: number;
157
155
  };
158
- /** Live-only: the spend ledger surfaced on the result — unknowns are null, never guessed.
156
+ /** Live-only: the spend ledger surfaced on the result. Unknowns are null, never guessed.
159
157
  * Lets a programmatic caller read spend without parsing the bundle. */
160
158
  cost?: {
161
159
  knownTotalUsd: number;
@@ -173,7 +171,7 @@ export interface TerminalProductLabResult extends AutomaticAnalysisResult {
173
171
  observer?: ObserverResult;
174
172
  warnings: string[];
175
173
  error?: {
176
- code: "HUMANISH_LAB_ANALYSIS_INVALID" | "HUMANISH_LAB_TASKS_UNSUPPORTED" | "HUMANISH_LAB_OPTION_UNSUPPORTED" | "HUMANISH_TERMINAL_LAB_FAILED" | "HUMANISH_TERMINAL_LAB_ACTOR_UNSUPPORTED" | "HUMANISH_TERMINAL_LAB_SUBJECT_INVALID" | "HUMANISH_TERMINAL_LAB_KEYPLACEMENT_INVALID" | "HUMANISH_TERMINAL_LAB_RUNTIME_AUTH_MISSING" | "HUMANISH_TERMINAL_LAB_KEYS_MISSING" | "HUMANISH_TERMINAL_LAB_CAPS_MISSING" | "HUMANISH_TERMINAL_LAB_CAPS_INVALID" | "HUMANISH_TERMINAL_LAB_UNPRICED_CAP" | "HUMANISH_TERMINAL_LAB_CAPS_EXCEEDED" | "HUMANISH_TERMINAL_LAB_CREDENTIAL_DENIED" | "HUMANISH_TERMINAL_LAB_CLEANUP_UNPROVEN" | "HUMANISH_RUN_ID_IN_USE";
174
+ code: "HUMANISH_STUDY_ANALYSIS_INVALID" | "HUMANISH_STUDY_TASKS_UNSUPPORTED" | "HUMANISH_STUDY_OPTION_UNSUPPORTED" | "HUMANISH_STUDY_V2_UNSUPPORTED" | "HUMANISH_TERMINAL_FAILED" | "HUMANISH_TERMINAL_ACTOR_UNSUPPORTED" | "HUMANISH_TERMINAL_SUBJECT_INVALID" | "HUMANISH_TERMINAL_KEYPLACEMENT_INVALID" | "HUMANISH_TERMINAL_RUNTIME_AUTH_MISSING" | "HUMANISH_TERMINAL_KEYS_MISSING" | "HUMANISH_TERMINAL_CAPS_MISSING" | "HUMANISH_TERMINAL_CAPS_INVALID" | "HUMANISH_TERMINAL_UNPRICED_CAP" | "HUMANISH_TERMINAL_CAPS_EXCEEDED" | "HUMANISH_TERMINAL_CREDENTIAL_DENIED" | "HUMANISH_TERMINAL_CLEANUP_UNPROVEN" | "HUMANISH_RUN_ID_IN_USE";
177
175
  message: string;
178
176
  };
179
177
  }
@@ -189,7 +187,7 @@ export interface CommandLogRecord {
189
187
  at: string;
190
188
  /** A public-safe label for the command (e.g. "codex-exec"); the full argv is bound by digest only. */
191
189
  label: string;
192
- /** sha256-12 of the exact command string — pins "same recipe" without persisting it. */
190
+ /** sha256-12 of the exact command string. It pins "same recipe" without persisting it. */
193
191
  commandDigest: string;
194
192
  /** The env var names injected command-scoped (values never persisted): the credential evidence. */
195
193
  envNames: string[];
@@ -216,7 +214,7 @@ export interface InterventionRecord {
216
214
  inputDigest: string;
217
215
  }
218
216
  /**
219
- * One cost line of the spend ledger. The null discipline (issue #154, the cost/no-spend asks):
217
+ * One cost line of the spend ledger. The null discipline:
220
218
  * three distinct states are kept apart:
221
219
  * - `usd: 0` => known to be zero. A measured-and-zero spend (we metered this category and it
222
220
  * billed nothing). The no-spend proof may legitimately assert this is zero.
@@ -226,7 +224,7 @@ export interface InterventionRecord {
226
224
  * - line absent => not applicable to this route/run (n/a). The line simply does not appear in
227
225
  * `lines`. (The current route emits all four lines, so absence is reserved for
228
226
  * future routes that genuinely have no such category.)
229
- * `null` vs missing-key is the load-bearing distinction: a missing key means "this category does not
227
+ * `null` vs missing-key is the distinction that matters: a missing key means "this category does not
230
228
  * exist for this run"; a present key with `null` means "this category exists but we did not measure
231
229
  * it". A no-spend proof that claimed zero on a `null` line would claim more than it measured.
232
230
  */
@@ -238,7 +236,7 @@ export interface CostLine {
238
236
  /** How this line's value was established (provenance for the verifier + the human reviewer). */
239
237
  source: "provider-token-usage" | "no-spend-signal" | "operator-cap" | "unmeasured"
240
238
  /** Tokens were counted but no rate could price them, so `usd` stays null while the note
241
- * carries the measured token totals (#531). Distinct from "unmeasured", which means no
239
+ * carries the measured token totals. Distinct from "unmeasured", which means no
242
240
  * signal at all. */
243
241
  | "unpriced-token-usage";
244
242
  /** A short, public-safe note (never a secret value). */
@@ -260,8 +258,8 @@ export interface TerminalCostLedger {
260
258
  fullyMeasured: boolean;
261
259
  }
262
260
  /**
263
- * The no-spend proof, derived from the cost ledger (issue #154: "derived from a ledger, not
264
- * asserted"). It lists the known-zero lines it can vouch for and, separately, the unmeasured
261
+ * The no-spend proof, derived from the cost ledger.
262
+ * It lists the known-zero lines it can vouch for and, separately, the unmeasured
265
263
  * (null) lines it cannot vouch for. `satisfied` is true only when every known line is zero (a
266
264
  * known non-zero line fails it). A proof with unmeasured lines says it could not measure them;
267
265
  * it never claims zero on a line the ledger marks null.
@@ -274,14 +272,14 @@ export interface NoSpendProof {
274
272
  satisfied: boolean;
275
273
  /** Categories the ledger measured and found at (known) zero: the proof can vouch for these. */
276
274
  knownZeroLines: CostCategory[];
277
- /** Categories the ledger measured with a known NON-zero spend (these break `satisfied`). */
275
+ /** Categories the ledger measured with a known non-zero spend (these break `satisfied`). */
278
276
  knownNonZeroLines: CostCategory[];
279
277
  /** Categories the ledger marks `null` (not measured). The proof lists these and does not claim
280
278
  * they are zero; it claims only that this run could not measure them. */
281
279
  unmeasuredLines: CostCategory[];
282
280
  /** Sum of the known lines (== 0 for a satisfied no-spend run). */
283
281
  knownTotalUsd: number;
284
- /** Human-readable honesty statement covering both what is proven and what is unmeasured. */
282
+ /** Human-readable statement covering both what is proven and what is unmeasured. */
285
283
  statement: string;
286
284
  }
287
285
  /** The persisted terminal-product ledgers artifact (substrate lifecycle + command log + interventions + cleanup + cost). */
@@ -302,7 +300,7 @@ export interface TerminalLedgers {
302
300
  * this exact sandbox running/paused (still present); -1 = kill(id) itself failed, threw, or
303
301
  * was unavailable (the server-side kill-on-timeout is the backstop). */
304
302
  remaining: number;
305
- /** Honest, human-readable statement of which by-id signal produced `remaining`. */
303
+ /** Human-readable statement of which by-id signal produced `remaining`. */
306
304
  reason: string;
307
305
  };
308
306
  /** The spend ledger. Unknowns are `null`, never guessed; the no-spend proof
@@ -311,13 +309,13 @@ export interface TerminalLedgers {
311
309
  /** The no-spend proof derived from `cost`. Never an independent assertion. */
312
310
  noSpendProof: NoSpendProof;
313
311
  }
314
- /** What a terminal run takes besides its plan. The plan carries the config, dry run and lab. */
315
- export type TerminalRunInput = Omit<RunTerminalProductLabOptions, "config" | "dryRun" | "lab">;
316
- /** A live terminal plan: its caps are the fail-closed ones planTerminalLab required. */
312
+ /** What a terminal run takes besides its plan. The plan carries the config, dry run and study. */
313
+ export type TerminalRunInput = Omit<RunTerminalProductStudyOptions, "config" | "dryRun">;
314
+ /** A live terminal plan: its caps are the fail-closed ones planTerminalStudy required. */
317
315
  export type LiveTerminalPlan = Extract<TerminalPlan, {
318
316
  readonly dryRun: false;
319
317
  }>;
320
- export type TerminalProductLabErrorCode = NonNullable<TerminalProductLabResult["error"]>["code"];
318
+ export type TerminalProductStudyErrorCode = NonNullable<TerminalProductStudyResult["error"]>["code"];
321
319
  /** The runtime key's command-scoped placement, built by a live run's checks of this machine. */
322
320
  export type LiveTerminalAuth = Extract<ReturnType<typeof buildRuntimeAuth>, {
323
321
  ok: true;
@@ -327,8 +325,8 @@ export interface RunLiveTerminalSessionArgs {
327
325
  input: TerminalRunInput;
328
326
  cwd: string;
329
327
  warnings: string[];
330
- failed: (code: TerminalProductLabErrorCode, message: string) => TerminalProductLabResult;
331
- /** The lab's run scope; the live session starts its run in it. */
328
+ failed: (code: TerminalProductStudyErrorCode, message: string) => TerminalProductStudyResult;
329
+ /** The study's run scope; the live session starts its run in it. */
332
330
  scope: RunScope;
333
331
  runtimeEnv: LiveTerminalAuth;
334
332
  }