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,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
 
@@ -46,9 +41,9 @@ regardless of substrate:
46
41
  - `artifact`: artifact-only evidence stream;
47
42
  - `summary`: run-level synthesis stream.
48
43
 
49
- Each stream points back to a simulation and carries its own transport,
50
- terminal tail, UI state, artifact links, event timeline, and public-safe
51
- metadata.
44
+ Each stream points back to its participant's `simulations[]` entry and carries its
45
+ own transport, terminal tail, UI state, artifact links, event timeline, and
46
+ public-safe metadata.
52
47
 
53
48
  ## Live Watch
54
49
 
@@ -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/lanes.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,11 +34,36 @@ 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
 
42
+ Each launch also checks the release's app-server schema. After `--version`, the launcher runs
43
+ `codex app-server generate-json-schema --experimental` into its private work directory, bounded
44
+ at 15 seconds and 64 KiB of output. It reads only regular files of at most 16 MiB, waits on the
45
+ request deadline while reading, and removes the schema afterwards.
46
+ [`src/actors/codex/protocol-contract.ts`](https://github.com/danielgwilson/humanish/blob/main/src/actors/codex/protocol-contract.ts)
47
+ lists each method humanish calls with the fields and values it sends and the response fields it
48
+ reads, each notification and server request it consumes, the reply it sends to a tool call, and
49
+ the containers (`items`, `turn.items`, `thread.turns[].items`) its item policy reads in every
50
+ notification, including the consumed ones outside the ServerNotification union. Where the
51
+ baseline carries items (`thread.turns[].items` in `thread/started`, `turn.items` in
52
+ `turn/started` and `turn/completed`), the carrier is required, so a release that renames it
53
+ refuses. The schema does not link a response to its method, so the table names each response
54
+ definition. A read field is checked in every alternative the schema allows, including each
55
+ object or array on its path; a sent field needs one alternative that still accepts it. `allOf`
56
+ members intersect, and `false` allows no value. The launch refuses as
57
+ `codex_incompatible_release` before app-server starts, listing each change, when a read field
58
+ is gone or allows another type, a compared value is no longer allowed, a sent field or value is
59
+ no longer accepted, a field humanish does not send is newly required, or a method or definition
60
+ is missing. A value beyond those the admitted releases offer, such as a new item type, is
61
+ recorded on an admitted launch and reported as a warning; a new item type that arrives is still
62
+ refused by the item allowlist. Values humanish only refuses, such as an asynchronous delivery,
63
+ are listed as known values: their removal does not refuse the launch, since it cannot make
64
+ humanish accept more. The check covers only the listed fields. It does not attest the binary,
65
+ and the `config/read` keys the schema leaves untyped are checked by exact value after launch.
66
+
38
67
  ## Authority and request limits
39
68
 
40
69
  The host creates a private temporary Codex home and links only the existing
@@ -54,8 +83,17 @@ This profile is **not advertised as tool-free**. The CLI retains code-mode
54
83
  descriptions, but the qualified `features.code_mode_host=false` setting rejects
55
84
  their actual dispatch. `agents.enabled=false` removes delegation; the older
56
85
  feature toggle alone did not. humanish also refuses raw tool calls, unexpected
57
- host RPCs and asynchronous question messages before accepting any report. The
58
- actual notification/denial captures and provenance are in
86
+ host RPCs and asynchronous question messages before accepting any report. Every
87
+ item an app-server notification carries (`item`, `items`, `turn.items`,
88
+ `thread.turns[].items`) passes the item allowlist whatever its method, from the
89
+ launch handshake until the app-server exits. Output that arrives after a request
90
+ stopped, or during shutdown, is still read for the item policy. Every refusal, and
91
+ any output that could not be checked, is kept for the session's close: it fails a
92
+ participant's run even when a step that tolerates a failed request absorbed it,
93
+ and it fails an analysis that had completed. A last frame cut off by humanish's
94
+ own signal, delivered to the running app-server and ending it, is a warning with
95
+ its byte count. A method humanish does not know that carries no item is counted
96
+ in the run's warnings and does not refuse. The actual notification/denial captures and provenance are in
59
97
  [`tests/fixtures/restricted-codex`](https://github.com/danielgwilson/humanish/blob/46330116726f74080fa18947c36da4fb4b333805/tests/fixtures/restricted-codex/README.md).
60
98
 
61
99
  Each analyst or readiness request owns a separate child process, temporary home
@@ -125,10 +163,11 @@ not established by that proof. Recovery deliberately fails closed if storage
125
163
  behaves differently. Keychain/other-platform support and whole-process-tree
126
164
  leases require their own qualification.
127
165
 
128
- ## Admitting a Codex CLI release
166
+ ## Testing a Codex CLI release
129
167
 
130
- A release enters a host's list only with a dated receipt under
131
- `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:
132
171
 
133
172
  1. The release notes since the baseline were read for changes near the tool boundary.
134
173
  2. A drift check against a release already qualified on the host found no exec, connection or
@@ -136,27 +175,28 @@ A release enters a host's list only with a dated receipt under
136
175
  launches, and the same tool inventory, denials and isolate behavior. `pnpm codex:qualify`
137
176
  runs this check; see "The qualifier" below.
138
177
  3. One hosted participant study with the candidate first on `PATH` (for example
139
- `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>
140
179
  --env-file <file with E2B_API_KEY only>`) reached its goal in the final capture, with a
141
180
  verified request receipt, `humanish verify --run <id>` passing and the automatic Codex
142
181
  analysis recording the release. Keep `OPENAI_API_KEY` out of that environment so the
143
182
  participant stays on ChatGPT-account billing.
144
183
 
145
184
  The drift check compares a candidate with a vendor release that has already been qualified. It
146
- 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
147
186
  binary built to evade it is safe. Pair that with the attestation limit above: the launcher
148
187
  admits by release string and does not pin the executable.
149
188
 
150
- Then commit the release in `QUALIFIED_CODEX_CLI_VERSIONS`
151
- (`src/actors/codex/qualified-versions.ts`) for that host, in `RECORDED_CODEX_CLI_VERSIONS`
152
- (`src/actors/contract.ts`) and in the Observer's copy
153
- (`observer/lib/actor-execution-profile.ts`). If any check fails, change no code and record
154
- 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.
155
195
 
156
196
  ### The qualifier
157
197
 
158
198
  `pnpm codex:qualify` produces the drift evidence step 2 above requires. Its threat model:
159
- 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
160
200
  to a destination or writes a file the baseline release did not, and it fails closed when the
161
201
  harness cannot see (a failed trace, sampler read or parse). A binary built to evade it is out of
162
202
  scope. Named limits, none of which it inspects:
@@ -1,33 +1,28 @@
1
1
  # Serve: the run library surface
2
2
 
3
- Date: 2026-08-02
4
-
5
- Status: shipped. The `loopback`, `exposed` (edge-authed) and `share-safe-open`
6
- modes live in `src/observer/serve.ts`, `src/observer/library.ts`,
7
- `src/observer/http.ts`, `src/observer/exposure.ts` and `src/observer/tunnel.ts`,
8
- with per-run routes and the history index in `src/observer/run-routes.ts` and the
9
- loopback bind in `src/observer/listen.ts`. The CLI wiring is in
3
+ The `loopback`, `exposed` (edge-authed) and `share-safe-open` modes live in
4
+ `src/observer/serve.ts`, `src/observer/library.ts`, `src/observer/http.ts`,
5
+ `src/observer/exposure.ts` and `src/observer/tunnel.ts`, with per-run routes and the history
6
+ index in `src/observer/run-routes.ts` and the loopback bind in `src/observer/listen.ts`. The CLI wiring is in
10
7
  `src/cli/commands/observe.ts`. The `/_humanish/api/*` control-plane namespace is
11
8
  reserved and answers `501`; no mutating route ships.
12
9
 
13
- Exposure auth is **tunnel-edge only**. As of 0.18.0 humanish carries NO
14
- in-process auth: the hand-rolled capability-link (cookie/token/TTL, its auth
15
- module and the `serve --auth link|none` flags) was removed as
16
- a pre-1.0 breaking change. The gate now lives entirely at the edge: ngrok
17
- `--oauth google` (with `--allow-email`/`--allow-domain` allow rules), or an
18
- operator-secured `--public-url` (Cloudflare Access, Tailscale, a reverse proxy
19
- you own).
10
+ Exposure auth happens only at the tunnel edge. humanish has had no in-process auth since 0.18.0,
11
+ which removed the capability link (cookie, token and TTL), its auth module and the
12
+ `serve --auth link|none` flags. The gate is ngrok `--oauth google` with `--allow-email` or
13
+ `--allow-domain` rules, or an operator-secured `--public-url` (Cloudflare Access, Tailscale or a
14
+ reverse proxy you own).
20
15
 
21
16
  ## What serve is
22
17
 
23
- `humanish serve` is the third observer surface, and the first whose subject is
24
- the LIBRARY rather than a run:
18
+ `humanish observe --all` is the third observer surface, and the first whose subject is
19
+ the library rather than a run:
25
20
 
26
21
  - `humanish watch` serves one attached run: the process that created the run
27
22
  serves it and may inject runtime stream URLs for live following (see the
28
23
  stream-URL rules below and `watch --expose`);
29
24
  - `humanish observe` re-serves one finished run read-only;
30
- - `humanish serve` serves the whole local library under `.humanish/runs/`: a
25
+ - `humanish observe --all` serves the whole local library under `.humanish/runs/`: a
31
26
  library index, per-run Observer pages, `/_humanish/history.json` polling, and
32
27
  optional edge-authenticated exposure beyond the machine.
33
28
 
@@ -39,11 +34,11 @@ authenticated edge (or `--safe`, see the fail-closed matrix).
39
34
  ## Fail-closed exposure matrix
40
35
 
41
36
  One shared validator (`validateExposure` in `src/observer/exposure.ts`) governs
42
- both `serve` and `watch`. `--expose` must always resolve to a reachable public
37
+ both `observe --all` and `watch`. `--expose` must always resolve to a reachable public
43
38
  origin (a `--tunnel` or a `--public-url`), even under `--safe`, since an
44
39
  origin-less exposed server is an unreachable loopback no-op. With an origin
45
- present, exposure requires EITHER edge auth (`--oauth` on the ngrok edge, or a
46
- `--public-url` you secure) OR `--safe` (share_ready runs only). A tunnel with
40
+ present, exposure requires either edge auth (`--oauth` on the ngrok edge, or a
41
+ `--public-url` you secure) or `--safe` (share_ready runs only). A tunnel with
47
42
  neither is a wide-open public URL to local bundles and is refused.
48
43
 
49
44
  | `--expose` | `--tunnel` | `--oauth` | `--public-url` | `--safe` | Outcome |
@@ -51,11 +46,11 @@ neither is a wide-open public URL to local bundles and is refused.
51
46
  | no | no | no | no | any | `loopback` (no exposure) |
52
47
  | yes | yes | yes | no | any | OK → `exposed` (edge-authed; all runs unless `--safe`) |
53
48
  | yes | yes | no | no | yes | OK → `share-safe-open` (public, share_ready only) |
54
- | yes | yes | no | no | no | **REFUSED** `HUMANISH_SERVE_EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE` |
49
+ | yes | yes | no | no | no | **refused** `HUMANISH_SERVE_EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE` |
55
50
  | yes | no | no | yes | any | OK → `exposed` (operator-secured edge) |
56
- | yes | no | no | no | any | **REFUSED** `HUMANISH_SERVE_EXPOSE_REQUIRES_ORIGIN` (no reachable origin, even with `--safe`) |
57
- | yes | no | yes | no | any | **REFUSED** `HUMANISH_SERVE_OAUTH_REQUIRES_TUNNEL` |
58
- | yes | yes | yes | yes | any | **REFUSED** `HUMANISH_SERVE_OPTION_CONFLICT` (tunnel + public-url) |
51
+ | yes | no | no | no | any | **refused** `HUMANISH_SERVE_EXPOSE_REQUIRES_ORIGIN` (no reachable origin, even with `--safe`) |
52
+ | yes | no | yes | no | any | **refused** `HUMANISH_SERVE_OAUTH_REQUIRES_TUNNEL` |
53
+ | yes | yes | yes | yes | any | **refused** `HUMANISH_SERVE_OPTION_CONFLICT` (tunnel + public-url) |
59
54
 
60
55
  Guard order (all before any bind/spawn): `--allow-email`/`--allow-domain` without
61
56
  `--oauth` → `HUMANISH_SERVE_ALLOW_REQUIRES_OAUTH`; `--oauth` without `--tunnel` →
@@ -66,8 +61,8 @@ http(s) origin → conflict; a tunnel/public-url without `--expose` →
66
61
  no `--public-url` (even under `--safe`) →
67
62
  `HUMANISH_SERVE_EXPOSE_REQUIRES_ORIGIN`; `--expose` with an origin but without
68
63
  edge auth and without `--safe` →
69
- `HUMANISH_SERVE_EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE`. `--oauth google` with NO
70
- allow rule is ALLOWED (any Google account authenticates) but pushes a prominent
64
+ `HUMANISH_SERVE_EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE`. `--oauth google` with no
65
+ allow rule is allowed (any Google account authenticates) but pushes a prominent
71
66
  warning recommending at least one `--allow-email`/`--allow-domain`.
72
67
 
73
68
  The `watch` surface reuses the same validator but is stricter: a live,
@@ -77,7 +72,7 @@ therefore refused outright with `HUMANISH_WATCH_SAFE_NOT_APPLICABLE` (exit 2), s
77
72
  never silently ignored.
78
73
  `watch --expose` always requires edge auth (`--tunnel --oauth` or `--public-url`),
79
74
  and is also refused with `--dry-run`/`--detach`/`--json` (no live desktop / no
80
- attached follow). An exposed watch serves ONLY the attached live run: its
75
+ attached follow). An exposed watch serves only the attached live run: its
81
76
  `/_humanish/history.json` lists just that run and every other run id 404s
82
77
  byte-identically to a nonexistent one, so a remote viewer can never enumerate or
83
78
  reach any prior run's raw evidence (loopback watch still serves the full library).
@@ -122,14 +117,14 @@ which adds `sandbox allow-scripts` to that policy.
122
117
 
123
118
  | Mode | Invocation | Boundary class |
124
119
  | ----------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
125
- | `loopback` | `humanish serve` | Capture-side trust: readable only by whoever can already read gitignored `.humanish/` on this machine; no new boundary is crossed. |
120
+ | `loopback` | `humanish observe --all` | Capture-side trust: readable only by whoever can already read gitignored `.humanish/` on this machine; no new boundary is crossed. |
126
121
  | `exposed` | `--expose --tunnel ngrok --oauth google …`, or `--expose --public-url <origin>` | Edge-authed exposure: only viewers who clear the edge OAuth (or the operator's own edge) reach the loopback server, which then serves everything it grants unless `--safe` composes in. The gate is the edge, not humanish. |
127
122
  | `share-safe-open` | `--expose --safe --tunnel ngrok` (no `--oauth`) | Genuine publishing behind the feedback-grade `share_ready` gate: only runs that pass verify are served. Each request walks the run, and any added, removed or changed file re-verifies it first; a file is read only while its inode, size, mtime and ctime match the walk verify covered, and its bytes are served only when their sha256 matches the hash taken at admission. Everything else is absent, 404ing byte-identically to a nonexistent run (no existence oracle). |
128
123
 
129
124
  ## Keep stream URLs off the library surface
130
125
 
131
126
  Live desktop stream URLs (auth-bearing hosted-VNC links) are never served by the
132
- LIBRARY surface, in any mode, and the guarantee is layered:
127
+ library surface, in any mode, and the guarantee is layered:
133
128
 
134
129
  - **Structural:** runtime stream URLs live in a `WeakMap` keyed by the watch
135
130
  process's in-memory `ObserverResult` (`src/observer/render.ts`) and are never
@@ -149,12 +144,14 @@ disk). See observer.md.
149
144
 
150
145
  ## Know what `share_ready` checks
151
146
 
152
- `share_ready` was designed as the bar for FEEDBACK payloads: evidence eligible
147
+ `share_ready` was designed as the bar for feedback payloads: evidence eligible
153
148
  to leave the machine inside a public issue draft. Serve's `share-safe-open` mode
154
- extends that same gate to arbitrary-audience BROWSING, which is a broader
155
- exposure of the same artifacts. The honest caveat carries over unchanged:
149
+ extends that same gate to arbitrary-audience browsing, which is a broader
150
+ exposure of the same artifacts. The same caveat carries over:
156
151
  `humanish verify` does not yet detect free-form PII/PHI (names, emails, medical
157
- identifiers; see the README's public-safety boundary and issue #108), so
152
+ identifiers; see
153
+ [Share evidence safely](../../README.md#share-evidence-safely) and the
154
+ [open detector issue](https://github.com/danielgwilson/humanish/issues/108)), so
158
155
  `share_ready` means the automated secret/path scan passed, not that a human would
159
156
  publish every pixel. Maintainers should treat open mode accordingly: synthetic
160
157
  data upstream, review before exposing, and treat `--safe` without edge auth as
@@ -173,13 +170,13 @@ any mutating route ships, the contract is:
173
170
  - an operator identity distinct from a viewer, sourced from the edge/control
174
171
  plane, not from a humanish-minted cookie;
175
172
  - mutating routes require CSRF defenses appropriate to the chosen edge session;
176
- - the spend rule is invariant 3 applied to remote hands: a phone-initiated LIVE
173
+ - the live-spend rule applies to remote hands too: a phone-initiated live
177
174
  run needs its own affirmative declaration at serve startup (an explicit opt-in
178
- naming the lab and budget), never a default the viewer UI can reach.
175
+ naming the study and budget), never a default the viewer UI can reach.
179
176
 
180
177
  ## Why not Better Auth here
181
178
 
182
- Better Auth is a strong TypeScript auth framework, but it is deliberately NOT
179
+ Better Auth is a strong TypeScript auth framework, but it is deliberately not
183
180
  used for this CLI serve surface: serve is an ephemeral, no-database,
184
181
  per-invocation loopback server whose only job is to hand persisted evidence to an
185
182
  already-authenticated edge. A password/session/social-login framework with a
@@ -193,6 +190,6 @@ where accounts, org membership, and durable sessions actually exist.
193
190
  - **Traffic Policy for ngrok.** Migrate off the deprecated `--oauth*` flags to a
194
191
  generated Traffic Policy YAML once ngrok requires it (the `yaml` dep is already
195
192
  available); pin the behavior in `tests/observer/tunnel.test.ts` first.
196
- - **Shipped in 0.18.0: `watch --expose`.** Remote LIVE following of a run,
193
+ - **Shipped in 0.18.0: `watch --expose`.** Remote live following of a run,
197
194
  including its live E2B desktop stream, behind the same edge auth. It is the one
198
195
  surface that deliberately serves runtime stream URLs. See observer.md.