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
@@ -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/lab/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
20
  owned by `runTerminalProductLab`, which coordinates sandbox creation,
24
21
  command-scoped runtime auth, evidence, caps, and by-id cleanup.
25
22
 
26
23
  The `pi-agent-core` and `claude-agent-sdk` descriptors, the `app` run kind and the
27
- `in-process-sdk` protocol were removed. 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
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,13 +61,24 @@ 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 has been removed.
68
-
69
- 2. **One normalized evidence schema: `humanish.actor-trace.v1`.** Codex `item/*`
70
- events, Claude `ToolUse`/`ToolResult` blocks, pi `tool_execution_*` events,
71
- and computer-use `computer_call` cycles all map onto one `ActorTrace` with a
72
- typed `items[]`. `humanish.codex-app-server-trace.v1` remains a back-compat
73
- alias during migration.
64
+ route, and was removed.
65
+
66
+ 2. **One normalized evidence schema: `humanish.actor-trace.v1`.** Four producers map
67
+ their records onto one `ActorTrace` with a typed `items[]`:
68
+ - Codex app-server `item/*` events, protocol `json-rpc`: `codexResultToActorTrace`
69
+ (`src/actors/codex/app-server-actor-trace.ts`).
70
+ - Computer-use loop turns, protocol `cua-loop`, whether the provider returned an OpenAI
71
+ `computer_call` or a local agent's JSON actions: `loopResult`
72
+ (`src/actors/computer-use/loop/trace.ts`).
73
+ - Scripted-browser steps, protocol `scripted-steps`: `projectScriptedActorTrace`
74
+ (`src/actors/scripted-browser/actor.ts`).
75
+ - The terminal route's command log and terminal events, protocol `terminal-exec`:
76
+ `buildTerminalActorTrace` (`src/routes/terminal/trace.ts`).
77
+
78
+ The Codex app-server still writes its own `humanish.codex-app-server-trace.v1` record
79
+ (`CodexAppServerTrace` in `src/actors/codex/app-server-trace.ts`), which
80
+ `codexResultToActorTrace` converts. The Claude Agent SDK `ToolUse`/`ToolResult` and pi
81
+ `tool_execution_*` mappers were removed with their adapters.
74
82
 
75
83
  3. **A run is multi-turn within one trace; it stops on goal, abandonment, unrecoverable
76
84
  failure, or a wall-clock safety timeout, never on a turn cap.** Turn count is explicitly
@@ -85,7 +93,7 @@ API surface.
85
93
  4. **Redaction is injected once, never re-implemented per adapter.** Every
86
94
  adapter receives `RedactionHooks` (the shared secret/path/prompt-digest
87
95
  redaction, plus screenshot redaction) and must route all persisted evidence
88
- through it. This is also where the remaining consolidation of #107 lands.
96
+ through it.
89
97
 
90
98
  5. **The registry refuses capability mismatches.** Each adapter declares
91
99
  `ActorCapabilities`. A scenario that needs `producesScreenshots` (a GUI
@@ -260,7 +268,13 @@ export interface Actor {
260
268
  run-bundle wiring is provider-agnostic. The artifact names differ by route: the Codex
261
269
  app-server adapter writes `events.ndjson`, `summary.json` and `transcript.txt`; a
262
270
  computer-use participant writes its trace to `actor.json` or `actors/<streamId>.json`; the
263
- terminal route writes `terminal-events.ndjson` and `terminal-transcript.txt`.
271
+ terminal route writes `terminal-events.ndjson` and `terminal-transcript.txt`. Analysis quotes
272
+ only `message` and `reasoning` items, so they carry the participant's own words. The terminal
273
+ route reads them from the Codex `agent_message` and `reasoning` items in the raw exec JSON
274
+ stream, in memory, before source redaction can break a line's JSON. It removes verdict marker
275
+ lines, then scrubs and redacts the decoded text. The trace keeps the last 200 items within
276
+ 128 KiB and adds a `notice` item when it leaves older ones out. The stream's last 2000
277
+ characters stay in the `command` item's `outputTail`.
264
278
  - **Approvals.** Call `approval.onRequest`; never embed adapter-local decline
265
279
  strings. Every call is recorded as an `items[kind=approval]`.
266
280
  - **Redaction.** Use the injected `RedactionHooks`. Never re-implement redaction
@@ -270,27 +284,27 @@ export interface Actor {
270
284
  public-safe: redacted message, coarse loop phase, last normalized UI action,
271
285
  and last screenshot reference only. Do not persist raw stacks, env values,
272
286
  target URLs, or unredacted provider payloads in the trace.
273
- - **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
274
288
  `producesScreenshots` do not fit the route; the other capabilities are not checked.
275
- - **Cost (estimate vs. charge).** `tokenUsage.costUsd` stays RESERVED for a
289
+ - **Cost (estimate vs. charge).** `tokenUsage.costUsd` stays reserved for a
276
290
  real, provider-returned charge (the codex path); a bare `costUsd`
277
291
  always means "the provider billed this". The optional `estimatedCost`
278
- (`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
279
293
  token-derived rate-table multiply from the operator-editable `src/run/pricing.ts`,
280
- labeled honestly as an estimate and projected up into `RunBundle.cost` (see
294
+ labeled as an estimate and projected up into `RunBundle.cost` (see
281
295
  [`../contracts/schemas.md`](../contracts/schemas.md) → Run Cost Summary And
282
- Estimated Actor Cost). The CUA lab computes and attaches `estimatedCost` at the
283
- 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
284
298
  depends on the pricing table. An unknown model yields
285
299
  `estimatedCostUsd: null` + a `reason`, never a guessed charge.
286
300
 
287
- ## The scripted-browser route (shipped)
301
+ ## The scripted-browser route
288
302
 
289
303
  `scripted-browser` is the deterministic, model-free browser-actuation route, distinct from
290
304
  `computer-use` (raw pixels + a model deciding actions). The registered
291
305
  `scripted-browser` actor (`src/actors/scripted-browser/`) replays a committed scenario's
292
- browser steps with playwright against a loopback app; the steps ARE the behavior, so
293
- `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
294
308
  $0 declaration that is true by mechanism (no provider client is importable from that code
295
309
  path). Its trace keeps the concrete driver name `provider: "browser-persona"` (matching the
296
310
  native `humanish.browser-persona-trace.v1` it also emits) with `protocol: "scripted-steps"`.
@@ -305,16 +319,16 @@ has no persona patience and no approvals.
305
319
 
306
320
  ### The time budget vs. a stuck timeout (`budget_reached`)
307
321
 
308
- `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
309
323
  "watch it play" session has no success predicate, because productive play is the outcome. So
310
324
  the computer-use loop distinguishes two ways to hit the cap:
311
325
 
312
- - **`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)
313
327
  action, or a spend, adapter or token limit ended the session. This maps to `ActorStatus:
314
328
  "incomplete"`: the participant did not reach the goal, and the harness did not fail.
315
329
  `participantOutcomeOk` is false, the verdict is `fail`, and the CLI exits `2`. The trace
316
330
  `reason` and optional `stopCause` say which limit ended the session.
317
- - **`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
318
332
  idle-only stall). This maps to `ActorStatus: "timed_out"`, `participantOutcomeOk` is false, the
319
333
  verdict is `timed_out`, and the CLI exits `2`.
320
334
 
@@ -325,7 +339,7 @@ switch with no default, so a new completion reason forces a compile-time decisio
325
339
  status. ~30 min (`1_800_000`) is a reasonable default for open-ended watch; the persona
326
340
  still stops early on `goal_satisfied`/`gave_up`/`stopWhen`.
327
341
 
328
- 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
329
343
  even though provider spend is $0 by mechanism. The gate's justification there is actuation,
330
344
  not cost: a live scripted run drives a real browser against a real running app
331
345
  (state-mutating effects on the operator's app), which deserves the same affirmative
@@ -334,8 +348,8 @@ this paragraph is the record of that decision.
334
348
 
335
349
  ## Optional closing report
336
350
 
337
- `CuaProvider.debrief` is an optional read-only request after a structured
338
- `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
339
353
  `summary` and `frictionReports`; an empty friction list is valid. The loop rejects
340
354
  actions, pending safety checks, and invalid report shapes. It redacts accepted
341
355
  reports, records them in `ActorTrace.debrief`, and projects one readable message
@@ -350,39 +364,40 @@ from interaction turns, and reported usage contributes to aggregate cost.
350
364
 
351
365
  The OpenAI implementation makes one request with tools disabled and structured
352
366
  output; no HTTP or policy retries. Stateless/ZDR mode does not offer retrospective
353
- reporting because it does not retain the required session history. The
354
- [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)
355
370
  records both report recovery and control failures in the separate legacy parser.
356
371
 
357
- ## The state-driven executor seam (shipped)
372
+ ## The state-driven executor seam
358
373
 
359
- 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 /
360
375
  transport-agnostic" intent above: the computer-use loop does not require a screen or a vision
361
376
  model. A library caller can drive an **already-running local app** through its in-process JS
362
- contract (`window.app.getState()` etc.) with a custom `CuaExecutor` (screenshot optional,
363
- `appState` as the progress signal) paired with a **non-vision** `CuaProvider` (`requiresFrame`
364
- 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
365
380
  [`state-driven-executor.md`](./state-driven-executor.md) for the port, both entry points
366
- (`runComputerUseLoop` and `runLab` + `inProcess`/`createProvider`), the `subject.source:
381
+ (`runComputerUseLoop` and `runStudy` + `inProcess`/`createProvider`), the `subject.source:
367
382
  local-app` config surface, the `requiresFrame` provider-authoring contract, and the
368
383
  appState-is-runtime-only stance.
369
384
 
370
- ## The product-adapter extension seam (shipped in the terminal-product route, layer 6)
385
+ ## The product-adapter extension seam
371
386
 
372
- The terminal-product route carries the proof-roadmap layer-6 deliverable: a product adopter
373
- 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
374
389
  core. The seam is exported contract types (`RunBundle`, `RunFeedbackCandidate`,
375
390
  `RunAdapterScore`, `ActorTrace`, `AdapterScorerModule` and the terminal-route
376
- `TerminalProductScoringContext`) plus a registrable scorer module, `RunLabOptions.scorer`,
377
- with optional `score` and `deriveFeedback`. The older `score` / `deriveFeedback` members of
378
- `terminalHooks` and `cuaHooks` are deprecated. The adapter records its product nouns ONLY
379
- under an adapter-NAMESPACED block (`RunFeedbackCandidate.adapter` /
391
+ `TerminalProductScoringContext`) plus a registrable scorer module, `RunStudyOptions.scorer`,
392
+ with optional `score` and `deriveFeedback`. The older `terminalHooks` and `cuaHooks` bags were
393
+ removed from `RunStudyOptions`. The adapter records its product nouns only
394
+ under an adapter-namespaced block (`RunFeedbackCandidate.adapter` /
380
395
  `RunAdapterScore.{namespace,data}`), so core's enums stay product-agnostic: no adopter noun
381
396
  is hardcoded into a core enum. Default (no hook) behavior is unchanged. See
382
- [`terminal-product-lane.md`](./terminal-product-lane.md#slice-4-the-product-adapter-extension-seam-layer-6)
397
+ [`terminal-product-route.md`](./terminal-product-route.md#the-product-adapter-extension-seam)
383
398
  for the full seam and the thin-adapter conformance proof.
384
399
 
385
- ## Making personas load-bearing
400
+ ## Making personas change the actor's behavior
386
401
 
387
402
  The original bug, now fixed: `loadDryRunInputs` (`src/run/dry-run-inputs.ts`) parsed
388
403
  persona YAML down to `{ id, name, source, sourceDigest }` and discarded `summary`,
@@ -419,12 +434,33 @@ traits: { patience, skill, accessibilityNeeds? }, constraints[], sourceDigest }`
419
434
  toward the success predicate) and annotates the abandonment friction as a feedback
420
435
  candidate. The harness imposes no turn cap; its hard stops are the wall-clock
421
436
  `timeoutMs` and declared spend caps.
422
- 4. **Bind the same directives per harness**: pi (`systemPrompt` +
423
- `beforeToolCall` allow rules), Claude (`system_prompt`/`--append-system-prompt`
424
- - `allowedTools`), Codex (prepend to `turn/start` input), Stagehand (agent
425
- context + action policy). Each binds the friction-tolerance, skill, and
426
- accessibility directives identically; none uses a `max_turns`-style cap as the
427
- persona stop condition.
437
+ 4. **Bind the same directives per harness.** `renderPersonaPromptSection`
438
+ (`src/lab/persona.ts`) renders the directives as one prompt section, and each harness puts
439
+ that section where its model reads standing instructions:
440
+ - Computer use: `composeParticipantInstructions`
441
+ (`src/routes/computer-use/participant-prompt.ts`) opens the participant instructions
442
+ with it. `openai-computer-use` sends those instructions as each Responses request's
443
+ `instructions`. A local-agent Codex runs as a restricted app-server participant and
444
+ receives them as thread/start `baseInstructions` (`threadStartParams` in
445
+ `src/actors/codex/restricted-launch.ts`), on an ephemeral read-only thread whose only
446
+ dynamic tool is `humanish_ui`. A local-agent Claude Code runs one `claude -p`
447
+ stream-json session with `--allowedTools Read`; the instructions open its first user
448
+ message (`promptFor` in `src/actors/local-agent/cli.ts`), and later turns rely on the
449
+ session's memory. `HUMANISH_LOCAL_AGENT_ONE_SHOT` instead spawns one `claude -p` per
450
+ turn, which resends the instructions every turn.
451
+ - Terminal: the section opens the `codex exec` prompt (`composeLivePrompt` in
452
+ `src/routes/terminal/session.ts`).
453
+ - The scripted-browser route replays declared steps with no model, so it binds no
454
+ directives and records an empty `traitsApplied`. The Codex app-server session behind
455
+ `humanish codex app-server` and the `codex-app-server` registry descriptor binds none
456
+ either: it sends the operator's prompt to turn/start as given.
457
+ - Stagehand remains roadmap. This rule once planned a pi binding (`systemPrompt` +
458
+ `beforeToolCall`) and a Claude Agent SDK one (`systemPrompt` + `allowedTools`). pi
459
+ shipped only as a trace mapper, the Claude Agent SDK descriptor never had a route, and
460
+ both were removed.
461
+
462
+ None of these uses a `max_turns`-style cap as the persona stop condition.
463
+
428
464
  5. **Prove it.** `ActorTrace.persona.traitsApplied` lists the injected directives; a
429
465
  `persona-fidelity` verify check asserts that the friction and accessibility directives
430
466
  reached the actor input and that a `gave_up` run cites a concrete friction reason (not a
@@ -475,7 +511,7 @@ Non-obvious tradeoffs to revisit with real-run data:
475
511
  - `persona-fidelity` treats a `gave_up` with no cited friction as a fidelity
476
512
  failure, not an accepted stop, so the model cannot quietly quit for no reason.
477
513
 
478
- This keeps patience load-bearing and reproducible without ever using elapsed
514
+ So patience decides when a run stops, reproducibly, without ever using elapsed
479
515
  turns as a stop signal.
480
516
 
481
517
  ## Capability matrix (target adapters)
@@ -487,41 +523,12 @@ turns as a stop signal.
487
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 |
488
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 |
489
525
 
490
- ## Sequencing
491
-
492
- 1. This document.
493
- 2. Shared `RedactionHooks` module (completes the remaining #107 criterion) plus
494
- the `Actor` contract types, with the Codex integration refactored to implement
495
- `Actor` and emit `ActorTrace` behind the back-compat alias. Add an
496
- `actorRegistry`; generalize `RunStream.codex` to `RunStream.actor`.
497
- 3. Personas load-bearing: `ResolvedPersona`, `personaToDirectives`, harness turn
498
- budget, and the `persona-fidelity` verify check.
499
- 4. `pi-agent-core` adapter (proves the contract against a non-Codex protocol;
500
- local-model dogfood for ~$0). Landed in two slices: first the pure
501
- `piSessionToActorTrace` mapper + registry generalization (discriminated
502
- `ActorDescriptor` union + `getActor` overloads) + a fixture conformance test,
503
- with no pi dependency and no model key required (proves the evidence contract
504
- is provider-neutral); then a follow-up live SDK shim behind a DI seam, deferred
505
- until the package identity (`@earendil-works/pi-agent-core` vs
506
- `@mariozechner/pi-coding-agent`) and the Node `>=22.19` vs engines `>=20` gap
507
- are pinned against an installed build. The live shim never landed, and the
508
- mapper-only descriptor was removed because no route dispatched it.
509
- 5. `claude-agent-sdk` adapter (the `app` run kind). It shipped as a descriptor with
510
- a live session but no route, and was removed along with the `app` run kind.
511
- 6. Computer-use route. (Shipped as `openai-computer-use`: registered 0.3.0,
512
- lab-dispatched 0.4.0; `stagehand-cua` as a multi-provider front remains
513
- not-yet-shipped roadmap.)
514
- 7. Cross-harness conformance test: one persona x scenario through every adapter,
515
- asserting identical trace shape, completion vocabulary, and redaction status.
516
- 8. The proof point: run the harness-plural loop against popular OSS repos and turn
517
- real, merged issues into the receipt.
518
-
519
526
  ## Risks
520
527
 
521
528
  - Protocol/version drift across four moving harnesses. Pin every binary/SDK and
522
529
  assert the init handshake; the registry refuses an actor whose declared
523
530
  capabilities do not satisfy the scenario.
524
- - Screenshot PII in the computer-use route. Redaction binds the PUBLISH
531
+ - Screenshot PII in the computer-use route. Redaction binds the publish
525
532
  boundary, not capture (0.6.0): raw frames stay local in gitignored
526
533
  `.humanish/` and are never emitted by a publish command (this repo's CI
527
534
  binary-asset scan also blocks them from commit);
@@ -540,4 +547,4 @@ turns as a stop signal.
540
547
 
541
548
  - Self-driving harness principles: `docs/principles/self-driving-harness.md`.
542
549
  - Observer architecture: `docs/architecture/observer.md`.
543
- - 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).
@@ -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,17 +62,17 @@ 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
- Firecracker study supplies its desktops through the `PARTICIPANT_DESKTOP` symbol on
72
- the hook bag (`src/routes/computer-use/participant-desktop.ts`), which no caller
73
- can set by name. The public `cuaHooks.createDesktopLane` is deprecated, warns once,
74
- and goes in the next minor; contract tests still inject a desktop through it. Neither
75
- bypasses CLI admission checks.
71
+ Firecracker run supplies its desktops through the computer-use run's `localVm`
72
+ input (`LocalVmInput` in `src/routes/computer-use/types.ts`). runStudy builds that
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 study with
75
+ `execution.target: local`. Neither bypasses CLI admission checks.
76
76
 
77
77
  Final evidence errors cannot skip desktop release. Existing bundle fields and
78
78
  desktop lifetime accounting retain their meanings; unconfirmed or retained
@@ -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
- normal `CuaActorSessionOptions` executor or delegate to `runCuaActorSession`.
89
- Library calls directly using `runCuaActorSession({ desktop, executorOptions })`
90
- still work but warn as deprecated; use `runComputerUseLoop`. A custom in-process
91
- executor now goes through `RunLabOptions.inProcess`, which replaces the
92
- deprecated `cuaHooks.buildExecutor`.
88
+ normal `CuaActorSessionOptions` executor or delegate to the internal
89
+ `runCuaActorSession`. The `runCuaActorSession` export was removed in 0.107.0; a
90
+ library caller uses `runComputerUseLoop`. A custom in-process
91
+ executor now goes through `RunStudyOptions.inProcess`, which replaces the
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,35 +8,35 @@ 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
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
34
  (`concurrentSharedWorldValidationReason` in `src/lab/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
39
+ neither provisioned nor exposed has neither property, so the gate's hazard does not exist there. The
40
40
  app-url branch is validated by `externalPublicSharedWorldValidationReason` (`src/lab/validation.ts`)
41
41
  and is reached before the getHost gate; a snapshot regression test pins the getHost path
42
42
  byte-unchanged.
@@ -48,14 +48,20 @@ 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, `CuaLoopOptions.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).
60
+
61
+ `onObservedUrl`, `onMessage` and `onScreenshot` are deprecated on `CuaLoopOptions`, and the next
62
+ minor removes them. A `runComputerUseLoop` caller that used them wraps the executor's `observe`
63
+ (for `url` and `screenshot`) or the provider's `nextTurn` (for `reasoning` and `message`). The
64
+ handoff still passes all three.
59
65
 
60
66
  Flow, a host-first barrier inside `runConcurrentSharedWorld`'s fan-out:
61
67
 
@@ -66,71 +72,72 @@ Flow, a host-first barrier inside `runConcurrentSharedWorld`'s fan-out:
66
72
  `/\/lobby\/([A-Z2-9]{6})(?:$|[/?#])/` (a locale prefix `/en/lobby/CODE` and a query/hash suffix
67
73
  are tolerated), a lobby code in its narration (`extractLobbyCodeFromNarration`), or a vision read
68
74
  of its screenshot (`readLobbyCodeFromFrame`). The vision reads are out-of-band OpenAI calls, at
69
- most 30 per participant, and are not counted against `execution.caps.maxUsd`. The host KEEPS PLAYING
75
+ most 30 per participant, and are not counted against `caps.maxUsd`. The host keeps playing
70
76
  after resolving, so its window overlaps the followers'.
71
- 3. **Barrier.** Follower participants (`host` absent) do NOT compose a mission or open their target until
72
- the latch resolves or the handoff deadline passes. On resolve, CODE is threaded into each
73
- follower's mission ("…choose Join, enter lobby code {CODE}…"). It is not a raw URL navigation,
77
+ 3. **Barrier.** Follower participants (`host` absent) do not compose a mission or open their target until
78
+ the latch resolves or the handoff deadline passes. On resolve, code is threaded into each
79
+ follower's mission (`…choose Join, enter lobby code {CODE}…`). It is not a raw URL navigation,
74
80
  because a direct `/lobby/CODE` visit does not auto-join a non-member (lobby-trivia's lobby page
75
81
  redirects unknown/non-member sessions home); the follower goes through the real Join flow.
76
82
  4. **Convergence confirmation.** Each follower's own `onObservedUrl`, or a vision read of its own
77
83
  frame, confirms it reached `/lobby/CODE`; this observed convergence becomes the
78
- `lobbyConvergenceDigest`, the pass signal that the handoff LANDED rather than merely being
79
- instructed. Recorded only when EVERY participant converged on ONE code.
84
+ `lobbyConvergenceDigest`, the pass signal that the followers reached the lobby. An instruction to
85
+ join does not set it. It is recorded only when every participant converged on one code.
80
86
  5. **Fail-closed timeout.** If the host never yields a `/lobby/CODE` within the handoff deadline
81
87
  (`min(execution.timeoutMs, max(120 s, 40% of execution.timeoutMs))`; injectable in tests), the
82
- latch rejects; every follower fails closed WITHOUT opening (no wasted turns against a codeless
83
- home page); the run returns `HUMANISH_CONCURRENT_SHARED_WORLD_LAB_HANDOFF_TIMEOUT` and the bundle
88
+ latch rejects; every follower fails closed without opening (no wasted turns against a codeless
89
+ home page); the run returns `HUMANISH_SHARED_WORLD_HANDOFF_TIMEOUT` and the bundle
84
90
  records the host window + a handoff-failed outcome for followers. If the host participant ends without a
85
91
  code before the deadline, `releaseFollowersIfUnlatched` releases the followers at once and the
86
- run returns `HUMANISH_CONCURRENT_SHARED_WORLD_LAB_FAILED` with the host's reason. A host that
87
- reaches the lobby but whose followers fail to JOIN is a normal per-participant non-pass (the
88
- concurrency-on-pass gate then simply won't see ≥2 overlap, and the verdict stays non-pass,
89
- honestly), not a whole-run abort.
90
-
91
- > **Temporary shim (tracked by #296).** This CDP URL-relay handoff — reading the host's `/lobby/CODE`
92
- > off its own browser and threading it into the follower missions — is a TEMPORARY coordination shim.
93
- > It is to be augmented/replaced by the actor message bus (fake SMS/email invite) in #297: the
94
- > human-realistic version is the HOST SENDING the invite link and followers RECEIVING and tapping it,
95
- > rather than the orchestrator relaying the code out-of-band.
92
+ run returns `HUMANISH_SHARED_WORLD_FAILED` with the host's reason. A host that
93
+ reaches the lobby but whose followers fail to join is a normal per-participant non-pass (the
94
+ concurrency-on-pass gate then simply won't see ≥2 overlap, and the verdict stays non-pass),
95
+ not a whole-run abort.
96
+
97
+ > **Temporary shim.** This CDP URL-relay handoff reads the host's `/lobby/CODE` off its own browser
98
+ > and threads it into the follower missions.
99
+ > [An open issue](https://github.com/danielgwilson/humanish/issues/296) tracks replacing it with the
100
+ > [actor message bus](https://github.com/danielgwilson/humanish/issues/297), where the host sends an
101
+ > SMS or email invite link and the followers receive and tap it. The orchestrator then no longer
102
+ > relays the code out of band.
96
103
 
97
104
  ## Observed-origin convergence (not declared)
98
105
 
99
- The convergence proof is about what the participants OBSERVED, not what was DECLARED. `plane.publicOriginDigest`
100
- is the sha256-16 of the ONE origin the participants' CDP-observed final URLs converged on; verify requires every
106
+ The convergence proof is about what the participants observed, not what was declared. `plane.publicOriginDigest`
107
+ is the sha256-16 of the one origin the participants' CDP-observed final URLs converged on; verify requires every
101
108
  `laneWindow.routeHostDigest` to agree on it. A normal cross-origin redirect (apex→www, http→https;
102
- lobby-trivia.example.test 307-redirects) makes the OBSERVED origin differ from the declared `subject.appUrl`, which
103
- is EXPECTED and must never fail the run. So the declared origin is recorded separately as
104
- `plane.declaredOriginDigest` for reference and is NEVER asserted equal to the observed one. Operator
105
- OWNERSHIP rests on the `subject.publicTarget.authorized` attestation + the declared `appUrl`, NOT on
106
- digest equality. Verify fails closed only when the participants did not converge on a single OBSERVED origin
109
+ lobby-trivia.example.test 307-redirects) makes the observed origin differ from the declared `subject.appUrl`, which
110
+ is expected and must never fail the run. So the declared origin is recorded separately as
111
+ `plane.declaredOriginDigest` for reference and is never asserted equal to the observed one. Operator
112
+ ownership rests on the `subject.publicTarget.authorized` attestation + the declared `appUrl`, not on
113
+ digest equality. Verify fails closed only when the participants did not converge on a single observed origin
107
114
  (it then lists the distinct observed origin digests).
108
115
 
109
116
  ## Hygiene
110
117
 
111
- The runtime `location.href` (and the 6-char CODE inside it) is never persisted raw: `onObservedUrl` is
112
- runtime-only; the threaded CODE flows only into the follower's composed prompt (never a raw bundle
113
- field) and is scrubbed from all narration once latched; the shared origin and lobby path persist ONLY
118
+ The runtime `location.href` (and the 6-char code inside it) is never persisted raw: `onObservedUrl` is
119
+ runtime-only; the threaded code flows only into the follower's composed prompt (never a raw bundle
120
+ field) and is scrubbed from all narration once latched; the shared origin and lobby path persist only
114
121
  as sha256-16 digests (`publicOriginDigest`, `lobbyConvergenceDigest`). This matches the existing
115
122
  e2b-URL / host-digest redaction discipline.
116
123
 
117
124
  ## Mobile fidelity caveat
118
125
 
119
- The example roster runs mobile-LAYOUT participants (`device: mobile` 414×896, `small-mobile` 360×740). On
120
- the E2B-desktop route the rendered WIDTH is floored to `MIN_DESKTOP_RENDER_WIDTH` (500) because
121
- Chrome refuses a narrower window and a narrower X screen clipped the page (0.20.3, #304), so both
122
- presets render at 500 wide and are identical in layout; only HEIGHT renders as declared.
126
+ The example roster runs mobile-layout participants (`device: mobile` 414×896, `small-mobile` 360×740). On
127
+ the E2B-desktop route the rendered width is floored to `MIN_DESKTOP_RENDER_WIDTH` (500) because
128
+ Chrome refuses a narrower window and a narrower X screen clips the page, so both
129
+ presets render at 500 wide and are identical in layout; only height renders as declared.
123
130
  `desktopGeometry.screen.verified` compares the floored number with itself, so it does not attest the
124
- preset width. There is NO touch input, and `isMobile`/DPR are prompt-signal + metadata (DPR renders
125
- only via the CDP geometry path). "3 mobile personas" = 3 mobile-LAYOUT desktop-Chromium participants, not
131
+ preset width. There is no touch input, and `isMobile`/DPR are prompt-signal + metadata (DPR renders
132
+ only via the CDP geometry path). "3 mobile personas" = 3 mobile-layout desktop-Chromium participants, not
126
133
  touch devices. Do not over-read the results as true mobile-device coverage. That describes the
127
- default. With `execution.desktop.fidelity.mobileEmulation: true` (#221), Chromium participants on a mobile
134
+ default. With `execution.desktop.fidelity.mobileEmulation: true`, Chromium participants on a mobile
128
135
  preset get a DevTools device-metrics override at the preset width, plus DPR, touch emulation and a
129
136
  mobile user agent. That is still not physical-device fidelity.
130
137
 
131
138
  ## Watch-from-phone
132
139
 
133
140
  Native live-desktop `--expose` is not supported on the concurrent path; only the computer-use
134
- backend live-serves a run (`src/cli/io.ts`). Today, watch it from a phone via `humanish serve
141
+ route live-serves a run (`src/cli/io.ts`). Today, watch it from a phone via `humanish observe --all
135
142
  --expose --tunnel … --oauth …` against the run directory's Observer (the concurrent path writes
136
143
  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