humanish 0.107.0 → 0.109.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 (671) hide show
  1. package/ARCHITECTURE.md +73 -69
  2. package/CHANGELOG.md +27 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +148 -175
  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-trace.js +2 -1
  14. package/dist/actors/codex/app-server-ui.js +1 -1
  15. package/dist/actors/codex/codex-admission.d.ts +91 -0
  16. package/dist/actors/codex/codex-admission.js +150 -0
  17. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  18. package/dist/actors/codex/restricted-executable.js +8 -8
  19. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  20. package/dist/actors/codex/restricted-launch.js +1 -1
  21. package/dist/actors/codex/restricted-participant.js +20 -18
  22. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  23. package/dist/actors/codex/restricted-policy.js +2 -2
  24. package/dist/actors/codex/restricted-session.d.ts +3 -3
  25. package/dist/actors/codex/restricted-session.js +10 -5
  26. package/dist/actors/computer-use/actor.d.ts +18 -18
  27. package/dist/actors/computer-use/actor.js +4 -4
  28. package/dist/actors/computer-use/admission-limit.d.ts +3 -3
  29. package/dist/actors/computer-use/admission-limit.js +4 -4
  30. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  31. package/dist/actors/computer-use/executor-error.js +3 -3
  32. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  33. package/dist/actors/computer-use/loop/actions.js +15 -15
  34. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  35. package/dist/actors/computer-use/loop/backstop.js +14 -12
  36. package/dist/actors/computer-use/loop/debrief.js +2 -2
  37. package/dist/actors/computer-use/loop/ending.d.ts +6 -6
  38. package/dist/actors/computer-use/loop/ending.js +18 -17
  39. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  40. package/dist/actors/computer-use/loop/observation.js +15 -14
  41. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  42. package/dist/actors/computer-use/loop/provider-call.js +12 -12
  43. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  44. package/dist/actors/computer-use/loop/session.js +4 -4
  45. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  46. package/dist/actors/computer-use/loop/spend.js +1 -1
  47. package/dist/actors/computer-use/loop/trace.js +11 -9
  48. package/dist/actors/computer-use/loop/types.d.ts +47 -45
  49. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  50. package/dist/actors/computer-use/loop/usage.js +2 -2
  51. package/dist/actors/computer-use/loop.d.ts +6 -1
  52. package/dist/actors/computer-use/loop.js +26 -4
  53. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  54. package/dist/actors/computer-use/openai-context.js +214 -0
  55. package/dist/actors/computer-use/openai-provider.d.ts +13 -10
  56. package/dist/actors/computer-use/openai-provider.js +52 -41
  57. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  58. package/dist/actors/computer-use/openai-requests.js +82 -15
  59. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  60. package/dist/actors/computer-use/openai-wire.js +36 -34
  61. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  62. package/dist/actors/computer-use/provider-error.js +6 -6
  63. package/dist/actors/contract.d.ts +82 -47
  64. package/dist/actors/contract.js +30 -24
  65. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  66. package/dist/actors/local-agent/claude-session.js +13 -12
  67. package/dist/actors/local-agent/cli.d.ts +9 -7
  68. package/dist/actors/local-agent/cli.js +24 -28
  69. package/dist/actors/local-agent/readiness.d.ts +2 -2
  70. package/dist/actors/local-agent/readiness.js +4 -4
  71. package/dist/actors/reasoning-effort.js +8 -8
  72. package/dist/actors/registry.d.ts +12 -12
  73. package/dist/actors/registry.js +21 -20
  74. package/dist/actors/scripted-browser/actor.d.ts +10 -10
  75. package/dist/actors/scripted-browser/actor.js +17 -17
  76. package/dist/actors/scripted-browser/browser-command.js +1 -1
  77. package/dist/actors/scripted-browser/steps.js +1 -1
  78. package/dist/actors/scripted-browser/types.d.ts +1 -1
  79. package/dist/actors/stop-conditions.d.ts +1 -1
  80. package/dist/analysis/automatic-completion.d.ts +7 -7
  81. package/dist/analysis/automatic-completion.js +1 -1
  82. package/dist/analysis/automatic-config.d.ts +6 -6
  83. package/dist/analysis/automatic-config.js +1 -1
  84. package/dist/analysis/codex-config.d.ts +6 -2
  85. package/dist/analysis/codex-config.js +22 -14
  86. package/dist/analysis/execute.d.ts +1 -1
  87. package/dist/analysis/execute.js +1 -1
  88. package/dist/analysis/service.js +5 -5
  89. package/dist/analysis/types.d.ts +6 -0
  90. package/dist/browser-control/client.js +16 -16
  91. package/dist/browser-control/dispatcher.js +4 -4
  92. package/dist/browser-control/protocol.js +14 -14
  93. package/dist/browser-control/recording-transfer.js +4 -4
  94. package/dist/browser-control/transport.js +7 -7
  95. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  96. package/dist/cli/commands/analyze.js +19 -16
  97. package/dist/cli/commands/codex.js +9 -9
  98. package/dist/cli/commands/comms.js +48 -35
  99. package/dist/cli/commands/feedback.js +20 -21
  100. package/dist/cli/commands/migrate.d.ts +4 -0
  101. package/dist/cli/commands/migrate.js +65 -0
  102. package/dist/cli/commands/observe.d.ts +0 -1
  103. package/dist/cli/commands/observe.js +136 -112
  104. package/dist/cli/commands/run-command.d.ts +10 -0
  105. package/dist/cli/commands/run-command.js +85 -0
  106. package/dist/cli/commands/runs.js +136 -139
  107. package/dist/cli/commands/setup.d.ts +2 -2
  108. package/dist/cli/commands/setup.js +27 -24
  109. package/dist/cli/commands/study-format.d.ts +9 -0
  110. package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
  111. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  112. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
  113. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  114. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  115. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  116. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
  117. package/dist/cli/commands/study-route-run.d.ts +19 -0
  118. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  119. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  120. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  121. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  122. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
  123. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  124. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  125. package/dist/cli/commands/study-run.d.ts +9 -0
  126. package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
  127. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
  128. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
  129. package/dist/cli/commands/study.d.ts +3 -0
  130. package/dist/cli/commands/study.js +146 -0
  131. package/dist/cli/commands/tui.d.ts +4 -4
  132. package/dist/cli/commands/tui.js +31 -31
  133. package/dist/cli/commands/watch.js +71 -121
  134. package/dist/cli/deprecations.d.ts +6 -0
  135. package/dist/cli/deprecations.js +18 -0
  136. package/dist/cli/doctor.d.ts +18 -8
  137. package/dist/cli/doctor.js +114 -59
  138. package/dist/cli/first-run-path.d.ts +15 -13
  139. package/dist/cli/first-run-path.js +35 -33
  140. package/dist/cli/io.d.ts +44 -9
  141. package/dist/cli/io.js +98 -23
  142. package/dist/cli/observer-follow.d.ts +3 -3
  143. package/dist/cli/observer-follow.js +6 -7
  144. package/dist/cli/orientation.d.ts +10 -7
  145. package/dist/cli/orientation.js +89 -47
  146. package/dist/cli/product-sentence.d.ts +6 -0
  147. package/dist/cli/product-sentence.js +6 -0
  148. package/dist/cli/program.d.ts +6 -1
  149. package/dist/cli/program.js +111 -43
  150. package/dist/cli/telemetry.d.ts +16 -16
  151. package/dist/cli/telemetry.js +46 -44
  152. package/dist/cli.js +1 -1
  153. package/dist/comms/capture-surface.d.ts +13 -12
  154. package/dist/comms/capture-surface.js +23 -22
  155. package/dist/comms/catch-host.d.ts +7 -7
  156. package/dist/comms/catch-host.js +17 -17
  157. package/dist/comms/connections.d.ts +1 -1
  158. package/dist/comms/connections.js +2 -2
  159. package/dist/comms/email-catch.d.ts +3 -3
  160. package/dist/comms/email-catch.js +8 -8
  161. package/dist/comms/external-evidence.d.ts +5 -5
  162. package/dist/comms/external-evidence.js +5 -4
  163. package/dist/comms/extract.js +2 -2
  164. package/dist/comms/fake-inbox.d.ts +3 -3
  165. package/dist/comms/fake-inbox.js +3 -3
  166. package/dist/comms/receiving-render.d.ts +1 -1
  167. package/dist/comms/receiving-render.js +2 -2
  168. package/dist/comms/receiving-runtime.d.ts +4 -4
  169. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  170. package/dist/comms/sandbox-catch-script.js +6 -6
  171. package/dist/comms/sandbox-catch.d.ts +38 -39
  172. package/dist/comms/sandbox-catch.js +36 -37
  173. package/dist/comms/setup.d.ts +2 -2
  174. package/dist/comms/setup.js +56 -25
  175. package/dist/comms/thread-evidence.d.ts +1 -1
  176. package/dist/comms/thread-evidence.js +6 -6
  177. package/dist/comms/types.d.ts +6 -6
  178. package/dist/comms/types.js +3 -3
  179. package/dist/evidence/frame-signature.d.ts +1 -1
  180. package/dist/evidence/frame-signature.js +4 -4
  181. package/dist/evidence/redaction.d.ts +3 -3
  182. package/dist/evidence/redaction.js +4 -4
  183. package/dist/feedback/draft.js +38 -80
  184. package/dist/feedback/export-bundle.js +1 -1
  185. package/dist/feedback/export.d.ts +5 -1
  186. package/dist/feedback/export.js +10 -10
  187. package/dist/feedback/feedback.d.ts +2 -2
  188. package/dist/feedback/feedback.js +21 -3
  189. package/dist/feedback/proof.d.ts +1 -1
  190. package/dist/feedback/proof.js +2 -2
  191. package/dist/guest/bootstrap.js +6 -6
  192. package/dist/guest/browser-tools.js +8 -8
  193. package/dist/guest/chromium-text.js +19 -19
  194. package/dist/guest/desktop-executor.d.ts +2 -2
  195. package/dist/guest/desktop-executor.js +20 -20
  196. package/dist/guest/desktop-keys.js +4 -4
  197. package/dist/guest/desktop-media.d.ts +2 -2
  198. package/dist/guest/desktop-media.js +16 -16
  199. package/dist/guest/desktop-native.d.ts +1 -1
  200. package/dist/guest/desktop-native.js +10 -10
  201. package/dist/guest/runtime-desktop.js +2 -2
  202. package/dist/guest/runtime-processes.d.ts +2 -2
  203. package/dist/guest/runtime-processes.js +2 -2
  204. package/dist/guest/runtime.js +6 -6
  205. package/dist/index.d.ts +14 -14
  206. package/dist/index.js +8 -8
  207. package/dist/keys/key-resolution.d.ts +5 -5
  208. package/dist/keys/key-resolution.js +23 -23
  209. package/dist/observer/artifact.d.ts +2 -2
  210. package/dist/observer/artifact.js +7 -7
  211. package/dist/observer/data.d.ts +6 -6
  212. package/dist/observer/data.js +5 -4
  213. package/dist/observer/exposure.d.ts +1 -1
  214. package/dist/observer/exposure.js +11 -11
  215. package/dist/observer/http.js +1 -1
  216. package/dist/observer/library.d.ts +3 -1
  217. package/dist/observer/library.js +8 -3
  218. package/dist/observer/listen.js +5 -4
  219. package/dist/observer/render.d.ts +1 -1
  220. package/dist/observer/render.js +17 -6
  221. package/dist/observer/run-routes.d.ts +4 -3
  222. package/dist/observer/run-routes.js +38 -13
  223. package/dist/observer/serve.d.ts +1 -1
  224. package/dist/observer/serve.js +7 -3
  225. package/dist/observer/tunnel.js +1 -1
  226. package/dist/observer-app.html +4 -4
  227. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  228. package/dist/routes/computer-use/bundle-parts.js +18 -17
  229. package/dist/routes/computer-use/bundle.d.ts +2 -2
  230. package/dist/routes/computer-use/bundle.js +10 -9
  231. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
  232. package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
  233. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  234. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
  235. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  236. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
  238. package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
  239. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  240. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
  241. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  242. package/dist/routes/computer-use/external-comms.js +1 -1
  243. package/dist/routes/computer-use/fanout-bundle.js +27 -26
  244. package/dist/routes/computer-use/fanout-records.js +12 -13
  245. package/dist/routes/computer-use/live-flush.d.ts +4 -4
  246. package/dist/routes/computer-use/live-flush.js +6 -6
  247. package/dist/routes/computer-use/live-phase.d.ts +5 -4
  248. package/dist/routes/computer-use/live-phase.js +8 -8
  249. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  250. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  251. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  252. package/dist/routes/computer-use/local-vm.js +3 -3
  253. package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
  254. package/dist/routes/computer-use/participant-desktop.js +5 -5
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +10 -10
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +33 -15
  259. package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
  260. package/dist/routes/computer-use/participant-prompt.js +9 -9
  261. package/dist/routes/computer-use/participant-runs.d.ts +16 -16
  262. package/dist/routes/computer-use/participant-runs.js +26 -25
  263. package/dist/routes/computer-use/plan.d.ts +12 -12
  264. package/dist/routes/computer-use/plan.js +42 -42
  265. package/dist/routes/computer-use/preflight.d.ts +5 -5
  266. package/dist/routes/computer-use/preflight.js +25 -25
  267. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  268. package/dist/routes/computer-use/rerun-selection.js +4 -3
  269. package/dist/routes/computer-use/result.d.ts +4 -4
  270. package/dist/routes/computer-use/result.js +22 -21
  271. package/dist/routes/computer-use/route.d.ts +12 -11
  272. package/dist/routes/computer-use/route.js +31 -30
  273. package/dist/routes/computer-use/self-report.d.ts +7 -7
  274. package/dist/routes/computer-use/self-report.js +32 -32
  275. package/dist/routes/computer-use/setup.d.ts +23 -23
  276. package/dist/routes/computer-use/setup.js +28 -29
  277. package/dist/routes/computer-use/single-bundle.d.ts +11 -11
  278. package/dist/routes/computer-use/single-bundle.js +40 -41
  279. package/dist/routes/computer-use/subject-projection.d.ts +4 -4
  280. package/dist/routes/computer-use/subject-projection.js +6 -6
  281. package/dist/routes/computer-use/types.d.ts +71 -73
  282. package/dist/routes/computer-use/types.js +12 -12
  283. package/dist/routes/preview.d.ts +13 -7
  284. package/dist/routes/preview.js +11 -7
  285. package/dist/routes/scripted/bundle.d.ts +7 -7
  286. package/dist/routes/scripted/bundle.js +20 -18
  287. package/dist/routes/scripted/plan.d.ts +8 -8
  288. package/dist/routes/scripted/plan.js +13 -13
  289. package/dist/routes/scripted/result.d.ts +3 -3
  290. package/dist/routes/scripted/result.js +13 -13
  291. package/dist/routes/scripted/route.d.ts +9 -9
  292. package/dist/routes/scripted/route.js +15 -16
  293. package/dist/routes/scripted/scenario.d.ts +1 -1
  294. package/dist/routes/scripted/scenario.js +5 -5
  295. package/dist/routes/scripted/setup.d.ts +6 -6
  296. package/dist/routes/scripted/setup.js +8 -8
  297. package/dist/routes/scripted/subject.d.ts +5 -5
  298. package/dist/routes/scripted/subject.js +4 -4
  299. package/dist/routes/scripted/surface-records.d.ts +1 -1
  300. package/dist/routes/scripted/surface-records.js +4 -4
  301. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  302. package/dist/routes/scripted/types.d.ts +18 -20
  303. package/dist/routes/scripted/types.js +2 -2
  304. package/dist/routes/shared-world/bundle-records.js +11 -10
  305. package/dist/routes/shared-world/bundle.d.ts +5 -5
  306. package/dist/routes/shared-world/bundle.js +46 -43
  307. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  308. package/dist/routes/shared-world/checkpoints.js +2 -2
  309. package/dist/routes/shared-world/comms.d.ts +14 -14
  310. package/dist/routes/shared-world/comms.js +19 -18
  311. package/dist/routes/shared-world/external-public.d.ts +4 -3
  312. package/dist/routes/shared-world/external-public.js +16 -12
  313. package/dist/routes/shared-world/handoff.d.ts +7 -6
  314. package/dist/routes/shared-world/handoff.js +65 -57
  315. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  316. package/dist/routes/shared-world/lobby-code.js +9 -9
  317. package/dist/routes/shared-world/participant-specs.d.ts +10 -9
  318. package/dist/routes/shared-world/participant-specs.js +38 -31
  319. package/dist/routes/shared-world/plan.d.ts +9 -9
  320. package/dist/routes/shared-world/plan.js +16 -16
  321. package/dist/routes/shared-world/provenance.d.ts +2 -2
  322. package/dist/routes/shared-world/provenance.js +2 -2
  323. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  324. package/dist/routes/shared-world/provisioned.js +18 -17
  325. package/dist/routes/shared-world/result.d.ts +6 -6
  326. package/dist/routes/shared-world/result.js +29 -29
  327. package/dist/routes/shared-world/route.d.ts +11 -11
  328. package/dist/routes/shared-world/route.js +40 -39
  329. package/dist/routes/shared-world/setup.d.ts +16 -16
  330. package/dist/routes/shared-world/setup.js +23 -23
  331. package/dist/routes/shared-world/types.d.ts +55 -53
  332. package/dist/routes/shared-world/types.js +4 -4
  333. package/dist/routes/terminal/adapter.d.ts +5 -5
  334. package/dist/routes/terminal/adapter.js +9 -9
  335. package/dist/routes/terminal/bundle.d.ts +13 -13
  336. package/dist/routes/terminal/bundle.js +28 -27
  337. package/dist/routes/terminal/credentials.d.ts +8 -8
  338. package/dist/routes/terminal/credentials.js +12 -12
  339. package/dist/routes/terminal/dry-run.d.ts +4 -4
  340. package/dist/routes/terminal/dry-run.js +12 -12
  341. package/dist/routes/terminal/encoding.js +2 -2
  342. package/dist/routes/terminal/ledger.d.ts +5 -5
  343. package/dist/routes/terminal/ledger.js +14 -14
  344. package/dist/routes/terminal/lifetime.d.ts +1 -1
  345. package/dist/routes/terminal/lifetime.js +1 -1
  346. package/dist/routes/terminal/live-finish.d.ts +2 -2
  347. package/dist/routes/terminal/live-finish.js +10 -10
  348. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  349. package/dist/routes/terminal/live-sandbox.js +15 -15
  350. package/dist/routes/terminal/participant-text.js +2 -1
  351. package/dist/routes/terminal/persona.d.ts +2 -2
  352. package/dist/routes/terminal/persona.js +3 -3
  353. package/dist/routes/terminal/plan.d.ts +7 -7
  354. package/dist/routes/terminal/plan.js +15 -15
  355. package/dist/routes/terminal/recorder.js +2 -2
  356. package/dist/routes/terminal/result.d.ts +5 -5
  357. package/dist/routes/terminal/result.js +14 -14
  358. package/dist/routes/terminal/route.d.ts +9 -9
  359. package/dist/routes/terminal/route.js +19 -20
  360. package/dist/routes/terminal/sandbox.d.ts +1 -1
  361. package/dist/routes/terminal/sandbox.js +1 -1
  362. package/dist/routes/terminal/session.d.ts +5 -5
  363. package/dist/routes/terminal/session.js +14 -13
  364. package/dist/routes/terminal/token-usage.d.ts +1 -1
  365. package/dist/routes/terminal/token-usage.js +7 -8
  366. package/dist/routes/terminal/trace.d.ts +4 -4
  367. package/dist/routes/terminal/trace.js +2 -2
  368. package/dist/routes/terminal/types.d.ts +48 -50
  369. package/dist/routes/terminal/types.js +5 -5
  370. package/dist/run/bundle-shape.js +3 -3
  371. package/dist/run/bundle.d.ts +49 -49
  372. package/dist/run/bundle.js +3 -2
  373. package/dist/run/cost-summary.js +3 -3
  374. package/dist/run/costs.d.ts +23 -0
  375. package/dist/run/costs.js +79 -44
  376. package/dist/run/detail.d.ts +6 -6
  377. package/dist/run/detail.js +4 -4
  378. package/dist/run/dry-run-inputs.d.ts +1 -1
  379. package/dist/run/dry-run-inputs.js +2 -2
  380. package/dist/run/dry-run.js +20 -20
  381. package/dist/run/judge.d.ts +19 -13
  382. package/dist/run/judge.js +18 -8
  383. package/dist/run/outcomes.d.ts +1 -1
  384. package/dist/run/participant.d.ts +1 -1
  385. package/dist/run/paths.d.ts +1 -1
  386. package/dist/run/paths.js +1 -1
  387. package/dist/run/preflight-receipts.js +1 -1
  388. package/dist/run/pricing.d.ts +11 -6
  389. package/dist/run/pricing.js +22 -15
  390. package/dist/run/projection.d.ts +46 -46
  391. package/dist/run/projection.js +57 -57
  392. package/dist/run/reclaim.d.ts +1 -1
  393. package/dist/run/reclaim.js +3 -3
  394. package/dist/run/results.d.ts +5 -5
  395. package/dist/run/run-cost.d.ts +53 -0
  396. package/dist/run/run-cost.js +105 -0
  397. package/dist/run/run-index-analysis.d.ts +15 -0
  398. package/dist/run/run-index-analysis.js +77 -0
  399. package/dist/run/run-index.d.ts +19 -7
  400. package/dist/run/run-index.js +77 -64
  401. package/dist/run/run-not-found.d.ts +5 -0
  402. package/dist/run/run-not-found.js +15 -0
  403. package/dist/run/run.d.ts +6 -5
  404. package/dist/run/run.js +3 -3
  405. package/dist/run/sandbox-receipts.d.ts +2 -2
  406. package/dist/run/sandbox-receipts.js +3 -3
  407. package/dist/run/shared-world-evidence.d.ts +37 -36
  408. package/dist/run/shared-world-evidence.js +4 -4
  409. package/dist/run/shared-world-shape.d.ts +1 -1
  410. package/dist/run/shared-world-shape.js +7 -7
  411. package/dist/run/stats.d.ts +14 -8
  412. package/dist/run/stats.js +121 -63
  413. package/dist/run/status.d.ts +16 -29
  414. package/dist/run/status.js +10 -29
  415. package/dist/run/stored-runs.js +2 -1
  416. package/dist/run/stream-shape.js +1 -1
  417. package/dist/run/streams.d.ts +7 -7
  418. package/dist/run/study-provenance.d.ts +49 -0
  419. package/dist/run/study-provenance.js +66 -0
  420. package/dist/run/study-result.d.ts +11 -0
  421. package/dist/run/study-result.js +9 -0
  422. package/dist/run/text.d.ts +2 -0
  423. package/dist/run/text.js +4 -0
  424. package/dist/run-study.d.ts +112 -0
  425. package/dist/{run-lab.js → run-study.js} +52 -47
  426. package/dist/{lab → study}/adapter-extension.d.ts +15 -27
  427. package/dist/{lab → study}/adapter-extension.js +10 -45
  428. package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
  429. package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
  430. package/dist/study/composition-rules.d.ts +7 -0
  431. package/dist/{lab → study}/composition-rules.js +53 -53
  432. package/dist/study/config.d.ts +15 -0
  433. package/dist/{lab → study}/config.js +98 -41
  434. package/dist/study/convert.d.ts +33 -0
  435. package/dist/study/convert.js +432 -0
  436. package/dist/{lab → study}/device-presets.d.ts +10 -10
  437. package/dist/{lab → study}/device-presets.js +11 -11
  438. package/dist/study/discover.d.ts +75 -0
  439. package/dist/{lab → study}/discover.js +134 -95
  440. package/dist/{lab → study}/doctor.d.ts +19 -12
  441. package/dist/{lab → study}/doctor.js +58 -20
  442. package/dist/study/field-paths.d.ts +12 -0
  443. package/dist/study/field-paths.js +126 -0
  444. package/dist/study/files.d.ts +26 -0
  445. package/dist/study/files.js +44 -0
  446. package/dist/{lab → study}/init-templates.d.ts +2 -2
  447. package/dist/study/init-templates.js +421 -0
  448. package/dist/{lab → study}/init.d.ts +2 -2
  449. package/dist/{lab → study}/init.js +46 -11
  450. package/dist/study/keys.d.ts +4 -0
  451. package/dist/{lab → study}/keys.js +46 -12
  452. package/dist/study/migrate.d.ts +48 -0
  453. package/dist/study/migrate.js +408 -0
  454. package/dist/study/owned-files.d.ts +38 -0
  455. package/dist/study/owned-files.js +182 -0
  456. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  457. package/dist/{lab → study}/parse/actors.js +14 -14
  458. package/dist/study/parse/comms.d.ts +12 -0
  459. package/dist/{lab → study}/parse/comms.js +5 -5
  460. package/dist/study/parse/execution.d.ts +19 -0
  461. package/dist/{lab → study}/parse/execution.js +13 -13
  462. package/dist/study/parse/study-v3.d.ts +21 -0
  463. package/dist/study/parse/study-v3.js +259 -0
  464. package/dist/study/parse/subject-state.d.ts +30 -0
  465. package/dist/{lab → study}/parse/subject-state.js +19 -19
  466. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  467. package/dist/{lab → study}/parse/subject.js +34 -34
  468. package/dist/{lab → study}/parse/values.d.ts +3 -3
  469. package/dist/{lab → study}/parse/values.js +3 -3
  470. package/dist/{lab → study}/persona-resolve.d.ts +8 -8
  471. package/dist/{lab → study}/persona-resolve.js +6 -6
  472. package/dist/{lab → study}/plan-base.d.ts +7 -7
  473. package/dist/{lab → study}/plan-base.js +1 -1
  474. package/dist/{lab → study}/plan-participants.d.ts +12 -12
  475. package/dist/{lab → study}/plan-participants.js +4 -4
  476. package/dist/{lab → study}/plan-types.d.ts +31 -31
  477. package/dist/{lab → study}/plan-types.js +2 -2
  478. package/dist/study/plan.d.ts +13 -0
  479. package/dist/study/plan.js +101 -0
  480. package/dist/study/preflight-probes.d.ts +3 -0
  481. package/dist/{lab → study}/preflight-probes.js +20 -19
  482. package/dist/study/preflight-result.d.ts +8 -0
  483. package/dist/{lab → study}/preflight-result.js +5 -4
  484. package/dist/study/preflight.d.ts +94 -0
  485. package/dist/{lab → study}/preflight.js +12 -12
  486. package/dist/{lab → study}/requirements.d.ts +3 -3
  487. package/dist/{lab → study}/requirements.js +1 -1
  488. package/dist/study/route-inputs.d.ts +28 -0
  489. package/dist/{lab → study}/route-inputs.js +1 -1
  490. package/dist/{lab → study}/routing.d.ts +39 -33
  491. package/dist/{lab → study}/routing.js +60 -29
  492. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
  493. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
  494. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
  495. package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
  496. package/dist/study/run-study-options.d.ts +28 -0
  497. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
  498. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
  499. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  500. package/dist/{lab → study}/summary.d.ts +16 -15
  501. package/dist/{lab → study}/summary.js +21 -21
  502. package/dist/{lab → study}/tasks.d.ts +18 -18
  503. package/dist/{lab → study}/tasks.js +14 -14
  504. package/dist/{lab → study}/types.d.ts +202 -196
  505. package/dist/{lab → study}/types.js +3 -1
  506. package/dist/{lab → study}/validation.d.ts +27 -27
  507. package/dist/{lab → study}/validation.js +53 -51
  508. package/dist/study/warnings.d.ts +12 -0
  509. package/dist/{lab → study}/warnings.js +62 -34
  510. package/dist/subject/clone.d.ts +7 -7
  511. package/dist/subject/clone.js +2 -2
  512. package/dist/subject/desktop-cli.d.ts +1 -1
  513. package/dist/subject/desktop-cli.js +2 -2
  514. package/dist/subject/local-tree-archive.d.ts +2 -2
  515. package/dist/subject/local-tree-archive.js +4 -4
  516. package/dist/subject/local-tree.d.ts +4 -4
  517. package/dist/subject/node-bootstrap.js +1 -1
  518. package/dist/subject/runtime.js +9 -10
  519. package/dist/subject/serve.d.ts +5 -5
  520. package/dist/subject/serve.js +3 -3
  521. package/dist/subject/state.d.ts +4 -4
  522. package/dist/subject/state.js +1 -1
  523. package/dist/subject/steps.d.ts +6 -6
  524. package/dist/subject/steps.js +5 -5
  525. package/dist/substrates/command-failure.d.ts +3 -3
  526. package/dist/substrates/command-failure.js +3 -3
  527. package/dist/substrates/desktop-session.js +2 -2
  528. package/dist/substrates/detached.d.ts +6 -6
  529. package/dist/substrates/detached.js +7 -7
  530. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  531. package/dist/substrates/e2b/cdp-probe.js +14 -17
  532. package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
  533. package/dist/substrates/e2b/desktop-browser.js +9 -9
  534. package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
  535. package/dist/substrates/e2b/desktop-cdp.js +9 -9
  536. package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
  537. package/dist/substrates/e2b/desktop-executor.js +13 -13
  538. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  539. package/dist/substrates/e2b/desktop-geometry.js +8 -8
  540. package/dist/substrates/e2b/desktop-media.d.ts +4 -4
  541. package/dist/substrates/e2b/desktop-media.js +1 -1
  542. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  543. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  544. package/dist/substrates/e2b/lifetime.js +1 -1
  545. package/dist/substrates/e2b/sandbox.d.ts +4 -4
  546. package/dist/substrates/e2b/sandbox.js +2 -2
  547. package/dist/substrates/e2b/sdk.d.ts +12 -12
  548. package/dist/substrates/e2b/sdk.js +7 -7
  549. package/dist/substrates/local/runtime-config.d.ts +4 -4
  550. package/dist/substrates/local/runtime-config.js +4 -4
  551. package/dist/tui/actions.d.ts +1 -1
  552. package/dist/tui/actions.js +13 -13
  553. package/dist/tui/contract.d.ts +23 -23
  554. package/dist/tui/contract.js +11 -11
  555. package/dist/tui/launch.d.ts +7 -7
  556. package/dist/tui/launch.js +36 -31
  557. package/dist/tui/project.js +5 -5
  558. package/dist/tui-app.js +139 -139
  559. package/dist/verify/actor.d.ts +8 -8
  560. package/dist/verify/actor.js +36 -36
  561. package/dist/verify/artifacts.d.ts +2 -2
  562. package/dist/verify/artifacts.js +3 -3
  563. package/dist/verify/context-growth.d.ts +9 -0
  564. package/dist/verify/context-growth.js +62 -0
  565. package/dist/verify/costs.d.ts +6 -6
  566. package/dist/verify/costs.js +8 -8
  567. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  568. package/dist/verify/shared-world-concurrent.js +79 -76
  569. package/dist/verify/shared-world.d.ts +2 -2
  570. package/dist/verify/shared-world.js +16 -16
  571. package/dist/verify/subject.d.ts +5 -5
  572. package/dist/verify/subject.js +19 -19
  573. package/dist/verify/verify.js +94 -44
  574. package/docs/README.md +25 -32
  575. package/docs/architecture/actor-contract.md +60 -91
  576. package/docs/architecture/browser-control.md +1 -1
  577. package/docs/architecture/desktop-sessions.md +7 -7
  578. package/docs/architecture/external-public-shared-world.md +68 -65
  579. package/docs/architecture/github-feedback-loop.md +2 -5
  580. package/docs/architecture/guest-desktop.md +2 -2
  581. package/docs/architecture/observer.md +34 -34
  582. package/docs/architecture/restricted-codex-analysis.md +34 -28
  583. package/docs/architecture/serve.md +34 -37
  584. package/docs/architecture/state-driven-executor.md +55 -58
  585. package/docs/architecture/task-protocol-support.md +6 -6
  586. package/docs/architecture/terminal-product-route.md +70 -110
  587. package/docs/contracts/README.md +24 -0
  588. package/docs/contracts/adapter-admission.md +3 -3
  589. package/docs/contracts/adapter-fixtures.md +4 -7
  590. package/docs/contracts/core.md +1 -3
  591. package/docs/contracts/errors.md +62 -0
  592. package/docs/contracts/feedback.md +8 -9
  593. package/docs/contracts/policy.md +7 -12
  594. package/docs/contracts/run-bundle.md +42 -44
  595. package/docs/contracts/schemas.md +446 -368
  596. package/docs/contracts/study-analysis.md +7 -4
  597. package/docs/contracts/study-costs.md +28 -9
  598. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  599. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  600. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  601. package/docs/principles/actor-fidelity.md +4 -4
  602. package/docs/principles/engineering.md +3 -3
  603. package/docs/principles/invariants-and-defaults.md +38 -38
  604. package/docs/principles/self-driving-harness.md +1 -5
  605. package/docs/principles/three-roles.md +1 -1
  606. package/docs/product/automatic-analysis.md +7 -7
  607. package/examples/README.md +1 -1
  608. package/examples/participant/README.md +5 -5
  609. package/examples/participant/run.mjs +11 -10
  610. package/examples/scorer/README.md +3 -3
  611. package/examples/scorer/run.mjs +11 -12
  612. package/examples/scorer/scorer.mjs +3 -3
  613. package/package.json +16 -17
  614. package/skills/humanish/SKILL.md +64 -60
  615. package/skills/humanish/agents/openai.yaml +1 -1
  616. package/AGENTS.md +0 -99
  617. package/CONTRIBUTING.md +0 -148
  618. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  619. package/dist/actors/codex/qualified-versions.js +0 -132
  620. package/dist/cli/commands/lab-format.d.ts +0 -8
  621. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  622. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  623. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  624. package/dist/cli/commands/lab-run.d.ts +0 -9
  625. package/dist/cli/commands/lab.d.ts +0 -3
  626. package/dist/cli/commands/lab.js +0 -199
  627. package/dist/cli/renamed-options.d.ts +0 -11
  628. package/dist/cli/renamed-options.js +0 -18
  629. package/dist/lab/composition-rules.d.ts +0 -7
  630. package/dist/lab/config.d.ts +0 -7
  631. package/dist/lab/discover.d.ts +0 -65
  632. package/dist/lab/init-templates.js +0 -416
  633. package/dist/lab/keys.d.ts +0 -2
  634. package/dist/lab/parse/comms.d.ts +0 -12
  635. package/dist/lab/parse/execution.d.ts +0 -19
  636. package/dist/lab/parse/subject-state.d.ts +0 -30
  637. package/dist/lab/plan.d.ts +0 -19
  638. package/dist/lab/plan.js +0 -132
  639. package/dist/lab/preflight-probes.d.ts +0 -3
  640. package/dist/lab/preflight-result.d.ts +0 -7
  641. package/dist/lab/preflight.d.ts +0 -92
  642. package/dist/lab/route-inputs.d.ts +0 -28
  643. package/dist/lab/run-lab-options.d.ts +0 -28
  644. package/dist/lab/warnings.d.ts +0 -2
  645. package/dist/observer/static.d.ts +0 -39
  646. package/dist/observer/static.js +0 -369
  647. package/dist/run-lab.d.ts +0 -112
  648. package/docs/architecture/comms-inbox.md +0 -122
  649. package/docs/architecture/desktop-recording.md +0 -80
  650. package/docs/architecture/local-browser-runtime.md +0 -178
  651. package/docs/architecture/observer-review.md +0 -144
  652. package/docs/architecture/participant-media.md +0 -90
  653. package/docs/architecture/project-layout.md +0 -62
  654. package/docs/architecture/real-email-receiving.md +0 -136
  655. package/docs/assets/humanish-drawdb-hero.png +0 -0
  656. package/docs/assets/humanish-observer-hero.png +0 -0
  657. package/docs/goals/current.md +0 -207
  658. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  659. package/docs/product/open-source-install-experience.md +0 -240
  660. package/docs/ramp/README.md +0 -295
  661. package/docs/release/open-source-readiness.md +0 -222
  662. package/docs/release/public-readiness-standard.md +0 -210
  663. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  664. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  665. /package/dist/{lab → study}/init-paths.js +0 -0
  666. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  667. /package/dist/{lab → study}/init-plan.js +0 -0
  668. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  669. /package/dist/{lab → study}/participant-assignment.js +0 -0
  670. /package/dist/{lab → study}/persona.d.ts +0 -0
  671. /package/dist/{lab → study}/persona.js +0 -0
@@ -1,4 +1,4 @@
1
- // Builds the run bundle for a concurrent shared-world run: per-seat simulations, streams and
1
+ // Builds the run bundle for a concurrent shared-world run: per-participant simulations, streams and
2
2
  // events, the sharedWorld evidence block and the review summary.
3
3
  import { receivingPublication } from "../../comms/receiving-runtime.js";
4
4
  import { redactText } from "../../evidence/redaction.js";
@@ -8,13 +8,14 @@ import { SHARED_WORLD_SCHEMA, concurrencyFacts, sharedWorldParticipantKeys, } fr
8
8
  import { commandDigestOf } from "../../subject/state.js";
9
9
  import { buildRunCostSummary, desktopSpanToMinutes } from "../../run/cost-summary.js";
10
10
  import { participantFactsOf } from "../computer-use/participant-facts.js";
11
- import { judgeSharedWorld, participantPassed, sharedWorldShortfall, } from "../../run/judge.js";
11
+ import { judgeSharedWorld, participantPassed, sharedWorldShortfall, verdictText, } from "../../run/judge.js";
12
12
  import { combineCheckpointDigest } from "./checkpoints.js";
13
13
  import { hostOriginDigest } from "./provenance.js";
14
14
  import { participantEvent, participantIds } from "../../run/participant-records.js";
15
15
  import { sharedWorldParticipantRecords } from "./bundle-records.js";
16
16
  import { CONCURRENT_ATTRIBUTION_LIMITS, EXTERNAL_PUBLIC_ATTRIBUTION_LIMITS, } from "./types.js";
17
- /** Max windows live at the same instant (sweep over start/end points). The honest simultaneity
17
+ import { plural } from "../../run/text.js";
18
+ /** Max windows live at the same instant (sweep over start/end points). The simultaneity
18
19
  * count: the participant count says how many existed; this says how many ever ran at once. */
19
20
  export function maxSimultaneousWindows(windows) {
20
21
  const points = windows
@@ -34,10 +35,10 @@ export function maxSimultaneousWindows(windows) {
34
35
  return max;
35
36
  }
36
37
  /**
37
- * The judgment for a shared-world bundle's inputs: how each seat ended, plus what the run observed
38
- * about its world: overlap, a state change under overlap on the provisioned plane, and lobby
39
- * convergence on the external-public plane. The bundle's verdict and the lab result's ok both read
40
- * it.
38
+ * The judgment for a shared-world bundle's inputs: how each participant ended, plus what the run
39
+ * observed about its world: overlap, a state change under overlap on the provisioned plane, and
40
+ * lobby convergence on the external-public plane. The bundle's verdict and the study result's ok
41
+ * both read it.
41
42
  */
42
43
  export function judgeSharedWorldRun(args) {
43
44
  const external = (args.planeClass ?? "provisioned-getHost") === "external-public";
@@ -68,7 +69,7 @@ export function actorRunPassed(result) {
68
69
  *
69
70
  * None of those is adopter-scored proof that the mission text was completed. In particular, a
70
71
  * productive `budget_reached` session can coexist with lobby convergence without becoming a
71
- * `goal_satisfied` result (#364).
72
+ * `goal_satisfied` result.
72
73
  */
73
74
  function formatSharedWorldActorOutcomes(outcomes, expectedCount) {
74
75
  const passedSessions = outcomes.filter((outcome) => outcome.ok).length;
@@ -86,7 +87,7 @@ function formatSharedWorldActorOutcomes(outcomes, expectedCount) {
86
87
  .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
87
88
  .map(([reason, count]) => `${reason} ${count}/${expectedCount}`)
88
89
  .join(", ");
89
- return `${passedSessions}/${expectedCount} actor session(s) passed credibility checks; mission endpoint: ${goalSatisfiedSessions}/${expectedCount} ended goal_satisfied; completion reasons: ${completionReasons}`;
90
+ return `${passedSessions}/${plural(expectedCount, "actor session")} passed credibility checks; mission endpoint: ${goalSatisfiedSessions}/${expectedCount} ended goal_satisfied; completion reasons: ${completionReasons}`;
90
91
  }
91
92
  /** The run's first two events: its creation and the shared plane's provenance. */
92
93
  function planeEvents(args, external) {
@@ -97,7 +98,7 @@ function planeEvents(args, external) {
97
98
  at: createdAt,
98
99
  level: "info",
99
100
  type: "concurrent-shared-world.run.created",
100
- message: `Created CONCURRENT shared-world run for ${plan.labId} (actor ${descriptor.id}, ${actorSpecs.length} persona(s) vs ONE shared plane, max ${plan.concurrency} concurrent).`,
101
+ message: `Created a concurrent shared-world run for ${plan.studyId} (actor ${descriptor.id}, ${plural(actorSpecs.length, "persona")} on one shared app, at most ${plan.concurrency} at once).`,
101
102
  });
102
103
  // Human-readable plane label, byte-stable for the clone route. local-tree has no repo slug: it
103
104
  // labels the packed archive instead (archiveSha256 + dirty/clean when the packed root was a git
@@ -111,7 +112,7 @@ function planeEvents(args, external) {
111
112
  // External-public plane provenance differs: an operator-declared, operator-owned public
112
113
  // deployment humanish neither provisioned nor seeded, with no getHost, no clone and no synthetic
113
114
  // attestation (claiming synthetic on a real site is a lie). The origin persists digest-only.
114
- // planSharedWorldLab refuses an external-public plane without a declared owner; the fallback
115
+ // planSharedWorldStudy refuses an external-public plane without a declared owner; the fallback
115
116
  // says so rather than naming one.
116
117
  const externalPlaneOwner = plan.plane.kind === "external-public" ? plan.plane.owner : "(undeclared)";
117
118
  events.push(participantEvent(actorSpecs[0] ?? participantIds(0), {
@@ -120,19 +121,21 @@ function planeEvents(args, external) {
120
121
  level: "info",
121
122
  type: "concurrent-shared-world.plane.provenance",
122
123
  message: external
123
- ? `Shared plane: an EXTERNAL-PUBLIC deployment (operator-attested owner ${externalPlaneOwner}, authorized) used DIRECTLY as the shared plane, with NO getHost, clone, subject sandbox, or seed. The harness OBSERVES that each participant reached the operator-declared origin (publicOriginDigest); it did NOT mint or control the plane. Author-trust ownership attestation, NOT a synthetic-data claim.`
124
+ ? `Shared app: a public deployment the operator declares they own (${externalPlaneOwner}, authorized), used as it is, with no sandbox, clone or seed. humanish observed that each participant reached the declared origin (publicOriginDigest); it did not create or control the app. Ownership is the study's declaration, and the data is not claimed to be synthetic.`
124
125
  : dryRun
125
- ? `Shared plane declared: ${dryRunPlaneLabel}, served + getHost-exposed in-sandbox (dry-run contract; nothing ${args.subject.source === "local-tree" ? "packed" : "cloned"}). Seed recipe ${args.seedDigest}; SYNTHETIC subject (author-attested); env names: ${args.subject.envNames?.join(", ") || "none"} (values never persisted).`
126
- : `Shared plane: ${livePlaneLabel}, served + exposed at the harness-minted getHost URL; seed recipe ${args.seedDigest}; SYNTHETIC subject (author-attested); env names: ${args.subject.envNames?.join(", ") || "none"} (values never persisted).`,
126
+ ? `Shared app declared: ${dryRunPlaneLabel}, to be served in the sandbox at a public sandbox URL (dry run: nothing ${args.subject.source === "local-tree" ? "packed" : "cloned"}). Seed recipe ${args.seedDigest}; synthetic subject, as the study declares; env names: ${args.subject.envNames?.join(", ") || "none"} (values never stored).`
127
+ : `Shared app: ${livePlaneLabel}, served at a public sandbox URL humanish created; seed recipe ${args.seedDigest}; synthetic subject, as the study declares; env names: ${args.subject.envNames?.join(", ") || "none"} (values never stored).`,
127
128
  }));
128
129
  return events;
129
130
  }
130
- /** The sharedWorld block: seat windows, the state series, seat outcomes and the plane. */
131
+ /** The sharedWorld block: participant windows, the state series, participant outcomes and the
132
+ * plane. */
131
133
  function sharedWorldEvidence(args, external, inProgress, planeCommit) {
132
134
  const { plan, dryRun, actorSpecs, actorResults } = args;
133
135
  // Build the concurrent shared-world evidence block. routeHostDigest is sha256-16 of the origin each
134
- // seat reached: on getHost the seat URL the actor drove (verify confirms == plane.hostDigest); on
135
- // external-public the seat's CDP-OBSERVED URL origin (verify confirms == plane.publicOriginDigest).
136
+ // participant reached: on getHost the participant URL the actor drove (verify confirms ==
137
+ // plane.hostDigest); on external-public the participant's CDP-observed URL origin (verify
138
+ // confirms == plane.publicOriginDigest).
136
139
  const fallbackHostDigest = external
137
140
  ? (args.publicOriginDigest ?? commandDigestOf("[external-public-plane]"))
138
141
  : (args.hostDigest ?? commandDigestOf("[provisioned-subject]"));
@@ -189,7 +192,7 @@ function sharedWorldEvidence(args, external, inProgress, planeCommit) {
189
192
  seedDigest: args.seedDigest,
190
193
  envNames: [],
191
194
  // publicOriginDigest is the observed convergence origin; declaredOriginDigest records the
192
- // operator-declared origin for reference (a redirect makes them differ — not a failure).
195
+ // operator-declared origin for reference (a redirect that makes them differ is no failure).
193
196
  ...(args.publicOriginDigest === undefined
194
197
  ? {}
195
198
  : { publicOriginDigest: args.publicOriginDigest }),
@@ -226,8 +229,8 @@ function sharedWorldEvidence(args, external, inProgress, planeCommit) {
226
229
  return { sharedWorld, windows, stateSeries, outcomes };
227
230
  }
228
231
  /**
229
- * A finished run's gaps: each seat that did not pass, or, when every seat passed, the world
230
- * shortfall that failed the run.
232
+ * A finished run's gaps: each participant that did not pass, or, when every participant passed, the
233
+ * world shortfall that failed the run.
231
234
  */
232
235
  function finishedGaps(actorResults, shortfall) {
233
236
  const participantGaps = actorResults
@@ -247,12 +250,12 @@ function concurrencyReview(args, external, inProgress, evidence, events, nextEve
247
250
  const deltas = (stateSeries ?? []).filter((snapshot, i) => i > 0 && snapshot.digest !== (stateSeries ?? [])[i - 1].digest).length;
248
251
  const stateSeriesLabel = external
249
252
  ? "stateSeries omitted (no authoritative shared-state proof on the external-public plane)"
250
- : `stateSeries ${(stateSeries ?? []).length} snapshot(s), ${deltas} delta(s)`;
253
+ : `stateSeries ${plural((stateSeries ?? []).length, "snapshot")}, ${plural(deltas, "delta")}`;
251
254
  const convergenceLabel = external
252
- ? `; lobby convergence ${args.lobbyConvergenceDigest ? "PROVEN (all participants reached one /lobby/CODE)" : "not observed"}`
255
+ ? `; lobby convergence ${args.lobbyConvergenceDigest ? "shown (all participants reached one /lobby/CODE)" : "not observed"}`
253
256
  : "";
254
257
  // The count that matters is how many participants were live at once, which can be fewer than exist:
255
- // a 6-participant run capped at 3 must never read as 6-wide concurrency (#350, the field failure).
258
+ // a 6-participant run capped at 3 must never read as 6-wide concurrency.
256
259
  const capForReport = plan.concurrency;
257
260
  const maxLive = maxSimultaneousWindows(windows);
258
261
  events.push({
@@ -260,11 +263,11 @@ function concurrencyReview(args, external, inProgress, evidence, events, nextEve
260
263
  at: createdAt,
261
264
  level: "info",
262
265
  type: "concurrent-shared-world.concurrency",
263
- message: `Concurrency: ${windows.length} participant(s)${dryRun ? " (dry-run contract; $0)" : `, up to ${maxLive} live at once (cap ${capForReport}), overlap ${overlaps ? "PROVEN" : "not observed"}`}; ${stateSeriesLabel}${convergenceLabel}. Attribution ceiling: ${sharedWorld.attributionLimits.join(", ")}. ${dryRun ? "This contract-only run proves no live concurrency, scale, or adoption." : "This run reports only its own observed overlap and state changes; it does not prove scale, repeatability, or adopter-harness replacement."}`,
266
+ message: `Concurrency: ${plural(windows.length, "participant")}${dryRun ? " (dry run; $0)" : `, up to ${maxLive} live at once (cap ${capForReport}), overlap ${overlaps ? "shown" : "not observed"}`}; ${stateSeriesLabel}${convergenceLabel}. Attribution ceiling: ${sharedWorld.attributionLimits.join(", ")}. ${dryRun ? "This dry run proves nothing about live concurrency, scale, or adoption." : "This run reports only its own observed overlap and state changes; it does not prove scale, repeatability, or adopter-harness replacement."}`,
264
267
  });
265
- // The judge's verdict (judgeSharedWorld): every seat produced a terminal, engaged, passed session.
266
- // Mission endpoint and completion reasons are reported separately below; `outcomes[].ok` is not
267
- // renamed into mission success (#364).
268
+ // The judge's verdict (judgeSharedWorld): every participant produced a terminal, engaged, passed
269
+ // session. Mission endpoint and completion reasons are reported separately below; `outcomes[].ok`
270
+ // is not renamed into mission success.
268
271
  const verdict = args.judgment.verdict;
269
272
  const actorOutcomeSummary = formatSharedWorldActorOutcomes(outcomes, actorSpecs.length);
270
273
  const review = {
@@ -272,19 +275,19 @@ function concurrencyReview(args, external, inProgress, evidence, events, nextEve
272
275
  verdict,
273
276
  // Plane-class-aware: the external-public plane has no getHost/clone/seed and carries no
274
277
  // authoritative state series, so its summary must not claim a getHost-exposed plane (dry-run) nor
275
- // report "state delta(s) under load" (live) — it reports lobby convergence instead.
278
+ // report "state delta(s) under load" (live). It reports lobby convergence instead.
276
279
  summary: dryRun
277
280
  ? external
278
- ? `Dry-run concurrent shared-world contract: ${actorSpecs.length} persona(s) declared against ONE external-public shared plane (a real public deployment used directly; no getHost/clone/seed); no sandboxes launched, $0 spend.`
279
- : `Dry-run concurrent shared-world contract: ${actorSpecs.length} persona(s) declared against ONE getHost-exposed plane (${descriptor.id}); no sandboxes launched, $0 spend.`
281
+ ? `Concurrent shared-world dry run: ${plural(actorSpecs.length, "persona")} declared against one public deployment, used as it is (no sandbox, clone or seed); no sandboxes launched, $0 spent.`
282
+ : `Concurrent shared-world dry run: ${plural(actorSpecs.length, "persona")} declared against one app served at a public sandbox URL (${descriptor.id}); no sandboxes launched, $0 spent.`
280
283
  : inProgress
281
- ? `In-progress concurrent shared-world Observer snapshot: ${actorSpecs.length} persona(s) running against ONE shared plane; final verification is pending.`
284
+ ? `In-progress concurrent shared-world Observer snapshot: ${plural(actorSpecs.length, "persona")} running against one shared app; final verification is pending.`
282
285
  : external
283
- ? `Concurrent shared-world (ONE external-public plane, ${actorSpecs.length} simultaneous personas): swarm ${verdict === "pass" ? "ran coherently" : "did not run coherently"}; ${actorOutcomeSummary}; overlap ${overlaps ? "proven" : "not observed"}; ${args.lobbyConvergenceDigest ? `${actorSpecs.length} participants converged on one lobby` : "lobby convergence not observed"}.`
284
- : `Concurrent shared-world (ONE plane, ${actorSpecs.length} simultaneous personas): swarm ${verdict === "pass" ? "ran coherently" : "did not run coherently"}; ${actorOutcomeSummary}; overlap ${overlaps ? "proven" : "not observed"}; ${deltas} state delta(s) under load.`,
286
+ ? `Concurrent shared-world (one public deployment, ${actorSpecs.length} personas at once): swarm ${verdict === "pass" ? "ran coherently" : "did not run coherently"}; ${actorOutcomeSummary}; overlap ${overlaps ? "proven" : "not observed"}; ${args.lobbyConvergenceDigest ? `${actorSpecs.length} participants converged on one lobby` : "lobby convergence not observed"}.`
287
+ : `Concurrent shared-world (one shared app, ${actorSpecs.length} personas at once): swarm ${verdict === "pass" ? "ran coherently" : "did not run coherently"}; ${actorOutcomeSummary}; overlap ${overlaps ? "proven" : "not observed"}; ${plural(deltas, "state delta")} under load.`,
285
288
  gaps: dryRun
286
289
  ? [
287
- "This dry-run launched no concurrent shared-world session; it proves contract shape only, not live behavior, scale, or adopter-harness replacement.",
290
+ "This dry run launched no concurrent shared-world session; it checks the evidence shape only, not live behavior, scale, or adopter-harness replacement.",
288
291
  ]
289
292
  : inProgress
290
293
  ? [
@@ -301,7 +304,7 @@ export function buildConcurrentSharedWorldBundle(args) {
301
304
  const external = (args.planeClass ?? "provisioned-getHost") === "external-public";
302
305
  const simulations = [];
303
306
  const streams = [];
304
- // Public-safe label only — neither the raw getHost URL (provisioned) nor the raw public origin
307
+ // Public-safe label only: neither the raw getHost URL (provisioned) nor the raw public origin
305
308
  // (external-public) lands in the bundle. The plane identity is a digest (plane.hostDigest on
306
309
  // getHost; plane.publicOriginDigest on external-public).
307
310
  const appUrl = external ? "[external-public-plane]" : "[provisioned-subject]";
@@ -331,23 +334,23 @@ export function buildConcurrentSharedWorldBundle(args) {
331
334
  persona: {
332
335
  id: actorSpecs[0]?.persona.id ?? "concurrent-persona",
333
336
  name: `Concurrent shared-world swarm (${actorSpecs.length} personas)`,
334
- source: `lab:${plan.labId}`,
337
+ source: `study:${plan.studyId}`,
335
338
  sourceDigest: actorSpecs[0]?.persona.promptDigest ?? args.seedDigest,
336
339
  },
337
340
  scenario: {
338
- id: `concurrent-shared-world-${plan.labId}`,
339
- title: plan.title ?? `Concurrent shared-world: ${plan.labId}`,
341
+ id: `concurrent-shared-world-${plan.studyId}`,
342
+ title: plan.title ?? `Concurrent shared-world: ${plan.studyId}`,
340
343
  goal: redactText(actorSpecs[0]?.evidenceInstructions ??
341
344
  actorSpecs[0]?.instructions ??
342
345
  "Concurrent shared-world interaction."),
343
- source: `lab:${plan.labId}`,
346
+ source: `study:${plan.studyId}`,
344
347
  sourceDigest: actorSpecs[0]?.persona.promptDigest ?? args.seedDigest,
345
348
  },
346
349
  lifecycle: [
347
350
  {
348
351
  at: createdAt,
349
352
  event: "concurrent-shared-world.run.created",
350
- message: `Created concurrent shared-world run with ONE shared plane and ${actorSpecs.length} simultaneous participants (actor ${descriptor.id}).`,
353
+ message: `Created a concurrent shared-world run with one shared app and ${actorSpecs.length} participants at once (actor ${descriptor.id}).`,
351
354
  },
352
355
  ],
353
356
  simulations,
@@ -357,11 +360,11 @@ export function buildConcurrentSharedWorldBundle(args) {
357
360
  status: "passed",
358
361
  notes: ranLive
359
362
  ? anyRaw
360
- ? "Typed text recorded as length only and reasoning/messages pass through text redaction. Some personas captured FULL-FIDELITY (raw) screenshots, retained for local use — NOT redacted for publishing; set policies.redactScreenshots: true to blur a share-as-is bundle. stateSeries persists digest-only."
363
+ ? "Typed text is recorded as its length only, and reasoning and messages pass through text redaction. Some personas captured unblurred screenshots, kept for local use and not redacted for publishing. Set policies.redactScreenshots: true to blur screenshots in a bundle you plan to share. stateSeries stores digests only."
361
364
  : "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. stateSeries persists digest-only."
362
365
  : inProgress
363
366
  ? "In-progress live Observer snapshot: runtime stream auth URLs are process-local only and are not persisted. Final typed text, traces, and screenshots are pending. stateSeries persists digest-only."
364
- : "Dry-run concurrent shared-world contract bundle: no sandboxes launched and no screenshots captured. Typed text is recorded as length only and reasoning/messages pass through text redaction whenever a session runs. stateSeries persists digest-only.",
367
+ : "Concurrent shared-world dry-run bundle: no sandboxes launched and no screenshots captured. Typed text is recorded as length only and reasoning/messages pass through text redaction whenever a session runs. stateSeries persists digest-only.",
365
368
  },
366
369
  artifacts: bundleArtifacts(),
367
370
  review,
@@ -429,7 +432,7 @@ export function renderConcurrentReviewMarkdown(bundle) {
429
432
  `- attribution class: ${bundle.attributionClass ?? "isolated"}`,
430
433
  `- topology: ${sw?.topology ?? "(none)"} / ${sw?.topologyMode ?? "(none)"}`,
431
434
  `- personas: ${sw?.roleCount ?? 0}`,
432
- `- verdict: ${bundle.review.verdict}`,
435
+ `- verdict: ${verdictText(bundle.review.verdict, bundle.mode)}`,
433
436
  `- summary: ${bundle.review.summary}`,
434
437
  ...(plane ? [`- plane: ${plane.message}`] : []),
435
438
  ...(concurrency ? [`- concurrency: ${concurrency.message}`] : []),
@@ -1,6 +1,6 @@
1
1
  import type { Shell } from "../../substrates/shell.js";
2
2
  import { type DetachedTimers } from "../../substrates/detached.js";
3
- import { type LabSubjectState, type LabSubjectStateCheckpoint } from "../../lab/types.js";
3
+ import { type StudySubjectState, type StudySubjectStateCheckpoint } from "../../study/types.js";
4
4
  import { type SharedWorldCheckpoint } from "../../run/shared-world-evidence.js";
5
5
  /** Combine a snapshot's per-probe digests into one sha256-16 (digest-only; no raw value). */
6
6
  export declare function combineCheckpointDigest(parts: string[]): string;
@@ -8,18 +8,18 @@ export declare function combineCheckpointDigest(parts: string[]): string;
8
8
  * Run one checkpoint snapshot live: each declared probe runs read-only via the detached
9
9
  * primitive; its stdout is literal-scrubbed (provisioned values + the probe's declared redact
10
10
  * literals, folded into `scrub`) then pattern-redacted, then digested. Only the combined digest
11
- * persists — never the raw value (the seed-step lockdown). Unique step names per snapshot prevent
11
+ * persists, never the raw value (the seed-step lockdown). Unique step names per snapshot prevent
12
12
  * stale-status reuse across snapshots.
13
13
  */
14
14
  export declare function runCheckpointSnapshot(args: {
15
15
  shell: Shell;
16
16
  snapshotIndex: number;
17
17
  name: string;
18
- checkpoints: LabSubjectStateCheckpoint[];
18
+ checkpoints: StudySubjectStateCheckpoint[];
19
19
  prevDigest: string | undefined;
20
20
  scrub: (text: string) => string;
21
21
  requestTimeoutMs: number;
22
22
  timers: DetachedTimers;
23
23
  }): Promise<SharedWorldCheckpoint>;
24
24
  /** sha256-16 over the ordered seed-step command digests: the seeded-state recipe identity. */
25
- export declare function seedRecipeDigest(state: LabSubjectState | undefined): string;
25
+ export declare function seedRecipeDigest(state: StudySubjectState | undefined): string;
@@ -1,7 +1,7 @@
1
1
  import { commandDigestOf } from "../../subject/state.js";
2
2
  import { SUBJECT_DIR } from "../../subject/steps.js";
3
3
  import { runDetachedStep } from "../../substrates/detached.js";
4
- import {} from "../../lab/types.js";
4
+ import {} from "../../study/types.js";
5
5
  import { redactText } from "../../evidence/redaction.js";
6
6
  import {} from "../../run/shared-world-evidence.js";
7
7
  // Per-checkpoint probe budget (read-only aggregate probes are fast).
@@ -14,7 +14,7 @@ export function combineCheckpointDigest(parts) {
14
14
  * Run one checkpoint snapshot live: each declared probe runs read-only via the detached
15
15
  * primitive; its stdout is literal-scrubbed (provisioned values + the probe's declared redact
16
16
  * literals, folded into `scrub`) then pattern-redacted, then digested. Only the combined digest
17
- * persists — never the raw value (the seed-step lockdown). Unique step names per snapshot prevent
17
+ * persists, never the raw value (the seed-step lockdown). Unique step names per snapshot prevent
18
18
  * stale-status reuse across snapshots.
19
19
  */
20
20
  export async function runCheckpointSnapshot(args) {
@@ -1,53 +1,53 @@
1
1
  import { type ReceivingSource } from "../../comms/receiving-runtime.js";
2
- import type { SharedWorldPlan } from "../../lab/plan-types.js";
2
+ import type { SharedWorldPlan } from "../../study/plan-types.js";
3
3
  import type { CommsReceivingRun } from "../../comms/receiving.js";
4
4
  import { type DeployedCommsCatch } from "../../comms/sandbox-catch.js";
5
- import type { LabCommsEmail, LabConfig } from "../../lab/types.js";
5
+ import type { StudyCommsEmail, StudyConfig } from "../../study/types.js";
6
6
  import type { Shell } from "../../substrates/shell.js";
7
7
  import type { ConcurrentSharedWorldPlaneClass, ExternalCommsWiring, PlaneContext } from "./types.js";
8
- /** The in-sandbox email catch a provisioned plane deploys, when the lab declares one. */
8
+ /** The in-sandbox email catch a provisioned plane deploys, when the study declares one. */
9
9
  export interface SubjectComms {
10
- email: LabCommsEmail | undefined;
10
+ email: StudyCommsEmail | undefined;
11
11
  port: number | undefined;
12
12
  /** The catch's base URL, injected into the subject sandbox's env at create. */
13
13
  env: Record<string, string>;
14
14
  }
15
- export declare function subjectCommsOf(config: Pick<LabConfig, "comms">, planeClass: ConcurrentSharedWorldPlaneClass): SubjectComms;
15
+ export declare function subjectCommsOf(config: Pick<StudyConfig, "comms">, planeClass: ConcurrentSharedWorldPlaneClass): SubjectComms;
16
16
  /**
17
- * Adopter-hosted ingress (#328): on the external-public plane the harness provisions nothing, so
17
+ * Adopter-hosted ingress: on the external-public plane the harness provisions nothing, so
18
18
  * it cannot host a catch. The operator can, and then humanish still does every other part of
19
19
  * the funnel: it tells each persona its address and inbox URL, drains the declared catch over
20
20
  * HTTP at teardown, and writes the same digest-only evidence. Declaring `external` is what turns
21
21
  * the previously-inert block into a working one. Returns an error message when the declared catch
22
22
  * does not answer as a humanish catch.
23
23
  */
24
- export declare function prepareExternalComms(config: Pick<LabConfig, "comms">, planeClass: ConcurrentSharedWorldPlaneClass, dryRun: boolean, warnings: string[], env: Record<string, string | undefined>): Promise<{
24
+ export declare function prepareExternalComms(config: Pick<StudyConfig, "comms">, planeClass: ConcurrentSharedWorldPlaneClass, dryRun: boolean, warnings: string[], env: Record<string, string | undefined>): Promise<{
25
25
  ok: true;
26
26
  wiring: ExternalCommsWiring | undefined;
27
27
  } | {
28
28
  ok: false;
29
- code: "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_COMMS_TOKEN_INVALID" | "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_COMMS_CATCH_UNREACHABLE";
29
+ code: "HUMANISH_SHARED_WORLD_COMMS_TOKEN_INVALID" | "HUMANISH_SHARED_WORLD_COMMS_CATCH_UNREACHABLE";
30
30
  message: string;
31
31
  }>;
32
32
  /**
33
- * Off-app comms evidence (#297): drain everything the in-sandbox catch captured, route it into a
33
+ * Off-app comms evidence: drain everything the in-sandbox catch captured, route it into a
34
34
  * host fake inbox addressed to the declared recipients, and write the run-level digest-only thread
35
35
  * artifact while the subject is still alive, before it is killed. Wrapped so a drain error
36
36
  * never blocks teardown (invariant: all sandboxes torn down by id in the plane's finally). Returns
37
37
  * the thread's path when one was written.
38
38
  */
39
- export declare function drainSubjectComms(ctx: PlaneContext, commsEmail: LabCommsEmail, subjectShell: Shell, deployedComms: DeployedCommsCatch): Promise<string | undefined>;
39
+ export declare function drainSubjectComms(ctx: PlaneContext, commsEmail: StudyCommsEmail, subjectShell: Shell, deployedComms: DeployedCommsCatch): Promise<string | undefined>;
40
40
  /**
41
- * Adopter-hosted drain (#328/#387): same routing and digest-only artifact as the in-sandbox
42
- * catch — only the transport differs (HTTP GET /deliveries against the catch the operator
41
+ * Adopter-hosted drain: same routing and digest-only artifact as the in-sandbox
42
+ * catch. Only the transport differs (HTTP GET /deliveries against the catch the operator
43
43
  * runs). Called in the plane's finally so the evidence survives a failed run; a drain error never
44
44
  * masks the run's own outcome. Returns the thread's path when one was written.
45
45
  */
46
46
  export declare function drainExternalComms(ctx: PlaneContext, comms: ExternalCommsWiring): Promise<string | undefined>;
47
- /** What receiving guards: the lab's email declaration and the subject env names and values. */
47
+ /** What receiving guards: the study's email declaration and the subject env names and values. */
48
48
  export declare function receivingSourceOf(residual: SharedWorldPlan["residual"], env: readonly string[]): ReceivingSource;
49
49
  /**
50
- * Real email receiving, when the lab declares it on a live run. It registers the connection's
50
+ * Real email receiving, when the study declares it on a live run. It registers the connection's
51
51
  * secrets with the run's scrub before any desktop starts. Returns the message the run fails with
52
52
  * when setup fails.
53
53
  */
@@ -1,5 +1,5 @@
1
1
  // Off-app comms for the concurrent shared-world route: which email catch a plane gets (in the
2
- // subject sandbox, or adopter-hosted), and the drains that match captured mail to the seats'
2
+ // subject sandbox, or adopter-hosted), and the drains that match captured mail to the participants'
3
3
  // declared inboxes and write the digest-only thread.
4
4
  import { catchTokenOf, catchTokenRefusal, collectExternalCommsEvidence, } from "../../comms/external-evidence.js";
5
5
  import { FakeInbox } from "../../comms/fake-inbox.js";
@@ -7,10 +7,11 @@ import { prepareReceivingRun } from "../../comms/receiving-runtime.js";
7
7
  import { DEFAULT_SANDBOX_CATCH_PORT, collectCommsThread, externalCatchHealthy, externalInboxUrl, } from "../../comms/sandbox-catch.js";
8
8
  import { redactText, toErrorMessage } from "../../evidence/redaction.js";
9
9
  import { writeContainedOutputFile } from "../../run/contained-output.js";
10
- import { addressedRecipients } from "../../lab/parse/comms.js";
11
- // Off-app comms (#297): on the provisioned-getHost plane the harness owns the one subject sandbox, so
10
+ import { addressedRecipients } from "../../study/parse/comms.js";
11
+ import { plural } from "../../run/text.js";
12
+ // Off-app comms: on the provisioned-getHost plane the harness owns the one subject sandbox, so
12
13
  // it can redirect the app's email-API sends into an in-sandbox catch and evidence them. Gated entirely
13
- // on config.comms — no comms declared → zero change. The base-URL env is injected into the subject
14
+ // on config.comms: no comms declared → zero change. The base-URL env is injected into the subject
14
15
  // sandbox at create (fixed port known up front); the catch is deployed before serve; the drain + digest
15
16
  // evidence run at subject teardown, then register run-level in the bundle. Unavailable on the
16
17
  // external-public plane (the app is an operator-owned deployment the harness never provisions).
@@ -19,7 +20,7 @@ export function subjectCommsOf(config, planeClass) {
19
20
  ? config.comms.email
20
21
  : undefined;
21
22
  const commsPort = commsEmail ? (commsEmail.port ?? DEFAULT_SANDBOX_CATCH_PORT) : undefined;
22
- // injectEnv is absent on an adopter-hosted plane (#328): there is no subject env to inject
23
+ // injectEnv is absent on an adopter-hosted plane: there is no subject env to inject
23
24
  // because the operator points their own app at their own catch.
24
25
  const commsEnv = commsEmail?.injectEnv !== undefined && commsPort !== undefined
25
26
  ? { [commsEmail.injectEnv]: `http://127.0.0.1:${commsPort}` }
@@ -27,7 +28,7 @@ export function subjectCommsOf(config, planeClass) {
27
28
  return { email: commsEmail, port: commsPort, env: commsEnv };
28
29
  }
29
30
  /**
30
- * Adopter-hosted ingress (#328): on the external-public plane the harness provisions nothing, so
31
+ * Adopter-hosted ingress: on the external-public plane the harness provisions nothing, so
31
32
  * it cannot host a catch. The operator can, and then humanish still does every other part of
32
33
  * the funnel: it tells each persona its address and inbox URL, drains the declared catch over
33
34
  * HTTP at teardown, and writes the same digest-only evidence. Declaring `external` is what turns
@@ -40,7 +41,7 @@ export async function prepareExternalComms(config, planeClass, dryRun, warnings,
40
41
  if (config.comms?.email?.kind === "fake" &&
41
42
  planeClass === "external-public" &&
42
43
  externalComms === undefined) {
43
- warnings.push("comms.email is declared but this is the external-public plane (the shared plane is an operator-owned public deployment the harness does not provision) — the in-sandbox email catch cannot be deployed and no comms evidence is collected. Declare `comms.email.external` to host the catch yourself (#328).");
44
+ warnings.push("comms.email is declared, but this study drives a public deployment that humanish does not provision, so the email catch cannot run in a sandbox and no email evidence is collected. Run the catch yourself with `humanish comms catch` and declare `comms.email.external`.");
44
45
  }
45
46
  if (!externalComms || !externalCommsEmail)
46
47
  return { ok: true, wiring: undefined };
@@ -49,23 +50,23 @@ export async function prepareExternalComms(config, planeClass, dryRun, warnings,
49
50
  if (tokenRefusal !== undefined)
50
51
  return {
51
52
  ok: false,
52
- code: "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_COMMS_TOKEN_INVALID",
53
+ code: "HUMANISH_SHARED_WORLD_COMMS_TOKEN_INVALID",
53
54
  message: tokenRefusal,
54
55
  };
55
- // Fail closed before any actor sandbox is created: a comms lab whose catch is unreachable
56
+ // Fail closed before any actor sandbox is created: a comms study whose catch is unreachable
56
57
  // collects nothing while every participant still spends. The probe asserts our service marker in
57
58
  // /health, so an adopter's proxy answering 200 for everything cannot pass for a catch.
58
59
  if (!dryRun && !(await externalCatchHealthy(externalComms))) {
59
60
  return {
60
61
  ok: false,
61
- code: "HUMANISH_CONCURRENT_SHARED_WORLD_LAB_COMMS_CATCH_UNREACHABLE",
62
+ code: "HUMANISH_SHARED_WORLD_COMMS_CATCH_UNREACHABLE",
62
63
  message: `The external comms catch or inbox is unreachable or incompatible (GET /health must identify humanish-comms-catch and advertise recipient-inbox-v1). Update humanish on the catch host and restart it with \`humanish comms catch\` on that host, or drop comms.email to run without the inbox funnel.`,
63
64
  };
64
65
  }
65
66
  return { ok: true, wiring: { external: externalComms, email: externalCommsEmail, inboxUrl } };
66
67
  }
67
68
  /**
68
- * Off-app comms evidence (#297): drain everything the in-sandbox catch captured, route it into a
69
+ * Off-app comms evidence: drain everything the in-sandbox catch captured, route it into a
69
70
  * host fake inbox addressed to the declared recipients, and write the run-level digest-only thread
70
71
  * artifact while the subject is still alive, before it is killed. Wrapped so a drain error
71
72
  * never blocks teardown (invariant: all sandboxes torn down by id in the plane's finally). Returns
@@ -91,11 +92,11 @@ export async function drainSubjectComms(ctx, commsEmail, subjectShell, deployedC
91
92
  return "comms/thread.json";
92
93
  }
93
94
  else if (collected.captured > 0) {
94
- warnings.push(`Comms catch captured ${collected.captured} email send(s) but none matched a declared recipient inbox — no comms evidence written. Declare comms.email.recipients[].address to match the address the app sends to.`);
95
+ warnings.push(`The email catch captured ${plural(collected.captured, "email send")}, but none matched a declared recipient inbox, so no email evidence was written. Set comms.email.recipients[].address to the address the app sends to.`);
95
96
  }
96
97
  else {
97
- // Zero captures is the silent-broken shape (#351): the app never posted to the catch.
98
- warnings.push(`Comms catch captured ZERO email sends — the app never delivered mail through the catch. Verify the app reads ${commsEmail.injectEnv} for its email API base URL (an SDK that ignores it sends real mail or throws) and that the flow reached an email step.`);
98
+ // Zero captures is the silent-broken shape: the app never posted to the catch.
99
+ warnings.push(`The email catch captured no email sends: the app never delivered mail through it. Verify the app reads ${commsEmail.injectEnv} for its email API base URL (an SDK that ignores it sends real mail or throws) and that the flow reached an email step.`);
99
100
  }
100
101
  }
101
102
  catch (error) {
@@ -104,8 +105,8 @@ export async function drainSubjectComms(ctx, commsEmail, subjectShell, deployedC
104
105
  return undefined;
105
106
  }
106
107
  /**
107
- * Adopter-hosted drain (#328/#387): same routing and digest-only artifact as the in-sandbox
108
- * catch — only the transport differs (HTTP GET /deliveries against the catch the operator
108
+ * Adopter-hosted drain: same routing and digest-only artifact as the in-sandbox
109
+ * catch. Only the transport differs (HTTP GET /deliveries against the catch the operator
109
110
  * runs). Called in the plane's finally so the evidence survives a failed run; a drain error never
110
111
  * masks the run's own outcome. Returns the thread's path when one was written.
111
112
  */
@@ -120,7 +121,7 @@ export async function drainExternalComms(ctx, comms) {
120
121
  ctx.warnings.push(...warnings);
121
122
  return path;
122
123
  }
123
- /** What receiving guards: the lab's email declaration and the subject env names and values. */
124
+ /** What receiving guards: the study's email declaration and the subject env names and values. */
124
125
  export function receivingSourceOf(residual, env) {
125
126
  const { comms } = residual;
126
127
  const { envValues } = residual.subject;
@@ -130,7 +131,7 @@ export function receivingSourceOf(residual, env) {
130
131
  };
131
132
  }
132
133
  /**
133
- * Real email receiving, when the lab declares it on a live run. It registers the connection's
134
+ * Real email receiving, when the study declares it on a live run. It registers the connection's
134
135
  * secrets with the run's scrub before any desktop starts. Returns the message the run fails with
135
136
  * when setup fails.
136
137
  */
@@ -13,9 +13,10 @@ export interface ExternalPublicPlaneOutcome {
13
13
  /**
14
14
  * The operator-declared origin (from subject.appUrl), recorded for evidence and reference only. The
15
15
  * operator-ownership claim rests on the subject.publicTarget.authorized attestation + this declared
16
- * appUrl; digest equality plays no part (blocker 2): a normal cross-origin redirect (apex->www, http->https;
17
- * lobby-trivia.example.test 307-redirects) makes the seats' observed origin differ from the declared one, which
18
- * is expected and must not fail the run. Persisted digest-only (never the raw origin).
16
+ * appUrl; digest equality plays no part: a normal cross-origin redirect (apex->www, http->https;
17
+ * lobby-trivia.example.test 307-redirects) makes the participants' observed origin differ from the
18
+ * declared one, which is expected and must not fail the run. Persisted digest-only (never the raw
19
+ * origin).
19
20
  */
20
21
  export declare function declaredOriginDigestOf(publicAppUrl: string): string | undefined;
21
22
  export declare function runExternalPublicPlane(ctx: PlaneContext, live: LiveParticipants, inbox: ExternalCommsWiring | undefined): Promise<ExternalPublicPlaneOutcome>;
@@ -1,8 +1,9 @@
1
- // External-public plane (#164 phase 2): no subject sandbox, no getHost, no prober. The shared plane
2
- // is the operator-declared public deployment (publicAppUrl); each seat opens it directly and reaches
3
- // the shared session through the real UI. A host-first barrier extracts the /lobby/CODE from the host
4
- // seat's CDP-observed URL (onObservedUrl) and threads it into the follower missions; a follower fails
5
- // closed without opening if the host never yields a code within the handoff deadline.
1
+ // External-public plane: no subject sandbox, no getHost, no prober. The shared plane is the
2
+ // operator-declared public deployment (publicAppUrl); each participant opens it directly and
3
+ // reaches the shared session through the real UI. A host-first barrier extracts the /lobby/CODE
4
+ // from the host's CDP-observed URL (onObservedUrl) and threads it into the follower missions; a
5
+ // follower fails closed without opening if the host never yields a code within the handoff
6
+ // deadline.
6
7
  import { liveObserverResult } from "../../observer/live.js";
7
8
  import { redactText, toErrorMessage } from "../../evidence/redaction.js";
8
9
  import { mapWithConcurrency } from "../../run/concurrency.js";
@@ -15,9 +16,10 @@ import { participantRunDeps, startParticipantFlush } from "./participant-specs.j
15
16
  /**
16
17
  * The operator-declared origin (from subject.appUrl), recorded for evidence and reference only. The
17
18
  * operator-ownership claim rests on the subject.publicTarget.authorized attestation + this declared
18
- * appUrl; digest equality plays no part (blocker 2): a normal cross-origin redirect (apex->www, http->https;
19
- * lobby-trivia.example.test 307-redirects) makes the seats' observed origin differ from the declared one, which
20
- * is expected and must not fail the run. Persisted digest-only (never the raw origin).
19
+ * appUrl; digest equality plays no part: a normal cross-origin redirect (apex->www, http->https;
20
+ * lobby-trivia.example.test 307-redirects) makes the participants' observed origin differ from the
21
+ * declared one, which is expected and must not fail the run. Persisted digest-only (never the raw
22
+ * origin).
21
23
  */
22
24
  export function declaredOriginDigestOf(publicAppUrl) {
23
25
  return publicAppUrl ? hostOriginDigest(publicAppUrl) : undefined;
@@ -35,8 +37,9 @@ export async function runExternalPublicPlane(ctx, live, inbox) {
35
37
  timeoutMs: ctx.timeoutMs,
36
38
  deadlineMs: seams.handoffDeadlineMs,
37
39
  scrubKnownValues: ctx.scrubKnownValues,
38
- // The per-seat vision lobby-code reader (default: the real single-frame OpenAI read). Injectable
39
- // so the barrier's handoff + convergence proof are testable without a live vision call.
40
+ // The per-participant vision lobby-code reader (default: the real single-frame OpenAI read).
41
+ // Injectable so the barrier's handoff + convergence proof are testable without a live vision
42
+ // call.
40
43
  readLobbyCode: seams.readLobbyCodeFromFrame ?? readLobbyCodeFromFrame,
41
44
  openaiApiKey: ctx.openaiApiKey,
42
45
  });
@@ -62,8 +65,9 @@ export async function runExternalPublicPlane(ctx, live, inbox) {
62
65
  subject: { source: "app-url", envNames: [], state: { provenance: "external-public" } },
63
66
  seedDigest: ctx.seedDigest,
64
67
  planeClass: "external-public",
65
- // Pre-fan-out snapshot: no seat has observed an origin yet, so the observed publicOriginDigest
66
- // is not available; surface the declared origin for the live Observer's reference.
68
+ // Pre-fan-out snapshot: no participant has observed an origin yet, so the observed
69
+ // publicOriginDigest is not available; surface the declared origin for the live Observer's
70
+ // reference.
67
71
  ...(declaredOriginDigest === undefined ? {} : { declaredOriginDigest }),
68
72
  };
69
73
  const inProgressBundle = buildConcurrentSharedWorldBundle({
@@ -9,10 +9,11 @@ export interface HandoffParticipantDeps {
9
9
  now: () => number;
10
10
  }
11
11
  /**
12
- * The handoff latch, its deadline and what each seat observed. The latched code and observed URLs
13
- * are runtime-only and land in persisted metadata only as digests (origin + convergence). (The code
14
- * is a shareable game code, not a secret, and it still renders in the host's screenshots, which are
15
- * full-fidelity unless redactScreenshots is set — the digesting is about narration/URL metadata.)
12
+ * The handoff latch, its deadline and what each participant observed. The latched code and observed
13
+ * URLs are runtime-only and land in persisted metadata only as digests (origin + convergence). (The
14
+ * code is a shareable game code, not a secret, and it still renders in the host's screenshots,
15
+ * which are full-fidelity unless redactScreenshots is set. The digesting is about narration/URL
16
+ * metadata.)
16
17
  */
17
18
  export declare class LobbyHandoff {
18
19
  readonly observedFinalUrls: (string | undefined)[];
@@ -20,7 +21,7 @@ export declare class LobbyHandoff {
20
21
  latchedLobbyCode: string | undefined;
21
22
  /** A follower gave up because the deadline passed. */
22
23
  timedOut: boolean;
23
- /** Why the host seat ended without producing a lobby code. */
24
+ /** Why the host ended without producing a lobby code. */
24
25
  hostFailure: string | undefined;
25
26
  readonly deadlineMs: number;
26
27
  private readonly lobbyCodeLatch;
@@ -52,7 +53,7 @@ export declare class LobbyHandoff {
52
53
  waitForHostCode(): Promise<string>;
53
54
  /** Releases waiting followers to fail closed when the host ended without a code. */
54
55
  releaseFollowersIfUnlatched(outcome: ParticipantRunOutcome | undefined): void;
55
- /** The digest-only convergence proofs over what the seats observed. */
56
+ /** The digest-only convergence proofs over what the participants observed. */
56
57
  convergence(declaredOriginDigest: string | undefined): {
57
58
  publicOriginDigest: string | undefined;
58
59
  lobbyConvergenceDigest: string | undefined;