humanish 0.106.1 → 0.108.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (668) hide show
  1. package/ARCHITECTURE.md +38 -32
  2. package/CHANGELOG.md +28 -0
  3. package/CONTEXT.md +51 -41
  4. package/README.md +152 -174
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-client.js +2 -1
  14. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  15. package/dist/actors/codex/app-server-trace.js +1 -3
  16. package/dist/actors/codex/app-server-ui.js +1 -1
  17. package/dist/actors/codex/app-server.js +2 -1
  18. package/dist/actors/codex/codex-admission.d.ts +91 -0
  19. package/dist/actors/codex/codex-admission.js +150 -0
  20. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  21. package/dist/actors/codex/protocol-compat.js +357 -0
  22. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  23. package/dist/actors/codex/protocol-contract.js +471 -0
  24. package/dist/actors/codex/restricted-executable.d.ts +28 -4
  25. package/dist/actors/codex/restricted-executable.js +104 -29
  26. package/dist/actors/codex/restricted-launch.d.ts +9 -2
  27. package/dist/actors/codex/restricted-launch.js +43 -4
  28. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  29. package/dist/actors/codex/restricted-notifications.js +277 -0
  30. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  31. package/dist/actors/codex/restricted-participant.js +66 -6
  32. package/dist/actors/codex/restricted-policy.d.ts +11 -3
  33. package/dist/actors/codex/restricted-policy.js +2 -2
  34. package/dist/actors/codex/restricted-session.d.ts +16 -3
  35. package/dist/actors/codex/restricted-session.js +60 -22
  36. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  37. package/dist/actors/codex/restricted-transport.js +139 -27
  38. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  39. package/dist/actors/codex/restricted-turn.js +43 -30
  40. package/dist/actors/computer-use/actor.d.ts +17 -17
  41. package/dist/actors/computer-use/actor.js +6 -6
  42. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  43. package/dist/actors/computer-use/admission-limit.js +1 -1
  44. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  45. package/dist/actors/computer-use/loop/actions.js +10 -10
  46. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  47. package/dist/actors/computer-use/loop/backstop.js +15 -13
  48. package/dist/actors/computer-use/loop/ending.d.ts +7 -7
  49. package/dist/actors/computer-use/loop/ending.js +9 -9
  50. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  51. package/dist/actors/computer-use/loop/observation.js +9 -9
  52. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  53. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  54. package/dist/actors/computer-use/loop/session.js +3 -3
  55. package/dist/actors/computer-use/loop/spend.d.ts +2 -2
  56. package/dist/actors/computer-use/loop/spend.js +4 -4
  57. package/dist/actors/computer-use/loop/trace.js +11 -10
  58. package/dist/actors/computer-use/loop/types.d.ts +37 -26
  59. package/dist/actors/computer-use/loop/usage.js +2 -2
  60. package/dist/actors/computer-use/loop.js +4 -4
  61. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  62. package/dist/actors/computer-use/openai-context.js +214 -0
  63. package/dist/actors/computer-use/openai-provider.d.ts +12 -9
  64. package/dist/actors/computer-use/openai-provider.js +47 -36
  65. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  66. package/dist/actors/computer-use/openai-requests.js +82 -15
  67. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  68. package/dist/actors/computer-use/openai-wire.js +36 -34
  69. package/dist/actors/contract.d.ts +86 -49
  70. package/dist/actors/contract.js +29 -23
  71. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  72. package/dist/actors/local-agent/claude-session.js +10 -9
  73. package/dist/actors/local-agent/cli.d.ts +8 -6
  74. package/dist/actors/local-agent/cli.js +24 -28
  75. package/dist/actors/local-agent/readiness.d.ts +2 -2
  76. package/dist/actors/local-agent/readiness.js +4 -4
  77. package/dist/actors/reasoning-effort.js +6 -6
  78. package/dist/actors/registry.d.ts +10 -10
  79. package/dist/actors/registry.js +18 -17
  80. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  81. package/dist/actors/scripted-browser/actor.js +16 -16
  82. package/dist/actors/scripted-browser/browser-command.js +1 -1
  83. package/dist/actors/scripted-browser/journey.js +15 -4
  84. package/dist/actors/scripted-browser/steps.js +19 -1
  85. package/dist/actors/scripted-browser/types.d.ts +12 -2
  86. package/dist/actors/stop-conditions.d.ts +1 -1
  87. package/dist/actors/stop-conditions.js +1 -3
  88. package/dist/analysis/automatic-completion.d.ts +13 -8
  89. package/dist/analysis/automatic-completion.js +14 -8
  90. package/dist/analysis/automatic-config.d.ts +1 -1
  91. package/dist/analysis/automatic-config.js +2 -2
  92. package/dist/analysis/automatic.d.ts +10 -4
  93. package/dist/analysis/automatic.js +17 -13
  94. package/dist/analysis/codex-config.d.ts +6 -2
  95. package/dist/analysis/codex-config.js +22 -14
  96. package/dist/analysis/diagnostics.d.ts +23 -0
  97. package/dist/analysis/diagnostics.js +112 -0
  98. package/dist/analysis/evidence-sources.js +2 -2
  99. package/dist/analysis/evidence.js +6 -6
  100. package/dist/analysis/execute.d.ts +7 -1
  101. package/dist/analysis/execute.js +39 -12
  102. package/dist/analysis/job.d.ts +8 -5
  103. package/dist/analysis/job.js +15 -14
  104. package/dist/analysis/load.d.ts +1 -1
  105. package/dist/analysis/load.js +5 -5
  106. package/dist/analysis/provider.d.ts +9 -1
  107. package/dist/analysis/restricted-codex.d.ts +2 -0
  108. package/dist/analysis/restricted-codex.js +10 -1
  109. package/dist/analysis/service.d.ts +2 -0
  110. package/dist/analysis/service.js +35 -16
  111. package/dist/analysis/sharing.d.ts +2 -2
  112. package/dist/analysis/sharing.js +5 -5
  113. package/dist/analysis/store-executions.d.ts +5 -5
  114. package/dist/analysis/store-executions.js +12 -12
  115. package/dist/analysis/store.d.ts +4 -4
  116. package/dist/analysis/store.js +13 -13
  117. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  118. package/dist/cli/commands/analysis-signals.js +4 -1
  119. package/dist/cli/commands/analyze.js +23 -18
  120. package/dist/cli/commands/codex.js +9 -9
  121. package/dist/cli/commands/comms.js +62 -34
  122. package/dist/cli/commands/feedback.js +20 -21
  123. package/dist/cli/commands/lab-format.d.ts +5 -4
  124. package/dist/cli/commands/lab-format.js +35 -23
  125. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  126. package/dist/cli/commands/lab-route-computer-use.js +32 -21
  127. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  128. package/dist/cli/commands/lab-route-preview.js +7 -7
  129. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  130. package/dist/cli/commands/lab-route-run.js +6 -2
  131. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  132. package/dist/cli/commands/lab-route-scripted.js +0 -1
  133. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  134. package/dist/cli/commands/lab-route-shared-world.js +3 -4
  135. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  136. package/dist/cli/commands/lab-route-terminal.js +0 -1
  137. package/dist/cli/commands/lab-run.js +84 -54
  138. package/dist/cli/commands/lab-scorer.d.ts +2 -4
  139. package/dist/cli/commands/lab-scorer.js +1 -1
  140. package/dist/cli/commands/migrate.d.ts +4 -0
  141. package/dist/cli/commands/migrate.js +65 -0
  142. package/dist/cli/commands/observe.js +168 -107
  143. package/dist/cli/commands/run-command.d.ts +10 -0
  144. package/dist/cli/commands/run-command.js +85 -0
  145. package/dist/cli/commands/run-signals.d.ts +30 -0
  146. package/dist/cli/commands/run-signals.js +146 -0
  147. package/dist/cli/commands/runs.js +137 -136
  148. package/dist/cli/commands/setup.d.ts +2 -2
  149. package/dist/cli/commands/setup.js +26 -21
  150. package/dist/cli/commands/study.d.ts +3 -0
  151. package/dist/cli/commands/study.js +182 -0
  152. package/dist/cli/commands/tui.d.ts +4 -4
  153. package/dist/cli/commands/tui.js +21 -21
  154. package/dist/cli/commands/watch.js +64 -77
  155. package/dist/cli/deprecations.d.ts +18 -0
  156. package/dist/cli/deprecations.js +48 -0
  157. package/dist/cli/doctor.d.ts +18 -5
  158. package/dist/cli/doctor.js +111 -48
  159. package/dist/cli/first-run-path.d.ts +12 -10
  160. package/dist/cli/first-run-path.js +30 -28
  161. package/dist/cli/io.d.ts +46 -10
  162. package/dist/cli/io.js +109 -30
  163. package/dist/cli/observer-follow.d.ts +2 -2
  164. package/dist/cli/observer-follow.js +5 -6
  165. package/dist/cli/orientation.d.ts +6 -3
  166. package/dist/cli/orientation.js +43 -39
  167. package/dist/cli/product-sentence.d.ts +6 -0
  168. package/dist/cli/product-sentence.js +6 -0
  169. package/dist/cli/program.d.ts +6 -1
  170. package/dist/cli/program.js +112 -43
  171. package/dist/cli/telemetry.d.ts +17 -17
  172. package/dist/cli/telemetry.js +49 -41
  173. package/dist/cli.js +1 -1
  174. package/dist/comms/capture-surface.d.ts +14 -13
  175. package/dist/comms/capture-surface.js +23 -22
  176. package/dist/comms/catch-host.d.ts +8 -8
  177. package/dist/comms/catch-host.js +14 -14
  178. package/dist/comms/connections.js +4 -4
  179. package/dist/comms/email-catch.d.ts +3 -3
  180. package/dist/comms/email-catch.js +8 -8
  181. package/dist/comms/external-evidence.d.ts +27 -0
  182. package/dist/comms/external-evidence.js +93 -0
  183. package/dist/comms/extract.js +2 -2
  184. package/dist/comms/fake-inbox.d.ts +2 -2
  185. package/dist/comms/fake-inbox.js +2 -2
  186. package/dist/comms/lease-store.js +7 -7
  187. package/dist/comms/receiving-render.d.ts +1 -1
  188. package/dist/comms/receiving-render.js +2 -2
  189. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  190. package/dist/comms/sandbox-catch-script.js +6 -6
  191. package/dist/comms/sandbox-catch.d.ts +36 -37
  192. package/dist/comms/sandbox-catch.js +34 -35
  193. package/dist/comms/setup.js +42 -8
  194. package/dist/comms/thread-evidence.d.ts +1 -1
  195. package/dist/comms/thread-evidence.js +6 -6
  196. package/dist/comms/types.d.ts +6 -6
  197. package/dist/comms/types.js +4 -4
  198. package/dist/evidence/browser-hygiene.d.ts +1 -1
  199. package/dist/evidence/browser-hygiene.js +1 -1
  200. package/dist/evidence/frame-signature.d.ts +1 -1
  201. package/dist/evidence/frame-signature.js +4 -4
  202. package/dist/evidence/redaction.d.ts +3 -3
  203. package/dist/evidence/redaction.js +5 -5
  204. package/dist/evidence/secret-scrub.d.ts +9 -0
  205. package/dist/evidence/secret-scrub.js +96 -0
  206. package/dist/feedback/draft.js +41 -85
  207. package/dist/feedback/export-bundle.js +5 -5
  208. package/dist/feedback/export.d.ts +5 -1
  209. package/dist/feedback/export.js +16 -17
  210. package/dist/feedback/feedback.d.ts +3 -3
  211. package/dist/feedback/feedback.js +21 -3
  212. package/dist/guest/chromium-text.js +2 -2
  213. package/dist/guest/desktop-native.d.ts +1 -1
  214. package/dist/guest/runtime.js +1 -1
  215. package/dist/index.d.ts +14 -15
  216. package/dist/index.js +10 -11
  217. package/dist/keys/key-resolution.d.ts +7 -5
  218. package/dist/keys/key-resolution.js +40 -38
  219. package/dist/lab/adapter-extension.d.ts +35 -13
  220. package/dist/lab/adapter-extension.js +50 -134
  221. package/dist/lab/adapter-scorer-loader.d.ts +32 -12
  222. package/dist/lab/adapter-scorer-loader.js +56 -32
  223. package/dist/lab/composition-rules.js +58 -58
  224. package/dist/lab/config.js +85 -43
  225. package/dist/lab/deprecated-fields.d.ts +10 -0
  226. package/dist/lab/deprecated-fields.js +24 -0
  227. package/dist/lab/device-presets.d.ts +10 -10
  228. package/dist/lab/device-presets.js +11 -11
  229. package/dist/lab/discover.d.ts +13 -9
  230. package/dist/lab/discover.js +118 -60
  231. package/dist/lab/doctor.d.ts +53 -11
  232. package/dist/lab/doctor.js +193 -47
  233. package/dist/lab/init-plan.js +1 -3
  234. package/dist/lab/init-templates.js +147 -147
  235. package/dist/lab/init.d.ts +1 -1
  236. package/dist/lab/init.js +41 -9
  237. package/dist/lab/keys.d.ts +2 -0
  238. package/dist/lab/keys.js +43 -9
  239. package/dist/lab/lab-deps.d.ts +80 -0
  240. package/dist/lab/lab-deps.js +4 -0
  241. package/dist/lab/parse/actors.js +17 -16
  242. package/dist/lab/parse/comms.js +8 -7
  243. package/dist/lab/parse/execution.js +15 -14
  244. package/dist/lab/parse/study-v3.d.ts +23 -0
  245. package/dist/lab/parse/study-v3.js +259 -0
  246. package/dist/lab/parse/subject-state.d.ts +7 -7
  247. package/dist/lab/parse/subject-state.js +18 -17
  248. package/dist/lab/parse/subject.js +30 -29
  249. package/dist/lab/parse/values.d.ts +1 -2
  250. package/dist/lab/parse/values.js +3 -6
  251. package/dist/lab/persona-resolve.d.ts +7 -7
  252. package/dist/lab/persona-resolve.js +8 -8
  253. package/dist/lab/persona.js +1 -3
  254. package/dist/lab/plan-base.d.ts +0 -2
  255. package/dist/lab/plan-base.js +6 -4
  256. package/dist/lab/plan-participants.d.ts +7 -7
  257. package/dist/lab/plan-participants.js +2 -2
  258. package/dist/lab/plan-types.d.ts +26 -8
  259. package/dist/lab/plan.d.ts +4 -18
  260. package/dist/lab/plan.js +24 -79
  261. package/dist/lab/preflight-probes.js +11 -11
  262. package/dist/lab/preflight-result.d.ts +2 -1
  263. package/dist/lab/preflight-result.js +5 -6
  264. package/dist/lab/preflight.d.ts +7 -8
  265. package/dist/lab/preflight.js +6 -6
  266. package/dist/lab/requirements.d.ts +20 -0
  267. package/dist/lab/requirements.js +54 -0
  268. package/dist/lab/route-inputs.d.ts +23 -12
  269. package/dist/lab/route-inputs.js +48 -51
  270. package/dist/lab/routing.d.ts +42 -41
  271. package/dist/lab/routing.js +66 -68
  272. package/dist/lab/run-lab-events.d.ts +3 -11
  273. package/dist/lab/run-lab-events.js +2 -16
  274. package/dist/lab/run-lab-homes.d.ts +76 -0
  275. package/dist/lab/run-lab-homes.js +7 -0
  276. package/dist/lab/run-lab-options.d.ts +12 -66
  277. package/dist/lab/run-lab-options.js +58 -285
  278. package/dist/lab/summary.d.ts +15 -9
  279. package/dist/lab/summary.js +24 -17
  280. package/dist/lab/tasks.d.ts +15 -15
  281. package/dist/lab/tasks.js +14 -14
  282. package/dist/lab/types.d.ts +201 -195
  283. package/dist/lab/types.js +2 -0
  284. package/dist/lab/validation.d.ts +21 -21
  285. package/dist/lab/validation.js +61 -59
  286. package/dist/lab/warnings.d.ts +10 -0
  287. package/dist/lab/warnings.js +70 -41
  288. package/dist/library-aliases.d.ts +56 -0
  289. package/dist/library-aliases.js +22 -0
  290. package/dist/observer/artifact.d.ts +2 -2
  291. package/dist/observer/artifact.js +9 -9
  292. package/dist/observer/data.d.ts +6 -6
  293. package/dist/observer/data.js +7 -6
  294. package/dist/observer/exposure.d.ts +1 -1
  295. package/dist/observer/exposure.js +11 -11
  296. package/dist/observer/http.js +1 -1
  297. package/dist/observer/library.d.ts +1 -1
  298. package/dist/observer/library.js +4 -2
  299. package/dist/observer/listen.js +5 -4
  300. package/dist/observer/render.d.ts +1 -1
  301. package/dist/observer/render.js +12 -7
  302. package/dist/observer/run-routes.d.ts +4 -4
  303. package/dist/observer/run-routes.js +6 -6
  304. package/dist/observer/serve.d.ts +17 -0
  305. package/dist/observer/serve.js +41 -6
  306. package/dist/observer/tunnel.js +1 -1
  307. package/dist/observer-app.html +4 -4
  308. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  309. package/dist/routes/computer-use/bundle-parts.js +24 -17
  310. package/dist/routes/computer-use/bundle.d.ts +4 -11
  311. package/dist/routes/computer-use/bundle.js +12 -18
  312. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  313. package/dist/routes/computer-use/diagnostics.js +1 -1
  314. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
  315. package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
  316. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  317. package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
  318. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
  319. package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
  320. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  321. package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
  322. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  323. package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
  324. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  325. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  326. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  327. package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
  328. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  329. package/dist/routes/computer-use/external-comms.js +19 -43
  330. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  331. package/dist/routes/computer-use/fanout-bundle.js +38 -42
  332. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
  333. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  334. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  335. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  336. package/dist/routes/computer-use/live-flush.js +20 -28
  337. package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
  338. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
  339. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  340. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  341. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  342. package/dist/routes/computer-use/local-vm.js +40 -67
  343. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  344. package/dist/routes/computer-use/participant-desktop.js +5 -25
  345. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
  346. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
  347. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  348. package/dist/routes/computer-use/participant-facts.js +12 -1
  349. package/dist/routes/computer-use/participant-model.d.ts +25 -11
  350. package/dist/routes/computer-use/participant-model.js +76 -34
  351. package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
  352. package/dist/routes/computer-use/participant-prompt.js +8 -8
  353. package/dist/routes/computer-use/participant-runs.d.ts +11 -11
  354. package/dist/routes/computer-use/participant-runs.js +18 -18
  355. package/dist/routes/computer-use/plan.d.ts +21 -29
  356. package/dist/routes/computer-use/plan.js +70 -78
  357. package/dist/routes/computer-use/preflight.d.ts +3 -5
  358. package/dist/routes/computer-use/preflight.js +40 -36
  359. package/dist/routes/computer-use/rerun-selection.js +11 -7
  360. package/dist/routes/computer-use/result.d.ts +1 -1
  361. package/dist/routes/computer-use/result.js +48 -38
  362. package/dist/routes/computer-use/route.d.ts +5 -5
  363. package/dist/routes/computer-use/route.js +36 -33
  364. package/dist/routes/computer-use/self-report.d.ts +8 -8
  365. package/dist/routes/computer-use/self-report.js +33 -33
  366. package/dist/routes/computer-use/setup.d.ts +9 -15
  367. package/dist/routes/computer-use/setup.js +106 -83
  368. package/dist/routes/computer-use/single-bundle.d.ts +13 -16
  369. package/dist/routes/computer-use/single-bundle.js +46 -53
  370. package/dist/routes/computer-use/subject-projection.d.ts +6 -8
  371. package/dist/routes/computer-use/subject-projection.js +24 -23
  372. package/dist/routes/computer-use/types.d.ts +195 -238
  373. package/dist/routes/computer-use/types.js +21 -13
  374. package/dist/routes/preview.d.ts +8 -2
  375. package/dist/routes/preview.js +8 -5
  376. package/dist/routes/scripted/bundle.d.ts +5 -8
  377. package/dist/routes/scripted/bundle.js +23 -27
  378. package/dist/routes/scripted/plan.d.ts +6 -8
  379. package/dist/routes/scripted/plan.js +15 -13
  380. package/dist/routes/scripted/result.d.ts +4 -1
  381. package/dist/routes/scripted/result.js +15 -11
  382. package/dist/routes/scripted/route.js +15 -17
  383. package/dist/routes/scripted/scenario.d.ts +1 -1
  384. package/dist/routes/scripted/scenario.js +3 -3
  385. package/dist/routes/scripted/setup.d.ts +3 -2
  386. package/dist/routes/scripted/setup.js +27 -26
  387. package/dist/routes/scripted/subject.d.ts +8 -3
  388. package/dist/routes/scripted/subject.js +10 -6
  389. package/dist/routes/scripted/surface-records.js +4 -4
  390. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  391. package/dist/routes/scripted/surface-sessions.js +4 -4
  392. package/dist/routes/scripted/types.d.ts +21 -40
  393. package/dist/routes/scripted/types.js +2 -3
  394. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
  395. package/dist/routes/shared-world/bundle.d.ts +7 -7
  396. package/dist/routes/shared-world/bundle.js +60 -62
  397. package/dist/routes/shared-world/checkpoints.d.ts +5 -5
  398. package/dist/routes/shared-world/checkpoints.js +5 -5
  399. package/dist/routes/shared-world/comms.d.ts +8 -7
  400. package/dist/routes/shared-world/comms.js +38 -51
  401. package/dist/routes/shared-world/external-public.d.ts +6 -5
  402. package/dist/routes/shared-world/external-public.js +28 -25
  403. package/dist/routes/shared-world/handoff.d.ts +10 -9
  404. package/dist/routes/shared-world/handoff.js +89 -81
  405. package/dist/routes/shared-world/lobby-code.d.ts +7 -7
  406. package/dist/routes/shared-world/lobby-code.js +22 -22
  407. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
  408. package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
  409. package/dist/routes/shared-world/plan.d.ts +2 -6
  410. package/dist/routes/shared-world/plan.js +8 -9
  411. package/dist/routes/shared-world/provenance.d.ts +4 -4
  412. package/dist/routes/shared-world/provenance.js +4 -4
  413. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  414. package/dist/routes/shared-world/provisioned.js +55 -48
  415. package/dist/routes/shared-world/result.js +47 -36
  416. package/dist/routes/shared-world/route.js +54 -57
  417. package/dist/routes/shared-world/setup.d.ts +6 -5
  418. package/dist/routes/shared-world/setup.js +16 -18
  419. package/dist/routes/shared-world/types.d.ts +70 -141
  420. package/dist/routes/shared-world/types.js +5 -5
  421. package/dist/routes/terminal/adapter.d.ts +10 -10
  422. package/dist/routes/terminal/adapter.js +32 -129
  423. package/dist/routes/terminal/bundle.d.ts +10 -15
  424. package/dist/routes/terminal/bundle.js +43 -52
  425. package/dist/routes/terminal/credentials.d.ts +4 -4
  426. package/dist/routes/terminal/credentials.js +20 -20
  427. package/dist/routes/terminal/dry-run.d.ts +1 -1
  428. package/dist/routes/terminal/dry-run.js +13 -15
  429. package/dist/routes/terminal/encoding.d.ts +1 -1
  430. package/dist/routes/terminal/encoding.js +4 -4
  431. package/dist/routes/terminal/ledger.d.ts +8 -8
  432. package/dist/routes/terminal/ledger.js +22 -22
  433. package/dist/routes/terminal/live-finish.d.ts +1 -2
  434. package/dist/routes/terminal/live-finish.js +24 -23
  435. package/dist/routes/terminal/live-sandbox.d.ts +3 -2
  436. package/dist/routes/terminal/live-sandbox.js +31 -32
  437. package/dist/routes/terminal/participant-text.d.ts +23 -0
  438. package/dist/routes/terminal/participant-text.js +165 -0
  439. package/dist/routes/terminal/persona.js +1 -1
  440. package/dist/routes/terminal/plan.d.ts +2 -6
  441. package/dist/routes/terminal/plan.js +23 -19
  442. package/dist/routes/terminal/recorder.d.ts +6 -1
  443. package/dist/routes/terminal/recorder.js +12 -4
  444. package/dist/routes/terminal/result.js +12 -12
  445. package/dist/routes/terminal/route.js +30 -31
  446. package/dist/routes/terminal/runtime.d.ts +3 -2
  447. package/dist/routes/terminal/runtime.js +3 -3
  448. package/dist/routes/terminal/sandbox.d.ts +4 -4
  449. package/dist/routes/terminal/sandbox.js +10 -10
  450. package/dist/routes/terminal/session.js +22 -19
  451. package/dist/routes/terminal/token-usage.d.ts +1 -1
  452. package/dist/routes/terminal/token-usage.js +10 -11
  453. package/dist/routes/terminal/trace.d.ts +7 -10
  454. package/dist/routes/terminal/trace.js +11 -66
  455. package/dist/routes/terminal/types.d.ts +104 -114
  456. package/dist/routes/terminal/types.js +12 -7
  457. package/dist/run/active-runs.d.ts +13 -0
  458. package/dist/run/active-runs.js +12 -0
  459. package/dist/run/bundle-shape.d.ts +2 -1
  460. package/dist/run/bundle-shape.js +7 -7
  461. package/dist/run/bundle.d.ts +99 -92
  462. package/dist/run/bundle.js +10 -8
  463. package/dist/run/cost-summary.js +6 -5
  464. package/dist/run/costs.d.ts +6 -6
  465. package/dist/run/costs.js +17 -11
  466. package/dist/run/detail.d.ts +9 -9
  467. package/dist/run/detail.js +10 -10
  468. package/dist/run/dry-run-inputs.js +1 -1
  469. package/dist/run/dry-run.js +23 -30
  470. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  471. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  472. package/dist/run/feedback-shape.js +1 -1
  473. package/dist/run/judge.d.ts +34 -16
  474. package/dist/run/judge.js +41 -14
  475. package/dist/run/locate.d.ts +2 -0
  476. package/dist/run/locate.js +3 -1
  477. package/dist/run/outcomes.d.ts +3 -3
  478. package/dist/run/outcomes.js +3 -3
  479. package/dist/run/participant-records.d.ts +2 -2
  480. package/dist/run/participant-records.js +2 -2
  481. package/dist/run/paths.d.ts +1 -1
  482. package/dist/run/paths.js +2 -2
  483. package/dist/run/pricing.d.ts +30 -15
  484. package/dist/run/pricing.js +49 -30
  485. package/dist/run/projection.d.ts +27 -27
  486. package/dist/run/projection.js +23 -23
  487. package/dist/run/reclaim.d.ts +6 -0
  488. package/dist/run/reclaim.js +15 -5
  489. package/dist/run/results.d.ts +5 -5
  490. package/dist/run/run-index.d.ts +9 -7
  491. package/dist/run/run-index.js +24 -25
  492. package/dist/run/run-not-found.d.ts +5 -0
  493. package/dist/run/run-not-found.js +15 -0
  494. package/dist/run/run.d.ts +7 -4
  495. package/dist/run/run.js +10 -6
  496. package/dist/run/sandbox-receipts.d.ts +5 -5
  497. package/dist/run/sandbox-receipts.js +6 -6
  498. package/dist/run/shared-world-evidence.d.ts +67 -66
  499. package/dist/run/shared-world-evidence.js +4 -4
  500. package/dist/run/shared-world-shape.d.ts +3 -3
  501. package/dist/run/shared-world-shape.js +16 -16
  502. package/dist/run/stats.d.ts +17 -11
  503. package/dist/run/stats.js +124 -66
  504. package/dist/run/status.d.ts +21 -32
  505. package/dist/run/status.js +34 -33
  506. package/dist/run/stored-runs.js +2 -1
  507. package/dist/run/stream-shape.js +1 -1
  508. package/dist/run/streams.d.ts +29 -22
  509. package/dist/run/study-provenance.d.ts +47 -0
  510. package/dist/run/study-provenance.js +63 -0
  511. package/dist/run/study-result.d.ts +16 -0
  512. package/dist/run/study-result.js +9 -0
  513. package/dist/run/terminal-contract.d.ts +5 -5
  514. package/dist/run/terminal-contract.js +4 -4
  515. package/dist/run/text.d.ts +2 -0
  516. package/dist/run/text.js +4 -0
  517. package/dist/run/transient-comms-secrets.d.ts +5 -0
  518. package/dist/run/transient-comms-secrets.js +12 -0
  519. package/dist/run-lab.d.ts +40 -38
  520. package/dist/run-lab.js +42 -40
  521. package/dist/study/convert.d.ts +33 -0
  522. package/dist/study/convert.js +432 -0
  523. package/dist/study/field-paths.d.ts +12 -0
  524. package/dist/study/field-paths.js +126 -0
  525. package/dist/study/files.d.ts +26 -0
  526. package/dist/study/files.js +43 -0
  527. package/dist/study/migrate.d.ts +48 -0
  528. package/dist/study/migrate.js +408 -0
  529. package/dist/study/owned-files.d.ts +38 -0
  530. package/dist/study/owned-files.js +182 -0
  531. package/dist/subject/clone.d.ts +1 -1
  532. package/dist/subject/desktop-cli.d.ts +2 -2
  533. package/dist/subject/desktop-cli.js +3 -3
  534. package/dist/subject/local-tree-archive.d.ts +1 -1
  535. package/dist/subject/local-tree-archive.js +5 -5
  536. package/dist/subject/local-tree.d.ts +3 -3
  537. package/dist/subject/local-tree.js +1 -1
  538. package/dist/subject/node-bootstrap.d.ts +1 -1
  539. package/dist/subject/node-bootstrap.js +4 -4
  540. package/dist/subject/runtime.js +10 -11
  541. package/dist/subject/serve.d.ts +1 -1
  542. package/dist/subject/serve.js +4 -4
  543. package/dist/subject/state.d.ts +1 -1
  544. package/dist/subject/steps.d.ts +8 -8
  545. package/dist/subject/steps.js +7 -7
  546. package/dist/substrates/command-failure.d.ts +3 -3
  547. package/dist/substrates/command-failure.js +3 -3
  548. package/dist/substrates/detached.d.ts +6 -6
  549. package/dist/substrates/detached.js +7 -7
  550. package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
  551. package/dist/substrates/e2b/cdp-probe.js +15 -18
  552. package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
  553. package/dist/substrates/e2b/desktop-browser.js +12 -12
  554. package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
  555. package/dist/substrates/e2b/desktop-cdp.js +11 -11
  556. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  557. package/dist/substrates/e2b/desktop-executor.js +1 -1
  558. package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
  559. package/dist/substrates/e2b/desktop-geometry.js +9 -9
  560. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  561. package/dist/substrates/e2b/desktop-media.js +3 -3
  562. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  563. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  564. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  565. package/dist/substrates/e2b/sandbox.js +2 -2
  566. package/dist/substrates/e2b/sdk.d.ts +11 -11
  567. package/dist/substrates/e2b/sdk.js +8 -8
  568. package/dist/substrates/local/runtime-host.d.ts +2 -0
  569. package/dist/substrates/local/runtime-host.js +6 -0
  570. package/dist/tui/actions.d.ts +8 -6
  571. package/dist/tui/actions.js +31 -22
  572. package/dist/tui/contract.d.ts +16 -16
  573. package/dist/tui/contract.js +10 -10
  574. package/dist/tui/launch.d.ts +4 -4
  575. package/dist/tui/launch.js +18 -19
  576. package/dist/tui/project.js +5 -5
  577. package/dist/tui-app.js +83 -83
  578. package/dist/verify/actor.d.ts +14 -14
  579. package/dist/verify/actor.js +45 -45
  580. package/dist/verify/artifacts.d.ts +3 -3
  581. package/dist/verify/artifacts.js +6 -6
  582. package/dist/verify/context-growth.d.ts +9 -0
  583. package/dist/verify/context-growth.js +62 -0
  584. package/dist/verify/costs.d.ts +7 -7
  585. package/dist/verify/costs.js +9 -9
  586. package/dist/verify/liveness.d.ts +1 -1
  587. package/dist/verify/liveness.js +4 -1
  588. package/dist/verify/rerun.d.ts +1 -1
  589. package/dist/verify/rerun.js +1 -1
  590. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  591. package/dist/verify/shared-world-concurrent.js +79 -76
  592. package/dist/verify/shared-world.d.ts +2 -2
  593. package/dist/verify/shared-world.js +18 -18
  594. package/dist/verify/subject.d.ts +4 -4
  595. package/dist/verify/subject.js +18 -18
  596. package/dist/verify/verify.js +98 -49
  597. package/docs/README.md +26 -33
  598. package/docs/architecture/actor-contract.md +105 -98
  599. package/docs/architecture/desktop-sessions.md +14 -14
  600. package/docs/architecture/external-public-shared-world.md +66 -59
  601. package/docs/architecture/github-feedback-loop.md +1 -4
  602. package/docs/architecture/guest-desktop.md +2 -2
  603. package/docs/architecture/observer.md +37 -37
  604. package/docs/architecture/restricted-codex-analysis.md +70 -30
  605. package/docs/architecture/serve.md +34 -37
  606. package/docs/architecture/state-driven-executor.md +55 -59
  607. package/docs/architecture/task-protocol-support.md +7 -9
  608. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
  609. package/docs/contracts/README.md +24 -0
  610. package/docs/contracts/adapter-admission.md +3 -3
  611. package/docs/contracts/adapter-fixtures.md +2 -5
  612. package/docs/contracts/core.md +1 -3
  613. package/docs/contracts/errors.md +62 -0
  614. package/docs/contracts/feedback.md +8 -9
  615. package/docs/contracts/policy.md +7 -12
  616. package/docs/contracts/run-bundle.md +54 -51
  617. package/docs/contracts/schemas.md +505 -390
  618. package/docs/contracts/study-analysis.md +26 -2
  619. package/docs/contracts/study-costs.md +11 -7
  620. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  621. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  622. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  623. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  624. package/docs/principles/actor-fidelity.md +4 -4
  625. package/docs/principles/engineering.md +3 -3
  626. package/docs/principles/invariants-and-defaults.md +38 -38
  627. package/docs/principles/self-driving-harness.md +1 -5
  628. package/docs/principles/three-roles.md +1 -1
  629. package/docs/product/automatic-analysis.md +8 -7
  630. package/examples/participant/README.md +5 -5
  631. package/examples/participant/run.mjs +11 -10
  632. package/examples/scorer/README.md +3 -3
  633. package/examples/scorer/run.mjs +11 -12
  634. package/package.json +16 -17
  635. package/skills/humanish/SKILL.md +63 -60
  636. package/skills/humanish/agents/openai.yaml +1 -1
  637. package/AGENTS.md +0 -99
  638. package/CONTRIBUTING.md +0 -148
  639. package/dist/actors/codex/qualified-versions.d.ts +0 -45
  640. package/dist/actors/codex/qualified-versions.js +0 -87
  641. package/dist/cli/commands/lab.d.ts +0 -3
  642. package/dist/cli/commands/lab.js +0 -193
  643. package/dist/deprecated.d.ts +0 -90
  644. package/dist/deprecated.js +0 -106
  645. package/dist/lab/bag-overrides.d.ts +0 -18
  646. package/dist/lab/bag-overrides.js +0 -121
  647. package/dist/observer/static.d.ts +0 -39
  648. package/dist/observer/static.js +0 -369
  649. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  650. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  651. package/docs/architecture/comms-inbox.md +0 -122
  652. package/docs/architecture/desktop-recording.md +0 -80
  653. package/docs/architecture/local-browser-runtime.md +0 -178
  654. package/docs/architecture/observer-review.md +0 -144
  655. package/docs/architecture/participant-media.md +0 -90
  656. package/docs/architecture/project-layout.md +0 -62
  657. package/docs/architecture/real-email-receiving.md +0 -136
  658. package/docs/assets/humanish-drawdb-hero.png +0 -0
  659. package/docs/assets/humanish-observer-hero.png +0 -0
  660. package/docs/goals/current.md +0 -207
  661. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  662. package/docs/product/open-source-install-experience.md +0 -240
  663. package/docs/ramp/README.md +0 -294
  664. package/docs/release/open-source-readiness.md +0 -222
  665. package/docs/release/public-readiness-standard.md +0 -210
  666. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  667. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  668. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -12,13 +12,14 @@ const scriptedRoute = (routes) => !promptRoute(routes) && routes.scripted;
12
12
  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
- // Shared-world ONLY fields on the roster: per-role `entry` is inert anywhere else (invariant 6).
15
+ // Shared-world-only fields on the roster: a participant's `entry` is inert anywhere else
16
+ // (claims match mechanism).
16
17
  {
17
18
  field: "lanes[].entry",
18
- reason: "the per-role loopback entry is a shared-world capability; needs subject.topology: shared-world",
19
+ reason: "the per-participant loopback entry is a shared-world capability; needs subject.topology: shared-world",
19
20
  applies: (actor, routes) => Boolean(rosterOf(actor)?.some((entry) => entry.entry !== undefined)) && !routes.shared,
20
21
  },
21
- // 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.
22
23
  {
23
24
  field: "lanes[].host",
24
25
  reason: "the designated host-participant marker; needs the external-public shared-world route: app-url × topology shared-world × allowPublicTargets",
@@ -34,7 +35,7 @@ const ACTOR_ROWS = [
34
35
  },
35
36
  {
36
37
  field: "lanes",
37
- 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",
38
39
  applies: (actor, routes) => routes.terminal && Boolean(rosterOf(actor)),
39
40
  },
40
41
  {
@@ -57,7 +58,7 @@ const ACTOR_ROWS = [
57
58
  reason: "the scripted-browser route fans out via actors[0].count, not an actors[0].lanes roster",
58
59
  applies: (actor, routes) => scriptedRoute(routes) && Boolean(rosterOf(actor)),
59
60
  },
60
- // On every other route the prompt fields, persona and the lane roster are inert.
61
+ // On every other route the prompt fields, persona and the `lanes[]` roster are inert.
61
62
  { field: "mission", applies: (actor, routes) => otherRoute(routes) && Boolean(actor.mission) },
62
63
  {
63
64
  field: "laneFocus",
@@ -68,7 +69,7 @@ const ACTOR_ROWS = [
68
69
  { field: "lanes", applies: (actor, routes) => otherRoute(routes) && Boolean(rosterOf(actor)) },
69
70
  ];
70
71
  const TERMINAL_ONLY = "needs subject.source: terminal-product + a registered terminal actor";
71
- const RESERVED = "reserved for a later slice; not yet consumed";
72
+ const RESERVED = "reserved; no route reads it yet";
72
73
  /** Rows for the rest of the config, reported after the actor rows, in this order. */
73
74
  const CONFIG_ROWS = [
74
75
  // The computer-use routes consume (clone) subject.{serve,env,state,clone.depth}, and so does the
@@ -89,8 +90,9 @@ const CONFIG_ROWS = [
89
90
  field: "subject.state",
90
91
  applies: (config, routes) => Boolean(config.subject.state) && !routes.cua && !routes.scripted,
91
92
  },
92
- // topology + checkpoint act ONLY on the shared-world route (#164); a set-but-unconsumed value
93
- // (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.
94
96
  {
95
97
  field: "subject.topology",
96
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",
@@ -101,29 +103,29 @@ const CONFIG_ROWS = [
101
103
  reason: "the shared-world state-checkpoint probe; needs subject.topology: shared-world",
102
104
  applies: (config, routes) => config.subject.state?.checkpoint !== undefined && !routes.shared,
103
105
  },
104
- // publicTarget (the external-public ownership attestation) acts ONLY on the external-public
106
+ // publicTarget (the external-public ownership attestation) acts only on the external-public
105
107
  // shared-world route; inert elsewhere. (It is already parse-rejected on non-app-url sources.)
106
108
  {
107
109
  field: "subject.publicTarget",
108
110
  reason: "the external-public ownership attestation; needs the external-public shared-world route: app-url × topology shared-world × allowPublicTargets",
109
111
  applies: (config, routes) => config.subject.publicTarget !== undefined && !routes.externalPublic,
110
112
  },
111
- // exposure (the synthetic-subject attestation) acts ONLY on the shared-world route (the
113
+ // exposure (the synthetic-subject attestation) acts only on the shared-world route (the
112
114
  // getHost-exposed plane) and on scripted clones; inert elsewhere.
113
115
  {
114
116
  field: "subject.exposure",
115
- 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",
116
118
  applies: (config, routes) => config.subject.exposure !== undefined &&
117
119
  !routes.shared &&
118
120
  !(routes.scripted && config.subject.source === "clone"),
119
121
  },
120
- // comms.email drives the in-sandbox email/SMS catch, which needs a subject sandbox HUMANISH
122
+ // comms.email drives the in-sandbox email/SMS catch, which needs a subject sandbox that humanish
121
123
  // provisions (clone or local-tree) so it holds a handle to host the catch. On an app-url /
122
124
  // operator-provided subject there is no such handle, so a declared comms block would silently
123
- // 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).
124
126
  {
125
127
  field: "comms.email",
126
- 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",
127
129
  applies: (config) => config.comms?.email?.kind === "fake" &&
128
130
  config.comms.email.external === undefined &&
129
131
  config.subject.source !== "clone" &&
@@ -138,9 +140,9 @@ const CONFIG_ROWS = [
138
140
  applies: (config) => Boolean(config.comms?.email?.external) &&
139
141
  (config.subject.source === "clone" || config.subject.source === "local-tree"),
140
142
  },
141
- // clone.keep IS consumed on the cua route (honored on FAILURE: the sandbox is left up to debug
142
- // a failed install/boot; otherwise always killed). clone.fanout is REJECTED on the cua route
143
- // (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.
144
146
  {
145
147
  field: "execution.timeoutMs",
146
148
  applies: (config, routes) => !routes.cua &&
@@ -152,23 +154,24 @@ const CONFIG_ROWS = [
152
154
  field: "execution.completionTimeoutMs",
153
155
  applies: (config) => config.execution?.completionTimeoutMs !== undefined,
154
156
  },
155
- // execution.concurrency is CONSUMED on the cua route (it bounds in-flight fan-out lanes);
156
- // 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.
157
159
  {
158
160
  field: "execution.concurrency",
159
161
  applies: (config, routes) => config.execution?.concurrency !== undefined && !routes.cua,
160
162
  },
161
- // execution.caps is CONSUMED on the cua route (maxUsd is the fail-closed spend abort); inert
162
- // (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.
163
166
  {
164
167
  field: "execution.caps",
165
- 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",
166
169
  applies: (config, routes) => Boolean(config.execution?.caps) && !routes.cua,
167
170
  },
168
171
  // terminal-product consumes subject.product, scenario.caps, execution.{terminal,runtimeAuth}:
169
172
  // dry-run records the contract; live execution enforces caps and command-scoped auth. On every
170
- // OTHER route they are inert and must warn so a
171
- // misplaced safety/budget field is never trusted to do something it cannot (invariant 6).
173
+ // other route they are inert and must warn so a
174
+ // misplaced safety/budget field is never trusted to do something it cannot.
172
175
  {
173
176
  field: "subject.product",
174
177
  reason: "needs subject.source: terminal-product or desktop-cli with the matching actor",
@@ -227,10 +230,10 @@ const CONFIG_ROWS = [
227
230
  field: "execution.desktop.sandboxTimeoutMs",
228
231
  applies: (config, routes) => !routes.cua && config.execution?.desktop?.sandboxTimeoutMs !== undefined,
229
232
  },
230
- // execution.desktop.template (the custom E2B desktop image) is consumed ONLY where a desktop is
231
- // actually created via Sandbox.create — the e2b-desktop computer-use routes (cua/shared-world/
232
- // concurrent). It is INERT on every other route (incl. the in-process local-app cua route, which
233
- // creates no desktop): warn so an unconsumed template is never silently ignored (invariant 6).
233
+ // execution.desktop.template (the custom E2B desktop image) is consumed only where a desktop is
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.
234
237
  {
235
238
  field: "execution.desktop.template",
236
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",
@@ -243,15 +246,15 @@ const CONFIG_ROWS = [
243
246
  reason: "no current route reads it",
244
247
  applies: (config) => config.execution?.desktop?.codexAppServer !== undefined,
245
248
  },
246
- // scenario.ref is CONSUMED on the scripted-browser route (required there); forward-declared
249
+ // scenario.ref is consumed on the scripted-browser route (required there); forward-declared
247
250
  // everywhere else.
248
251
  {
249
252
  field: "scenario.ref",
250
253
  applies: (config, routes) => Boolean(config.scenario?.ref) && !routes.scripted,
251
254
  },
252
255
  { field: "scenario.inline", applies: (config) => Boolean(config.scenario?.inline) },
253
- // review.{scoring,milestones,vocabulary} stay forward-declared (reserved for #319) on every route.
254
- // 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
255
258
  // route, so it does not warn there; on the scripted-browser route the actor carries no scorer seam,
256
259
  // so a declared scorer is flagged inert (the run also fails closed at load).
257
260
  {
@@ -296,9 +299,11 @@ function rowLabel(row, prefix = "") {
296
299
  ? `${prefix}${row.field}`
297
300
  : `${prefix}${row.field} (${row.reason})`;
298
301
  }
299
- // Report fields that are present but not yet consumed by the engine, so a user never trusts a
300
- // setting that silently does nothing. Keeps the schema forward-correct AND honest.
301
- 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) {
302
307
  const routes = routesOf(config);
303
308
  const inert = [];
304
309
  for (const [index, actor] of config.actors.entries()) {
@@ -309,14 +314,38 @@ export function forwardDeclaredWarnings(config) {
309
314
  for (const row of CONFIG_ROWS)
310
315
  if (row.applies(config, routes))
311
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);
312
341
  const warnings = inert.length === 0
313
342
  ? []
314
343
  : [
315
- `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(", ")}.`,
316
345
  ];
317
- // A declared cap below the seat count is legal but loud: the roster promises N live actors and
318
- // the cap delivers waves of M. Say so up front (inspect + dry-run + run) — a green run in waves
319
- // 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.
320
349
  {
321
350
  const participantCount = rosterOf(config.actors[0])?.length ?? config.actors[0]?.count ?? 1;
322
351
  const cap = config.execution?.concurrency;
@@ -324,14 +353,14 @@ export function forwardDeclaredWarnings(config) {
324
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.`);
325
354
  }
326
355
  }
327
- // Partial email coverage is legal but loud (#351): a lane without an addressed recipient never
328
- // 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.
329
358
  if (routes.cua && config.comms?.email?.recipients) {
330
359
  const participantIds = declaredParticipantIds(config);
331
360
  const covered = new Set(addressedRecipients(config.comms.email).map((recipient) => recipient.participantId));
332
361
  const uncovered = participantIds.filter((id) => !covered.has(id));
333
362
  if (covered.size > 0 && uncovered.length > 0 && participantIds.length > 1) {
334
- 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.`);
335
364
  }
336
365
  }
337
366
  return warnings;
@@ -0,0 +1,56 @@
1
+ import { CuaAdmissionLimitError as AdmissionLimitError } from "./actors/computer-use/admission-limit.js";
2
+ import type { CuaAction as Action, CuaExecutor as Executor, CuaLoopOptions as LoopOptions, CuaLoopResult as LoopResult, CuaObservation as Observation, CuaProvider as Provider, CuaSafetyCheck as SafetyCheck, CuaTurn as Turn, CuaTurnRequest as TurnRequest } from "./actors/computer-use/loop.js";
3
+ import type { BrowserLabScoringContext as BrowserScoringContext } from "./lab/adapter-extension.js";
4
+ import { parseLabConfig as parseStudy } from "./lab/config.js";
5
+ import type { LabRoute as StudyRoute } from "./lab/routing.js";
6
+ import type { LabEvent as StudyEvent } from "./lab/run-lab-events.js";
7
+ import { type LabConfig as StudyConfig } from "./lab/types.js";
8
+ import { runPackageLab as runStudy, type LabOutcome as StudyOutcome, type LabResult as StudyResult, type RunLabOptions as RunStudyOptions } from "./run-lab.js";
9
+ /** @deprecated Use `runStudy`, the same function. 0.109 removes `runLab`. */
10
+ export declare const runLab: typeof runStudy;
11
+ /** @deprecated Use `parseStudy`, the same function. 0.109 removes `parseLabConfig`. */
12
+ export declare const parseLabConfig: typeof parseStudy;
13
+ /**
14
+ * The `humanish.lab.v2` schema id, which 0.109 stops parsing.
15
+ * @deprecated Write `STUDY_SCHEMA` (`humanish.study.v3`) files. 0.109 removes `LAB_CONFIG_SCHEMA`.
16
+ */
17
+ export declare const LAB_CONFIG_SCHEMA = "humanish.lab.v2";
18
+ /** @deprecated Use `StudyConfig`, the same type. 0.109 removes `LabConfig`. */
19
+ export type LabConfig = StudyConfig;
20
+ /** @deprecated Use `StudyEvent`, the same type. 0.109 removes `LabEvent`. */
21
+ export type LabEvent = StudyEvent;
22
+ /** @deprecated Use `StudyOutcome`, the same type. 0.109 removes `LabOutcome`. */
23
+ export type LabOutcome = StudyOutcome;
24
+ /** @deprecated Use `StudyResult`, the same type. 0.109 removes `LabResult`. */
25
+ export type LabResult<R extends StudyRoute = StudyRoute> = StudyResult<R>;
26
+ /** @deprecated Use `StudyRoute`, the same type. 0.109 removes `LabRoute`. */
27
+ export type LabRoute = StudyRoute;
28
+ /** @deprecated Use `RunStudyOptions`, the same type. 0.109 removes `RunLabOptions`. */
29
+ export type RunLabOptions = RunStudyOptions;
30
+ /** @deprecated Use `BrowserScoringContext`, the same type. 0.109 removes `BrowserLabScoringContext`. */
31
+ export type BrowserLabScoringContext = BrowserScoringContext;
32
+ /**
33
+ * @deprecated Use `ComputerUseAdmissionLimitError`, the same class, so `instanceof` matches either
34
+ * name. 0.109 removes `CuaAdmissionLimitError`.
35
+ */
36
+ export declare const CuaAdmissionLimitError: typeof AdmissionLimitError;
37
+ /** @deprecated Use `ComputerUseAdmissionLimitError`. 0.109 removes `CuaAdmissionLimitError`. */
38
+ export type CuaAdmissionLimitError = AdmissionLimitError;
39
+ /** @deprecated Use `ComputerUseAction`, the same type. 0.109 removes `CuaAction`. */
40
+ export type CuaAction = Action;
41
+ /** @deprecated Use `ComputerUseExecutor`, the same type. 0.109 removes `CuaExecutor`. */
42
+ export type CuaExecutor = Executor;
43
+ /** @deprecated Use `ComputerUseLoopOptions`, the same type. 0.109 removes `CuaLoopOptions`. */
44
+ export type CuaLoopOptions = LoopOptions;
45
+ /** @deprecated Use `ComputerUseLoopResult`, the same type. 0.109 removes `CuaLoopResult`. */
46
+ export type CuaLoopResult = LoopResult;
47
+ /** @deprecated Use `ComputerUseObservation`, the same type. 0.109 removes `CuaObservation`. */
48
+ export type CuaObservation = Observation;
49
+ /** @deprecated Use `ComputerUseProvider`, the same type. 0.109 removes `CuaProvider`. */
50
+ export type CuaProvider = Provider;
51
+ /** @deprecated Use `ComputerUseSafetyCheck`, the same type. 0.109 removes `CuaSafetyCheck`. */
52
+ export type CuaSafetyCheck = SafetyCheck;
53
+ /** @deprecated Use `ComputerUseTurn`, the same type. 0.109 removes `CuaTurn`. */
54
+ export type CuaTurn = Turn;
55
+ /** @deprecated Use `ComputerUseTurnRequest`, the same type. 0.109 removes `CuaTurnRequest`. */
56
+ export type CuaTurnRequest = TurnRequest;
@@ -0,0 +1,22 @@
1
+ // The names 0.107's library exported for running a lab and driving a computer-use participant.
2
+ // Each is the same function, constant, class or type as the name that replaces it, so an existing
3
+ // import, call or `instanceof` check keeps working, and editors mark it deprecated.
4
+ // Removed in 0.109.0: this module and its exports in src/index.ts.
5
+ import { CuaAdmissionLimitError as AdmissionLimitError } from "./actors/computer-use/admission-limit.js";
6
+ import { parseLabConfig as parseStudy } from "./lab/config.js";
7
+ import { LAB_CONFIG_SCHEMA as V2_SCHEMA } from "./lab/types.js";
8
+ import { runPackageLab as runStudy, } from "./run-lab.js";
9
+ /** @deprecated Use `runStudy`, the same function. 0.109 removes `runLab`. */
10
+ export const runLab = runStudy;
11
+ /** @deprecated Use `parseStudy`, the same function. 0.109 removes `parseLabConfig`. */
12
+ export const parseLabConfig = parseStudy;
13
+ /**
14
+ * The `humanish.lab.v2` schema id, which 0.109 stops parsing.
15
+ * @deprecated Write `STUDY_SCHEMA` (`humanish.study.v3`) files. 0.109 removes `LAB_CONFIG_SCHEMA`.
16
+ */
17
+ export const LAB_CONFIG_SCHEMA = V2_SCHEMA;
18
+ /**
19
+ * @deprecated Use `ComputerUseAdmissionLimitError`, the same class, so `instanceof` matches either
20
+ * name. 0.109 removes `CuaAdmissionLimitError`.
21
+ */
22
+ export const CuaAdmissionLimitError = AdmissionLimitError;
@@ -1,9 +1,9 @@
1
1
  import type { LoadedAnalysis } from "../analysis/types.js";
2
2
  import { type ObserverData } from "./data.js";
3
3
  /**
4
- * Resolve — and in a repo checkout, build — the Observer artifact BEFORE any run or
4
+ * Resolve (and in a repo checkout, build) the Observer artifact before any run or
5
5
  * lab work starts. A missing artifact must cost seconds at startup, never a completed
6
- * session (a live lane spends real money before the render step would have noticed).
6
+ * session (a live participant spends real money before the render step would have noticed).
7
7
  * Unconditional on purpose: the artifact is the only renderer now, so the fail-before-
8
8
  * spend property this preflight bought under the flag matters more, not less.
9
9
  */
@@ -5,15 +5,15 @@ import { execSync } from "node:child_process";
5
5
  import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync } from "node:fs";
6
6
  import path from "node:path";
7
7
  import { fileURLToPath } from "node:url";
8
- import { projectShareCheckedAnalysis, studyAnalysisSharingProblems } from "../analysis/sharing.js";
8
+ import { projectShareCheckedAnalysis, analysisSharingProblems } from "../analysis/sharing.js";
9
9
  import { withObserverEndings } from "./data.js";
10
10
  const OBSERVER_DATA_PLACEHOLDER = "__HUMANISH_OBSERVER_DATA__";
11
11
  const OBSERVER_DATA_SLOT = `<script id="observer-data" type="application/json">${OBSERVER_DATA_PLACEHOLDER}</script>`;
12
12
  let cachedObserverArtifact = null;
13
13
  /**
14
- * Resolve — and in a repo checkout, build — the Observer artifact BEFORE any run or
14
+ * Resolve (and in a repo checkout, build) the Observer artifact before any run or
15
15
  * lab work starts. A missing artifact must cost seconds at startup, never a completed
16
- * session (a live lane spends real money before the render step would have noticed).
16
+ * session (a live participant spends real money before the render step would have noticed).
17
17
  * Unconditional on purpose: the artifact is the only renderer now, so the fail-before-
18
18
  * spend property this preflight bought under the flag matters more, not less.
19
19
  */
@@ -42,7 +42,7 @@ function loadObserverArtifact() {
42
42
  // together) must not race one `vite build` output: a reader can catch the
43
43
  // artifact half-written. A mkdir lock serializes builders across processes;
44
44
  // whoever loses the race re-checks staleness and usually just reads.
45
- // The lock lives OUTSIDE dist/ (vite empties dist mid-build) and inside an
45
+ // The lock lives outside dist/ (vite empties dist mid-build) and inside an
46
46
  // ignored path so a crashed builder cannot dirty the tree.
47
47
  const lockDir = path.join(workspaceDir, "node_modules", ".observer-build-lock");
48
48
  mkdirSync(path.dirname(lockDir), { recursive: true });
@@ -50,7 +50,7 @@ function loadObserverArtifact() {
50
50
  for (;;) {
51
51
  try {
52
52
  mkdirSync(lockDir);
53
- break; // lock acquired — this process builds
53
+ break; // lock acquired: this process builds
54
54
  }
55
55
  catch {
56
56
  if (Date.now() > deadline)
@@ -71,7 +71,7 @@ function loadObserverArtifact() {
71
71
  try {
72
72
  // NODE_ENV is forced: Vite respects a preset NODE_ENV (test, development),
73
73
  // and a dev-flavored artifact embeds jsxDEV plus the builder's absolute
74
- // filesystem paths — which the run's public-safety scan then rightly rejects.
74
+ // filesystem paths, which the run's public-safety scan then rightly rejects.
75
75
  execSync("pnpm --filter humanish-observer build", {
76
76
  cwd: repoRoot,
77
77
  stdio: ["ignore", "pipe", "inherit"],
@@ -79,7 +79,7 @@ function loadObserverArtifact() {
79
79
  });
80
80
  }
81
81
  catch {
82
- throw new Error("observer workspace build failed — run `pnpm --filter humanish-observer build` for the full output.");
82
+ throw new Error("observer workspace build failed; run `pnpm --filter humanish-observer build` to see the full output.");
83
83
  }
84
84
  }
85
85
  }
@@ -169,7 +169,7 @@ function renderObserverAppHtml(data, snapshot, analysis, assets) {
169
169
  .replace(OBSERVER_DATA_SLOT, () => `<script id="observer-data" type="application/json">${escapeJsonScript(data)}</script>`)
170
170
  .replace(/<script id="study-analysis" type="application\/json">[\s\S]*?<\/script>/, () => `<script id="study-analysis" type="application/json">${escapeJsonScript(analysis)}</script>`)
171
171
  .replace("</body>", () => `${renderExportAssets(assets)}</body>`)
172
- .replace(/<title>[^<]*<\/title>/, () => `<title>humanish Observer — ${escapeHtml(data.run.runId)}</title>`);
172
+ .replace(/<title>[^<]*<\/title>/, () => `<title>humanish Observer · ${escapeHtml(data.run.runId)}</title>`);
173
173
  }
174
174
  /** Render current packaged UI around a validated/projected Observer snapshot. */
175
175
  export function renderObserverHtml(data, options = {}) {
@@ -192,7 +192,7 @@ export function renderObserverHtml(data, options = {}) {
192
192
  },
193
193
  };
194
194
  }
195
- const sharing = studyAnalysisSharingProblems(analysis);
195
+ const sharing = analysisSharingProblems(analysis);
196
196
  if (data.publicSafety && (sharing.sensitive || sharing.unverified)) {
197
197
  const share = data.publicSafety.share;
198
198
  data = {
@@ -31,18 +31,18 @@ export interface ObserverData {
31
31
  lifecycle: RunBundle["lifecycle"];
32
32
  knownGaps: string[];
33
33
  /**
34
- * What happened to the PARTICIPANTS, with the denominator attached. `status` above collapses the
34
+ * What happened to the participants, with the denominator attached. `status` above collapses the
35
35
  * run to one word for a gate; this is the study result, and it is what the person watching
36
36
  * through the glass actually wants to know. Absent on a bundle with no participants.
37
37
  *
38
- * A viewing room that shows only vivid moments manufactures certainty from n=1 — so the count
38
+ * A viewing room that shows only vivid moments manufactures certainty from n=1, so the count
39
39
  * travels with the outcome here, always (docs/principles/three-roles.md).
40
40
  */
41
41
  participants?: RunBundle["review"]["participants"];
42
42
  /** The same thing as one readable line, so a renderer cannot accidentally show a number
43
43
  * without its denominator. */
44
44
  participantsLine?: string;
45
- /** The study's per-task completion rates (#414), when the lab declared a protocol. */
45
+ /** The study's per-task completion rates, when the lab declared a protocol. */
46
46
  tasks?: RunBundle["review"]["tasks"];
47
47
  /** Pre-formatted like participantsLine, denominator on every number. */
48
48
  tasksLine?: string;
@@ -56,8 +56,8 @@ export interface ObserverData {
56
56
  };
57
57
  laneGroups: ObserverLaneGroup[];
58
58
  /**
59
- * OPTIONAL run-level cost ESTIMATE projected straight through from the bundle
60
- * (humanish.run-cost-summary.v1). Absent when the bundle carries none. The Observer LABELS every
59
+ * Optional run-level cost estimate projected straight through from the bundle
60
+ * (humanish.run-cost-summary.v1). Absent when the bundle carries none. The Observer labels every
61
61
  * figure as estimated (rates as of <asOf>) and never presents it as an authoritative charge.
62
62
  */
63
63
  cost?: RunCostSummary;
@@ -68,7 +68,7 @@ export interface ObserverData {
68
68
  publishable: false;
69
69
  note: string;
70
70
  /**
71
- * ADDITIVE + OPTIONAL (#584): the result of verification at static render or
71
+ * Additive + optional: the result of verification at static render or
72
72
  * export time. Unverified projections omit this field. The timestamp records
73
73
  * that check; it is not an assertion about subsequent file changes.
74
74
  */
@@ -1,6 +1,6 @@
1
1
  import { actorEnding } from "../actors/stop-cause.js";
2
2
  import { isCommsReceivingEvidence, receivingAnalysisContext } from "../comms/receiving-evidence.js";
3
- import { formatParticipantOutcomes, formatStudyTaskFunnel, participantOutcomeDetails, withCuaReviewProvenance, } from "../run/outcomes.js";
3
+ import { formatParticipantOutcomes, formatRunTaskFunnel, participantOutcomeDetails, withCuaReviewProvenance, } from "../run/outcomes.js";
4
4
  import { cuaGoalSource, CUA_COMPLETION_NOTE } from "../actors/goal-source.js";
5
5
  export const OBSERVER_DATA_SCHEMA = "humanish.observer-data.v1";
6
6
  /** Discard a forged or stale runtime grant before projecting persisted evidence. */
@@ -33,7 +33,7 @@ export function buildObserverData(bundle, generatedAt = new Date().toISOString()
33
33
  const sim = bundle.simulations.find((candidate) => candidate.id === stream.simId) ??
34
34
  fallbackSimulation(bundle, stream);
35
35
  // A natural session can finish its protocol while the participant explicitly reports a
36
- // blocker (#690). Match the review's typed-outcome rule without rewriting the raw trace or
36
+ // blocker. Match the review's typed-outcome rule without rewriting the raw trace or
37
37
  // guessing from prose. Never turn an active or failed harness into a participant outcome.
38
38
  const status = (stream.status === "passed" || stream.status === "complete") &&
39
39
  stream.actor?.completionReason === "goal_satisfied" &&
@@ -47,7 +47,7 @@ export function buildObserverData(bundle, generatedAt = new Date().toISOString()
47
47
  status,
48
48
  sim,
49
49
  kindLabel: kindLabel(stream.kind),
50
- statusLabel: statusLabel(status),
50
+ statusLabel: statusLabel(status, bundle.mode),
51
51
  terminalPlain: stripAnsi(stream.terminal?.tail ?? ""),
52
52
  timeline: [
53
53
  ...events.filter((event) => event.simId === sim.id || event.streamId === stream.id),
@@ -95,7 +95,7 @@ export function buildObserverData(bundle, generatedAt = new Date().toISOString()
95
95
  ? {}
96
96
  : {
97
97
  tasks: bundle.review.tasks,
98
- tasksLine: formatStudyTaskFunnel(bundle.review.tasks),
98
+ tasksLine: formatRunTaskFunnel(bundle.review.tasks),
99
99
  }),
100
100
  },
101
101
  summary: {
@@ -229,10 +229,11 @@ function kindLabel(kind) {
229
229
  return "Summary";
230
230
  }
231
231
  }
232
- function statusLabel(status) {
232
+ /** `contract_proof_only` reads "Dry run" on a dry run; a live participant with it has no result. */
233
+ function statusLabel(status, mode) {
233
234
  switch (status) {
234
235
  case "contract_proof_only":
235
- return "Contract proof";
236
+ return mode === "dry-run" ? "Dry run" : "No verdict";
236
237
  case "preparing":
237
238
  return "Preparing";
238
239
  case "queued":
@@ -47,7 +47,7 @@ export type ExposureValidation = {
47
47
  };
48
48
  };
49
49
  /** Why `watch` refuses `--safe`, on every watch path. */
50
- export declare const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready; --safe (a share_ready library filter) applies to `serve`, not `watch`. Restrict viewers with edge auth: --allow-email / --allow-domain.";
50
+ export declare const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready, so --safe (a share_ready library filter for `observe --all`) cannot apply. Restrict viewers with edge auth: --allow-email / --allow-domain.";
51
51
  export declare function validateExposure(surface: ExposureSurface, request: ExposureRequest, live?: WatchLiveContext): ExposureValidation;
52
52
  export interface ExposableServer {
53
53
  readonly port: number;
@@ -1,15 +1,15 @@
1
- // Shared fail-closed exposure validation + tunnel orchestration for BOTH `serve` (a library of
2
- // finished runs) and `watch` (one live run). Exposure auth is TUNNEL-EDGE only: humanish carries no
1
+ // Shared fail-closed exposure validation + tunnel orchestration for both `serve` (a library of
2
+ // finished runs) and `watch` (one live run). Exposure auth is tunnel-edge only: humanish carries no
3
3
  // in-process auth. Exposure is admitted only behind edge auth (ngrok --oauth google, or an operator
4
- // --public-url they secure) OR, for serve, behind --safe (share_ready runs only). A live watch run
5
- // is never share_ready (raw, unverified screenshots), so watch --expose ALWAYS requires edge auth.
4
+ // --public-url they secure) or, for serve, behind --safe (share_ready runs only). A live watch run
5
+ // is never share_ready (raw, unverified screenshots), so watch --expose always requires edge auth.
6
6
  //
7
7
  // This module is pure with respect to the fail-closed matrix (validateExposure) and thin over the
8
8
  // tunnel launcher (startExposedObserver), so the CLI just maps flags in and results out.
9
9
  import { parsePublicOrigin } from "./http.js";
10
10
  import { startNgrokTunnel } from "./tunnel.js";
11
11
  /** Why `watch` refuses `--safe`, on every watch path. */
12
- export const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready; --safe (a share_ready library filter) applies to `serve`, not `watch`. Restrict viewers with edge auth: --allow-email / --allow-domain.";
12
+ export const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready, so --safe (a share_ready library filter for `observe --all`) cannot apply. Restrict viewers with edge auth: --allow-email / --allow-domain.";
13
13
  function code(surface, suffix) {
14
14
  return `HUMANISH_${surface.toUpperCase()}_${suffix}`;
15
15
  }
@@ -70,12 +70,12 @@ export function validateExposure(surface, request, live) {
70
70
  const warnings = [];
71
71
  if (surface === "watch") {
72
72
  // A live, in-progress run is never share_ready (raw screenshots, unverified), so --safe would
73
- // admit nothing and expose nothing: watch --expose ALWAYS requires edge auth, and the live-follow
73
+ // admit nothing and expose nothing: watch --expose always requires edge auth, and the live-follow
74
74
  // preconditions are checked first so `--dry-run`/`--detach`/`--json` fail with the clearer reason.
75
75
  if (live && (live.dryRun || live.detach || live.json)) {
76
76
  return fail("EXPOSE_REQUIRES_LIVE_FOLLOW", "watch --expose streams a live desktop over an attached follow channel; it cannot combine with --dry-run, --detach, or --json.");
77
77
  }
78
- // --safe is a share_ready LIBRARY filter for `serve`; watch streams a single live run that is
78
+ // --safe is a share_ready library filter for `serve`; watch streams a single live run that is
79
79
  // never share_ready, so --safe would silently do nothing here. Reject it rather than ignore it.
80
80
  if (request.safe) {
81
81
  return fail("SAFE_NOT_APPLICABLE", WATCH_SAFE_NOT_APPLICABLE_MESSAGE);
@@ -85,18 +85,18 @@ export function validateExposure(surface, request, live) {
85
85
  }
86
86
  }
87
87
  else {
88
- // serve: --expose must ALWAYS resolve to a reachable public origin (a tunnel or a --public-url),
88
+ // serve: --expose must always resolve to a reachable public origin (a tunnel or a --public-url),
89
89
  // even under --safe. Without one the exposed server is an unreachable loopback no-op, so fail
90
- // closed before the origin-less bind. When an origin IS present, keep the edge-auth-OR-safe gate.
90
+ // closed before the origin-less bind. When an origin is present, keep the edge-auth-or-safe gate.
91
91
  if (!request.tunnel && !publicOrigin) {
92
92
  return fail("EXPOSE_REQUIRES_ORIGIN", "--expose needs a declared public origin: pass --tunnel ngrok or --public-url <origin>.");
93
93
  }
94
94
  if (!edgeAuthed && !request.safe) {
95
- return fail("EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE", "--expose opens a public URL to local run bundles; require edge auth (--oauth google with --tunnel, or a --public-url you secure) OR --safe (share_ready runs only).");
95
+ return fail("EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE", "--expose opens a public URL to local run bundles, so it needs edge auth (--oauth google with --tunnel, or a --public-url you secure) or --safe (share_ready runs only).");
96
96
  }
97
97
  }
98
98
  if (request.oauth && request.allowEmails.length === 0 && request.allowDomains.length === 0) {
99
- warnings.push("ngrok --oauth google with NO --allow-email/--allow-domain lets ANY Google account that reaches the URL in; add at least one allow rule to restrict who can watch.");
99
+ warnings.push("ngrok --oauth google without --allow-email or --allow-domain lets in any Google account that reaches the URL. Add at least one allow rule to choose who can watch.");
100
100
  }
101
101
  const mode = edgeAuthed ? "exposed" : "share-safe-open";
102
102
  return {
@@ -1,4 +1,4 @@
1
- // Shared HTTP hardening primitives for the serve surfaces. Extracted here so BOTH the live
1
+ // Shared HTTP hardening primitives for the serve surfaces. Extracted here so both the live
2
2
  // Observer server (src/observer/render.ts) and the run-library server
3
3
  // (src/observer/serve.ts) can enforce the identical Host allowlist + security-header posture
4
4
  // without a module cycle. This file imports nothing from the serve modules.
@@ -9,7 +9,7 @@ export interface LibraryHistory {
9
9
  /** Current contained status-record observation, separate from the evidence verdict. */
10
10
  runtimeState?: "running" | "finished" | "interrupted" | "unknown";
11
11
  streamCount: number;
12
- /** Labeled run-total cost ESTIMATE (null when the run carries no cost summary). */
12
+ /** Labeled run-total cost estimate (null when the run carries no cost summary). */
13
13
  estimatedCostUsd: number | null;
14
14
  costRatesAsOf: string | null;
15
15
  costPlaceholder: boolean;
@@ -7,8 +7,8 @@ const STATUS_TONES = {
7
7
  };
8
8
  export function renderLibraryHtml(history, opts) {
9
9
  const emptyState = opts.safe
10
- ? "No share_ready runs yet — run `humanish verify` to see why."
11
- : "No runs yet — run `humanish watch` to create one.";
10
+ ? "No share_ready runs yet. Run `humanish verify` to see why."
11
+ : "No runs yet. Run `humanish watch` to create one.";
12
12
  return `<!doctype html>
13
13
  <html lang="en" data-theme="dark">
14
14
  <head>
@@ -39,6 +39,7 @@ function modeLabel(opts) {
39
39
  const auth = opts.mode === "exposed" ? "edge-authed" : opts.mode === "share-safe-open" ? "open" : "loopback";
40
40
  return opts.safe ? `${auth} · share_ready only` : auth;
41
41
  }
42
+ // prose-check: script (the library page's CSS)
42
43
  function libraryCss() {
43
44
  return `
44
45
  :root { color-scheme: dark; }
@@ -80,6 +81,7 @@ main { padding: 1rem 1.1rem 3rem; max-width: 44rem; margin: 0 auto; }
80
81
  .empty { color: #9aa3b2; font-size: 0.85rem; padding: 2rem 0; text-align: center; }
81
82
  `;
82
83
  }
84
+ // prose-check: script (the library page's JavaScript)
83
85
  function libraryClientJs() {
84
86
  const tones = JSON.stringify(STATUS_TONES);
85
87
  return `