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,62 +0,0 @@
1
- import type { ActorPersonaRef } from "../../actors/contract.js";
2
- import type { ReasoningEffort } from "../../actors/reasoning-effort.js";
3
- import type { DwellWindow, StopWhen } from "../../actors/stop-conditions.js";
4
- import type { DevicePreset } from "../../lab/device-presets.js";
5
- import type { LabTask } from "../../lab/tasks.js";
6
- import type { RunStream } from "../../run/streams.js";
7
- import type { DesktopParticipantRun } from "./types.js";
8
- /**
9
- * A lane as the deprecated cuaHooks.buildProvider and cuaHooks.createDesktopLane receive it: a flat
10
- * copy of a DesktopParticipantRun.
11
- * @deprecated Use RunLabOptions.createProvider, which receives a ParticipantRef. Removed with the
12
- * compatibility section in the next minor.
13
- */
14
- export interface CuaLaneSpec {
15
- laneId: string;
16
- actorType?: string;
17
- surface?: string;
18
- caseGroup?: string;
19
- /** 0-based. */
20
- laneIndex: number;
21
- simId: string;
22
- streamId: string;
23
- persona: ActorPersonaRef;
24
- instructions: string;
25
- /** Redacted original composed prompt for legacy study context; execution uses instructions. */
26
- evidenceInstructions?: string;
27
- /** Original declarative assignment, separate from runtime-composed instructions. */
28
- assignment?: RunStream["assignment"];
29
- /** App-url fan-out only: this lane's explicit browser target; absent falls back to deps.appUrl. */
30
- targetUrl?: string;
31
- /** Deterministic harness-owned completion guard. Lane-level override, else actor default. */
32
- stopWhen?: StopWhen;
33
- /** A declared observation window (#510). Lane-level override, else actor default. */
34
- dwell?: DwellWindow;
35
- /**
36
- * How hard this lane's model is asked to think. Lane-level override, else the actor default,
37
- * else absent — and absent means the provider's own default, which the trace records as the
38
- * resolved value rather than as nothing (#497).
39
- */
40
- reasoningEffort?: ReasoningEffort;
41
- maxOutputTokens?: number;
42
- /** The lab's declared protocol (#414). Every lane runs the SAME protocol — that is what makes the
43
- * per-task rates comparable across participants. Goals are already composed into `instructions`;
44
- * this carries the full tasks so the loop can corroborate completion, and the criteria never
45
- * reach the prompt. */
46
- tasks?: readonly LabTask[];
47
- /** Per-lane override of the CUA idle backstop (consecutive screenshot/wait turns before gave_up).
48
- * Absent falls back to the loop default. Raised for a lane whose job includes a long LEGITIMATE
49
- * wait (e.g. a shared-world HOST idling in the waiting room while followers provision + join). */
50
- idleSteps?: number;
51
- /** Per-lane override of the non-idle no-progress backstop; see idleSteps. */
52
- noProgressSteps?: number;
53
- deviceName: string;
54
- devicePreset: DevicePreset;
55
- resolution: [number, number];
56
- /** "" for N=1 (screenshots/<name>); the laneId for N>1 (screenshots/<laneId>/<name>). */
57
- screenshotDir: string;
58
- /** "actor.json" for N=1; "actors/<streamId>.json" for N>1. */
59
- traceArtifactPath: string;
60
- }
61
- /** The flat hook view of one participant run. Called only where a caller's hook receives a lane. */
62
- export declare function legacyHookSpecOf(run: DesktopParticipantRun): CuaLaneSpec;
@@ -1,39 +0,0 @@
1
- // Translation module: legacy lane spellings stay only in modules like this one, so the rest of the
2
- // route reads participants. CuaActorLabHooks is public API in the deprecated compatibility section, and two of its hooks,
3
- // buildProvider and createDesktopLane, receive a lane. They keep receiving this flat record until
4
- // the next minor removes the section. Internally a lane is a DesktopParticipantRun.
5
- /** The flat hook view of one participant run. Called only where a caller's hook receives a lane. */
6
- export function legacyHookSpecOf(run) {
7
- const { planned } = run;
8
- const { labels, limits, device } = planned;
9
- return {
10
- laneId: planned.id,
11
- ...(labels.actorType === undefined ? {} : { actorType: labels.actorType }),
12
- ...(labels.surface === undefined ? {} : { surface: labels.surface }),
13
- ...(labels.caseGroup === undefined ? {} : { caseGroup: labels.caseGroup }),
14
- laneIndex: planned.index,
15
- simId: run.recordId,
16
- streamId: run.streamId,
17
- persona: run.persona,
18
- instructions: run.instructions,
19
- ...(run.evidenceInstructions === undefined
20
- ? {}
21
- : { evidenceInstructions: run.evidenceInstructions }),
22
- ...(run.evidenceAssignment === undefined ? {} : { assignment: run.evidenceAssignment }),
23
- ...(planned.targetUrl === undefined ? {} : { targetUrl: planned.targetUrl }),
24
- ...(limits.stopWhen === undefined ? {} : { stopWhen: limits.stopWhen }),
25
- ...(limits.dwell === undefined ? {} : { dwell: limits.dwell }),
26
- ...(limits.reasoningEffort === undefined ? {} : { reasoningEffort: limits.reasoningEffort }),
27
- ...(limits.maxOutputTokens === undefined ? {} : { maxOutputTokens: limits.maxOutputTokens }),
28
- ...(planned.tasks === undefined ? {} : { tasks: planned.tasks }),
29
- ...(run.backstop?.idleSteps === undefined ? {} : { idleSteps: run.backstop.idleSteps }),
30
- ...(run.backstop?.noProgressSteps === undefined
31
- ? {}
32
- : { noProgressSteps: run.backstop.noProgressSteps }),
33
- deviceName: device.name,
34
- devicePreset: device.preset,
35
- resolution: device.resolution,
36
- screenshotDir: run.screenshotDir,
37
- traceArtifactPath: run.traceArtifactPath,
38
- };
39
- }
@@ -1,122 +0,0 @@
1
- # Participant inboxes
2
-
3
- This page describes local capture. For fresh hosted inboxes, see
4
- [real email receiving](real-email-receiving.md); that route has a separate
5
- parsed renderer, strict remote-asset blocking and private lease lifecycle.
6
-
7
- The catch captures application mail without sending it to an external recipient.
8
- humanish gives each participant an address and a matching
9
- `/inbox/for/<address-digest>` URL. The same address scope applies to list, message,
10
- plain view, latest-message and JSON routes. Going back from a missing message
11
- stays in that scope. An unknown scope is empty; it never falls back to all mail.
12
- A participant without an assigned address receives no inbox instruction.
13
-
14
- This works with separate participant worlds, shared worlds, and an external catch.
15
- Sharing an application world does not require sharing an inbox. If a lab deliberately
16
- assigns the same address to two participants, both see that address's mail. Generated
17
- addresses that collide after normalization are made distinct. A message addressed
18
- to several participants appears in each recipient's inbox and retains its actual
19
- To field.
20
-
21
- `/inbox` remains available and is labeled **Shared operator inbox**. Address digests
22
- are routing identifiers, not authentication credentials. The catch is study
23
- infrastructure, not a mailbox service with hostile-tenant isolation. Keep its network
24
- exposure appropriate for test mail. The read-only listener cannot expose the private
25
- `/deliveries` drain, even when supplied a valid drain token. The capture listener
26
- retains its existing optional bearer-token protection for that endpoint.
27
-
28
- A standalone catch tracks its generated files. Reusing its directory with a changed
29
- `--recipient` roster or an emptied delivery log removes obsolete message, latest and
30
- recipient routes; unrelated files are untouched.
31
-
32
- ## Local browser studies
33
-
34
- Run a catch on the same host as the local study:
35
-
36
- ```bash
37
- humanish comms catch --port 8025 --dir .humanish/mail-catch
38
- ```
39
-
40
- Configure your **app's** email transport to send to `http://127.0.0.1:8025`
41
- using its supported HTTP send configuration, or add `--smtp-port 1025` and
42
- point its SMTP transport at `127.0.0.1:1025`. humanish does not change an
43
- already-running app's environment. No real mailbox-provider credentials are
44
- needed. This captures mail sent by that app; it does not receive arbitrary
45
- internet email.
46
-
47
- Add this to an existing local `app-url` lab:
48
-
49
- ```yaml
50
- comms:
51
- email:
52
- external:
53
- catchBaseUrl: http://127.0.0.1:8025
54
- ```
55
-
56
- Then run `humanish doctor --lab <lab>` and `humanish run <lab>`. Omit
57
- `recipients` to assign an address per participant automatically, or declare explicit
58
- `{ lane, address }` entries for an existing roster. The participant receives its
59
- address and inbox URL in its mission. Verification links keep their original
60
- app origin; ensure they target the loopback app port selected by the lab.
61
-
62
- Each local desktop forwards a separate host-owned read-only proxy for its
63
- assigned recipient. Other recipient routes, the operator inbox, mail sends and
64
- the private delivery drain are unavailable through that proxy. The study closes
65
- these proxies with its desktops and leaves your catch running. Host-side
66
- collection uses the existing digest-only comms evidence. Supported captured
67
- images and explicit unavailable-image placeholders work as described below.
68
-
69
- The local path supports captured email only. Provider-backed real receiving
70
- retains its separate hosted-route and management-credential requirements.
71
-
72
- ## Existing external catches
73
-
74
- Upgrade the humanish installation that runs `humanish comms catch` and **restart that
75
- catch process**, as well as upgrading the installation that starts the study. Updating
76
- only the study client leaves an older catch without participant routes.
77
-
78
- Before allocating participants, the client checks `/health` on both `catchBaseUrl`
79
- and a distinct `inboxBaseUrl`. Each must return the normal service marker and
80
- `capabilities: ["recipient-inbox-v1", ...]`. Missing, malformed or older responses
81
- fail admission with an upgrade/restart instruction. Existing email capture endpoints
82
- and unscoped operator URLs remain available; their payload contracts are unchanged.
83
-
84
- ## Captured and remote images
85
-
86
- The SMTP catch preserves MIME parts with a Content-ID when they contain PNG, JPEG,
87
- GIF or WebP bytes. The generic `/emails` payload can also carry runtime-only
88
- `inlineImages` entries with `contentId`, `contentType` and `base64`. Provider-specific
89
- attachment fields are not converted; unsupported or missing CID references show an
90
- explicit unavailable-image placeholder instead of pretending capture succeeded.
91
-
92
- Captured images are limited to 12 entries, 1 MiB each and 2 MiB total. The renderer
93
- checks canonical base64 and the declared raster format's signature before creating a
94
- data URL. This is not a full image decoder; malformed raster content can still fail
95
- in the browser. Inline data URLs receive the same per-image checks. SVG, arbitrary
96
- attachment URLs and local paths are not fetched or converted.
97
-
98
- HTTP(S) images remain browser loads with `no-referrer`. humanish does not fetch or
99
- proxy them server-side. Relative image URLs use the existing declared origin-rewrite
100
- map when available; otherwise they receive an explicit placeholder. Remote URLs that
101
- return errors retain the browser's alt-text fallback. The renderer does not claim to
102
- repair a dead URL. The inbox retains `script-src 'none'` and the existing HTML
103
- neutralization and origin-rewrite protections.
104
-
105
- Raw mail and image bytes remain runtime catch data. Persisted comms evidence remains
106
- digest-only; adding image capture does not add raw attachments to the run artifact.
107
-
108
- ## Reproduce the contract
109
-
110
- ```bash
111
- pnpm exec vitest run tests/comms/ tests/substrates/local/captured-inbox.test.ts
112
- pnpm exec tsx scripts/comms-inbox-proof.ts
113
- ```
114
-
115
- The browser proof starts owned loopback HTTP, read-only inbox and SMTP listeners,
116
- sends fictional multipart mail through the real MIME parser, and renders two recipient
117
- inboxes in Chromium at desktop and phone sizes. It checks decoded CID/data/remote
118
- images, unavailable sources, a genuine remote 404, recipient isolation across HTML
119
- and JSON, navigation, script blocking, referrer suppression, directory reuse and drain
120
- access. Screenshots and a machine-readable receipt are saved under the ignored
121
- `.humanish/comms-inbox-proof/` directory. It uses no external email delivery, paid model
122
- calls or hosted desktop, and makes no claim about those providers.
@@ -1,80 +0,0 @@
1
- # Optional desktop recording
2
-
3
- humanish keeps screenshots, actions, participant feedback and analysis by default.
4
- For continuous playback, opt into a desktop video:
5
-
6
- ```yaml
7
- execution:
8
- desktop:
9
- recording: { audio: true }
10
- ```
11
-
12
- Set `audio: false` for screen-only video. Omit `recording` to keep the lightweight
13
- snapshot recording. This applies to independent computer-use desktop participants on
14
- local Firecracker and E2B; scripted-browser, shared-world and in-process executors
15
- do not consume this setting and reject it before execution.
16
-
17
- Recording does not enable a camera, speech synthesis or speech recognition.
18
- Those remain separate [participant media](participant-media.md) options. With
19
- audio enabled, microphone input and speaker output are mixed into one AAC track.
20
- `audioSources` identifies the capture points feeding that mix, not separate
21
- retained tracks. The microphone can be silent when speech is not configured.
22
- A recorded microphone signal proves what was offered to the browser, not what
23
- another person received. Confirm reciprocal delivery from the other
24
- participant's evidence.
25
-
26
- ## Capture and playback
27
-
28
- The desktop runs FFmpeg against its X display. MP4 carries H.264 video and optional
29
- AAC audio. Recording stops and streams to the run directory before desktop cleanup.
30
- Both providers use the same encoding settings and artifact metadata. Video encoding
31
- uses the capture input’s microsecond time base, preserving closely spaced captures
32
- and their offsets rather than rounding them to the nominal frame interval.
33
- Explicit variable-frame-rate output preserves gaps without filling them with
34
- duplicate frames across the supported FFmpeg versions. The recording
35
- mix disables playback rewinds to avoid the null sink's initial two-second buffer. The local
36
- runtime transfers one bounded file over its existing owner connection; E2B uses
37
- the SDK's streaming file download. Participant tools cannot request arbitrary files.
38
-
39
- Local recording uses the existing optional media runtime archive. This keeps the
40
- browser-only download unchanged, but the optional archive also contains speech
41
- assets even when speech is disabled. Recording alone does not start Whisper or
42
- text-to-speech. E2B's stock desktop already has the recording dependencies; a custom
43
- template must provide compatible FFmpeg, X11 and, for audio, PulseAudio tools.
44
-
45
- Observer uses the existing study clock to play the selected participant's video.
46
- Scrubbing, opening a participant and returning to the grid preserve study time.
47
- The grid continues to show lightweight captures; only the selected participant
48
- has audible playback. Outside the retained media interval, Observer shows that
49
- video is unavailable rather than extending its coverage. Old screenshot-only runs
50
- continue to work.
51
-
52
- Capture still begins after device and transport startup. An audio track can contain
53
- silence before a cold source delivers sound; early dispatch of speech or playback
54
- does not itself prove audible capture. Preserve these offsets when reviewing early
55
- events. The startup correction does not reconstruct missing frames or audio in
56
- existing files. Variable guest execution stalls can still leave frame gaps; the
57
- recorded timestamps preserve those gaps. A regularly timestamped video can also
58
- show an unchanged screen while the application stalls. Visual/audio event timing
59
- depends on source delivery and guest execution; timestamp precision does not
60
- guarantee simultaneous delivery. See #854 for the remaining investigation.
61
-
62
- The file and its measured interval are recorded in `streams[].recording` and a
63
- `recording` artifact entry. A recorder failure warns and preserves screenshots,
64
- actions and feedback; it does not fail an otherwise useful participant. Incomplete
65
- but playable media is labeled partial. Forced VM loss may leave no retrievable
66
- video. Analysis continues to use the existing screenshot and text evidence; it
67
- does not inspect the MP4.
68
-
69
- ## Local evidence and exports
70
-
71
- Video and audio are raw local evidence. `policies.redactScreenshots` does not redact
72
- them, and verification keeps a run with continuous media `local_only`. The recorder
73
- has a 128 MiB per-participant file limit; a retained size-limited recording is partial.
74
- Encoding consumes additional CPU, memory and disk, so snapshots remain the default.
75
-
76
- `humanish export --local-only` produces the existing portable HTML with screenshots
77
- and text, excludes continuous media and displays that exclusion. Open the original
78
- run through `humanish watch` or `humanish serve` to play its video. Redacted bundle
79
- export does not redact video/audio and rejects these runs. There is no new portable
80
- video format or automatic audio/video redaction in this feature.
@@ -1,178 +0,0 @@
1
- # Local browser studies
2
-
3
- Linux x64 and supported Apple Silicon Mac users can run isolated Firecracker
4
- browser participants from the installed CLI or TUI. Docker manages their
5
- containers and private state volumes; the normal study runner supplies
6
- scheduling, recordings, Observer and findings.
7
- No separate host service is installed.
8
-
9
- ## Start a study
10
-
11
- Both platforms need a signed-in, supported Codex CLI. Linux needs a local,
12
- rootful Docker Engine, KVM (`/dev/kvm`) and TUN (`/dev/net/tun`). Macs need an
13
- M3-or-newer chip, native ARM64 Node, Lima 2.2+ (`brew install lima`) and a macOS
14
- version supporting nested virtualization; see [Mac setup](#apple-silicon-macs).
15
- Docker Desktop is unnecessary. See
16
- [Codex account setup](restricted-codex-analysis.md) for the qualified version
17
- and account restrictions. Docker access is an administrative capability.
18
- humanish does not install Docker on Linux or change host permissions. On Mac,
19
- setup installs Docker only inside the dedicated Lima host.
20
-
21
- Configure the starter while initializing the project, then start your app on
22
- the same loopback URL:
23
-
24
- ```sh
25
- npx humanish init --yes \
26
- --local-browser http://127.0.0.1:3000 \
27
- --local-mission "Create a note and explain anything confusing about saving it"
28
- npx humanish doctor --lab local-browser
29
- npx humanish run local-browser
30
- npx humanish verify
31
- ```
32
-
33
- `verify` checks the saved run bundle, and its share-safety line says whether the evidence can be
34
- shared as-is. `init` also adds `humanish:*` scripts to `package.json`; `humanish:run` among them
35
- is `humanish run --dry-run`, a contract-proof dry run rather than this live study. `init` also
36
- writes `humanish/labs/local-browser.yaml` with safe defaults when the two options are omitted.
37
- The options provide the normal setup path for the app URL and mission on first setup. If the
38
- file already exists, `init` preserves it and warns that these options were skipped; edit the
39
- existing manifest to change its URL or mission. The commands above write this lab (its
40
- `description` is omitted here):
41
-
42
- ```yaml
43
- schema: humanish.lab.v2
44
- id: local-browser
45
- title: Local browser · your app · Codex account
46
- subject:
47
- source: app-url
48
- appUrl: "http://127.0.0.1:3000"
49
- actors:
50
- - type: local-agent
51
- localAgent: codex
52
- persona: synthetic-new-user
53
- mission: "Create a note and explain anything confusing about saving it"
54
- execution:
55
- target: local
56
- concurrency: 1
57
- timeoutMs: 120000
58
- scenario:
59
- mode: live
60
- defaults:
61
- open: true
62
- ```
63
-
64
- ```sh
65
- npx humanish runtime status --json
66
- npx humanish doctor --lab local-browser --json
67
- npx humanish run local-browser
68
- npx humanish verify
69
- ```
70
-
71
- The first live run downloads the pinned runtime archive (about 569 MiB on x64 or
72
- 556 MiB on ARM64), verifies its exact size and SHA-256, and loads it into Docker.
73
- Later runs reuse the image.
74
- `humanish runtime setup` prepares it in advance. Status, doctor and dry-run never
75
- download an image or launch a participant. Preparation does not consume the
76
- participant's task-time budget. The TUI lists the same lab and runtime readiness;
77
- starting it uses the same preparation and execution path.
78
-
79
- This configuration needs neither an E2B key nor an OpenAI API key. Participants
80
- and the separate post-run analyst use Codex account quota and **remote model
81
- inference**. It is not an offline model. The restricted participant has no host
82
- shell, checkout mount or credential files. Account dollar cost and output-token
83
- ceilings are unknown; numeric dollar/token caps are rejected. Set
84
- `review.analysis: false` to skip analysis.
85
-
86
- For API billing and its supported caps, use `type: openai-computer-use`, remove
87
- `localAgent`, and provide `OPENAI_API_KEY`. Its analysis retains the existing API
88
- default. Neither path silently falls back to another provider or hosted desktop.
89
- Existing labs without `execution.target: local` retain their previous behavior.
90
-
91
- Before handing the desktop to the participant, the guest opens the
92
- selected app and waits up to 30 seconds for the initial document's
93
- `DOMContentLoaded` event, then allows a bounded paint. It does not wait for app
94
- data, images or network idle: the app's own loading screen remains observable.
95
- Navigation failures and timeouts fail startup and release the owned desktop.
96
- Later participant actions and observations do not use this startup wait.
97
-
98
- ## Current limits
99
-
100
- - Linux x64 or M3-or-newer Mac with native ARM64 Node and Lima. Linux ARM64 is
101
- refused: the local participant, the restricted Codex participant, runs only on
102
- Linux x64 and Apple-silicon macOS. The installed Mac setup was tested on an M5
103
- Max; smaller machines are not capacity-qualified.
104
- - On Linux, a local Docker Engine; remote contexts, rootless Docker and Docker
105
- Desktop are unsupported. The Mac adapter uses Docker inside its own Lima host.
106
- - Loopback HTTP(S) app URLs on explicit ports above 1023. Each participant can
107
- reach its selected app port, its assigned captured inbox when declared, and public destinations over ordinary TCP/UDP.
108
- Other private host/LAN destinations and cloud metadata are blocked.
109
- - Chromium at 960×720, 2 vCPUs and 2 GiB guest RAM per participant. Docker's
110
- enclosing memory limit is 3 GiB. Start with a small concurrency for your host;
111
- these allocations are not a promise of measured peak memory or capacity.
112
- - Browser-only by default. [Optional camera and spoken conversation](participant-media.md)
113
- use a separate media image and the same study loop.
114
- - [Captured inboxes](comms-inbox.md#local-browser-studies) use an operator-run mail catch.
115
- Real email receiving remains unsupported on the local route.
116
- - A 20-minute default and maximum participant session budget, within the runtime
117
- image's 30-minute process lifetime. A shorter `execution.timeoutMs` is supported.
118
- - Codex participants currently use `gpt-6-astra` at low effort. Hosted templates,
119
- device presets and hosted sandbox timeouts do not apply.
120
-
121
- Normal close and cooperative startup cancellation remove the owned container
122
- and its private state volume. After a desktop connects, controller death
123
- disconnects the guest, which reboots; Firecracker exits and Docker removes both.
124
- A small host socket directory can remain after abrupt death.
125
- Run evidence remains in `.humanish/` under the normal local capture and sharing
126
- rules. An unconfirmed release is reported as such.
127
-
128
- ## Runtime maintenance
129
-
130
- The npm build pins a release URL, byte count, SHA-256 and immutable Docker image
131
- ID in `src/substrates/local/runtime-release.ts`. It has no moving `latest` image dependency.
132
- Runtime releases include source archives and notices separately; study users do
133
- not download those archives. Updating a runtime requires a reviewed catalog
134
- change and a new CLI release.
135
-
136
- Source builders can use the
137
- [maintained recipes](https://github.com/danielgwilson/humanish/blob/main/runtime/local-firecracker/README.md) and set
138
- `HUMANISH_LOCAL_RUNTIME_IMAGE` to an already-built compatible local image. An
139
- invalid override fails; it does not cause an implicit registry pull.
140
-
141
- ## Apple Silicon Macs
142
-
143
- The Mac adapter uses a dedicated `humanish-runtime` Lima/VZ host on M3 or
144
- newer Macs, with Lima 2.2+ and macOS supporting nested virtualization. Docker
145
- runs inside that host; Docker Desktop is unnecessary. Setup creates the host
146
- with 6 CPUs, 8 GiB RAM and an 80 GiB growable disk. It mounts no Mac directories.
147
- Start with two participants; larger concurrency has not been qualified by this
148
- integration. Use Lima's normal resource configuration for subsequent capacity
149
- experiments, without changing study concurrency behind the user's back.
150
-
151
- The scheduler and study loop remain shared. Standard OpenSSH forwards the
152
- browser-control Unix socket to the Mac, and the selected app port back into the
153
- Linux host. It preserves HTTP(S)/WebSocket bytes without parsing them. Codex
154
- runs on the Mac and retains the same separate participant/analyst profiles and
155
- file-backed login requirement. Keychain-only authentication is not supported.
156
-
157
- The installed CLI passed first-attempt public image setup and two-participant
158
- studies on an M5 Max: distinct app-side saves, overlapping participants,
159
- verified recordings and automatic account analysis. A fresh Lima instance used
160
- the public ARM64 catalog without a development image override. The separately
161
- available source archives match that native build. The manually dispatched ARM64
162
- job in `browser-appliance-proof.yml` builds images and sources; compilation alone
163
- does not establish Mac execution.
164
-
165
- Status and doctor do not create or start Lima. Explicit setup/first live use
166
- starts the owned host; closing a study removes its participant containers and
167
- volumes, but keeps the reusable Lima host running. Stop it with
168
- `limactl stop humanish-runtime` when no studies are running. An interrupted
169
- first provision remains inspectable through Lima and can be retried. humanish
170
- does not replace a conflicting instance or stop unrelated instances.
171
-
172
- Normal close, cancellation and controller death were exercised on established
173
- Mac desktops. Shared startup cancellation and interrupted create-reply recovery
174
- were exercised against real Linux Docker/Firecracker, with a separate regression
175
- check for Lima cleanup. Forced controller death during startup, full-study
176
- cancellation, host sleep/wake and higher concurrency remain unqualified. A forced
177
- kill before a desktop connects can leave resources requiring inspection; this
178
- adapter adds no suspend detector that unconditionally destroys a study.
@@ -1,144 +0,0 @@
1
- # Watching and reviewing evidence
2
-
3
- Observer shows a study's participants, their recorded screens, and the events
4
- that explain those screens. The grid, player and exported HTML use the same
5
- current renderer. Screens fit their actual aspect ratio; a portrait capture is
6
- never cropped to fill a wide tile.
7
-
8
- ## Choose the right entry point
9
-
10
- `humanish watch <lab>` starts a study and keeps its viewer attached. The process
11
- that owns a hosted desktop can offer its live stream while it runs. `--no-open`
12
- keeps that attachment without launching a browser. `--json` is the machine-result
13
- path and does not keep an interactive stream server attached.
14
-
15
- `humanish observe --run <id>` opens an existing study without starting another. The
16
- TUI's **Open in Observer** action does the same through its session-owned loopback
17
- library. These entry points follow saved captures; they cannot recover live desktop
18
- credentials owned by another process. Keep the owning CLI or TUI open while using its
19
- viewer. Exported HTML is an independent offline recording.
20
-
21
- ## Read status without guessing
22
-
23
- The top band separates the run's current status from evidence freshness. A
24
- finished study never uses its execution mode (`live`, as opposed to `dry-run`)
25
- as a claim that it is still running. When updates fail, the last usable evidence
26
- stays visible, the band reports the failure, and **Retry** requests another
27
- snapshot. A stale process heartbeat does not prove that the process died.
28
-
29
- A player's **Live desktop** label identifies what it displays. An iframe loading
30
- is not a connection-health signal: the provider owns that connection. **Reload
31
- stream** reloads the desktop viewer without restarting a participant. **Latest capture**
32
- follows the latest saved screenshot without a desktop stream. **Replay** means
33
- the researcher has chosen a recorded moment. Offline exports say so explicitly.
34
-
35
- Freshness uses recorded activity and capture timestamps, not the time the server
36
- reserialized the same data. Browser tabs poll less frequently while hidden and
37
- refresh when visible again. Requests are serialized, bounded by a timeout and
38
- cancelled when the viewer closes.
39
-
40
- ## Work through a study
41
-
42
- Previews share a height and wrap into rows; desktop cards are wider and portrait
43
- cards narrower. Complete screens remain contained when the available width is
44
- smaller than a preview. Sparse rows keep their chosen size. Open **View and filter
45
- participants** in the top right to search, change **Preview size**, or enter
46
- **Monitor** for a larger evidence area. **Exit monitor** stays beside the run status.
47
- Open a card's **Participant details** to **Pin** it at the beginning. Ordering changes only
48
- when the researcher changes it. Large studies have reachable participant pages.
49
- At most four desktop previews attach in the grid; allocation prioritizes screens
50
- that are actually visible, with the hovered or keyboard-focused participant taking
51
- priority. Other cards show their latest saved capture.
52
-
53
- Each card follows its screen's aspect ratio without a minimum width that adds
54
- portrait gutters. Its 44px caption holds the participant name, a short preview
55
- source (**Live**, **Capture**, or **Snapshot**) or finished outcome, and a stable
56
- **Participant details** button. Labels and controls never cover captured pixels.
57
- Details contains labeled **Pin** and **Compare** toggles, the full source and
58
- freshness, final messages, recorded notices, duration and dimensions. Historical
59
- notices do not turn the details control into a warning; exceptional outcomes
60
- remain in the caption. Comparison permits three participants and explains the
61
- limit while keeping selected participants removable.
62
-
63
- Icon buttons use Lucide glyphs, accessible names, hover/focus hints and visible
64
- keyboard focus. Touch targets expand to 44px. Popovers have explicit close buttons;
65
- Escape dismisses a hint without moving the player. These conventions follow
66
- [Carbon icon usage](https://carbondesignsystem.com/elements/icons/usage/),
67
- [ARIA toggle-button semantics](https://www.w3.org/WAI/ARIA/apg/patterns/button/),
68
- and [WCAG target sizing](https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html).
69
- The bookmark icon in the top bar opens **Saved moments**; recalling an available
70
- moment closes the popover, while an unavailable moment leaves the error visible.
71
-
72
- Opening a participant provides elapsed-time seeking, the original frame number,
73
- playback speed, **Fit**, **Actual size**, zoom/pan and fullscreen. The inspector can
74
- be hidden or resized. Click markers use the recorded desktop coordinate system
75
- and the image's rendered rectangle, including at zoomed sizes.
76
-
77
- Arrow keys, mouse controls, same-participant links, browser navigation and reload
78
- agree about the selected moment. Seeking leaves live mode. Pausing on the newest
79
- frame stays paused when new evidence arrives; **Go live** explicitly resumes
80
- following. A missing addressed moment is reported instead of silently replaced.
81
-
82
- Screenshot playback is sparse evidence, not a video recording. Capture gaps stay
83
- visible. **Skip waits** compresses intervals associated with recorded waits and
84
- reports the skipped duration. **Next action**, **Next flagged frame**, activity
85
- filters and grouped waits make long traces easier to inspect without deleting events.
86
- Older unstamped recordings use labeled estimated pacing. Long feeds, filmstrips,
87
- terminal output and event lists stay bounded while earlier/later content remains
88
- reachable.
89
-
90
- **Copy moment link** creates a frame address; denied clipboard access exposes a
91
- selectable link. **Original frame** opens/downloads the captured raster. **Saved
92
- moments** keeps bounded run/participant/frame identifiers in this browser. It does
93
- not save credentials, publish annotations or change the evidence bundle. Storage
94
- failure leaves the controls usable for the current visit.
95
-
96
- ## Compare recorded evidence
97
-
98
- Select participants and open **Compare selected**. Capture-time alignment chooses
99
- the latest frame at or before the cursor, never a future frame. Before/after
100
- coverage and each frame's age are explicit. Clock differences between desktops
101
- remain an uncertainty; matching timestamps alone do not establish causality.
102
-
103
- Elapsed-time alignment starts each participant at its first capture and compares
104
- progress rather than simultaneous events. Missing or descending timestamps cannot
105
- be used as a shared clock. Another run can be loaded from the available library
106
- as recorded evidence. The address retains the chosen runs, participants, clock
107
- and cursor so reopening it restores the comparison.
108
-
109
- ## Boundaries and checks
110
-
111
- Only the attached process can grant a desktop iframe its own origin for provider
112
- module loading. Stored grants are removed, exports contain no runtime grants,
113
- and every local viewer response refuses to be framed. Generic imported embeds
114
- retain an opaque sandbox. Artifact and history links cannot introduce arbitrary
115
- URL schemes or traverse outside their evidence roots.
116
-
117
- `pnpm observer:browser:proof` exercises generated synthetic evidence in the
118
- production artifact. `pnpm observer:iframe:proof`, after `pnpm build`, checks the
119
- actual serving boundary against direct, redirected and scripted iframe attacks.
120
- CI retains their screenshots and JSON receipts. These Chromium checks do not
121
- claim physical-device or non-Chromium coverage. Actual provider checks and their
122
- resource-cleanup receipts are separate acceptance evidence.
123
-
124
- Interaction references rechecked September 8, 2026:
125
- [Base UI popover](https://base-ui.com/react/components/popover),
126
- [React state structure](https://react.dev/learn/choosing-the-state-structure),
127
- [WAI-ARIA tabs](https://www.w3.org/WAI/ARIA/apg/patterns/tabs/),
128
- [iframe sandboxing](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe),
129
- [Playwright Trace Viewer](https://playwright.dev/docs/trace-viewer), and
130
- [PostHog recording controls](https://posthog.com/docs/session-replay/how-to-watch-recordings).
131
-
132
- ### Moving between review views
133
-
134
- The library button opens a drawer while reviewing a participant or comparison,
135
- including on desktop. Comparison panels use the same participant names as the
136
- grid. **Open frame** opens the displayed capture in the player, where it can be
137
- saved; **Back to comparison** restores that comparison's selection, alignment and
138
- cursor. Browser Back also returns to the addressed comparison. Comparing another
139
- run needs a free slot within the three-participant limit.
140
-
141
- **Reported thinking** is an explicit filter; the Thinking checkbox controls only
142
- All evidence. **Warnings & findings** includes a separate Run and setup notices
143
- section. These recorded operational notices retain their source timestamps and
144
- are not assigned invented screenshot positions or counted as participant findings.