humanish 0.106.1 → 0.107.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 (453) hide show
  1. package/AGENTS.md +4 -4
  2. package/ARCHITECTURE.md +17 -16
  3. package/CHANGELOG.md +14 -0
  4. package/CONTEXT.md +42 -39
  5. package/CONTRIBUTING.md +8 -8
  6. package/README.md +8 -3
  7. package/dist/actors/codex/app-server-client.js +2 -1
  8. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  9. package/dist/actors/codex/app-server-trace.js +1 -3
  10. package/dist/actors/codex/app-server.js +2 -1
  11. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  12. package/dist/actors/codex/protocol-compat.js +357 -0
  13. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  14. package/dist/actors/codex/protocol-contract.js +471 -0
  15. package/dist/actors/codex/qualified-versions.d.ts +30 -3
  16. package/dist/actors/codex/qualified-versions.js +50 -5
  17. package/dist/actors/codex/restricted-executable.d.ts +24 -0
  18. package/dist/actors/codex/restricted-executable.js +97 -22
  19. package/dist/actors/codex/restricted-launch.d.ts +7 -1
  20. package/dist/actors/codex/restricted-launch.js +42 -3
  21. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  22. package/dist/actors/codex/restricted-notifications.js +277 -0
  23. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  24. package/dist/actors/codex/restricted-participant.js +60 -2
  25. package/dist/actors/codex/restricted-policy.d.ts +9 -1
  26. package/dist/actors/codex/restricted-session.d.ts +14 -1
  27. package/dist/actors/codex/restricted-session.js +50 -17
  28. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  29. package/dist/actors/codex/restricted-transport.js +139 -27
  30. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  31. package/dist/actors/codex/restricted-turn.js +43 -30
  32. package/dist/actors/computer-use/actor.d.ts +1 -1
  33. package/dist/actors/computer-use/actor.js +4 -4
  34. package/dist/actors/computer-use/loop/backstop.js +1 -1
  35. package/dist/actors/computer-use/loop/ending.d.ts +2 -2
  36. package/dist/actors/computer-use/loop/ending.js +2 -2
  37. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  38. package/dist/actors/computer-use/loop/spend.js +3 -3
  39. package/dist/actors/computer-use/loop/trace.js +2 -2
  40. package/dist/actors/computer-use/loop/types.d.ts +14 -5
  41. package/dist/actors/computer-use/loop.js +4 -4
  42. package/dist/actors/computer-use/openai-provider.d.ts +1 -1
  43. package/dist/actors/computer-use/openai-provider.js +2 -2
  44. package/dist/actors/contract.d.ts +9 -7
  45. package/dist/actors/local-agent/cli.js +1 -1
  46. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  47. package/dist/actors/scripted-browser/journey.js +15 -4
  48. package/dist/actors/scripted-browser/steps.js +18 -0
  49. package/dist/actors/scripted-browser/types.d.ts +11 -1
  50. package/dist/actors/stop-conditions.js +1 -3
  51. package/dist/analysis/automatic-completion.d.ts +13 -8
  52. package/dist/analysis/automatic-completion.js +14 -8
  53. package/dist/analysis/automatic-config.d.ts +1 -1
  54. package/dist/analysis/automatic-config.js +2 -2
  55. package/dist/analysis/automatic.d.ts +10 -4
  56. package/dist/analysis/automatic.js +17 -13
  57. package/dist/analysis/diagnostics.d.ts +23 -0
  58. package/dist/analysis/diagnostics.js +112 -0
  59. package/dist/analysis/evidence-sources.js +2 -2
  60. package/dist/analysis/evidence.js +6 -6
  61. package/dist/analysis/execute.d.ts +7 -1
  62. package/dist/analysis/execute.js +39 -12
  63. package/dist/analysis/job.d.ts +8 -5
  64. package/dist/analysis/job.js +15 -14
  65. package/dist/analysis/load.d.ts +1 -1
  66. package/dist/analysis/load.js +5 -5
  67. package/dist/analysis/provider.d.ts +9 -1
  68. package/dist/analysis/restricted-codex.d.ts +2 -0
  69. package/dist/analysis/restricted-codex.js +10 -1
  70. package/dist/analysis/service.d.ts +2 -0
  71. package/dist/analysis/service.js +31 -12
  72. package/dist/analysis/sharing.d.ts +2 -2
  73. package/dist/analysis/sharing.js +5 -5
  74. package/dist/analysis/store-executions.d.ts +5 -5
  75. package/dist/analysis/store-executions.js +12 -12
  76. package/dist/analysis/store.d.ts +4 -4
  77. package/dist/analysis/store.js +13 -13
  78. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  79. package/dist/cli/commands/analysis-signals.js +4 -1
  80. package/dist/cli/commands/analyze.js +4 -2
  81. package/dist/cli/commands/comms.js +8 -1
  82. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  83. package/dist/cli/commands/lab-route-computer-use.js +26 -14
  84. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  85. package/dist/cli/commands/lab-route-preview.js +3 -4
  86. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  87. package/dist/cli/commands/lab-route-run.js +6 -2
  88. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  89. package/dist/cli/commands/lab-route-scripted.js +0 -1
  90. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  91. package/dist/cli/commands/lab-route-shared-world.js +0 -1
  92. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  93. package/dist/cli/commands/lab-route-terminal.js +0 -1
  94. package/dist/cli/commands/lab-run.js +76 -45
  95. package/dist/cli/commands/lab-scorer.d.ts +0 -2
  96. package/dist/cli/commands/lab.js +12 -6
  97. package/dist/cli/commands/observe.js +22 -0
  98. package/dist/cli/commands/run-signals.d.ts +30 -0
  99. package/dist/cli/commands/run-signals.js +146 -0
  100. package/dist/cli/commands/runs.js +10 -8
  101. package/dist/cli/commands/watch.js +12 -10
  102. package/dist/cli/doctor.d.ts +3 -0
  103. package/dist/cli/doctor.js +10 -2
  104. package/dist/cli/io.d.ts +5 -4
  105. package/dist/cli/io.js +12 -8
  106. package/dist/cli/program.js +3 -3
  107. package/dist/cli/renamed-options.d.ts +11 -0
  108. package/dist/cli/renamed-options.js +18 -0
  109. package/dist/cli/telemetry.d.ts +2 -2
  110. package/dist/cli/telemetry.js +1 -1
  111. package/dist/comms/capture-surface.d.ts +1 -1
  112. package/dist/comms/catch-host.d.ts +1 -1
  113. package/dist/comms/connections.js +4 -4
  114. package/dist/comms/external-evidence.d.ts +27 -0
  115. package/dist/comms/external-evidence.js +93 -0
  116. package/dist/comms/lease-store.js +7 -7
  117. package/dist/comms/types.js +1 -1
  118. package/dist/evidence/browser-hygiene.d.ts +1 -1
  119. package/dist/evidence/browser-hygiene.js +1 -1
  120. package/dist/evidence/redaction.js +1 -1
  121. package/dist/evidence/secret-scrub.d.ts +9 -0
  122. package/dist/evidence/secret-scrub.js +96 -0
  123. package/dist/feedback/draft.js +7 -9
  124. package/dist/feedback/export-bundle.js +4 -4
  125. package/dist/feedback/export.js +9 -9
  126. package/dist/feedback/feedback.d.ts +1 -1
  127. package/dist/index.d.ts +3 -6
  128. package/dist/index.js +3 -6
  129. package/dist/keys/key-resolution.d.ts +3 -1
  130. package/dist/keys/key-resolution.js +18 -16
  131. package/dist/lab/adapter-extension.d.ts +28 -6
  132. package/dist/lab/adapter-extension.js +65 -126
  133. package/dist/lab/adapter-scorer-loader.d.ts +25 -5
  134. package/dist/lab/adapter-scorer-loader.js +24 -0
  135. package/dist/lab/composition-rules.js +20 -20
  136. package/dist/lab/config.js +28 -26
  137. package/dist/lab/device-presets.d.ts +2 -2
  138. package/dist/lab/discover.js +1 -3
  139. package/dist/lab/doctor.d.ts +44 -9
  140. package/dist/lab/doctor.js +149 -41
  141. package/dist/lab/init-plan.js +1 -3
  142. package/dist/lab/keys.js +1 -1
  143. package/dist/lab/lab-deps.d.ts +85 -0
  144. package/dist/lab/lab-deps.js +4 -0
  145. package/dist/lab/parse/actors.js +8 -7
  146. package/dist/lab/parse/comms.js +3 -2
  147. package/dist/lab/parse/execution.js +3 -2
  148. package/dist/lab/parse/subject-state.js +2 -1
  149. package/dist/lab/parse/subject.js +2 -1
  150. package/dist/lab/parse/values.d.ts +0 -1
  151. package/dist/lab/parse/values.js +0 -3
  152. package/dist/lab/persona-resolve.d.ts +3 -3
  153. package/dist/lab/persona-resolve.js +4 -4
  154. package/dist/lab/persona.js +1 -3
  155. package/dist/lab/plan-base.d.ts +0 -2
  156. package/dist/lab/plan-base.js +6 -4
  157. package/dist/lab/plan-participants.d.ts +5 -5
  158. package/dist/lab/plan-participants.js +2 -2
  159. package/dist/lab/plan-types.d.ts +22 -4
  160. package/dist/lab/plan.d.ts +3 -11
  161. package/dist/lab/plan.js +18 -42
  162. package/dist/lab/preflight-result.js +0 -2
  163. package/dist/lab/preflight.d.ts +0 -3
  164. package/dist/lab/preflight.js +1 -1
  165. package/dist/lab/requirements.d.ts +20 -0
  166. package/dist/lab/requirements.js +54 -0
  167. package/dist/lab/route-inputs.d.ts +23 -12
  168. package/dist/lab/route-inputs.js +48 -51
  169. package/dist/lab/routing.d.ts +19 -24
  170. package/dist/lab/routing.js +14 -47
  171. package/dist/lab/run-lab-events.d.ts +6 -11
  172. package/dist/lab/run-lab-events.js +3 -11
  173. package/dist/lab/run-lab-homes.d.ts +64 -0
  174. package/dist/lab/run-lab-homes.js +3 -0
  175. package/dist/lab/run-lab-options.d.ts +12 -66
  176. package/dist/lab/run-lab-options.js +45 -275
  177. package/dist/lab/summary.d.ts +9 -4
  178. package/dist/lab/summary.js +15 -8
  179. package/dist/lab/types.d.ts +132 -132
  180. package/dist/lab/validation.d.ts +15 -15
  181. package/dist/lab/validation.js +28 -28
  182. package/dist/lab/warnings.js +20 -19
  183. package/dist/observer/artifact.d.ts +1 -1
  184. package/dist/observer/artifact.js +3 -3
  185. package/dist/observer/data.js +2 -2
  186. package/dist/observer/render.js +2 -2
  187. package/dist/observer/run-routes.d.ts +1 -1
  188. package/dist/observer/run-routes.js +5 -5
  189. package/dist/observer/serve.d.ts +17 -0
  190. package/dist/observer/serve.js +34 -3
  191. package/dist/routes/computer-use/bundle-parts.d.ts +1 -1
  192. package/dist/routes/computer-use/bundle-parts.js +10 -3
  193. package/dist/routes/computer-use/bundle.d.ts +4 -11
  194. package/dist/routes/computer-use/bundle.js +9 -15
  195. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  196. package/dist/routes/computer-use/diagnostics.js +1 -1
  197. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +10 -10
  198. package/dist/routes/computer-use/e2b-desktop/comms.js +11 -14
  199. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  200. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -7
  201. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +13 -13
  202. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -11
  203. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  204. package/dist/routes/computer-use/e2b-desktop/prepare.js +33 -36
  205. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  206. package/dist/routes/computer-use/e2b-desktop/start.js +24 -23
  207. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  208. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  209. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  210. package/dist/routes/computer-use/e2b-desktop/teardown.js +29 -17
  211. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  212. package/dist/routes/computer-use/external-comms.js +19 -43
  213. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  214. package/dist/routes/computer-use/fanout-bundle.js +25 -29
  215. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +25 -19
  216. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  217. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  218. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  219. package/dist/routes/computer-use/live-flush.js +19 -27
  220. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +12 -11
  221. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  222. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  223. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  224. package/dist/routes/computer-use/local-vm.js +39 -66
  225. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  226. package/dist/routes/computer-use/participant-desktop.js +5 -25
  227. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +10 -10
  228. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +35 -22
  229. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  230. package/dist/routes/computer-use/participant-facts.js +12 -1
  231. package/dist/routes/computer-use/participant-model.d.ts +19 -11
  232. package/dist/routes/computer-use/participant-model.js +49 -25
  233. package/dist/routes/computer-use/participant-prompt.d.ts +3 -3
  234. package/dist/routes/computer-use/participant-prompt.js +4 -4
  235. package/dist/routes/computer-use/participant-runs.d.ts +6 -6
  236. package/dist/routes/computer-use/participant-runs.js +8 -8
  237. package/dist/routes/computer-use/plan.d.ts +21 -29
  238. package/dist/routes/computer-use/plan.js +52 -60
  239. package/dist/routes/computer-use/preflight.d.ts +3 -5
  240. package/dist/routes/computer-use/preflight.js +20 -16
  241. package/dist/routes/computer-use/rerun-selection.js +10 -6
  242. package/dist/routes/computer-use/result.d.ts +1 -1
  243. package/dist/routes/computer-use/result.js +40 -30
  244. package/dist/routes/computer-use/route.d.ts +3 -4
  245. package/dist/routes/computer-use/route.js +21 -19
  246. package/dist/routes/computer-use/self-report.d.ts +2 -2
  247. package/dist/routes/computer-use/self-report.js +4 -4
  248. package/dist/routes/computer-use/setup.d.ts +8 -14
  249. package/dist/routes/computer-use/setup.js +96 -72
  250. package/dist/routes/computer-use/single-bundle.d.ts +8 -11
  251. package/dist/routes/computer-use/single-bundle.js +20 -25
  252. package/dist/routes/computer-use/subject-projection.d.ts +5 -7
  253. package/dist/routes/computer-use/subject-projection.js +20 -19
  254. package/dist/routes/computer-use/types.d.ts +169 -210
  255. package/dist/routes/computer-use/types.js +13 -5
  256. package/dist/routes/preview.js +0 -1
  257. package/dist/routes/scripted/bundle.d.ts +3 -6
  258. package/dist/routes/scripted/bundle.js +11 -16
  259. package/dist/routes/scripted/plan.d.ts +5 -7
  260. package/dist/routes/scripted/plan.js +6 -4
  261. package/dist/routes/scripted/result.d.ts +4 -1
  262. package/dist/routes/scripted/result.js +10 -6
  263. package/dist/routes/scripted/route.js +10 -11
  264. package/dist/routes/scripted/scenario.d.ts +1 -1
  265. package/dist/routes/scripted/scenario.js +1 -1
  266. package/dist/routes/scripted/setup.d.ts +3 -2
  267. package/dist/routes/scripted/setup.js +22 -21
  268. package/dist/routes/scripted/subject.d.ts +8 -3
  269. package/dist/routes/scripted/subject.js +9 -5
  270. package/dist/routes/scripted/surface-records.js +1 -1
  271. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  272. package/dist/routes/scripted/surface-sessions.js +4 -4
  273. package/dist/routes/scripted/types.d.ts +19 -36
  274. package/dist/routes/scripted/types.js +1 -2
  275. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +8 -8
  276. package/dist/routes/shared-world/bundle.d.ts +2 -2
  277. package/dist/routes/shared-world/bundle.js +22 -26
  278. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  279. package/dist/routes/shared-world/checkpoints.js +4 -4
  280. package/dist/routes/shared-world/comms.d.ts +5 -4
  281. package/dist/routes/shared-world/comms.js +28 -41
  282. package/dist/routes/shared-world/external-public.d.ts +5 -5
  283. package/dist/routes/shared-world/external-public.js +19 -20
  284. package/dist/routes/shared-world/handoff.d.ts +4 -4
  285. package/dist/routes/shared-world/handoff.js +50 -50
  286. package/dist/routes/shared-world/lobby-code.d.ts +5 -5
  287. package/dist/routes/shared-world/lobby-code.js +13 -13
  288. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +8 -6
  289. package/dist/routes/shared-world/{seats.js → participant-specs.js} +43 -48
  290. package/dist/routes/shared-world/plan.d.ts +2 -6
  291. package/dist/routes/shared-world/plan.js +1 -2
  292. package/dist/routes/shared-world/provenance.d.ts +4 -4
  293. package/dist/routes/shared-world/provenance.js +4 -4
  294. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  295. package/dist/routes/shared-world/provisioned.js +46 -40
  296. package/dist/routes/shared-world/result.js +31 -19
  297. package/dist/routes/shared-world/route.js +37 -41
  298. package/dist/routes/shared-world/setup.d.ts +5 -4
  299. package/dist/routes/shared-world/setup.js +12 -14
  300. package/dist/routes/shared-world/types.d.ts +53 -126
  301. package/dist/routes/shared-world/types.js +2 -2
  302. package/dist/routes/terminal/adapter.d.ts +8 -8
  303. package/dist/routes/terminal/adapter.js +28 -125
  304. package/dist/routes/terminal/bundle.d.ts +7 -12
  305. package/dist/routes/terminal/bundle.js +24 -34
  306. package/dist/routes/terminal/credentials.d.ts +2 -2
  307. package/dist/routes/terminal/credentials.js +16 -16
  308. package/dist/routes/terminal/dry-run.d.ts +1 -1
  309. package/dist/routes/terminal/dry-run.js +9 -11
  310. package/dist/routes/terminal/encoding.d.ts +1 -1
  311. package/dist/routes/terminal/encoding.js +2 -2
  312. package/dist/routes/terminal/ledger.d.ts +6 -6
  313. package/dist/routes/terminal/ledger.js +9 -9
  314. package/dist/routes/terminal/live-finish.d.ts +1 -2
  315. package/dist/routes/terminal/live-finish.js +21 -20
  316. package/dist/routes/terminal/live-sandbox.d.ts +3 -2
  317. package/dist/routes/terminal/live-sandbox.js +20 -20
  318. package/dist/routes/terminal/participant-text.d.ts +23 -0
  319. package/dist/routes/terminal/participant-text.js +165 -0
  320. package/dist/routes/terminal/plan.d.ts +2 -6
  321. package/dist/routes/terminal/plan.js +13 -9
  322. package/dist/routes/terminal/recorder.d.ts +6 -1
  323. package/dist/routes/terminal/recorder.js +12 -4
  324. package/dist/routes/terminal/result.js +4 -4
  325. package/dist/routes/terminal/route.js +26 -26
  326. package/dist/routes/terminal/runtime.d.ts +3 -2
  327. package/dist/routes/terminal/runtime.js +3 -3
  328. package/dist/routes/terminal/sandbox.d.ts +3 -3
  329. package/dist/routes/terminal/sandbox.js +9 -9
  330. package/dist/routes/terminal/session.js +16 -14
  331. package/dist/routes/terminal/token-usage.js +5 -5
  332. package/dist/routes/terminal/trace.d.ts +5 -8
  333. package/dist/routes/terminal/trace.js +9 -64
  334. package/dist/routes/terminal/types.d.ts +85 -93
  335. package/dist/routes/terminal/types.js +9 -4
  336. package/dist/run/active-runs.d.ts +13 -0
  337. package/dist/run/active-runs.js +12 -0
  338. package/dist/run/bundle-shape.d.ts +2 -1
  339. package/dist/run/bundle-shape.js +4 -4
  340. package/dist/run/bundle.d.ts +63 -56
  341. package/dist/run/bundle.js +9 -8
  342. package/dist/run/cost-summary.js +3 -2
  343. package/dist/run/costs.d.ts +6 -6
  344. package/dist/run/costs.js +10 -10
  345. package/dist/run/detail.d.ts +5 -5
  346. package/dist/run/detail.js +6 -6
  347. package/dist/run/dry-run.js +5 -12
  348. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  349. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  350. package/dist/run/feedback-shape.js +1 -1
  351. package/dist/run/judge.d.ts +16 -4
  352. package/dist/run/judge.js +24 -7
  353. package/dist/run/locate.d.ts +2 -0
  354. package/dist/run/locate.js +3 -1
  355. package/dist/run/outcomes.d.ts +3 -3
  356. package/dist/run/outcomes.js +3 -3
  357. package/dist/run/participant-records.d.ts +2 -2
  358. package/dist/run/participant-records.js +2 -2
  359. package/dist/run/paths.js +1 -1
  360. package/dist/run/pricing.d.ts +19 -9
  361. package/dist/run/pricing.js +30 -18
  362. package/dist/run/projection.d.ts +13 -13
  363. package/dist/run/projection.js +8 -8
  364. package/dist/run/reclaim.d.ts +6 -0
  365. package/dist/run/reclaim.js +13 -3
  366. package/dist/run/results.d.ts +1 -1
  367. package/dist/run/run-index.d.ts +1 -1
  368. package/dist/run/run-index.js +11 -11
  369. package/dist/run/run.d.ts +4 -2
  370. package/dist/run/run.js +9 -5
  371. package/dist/run/sandbox-receipts.d.ts +4 -4
  372. package/dist/run/sandbox-receipts.js +4 -4
  373. package/dist/run/shared-world-evidence.d.ts +47 -47
  374. package/dist/run/shared-world-shape.d.ts +3 -3
  375. package/dist/run/shared-world-shape.js +11 -11
  376. package/dist/run/stats.d.ts +5 -5
  377. package/dist/run/stats.js +8 -8
  378. package/dist/run/status.d.ts +16 -6
  379. package/dist/run/status.js +31 -8
  380. package/dist/run/streams.d.ts +26 -19
  381. package/dist/run/terminal-contract.d.ts +5 -5
  382. package/dist/run/terminal-contract.js +4 -4
  383. package/dist/run/transient-comms-secrets.d.ts +5 -0
  384. package/dist/run/transient-comms-secrets.js +12 -0
  385. package/dist/run-lab.d.ts +36 -34
  386. package/dist/run-lab.js +41 -37
  387. package/dist/subject/desktop-cli.d.ts +1 -1
  388. package/dist/subject/desktop-cli.js +1 -1
  389. package/dist/subject/local-tree-archive.d.ts +1 -1
  390. package/dist/subject/local-tree-archive.js +4 -4
  391. package/dist/subject/local-tree.d.ts +2 -2
  392. package/dist/subject/local-tree.js +1 -1
  393. package/dist/subject/node-bootstrap.d.ts +1 -1
  394. package/dist/subject/node-bootstrap.js +4 -4
  395. package/dist/subject/runtime.js +5 -5
  396. package/dist/subject/serve.js +1 -1
  397. package/dist/subject/steps.d.ts +4 -4
  398. package/dist/subject/steps.js +5 -5
  399. package/dist/substrates/e2b/cdp-probe.d.ts +2 -2
  400. package/dist/substrates/e2b/cdp-probe.js +1 -1
  401. package/dist/substrates/e2b/desktop-browser.d.ts +3 -3
  402. package/dist/substrates/e2b/desktop-browser.js +4 -4
  403. package/dist/substrates/e2b/desktop-cdp.d.ts +7 -7
  404. package/dist/substrates/e2b/desktop-cdp.js +4 -4
  405. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  406. package/dist/substrates/e2b/desktop-geometry.js +3 -3
  407. package/dist/substrates/e2b/desktop-media.js +2 -2
  408. package/dist/substrates/e2b/sandbox.js +1 -1
  409. package/dist/substrates/e2b/sdk.js +2 -2
  410. package/dist/substrates/local/runtime-host.d.ts +2 -0
  411. package/dist/substrates/local/runtime-host.js +6 -0
  412. package/dist/tui/actions.d.ts +7 -5
  413. package/dist/tui/actions.js +18 -9
  414. package/dist/tui-app.js +42 -42
  415. package/dist/verify/actor.d.ts +10 -10
  416. package/dist/verify/actor.js +15 -15
  417. package/dist/verify/artifacts.d.ts +1 -1
  418. package/dist/verify/artifacts.js +3 -3
  419. package/dist/verify/costs.d.ts +2 -2
  420. package/dist/verify/costs.js +2 -2
  421. package/dist/verify/liveness.d.ts +1 -1
  422. package/dist/verify/liveness.js +4 -1
  423. package/dist/verify/rerun.d.ts +1 -1
  424. package/dist/verify/rerun.js +1 -1
  425. package/dist/verify/shared-world.js +2 -2
  426. package/dist/verify/verify.js +6 -6
  427. package/docs/README.md +1 -1
  428. package/docs/architecture/actor-contract.md +60 -22
  429. package/docs/architecture/desktop-sessions.md +9 -9
  430. package/docs/architecture/external-public-shared-world.md +5 -0
  431. package/docs/architecture/observer.md +4 -4
  432. package/docs/architecture/restricted-codex-analysis.md +36 -2
  433. package/docs/architecture/state-driven-executor.md +4 -5
  434. package/docs/architecture/task-protocol-support.md +3 -5
  435. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +24 -16
  436. package/docs/contracts/run-bundle.md +10 -8
  437. package/docs/contracts/schemas.md +109 -53
  438. package/docs/contracts/study-analysis.md +24 -0
  439. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  440. package/docs/product/automatic-analysis.md +1 -0
  441. package/docs/ramp/README.md +2 -1
  442. package/package.json +4 -4
  443. package/skills/humanish/SKILL.md +3 -2
  444. package/skills/humanish/agents/openai.yaml +1 -1
  445. package/dist/deprecated.d.ts +0 -90
  446. package/dist/deprecated.js +0 -106
  447. package/dist/lab/bag-overrides.d.ts +0 -18
  448. package/dist/lab/bag-overrides.js +0 -121
  449. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  450. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  451. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  452. /package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +0 -0
  453. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -1,27 +1,27 @@
1
1
  import type { ActorTrace } from "../../actors/contract.js";
2
2
  import { type RunBundle, type RunScorerProvenance } from "../../run/bundle.js";
3
3
  import { type ScorerOutcome } from "../../lab/adapter-extension.js";
4
- import type { TerminalLedgers, TerminalProductLabHooks } from "./types.js";
4
+ import type { TerminalLedgers, TerminalScorer } from "./types.js";
5
5
  /**
6
6
  * Run the layer-6 product-adapter extension seam (issue #154 acceptance #8) over the assembled
7
- * evidence and attach its results to the bundle IN PLACE — without core knowing any product noun.
7
+ * evidence and attach its results to the bundle in place, without core knowing any product noun.
8
8
  * The review is not touched here: the returned failures are folded into it by the caller.
9
9
  *
10
10
  * - `score`: when present, the returned namespaced `RunAdapterScore` lands on `bundle.adapterScore`.
11
- * For a LIBRARY caller (no `scorerProvenance`), the adapter score is additive and never a
12
- * failure. For a CONFIG-DECLARED scorer (#316; `scorerProvenance` present), a status:"fail" is a
13
- * failure (the keystone lane is the product's own definition of pass/fail), and so is a scorer
14
- * that THROWS or returns a malformed value, so a crashed declared gate is never a silent green.
11
+ * For a library caller (no `scorerProvenance`), the adapter score is additive and never a
12
+ * failure. For a config-declared scorer (#316; `scorerProvenance` present), a status:"fail" is a
13
+ * failure (the keystone route is the product's own definition of pass/fail), and so is a scorer
14
+ * that throws or returns a malformed value, so a crashed declared gate is never a silent green.
15
15
  * - `deriveFeedback`: when present, the returned candidates are appended to
16
16
  * `bundle.feedbackCandidates`; each carries its own namespaced `adapter` product-noun block.
17
17
  *
18
18
  * Defense in depth: the adapter's namespaced payloads are re-serialized through the run's scrub +
19
- * redact, and any candidate / score that does not satisfy core's exported shape is DROPPED with a
19
+ * redact, and any candidate / score that does not satisfy core's exported shape is dropped with a
20
20
  * warning (a malformed adapter output never poisons a verifiable bundle). The bundle verifier
21
21
  * re-checks the surviving shapes downstream, so the seam stays fail-closed end to end.
22
22
  */
23
23
  export declare function applyAdapterExtensionSeam(args: {
24
- hooks: TerminalProductLabHooks;
24
+ scorer: TerminalScorer | undefined;
25
25
  bundle: RunBundle;
26
26
  trace: ActorTrace;
27
27
  ledgers: TerminalLedgers;
@@ -1,28 +1,27 @@
1
- import path from "node:path";
2
1
  import {} from "../../run/bundle.js";
3
- import { isFeedbackIdempotencyKey } from "../../run/feedback-shape.js";
4
- import { adapterScoreFailureMessage, declaredScorerThrew, DECLARED_SCORER_MALFORMED, frozenBundleView, } from "../../lab/adapter-extension.js";
2
+ import { isRunAdapterScore } from "../../run/bundle-shape.js";
3
+ import { adapterScoreFailureMessage, declaredScorerThrew, DECLARED_SCORER_MALFORMED, frozenBundleView, isAdapterFeedbackCandidate, } from "../../lab/adapter-extension.js";
5
4
  /**
6
5
  * Run the layer-6 product-adapter extension seam (issue #154 acceptance #8) over the assembled
7
- * evidence and attach its results to the bundle IN PLACE — without core knowing any product noun.
6
+ * evidence and attach its results to the bundle in place, without core knowing any product noun.
8
7
  * The review is not touched here: the returned failures are folded into it by the caller.
9
8
  *
10
9
  * - `score`: when present, the returned namespaced `RunAdapterScore` lands on `bundle.adapterScore`.
11
- * For a LIBRARY caller (no `scorerProvenance`), the adapter score is additive and never a
12
- * failure. For a CONFIG-DECLARED scorer (#316; `scorerProvenance` present), a status:"fail" is a
13
- * failure (the keystone lane is the product's own definition of pass/fail), and so is a scorer
14
- * that THROWS or returns a malformed value, so a crashed declared gate is never a silent green.
10
+ * For a library caller (no `scorerProvenance`), the adapter score is additive and never a
11
+ * failure. For a config-declared scorer (#316; `scorerProvenance` present), a status:"fail" is a
12
+ * failure (the keystone route is the product's own definition of pass/fail), and so is a scorer
13
+ * that throws or returns a malformed value, so a crashed declared gate is never a silent green.
15
14
  * - `deriveFeedback`: when present, the returned candidates are appended to
16
15
  * `bundle.feedbackCandidates`; each carries its own namespaced `adapter` product-noun block.
17
16
  *
18
17
  * Defense in depth: the adapter's namespaced payloads are re-serialized through the run's scrub +
19
- * redact, and any candidate / score that does not satisfy core's exported shape is DROPPED with a
18
+ * redact, and any candidate / score that does not satisfy core's exported shape is dropped with a
20
19
  * warning (a malformed adapter output never poisons a verifiable bundle). The bundle verifier
21
20
  * re-checks the surviving shapes downstream, so the seam stays fail-closed end to end.
22
21
  */
23
22
  export async function applyAdapterExtensionSeam(args) {
24
- const { hooks, bundle, trace, ledgers, transcript, product, labId, runId, sanitize, warnings, scorerProvenance, } = args;
25
- if (!hooks.score && !hooks.deriveFeedback)
23
+ const { scorer, bundle, trace, ledgers, transcript, product, labId, runId, sanitize, warnings, scorerProvenance, } = args;
24
+ if (!scorer?.score && !scorer?.deriveFeedback)
26
25
  return { failures: [] };
27
26
  const declared = scorerProvenance !== undefined;
28
27
  // Record the loaded scorer's identity regardless of hook outcome (a throwing/invalid scorer was
@@ -31,7 +30,7 @@ export async function applyAdapterExtensionSeam(args) {
31
30
  bundle.scorerProvenance = scorerProvenance;
32
31
  // The scorer sees a READ-ONLY view of the bundle so it cannot mutate noSpend/cost/review in place to
33
32
  // launder a verdict (a tamper attempt throws and is caught as a hook failure below). The seam stamps
34
- // the REAL bundle. The transcript is the SAME normalized, source-scrubbed text the run persists as
33
+ // the real bundle. The transcript is the same normalized, source-scrubbed text the run persists as
35
34
  // terminal-transcript.txt — no new exposure beyond what disk already holds (#341).
36
35
  const ctx = {
37
36
  bundle: frozenBundleView(bundle),
@@ -43,21 +42,22 @@ export async function applyAdapterExtensionSeam(args) {
43
42
  runId,
44
43
  };
45
44
  // Best-effort re-scrub of the adapter payload: round-trip the whole JSON through the run's denylist
46
- // sanitizer. This is NOT containment — it catches recognizable secret shapes and known local paths,
47
- // but not encoded/split/custom secrets, DB passwords, PII, or abs paths outside the denylist. A
45
+ // sanitizer. It is a scrub with no containment: it catches recognizable secret shapes and known
46
+ // local paths, and misses encoded/split/custom secrets, DB passwords, PII, or abs paths outside
47
+ // the denylist. A
48
48
  // payload from config-declared code is acceptable only because the trust boundary (the party who
49
49
  // declares the scorer runs the lab) already permits direct exfiltration; the re-scrub is
50
50
  // defense-in-depth, not a wall.
51
51
  const scrubValue = (value) => JSON.parse(sanitize(JSON.stringify(value)));
52
- // Set for a DECLARED scorer that fails to render a PASS verdict (status:"fail", malformed, or throw).
53
- // The caller folds it into the review and fails the run RESULT on it — a declared gate that cannot
52
+ // Set for a declared scorer that fails to render a pass verdict (status:"fail", malformed, or throw).
53
+ // The caller folds it into the review and fails the run result on it: a declared gate that cannot
54
54
  // pass is a fail, never a silent green. Empty for a library caller and for a passing scorer.
55
55
  const failures = [];
56
- if (hooks.score) {
56
+ if (scorer?.score) {
57
57
  try {
58
- const score = await hooks.score(ctx);
58
+ const score = await scorer.score(ctx);
59
59
  const cleaned = scrubValue(score);
60
- if (isAdapterScoreShape(cleaned)) {
60
+ if (isRunAdapterScore(cleaned)) {
61
61
  bundle.adapterScore = cleaned;
62
62
  // A CONFIG-DECLARED terminal scorer owns the product verdict: a status:"fail" fails the
63
63
  // review and the run result. A library caller keeps the additive no-fail behavior.
@@ -66,136 +66,39 @@ export async function applyAdapterExtensionSeam(args) {
66
66
  failures.push(message);
67
67
  }
68
68
  else {
69
- warnings.push("terminalHooks.score returned a value that is not a well-formed humanish.adapter-score.v1 (non-empty namespace + status + numeric score + summary); dropped so the bundle stays verifiable.");
70
- // A declared gate that returned a MALFORMED value never rendered a verdict — fail closed.
69
+ warnings.push("scorer.score returned a value that is not a well-formed humanish.adapter-score.v1 (non-empty namespace + status + numeric score + summary); dropped so the bundle stays verifiable.");
70
+ // A declared gate that returned a malformed value never rendered a verdict, so it fails closed.
71
71
  if (declared)
72
72
  failures.push(DECLARED_SCORER_MALFORMED);
73
73
  }
74
74
  }
75
75
  catch (error) {
76
76
  const detail = sanitize(error instanceof Error ? error.message : String(error));
77
- warnings.push(`terminalHooks.score threw (${detail}); dropped so the bundle stays verifiable.`);
78
- // A crashed DECLARED gate must be visible, never a silent pass: it fails the review and the
77
+ warnings.push(`scorer.score threw (${detail}); dropped so the bundle stays verifiable.`);
78
+ // A crashed declared gate must be visible, never a silent pass: it fails the review and the
79
79
  // run result.
80
80
  if (declared)
81
81
  failures.push(declaredScorerThrew(detail));
82
82
  }
83
83
  }
84
- if (hooks.deriveFeedback) {
84
+ if (scorer?.deriveFeedback) {
85
85
  try {
86
- const candidates = await hooks.deriveFeedback(ctx);
86
+ const candidates = await scorer.deriveFeedback(ctx);
87
87
  const accepted = [];
88
88
  for (const candidate of Array.isArray(candidates) ? candidates : []) {
89
89
  const cleaned = scrubValue(candidate);
90
- if (isAdapterFeedbackCandidateShape(cleaned))
90
+ if (isAdapterFeedbackCandidate(cleaned))
91
91
  accepted.push(cleaned);
92
92
  else
93
- warnings.push("terminalHooks.deriveFeedback returned a candidate that is not a well-formed humanish.feedback-candidate.v1 (or its adapter block lacked a non-empty namespace + data record); dropped so the bundle stays verifiable.");
93
+ warnings.push("scorer.deriveFeedback returned a candidate that is not a well-formed humanish.feedback-candidate.v1 (or its adapter block lacked a non-empty namespace + data record); dropped so the bundle stays verifiable.");
94
94
  }
95
95
  if (accepted.length > 0) {
96
96
  bundle.feedbackCandidates = [...bundle.feedbackCandidates, ...accepted];
97
97
  }
98
98
  }
99
99
  catch (error) {
100
- warnings.push(`terminalHooks.deriveFeedback threw (${sanitize(error instanceof Error ? error.message : String(error))}); dropped so the bundle stays verifiable.`);
100
+ warnings.push(`scorer.deriveFeedback threw (${sanitize(error instanceof Error ? error.message : String(error))}); dropped so the bundle stays verifiable.`);
101
101
  }
102
102
  }
103
103
  return { failures };
104
104
  }
105
- /** Structural guard for an adapter-returned RunAdapterScore (mirrors run/bundle-shape.ts isRunAdapterScore, kept
106
- * local so the lane fails closed at the seam BEFORE the bundle verifier re-checks it). */
107
- function isAdapterScoreShape(value) {
108
- return (typeof value === "object" &&
109
- value !== null &&
110
- !Array.isArray(value) &&
111
- value.schema === "humanish.adapter-score.v1" &&
112
- typeof value.namespace === "string" &&
113
- value.namespace.trim().length > 0 &&
114
- ["pass", "partial", "fail"].includes(value.status) &&
115
- typeof value.score === "number" &&
116
- Number.isFinite(value.score) &&
117
- typeof value.summary === "string");
118
- }
119
- /** Structural guard for an adapter-returned feedback candidate. This mirrors run/feedback-shape.ts's full
120
- * isRunFeedbackCandidate predicate, including its local evidence-path contract, so a malformed
121
- * candidate is dropped at the extension seam instead of poisoning the persisted bundle. */
122
- function isAdapterFeedbackCandidateShape(value) {
123
- return (isAdapterRecord(value) &&
124
- value.schema === "humanish.feedback-candidate.v1" &&
125
- typeof value.id === "string" &&
126
- typeof value.run_id === "string" &&
127
- (typeof value.stream_id === "string" || value.stream_id === undefined) &&
128
- typeof value.adapter_id === "string" &&
129
- typeof value.scenario_id === "string" &&
130
- typeof value.persona_id === "string" &&
131
- isAdapterFeedbackActor(value.actor) &&
132
- isAdapterFeedbackSubstrate(value.substrate) &&
133
- isAdapterFeedbackFailureOwner(value.failure_owner) &&
134
- typeof value.summary === "string" &&
135
- value.summary.trim().length > 0 &&
136
- typeof value.expected === "string" &&
137
- typeof value.actual === "string" &&
138
- Array.isArray(value.evidence) &&
139
- value.evidence.every(isAdapterFeedbackEvidence) &&
140
- isAdapterRecord(value.redaction) &&
141
- value.redaction.status === "passed" &&
142
- typeof value.redaction.notes === "string" &&
143
- isFeedbackIdempotencyKey(value.idempotency_key) &&
144
- isAdapterFeedbackNextState(value.proposed_next_state) &&
145
- Array.isArray(value.acceptance_proof) &&
146
- value.acceptance_proof.every((item) => typeof item === "string") &&
147
- (value.adapter === undefined ||
148
- (isAdapterRecord(value.adapter) &&
149
- typeof value.adapter.namespace === "string" &&
150
- value.adapter.namespace.trim().length > 0 &&
151
- isAdapterRecord(value.adapter.data))));
152
- }
153
- function isAdapterFeedbackEvidence(value) {
154
- return (isAdapterRecord(value) &&
155
- typeof value.path === "string" &&
156
- value.path.length > 0 &&
157
- !path.isAbsolute(value.path) &&
158
- !value.path.includes("://") &&
159
- !value.path.includes("..") &&
160
- (value.kind === "review" ||
161
- value.kind === "state" ||
162
- value.kind === "log" ||
163
- value.kind === "trace" ||
164
- value.kind === "screenshot" ||
165
- value.kind === "filesystem") &&
166
- typeof value.note === "string");
167
- }
168
- function isAdapterFeedbackActor(value) {
169
- return (value === "codex-tui" ||
170
- value === "codex-exec" ||
171
- value === "codex-app-server" ||
172
- value === "computer-use" ||
173
- value === "synthetic-dry-run" ||
174
- value === "unknown");
175
- }
176
- function isAdapterFeedbackSubstrate(value) {
177
- return (value === "e2b-desktop" ||
178
- value === "local-desktop" ||
179
- value === "e2b-terminal" ||
180
- value === "local-filesystem" ||
181
- value === "codex-app-server" ||
182
- value === "unknown");
183
- }
184
- function isAdapterFeedbackFailureOwner(value) {
185
- return (value === "harness" ||
186
- value === "target-app" ||
187
- value === "actor" ||
188
- value === "environment" ||
189
- value === "unknown");
190
- }
191
- function isAdapterFeedbackNextState(value) {
192
- return (value === "watch" ||
193
- value === "adapter-hardening" ||
194
- value === "target-app-setup" ||
195
- value === "actor-auth" ||
196
- value === "setup-quality-review" ||
197
- value === "study-quality-review");
198
- }
199
- function isAdapterRecord(value) {
200
- return typeof value === "object" && value !== null && !Array.isArray(value);
201
- }
@@ -1,21 +1,19 @@
1
1
  import type { ActorPersonaRef, ActorTrace } from "../../actors/contract.js";
2
- import { type RunLabProvenance } from "../../run/status.js";
3
2
  import type { LabScenarioCaps, LabRuntimeAuth } from "../../lab/types.js";
4
- import { type RunBundle, type RunCostSummary } from "../../run/bundle.js";
3
+ import { type RunBundle, type RunCostSummary, type BundleRun } from "../../run/bundle.js";
5
4
  import type { Verdict } from "../../run/judge.js";
6
5
  import type { TerminalLedgers } from "./types.js";
7
6
  /**
8
7
  * Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change — a new
9
8
  * producer only). DRY-RUN: a contract bundle. The terminal stream is a contract placeholder
10
- * (stdin disabled, no captured tail — honest: nothing ran), the subject is declared UNPINNED, and
9
+ * (stdin disabled, no captured tail, because nothing ran), the subject is declared unpinned, and
11
10
  * the caps/policies/runtime-auth declarations are recorded without pretending that live ledgers
12
11
  * exist. The shipped live builder fills the same evidence contract. Exported for tests.
13
12
  */
14
13
  export declare function buildTerminalProductBundle(args: {
15
- /** Lab provenance for the bundle\'s own `lab` field (#455). */
16
- lab?: RunLabProvenance;
14
+ /** The run this bundle belongs to; the bundle head reads its id, mode, start and lab. */
15
+ run: BundleRun;
17
16
  actorId: string;
18
- createdAt: string;
19
17
  dryRun: boolean;
20
18
  labId: string;
21
19
  labTitle?: string;
@@ -32,23 +30,21 @@ export declare function buildTerminalProductBundle(args: {
32
30
  allowPaymentCredentials: boolean;
33
31
  allowGitHubMutation: boolean;
34
32
  };
35
- runId: string;
36
33
  source: RunBundle["source"];
37
34
  /** The run's judgment verdict (judgeTerminal): a contract for a dry run. */
38
35
  verdict: Verdict;
39
36
  }): RunBundle;
40
37
  /**
41
- * Build the LIVE terminal-product run bundle (mode "live") from the captured session: the actor
38
+ * Build the live terminal-product run bundle (mode "live") from the captured session: the actor
42
39
  * trace seam (stream.actor = trace), the substrate-lifecycle events, the terminal stream with the
43
40
  * redacted transcript tail, and references to the written evidence artifacts (terminal event
44
41
  * stream, transcript, ledgers, actor trace). verifyRun's terminal-product check (gated on
45
42
  * mode==="live") enforces the ledgers + proven cleanup + interventions-present over this bundle.
46
43
  */
47
44
  export declare function buildLiveTerminalProductBundle(args: {
48
- /** Lab provenance for the bundle\'s own `lab` field (#455). */
49
- lab?: RunLabProvenance;
45
+ /** The run this bundle belongs to; the bundle head reads its id, mode, start and lab. */
46
+ run: BundleRun;
50
47
  actorId: string;
51
- createdAt: string;
52
48
  labId: string;
53
49
  labTitle?: string;
54
50
  mission: string;
@@ -64,7 +60,6 @@ export declare function buildLiveTerminalProductBundle(args: {
64
60
  allowPaymentCredentials: boolean;
65
61
  allowGitHubMutation: boolean;
66
62
  };
67
- runId: string;
68
63
  source: RunBundle["source"];
69
64
  trace: ActorTrace;
70
65
  ledgers: TerminalLedgers;
@@ -1,4 +1,3 @@
1
- import {} from "../../run/status.js";
2
1
  import { redactText } from "../../evidence/redaction.js";
3
2
  import { participantAssignment } from "../../lab/participant-assignment.js";
4
3
  import { REVIEW_SCHEMA, bundleArtifacts, bundleHead, } from "../../run/bundle.js";
@@ -9,21 +8,21 @@ import { describeMeasuredSpend, noSpendLineMeasured, noSpendNotEstablished } fro
9
8
  /**
10
9
  * Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change — a new
11
10
  * producer only). DRY-RUN: a contract bundle. The terminal stream is a contract placeholder
12
- * (stdin disabled, no captured tail — honest: nothing ran), the subject is declared UNPINNED, and
11
+ * (stdin disabled, no captured tail, because nothing ran), the subject is declared unpinned, and
13
12
  * the caps/policies/runtime-auth declarations are recorded without pretending that live ledgers
14
13
  * exist. The shipped live builder fills the same evidence contract. Exported for tests.
15
14
  */
16
15
  export function buildTerminalProductBundle(args) {
17
16
  const reason = "Contract bundle only: dry-run declared the terminal-product study contract without creating an E2B sandbox, injecting any key, or spending. This run did not execute an agent or prove live behavior.";
18
- // The terminal stream is a CONTRACT PLACEHOLDER on the dry-run path: stdin is disabled and no
19
- // exec output was captured, so the tail is empty and transport stays "snapshot" — NOT "pty"
17
+ // The terminal stream is a contract placeholder on the dry-run path: stdin is disabled and no
18
+ // exec output was captured, so the tail is empty and transport stays "snapshot", never "pty"
20
19
  // (captured non-interactive exec output is never an interactive PTY; invariant 6 + the PTY
21
20
  // ruling). The shipped live builder fills terminal.tail from redacted exec-stream capture.
22
21
  const { simulation, stream } = terminalParticipant(args, {
23
22
  status: "contract_proof_only",
24
23
  reason,
25
24
  summary: `Contract participant for the terminal agent (${args.actorId}) studying ${args.productName} from public surfaces.`,
26
- updatedAt: args.createdAt,
25
+ updatedAt: args.run.createdAt,
27
26
  stdin: args.stdin,
28
27
  tail: "",
29
28
  artifacts: [
@@ -36,40 +35,40 @@ export function buildTerminalProductBundle(args) {
36
35
  const events = [
37
36
  {
38
37
  id: "event-000-created",
39
- at: args.createdAt,
38
+ at: args.run.createdAt,
40
39
  level: "info",
41
40
  type: "terminal-lab.run.created",
42
41
  message: `Created terminal-product lab run for ${args.labId} (actor ${args.actorId}, product ${args.productName}).`,
43
42
  },
44
43
  participantEvent(TERMINAL_IDS, {
45
44
  id: "event-001-subject",
46
- at: args.createdAt,
45
+ at: args.run.createdAt,
47
46
  level: "info",
48
47
  type: "terminal-lab.subject.declared",
49
- // Invariant 5: provenance recorded or its absence DECLARED. The agent drives PUBLIC surfaces,
50
- // not a clone, so the subject provenance is explicitly UNPINNED; evidence binds to the
48
+ // Invariant 5: provenance recorded or its absence declared. The agent drives public surfaces
49
+ // and nothing is cloned, so the subject provenance is explicitly unpinned; evidence binds to the
51
50
  // composed-prompt digest. Public surfaces are recorded (they are public by declaration).
52
51
  message: `Subject product declared: ${args.productName}; public surfaces: ${args.publicSurfaces.join(", ")}. The lab did not provision/clone the product — subject provenance is UNPINNED (a public-surface study cannot be commit-pinned); evidence binds to the composed-prompt digest ${args.persona.promptDigest}.`,
53
52
  }),
54
53
  participantEvent(TERMINAL_IDS, {
55
54
  id: "event-002-credentials",
56
- at: args.createdAt,
55
+ at: args.run.createdAt,
57
56
  level: "info",
58
57
  type: "terminal-lab.credentials.declared",
59
- // Names-only evidence (invariant 1): the runtime-auth CHANNEL is declared; no value is ever
58
+ // Names-only evidence (invariant 1): the runtime-auth channel is declared; no value is ever
60
59
  // recorded. The deny-by-default policies are recorded so the credential posture is auditable.
61
60
  message: `Runtime auth channel: ${args.runtimeAuth ?? "none declared"} (names only; values never persist; the live engine applies the selected key placement, while this dry-run performs no injection). Credential policies (deny-by-default): allowPrivateRepoAccess=${args.policies.allowPrivateRepoAccess}, allowProviderCredentials=${args.policies.allowProviderCredentials}, allowPaymentCredentials=${args.policies.allowPaymentCredentials}, allowGitHubMutation=${args.policies.allowGitHubMutation}.`,
62
61
  }),
63
62
  participantEvent(TERMINAL_IDS, {
64
63
  id: "event-003-caps",
65
- at: args.createdAt,
64
+ at: args.run.createdAt,
66
65
  level: "info",
67
66
  type: "terminal-lab.caps.declared",
68
67
  message: `Spend/job/time caps: ${capsText}. A live run never exercises the runtime key without a fail-closed cap; its no-spend proof is derived from the persisted cost ledger. This dry-run spends $0 by mechanism.`,
69
68
  }),
70
69
  participantEvent(TERMINAL_IDS, {
71
70
  id: "event-004-contract",
72
- at: args.createdAt,
71
+ at: args.run.createdAt,
73
72
  level: "info",
74
73
  type: "terminal-lab.contract.ready",
75
74
  message: "Dry-run contract bundle ready. Switch scenario.mode to live with the required runtime auth and caps to exercise the in-sandbox agent route, captured exec stream, and declared runtime-auth placement.",
@@ -85,10 +84,9 @@ export function buildTerminalProductBundle(args) {
85
84
  ],
86
85
  };
87
86
  return terminalRunBundle(args, {
88
- mode: args.dryRun ? "dry-run" : "live",
89
87
  lifecycle: [
90
88
  {
91
- at: args.createdAt,
89
+ at: args.run.createdAt,
92
90
  event: "terminal-lab.run.created",
93
91
  message: `Created terminal-product lab run with one in-sandbox agent participant (actor ${args.actorId}, product ${args.productName}).`,
94
92
  },
@@ -101,7 +99,7 @@ export function buildTerminalProductBundle(args) {
101
99
  });
102
100
  }
103
101
  /**
104
- * Build the LIVE terminal-product run bundle (mode "live") from the captured session: the actor
102
+ * Build the live terminal-product run bundle (mode "live") from the captured session: the actor
105
103
  * trace seam (stream.actor = trace), the substrate-lifecycle events, the terminal stream with the
106
104
  * redacted transcript tail, and references to the written evidence artifacts (terminal event
107
105
  * stream, transcript, ledgers, actor trace). verifyRun's terminal-product check (gated on
@@ -115,10 +113,10 @@ export function buildLiveTerminalProductBundle(args) {
115
113
  : args.trace.status === "timed_out"
116
114
  ? "timed_out"
117
115
  : "failed";
118
- const messageItem = args.trace.items.find((item) => item.kind === "message");
119
- const tail = (messageItem?.text ?? args.trace.reason).slice(0, 2000);
116
+ const commandItem = args.trace.items.find((item) => item.kind === "command");
117
+ const tail = (commandItem?.command?.outputTail || args.trace.reason).slice(0, 2000);
120
118
  // transport "snapshot": the persisted tail is a redacted snapshot of the captured exec output,
121
- // NOT an interactive PTY (stdin disabled). The actor trace seam carries the structured evidence.
119
+ // never an interactive PTY (stdin disabled). The actor trace seam carries the structured evidence.
122
120
  const { simulation, stream } = terminalParticipant(args, {
123
121
  status: recordStatus,
124
122
  reason: args.sessionReason,
@@ -149,9 +147,9 @@ export function buildLiveTerminalProductBundle(args) {
149
147
  type: record.event,
150
148
  message: record.message,
151
149
  }));
152
- // Surface the no-spend proof as a first-class bundle event so the Observer/review can SHOW it.
153
- // It is DERIVED from the cost ledger (never asserted): it lists the known-zero lines it vouches
154
- // for AND the unmeasured (null) lines it explicitly cannot vouch for.
150
+ // Surface the no-spend proof as a first-class bundle event so the Observer/review can show it.
151
+ // It is derived from the cost ledger (never asserted): it lists the known-zero lines it vouches
152
+ // for and the unmeasured (null) lines it explicitly cannot vouch for.
155
153
  const noSpend = args.ledgers.noSpendProof;
156
154
  lifecycleEvents.push(participantEvent(TERMINAL_IDS, {
157
155
  id: "event-cost-no-spend-proof",
@@ -169,7 +167,7 @@ export function buildLiveTerminalProductBundle(args) {
169
167
  ? []
170
168
  : [`Agent session ended ${args.trace.status}: ${args.sessionReason}`]),
171
169
  ...(args.capFailure === undefined ? [] : [args.capFailure]),
172
- // Honesty gap: the no-spend proof always declares which spend lines it could NOT measure, so a
170
+ // Honesty gap: the no-spend proof always declares which spend lines it could not measure, so a
173
171
  // green run never silently over-claims a fully-proven $0.
174
172
  ...(noSpend.unmeasuredLines.length > 0
175
173
  ? [
@@ -179,7 +177,6 @@ export function buildLiveTerminalProductBundle(args) {
179
177
  ],
180
178
  };
181
179
  return terminalRunBundle(args, {
182
- mode: "live",
183
180
  lifecycle: args.ledgers.lifecycle.map((record) => ({
184
181
  at: record.at,
185
182
  event: record.event,
@@ -206,7 +203,7 @@ function terminalParticipant(args, session) {
206
203
  progress: 100,
207
204
  currentStep: session.reason,
208
205
  summary: session.summary,
209
- startedAt: args.createdAt,
206
+ startedAt: args.run.createdAt,
210
207
  updatedAt: session.updatedAt,
211
208
  });
212
209
  const stream = participantStream(TERMINAL_IDS, {
@@ -232,17 +229,10 @@ function terminalParticipant(args, session) {
232
229
  });
233
230
  return { simulation, stream };
234
231
  }
235
- /** The run bundle around the lane: the fields both builders fill the same way. */
232
+ /** The run bundle around the terminal session: the fields both builders fill the same way. */
236
233
  function terminalRunBundle(args, parts) {
237
234
  return {
238
- ...bundleHead({
239
- runId: args.runId,
240
- mode: parts.mode,
241
- participants: 1,
242
- createdAt: args.createdAt,
243
- ...(args.lab === undefined ? {} : { lab: args.lab }),
244
- source: args.source,
245
- }),
235
+ ...bundleHead(args.run, { participants: 1, source: args.source }),
246
236
  persona: {
247
237
  id: args.persona.id,
248
238
  name: `Autonomous terminal agent (${args.persona.id})`,
@@ -22,8 +22,8 @@ export declare function buildRuntimeAuth(args: {
22
22
  message: string;
23
23
  };
24
24
  /**
25
- * Build the sandbox metadata from a POSITIVE ALLOWLIST (safety contract item 6). This is the ONLY
26
- * way metadata is set on the terminal lane — it carries solely non-secret labels and rejects any
25
+ * Build the sandbox metadata from a positive allowlist (safety contract item 6). This is the only
26
+ * way metadata is set on the terminal route — it carries solely non-secret labels and rejects any
27
27
  * value that is not a plain short label. A verifier check asserts the persisted metadata has no
28
28
  * prompt/token/secret shapes; this builder makes that true by construction.
29
29
  */
@@ -7,22 +7,22 @@ import { TERMINAL_PRODUCT_LAB_PROVIDER_METADATA } from "./types.js";
7
7
  * credential is forwarded. The real value must never be logged or persisted in either mode.
8
8
  */
9
9
  export function buildRuntimeAuth(args) {
10
- // The "openai-env" channel accepts CODEX_API_KEY or OPENAI_API_KEY as the runtime key SOURCE
10
+ // The "openai-env" channel accepts CODEX_API_KEY or OPENAI_API_KEY as the runtime key source
11
11
  // name, read in this preference order. CODEX_API_KEY is preferred: the official Codex docs
12
- // (developers.openai.com/codex/noninteractive) document it as the channel for a SINGLE codex exec
13
- // invocation, which is exactly this lane's shape (no persisted auth.json/CODEX_HOME, per-command
12
+ // (developers.openai.com/codex/noninteractive) document it as the channel for a single codex exec
13
+ // invocation, which is exactly this route's shape (no persisted auth.json/CODEX_HOME, per-command
14
14
  // envs only). A dated in-repo receipt
15
15
  // (docs/goals/humanish-recursive-proof-critical-point/receipts/actor-required-attempt.md) shows a
16
16
  // job-wide OPENAI_API_KEY alone failing bearer auth for this same pinned-exec pattern. When the
17
- // operator only exported OPENAI_API_KEY, its value is ALSO injected under CODEX_API_KEY below, so
17
+ // operator only exported OPENAI_API_KEY, its value is also injected under CODEX_API_KEY below, so
18
18
  // the documented exec auth channel is always populated regardless of which name the operator
19
- // used. The ALLOWLIST is exactly these two names; everything else is denied by construction.
19
+ // used. The allowlist is exactly these two names; everything else is denied by construction.
20
20
  const ALLOWED_RUNTIME_KEY_NAMES = ["CODEX_API_KEY", "OPENAI_API_KEY"];
21
- // Tripwire (safety contract item 4): if a FUTURE widening of ALLOWED_RUNTIME_KEY_NAMES ever
21
+ // Tripwire (safety contract item 4): if a future widening of ALLOWED_RUNTIME_KEY_NAMES ever
22
22
  // added a clearly-non-runtime credential (a GitHub/payment/deploy/db secret), fail closed. The
23
- // generic `*_KEY` shape is deliberately NOT a tripwire here, since a runtime key legitimately
23
+ // generic `*_KEY` shape is deliberately left out of the tripwire, since a runtime key legitimately
24
24
  // ends in _KEY (CODEX_API_KEY/OPENAI_API_KEY), so testing it against the generic shape would
25
- // false-positive on the very key this lane exists to inject. The positive allowlist itself is
25
+ // false-positive on the very key this route exists to inject. The positive allowlist itself is
26
26
  // the real boundary: the command env is built from exactly these names and nothing else (so
27
27
  // GITHUB_TOKEN/payment/db keys present in the operator env are never forwarded, proven by the
28
28
  // deterministic test).
@@ -42,9 +42,9 @@ export function buildRuntimeAuth(args) {
42
42
  };
43
43
  }
44
44
  const keyValue = args.env[keyName];
45
- // The command-scoped env is the ALLOWLIST: exactly the runtime key name(s), nothing else. No
45
+ // The command-scoped env is the allowlist: exactly the runtime key name(s). No
46
46
  // GITHUB_TOKEN/GH_TOKEN, no payment/deploy/db/media key, excluded by construction. When the
47
- // SOURCE was OPENAI_API_KEY, the SAME value is also injected as CODEX_API_KEY so codex exec's
47
+ // source was OPENAI_API_KEY, the same value is also injected as CODEX_API_KEY so codex exec's
48
48
  // documented single-invocation auth channel is populated either way (see the comment above).
49
49
  const mode = args.runtimeAuth ?? "openai-env";
50
50
  const envs = mode === "openai-egress"
@@ -62,11 +62,11 @@ export function buildRuntimeAuth(args) {
62
62
  keyValue,
63
63
  };
64
64
  }
65
- // Clearly-non-runtime credential NAME shapes. Used as the runtime-key allowlist tripwire (a
66
- // runtime key must never be one of these). Deliberately EXCLUDES the generic `*_KEY` shape: the
67
- // runtime key this lane injects (CODEX_API_KEY/OPENAI_API_KEY) legitimately ends in _KEY, so the
65
+ // Clearly-non-runtime credential name shapes. Used as the runtime-key allowlist tripwire (a
66
+ // runtime key must never be one of these). Deliberately excludes the generic `*_KEY` shape: the
67
+ // runtime key this route injects (CODEX_API_KEY/OPENAI_API_KEY) legitimately ends in _KEY, so the
68
68
  // generic shape would false-positive on it. The positive allowlist, not a denylist, is what
69
- // keeps every OTHER operator-env credential (GitHub/payment/deploy/db/media keys) out of the
69
+ // keeps every other operator-env credential (GitHub/payment/deploy/db/media keys) out of the
70
70
  // sandbox: the command env is built from exactly the allowlisted runtime key and nothing else.
71
71
  const NON_RUNTIME_CREDENTIAL_NAME_PATTERNS = [
72
72
  /^GITHUB_TOKEN$/i,
@@ -84,8 +84,8 @@ function isNonRuntimeCredentialName(name) {
84
84
  return NON_RUNTIME_CREDENTIAL_NAME_PATTERNS.some((pattern) => pattern.test(name));
85
85
  }
86
86
  /**
87
- * Build the sandbox metadata from a POSITIVE ALLOWLIST (safety contract item 6). This is the ONLY
88
- * way metadata is set on the terminal lane — it carries solely non-secret labels and rejects any
87
+ * Build the sandbox metadata from a positive allowlist (safety contract item 6). This is the only
88
+ * way metadata is set on the terminal route — it carries solely non-secret labels and rejects any
89
89
  * value that is not a plain short label. A verifier check asserts the persisted metadata has no
90
90
  * prompt/token/secret shapes; this builder makes that true by construction.
91
91
  */
@@ -15,7 +15,7 @@ export declare function runDryTerminalLab(args: {
15
15
  failed: RunLiveTerminalSessionArgs["failed"];
16
16
  scope: RunScope;
17
17
  }): Promise<TerminalProductLabResult>;
18
- /** Compose the full prompt the agent would run. Bound to evidence by DIGEST only. */
18
+ /** Compose the full prompt the agent would run. Bound to evidence by digest only. */
19
19
  export declare function composePrompt(args: {
20
20
  mission: string;
21
21
  personaLine: string;