humanish 0.107.0 → 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 (521) hide show
  1. package/ARCHITECTURE.md +22 -17
  2. package/CHANGELOG.md +14 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +145 -172
  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-ui.js +1 -1
  14. package/dist/actors/codex/codex-admission.d.ts +91 -0
  15. package/dist/actors/codex/codex-admission.js +150 -0
  16. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  17. package/dist/actors/codex/restricted-executable.js +8 -8
  18. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  19. package/dist/actors/codex/restricted-launch.js +1 -1
  20. package/dist/actors/codex/restricted-participant.js +8 -6
  21. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  22. package/dist/actors/codex/restricted-policy.js +2 -2
  23. package/dist/actors/codex/restricted-session.d.ts +2 -2
  24. package/dist/actors/codex/restricted-session.js +10 -5
  25. package/dist/actors/computer-use/actor.d.ts +16 -16
  26. package/dist/actors/computer-use/actor.js +2 -2
  27. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  28. package/dist/actors/computer-use/admission-limit.js +1 -1
  29. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  30. package/dist/actors/computer-use/loop/actions.js +10 -10
  31. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  32. package/dist/actors/computer-use/loop/backstop.js +14 -12
  33. package/dist/actors/computer-use/loop/ending.d.ts +5 -5
  34. package/dist/actors/computer-use/loop/ending.js +7 -7
  35. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  36. package/dist/actors/computer-use/loop/observation.js +9 -9
  37. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  38. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  39. package/dist/actors/computer-use/loop/session.js +3 -3
  40. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  41. package/dist/actors/computer-use/loop/spend.js +1 -1
  42. package/dist/actors/computer-use/loop/trace.js +9 -8
  43. package/dist/actors/computer-use/loop/types.d.ts +25 -23
  44. package/dist/actors/computer-use/loop/usage.js +2 -2
  45. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  46. package/dist/actors/computer-use/openai-context.js +214 -0
  47. package/dist/actors/computer-use/openai-provider.d.ts +11 -8
  48. package/dist/actors/computer-use/openai-provider.js +45 -34
  49. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  50. package/dist/actors/computer-use/openai-requests.js +82 -15
  51. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  52. package/dist/actors/computer-use/openai-wire.js +36 -34
  53. package/dist/actors/contract.d.ts +78 -43
  54. package/dist/actors/contract.js +29 -23
  55. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  56. package/dist/actors/local-agent/claude-session.js +10 -9
  57. package/dist/actors/local-agent/cli.d.ts +8 -6
  58. package/dist/actors/local-agent/cli.js +24 -28
  59. package/dist/actors/local-agent/readiness.d.ts +2 -2
  60. package/dist/actors/local-agent/readiness.js +4 -4
  61. package/dist/actors/reasoning-effort.js +6 -6
  62. package/dist/actors/registry.d.ts +10 -10
  63. package/dist/actors/registry.js +18 -17
  64. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  65. package/dist/actors/scripted-browser/actor.js +16 -16
  66. package/dist/actors/scripted-browser/browser-command.js +1 -1
  67. package/dist/actors/scripted-browser/steps.js +1 -1
  68. package/dist/actors/scripted-browser/types.d.ts +1 -1
  69. package/dist/actors/stop-conditions.d.ts +1 -1
  70. package/dist/analysis/codex-config.d.ts +6 -2
  71. package/dist/analysis/codex-config.js +22 -14
  72. package/dist/analysis/service.js +5 -5
  73. package/dist/cli/commands/analyze.js +19 -16
  74. package/dist/cli/commands/codex.js +9 -9
  75. package/dist/cli/commands/comms.js +54 -33
  76. package/dist/cli/commands/feedback.js +20 -21
  77. package/dist/cli/commands/lab-format.d.ts +5 -4
  78. package/dist/cli/commands/lab-format.js +35 -23
  79. package/dist/cli/commands/lab-route-computer-use.js +6 -7
  80. package/dist/cli/commands/lab-route-preview.js +4 -3
  81. package/dist/cli/commands/lab-route-shared-world.js +3 -3
  82. package/dist/cli/commands/lab-run.js +10 -11
  83. package/dist/cli/commands/lab-scorer.d.ts +2 -2
  84. package/dist/cli/commands/lab-scorer.js +1 -1
  85. package/dist/cli/commands/migrate.d.ts +4 -0
  86. package/dist/cli/commands/migrate.js +65 -0
  87. package/dist/cli/commands/observe.js +147 -108
  88. package/dist/cli/commands/run-command.d.ts +10 -0
  89. package/dist/cli/commands/run-command.js +85 -0
  90. package/dist/cli/commands/runs.js +137 -138
  91. package/dist/cli/commands/setup.d.ts +2 -2
  92. package/dist/cli/commands/setup.js +26 -21
  93. package/dist/cli/commands/study.d.ts +3 -0
  94. package/dist/cli/commands/study.js +182 -0
  95. package/dist/cli/commands/tui.d.ts +4 -4
  96. package/dist/cli/commands/tui.js +21 -21
  97. package/dist/cli/commands/watch.js +60 -75
  98. package/dist/cli/deprecations.d.ts +18 -0
  99. package/dist/cli/deprecations.js +48 -0
  100. package/dist/cli/doctor.d.ts +15 -5
  101. package/dist/cli/doctor.js +103 -48
  102. package/dist/cli/first-run-path.d.ts +12 -10
  103. package/dist/cli/first-run-path.js +30 -28
  104. package/dist/cli/io.d.ts +41 -6
  105. package/dist/cli/io.js +97 -22
  106. package/dist/cli/observer-follow.d.ts +2 -2
  107. package/dist/cli/observer-follow.js +5 -6
  108. package/dist/cli/orientation.d.ts +6 -3
  109. package/dist/cli/orientation.js +43 -39
  110. package/dist/cli/product-sentence.d.ts +6 -0
  111. package/dist/cli/product-sentence.js +6 -0
  112. package/dist/cli/program.d.ts +6 -1
  113. package/dist/cli/program.js +109 -40
  114. package/dist/cli/telemetry.d.ts +15 -15
  115. package/dist/cli/telemetry.js +48 -40
  116. package/dist/cli.js +1 -1
  117. package/dist/comms/capture-surface.d.ts +13 -12
  118. package/dist/comms/capture-surface.js +23 -22
  119. package/dist/comms/catch-host.d.ts +7 -7
  120. package/dist/comms/catch-host.js +14 -14
  121. package/dist/comms/email-catch.d.ts +3 -3
  122. package/dist/comms/email-catch.js +8 -8
  123. package/dist/comms/external-evidence.js +2 -2
  124. package/dist/comms/extract.js +2 -2
  125. package/dist/comms/fake-inbox.d.ts +2 -2
  126. package/dist/comms/fake-inbox.js +2 -2
  127. package/dist/comms/receiving-render.d.ts +1 -1
  128. package/dist/comms/receiving-render.js +2 -2
  129. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  130. package/dist/comms/sandbox-catch-script.js +6 -6
  131. package/dist/comms/sandbox-catch.d.ts +36 -37
  132. package/dist/comms/sandbox-catch.js +34 -35
  133. package/dist/comms/setup.js +42 -8
  134. package/dist/comms/thread-evidence.d.ts +1 -1
  135. package/dist/comms/thread-evidence.js +6 -6
  136. package/dist/comms/types.d.ts +6 -6
  137. package/dist/comms/types.js +3 -3
  138. package/dist/evidence/frame-signature.d.ts +1 -1
  139. package/dist/evidence/frame-signature.js +4 -4
  140. package/dist/evidence/redaction.d.ts +3 -3
  141. package/dist/evidence/redaction.js +4 -4
  142. package/dist/feedback/draft.js +36 -78
  143. package/dist/feedback/export-bundle.js +1 -1
  144. package/dist/feedback/export.d.ts +5 -1
  145. package/dist/feedback/export.js +7 -8
  146. package/dist/feedback/feedback.d.ts +2 -2
  147. package/dist/feedback/feedback.js +21 -3
  148. package/dist/guest/chromium-text.js +2 -2
  149. package/dist/guest/desktop-native.d.ts +1 -1
  150. package/dist/guest/runtime.js +1 -1
  151. package/dist/index.d.ts +12 -10
  152. package/dist/index.js +8 -6
  153. package/dist/keys/key-resolution.d.ts +5 -5
  154. package/dist/keys/key-resolution.js +23 -23
  155. package/dist/lab/adapter-extension.d.ts +7 -7
  156. package/dist/lab/adapter-extension.js +13 -36
  157. package/dist/lab/adapter-scorer-loader.d.ts +7 -7
  158. package/dist/lab/adapter-scorer-loader.js +32 -32
  159. package/dist/lab/composition-rules.js +42 -42
  160. package/dist/lab/config.js +65 -25
  161. package/dist/lab/deprecated-fields.d.ts +10 -0
  162. package/dist/lab/deprecated-fields.js +24 -0
  163. package/dist/lab/device-presets.d.ts +8 -8
  164. package/dist/lab/device-presets.js +11 -11
  165. package/dist/lab/discover.d.ts +13 -9
  166. package/dist/lab/discover.js +117 -57
  167. package/dist/lab/doctor.d.ts +10 -3
  168. package/dist/lab/doctor.js +47 -9
  169. package/dist/lab/init-templates.js +147 -147
  170. package/dist/lab/init.d.ts +1 -1
  171. package/dist/lab/init.js +41 -9
  172. package/dist/lab/keys.d.ts +2 -0
  173. package/dist/lab/keys.js +42 -8
  174. package/dist/lab/lab-deps.d.ts +7 -12
  175. package/dist/lab/parse/actors.js +9 -9
  176. package/dist/lab/parse/comms.js +5 -5
  177. package/dist/lab/parse/execution.js +13 -13
  178. package/dist/lab/parse/study-v3.d.ts +23 -0
  179. package/dist/lab/parse/study-v3.js +259 -0
  180. package/dist/lab/parse/subject-state.d.ts +7 -7
  181. package/dist/lab/parse/subject-state.js +16 -16
  182. package/dist/lab/parse/subject.js +28 -28
  183. package/dist/lab/parse/values.d.ts +1 -1
  184. package/dist/lab/parse/values.js +3 -3
  185. package/dist/lab/persona-resolve.d.ts +4 -4
  186. package/dist/lab/persona-resolve.js +4 -4
  187. package/dist/lab/plan-participants.d.ts +2 -2
  188. package/dist/lab/plan-types.d.ts +4 -4
  189. package/dist/lab/plan.d.ts +1 -7
  190. package/dist/lab/plan.js +10 -41
  191. package/dist/lab/preflight-probes.js +11 -11
  192. package/dist/lab/preflight-result.d.ts +2 -1
  193. package/dist/lab/preflight-result.js +5 -4
  194. package/dist/lab/preflight.d.ts +7 -5
  195. package/dist/lab/preflight.js +5 -5
  196. package/dist/lab/routing.d.ts +31 -25
  197. package/dist/lab/routing.js +60 -29
  198. package/dist/lab/run-lab-events.d.ts +0 -3
  199. package/dist/lab/run-lab-events.js +0 -6
  200. package/dist/lab/run-lab-homes.d.ts +22 -10
  201. package/dist/lab/run-lab-homes.js +5 -1
  202. package/dist/lab/run-lab-options.d.ts +1 -1
  203. package/dist/lab/run-lab-options.js +16 -13
  204. package/dist/lab/summary.d.ts +7 -6
  205. package/dist/lab/summary.js +10 -10
  206. package/dist/lab/tasks.d.ts +15 -15
  207. package/dist/lab/tasks.js +14 -14
  208. package/dist/lab/types.d.ts +101 -95
  209. package/dist/lab/types.js +2 -0
  210. package/dist/lab/validation.d.ts +13 -13
  211. package/dist/lab/validation.js +44 -42
  212. package/dist/lab/warnings.d.ts +10 -0
  213. package/dist/lab/warnings.js +61 -33
  214. package/dist/library-aliases.d.ts +56 -0
  215. package/dist/library-aliases.js +22 -0
  216. package/dist/observer/artifact.d.ts +1 -1
  217. package/dist/observer/artifact.js +6 -6
  218. package/dist/observer/data.d.ts +6 -6
  219. package/dist/observer/data.js +5 -4
  220. package/dist/observer/exposure.d.ts +1 -1
  221. package/dist/observer/exposure.js +11 -11
  222. package/dist/observer/http.js +1 -1
  223. package/dist/observer/library.d.ts +1 -1
  224. package/dist/observer/library.js +4 -2
  225. package/dist/observer/listen.js +5 -4
  226. package/dist/observer/render.d.ts +1 -1
  227. package/dist/observer/render.js +10 -5
  228. package/dist/observer/run-routes.d.ts +3 -3
  229. package/dist/observer/run-routes.js +1 -1
  230. package/dist/observer/serve.js +7 -3
  231. package/dist/observer/tunnel.js +1 -1
  232. package/dist/observer-app.html +4 -4
  233. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  234. package/dist/routes/computer-use/bundle-parts.js +15 -15
  235. package/dist/routes/computer-use/bundle.js +3 -3
  236. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
  238. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  239. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
  240. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  241. package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
  242. package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
  243. package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
  244. package/dist/routes/computer-use/external-comms.d.ts +1 -1
  245. package/dist/routes/computer-use/external-comms.js +1 -1
  246. package/dist/routes/computer-use/fanout-bundle.js +18 -18
  247. package/dist/routes/computer-use/fanout-records.js +10 -11
  248. package/dist/routes/computer-use/live-flush.d.ts +1 -1
  249. package/dist/routes/computer-use/live-flush.js +6 -6
  250. package/dist/routes/computer-use/live-phase.d.ts +4 -2
  251. package/dist/routes/computer-use/live-phase.js +6 -6
  252. package/dist/routes/computer-use/local-vm.js +1 -1
  253. package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
  254. package/dist/routes/computer-use/participant-desktop.js +4 -4
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +9 -9
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +31 -13
  259. package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
  260. package/dist/routes/computer-use/participant-prompt.js +6 -6
  261. package/dist/routes/computer-use/participant-runs.d.ts +7 -7
  262. package/dist/routes/computer-use/participant-runs.js +13 -13
  263. package/dist/routes/computer-use/plan.js +22 -22
  264. package/dist/routes/computer-use/preflight.js +21 -21
  265. package/dist/routes/computer-use/rerun-selection.js +1 -1
  266. package/dist/routes/computer-use/result.js +11 -11
  267. package/dist/routes/computer-use/route.d.ts +2 -1
  268. package/dist/routes/computer-use/route.js +15 -14
  269. package/dist/routes/computer-use/self-report.d.ts +7 -7
  270. package/dist/routes/computer-use/self-report.js +31 -31
  271. package/dist/routes/computer-use/setup.d.ts +1 -1
  272. package/dist/routes/computer-use/setup.js +17 -18
  273. package/dist/routes/computer-use/single-bundle.d.ts +7 -7
  274. package/dist/routes/computer-use/single-bundle.js +28 -30
  275. package/dist/routes/computer-use/subject-projection.d.ts +1 -1
  276. package/dist/routes/computer-use/subject-projection.js +6 -6
  277. package/dist/routes/computer-use/types.d.ts +40 -42
  278. package/dist/routes/computer-use/types.js +10 -10
  279. package/dist/routes/preview.d.ts +8 -2
  280. package/dist/routes/preview.js +8 -4
  281. package/dist/routes/scripted/bundle.d.ts +2 -2
  282. package/dist/routes/scripted/bundle.js +13 -12
  283. package/dist/routes/scripted/plan.d.ts +1 -1
  284. package/dist/routes/scripted/plan.js +9 -9
  285. package/dist/routes/scripted/result.js +5 -5
  286. package/dist/routes/scripted/route.js +5 -6
  287. package/dist/routes/scripted/scenario.js +2 -2
  288. package/dist/routes/scripted/setup.js +7 -7
  289. package/dist/routes/scripted/subject.js +1 -1
  290. package/dist/routes/scripted/surface-records.js +3 -3
  291. package/dist/routes/scripted/types.d.ts +3 -5
  292. package/dist/routes/scripted/types.js +1 -1
  293. package/dist/routes/shared-world/bundle-records.js +9 -8
  294. package/dist/routes/shared-world/bundle.d.ts +5 -5
  295. package/dist/routes/shared-world/bundle.js +40 -38
  296. package/dist/routes/shared-world/checkpoints.d.ts +1 -1
  297. package/dist/routes/shared-world/checkpoints.js +1 -1
  298. package/dist/routes/shared-world/comms.d.ts +5 -5
  299. package/dist/routes/shared-world/comms.js +14 -14
  300. package/dist/routes/shared-world/external-public.d.ts +4 -3
  301. package/dist/routes/shared-world/external-public.js +16 -12
  302. package/dist/routes/shared-world/handoff.d.ts +7 -6
  303. package/dist/routes/shared-world/handoff.js +65 -57
  304. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  305. package/dist/routes/shared-world/lobby-code.js +9 -9
  306. package/dist/routes/shared-world/participant-specs.d.ts +7 -6
  307. package/dist/routes/shared-world/participant-specs.js +31 -24
  308. package/dist/routes/shared-world/plan.js +7 -7
  309. package/dist/routes/shared-world/provenance.d.ts +2 -2
  310. package/dist/routes/shared-world/provenance.js +2 -2
  311. package/dist/routes/shared-world/provisioned.js +14 -13
  312. package/dist/routes/shared-world/result.js +20 -21
  313. package/dist/routes/shared-world/route.js +23 -22
  314. package/dist/routes/shared-world/setup.d.ts +3 -3
  315. package/dist/routes/shared-world/setup.js +4 -4
  316. package/dist/routes/shared-world/types.d.ts +30 -28
  317. package/dist/routes/shared-world/types.js +4 -4
  318. package/dist/routes/terminal/adapter.d.ts +3 -3
  319. package/dist/routes/terminal/adapter.js +5 -5
  320. package/dist/routes/terminal/bundle.d.ts +3 -3
  321. package/dist/routes/terminal/bundle.js +22 -21
  322. package/dist/routes/terminal/credentials.d.ts +4 -4
  323. package/dist/routes/terminal/credentials.js +7 -7
  324. package/dist/routes/terminal/dry-run.js +4 -4
  325. package/dist/routes/terminal/encoding.js +2 -2
  326. package/dist/routes/terminal/ledger.d.ts +3 -3
  327. package/dist/routes/terminal/ledger.js +14 -14
  328. package/dist/routes/terminal/live-finish.js +3 -3
  329. package/dist/routes/terminal/live-sandbox.js +12 -13
  330. package/dist/routes/terminal/persona.js +1 -1
  331. package/dist/routes/terminal/plan.js +11 -11
  332. package/dist/routes/terminal/recorder.js +2 -2
  333. package/dist/routes/terminal/result.js +8 -8
  334. package/dist/routes/terminal/route.js +6 -7
  335. package/dist/routes/terminal/sandbox.d.ts +1 -1
  336. package/dist/routes/terminal/sandbox.js +1 -1
  337. package/dist/routes/terminal/session.js +8 -7
  338. package/dist/routes/terminal/token-usage.d.ts +1 -1
  339. package/dist/routes/terminal/token-usage.js +7 -8
  340. package/dist/routes/terminal/trace.d.ts +2 -2
  341. package/dist/routes/terminal/trace.js +2 -2
  342. package/dist/routes/terminal/types.d.ts +26 -28
  343. package/dist/routes/terminal/types.js +3 -3
  344. package/dist/run/bundle-shape.js +3 -3
  345. package/dist/run/bundle.d.ts +46 -46
  346. package/dist/run/bundle.js +2 -1
  347. package/dist/run/cost-summary.js +3 -3
  348. package/dist/run/costs.js +7 -1
  349. package/dist/run/detail.d.ts +6 -6
  350. package/dist/run/detail.js +4 -4
  351. package/dist/run/dry-run-inputs.js +1 -1
  352. package/dist/run/dry-run.js +18 -18
  353. package/dist/run/judge.d.ts +19 -13
  354. package/dist/run/judge.js +18 -8
  355. package/dist/run/paths.d.ts +1 -1
  356. package/dist/run/paths.js +1 -1
  357. package/dist/run/pricing.d.ts +11 -6
  358. package/dist/run/pricing.js +20 -13
  359. package/dist/run/projection.d.ts +14 -14
  360. package/dist/run/projection.js +15 -15
  361. package/dist/run/reclaim.js +2 -2
  362. package/dist/run/results.d.ts +5 -5
  363. package/dist/run/run-index.d.ts +8 -6
  364. package/dist/run/run-index.js +15 -16
  365. package/dist/run/run-not-found.d.ts +5 -0
  366. package/dist/run/run-not-found.js +15 -0
  367. package/dist/run/run.d.ts +5 -4
  368. package/dist/run/run.js +1 -1
  369. package/dist/run/sandbox-receipts.d.ts +2 -2
  370. package/dist/run/sandbox-receipts.js +3 -3
  371. package/dist/run/shared-world-evidence.d.ts +36 -35
  372. package/dist/run/shared-world-evidence.js +4 -4
  373. package/dist/run/shared-world-shape.d.ts +1 -1
  374. package/dist/run/shared-world-shape.js +6 -6
  375. package/dist/run/stats.d.ts +12 -6
  376. package/dist/run/stats.js +116 -58
  377. package/dist/run/status.d.ts +8 -29
  378. package/dist/run/status.js +5 -27
  379. package/dist/run/stored-runs.js +2 -1
  380. package/dist/run/stream-shape.js +1 -1
  381. package/dist/run/streams.d.ts +6 -6
  382. package/dist/run/study-provenance.d.ts +47 -0
  383. package/dist/run/study-provenance.js +63 -0
  384. package/dist/run/study-result.d.ts +16 -0
  385. package/dist/run/study-result.js +9 -0
  386. package/dist/run/text.d.ts +2 -0
  387. package/dist/run/text.js +4 -0
  388. package/dist/run-lab.d.ts +7 -7
  389. package/dist/run-lab.js +1 -3
  390. package/dist/study/convert.d.ts +33 -0
  391. package/dist/study/convert.js +432 -0
  392. package/dist/study/field-paths.d.ts +12 -0
  393. package/dist/study/field-paths.js +126 -0
  394. package/dist/study/files.d.ts +26 -0
  395. package/dist/study/files.js +43 -0
  396. package/dist/study/migrate.d.ts +48 -0
  397. package/dist/study/migrate.js +408 -0
  398. package/dist/study/owned-files.d.ts +38 -0
  399. package/dist/study/owned-files.js +182 -0
  400. package/dist/subject/clone.d.ts +1 -1
  401. package/dist/subject/desktop-cli.d.ts +1 -1
  402. package/dist/subject/desktop-cli.js +2 -2
  403. package/dist/subject/local-tree-archive.js +1 -1
  404. package/dist/subject/local-tree.d.ts +1 -1
  405. package/dist/subject/node-bootstrap.js +1 -1
  406. package/dist/subject/runtime.js +8 -9
  407. package/dist/subject/serve.d.ts +1 -1
  408. package/dist/subject/serve.js +3 -3
  409. package/dist/subject/state.d.ts +1 -1
  410. package/dist/subject/steps.d.ts +5 -5
  411. package/dist/subject/steps.js +4 -4
  412. package/dist/substrates/command-failure.d.ts +3 -3
  413. package/dist/substrates/command-failure.js +3 -3
  414. package/dist/substrates/detached.d.ts +6 -6
  415. package/dist/substrates/detached.js +7 -7
  416. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  417. package/dist/substrates/e2b/cdp-probe.js +14 -17
  418. package/dist/substrates/e2b/desktop-browser.d.ts +2 -2
  419. package/dist/substrates/e2b/desktop-browser.js +8 -8
  420. package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
  421. package/dist/substrates/e2b/desktop-cdp.js +8 -8
  422. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  423. package/dist/substrates/e2b/desktop-executor.js +1 -1
  424. package/dist/substrates/e2b/desktop-geometry.d.ts +3 -3
  425. package/dist/substrates/e2b/desktop-geometry.js +7 -7
  426. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  427. package/dist/substrates/e2b/desktop-media.js +1 -1
  428. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  429. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  430. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  431. package/dist/substrates/e2b/sandbox.js +1 -1
  432. package/dist/substrates/e2b/sdk.d.ts +11 -11
  433. package/dist/substrates/e2b/sdk.js +6 -6
  434. package/dist/tui/actions.d.ts +1 -1
  435. package/dist/tui/actions.js +13 -13
  436. package/dist/tui/contract.d.ts +16 -16
  437. package/dist/tui/contract.js +10 -10
  438. package/dist/tui/launch.d.ts +4 -4
  439. package/dist/tui/launch.js +18 -19
  440. package/dist/tui/project.js +5 -5
  441. package/dist/tui-app.js +82 -82
  442. package/dist/verify/actor.d.ts +8 -8
  443. package/dist/verify/actor.js +36 -36
  444. package/dist/verify/artifacts.d.ts +2 -2
  445. package/dist/verify/artifacts.js +3 -3
  446. package/dist/verify/context-growth.d.ts +9 -0
  447. package/dist/verify/context-growth.js +62 -0
  448. package/dist/verify/costs.d.ts +6 -6
  449. package/dist/verify/costs.js +8 -8
  450. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  451. package/dist/verify/shared-world-concurrent.js +79 -76
  452. package/dist/verify/shared-world.d.ts +2 -2
  453. package/dist/verify/shared-world.js +16 -16
  454. package/dist/verify/subject.d.ts +4 -4
  455. package/dist/verify/subject.js +18 -18
  456. package/dist/verify/verify.js +92 -43
  457. package/docs/README.md +25 -32
  458. package/docs/architecture/actor-contract.md +56 -87
  459. package/docs/architecture/desktop-sessions.md +7 -7
  460. package/docs/architecture/external-public-shared-world.md +61 -59
  461. package/docs/architecture/github-feedback-loop.md +1 -4
  462. package/docs/architecture/guest-desktop.md +2 -2
  463. package/docs/architecture/observer.md +34 -34
  464. package/docs/architecture/restricted-codex-analysis.md +34 -28
  465. package/docs/architecture/serve.md +34 -37
  466. package/docs/architecture/state-driven-executor.md +55 -58
  467. package/docs/architecture/task-protocol-support.md +5 -5
  468. package/docs/architecture/terminal-product-route.md +67 -107
  469. package/docs/contracts/README.md +24 -0
  470. package/docs/contracts/adapter-admission.md +3 -3
  471. package/docs/contracts/adapter-fixtures.md +2 -5
  472. package/docs/contracts/core.md +1 -3
  473. package/docs/contracts/errors.md +62 -0
  474. package/docs/contracts/feedback.md +8 -9
  475. package/docs/contracts/policy.md +7 -12
  476. package/docs/contracts/run-bundle.md +45 -44
  477. package/docs/contracts/schemas.md +421 -362
  478. package/docs/contracts/study-analysis.md +3 -3
  479. package/docs/contracts/study-costs.md +11 -7
  480. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  481. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  482. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  483. package/docs/principles/actor-fidelity.md +4 -4
  484. package/docs/principles/engineering.md +3 -3
  485. package/docs/principles/invariants-and-defaults.md +38 -38
  486. package/docs/principles/self-driving-harness.md +1 -5
  487. package/docs/principles/three-roles.md +1 -1
  488. package/docs/product/automatic-analysis.md +7 -7
  489. package/examples/participant/README.md +5 -5
  490. package/examples/participant/run.mjs +11 -10
  491. package/examples/scorer/README.md +3 -3
  492. package/examples/scorer/run.mjs +11 -12
  493. package/package.json +16 -17
  494. package/skills/humanish/SKILL.md +60 -58
  495. package/skills/humanish/agents/openai.yaml +1 -1
  496. package/AGENTS.md +0 -99
  497. package/CONTRIBUTING.md +0 -148
  498. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  499. package/dist/actors/codex/qualified-versions.js +0 -132
  500. package/dist/cli/commands/lab.d.ts +0 -3
  501. package/dist/cli/commands/lab.js +0 -199
  502. package/dist/cli/renamed-options.d.ts +0 -11
  503. package/dist/cli/renamed-options.js +0 -18
  504. package/dist/observer/static.d.ts +0 -39
  505. package/dist/observer/static.js +0 -369
  506. package/docs/architecture/comms-inbox.md +0 -122
  507. package/docs/architecture/desktop-recording.md +0 -80
  508. package/docs/architecture/local-browser-runtime.md +0 -178
  509. package/docs/architecture/observer-review.md +0 -144
  510. package/docs/architecture/participant-media.md +0 -90
  511. package/docs/architecture/project-layout.md +0 -62
  512. package/docs/architecture/real-email-receiving.md +0 -136
  513. package/docs/assets/humanish-drawdb-hero.png +0 -0
  514. package/docs/assets/humanish-observer-hero.png +0 -0
  515. package/docs/goals/current.md +0 -207
  516. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  517. package/docs/product/open-source-install-experience.md +0 -240
  518. package/docs/ramp/README.md +0 -295
  519. package/docs/release/open-source-readiness.md +0 -222
  520. package/docs/release/public-readiness-standard.md +0 -210
  521. package/docs/roadmap/world-class-open-source-v0.md +0 -311
@@ -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,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,15 @@ 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).
59
60
 
60
61
  `onObservedUrl`, `onMessage` and `onScreenshot` are deprecated on `CuaLoopOptions`, and the next
61
62
  minor removes them. A `runComputerUseLoop` caller that used them wraps the executor's `observe`
@@ -71,71 +72,72 @@ Flow, a host-first barrier inside `runConcurrentSharedWorld`'s fan-out:
71
72
  `/\/lobby\/([A-Z2-9]{6})(?:$|[/?#])/` (a locale prefix `/en/lobby/CODE` and a query/hash suffix
72
73
  are tolerated), a lobby code in its narration (`extractLobbyCodeFromNarration`), or a vision read
73
74
  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
75
+ most 30 per participant, and are not counted against `caps.maxUsd`. The host keeps playing
75
76
  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,
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,
79
80
  because a direct `/lobby/CODE` visit does not auto-join a non-member (lobby-trivia's lobby page
80
81
  redirects unknown/non-member sessions home); the follower goes through the real Join flow.
81
82
  4. **Convergence confirmation.** Each follower's own `onObservedUrl`, or a vision read of its own
82
83
  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.
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.
85
86
  5. **Fail-closed timeout.** If the host never yields a `/lobby/CODE` within the handoff deadline
86
87
  (`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
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
89
90
  records the host window + a handoff-failed outcome for followers. If the host participant ends without a
90
91
  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.
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.
101
103
 
102
104
  ## Observed-origin convergence (not declared)
103
105
 
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
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
106
108
  `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
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
112
114
  (it then lists the distinct observed origin digests).
113
115
 
114
116
  ## Hygiene
115
117
 
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
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
119
121
  as sha256-16 digests (`publicOriginDigest`, `lobbyConvergenceDigest`). This matches the existing
120
122
  e2b-URL / host-digest redaction discipline.
121
123
 
122
124
  ## Mobile fidelity caveat
123
125
 
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.
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.
128
130
  `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
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
131
133
  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
134
+ default. With `execution.desktop.fidelity.mobileEmulation: true`, Chromium participants on a mobile
133
135
  preset get a DevTools device-metrics override at the preset width, plus DPR, touch emulation and a
134
136
  mobile user agent. That is still not physical-device fidelity.
135
137
 
136
138
  ## Watch-from-phone
137
139
 
138
140
  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
141
+ route live-serves a run (`src/cli/io.ts`). Today, watch it from a phone via `humanish observe --all
140
142
  --expose --tunnel … --oauth …` against the run directory's Observer (the concurrent path writes
141
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
 
@@ -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).
@@ -1,13 +1,8 @@
1
1
  # Observer Architecture
2
2
 
3
- Date: 2026-06-01 (current-state note updated 2026-07-14)
4
-
5
- Status: implemented for synthetic streams and persisted live browser,
6
- terminal-product, fan-out, and shared-world evidence.
7
- Plain computer-use and shared-world runs can publish an in-progress bundle to
8
- an attached loopback Observer without persisting runtime stream-auth URLs. The
9
- version-pinned README image is a synthetic technical sample, not real-application
10
- proof.
3
+ The Observer renders synthetic streams and saved live browser, terminal-product, fan-out and
4
+ shared-world evidence. A computer-use or shared-world run can publish its in-progress bundle to an
5
+ attached loopback Observer without saving runtime stream-auth URLs.
11
6
 
12
7
  ## Decision
13
8
 
@@ -80,7 +75,7 @@ forwarding, and only contained run paths in the TUI's project are accepted.
80
75
  | `watch` during a study | Saved evidence and available in-memory desktop streams | Until the attached command exits |
81
76
  | `observe --run <id>` | Saved evidence from the selected run | Until the command exits |
82
77
  | TUI Open in Observer | Saved evidence in the selected run; shares the project's evidence library | Until the TUI exits |
83
- | `serve` | Saved evidence across the project's library | Until the server command exits |
78
+ | `observe --all` | Saved evidence across the project's library | Until the server command exits |
84
79
  | Static HTML or `file://` | The exported snapshot | Independent of a server |
85
80
 
86
81
  `observe` uses the same current-data projection as the attached viewer, scoped
@@ -103,7 +98,7 @@ mismatched records omit the observation. A stale heartbeat alone does not prove
103
98
  interruption, and stored PIDs are neither probed nor returned. Static rendering
104
99
  and export do not create this served-only observation.
105
100
 
106
- Watch is deliberately distinct from `humanish serve`. Watch serves ONE
101
+ Watch is deliberately distinct from `humanish observe --all`. Watch serves one
107
102
  attached run, and the process that created it may inject runtime stream URLs
108
103
  (live hosted-desktop viewers) into the observer data it serves. Serve is the
109
104
  library surface (every run under `.humanish/runs/`) and never serves runtime
@@ -123,23 +118,23 @@ Misdirected Request` otherwise) and the shared `buildServeSecurityHeaders()` on
123
118
  every response (both live in `src/observer/http.ts`, shared without a module cycle).
124
119
  The Host allowlist applies in exposed mode; frame-denial headers apply in both modes.
125
120
 
126
- Exposed mode also SCOPES the surface to the attached live run (`result.run`): the
121
+ Exposed mode also scopes the surface to the attached live run (`result.run`): the
127
122
  `/_humanish/history.json` index is filtered to that one run, and `/_humanish/runs/<id>/…`
128
123
  404s byte-identically to a nonexistent run for any other id. A remote viewer who
129
124
  clears the edge auth can therefore see only the run being watched. They can never
130
125
  enumerate or fetch a prior run's raw, unverified evidence. Loopback keeps the full cross-run
131
126
  library (history + any run by id) exactly as before.
132
127
 
133
- `watch --expose` is the ONE surface that DELIBERATELY streams the live E2B
128
+ `watch --expose` is the one surface that deliberately streams the live E2B
134
129
  desktop to a remote viewer: the attached watch process genuinely holds the
135
130
  runtime stream URLs (in the in-memory `WeakMap`, never persisted), and watching
136
131
  from a phone needs them. It is safe only because the
137
132
  ngrok edge (Google OAuth + allow rules) or an operator `--public-url` edge
138
133
  authenticates the viewer first, so `watch --expose` always requires edge
139
134
  auth (a live run is never `share_ready`, so `--safe` alone cannot gate it). The
140
- attached server comes up DURING the run and survives a `timed_out`/`failed` run
135
+ attached server comes up during the run and survives a `timed_out`/`failed` run
141
136
  (serving is not gated on pass/fail), so a failed run's evidence stays inspectable
142
- to Ctrl-C. `serve` still never injects stream URLs. See
137
+ to Ctrl-C. `observe --all` still never injects stream URLs. See
143
138
  [Serve: the run library surface](serve.md).
144
139
 
145
140
  ### Live desktop iframe authority
@@ -178,8 +173,9 @@ between an active study and its provisional evidence outcome.
178
173
 
179
174
  ## UI Shape
180
175
 
181
- See [Watching and reviewing evidence](observer-review.md) for current controls,
182
- entry-point capabilities, timing limits and browser acceptance commands.
176
+ [Watch and review in the Observer](https://humanish.dev/docs/review-surfaces#watch-and-review-in-the-observer)
177
+ describes the current controls, entry points and timing limits for users;
178
+ [Browser checks](#browser-checks) below covers the proofs that pin them.
183
179
 
184
180
  The Observer shell has:
185
181
 
@@ -198,7 +194,7 @@ the frozen Observer data schema or start provider requests. Analysis polling has
198
194
  an independent lifecycle, so a delayed companion does not stall recording updates.
199
195
  Invalid or stale interpretation never overwrites original participant outcomes.
200
196
  Recording navigation retains its originating view, and nonvisual citations open
201
- the source event rather than inventing a playback frame.
197
+ the source event with no invented playback frame.
202
198
 
203
199
  The participant grid uses equal-height previews whose widths follow each screen's
204
200
  aspect ratio. A 44px identity/source/outcome caption sits below the captured pixels;
@@ -230,29 +226,16 @@ A host adapter may provide:
230
226
  If no embed URL exists, the Observer still renders the Codex-style timeline and
231
227
  session contract instead of failing the stream.
232
228
 
233
- ## Historical slice and remaining gaps
234
-
235
- The original 2026-06-01 slice implemented the Observer substrate and synthetic
236
- stream contracts; local `codex-exec` active-run snapshots followed.
237
-
238
- Subsequent additions through 2026-06-11 included:
229
+ ## Remaining gaps
239
230
 
240
- - Playwright-backed browser proof with scripted, app-specific
241
- `browser.steps` authored in `humanish/scenarios/*.yaml` (`src/actors/scripted-browser/`);
242
- - native Codex app-server session adapter (`src/actors/codex/app-server.ts`,
243
- registered in `src/actors/registry.ts`);
244
- - E2B desktop participants on the computer-use and shared-world routes;
245
- - computer-use bundles persist a `screenshots/` directory and the Observer
246
- renders the frames (`src/routes/computer-use/participant-execution.ts` writes them).
247
-
248
- Intentionally still adapter work:
231
+ These remain adapter work:
249
232
 
250
233
  - local PTY capture;
251
234
  - Codex TUI live follow after workspace trust bootstrap;
252
235
  - richer screenshot/trace galleries across multi-step product journeys;
253
236
  - reviewer acceptance gates over real product behavior.
254
237
 
255
- ## The rendering layer (#426, cut over 2026-08-16)
238
+ ## The rendering layer
256
239
 
257
240
  The renderer is the `observer/` workspace: a Vite single-file build on the
258
241
  `@humanish` registry tokens, frozen against `humanish.observer-data.v1`
@@ -260,10 +243,27 @@ The renderer is the `observer/` workspace: a Vite single-file build on the
260
243
  artifact to `dist/observer-app.html`; in a repo checkout a missing or stale
261
244
  artifact auto-builds, and an unconditional preflight at CLI startup makes a
262
245
  broken artifact cost seconds, never a completed session. `renderObserverHtml`,
263
- the one function every surface (observe, watch, serve, labs) renders through,
246
+ the one function every surface (observe, observe --all, watch, studies) renders through,
264
247
  injects the run's snapshot into the artifact
265
248
  (`tests/observer/artifact.test.ts` pins the path, cold, so CI exercises the
266
249
  auto-build every run). The legacy string-concat renderer was deleted at
267
250
  cutover; there is no flag and no fallback. Rollback is a version pin. The
268
251
  workspace's own tests pin the durability constraints (self-contained single
269
252
  file, fonts inlined, no network references).
253
+
254
+ ## Browser checks
255
+
256
+ `pnpm observer:browser:proof` exercises generated synthetic evidence in the
257
+ production artifact. `pnpm observer:iframe:proof`, after `pnpm build`, checks the
258
+ actual serving boundary against direct, redirected and scripted iframe attacks.
259
+ CI retains their screenshots and JSON receipts. These Chromium checks do not
260
+ claim physical-device or non-Chromium coverage. Actual provider checks and their
261
+ resource-cleanup receipts are separate acceptance evidence.
262
+
263
+ Interaction references rechecked September 8, 2026:
264
+ [Base UI popover](https://base-ui.com/react/components/popover),
265
+ [React state structure](https://react.dev/learn/choosing-the-state-structure),
266
+ [WAI-ARIA tabs](https://www.w3.org/WAI/ARIA/apg/patterns/tabs/),
267
+ [iframe sandboxing](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe),
268
+ [Playwright Trace Viewer](https://playwright.dev/docs/trace-viewer), and
269
+ [PostHog recording controls](https://posthog.com/docs/session-replay/how-to-watch-recordings).
@@ -5,24 +5,28 @@ execution, with a separate conversation, process and tool authority. It can use
5
5
  the same host Codex login as a local-agent participant. Existing API analysis
6
6
  remains a separate provider.
7
7
 
8
- The qualified launcher profile is **a qualified Codex CLI release for the host, Linux x64
9
- or Apple Silicon macOS, file-backed ChatGPT login, `gpt-6-astra`, low reasoning effort**.
10
- Qualified releases are listed per host in
11
- [`src/actors/codex/qualified-versions.ts`](https://github.com/danielgwilson/humanish/blob/main/src/actors/codex/qualified-versions.ts).
12
- Linux x64 accepts 0.154.0, 0.157.1
13
- ([receipt](https://github.com/danielgwilson/humanish/blob/main/docs/goals/computer-use-actor/receipts/codex-cli-0.157.1-requalification-2026-09-30.md))
8
+ The launcher profile is **a stable Codex CLI release from 0.154.0 on, Linux x64 or Apple
9
+ Silicon macOS, file-backed ChatGPT login, `gpt-6-astra`, low reasoning effort**.
10
+ [`src/actors/codex/codex-admission.ts`](https://github.com/danielgwilson/humanish/blob/main/src/actors/codex/codex-admission.ts)
11
+ admits every stable `MAJOR.MINOR.PATCH` release from 0.154.0, the oldest known to work, except
12
+ those in `REFUSED_CODEX_CLI_VERSIONS` (none yet). There is no ceiling: a new release runs the
13
+ day it ships, and one that breaks humanish is refused there until humanish handles it.
14
+ Prereleases and older releases are refused, and the refusal names the release and why. Hosted
15
+ participants (operator mode) run the same releases on Linux x64 and arm64 and macOS x64 and
16
+ arm64; a hosted run on a release outside `TESTED_CODEX_CLI_VERSIONS` records a warning that its
17
+ evidence rests on the checks each launch makes. `TESTED_CODEX_CLI_VERSIONS` gates nothing. It
18
+ lists the releases the qualifier passed on Linux x64, and its newest is the default and the
19
+ install target: 0.154.0, 0.157.1
20
+ ([receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/computer-use/codex-cli-0.157.1-requalification-2026-09-30.md))
14
21
  0.159.2
15
- ([receipt](https://github.com/danielgwilson/humanish/blob/main/docs/goals/computer-use-actor/receipts/codex-cli-0.159.2-qualification-2026-09-30.md))
22
+ ([receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/computer-use/codex-cli-0.159.2-qualification-2026-09-30.md))
16
23
  0.159.3
17
- ([receipt](https://github.com/danielgwilson/humanish/blob/main/docs/goals/computer-use-actor/receipts/codex-cli-0.159.3-qualification-2026-10-01.md))
24
+ ([receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/computer-use/codex-cli-0.159.3-qualification-2026-10-01.md))
18
25
  and 0.160.0
19
- ([receipt](https://github.com/danielgwilson/humanish/blob/main/docs/goals/computer-use-actor/receipts/codex-cli-0.160.0-qualification-2026-10-01.md)).
20
- Apple Silicon accepts 0.154.0, which passed installed participant/analysis studies and the
21
- native dispatch restriction check on an M5 Max; later releases need the same check on a Mac.
22
- Hosted participants on Linux arm64 and Intel macOS keep 0.154.0 as a pre-existing admission,
23
- listed separately in `PREEXISTING_CODEX_CLI_ADMISSIONS`: it is what they ran before per-host
24
- lists existed, not a qualification, and no later release is admitted there. Other releases and
25
- platforms, keychain-only logins and API-key Codex logins are refused before a model turn.
26
+ ([receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/computer-use/codex-cli-0.160.0-qualification-2026-10-01.md)).
27
+ On Apple Silicon, 0.154.0 passed installed participant/analysis studies and the native dispatch
28
+ restriction check on an M5 Max; no later release has run on a Mac. Other platforms,
29
+ keychain-only logins and API-key Codex logins are refused before a model turn.
26
30
 
27
31
  A release string is a compatibility check, not binary attestation. The launcher compares the
28
32
  release that `codex --version`, initialize and thread start report, then executes the same
@@ -30,8 +34,8 @@ path; it does not pin the executable's contents, and a modified binary can repor
30
34
  The launcher records the detected release in the participant execution profile and in the
31
35
  analysis identity. A recorded release alone is not execution proof: prelaunch and failed
32
36
  attempts can carry the declared default, and a request's `dispatched` and `profileVerified`
33
- receipt shows that the launched release passed its checks. Saved bundles naming any recorded
34
- release stay readable.
37
+ receipt shows that the launched release passed its checks. Saved bundles naming any stable
38
+ release from 0.154.0 on stay readable, whether or not a launch list names it.
35
39
  Readiness validates the installation and effective profile without submitting a
36
40
  model turn; it does not guarantee current quota or model access.
37
41
 
@@ -159,10 +163,11 @@ not established by that proof. Recovery deliberately fails closed if storage
159
163
  behaves differently. Keychain/other-platform support and whole-process-tree
160
164
  leases require their own qualification.
161
165
 
162
- ## Admitting a Codex CLI release
166
+ ## Testing a Codex CLI release
163
167
 
164
- A release enters a host's list only with a dated receipt under
165
- `docs/goals/computer-use-actor/receipts/` showing all of the following, on that host:
168
+ Admission does not wait for a test. A release enters `TESTED_CODEX_CLI_VERSIONS`, which gates
169
+ nothing, with a dated receipt under `docs/evidence/computer-use/` showing all of
170
+ the following, on Linux x64:
166
171
 
167
172
  1. The release notes since the baseline were read for changes near the tool boundary.
168
173
  2. A drift check against a release already qualified on the host found no exec, connection or
@@ -170,27 +175,28 @@ A release enters a host's list only with a dated receipt under
170
175
  launches, and the same tool inventory, denials and isolate behavior. `pnpm codex:qualify`
171
176
  runs this check; see "The qualifier" below.
172
177
  3. One hosted participant study with the candidate first on `PATH` (for example
173
- `PATH=<evidence>/npm-<version>/node_modules/.bin:$PATH pnpm humanish lab run <lab>
178
+ `PATH=<evidence>/npm-<version>/node_modules/.bin:$PATH pnpm humanish run <study>
174
179
  --env-file <file with E2B_API_KEY only>`) reached its goal in the final capture, with a
175
180
  verified request receipt, `humanish verify --run <id>` passing and the automatic Codex
176
181
  analysis recording the release. Keep `OPENAI_API_KEY` out of that environment so the
177
182
  participant stays on ChatGPT-account billing.
178
183
 
179
184
  The drift check compares a candidate with a vendor release that has already been qualified. It
180
- can show that an honest new release does nothing new in those scenarios; it cannot show that a
185
+ can show that a benign new release does nothing new in those scenarios; it cannot show that a
181
186
  binary built to evade it is safe. Pair that with the attestation limit above: the launcher
182
187
  admits by release string and does not pin the executable.
183
188
 
184
- Then commit the release in `QUALIFIED_CODEX_CLI_VERSIONS`
185
- (`src/actors/codex/qualified-versions.ts`) for that host, in `RECORDED_CODEX_CLI_VERSIONS`
186
- (`src/actors/contract.ts`) and in the Observer's copy
187
- (`observer/lib/actor-execution-profile.ts`). If any check fails, change no code and record
188
- what differs.
189
+ Then commit the release in `TESTED_CODEX_CLI_VERSIONS` (`src/actors/codex/codex-admission.ts`);
190
+ launch admission does not change. Readers need no change: saved
191
+ profiles may name any stable release from `RECORDED_CODEX_CLI_FLOOR` (0.154.0) on, in
192
+ `src/actors/contract.ts` and the Observer's copy (`observer/lib/actor-execution-profile.ts`).
193
+ If any check fails, record what differs; a release that breaks humanish goes in
194
+ `REFUSED_CODEX_CLI_VERSIONS` with its issue.
189
195
 
190
196
  ### The qualifier
191
197
 
192
198
  `pnpm codex:qualify` produces the drift evidence step 2 above requires. Its threat model:
193
- it detects an honest new vendor release that, in these scenarios, executes a program, connects
199
+ it detects a benign new vendor release that, in these scenarios, executes a program, connects
194
200
  to a destination or writes a file the baseline release did not, and it fails closed when the
195
201
  harness cannot see (a failed trace, sampler read or parse). A binary built to evade it is out of
196
202
  scope. Named limits, none of which it inspects: