humanish 0.106.0 → 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 (459) hide show
  1. package/AGENTS.md +4 -2
  2. package/ARCHITECTURE.md +17 -16
  3. package/CHANGELOG.md +24 -0
  4. package/CONTEXT.md +42 -39
  5. package/CONTRIBUTING.md +8 -6
  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 +31 -4
  16. package/dist/actors/codex/qualified-versions.js +51 -6
  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 +10 -8
  45. package/dist/actors/contract.js +7 -1
  46. package/dist/actors/local-agent/cli.js +1 -1
  47. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  48. package/dist/actors/scripted-browser/journey.js +15 -4
  49. package/dist/actors/scripted-browser/steps.js +18 -0
  50. package/dist/actors/scripted-browser/types.d.ts +11 -1
  51. package/dist/actors/stop-conditions.js +1 -3
  52. package/dist/analysis/automatic-completion.d.ts +13 -8
  53. package/dist/analysis/automatic-completion.js +14 -8
  54. package/dist/analysis/automatic-config.d.ts +1 -1
  55. package/dist/analysis/automatic-config.js +2 -2
  56. package/dist/analysis/automatic.d.ts +10 -4
  57. package/dist/analysis/automatic.js +17 -13
  58. package/dist/analysis/diagnostics.d.ts +23 -0
  59. package/dist/analysis/diagnostics.js +112 -0
  60. package/dist/analysis/evidence-sources.js +2 -2
  61. package/dist/analysis/evidence.js +6 -6
  62. package/dist/analysis/execute.d.ts +7 -1
  63. package/dist/analysis/execute.js +39 -12
  64. package/dist/analysis/job.d.ts +8 -5
  65. package/dist/analysis/job.js +15 -14
  66. package/dist/analysis/load.d.ts +1 -1
  67. package/dist/analysis/load.js +5 -5
  68. package/dist/analysis/provider.d.ts +9 -1
  69. package/dist/analysis/restricted-codex.d.ts +2 -0
  70. package/dist/analysis/restricted-codex.js +10 -1
  71. package/dist/analysis/service.d.ts +2 -0
  72. package/dist/analysis/service.js +31 -12
  73. package/dist/analysis/sharing.d.ts +2 -2
  74. package/dist/analysis/sharing.js +5 -5
  75. package/dist/analysis/store-executions.d.ts +5 -5
  76. package/dist/analysis/store-executions.js +12 -12
  77. package/dist/analysis/store.d.ts +4 -4
  78. package/dist/analysis/store.js +13 -13
  79. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  80. package/dist/cli/commands/analysis-signals.js +4 -1
  81. package/dist/cli/commands/analyze.js +4 -2
  82. package/dist/cli/commands/comms.js +8 -1
  83. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  84. package/dist/cli/commands/lab-route-computer-use.js +26 -14
  85. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  86. package/dist/cli/commands/lab-route-preview.js +3 -4
  87. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  88. package/dist/cli/commands/lab-route-run.js +6 -2
  89. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  90. package/dist/cli/commands/lab-route-scripted.js +0 -1
  91. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  92. package/dist/cli/commands/lab-route-shared-world.js +0 -1
  93. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  94. package/dist/cli/commands/lab-route-terminal.js +0 -1
  95. package/dist/cli/commands/lab-run.js +76 -45
  96. package/dist/cli/commands/lab-scorer.d.ts +0 -2
  97. package/dist/cli/commands/lab.js +12 -6
  98. package/dist/cli/commands/observe.js +22 -0
  99. package/dist/cli/commands/run-signals.d.ts +30 -0
  100. package/dist/cli/commands/run-signals.js +146 -0
  101. package/dist/cli/commands/runs.js +10 -8
  102. package/dist/cli/commands/watch.js +12 -10
  103. package/dist/cli/doctor.d.ts +3 -0
  104. package/dist/cli/doctor.js +10 -2
  105. package/dist/cli/io.d.ts +5 -4
  106. package/dist/cli/io.js +12 -8
  107. package/dist/cli/program.js +3 -3
  108. package/dist/cli/renamed-options.d.ts +11 -0
  109. package/dist/cli/renamed-options.js +18 -0
  110. package/dist/cli/telemetry.d.ts +2 -2
  111. package/dist/cli/telemetry.js +1 -1
  112. package/dist/comms/capture-surface.d.ts +1 -1
  113. package/dist/comms/catch-host.d.ts +1 -1
  114. package/dist/comms/connections.js +4 -4
  115. package/dist/comms/external-evidence.d.ts +27 -0
  116. package/dist/comms/external-evidence.js +93 -0
  117. package/dist/comms/lease-store.js +7 -7
  118. package/dist/comms/types.js +1 -1
  119. package/dist/evidence/browser-hygiene.d.ts +1 -1
  120. package/dist/evidence/browser-hygiene.js +1 -1
  121. package/dist/evidence/redaction.js +1 -1
  122. package/dist/evidence/secret-scrub.d.ts +9 -0
  123. package/dist/evidence/secret-scrub.js +96 -0
  124. package/dist/feedback/draft.js +7 -9
  125. package/dist/feedback/export-bundle.js +4 -4
  126. package/dist/feedback/export.js +9 -9
  127. package/dist/feedback/feedback.d.ts +1 -1
  128. package/dist/index.d.ts +3 -6
  129. package/dist/index.js +3 -6
  130. package/dist/keys/key-resolution.d.ts +3 -1
  131. package/dist/keys/key-resolution.js +18 -16
  132. package/dist/lab/adapter-extension.d.ts +28 -6
  133. package/dist/lab/adapter-extension.js +65 -126
  134. package/dist/lab/adapter-scorer-loader.d.ts +25 -5
  135. package/dist/lab/adapter-scorer-loader.js +24 -0
  136. package/dist/lab/composition-rules.d.ts +2 -0
  137. package/dist/lab/composition-rules.js +35 -26
  138. package/dist/lab/config.js +28 -26
  139. package/dist/lab/device-presets.d.ts +2 -2
  140. package/dist/lab/discover.js +1 -3
  141. package/dist/lab/doctor.d.ts +44 -9
  142. package/dist/lab/doctor.js +149 -41
  143. package/dist/lab/init-plan.js +1 -3
  144. package/dist/lab/keys.js +1 -1
  145. package/dist/lab/lab-deps.d.ts +85 -0
  146. package/dist/lab/lab-deps.js +4 -0
  147. package/dist/lab/parse/actors.js +8 -7
  148. package/dist/lab/parse/comms.js +3 -2
  149. package/dist/lab/parse/execution.js +3 -2
  150. package/dist/lab/parse/subject-state.js +2 -1
  151. package/dist/lab/parse/subject.js +2 -1
  152. package/dist/lab/parse/values.d.ts +0 -1
  153. package/dist/lab/parse/values.js +0 -3
  154. package/dist/lab/persona-resolve.d.ts +3 -3
  155. package/dist/lab/persona-resolve.js +4 -4
  156. package/dist/lab/persona.js +1 -3
  157. package/dist/lab/plan-base.d.ts +6 -2
  158. package/dist/lab/plan-base.js +22 -7
  159. package/dist/lab/plan-participants.d.ts +5 -5
  160. package/dist/lab/plan-participants.js +2 -2
  161. package/dist/lab/plan-types.d.ts +33 -7
  162. package/dist/lab/plan.d.ts +3 -11
  163. package/dist/lab/plan.js +18 -42
  164. package/dist/lab/preflight-result.js +0 -2
  165. package/dist/lab/preflight.d.ts +0 -3
  166. package/dist/lab/preflight.js +1 -1
  167. package/dist/lab/requirements.d.ts +20 -0
  168. package/dist/lab/requirements.js +54 -0
  169. package/dist/lab/route-inputs.d.ts +23 -12
  170. package/dist/lab/route-inputs.js +48 -51
  171. package/dist/lab/routing.d.ts +19 -24
  172. package/dist/lab/routing.js +14 -47
  173. package/dist/lab/run-lab-events.d.ts +6 -11
  174. package/dist/lab/run-lab-events.js +3 -11
  175. package/dist/lab/run-lab-homes.d.ts +64 -0
  176. package/dist/lab/run-lab-homes.js +3 -0
  177. package/dist/lab/run-lab-options.d.ts +12 -66
  178. package/dist/lab/run-lab-options.js +45 -275
  179. package/dist/lab/summary.d.ts +9 -4
  180. package/dist/lab/summary.js +15 -8
  181. package/dist/lab/types.d.ts +132 -132
  182. package/dist/lab/validation.d.ts +15 -15
  183. package/dist/lab/validation.js +28 -28
  184. package/dist/lab/warnings.js +20 -19
  185. package/dist/observer/artifact.d.ts +1 -1
  186. package/dist/observer/artifact.js +3 -3
  187. package/dist/observer/data.js +2 -2
  188. package/dist/observer/render.js +2 -2
  189. package/dist/observer/run-routes.d.ts +1 -1
  190. package/dist/observer/run-routes.js +5 -5
  191. package/dist/observer/serve.d.ts +17 -0
  192. package/dist/observer/serve.js +34 -3
  193. package/dist/observer-app.html +1 -1
  194. package/dist/routes/computer-use/bundle-parts.d.ts +1 -1
  195. package/dist/routes/computer-use/bundle-parts.js +10 -3
  196. package/dist/routes/computer-use/bundle.d.ts +4 -11
  197. package/dist/routes/computer-use/bundle.js +9 -15
  198. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  199. package/dist/routes/computer-use/diagnostics.js +1 -1
  200. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +10 -10
  201. package/dist/routes/computer-use/e2b-desktop/comms.js +11 -14
  202. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  203. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -7
  204. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +13 -13
  205. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -11
  206. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  207. package/dist/routes/computer-use/e2b-desktop/prepare.js +33 -36
  208. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  209. package/dist/routes/computer-use/e2b-desktop/start.js +24 -23
  210. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  211. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  212. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  213. package/dist/routes/computer-use/e2b-desktop/teardown.js +29 -17
  214. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  215. package/dist/routes/computer-use/external-comms.js +19 -43
  216. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  217. package/dist/routes/computer-use/fanout-bundle.js +25 -29
  218. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +25 -19
  219. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  220. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  221. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  222. package/dist/routes/computer-use/live-flush.js +19 -27
  223. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +14 -13
  224. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  225. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  226. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  227. package/dist/routes/computer-use/local-vm.js +39 -66
  228. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  229. package/dist/routes/computer-use/participant-desktop.js +5 -25
  230. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +10 -10
  231. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +35 -22
  232. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  233. package/dist/routes/computer-use/participant-facts.js +12 -1
  234. package/dist/routes/computer-use/participant-model.d.ts +19 -11
  235. package/dist/routes/computer-use/participant-model.js +58 -33
  236. package/dist/routes/computer-use/participant-prompt.d.ts +3 -3
  237. package/dist/routes/computer-use/participant-prompt.js +4 -4
  238. package/dist/routes/computer-use/participant-runs.d.ts +6 -6
  239. package/dist/routes/computer-use/participant-runs.js +8 -8
  240. package/dist/routes/computer-use/plan.d.ts +21 -29
  241. package/dist/routes/computer-use/plan.js +59 -65
  242. package/dist/routes/computer-use/preflight.d.ts +6 -11
  243. package/dist/routes/computer-use/preflight.js +26 -18
  244. package/dist/routes/computer-use/rerun-selection.js +10 -6
  245. package/dist/routes/computer-use/result.d.ts +1 -1
  246. package/dist/routes/computer-use/result.js +40 -30
  247. package/dist/routes/computer-use/route.d.ts +3 -4
  248. package/dist/routes/computer-use/route.js +21 -19
  249. package/dist/routes/computer-use/self-report.d.ts +2 -2
  250. package/dist/routes/computer-use/self-report.js +4 -4
  251. package/dist/routes/computer-use/setup.d.ts +8 -17
  252. package/dist/routes/computer-use/setup.js +98 -86
  253. package/dist/routes/computer-use/single-bundle.d.ts +8 -11
  254. package/dist/routes/computer-use/single-bundle.js +20 -25
  255. package/dist/routes/computer-use/subject-projection.d.ts +5 -7
  256. package/dist/routes/computer-use/subject-projection.js +20 -19
  257. package/dist/routes/computer-use/types.d.ts +169 -211
  258. package/dist/routes/computer-use/types.js +13 -6
  259. package/dist/routes/preview.js +0 -1
  260. package/dist/routes/scripted/bundle.d.ts +3 -6
  261. package/dist/routes/scripted/bundle.js +11 -16
  262. package/dist/routes/scripted/plan.d.ts +5 -7
  263. package/dist/routes/scripted/plan.js +6 -4
  264. package/dist/routes/scripted/result.d.ts +4 -1
  265. package/dist/routes/scripted/result.js +10 -6
  266. package/dist/routes/scripted/route.js +10 -11
  267. package/dist/routes/scripted/scenario.d.ts +1 -1
  268. package/dist/routes/scripted/scenario.js +1 -1
  269. package/dist/routes/scripted/setup.d.ts +3 -2
  270. package/dist/routes/scripted/setup.js +22 -21
  271. package/dist/routes/scripted/subject.d.ts +8 -3
  272. package/dist/routes/scripted/subject.js +11 -6
  273. package/dist/routes/scripted/surface-records.js +1 -1
  274. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  275. package/dist/routes/scripted/surface-sessions.js +4 -4
  276. package/dist/routes/scripted/types.d.ts +19 -36
  277. package/dist/routes/scripted/types.js +1 -2
  278. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +8 -8
  279. package/dist/routes/shared-world/bundle.d.ts +2 -2
  280. package/dist/routes/shared-world/bundle.js +22 -26
  281. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  282. package/dist/routes/shared-world/checkpoints.js +4 -4
  283. package/dist/routes/shared-world/comms.d.ts +5 -4
  284. package/dist/routes/shared-world/comms.js +28 -41
  285. package/dist/routes/shared-world/external-public.d.ts +5 -5
  286. package/dist/routes/shared-world/external-public.js +19 -20
  287. package/dist/routes/shared-world/handoff.d.ts +4 -4
  288. package/dist/routes/shared-world/handoff.js +50 -50
  289. package/dist/routes/shared-world/lobby-code.d.ts +5 -5
  290. package/dist/routes/shared-world/lobby-code.js +13 -13
  291. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +8 -6
  292. package/dist/routes/shared-world/{seats.js → participant-specs.js} +46 -51
  293. package/dist/routes/shared-world/plan.d.ts +2 -6
  294. package/dist/routes/shared-world/plan.js +1 -2
  295. package/dist/routes/shared-world/provenance.d.ts +4 -4
  296. package/dist/routes/shared-world/provenance.js +4 -4
  297. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  298. package/dist/routes/shared-world/provisioned.js +48 -41
  299. package/dist/routes/shared-world/result.js +31 -19
  300. package/dist/routes/shared-world/route.js +37 -41
  301. package/dist/routes/shared-world/setup.d.ts +5 -4
  302. package/dist/routes/shared-world/setup.js +12 -14
  303. package/dist/routes/shared-world/types.d.ts +53 -126
  304. package/dist/routes/shared-world/types.js +2 -2
  305. package/dist/routes/terminal/adapter.d.ts +8 -8
  306. package/dist/routes/terminal/adapter.js +28 -125
  307. package/dist/routes/terminal/bundle.d.ts +7 -12
  308. package/dist/routes/terminal/bundle.js +24 -34
  309. package/dist/routes/terminal/credentials.d.ts +2 -2
  310. package/dist/routes/terminal/credentials.js +16 -16
  311. package/dist/routes/terminal/dry-run.d.ts +1 -1
  312. package/dist/routes/terminal/dry-run.js +9 -11
  313. package/dist/routes/terminal/encoding.d.ts +1 -1
  314. package/dist/routes/terminal/encoding.js +2 -2
  315. package/dist/routes/terminal/ledger.d.ts +6 -6
  316. package/dist/routes/terminal/ledger.js +9 -9
  317. package/dist/routes/terminal/live-finish.d.ts +1 -2
  318. package/dist/routes/terminal/live-finish.js +21 -20
  319. package/dist/routes/terminal/live-sandbox.d.ts +4 -2
  320. package/dist/routes/terminal/live-sandbox.js +25 -21
  321. package/dist/routes/terminal/participant-text.d.ts +23 -0
  322. package/dist/routes/terminal/participant-text.js +165 -0
  323. package/dist/routes/terminal/plan.d.ts +2 -6
  324. package/dist/routes/terminal/plan.js +13 -9
  325. package/dist/routes/terminal/recorder.d.ts +6 -1
  326. package/dist/routes/terminal/recorder.js +12 -4
  327. package/dist/routes/terminal/result.js +4 -4
  328. package/dist/routes/terminal/route.js +26 -26
  329. package/dist/routes/terminal/runtime.d.ts +3 -2
  330. package/dist/routes/terminal/runtime.js +3 -3
  331. package/dist/routes/terminal/sandbox.d.ts +5 -3
  332. package/dist/routes/terminal/sandbox.js +13 -16
  333. package/dist/routes/terminal/session.js +16 -14
  334. package/dist/routes/terminal/token-usage.js +5 -5
  335. package/dist/routes/terminal/trace.d.ts +5 -8
  336. package/dist/routes/terminal/trace.js +9 -64
  337. package/dist/routes/terminal/types.d.ts +85 -93
  338. package/dist/routes/terminal/types.js +9 -4
  339. package/dist/run/active-runs.d.ts +13 -0
  340. package/dist/run/active-runs.js +12 -0
  341. package/dist/run/bundle-shape.d.ts +2 -1
  342. package/dist/run/bundle-shape.js +4 -4
  343. package/dist/run/bundle.d.ts +63 -56
  344. package/dist/run/bundle.js +9 -8
  345. package/dist/run/cost-summary.js +3 -2
  346. package/dist/run/costs.d.ts +6 -6
  347. package/dist/run/costs.js +10 -10
  348. package/dist/run/detail.d.ts +5 -5
  349. package/dist/run/detail.js +6 -6
  350. package/dist/run/dry-run.js +5 -12
  351. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  352. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  353. package/dist/run/feedback-shape.js +1 -1
  354. package/dist/run/judge.d.ts +16 -4
  355. package/dist/run/judge.js +24 -7
  356. package/dist/run/locate.d.ts +2 -0
  357. package/dist/run/locate.js +3 -1
  358. package/dist/run/outcomes.d.ts +3 -3
  359. package/dist/run/outcomes.js +3 -3
  360. package/dist/run/participant-records.d.ts +2 -2
  361. package/dist/run/participant-records.js +2 -2
  362. package/dist/run/paths.js +1 -1
  363. package/dist/run/pricing.d.ts +19 -9
  364. package/dist/run/pricing.js +30 -18
  365. package/dist/run/projection.d.ts +13 -13
  366. package/dist/run/projection.js +8 -8
  367. package/dist/run/reclaim.d.ts +7 -1
  368. package/dist/run/reclaim.js +24 -4
  369. package/dist/run/results.d.ts +1 -1
  370. package/dist/run/run-index.d.ts +1 -1
  371. package/dist/run/run-index.js +11 -11
  372. package/dist/run/run.d.ts +4 -2
  373. package/dist/run/run.js +9 -5
  374. package/dist/run/sandbox-receipts.d.ts +4 -4
  375. package/dist/run/sandbox-receipts.js +4 -4
  376. package/dist/run/shared-world-evidence.d.ts +47 -47
  377. package/dist/run/shared-world-shape.d.ts +3 -3
  378. package/dist/run/shared-world-shape.js +11 -11
  379. package/dist/run/stats.d.ts +5 -5
  380. package/dist/run/stats.js +8 -8
  381. package/dist/run/status.d.ts +16 -6
  382. package/dist/run/status.js +31 -8
  383. package/dist/run/streams.d.ts +26 -19
  384. package/dist/run/terminal-contract.d.ts +5 -5
  385. package/dist/run/terminal-contract.js +4 -4
  386. package/dist/run/transient-comms-secrets.d.ts +5 -0
  387. package/dist/run/transient-comms-secrets.js +12 -0
  388. package/dist/run-lab.d.ts +36 -34
  389. package/dist/run-lab.js +41 -37
  390. package/dist/subject/desktop-cli.d.ts +1 -1
  391. package/dist/subject/desktop-cli.js +1 -1
  392. package/dist/subject/local-tree-archive.d.ts +1 -1
  393. package/dist/subject/local-tree-archive.js +4 -4
  394. package/dist/subject/local-tree.d.ts +2 -2
  395. package/dist/subject/local-tree.js +1 -1
  396. package/dist/subject/node-bootstrap.d.ts +1 -1
  397. package/dist/subject/node-bootstrap.js +4 -4
  398. package/dist/subject/runtime.js +5 -5
  399. package/dist/subject/serve.js +1 -1
  400. package/dist/subject/steps.d.ts +4 -4
  401. package/dist/subject/steps.js +5 -5
  402. package/dist/substrates/desktop-session.d.ts +2 -0
  403. package/dist/substrates/e2b/cdp-probe.d.ts +2 -2
  404. package/dist/substrates/e2b/cdp-probe.js +1 -1
  405. package/dist/substrates/e2b/desktop-browser.d.ts +3 -3
  406. package/dist/substrates/e2b/desktop-browser.js +4 -4
  407. package/dist/substrates/e2b/desktop-cdp.d.ts +7 -7
  408. package/dist/substrates/e2b/desktop-cdp.js +4 -4
  409. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  410. package/dist/substrates/e2b/desktop-geometry.js +3 -3
  411. package/dist/substrates/e2b/desktop-media.js +2 -2
  412. package/dist/substrates/e2b/sandbox.d.ts +2 -0
  413. package/dist/substrates/e2b/sandbox.js +22 -8
  414. package/dist/substrates/e2b/sdk.d.ts +12 -1
  415. package/dist/substrates/e2b/sdk.js +30 -9
  416. package/dist/substrates/local/runtime-host.d.ts +2 -0
  417. package/dist/substrates/local/runtime-host.js +6 -0
  418. package/dist/tui/actions.d.ts +7 -5
  419. package/dist/tui/actions.js +18 -9
  420. package/dist/tui-app.js +42 -42
  421. package/dist/verify/actor.d.ts +10 -10
  422. package/dist/verify/actor.js +15 -15
  423. package/dist/verify/artifacts.d.ts +1 -1
  424. package/dist/verify/artifacts.js +3 -3
  425. package/dist/verify/costs.d.ts +2 -2
  426. package/dist/verify/costs.js +2 -2
  427. package/dist/verify/liveness.d.ts +1 -1
  428. package/dist/verify/liveness.js +4 -1
  429. package/dist/verify/rerun.d.ts +1 -1
  430. package/dist/verify/rerun.js +1 -1
  431. package/dist/verify/shared-world.js +2 -2
  432. package/dist/verify/verify.js +6 -6
  433. package/docs/README.md +1 -1
  434. package/docs/architecture/actor-contract.md +60 -22
  435. package/docs/architecture/desktop-sessions.md +9 -9
  436. package/docs/architecture/external-public-shared-world.md +5 -0
  437. package/docs/architecture/observer.md +4 -4
  438. package/docs/architecture/restricted-codex-analysis.md +40 -4
  439. package/docs/architecture/state-driven-executor.md +4 -5
  440. package/docs/architecture/task-protocol-support.md +3 -5
  441. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +24 -16
  442. package/docs/contracts/run-bundle.md +10 -8
  443. package/docs/contracts/schemas.md +109 -53
  444. package/docs/contracts/study-analysis.md +24 -0
  445. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  446. package/docs/product/automatic-analysis.md +1 -0
  447. package/docs/ramp/README.md +2 -1
  448. package/package.json +4 -4
  449. package/skills/humanish/SKILL.md +3 -2
  450. package/skills/humanish/agents/openai.yaml +1 -1
  451. package/dist/deprecated.d.ts +0 -90
  452. package/dist/deprecated.js +0 -106
  453. package/dist/lab/bag-overrides.d.ts +0 -18
  454. package/dist/lab/bag-overrides.js +0 -121
  455. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  456. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  457. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  458. /package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +0 -0
  459. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -1,22 +1,19 @@
1
+ import type { LabDeps } from "../../lab/lab-deps.js";
2
+ import type { LabEvent } from "../../lab/run-lab-events.js";
3
+ import type { RunLabHomes } from "../../lab/run-lab-homes.js";
1
4
  import type { SharedWorldJudgment } from "../../run/judge.js";
2
- import type { CuaActorSessionOptions } from "../../actors/computer-use/actor.js";
3
- import type { CuaLoopResult } from "../../actors/computer-use/loop.js";
4
- import type { BrowserLabAdapterHooks } from "../../lab/adapter-extension.js";
5
- import type { SubjectPhaseEvent } from "../../subject/steps.js";
6
- import type { DetachedTimers } from "../../substrates/detached.js";
7
- import type { E2BDesktopModule, E2BDesktopSandbox } from "../../substrates/e2b/sdk.js";
8
- import type { AutomaticAnalysisHooks, AutomaticAnalysisResult } from "../../analysis/automatic-completion.js";
5
+ import type { BrowserScorer } from "../../lab/adapter-extension.js";
6
+ import type { AutomaticAnalysisResult } from "../../analysis/automatic-completion.js";
9
7
  import type { CuaActorDescriptor } from "../../actors/registry.js";
10
8
  import type { CommsReceivingRun } from "../../comms/receiving.js";
11
9
  import type { LabCommsEmail, LabCommsExternal, LabConfig } from "../../lab/types.js";
12
10
  import type { DesktopResourceObservation } from "../../substrates/e2b/desktop-resources.js";
13
- import type { ObserverResult, renderObserver } from "../../observer/render.js";
11
+ import type { ObserverResult } from "../../observer/render.js";
14
12
  import type { ObserverRuntimeStreamUrl } from "../../observer/run-routes.js";
15
- import type { RunBundle, RunScorerProvenance, RunSubjectProvenance, RunSubjectStateStepRecord } from "../../run/bundle.js";
13
+ import type { BundleRun, RunBundle, RunScorerProvenance, RunSubjectProvenance, RunSubjectStateStepRecord } from "../../run/bundle.js";
16
14
  import type { RunScope } from "../../run/run.js";
17
15
  import type { SharedWorldStateSnapshot } from "../../run/shared-world-evidence.js";
18
16
  import type { LocalTreeArchive } from "../../subject/local-tree-archive.js";
19
- import type { RunLabProvenance } from "../../run/status.js";
20
17
  import type { LiveTraceFlush } from "../computer-use/live-flush.js";
21
18
  import type { CuaParticipantDeps, DesktopParticipantRun, CuaRunBudget, ParticipantRunOutcome } from "../computer-use/types.js";
22
19
  import type { ProvisionedPlaneSetup } from "./provisioned.js";
@@ -28,9 +25,8 @@ export declare const CONCURRENT_SHARED_WORLD_PROVIDER_METADATA: {
28
25
  };
29
26
  export declare const CONCURRENT_ATTRIBUTION_LIMITS: readonly ["concurrent", "best-effort-causal-attribution", "non-deterministic-shared-state", "window-and-snapshot-granularity", "contention-observed-not-proven-safe", "state-change-not-isolated-to-actors"];
30
27
  export interface RunConcurrentSharedWorldLabOptions {
31
- automaticAnalysis?: AutomaticAnalysisHooks;
32
- /** Which manifest produced this run (#455); threaded into the status record + bundle. */
33
- lab?: RunLabProvenance;
28
+ /** Cancels post-run analysis only. */
29
+ analysisSignal?: AbortSignal;
34
30
  cwd: string;
35
31
  config: LabConfig;
36
32
  /** Resolved upstream (scenario.mode + CLI override); defaults safe (dry-run). */
@@ -40,27 +36,44 @@ export interface RunConcurrentSharedWorldLabOptions {
40
36
  onObserverReady?: (observer: ObserverResult & {
41
37
  ok: true;
42
38
  }) => Promise<void> | void;
43
- hooks?: SharedWorldLabHooks;
44
- /** Present only when the browser-route scorer hooks were CONFIG-DECLARED and loaded by the CLI
45
- * (#316); core-stamped onto the bundle as evidence. Absent for library callers. */
39
+ /** Keys and subject env for the run. Defaults to process.env. */
40
+ env?: Readonly<Record<string, string | undefined>>;
41
+ /**
42
+ * Runs after a sandbox exists and before anything is provisioned on it: the provisioned plane's
43
+ * subject sandbox, then each seat's desktop. The external-public plane has seats only.
44
+ */
45
+ prepareDesktop?: NonNullable<RunLabHomes["prepareDesktop"]>;
46
+ /** Awaited after a participant's live stream starts, and again after its sandbox is gone. */
47
+ onStream?: NonNullable<RunLabHomes["onStream"]>;
48
+ /** Reports subject phases to onEvent; built by normalizeRunLabOptions. */
49
+ emit?: (event: LabEvent) => void;
50
+ /** Test seams. */
51
+ deps?: LabDeps;
52
+ /** Scores the assembled evidence: `RunLabOptions.scorer`, or the scorer the CLI loads. */
53
+ scorer?: BrowserScorer;
54
+ /** Present only when the scorer was CONFIG-DECLARED and loaded by the CLI (#316);
55
+ * core-stamped onto the bundle as evidence. Absent for library callers. */
46
56
  scorerProvenance?: RunScorerProvenance;
47
57
  }
48
58
  /** What a shared-world run takes besides its plan. The plan carries the config, dry run and lab. */
49
59
  export type SharedWorldRunInput = Omit<RunConcurrentSharedWorldLabOptions, "config" | "dryRun" | "lab">;
50
- export type ConcurrentSharedWorldLabErrorCode = "HUMANISH_LAB_ANALYSIS_INVALID" | "HUMANISH_LAB_TASKS_UNSUPPORTED" | "HUMANISH_LAB_OPTION_CONFLICT" | "HUMANISH_LAB_OPTION_UNSUPPORTED" | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_FAILED" | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_ACTOR_UNSUPPORTED" | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_INVALID" | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_KEYS_MISSING"
51
- /** A local-agent brain's CLI is not on PATH. */
60
+ export type ConcurrentSharedWorldLabErrorCode = "HUMANISH_LAB_ANALYSIS_INVALID" | "HUMANISH_LAB_TASKS_UNSUPPORTED" | "HUMANISH_LAB_OPTION_UNSUPPORTED" | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_FAILED" | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_ACTOR_UNSUPPORTED" | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_INVALID" | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_KEYS_MISSING"
61
+ /** A local-agent brain's CLI is not on `PATH`. */
52
62
  | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_AGENT_MISSING"
53
63
  /** A local-agent brain's CLI is signed out, or could not report its sign-in status. */
54
64
  | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_AGENT_SIGNIN_REQUIRED"
55
65
  /** A dollar cap that cannot be priced: an unpriced model, or a ChatGPT-account Codex brain. */
56
66
  | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_UNPRICED_CAP" | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_SUBJECT_ENV_MISSING" | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_GETHOST_UNAVAILABLE" | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_HANDOFF_TIMEOUT" | "HUMANISH_RUN_ID_IN_USE"
57
67
  /** A declared adopter-hosted comms catch (#328) did not answer as a humanish catch — fail closed
58
- * BEFORE any actor spend, since the funnel would silently collect nothing. */
59
- | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_COMMS_CATCH_UNREACHABLE";
68
+ * before any actor spend, since the funnel would silently collect nothing. */
69
+ | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_COMMS_CATCH_UNREACHABLE"
70
+ /** comms.email.external.authTokenEnv names a token shorter than MIN_CATCH_TOKEN_LENGTH or not
71
+ * well-formed Unicode (src/comms/external-evidence.ts). Refused before the catch is probed. */
72
+ | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_COMMS_TOKEN_INVALID";
60
73
  /** The two plane classes of the concurrent shared-world route (#164 phase 2). */
61
74
  export type ConcurrentSharedWorldPlaneClass = "provisioned-getHost" | "external-public";
62
75
  export declare const EXTERNAL_PUBLIC_ATTRIBUTION_LIMITS: readonly ["concurrent", "best-effort-causal-attribution", "non-deterministic-shared-state", "window-and-snapshot-granularity", "contention-observed-not-proven-safe", "state-change-not-isolated-to-actors", "external-public-plane", "operator-attested-target-not-harness-controlled", "no-synthetic-attestation", "no-authoritative-shared-state-proof", "concurrency-by-temporal-co-occupancy-only"];
63
- /** One persona's OUTCOME against the contended world (the "M of N" headline). */
76
+ /** One persona's outcome against the contended world (the "M of N" headline). */
64
77
  export interface ConcurrentSharedWorldParticipantResult {
65
78
  id: string;
66
79
  index: number;
@@ -96,7 +109,7 @@ export interface ConcurrentSharedWorldLabResult extends AutomaticAnalysisResult
96
109
  actor: string;
97
110
  topology: "shared-world";
98
111
  topologyMode: "concurrent";
99
- /** The DECLARED number of persona seats. */
112
+ /** The declared number of personas. */
100
113
  roleCount: number;
101
114
  /** Effective in-flight bound (execution.concurrency). */
102
115
  concurrency: number;
@@ -104,17 +117,17 @@ export interface ConcurrentSharedWorldLabResult extends AutomaticAnalysisResult
104
117
  runId: string;
105
118
  /** The harness-minted getHost URL the actors drove (tokenless; live only). */
106
119
  host?: string;
107
- /** The ONE subject sandbox lifecycle proof. */
120
+ /** The one subject sandbox lifecycle proof. */
108
121
  subjectSandbox?: {
109
122
  sandboxId: string;
110
123
  killed: boolean;
111
124
  };
112
125
  /** Whether ≥2 actor windows overlapped in time (proven concurrency; live only). */
113
126
  overlapProven?: boolean;
114
- /** Max lanes observed live at the same instant (live only) — the honest simultaneity number; a
115
- * 6-lane run capped at 3 reports 3 here, never 6 (#350). */
127
+ /** Max participants observed live at the same instant (live only) — the honest simultaneity number; a
128
+ * 6-participant run capped at 3 reports 3 here, never 6 (#350). */
116
129
  maxSimultaneousLanes?: number;
117
- /** Subject provenance (invariant 5): the ONE shared plane. */
130
+ /** Subject provenance (invariant 5): the one shared plane. */
118
131
  subject?: RunSubjectProvenance;
119
132
  roles: ConcurrentSharedWorldParticipantResult[];
120
133
  observer?: ObserverResult;
@@ -145,11 +158,12 @@ type StartedRun = Extract<Awaited<ReturnType<RunScope["startRun"]>>, {
145
158
  export interface PlaneContext {
146
159
  plan: SharedWorldPlan;
147
160
  input: SharedWorldRunInput;
148
- /** Read by the computer-use lane runner, whose hooks and desktop setup take the whole config.
149
- * Seats, their count and their host and entry come from the plan's participants. */
161
+ /** Read for the subject's serve URL, which each seat's subject names. Seats, their count and
162
+ * their host and entry come from the plan's participants. */
150
163
  config: LabConfig;
151
164
  descriptor: CuaActorDescriptor;
152
- hooks: SharedWorldLabHooks;
165
+ /** The run's test seams; empty outside tests. */
166
+ deps: LabDeps;
153
167
  env: Record<string, string | undefined>;
154
168
  concurrency: number;
155
169
  runBudget: CuaRunBudget | undefined;
@@ -157,6 +171,8 @@ export interface PlaneContext {
157
171
  openaiApiKey: string;
158
172
  e2bApiKey: string;
159
173
  scrubKnownValues: (text: string) => string;
174
+ /** The values scrubKnownValues removes. Real email receiving adds its secrets before seats start. */
175
+ knownSecretValues: readonly string[];
160
176
  cwd: string;
161
177
  run: StartedRun;
162
178
  runId: string;
@@ -176,7 +192,7 @@ export interface PlaneContext {
176
192
  }
177
193
  /**
178
194
  * What the seats feed while they run. A plane sets the attached Observer and starts the trace
179
- * flush; the runtime stream hooks append stream URLs; the orchestrator reads all three at finish.
195
+ * flush; each seat's onStream appends stream URLs; the orchestrator reads all three at finish.
180
196
  */
181
197
  export interface LiveParticipants {
182
198
  observer?: ObserverResult & {
@@ -195,14 +211,12 @@ export interface ExternalCommsWiring {
195
211
  export interface ConcurrentBundleArgs {
196
212
  /** The run's judgment (judgeSharedWorldRun over the other fields). */
197
213
  judgment: SharedWorldJudgment;
198
- /** Lab provenance for the bundle\'s own `lab` field (#455). */
199
- lab?: RunLabProvenance;
214
+ /** The run this bundle belongs to; the bundle head reads its id, mode, start and lab. */
215
+ run: BundleRun;
200
216
  plan: SharedWorldPlan;
201
217
  descriptor: CuaActorDescriptor;
202
- createdAt: string;
203
218
  dryRun: boolean;
204
219
  inProgress?: boolean;
205
- runId: string;
206
220
  source: RunBundle["source"];
207
221
  actorSpecs: DesktopParticipantRun[];
208
222
  actorResults: ActorRunResult[];
@@ -213,15 +227,15 @@ export interface ConcurrentBundleArgs {
213
227
  hostDigest?: string;
214
228
  /** Run-level digest-only comms-thread evidence path (humanish.comms-thread.v1), when a comms lab
215
229
  * captured mail into the subject sandbox's catch. Registered on the first persona stream (it is a
216
- * property of the ONE shared app, not of any single persona). */
230
+ * property of the one shared app, and belongs to no single persona). */
217
231
  commsArtifactPath?: string;
218
232
  /** #164 phase 2: the plane-class discriminator (default provisioned-getHost, byte-stable). */
219
233
  planeClass?: ConcurrentSharedWorldPlaneClass;
220
- /** external-public only: sha256-16 of the OBSERVED origin the seats converged on (the convergence
234
+ /** external-public only: sha256-16 of the observed origin the seats converged on (the convergence
221
235
  * proof — what the seats actually reached, tolerant of a declared->observed redirect). */
222
236
  publicOriginDigest?: string;
223
237
  /** external-public only: sha256-16 of the operator-DECLARED plane origin (evidence/reference only;
224
- * NOT asserted equal to the observed origin — a cross-origin redirect is normal and expected). */
238
+ * never asserted equal to the observed origin, since a cross-origin redirect is normal). */
225
239
  declaredOriginDigest?: string;
226
240
  /** external-public only: sha256-16 of the shared /lobby/CODE path all seats converged on. */
227
241
  lobbyConvergenceDigest?: string;
@@ -236,6 +250,8 @@ export interface PlaneResults {
236
250
  subjectCommit: string | undefined;
237
251
  subjectSandboxId: string | undefined;
238
252
  subjectKilled: boolean;
253
+ /** The subject sandbox's scrubbed release warning when its release is unconfirmed. */
254
+ subjectReleaseWarning: string | undefined;
239
255
  subjectDesktop: SubjectDesktopUsage | undefined;
240
256
  getHostUrl: string | undefined;
241
257
  publicOriginDigest: string | undefined;
@@ -262,93 +278,4 @@ export interface FinishFacts {
262
278
  stateSnapshots: SharedWorldStateSnapshot[];
263
279
  declaredOriginDigest: string | undefined;
264
280
  }
265
- /**
266
- * Library-level hooks mirroring CuaActorLabHooks — the DI seams that let CI drive the FULL
267
- * orchestration with fakes at $0/zero-network. The fake desktop module records create/kill BY id
268
- * and exposes NO `list` method (the by-id teardown rail is then provable by construction).
269
- */
270
- export interface SharedWorldLabHooks extends BrowserLabAdapterHooks {
271
- /** Lazy-load the E2B desktop module (tests inject a fake; default loadE2BDesktopModule). */
272
- loadDesktopModule?: () => Promise<E2BDesktopModule>;
273
- /**
274
- * Runs after a sandbox is created and before anything is provisioned on it. The provisioned
275
- * plane calls it for the subject sandbox with no lane, then for each seat's desktop with its lane;
276
- * the external-public plane calls it for the seats only.
277
- */
278
- prepareDesktop?: (desktop: E2BDesktopSandbox, lane?: {
279
- laneId: string;
280
- laneIndex: number;
281
- laneCount: number;
282
- }) => Promise<void>;
283
- /**
284
- * Awaited after a seat's live desktop stream starts. The URL carries an auth key and must never
285
- * be persisted. A rejection becomes a run warning, as on the computer-use route.
286
- */
287
- onRuntimeStreamReady?: (stream: {
288
- laneId: string;
289
- sandboxId: string;
290
- simId: string;
291
- streamId: string;
292
- url: string;
293
- }) => Promise<void> | void;
294
- /** Awaited after a seat's sandbox is gone, for seats whose stream started. Rejections are swallowed. */
295
- onRuntimeStreamEnded?: (stream: {
296
- laneId: string;
297
- simId: string;
298
- streamId: string;
299
- }) => Promise<void> | void;
300
- /** The per-seat computer-use session runner (default: the resolved actor descriptor's). */
301
- runSession?: (options: CuaActorSessionOptions) => Promise<CuaLoopResult>;
302
- /** The operator environment (keys + subject env values). Defaults to process.env. */
303
- env?: Record<string, string | undefined>;
304
- renderObserverFn?: typeof renderObserver;
305
- /** Injected clock/sleep for the detached-step polling (tests only). */
306
- detachedTimers?: DetachedTimers;
307
- /**
308
- * Subject-provisioning phase sink (mirrors CuaActorLabHooks.onPhase): one call per
309
- * started/completed boundary during the ONE shared-plane provision (clone route: clone, install,
310
- * build, serve start, ready, subject.state seed-step groups; local-tree route: upload, extract,
311
- * install, build, serve start, ready, seed-step groups - no clone phase). Defaults to one stderr
312
- * line per event. Override in tests to capture instead of writing to real stderr.
313
- */
314
- onPhase?: (event: SubjectPhaseEvent) => void;
315
- /**
316
- * CONCURRENT route only (#164 phase 2): the harness clock used to MEASURE each actor's laneWindow
317
- * [start,end] (default Date.now). The deterministic heart test does NOT override this — overlap is
318
- * produced by a rendezvous latch in the fake runSession + measured by the REAL clock (FIX-1), so
319
- * the windows are real, not injected. (A test may override only for non-overlap assertions.)
320
- */
321
- now?: () => number;
322
- /** CONCURRENT route only: the background stateSeries prober cadence (ms). Default 1000. */
323
- proberCadenceMs?: number;
324
- /**
325
- * EXTERNAL-PUBLIC concurrent route only (#164 phase 2): the host-first handoff barrier deadline
326
- * (ms). The host seat must surface a shared-session (/lobby/CODE) URL within this budget or the run
327
- * fails closed with HUMANISH_CONCURRENT_SHARED_WORLD_LAB_HANDOFF_TIMEOUT and no follower opens.
328
- * Default 120000 (also capped by execution.timeoutMs). Tests inject a short value to exercise the
329
- * fail-closed path deterministically.
330
- */
331
- handoffDeadlineMs?: number;
332
- /**
333
- * EXTERNAL-PUBLIC concurrent route only: the vision reader that extracts a /lobby/CODE off a seat's
334
- * screenshot frame (the CDP-independent handoff relay + per-seat convergence observation). Defaults to
335
- * the real single-frame OpenAI read (readLobbyCodeFromFrame). Tests inject a fake so the barrier's
336
- * handoff + convergence proof can be exercised deterministically without a live vision call.
337
- */
338
- readLobbyCodeFromFrame?: (frame: Buffer, apiKey: string) => Promise<string | undefined>;
339
- /**
340
- * Local-tree packing DI seam (tests only, no npm dependency needed to exercise the route):
341
- * defaults to createLocalTreeArchive(root, opts) plus a host-side read of the produced archive
342
- * file into an ArrayBuffer (the SAME default routes/computer-use/route.ts uses). Called ONCE per run, before
343
- * the ONE shared-plane sandbox is created, on the live local-tree route.
344
- */
345
- packLocalTree?: (args: {
346
- root: string;
347
- extraExclude?: string[];
348
- maxArchiveBytes?: number;
349
- }) => Promise<{
350
- archive: LocalTreeArchive;
351
- buffer: ArrayBuffer;
352
- }>;
353
- }
354
281
  export {};
@@ -5,7 +5,7 @@ export const CONCURRENT_SHARED_WORLD_PROVIDER_METADATA = {
5
5
  mode: "concurrent-shared-world-lab",
6
6
  tool: "humanish",
7
7
  };
8
- // The verify-enforced CONCURRENT attribution ceiling (FIX-5). Mirrored in
8
+ // The verify-enforced concurrent attribution ceiling. Mirrored in
9
9
  // verify/shared-world-concurrent.ts CONCURRENT_REQUIRED_LIMITS.
10
10
  export const CONCURRENT_ATTRIBUTION_LIMITS = [
11
11
  "concurrent",
@@ -16,7 +16,7 @@ export const CONCURRENT_ATTRIBUTION_LIMITS = [
16
16
  "state-change-not-isolated-to-actors",
17
17
  ];
18
18
  // EXTERNAL-PUBLIC plane class: the honest-downgrade attribution ceiling. The concurrent family
19
- // (an honest ceiling) PLUS the mandatory external-public disclosures — mirrored in the required
19
+ // (an honest ceiling) plus the mandatory external-public disclosures, mirrored in the required
20
20
  // set in verify/shared-world-concurrent.ts (CONCURRENT_ATTRIBUTION_LIMITS +
21
21
  // EXTERNAL_PUBLIC_EXTRA_LIMITS). Verify fails closed on a missing one.
22
22
  export const EXTERNAL_PUBLIC_ATTRIBUTION_LIMITS = [
@@ -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;