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,38 +1,37 @@
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
- * 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.
5
+ * Run the product-adapter extension seam over the assembled
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 (`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
29
28
  // still loaded and attempted).
30
29
  if (scorerProvenance)
31
30
  bundle.scorerProvenance = scorerProvenance;
32
- // The scorer sees a READ-ONLY view of the bundle so it cannot mutate noSpend/cost/review in place to
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
35
- // terminal-transcript.txt — no new exposure beyond what disk already holds (#341).
33
+ // the real bundle. The transcript is the same normalized, source-scrubbed text the run persists as
34
+ // terminal-transcript.txt, so the scorer sees nothing beyond what disk already holds.
36
35
  const ctx = {
37
36
  bundle: frozenBundleView(bundle),
38
37
  trace,
@@ -43,159 +42,63 @@ 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
- // A CONFIG-DECLARED terminal scorer owns the product verdict: a status:"fail" fails the
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.
64
64
  const message = declared ? adapterScoreFailureMessage(bundle) : undefined;
65
65
  if (message !== undefined)
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";
5
- import type { Verdict } from "../../run/judge.js";
3
+ import { type RunBundle, type RunCostSummary, type BundleRun } from "../../run/bundle.js";
4
+ import { type Verdict } from "../../run/judge.js";
6
5
  import type { TerminalLedgers } from "./types.js";
7
6
  /**
8
- * Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change — a new
9
- * 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
7
+ * Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change: a new
8
+ * producer only). Dry run: a contract bundle. The terminal stream is a contract placeholder
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,29 +1,29 @@
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";
4
+ import { verdictText } from "../../run/judge.js";
5
5
  import {} from "../../run/streams.js";
6
6
  import { participantEvent, participantIds, participantRecord, participantStream, } from "../../run/participant-records.js";
7
7
  import { TERMINAL_EVENTS_ARTIFACT, TERMINAL_LEDGERS_ARTIFACT, TERMINAL_TRANSCRIPT_ARTIFACT, } from "../../run/terminal-contract.js";
8
8
  import { describeMeasuredSpend, noSpendLineMeasured, noSpendNotEstablished } from "./ledger.js";
9
9
  /**
10
- * Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change — a new
11
- * producer only). DRY-RUN: a contract bundle. The terminal stream is a contract placeholder
12
- * (stdin disabled, no captured tail — honest: nothing ran), the subject is declared UNPINNED, and
10
+ * Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change: a new
11
+ * producer only). Dry run: a contract bundle. The terminal stream is a contract placeholder
12
+ * (stdin disabled, no captured tail, because nothing ran), the subject is declared unpinned, and
13
13
  * the caps/policies/runtime-auth declarations are recorded without pretending that live ledgers
14
14
  * exist. The shipped live builder fills the same evidence contract. Exported for tests.
15
15
  */
16
16
  export function buildTerminalProductBundle(args) {
17
- 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"
20
- // (captured non-interactive exec output is never an interactive PTY; invariant 6 + the PTY
21
- // ruling). The shipped live builder fills terminal.tail from redacted exec-stream capture.
17
+ const reason = "Dry run: the terminal-product study was declared without creating an E2B sandbox, injecting any key, or spending. This run did not execute an agent or prove live behavior.";
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", never "pty"
20
+ // (captured non-interactive exec output is never an interactive PTY). The shipped live builder
21
+ // fills terminal.tail from redacted exec-stream capture.
22
22
  const { simulation, stream } = terminalParticipant(args, {
23
23
  status: "contract_proof_only",
24
24
  reason,
25
- summary: `Contract participant for the terminal agent (${args.actorId}) studying ${args.productName} from public surfaces.`,
26
- updatedAt: args.createdAt,
25
+ summary: `Dry-run participant for the terminal agent (${args.actorId}) studying ${args.productName} from public surfaces.`,
26
+ updatedAt: args.run.createdAt,
27
27
  stdin: args.stdin,
28
28
  tail: "",
29
29
  artifacts: [
@@ -36,43 +36,43 @@ export function buildTerminalProductBundle(args) {
36
36
  const events = [
37
37
  {
38
38
  id: "event-000-created",
39
- at: args.createdAt,
39
+ at: args.run.createdAt,
40
40
  level: "info",
41
41
  type: "terminal-lab.run.created",
42
42
  message: `Created terminal-product lab run for ${args.labId} (actor ${args.actorId}, product ${args.productName}).`,
43
43
  },
44
44
  participantEvent(TERMINAL_IDS, {
45
45
  id: "event-001-subject",
46
- at: args.createdAt,
46
+ at: args.run.createdAt,
47
47
  level: "info",
48
48
  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
49
+ // Provenance is recorded or its absence declared. The agent drives public surfaces
50
+ // and nothing is cloned, so the subject provenance is explicitly unpinned; evidence binds to the
51
51
  // composed-prompt digest. Public surfaces are recorded (they are public by declaration).
52
- message: `Subject product declared: ${args.productName}; public surfaces: ${args.publicSurfaces.join(", ")}. The lab did not provision/clone the product — subject provenance is UNPINNED (a public-surface study cannot be commit-pinned); evidence binds to the composed-prompt digest ${args.persona.promptDigest}.`,
52
+ message: `Subject product declared: ${args.productName}; public surfaces: ${args.publicSurfaces.join(", ")}. humanish did not provision or clone the product, so its provenance is unpinned: a study of public pages has no commit to pin. The evidence is tied to the prompt digest ${args.persona.promptDigest}.`,
53
53
  }),
54
54
  participantEvent(TERMINAL_IDS, {
55
55
  id: "event-002-credentials",
56
- at: args.createdAt,
56
+ at: args.run.createdAt,
57
57
  level: "info",
58
58
  type: "terminal-lab.credentials.declared",
59
- // Names-only evidence (invariant 1): the runtime-auth CHANNEL is declared; no value is ever
59
+ // Names-only evidence: the runtime-auth channel is declared; no value is ever
60
60
  // recorded. The deny-by-default policies are recorded so the credential posture is auditable.
61
61
  message: `Runtime auth channel: ${args.runtimeAuth ?? "none declared"} (names only; values never persist; the live engine applies the selected key placement, while this dry-run performs no injection). Credential policies (deny-by-default): allowPrivateRepoAccess=${args.policies.allowPrivateRepoAccess}, allowProviderCredentials=${args.policies.allowProviderCredentials}, allowPaymentCredentials=${args.policies.allowPaymentCredentials}, allowGitHubMutation=${args.policies.allowGitHubMutation}.`,
62
62
  }),
63
63
  participantEvent(TERMINAL_IDS, {
64
64
  id: "event-003-caps",
65
- at: args.createdAt,
65
+ at: args.run.createdAt,
66
66
  level: "info",
67
67
  type: "terminal-lab.caps.declared",
68
- message: `Spend/job/time caps: ${capsText}. A live run never exercises the runtime key without a fail-closed cap; its no-spend proof is derived from the persisted cost ledger. This dry-run spends $0 by mechanism.`,
68
+ message: `Spend, job and time caps: ${capsText}. A live run uses the runtime key only while a cap is in force, and derives its no-spend proof from the recorded cost ledger. This dry run spends $0: it makes no model request.`,
69
69
  }),
70
70
  participantEvent(TERMINAL_IDS, {
71
71
  id: "event-004-contract",
72
- at: args.createdAt,
72
+ at: args.run.createdAt,
73
73
  level: "info",
74
74
  type: "terminal-lab.contract.ready",
75
- message: "Dry-run contract bundle ready. Switch scenario.mode to live with the required runtime auth and caps to exercise the in-sandbox agent route, captured exec stream, and declared runtime-auth placement.",
75
+ message: "Dry-run bundle ready. Switch scenario.mode to live with the required runtime auth and caps to exercise the in-sandbox agent route, captured exec stream, and declared runtime-auth placement.",
76
76
  }),
77
77
  ];
78
78
  const review = {
@@ -80,15 +80,14 @@ export function buildTerminalProductBundle(args) {
80
80
  verdict: args.verdict,
81
81
  summary: reason,
82
82
  gaps: [
83
- "This dry-run did not execute the live in-sandbox agent route; it proves contract shape only, not live behavior, scale, or adoption.",
83
+ "This dry run did not execute the live in-sandbox agent route; it checks the evidence shape only, not live behavior, scale, or adoption.",
84
84
  "No exec-stream, transcript, substrate, cost, or cleanup artifacts were produced because no live session ran; live verification requires those artifacts.",
85
85
  ],
86
86
  };
87
87
  return terminalRunBundle(args, {
88
- mode: args.dryRun ? "dry-run" : "live",
89
88
  lifecycle: [
90
89
  {
91
- at: args.createdAt,
90
+ at: args.run.createdAt,
92
91
  event: "terminal-lab.run.created",
93
92
  message: `Created terminal-product lab run with one in-sandbox agent participant (actor ${args.actorId}, product ${args.productName}).`,
94
93
  },
@@ -96,12 +95,12 @@ export function buildTerminalProductBundle(args) {
96
95
  simulation,
97
96
  stream,
98
97
  events,
99
- redactionNotes: "Dry-run contract bundle: no sandbox ran, no key was injected, no exec output was captured. The author mission is public-safe committed lab text (redacted defensively); the composed prompt is bound by digest. The shipped live path applies scrubKnownValues then redactText at the capture source before persistence.",
98
+ redactionNotes: "Dry-run bundle: no sandbox ran, no key was injected, no exec output was captured. The author mission is public-safe committed lab text (redacted defensively); the composed prompt is bound by digest. The shipped live path applies scrubKnownValues then redactText at the capture source before persistence.",
100
99
  review,
101
100
  });
102
101
  }
103
102
  /**
104
- * Build the LIVE terminal-product run bundle (mode "live") from the captured session: the actor
103
+ * Build the live terminal-product run bundle (mode "live") from the captured session: the actor
105
104
  * trace seam (stream.actor = trace), the substrate-lifecycle events, the terminal stream with the
106
105
  * redacted transcript tail, and references to the written evidence artifacts (terminal event
107
106
  * stream, transcript, ledgers, actor trace). verifyRun's terminal-product check (gated on
@@ -115,10 +114,10 @@ export function buildLiveTerminalProductBundle(args) {
115
114
  : args.trace.status === "timed_out"
116
115
  ? "timed_out"
117
116
  : "failed";
118
- const messageItem = args.trace.items.find((item) => item.kind === "message");
119
- const tail = (messageItem?.text ?? args.trace.reason).slice(0, 2000);
117
+ const commandItem = args.trace.items.find((item) => item.kind === "command");
118
+ const tail = (commandItem?.command?.outputTail || args.trace.reason).slice(0, 2000);
120
119
  // 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.
120
+ // never an interactive PTY (stdin disabled). The actor trace seam carries the structured evidence.
122
121
  const { simulation, stream } = terminalParticipant(args, {
123
122
  status: recordStatus,
124
123
  reason: args.sessionReason,
@@ -149,9 +148,9 @@ export function buildLiveTerminalProductBundle(args) {
149
148
  type: record.event,
150
149
  message: record.message,
151
150
  }));
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.
151
+ // Surface the no-spend proof as a first-class bundle event so the Observer/review can show it.
152
+ // It is derived from the cost ledger (never asserted): it lists the known-zero lines it vouches
153
+ // for and the unmeasured (null) lines it explicitly cannot vouch for.
155
154
  const noSpend = args.ledgers.noSpendProof;
156
155
  lifecycleEvents.push(participantEvent(TERMINAL_IDS, {
157
156
  id: "event-cost-no-spend-proof",
@@ -169,8 +168,8 @@ export function buildLiveTerminalProductBundle(args) {
169
168
  ? []
170
169
  : [`Agent session ended ${args.trace.status}: ${args.sessionReason}`]),
171
170
  ...(args.capFailure === undefined ? [] : [args.capFailure]),
172
- // Honesty gap: the no-spend proof always declares which spend lines it could NOT measure, so a
173
- // green run never silently over-claims a fully-proven $0.
171
+ // Measurement gap: the no-spend proof always declares which spend lines it could not measure,
172
+ // so a green run never silently over-claims a fully-proven $0.
174
173
  ...(noSpend.unmeasuredLines.length > 0
175
174
  ? [
176
175
  `${noSpendLineMeasured(noSpend) ? noSpendNotEstablished(noSpend.maxUsd ?? 0) : "No-spend proof is partial."} ${describeMeasuredSpend(args.ledgers.cost, args.trace.tokenUsage)} An adapter may supply the missing signals through costProbe.`,
@@ -179,7 +178,6 @@ export function buildLiveTerminalProductBundle(args) {
179
178
  ],
180
179
  };
181
180
  return terminalRunBundle(args, {
182
- mode: "live",
183
181
  lifecycle: args.ledgers.lifecycle.map((record) => ({
184
182
  at: record.at,
185
183
  event: record.event,
@@ -188,7 +186,7 @@ export function buildLiveTerminalProductBundle(args) {
188
186
  simulation,
189
187
  stream,
190
188
  events: lifecycleEvents,
191
- redactionNotes: `Live terminal-product run: the in-sandbox agent's output was captured via commands.run onStdout/onStderr and scrubbed (literal known values incl. the runtime key) THEN redacted (shape patterns) AT THE SOURCE before persisting. ${args.runtimeAuth === "openai-egress" ? `Runtime auth openai-egress: the raw key from ${args.runtimeAuthKeyName} is reserved for E2B's external api.openai.com HTTPS header transform. ${args.ledgers.commandLog.some((command) => command.label === "codex-exec") ? "Codex received an inert CODEX_API_KEY placeholder." : "Codex was not launched."} Any created sandbox retains a spendable OpenAI proxy capability until teardown; additional provider calls may not appear in the Codex usage ledger.` : `Runtime auth openai-env: the runtime key (${args.runtimeAuthKeyName}) was injected ONLY into the command-scoped codex invocation, never sandbox-global env or metadata; only its NAME appears in evidence.`} Subject provenance is UNPINNED (public-surface study).`,
189
+ redactionNotes: `Live terminal-product run: the in-sandbox agent's output was captured via commands.run onStdout/onStderr and had known values (including the runtime key) scrubbed, then shape patterns redacted, before anything was stored. ${args.runtimeAuth === "openai-egress" ? `Runtime auth openai-egress: the raw key from ${args.runtimeAuthKeyName} is reserved for E2B's external api.openai.com HTTPS header transform. ${args.ledgers.commandLog.some((command) => command.label === "codex-exec") ? "Codex received an inert CODEX_API_KEY placeholder." : "Codex was not launched."} Any created sandbox retains a spendable OpenAI proxy capability until teardown; additional provider calls may not appear in the Codex usage ledger.` : `Runtime auth openai-env: the runtime key (${args.runtimeAuthKeyName}) was passed only to the codex command, never to sandbox-wide environment variables or metadata; only its name appears in evidence.`} Subject provenance is unpinned (a study of public pages).`,
192
190
  review,
193
191
  ...(args.cost === undefined ? {} : { cost: args.cost }),
194
192
  });
@@ -206,13 +204,13 @@ function terminalParticipant(args, session) {
206
204
  progress: 100,
207
205
  currentStep: session.reason,
208
206
  summary: session.summary,
209
- startedAt: args.createdAt,
207
+ startedAt: args.run.createdAt,
210
208
  updatedAt: session.updatedAt,
211
209
  });
212
210
  const stream = participantStream(TERMINAL_IDS, {
213
211
  assignment: participantAssignment({ mission: args.mission }),
214
212
  kind: "terminal",
215
- label: `Terminal agent — ${args.labId}`,
213
+ label: `Terminal agent · ${args.labId}`,
216
214
  status: session.status,
217
215
  transport: "snapshot",
218
216
  updatedAt: session.updatedAt,
@@ -232,31 +230,24 @@ function terminalParticipant(args, session) {
232
230
  });
233
231
  return { simulation, stream };
234
232
  }
235
- /** The run bundle around the lane: the fields both builders fill the same way. */
233
+ /** The run bundle around the terminal session: the fields both builders fill the same way. */
236
234
  function terminalRunBundle(args, parts) {
237
235
  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
- }),
236
+ ...bundleHead(args.run, { participants: 1, source: args.source }),
246
237
  persona: {
247
238
  id: args.persona.id,
248
239
  name: `Autonomous terminal agent (${args.persona.id})`,
249
- source: `lab:${args.labId}`,
240
+ source: `study:${args.labId}`,
250
241
  sourceDigest: args.persona.promptDigest,
251
242
  },
252
243
  scenario: {
253
244
  id: `terminal-${args.labId}`,
254
245
  title: args.labTitle ?? `Terminal-product lab: ${args.labId}`,
255
- // The author mission is public-safe committed lab text — recorded plaintext as the goal,
246
+ // The author mission is public-safe committed lab text. It is recorded plaintext as the goal,
256
247
  // redacted defensively before persisting (it never carries a secret, but the harness never
257
248
  // trusts that). The full composed prompt is bound by digest, not text.
258
249
  goal: redactText(args.mission),
259
- source: `lab:${args.labId}`,
250
+ source: `study:${args.labId}`,
260
251
  sourceDigest: args.persona.promptDigest,
261
252
  },
262
253
  lifecycle: parts.lifecycle,
@@ -291,7 +282,7 @@ export function renderTerminalReviewMarkdown(bundle) {
291
282
  "",
292
283
  `- run: ${bundle.runId}`,
293
284
  `- mode: ${bundle.mode}`,
294
- `- verdict: ${bundle.review.verdict}`,
285
+ `- verdict: ${verdictText(bundle.review.verdict, bundle.mode)}`,
295
286
  `- summary: ${bundle.review.summary}`,
296
287
  `- mission: ${bundle.scenario.goal}`,
297
288
  ...(subject ? [`- subject: ${subject.message}`] : []),
@@ -18,17 +18,17 @@ export declare function buildRuntimeAuth(args: {
18
18
  keyValue: string;
19
19
  } | {
20
20
  ok: false;
21
- code: "HUMANISH_TERMINAL_LAB_RUNTIME_AUTH_MISSING" | "HUMANISH_TERMINAL_LAB_CREDENTIAL_DENIED";
21
+ code: "HUMANISH_TERMINAL_RUNTIME_AUTH_MISSING" | "HUMANISH_TERMINAL_CREDENTIAL_DENIED";
22
22
  message: string;
23
23
  };
24
24
  /**
25
- * Build the sandbox metadata from a POSITIVE ALLOWLIST (safety contract item 6). This is the ONLY
26
- * way metadata is set on the terminal lane — it carries solely non-secret labels and rejects any
25
+ * Build the sandbox metadata from a positive allowlist. This is the only
26
+ * way metadata is set on the terminal route. It carries solely non-secret labels and rejects any
27
27
  * value that is not a plain short label. A verifier check asserts the persisted metadata has no
28
28
  * prompt/token/secret shapes; this builder makes that true by construction.
29
29
  */
30
30
  export declare function buildSandboxMetadata(allowlist: {
31
31
  labId: string;
32
- simId: string;
32
+ recordId: string;
33
33
  runId: string;
34
34
  }): Record<string, string>;