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,7 +1,7 @@
1
- // The PROVISIONED-GETHOST plane: the harness provisions ONE subject sandbox (clone or local-tree,
1
+ // The provisioned-getHost plane: the harness provisions one subject sandbox (clone or local-tree,
2
2
  // install/build, seed, serve on 0.0.0.0), exposes it through getHost, probes its state on a
3
- // cadence, and runs every seat against that one shared plane. All sandboxes are torn down by exact
4
- // id in the plane's finally, never through Sandbox.list.
3
+ // cadence, and runs every participant against that one shared plane. All sandboxes are torn down by
4
+ // exact id in the plane's finally, never through Sandbox.list.
5
5
  import { buildOriginMap } from "../../comms/capture-surface.js";
6
6
  import { deployCommsCatch, refreshInboxSurface, writeInboxSurface, } from "../../comms/sandbox-catch.js";
7
7
  import { redactText, toErrorMessage } from "../../evidence/redaction.js";
@@ -10,6 +10,7 @@ import { mapWithConcurrency } from "../../run/concurrency.js";
10
10
  import { provisionCloneSubject } from "../../subject/clone.js";
11
11
  import { provisionLocalTreeSubject } from "../../subject/local-tree.js";
12
12
  import { defaultSharedWorldPhaseSink } from "../../subject/steps.js";
13
+ import { phaseEvent } from "../../lab/run-lab-events.js";
13
14
  import { loadE2BDesktopModule } from "../../substrates/e2b/sdk.js";
14
15
  import { observeDesktopResources, } from "../../substrates/e2b/desktop-resources.js";
15
16
  import { acquireE2BDesktopSandbox, readE2BRelease } from "../../substrates/e2b/sandbox.js";
@@ -19,14 +20,14 @@ import { inboxRecipientFor, participantHasInboxRecipient, } from "../computer-us
19
20
  import { resolveSubjectState } from "../computer-use/subject-projection.js";
20
21
  import { withInboxMission } from "../computer-use/participant-prompt.js";
21
22
  import { planeStateOf } from "./plan.js";
22
- import { runCuaParticipant } from "../computer-use/lanes.js";
23
+ import { runCuaParticipant } from "../computer-use/participant-execution.js";
23
24
  import { buildConcurrentSharedWorldBundle, judgeSharedWorldRun } from "./bundle.js";
24
25
  import { runCheckpointSnapshot } from "./checkpoints.js";
25
26
  import { drainSubjectComms } from "./comms.js";
26
27
  import { buildSubjectProvenance, hostOriginDigest, isTokenlessHost, servePort, } from "./provenance.js";
27
28
  import { SANDBOX_TIMEOUT_BUFFER_MS, SUBJECT_PROVISION_BUDGET_MS, } from "../../substrates/e2b/lifetime.js";
28
29
  import { DEFAULT_STATE_STEP_TIMEOUT_MS } from "../../subject/state.js";
29
- import { resolveActorEntryUrl, participantRunDeps, startParticipantFlush } from "./seats.js";
30
+ import { resolveActorEntryUrl, participantRunDeps, startParticipantFlush, } from "./participant-specs.js";
30
31
  import { CONCURRENT_SHARED_WORLD_PROVIDER_METADATA, } from "./types.js";
31
32
  import { addressedRecipients } from "../../lab/parse/comms.js";
32
33
  /**
@@ -41,12 +42,13 @@ class ObserverGateError extends Error {
41
42
  this.name = "ObserverGateError";
42
43
  }
43
44
  }
44
- /** The ONE subject sandbox and the loops that run against it until teardown. */
45
+ /** The one subject sandbox and the loops that run against it until teardown. */
45
46
  class SubjectPlane {
46
47
  commsInboxUrl;
47
48
  subjectCommit;
48
49
  subjectSandboxId;
49
50
  subjectKilled = false;
51
+ subjectReleaseWarning;
50
52
  getHostUrl;
51
53
  // The subject desktop's host-side span and size, priced in the run's cost estimate.
52
54
  subjectCreatedAtMs;
@@ -57,17 +59,17 @@ class SubjectPlane {
57
59
  subjectAllocation;
58
60
  subjectDesktop;
59
61
  subjectShell;
60
- // The in-sandbox email catch on the ONE subject sandbox (#297); drained at teardown. Undefined
62
+ // The in-sandbox email catch on the one subject sandbox; drained at teardown. Undefined
61
63
  // unless a comms lab declared it.
62
64
  deployedComms;
63
- // Background prober dispose signal (FIX-9: cleared in teardown).
65
+ // Background prober dispose signal, cleared in teardown.
64
66
  proberDisposed = false;
65
67
  releaseDispose = () => { };
66
68
  disposeSignal;
67
69
  proberLoop;
68
70
  snapshotIndex = 0;
69
- // Persona inbox SURFACE (#297 slice B, shared-world): the serve->getHost origin-rewrite map
70
- // (REQUIRED here so the app's loopback verify links resolve to a reachable host), and the
71
+ // Persona inbox surface: the serve->getHost origin-rewrite map
72
+ // (required here so the app's loopback verify links resolve to a reachable host), and the
71
73
  // dedicated surface render loop.
72
74
  commsOriginMap = [];
73
75
  surfaceRenderedCount = 0;
@@ -98,12 +100,12 @@ class SubjectPlane {
98
100
  this.setup.stateSnapshots.push({ timestamp, digest: snapshot.digest });
99
101
  }
100
102
  async acquire() {
101
- const { plan, hooks, env, requestTimeoutMs, timeoutMs } = this.ctx;
103
+ const { plan, deps, env, requestTimeoutMs, timeoutMs } = this.ctx;
102
104
  const { subjectEnvNames, commsEnv } = this.setup;
103
- const subjectModule = await (hooks.loadDesktopModule ?? loadE2BDesktopModule)();
104
- // The ONE subject sandbox: headless service host (no GUI seat). The SUBJECT env is provisioned
105
- // HERE; the actor sandboxes get NONE of it (FIX-10). A custom desktop template (image) is
106
- // honored on BOTH the subject sandbox (here) and every actor sandbox (via runCuaParticipant, which
105
+ const subjectModule = await (deps.desktopModule ?? loadE2BDesktopModule)();
106
+ // The one subject sandbox: headless service host (no GUI participant). The subject env is
107
+ // provisioned here; the actor sandboxes get none of it. A custom desktop template (image) is
108
+ // honored on both the subject sandbox (here) and every actor sandbox (via runCuaParticipant, which
107
109
  // reads the same config); absent keeps the byte-stable Sandbox.create(opts) default. The
108
110
  // receipt is on disk before any work, so `humanish reclaim` can kill it by exact id.
109
111
  const subject = await acquireE2BDesktopSandbox({
@@ -120,8 +122,8 @@ class SubjectPlane {
120
122
  labId: plan.labId,
121
123
  topology: "shared-world",
122
124
  topologyMode: "concurrent",
123
- role: "subject",
124
- roleCount: String(plan.plane.participants.length),
125
+ kind: "subject",
126
+ participantCount: String(plan.plane.participants.length),
125
127
  },
126
128
  ...(subjectEnvNames.length > 0 || Object.keys(commsEnv).length > 0
127
129
  ? {
@@ -143,18 +145,16 @@ class SubjectPlane {
143
145
  this.subjectSandboxId = subject.allocation.resourceId;
144
146
  this.subjectCreatedAtMs = this.ctx.now();
145
147
  this.subjectResources = await observeDesktopResources(this.subjectDesktop);
146
- if (hooks.prepareDesktop) {
147
- await hooks.prepareDesktop(this.subjectDesktop);
148
- }
148
+ await this.ctx.input.prepareDesktop?.(this.subjectDesktop, { kind: "subject" });
149
149
  }
150
- // Start the in-sandbox email catch BEFORE the subject serve, so the app's send-API base URL
150
+ // Start the in-sandbox email catch before the subject serve, so the app's send-API base URL
151
151
  // (injected into its env at create) resolves the moment it boots. Fail closed if the catch can't
152
152
  // stand up rather than let a comms-declared app silently send real mail to the internet.
153
153
  async deployCatch() {
154
154
  const { commsEmail, commsPort } = this.setup;
155
155
  if (commsEmail && commsPort !== undefined) {
156
- // A SECOND (0.0.0.0) read-only inbox listener on commsPort+1 so the persona — which lives in a
157
- // DIFFERENT sandbox here — can reach the inbox surface via getHost; capture stays loopback.
156
+ // A second (0.0.0.0) read-only inbox listener on commsPort+1 so the persona, which lives in
157
+ // another sandbox here, can reach the inbox surface via getHost; capture stays loopback.
158
158
  this.deployedComms = await deployCommsCatch(this.subjectShell, {
159
159
  port: commsPort,
160
160
  inboxPort: commsPort + 1,
@@ -166,15 +166,19 @@ class SubjectPlane {
166
166
  }
167
167
  }
168
168
  }
169
- // Provision the ONE shared plane: clone + install/build + seed + serve on 0.0.0.0 + probe
170
- // (clone route), or upload/extract the once-per-run packed archive + the SAME shared serve
169
+ // Provision the one shared plane: clone + install/build + seed + serve on 0.0.0.0 + probe
170
+ // (clone route), or upload/extract the once-per-run packed archive + the same shared serve
171
171
  // pipeline (local-tree route).
172
172
  async provision() {
173
- const { plan, hooks, requestTimeoutMs, scrubKnownValues } = this.ctx;
173
+ const { plan, requestTimeoutMs, scrubKnownValues } = this.ctx;
174
174
  const { serve, timers, stateStepRecords } = this.setup;
175
175
  const state = planeStateOf(plan);
176
176
  const subjectShell = this.subjectShell;
177
- const onSubjectPhase = hooks.onPhase ?? defaultSharedWorldPhaseSink;
177
+ const sink = this.ctx.input.deps?.subjectPhaseSink ?? defaultSharedWorldPhaseSink;
178
+ const onSubjectPhase = (event) => {
179
+ sink(event);
180
+ this.ctx.input.emit?.(phaseEvent(event, { kind: "subject" }));
181
+ };
178
182
  if (this.setup.localTreeRoute) {
179
183
  await provisionLocalTreeSubject(subjectShell, {
180
184
  archiveBuffer: this.setup.localTreeArchiveBuffer,
@@ -209,13 +213,13 @@ class SubjectPlane {
209
213
  });
210
214
  }
211
215
  }
212
- // Expose the served port via getHost (FIX-2). Fail closed if the SDK lacks it.
216
+ // Expose the served port via getHost. Fail closed if the SDK lacks it.
213
217
  exposeHost() {
214
218
  const subjectDesktop = this.subjectDesktop;
215
219
  if (typeof subjectDesktop.getHost !== "function") {
216
220
  throw new Error("the installed @e2b/desktop SDK does not expose getHost(port); the concurrent shared-world route requires it to reach the subject plane");
217
221
  }
218
- // getHost returns a BARE host (e.g. "3000-<sandboxId>.e2b.app", no scheme); e2b exposes the
222
+ // getHost returns a bare host (e.g. "3000-<sandboxId>.e2b.app", no scheme); e2b exposes the
219
223
  // port over https. Normalize to a full URL before the tokenless check + before persisting.
220
224
  const rawHost = subjectDesktop.getHost(servePort(this.setup.serve.url));
221
225
  const hostUrl = /^https?:\/\//i.test(rawHost) ? rawHost : `https://${rawHost}`;
@@ -224,12 +228,12 @@ class SubjectPlane {
224
228
  }
225
229
  this.getHostUrl = hostUrl;
226
230
  }
227
- // Persona inbox SURFACE (#297 slice B, shared-world): getHost-expose the read-only inbox listener so
228
- // a persona in a DIFFERENT sandbox can open it; build the serve->getHost origin map (REQUIRED here —
231
+ // Persona inbox surface: getHost-expose the read-only inbox listener so
232
+ // a persona in another sandbox can open it; build the serve->getHost origin map (required here:
229
233
  // the app's loopback verify links must be rewritten to a reachable host); provision the surface
230
- // channel; write the EMPTY inbox up front (so /inbox never 404s); and start a render loop that drains
234
+ // channel; write the empty inbox up front (so /inbox never 404s); and start a render loop that drains
231
235
  // + re-renders on a cadence. The loop shares the prober's dispose signal (disposed together, before
232
- // the teardown evidence drain), and uses a DEDICATED FakeInbox + cursor (independent of that drain).
236
+ // the teardown evidence drain), and uses a dedicated FakeInbox + cursor (independent of that drain).
233
237
  async startInboxSurface() {
234
238
  const { commsEmail } = this.setup;
235
239
  const { requestTimeoutMs } = this.ctx;
@@ -259,7 +263,7 @@ class SubjectPlane {
259
263
  const surfaceCadenceMs = 2500;
260
264
  this.surfaceLoop = (async () => {
261
265
  // Full, idempotent rebuild each tick; surfaceRenderedCount advances only on a successful render,
262
- // so a transient failure retries cleanly. Real timer (dispose-interruptible + cleared) — an
266
+ // so a transient failure retries cleanly. Real timer (dispose-interruptible + cleared): an
263
267
  // unbounded loop must not busy-spin on the injected instant clock.
264
268
  for (;;) {
265
269
  try {
@@ -303,7 +307,7 @@ class SubjectPlane {
303
307
  this.disposeSignal,
304
308
  ]);
305
309
  if (timer)
306
- clearTimeout(timer); // FIX-9: no dangling prober timer.
310
+ clearTimeout(timer); // No dangling prober timer.
307
311
  if (this.proberDisposed)
308
312
  break;
309
313
  await this.snapshot().catch(() => undefined);
@@ -311,8 +315,8 @@ class SubjectPlane {
311
315
  })();
312
316
  }
313
317
  /**
314
- * FIX-9: stop the prober, take a final snapshot while the subject is still alive, then tear
315
- * down the ONE subject sandbox BY id (the actor sandboxes are torn down inside runCuaParticipant).
318
+ * Stop the prober, take a final snapshot while the subject is still alive, then tear
319
+ * down the one subject sandbox by id (the actor sandboxes are torn down inside runCuaParticipant).
316
320
  * Returns the comms thread's path when the drain wrote one.
317
321
  */
318
322
  async teardown() {
@@ -323,7 +327,7 @@ class SubjectPlane {
323
327
  await this.proberLoop.catch(() => undefined);
324
328
  }
325
329
  // Stop the inbox-surface render loop too (shares the prober's dispose signal), before the teardown
326
- // evidence drain below — so the two in-sandbox reads never overlap and the surface state is final.
330
+ // evidence drain below, so the two in-sandbox reads never overlap and the surface state is final.
327
331
  if (this.surfaceLoop) {
328
332
  await this.surfaceLoop.catch(() => undefined);
329
333
  }
@@ -345,6 +349,8 @@ class SubjectPlane {
345
349
  this.subjectKilled = reading.released;
346
350
  if (reading.warning)
347
351
  warnings.push(reading.warning);
352
+ if (!reading.released)
353
+ this.subjectReleaseWarning = reading.warning ?? "Subject sandbox release is unconfirmed.";
348
354
  // Without a kill method, or in E2B debug mode, no kill reached E2B, so there is no teardown
349
355
  // time to record.
350
356
  if (released.status !== "unconfirmed" || released.reason !== "release_unavailable")
@@ -364,7 +370,8 @@ class SubjectPlane {
364
370
  };
365
371
  }
366
372
  }
367
- /** Writes the in-progress bundle, runs the caller's Observer gate and starts the seat flush. */
373
+ /** Writes the in-progress bundle, runs the caller's Observer gate and starts the participants'
374
+ * flush. */
368
375
  async function publishInProgress(plane, ctx, live, setup) {
369
376
  const { plan, input } = ctx;
370
377
  const { localTreeRoute, localTreeArchive } = setup;
@@ -385,11 +392,10 @@ async function publishInProgress(plane, ctx, live, setup) {
385
392
  });
386
393
  const snapshotArgs = {
387
394
  plan,
395
+ run: ctx.run,
388
396
  descriptor: ctx.descriptor,
389
- createdAt: ctx.createdAt,
390
397
  dryRun: false,
391
398
  inProgress: true,
392
- runId: ctx.runId,
393
399
  source: ctx.source,
394
400
  actorSpecs: ctx.actorSpecs,
395
401
  actorResults: [],
@@ -417,9 +423,9 @@ async function publishInProgress(plane, ctx, live, setup) {
417
423
  }
418
424
  startParticipantFlush(ctx, live, inProgressBundle);
419
425
  }
420
- // Launch N actor sandboxes CONCURRENTLY, INDEPENDENT (FIX-11: runCuaParticipant + mapWithConcurrency,
421
- // NOT runCuaParticipants — no pipeline gate / fail-fast). Each actor's window is measured on the ONE
422
- // orchestrator clock (FIX-1).
426
+ // Launch N actor sandboxes concurrently and independently (runCuaParticipant + mapWithConcurrency;
427
+ // runCuaParticipants would add a pipeline gate and fail-fast). Each actor's window is measured on the
428
+ // one orchestrator clock.
423
429
  function runParticipants(plane, ctx, live, setup) {
424
430
  const { now } = ctx;
425
431
  const participants = ctx.plan.plane.participants;
@@ -427,10 +433,10 @@ function runParticipants(plane, ctx, live, setup) {
427
433
  const baseActorDeps = participantRunDeps(ctx, live, ctx.scrubKnownValues);
428
434
  return mapWithConcurrency(ctx.actorSpecs, Math.max(1, ctx.concurrency), async (spec, i) => {
429
435
  const route = resolveActorEntryUrl(plane.getHostUrl, participants[i]?.entry);
430
- // Tell this persona its (getHost-reachable) inbox URL — but only when comms is live AND this lane
436
+ // Tell this persona its (getHost-reachable) inbox URL, but only when comms is live and this participant
431
437
  // has a declared recipient it can actually receive mail into (else it would stall on an empty
432
438
  // inbox). Only the in-sandbox catch exists on this plane; the adopter-hosted catch is the
433
- // external-public plane's (#387).
439
+ // external-public plane's.
434
440
  const actorSpec = commsEmail && plane.commsInboxUrl && participantHasInboxRecipient(commsEmail, spec.planned.id)
435
441
  ? withInboxMission(spec, plane.commsInboxUrl, inboxRecipientFor(commsEmail, spec.planned.id)?.address)
436
442
  : spec;
@@ -472,6 +478,7 @@ export async function runProvisionedPlane(ctx, live, setup) {
472
478
  subjectCommit: plane.subjectCommit,
473
479
  subjectSandboxId: plane.subjectSandboxId,
474
480
  subjectKilled: plane.subjectKilled,
481
+ subjectReleaseWarning: plane.subjectReleaseWarning,
475
482
  subjectDesktop: plane.desktopUsage(),
476
483
  getHostUrl: plane.getHostUrl,
477
484
  commsArtifactPath,
@@ -481,8 +488,8 @@ export async function runProvisionedPlane(ctx, live, setup) {
481
488
  * Packs the working tree once per run, on the host, for a local-tree subject. Returns the archive,
482
489
  * or the message the run fails with.
483
490
  */
484
- export async function packSubjectTree(cwd, config, hooks, scrubKnownValues) {
485
- const packLocalTree = hooks.packLocalTree ?? defaultPackLocalTree;
491
+ export async function packSubjectTree(cwd, config, deps, scrubKnownValues) {
492
+ const packLocalTree = deps.packLocalTree ?? defaultPackLocalTree;
486
493
  try {
487
494
  const packed = await packLocalTree({
488
495
  root: cwd,
@@ -1,15 +1,16 @@
1
1
  // Finishing a concurrent shared-world run: publishing its bundle, rendering the Observer, and the
2
2
  // lab result with each role's outcome and the one error a run that did not pass reports.
3
3
  import { redactText } from "../../evidence/redaction.js";
4
- import { adapterScoreFailureMessage, applyBrowserAdapterHooks, } from "../../lab/adapter-extension.js";
4
+ import { adapterScoreFailureMessage, applyBrowserScorer } from "../../lab/adapter-extension.js";
5
5
  import { attachObserverRuntimeStreamUrls } from "../../observer/render.js";
6
- import { foldScorerFailures, judgeExecution, OUTCOME_POLICIES, participantHarnessFailed, resultOk, sharedWorldShortfall, } from "../../run/judge.js";
7
- import { participantFactsOf } from "../computer-use/participant-facts.js";
6
+ import { foldScorerFailures, judgeExecution, sandboxCleanupFailure, OUTCOME_POLICIES, participantHarnessFailed, resultOk, sharedWorldShortfall, } from "../../run/judge.js";
7
+ import { participantFactsOf, unreleasedSandboxFailures, } from "../computer-use/participant-facts.js";
8
8
  import { resolveSubjectState } from "../computer-use/subject-projection.js";
9
9
  import { actorRunPassed, buildConcurrentSharedWorldBundle, judgeSharedWorldRun, maxSimultaneousWindows, } from "./bundle.js";
10
10
  import { planeStateOf } from "./plan.js";
11
11
  import { buildSubjectProvenance, hostOriginDigest } from "./provenance.js";
12
- import { CONCURRENT_SHARED_WORLD_LAB_SCHEMA, } from "./types.js";
12
+ import {} from "./types.js";
13
+ import { studyResultIdentity } from "../../run/study-result.js";
13
14
  /** The results of a run whose plane did not run (a dry run) or has not reported yet. */
14
15
  export function emptyPlaneResults() {
15
16
  return {
@@ -18,6 +19,7 @@ export function emptyPlaneResults() {
18
19
  subjectCommit: undefined,
19
20
  subjectSandboxId: undefined,
20
21
  subjectKilled: false,
22
+ subjectReleaseWarning: undefined,
21
23
  subjectDesktop: undefined,
22
24
  getHostUrl: undefined,
23
25
  publicOriginDigest: undefined,
@@ -64,7 +66,7 @@ function concurrentParticipantResults(actorSpecs, actorResults, dryRun) {
64
66
  ? {}
65
67
  : {
66
68
  error: {
67
- code: "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_FAILED",
69
+ code: "HUMANISH_SHARED_WORLD_FAILED",
68
70
  message: result.outcome.sessionError ??
69
71
  (result.outcome.noEngagement
70
72
  ? "Actor took no actions and produced no message (likely a blank/still-loading screen); not a credible goal_satisfied."
@@ -85,18 +87,18 @@ function concurrentLabError(args) {
85
87
  if (ok)
86
88
  return undefined;
87
89
  if (handoffTimedOut) {
88
- // Checked BEFORE the observer failure: the host never yielded a /lobby/CODE within the
89
- // deadline (followers failed closed without opening), which is the ROOT CAUSE — and it can
90
- // itself make the Observer unable to render a coherent run. Report the distinct, honest
90
+ // Checked before the observer failure: the host never yielded a /lobby/CODE within the
91
+ // deadline (followers failed closed without opening), which is the root cause, and it can
92
+ // itself make the Observer unable to render a coherent run. Report the distinct
91
93
  // handoff-timeout code rather than a generic observer/run failure.
92
94
  return {
93
- code: "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_HANDOFF_TIMEOUT",
95
+ code: "HUMANISH_SHARED_WORLD_HANDOFF_TIMEOUT",
94
96
  message: runError ??
95
97
  "The host participant never produced a /lobby/CODE URL within the handoff deadline.",
96
98
  };
97
99
  }
98
100
  if (hostHandoffFailure !== undefined) {
99
- return { code: "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_FAILED", message: hostHandoffFailure };
101
+ return { code: "HUMANISH_SHARED_WORLD_FAILED", message: hostHandoffFailure };
100
102
  }
101
103
  // The run's own failure before the Observer's: a run that stopped early (a desktop module that
102
104
  // failed to load, a plane that failed to start) leaves a bundle verify then refuses, and naming
@@ -104,34 +106,34 @@ function concurrentLabError(args) {
104
106
  // evidence).
105
107
  if (runError) {
106
108
  return {
107
- code: "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_FAILED",
109
+ code: "HUMANISH_SHARED_WORLD_FAILED",
108
110
  message: observer.ok ? runError : `${runError} The run bundle it left failed verification.`,
109
111
  };
110
112
  }
111
113
  if (!observer.ok) {
112
114
  return {
113
- code: "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_FAILED",
115
+ code: "HUMANISH_SHARED_WORLD_FAILED",
114
116
  message: observer.error?.message ?? "Observer failed for the concurrent shared-world run.",
115
117
  };
116
118
  }
117
119
  if (adapterFailure !== undefined) {
118
- return { code: "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_FAILED", message: adapterFailure };
120
+ return { code: "HUMANISH_SHARED_WORLD_FAILED", message: adapterFailure };
119
121
  }
120
122
  const passed = participantResults.filter((result) => result.ok).length;
121
123
  if (passed === participantCount && args.shortfall !== undefined) {
122
124
  return {
123
- code: "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_FAILED",
125
+ code: "HUMANISH_SHARED_WORLD_FAILED",
124
126
  message: `Concurrent shared-world run did not run coherently. ${args.shortfall}`,
125
127
  };
126
128
  }
127
129
  if (passed === participantCount && args.executionFailure !== undefined) {
128
130
  return {
129
- code: "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_FAILED",
131
+ code: "HUMANISH_SHARED_WORLD_FAILED",
130
132
  message: `Concurrent shared-world run failed as an execution. ${args.executionFailure}`,
131
133
  };
132
134
  }
133
135
  return {
134
- code: "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_FAILED",
136
+ code: "HUMANISH_SHARED_WORLD_FAILED",
135
137
  message: `Concurrent shared-world run did not run coherently: ${passed}/${participantCount} actor(s) reached a terminal, engaged passed session.`,
136
138
  };
137
139
  }
@@ -141,10 +143,9 @@ function concurrentLabError(args) {
141
143
  */
142
144
  export function concurrentLabFailure(envelope) {
143
145
  return (code, message, actorLabel) => ({
144
- schema: CONCURRENT_SHARED_WORLD_LAB_SCHEMA,
146
+ ...studyResultIdentity("shared-world", envelope.labId),
145
147
  ok: false,
146
148
  cwd: envelope.cwd,
147
- labId: envelope.labId,
148
149
  actor: actorLabel ?? envelope.actor,
149
150
  topology: "shared-world",
150
151
  topologyMode: "concurrent",
@@ -158,11 +159,13 @@ export function concurrentLabFailure(envelope) {
158
159
  });
159
160
  }
160
161
  /**
161
- * The run's execution failures: a run error (the handoff, the plane), each seat whose session
162
- * failed in the harness, and an Observer that failed.
162
+ * The run's execution failures: a run error (the handoff, the plane), each participant whose
163
+ * session failed in the harness, each provider whose cleanup is unconfirmed or that reported a
164
+ * disallowed item after its last request, each sandbox whose release is unconfirmed, and an
165
+ * Observer that failed.
163
166
  */
164
167
  function sharedWorldExecutionFailures(args) {
165
- const { runError, actorResults, observer } = args;
168
+ const { runId, runError, actorResults, subject, observer } = args;
166
169
  return [
167
170
  ...(runError === undefined ? [] : [{ kind: "run", message: runError }]),
168
171
  ...actorResults
@@ -179,6 +182,18 @@ function sharedWorldExecutionFailures(args) {
179
182
  message: `${result.spec.planned.id}: ${result.outcome.providerCleanupError}`,
180
183
  },
181
184
  ]),
185
+ ...actorResults.flatMap((result) => result.outcome.providerPolicyError === undefined
186
+ ? []
187
+ : [
188
+ {
189
+ kind: "provider-policy",
190
+ message: `${result.spec.planned.id}: ${result.outcome.providerPolicyError}`,
191
+ },
192
+ ]),
193
+ ...unreleasedSandboxFailures(actorResults.map((result) => result.outcome), runId),
194
+ ...(subject.subjectSandboxId === undefined || subject.subjectKilled
195
+ ? []
196
+ : [sandboxCleanupFailure("subject", subject.subjectReleaseWarning, runId)]),
182
197
  ...(observer.ok
183
198
  ? []
184
199
  : [
@@ -191,7 +206,7 @@ function sharedWorldExecutionFailures(args) {
191
206
  }
192
207
  /** Builds and publishes the bundle, renders the Observer and returns the lab result. */
193
208
  export async function finishConcurrentRun(ctx, live, results, plane) {
194
- const { plan, input, descriptor, hooks, actorSpecs, run, runId, createdAt } = ctx;
209
+ const { plan, input, descriptor, actorSpecs, run, runId } = ctx;
195
210
  const participantCount = plan.plane.participants.length;
196
211
  const { cwd, concurrency, source, seedDigest, receiving, warnings, scrubKnownValues } = ctx;
197
212
  const { dryRun } = plan;
@@ -218,17 +233,15 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
218
233
  }),
219
234
  });
220
235
  const planeCommit = localTreeRoute ? localTreeArchive?.git?.commit : subjectCommit;
221
- // Collect per-actor warnings (each lane's own teardown/raw-screenshot notes).
236
+ // Collect per-actor warnings (each participant's own teardown/raw-screenshot notes).
222
237
  for (const result of actorResults) {
223
238
  warnings.push(...result.outcome.warnings);
224
239
  }
225
240
  const bundleArgs = {
226
- ...(plan.lab === undefined ? {} : { lab: plan.lab }),
241
+ run,
227
242
  plan,
228
243
  descriptor,
229
- createdAt,
230
244
  dryRun,
231
- runId,
232
245
  source,
233
246
  actorSpecs,
234
247
  actorResults,
@@ -249,8 +262,8 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
249
262
  const judgment = judgeSharedWorldRun(bundleArgs);
250
263
  const bundle = buildConcurrentSharedWorldBundle({ ...bundleArgs, judgment });
251
264
  const adapterWarnings = [];
252
- const scorerResult = await applyBrowserAdapterHooks({
253
- hooks,
265
+ const scorerResult = await applyBrowserScorer({
266
+ scorer: input.scorer,
254
267
  bundle,
255
268
  context: {
256
269
  bundle,
@@ -258,13 +271,12 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
258
271
  labId: plan.labId,
259
272
  runId,
260
273
  actor: descriptor.id,
261
- backend: "concurrent-shared-world",
274
+ route: "shared-world",
262
275
  dryRun,
263
- laneCount: participantCount,
276
+ participantCount,
264
277
  },
265
278
  sanitize: (text) => redactText(scrubKnownValues(text)),
266
279
  warnings: adapterWarnings,
267
- hookLabel: "sharedWorldHooks",
268
280
  ...(input.scorerProvenance === undefined ? {} : { scorerProvenance: input.scorerProvenance }),
269
281
  });
270
282
  // The one final verdict fold: scoring can only make the judged verdict stricter.
@@ -276,13 +288,13 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
276
288
  if (observer.ok && live.observer) {
277
289
  attachObserverRuntimeStreamUrls(observer, live.streamUrls);
278
290
  }
279
- // Concurrent "ok": every actor must produce a terminal, engaged PASSED session, and the seats
280
- // must show the concurrency verify requires of a pass (judgeSharedWorld). This is a
291
+ // Concurrent "ok": every actor must produce a terminal, engaged, passed session, and the
292
+ // participants must show the concurrency verify requires of a pass (judgeSharedWorld). This is a
281
293
  // harness/session-credibility gate, not mission-completion proof; a failed actor trace cannot
282
294
  // make the route green just because the harness got a terminal.
283
295
  const adapterFailure = adapterScoreFailureMessage(bundle);
284
296
  const policy = OUTCOME_POLICIES["shared-world"];
285
- const execution = judgeExecution(sharedWorldExecutionFailures({ runError, actorResults, observer }), policy);
297
+ const execution = judgeExecution(sharedWorldExecutionFailures({ runId, runError, actorResults, subject: results, observer }), policy);
286
298
  const ok = resultOk({ judgment, execution, scorerFailures: scorerResult.failures, policy });
287
299
  const overlapProven = !dryRun && judgment.world.overlap;
288
300
  const participantResults = concurrentParticipantResults(actorSpecs, actorResults, dryRun);
@@ -299,10 +311,9 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
299
311
  executionFailure: execution.failures[0]?.message,
300
312
  });
301
313
  const result = {
302
- schema: CONCURRENT_SHARED_WORLD_LAB_SCHEMA,
314
+ ...studyResultIdentity("shared-world", plan.labId),
303
315
  ok,
304
316
  cwd,
305
- labId: plan.labId,
306
317
  actor: descriptor.id,
307
318
  topology: "shared-world",
308
319
  topologyMode: "concurrent",