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
@@ -3,8 +3,7 @@ import type { SubjectPhaseEvent } from "../../subject/steps.js";
3
3
  import type { DesktopBrowserEvidence } from "../../substrates/e2b/desktop-browser.js";
4
4
  import type { ActorPersonaRef } from "../../actors/contract.js";
5
5
  import type { CuaLoopResult } from "../../actors/computer-use/loop.js";
6
- import { type RunLabProvenance } from "../../run/status.js";
7
- import { type RunBundle, type RunFeedbackCandidate, type RunProviderResource } from "../../run/bundle.js";
6
+ import { type BundleRun, type RunBundle, type RunFeedbackCandidate, type RunProviderResource } from "../../run/bundle.js";
8
7
  import { type RunDesktopGeometry, type RunStream } from "../../run/streams.js";
9
8
  import { type Verdict } from "../../run/judge.js";
10
9
  import { type DesktopUsage } from "../../run/cost-summary.js";
@@ -17,8 +16,8 @@ export declare function buildSingleParticipantBundle(args: {
17
16
  /** The run's verdict, from the judge. */
18
17
  verdict: Verdict;
19
18
  realEmail?: boolean;
20
- /** Lab provenance for the bundle's own `lab` field (#455). */
21
- lab?: RunLabProvenance;
19
+ /** The run this bundle belongs to; the bundle head reads its id, mode, start and lab. */
20
+ run: BundleRun;
22
21
  actorId: string;
23
22
  appUrl: string;
24
23
  /** The participant's plan id, saved as the stream's laneId ("lane-01" when absent). */
@@ -26,7 +25,6 @@ export declare function buildSingleParticipantBundle(args: {
26
25
  actorType?: string;
27
26
  surface?: string;
28
27
  caseGroup?: string;
29
- createdAt: string;
30
28
  dryRun: boolean;
31
29
  labId: string;
32
30
  labTitle?: string;
@@ -44,7 +42,6 @@ export declare function buildSingleParticipantBundle(args: {
44
42
  /** Device-preset touch metadata echoed on the measured stream viewport (a prompt signal on
45
43
  * this route, never a rendered claim); the measured width/height/DPR stay authoritative. */
46
44
  isMobile?: boolean;
47
- runId: string;
48
45
  screenshots: string[];
49
46
  /** Relative run-dir path of the digest-only comms-thread evidence artifact (humanish.comms-thread.v1),
50
47
  * when a comms lab captured mail; registered as a "log" stream artifact. */
@@ -52,17 +49,17 @@ export declare function buildSingleParticipantBundle(args: {
52
49
  /**
53
50
  * Capture-time screenshot policy ("blurred" when policies.redactScreenshots, else "raw").
54
51
  * When a session ran, its trace's `redaction.screenshots` is the evidence-of-record and
55
- * wins; this fallback keeps labels honest for frames written before a mid-session failure
56
- * (no trace exists to testify then). Defaults to "raw" — the engine default.
52
+ * wins; this fallback labels the frames written before a mid-session failure
53
+ * (no trace exists to testify then). Defaults to "raw", the engine default.
57
54
  */
58
55
  captureRedaction?: "raw" | "blurred";
59
56
  session?: CuaLoopResult;
60
57
  sessionError?: string;
61
58
  /**
62
- * The lane's own credibility read of a goal_satisfied session (#476). The actor's status is
63
- * evidence of what it CLAIMED; whether the harness counts the claim is decided by the lane
59
+ * The route's own credibility read of a goal_satisfied session. The actor's status is
60
+ * evidence of what it claimed; whether the harness counts the claim is decided by the route
64
61
  * (zero engagement, a final message that describes a blocker). The review has to say the same
65
- * thing the lane's exit code says, or the durable bundle reports a participant reaching the
62
+ * thing the participant's exit code says, or the durable bundle reports a participant reaching the
66
63
  * goal on a run the harness refused to count.
67
64
  */
68
65
  credibility?: {
@@ -75,12 +72,12 @@ export declare function buildSingleParticipantBundle(args: {
75
72
  * + digests only, never values or command text), including the subject's state story. */
76
73
  subjectProvenance?: CuaSubjectProvenanceArg;
77
74
  /**
78
- * Entry kind for the non-clone subject.declared event (invariant 5 — declare what the subject
79
- * WAS). "local-app": an already-running LOCAL dev server driven in-process, un-pinnable —
80
- * declared honestly as caller-provisioned/unpinned with no E2B. Absent: a plain app-url entry.
75
+ * Entry kind for the non-clone subject.declared event, which declares what the subject
76
+ * was. "local-app": an already-running local dev server driven in-process, un-pinnable, and
77
+ * declared as caller-provisioned/unpinned with no E2B. Absent: a plain app-url entry.
81
78
  */
82
79
  entryKind?: "local-app";
83
- /** The custom E2B desktop template (image) this lane launched on, when configured (provenance). */
80
+ /** The custom E2B desktop template (image) this participant launched on, when configured (provenance). */
84
81
  desktopTemplate?: string;
85
82
  /** The configured browser choice and the command that opened, when explicitly configured. */
86
83
  desktopBrowser?: DesktopBrowserEvidence;
@@ -90,7 +87,7 @@ export declare function buildSingleParticipantBundle(args: {
90
87
  /** Completed subject-phase records (clone/upload/extract/install/build/ready/state groups)
91
88
  * to fold into bundle.events, so run.json carries real phase timing after the fact. */
92
89
  phaseEvents?: SubjectPhaseEvent[];
93
- /** Host-side E2B desktop billed span for this lane, in minutes (from ParticipantRunOutcome
90
+ /** Host-side E2B desktop billed span for this participant, in minutes (from ParticipantRunOutcome
94
91
  * desktopDurationMs). Absent when no sandbox ran (in-process/dry-run) → no desktop cost line. */
95
92
  desktopMinutes?: number;
96
93
  desktopUsage?: DesktopUsage;
@@ -1,6 +1,5 @@
1
1
  import { participantAssignment } from "../../lab/participant-assignment.js";
2
2
  import { redactText } from "../../evidence/redaction.js";
3
- import {} from "../../run/status.js";
4
3
  import { REVIEW_SCHEMA, bundleArtifacts, bundleHead, } from "../../run/bundle.js";
5
4
  import {} from "../../run/streams.js";
6
5
  import { aggregateTaskFunnels, tallyParticipantOutcomes, withCuaReviewProvenance, } from "../../run/outcomes.js";
@@ -25,7 +24,7 @@ function browserPlace(args) {
25
24
  return "in a hosted desktop browser";
26
25
  }
27
26
  }
28
- /** Run-level cost ESTIMATE (advisory; omitted when nothing was priced and no sandbox ran). */
27
+ /** Run-level cost estimate (advisory; omitted when nothing was priced and no sandbox ran). */
29
28
  function runCost(args) {
30
29
  return buildRunCostSummary({
31
30
  participants: args.session
@@ -53,15 +52,15 @@ function participantView(args, publicAppUrl) {
53
52
  ? "Live computer-use session is running; stream auth URL is available only through the attached Observer server."
54
53
  : (args.session?.reason ??
55
54
  args.sessionError ??
56
- "Contract bundle only: dry-run produced the evidence shape without launching a desktop or spending provider tokens.");
55
+ "Dry run: the evidence shape was written without launching a desktop or spending provider tokens.");
57
56
  const lastScreenshot = args.screenshots[args.screenshots.length - 1];
58
57
  const desktopGeometry = args.desktopRoute === false
59
58
  ? undefined
60
59
  : (args.desktopGeometry ?? {
61
60
  screen: { requested: { width: args.resolution[0], height: args.resolution[1] } },
62
61
  });
63
- // Honest labels (invariant 6: claims match mechanism): every screenshot label names the
64
- // run's ACTUAL mode. The session trace is the evidence-of-record; the capture policy covers
62
+ // Claims match mechanism: every screenshot label names the
63
+ // run's actual mode. The session trace is the evidence-of-record; the capture policy covers
65
64
  // frames written before a mid-session failure produced a trace.
66
65
  const traceScreenshotMode = args.session?.trace.redaction.screenshots;
67
66
  const screenshotMode = traceScreenshotMode === "raw" || traceScreenshotMode === "blurred"
@@ -93,9 +92,9 @@ function singleSimulation(args, view) {
93
92
  ? `Computer-use actor (${args.actorId}) is driving the subject app ${browserPlace(args)}.`
94
93
  : args.sessionError !== undefined
95
94
  ? `Computer-use lab failed before a terminal session verdict: ${args.sessionError}`
96
- : `Contract participant for the computer-use actor (${args.actorId}) against ${publicAppUrl}.`,
97
- startedAt: args.createdAt,
98
- updatedAt: args.createdAt,
95
+ : `Computer-use actor (${args.actorId}) against ${publicAppUrl}; no session ran.`,
96
+ startedAt: args.run.createdAt,
97
+ updatedAt: args.run.createdAt,
99
98
  });
100
99
  }
101
100
  function singleStream(args, view) {
@@ -108,13 +107,13 @@ function singleStream(args, view) {
108
107
  ...(args.surface === undefined ? {} : { surface: args.surface }),
109
108
  ...(args.caseGroup === undefined ? {} : { caseGroup: args.caseGroup }),
110
109
  kind: "browser",
111
- label: `CUA browser — ${args.labId}`,
110
+ label: `${args.participantId ?? "lane-01"} · browser`,
112
111
  status,
113
112
  transport: "snapshot",
114
- updatedAt: args.createdAt,
113
+ updatedAt: args.run.createdAt,
115
114
  embed: lastScreenshot
116
- ? { kind: "screenshot", url: lastScreenshot, title: `CUA desktop (${screenshotMode})` }
117
- : { kind: "placeholder", title: "CUA desktop" },
115
+ ? { kind: "screenshot", url: lastScreenshot, title: `Desktop (${screenshotMode})` }
116
+ : { kind: "placeholder", title: "Desktop" },
118
117
  ...(desktopGeometry?.viewport === undefined
119
118
  ? {}
120
119
  : {
@@ -162,7 +161,7 @@ function singleEvents(args, view) {
162
161
  const events = [
163
162
  {
164
163
  id: "event-000-created",
165
- at: args.createdAt,
164
+ at: args.run.createdAt,
166
165
  level: "info",
167
166
  type: "cua-lab.run.created",
168
167
  message: `Created computer-use lab run for ${args.labId} (actor ${args.actorId}).`,
@@ -170,24 +169,24 @@ function singleEvents(args, view) {
170
169
  args.subjectProvenance
171
170
  ? participantEvent(SINGLE, {
172
171
  id: "event-001-subject",
173
- at: args.createdAt,
172
+ at: args.run.createdAt,
174
173
  level: "info",
175
174
  type: "cua-lab.subject.provenance",
176
- // HONEST WORDING: claim "cloned/packed and served" only when it actually happened.
175
+ // Claim "cloned/packed and served" only when it actually happened.
177
176
  message: `${subjectProvenanceMessage(args.subjectProvenance, publicAppUrl, args.dryRun, args.session !== undefined)} (subject env names: ${args.subjectProvenance.envNames.length > 0 ? args.subjectProvenance.envNames.join(", ") : "none"}; values never persisted); state: ${describeSubjectState(args.subjectProvenance.state, args.dryRun)}.`,
178
177
  })
179
178
  : participantEvent(SINGLE, {
180
179
  id: "event-001-subject",
181
- at: args.createdAt,
180
+ at: args.run.createdAt,
182
181
  level: "info",
183
182
  type: "cua-lab.subject.declared",
184
- // Invariant 5: declare what the subject WAS, including the ABSENCE of a pin. A
185
- // local-app / in-process subject is an already-running LOCAL dev server the caller
186
- // provisioned; it cannot be commit-pinned, so its provenance is honestly UNPINNED and
183
+ // Declare what the subject was, including the absence of a pin. A
184
+ // local-app / in-process subject is an already-running local dev server the caller
185
+ // provisioned; it cannot be commit-pinned, so its provenance is unpinned and
187
186
  // no E2B desktop was created. A plain app-url entry runs inside the desktop sandbox, or,
188
187
  // on the local VM, reaches the host's loopback from the VM's browser.
189
188
  message: args.entryKind === "local-app"
190
- ? `Subject app declared at ${publicAppUrl} (already-running LOCAL dev server driven in-process; NO clone, NO E2B desktop). Provenance: caller-provisioned and UNPINNED — a running dev server cannot be commit-pinned.`
189
+ ? `Subject app declared at ${publicAppUrl}: a running local dev server driven in this process, with no clone and no E2B desktop. Provenance: provided by the caller and unpinned, because a running dev server has no commit to pin.`
191
190
  : runnerSubstrate(args) === "local-desktop"
192
191
  ? `Subject app declared at ${publicAppUrl} (the host's loopback, opened from a browser on a local VM).`
193
192
  : `Subject app declared at ${publicAppUrl} (loopback inside the desktop sandbox).`,
@@ -195,7 +194,7 @@ function singleEvents(args, view) {
195
194
  args.session
196
195
  ? participantEvent(SINGLE, {
197
196
  id: "event-002-session",
198
- at: args.createdAt,
197
+ at: args.run.createdAt,
199
198
  level: args.session.status === "passed" ? "info" : "warn",
200
199
  type: `cua-lab.session.${args.session.completionReason}`,
201
200
  message: `${args.session.status}: ${args.session.reason}`,
@@ -203,7 +202,7 @@ function singleEvents(args, view) {
203
202
  : args.inProgress === true
204
203
  ? participantEvent(SINGLE, {
205
204
  id: "event-002-running",
206
- at: args.createdAt,
205
+ at: args.run.createdAt,
207
206
  level: "info",
208
207
  type: "cua-lab.session.running",
209
208
  message: "Live computer-use session is running; terminal evidence has not been written yet.",
@@ -211,22 +210,22 @@ function singleEvents(args, view) {
211
210
  : args.sessionError !== undefined
212
211
  ? participantEvent(SINGLE, {
213
212
  id: "event-002-session",
214
- at: args.createdAt,
213
+ at: args.run.createdAt,
215
214
  level: "error",
216
215
  type: "cua-lab.session.error",
217
216
  message: args.sessionError,
218
217
  })
219
218
  : participantEvent(SINGLE, {
220
219
  id: "event-002-contract",
221
- at: args.createdAt,
220
+ at: args.run.createdAt,
222
221
  level: "info",
223
222
  type: "cua-lab.contract.ready",
224
- message: "Dry-run contract bundle ready; switch scenario.mode to live for a real desktop session.",
223
+ message: "Dry-run bundle ready; switch scenario.mode to live for a real desktop session.",
225
224
  }),
226
225
  ];
227
226
  const record = (event) => events.push(participantEvent(SINGLE, event));
228
227
  // Persisted phase trail (real boot timing, not just a coarse provenance sentence): one
229
- // RunEvent per COMPLETED phase boundary (started events never persist here; they carry no
228
+ // RunEvent per completed phase boundary (started events never persist here; they carry no
230
229
  // durationMs). ok:false phases warn rather than error, since the failing phase's own thrown
231
230
  // error already becomes the terminal cua-lab.session.error event above.
232
231
  let phaseEventSeq = 3;
@@ -242,7 +241,7 @@ function singleEvents(args, view) {
242
241
  for (const warning of desktopGeometry?.warnings ?? []) {
243
242
  record({
244
243
  id: `event-${String(phaseEventSeq++).padStart(3, "0")}-geometry-warning`,
245
- at: args.createdAt,
244
+ at: args.run.createdAt,
246
245
  level: "warn",
247
246
  type: "cua-lab.geometry.warning",
248
247
  message: warning,
@@ -252,17 +251,15 @@ function singleEvents(args, view) {
252
251
  }
253
252
  function singleReview(args, view, stream) {
254
253
  const { reason } = view;
255
- // A funnel with a denominator of one is still the funnel — and its absence stays honest: no
254
+ // A funnel with a denominator of one is still the funnel, and its absence stays recorded: no
256
255
  // declared protocol (or a dry run) means no `tasks` field, never an empty one.
257
- const singleStudyTasks = args.inProgress !== true && args.session?.trace.taskFunnel !== undefined
256
+ const singleRunTasks = args.inProgress !== true && args.session?.trace.taskFunnel !== undefined
258
257
  ? aggregateTaskFunnels([args.session.trace.taskFunnel])
259
258
  : undefined;
260
- // What happened to the participant, as the LANE judged it — the same rule the fan-out roll-up
261
- // applies (participantStatusForOutcome). Before #476 this read the actor's own status, so a
262
- // run the lane refused as "not a credible pass" was written up as verdict pass, 1/1 reached
263
- // the goal, and every projection of the bundle (Observer tally, `runs`, the status index)
264
- // repeated it. Found on a real drawDB run whose participant wrote "Blocked after partial
265
- // completion".
259
+ // What happened to the participant, as the route judged it: the same rule the fan-out roll-up
260
+ // applies (participantStatus in src/run/judge.ts). Reading the actor's own status instead would write up
261
+ // a run the route refused as "not a credible pass" as verdict pass, 1/1 reached the goal, and
262
+ // every projection of the bundle (Observer tally, `runs`, the status index) would repeat it.
266
263
  const participantStatus = args.session === undefined
267
264
  ? undefined
268
265
  : participantStatusFor(args.session.status, args.credibility);
@@ -274,20 +271,20 @@ function singleReview(args, view, stream) {
274
271
  const review = withCuaReviewProvenance({
275
272
  schema: REVIEW_SCHEMA,
276
273
  verdict: args.verdict,
277
- // One lane is still a study with a denominator of one, and saying so keeps a single-lane
278
- // result from being read as though it generalized.
274
+ // One participant is still a study with a denominator of one, and saying so keeps a
275
+ // single-participant result from being read as though it generalized.
279
276
  ...(participantStatus !== undefined && args.inProgress !== true
280
277
  ? {
281
278
  participants: tallyParticipantOutcomes([participantStatus], [args.credibility?.reportedFriction === true]),
282
279
  }
283
280
  : {}),
284
- ...(singleStudyTasks === undefined ? {} : { tasks: singleStudyTasks }),
281
+ ...(singleRunTasks === undefined ? {} : { tasks: singleRunTasks }),
285
282
  summary: credibilityNote === undefined ? reason : `${credibilityNote} ${reason}`,
286
283
  gaps: args.session || args.sessionError !== undefined
287
284
  ? []
288
285
  : args.inProgress === true
289
286
  ? ["Live desktop session is still running."]
290
- : ["Live desktop session not yet run (dry-run contract only)."],
287
+ : ["Live desktop session not yet run (dry run only)."],
291
288
  }, [stream]);
292
289
  return review;
293
290
  }
@@ -305,33 +302,29 @@ export function buildSingleParticipantBundle(args) {
305
302
  const events = singleEvents(args, view);
306
303
  const review = singleReview(args, view, stream);
307
304
  return {
308
- ...bundleHead({
305
+ ...bundleHead(args.run, {
309
306
  ...(args.realEmail && !args.dryRun
310
307
  ? { publication: { restrictions: ["real-communications"] } }
311
308
  : {}),
312
- runId: args.runId,
313
- mode: args.dryRun ? "dry-run" : "live",
314
309
  participants: 1,
315
- createdAt: args.createdAt,
316
- ...(args.lab === undefined ? {} : { lab: args.lab }),
317
310
  source: args.source,
318
311
  }),
319
312
  persona: {
320
313
  id: args.persona.id,
321
314
  name: `Computer-use operator (${args.persona.id})`,
322
- source: `lab:${args.labId}`,
315
+ source: `study:${args.labId}`,
323
316
  sourceDigest: args.persona.promptDigest,
324
317
  },
325
318
  scenario: {
326
319
  id: `cua-${args.labId}`,
327
320
  title: args.labTitle ?? `Computer-use lab: ${args.labId}`,
328
321
  goal: redactText(args.mission),
329
- source: `lab:${args.labId}`,
322
+ source: `study:${args.labId}`,
330
323
  sourceDigest: args.persona.promptDigest,
331
324
  },
332
325
  lifecycle: [
333
326
  {
334
- at: args.createdAt,
327
+ at: args.run.createdAt,
335
328
  event: "cua-lab.run.created",
336
329
  message: `Created computer-use lab run with one participant in a desktop browser (actor ${args.actorId}).`,
337
330
  },
@@ -342,7 +335,7 @@ export function buildSingleParticipantBundle(args) {
342
335
  redaction: {
343
336
  status: "passed",
344
337
  notes: traceScreenshotMode === "raw"
345
- ? "Typed text recorded as length only and reasoning/messages pass through text redaction. Screenshots are FULL-FIDELITY (raw), retained for local use — NOT redacted for publishing; set policies.redactScreenshots: true to blur a share-as-is bundle."
338
+ ? "Typed text is recorded as its length only, and reasoning and messages pass through text redaction. Screenshots are unblurred and kept for local use; they are not redacted for publishing. Set policies.redactScreenshots: true to blur screenshots in a bundle you plan to share."
346
339
  : traceScreenshotMode === "blurred"
347
340
  ? "Typed text recorded as length only and reasoning/messages pass through text redaction. Screenshots are blurred at capture (policies.redactScreenshots: true) for a share-as-is bundle."
348
341
  : args.screenshots.length > 0
@@ -351,12 +344,12 @@ export function buildSingleParticipantBundle(args) {
351
344
  },
352
345
  artifacts: bundleArtifacts(),
353
346
  review,
354
- // What the participant reported, when it reported anything (#392). Dry-run and in-progress
355
- // bundles carry none — there is no participant yet to quote.
347
+ // What the participant reported, when it reported anything. Dry-run and in-progress
348
+ // bundles carry none: there is no participant yet to quote.
356
349
  feedbackCandidates: args.dryRun || args.inProgress === true
357
350
  ? []
358
351
  : participantFeedbackCandidates({
359
- runId: args.runId,
352
+ runId: args.run.runId,
360
353
  scenarioId: `cua-${args.labId}`,
361
354
  adapterId: args.labId,
362
355
  goal: redactText(args.mission),
@@ -383,8 +376,8 @@ export function buildSingleParticipantBundle(args) {
383
376
  ...(args.providerResources === undefined || args.providerResources.length === 0
384
377
  ? {}
385
378
  : { providerResources: args.providerResources }),
386
- // Structured subject provenance (invariant 5): code pin + state story. Uniform and
387
- // honest on app-url bundles too — the caller minted the URL, its state is the caller's.
379
+ // Structured subject provenance: code pin + state story. Uniform, and
380
+ // stated on app-url bundles too: the caller minted the URL, its state is the caller's.
388
381
  // CuaSubjectProvenanceArg's two variants (clone, local-tree) are already RunSubjectProvenance-
389
382
  // shaped, so no reconstruction is needed beyond the app-url fallback.
390
383
  subject: args.subjectProvenance ?? { source: "app-url", state: { provenance: "undeclared" } },
@@ -2,16 +2,14 @@ import type { ComputerUsePlan } from "../../lab/plan-types.js";
2
2
  import type { LabSubjectState } from "../../lab/types.js";
3
3
  import { type RunSubjectProvenance, type RunSubjectStateStepRecord } from "../../run/bundle.js";
4
4
  import { type LocalTreeArchive } from "../../subject/local-tree-archive.js";
5
- import { type CuaSubjectRoute } from "./plan.js";
6
5
  import { type DesktopParticipantRun, type CuaSubjectProjection, type CuaSubjectProvenanceArg, type ParticipantRunOutcome } from "./types.js";
7
6
  /**
8
- * Each lane's subject projection. A lane's outcome adds the subject commit it resolved and the
7
+ * Each participant's subject projection. A participant's outcome adds the subject commit it resolved and the
9
8
  * state steps it executed; without outcomes (dry run, or a run still in progress) the declared
10
9
  * state is projected as not yet run.
11
10
  */
12
11
  export declare function projectParticipantSubjects(args: {
13
12
  plan: ComputerUsePlan;
14
- subjectRoute: CuaSubjectRoute;
15
13
  publicRepo?: string;
16
14
  localTreeArchive?: LocalTreeArchive;
17
15
  runs: readonly DesktopParticipantRun[];
@@ -20,7 +18,7 @@ export declare function projectParticipantSubjects(args: {
20
18
  }): CuaSubjectProjection[];
21
19
  /**
22
20
  * Resolve the bundle's state marker from the declaration and what actually ran.
23
- * Precedence: external declared → "unpinned" (seed records, if any, stay attached — a
21
+ * Precedence: external declared → "unpinned" (seed records, if any, stay attached; a
24
22
  * migrated external DB is still unpinned overall); else seed declared → "seeded" only when
25
23
  * every declared step executed ok on a live run, otherwise "declared-not-run" (dry-run
26
24
  * contract bundles and failed live provisioning); no declaration → "undeclared".
@@ -35,10 +33,10 @@ export declare function resolveSubjectState(args: {
35
33
  * default branch that builder already handles). */
36
34
  export declare function subjectProvenanceArg(subject: CuaSubjectProjection, publicRepo: string | undefined, subjectEnvNames: string[]): CuaSubjectProvenanceArg | undefined;
37
35
  /**
38
- * The run-level subject for the top level and the bundle. Local-tree lanes all pack from the same
39
- * once-per-run archive, so every lane already carries the identical archiveSha256/commit/dirty and
40
- * the first lane's projection is the aggregate. Clone lanes each resolve their own commit; the
41
- * aggregate carries it only when every lane agrees, and warns when they diverge.
36
+ * The run-level subject for the top level and the bundle. Local-tree participants all pack from the
37
+ * same once-per-run archive, so every participant already carries the identical archiveSha256/commit/dirty and
38
+ * the first participant's projection is the aggregate. Clone participants each resolve their own
39
+ * commit; the aggregate carries it only when every participant agrees, and warns when they diverge.
42
40
  */
43
41
  export declare function aggregateCuaSubject(args: {
44
42
  subjects: readonly CuaSubjectProjection[];
@@ -1,32 +1,33 @@
1
- // Each lane's subject projection and the subject-state marker, from the declared subject and what
2
- // the lanes ran; the run-level subject aggregated from them; and the provenance argument the
1
+ // Each participant's subject projection and the subject-state marker, from the declared subject
2
+ // and what the participants ran; the run-level subject aggregated from them; and the provenance argument the
3
3
  // bundle builders take.
4
4
  import { commandDigestOf } from "../../subject/state.js";
5
5
  import { cuaDeclaredState } from "./plan.js";
6
6
  import {} from "../../run/bundle.js";
7
7
  import {} from "../../subject/local-tree-archive.js";
8
- import {} from "./plan.js";
9
- import {} from "./types.js";
8
+ import { participantSubjectEnv, } from "./types.js";
10
9
  /**
11
- * Each lane's subject projection. A lane's outcome adds the subject commit it resolved and the
10
+ * Each participant's subject projection. A participant's outcome adds the subject commit it resolved and the
12
11
  * state steps it executed; without outcomes (dry run, or a run still in progress) the declared
13
12
  * state is projected as not yet run.
14
13
  */
15
14
  export function projectParticipantSubjects(args) {
16
- const { subjectRoute, publicRepo, localTreeArchive } = args;
15
+ const { publicRepo, localTreeArchive } = args;
16
+ const { subject } = args.plan.runner;
17
+ const subjectEnvNames = [...participantSubjectEnv(subject)];
18
+ // Only a provisioned subject declares state; cuaDeclaredState is undefined for the others.
17
19
  const declaredState = cuaDeclaredState(args.plan);
18
20
  return args.runs.map((_spec, index) => {
19
21
  const outcome = args.outcomes?.[index];
20
22
  const subjectState = resolveSubjectState({
21
- declared: subjectRoute.provisionedRoute ? declaredState : undefined,
23
+ declared: declaredState,
22
24
  dryRun: args.dryRun,
23
25
  executed: outcome?.stateStepRecords ?? [],
24
26
  });
25
27
  return participantSubjectProjection({
26
- cloneRoute: subjectRoute.cloneRoute,
27
- localTreeRoute: subjectRoute.localTreeRoute,
28
+ kind: subject.kind,
28
29
  ...(publicRepo === undefined ? {} : { publicRepo }),
29
- subjectEnvNames: subjectRoute.subjectEnvNames,
30
+ subjectEnvNames,
30
31
  ...(outcome?.subjectCommit === undefined ? {} : { subjectCommit: outcome.subjectCommit }),
31
32
  ...(localTreeArchive === undefined ? {} : { localTreeArchive }),
32
33
  subjectState,
@@ -35,7 +36,7 @@ export function projectParticipantSubjects(args) {
35
36
  }
36
37
  /**
37
38
  * Resolve the bundle's state marker from the declaration and what actually ran.
38
- * Precedence: external declared → "unpinned" (seed records, if any, stay attached — a
39
+ * Precedence: external declared → "unpinned" (seed records, if any, stay attached; a
39
40
  * migrated external DB is still unpinned overall); else seed declared → "seeded" only when
40
41
  * every declared step executed ok on a live run, otherwise "declared-not-run" (dry-run
41
42
  * contract bundles and failed live provisioning); no declaration → "undeclared".
@@ -47,8 +48,8 @@ export function resolveSubjectState(args) {
47
48
  }
48
49
  const declaredSeed = declared.seed ?? [];
49
50
  const external = declared.external ?? [];
50
- // Dry-run: nothing executes (no sandbox) — record the DECLARED recipe: name, phase, and
51
- // command digest only, with NO execution fields.
51
+ // Dry-run: nothing executes (no sandbox), so record the declared recipe: name, phase, and
52
+ // command digest only, with no execution fields.
52
53
  const seed = args.dryRun
53
54
  ? declaredSeed.map((step) => ({
54
55
  name: step.name,
@@ -73,12 +74,12 @@ export function resolveSubjectState(args) {
73
74
  ...(external.length > 0 ? { externalEnvNames: external } : {}),
74
75
  };
75
76
  }
76
- /** Build the per-lane subject projection (invariant 5). Local-tree lanes all share ONE
77
- * host-packed archive, so every lane's projection carries the identical archiveSha256/
78
- * commit/dirty (no per-lane divergence is possible, unlike the clone route's per-lane
77
+ /** Build the per-participant subject projection. Local-tree participants all share
78
+ * one host-packed archive, so every participant's projection carries the identical archiveSha256/
79
+ * commit/dirty (no divergence is possible, unlike the clone route's per-participant
79
80
  * in-sandbox commit). */
80
81
  function participantSubjectProjection(args) {
81
- if (args.cloneRoute && args.publicRepo) {
82
+ if (args.kind === "clone" && args.publicRepo) {
82
83
  return {
83
84
  source: "clone",
84
85
  repo: args.publicRepo,
@@ -87,7 +88,7 @@ function participantSubjectProjection(args) {
87
88
  state: args.subjectState,
88
89
  };
89
90
  }
90
- if (args.localTreeRoute) {
91
+ if (args.kind === "local-tree") {
91
92
  const archive = args.localTreeArchive;
92
93
  return {
93
94
  source: "local-tree",
@@ -127,10 +128,10 @@ export function subjectProvenanceArg(subject, publicRepo, subjectEnvNames) {
127
128
  return undefined;
128
129
  }
129
130
  /**
130
- * The run-level subject for the top level and the bundle. Local-tree lanes all pack from the same
131
- * once-per-run archive, so every lane already carries the identical archiveSha256/commit/dirty and
132
- * the first lane's projection is the aggregate. Clone lanes each resolve their own commit; the
133
- * aggregate carries it only when every lane agrees, and warns when they diverge.
131
+ * The run-level subject for the top level and the bundle. Local-tree participants all pack from the
132
+ * same once-per-run archive, so every participant already carries the identical archiveSha256/commit/dirty and
133
+ * the first participant's projection is the aggregate. Clone participants each resolve their own
134
+ * commit; the aggregate carries it only when every participant agrees, and warns when they diverge.
134
135
  */
135
136
  export function aggregateCuaSubject(args) {
136
137
  const { subjects, outcomes, participantCount, dryRun } = args;
@@ -143,7 +144,7 @@ export function aggregateCuaSubject(args) {
143
144
  const unanimous = !dryRun && commits.length === participantCount && new Set(commits).size === 1;
144
145
  const warnings = !dryRun && participantCount > 1 && new Set(commits).size > 1
145
146
  ? [
146
- "Fan-out participants resolved DIVERGENT subject commits, so the top-level subject.commit is omitted; see each participant's provenance in result.lanes for its pinned commit.",
147
+ "Participants resolved different subject commits, so the top-level subject.commit is omitted; each participant's provenance in result.lanes has its pinned commit.",
147
148
  ]
148
149
  : [];
149
150
  return {