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
@@ -13,13 +13,13 @@ const otherRoute = (routes) => !promptRoute(routes) && !routes.scripted;
13
13
  /** Rows for each actor, reported as `actors[<index>].<field>`, in this order per actor. */
14
14
  const ACTOR_ROWS = [
15
15
  // Shared-world-only fields on the roster: a participant's `entry` is inert anywhere else
16
- // (invariant 6).
16
+ // (claims match mechanism).
17
17
  {
18
18
  field: "lanes[].entry",
19
19
  reason: "the per-participant loopback entry is a shared-world capability; needs subject.topology: shared-world",
20
20
  applies: (actor, routes) => Boolean(rosterOf(actor)?.some((entry) => entry.entry !== undefined)) && !routes.shared,
21
21
  },
22
- // The host-seat marker acts only on the external-public shared-world route; inert elsewhere.
22
+ // The host marker acts only on the external-public shared-world route; inert elsewhere.
23
23
  {
24
24
  field: "lanes[].host",
25
25
  reason: "the designated host-participant marker; needs the external-public shared-world route: app-url × topology shared-world × allowPublicTargets",
@@ -35,7 +35,7 @@ const ACTOR_ROWS = [
35
35
  },
36
36
  {
37
37
  field: "lanes",
38
- reason: "fan-out is a computer-use route capability; terminal fan-out is a later slice",
38
+ reason: "only the computer-use route runs more than one participant",
39
39
  applies: (actor, routes) => routes.terminal && Boolean(rosterOf(actor)),
40
40
  },
41
41
  {
@@ -69,7 +69,7 @@ const ACTOR_ROWS = [
69
69
  { field: "lanes", applies: (actor, routes) => otherRoute(routes) && Boolean(rosterOf(actor)) },
70
70
  ];
71
71
  const TERMINAL_ONLY = "needs subject.source: terminal-product + a registered terminal actor";
72
- const RESERVED = "reserved for a later slice; not yet consumed";
72
+ const RESERVED = "reserved; no route reads it yet";
73
73
  /** Rows for the rest of the config, reported after the actor rows, in this order. */
74
74
  const CONFIG_ROWS = [
75
75
  // The computer-use routes consume (clone) subject.{serve,env,state,clone.depth}, and so does the
@@ -90,8 +90,9 @@ const CONFIG_ROWS = [
90
90
  field: "subject.state",
91
91
  applies: (config, routes) => Boolean(config.subject.state) && !routes.cua && !routes.scripted,
92
92
  },
93
- // topology + checkpoint act only on the shared-world route (#164); a set-but-unconsumed value
94
- // (incl. an explicit per-lane-worlds, which the cua route already is by mechanism) warns inert.
93
+ // topology + checkpoint act only on the shared-world route; a set-but-unconsumed value
94
+ // (incl. an explicit per-lane-worlds, which the computer-use route already is by mechanism) warns
95
+ // inert.
95
96
  {
96
97
  field: "subject.topology",
97
98
  reason: "drives behavior only on the shared-world route; needs subject.topology: shared-world + clone × e2b-desktop × a computer-use actor + a roster of ≥2 participants",
@@ -113,7 +114,7 @@ const CONFIG_ROWS = [
113
114
  // getHost-exposed plane) and on scripted clones; inert elsewhere.
114
115
  {
115
116
  field: "subject.exposure",
116
- reason: "the synthetic-subject attestation for a getHost-exposed plane; needs shared-world or clone × e2b-desktop × scripted-browser",
117
+ reason: "the statement that a subject served on a public sandbox URL holds only synthetic data; needs shared-world or clone × e2b-desktop × scripted-browser",
117
118
  applies: (config, routes) => config.subject.exposure !== undefined &&
118
119
  !routes.shared &&
119
120
  !(routes.scripted && config.subject.source === "clone"),
@@ -121,10 +122,10 @@ const CONFIG_ROWS = [
121
122
  // comms.email drives the in-sandbox email/SMS catch, which needs a subject sandbox that humanish
122
123
  // provisions (clone or local-tree) so it holds a handle to host the catch. On an app-url /
123
124
  // operator-provided subject there is no such handle, so a declared comms block would silently
124
- // collect nothing — a false green. Warn at parse time (fires on inspect + dry-run too).
125
+ // collect nothing, a false green. Warn at parse time (fires on inspect + dry-run too).
125
126
  {
126
127
  field: "comms.email",
127
- reason: "the in-sandbox email/SMS catch needs a harness-provisioned subject to host it — subject.source: clone or local-tree; on an app-url or operator-provided subject humanish holds no sandbox handle. Declare `comms.email.external` to run the catch yourself: humanish then points the persona at your inbox, drains your catch, and writes the same evidence — see #328",
128
+ reason: "the email catch runs in a sandbox humanish provisions, which needs `subject.source: clone` or `local-tree`, and an app-url subject has none. To use email here, run the catch yourself with `humanish comms catch` and declare `comms.email.external`: humanish then points each persona at your inbox, reads your catch and records the same evidence",
128
129
  applies: (config) => config.comms?.email?.kind === "fake" &&
129
130
  config.comms.email.external === undefined &&
130
131
  config.subject.source !== "clone" &&
@@ -135,13 +136,13 @@ const CONFIG_ROWS = [
135
136
  // declared external one would silently collect nothing.
136
137
  {
137
138
  field: "comms.email.external",
138
- reason: "this subject is harness-provisioned, so humanish hosts the catch itself and injects its URL; an adopter-hosted catch would receive nothing. Drop `external` here, or move the lab to an app-url/operator-provisioned subject",
139
+ reason: "this subject is harness-provisioned, so humanish hosts the catch itself and injects its URL; an adopter-hosted catch would receive nothing. Drop `external` here, or move the study to an app-url or operator-provisioned subject",
139
140
  applies: (config) => Boolean(config.comms?.email?.external) &&
140
141
  (config.subject.source === "clone" || config.subject.source === "local-tree"),
141
142
  },
142
- // clone.keep is consumed on the cua route (honored on failure: the sandbox is left up to debug
143
- // a failed install/boot; otherwise always killed). clone.fanout is rejected on the cua route
144
- // (a hard parse error above), so it can never reach this warning list there.
143
+ // clone.keep is consumed on the computer-use route (honored on failure: the sandbox is left up to
144
+ // debug a failed install/boot; otherwise always killed). clone.fanout is rejected on the
145
+ // computer-use route (a hard parse error above), so it can never reach this warning list there.
145
146
  {
146
147
  field: "execution.timeoutMs",
147
148
  applies: (config, routes) => !routes.cua &&
@@ -153,23 +154,24 @@ const CONFIG_ROWS = [
153
154
  field: "execution.completionTimeoutMs",
154
155
  applies: (config) => config.execution?.completionTimeoutMs !== undefined,
155
156
  },
156
- // execution.concurrency is consumed on the cua route (it bounds in-flight fan-out participants);
157
- // inert (warned) everywhere else.
157
+ // execution.concurrency is consumed on the computer-use route (it bounds in-flight fan-out
158
+ // participants); inert (warned) everywhere else.
158
159
  {
159
160
  field: "execution.concurrency",
160
161
  applies: (config, routes) => config.execution?.concurrency !== undefined && !routes.cua,
161
162
  },
162
- // execution.caps is consumed on the cua route (maxUsd is the fail-closed spend abort); inert
163
- // (warned) everywhere else so a misplaced budget field is never trusted to cap a route it cannot.
163
+ // execution.caps is consumed on the computer-use route (maxUsd is the fail-closed spend abort);
164
+ // inert (warned) everywhere else so a misplaced budget field is never trusted to cap a route it
165
+ // cannot.
164
166
  {
165
167
  field: "execution.caps",
166
- reason: "the fail-closed spend abort is a computer-use route capability; needs a computer-use actor on e2b-desktop",
168
+ reason: "only the computer-use route enforces it, with a computer-use actor on e2b-desktop",
167
169
  applies: (config, routes) => Boolean(config.execution?.caps) && !routes.cua,
168
170
  },
169
171
  // terminal-product consumes subject.product, scenario.caps, execution.{terminal,runtimeAuth}:
170
172
  // dry-run records the contract; live execution enforces caps and command-scoped auth. On every
171
173
  // other route they are inert and must warn so a
172
- // misplaced safety/budget field is never trusted to do something it cannot (invariant 6).
174
+ // misplaced safety/budget field is never trusted to do something it cannot.
173
175
  {
174
176
  field: "subject.product",
175
177
  reason: "needs subject.source: terminal-product or desktop-cli with the matching actor",
@@ -229,9 +231,9 @@ const CONFIG_ROWS = [
229
231
  applies: (config, routes) => !routes.cua && config.execution?.desktop?.sandboxTimeoutMs !== undefined,
230
232
  },
231
233
  // execution.desktop.template (the custom E2B desktop image) is consumed only where a desktop is
232
- // actually created via Sandbox.create — the e2b-desktop computer-use routes (cua/shared-world/
233
- // concurrent). It is inert on every other route (incl. the in-process local-app cua route, which
234
- // creates no desktop): warn so an unconsumed template is never silently ignored (invariant 6).
234
+ // actually created via Sandbox.create: the e2b-desktop computer-use routes (cua/shared-world/
235
+ // concurrent). It is inert on every other route (incl. the in-process local-app computer-use
236
+ // route, which creates no desktop): warn so an unconsumed template is never silently ignored.
235
237
  {
236
238
  field: "execution.desktop.template",
237
239
  reason: "the custom E2B desktop image is consumed only on execution.target: e2b-desktop computer-use routes that create a desktop; needs a computer-use actor on e2b-desktop",
@@ -251,8 +253,8 @@ const CONFIG_ROWS = [
251
253
  applies: (config, routes) => Boolean(config.scenario?.ref) && !routes.scripted,
252
254
  },
253
255
  { field: "scenario.inline", applies: (config) => Boolean(config.scenario?.inline) },
254
- // review.{scoring,milestones,vocabulary} stay forward-declared (reserved for #319) on every route.
255
- // review.scorer (#316) is consumed (loaded + wired, or fail-closed at load) on every scorer-capable
256
+ // review.{scoring,milestones,vocabulary} stay forward-declared on every route.
257
+ // review.scorer is consumed (loaded + wired, or fail-closed at load) on every scorer-capable
256
258
  // route, so it does not warn there; on the scripted-browser route the actor carries no scorer seam,
257
259
  // so a declared scorer is flagged inert (the run also fails closed at load).
258
260
  {
@@ -297,9 +299,11 @@ function rowLabel(row, prefix = "") {
297
299
  ? `${prefix}${row.field}`
298
300
  : `${prefix}${row.field} (${row.reason})`;
299
301
  }
300
- // Report fields that are present but not yet consumed by the engine, so a user never trusts a
301
- // setting that silently does nothing. Keeps the schema forward-correct and honest.
302
- export function forwardDeclaredWarnings(config) {
302
+ /**
303
+ * The fields a config sets that its route does not read, each as `field` or `field (reason)`. A v2
304
+ * file gets them as one warning; a v3 study is refused for any of them.
305
+ */
306
+ export function inertFieldLabels(config) {
303
307
  const routes = routesOf(config);
304
308
  const inert = [];
305
309
  for (const [index, actor] of config.actors.entries()) {
@@ -310,14 +314,38 @@ export function forwardDeclaredWarnings(config) {
310
314
  for (const row of CONFIG_ROWS)
311
315
  if (row.applies(config, routes))
312
316
  inert.push(rowLabel(row));
317
+ return inert;
318
+ }
319
+ /**
320
+ * The same fields as `inertFieldLabels`, as paths without their reasons, such as
321
+ * `actors[0].lanes[].entry` or `execution.timeoutMs`. `humanish migrate` drops each one.
322
+ */
323
+ export function inertFieldPaths(config) {
324
+ const routes = routesOf(config);
325
+ const paths = [];
326
+ for (const [index, actor] of config.actors.entries()) {
327
+ for (const row of ACTOR_ROWS)
328
+ if (row.applies(actor, routes))
329
+ paths.push(`actors[${index}].${row.field}`);
330
+ }
331
+ for (const row of CONFIG_ROWS)
332
+ if (row.applies(config, routes))
333
+ paths.push(row.field);
334
+ return paths;
335
+ }
336
+ // Report fields that are present but not yet consumed by the engine, so a user never trusts a
337
+ // setting that silently does nothing.
338
+ export function forwardDeclaredWarnings(config) {
339
+ const routes = routesOf(config);
340
+ const inert = inertFieldLabels(config);
313
341
  const warnings = inert.length === 0
314
342
  ? []
315
343
  : [
316
- `Forward-declared fields are set but not yet consumed by the engine (planned for a later slice): ${inert.join(", ")}.`,
344
+ `These fields are set, but no route reads them yet, so they have no effect: ${inert.join(", ")}.`,
317
345
  ];
318
- // A declared cap below the seat count is legal but loud: the roster promises N live actors and
319
- // the cap delivers waves of M. Say so up front (inspect + dry-run + run) — a green run in waves
320
- // is otherwise indistinguishable from the all-live run the author meant (#350).
346
+ // A declared cap below the participant count is legal but loud: the roster promises N live actors
347
+ // and the cap delivers waves of M. Say so up front (inspect + dry-run + run): a green run in
348
+ // waves is otherwise indistinguishable from the all-live run the author meant.
321
349
  {
322
350
  const participantCount = rosterOf(config.actors[0])?.length ?? config.actors[0]?.count ?? 1;
323
351
  const cap = config.execution?.concurrency;
@@ -325,14 +353,14 @@ export function forwardDeclaredWarnings(config) {
325
353
  warnings.push(`execution.concurrency ${cap} caps a ${participantCount}-participant roster: participants run in waves of ${cap}, never all live at once. Remove execution.concurrency (the default runs all ${participantCount} participants simultaneously) or set it to ${participantCount}; declare a lower cap only to bound simultaneous paid desktops.`);
326
354
  }
327
355
  }
328
- // Partial email coverage is legal but loud (#351): a participant without an addressed recipient never
329
- // hears an inbox exists, so an email-gated flow on that seat dead-ends by construction.
356
+ // Partial email coverage is legal but loud: a participant without an addressed recipient never
357
+ // hears an inbox exists, so an email-gated flow on that participant dead-ends by construction.
330
358
  if (routes.cua && config.comms?.email?.recipients) {
331
359
  const participantIds = declaredParticipantIds(config);
332
360
  const covered = new Set(addressedRecipients(config.comms.email).map((recipient) => recipient.participantId));
333
361
  const uncovered = participantIds.filter((id) => !covered.has(id));
334
362
  if (covered.size > 0 && uncovered.length > 0 && participantIds.length > 1) {
335
- warnings.push(`comms.email covers ${covered.size} of ${participantIds.length} participants; the uncovered participant(s) get no inbox and are never told one exists: ${uncovered.join(", ")}. Add addressed recipients for them if their flows need email.`);
363
+ warnings.push(`comms.email covers ${covered.size} of ${participantIds.length} participants. These get no inbox and are never told one exists: ${uncovered.join(", ")}. Add a recipient with an address for each one whose flow needs email.`);
336
364
  }
337
365
  }
338
366
  return warnings;
@@ -1,15 +1,15 @@
1
- import type { LabSubjectServe, LabSubjectState } from "../lab/types.js";
1
+ import type { StudySubjectServe, StudySubjectState } from "../study/types.js";
2
2
  import type { RunSubjectStateStepRecord } from "../run/bundle.js";
3
3
  import { type DetachedTimers } from "../substrates/detached.js";
4
4
  import { type Shell } from "../substrates/shell.js";
5
5
  import { type SubjectPhaseEvent } from "./steps.js";
6
- /** The longest provisionCloneSubject can take with the lab's budgets: the clone, then serving. */
7
- export declare function cloneProvisioningBudgetMs(serve: LabSubjectServe, state: LabSubjectState | undefined): number;
6
+ /** The longest provisionCloneSubject can take with the study's budgets: the clone, then serving. */
7
+ export declare function cloneProvisioningBudgetMs(serve: StudySubjectServe, state: StudySubjectState | undefined): number;
8
8
  /**
9
9
  * Provision a clone subject inside the sandbox: clone, then the shared serve pipeline (install,
10
10
  * state before-build, build, state before-start, start, readiness probe, state after-ready).
11
11
  * Returns the latest subject HEAD after successful provisioning. Throws (with a capped log tail
12
- * for the caller to redact) on any failing step; the lab persists that as a failed-evidence
12
+ * for the caller to redact) on any failing step; the route persists that as a failed-evidence
13
13
  * bundle.
14
14
  *
15
15
  * Auth: when GITHUB_TOKEN is among the declared subject env names, the clone authenticates via an
@@ -20,12 +20,12 @@ export declare function cloneProvisioningBudgetMs(serve: LabSubjectServe, state:
20
20
  export declare function provisionCloneSubject(shell: Shell, args: {
21
21
  repo: string;
22
22
  depth: number;
23
- serve: LabSubjectServe;
23
+ serve: StudySubjectServe;
24
24
  /** Declared subject state (seed steps; external declaration is provenance-only). */
25
- state?: LabSubjectState;
25
+ state?: StudySubjectState;
26
26
  hasGithubToken: boolean;
27
27
  requestTimeoutMs: number;
28
- /** Literal scrubber for known provisioned values, applied to log tails PRE-truncation. */
28
+ /** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
29
29
  scrub: (text: string) => string;
30
30
  /** Called the moment the cloned commit resolves, so provenance survives later failures. */
31
31
  onCommit?: (commit: string) => void;
@@ -3,7 +3,7 @@ import { detachedTimersOf, runDetachedStep } from "../substrates/detached.js";
3
3
  import { runOrThrow } from "../substrates/shell.js";
4
4
  import { runSubjectServePipeline, serveProvisioningBudgetMs } from "./serve.js";
5
5
  import { SOURCE_TIMEOUT_MS, emitPhaseCompleted, emitPhaseStarted, SUBJECT_DIR, } from "./steps.js";
6
- /** The longest provisionCloneSubject can take with the lab's budgets: the clone, then serving. */
6
+ /** The longest provisionCloneSubject can take with the study's budgets: the clone, then serving. */
7
7
  export function cloneProvisioningBudgetMs(serve, state) {
8
8
  return SOURCE_TIMEOUT_MS + serveProvisioningBudgetMs(serve, state);
9
9
  }
@@ -11,7 +11,7 @@ export function cloneProvisioningBudgetMs(serve, state) {
11
11
  * Provision a clone subject inside the sandbox: clone, then the shared serve pipeline (install,
12
12
  * state before-build, build, state before-start, start, readiness probe, state after-ready).
13
13
  * Returns the latest subject HEAD after successful provisioning. Throws (with a capped log tail
14
- * for the caller to redact) on any failing step; the lab persists that as a failed-evidence
14
+ * for the caller to redact) on any failing step; the route persists that as a failed-evidence
15
15
  * bundle.
16
16
  *
17
17
  * Auth: when GITHUB_TOKEN is among the declared subject env names, the clone authenticates via an
@@ -1,7 +1,7 @@
1
1
  import type { Shell } from "../substrates/shell.js";
2
2
  import { type SubjectPhaseEvent } from "./steps.js";
3
3
  /**
4
- * Prepare a CLI study's runtime and, only when declared, its product (#495, #515).
4
+ * Prepare a CLI study's runtime and, only when declared, its product.
5
5
  *
6
6
  * The install runs unkeyed and before the session starts, for the same reason the clone route
7
7
  * provisions its subject first: what is being studied begins when the participant looks at the
@@ -4,7 +4,7 @@ import { NODE_BOOTSTRAP_COMMAND, NODE_BOOTSTRAP_TIMEOUT_MS } from "./node-bootst
4
4
  import { runDetachedStep } from "../substrates/detached.js";
5
5
  import { emitPhaseCompleted, emitPhaseStarted, INSTALL_TIMEOUT_MS, } from "./steps.js";
6
6
  /**
7
- * Prepare a CLI study's runtime and, only when declared, its product (#495, #515).
7
+ * Prepare a CLI study's runtime and, only when declared, its product.
8
8
  *
9
9
  * The install runs unkeyed and before the session starts, for the same reason the clone route
10
10
  * provisions its subject first: what is being studied begins when the participant looks at the
@@ -44,7 +44,7 @@ export async function provisionDesktopCli(shell, args) {
44
44
  if (!result.ok) {
45
45
  // Fail closed: a participant handed a desktop where the product is not installed would produce
46
46
  // a transcript about a missing command, and that finding belongs to the harness, not the tool.
47
- // The tail rides along, scrubbed before truncation like every other provisioning failure — a
47
+ // The tail rides along, scrubbed before truncation like every other provisioning failure. A
48
48
  // bare "install failed" is unactionable to whoever wrote the command.
49
49
  throw new Error(args.scrub(`desktop-cli install failed for "${args.product}" (${result.timedOut ? "timed out" : `exit ${result.exitCode ?? "?"}`}): ${failureTail(args.scrub(result.logTail))}`));
50
50
  }
@@ -76,7 +76,7 @@ export declare function createLocalTreeArchive(root: string, options?: CreateLoc
76
76
  * produces (no leading "./", no trailing "/"). Absolute paths and glob syntax
77
77
  * are rejected instead of silently ignored: an exclude the author believed in but
78
78
  * that never matches anything is a leak vector, so unusable shapes fail
79
- * closed at the packing boundary (and, for lab manifests, already at parse
80
- * time in src/lab/parse/subject.ts).
79
+ * closed at the packing boundary (and, for study manifests, already at parse
80
+ * time in src/study/parse/subject.ts).
81
81
  */
82
82
  export declare function normalizeExtraExcludeEntry(entry: string): string;
@@ -8,7 +8,7 @@
8
8
  // that cannot happen: enumerateLocalTree() builds one entries array, and both
9
9
  // the hash and the tar file list are derived from that same array.
10
10
  //
11
- // See docs/goals/local-tree-subject/goal.md ("Packing design") for the full
11
+ // See docs/history/goals/local-tree-subject/goal.md ("Packing design") for the full
12
12
  // contract implemented here. Node builtins only, no npm dependencies.
13
13
  import { execFileSync } from "node:child_process";
14
14
  import { createHash } from "node:crypto";
@@ -111,7 +111,7 @@ export function createLocalTreeArchive(root, options = {}) {
111
111
  if (entries.length === 0) {
112
112
  throw new Error(`Local tree root "${path.basename(resolvedRoot)}" produced zero packable entries after the always-on denylist` +
113
113
  (extraExclude.length > 0 ? " and extraExclude" : "") +
114
- "; local-tree packing requires at least one non-denylisted file or symlink. (Paths in this message are basenames only; the packed root is the lab resolution cwd.)");
114
+ "; local-tree packing requires at least one non-denylisted file or symlink. (Paths in this message are basenames only; the packed root is the study's working directory.)");
115
115
  }
116
116
  // Check the cap from enumerated sizes before reading/hashing file bytes, so
117
117
  // an oversized tree fails closed without the cost of hashing all of it.
@@ -292,8 +292,8 @@ function isDenylistedSegment(relPath) {
292
292
  * produces (no leading "./", no trailing "/"). Absolute paths and glob syntax
293
293
  * are rejected instead of silently ignored: an exclude the author believed in but
294
294
  * that never matches anything is a leak vector, so unusable shapes fail
295
- * closed at the packing boundary (and, for lab manifests, already at parse
296
- * time in src/lab/parse/subject.ts).
295
+ * closed at the packing boundary (and, for study manifests, already at parse
296
+ * time in src/study/parse/subject.ts).
297
297
  */
298
298
  export function normalizeExtraExcludeEntry(entry) {
299
299
  const trimmed = entry.trim();
@@ -1,4 +1,4 @@
1
- import type { LabSubjectServe, LabSubjectState } from "../lab/types.js";
1
+ import type { StudySubjectServe, StudySubjectState } from "../study/types.js";
2
2
  import type { RunSubjectStateStepRecord } from "../run/bundle.js";
3
3
  import { type DetachedTimers } from "../substrates/detached.js";
4
4
  import type { Shell } from "../substrates/shell.js";
@@ -14,11 +14,11 @@ import { type SubjectPhaseEvent } from "./steps.js";
14
14
  export declare function provisionLocalTreeSubject(shell: Shell, args: {
15
15
  /** The once-per-run packed archive bytes (shared byte-identically across every participant). */
16
16
  archiveBuffer: ArrayBuffer;
17
- serve: LabSubjectServe;
17
+ serve: StudySubjectServe;
18
18
  /** Declared subject state (seed steps; external declaration is provenance-only). */
19
- state?: LabSubjectState;
19
+ state?: StudySubjectState;
20
20
  requestTimeoutMs: number;
21
- /** Literal scrubber for known provisioned values, applied to log tails PRE-truncation. */
21
+ /** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
22
22
  scrub: (text: string) => string;
23
23
  /** Called the moment each state step finishes, success or failure. */
24
24
  onStateStep?: (record: RunSubjectStateStepRecord) => void;
@@ -54,7 +54,7 @@ export const NODE_BOOTSTRAP_COMMAND = [
54
54
  "for executable in node npm npx; do",
55
55
  ` sudo -n ln -sfn "$node_target/bin/$executable" "/usr/local/bin/$executable"`,
56
56
  "done",
57
- // Keep global product executables on the existing ordinary/sudo `PATH` (#679). The new
57
+ // Keep global product executables on the existing ordinary/sudo `PATH`. The new
58
58
  // versioned distribution is the only config we modify; no user/global npmrc or profile.
59
59
  `sudo -n "$node_target/bin/node" -e '${NODE_NPM_PREFIX_SCRIPT}' "$node_target/lib/node_modules/npm/npmrc"`,
60
60
  "hash -r",
@@ -1,17 +1,16 @@
1
- // Provide the runtime a subject's serve pipeline needs, instead of failing at exit 127 (#371).
1
+ // Provide the runtime a subject's serve pipeline needs, instead of failing at exit 127.
2
2
  //
3
- // The stock E2B `desktop` template ships python3 and curl but no Node. That fact has now been
4
- // rediscovered three times: the in-sandbox comms catch was rewritten from node to python3 in 0.29.0
5
- // for exactly this reason, the terminal route bootstraps Node explicitly, and the computer-use
6
- // clone/local-tree route did neither — so any lab whose `serve.install` runs npm or pnpm died with
7
- // `pnpm: command not found` after a sandbox had been created and paid for.
3
+ // The stock E2B `desktop` template ships python3 and curl but no Node. So the in-sandbox comms
4
+ // catch runs on python3, the terminal route bootstraps Node explicitly, and this module provides
5
+ // Node for the computer-use clone/local-tree route. Without it, any study whose `serve.install`
6
+ // runs npm or pnpm dies with `pnpm: command not found` after its sandbox is created and paid for.
8
7
  //
9
- // It failed invisibly up front: `lab inspect` was clean, the plan printed normally, the sandbox
10
- // provisioned, and the first signal was a shell exit code attributed to "subject install failed".
8
+ // That failure is invisible up front: `study show` is clean, the plan prints normally, the sandbox
9
+ // provisions, and the first signal is a shell exit code attributed to "subject install failed".
11
10
  // Nobody can debug that from the outside.
12
11
  //
13
- // The harness provides the runtime instead of warning about it. An adopter writing a lab for a Node app should not have to
14
- // know which binaries the template happens to carry — that is the harness's job, and the terminal
12
+ // The harness provides the runtime instead of warning about it. An adopter writing a study for a Node app should not have to
13
+ // know which binaries the template happens to carry. That is the harness's job, and the terminal
15
14
  // route already treats it that way. Detection is conservative and the bootstrap is skipped whenever
16
15
  // a runtime is already present, so a custom template that ships Node pays nothing.
17
16
  /** Package managers and runtimes whose absence on the stock template breaks a serve pipeline. */
@@ -1,4 +1,4 @@
1
- import type { LabSubjectServe, LabSubjectState } from "../lab/types.js";
1
+ import type { StudySubjectServe, StudySubjectState } from "../study/types.js";
2
2
  import type { RunSubjectStateStepRecord } from "../run/bundle.js";
3
3
  import { type DetachedTimers } from "../substrates/detached.js";
4
4
  import type { Shell } from "../substrates/shell.js";
@@ -8,7 +8,7 @@ import { type SubjectPhaseEvent } from "./steps.js";
8
8
  * with their one retry, the package-manager step, every seed step, the build and the readiness
9
9
  * wait. Detached-step polling adds seconds on top.
10
10
  */
11
- export declare function serveProvisioningBudgetMs(serve: LabSubjectServe, state: LabSubjectState | undefined): number;
11
+ export declare function serveProvisioningBudgetMs(serve: StudySubjectServe, state: StudySubjectState | undefined): number;
12
12
  /**
13
13
  * The provisioning pipeline the clone and local-tree routes share once SUBJECT_DIR is populated
14
14
  * (by git clone, or by upload and extract): install, state before-build, build, state
@@ -21,11 +21,11 @@ export declare function serveProvisioningBudgetMs(serve: LabSubjectServe, state:
21
21
  * eats the session budget.
22
22
  */
23
23
  export declare function runSubjectServePipeline(shell: Shell, args: {
24
- serve: LabSubjectServe;
24
+ serve: StudySubjectServe;
25
25
  /** Declared subject state (seed steps; external declaration is provenance-only). */
26
- state?: LabSubjectState;
26
+ state?: StudySubjectState;
27
27
  requestTimeoutMs: number;
28
- /** Literal scrubber for known provisioned values, applied to log tails PRE-truncation. */
28
+ /** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
29
29
  scrub: (text: string) => string;
30
30
  /** Called the moment each state step finishes, success or failure. */
31
31
  onStateStep?: (record: RunSubjectStateStepRecord) => void;
@@ -8,7 +8,7 @@ import { emitPhaseCompleted, emitPhaseStarted, INSTALL_TIMEOUT_MS, isoNow, SUBJE
8
8
  const BUILD_TIMEOUT_MS = 10 * 60_000;
9
9
  const DEFAULT_READY_TIMEOUT_MS = 180_000;
10
10
  /**
11
- * Run a provisioning step and, when it fails with an exit code, run it once more (#602): a
11
+ * Run a provisioning step and, when it fails with an exit code, run it once more: a
12
12
  * transient network error inside `npm install` is the common case. A timeout is not retried: its
13
13
  * budget is already spent, and a second wait would double it. The retry runs under its own step
14
14
  * name so both logs stay.
@@ -121,7 +121,7 @@ export async function runSubjectServePipeline(shell, args) {
121
121
  await refresh();
122
122
  }
123
123
  /**
124
- * Provide the runtime the pipeline needs before running it (#371). The stock desktop template
124
+ * Provide the runtime the pipeline needs before running it. The stock desktop template
125
125
  * ships python3 and curl but no Node. Probe first, so a template that ships its own Node pays
126
126
  * nothing.
127
127
  */
@@ -187,7 +187,7 @@ async function installSubject(step, command) {
187
187
  ? "subject install failed twice"
188
188
  : "subject install failed");
189
189
  if (!install.ok) {
190
- // Lead with the line a person can act on; npm's own trace follows it (#602).
190
+ // Lead with the line a person can act on; npm's own trace follows it.
191
191
  const headline = install.timedOut
192
192
  ? `subject install timed out after ${step.serve.installTimeoutMs ?? INSTALL_TIMEOUT_MS}ms`
193
193
  : install.attempts === 2
@@ -1,4 +1,4 @@
1
- import type { LabStateStepWhen, LabSubjectState } from "../lab/types.js";
1
+ import type { StudyStateStepWhen, StudySubjectState } from "../study/types.js";
2
2
  import type { RunSubjectStateStepRecord } from "../run/bundle.js";
3
3
  import { type DetachedTimers } from "../substrates/detached.js";
4
4
  import type { Shell } from "../substrates/shell.js";
@@ -11,10 +11,10 @@ export declare function commandDigestOf(command: string): string;
11
11
  * `subject-state-<name>` so a step can never collide with a serve step. Each step's record goes
12
12
  * to `onStateStep` as it finishes; the first failure throws with its scrubbed log tail.
13
13
  */
14
- export declare function runStateSteps(shell: Shell, when: LabStateStepWhen, args: {
15
- state?: LabSubjectState;
14
+ export declare function runStateSteps(shell: Shell, when: StudyStateStepWhen, args: {
15
+ state?: StudySubjectState;
16
16
  requestTimeoutMs: number;
17
- /** Literal scrubber for known provisioned values, applied to log tails PRE-truncation. */
17
+ /** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
18
18
  scrub: (text: string) => string;
19
19
  onStateStep?: (record: RunSubjectStateStepRecord) => void;
20
20
  onPhase?: (event: SubjectPhaseEvent) => void;
@@ -39,7 +39,7 @@ export async function runStateSteps(shell, when, args) {
39
39
  args.onStateStep?.({
40
40
  name: step.name,
41
41
  when,
42
- // Digest only (sha256-16): the command text never persists: the lab YAML in the
42
+ // Digest only (sha256-16): the command text never persists: the study YAML in the
43
43
  // consumer's repo is the plaintext source of truth.
44
44
  commandDigest: commandDigestOf(step.command),
45
45
  ok: result.ok,
@@ -25,13 +25,13 @@ export declare function emitPhaseStarted(onPhase: ((event: SubjectPhaseEvent) =>
25
25
  /** Emit the matching phase-completed event: always carries ok and durationMs (>= 0). */
26
26
  export declare function emitPhaseCompleted(onPhase: ((event: SubjectPhaseEvent) => void) | undefined, now: () => number, startedAt: number, phase: string, ok: boolean, message: string): void;
27
27
  /** Default phase-boundary sink (stderr): one line per event, prefixed with the participant id
28
- * only when laneCount > 1. Single-participant emission is unconditional: total single-participant silence for the
29
- * whole clone/install/build/ready boot is the bug this event stream exists to close.
30
- * Overridable via LabDeps.subjectPhaseSink so deterministic tests capture instead of writing to
28
+ * only when the run has more than one participant. A single participant still gets every line:
29
+ * a silent clone, install, build and ready boot is the bug this event stream exists to close.
30
+ * Overridable via StudyDeps.subjectPhaseSink so deterministic tests capture instead of writing to
31
31
  * the real stderr. */
32
- export declare function defaultSubjectPhaseSink(event: SubjectPhaseEvent, ctx: {
33
- laneId: string;
34
- laneCount: number;
32
+ export declare function defaultSubjectPhaseSink(event: SubjectPhaseEvent, participant: {
33
+ readonly id: string;
34
+ readonly count: number;
35
35
  }): void;
36
36
  /** The shared-world subject's phase line: one shared plane, so no participant prefix. */
37
37
  export declare function defaultSharedWorldPhaseSink(event: SubjectPhaseEvent): void;
@@ -23,13 +23,13 @@ export function emitPhaseCompleted(onPhase, now, startedAt, phase, ok, message)
23
23
  });
24
24
  }
25
25
  /** Default phase-boundary sink (stderr): one line per event, prefixed with the participant id
26
- * only when laneCount > 1. Single-participant emission is unconditional: total single-participant silence for the
27
- * whole clone/install/build/ready boot is the bug this event stream exists to close.
28
- * Overridable via LabDeps.subjectPhaseSink so deterministic tests capture instead of writing to
26
+ * only when the run has more than one participant. A single participant still gets every line:
27
+ * a silent clone, install, build and ready boot is the bug this event stream exists to close.
28
+ * Overridable via StudyDeps.subjectPhaseSink so deterministic tests capture instead of writing to
29
29
  * the real stderr. */
30
- export function defaultSubjectPhaseSink(event, ctx) {
30
+ export function defaultSubjectPhaseSink(event, participant) {
31
31
  const durationSuffix = event.durationMs === undefined ? "" : ` (${event.durationMs}ms)`;
32
- const prefix = ctx.laneCount > 1 ? `humanish computer-use [${ctx.laneId}]` : "humanish computer-use";
32
+ const prefix = participant.count > 1 ? `humanish computer-use [${participant.id}]` : "humanish computer-use";
33
33
  process.stderr.write(`${prefix}: ${event.message}${durationSuffix}\n`);
34
34
  }
35
35
  /** The shared-world subject's phase line: one shared plane, so no participant prefix. */
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * True when `error` is (structurally) the @e2b/desktop CommandExitError: a
3
- * non-zero substrate command exit that the real Sandbox surfaces as a THROW.
3
+ * non-zero substrate command exit that the real Sandbox surfaces as a throw.
4
4
  * Matches either the SDK class name (`name === "CommandExitError"`) or any object
5
5
  * carrying a numeric `exitCode` (the same field `commandFailureInfo` reads, so a
6
6
  * structural fake is covered without importing the SDK class).
7
7
  *
8
- * Deliberately conservative — it is the RECOVERABILITY predicate the CUA loop uses
8
+ * Deliberately conservative: it is the recoverability predicate the CUA loop uses
9
9
  * to skip a single failed desktop action instead of ending the whole run: it must
10
- * NOT match a deadline/abort control-flow signal (those subclass Error without a
10
+ * not match a deadline/abort control-flow signal (those subclass Error without a
11
11
  * name override or an exitCode) or a generic Error with no exit signal, so only a
12
12
  * genuine substrate-command failure is treated as recoverable.
13
13
  */
@@ -12,14 +12,14 @@
12
12
  import { tailOf } from "./shell.js";
13
13
  /**
14
14
  * True when `error` is (structurally) the @e2b/desktop CommandExitError: a
15
- * non-zero substrate command exit that the real Sandbox surfaces as a THROW.
15
+ * non-zero substrate command exit that the real Sandbox surfaces as a throw.
16
16
  * Matches either the SDK class name (`name === "CommandExitError"`) or any object
17
17
  * carrying a numeric `exitCode` (the same field `commandFailureInfo` reads, so a
18
18
  * structural fake is covered without importing the SDK class).
19
19
  *
20
- * Deliberately conservative — it is the RECOVERABILITY predicate the CUA loop uses
20
+ * Deliberately conservative: it is the recoverability predicate the CUA loop uses
21
21
  * to skip a single failed desktop action instead of ending the whole run: it must
22
- * NOT match a deadline/abort control-flow signal (those subclass Error without a
22
+ * not match a deadline/abort control-flow signal (those subclass Error without a
23
23
  * name override or an exitCode) or a generic Error with no exit signal, so only a
24
24
  * genuine substrate-command failure is treated as recoverable.
25
25
  */
@@ -1,4 +1,4 @@
1
- import { CuaExecutorError } from "../actors/computer-use/executor-error.js";
1
+ import { ComputerUseExecutorError } from "../actors/computer-use/executor-error.js";
2
2
  /**
3
3
  * Wrap an already-acquired resource. The adapter supplies release authority as a closure;
4
4
  * this layer never reconstructs it from a saved ID or enumerates provider resources.
@@ -12,7 +12,7 @@ export function ownDesktopAllocation(options) {
12
12
  let closing;
13
13
  const assertOpen = () => {
14
14
  if (closing !== undefined)
15
- throw new CuaExecutorError("executor_closed", "not_dispatched");
15
+ throw new ComputerUseExecutorError("executor_closed", "not_dispatched");
16
16
  };
17
17
  const close = (policy = {}) => {
18
18
  // Install the promise before invoking release: concurrent/reentrant callers share it.