humanish 0.106.1 → 0.108.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (668) hide show
  1. package/ARCHITECTURE.md +38 -32
  2. package/CHANGELOG.md +28 -0
  3. package/CONTEXT.md +51 -41
  4. package/README.md +152 -174
  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-client.js +2 -1
  14. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  15. package/dist/actors/codex/app-server-trace.js +1 -3
  16. package/dist/actors/codex/app-server-ui.js +1 -1
  17. package/dist/actors/codex/app-server.js +2 -1
  18. package/dist/actors/codex/codex-admission.d.ts +91 -0
  19. package/dist/actors/codex/codex-admission.js +150 -0
  20. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  21. package/dist/actors/codex/protocol-compat.js +357 -0
  22. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  23. package/dist/actors/codex/protocol-contract.js +471 -0
  24. package/dist/actors/codex/restricted-executable.d.ts +28 -4
  25. package/dist/actors/codex/restricted-executable.js +104 -29
  26. package/dist/actors/codex/restricted-launch.d.ts +9 -2
  27. package/dist/actors/codex/restricted-launch.js +43 -4
  28. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  29. package/dist/actors/codex/restricted-notifications.js +277 -0
  30. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  31. package/dist/actors/codex/restricted-participant.js +66 -6
  32. package/dist/actors/codex/restricted-policy.d.ts +11 -3
  33. package/dist/actors/codex/restricted-policy.js +2 -2
  34. package/dist/actors/codex/restricted-session.d.ts +16 -3
  35. package/dist/actors/codex/restricted-session.js +60 -22
  36. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  37. package/dist/actors/codex/restricted-transport.js +139 -27
  38. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  39. package/dist/actors/codex/restricted-turn.js +43 -30
  40. package/dist/actors/computer-use/actor.d.ts +17 -17
  41. package/dist/actors/computer-use/actor.js +6 -6
  42. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  43. package/dist/actors/computer-use/admission-limit.js +1 -1
  44. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  45. package/dist/actors/computer-use/loop/actions.js +10 -10
  46. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  47. package/dist/actors/computer-use/loop/backstop.js +15 -13
  48. package/dist/actors/computer-use/loop/ending.d.ts +7 -7
  49. package/dist/actors/computer-use/loop/ending.js +9 -9
  50. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  51. package/dist/actors/computer-use/loop/observation.js +9 -9
  52. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  53. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  54. package/dist/actors/computer-use/loop/session.js +3 -3
  55. package/dist/actors/computer-use/loop/spend.d.ts +2 -2
  56. package/dist/actors/computer-use/loop/spend.js +4 -4
  57. package/dist/actors/computer-use/loop/trace.js +11 -10
  58. package/dist/actors/computer-use/loop/types.d.ts +37 -26
  59. package/dist/actors/computer-use/loop/usage.js +2 -2
  60. package/dist/actors/computer-use/loop.js +4 -4
  61. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  62. package/dist/actors/computer-use/openai-context.js +214 -0
  63. package/dist/actors/computer-use/openai-provider.d.ts +12 -9
  64. package/dist/actors/computer-use/openai-provider.js +47 -36
  65. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  66. package/dist/actors/computer-use/openai-requests.js +82 -15
  67. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  68. package/dist/actors/computer-use/openai-wire.js +36 -34
  69. package/dist/actors/contract.d.ts +86 -49
  70. package/dist/actors/contract.js +29 -23
  71. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  72. package/dist/actors/local-agent/claude-session.js +10 -9
  73. package/dist/actors/local-agent/cli.d.ts +8 -6
  74. package/dist/actors/local-agent/cli.js +24 -28
  75. package/dist/actors/local-agent/readiness.d.ts +2 -2
  76. package/dist/actors/local-agent/readiness.js +4 -4
  77. package/dist/actors/reasoning-effort.js +6 -6
  78. package/dist/actors/registry.d.ts +10 -10
  79. package/dist/actors/registry.js +18 -17
  80. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  81. package/dist/actors/scripted-browser/actor.js +16 -16
  82. package/dist/actors/scripted-browser/browser-command.js +1 -1
  83. package/dist/actors/scripted-browser/journey.js +15 -4
  84. package/dist/actors/scripted-browser/steps.js +19 -1
  85. package/dist/actors/scripted-browser/types.d.ts +12 -2
  86. package/dist/actors/stop-conditions.d.ts +1 -1
  87. package/dist/actors/stop-conditions.js +1 -3
  88. package/dist/analysis/automatic-completion.d.ts +13 -8
  89. package/dist/analysis/automatic-completion.js +14 -8
  90. package/dist/analysis/automatic-config.d.ts +1 -1
  91. package/dist/analysis/automatic-config.js +2 -2
  92. package/dist/analysis/automatic.d.ts +10 -4
  93. package/dist/analysis/automatic.js +17 -13
  94. package/dist/analysis/codex-config.d.ts +6 -2
  95. package/dist/analysis/codex-config.js +22 -14
  96. package/dist/analysis/diagnostics.d.ts +23 -0
  97. package/dist/analysis/diagnostics.js +112 -0
  98. package/dist/analysis/evidence-sources.js +2 -2
  99. package/dist/analysis/evidence.js +6 -6
  100. package/dist/analysis/execute.d.ts +7 -1
  101. package/dist/analysis/execute.js +39 -12
  102. package/dist/analysis/job.d.ts +8 -5
  103. package/dist/analysis/job.js +15 -14
  104. package/dist/analysis/load.d.ts +1 -1
  105. package/dist/analysis/load.js +5 -5
  106. package/dist/analysis/provider.d.ts +9 -1
  107. package/dist/analysis/restricted-codex.d.ts +2 -0
  108. package/dist/analysis/restricted-codex.js +10 -1
  109. package/dist/analysis/service.d.ts +2 -0
  110. package/dist/analysis/service.js +35 -16
  111. package/dist/analysis/sharing.d.ts +2 -2
  112. package/dist/analysis/sharing.js +5 -5
  113. package/dist/analysis/store-executions.d.ts +5 -5
  114. package/dist/analysis/store-executions.js +12 -12
  115. package/dist/analysis/store.d.ts +4 -4
  116. package/dist/analysis/store.js +13 -13
  117. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  118. package/dist/cli/commands/analysis-signals.js +4 -1
  119. package/dist/cli/commands/analyze.js +23 -18
  120. package/dist/cli/commands/codex.js +9 -9
  121. package/dist/cli/commands/comms.js +62 -34
  122. package/dist/cli/commands/feedback.js +20 -21
  123. package/dist/cli/commands/lab-format.d.ts +5 -4
  124. package/dist/cli/commands/lab-format.js +35 -23
  125. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  126. package/dist/cli/commands/lab-route-computer-use.js +32 -21
  127. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  128. package/dist/cli/commands/lab-route-preview.js +7 -7
  129. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  130. package/dist/cli/commands/lab-route-run.js +6 -2
  131. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  132. package/dist/cli/commands/lab-route-scripted.js +0 -1
  133. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  134. package/dist/cli/commands/lab-route-shared-world.js +3 -4
  135. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  136. package/dist/cli/commands/lab-route-terminal.js +0 -1
  137. package/dist/cli/commands/lab-run.js +84 -54
  138. package/dist/cli/commands/lab-scorer.d.ts +2 -4
  139. package/dist/cli/commands/lab-scorer.js +1 -1
  140. package/dist/cli/commands/migrate.d.ts +4 -0
  141. package/dist/cli/commands/migrate.js +65 -0
  142. package/dist/cli/commands/observe.js +168 -107
  143. package/dist/cli/commands/run-command.d.ts +10 -0
  144. package/dist/cli/commands/run-command.js +85 -0
  145. package/dist/cli/commands/run-signals.d.ts +30 -0
  146. package/dist/cli/commands/run-signals.js +146 -0
  147. package/dist/cli/commands/runs.js +137 -136
  148. package/dist/cli/commands/setup.d.ts +2 -2
  149. package/dist/cli/commands/setup.js +26 -21
  150. package/dist/cli/commands/study.d.ts +3 -0
  151. package/dist/cli/commands/study.js +182 -0
  152. package/dist/cli/commands/tui.d.ts +4 -4
  153. package/dist/cli/commands/tui.js +21 -21
  154. package/dist/cli/commands/watch.js +64 -77
  155. package/dist/cli/deprecations.d.ts +18 -0
  156. package/dist/cli/deprecations.js +48 -0
  157. package/dist/cli/doctor.d.ts +18 -5
  158. package/dist/cli/doctor.js +111 -48
  159. package/dist/cli/first-run-path.d.ts +12 -10
  160. package/dist/cli/first-run-path.js +30 -28
  161. package/dist/cli/io.d.ts +46 -10
  162. package/dist/cli/io.js +109 -30
  163. package/dist/cli/observer-follow.d.ts +2 -2
  164. package/dist/cli/observer-follow.js +5 -6
  165. package/dist/cli/orientation.d.ts +6 -3
  166. package/dist/cli/orientation.js +43 -39
  167. package/dist/cli/product-sentence.d.ts +6 -0
  168. package/dist/cli/product-sentence.js +6 -0
  169. package/dist/cli/program.d.ts +6 -1
  170. package/dist/cli/program.js +112 -43
  171. package/dist/cli/telemetry.d.ts +17 -17
  172. package/dist/cli/telemetry.js +49 -41
  173. package/dist/cli.js +1 -1
  174. package/dist/comms/capture-surface.d.ts +14 -13
  175. package/dist/comms/capture-surface.js +23 -22
  176. package/dist/comms/catch-host.d.ts +8 -8
  177. package/dist/comms/catch-host.js +14 -14
  178. package/dist/comms/connections.js +4 -4
  179. package/dist/comms/email-catch.d.ts +3 -3
  180. package/dist/comms/email-catch.js +8 -8
  181. package/dist/comms/external-evidence.d.ts +27 -0
  182. package/dist/comms/external-evidence.js +93 -0
  183. package/dist/comms/extract.js +2 -2
  184. package/dist/comms/fake-inbox.d.ts +2 -2
  185. package/dist/comms/fake-inbox.js +2 -2
  186. package/dist/comms/lease-store.js +7 -7
  187. package/dist/comms/receiving-render.d.ts +1 -1
  188. package/dist/comms/receiving-render.js +2 -2
  189. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  190. package/dist/comms/sandbox-catch-script.js +6 -6
  191. package/dist/comms/sandbox-catch.d.ts +36 -37
  192. package/dist/comms/sandbox-catch.js +34 -35
  193. package/dist/comms/setup.js +42 -8
  194. package/dist/comms/thread-evidence.d.ts +1 -1
  195. package/dist/comms/thread-evidence.js +6 -6
  196. package/dist/comms/types.d.ts +6 -6
  197. package/dist/comms/types.js +4 -4
  198. package/dist/evidence/browser-hygiene.d.ts +1 -1
  199. package/dist/evidence/browser-hygiene.js +1 -1
  200. package/dist/evidence/frame-signature.d.ts +1 -1
  201. package/dist/evidence/frame-signature.js +4 -4
  202. package/dist/evidence/redaction.d.ts +3 -3
  203. package/dist/evidence/redaction.js +5 -5
  204. package/dist/evidence/secret-scrub.d.ts +9 -0
  205. package/dist/evidence/secret-scrub.js +96 -0
  206. package/dist/feedback/draft.js +41 -85
  207. package/dist/feedback/export-bundle.js +5 -5
  208. package/dist/feedback/export.d.ts +5 -1
  209. package/dist/feedback/export.js +16 -17
  210. package/dist/feedback/feedback.d.ts +3 -3
  211. package/dist/feedback/feedback.js +21 -3
  212. package/dist/guest/chromium-text.js +2 -2
  213. package/dist/guest/desktop-native.d.ts +1 -1
  214. package/dist/guest/runtime.js +1 -1
  215. package/dist/index.d.ts +14 -15
  216. package/dist/index.js +10 -11
  217. package/dist/keys/key-resolution.d.ts +7 -5
  218. package/dist/keys/key-resolution.js +40 -38
  219. package/dist/lab/adapter-extension.d.ts +35 -13
  220. package/dist/lab/adapter-extension.js +50 -134
  221. package/dist/lab/adapter-scorer-loader.d.ts +32 -12
  222. package/dist/lab/adapter-scorer-loader.js +56 -32
  223. package/dist/lab/composition-rules.js +58 -58
  224. package/dist/lab/config.js +85 -43
  225. package/dist/lab/deprecated-fields.d.ts +10 -0
  226. package/dist/lab/deprecated-fields.js +24 -0
  227. package/dist/lab/device-presets.d.ts +10 -10
  228. package/dist/lab/device-presets.js +11 -11
  229. package/dist/lab/discover.d.ts +13 -9
  230. package/dist/lab/discover.js +118 -60
  231. package/dist/lab/doctor.d.ts +53 -11
  232. package/dist/lab/doctor.js +193 -47
  233. package/dist/lab/init-plan.js +1 -3
  234. package/dist/lab/init-templates.js +147 -147
  235. package/dist/lab/init.d.ts +1 -1
  236. package/dist/lab/init.js +41 -9
  237. package/dist/lab/keys.d.ts +2 -0
  238. package/dist/lab/keys.js +43 -9
  239. package/dist/lab/lab-deps.d.ts +80 -0
  240. package/dist/lab/lab-deps.js +4 -0
  241. package/dist/lab/parse/actors.js +17 -16
  242. package/dist/lab/parse/comms.js +8 -7
  243. package/dist/lab/parse/execution.js +15 -14
  244. package/dist/lab/parse/study-v3.d.ts +23 -0
  245. package/dist/lab/parse/study-v3.js +259 -0
  246. package/dist/lab/parse/subject-state.d.ts +7 -7
  247. package/dist/lab/parse/subject-state.js +18 -17
  248. package/dist/lab/parse/subject.js +30 -29
  249. package/dist/lab/parse/values.d.ts +1 -2
  250. package/dist/lab/parse/values.js +3 -6
  251. package/dist/lab/persona-resolve.d.ts +7 -7
  252. package/dist/lab/persona-resolve.js +8 -8
  253. package/dist/lab/persona.js +1 -3
  254. package/dist/lab/plan-base.d.ts +0 -2
  255. package/dist/lab/plan-base.js +6 -4
  256. package/dist/lab/plan-participants.d.ts +7 -7
  257. package/dist/lab/plan-participants.js +2 -2
  258. package/dist/lab/plan-types.d.ts +26 -8
  259. package/dist/lab/plan.d.ts +4 -18
  260. package/dist/lab/plan.js +24 -79
  261. package/dist/lab/preflight-probes.js +11 -11
  262. package/dist/lab/preflight-result.d.ts +2 -1
  263. package/dist/lab/preflight-result.js +5 -6
  264. package/dist/lab/preflight.d.ts +7 -8
  265. package/dist/lab/preflight.js +6 -6
  266. package/dist/lab/requirements.d.ts +20 -0
  267. package/dist/lab/requirements.js +54 -0
  268. package/dist/lab/route-inputs.d.ts +23 -12
  269. package/dist/lab/route-inputs.js +48 -51
  270. package/dist/lab/routing.d.ts +42 -41
  271. package/dist/lab/routing.js +66 -68
  272. package/dist/lab/run-lab-events.d.ts +3 -11
  273. package/dist/lab/run-lab-events.js +2 -16
  274. package/dist/lab/run-lab-homes.d.ts +76 -0
  275. package/dist/lab/run-lab-homes.js +7 -0
  276. package/dist/lab/run-lab-options.d.ts +12 -66
  277. package/dist/lab/run-lab-options.js +58 -285
  278. package/dist/lab/summary.d.ts +15 -9
  279. package/dist/lab/summary.js +24 -17
  280. package/dist/lab/tasks.d.ts +15 -15
  281. package/dist/lab/tasks.js +14 -14
  282. package/dist/lab/types.d.ts +201 -195
  283. package/dist/lab/types.js +2 -0
  284. package/dist/lab/validation.d.ts +21 -21
  285. package/dist/lab/validation.js +61 -59
  286. package/dist/lab/warnings.d.ts +10 -0
  287. package/dist/lab/warnings.js +70 -41
  288. package/dist/library-aliases.d.ts +56 -0
  289. package/dist/library-aliases.js +22 -0
  290. package/dist/observer/artifact.d.ts +2 -2
  291. package/dist/observer/artifact.js +9 -9
  292. package/dist/observer/data.d.ts +6 -6
  293. package/dist/observer/data.js +7 -6
  294. package/dist/observer/exposure.d.ts +1 -1
  295. package/dist/observer/exposure.js +11 -11
  296. package/dist/observer/http.js +1 -1
  297. package/dist/observer/library.d.ts +1 -1
  298. package/dist/observer/library.js +4 -2
  299. package/dist/observer/listen.js +5 -4
  300. package/dist/observer/render.d.ts +1 -1
  301. package/dist/observer/render.js +12 -7
  302. package/dist/observer/run-routes.d.ts +4 -4
  303. package/dist/observer/run-routes.js +6 -6
  304. package/dist/observer/serve.d.ts +17 -0
  305. package/dist/observer/serve.js +41 -6
  306. package/dist/observer/tunnel.js +1 -1
  307. package/dist/observer-app.html +4 -4
  308. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  309. package/dist/routes/computer-use/bundle-parts.js +24 -17
  310. package/dist/routes/computer-use/bundle.d.ts +4 -11
  311. package/dist/routes/computer-use/bundle.js +12 -18
  312. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  313. package/dist/routes/computer-use/diagnostics.js +1 -1
  314. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
  315. package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
  316. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  317. package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
  318. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
  319. package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
  320. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  321. package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
  322. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  323. package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
  324. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  325. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  326. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  327. package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
  328. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  329. package/dist/routes/computer-use/external-comms.js +19 -43
  330. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  331. package/dist/routes/computer-use/fanout-bundle.js +38 -42
  332. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
  333. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  334. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  335. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  336. package/dist/routes/computer-use/live-flush.js +20 -28
  337. package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
  338. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
  339. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  340. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  341. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  342. package/dist/routes/computer-use/local-vm.js +40 -67
  343. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  344. package/dist/routes/computer-use/participant-desktop.js +5 -25
  345. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
  346. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
  347. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  348. package/dist/routes/computer-use/participant-facts.js +12 -1
  349. package/dist/routes/computer-use/participant-model.d.ts +25 -11
  350. package/dist/routes/computer-use/participant-model.js +76 -34
  351. package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
  352. package/dist/routes/computer-use/participant-prompt.js +8 -8
  353. package/dist/routes/computer-use/participant-runs.d.ts +11 -11
  354. package/dist/routes/computer-use/participant-runs.js +18 -18
  355. package/dist/routes/computer-use/plan.d.ts +21 -29
  356. package/dist/routes/computer-use/plan.js +70 -78
  357. package/dist/routes/computer-use/preflight.d.ts +3 -5
  358. package/dist/routes/computer-use/preflight.js +40 -36
  359. package/dist/routes/computer-use/rerun-selection.js +11 -7
  360. package/dist/routes/computer-use/result.d.ts +1 -1
  361. package/dist/routes/computer-use/result.js +48 -38
  362. package/dist/routes/computer-use/route.d.ts +5 -5
  363. package/dist/routes/computer-use/route.js +36 -33
  364. package/dist/routes/computer-use/self-report.d.ts +8 -8
  365. package/dist/routes/computer-use/self-report.js +33 -33
  366. package/dist/routes/computer-use/setup.d.ts +9 -15
  367. package/dist/routes/computer-use/setup.js +106 -83
  368. package/dist/routes/computer-use/single-bundle.d.ts +13 -16
  369. package/dist/routes/computer-use/single-bundle.js +46 -53
  370. package/dist/routes/computer-use/subject-projection.d.ts +6 -8
  371. package/dist/routes/computer-use/subject-projection.js +24 -23
  372. package/dist/routes/computer-use/types.d.ts +195 -238
  373. package/dist/routes/computer-use/types.js +21 -13
  374. package/dist/routes/preview.d.ts +8 -2
  375. package/dist/routes/preview.js +8 -5
  376. package/dist/routes/scripted/bundle.d.ts +5 -8
  377. package/dist/routes/scripted/bundle.js +23 -27
  378. package/dist/routes/scripted/plan.d.ts +6 -8
  379. package/dist/routes/scripted/plan.js +15 -13
  380. package/dist/routes/scripted/result.d.ts +4 -1
  381. package/dist/routes/scripted/result.js +15 -11
  382. package/dist/routes/scripted/route.js +15 -17
  383. package/dist/routes/scripted/scenario.d.ts +1 -1
  384. package/dist/routes/scripted/scenario.js +3 -3
  385. package/dist/routes/scripted/setup.d.ts +3 -2
  386. package/dist/routes/scripted/setup.js +27 -26
  387. package/dist/routes/scripted/subject.d.ts +8 -3
  388. package/dist/routes/scripted/subject.js +10 -6
  389. package/dist/routes/scripted/surface-records.js +4 -4
  390. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  391. package/dist/routes/scripted/surface-sessions.js +4 -4
  392. package/dist/routes/scripted/types.d.ts +21 -40
  393. package/dist/routes/scripted/types.js +2 -3
  394. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
  395. package/dist/routes/shared-world/bundle.d.ts +7 -7
  396. package/dist/routes/shared-world/bundle.js +60 -62
  397. package/dist/routes/shared-world/checkpoints.d.ts +5 -5
  398. package/dist/routes/shared-world/checkpoints.js +5 -5
  399. package/dist/routes/shared-world/comms.d.ts +8 -7
  400. package/dist/routes/shared-world/comms.js +38 -51
  401. package/dist/routes/shared-world/external-public.d.ts +6 -5
  402. package/dist/routes/shared-world/external-public.js +28 -25
  403. package/dist/routes/shared-world/handoff.d.ts +10 -9
  404. package/dist/routes/shared-world/handoff.js +89 -81
  405. package/dist/routes/shared-world/lobby-code.d.ts +7 -7
  406. package/dist/routes/shared-world/lobby-code.js +22 -22
  407. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
  408. package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
  409. package/dist/routes/shared-world/plan.d.ts +2 -6
  410. package/dist/routes/shared-world/plan.js +8 -9
  411. package/dist/routes/shared-world/provenance.d.ts +4 -4
  412. package/dist/routes/shared-world/provenance.js +4 -4
  413. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  414. package/dist/routes/shared-world/provisioned.js +55 -48
  415. package/dist/routes/shared-world/result.js +47 -36
  416. package/dist/routes/shared-world/route.js +54 -57
  417. package/dist/routes/shared-world/setup.d.ts +6 -5
  418. package/dist/routes/shared-world/setup.js +16 -18
  419. package/dist/routes/shared-world/types.d.ts +70 -141
  420. package/dist/routes/shared-world/types.js +5 -5
  421. package/dist/routes/terminal/adapter.d.ts +10 -10
  422. package/dist/routes/terminal/adapter.js +32 -129
  423. package/dist/routes/terminal/bundle.d.ts +10 -15
  424. package/dist/routes/terminal/bundle.js +43 -52
  425. package/dist/routes/terminal/credentials.d.ts +4 -4
  426. package/dist/routes/terminal/credentials.js +20 -20
  427. package/dist/routes/terminal/dry-run.d.ts +1 -1
  428. package/dist/routes/terminal/dry-run.js +13 -15
  429. package/dist/routes/terminal/encoding.d.ts +1 -1
  430. package/dist/routes/terminal/encoding.js +4 -4
  431. package/dist/routes/terminal/ledger.d.ts +8 -8
  432. package/dist/routes/terminal/ledger.js +22 -22
  433. package/dist/routes/terminal/live-finish.d.ts +1 -2
  434. package/dist/routes/terminal/live-finish.js +24 -23
  435. package/dist/routes/terminal/live-sandbox.d.ts +3 -2
  436. package/dist/routes/terminal/live-sandbox.js +31 -32
  437. package/dist/routes/terminal/participant-text.d.ts +23 -0
  438. package/dist/routes/terminal/participant-text.js +165 -0
  439. package/dist/routes/terminal/persona.js +1 -1
  440. package/dist/routes/terminal/plan.d.ts +2 -6
  441. package/dist/routes/terminal/plan.js +23 -19
  442. package/dist/routes/terminal/recorder.d.ts +6 -1
  443. package/dist/routes/terminal/recorder.js +12 -4
  444. package/dist/routes/terminal/result.js +12 -12
  445. package/dist/routes/terminal/route.js +30 -31
  446. package/dist/routes/terminal/runtime.d.ts +3 -2
  447. package/dist/routes/terminal/runtime.js +3 -3
  448. package/dist/routes/terminal/sandbox.d.ts +4 -4
  449. package/dist/routes/terminal/sandbox.js +10 -10
  450. package/dist/routes/terminal/session.js +22 -19
  451. package/dist/routes/terminal/token-usage.d.ts +1 -1
  452. package/dist/routes/terminal/token-usage.js +10 -11
  453. package/dist/routes/terminal/trace.d.ts +7 -10
  454. package/dist/routes/terminal/trace.js +11 -66
  455. package/dist/routes/terminal/types.d.ts +104 -114
  456. package/dist/routes/terminal/types.js +12 -7
  457. package/dist/run/active-runs.d.ts +13 -0
  458. package/dist/run/active-runs.js +12 -0
  459. package/dist/run/bundle-shape.d.ts +2 -1
  460. package/dist/run/bundle-shape.js +7 -7
  461. package/dist/run/bundle.d.ts +99 -92
  462. package/dist/run/bundle.js +10 -8
  463. package/dist/run/cost-summary.js +6 -5
  464. package/dist/run/costs.d.ts +6 -6
  465. package/dist/run/costs.js +17 -11
  466. package/dist/run/detail.d.ts +9 -9
  467. package/dist/run/detail.js +10 -10
  468. package/dist/run/dry-run-inputs.js +1 -1
  469. package/dist/run/dry-run.js +23 -30
  470. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  471. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  472. package/dist/run/feedback-shape.js +1 -1
  473. package/dist/run/judge.d.ts +34 -16
  474. package/dist/run/judge.js +41 -14
  475. package/dist/run/locate.d.ts +2 -0
  476. package/dist/run/locate.js +3 -1
  477. package/dist/run/outcomes.d.ts +3 -3
  478. package/dist/run/outcomes.js +3 -3
  479. package/dist/run/participant-records.d.ts +2 -2
  480. package/dist/run/participant-records.js +2 -2
  481. package/dist/run/paths.d.ts +1 -1
  482. package/dist/run/paths.js +2 -2
  483. package/dist/run/pricing.d.ts +30 -15
  484. package/dist/run/pricing.js +49 -30
  485. package/dist/run/projection.d.ts +27 -27
  486. package/dist/run/projection.js +23 -23
  487. package/dist/run/reclaim.d.ts +6 -0
  488. package/dist/run/reclaim.js +15 -5
  489. package/dist/run/results.d.ts +5 -5
  490. package/dist/run/run-index.d.ts +9 -7
  491. package/dist/run/run-index.js +24 -25
  492. package/dist/run/run-not-found.d.ts +5 -0
  493. package/dist/run/run-not-found.js +15 -0
  494. package/dist/run/run.d.ts +7 -4
  495. package/dist/run/run.js +10 -6
  496. package/dist/run/sandbox-receipts.d.ts +5 -5
  497. package/dist/run/sandbox-receipts.js +6 -6
  498. package/dist/run/shared-world-evidence.d.ts +67 -66
  499. package/dist/run/shared-world-evidence.js +4 -4
  500. package/dist/run/shared-world-shape.d.ts +3 -3
  501. package/dist/run/shared-world-shape.js +16 -16
  502. package/dist/run/stats.d.ts +17 -11
  503. package/dist/run/stats.js +124 -66
  504. package/dist/run/status.d.ts +21 -32
  505. package/dist/run/status.js +34 -33
  506. package/dist/run/stored-runs.js +2 -1
  507. package/dist/run/stream-shape.js +1 -1
  508. package/dist/run/streams.d.ts +29 -22
  509. package/dist/run/study-provenance.d.ts +47 -0
  510. package/dist/run/study-provenance.js +63 -0
  511. package/dist/run/study-result.d.ts +16 -0
  512. package/dist/run/study-result.js +9 -0
  513. package/dist/run/terminal-contract.d.ts +5 -5
  514. package/dist/run/terminal-contract.js +4 -4
  515. package/dist/run/text.d.ts +2 -0
  516. package/dist/run/text.js +4 -0
  517. package/dist/run/transient-comms-secrets.d.ts +5 -0
  518. package/dist/run/transient-comms-secrets.js +12 -0
  519. package/dist/run-lab.d.ts +40 -38
  520. package/dist/run-lab.js +42 -40
  521. package/dist/study/convert.d.ts +33 -0
  522. package/dist/study/convert.js +432 -0
  523. package/dist/study/field-paths.d.ts +12 -0
  524. package/dist/study/field-paths.js +126 -0
  525. package/dist/study/files.d.ts +26 -0
  526. package/dist/study/files.js +43 -0
  527. package/dist/study/migrate.d.ts +48 -0
  528. package/dist/study/migrate.js +408 -0
  529. package/dist/study/owned-files.d.ts +38 -0
  530. package/dist/study/owned-files.js +182 -0
  531. package/dist/subject/clone.d.ts +1 -1
  532. package/dist/subject/desktop-cli.d.ts +2 -2
  533. package/dist/subject/desktop-cli.js +3 -3
  534. package/dist/subject/local-tree-archive.d.ts +1 -1
  535. package/dist/subject/local-tree-archive.js +5 -5
  536. package/dist/subject/local-tree.d.ts +3 -3
  537. package/dist/subject/local-tree.js +1 -1
  538. package/dist/subject/node-bootstrap.d.ts +1 -1
  539. package/dist/subject/node-bootstrap.js +4 -4
  540. package/dist/subject/runtime.js +10 -11
  541. package/dist/subject/serve.d.ts +1 -1
  542. package/dist/subject/serve.js +4 -4
  543. package/dist/subject/state.d.ts +1 -1
  544. package/dist/subject/steps.d.ts +8 -8
  545. package/dist/subject/steps.js +7 -7
  546. package/dist/substrates/command-failure.d.ts +3 -3
  547. package/dist/substrates/command-failure.js +3 -3
  548. package/dist/substrates/detached.d.ts +6 -6
  549. package/dist/substrates/detached.js +7 -7
  550. package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
  551. package/dist/substrates/e2b/cdp-probe.js +15 -18
  552. package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
  553. package/dist/substrates/e2b/desktop-browser.js +12 -12
  554. package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
  555. package/dist/substrates/e2b/desktop-cdp.js +11 -11
  556. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  557. package/dist/substrates/e2b/desktop-executor.js +1 -1
  558. package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
  559. package/dist/substrates/e2b/desktop-geometry.js +9 -9
  560. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  561. package/dist/substrates/e2b/desktop-media.js +3 -3
  562. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  563. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  564. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  565. package/dist/substrates/e2b/sandbox.js +2 -2
  566. package/dist/substrates/e2b/sdk.d.ts +11 -11
  567. package/dist/substrates/e2b/sdk.js +8 -8
  568. package/dist/substrates/local/runtime-host.d.ts +2 -0
  569. package/dist/substrates/local/runtime-host.js +6 -0
  570. package/dist/tui/actions.d.ts +8 -6
  571. package/dist/tui/actions.js +31 -22
  572. package/dist/tui/contract.d.ts +16 -16
  573. package/dist/tui/contract.js +10 -10
  574. package/dist/tui/launch.d.ts +4 -4
  575. package/dist/tui/launch.js +18 -19
  576. package/dist/tui/project.js +5 -5
  577. package/dist/tui-app.js +83 -83
  578. package/dist/verify/actor.d.ts +14 -14
  579. package/dist/verify/actor.js +45 -45
  580. package/dist/verify/artifacts.d.ts +3 -3
  581. package/dist/verify/artifacts.js +6 -6
  582. package/dist/verify/context-growth.d.ts +9 -0
  583. package/dist/verify/context-growth.js +62 -0
  584. package/dist/verify/costs.d.ts +7 -7
  585. package/dist/verify/costs.js +9 -9
  586. package/dist/verify/liveness.d.ts +1 -1
  587. package/dist/verify/liveness.js +4 -1
  588. package/dist/verify/rerun.d.ts +1 -1
  589. package/dist/verify/rerun.js +1 -1
  590. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  591. package/dist/verify/shared-world-concurrent.js +79 -76
  592. package/dist/verify/shared-world.d.ts +2 -2
  593. package/dist/verify/shared-world.js +18 -18
  594. package/dist/verify/subject.d.ts +4 -4
  595. package/dist/verify/subject.js +18 -18
  596. package/dist/verify/verify.js +98 -49
  597. package/docs/README.md +26 -33
  598. package/docs/architecture/actor-contract.md +105 -98
  599. package/docs/architecture/desktop-sessions.md +14 -14
  600. package/docs/architecture/external-public-shared-world.md +66 -59
  601. package/docs/architecture/github-feedback-loop.md +1 -4
  602. package/docs/architecture/guest-desktop.md +2 -2
  603. package/docs/architecture/observer.md +37 -37
  604. package/docs/architecture/restricted-codex-analysis.md +70 -30
  605. package/docs/architecture/serve.md +34 -37
  606. package/docs/architecture/state-driven-executor.md +55 -59
  607. package/docs/architecture/task-protocol-support.md +7 -9
  608. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
  609. package/docs/contracts/README.md +24 -0
  610. package/docs/contracts/adapter-admission.md +3 -3
  611. package/docs/contracts/adapter-fixtures.md +2 -5
  612. package/docs/contracts/core.md +1 -3
  613. package/docs/contracts/errors.md +62 -0
  614. package/docs/contracts/feedback.md +8 -9
  615. package/docs/contracts/policy.md +7 -12
  616. package/docs/contracts/run-bundle.md +54 -51
  617. package/docs/contracts/schemas.md +505 -390
  618. package/docs/contracts/study-analysis.md +26 -2
  619. package/docs/contracts/study-costs.md +11 -7
  620. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  621. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  622. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  623. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  624. package/docs/principles/actor-fidelity.md +4 -4
  625. package/docs/principles/engineering.md +3 -3
  626. package/docs/principles/invariants-and-defaults.md +38 -38
  627. package/docs/principles/self-driving-harness.md +1 -5
  628. package/docs/principles/three-roles.md +1 -1
  629. package/docs/product/automatic-analysis.md +8 -7
  630. package/examples/participant/README.md +5 -5
  631. package/examples/participant/run.mjs +11 -10
  632. package/examples/scorer/README.md +3 -3
  633. package/examples/scorer/run.mjs +11 -12
  634. package/package.json +16 -17
  635. package/skills/humanish/SKILL.md +63 -60
  636. package/skills/humanish/agents/openai.yaml +1 -1
  637. package/AGENTS.md +0 -99
  638. package/CONTRIBUTING.md +0 -148
  639. package/dist/actors/codex/qualified-versions.d.ts +0 -45
  640. package/dist/actors/codex/qualified-versions.js +0 -87
  641. package/dist/cli/commands/lab.d.ts +0 -3
  642. package/dist/cli/commands/lab.js +0 -193
  643. package/dist/deprecated.d.ts +0 -90
  644. package/dist/deprecated.js +0 -106
  645. package/dist/lab/bag-overrides.d.ts +0 -18
  646. package/dist/lab/bag-overrides.js +0 -121
  647. package/dist/observer/static.d.ts +0 -39
  648. package/dist/observer/static.js +0 -369
  649. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  650. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  651. package/docs/architecture/comms-inbox.md +0 -122
  652. package/docs/architecture/desktop-recording.md +0 -80
  653. package/docs/architecture/local-browser-runtime.md +0 -178
  654. package/docs/architecture/observer-review.md +0 -144
  655. package/docs/architecture/participant-media.md +0 -90
  656. package/docs/architecture/project-layout.md +0 -62
  657. package/docs/architecture/real-email-receiving.md +0 -136
  658. package/docs/assets/humanish-drawdb-hero.png +0 -0
  659. package/docs/assets/humanish-observer-hero.png +0 -0
  660. package/docs/goals/current.md +0 -207
  661. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  662. package/docs/product/open-source-install-experience.md +0 -240
  663. package/docs/ramp/README.md +0 -294
  664. package/docs/release/open-source-readiness.md +0 -222
  665. package/docs/release/public-readiness-standard.md +0 -210
  666. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  667. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  668. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -1,5 +1,6 @@
1
1
  import { OUTCOME_POLICIES, participantHarnessFailed, resultOk, } from "../../run/judge.js";
2
- import { TERMINAL_PRODUCT_LAB_SCHEMA, } from "./types.js";
2
+ import {} from "./types.js";
3
+ import { studyResultIdentity } from "../../run/study-result.js";
3
4
  /**
4
5
  * What judge.ts reads from a finished terminal session, after a blown cap has overridden it. It has
5
6
  * no engagement or blocker rule: the agent's nonce-verified marker is its declared outcome.
@@ -46,14 +47,14 @@ export function terminalExecutionFailures(args) {
46
47
  /** The terminal-product lab result for a live run, from its session, cleanup and cost ledger. */
47
48
  export function terminalLabResult(args) {
48
49
  const { cwd, labId, actorId, productName, runId, sessionStatus, completionReason, sessionReason, sessionError, sandboxId, cleanup, cost, noSpendProof, capFailure, declaredScorerFailure, judgment, execution, observer, warnings, } = args;
49
- // The lab's exit code: verified evidence AND no harness error AND proven cleanup. A blocked/
50
- // timed-out agent run is STILL ok-as-evidence at the bundle level (the failure is the evidence),
51
- // but the LAB result surfaces ok:false on a harness error or unproven teardown (fail-closed).
50
+ // The lab's exit code: verified evidence, no harness error and proven cleanup. A blocked/
51
+ // timed-out agent run is still ok-as-evidence at the bundle level (the failure is the evidence),
52
+ // but the lab result surfaces ok:false on a harness error or unproven teardown (fail-closed).
52
53
  // remaining===0 is the by-id-confirmed-reclaimed state; remaining===1 (still present) and
53
54
  // remaining===-1 (kill(id) itself failed) are both unproven by design.
54
55
  const cleanupProven = cleanup.killed && cleanup.remaining === 0;
55
- // A CONFIG-DECLARED scorer that failed to render a pass (status:"fail" / malformed / throw) fails the
56
- // run RESULT too, not just the persisted verdict — the keystone lane's declared rubric is a gate, so
56
+ // A config-declared scorer that failed to render a pass (status:"fail" / malformed / throw) fails the
57
+ // run result as well as the persisted verdict: the keystone route's declared rubric is a gate, so
57
58
  // its fail must drive exit code. Library callers never set this (additive, back-compat).
58
59
  const ok = resultOk({
59
60
  judgment,
@@ -62,10 +63,9 @@ export function terminalLabResult(args) {
62
63
  policy: OUTCOME_POLICIES.terminal,
63
64
  });
64
65
  return {
65
- schema: TERMINAL_PRODUCT_LAB_SCHEMA,
66
+ ...studyResultIdentity("terminal", labId),
66
67
  ok,
67
68
  cwd,
68
- labId,
69
69
  actor: actorId,
70
70
  product: productName,
71
71
  dryRun: false,
@@ -97,12 +97,12 @@ export function terminalLabResult(args) {
97
97
  : {
98
98
  error: {
99
99
  code: (!cleanupProven
100
- ? "HUMANISH_TERMINAL_LAB_CLEANUP_UNPROVEN"
100
+ ? "HUMANISH_TERMINAL_CLEANUP_UNPROVEN"
101
101
  : capFailure !== undefined
102
- ? "HUMANISH_TERMINAL_LAB_CAPS_EXCEEDED"
103
- : "HUMANISH_TERMINAL_LAB_FAILED"),
102
+ ? "HUMANISH_TERMINAL_CAPS_EXCEEDED"
103
+ : "HUMANISH_TERMINAL_FAILED"),
104
104
  message: !cleanupProven
105
- ? `Live terminal-product run could not prove sandbox teardown (killed=${cleanup.killed}, remaining=${cleanup.remaining}): ${cleanup.reason}. A run that cannot prove teardown fails closed.${sessionError !== undefined ? ` Session failure: ${sessionError}` : ""}`
105
+ ? `Live terminal-product run could not prove sandbox teardown (killed=${cleanup.killed}, remaining=${cleanup.remaining}): ${cleanup.reason}. A run that cannot prove its sandbox was removed does not pass.${sessionError !== undefined ? ` Session failure: ${sessionError}` : ""}`
106
106
  : (declaredScorerFailure ??
107
107
  capFailure ??
108
108
  sessionError ??
@@ -8,39 +8,39 @@
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
12
- // the files each item names, and CHECKED by the verifier (verify/actor.ts
11
+ // The safety contract (`docs/history/goals/terminal-product-lane/goal.md`) is enforced by construction in
12
+ // the files each item names, and checked by the verifier (verify/actor.ts
13
13
  // validateTerminalProductEvidence):
14
- // 1. EXPLICIT KEY PLACEMENT. openai-env (default) injects the raw runtime key command-scoped,
15
- // NEVER Sandbox.create({envs}). Opt-in openai-egress sends it only in the host-side E2B
14
+ // 1. Explicit key placement. openai-env (default) injects the raw runtime key command-scoped,
15
+ // never through Sandbox.create({envs}). Opt-in openai-egress sends it only in the host-side E2B
16
16
  // header transform and passes an inert command placeholder. The proxy is spendable by every
17
17
  // sandbox process from creation; this protects the raw key, not provider spending.
18
18
  // Enforced in credentials.ts and runtime-auth.ts.
19
- // 2. FAIL-CLOSED CAP. The live key is never exercised without scenario.caps in force: maxUsd
19
+ // 2. Fail-closed cap. The live key is never exercised without scenario.caps in force: maxUsd
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
- // 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 in this lane.
22
+ // 3. Public surfaces only. The mission references only subject.product.publicSurfaces + the
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
- // 4. DENY-BY-DEFAULT CREDENTIALS. The command envs are built from an ALLOWLIST of ONLY the
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
27
27
  // construction (a banned-name guard also fails closed if one is ever requested).
28
28
  // Enforced in credentials.ts.
29
- // 5. NO SECRET VALUES IN EVIDENCE. Every captured byte (event stream, transcript, command logs,
29
+ // 5. No secret values in evidence. Every captured byte (event stream, transcript, command logs,
30
30
  // agent report, metadata) passes scrubKnownValues (literal scrub of the runtime key + any
31
- // provisioned values, >=4 chars, PRE-truncation) THEN redactText (shape patterns) BEFORE
32
- // persisting. The transport is labeled HONESTLY (exec-stream/snapshot, NOT an interactive pty).
31
+ // provisioned values, >=4 chars, before truncation), then redactText (shape patterns), before
32
+ // persisting. The transport is labeled exec-stream/snapshot; there is no interactive pty.
33
33
  // Enforced in recorder.ts, with the scrubber session.ts builds.
34
- // 6. METADATA POSITIVE ALLOWLIST. buildSandboxMetadata(allowlist) is the ONLY way metadata is
34
+ // 6. Metadata positive allowlist. buildSandboxMetadata(allowlist) is the only way metadata is
35
35
  // set; it carries solely non-secret labels (mode/tool/labId/simId/provider/runId).
36
36
  // Enforced in credentials.ts.
37
- // 7. STDIN DISABLED + INTERVENTIONS LEDGER. stdin is never wired to the codex command; the
38
- // bundle ALWAYS carries an interventions ledger (empty array is valid + required-present).
37
+ // 7. Stdin disabled + interventions ledger. stdin is never wired to the codex command; the
38
+ // bundle always carries an interventions ledger (empty array is valid + required-present).
39
39
  // Enforced in live-sandbox.ts (stdin) and recorder.ts (the ledger).
40
- // 8. PROVEN CLEANUP, BY ID, NEVER ACCOUNT-WIDE. Sandbox.kill(id) in a finally; the cleanup
41
- // proof is BY EXACT ID: kill(id)'s own found-and-killed boolean, confirmed further by
40
+ // 8. Proven cleanup, by id, never account-wide. Sandbox.kill(id) in a finally; the cleanup
41
+ // proof is by exact id: kill(id)'s own found-and-killed boolean, confirmed further by
42
42
  // Sandbox.getInfo(id) when the SDK exposes it (a thrown SandboxNotFoundError means gone).
43
- // humanish NEVER calls Sandbox.list to prove cleanup, so a shared operator key never reaches a
43
+ // humanish never calls Sandbox.list to prove cleanup, so a shared operator key never reaches a
44
44
  // sandbox it did not create. A live run that cannot prove teardown fails closed.
45
45
  // Enforced in sandbox.ts.
46
46
  import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
@@ -50,18 +50,19 @@ import { runScope } from "../../run/run.js";
50
50
  import { planTerminalLab } from "./plan.js";
51
51
  import { runDryTerminalLab } from "./dry-run.js";
52
52
  import { checkLiveTerminalMachine, runLiveTerminalSession } from "./session.js";
53
- import { terminalInputWithScorer } from "../../lab/route-inputs.js";
54
- import { TERMINAL_PRODUCT_LAB_SCHEMA, } from "./types.js";
53
+ import { terminalRouteScorer } from "../../lab/adapter-scorer-loader.js";
54
+ import { withLateScorer } from "../../lab/route-inputs.js";
55
+ import {} from "./types.js";
56
+ import { studyResultIdentity } from "../../run/study-result.js";
55
57
  /**
56
58
  * The config-taking entry point. It plans, returns a refusal with the same envelope and analysis
57
59
  * record the route has always returned, and otherwise runs the plan.
58
60
  */
59
61
  export async function runTerminalProductLab(options) {
60
- const { config, dryRun, lab, ...input } = options;
62
+ const { config, dryRun, ...input } = options;
61
63
  const planned = planTerminalLab(config, {
62
64
  dryRun,
63
- ...(lab === undefined ? {} : { lab }),
64
- ...(input.hooks === undefined ? {} : { hooks: input.hooks }),
65
+ hasCostProbe: input.deps?.costProbe !== undefined,
65
66
  });
66
67
  if (planned.ok)
67
68
  return runTerminalPlan(planned.plan, input);
@@ -71,10 +72,9 @@ export async function runTerminalProductLab(options) {
71
72
  export function terminalLabRefusal(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,
@@ -84,7 +84,7 @@ export function terminalLabRefusal(options, refusal) {
84
84
  };
85
85
  // A refusal starts no run, so a declared or default analysis is recorded as skipped.
86
86
  const analysis = resolveAutomaticAnalysis(config.review?.analysis);
87
- return completeAutomaticAnalysis(refused, undefined, analysis.ok ? analysis.config : undefined, options.automaticAnalysis, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
87
+ return completeAutomaticAnalysis(refused, undefined, analysis.ok ? analysis.config : undefined, options, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
88
88
  }
89
89
  /**
90
90
  * Run a terminal plan. The run scope gives a direct library caller the same run lifetime the CLI
@@ -106,11 +106,11 @@ export async function admitTerminalPlan(plan, input) {
106
106
  return { ok: false, outcome: terminalOutcome(admission.result) };
107
107
  return {
108
108
  ok: true,
109
- run: async (scorer) => terminalOutcome(await runAdmittedTerminalRun(admission.admitted, terminalInputWithScorer(input, scorer))),
109
+ run: async (scorer) => terminalOutcome(await runAdmittedTerminalRun(admission.admitted, withLateScorer(input, scorer, terminalRouteScorer))),
110
110
  };
111
111
  }
112
112
  function terminalOutcome(result) {
113
- return { route: "terminal", backend: "terminal", result };
113
+ return { route: "terminal", result };
114
114
  }
115
115
  /**
116
116
  * A live plan's local checks, made outside any run scope. A refusal is the result runTerminalPlan
@@ -132,7 +132,7 @@ async function runAdmittedTerminalRun(admitted, input) {
132
132
  return completeTerminalAnalysis(admitted.plan, input, result, finished);
133
133
  }
134
134
  function completeTerminalAnalysis(plan, input, result, finished) {
135
- return completeAutomaticAnalysis(result, finished, plan.analysis?.config, input.automaticAnalysis, {
135
+ return completeAutomaticAnalysis(result, finished, plan.analysis?.config, input, {
136
136
  ...(plan.analysis === undefined ? {} : { trigger: plan.analysis.trigger }),
137
137
  preferLargerOutput: plan.analysis?.preferLargerOutput === true,
138
138
  });
@@ -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.labId),
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,
@@ -157,7 +156,7 @@ async function runTerminalPlanInScope(admitted, input, scope) {
157
156
  const cwd = path.resolve(input.cwd);
158
157
  const { warnings } = admitted;
159
158
  const failed = terminalFailure(admitted.plan, input, warnings);
160
- // LIVE path: the real in-sandbox agent session. A separate orchestrator owns the
159
+ // Live path: the real in-sandbox agent session. A separate orchestrator owns the
161
160
  // create -> inject (command-scoped) -> run -> capture -> teardown lifecycle so the dry-run path
162
161
  // below stays a pure contract builder. It enforces the safety contract by construction (the
163
162
  // keyPlacement-routed command-scoped key, the deny-by-default allowlist, the fail-closed cap,
@@ -6,9 +6,10 @@ export declare function isExactRuntimeVersion(value: unknown): value is string;
6
6
  /** Captured Codex CLI output: `codex-cli 0.153.3\n`. Other shapes fail closed. */
7
7
  export declare function parseTerminalRuntimeVersion(stdout: string): string | undefined;
8
8
  export declare function buildRuntimeVersionCommand(requestedVersion?: string): string;
9
- export declare function buildRuntimeExecPrefix(version: string, model?: string, reasoningEffort?: ReasoningEffort): string;
9
+ export declare function buildRuntimeExecPrefix(version: string, model: string, reasoningEffort?: ReasoningEffort): string;
10
10
  export declare function declaredRuntimeProvenance(args: {
11
11
  version?: string;
12
- model?: string;
12
+ model: string;
13
+ modelSource: "declared" | "humanish_default";
13
14
  reasoningEffort?: ReasoningEffort;
14
15
  }): ActorRuntimeProvenance;
@@ -26,7 +26,7 @@ export function buildRuntimeExecPrefix(version, model, reasoningEffort) {
26
26
  if (!isExactRuntimeVersion(version))
27
27
  throw new Error("Codex execution requires a verified exact runtime version.");
28
28
  return (`npm_config_update_notifier=false npx -y ${TERMINAL_RUNTIME_PACKAGE}@${version} exec` +
29
- (model === undefined ? "" : ` --model ${shellQuote(model)}`) +
29
+ ` --model ${shellQuote(model)}` +
30
30
  (reasoningEffort === undefined
31
31
  ? ""
32
32
  : ` -c ${shellQuote(`model_reasoning_effort=${JSON.stringify(reasoningEffort)}`)}`));
@@ -37,8 +37,8 @@ export function declaredRuntimeProvenance(args) {
37
37
  package: TERMINAL_RUNTIME_PACKAGE,
38
38
  requestedVersion: args.version ?? "latest",
39
39
  versionStatus: "unobserved",
40
- ...(args.model === undefined ? {} : { requestedModel: args.model }),
41
- modelStatus: args.model === undefined ? "runtime_default_unobserved" : "declared",
40
+ requestedModel: args.model,
41
+ modelStatus: args.modelSource,
42
42
  ...(args.reasoningEffort === undefined
43
43
  ? {}
44
44
  : { requestedReasoningEffort: args.reasoningEffort }),
@@ -2,13 +2,13 @@ import type { OwnedDesktopAllocation } from "../../substrates/desktop-session.js
2
2
  import { E2BDesktopStartupError, type E2BDesktopModule } from "../../substrates/e2b/sdk.js";
3
3
  import type { TerminalLedgers } from "./types.js";
4
4
  /**
5
- * Tear the sandbox down and PROVE it BY EXACT ID -- NEVER Sandbox.list (humanish must never
5
+ * Tear the sandbox down and prove it by exact id, never by Sandbox.list (humanish must never
6
6
  * enumerate the operator's E2B account; see docs/principles/invariants-and-defaults.md). The
7
7
  * allocation's release (src/substrates/e2b/sandbox.ts) kills the exact id and reads the answer the
8
8
  * same way every route does: true is terminated, false or a not-found error is already gone. That
9
- * is the PRIMARY proof. Where the SDK exposes Sandbox.getInfo(id), a thrown SandboxNotFoundError is
9
+ * is the primary proof. Where the SDK exposes Sandbox.getInfo(id), a thrown SandboxNotFoundError is
10
10
  * a second by-id confirmation that the exact sandbox is gone; a returned SandboxInfo with a live
11
- * state means teardown is NOT confirmed. Never throws -- teardown failure is recorded, the caller
11
+ * state means teardown is unconfirmed. Never throws: teardown failure is recorded, and the caller
12
12
  * fails closed on an unproven teardown.
13
13
  */
14
14
  export declare function teardownSandbox(args: {
@@ -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
  */
@@ -2,20 +2,20 @@ import { toErrorMessage } from "../../evidence/redaction.js";
2
2
  import { E2BDesktopStartupError, isSandboxNotFoundError, } from "../../substrates/e2b/sdk.js";
3
3
  import { releaseUnavailableDetail } from "../../substrates/e2b/sandbox.js";
4
4
  /**
5
- * Tear the sandbox down and PROVE it BY EXACT ID -- NEVER Sandbox.list (humanish must never
5
+ * Tear the sandbox down and prove it by exact id, never by Sandbox.list (humanish must never
6
6
  * enumerate the operator's E2B account; see docs/principles/invariants-and-defaults.md). The
7
7
  * allocation's release (src/substrates/e2b/sandbox.ts) kills the exact id and reads the answer the
8
8
  * same way every route does: true is terminated, false or a not-found error is already gone. That
9
- * is the PRIMARY proof. Where the SDK exposes Sandbox.getInfo(id), a thrown SandboxNotFoundError is
9
+ * is the primary proof. Where the SDK exposes Sandbox.getInfo(id), a thrown SandboxNotFoundError is
10
10
  * a second by-id confirmation that the exact sandbox is gone; a returned SandboxInfo with a live
11
- * state means teardown is NOT confirmed. Never throws -- teardown failure is recorded, the caller
11
+ * state means teardown is unconfirmed. Never throws: teardown failure is recorded, and the caller
12
12
  * fails closed on an unproven teardown.
13
13
  */
14
14
  export async function teardownSandbox(args) {
15
15
  const { allocation, sandboxModule, startupCleanup, startupCleanupDetail, requestTimeoutMs, sanitize, recordLifecycle, warnings, } = args;
16
16
  if (allocation === undefined || !sandboxModule) {
17
- // create() can reject AFTER its constructor acquired a handle. The default loader retains
18
- // that authority and reclaims it before rejecting; the lane itself never receives its ID.
17
+ // create() can reject after its constructor acquired a handle. The default loader retains
18
+ // that authority and reclaims it before rejecting; the route itself never receives its ID.
19
19
  if (startupCleanup === "killed" || startupCleanup === "already_gone") {
20
20
  const reason = `desktop startup guard confirmed its acquired sandbox ${startupCleanup === "killed" ? "was killed" : "was already gone"}`;
21
21
  recordLifecycle("terminal-lab.cleanup.killed", reason);
@@ -49,12 +49,12 @@ export async function teardownSandbox(args) {
49
49
  recordLifecycle("terminal-lab.cleanup.unconfirmed", `Sandbox ${sandboxId} ${reason}.`);
50
50
  return { killed: false, remaining: -1, reason };
51
51
  }
52
- // BY-ID verification only, from here down: NEVER Sandbox.list. A released result is itself proof
52
+ // By-id verification only, from here down: never Sandbox.list. A released result is itself proof
53
53
  // the exact sandbox is gone: terminated when kill(id) found and killed it, already gone when
54
54
  // kill(id) answered false or threw not-found (a 404, e.g. the server-side kill-on-timeout raced
55
55
  // ahead). Both mean "this id is no longer running." Sandbox.getInfo(id), when the SDK exposes
56
56
  // it, adds a second by-id confirmation; the only thing that overturns the release proof is
57
- // getInfo returning a LIVE sandbox for this exact id.
57
+ // getInfo returning a live sandbox for this exact id.
58
58
  const killNote = released.reason === "terminated"
59
59
  ? "kill(id) returned true (found and killed)"
60
60
  : "kill(id) found the exact sandbox already gone (404)";
@@ -85,8 +85,8 @@ export async function teardownSandbox(args) {
85
85
  reason: `reclaimed by id; getInfo(id) confirms the exact sandbox no longer exists (SandboxNotFoundError)`,
86
86
  };
87
87
  }
88
- // getInfo(id) failed for a reason OTHER than "not found" (e.g. a transient network error):
89
- // no second by-id confirmation is available, so the RESOLVED kill(id) call stands as the proof
88
+ // getInfo(id) failed for a reason other than "not found" (e.g. a transient network error):
89
+ // no second by-id confirmation is available, so the resolved kill(id) call stands as the proof
90
90
  // of absence. Never fall back to Sandbox.list.
91
91
  const sanitizedError = sanitize(toErrorMessage(error));
92
92
  recordLifecycle("terminal-lab.cleanup.killed", `Sandbox ${sandboxId} reclaimed: ${killNote}; getInfo(id) re-verification errored (${sanitizedError}), so kill(id)'s resolved result is the proof.`);
@@ -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,5 @@
1
1
  import { randomBytes, randomUUID } from "node:crypto";
2
+ import { missingKeys } from "../../lab/requirements.js";
2
3
  import { declaredRuntimeProvenance } from "./runtime.js";
3
4
  import { digestText, redactText, scrubLiterals } from "../../evidence/redaction.js";
4
5
  import { describeMissingKeys } from "../../keys/key-resolution.js";
@@ -15,21 +16,22 @@ import { finishLiveTerminalSession } from "./live-finish.js";
15
16
  * a declared scorer. Returns the runtime key's command-scoped placement, or the refusal.
16
17
  */
17
18
  export function checkLiveTerminalMachine(plan, input, warnings) {
18
- const env = input.hooks?.env ?? process.env;
19
+ const env = input.env ?? process.env;
19
20
  const { maxUsd } = plan.caps;
20
21
  // planTerminalLab refuses a positive maxUsd without a costProbe, so one is present here.
21
22
  if (maxUsd > 0) {
22
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.`);
23
24
  }
24
- // --- Safety contract item 4: deny-by-default credentials; build the command-scoped allowlist. ---
25
+ // --- Deny-by-default credentials: build the command-scoped allowlist. ---
25
26
  const runtimeEnv = buildRuntimeAuth({ runtimeAuth: plan.runtime.auth, env });
26
27
  if (!runtimeEnv.ok)
27
28
  return runtimeEnv;
28
29
  // The sandbox is created with E2B_API_KEY, so a missing key is refused before the run starts.
29
- if (!env.E2B_API_KEY?.trim()) {
30
+ // The runtime key above is the plan's `key-one-of`; E2B_API_KEY is its only `key`.
31
+ if (missingKeys(plan.requirements, env).length > 0) {
30
32
  return {
31
33
  ok: false,
32
- code: "HUMANISH_TERMINAL_LAB_KEYS_MISSING",
34
+ code: "HUMANISH_TERMINAL_KEYS_MISSING",
33
35
  message: `Live terminal-product labs need E2B_API_KEY in the environment (values are never persisted). ${describeMissingKeys(["E2B_API_KEY"], env)}`,
34
36
  };
35
37
  }
@@ -46,9 +48,9 @@ export async function runLiveTerminalSession(args) {
46
48
  const { plan, input, cwd, warnings, failed, scope, runtimeEnv } = args;
47
49
  const { actor, product } = plan;
48
50
  const { maxUsd, maxMinutes } = plan.caps;
49
- const hooks = input.hooks ?? {};
50
- const env = hooks.env ?? process.env;
51
- const now = hooks.now ?? (() => Date.now());
51
+ const deps = input.deps ?? {};
52
+ const env = input.env ?? process.env;
53
+ const now = deps.now ?? (() => Date.now());
52
54
  const nowIso = () => new Date(now()).toISOString();
53
55
  const prepared = await prepareLivePrompt({ plan, cwd, runtimeEnv, env, warnings });
54
56
  const { mission, physicalCwd, persona, composedPrompt, verdictNonce } = prepared;
@@ -61,7 +63,7 @@ export async function runLiveTerminalSession(args) {
61
63
  mode: "live",
62
64
  lab: plan.lab,
63
65
  renderReview: renderTerminalReviewMarkdown,
64
- observer: { open: input.open === true, render: hooks.renderObserverFn },
66
+ observer: { open: input.open === true, render: deps.renderObserver },
65
67
  now,
66
68
  });
67
69
  if (!started.ok)
@@ -77,17 +79,18 @@ export async function runLiveTerminalSession(args) {
77
79
  const e2bApiKey = env.E2B_API_KEY?.trim() ?? "";
78
80
  // The ledgers + capture buffers, mutated through the live lifecycle.
79
81
  const recorder = createTerminalRecorder({ nowIso, sanitize, knownSecretValues });
80
- const { version, model, reasoningEffort } = plan.runtime;
82
+ const { version, model, modelSource, reasoningEffort } = plan.runtime;
81
83
  const runtime = declaredRuntimeProvenance({
82
84
  ...(version === undefined ? {} : { version }),
83
- ...(model === undefined ? {} : { model: sanitize(model) }),
85
+ model: sanitize(model),
86
+ modelSource,
84
87
  ...(reasoningEffort === undefined ? {} : { reasoningEffort }),
85
88
  });
86
- 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).`);
87
90
  const session = new LiveTerminalSandbox({
88
91
  plan,
89
92
  cwd,
90
- hooks,
93
+ deps,
91
94
  now,
92
95
  nowIso,
93
96
  sanitize,
@@ -98,7 +101,7 @@ export async function runLiveTerminalSession(args) {
98
101
  maxMinutes,
99
102
  e2bApiKey,
100
103
  runPaths,
101
- metadata: buildSandboxMetadata({ labId: plan.labId, simId: "sim-001", runId }),
104
+ metadata: buildSandboxMetadata({ labId: plan.labId, recordId: "sim-001", runId }),
102
105
  warnings,
103
106
  recorder,
104
107
  });
@@ -122,7 +125,6 @@ export async function runLiveTerminalSession(args) {
122
125
  plan,
123
126
  input,
124
127
  cwd,
125
- hooks,
126
128
  sanitize,
127
129
  nowIso,
128
130
  knownSecretValues,
@@ -144,7 +146,7 @@ export async function runLiveTerminalSession(args) {
144
146
  async function prepareLivePrompt(args) {
145
147
  const { plan, cwd, runtimeEnv, env, warnings } = args;
146
148
  const { product } = plan;
147
- // Compose the prompt from PUBLIC surfaces + the author mission ONLY (safety contract item 3).
149
+ // Compose the prompt from public surfaces and the author mission alone.
148
150
  // Inject a per-run verdict nonce: the agent echoes HUMANISH_ACTOR_VERDICT=<status>
149
151
  // HUMANISH_ACTOR_NONCE=<nonce>; the scorer verifies the nonce so replayed text cannot forge it.
150
152
  const mission = plan.mission ?? defaultMission(product.name);
@@ -158,10 +160,10 @@ async function prepareLivePrompt(args) {
158
160
  verdictNonce,
159
161
  });
160
162
  const promptDigest = digestText(composedPrompt);
161
- // --- Safety contract item 5: literal-scrub EVERY known value, then pattern-redact, at the source. ---
162
- // The runtime key value (+ any other provisioned value) is scrubbed by LITERAL match before
163
+ // --- Literal-scrub every known value, then pattern-redact, at the source. ---
164
+ // The runtime key value (+ any other provisioned value) is scrubbed by literal match before
163
165
  // anything persists (a key has no detectable "shape" if it is an arbitrary token); redactText is
164
- // 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
165
167
  // value past the scrubber.
166
168
  const knownSecretValues = [runtimeEnv.keyValue, env.E2B_API_KEY?.trim() ?? ""].filter((v) => v.length >= 4);
167
169
  const scrubKnownValues = scrubLiterals(knownSecretValues);
@@ -177,8 +179,9 @@ async function prepareLivePrompt(args) {
177
179
  sanitize,
178
180
  };
179
181
  }
180
- /** Compose the live prompt: PUBLIC surfaces + author mission + the verdict-nonce marker contract. */
182
+ /** Compose the live prompt: public surfaces + author mission + the verdict-nonce marker contract. */
181
183
  function composeLivePrompt(args) {
184
+ // prose-check: model prompt (the terminal agent reads this, not a person)
182
185
  return [
183
186
  args.personaLine,
184
187
  `product: ${args.productName}`,
@@ -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,20 +1,19 @@
1
- // Provider token accounting for the terminal lane (#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,
11
10
  // "cache_write_input_tokens":30951,"output_tokens":2283,"reasoning_output_tokens":902}}
12
11
  //
13
- // So the lane can record a MEASURED token fact even when it cannot record a priced one. Rates stay
14
- // out of this module deliberately: pricing lives in src/run/pricing.ts, and the terminal lane has no
15
- // real model id to price against (it records `model: "codex"`), so the honest output is
12
+ // So the route can record a measured token fact even when it cannot record a priced one. Rates stay
13
+ // out of this module deliberately: pricing lives in src/run/pricing.ts, and the terminal route has no
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
- // Bounded to a single line on purpose. `[^}]*` would run past a TRUNCATED record's missing brace
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.
19
18
  const USAGE_RE = /"type"\s*:\s*"turn\.completed"\s*,\s*"usage"\s*:\s*(\{[^}\n]*\})/g;
20
19
  function num(value) {
@@ -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,6 @@
1
1
  import type { ActorCompletionReason, ActorPersonaRef, ActorRuntimeProvenance, ActorStatus, ActorTokenUsage, ActorTrace } from "../../actors/contract.js";
2
2
  import type { LabRuntimeAuth } from "../../lab/types.js";
3
+ import type { TerminalParticipantText } from "./participant-text.js";
3
4
  import { type CommandLogRecord, type TerminalEventRecord } from "./types.js";
4
5
  /**
5
6
  * Per-chunk sanitization cannot recognize a value split across deliveries. Redact those complete
@@ -10,9 +11,9 @@ export declare function scrubSplitKnownValues(events: TerminalEventRecord[], kno
10
11
  /** Redacted, ellipsis-prefixed tail of a captured stream/log for a message field. */
11
12
  export declare function tailOf(text: string): string;
12
13
  /**
13
- * Project the live terminal session into the provider-neutral humanish.actor-trace.v1 (lane
14
- * "terminal", protocol "terminal-exec"). counts.actions/messages drive the no-engagement honesty
15
- * guard (a real run bumps them; a no-op is caught). No screenshots on this lane.
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
16
+ * guard (a real run bumps them; a no-op is caught). No screenshots on this route.
16
17
  */
17
18
  export declare function buildTerminalActorTrace(args: {
18
19
  persona: ActorPersonaRef;
@@ -28,13 +29,9 @@ export declare function buildTerminalActorTrace(args: {
28
29
  transcriptTail: string;
29
30
  runtimeAuth: LabRuntimeAuth;
30
31
  runtime: ActorRuntimeProvenance;
31
- /** 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
32
33
  * carried no usage record, which stays distinct from a measured zero. */
33
34
  tokenUsage?: ActorTokenUsage;
35
+ /** The agent's own text and activity, read from the raw stdout as it arrived. */
36
+ participant: TerminalParticipantText;
34
37
  }): ActorTrace;
35
- /** Count distinct participant items in the retained Codex JSON stdout stream.
36
- * The caller supplies stdout only, after transport reconciliation and redaction.
37
- * Lifecycle, usage, launcher diagnostics, and nested command output are not activity.
38
- * Zero means no recognized item was retained, not that the participant succeeded.
39
- */
40
- export declare function countTerminalParticipantItems(stdout: string): number;