humanish 0.107.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (671) hide show
  1. package/ARCHITECTURE.md +73 -69
  2. package/CHANGELOG.md +27 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +148 -175
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-trace.js +2 -1
  14. package/dist/actors/codex/app-server-ui.js +1 -1
  15. package/dist/actors/codex/codex-admission.d.ts +91 -0
  16. package/dist/actors/codex/codex-admission.js +150 -0
  17. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  18. package/dist/actors/codex/restricted-executable.js +8 -8
  19. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  20. package/dist/actors/codex/restricted-launch.js +1 -1
  21. package/dist/actors/codex/restricted-participant.js +20 -18
  22. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  23. package/dist/actors/codex/restricted-policy.js +2 -2
  24. package/dist/actors/codex/restricted-session.d.ts +3 -3
  25. package/dist/actors/codex/restricted-session.js +10 -5
  26. package/dist/actors/computer-use/actor.d.ts +18 -18
  27. package/dist/actors/computer-use/actor.js +4 -4
  28. package/dist/actors/computer-use/admission-limit.d.ts +3 -3
  29. package/dist/actors/computer-use/admission-limit.js +4 -4
  30. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  31. package/dist/actors/computer-use/executor-error.js +3 -3
  32. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  33. package/dist/actors/computer-use/loop/actions.js +15 -15
  34. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  35. package/dist/actors/computer-use/loop/backstop.js +14 -12
  36. package/dist/actors/computer-use/loop/debrief.js +2 -2
  37. package/dist/actors/computer-use/loop/ending.d.ts +6 -6
  38. package/dist/actors/computer-use/loop/ending.js +18 -17
  39. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  40. package/dist/actors/computer-use/loop/observation.js +15 -14
  41. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  42. package/dist/actors/computer-use/loop/provider-call.js +12 -12
  43. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  44. package/dist/actors/computer-use/loop/session.js +4 -4
  45. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  46. package/dist/actors/computer-use/loop/spend.js +1 -1
  47. package/dist/actors/computer-use/loop/trace.js +11 -9
  48. package/dist/actors/computer-use/loop/types.d.ts +47 -45
  49. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  50. package/dist/actors/computer-use/loop/usage.js +2 -2
  51. package/dist/actors/computer-use/loop.d.ts +6 -1
  52. package/dist/actors/computer-use/loop.js +26 -4
  53. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  54. package/dist/actors/computer-use/openai-context.js +214 -0
  55. package/dist/actors/computer-use/openai-provider.d.ts +13 -10
  56. package/dist/actors/computer-use/openai-provider.js +52 -41
  57. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  58. package/dist/actors/computer-use/openai-requests.js +82 -15
  59. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  60. package/dist/actors/computer-use/openai-wire.js +36 -34
  61. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  62. package/dist/actors/computer-use/provider-error.js +6 -6
  63. package/dist/actors/contract.d.ts +82 -47
  64. package/dist/actors/contract.js +30 -24
  65. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  66. package/dist/actors/local-agent/claude-session.js +13 -12
  67. package/dist/actors/local-agent/cli.d.ts +9 -7
  68. package/dist/actors/local-agent/cli.js +24 -28
  69. package/dist/actors/local-agent/readiness.d.ts +2 -2
  70. package/dist/actors/local-agent/readiness.js +4 -4
  71. package/dist/actors/reasoning-effort.js +8 -8
  72. package/dist/actors/registry.d.ts +12 -12
  73. package/dist/actors/registry.js +21 -20
  74. package/dist/actors/scripted-browser/actor.d.ts +10 -10
  75. package/dist/actors/scripted-browser/actor.js +17 -17
  76. package/dist/actors/scripted-browser/browser-command.js +1 -1
  77. package/dist/actors/scripted-browser/steps.js +1 -1
  78. package/dist/actors/scripted-browser/types.d.ts +1 -1
  79. package/dist/actors/stop-conditions.d.ts +1 -1
  80. package/dist/analysis/automatic-completion.d.ts +7 -7
  81. package/dist/analysis/automatic-completion.js +1 -1
  82. package/dist/analysis/automatic-config.d.ts +6 -6
  83. package/dist/analysis/automatic-config.js +1 -1
  84. package/dist/analysis/codex-config.d.ts +6 -2
  85. package/dist/analysis/codex-config.js +22 -14
  86. package/dist/analysis/execute.d.ts +1 -1
  87. package/dist/analysis/execute.js +1 -1
  88. package/dist/analysis/service.js +5 -5
  89. package/dist/analysis/types.d.ts +6 -0
  90. package/dist/browser-control/client.js +16 -16
  91. package/dist/browser-control/dispatcher.js +4 -4
  92. package/dist/browser-control/protocol.js +14 -14
  93. package/dist/browser-control/recording-transfer.js +4 -4
  94. package/dist/browser-control/transport.js +7 -7
  95. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  96. package/dist/cli/commands/analyze.js +19 -16
  97. package/dist/cli/commands/codex.js +9 -9
  98. package/dist/cli/commands/comms.js +48 -35
  99. package/dist/cli/commands/feedback.js +20 -21
  100. package/dist/cli/commands/migrate.d.ts +4 -0
  101. package/dist/cli/commands/migrate.js +65 -0
  102. package/dist/cli/commands/observe.d.ts +0 -1
  103. package/dist/cli/commands/observe.js +136 -112
  104. package/dist/cli/commands/run-command.d.ts +10 -0
  105. package/dist/cli/commands/run-command.js +85 -0
  106. package/dist/cli/commands/runs.js +136 -139
  107. package/dist/cli/commands/setup.d.ts +2 -2
  108. package/dist/cli/commands/setup.js +27 -24
  109. package/dist/cli/commands/study-format.d.ts +9 -0
  110. package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
  111. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  112. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
  113. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  114. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  115. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  116. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
  117. package/dist/cli/commands/study-route-run.d.ts +19 -0
  118. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  119. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  120. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  121. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  122. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
  123. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  124. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  125. package/dist/cli/commands/study-run.d.ts +9 -0
  126. package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
  127. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
  128. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
  129. package/dist/cli/commands/study.d.ts +3 -0
  130. package/dist/cli/commands/study.js +146 -0
  131. package/dist/cli/commands/tui.d.ts +4 -4
  132. package/dist/cli/commands/tui.js +31 -31
  133. package/dist/cli/commands/watch.js +71 -121
  134. package/dist/cli/deprecations.d.ts +6 -0
  135. package/dist/cli/deprecations.js +18 -0
  136. package/dist/cli/doctor.d.ts +18 -8
  137. package/dist/cli/doctor.js +114 -59
  138. package/dist/cli/first-run-path.d.ts +15 -13
  139. package/dist/cli/first-run-path.js +35 -33
  140. package/dist/cli/io.d.ts +44 -9
  141. package/dist/cli/io.js +98 -23
  142. package/dist/cli/observer-follow.d.ts +3 -3
  143. package/dist/cli/observer-follow.js +6 -7
  144. package/dist/cli/orientation.d.ts +10 -7
  145. package/dist/cli/orientation.js +89 -47
  146. package/dist/cli/product-sentence.d.ts +6 -0
  147. package/dist/cli/product-sentence.js +6 -0
  148. package/dist/cli/program.d.ts +6 -1
  149. package/dist/cli/program.js +111 -43
  150. package/dist/cli/telemetry.d.ts +16 -16
  151. package/dist/cli/telemetry.js +46 -44
  152. package/dist/cli.js +1 -1
  153. package/dist/comms/capture-surface.d.ts +13 -12
  154. package/dist/comms/capture-surface.js +23 -22
  155. package/dist/comms/catch-host.d.ts +7 -7
  156. package/dist/comms/catch-host.js +17 -17
  157. package/dist/comms/connections.d.ts +1 -1
  158. package/dist/comms/connections.js +2 -2
  159. package/dist/comms/email-catch.d.ts +3 -3
  160. package/dist/comms/email-catch.js +8 -8
  161. package/dist/comms/external-evidence.d.ts +5 -5
  162. package/dist/comms/external-evidence.js +5 -4
  163. package/dist/comms/extract.js +2 -2
  164. package/dist/comms/fake-inbox.d.ts +3 -3
  165. package/dist/comms/fake-inbox.js +3 -3
  166. package/dist/comms/receiving-render.d.ts +1 -1
  167. package/dist/comms/receiving-render.js +2 -2
  168. package/dist/comms/receiving-runtime.d.ts +4 -4
  169. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  170. package/dist/comms/sandbox-catch-script.js +6 -6
  171. package/dist/comms/sandbox-catch.d.ts +38 -39
  172. package/dist/comms/sandbox-catch.js +36 -37
  173. package/dist/comms/setup.d.ts +2 -2
  174. package/dist/comms/setup.js +56 -25
  175. package/dist/comms/thread-evidence.d.ts +1 -1
  176. package/dist/comms/thread-evidence.js +6 -6
  177. package/dist/comms/types.d.ts +6 -6
  178. package/dist/comms/types.js +3 -3
  179. package/dist/evidence/frame-signature.d.ts +1 -1
  180. package/dist/evidence/frame-signature.js +4 -4
  181. package/dist/evidence/redaction.d.ts +3 -3
  182. package/dist/evidence/redaction.js +4 -4
  183. package/dist/feedback/draft.js +38 -80
  184. package/dist/feedback/export-bundle.js +1 -1
  185. package/dist/feedback/export.d.ts +5 -1
  186. package/dist/feedback/export.js +10 -10
  187. package/dist/feedback/feedback.d.ts +2 -2
  188. package/dist/feedback/feedback.js +21 -3
  189. package/dist/feedback/proof.d.ts +1 -1
  190. package/dist/feedback/proof.js +2 -2
  191. package/dist/guest/bootstrap.js +6 -6
  192. package/dist/guest/browser-tools.js +8 -8
  193. package/dist/guest/chromium-text.js +19 -19
  194. package/dist/guest/desktop-executor.d.ts +2 -2
  195. package/dist/guest/desktop-executor.js +20 -20
  196. package/dist/guest/desktop-keys.js +4 -4
  197. package/dist/guest/desktop-media.d.ts +2 -2
  198. package/dist/guest/desktop-media.js +16 -16
  199. package/dist/guest/desktop-native.d.ts +1 -1
  200. package/dist/guest/desktop-native.js +10 -10
  201. package/dist/guest/runtime-desktop.js +2 -2
  202. package/dist/guest/runtime-processes.d.ts +2 -2
  203. package/dist/guest/runtime-processes.js +2 -2
  204. package/dist/guest/runtime.js +6 -6
  205. package/dist/index.d.ts +14 -14
  206. package/dist/index.js +8 -8
  207. package/dist/keys/key-resolution.d.ts +5 -5
  208. package/dist/keys/key-resolution.js +23 -23
  209. package/dist/observer/artifact.d.ts +2 -2
  210. package/dist/observer/artifact.js +7 -7
  211. package/dist/observer/data.d.ts +6 -6
  212. package/dist/observer/data.js +5 -4
  213. package/dist/observer/exposure.d.ts +1 -1
  214. package/dist/observer/exposure.js +11 -11
  215. package/dist/observer/http.js +1 -1
  216. package/dist/observer/library.d.ts +3 -1
  217. package/dist/observer/library.js +8 -3
  218. package/dist/observer/listen.js +5 -4
  219. package/dist/observer/render.d.ts +1 -1
  220. package/dist/observer/render.js +17 -6
  221. package/dist/observer/run-routes.d.ts +4 -3
  222. package/dist/observer/run-routes.js +38 -13
  223. package/dist/observer/serve.d.ts +1 -1
  224. package/dist/observer/serve.js +7 -3
  225. package/dist/observer/tunnel.js +1 -1
  226. package/dist/observer-app.html +4 -4
  227. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  228. package/dist/routes/computer-use/bundle-parts.js +18 -17
  229. package/dist/routes/computer-use/bundle.d.ts +2 -2
  230. package/dist/routes/computer-use/bundle.js +10 -9
  231. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
  232. package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
  233. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  234. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
  235. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  236. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
  238. package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
  239. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  240. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
  241. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  242. package/dist/routes/computer-use/external-comms.js +1 -1
  243. package/dist/routes/computer-use/fanout-bundle.js +27 -26
  244. package/dist/routes/computer-use/fanout-records.js +12 -13
  245. package/dist/routes/computer-use/live-flush.d.ts +4 -4
  246. package/dist/routes/computer-use/live-flush.js +6 -6
  247. package/dist/routes/computer-use/live-phase.d.ts +5 -4
  248. package/dist/routes/computer-use/live-phase.js +8 -8
  249. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  250. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  251. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  252. package/dist/routes/computer-use/local-vm.js +3 -3
  253. package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
  254. package/dist/routes/computer-use/participant-desktop.js +5 -5
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +10 -10
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +33 -15
  259. package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
  260. package/dist/routes/computer-use/participant-prompt.js +9 -9
  261. package/dist/routes/computer-use/participant-runs.d.ts +16 -16
  262. package/dist/routes/computer-use/participant-runs.js +26 -25
  263. package/dist/routes/computer-use/plan.d.ts +12 -12
  264. package/dist/routes/computer-use/plan.js +42 -42
  265. package/dist/routes/computer-use/preflight.d.ts +5 -5
  266. package/dist/routes/computer-use/preflight.js +25 -25
  267. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  268. package/dist/routes/computer-use/rerun-selection.js +4 -3
  269. package/dist/routes/computer-use/result.d.ts +4 -4
  270. package/dist/routes/computer-use/result.js +22 -21
  271. package/dist/routes/computer-use/route.d.ts +12 -11
  272. package/dist/routes/computer-use/route.js +31 -30
  273. package/dist/routes/computer-use/self-report.d.ts +7 -7
  274. package/dist/routes/computer-use/self-report.js +32 -32
  275. package/dist/routes/computer-use/setup.d.ts +23 -23
  276. package/dist/routes/computer-use/setup.js +28 -29
  277. package/dist/routes/computer-use/single-bundle.d.ts +11 -11
  278. package/dist/routes/computer-use/single-bundle.js +40 -41
  279. package/dist/routes/computer-use/subject-projection.d.ts +4 -4
  280. package/dist/routes/computer-use/subject-projection.js +6 -6
  281. package/dist/routes/computer-use/types.d.ts +71 -73
  282. package/dist/routes/computer-use/types.js +12 -12
  283. package/dist/routes/preview.d.ts +13 -7
  284. package/dist/routes/preview.js +11 -7
  285. package/dist/routes/scripted/bundle.d.ts +7 -7
  286. package/dist/routes/scripted/bundle.js +20 -18
  287. package/dist/routes/scripted/plan.d.ts +8 -8
  288. package/dist/routes/scripted/plan.js +13 -13
  289. package/dist/routes/scripted/result.d.ts +3 -3
  290. package/dist/routes/scripted/result.js +13 -13
  291. package/dist/routes/scripted/route.d.ts +9 -9
  292. package/dist/routes/scripted/route.js +15 -16
  293. package/dist/routes/scripted/scenario.d.ts +1 -1
  294. package/dist/routes/scripted/scenario.js +5 -5
  295. package/dist/routes/scripted/setup.d.ts +6 -6
  296. package/dist/routes/scripted/setup.js +8 -8
  297. package/dist/routes/scripted/subject.d.ts +5 -5
  298. package/dist/routes/scripted/subject.js +4 -4
  299. package/dist/routes/scripted/surface-records.d.ts +1 -1
  300. package/dist/routes/scripted/surface-records.js +4 -4
  301. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  302. package/dist/routes/scripted/types.d.ts +18 -20
  303. package/dist/routes/scripted/types.js +2 -2
  304. package/dist/routes/shared-world/bundle-records.js +11 -10
  305. package/dist/routes/shared-world/bundle.d.ts +5 -5
  306. package/dist/routes/shared-world/bundle.js +46 -43
  307. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  308. package/dist/routes/shared-world/checkpoints.js +2 -2
  309. package/dist/routes/shared-world/comms.d.ts +14 -14
  310. package/dist/routes/shared-world/comms.js +19 -18
  311. package/dist/routes/shared-world/external-public.d.ts +4 -3
  312. package/dist/routes/shared-world/external-public.js +16 -12
  313. package/dist/routes/shared-world/handoff.d.ts +7 -6
  314. package/dist/routes/shared-world/handoff.js +65 -57
  315. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  316. package/dist/routes/shared-world/lobby-code.js +9 -9
  317. package/dist/routes/shared-world/participant-specs.d.ts +10 -9
  318. package/dist/routes/shared-world/participant-specs.js +38 -31
  319. package/dist/routes/shared-world/plan.d.ts +9 -9
  320. package/dist/routes/shared-world/plan.js +16 -16
  321. package/dist/routes/shared-world/provenance.d.ts +2 -2
  322. package/dist/routes/shared-world/provenance.js +2 -2
  323. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  324. package/dist/routes/shared-world/provisioned.js +18 -17
  325. package/dist/routes/shared-world/result.d.ts +6 -6
  326. package/dist/routes/shared-world/result.js +29 -29
  327. package/dist/routes/shared-world/route.d.ts +11 -11
  328. package/dist/routes/shared-world/route.js +40 -39
  329. package/dist/routes/shared-world/setup.d.ts +16 -16
  330. package/dist/routes/shared-world/setup.js +23 -23
  331. package/dist/routes/shared-world/types.d.ts +55 -53
  332. package/dist/routes/shared-world/types.js +4 -4
  333. package/dist/routes/terminal/adapter.d.ts +5 -5
  334. package/dist/routes/terminal/adapter.js +9 -9
  335. package/dist/routes/terminal/bundle.d.ts +13 -13
  336. package/dist/routes/terminal/bundle.js +28 -27
  337. package/dist/routes/terminal/credentials.d.ts +8 -8
  338. package/dist/routes/terminal/credentials.js +12 -12
  339. package/dist/routes/terminal/dry-run.d.ts +4 -4
  340. package/dist/routes/terminal/dry-run.js +12 -12
  341. package/dist/routes/terminal/encoding.js +2 -2
  342. package/dist/routes/terminal/ledger.d.ts +5 -5
  343. package/dist/routes/terminal/ledger.js +14 -14
  344. package/dist/routes/terminal/lifetime.d.ts +1 -1
  345. package/dist/routes/terminal/lifetime.js +1 -1
  346. package/dist/routes/terminal/live-finish.d.ts +2 -2
  347. package/dist/routes/terminal/live-finish.js +10 -10
  348. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  349. package/dist/routes/terminal/live-sandbox.js +15 -15
  350. package/dist/routes/terminal/participant-text.js +2 -1
  351. package/dist/routes/terminal/persona.d.ts +2 -2
  352. package/dist/routes/terminal/persona.js +3 -3
  353. package/dist/routes/terminal/plan.d.ts +7 -7
  354. package/dist/routes/terminal/plan.js +15 -15
  355. package/dist/routes/terminal/recorder.js +2 -2
  356. package/dist/routes/terminal/result.d.ts +5 -5
  357. package/dist/routes/terminal/result.js +14 -14
  358. package/dist/routes/terminal/route.d.ts +9 -9
  359. package/dist/routes/terminal/route.js +19 -20
  360. package/dist/routes/terminal/sandbox.d.ts +1 -1
  361. package/dist/routes/terminal/sandbox.js +1 -1
  362. package/dist/routes/terminal/session.d.ts +5 -5
  363. package/dist/routes/terminal/session.js +14 -13
  364. package/dist/routes/terminal/token-usage.d.ts +1 -1
  365. package/dist/routes/terminal/token-usage.js +7 -8
  366. package/dist/routes/terminal/trace.d.ts +4 -4
  367. package/dist/routes/terminal/trace.js +2 -2
  368. package/dist/routes/terminal/types.d.ts +48 -50
  369. package/dist/routes/terminal/types.js +5 -5
  370. package/dist/run/bundle-shape.js +3 -3
  371. package/dist/run/bundle.d.ts +49 -49
  372. package/dist/run/bundle.js +3 -2
  373. package/dist/run/cost-summary.js +3 -3
  374. package/dist/run/costs.d.ts +23 -0
  375. package/dist/run/costs.js +79 -44
  376. package/dist/run/detail.d.ts +6 -6
  377. package/dist/run/detail.js +4 -4
  378. package/dist/run/dry-run-inputs.d.ts +1 -1
  379. package/dist/run/dry-run-inputs.js +2 -2
  380. package/dist/run/dry-run.js +20 -20
  381. package/dist/run/judge.d.ts +19 -13
  382. package/dist/run/judge.js +18 -8
  383. package/dist/run/outcomes.d.ts +1 -1
  384. package/dist/run/participant.d.ts +1 -1
  385. package/dist/run/paths.d.ts +1 -1
  386. package/dist/run/paths.js +1 -1
  387. package/dist/run/preflight-receipts.js +1 -1
  388. package/dist/run/pricing.d.ts +11 -6
  389. package/dist/run/pricing.js +22 -15
  390. package/dist/run/projection.d.ts +46 -46
  391. package/dist/run/projection.js +57 -57
  392. package/dist/run/reclaim.d.ts +1 -1
  393. package/dist/run/reclaim.js +3 -3
  394. package/dist/run/results.d.ts +5 -5
  395. package/dist/run/run-cost.d.ts +53 -0
  396. package/dist/run/run-cost.js +105 -0
  397. package/dist/run/run-index-analysis.d.ts +15 -0
  398. package/dist/run/run-index-analysis.js +77 -0
  399. package/dist/run/run-index.d.ts +19 -7
  400. package/dist/run/run-index.js +77 -64
  401. package/dist/run/run-not-found.d.ts +5 -0
  402. package/dist/run/run-not-found.js +15 -0
  403. package/dist/run/run.d.ts +6 -5
  404. package/dist/run/run.js +3 -3
  405. package/dist/run/sandbox-receipts.d.ts +2 -2
  406. package/dist/run/sandbox-receipts.js +3 -3
  407. package/dist/run/shared-world-evidence.d.ts +37 -36
  408. package/dist/run/shared-world-evidence.js +4 -4
  409. package/dist/run/shared-world-shape.d.ts +1 -1
  410. package/dist/run/shared-world-shape.js +7 -7
  411. package/dist/run/stats.d.ts +14 -8
  412. package/dist/run/stats.js +121 -63
  413. package/dist/run/status.d.ts +16 -29
  414. package/dist/run/status.js +10 -29
  415. package/dist/run/stored-runs.js +2 -1
  416. package/dist/run/stream-shape.js +1 -1
  417. package/dist/run/streams.d.ts +7 -7
  418. package/dist/run/study-provenance.d.ts +49 -0
  419. package/dist/run/study-provenance.js +66 -0
  420. package/dist/run/study-result.d.ts +11 -0
  421. package/dist/run/study-result.js +9 -0
  422. package/dist/run/text.d.ts +2 -0
  423. package/dist/run/text.js +4 -0
  424. package/dist/run-study.d.ts +112 -0
  425. package/dist/{run-lab.js → run-study.js} +52 -47
  426. package/dist/{lab → study}/adapter-extension.d.ts +15 -27
  427. package/dist/{lab → study}/adapter-extension.js +10 -45
  428. package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
  429. package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
  430. package/dist/study/composition-rules.d.ts +7 -0
  431. package/dist/{lab → study}/composition-rules.js +53 -53
  432. package/dist/study/config.d.ts +15 -0
  433. package/dist/{lab → study}/config.js +98 -41
  434. package/dist/study/convert.d.ts +33 -0
  435. package/dist/study/convert.js +432 -0
  436. package/dist/{lab → study}/device-presets.d.ts +10 -10
  437. package/dist/{lab → study}/device-presets.js +11 -11
  438. package/dist/study/discover.d.ts +75 -0
  439. package/dist/{lab → study}/discover.js +134 -95
  440. package/dist/{lab → study}/doctor.d.ts +19 -12
  441. package/dist/{lab → study}/doctor.js +58 -20
  442. package/dist/study/field-paths.d.ts +12 -0
  443. package/dist/study/field-paths.js +126 -0
  444. package/dist/study/files.d.ts +26 -0
  445. package/dist/study/files.js +44 -0
  446. package/dist/{lab → study}/init-templates.d.ts +2 -2
  447. package/dist/study/init-templates.js +421 -0
  448. package/dist/{lab → study}/init.d.ts +2 -2
  449. package/dist/{lab → study}/init.js +46 -11
  450. package/dist/study/keys.d.ts +4 -0
  451. package/dist/{lab → study}/keys.js +46 -12
  452. package/dist/study/migrate.d.ts +48 -0
  453. package/dist/study/migrate.js +408 -0
  454. package/dist/study/owned-files.d.ts +38 -0
  455. package/dist/study/owned-files.js +182 -0
  456. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  457. package/dist/{lab → study}/parse/actors.js +14 -14
  458. package/dist/study/parse/comms.d.ts +12 -0
  459. package/dist/{lab → study}/parse/comms.js +5 -5
  460. package/dist/study/parse/execution.d.ts +19 -0
  461. package/dist/{lab → study}/parse/execution.js +13 -13
  462. package/dist/study/parse/study-v3.d.ts +21 -0
  463. package/dist/study/parse/study-v3.js +259 -0
  464. package/dist/study/parse/subject-state.d.ts +30 -0
  465. package/dist/{lab → study}/parse/subject-state.js +19 -19
  466. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  467. package/dist/{lab → study}/parse/subject.js +34 -34
  468. package/dist/{lab → study}/parse/values.d.ts +3 -3
  469. package/dist/{lab → study}/parse/values.js +3 -3
  470. package/dist/{lab → study}/persona-resolve.d.ts +8 -8
  471. package/dist/{lab → study}/persona-resolve.js +6 -6
  472. package/dist/{lab → study}/plan-base.d.ts +7 -7
  473. package/dist/{lab → study}/plan-base.js +1 -1
  474. package/dist/{lab → study}/plan-participants.d.ts +12 -12
  475. package/dist/{lab → study}/plan-participants.js +4 -4
  476. package/dist/{lab → study}/plan-types.d.ts +31 -31
  477. package/dist/{lab → study}/plan-types.js +2 -2
  478. package/dist/study/plan.d.ts +13 -0
  479. package/dist/study/plan.js +101 -0
  480. package/dist/study/preflight-probes.d.ts +3 -0
  481. package/dist/{lab → study}/preflight-probes.js +20 -19
  482. package/dist/study/preflight-result.d.ts +8 -0
  483. package/dist/{lab → study}/preflight-result.js +5 -4
  484. package/dist/study/preflight.d.ts +94 -0
  485. package/dist/{lab → study}/preflight.js +12 -12
  486. package/dist/{lab → study}/requirements.d.ts +3 -3
  487. package/dist/{lab → study}/requirements.js +1 -1
  488. package/dist/study/route-inputs.d.ts +28 -0
  489. package/dist/{lab → study}/route-inputs.js +1 -1
  490. package/dist/{lab → study}/routing.d.ts +39 -33
  491. package/dist/{lab → study}/routing.js +60 -29
  492. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
  493. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
  494. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
  495. package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
  496. package/dist/study/run-study-options.d.ts +28 -0
  497. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
  498. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
  499. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  500. package/dist/{lab → study}/summary.d.ts +16 -15
  501. package/dist/{lab → study}/summary.js +21 -21
  502. package/dist/{lab → study}/tasks.d.ts +18 -18
  503. package/dist/{lab → study}/tasks.js +14 -14
  504. package/dist/{lab → study}/types.d.ts +202 -196
  505. package/dist/{lab → study}/types.js +3 -1
  506. package/dist/{lab → study}/validation.d.ts +27 -27
  507. package/dist/{lab → study}/validation.js +53 -51
  508. package/dist/study/warnings.d.ts +12 -0
  509. package/dist/{lab → study}/warnings.js +62 -34
  510. package/dist/subject/clone.d.ts +7 -7
  511. package/dist/subject/clone.js +2 -2
  512. package/dist/subject/desktop-cli.d.ts +1 -1
  513. package/dist/subject/desktop-cli.js +2 -2
  514. package/dist/subject/local-tree-archive.d.ts +2 -2
  515. package/dist/subject/local-tree-archive.js +4 -4
  516. package/dist/subject/local-tree.d.ts +4 -4
  517. package/dist/subject/node-bootstrap.js +1 -1
  518. package/dist/subject/runtime.js +9 -10
  519. package/dist/subject/serve.d.ts +5 -5
  520. package/dist/subject/serve.js +3 -3
  521. package/dist/subject/state.d.ts +4 -4
  522. package/dist/subject/state.js +1 -1
  523. package/dist/subject/steps.d.ts +6 -6
  524. package/dist/subject/steps.js +5 -5
  525. package/dist/substrates/command-failure.d.ts +3 -3
  526. package/dist/substrates/command-failure.js +3 -3
  527. package/dist/substrates/desktop-session.js +2 -2
  528. package/dist/substrates/detached.d.ts +6 -6
  529. package/dist/substrates/detached.js +7 -7
  530. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  531. package/dist/substrates/e2b/cdp-probe.js +14 -17
  532. package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
  533. package/dist/substrates/e2b/desktop-browser.js +9 -9
  534. package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
  535. package/dist/substrates/e2b/desktop-cdp.js +9 -9
  536. package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
  537. package/dist/substrates/e2b/desktop-executor.js +13 -13
  538. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  539. package/dist/substrates/e2b/desktop-geometry.js +8 -8
  540. package/dist/substrates/e2b/desktop-media.d.ts +4 -4
  541. package/dist/substrates/e2b/desktop-media.js +1 -1
  542. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  543. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  544. package/dist/substrates/e2b/lifetime.js +1 -1
  545. package/dist/substrates/e2b/sandbox.d.ts +4 -4
  546. package/dist/substrates/e2b/sandbox.js +2 -2
  547. package/dist/substrates/e2b/sdk.d.ts +12 -12
  548. package/dist/substrates/e2b/sdk.js +7 -7
  549. package/dist/substrates/local/runtime-config.d.ts +4 -4
  550. package/dist/substrates/local/runtime-config.js +4 -4
  551. package/dist/tui/actions.d.ts +1 -1
  552. package/dist/tui/actions.js +13 -13
  553. package/dist/tui/contract.d.ts +23 -23
  554. package/dist/tui/contract.js +11 -11
  555. package/dist/tui/launch.d.ts +7 -7
  556. package/dist/tui/launch.js +36 -31
  557. package/dist/tui/project.js +5 -5
  558. package/dist/tui-app.js +139 -139
  559. package/dist/verify/actor.d.ts +8 -8
  560. package/dist/verify/actor.js +36 -36
  561. package/dist/verify/artifacts.d.ts +2 -2
  562. package/dist/verify/artifacts.js +3 -3
  563. package/dist/verify/context-growth.d.ts +9 -0
  564. package/dist/verify/context-growth.js +62 -0
  565. package/dist/verify/costs.d.ts +6 -6
  566. package/dist/verify/costs.js +8 -8
  567. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  568. package/dist/verify/shared-world-concurrent.js +79 -76
  569. package/dist/verify/shared-world.d.ts +2 -2
  570. package/dist/verify/shared-world.js +16 -16
  571. package/dist/verify/subject.d.ts +5 -5
  572. package/dist/verify/subject.js +19 -19
  573. package/dist/verify/verify.js +94 -44
  574. package/docs/README.md +25 -32
  575. package/docs/architecture/actor-contract.md +60 -91
  576. package/docs/architecture/browser-control.md +1 -1
  577. package/docs/architecture/desktop-sessions.md +7 -7
  578. package/docs/architecture/external-public-shared-world.md +68 -65
  579. package/docs/architecture/github-feedback-loop.md +2 -5
  580. package/docs/architecture/guest-desktop.md +2 -2
  581. package/docs/architecture/observer.md +34 -34
  582. package/docs/architecture/restricted-codex-analysis.md +34 -28
  583. package/docs/architecture/serve.md +34 -37
  584. package/docs/architecture/state-driven-executor.md +55 -58
  585. package/docs/architecture/task-protocol-support.md +6 -6
  586. package/docs/architecture/terminal-product-route.md +70 -110
  587. package/docs/contracts/README.md +24 -0
  588. package/docs/contracts/adapter-admission.md +3 -3
  589. package/docs/contracts/adapter-fixtures.md +4 -7
  590. package/docs/contracts/core.md +1 -3
  591. package/docs/contracts/errors.md +62 -0
  592. package/docs/contracts/feedback.md +8 -9
  593. package/docs/contracts/policy.md +7 -12
  594. package/docs/contracts/run-bundle.md +42 -44
  595. package/docs/contracts/schemas.md +446 -368
  596. package/docs/contracts/study-analysis.md +7 -4
  597. package/docs/contracts/study-costs.md +28 -9
  598. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  599. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  600. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  601. package/docs/principles/actor-fidelity.md +4 -4
  602. package/docs/principles/engineering.md +3 -3
  603. package/docs/principles/invariants-and-defaults.md +38 -38
  604. package/docs/principles/self-driving-harness.md +1 -5
  605. package/docs/principles/three-roles.md +1 -1
  606. package/docs/product/automatic-analysis.md +7 -7
  607. package/examples/README.md +1 -1
  608. package/examples/participant/README.md +5 -5
  609. package/examples/participant/run.mjs +11 -10
  610. package/examples/scorer/README.md +3 -3
  611. package/examples/scorer/run.mjs +11 -12
  612. package/examples/scorer/scorer.mjs +3 -3
  613. package/package.json +16 -17
  614. package/skills/humanish/SKILL.md +64 -60
  615. package/skills/humanish/agents/openai.yaml +1 -1
  616. package/AGENTS.md +0 -99
  617. package/CONTRIBUTING.md +0 -148
  618. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  619. package/dist/actors/codex/qualified-versions.js +0 -132
  620. package/dist/cli/commands/lab-format.d.ts +0 -8
  621. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  622. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  623. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  624. package/dist/cli/commands/lab-run.d.ts +0 -9
  625. package/dist/cli/commands/lab.d.ts +0 -3
  626. package/dist/cli/commands/lab.js +0 -199
  627. package/dist/cli/renamed-options.d.ts +0 -11
  628. package/dist/cli/renamed-options.js +0 -18
  629. package/dist/lab/composition-rules.d.ts +0 -7
  630. package/dist/lab/config.d.ts +0 -7
  631. package/dist/lab/discover.d.ts +0 -65
  632. package/dist/lab/init-templates.js +0 -416
  633. package/dist/lab/keys.d.ts +0 -2
  634. package/dist/lab/parse/comms.d.ts +0 -12
  635. package/dist/lab/parse/execution.d.ts +0 -19
  636. package/dist/lab/parse/subject-state.d.ts +0 -30
  637. package/dist/lab/plan.d.ts +0 -19
  638. package/dist/lab/plan.js +0 -132
  639. package/dist/lab/preflight-probes.d.ts +0 -3
  640. package/dist/lab/preflight-result.d.ts +0 -7
  641. package/dist/lab/preflight.d.ts +0 -92
  642. package/dist/lab/route-inputs.d.ts +0 -28
  643. package/dist/lab/run-lab-options.d.ts +0 -28
  644. package/dist/lab/warnings.d.ts +0 -2
  645. package/dist/observer/static.d.ts +0 -39
  646. package/dist/observer/static.js +0 -369
  647. package/dist/run-lab.d.ts +0 -112
  648. package/docs/architecture/comms-inbox.md +0 -122
  649. package/docs/architecture/desktop-recording.md +0 -80
  650. package/docs/architecture/local-browser-runtime.md +0 -178
  651. package/docs/architecture/observer-review.md +0 -144
  652. package/docs/architecture/participant-media.md +0 -90
  653. package/docs/architecture/project-layout.md +0 -62
  654. package/docs/architecture/real-email-receiving.md +0 -136
  655. package/docs/assets/humanish-drawdb-hero.png +0 -0
  656. package/docs/assets/humanish-observer-hero.png +0 -0
  657. package/docs/goals/current.md +0 -207
  658. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  659. package/docs/product/open-source-install-experience.md +0 -240
  660. package/docs/ramp/README.md +0 -295
  661. package/docs/release/open-source-readiness.md +0 -222
  662. package/docs/release/public-readiness-standard.md +0 -210
  663. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  664. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  665. /package/dist/{lab → study}/init-paths.js +0 -0
  666. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  667. /package/dist/{lab → study}/init-plan.js +0 -0
  668. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  669. /package/dist/{lab → study}/participant-assignment.js +0 -0
  670. /package/dist/{lab → study}/persona.d.ts +0 -0
  671. /package/dist/{lab → study}/persona.js +0 -0
@@ -1,32 +1,29 @@
1
1
  # Actor Contract
2
2
 
3
- Date: 2026-06-06 (current-state note updated 2026-09-30)
4
-
5
- Status: accepted contract with a partially open extension surface. Shipped: the evidence
6
- schema `humanish.actor-trace.v1` (`src/actors/contract.ts`) and a closed first-party
7
- registry of five descriptors (`src/actors/registry.ts`: `codex-app-server`,
8
- `openai-computer-use`, `local-agent`, `scripted-browser`, `codex-exec`). `actors[0].type`
9
- is a real dispatch key on the computer-use, scripted-browser, and terminal-product routes.
10
- Product scoring, feedback, and artifact hooks are extension seams, but public out-of-tree
11
- actor registration and its conformance certification are not shipped. Also not shipped: the
12
- full `Actor.run(input)` interface, `ApprovalPolicy`, `StagehandCuaActor`, and the
13
- `persona-fidelity` verify check. `RedactionHooks` ships in `src/evidence/redaction.ts`, and
14
- the computer-use loop takes it; the other adapters do not take it yet. Of the capabilities,
15
- routing checks `lanes` and `producesScreenshots` (`src/lab/routing.ts`): an actor that
16
- declares no screenshots cannot run on the computer-use or scripted-browser route. Decision
17
- 6's capture-time screenshot stance was recanted in 0.6.0; see the inline notes and the
3
+ Part of this contract ships and part is still open. Shipped: the evidence schema
4
+ `humanish.actor-trace.v1` (`src/actors/contract.ts`) and a closed first-party registry of five
5
+ descriptors (`src/actors/registry.ts`: `codex-app-server`, `openai-computer-use`, `local-agent`,
6
+ `scripted-browser`, `codex-exec`). `actor.type` is a real dispatch key on the computer-use,
7
+ scripted-browser, and terminal-product routes. Product scoring, feedback, and artifact hooks are
8
+ extension seams, but public out-of-tree actor registration and its conformance certification are not
9
+ shipped. Also not shipped: the full `Actor.run(input)` interface, `ApprovalPolicy`,
10
+ `StagehandCuaActor`, and the `persona-fidelity` verify check. `RedactionHooks` ships in
11
+ `src/evidence/redaction.ts`, and the computer-use loop takes it; the other adapters do not take it
12
+ yet. Of the capabilities, routing checks `lanes` and `producesScreenshots` (`src/study/routing.ts`):
13
+ an actor that declares no screenshots cannot run on the computer-use or scripted-browser route.
14
+ Decision 6's capture-time screenshot stance was recanted in 0.6.0; see the inline notes and the
18
15
  capture-vs-publish rule in
19
16
  [`docs/principles/invariants-and-defaults.md`](../principles/invariants-and-defaults.md).
20
17
 
21
- `codex-exec` is a real dispatch key for terminal-product labs, but the exported
18
+ `codex-exec` is a real dispatch key for terminal-product studies, but the exported
22
19
  descriptor `runSession` is a fail-closed compatibility entry. Live execution is
23
- owned by `runTerminalProductLab`, which coordinates sandbox creation,
20
+ owned by `runTerminalProductStudy`, which coordinates sandbox creation,
24
21
  command-scoped runtime auth, evidence, caps, and by-id cleanup.
25
22
 
26
- #955 removed the `pi-agent-core` and `claude-agent-sdk` descriptors, the `app` run kind and
27
- the `in-process-sdk` protocol. No lab route dispatched either descriptor, and a
28
- lab that names one now fails to parse. A signed-in Claude Code drives computer-use studies
29
- through `local-agent`, which plugs into the provider-neutral `CuaProvider` port
23
+ The `pi-agent-core` and `claude-agent-sdk` descriptors, the `app` run kind and the
24
+ `in-process-sdk` protocol were removed. No study route dispatched either descriptor, and a
25
+ study that names one now fails to parse. A signed-in Claude Code drives computer-use studies
26
+ through `local-agent`, which plugs into the provider-neutral `ComputerUseProvider` port
30
27
  (`src/actors/computer-use/loop/types.ts`, re-exported from `loop.ts`).
31
28
 
32
29
  ## Context
@@ -64,7 +61,7 @@ API surface.
64
61
  Agent SDK, Stagehand). The existing Codex app-server integration is the
65
62
  reference adapter. `pi-agent-core` was planned as the first in-process-SDK
66
63
  adapter to prove both shapes early; it shipped only as a trace mapper with no
67
- route, and #955 removed it.
64
+ route, and was removed.
68
65
 
69
66
  2. **One normalized evidence schema: `humanish.actor-trace.v1`.** Four producers map
70
67
  their records onto one `ActorTrace` with a typed `items[]`:
@@ -81,7 +78,7 @@ API surface.
81
78
  The Codex app-server still writes its own `humanish.codex-app-server-trace.v1` record
82
79
  (`CodexAppServerTrace` in `src/actors/codex/app-server-trace.ts`), which
83
80
  `codexResultToActorTrace` converts. The Claude Agent SDK `ToolUse`/`ToolResult` and pi
84
- `tool_execution_*` mappers went with their adapters in #955.
81
+ `tool_execution_*` mappers were removed with their adapters.
85
82
 
86
83
  3. **A run is multi-turn within one trace; it stops on goal, abandonment, unrecoverable
87
84
  failure, or a wall-clock safety timeout, never on a turn cap.** Turn count is explicitly
@@ -96,7 +93,7 @@ API surface.
96
93
  4. **Redaction is injected once, never re-implemented per adapter.** Every
97
94
  adapter receives `RedactionHooks` (the shared secret/path/prompt-digest
98
95
  redaction, plus screenshot redaction) and must route all persisted evidence
99
- through it. This is also where the remaining consolidation of #107 lands.
96
+ through it.
100
97
 
101
98
  5. **The registry refuses capability mismatches.** Each adapter declares
102
99
  `ActorCapabilities`. A scenario that needs `producesScreenshots` (a GUI
@@ -287,27 +284,27 @@ export interface Actor {
287
284
  public-safe: redacted message, coarse loop phase, last normalized UI action,
288
285
  and last screenshot reference only. Do not persist raw stacks, env values,
289
286
  target URLs, or unredacted provider payloads in the trace.
290
- - **Capabilities.** Declare them honestly. Routing refuses an actor whose `lanes` or
287
+ - **Capabilities.** Declare only what the actor does. Routing refuses an actor whose `lanes` or
291
288
  `producesScreenshots` do not fit the route; the other capabilities are not checked.
292
- - **Cost (estimate vs. charge).** `tokenUsage.costUsd` stays RESERVED for a
289
+ - **Cost (estimate vs. charge).** `tokenUsage.costUsd` stays reserved for a
293
290
  real, provider-returned charge (the codex path); a bare `costUsd`
294
291
  always means "the provider billed this". The optional `estimatedCost`
295
- (`humanish.actor-estimated-cost.v1`) is a SEPARATE, differently-named field: a
292
+ (`humanish.actor-estimated-cost.v1`) is a separate, differently-named field: a
296
293
  token-derived rate-table multiply from the operator-editable `src/run/pricing.ts`,
297
- labeled honestly as an estimate and projected up into `RunBundle.cost` (see
294
+ labeled as an estimate and projected up into `RunBundle.cost` (see
298
295
  [`../contracts/schemas.md`](../contracts/schemas.md) → Run Cost Summary And
299
- Estimated Actor Cost). The CUA lab computes and attaches `estimatedCost` at the
300
- lab boundary before persisting the trace, so the pure computer-use loop never
296
+ Estimated Actor Cost). The CUA study computes and attaches `estimatedCost` at the
297
+ study boundary before persisting the trace, so the pure computer-use loop never
301
298
  depends on the pricing table. An unknown model yields
302
299
  `estimatedCostUsd: null` + a `reason`, never a guessed charge.
303
300
 
304
- ## The scripted-browser route (shipped)
301
+ ## The scripted-browser route
305
302
 
306
303
  `scripted-browser` is the deterministic, model-free browser-actuation route, distinct from
307
304
  `computer-use` (raw pixels + a model deciding actions). The registered
308
305
  `scripted-browser` actor (`src/actors/scripted-browser/`) replays a committed scenario's
309
- browser steps with playwright against a loopback app; the steps ARE the behavior, so
310
- `byoModel: false` means there is NO model, and `tokenUsage` records zeros as an affirmative
306
+ browser steps with playwright against a loopback app; the steps are the behavior, so
307
+ `byoModel: false` means there is no model, and `tokenUsage` records zeros as an affirmative
311
308
  $0 declaration that is true by mechanism (no provider client is importable from that code
312
309
  path). Its trace keeps the concrete driver name `provider: "browser-persona"` (matching the
313
310
  native `humanish.browser-persona-trace.v1` it also emits) with `protocol: "scripted-steps"`.
@@ -322,16 +319,16 @@ has no persona patience and no approvals.
322
319
 
323
320
  ### The time budget vs. a stuck timeout (`budget_reached`)
324
321
 
325
- `execution.timeoutMs` is a GENEROUS wall-clock SAFETY cap, not a goal. An open-ended
322
+ `execution.timeoutMs` is a generous wall-clock safety cap, not a goal. An open-ended
326
323
  "watch it play" session has no success predicate, because productive play is the outcome. So
327
324
  the computer-use loop distinguishes two ways to hit the cap:
328
325
 
329
- - **`budget_reached`**: the deadline was reached AFTER at least one material (non-idle)
326
+ - **`budget_reached`**: the deadline was reached after at least one material (non-idle)
330
327
  action, or a spend, adapter or token limit ended the session. This maps to `ActorStatus:
331
328
  "incomplete"`: the participant did not reach the goal, and the harness did not fail.
332
329
  `participantOutcomeOk` is false, the verdict is `fail`, and the CLI exits `2`. The trace
333
330
  `reason` and optional `stopCause` say which limit ended the session.
334
- - **`timed_out`**: the deadline was reached with ZERO material actions (a hung provider, an
331
+ - **`timed_out`**: the deadline was reached with zero material actions (a hung provider, an
335
332
  idle-only stall). This maps to `ActorStatus: "timed_out"`, `participantOutcomeOk` is false, the
336
333
  verdict is `timed_out`, and the CLI exits `2`.
337
334
 
@@ -342,7 +339,7 @@ switch with no default, so a new completion reason forces a compile-time decisio
342
339
  status. ~30 min (`1_800_000`) is a reasonable default for open-ended watch; the persona
343
340
  still stops early on `goal_satisfied`/`gave_up`/`stopWhen`.
344
341
 
345
- Actuation-vs-spend gate: on the scripted lab route `scenario.mode: live` is still required
342
+ Actuation-vs-spend gate: on the scripted route `mode: live` is still required
346
343
  even though provider spend is $0 by mechanism. The gate's justification there is actuation,
347
344
  not cost: a live scripted run drives a real browser against a real running app
348
345
  (state-mutating effects on the operator's app), which deserves the same affirmative
@@ -351,8 +348,8 @@ this paragraph is the record of that decision.
351
348
 
352
349
  ## Optional closing report
353
350
 
354
- `CuaProvider.debrief` is an optional read-only request after a structured
355
- `stopWhen` or dwell stop. It returns a `CuaTurn` with `closingReport` containing
351
+ `ComputerUseProvider.debrief` is an optional read-only request after a structured
352
+ `stopWhen` or dwell stop. It returns a `ComputerUseTurn` with `closingReport` containing
356
353
  `summary` and `frictionReports`; an empty friction list is valid. The loop rejects
357
354
  actions, pending safety checks, and invalid report shapes. It redacts accepted
358
355
  reports, records them in `ActorTrace.debrief`, and projects one readable message
@@ -367,39 +364,40 @@ from interaction turns, and reported usage contributes to aggregate cost.
367
364
 
368
365
  The OpenAI implementation makes one request with tools disabled and structured
369
366
  output; no HTTP or policy retries. Stateless/ZDR mode does not offer retrospective
370
- reporting because it does not retain the required session history. The
371
- [paired live receipt](https://github.com/danielgwilson/humanish/blob/main/docs/goals/computer-use-actor/receipts/structured-closing-report-2026-09-05.md)
367
+ reporting: its client-carried conversation summarizes its oldest turns past a token
368
+ budget, so it may not hold the whole session a retrospective report needs. The
369
+ [paired live receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/computer-use/structured-closing-report-2026-09-05.md)
372
370
  records both report recovery and control failures in the separate legacy parser.
373
371
 
374
- ## The state-driven executor seam (shipped)
372
+ ## The state-driven executor seam
375
373
 
376
- The `CuaExecutor` / `CuaProvider` ports are the concrete realization of the "plural harnesses /
374
+ The `ComputerUseExecutor` / `ComputerUseProvider` ports are the concrete realization of the "plural harnesses /
377
375
  transport-agnostic" intent above: the computer-use loop does not require a screen or a vision
378
376
  model. A library caller can drive an **already-running local app** through its in-process JS
379
- contract (`window.app.getState()` etc.) with a custom `CuaExecutor` (screenshot optional,
380
- `appState` as the progress signal) paired with a **non-vision** `CuaProvider` (`requiresFrame`
381
- falsey), keeping the whole lab composition with NO E2B desktop and NO clone. See
377
+ contract (`window.app.getState()` etc.) with a custom `ComputerUseExecutor` (screenshot optional,
378
+ `appState` as the progress signal) paired with a **non-vision** `ComputerUseProvider` (`requiresFrame`
379
+ falsey), keeping the whole study composition with no E2B desktop and no clone. See
382
380
  [`state-driven-executor.md`](./state-driven-executor.md) for the port, both entry points
383
- (`runComputerUseLoop` and `runLab` + `inProcess`/`createProvider`), the `subject.source:
381
+ (`runComputerUseLoop` and `runStudy` + `inProcess`/`createProvider`), the `subject.source:
384
382
  local-app` config surface, the `requiresFrame` provider-authoring contract, and the
385
383
  appState-is-runtime-only stance.
386
384
 
387
- ## The product-adapter extension seam (shipped in the terminal-product route, layer 6)
385
+ ## The product-adapter extension seam
388
386
 
389
- The terminal-product route carries the proof-roadmap layer-6 deliverable: a product adopter
390
- attaches product-specific scoring + feedback as a THIN in-repo extension WITHOUT forking
387
+ The terminal-product route has a product-adapter extension seam: a product adopter
388
+ attaches product-specific scoring + feedback as a thin in-repo extension without forking
391
389
  core. The seam is exported contract types (`RunBundle`, `RunFeedbackCandidate`,
392
390
  `RunAdapterScore`, `ActorTrace`, `AdapterScorerModule` and the terminal-route
393
- `TerminalProductScoringContext`) plus a registrable scorer module, `RunLabOptions.scorer`,
391
+ `TerminalProductScoringContext`) plus a registrable scorer module, `RunStudyOptions.scorer`,
394
392
  with optional `score` and `deriveFeedback`. The older `terminalHooks` and `cuaHooks` bags were
395
- removed from `RunLabOptions`. The adapter records its product nouns ONLY
396
- under an adapter-NAMESPACED block (`RunFeedbackCandidate.adapter` /
393
+ removed from `RunStudyOptions`. The adapter records its product nouns only
394
+ under an adapter-namespaced block (`RunFeedbackCandidate.adapter` /
397
395
  `RunAdapterScore.{namespace,data}`), so core's enums stay product-agnostic: no adopter noun
398
396
  is hardcoded into a core enum. Default (no hook) behavior is unchanged. See
399
- [`terminal-product-route.md`](./terminal-product-route.md#slice-4-the-product-adapter-extension-seam-layer-6)
397
+ [`terminal-product-route.md`](./terminal-product-route.md#the-product-adapter-extension-seam)
400
398
  for the full seam and the thin-adapter conformance proof.
401
399
 
402
- ## Making personas load-bearing
400
+ ## Making personas change the actor's behavior
403
401
 
404
402
  The original bug, now fixed: `loadDryRunInputs` (`src/run/dry-run-inputs.ts`) parsed
405
403
  persona YAML down to `{ id, name, source, sourceDigest }` and discarded `summary`,
@@ -411,7 +409,7 @@ Plan:
411
409
 
412
410
  1. **Parse the whole persona** into a `ResolvedPersona`: `{ id, name, summary, goals[],
413
411
  traits: { patience, skill, accessibilityNeeds? }, constraints[], sourceDigest }` (map
414
- `technical_confidence` to `skill`). The shipped shape in `src/lab/persona.ts` has no
412
+ `technical_confidence` to `skill`). The shipped shape in `src/study/persona.ts` has no
415
413
  `goals`, adds `background`, and makes every trait optional.
416
414
  2. **Compile traits into actor-neutral directives**, not prose, via a pure
417
415
  `personaToDirectives(p)`:
@@ -437,7 +435,7 @@ traits: { patience, skill, accessibilityNeeds? }, constraints[], sourceDigest }`
437
435
  candidate. The harness imposes no turn cap; its hard stops are the wall-clock
438
436
  `timeoutMs` and declared spend caps.
439
437
  4. **Bind the same directives per harness.** `renderPersonaPromptSection`
440
- (`src/lab/persona.ts`) renders the directives as one prompt section, and each harness puts
438
+ (`src/study/persona.ts`) renders the directives as one prompt section, and each harness puts
441
439
  that section where its model reads standing instructions:
442
440
  - Computer use: `composeParticipantInstructions`
443
441
  (`src/routes/computer-use/participant-prompt.ts`) opens the participant instructions
@@ -459,7 +457,7 @@ traits: { patience, skill, accessibilityNeeds? }, constraints[], sourceDigest }`
459
457
  - Stagehand remains roadmap. This rule once planned a pi binding (`systemPrompt` +
460
458
  `beforeToolCall`) and a Claude Agent SDK one (`systemPrompt` + `allowedTools`). pi
461
459
  shipped only as a trace mapper, the Claude Agent SDK descriptor never had a route, and
462
- #955 removed both.
460
+ both were removed.
463
461
 
464
462
  None of these uses a `max_turns`-style cap as the persona stop condition.
465
463
 
@@ -467,7 +465,7 @@ traits: { patience, skill, accessibilityNeeds? }, constraints[], sourceDigest }`
467
465
  `persona-fidelity` verify check asserts that the friction and accessibility directives
468
466
  reached the actor input and that a `gave_up` run cites a concrete friction reason (not a
469
467
  turn count). "Did the persona drive the run" becomes a verifiable artifact. (Status
470
- 2026-06-11: `personaToDirectives` shipped in `src/lab/persona.ts` and `traitsApplied` is
468
+ 2026-06-11: `personaToDirectives` shipped in `src/study/persona.ts` and `traitsApplied` is
471
469
  threaded on the codex-exec terminal route, but the `persona-fidelity` verify check is
472
470
  not-yet-shipped roadmap. The computer-use route records `persona.traitsApplied` from the
473
471
  resolved persona in `src/routes/computer-use/participant-prompt.ts`.)
@@ -513,7 +511,7 @@ Non-obvious tradeoffs to revisit with real-run data:
513
511
  - `persona-fidelity` treats a `gave_up` with no cited friction as a fidelity
514
512
  failure, not an accepted stop, so the model cannot quietly quit for no reason.
515
513
 
516
- This keeps patience load-bearing and reproducible without ever using elapsed
514
+ So patience decides when a run stops, reproducibly, without ever using elapsed
517
515
  turns as a stop signal.
518
516
 
519
517
  ## Capability matrix (target adapters)
@@ -525,41 +523,12 @@ turns as a stop signal.
525
523
  | claude-agent-sdk (removed) | yes (SDK + `-p` stream-json) | typed ToolUse/ToolResult + cost | OS sandbox + dontAsk/allowedTools | Anthropic-centric | SDK MIT (CLI proprietary) | code, app |
526
524
  | stagehand-cua (roadmap, not shipped; `openai-computer-use` is the shipped computer-use actor) | yes (SDK, mode:'cua') | structured results + replay | Playwright/Browserbase isolation | OpenAI/Anthropic/Google | MIT | computer-use |
527
525
 
528
- ## Sequencing
529
-
530
- 1. This document.
531
- 2. Shared `RedactionHooks` module (completes the remaining #107 criterion) plus
532
- the `Actor` contract types, with the Codex integration refactored to implement
533
- `Actor` and emit `ActorTrace` behind the back-compat alias. Add an
534
- `actorRegistry`; generalize `RunStream.codex` to `RunStream.actor`.
535
- 3. Personas load-bearing: `ResolvedPersona`, `personaToDirectives`, harness turn
536
- budget, and the `persona-fidelity` verify check.
537
- 4. `pi-agent-core` adapter (proves the contract against a non-Codex protocol;
538
- local-model dogfood for ~$0). Landed in two slices: first the pure
539
- `piSessionToActorTrace` mapper + registry generalization (discriminated
540
- `ActorDescriptor` union + `getActor` overloads) + a fixture conformance test,
541
- with no pi dependency and no model key required (proves the evidence contract
542
- is provider-neutral); then a follow-up live SDK shim behind a DI seam, deferred
543
- until the package identity (`@earendil-works/pi-agent-core` vs
544
- `@mariozechner/pi-coding-agent`) and the Node `>=22.19` vs engines `>=20` gap
545
- are pinned against an installed build. The live shim never landed, and #955
546
- removed the mapper-only descriptor because no route dispatched it.
547
- 5. `claude-agent-sdk` adapter (the `app` run kind). It shipped as a descriptor with
548
- a live session but no route, and #955 removed it along with the `app` run kind.
549
- 6. Computer-use route. (Shipped as `openai-computer-use`: registered 0.3.0,
550
- lab-dispatched 0.4.0; `stagehand-cua` as a multi-provider front remains
551
- not-yet-shipped roadmap.)
552
- 7. Cross-harness conformance test: one persona x scenario through every adapter,
553
- asserting identical trace shape, completion vocabulary, and redaction status.
554
- 8. The proof point: run the harness-plural loop against popular OSS repos and turn
555
- real, merged issues into the receipt.
556
-
557
526
  ## Risks
558
527
 
559
528
  - Protocol/version drift across four moving harnesses. Pin every binary/SDK and
560
529
  assert the init handshake; the registry refuses an actor whose declared
561
530
  capabilities do not satisfy the scenario.
562
- - Screenshot PII in the computer-use route. Redaction binds the PUBLISH
531
+ - Screenshot PII in the computer-use route. Redaction binds the publish
563
532
  boundary, not capture (0.6.0): raw frames stay local in gitignored
564
533
  `.humanish/` and are never emitted by a publish command (this repo's CI
565
534
  binary-asset scan also blocks them from commit);
@@ -578,4 +547,4 @@ turns as a stop signal.
578
547
 
579
548
  - Self-driving harness principles: `docs/principles/self-driving-harness.md`.
580
549
  - Observer architecture: `docs/architecture/observer.md`.
581
- - Related issues: shared redaction module (#107), PII/PHI detector (#108).
550
+ - Open issue: [a PII/PHI detector for the redaction gate](https://github.com/danielgwilson/humanish/issues/108).
@@ -61,7 +61,7 @@ admission. There is no generic CDP, command, file, navigation-management, or
61
61
  runtime-management method. Initial target navigation remains an adapter-owned
62
62
  operation.
63
63
 
64
- Replies acknowledge completion or contain a finite `CuaExecutorError` code and
64
+ Replies acknowledge completion or contain a finite `ComputerUseExecutorError` code and
65
65
  `not_dispatched` / `outcome_uncertain` disposition. They never include raw
66
66
  exception prose, typed text, page URLs, or browser errors in their error fields.
67
67
  A generic driver exception after invocation is uncertain; only a genuine typed
@@ -2,7 +2,7 @@
2
2
 
3
3
  Independent computer-use participants, on hosted E2B desktops and local Firecracker
4
4
  desktops, acquire an owned desktop allocation before subject setup, then bind its
5
- executor after browser setup. The participant loop still consumes `CuaExecutor`;
5
+ executor after browser setup. The participant loop still consumes `ComputerUseExecutor`;
6
6
  provisioning commands stay in the desktop adapter. This internal interface is not
7
7
  a public runtime plugin API.
8
8
 
@@ -45,7 +45,7 @@ span, not a provider billing measurement.
45
45
  2. The runner starts its model session and signals the existing hosted pipeline
46
46
  gate, preserving the current scheduling order.
47
47
  3. `openSession()` measures initial browser geometry, starts the optional live
48
- stream, and supplies a `CuaExecutor` plus any participant inbox location.
48
+ stream, and supplies a `ComputerUseExecutor` plus any participant inbox location.
49
49
  4. The runner executes the participant loop and closes its model session.
50
50
  5. `finalize()` collects final evidence and releases the desktop, including after
51
51
  preparation or participant failure. Repeated calls share one finalization.
@@ -62,16 +62,16 @@ its steps in the files beside it; acquisition and release are in
62
62
  `src/substrates/e2b/desktop-media.ts`. Subject provisioning lives in
63
63
  `src/subject/` and reaches the sandbox only through a `Shell`
64
64
  (`src/substrates/shell.ts`), which `e2bShell` (`src/substrates/e2b/shell.ts`)
65
- builds from the sandbox handle. The adapter never imports the lab runner at
65
+ builds from the sandbox handle. The adapter never imports the study runner at
66
66
  runtime.
67
67
 
68
68
  The runner owns instructions, model execution, spend guards, screenshots, trace
69
69
  persistence and participant outcome interpretation. It does not invoke desktop
70
70
  shell commands or manufacture E2B objects for an alternate executor. A local
71
71
  Firecracker run supplies its desktops through the computer-use run's `localVm`
72
- input (`LocalVmInput` in `src/routes/computer-use/types.ts`). runLab builds that
72
+ input (`LocalVmInput` in `src/routes/computer-use/types.ts`). runStudy builds that
73
73
  input with `prepareLocalVmRun` (`src/routes/computer-use/local-vm.ts`), and no
74
- package caller can set it. Contract tests pass a `localVm` desktop on a lab with
74
+ package caller can set it. Contract tests pass a `localVm` desktop on a study with
75
75
  `execution.target: local`. Neither bypasses CLI admission checks.
76
76
 
77
77
  Final evidence errors cannot skip desktop release. Existing bundle fields and
@@ -81,12 +81,12 @@ adapter cannot establish them.
81
81
 
82
82
  Independent hosted browser and terminal participants, local Firecracker participants, and
83
83
  shared-world participants that use `runCuaParticipant` use this boundary. Local execution is
84
- described in [local browser studies](local-browser-runtime.md).
84
+ described in [local browser studies](https://humanish.dev/docs/local-browser).
85
85
 
86
86
  The `runSession` testing hook for independent participants now receives a constructed
87
87
  `executor` instead of `desktop`/`executorOptions`. A hook should consume the
88
88
  normal `CuaActorSessionOptions` executor or delegate to the internal
89
89
  `runCuaActorSession`. The `runCuaActorSession` export was removed in 0.107.0; a
90
90
  library caller uses `runComputerUseLoop`. A custom in-process
91
- executor now goes through `RunLabOptions.inProcess`, which replaces the
91
+ executor now goes through `RunStudyOptions.inProcess`, which replaces the
92
92
  removed `cuaHooks.buildExecutor`.
@@ -1,6 +1,6 @@
1
- # External-public shared-world plane + the CDP lobby-code handoff (#164 phase 2, 0.20.0)
1
+ # External-public shared world and the lobby-code handoff
2
2
 
3
- The concurrent shared-world backend now has TWO plane classes. This note documents the new
3
+ The shared-world route has two plane classes. This note documents the new
4
4
  `external-public` class and the host-first handoff barrier that makes cross-persona coordination on a
5
5
  real public app possible without any persona-to-persona messaging.
6
6
 
@@ -8,36 +8,36 @@ real public app possible without any persona-to-persona messaging.
8
8
 
9
9
  | | provisioned-getHost (historical) | external-public (new) |
10
10
  | ------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
11
- | Shared plane | a `clone`/`local-tree` subject served + `getHost`-exposed IN-SANDBOX | a real operator-OWNED public deployment (`source: app-url`) used DIRECTLY |
12
- | Harness role | MINTED and controls the host URL | OBSERVES that the participants converged on ONE origin (tolerant of a declared→observed redirect) |
11
+ | Shared plane | a `clone`/`local-tree` subject served + `getHost`-exposed in-sandbox | a real operator-owned public deployment (`source: app-url`) used directly |
12
+ | Harness role | Minted and controls the host URL | Observes that the participants converged on one origin (tolerant of a declared→observed redirect) |
13
13
  | Subject sandbox | one (headless service host) + N actor desktops | none; only N actor desktops |
14
14
  | Attestation | `subject.exposure: synthetic` (synthetic seeded data) | `subject.publicTarget: { owner, authorized }` (you own/operate it) |
15
15
  | Provenance | `subject.state.provenance == seeded` | `subject.state.provenance == external-public` |
16
16
  | Plane identity | `plane.hostDigest`; every `routeHostDigest == it` (harness-minted) | `plane.publicOriginDigest`; every CDP-observed `routeHostDigest == it` (observed) |
17
- | Shared-state proof | authoritative in-sandbox checkpoint `stateSeries` + delta-on-pass | none; `stateSeries` OMITTED (Option A) |
18
- | Concurrency-on-pass | ≥2 overlapping windows AND a state delta at/after an overlap start | ≥2 overlapping windows ONLY (temporal co-occupancy) |
17
+ | Shared-state proof | authoritative in-sandbox checkpoint `stateSeries` + delta-on-pass | none; `stateSeries` omitted (Option A) |
18
+ | Concurrency-on-pass | ≥2 overlapping windows and a state delta at/after an overlap start | ≥2 overlapping windows only (temporal co-occupancy) |
19
19
  | Extra proof | none | `lobbyConvergenceDigest` (all participants on one `/lobby/CODE`) |
20
20
 
21
21
  The run's own verdict applies the same concurrency-on-pass rule per plane (`judgeSharedWorld` in
22
- `src/run/judge.ts`), so a run whose participants all passed but missed it reads fail and the lab exits
22
+ `src/run/judge.ts`), so a run whose participants all passed but missed it reads fail and the study exits
23
23
  non-zero.
24
24
 
25
25
  In short: getHost = harness-minted host + synthetic-seeded attestation + authoritative
26
- in-sandbox checkpoint `stateSeries`. external-public = operator-attested public origin + NO synthetic
27
- claim + NO authoritative shared-state proof (concurrency evidenced by temporal co-occupancy +
28
- observed lobby-path convergence only). Every downgrade is asserted-ABSENT by verify, never silently
29
- dropped: `plane.exposure` MUST be absent (claiming synthetic on a real site is a lie),
30
- `plane.hostDigest` MUST be absent, the `seeded`/`synthetic` attribution limits are FORBIDDEN, and the
31
- external-public honest-downgrade limits are REQUIRED.
32
-
33
- Why the getHost synthetic gate is deliberately NOT reachable from the app-url branch: that gate
34
- (`concurrentSharedWorldValidationReason` in `src/lab/validation.ts` requires `subject.exposure:
26
+ in-sandbox checkpoint `stateSeries`. external-public = operator-attested public origin + no synthetic
27
+ claim + no authoritative shared-state proof (concurrency evidenced by temporal co-occupancy +
28
+ observed lobby-path convergence only). Every downgrade is asserted-absent by verify, never silently
29
+ dropped: `plane.exposure` must be absent (claiming synthetic on a real site is a lie),
30
+ `plane.hostDigest` must be absent, the `seeded`/`synthetic` attribution limits are forbidden, and the
31
+ external-public disclosure limits are required.
32
+
33
+ Why the getHost synthetic gate is deliberately not reachable from the app-url branch: that gate
34
+ (`concurrentSharedWorldValidationReason` in `src/study/validation.ts` requires `subject.exposure:
35
35
  synthetic`, a `0.0.0.0` bind and no `keep`; verify's `getHostPlaneFindings` in
36
36
  `src/verify/shared-world-concurrent.ts` then requires `plane.exposure == synthetic` and
37
- `subject.state.provenance == seeded`) exists because a getHost URL is internet-reachable AND
37
+ `subject.state.provenance == seeded`) exists because a getHost URL is internet-reachable and
38
38
  harness-owned; real data behind a harness-exposed URL is the hazard. A public site the harness
39
- neither provisioned nor exposed has NEITHER property, so the gate's hazard does not exist there. The
40
- app-url branch is validated by `externalPublicSharedWorldValidationReason` (`src/lab/validation.ts`)
39
+ neither provisioned nor exposed has neither property, so the gate's hazard does not exist there. The
40
+ app-url branch is validated by `externalPublicSharedWorldValidationReason` (`src/study/validation.ts`)
41
41
  and is reached before the getHost gate; a snapshot regression test pins the getHost path
42
42
  byte-unchanged.
43
43
 
@@ -48,19 +48,21 @@ Reading a participant's live URL mid-run is already implemented: `makeChromeBrow
48
48
  (`src/substrates/e2b/cdp-probe.ts`) that resolves the participant's Chrome CDP port, selects the participant's
49
49
  page, and sends `Runtime.evaluate({ url: location.href, title, text })` over the page's
50
50
  `webSocketDebuggerUrl`. `createE2BDesktopExecutor` stamps `observation.url` from it every turn.
51
- `CuaObservation.url` is RUNTIME-ONLY by contract (it drives `stopWhen`/progress but is never
51
+ `CuaObservation.url` is runtime-only by contract (it drives `stopWhen`/progress but is never
52
52
  persisted raw into the trace).
53
53
 
54
- The 0.20.0 delta is a single surgical callback: `CuaLoopOptions.onObservedUrl?(url)`, invoked right
55
- after every `executor.observe()` (the initial observe and each loop observe) with `observation.url`,
56
- threaded through `CuaActorSessionOptions` → `CuaParticipantDeps` → the concurrent orchestrator. No new CDP
57
- code; no lobby-trivia change. The CDP URL read later proved unreliable on E2B desktops, so the
58
- host's code can now also come from its narration or its screen (step 2).
54
+ The route reads each participant's URL through one callback, `LoopTaps.onObservedUrl?(url)`,
55
+ invoked right after every `executor.observe()` (the initial observe and each loop observe) with
56
+ `observation.url`, threaded through `CuaActorSessionOptions` → `CuaParticipantDeps` → the concurrent
57
+ orchestrator. It adds no CDP code and needs no change to the lobby-trivia app. The CDP URL read is
58
+ unreliable on E2B desktops, so the host's code can also come from its narration or its screen
59
+ (step 2).
59
60
 
60
- `onObservedUrl`, `onMessage` and `onScreenshot` are deprecated on `CuaLoopOptions`, and the next
61
- minor removes them. A `runComputerUseLoop` caller that used them wraps the executor's `observe`
62
- (for `url` and `screenshot`) or the provider's `nextTurn` (for `reasoning` and `message`). The
63
- handoff still passes all three.
61
+ `onObservedUrl`, `onMessage` and `onScreenshot` are internal `LoopTaps`
62
+ (`src/actors/computer-use/loop/types.ts`): 0.109.0 removed them from `ComputerUseLoopOptions`, and the
63
+ public `runComputerUseLoop` refuses them. The actor passes them through
64
+ `runComputerUseLoopWithTaps`. A library caller wraps the executor's `observe` (for `url` and
65
+ `screenshot`) or the provider's `nextTurn` (for `reasoning` and `message`).
64
66
 
65
67
  Flow, a host-first barrier inside `runConcurrentSharedWorld`'s fan-out:
66
68
 
@@ -71,71 +73,72 @@ Flow, a host-first barrier inside `runConcurrentSharedWorld`'s fan-out:
71
73
  `/\/lobby\/([A-Z2-9]{6})(?:$|[/?#])/` (a locale prefix `/en/lobby/CODE` and a query/hash suffix
72
74
  are tolerated), a lobby code in its narration (`extractLobbyCodeFromNarration`), or a vision read
73
75
  of its screenshot (`readLobbyCodeFromFrame`). The vision reads are out-of-band OpenAI calls, at
74
- most 30 per participant, and are not counted against `execution.caps.maxUsd`. The host KEEPS PLAYING
76
+ most 30 per participant, and are not counted against `caps.maxUsd`. The host keeps playing
75
77
  after resolving, so its window overlaps the followers'.
76
- 3. **Barrier.** Follower participants (`host` absent) do NOT compose a mission or open their target until
77
- the latch resolves or the handoff deadline passes. On resolve, CODE is threaded into each
78
- follower's mission ("…choose Join, enter lobby code {CODE}…"). It is not a raw URL navigation,
78
+ 3. **Barrier.** Follower participants (`host` absent) do not compose a mission or open their target until
79
+ the latch resolves or the handoff deadline passes. On resolve, code is threaded into each
80
+ follower's mission (`…choose Join, enter lobby code {CODE}…`). It is not a raw URL navigation,
79
81
  because a direct `/lobby/CODE` visit does not auto-join a non-member (lobby-trivia's lobby page
80
82
  redirects unknown/non-member sessions home); the follower goes through the real Join flow.
81
83
  4. **Convergence confirmation.** Each follower's own `onObservedUrl`, or a vision read of its own
82
84
  frame, confirms it reached `/lobby/CODE`; this observed convergence becomes the
83
- `lobbyConvergenceDigest`, the pass signal that the handoff LANDED rather than merely being
84
- instructed. Recorded only when EVERY participant converged on ONE code.
85
+ `lobbyConvergenceDigest`, the pass signal that the followers reached the lobby. An instruction to
86
+ join does not set it. It is recorded only when every participant converged on one code.
85
87
  5. **Fail-closed timeout.** If the host never yields a `/lobby/CODE` within the handoff deadline
86
88
  (`min(execution.timeoutMs, max(120 s, 40% of execution.timeoutMs))`; injectable in tests), the
87
- latch rejects; every follower fails closed WITHOUT opening (no wasted turns against a codeless
88
- home page); the run returns `HUMANISH_CONCURRENT_SHARED_WORLD_LAB_HANDOFF_TIMEOUT` and the bundle
89
+ latch rejects; every follower fails closed without opening (no wasted turns against a codeless
90
+ home page); the run returns `HUMANISH_SHARED_WORLD_HANDOFF_TIMEOUT` and the bundle
89
91
  records the host window + a handoff-failed outcome for followers. If the host participant ends without a
90
92
  code before the deadline, `releaseFollowersIfUnlatched` releases the followers at once and the
91
- run returns `HUMANISH_CONCURRENT_SHARED_WORLD_LAB_FAILED` with the host's reason. A host that
92
- reaches the lobby but whose followers fail to JOIN is a normal per-participant non-pass (the
93
- concurrency-on-pass gate then simply won't see ≥2 overlap, and the verdict stays non-pass,
94
- honestly), not a whole-run abort.
95
-
96
- > **Temporary shim (tracked by #296).** This CDP URL-relay handoff — reading the host's `/lobby/CODE`
97
- > off its own browser and threading it into the follower missions — is a TEMPORARY coordination shim.
98
- > It is to be augmented/replaced by the actor message bus (fake SMS/email invite) in #297: the
99
- > human-realistic version is the HOST SENDING the invite link and followers RECEIVING and tapping it,
100
- > rather than the orchestrator relaying the code out-of-band.
93
+ run returns `HUMANISH_SHARED_WORLD_FAILED` with the host's reason. A host that
94
+ reaches the lobby but whose followers fail to join is a normal per-participant non-pass (the
95
+ concurrency-on-pass gate then simply won't see ≥2 overlap, and the verdict stays non-pass),
96
+ not a whole-run abort.
97
+
98
+ > **Temporary shim.** This CDP URL-relay handoff reads the host's `/lobby/CODE` off its own browser
99
+ > and threads it into the follower missions.
100
+ > [An open issue](https://github.com/danielgwilson/humanish/issues/296) tracks replacing it with the
101
+ > [actor message bus](https://github.com/danielgwilson/humanish/issues/297), where the host sends an
102
+ > SMS or email invite link and the followers receive and tap it. The orchestrator then no longer
103
+ > relays the code out of band.
101
104
 
102
105
  ## Observed-origin convergence (not declared)
103
106
 
104
- The convergence proof is about what the participants OBSERVED, not what was DECLARED. `plane.publicOriginDigest`
105
- is the sha256-16 of the ONE origin the participants' CDP-observed final URLs converged on; verify requires every
107
+ The convergence proof is about what the participants observed, not what was declared. `plane.publicOriginDigest`
108
+ is the sha256-16 of the one origin the participants' CDP-observed final URLs converged on; verify requires every
106
109
  `laneWindow.routeHostDigest` to agree on it. A normal cross-origin redirect (apex→www, http→https;
107
- lobby-trivia.example.test 307-redirects) makes the OBSERVED origin differ from the declared `subject.appUrl`, which
108
- is EXPECTED and must never fail the run. So the declared origin is recorded separately as
109
- `plane.declaredOriginDigest` for reference and is NEVER asserted equal to the observed one. Operator
110
- OWNERSHIP rests on the `subject.publicTarget.authorized` attestation + the declared `appUrl`, NOT on
111
- digest equality. Verify fails closed only when the participants did not converge on a single OBSERVED origin
110
+ lobby-trivia.example.test 307-redirects) makes the observed origin differ from the declared `subject.appUrl`, which
111
+ is expected and must never fail the run. So the declared origin is recorded separately as
112
+ `plane.declaredOriginDigest` for reference and is never asserted equal to the observed one. Operator
113
+ ownership rests on the `subject.publicTarget.authorized` attestation + the declared `appUrl`, not on
114
+ digest equality. Verify fails closed only when the participants did not converge on a single observed origin
112
115
  (it then lists the distinct observed origin digests).
113
116
 
114
117
  ## Hygiene
115
118
 
116
- The runtime `location.href` (and the 6-char CODE inside it) is never persisted raw: `onObservedUrl` is
117
- runtime-only; the threaded CODE flows only into the follower's composed prompt (never a raw bundle
118
- field) and is scrubbed from all narration once latched; the shared origin and lobby path persist ONLY
119
+ The runtime `location.href` (and the 6-char code inside it) is never persisted raw: `onObservedUrl` is
120
+ runtime-only; the threaded code flows only into the follower's composed prompt (never a raw bundle
121
+ field) and is scrubbed from all narration once latched; the shared origin and lobby path persist only
119
122
  as sha256-16 digests (`publicOriginDigest`, `lobbyConvergenceDigest`). This matches the existing
120
123
  e2b-URL / host-digest redaction discipline.
121
124
 
122
125
  ## Mobile fidelity caveat
123
126
 
124
- The example roster runs mobile-LAYOUT participants (`device: mobile` 414×896, `small-mobile` 360×740). On
125
- the E2B-desktop route the rendered WIDTH is floored to `MIN_DESKTOP_RENDER_WIDTH` (500) because
126
- Chrome refuses a narrower window and a narrower X screen clipped the page (0.20.3, #304), so both
127
- presets render at 500 wide and are identical in layout; only HEIGHT renders as declared.
127
+ The example roster runs mobile-layout participants (`device: mobile` 414×896, `small-mobile` 360×740). On
128
+ the E2B-desktop route the rendered width is floored to `MIN_DESKTOP_RENDER_WIDTH` (500) because
129
+ Chrome refuses a narrower window and a narrower X screen clips the page, so both
130
+ presets render at 500 wide and are identical in layout; only height renders as declared.
128
131
  `desktopGeometry.screen.verified` compares the floored number with itself, so it does not attest the
129
- preset width. There is NO touch input, and `isMobile`/DPR are prompt-signal + metadata (DPR renders
130
- only via the CDP geometry path). "3 mobile personas" = 3 mobile-LAYOUT desktop-Chromium participants, not
132
+ preset width. There is no touch input, and `isMobile`/DPR are prompt-signal + metadata (DPR renders
133
+ only via the CDP geometry path). "3 mobile personas" = 3 mobile-layout desktop-Chromium participants, not
131
134
  touch devices. Do not over-read the results as true mobile-device coverage. That describes the
132
- default. With `execution.desktop.fidelity.mobileEmulation: true` (#221), Chromium participants on a mobile
135
+ default. With `execution.desktop.fidelity.mobileEmulation: true`, Chromium participants on a mobile
133
136
  preset get a DevTools device-metrics override at the preset width, plus DPR, touch emulation and a
134
137
  mobile user agent. That is still not physical-device fidelity.
135
138
 
136
139
  ## Watch-from-phone
137
140
 
138
141
  Native live-desktop `--expose` is not supported on the concurrent path; only the computer-use
139
- backend live-serves a run (`src/cli/io.ts`). Today, watch it from a phone via `humanish serve
142
+ route live-serves a run (`src/cli/io.ts`). Today, watch it from a phone via `humanish observe --all
140
143
  --expose --tunnel … --oauth …` against the run directory's Observer (the concurrent path writes
141
144
  artifacts continuously and attaches per-participant runtime stream URLs to the live Observer).
@@ -1,9 +1,6 @@
1
1
  # Public GitHub Feedback Loop Architecture
2
2
 
3
- Date: 2026-06-01
4
-
5
- Status: design note. The v0 dry-run issue draft path is implemented locally;
6
- live GitHub mutation remains out of scope.
3
+ This is a design note. The dry-run issue draft path ships; live GitHub mutation is out of scope.
7
4
 
8
5
  ## Goal
9
6
 
@@ -82,7 +79,7 @@ readiness, uses the labels and the `humanish_swarm` block below.
82
79
  draft (`src/feedback/draft.ts`).
83
80
  - `adapter-hardening`, `target-app-setup`, `actor-auth` and
84
81
  `setup-quality-review`: feedback candidates that an adapter adds to the
85
- bundle. `src/lab/adapter-extension.ts` checks the value.
82
+ bundle. `src/study/adapter-extension.ts` checks the value.
86
83
 
87
84
  ## Issue Body Contract
88
85
 
@@ -1,7 +1,7 @@
1
1
  # Headed browser guest components
2
2
 
3
3
  These internal components implement native input and full-desktop captures for the browser guest
4
- that [local browser studies](local-browser-runtime.md) run in a Firecracker VM. This page covers
4
+ that [local browser studies](https://humanish.dev/docs/local-browser) run in a Firecracker VM. This page covers
5
5
  the guest driver and its container proof; the local browser page covers the VM, its network
6
6
  policy and the installed study.
7
7
 
@@ -96,4 +96,4 @@ native scrolling and cancellation. CI reruns this proof for changes to the guest
96
96
  recipe, protocol or dependency lockfile. Its deterministic fixture is not a model participant, a
97
97
  run bundle, a host network policy, an independent watchdog or a Linux/Mac installed study. The
98
98
  local browser runtime is qualified separately; see [local browser
99
- studies](local-browser-runtime.md).
99
+ studies](https://humanish.dev/docs/local-browser).