humanish 0.104.3 → 0.106.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 (1407) hide show
  1. package/AGENTS.md +89 -94
  2. package/ARCHITECTURE.md +146 -0
  3. package/CHANGELOG.md +502 -0
  4. package/CONTEXT.md +51 -0
  5. package/CONTRIBUTING.md +111 -9
  6. package/README.md +213 -124
  7. package/SECURITY.md +1 -1
  8. package/TELEMETRY.md +112 -0
  9. package/dist/actors/affordance.d.ts +56 -0
  10. package/dist/actors/affordance.js +155 -0
  11. package/dist/actors/agent-session.js +42 -0
  12. package/dist/actors/codex/app-server-actor-trace.d.ts +11 -0
  13. package/dist/actors/codex/app-server-actor-trace.js +211 -0
  14. package/dist/actors/codex/app-server-client.d.ts +39 -0
  15. package/dist/actors/codex/app-server-client.js +116 -0
  16. package/dist/actors/codex/app-server-trace.d.ts +154 -0
  17. package/dist/actors/codex/app-server-trace.js +424 -0
  18. package/dist/actors/codex/app-server-ui.d.ts +40 -0
  19. package/dist/actors/codex/app-server-ui.js +328 -0
  20. package/dist/actors/codex/app-server.d.ts +44 -0
  21. package/dist/actors/codex/app-server.js +268 -0
  22. package/dist/actors/codex/qualified-versions.d.ts +45 -0
  23. package/dist/actors/codex/qualified-versions.js +87 -0
  24. package/dist/actors/codex/restricted-executable.d.ts +17 -0
  25. package/dist/actors/codex/restricted-executable.js +147 -0
  26. package/dist/actors/codex/restricted-launch.d.ts +116 -0
  27. package/dist/actors/codex/restricted-launch.js +222 -0
  28. package/dist/actors/codex/restricted-participant-policy.d.ts +46 -0
  29. package/dist/actors/codex/restricted-participant-policy.js +82 -0
  30. package/dist/actors/codex/restricted-participant.d.ts +20 -0
  31. package/dist/actors/codex/restricted-participant.js +432 -0
  32. package/dist/actors/codex/restricted-policy.d.ts +70 -0
  33. package/dist/actors/codex/restricted-policy.js +326 -0
  34. package/dist/actors/codex/restricted-session.d.ts +65 -0
  35. package/dist/actors/codex/restricted-session.js +432 -0
  36. package/dist/actors/codex/restricted-transport.d.ts +73 -0
  37. package/dist/actors/codex/restricted-transport.js +335 -0
  38. package/dist/actors/codex/restricted-turn.d.ts +62 -0
  39. package/dist/actors/codex/restricted-turn.js +284 -0
  40. package/dist/actors/computer-use/actor.d.ts +77 -0
  41. package/dist/actors/computer-use/actor.js +78 -0
  42. package/dist/actors/computer-use/admission-limit.d.ts +12 -0
  43. package/dist/actors/computer-use/admission-limit.js +19 -0
  44. package/dist/actors/computer-use/executor-error.js +48 -0
  45. package/dist/actors/computer-use/loop/actions.d.ts +26 -0
  46. package/dist/actors/computer-use/loop/actions.js +245 -0
  47. package/dist/actors/computer-use/loop/backstop.d.ts +42 -0
  48. package/dist/actors/computer-use/loop/backstop.js +202 -0
  49. package/dist/actors/computer-use/loop/debrief.d.ts +19 -0
  50. package/dist/actors/computer-use/loop/debrief.js +164 -0
  51. package/dist/actors/computer-use/loop/ending.d.ts +86 -0
  52. package/dist/actors/computer-use/loop/ending.js +316 -0
  53. package/dist/actors/computer-use/loop/observation.d.ts +55 -0
  54. package/dist/actors/computer-use/loop/observation.js +246 -0
  55. package/dist/actors/computer-use/loop/output-limit.d.ts +11 -0
  56. package/dist/actors/computer-use/loop/output-limit.js +21 -0
  57. package/dist/actors/computer-use/loop/provider-call.d.ts +19 -0
  58. package/dist/actors/computer-use/loop/provider-call.js +208 -0
  59. package/dist/actors/computer-use/loop/race.d.ts +34 -0
  60. package/dist/actors/computer-use/loop/race.js +79 -0
  61. package/dist/actors/computer-use/loop/session.d.ts +77 -0
  62. package/dist/actors/computer-use/loop/session.js +135 -0
  63. package/dist/actors/computer-use/loop/spend.d.ts +30 -0
  64. package/dist/actors/computer-use/loop/spend.js +85 -0
  65. package/dist/actors/computer-use/loop/trace.d.ts +35 -0
  66. package/dist/actors/computer-use/loop/trace.js +140 -0
  67. package/dist/actors/computer-use/loop/types.d.ts +404 -0
  68. package/dist/actors/computer-use/loop/types.js +1 -0
  69. package/dist/actors/computer-use/loop/usage.d.ts +102 -0
  70. package/dist/actors/computer-use/loop/usage.js +355 -0
  71. package/dist/actors/computer-use/loop.d.ts +11 -0
  72. package/dist/actors/computer-use/loop.js +248 -0
  73. package/dist/actors/computer-use/openai-provider.d.ts +107 -0
  74. package/dist/actors/computer-use/openai-provider.js +472 -0
  75. package/dist/actors/computer-use/openai-requests.d.ts +35 -0
  76. package/dist/actors/computer-use/openai-requests.js +74 -0
  77. package/dist/actors/computer-use/openai-wire.d.ts +67 -0
  78. package/dist/actors/computer-use/openai-wire.js +365 -0
  79. package/dist/actors/computer-use/provider-error.d.ts +27 -0
  80. package/dist/actors/computer-use/provider-error.js +86 -0
  81. package/dist/actors/computer-use/speech.js +6 -0
  82. package/dist/actors/contract.d.ts +315 -0
  83. package/dist/actors/contract.js +201 -0
  84. package/dist/actors/goal-source.js +38 -0
  85. package/dist/actors/local-agent/claude-session.d.ts +43 -0
  86. package/dist/actors/local-agent/claude-session.js +370 -0
  87. package/dist/actors/local-agent/cli.d.ts +115 -0
  88. package/dist/actors/local-agent/cli.js +413 -0
  89. package/dist/actors/local-agent/readiness.d.ts +31 -0
  90. package/dist/actors/local-agent/readiness.js +45 -0
  91. package/dist/actors/openai-endpoint.d.ts +2 -0
  92. package/dist/actors/openai-endpoint.js +2 -0
  93. package/dist/actors/output-token-limit.js +4 -0
  94. package/dist/actors/reasoning-effort.js +33 -0
  95. package/dist/actors/registry.d.ts +59 -0
  96. package/dist/actors/registry.js +89 -0
  97. package/dist/actors/scripted-browser/actor.d.ts +49 -0
  98. package/dist/actors/scripted-browser/actor.js +428 -0
  99. package/dist/actors/scripted-browser/browser-command.d.ts +1 -0
  100. package/dist/actors/scripted-browser/browser-command.js +48 -0
  101. package/dist/actors/scripted-browser/journey.d.ts +9 -0
  102. package/dist/actors/scripted-browser/journey.js +171 -0
  103. package/dist/actors/scripted-browser/steps.d.ts +60 -0
  104. package/dist/actors/scripted-browser/steps.js +384 -0
  105. package/dist/actors/scripted-browser/types.d.ts +135 -0
  106. package/dist/actors/scripted-browser/types.js +26 -0
  107. package/dist/actors/stop-cause.d.ts +9 -0
  108. package/dist/actors/stop-cause.js +42 -0
  109. package/dist/actors/stop-conditions.d.ts +40 -0
  110. package/dist/actors/stop-conditions.js +65 -0
  111. package/dist/analysis/automatic-completion.d.ts +38 -0
  112. package/dist/analysis/automatic-completion.js +90 -0
  113. package/dist/analysis/automatic-config.d.ts +41 -0
  114. package/dist/analysis/automatic-config.js +135 -0
  115. package/dist/analysis/automatic.d.ts +17 -0
  116. package/dist/analysis/automatic.js +279 -0
  117. package/dist/analysis/codex-config.d.ts +8 -0
  118. package/dist/analysis/codex-config.js +69 -0
  119. package/dist/analysis/evidence-sources.d.ts +23 -0
  120. package/dist/analysis/evidence-sources.js +251 -0
  121. package/dist/analysis/evidence.d.ts +18 -0
  122. package/dist/analysis/evidence.js +482 -0
  123. package/dist/analysis/execute.d.ts +52 -0
  124. package/dist/analysis/execute.js +504 -0
  125. package/dist/analysis/image-tokens.d.ts +1 -0
  126. package/dist/analysis/image-tokens.js +41 -0
  127. package/dist/analysis/job.d.ts +97 -0
  128. package/dist/analysis/job.js +311 -0
  129. package/dist/analysis/load.d.ts +3 -0
  130. package/dist/analysis/load.js +11 -0
  131. package/dist/analysis/provider.d.ts +57 -0
  132. package/dist/analysis/provider.js +227 -0
  133. package/dist/analysis/restricted-codex.d.ts +19 -0
  134. package/dist/analysis/restricted-codex.js +23 -0
  135. package/dist/analysis/service.d.ts +72 -0
  136. package/dist/analysis/service.js +399 -0
  137. package/dist/analysis/sharing.d.ts +11 -0
  138. package/dist/analysis/sharing.js +44 -0
  139. package/dist/analysis/store-executions.d.ts +27 -0
  140. package/dist/analysis/store-executions.js +224 -0
  141. package/dist/analysis/store.d.ts +31 -0
  142. package/dist/analysis/store.js +315 -0
  143. package/dist/analysis/types.d.ts +217 -0
  144. package/dist/analysis/types.js +12 -0
  145. package/dist/analysis/validation.d.ts +225 -0
  146. package/dist/analysis/validation.js +562 -0
  147. package/dist/browser-control/client.d.ts +18 -0
  148. package/dist/browser-control/client.js +239 -0
  149. package/dist/browser-control/dispatcher.d.ts +19 -0
  150. package/dist/browser-control/dispatcher.js +221 -0
  151. package/dist/browser-control/protocol.d.ts +492 -0
  152. package/dist/browser-control/protocol.js +360 -0
  153. package/dist/browser-control/recording-transfer.d.ts +3 -0
  154. package/dist/browser-control/recording-transfer.js +48 -0
  155. package/dist/browser-control/transport.d.ts +27 -0
  156. package/dist/browser-control/transport.js +189 -0
  157. package/dist/cli/commands/analysis-signals.d.ts +7 -0
  158. package/dist/cli/commands/analysis-signals.js +25 -0
  159. package/dist/cli/commands/analyze.d.ts +3 -0
  160. package/dist/cli/commands/analyze.js +212 -0
  161. package/dist/cli/commands/codex.d.ts +3 -0
  162. package/dist/cli/commands/codex.js +145 -0
  163. package/dist/cli/commands/comms.d.ts +3 -0
  164. package/dist/cli/commands/comms.js +225 -0
  165. package/dist/cli/commands/feedback.d.ts +3 -0
  166. package/dist/cli/commands/feedback.js +138 -0
  167. package/dist/cli/commands/lab-format.d.ts +8 -0
  168. package/dist/cli/commands/lab-format.js +105 -0
  169. package/dist/cli/commands/lab-route-computer-use.d.ts +20 -0
  170. package/dist/cli/commands/lab-route-computer-use.js +251 -0
  171. package/dist/cli/commands/lab-route-open.d.ts +27 -0
  172. package/dist/cli/commands/lab-route-open.js +37 -0
  173. package/dist/cli/commands/lab-route-preview.d.ts +20 -0
  174. package/dist/cli/commands/lab-route-preview.js +74 -0
  175. package/dist/cli/commands/lab-route-run.d.ts +17 -0
  176. package/dist/cli/commands/lab-route-run.js +31 -0
  177. package/dist/cli/commands/lab-route-scripted.d.ts +19 -0
  178. package/dist/cli/commands/lab-route-scripted.js +50 -0
  179. package/dist/cli/commands/lab-route-shared-world.d.ts +20 -0
  180. package/dist/cli/commands/lab-route-shared-world.js +135 -0
  181. package/dist/cli/commands/lab-route-terminal.d.ts +19 -0
  182. package/dist/cli/commands/lab-route-terminal.js +49 -0
  183. package/dist/cli/commands/lab-run.d.ts +9 -0
  184. package/dist/cli/commands/lab-run.js +166 -0
  185. package/dist/cli/commands/lab-scorer.d.ts +30 -0
  186. package/dist/cli/commands/lab-scorer.js +17 -0
  187. package/dist/cli/commands/lab.d.ts +3 -0
  188. package/dist/cli/commands/lab.js +193 -0
  189. package/dist/cli/commands/observe.d.ts +4 -0
  190. package/dist/cli/commands/observe.js +345 -0
  191. package/dist/cli/commands/runs.d.ts +11 -0
  192. package/dist/cli/commands/runs.js +314 -0
  193. package/dist/cli/commands/setup.d.ts +11 -0
  194. package/dist/cli/commands/setup.js +325 -0
  195. package/dist/cli/commands/tui.d.ts +32 -0
  196. package/dist/cli/commands/tui.js +305 -0
  197. package/dist/cli/commands/watch.d.ts +3 -0
  198. package/dist/cli/commands/watch.js +245 -0
  199. package/dist/cli/doctor.d.ts +39 -0
  200. package/dist/cli/doctor.js +263 -0
  201. package/dist/cli/first-run-path.d.ts +67 -0
  202. package/dist/cli/first-run-path.js +150 -0
  203. package/dist/cli/io.d.ts +85 -0
  204. package/dist/cli/io.js +232 -0
  205. package/dist/cli/observer-follow.d.ts +56 -0
  206. package/dist/cli/observer-follow.js +160 -0
  207. package/dist/cli/orientation.d.ts +30 -0
  208. package/dist/cli/orientation.js +114 -0
  209. package/dist/cli/program.d.ts +15 -0
  210. package/dist/cli/program.js +338 -0
  211. package/dist/cli/secret-prompt.js +39 -0
  212. package/dist/cli/telemetry.js +351 -0
  213. package/dist/cli.js +2 -4
  214. package/dist/comms/agentmail.d.ts +29 -0
  215. package/dist/comms/agentmail.js +568 -0
  216. package/dist/comms/capture-surface.d.ts +54 -0
  217. package/dist/comms/capture-surface.js +468 -0
  218. package/dist/comms/catch-host.d.ts +52 -0
  219. package/dist/comms/catch-host.js +192 -0
  220. package/dist/comms/connections.d.ts +20 -0
  221. package/dist/comms/connections.js +116 -0
  222. package/dist/comms/email-catch.d.ts +49 -0
  223. package/dist/comms/email-catch.js +236 -0
  224. package/dist/comms/extract.d.ts +7 -0
  225. package/dist/comms/extract.js +65 -0
  226. package/dist/comms/fake-inbox.d.ts +39 -0
  227. package/dist/comms/fake-inbox.js +136 -0
  228. package/dist/comms/images.d.ts +7 -0
  229. package/dist/comms/images.js +53 -0
  230. package/dist/comms/lease-store.d.ts +91 -0
  231. package/dist/comms/lease-store.js +600 -0
  232. package/dist/comms/providers.d.ts +30 -0
  233. package/dist/comms/providers.js +24 -0
  234. package/dist/comms/receiving-common.d.ts +17 -0
  235. package/dist/comms/receiving-common.js +82 -0
  236. package/dist/comms/receiving-evidence.d.ts +4 -0
  237. package/dist/comms/receiving-evidence.js +59 -0
  238. package/dist/comms/receiving-recovery.d.ts +22 -0
  239. package/dist/comms/receiving-recovery.js +100 -0
  240. package/dist/comms/receiving-render.d.ts +16 -0
  241. package/dist/comms/receiving-render.js +409 -0
  242. package/dist/comms/receiving-runtime.d.ts +41 -0
  243. package/dist/comms/receiving-runtime.js +66 -0
  244. package/dist/comms/receiving-surface.d.ts +8 -0
  245. package/dist/comms/receiving-surface.js +156 -0
  246. package/dist/comms/receiving-types.d.ts +122 -0
  247. package/dist/comms/receiving-types.js +3 -0
  248. package/dist/comms/receiving.d.ts +33 -0
  249. package/dist/comms/receiving.js +508 -0
  250. package/dist/comms/sandbox-catch-script.d.ts +16 -0
  251. package/dist/comms/sandbox-catch-script.js +331 -0
  252. package/dist/comms/sandbox-catch.d.ts +214 -0
  253. package/dist/comms/sandbox-catch.js +451 -0
  254. package/dist/comms/setup.d.ts +65 -0
  255. package/dist/comms/setup.js +259 -0
  256. package/dist/comms/thread-evidence.d.ts +28 -0
  257. package/dist/comms/thread-evidence.js +30 -0
  258. package/dist/comms/types.d.ts +76 -0
  259. package/dist/comms/types.js +8 -0
  260. package/dist/deprecated.d.ts +90 -0
  261. package/dist/deprecated.js +106 -0
  262. package/dist/evidence/browser-hygiene.js +42 -0
  263. package/dist/evidence/desktop-recorder.d.ts +39 -0
  264. package/dist/evidence/desktop-recorder.js +340 -0
  265. package/dist/evidence/desktop-recording-artifact.d.ts +5 -0
  266. package/dist/evidence/desktop-recording-artifact.js +53 -0
  267. package/dist/evidence/desktop-recording-types.d.ts +27 -0
  268. package/dist/evidence/desktop-recording-types.js +16 -0
  269. package/dist/evidence/encoded-text.d.ts +27 -0
  270. package/dist/evidence/encoded-text.js +243 -0
  271. package/dist/evidence/frame-signature.d.ts +17 -0
  272. package/dist/evidence/frame-signature.js +111 -0
  273. package/dist/evidence/image.d.ts +24 -0
  274. package/dist/evidence/image.js +170 -0
  275. package/dist/evidence/plain-text.d.ts +8 -0
  276. package/dist/evidence/plain-text.js +16 -0
  277. package/dist/evidence/redaction.d.ts +110 -0
  278. package/dist/evidence/redaction.js +329 -0
  279. package/dist/feedback/draft.d.ts +58 -0
  280. package/dist/feedback/draft.js +309 -0
  281. package/dist/feedback/export-bundle.d.ts +6 -0
  282. package/dist/feedback/export-bundle.js +585 -0
  283. package/dist/feedback/export.d.ts +50 -0
  284. package/dist/feedback/export.js +392 -0
  285. package/dist/feedback/feedback.d.ts +37 -0
  286. package/dist/feedback/feedback.js +282 -0
  287. package/dist/feedback/proof.d.ts +8 -0
  288. package/dist/feedback/proof.js +56 -0
  289. package/dist/guest/bootstrap.d.ts +55 -0
  290. package/dist/guest/bootstrap.js +348 -0
  291. package/dist/guest/browser-tools.d.ts +8 -0
  292. package/dist/guest/browser-tools.js +72 -0
  293. package/dist/guest/chromium-text.d.ts +62 -0
  294. package/dist/guest/chromium-text.js +386 -0
  295. package/dist/guest/desktop-executor.d.ts +57 -0
  296. package/dist/guest/desktop-executor.js +256 -0
  297. package/dist/guest/desktop-keys.d.ts +8 -0
  298. package/dist/guest/desktop-keys.js +89 -0
  299. package/dist/guest/desktop-media.d.ts +70 -0
  300. package/dist/guest/desktop-media.js +385 -0
  301. package/dist/guest/desktop-native.d.ts +14 -0
  302. package/dist/guest/desktop-native.js +156 -0
  303. package/dist/guest/media-config.d.ts +15 -0
  304. package/dist/guest/media-config.js +16 -0
  305. package/dist/guest/runtime-desktop.d.ts +45 -0
  306. package/dist/guest/runtime-desktop.js +420 -0
  307. package/dist/guest/runtime-processes.d.ts +28 -0
  308. package/dist/guest/runtime-processes.js +94 -0
  309. package/dist/guest/runtime.d.ts +31 -0
  310. package/dist/guest/runtime.js +124 -0
  311. package/dist/guest-media-worker.js +184 -48
  312. package/dist/guest-runtime-main.js +23 -10
  313. package/dist/guest-runtime-revision.js +1 -1
  314. package/dist/index.d.ts +32 -83
  315. package/dist/index.js +21 -42
  316. package/dist/keys/env-file.d.ts +15 -0
  317. package/dist/keys/env-file.js +109 -0
  318. package/dist/keys/key-resolution.d.ts +58 -0
  319. package/dist/keys/key-resolution.js +389 -0
  320. package/dist/lab/adapter-extension.d.ts +75 -0
  321. package/dist/lab/adapter-extension.js +253 -0
  322. package/dist/lab/adapter-scorer-loader.d.ts +43 -0
  323. package/dist/lab/adapter-scorer-loader.js +130 -0
  324. package/dist/lab/bag-overrides.d.ts +18 -0
  325. package/dist/lab/bag-overrides.js +121 -0
  326. package/dist/lab/composition-rules.d.ts +5 -0
  327. package/dist/lab/composition-rules.js +283 -0
  328. package/dist/lab/config.d.ts +7 -0
  329. package/dist/lab/config.js +208 -0
  330. package/dist/lab/device-presets.d.ts +97 -0
  331. package/dist/lab/device-presets.js +87 -0
  332. package/dist/lab/discover.d.ts +65 -0
  333. package/dist/lab/discover.js +422 -0
  334. package/dist/lab/doctor.d.ts +39 -0
  335. package/dist/lab/doctor.js +233 -0
  336. package/dist/lab/init-paths.d.ts +5 -0
  337. package/dist/lab/init-paths.js +89 -0
  338. package/dist/lab/init-plan.d.ts +20 -0
  339. package/dist/lab/init-plan.js +163 -0
  340. package/dist/lab/init-templates.d.ts +28 -0
  341. package/dist/lab/init-templates.js +416 -0
  342. package/dist/lab/init.d.ts +39 -0
  343. package/dist/lab/init.js +287 -0
  344. package/dist/lab/keys.d.ts +2 -0
  345. package/dist/lab/keys.js +264 -0
  346. package/dist/lab/parse/actors.d.ts +14 -0
  347. package/dist/lab/parse/actors.js +453 -0
  348. package/dist/lab/parse/comms.d.ts +12 -0
  349. package/dist/lab/parse/comms.js +246 -0
  350. package/dist/lab/parse/execution.d.ts +19 -0
  351. package/dist/lab/parse/execution.js +356 -0
  352. package/dist/lab/parse/subject-state.d.ts +30 -0
  353. package/dist/lab/parse/subject-state.js +179 -0
  354. package/dist/lab/parse/subject.d.ts +9 -0
  355. package/dist/lab/parse/subject.js +420 -0
  356. package/dist/lab/parse/values.d.ts +17 -0
  357. package/dist/lab/parse/values.js +65 -0
  358. package/dist/lab/participant-assignment.d.ts +12 -0
  359. package/dist/lab/participant-assignment.js +19 -0
  360. package/dist/lab/persona-resolve.d.ts +39 -0
  361. package/dist/lab/persona-resolve.js +118 -0
  362. package/dist/lab/persona.d.ts +39 -0
  363. package/dist/lab/persona.js +192 -0
  364. package/dist/lab/plan-base.d.ts +24 -0
  365. package/dist/lab/plan-base.js +113 -0
  366. package/dist/lab/plan-participants.d.ts +81 -0
  367. package/dist/lab/plan-participants.js +92 -0
  368. package/dist/lab/plan-types.d.ts +269 -0
  369. package/dist/lab/plan-types.js +5 -0
  370. package/dist/lab/plan.d.ts +27 -0
  371. package/dist/lab/plan.js +156 -0
  372. package/dist/lab/preflight-probes.d.ts +3 -0
  373. package/dist/lab/preflight-probes.js +312 -0
  374. package/dist/lab/preflight-result.d.ts +7 -0
  375. package/dist/lab/preflight-result.js +43 -0
  376. package/dist/lab/preflight.d.ts +95 -0
  377. package/dist/lab/preflight.js +117 -0
  378. package/dist/lab/route-inputs.d.ts +17 -0
  379. package/dist/lab/route-inputs.js +95 -0
  380. package/dist/lab/routing.d.ts +81 -0
  381. package/dist/lab/routing.js +214 -0
  382. package/dist/lab/run-lab-events.d.ts +69 -0
  383. package/dist/lab/run-lab-events.js +95 -0
  384. package/dist/lab/run-lab-options.d.ts +82 -0
  385. package/dist/lab/run-lab-options.js +399 -0
  386. package/dist/lab/summary.d.ts +60 -0
  387. package/dist/lab/summary.js +168 -0
  388. package/dist/lab/tasks.d.ts +91 -0
  389. package/dist/lab/tasks.js +139 -0
  390. package/dist/lab/types.d.ts +813 -0
  391. package/dist/lab/types.js +6 -0
  392. package/dist/lab/validation.d.ts +67 -0
  393. package/dist/lab/validation.js +387 -0
  394. package/dist/lab/warnings.d.ts +2 -0
  395. package/dist/lab/warnings.js +338 -0
  396. package/dist/observer/artifact.d.ts +23 -0
  397. package/dist/observer/artifact.js +235 -0
  398. package/dist/observer/data.d.ts +115 -0
  399. package/dist/observer/data.js +258 -0
  400. package/dist/observer/exposure.d.ts +64 -0
  401. package/dist/observer/exposure.js +143 -0
  402. package/dist/observer/http.js +50 -0
  403. package/dist/observer/library.js +190 -0
  404. package/dist/observer/listen.js +85 -0
  405. package/dist/observer/live.d.ts +9 -0
  406. package/dist/observer/live.js +25 -0
  407. package/dist/observer/pinned-files.d.ts +30 -0
  408. package/dist/observer/pinned-files.js +160 -0
  409. package/dist/observer/render.d.ts +69 -0
  410. package/dist/observer/render.js +350 -0
  411. package/dist/observer/run-inventory.d.ts +35 -0
  412. package/dist/observer/run-inventory.js +95 -0
  413. package/dist/observer/run-routes.d.ts +37 -0
  414. package/dist/observer/run-routes.js +373 -0
  415. package/dist/observer/serve.d.ts +97 -0
  416. package/dist/observer/serve.js +305 -0
  417. package/dist/observer/static.js +369 -0
  418. package/dist/observer/tunnel.js +112 -0
  419. package/dist/observer-app.html +9 -20
  420. package/dist/routes/computer-use/bundle-parts.d.ts +50 -0
  421. package/dist/routes/computer-use/bundle-parts.js +177 -0
  422. package/dist/routes/computer-use/bundle.d.ts +56 -0
  423. package/dist/routes/computer-use/bundle.js +184 -0
  424. package/dist/routes/computer-use/diagnostics.d.ts +38 -0
  425. package/dist/routes/computer-use/diagnostics.js +94 -0
  426. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +65 -0
  427. package/dist/routes/computer-use/e2b-desktop/comms.js +225 -0
  428. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +3 -0
  429. package/dist/routes/computer-use/e2b-desktop/desktop.js +91 -0
  430. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +65 -0
  431. package/dist/routes/computer-use/e2b-desktop/fidelity.js +156 -0
  432. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +18 -0
  433. package/dist/routes/computer-use/e2b-desktop/prepare.js +198 -0
  434. package/dist/routes/computer-use/e2b-desktop/start.d.ts +14 -0
  435. package/dist/routes/computer-use/e2b-desktop/start.js +193 -0
  436. package/dist/routes/computer-use/e2b-desktop/state.d.ts +65 -0
  437. package/dist/routes/computer-use/e2b-desktop/state.js +69 -0
  438. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +6 -0
  439. package/dist/routes/computer-use/e2b-desktop/teardown.js +152 -0
  440. package/dist/routes/computer-use/external-comms.d.ts +20 -0
  441. package/dist/routes/computer-use/external-comms.js +55 -0
  442. package/dist/routes/computer-use/fanout-bundle.d.ts +11 -0
  443. package/dist/routes/computer-use/fanout-bundle.js +274 -0
  444. package/dist/routes/computer-use/fanout-lanes.d.ts +15 -0
  445. package/dist/routes/computer-use/fanout-lanes.js +302 -0
  446. package/dist/routes/computer-use/in-process-desktop.d.ts +17 -0
  447. package/dist/routes/computer-use/in-process-desktop.js +40 -0
  448. package/dist/routes/computer-use/lanes.d.ts +35 -0
  449. package/dist/routes/computer-use/lanes.js +321 -0
  450. package/dist/routes/computer-use/legacy-lane-spec.d.ts +62 -0
  451. package/dist/routes/computer-use/legacy-lane-spec.js +39 -0
  452. package/dist/routes/computer-use/live-flush.d.ts +42 -0
  453. package/dist/routes/computer-use/live-flush.js +154 -0
  454. package/dist/routes/computer-use/local-tree-pack.d.ts +27 -0
  455. package/dist/routes/computer-use/local-tree-pack.js +47 -0
  456. package/dist/routes/computer-use/local-vm.d.ts +20 -0
  457. package/dist/routes/computer-use/local-vm.js +218 -0
  458. package/dist/routes/computer-use/participant-desktop.d.ts +63 -0
  459. package/dist/routes/computer-use/participant-desktop.js +33 -0
  460. package/dist/routes/computer-use/participant-facts.d.ts +6 -0
  461. package/dist/routes/computer-use/participant-facts.js +22 -0
  462. package/dist/routes/computer-use/participant-model.d.ts +30 -0
  463. package/dist/routes/computer-use/participant-model.js +222 -0
  464. package/dist/routes/computer-use/participant-prompt.d.ts +53 -0
  465. package/dist/routes/computer-use/participant-prompt.js +87 -0
  466. package/dist/routes/computer-use/participant-runs.d.ts +67 -0
  467. package/dist/routes/computer-use/participant-runs.js +255 -0
  468. package/dist/routes/computer-use/plan.d.ts +56 -0
  469. package/dist/routes/computer-use/plan.js +308 -0
  470. package/dist/routes/computer-use/preflight.d.ts +26 -0
  471. package/dist/routes/computer-use/preflight.js +85 -0
  472. package/dist/routes/computer-use/rerun-selection.d.ts +19 -0
  473. package/dist/routes/computer-use/rerun-selection.js +121 -0
  474. package/dist/routes/computer-use/result.d.ts +7 -0
  475. package/dist/routes/computer-use/result.js +292 -0
  476. package/dist/routes/computer-use/route.d.ts +33 -0
  477. package/dist/routes/computer-use/route.js +145 -0
  478. package/dist/routes/computer-use/run-lanes.d.ts +59 -0
  479. package/dist/routes/computer-use/run-lanes.js +135 -0
  480. package/dist/routes/computer-use/self-report.d.ts +21 -0
  481. package/dist/routes/computer-use/self-report.js +231 -0
  482. package/dist/routes/computer-use/setup.d.ts +136 -0
  483. package/dist/routes/computer-use/setup.js +371 -0
  484. package/dist/routes/computer-use/single-bundle.d.ts +97 -0
  485. package/dist/routes/computer-use/single-bundle.js +393 -0
  486. package/dist/routes/computer-use/subject-projection.d.ts +51 -0
  487. package/dist/routes/computer-use/subject-projection.js +159 -0
  488. package/dist/routes/computer-use/types.d.ts +539 -0
  489. package/dist/routes/computer-use/types.js +37 -0
  490. package/dist/routes/preview.d.ts +13 -0
  491. package/dist/routes/preview.js +36 -0
  492. package/dist/routes/scripted/bundle.d.ts +47 -0
  493. package/dist/routes/scripted/bundle.js +195 -0
  494. package/dist/routes/scripted/plan.d.ts +30 -0
  495. package/dist/routes/scripted/plan.js +95 -0
  496. package/dist/routes/scripted/result.d.ts +48 -0
  497. package/dist/routes/scripted/result.js +176 -0
  498. package/dist/routes/scripted/route.d.ts +28 -0
  499. package/dist/routes/scripted/route.js +218 -0
  500. package/dist/routes/scripted/scenario.d.ts +21 -0
  501. package/dist/routes/scripted/scenario.js +102 -0
  502. package/dist/routes/scripted/session-result.d.ts +8 -0
  503. package/dist/routes/scripted/session-result.js +60 -0
  504. package/dist/routes/scripted/setup.d.ts +45 -0
  505. package/dist/routes/scripted/setup.js +126 -0
  506. package/dist/routes/scripted/subject.d.ts +49 -0
  507. package/dist/routes/scripted/subject.js +156 -0
  508. package/dist/routes/scripted/surface-records.d.ts +26 -0
  509. package/dist/routes/scripted/surface-records.js +88 -0
  510. package/dist/routes/scripted/surface-sessions.d.ts +13 -0
  511. package/dist/routes/scripted/surface-sessions.js +40 -0
  512. package/dist/routes/scripted/types.d.ts +88 -0
  513. package/dist/routes/scripted/types.js +3 -0
  514. package/dist/routes/shared-world/bundle.d.ts +20 -0
  515. package/dist/routes/shared-world/bundle.js +446 -0
  516. package/dist/routes/shared-world/checkpoints.d.ts +25 -0
  517. package/dist/routes/shared-world/checkpoints.js +46 -0
  518. package/dist/routes/shared-world/comms.d.ts +68 -0
  519. package/dist/routes/shared-world/comms.js +176 -0
  520. package/dist/routes/shared-world/external-public.d.ts +21 -0
  521. package/dist/routes/shared-world/external-public.js +130 -0
  522. package/dist/routes/shared-world/handoff.d.ts +62 -0
  523. package/dist/routes/shared-world/handoff.js +348 -0
  524. package/dist/routes/shared-world/lobby-code.d.ts +25 -0
  525. package/dist/routes/shared-world/lobby-code.js +152 -0
  526. package/dist/routes/shared-world/plan.d.ts +27 -0
  527. package/dist/routes/shared-world/plan.js +174 -0
  528. package/dist/routes/shared-world/provenance.d.ts +27 -0
  529. package/dist/routes/shared-world/provenance.js +65 -0
  530. package/dist/routes/shared-world/provisioned.d.ts +57 -0
  531. package/dist/routes/shared-world/provisioned.js +505 -0
  532. package/dist/routes/shared-world/result.d.ts +18 -0
  533. package/dist/routes/shared-world/result.js +327 -0
  534. package/dist/routes/shared-world/route.d.ts +21 -0
  535. package/dist/routes/shared-world/route.js +277 -0
  536. package/dist/routes/shared-world/seat-records.d.ts +20 -0
  537. package/dist/routes/shared-world/seat-records.js +213 -0
  538. package/dist/routes/shared-world/seats.d.ts +38 -0
  539. package/dist/routes/shared-world/seats.js +208 -0
  540. package/dist/routes/shared-world/setup.d.ts +48 -0
  541. package/dist/routes/shared-world/setup.js +200 -0
  542. package/dist/routes/shared-world/types.d.ts +354 -0
  543. package/dist/routes/shared-world/types.js +29 -0
  544. package/dist/routes/terminal/adapter.d.ts +37 -0
  545. package/dist/routes/terminal/adapter.js +201 -0
  546. package/dist/routes/terminal/bundle.d.ts +79 -0
  547. package/dist/routes/terminal/bundle.js +305 -0
  548. package/dist/routes/terminal/credentials.d.ts +34 -0
  549. package/dist/routes/terminal/credentials.js +102 -0
  550. package/dist/routes/terminal/dry-run.d.ts +24 -0
  551. package/dist/routes/terminal/dry-run.js +157 -0
  552. package/dist/routes/terminal/encoding.js +79 -0
  553. package/dist/routes/terminal/ledger.d.ts +49 -0
  554. package/dist/routes/terminal/ledger.js +170 -0
  555. package/dist/routes/terminal/lifetime.d.ts +10 -0
  556. package/dist/routes/terminal/lifetime.js +22 -0
  557. package/dist/routes/terminal/live-finish.d.ts +31 -0
  558. package/dist/routes/terminal/live-finish.js +215 -0
  559. package/dist/routes/terminal/live-sandbox.d.ts +69 -0
  560. package/dist/routes/terminal/live-sandbox.js +452 -0
  561. package/dist/routes/terminal/persona.d.ts +20 -0
  562. package/dist/routes/terminal/persona.js +34 -0
  563. package/dist/routes/terminal/plan.d.ts +21 -0
  564. package/dist/routes/terminal/plan.js +115 -0
  565. package/dist/routes/terminal/recorder.d.ts +23 -0
  566. package/dist/routes/terminal/recorder.js +77 -0
  567. package/dist/routes/terminal/result.d.ts +47 -0
  568. package/dist/routes/terminal/result.js +114 -0
  569. package/dist/routes/terminal/route.d.ts +23 -0
  570. package/dist/routes/terminal/route.js +170 -0
  571. package/dist/routes/terminal/runtime-auth.d.ts +12 -0
  572. package/dist/routes/terminal/runtime-auth.js +23 -0
  573. package/dist/routes/terminal/runtime.d.ts +14 -0
  574. package/dist/routes/terminal/runtime.js +47 -0
  575. package/dist/routes/terminal/sandbox.d.ts +35 -0
  576. package/dist/routes/terminal/sandbox.js +126 -0
  577. package/dist/routes/terminal/session.d.ts +25 -0
  578. package/dist/routes/terminal/session.js +199 -0
  579. package/dist/routes/terminal/token-usage.d.ts +15 -0
  580. package/dist/routes/terminal/token-usage.js +93 -0
  581. package/dist/routes/terminal/trace.d.ts +40 -0
  582. package/dist/routes/terminal/trace.js +172 -0
  583. package/dist/routes/terminal/types.d.ts +342 -0
  584. package/dist/routes/terminal/types.js +31 -0
  585. package/dist/run/bundle-shape.d.ts +7 -0
  586. package/dist/run/bundle-shape.js +369 -0
  587. package/dist/run/bundle.d.ts +547 -0
  588. package/dist/run/bundle.js +44 -0
  589. package/dist/run/concurrency.js +24 -0
  590. package/dist/run/contained-output.d.ts +50 -0
  591. package/dist/run/contained-output.js +351 -0
  592. package/dist/run/cost-summary.d.ts +28 -0
  593. package/dist/run/cost-summary.js +213 -0
  594. package/dist/run/costs.js +140 -0
  595. package/dist/run/detail.d.ts +62 -0
  596. package/dist/run/detail.js +139 -0
  597. package/dist/run/dry-run-inputs.d.ts +9 -0
  598. package/dist/run/dry-run-inputs.js +90 -0
  599. package/dist/run/dry-run.d.ts +6 -0
  600. package/dist/run/dry-run.js +362 -0
  601. package/dist/run/feedback-shape.d.ts +7 -0
  602. package/dist/run/feedback-shape.js +89 -0
  603. package/dist/run/git-state.d.ts +35 -0
  604. package/dist/run/git-state.js +316 -0
  605. package/dist/run/git-workspace.d.ts +32 -0
  606. package/dist/run/git-workspace.js +450 -0
  607. package/dist/run/judge.d.ts +210 -0
  608. package/dist/run/judge.js +240 -0
  609. package/dist/run/locate.d.ts +22 -0
  610. package/dist/run/locate.js +122 -0
  611. package/dist/run/outcomes.d.ts +31 -0
  612. package/dist/run/outcomes.js +210 -0
  613. package/dist/run/participant-records.d.ts +28 -0
  614. package/dist/run/participant-records.js +63 -0
  615. package/dist/run/participant.d.ts +29 -0
  616. package/dist/run/participant.js +12 -0
  617. package/dist/run/paths.d.ts +79 -0
  618. package/dist/run/paths.js +356 -0
  619. package/dist/run/preflight-receipts.d.ts +46 -0
  620. package/dist/run/preflight-receipts.js +173 -0
  621. package/dist/run/pricing.d.ts +124 -0
  622. package/dist/run/pricing.js +298 -0
  623. package/dist/run/project.d.ts +8 -0
  624. package/dist/run/project.js +103 -0
  625. package/dist/run/projection.d.ts +184 -0
  626. package/dist/run/projection.js +356 -0
  627. package/dist/run/reclaim.d.ts +41 -0
  628. package/dist/run/reclaim.js +183 -0
  629. package/dist/run/results.d.ts +88 -0
  630. package/dist/run/results.js +3 -0
  631. package/dist/run/run-index.d.ts +107 -0
  632. package/dist/run/run-index.js +243 -0
  633. package/dist/run/run.d.ts +103 -0
  634. package/dist/run/run.js +199 -0
  635. package/dist/run/sandbox-receipts.d.ts +31 -0
  636. package/dist/run/sandbox-receipts.js +49 -0
  637. package/dist/run/shared-world-evidence.d.ts +220 -0
  638. package/dist/run/shared-world-evidence.js +49 -0
  639. package/dist/run/shared-world-shape.d.ts +26 -0
  640. package/dist/run/shared-world-shape.js +181 -0
  641. package/dist/run/stats.d.ts +82 -0
  642. package/dist/run/stats.js +258 -0
  643. package/dist/run/status.d.ts +111 -0
  644. package/dist/run/status.js +176 -0
  645. package/dist/run/stored-runs.d.ts +38 -0
  646. package/dist/run/stored-runs.js +273 -0
  647. package/dist/run/stream-shape.d.ts +4 -0
  648. package/dist/run/stream-shape.js +160 -0
  649. package/dist/run/streams.d.ts +257 -0
  650. package/dist/run/streams.js +12 -0
  651. package/dist/run/study-files.d.ts +35 -0
  652. package/dist/run/study-files.js +164 -0
  653. package/dist/run/terminal-contract.d.ts +25 -0
  654. package/dist/run/terminal-contract.js +47 -0
  655. package/dist/run/text.d.ts +2 -0
  656. package/dist/run/text.js +4 -0
  657. package/dist/run/transient-comms-secrets.js +72 -0
  658. package/dist/run/type-guards.d.ts +6 -0
  659. package/dist/run/type-guards.js +18 -0
  660. package/dist/run-lab.d.ts +110 -0
  661. package/dist/run-lab.js +148 -0
  662. package/dist/subject/clone.d.ts +37 -0
  663. package/dist/subject/clone.js +62 -0
  664. package/dist/subject/desktop-cli.d.ts +17 -0
  665. package/dist/subject/desktop-cli.js +51 -0
  666. package/dist/subject/local-tree-archive.d.ts +82 -0
  667. package/dist/subject/local-tree-archive.js +431 -0
  668. package/dist/subject/local-tree.d.ts +28 -0
  669. package/dist/subject/local-tree.js +58 -0
  670. package/dist/subject/node-bootstrap.d.ts +12 -0
  671. package/dist/subject/node-bootstrap.js +66 -0
  672. package/dist/subject/runtime.d.ts +13 -0
  673. package/dist/subject/runtime.js +50 -0
  674. package/dist/subject/serve.d.ts +39 -0
  675. package/dist/subject/serve.js +249 -0
  676. package/dist/subject/state.d.ts +23 -0
  677. package/dist/subject/state.js +58 -0
  678. package/dist/subject/steps.d.ts +37 -0
  679. package/dist/subject/steps.js +39 -0
  680. package/dist/substrates/command-failure.d.ts +23 -0
  681. package/dist/substrates/command-failure.js +45 -0
  682. package/dist/substrates/desktop-session.d.ts +41 -0
  683. package/dist/substrates/desktop-session.js +59 -0
  684. package/dist/substrates/detached.d.ts +55 -0
  685. package/dist/substrates/detached.js +139 -0
  686. package/dist/substrates/e2b/cdp-probe.d.ts +99 -0
  687. package/dist/substrates/e2b/cdp-probe.js +556 -0
  688. package/dist/substrates/e2b/desktop-browser.d.ts +81 -0
  689. package/dist/substrates/e2b/desktop-browser.js +410 -0
  690. package/dist/substrates/e2b/desktop-cdp.d.ts +77 -0
  691. package/dist/substrates/e2b/desktop-cdp.js +211 -0
  692. package/dist/substrates/e2b/desktop-executor.d.ts +92 -0
  693. package/dist/substrates/e2b/desktop-executor.js +302 -0
  694. package/dist/substrates/e2b/desktop-geometry.d.ts +83 -0
  695. package/dist/substrates/e2b/desktop-geometry.js +331 -0
  696. package/dist/substrates/e2b/desktop-media.d.ts +29 -0
  697. package/dist/substrates/e2b/desktop-media.js +151 -0
  698. package/dist/substrates/e2b/desktop-recording.d.ts +18 -0
  699. package/dist/substrates/e2b/desktop-recording.js +238 -0
  700. package/dist/substrates/e2b/desktop-resources.d.ts +11 -0
  701. package/dist/substrates/e2b/desktop-resources.js +35 -0
  702. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +15 -0
  703. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +66 -0
  704. package/dist/substrates/e2b/lifetime.d.ts +12 -0
  705. package/dist/substrates/e2b/lifetime.js +18 -0
  706. package/dist/substrates/e2b/sandbox.d.ts +102 -0
  707. package/dist/substrates/e2b/sandbox.js +202 -0
  708. package/dist/substrates/e2b/sdk.d.ts +194 -0
  709. package/dist/substrates/e2b/sdk.js +168 -0
  710. package/dist/substrates/e2b/shell.d.ts +10 -0
  711. package/dist/substrates/e2b/shell.js +61 -0
  712. package/dist/substrates/local/captured-inbox.d.ts +6 -0
  713. package/dist/substrates/local/captured-inbox.js +87 -0
  714. package/dist/substrates/local/firecracker-desktop.d.ts +25 -0
  715. package/dist/substrates/local/firecracker-desktop.js +315 -0
  716. package/dist/substrates/local/runtime-config.d.ts +6 -0
  717. package/dist/substrates/local/runtime-config.js +91 -0
  718. package/dist/substrates/local/runtime-host.d.ts +30 -0
  719. package/dist/substrates/local/runtime-host.js +143 -0
  720. package/dist/substrates/local/runtime-release.d.ts +5 -0
  721. package/dist/substrates/local/runtime-release.js +32 -0
  722. package/dist/substrates/local/runtime-ssh.d.ts +9 -0
  723. package/dist/substrates/local/runtime-ssh.js +129 -0
  724. package/dist/substrates/local/runtime.d.ts +25 -0
  725. package/dist/substrates/local/runtime.js +190 -0
  726. package/dist/substrates/shell.d.ts +44 -0
  727. package/dist/substrates/shell.js +22 -0
  728. package/dist/tui/actions.d.ts +39 -0
  729. package/dist/tui/actions.js +203 -0
  730. package/dist/tui/contract.d.ts +144 -0
  731. package/dist/tui/contract.js +52 -0
  732. package/dist/tui/launch.js +172 -0
  733. package/dist/tui/project.d.ts +10 -0
  734. package/dist/tui/project.js +17 -0
  735. package/dist/tui-app.js +125 -125
  736. package/dist/verify/actor.d.ts +27 -0
  737. package/dist/verify/actor.js +292 -0
  738. package/dist/verify/artifacts.d.ts +47 -0
  739. package/dist/verify/artifacts.js +373 -0
  740. package/dist/verify/costs.d.ts +30 -0
  741. package/dist/verify/costs.js +129 -0
  742. package/dist/verify/liveness.d.ts +7 -0
  743. package/dist/verify/liveness.js +72 -0
  744. package/dist/verify/rerun.d.ts +3 -0
  745. package/dist/verify/rerun.js +46 -0
  746. package/dist/verify/shared-world-concurrent.d.ts +11 -0
  747. package/dist/verify/shared-world-concurrent.js +346 -0
  748. package/dist/verify/shared-world.d.ts +8 -0
  749. package/dist/verify/shared-world.js +295 -0
  750. package/dist/verify/subject.d.ts +17 -0
  751. package/dist/verify/subject.js +123 -0
  752. package/dist/verify/verify.d.ts +34 -0
  753. package/dist/verify/verify.js +333 -0
  754. package/docs/README.md +67 -0
  755. package/docs/architecture/actor-contract.md +215 -174
  756. package/docs/architecture/browser-control.md +51 -37
  757. package/docs/architecture/comms-inbox.md +8 -8
  758. package/docs/architecture/desktop-recording.md +2 -2
  759. package/docs/architecture/desktop-sessions.md +33 -21
  760. package/docs/architecture/external-public-shared-world.md +80 -64
  761. package/docs/architecture/github-feedback-loop.md +40 -27
  762. package/docs/architecture/guest-desktop.md +22 -10
  763. package/docs/architecture/local-browser-runtime.md +30 -21
  764. package/docs/architecture/observer-review.md +9 -9
  765. package/docs/architecture/observer.md +53 -57
  766. package/docs/architecture/participant-media.md +3 -3
  767. package/docs/architecture/project-layout.md +33 -137
  768. package/docs/architecture/real-email-receiving.md +7 -6
  769. package/docs/architecture/restricted-codex-analysis.md +211 -25
  770. package/docs/architecture/serve.md +89 -87
  771. package/docs/architecture/state-driven-executor.md +79 -64
  772. package/docs/architecture/task-protocol-support.md +18 -18
  773. package/docs/architecture/terminal-product-lane.md +92 -86
  774. package/docs/contracts/adapter-admission.md +8 -4
  775. package/docs/contracts/adapter-fixtures.md +6 -6
  776. package/docs/contracts/core.md +22 -24
  777. package/docs/contracts/feedback.md +33 -23
  778. package/docs/contracts/policy.md +28 -31
  779. package/docs/contracts/run-bundle.md +168 -82
  780. package/docs/contracts/schemas.md +594 -379
  781. package/docs/contracts/study-analysis.md +2 -2
  782. package/docs/contracts/study-costs.md +12 -12
  783. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +36 -0
  784. package/docs/decisions/0002-observer-is-one-self-contained-file.md +30 -0
  785. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +35 -0
  786. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +31 -0
  787. package/docs/decisions/README.md +16 -0
  788. package/docs/goals/current.md +22 -46
  789. package/docs/principles/actor-fidelity.md +51 -63
  790. package/docs/principles/engineering.md +81 -0
  791. package/docs/principles/invariants-and-defaults.md +48 -45
  792. package/docs/principles/self-driving-harness.md +11 -10
  793. package/docs/principles/three-roles.md +12 -13
  794. package/docs/product/automatic-analysis.md +39 -9
  795. package/docs/product/lobby-trivia-3player-external-public.md +14 -13
  796. package/docs/product/open-source-install-experience.md +34 -38
  797. package/docs/ramp/README.md +91 -213
  798. package/docs/release/open-source-readiness.md +5 -2
  799. package/docs/release/public-readiness-standard.md +1 -1
  800. package/examples/README.md +11 -0
  801. package/examples/participant/README.md +80 -0
  802. package/examples/participant/app.mjs +55 -0
  803. package/examples/participant/run.mjs +116 -0
  804. package/examples/scorer/README.md +29 -0
  805. package/examples/scorer/run.mjs +63 -0
  806. package/examples/scorer/scorer.mjs +20 -0
  807. package/package.json +61 -57
  808. package/skills/humanish/SKILL.md +112 -83
  809. package/skills/humanish/agents/openai.yaml +2 -2
  810. package/dist/actor-contract.d.ts +0 -288
  811. package/dist/actor-contract.js +0 -340
  812. package/dist/actor-contract.js.map +0 -1
  813. package/dist/actor-goal-source.js +0 -32
  814. package/dist/actor-goal-source.js.map +0 -1
  815. package/dist/actor-registry.d.ts +0 -77
  816. package/dist/actor-registry.js +0 -106
  817. package/dist/actor-registry.js.map +0 -1
  818. package/dist/actor-stop-cause.d.ts +0 -9
  819. package/dist/actor-stop-cause.js +0 -42
  820. package/dist/actor-stop-cause.js.map +0 -1
  821. package/dist/adapter-extension.d.ts +0 -76
  822. package/dist/adapter-extension.js +0 -273
  823. package/dist/adapter-extension.js.map +0 -1
  824. package/dist/adapter-scorer-loader.d.ts +0 -42
  825. package/dist/adapter-scorer-loader.js +0 -129
  826. package/dist/adapter-scorer-loader.js.map +0 -1
  827. package/dist/affordance.d.ts +0 -53
  828. package/dist/affordance.js +0 -145
  829. package/dist/affordance.js.map +0 -1
  830. package/dist/agent-session.js +0 -43
  831. package/dist/agent-session.js.map +0 -1
  832. package/dist/argv.d.ts +0 -1
  833. package/dist/argv.js +0 -8
  834. package/dist/argv.js.map +0 -1
  835. package/dist/artifact-reference.d.ts +0 -22
  836. package/dist/artifact-reference.js +0 -47
  837. package/dist/artifact-reference.js.map +0 -1
  838. package/dist/automatic-analysis-completion.d.ts +0 -25
  839. package/dist/automatic-analysis-completion.js +0 -56
  840. package/dist/automatic-analysis-completion.js.map +0 -1
  841. package/dist/automatic-analysis-config.d.ts +0 -38
  842. package/dist/automatic-analysis-config.js +0 -68
  843. package/dist/automatic-analysis-config.js.map +0 -1
  844. package/dist/automatic-study-analysis.d.ts +0 -17
  845. package/dist/automatic-study-analysis.js +0 -195
  846. package/dist/automatic-study-analysis.js.map +0 -1
  847. package/dist/browser-control-client.d.ts +0 -18
  848. package/dist/browser-control-client.js +0 -176
  849. package/dist/browser-control-client.js.map +0 -1
  850. package/dist/browser-control-dispatcher.d.ts +0 -19
  851. package/dist/browser-control-dispatcher.js +0 -147
  852. package/dist/browser-control-dispatcher.js.map +0 -1
  853. package/dist/browser-control-protocol.d.ts +0 -472
  854. package/dist/browser-control-protocol.js +0 -185
  855. package/dist/browser-control-protocol.js.map +0 -1
  856. package/dist/browser-control-recording-transfer.d.ts +0 -4
  857. package/dist/browser-control-recording-transfer.js +0 -42
  858. package/dist/browser-control-recording-transfer.js.map +0 -1
  859. package/dist/browser-control-transport.d.ts +0 -27
  860. package/dist/browser-control-transport.js +0 -177
  861. package/dist/browser-control-transport.js.map +0 -1
  862. package/dist/browser-evidence-hygiene.js +0 -43
  863. package/dist/browser-evidence-hygiene.js.map +0 -1
  864. package/dist/chrome-cdp-probe.d.ts +0 -97
  865. package/dist/chrome-cdp-probe.js +0 -536
  866. package/dist/chrome-cdp-probe.js.map +0 -1
  867. package/dist/claude-agent-sdk.d.ts +0 -94
  868. package/dist/claude-agent-sdk.js +0 -367
  869. package/dist/claude-agent-sdk.js.map +0 -1
  870. package/dist/cli.js.map +0 -1
  871. package/dist/codex-app-server-ui.d.ts +0 -39
  872. package/dist/codex-app-server-ui.js +0 -357
  873. package/dist/codex-app-server-ui.js.map +0 -1
  874. package/dist/codex-app-server.d.ts +0 -144
  875. package/dist/codex-app-server.js +0 -754
  876. package/dist/codex-app-server.js.map +0 -1
  877. package/dist/command-failure.d.ts +0 -43
  878. package/dist/command-failure.js +0 -73
  879. package/dist/command-failure.js.map +0 -1
  880. package/dist/comms-agentmail.d.ts +0 -25
  881. package/dist/comms-agentmail.js +0 -418
  882. package/dist/comms-agentmail.js.map +0 -1
  883. package/dist/comms-catch-host.d.ts +0 -52
  884. package/dist/comms-catch-host.js +0 -178
  885. package/dist/comms-catch-host.js.map +0 -1
  886. package/dist/comms-connections.d.ts +0 -52
  887. package/dist/comms-connections.js +0 -123
  888. package/dist/comms-connections.js.map +0 -1
  889. package/dist/comms-email-catch.d.ts +0 -54
  890. package/dist/comms-email-catch.js +0 -212
  891. package/dist/comms-email-catch.js.map +0 -1
  892. package/dist/comms-evidence.d.ts +0 -27
  893. package/dist/comms-evidence.js +0 -31
  894. package/dist/comms-evidence.js.map +0 -1
  895. package/dist/comms-fake-inbox.d.ts +0 -45
  896. package/dist/comms-fake-inbox.js +0 -184
  897. package/dist/comms-fake-inbox.js.map +0 -1
  898. package/dist/comms-images.d.ts +0 -7
  899. package/dist/comms-images.js +0 -39
  900. package/dist/comms-images.js.map +0 -1
  901. package/dist/comms-inbox.d.ts +0 -66
  902. package/dist/comms-inbox.js +0 -389
  903. package/dist/comms-inbox.js.map +0 -1
  904. package/dist/comms-lease-store.d.ts +0 -91
  905. package/dist/comms-lease-store.js +0 -495
  906. package/dist/comms-lease-store.js.map +0 -1
  907. package/dist/comms-receiving-evidence.d.ts +0 -46
  908. package/dist/comms-receiving-evidence.js +0 -35
  909. package/dist/comms-receiving-evidence.js.map +0 -1
  910. package/dist/comms-receiving-inbox.d.ts +0 -16
  911. package/dist/comms-receiving-inbox.js +0 -410
  912. package/dist/comms-receiving-inbox.js.map +0 -1
  913. package/dist/comms-receiving-runtime.d.ts +0 -25
  914. package/dist/comms-receiving-runtime.js +0 -45
  915. package/dist/comms-receiving-runtime.js.map +0 -1
  916. package/dist/comms-receiving-types.d.ts +0 -98
  917. package/dist/comms-receiving-types.js +0 -2
  918. package/dist/comms-receiving-types.js.map +0 -1
  919. package/dist/comms-receiving.d.ts +0 -58
  920. package/dist/comms-receiving.js +0 -554
  921. package/dist/comms-receiving.js.map +0 -1
  922. package/dist/comms-sandbox-catch.d.ts +0 -229
  923. package/dist/comms-sandbox-catch.js +0 -737
  924. package/dist/comms-sandbox-catch.js.map +0 -1
  925. package/dist/comms-setup.d.ts +0 -40
  926. package/dist/comms-setup.js +0 -121
  927. package/dist/comms-setup.js.map +0 -1
  928. package/dist/comms-types.d.ts +0 -72
  929. package/dist/comms-types.js +0 -10
  930. package/dist/comms-types.js.map +0 -1
  931. package/dist/computer-use-actor.d.ts +0 -76
  932. package/dist/computer-use-actor.js +0 -68
  933. package/dist/computer-use-actor.js.map +0 -1
  934. package/dist/computer-use.d.ts +0 -429
  935. package/dist/computer-use.js +0 -1749
  936. package/dist/computer-use.js.map +0 -1
  937. package/dist/concurrency.js +0 -27
  938. package/dist/concurrency.js.map +0 -1
  939. package/dist/concurrent-shared-world-lab.d.ts +0 -186
  940. package/dist/concurrent-shared-world-lab.js +0 -2179
  941. package/dist/concurrent-shared-world-lab.js.map +0 -1
  942. package/dist/core/git-state.d.ts +0 -33
  943. package/dist/core/git-state.js +0 -277
  944. package/dist/core/git-state.js.map +0 -1
  945. package/dist/core/git-workspace.d.ts +0 -31
  946. package/dist/core/git-workspace.js +0 -447
  947. package/dist/core/git-workspace.js.map +0 -1
  948. package/dist/core/index.d.ts +0 -4
  949. package/dist/core/index.js +0 -3
  950. package/dist/core/index.js.map +0 -1
  951. package/dist/core/run-primitives.d.ts +0 -66
  952. package/dist/core/run-primitives.js +0 -120
  953. package/dist/core/run-primitives.js.map +0 -1
  954. package/dist/cua-actor-lab.d.ts +0 -855
  955. package/dist/cua-actor-lab.js +0 -3545
  956. package/dist/cua-actor-lab.js.map +0 -1
  957. package/dist/cua-admission-limit.d.ts +0 -12
  958. package/dist/cua-admission-limit.js +0 -20
  959. package/dist/cua-admission-limit.js.map +0 -1
  960. package/dist/cua-desktop-lane.d.ts +0 -35
  961. package/dist/cua-desktop-lane.js +0 -13
  962. package/dist/cua-desktop-lane.js.map +0 -1
  963. package/dist/cua-diagnostics.d.ts +0 -38
  964. package/dist/cua-diagnostics.js +0 -68
  965. package/dist/cua-diagnostics.js.map +0 -1
  966. package/dist/cua-executor-error.js +0 -48
  967. package/dist/cua-executor-error.js.map +0 -1
  968. package/dist/cua-provider-error.d.ts +0 -16
  969. package/dist/cua-provider-error.js +0 -35
  970. package/dist/cua-provider-error.js.map +0 -1
  971. package/dist/cua-speech.js +0 -2
  972. package/dist/cua-speech.js.map +0 -1
  973. package/dist/desktop-recorder.d.ts +0 -39
  974. package/dist/desktop-recorder.js +0 -226
  975. package/dist/desktop-recorder.js.map +0 -1
  976. package/dist/desktop-recording-artifact.d.ts +0 -5
  977. package/dist/desktop-recording-artifact.js +0 -54
  978. package/dist/desktop-recording-artifact.js.map +0 -1
  979. package/dist/desktop-recording-types.d.ts +0 -24
  980. package/dist/desktop-recording-types.js +0 -14
  981. package/dist/desktop-recording-types.js.map +0 -1
  982. package/dist/desktop-session.d.ts +0 -41
  983. package/dist/desktop-session.js +0 -47
  984. package/dist/desktop-session.js.map +0 -1
  985. package/dist/device-presets.d.ts +0 -67
  986. package/dist/device-presets.js +0 -55
  987. package/dist/device-presets.js.map +0 -1
  988. package/dist/doctor-lab.d.ts +0 -38
  989. package/dist/doctor-lab.js +0 -126
  990. package/dist/doctor-lab.js.map +0 -1
  991. package/dist/e2b-cua-desktop.d.ts +0 -3
  992. package/dist/e2b-cua-desktop.js +0 -708
  993. package/dist/e2b-cua-desktop.js.map +0 -1
  994. package/dist/e2b-cua-provisioning.d.ts +0 -314
  995. package/dist/e2b-cua-provisioning.js +0 -1219
  996. package/dist/e2b-cua-provisioning.js.map +0 -1
  997. package/dist/e2b-desktop-executor.d.ts +0 -101
  998. package/dist/e2b-desktop-executor.js +0 -297
  999. package/dist/e2b-desktop-executor.js.map +0 -1
  1000. package/dist/e2b-desktop-launch.d.ts +0 -243
  1001. package/dist/e2b-desktop-launch.js +0 -234
  1002. package/dist/e2b-desktop-launch.js.map +0 -1
  1003. package/dist/e2b-desktop-media.d.ts +0 -14
  1004. package/dist/e2b-desktop-media.js +0 -58
  1005. package/dist/e2b-desktop-media.js.map +0 -1
  1006. package/dist/e2b-desktop-recording.d.ts +0 -16
  1007. package/dist/e2b-desktop-recording.js +0 -162
  1008. package/dist/e2b-desktop-recording.js.map +0 -1
  1009. package/dist/e2b-desktop-resources.d.ts +0 -11
  1010. package/dist/e2b-desktop-resources.js +0 -33
  1011. package/dist/e2b-desktop-resources.js.map +0 -1
  1012. package/dist/e2b-desktop-screenshot-cleanup.d.ts +0 -15
  1013. package/dist/e2b-desktop-screenshot-cleanup.js +0 -67
  1014. package/dist/e2b-desktop-screenshot-cleanup.js.map +0 -1
  1015. package/dist/e2b-desktop-session.d.ts +0 -7
  1016. package/dist/e2b-desktop-session.js +0 -29
  1017. package/dist/e2b-desktop-session.js.map +0 -1
  1018. package/dist/e2b-detached.d.ts +0 -53
  1019. package/dist/e2b-detached.js +0 -130
  1020. package/dist/e2b-detached.js.map +0 -1
  1021. package/dist/e2b-terminal-lab.d.ts +0 -395
  1022. package/dist/e2b-terminal-lab.js +0 -2041
  1023. package/dist/e2b-terminal-lab.js.map +0 -1
  1024. package/dist/env-file.d.ts +0 -14
  1025. package/dist/env-file.js +0 -108
  1026. package/dist/env-file.js.map +0 -1
  1027. package/dist/export-bundle.d.ts +0 -7
  1028. package/dist/export-bundle.js +0 -441
  1029. package/dist/export-bundle.js.map +0 -1
  1030. package/dist/export.d.ts +0 -49
  1031. package/dist/export.js +0 -308
  1032. package/dist/export.js.map +0 -1
  1033. package/dist/feedback-proof.d.ts +0 -8
  1034. package/dist/feedback-proof.js +0 -44
  1035. package/dist/feedback-proof.js.map +0 -1
  1036. package/dist/feedback.d.ts +0 -76
  1037. package/dist/feedback.js +0 -496
  1038. package/dist/feedback.js.map +0 -1
  1039. package/dist/first-run-path.d.ts +0 -55
  1040. package/dist/first-run-path.js +0 -136
  1041. package/dist/first-run-path.js.map +0 -1
  1042. package/dist/frame-signature.d.ts +0 -24
  1043. package/dist/frame-signature.js +0 -128
  1044. package/dist/frame-signature.js.map +0 -1
  1045. package/dist/guest-bootstrap.d.ts +0 -55
  1046. package/dist/guest-bootstrap.js +0 -285
  1047. package/dist/guest-bootstrap.js.map +0 -1
  1048. package/dist/guest-browser-tools.d.ts +0 -8
  1049. package/dist/guest-browser-tools.js +0 -66
  1050. package/dist/guest-browser-tools.js.map +0 -1
  1051. package/dist/guest-chromium-text.d.ts +0 -27
  1052. package/dist/guest-chromium-text.js +0 -281
  1053. package/dist/guest-chromium-text.js.map +0 -1
  1054. package/dist/guest-desktop-executor.d.ts +0 -22
  1055. package/dist/guest-desktop-executor.js +0 -178
  1056. package/dist/guest-desktop-executor.js.map +0 -1
  1057. package/dist/guest-desktop-media.d.ts +0 -33
  1058. package/dist/guest-desktop-media.js +0 -281
  1059. package/dist/guest-desktop-media.js.map +0 -1
  1060. package/dist/guest-desktop-native.d.ts +0 -14
  1061. package/dist/guest-desktop-native.js +0 -131
  1062. package/dist/guest-desktop-native.js.map +0 -1
  1063. package/dist/guest-media-config.d.ts +0 -15
  1064. package/dist/guest-media-config.js +0 -8
  1065. package/dist/guest-media-config.js.map +0 -1
  1066. package/dist/guest-media-worker.js.map +0 -1
  1067. package/dist/guest-runtime-desktop.d.ts +0 -42
  1068. package/dist/guest-runtime-desktop.js +0 -314
  1069. package/dist/guest-runtime-desktop.js.map +0 -1
  1070. package/dist/guest-runtime-main.js.map +0 -1
  1071. package/dist/guest-runtime-revision.js.map +0 -1
  1072. package/dist/guest-runtime.d.ts +0 -31
  1073. package/dist/guest-runtime.js +0 -99
  1074. package/dist/guest-runtime.js.map +0 -1
  1075. package/dist/image-evidence.d.ts +0 -2
  1076. package/dist/image-evidence.js +0 -47
  1077. package/dist/image-evidence.js.map +0 -1
  1078. package/dist/index.js.map +0 -1
  1079. package/dist/init-templates.d.ts +0 -25
  1080. package/dist/init-templates.js +0 -542
  1081. package/dist/init-templates.js.map +0 -1
  1082. package/dist/init.d.ts +0 -38
  1083. package/dist/init.js +0 -532
  1084. package/dist/init.js.map +0 -1
  1085. package/dist/key-resolution.d.ts +0 -67
  1086. package/dist/key-resolution.js +0 -375
  1087. package/dist/key-resolution.js.map +0 -1
  1088. package/dist/lab-app-runner.d.ts +0 -78
  1089. package/dist/lab-app-runner.js +0 -403
  1090. package/dist/lab-app-runner.js.map +0 -1
  1091. package/dist/lab-config.d.ts +0 -968
  1092. package/dist/lab-config.js +0 -2714
  1093. package/dist/lab-config.js.map +0 -1
  1094. package/dist/lab-engine.d.ts +0 -97
  1095. package/dist/lab-engine.js +0 -285
  1096. package/dist/lab-engine.js.map +0 -1
  1097. package/dist/lab-preflight.d.ts +0 -70
  1098. package/dist/lab-preflight.js +0 -388
  1099. package/dist/lab-preflight.js.map +0 -1
  1100. package/dist/lab-summary.d.ts +0 -57
  1101. package/dist/lab-summary.js +0 -126
  1102. package/dist/lab-summary.js.map +0 -1
  1103. package/dist/labs.d.ts +0 -59
  1104. package/dist/labs.js +0 -385
  1105. package/dist/labs.js.map +0 -1
  1106. package/dist/listen.js +0 -84
  1107. package/dist/listen.js.map +0 -1
  1108. package/dist/local-agent-claude-session.d.ts +0 -45
  1109. package/dist/local-agent-claude-session.js +0 -203
  1110. package/dist/local-agent-claude-session.js.map +0 -1
  1111. package/dist/local-agent-cli.d.ts +0 -121
  1112. package/dist/local-agent-cli.js +0 -427
  1113. package/dist/local-agent-cli.js.map +0 -1
  1114. package/dist/local-captured-inbox.d.ts +0 -6
  1115. package/dist/local-captured-inbox.js +0 -65
  1116. package/dist/local-captured-inbox.js.map +0 -1
  1117. package/dist/local-firecracker-desktop.d.ts +0 -23
  1118. package/dist/local-firecracker-desktop.js +0 -191
  1119. package/dist/local-firecracker-desktop.js.map +0 -1
  1120. package/dist/local-firecracker-study.d.ts +0 -9
  1121. package/dist/local-firecracker-study.js +0 -135
  1122. package/dist/local-firecracker-study.js.map +0 -1
  1123. package/dist/local-runtime-config.d.ts +0 -6
  1124. package/dist/local-runtime-config.js +0 -60
  1125. package/dist/local-runtime-config.js.map +0 -1
  1126. package/dist/local-runtime-host.d.ts +0 -31
  1127. package/dist/local-runtime-host.js +0 -128
  1128. package/dist/local-runtime-host.js.map +0 -1
  1129. package/dist/local-runtime-release.d.ts +0 -7
  1130. package/dist/local-runtime-release.js +0 -33
  1131. package/dist/local-runtime-release.js.map +0 -1
  1132. package/dist/local-runtime-ssh.d.ts +0 -27
  1133. package/dist/local-runtime-ssh.js +0 -91
  1134. package/dist/local-runtime-ssh.js.map +0 -1
  1135. package/dist/local-runtime.d.ts +0 -25
  1136. package/dist/local-runtime.js +0 -133
  1137. package/dist/local-runtime.js.map +0 -1
  1138. package/dist/observer-data.d.ts +0 -114
  1139. package/dist/observer-data.js +0 -224
  1140. package/dist/observer-data.js.map +0 -1
  1141. package/dist/observer-library.js +0 -191
  1142. package/dist/observer-library.js.map +0 -1
  1143. package/dist/observer-serve.d.ts +0 -99
  1144. package/dist/observer-serve.js +0 -284
  1145. package/dist/observer-serve.js.map +0 -1
  1146. package/dist/observer-static.js +0 -357
  1147. package/dist/observer-static.js.map +0 -1
  1148. package/dist/observer.d.ts +0 -118
  1149. package/dist/observer.js +0 -947
  1150. package/dist/observer.js.map +0 -1
  1151. package/dist/openai-responses-cu.d.ts +0 -158
  1152. package/dist/openai-responses-cu.js +0 -714
  1153. package/dist/openai-responses-cu.js.map +0 -1
  1154. package/dist/orientation.d.ts +0 -29
  1155. package/dist/orientation.js +0 -95
  1156. package/dist/orientation.js.map +0 -1
  1157. package/dist/oss-lab.d.ts +0 -55
  1158. package/dist/oss-lab.js +0 -344
  1159. package/dist/oss-lab.js.map +0 -1
  1160. package/dist/oss-meta-lab-scoring.d.ts +0 -15
  1161. package/dist/oss-meta-lab-scoring.js +0 -145
  1162. package/dist/oss-meta-lab-scoring.js.map +0 -1
  1163. package/dist/oss-meta-lab.d.ts +0 -287
  1164. package/dist/oss-meta-lab.js +0 -4551
  1165. package/dist/oss-meta-lab.js.map +0 -1
  1166. package/dist/oss-remote-telemetry.d.ts +0 -77
  1167. package/dist/oss-remote-telemetry.js +0 -403
  1168. package/dist/oss-remote-telemetry.js.map +0 -1
  1169. package/dist/output-token-limit.js +0 -5
  1170. package/dist/output-token-limit.js.map +0 -1
  1171. package/dist/participant-assignment.d.ts +0 -12
  1172. package/dist/participant-assignment.js +0 -15
  1173. package/dist/participant-assignment.js.map +0 -1
  1174. package/dist/persona-resolve.d.ts +0 -44
  1175. package/dist/persona-resolve.js +0 -109
  1176. package/dist/persona-resolve.js.map +0 -1
  1177. package/dist/persona.d.ts +0 -35
  1178. package/dist/persona.js +0 -141
  1179. package/dist/persona.js.map +0 -1
  1180. package/dist/pi-agent-core.d.ts +0 -77
  1181. package/dist/pi-agent-core.js +0 -207
  1182. package/dist/pi-agent-core.js.map +0 -1
  1183. package/dist/pricing.d.ts +0 -145
  1184. package/dist/pricing.js +0 -277
  1185. package/dist/pricing.js.map +0 -1
  1186. package/dist/program.d.ts +0 -96
  1187. package/dist/program.js +0 -4029
  1188. package/dist/program.js.map +0 -1
  1189. package/dist/reasoning-effort.js +0 -26
  1190. package/dist/reasoning-effort.js.map +0 -1
  1191. package/dist/reclaim.d.ts +0 -31
  1192. package/dist/reclaim.js +0 -90
  1193. package/dist/reclaim.js.map +0 -1
  1194. package/dist/redaction.d.ts +0 -90
  1195. package/dist/redaction.js +0 -294
  1196. package/dist/redaction.js.map +0 -1
  1197. package/dist/restricted-codex-analysis.d.ts +0 -15
  1198. package/dist/restricted-codex-analysis.js +0 -13
  1199. package/dist/restricted-codex-analysis.js.map +0 -1
  1200. package/dist/restricted-codex-participant-policy.d.ts +0 -44
  1201. package/dist/restricted-codex-participant-policy.js +0 -43
  1202. package/dist/restricted-codex-participant-policy.js.map +0 -1
  1203. package/dist/restricted-codex-participant-run.d.ts +0 -20
  1204. package/dist/restricted-codex-participant-run.js +0 -79
  1205. package/dist/restricted-codex-participant-run.js.map +0 -1
  1206. package/dist/restricted-codex-participant.d.ts +0 -20
  1207. package/dist/restricted-codex-participant.js +0 -250
  1208. package/dist/restricted-codex-participant.js.map +0 -1
  1209. package/dist/restricted-codex-policy.d.ts +0 -64
  1210. package/dist/restricted-codex-policy.js +0 -176
  1211. package/dist/restricted-codex-policy.js.map +0 -1
  1212. package/dist/restricted-codex-session.d.ts +0 -44
  1213. package/dist/restricted-codex-session.js +0 -657
  1214. package/dist/restricted-codex-session.js.map +0 -1
  1215. package/dist/restricted-codex-transport.d.ts +0 -69
  1216. package/dist/restricted-codex-transport.js +0 -296
  1217. package/dist/restricted-codex-transport.js.map +0 -1
  1218. package/dist/run-detail.d.ts +0 -61
  1219. package/dist/run-detail.js +0 -137
  1220. package/dist/run-detail.js.map +0 -1
  1221. package/dist/run-index.d.ts +0 -71
  1222. package/dist/run-index.js +0 -206
  1223. package/dist/run-index.js.map +0 -1
  1224. package/dist/run-narration-secrets.js +0 -68
  1225. package/dist/run-narration-secrets.js.map +0 -1
  1226. package/dist/run-paths.d.ts +0 -56
  1227. package/dist/run-paths.js +0 -355
  1228. package/dist/run-paths.js.map +0 -1
  1229. package/dist/run-projection.d.ts +0 -186
  1230. package/dist/run-projection.js +0 -350
  1231. package/dist/run-projection.js.map +0 -1
  1232. package/dist/run-status.d.ts +0 -139
  1233. package/dist/run-status.js +0 -218
  1234. package/dist/run-status.js.map +0 -1
  1235. package/dist/run.d.ts +0 -1255
  1236. package/dist/run.js +0 -5947
  1237. package/dist/run.js.map +0 -1
  1238. package/dist/sandbox-receipts.d.ts +0 -19
  1239. package/dist/sandbox-receipts.js +0 -51
  1240. package/dist/sandbox-receipts.js.map +0 -1
  1241. package/dist/screenshot-image.d.ts +0 -11
  1242. package/dist/screenshot-image.js +0 -26
  1243. package/dist/screenshot-image.js.map +0 -1
  1244. package/dist/scripted-browser-actor.d.ts +0 -297
  1245. package/dist/scripted-browser-actor.js +0 -1399
  1246. package/dist/scripted-browser-actor.js.map +0 -1
  1247. package/dist/scripted-browser-lab.d.ts +0 -121
  1248. package/dist/scripted-browser-lab.js +0 -852
  1249. package/dist/scripted-browser-lab.js.map +0 -1
  1250. package/dist/secret-prompt.js +0 -36
  1251. package/dist/secret-prompt.js.map +0 -1
  1252. package/dist/selected-output-paths.d.ts +0 -52
  1253. package/dist/selected-output-paths.js +0 -366
  1254. package/dist/selected-output-paths.js.map +0 -1
  1255. package/dist/serve-exposure.d.ts +0 -62
  1256. package/dist/serve-exposure.js +0 -129
  1257. package/dist/serve-exposure.js.map +0 -1
  1258. package/dist/serve-http.js +0 -45
  1259. package/dist/serve-http.js.map +0 -1
  1260. package/dist/serve-tunnel.js +0 -113
  1261. package/dist/serve-tunnel.js.map +0 -1
  1262. package/dist/shared-world-lab.d.ts +0 -269
  1263. package/dist/shared-world-lab.js +0 -1422
  1264. package/dist/shared-world-lab.js.map +0 -1
  1265. package/dist/source-archive.d.ts +0 -82
  1266. package/dist/source-archive.js +0 -408
  1267. package/dist/source-archive.js.map +0 -1
  1268. package/dist/stats.d.ts +0 -82
  1269. package/dist/stats.js +0 -219
  1270. package/dist/stats.js.map +0 -1
  1271. package/dist/stop-conditions.d.ts +0 -39
  1272. package/dist/stop-conditions.js +0 -66
  1273. package/dist/stop-conditions.js.map +0 -1
  1274. package/dist/study-analysis-codex-config.d.ts +0 -11
  1275. package/dist/study-analysis-codex-config.js +0 -34
  1276. package/dist/study-analysis-codex-config.js.map +0 -1
  1277. package/dist/study-analysis-engine.d.ts +0 -47
  1278. package/dist/study-analysis-engine.js +0 -327
  1279. package/dist/study-analysis-engine.js.map +0 -1
  1280. package/dist/study-analysis-evidence.d.ts +0 -27
  1281. package/dist/study-analysis-evidence.js +0 -660
  1282. package/dist/study-analysis-evidence.js.map +0 -1
  1283. package/dist/study-analysis-job.d.ts +0 -97
  1284. package/dist/study-analysis-job.js +0 -214
  1285. package/dist/study-analysis-job.js.map +0 -1
  1286. package/dist/study-analysis-provider.d.ts +0 -40
  1287. package/dist/study-analysis-provider.js +0 -170
  1288. package/dist/study-analysis-provider.js.map +0 -1
  1289. package/dist/study-analysis-service.d.ts +0 -59
  1290. package/dist/study-analysis-service.js +0 -257
  1291. package/dist/study-analysis-service.js.map +0 -1
  1292. package/dist/study-analysis-sharing.d.ts +0 -11
  1293. package/dist/study-analysis-sharing.js +0 -35
  1294. package/dist/study-analysis-sharing.js.map +0 -1
  1295. package/dist/study-analysis-store.d.ts +0 -47
  1296. package/dist/study-analysis-store.js +0 -493
  1297. package/dist/study-analysis-store.js.map +0 -1
  1298. package/dist/study-analysis-validation.d.ts +0 -618
  1299. package/dist/study-analysis-validation.js +0 -384
  1300. package/dist/study-analysis-validation.js.map +0 -1
  1301. package/dist/study-analysis.d.ts +0 -206
  1302. package/dist/study-analysis.js +0 -4
  1303. package/dist/study-analysis.js.map +0 -1
  1304. package/dist/study-costs.js +0 -114
  1305. package/dist/study-costs.js.map +0 -1
  1306. package/dist/subject-runtime.d.ts +0 -23
  1307. package/dist/subject-runtime.js +0 -70
  1308. package/dist/subject-runtime.js.map +0 -1
  1309. package/dist/tasks.d.ts +0 -90
  1310. package/dist/tasks.js +0 -144
  1311. package/dist/tasks.js.map +0 -1
  1312. package/dist/telemetry.js +0 -324
  1313. package/dist/telemetry.js.map +0 -1
  1314. package/dist/terminal-agent-actor.d.ts +0 -41
  1315. package/dist/terminal-agent-actor.js +0 -25
  1316. package/dist/terminal-agent-actor.js.map +0 -1
  1317. package/dist/terminal-encoding.js +0 -80
  1318. package/dist/terminal-encoding.js.map +0 -1
  1319. package/dist/terminal-node-bootstrap.d.ts +0 -4
  1320. package/dist/terminal-node-bootstrap.js +0 -58
  1321. package/dist/terminal-node-bootstrap.js.map +0 -1
  1322. package/dist/terminal-participant-activity.d.ts +0 -6
  1323. package/dist/terminal-participant-activity.js +0 -34
  1324. package/dist/terminal-participant-activity.js.map +0 -1
  1325. package/dist/terminal-runtime-auth.d.ts +0 -13
  1326. package/dist/terminal-runtime-auth.js +0 -24
  1327. package/dist/terminal-runtime-auth.js.map +0 -1
  1328. package/dist/terminal-runtime.d.ts +0 -16
  1329. package/dist/terminal-runtime.js +0 -42
  1330. package/dist/terminal-runtime.js.map +0 -1
  1331. package/dist/terminal-token-usage.d.ts +0 -15
  1332. package/dist/terminal-token-usage.js +0 -94
  1333. package/dist/terminal-token-usage.js.map +0 -1
  1334. package/dist/tui-actions.d.ts +0 -39
  1335. package/dist/tui-actions.js +0 -178
  1336. package/dist/tui-actions.js.map +0 -1
  1337. package/dist/tui-contract.d.ts +0 -141
  1338. package/dist/tui-contract.js +0 -54
  1339. package/dist/tui-contract.js.map +0 -1
  1340. package/dist/tui-launch.js +0 -167
  1341. package/dist/tui-launch.js.map +0 -1
  1342. package/dist/tui-project.d.ts +0 -9
  1343. package/dist/tui-project.js +0 -18
  1344. package/dist/tui-project.js.map +0 -1
  1345. package/docs/architecture/examples/state-driven-local-app/README.md +0 -80
  1346. package/docs/architecture/examples/state-driven-local-app/app.mjs +0 -48
  1347. package/docs/architecture/examples/state-driven-local-app/runner.mjs +0 -105
  1348. package/docs/architecture/local-codex-tui-actor.md +0 -213
  1349. package/docs/architecture/oss-lab-poc.md +0 -250
  1350. package/docs/architecture/runtime-broker-core.md +0 -30
  1351. package/docs/release/0.100.0-local-setup.md +0 -31
  1352. package/docs/release/0.100.1-participant-continuity.md +0 -20
  1353. package/docs/release/0.101.0-codex-ui-tools.md +0 -28
  1354. package/docs/release/0.102.0-participant-media.md +0 -43
  1355. package/docs/release/0.103.0-desktop-recording.md +0 -29
  1356. package/docs/release/0.103.1-analysis-capture-allocation.md +0 -18
  1357. package/docs/release/0.103.2-analysis-ending-context.md +0 -21
  1358. package/docs/release/0.104.0-local-captured-inboxes.md +0 -29
  1359. package/docs/release/0.104.1-recording-startup.md +0 -24
  1360. package/docs/release/0.104.2-recording-timestamps.md +0 -32
  1361. package/docs/release/0.104.3-local-smtp-catch.md +0 -15
  1362. package/docs/release/0.20.0-external-public-shared-world.md +0 -43
  1363. package/docs/release/0.84.0-redacted-evidence.md +0 -42
  1364. package/docs/release/0.84.1-portable-feedback.md +0 -20
  1365. package/docs/release/0.85.0-observer-review.md +0 -56
  1366. package/docs/release/0.85.1-observer-continuity.md +0 -20
  1367. package/docs/release/0.86.0-participant-evidence.md +0 -50
  1368. package/docs/release/0.86.1-task-preflight-saved-recordings.md +0 -40
  1369. package/docs/release/0.87.0-participant-endings-and-phone-review.md +0 -64
  1370. package/docs/release/0.88.0-study-diagnostics.md +0 -43
  1371. package/docs/release/0.88.1-completion-evidence-and-local-app.md +0 -79
  1372. package/docs/release/0.88.2-sequential-study-budgets.md +0 -57
  1373. package/docs/release/0.89.0-study-findings.md +0 -79
  1374. package/docs/release/0.89.1-analysis-finished-notice.md +0 -24
  1375. package/docs/release/0.90.0-automatic-analysis.md +0 -21
  1376. package/docs/release/0.91.0-analysis-quality-and-defaults.md +0 -33
  1377. package/docs/release/0.91.1-study-review-polish.md +0 -28
  1378. package/docs/release/0.92.0-grid-playback.md +0 -22
  1379. package/docs/release/0.93.0-global-playback.md +0 -26
  1380. package/docs/release/0.93.1-observer-review-controls.md +0 -24
  1381. package/docs/release/0.94.0-reliability.md +0 -48
  1382. package/docs/release/0.95.0-connections-setup.md +0 -38
  1383. package/docs/release/0.96.0-real-email-receiving.md +0 -47
  1384. package/docs/release/0.96.1-browser-navigation.md +0 -22
  1385. package/docs/release/0.97.0-codex-account-analysis.md +0 -45
  1386. package/docs/release/0.98.0-local-browser-studies.md +0 -31
  1387. package/docs/release/0.99.0-local-browser-mac.md +0 -34
  1388. package/docs/release/0.99.1-action-recovery.md +0 -19
  1389. /package/dist/{agent-session.d.ts → actors/agent-session.d.ts} +0 -0
  1390. /package/dist/{cua-executor-error.d.ts → actors/computer-use/executor-error.d.ts} +0 -0
  1391. /package/dist/{cua-speech.d.ts → actors/computer-use/speech.d.ts} +0 -0
  1392. /package/dist/{actor-goal-source.d.ts → actors/goal-source.d.ts} +0 -0
  1393. /package/dist/{output-token-limit.d.ts → actors/output-token-limit.d.ts} +0 -0
  1394. /package/dist/{reasoning-effort.d.ts → actors/reasoning-effort.d.ts} +0 -0
  1395. /package/dist/{secret-prompt.d.ts → cli/secret-prompt.d.ts} +0 -0
  1396. /package/dist/{telemetry.d.ts → cli/telemetry.d.ts} +0 -0
  1397. /package/dist/{browser-evidence-hygiene.d.ts → evidence/browser-hygiene.d.ts} +0 -0
  1398. /package/dist/{serve-http.d.ts → observer/http.d.ts} +0 -0
  1399. /package/dist/{observer-library.d.ts → observer/library.d.ts} +0 -0
  1400. /package/dist/{listen.d.ts → observer/listen.d.ts} +0 -0
  1401. /package/dist/{observer-static.d.ts → observer/static.d.ts} +0 -0
  1402. /package/dist/{serve-tunnel.d.ts → observer/tunnel.d.ts} +0 -0
  1403. /package/dist/{terminal-encoding.d.ts → routes/terminal/encoding.d.ts} +0 -0
  1404. /package/dist/{concurrency.d.ts → run/concurrency.d.ts} +0 -0
  1405. /package/dist/{study-costs.d.ts → run/costs.d.ts} +0 -0
  1406. /package/dist/{run-narration-secrets.d.ts → run/transient-comms-secrets.d.ts} +0 -0
  1407. /package/dist/{tui-launch.d.ts → tui/launch.d.ts} +0 -0
@@ -3,14 +3,14 @@
3
3
  Date: 2026-06-02 (current-state note updated 2026-07-14)
4
4
 
5
5
  Status: reference map for the major contracts shipped through source version
6
- `0.104.3`; it is not an exhaustive inventory of command/result envelopes. Exported types,
6
+ `0.106.0`; it is not an exhaustive inventory of command/result envelopes. Exported types,
7
7
  schema constants, parsers, and validators in `src/` are authoritative. Rows
8
- marked "reserved" name layering intent only — no code emits or validates them
8
+ marked "reserved" name layering intent only; no code emits or validates them
9
9
  yet. Do not emit a reserved schema.
10
10
 
11
11
  ## Purpose
12
12
 
13
- This document names the core Humanish contracts before more implementation
13
+ This document names the core humanish contracts before more implementation
14
14
  lands. It is intentionally public-safe: examples use synthetic ids, local
15
15
  relative artifact paths, env var names without values, and redacted evidence
16
16
  notes.
@@ -20,65 +20,66 @@ workflow without leaking private upstream truth into core.
20
20
 
21
21
  ## Ownership Rule
22
22
 
23
- | Layer | Owns | Does not own |
24
- | --- | --- | --- |
25
- | Core | Schema versions, run ids, artifact layout, lifecycle events, actor/substrate status, evidence shape, review, verification, redaction, feedback mechanics, latest/history indexes. | Product routes, real customer data, private screenshots, private transcripts, credential values, target-specific acceptance language. |
26
- | Adapter | Product routes, scenario/persona choices, app topology, env var names, network allowlists, coverage vocabulary, milestones, fixture data, target-specific proof expectations. | Generic run bundle schema, public-safety gates, provider secret values, raw private artifacts, GitHub mutation authority. |
23
+ | Layer | Owns | Does not own |
24
+ | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
25
+ | Core | Schema versions, run ids, artifact layout, lifecycle events, actor/substrate status, evidence shape, review, verification, redaction, feedback mechanics, latest/history indexes. | Product routes, real customer data, private screenshots, private transcripts, credential values, target-specific acceptance language. |
26
+ | Adapter | Product routes, scenario/persona choices, app topology, env var names, network allowlists, coverage vocabulary, milestones, fixture data, target-specific proof expectations. | Generic run bundle schema, public-safety gates, provider secret values, raw private artifacts, GitHub mutation authority. |
27
27
 
28
28
  ## Contract Index
29
29
 
30
- | Contract | Schema | Public-safe fixture |
31
- | --- | --- | --- |
32
- | Run bundle | `humanish.run-bundle.v1` | `synthetic-run-bundle` |
33
- | Adapter | `humanish.adapter.v1` | `synthetic-cli-adapter` |
34
- | Lab | `humanish.lab.v2` | `first-run` |
35
- | Persona | `humanish.persona.v1` | `synthetic-maintainer` |
36
- | Scenario | `humanish.scenario.v1` | `first-run-smoke` |
37
- | Actor trace | `humanish.actor-trace.v1` | `synthetic-actor-trace` |
38
- | Substrate | reserved (never shipped) | none |
39
- | Evidence stream | reserved (streams live inside the run bundle) | see [`run-bundle.md`](run-bundle.md) |
40
- | Review | `humanish.review.v1` | `contract-proof-review` |
41
- | Study analysis | `humanish.study-analysis.v1` | see [study analysis](study-analysis.md) and synthetic analysis fixtures in `tests/` |
42
- | Study analysis correction | `humanish.study-analysis-correction.v1` | see [study analysis](study-analysis.md#human-review-and-sharing) |
43
- | Analysis execution receipt | `humanish.analysis-execution.v1` | see [study analysis](study-analysis.md#durable-records) |
44
- | Analysis execution start | `humanish.analysis-execution-start.v1` | see [study analysis](study-analysis.md#durable-records) |
45
- | Verification | `humanish.verify-result.v1` | `five-check-verify` |
46
- | Policy | `humanish.policy.v1` (fixture-only; not engine-validated) | `public-safety-policy` |
47
- | Feedback | `humanish.feedback.v1` | `public-safe-feedback` |
48
- | Terminal cost ledger | `humanish.terminal-cost-ledger.v1` | see Terminal Cost Ledger below |
49
- | Terminal no-spend proof | `humanish.terminal-no-spend-proof.v1` | see Terminal Cost Ledger below |
50
- | Pricing (operator-editable rates) | `humanish.pricing.v1` (`src/pricing.ts`; dated per-model + E2B desktop rates) | see Run Cost Summary And Estimated Actor Cost below |
51
- | Run cost summary | `humanish.run-cost-summary.v1` (additive `RunBundle.cost`; estimate, never a charge) | see Run Cost Summary And Estimated Actor Cost below |
52
- | Estimated actor cost | `humanish.actor-estimated-cost.v1` (additive `ActorTrace.estimatedCost`) | see Run Cost Summary And Estimated Actor Cost below |
53
- | Model settings | `humanish.model-settings.v1` (additive `ActorTrace.modelSettings`; the reasoning effort the request carried) | see Actor Trace below |
54
- | Affordance use | `humanish.affordance-use.v1` (additive `ActorTrace.affordanceUse`; per-class counts of the routes an actor took) | see Affordance Use below |
55
- | Adapter score | `humanish.adapter-score.v1` (`RunBundle.adapterScore`; namespaced; route-specific acceptance semantics) | see Product-Adapter Extension Seam below |
56
- | Adapter artifact | `humanish.adapter-artifact.v1` (`RunBundle.adapterArtifacts[]`; namespaced; local relative proof references) | see Product-Adapter Extension Seam below |
57
- | Shared-world evidence | `humanish.shared-world.v1` (additive `RunBundle.sharedWorld` + `RunBundle.attributionClass`; `topologyMode: sequential \| concurrent`) | see Shared-World Evidence below |
58
- | Comms thread | `humanish.comms-thread.v1` (off-app email/SMS the app sent, captured; a `kind: log` run-dir artifact of DIGESTS only — from/to/subject/link digests + an OTP count, never raw) | see `comms` under Lab Manifest |
59
- | Serve result | `humanish.serve-result.v1` (`src/observer-serve.ts` is authoritative) | none (command result envelope; see Serve Result below) |
60
- | Serve control plane | reserved (`/_humanish/api/*` answers `501` `HUMANISH_SERVE_CONTROL_PLANE_DISABLED` in v1) | none |
30
+ | Contract | Schema | Public-safe fixture |
31
+ | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------- |
32
+ | Run bundle | `humanish.run-bundle.v1` | `synthetic-run-bundle` |
33
+ | Adapter | `humanish.adapter.v1` | `synthetic-cli-adapter` |
34
+ | Lab | `humanish.lab.v2` | `first-run` |
35
+ | Persona | `humanish.persona.v1` | `synthetic-maintainer` |
36
+ | Scenario | `humanish.scenario.v1` | `first-run-smoke` |
37
+ | Actor trace | `humanish.actor-trace.v1` | `synthetic-actor-trace` |
38
+ | Substrate | reserved (never shipped) | none |
39
+ | Evidence stream | reserved (streams live inside the run bundle) | see [`run-bundle.md`](run-bundle.md) |
40
+ | Review | `humanish.review.v1` | `contract-proof-review` |
41
+ | Study analysis | `humanish.study-analysis.v1` | see [study analysis](study-analysis.md) and synthetic analysis fixtures in `tests/` |
42
+ | Study analysis correction | `humanish.study-analysis-correction.v1` | see [study analysis](study-analysis.md#human-review-and-sharing) |
43
+ | Analysis execution receipt | `humanish.analysis-execution.v1` | see [study analysis](study-analysis.md#durable-records) |
44
+ | Analysis execution start | `humanish.analysis-execution-start.v1` | see [study analysis](study-analysis.md#durable-records) |
45
+ | Verification | `humanish.verify-result.v1` | `five-check-verify` |
46
+ | Policy | `humanish.policy.v1` (fixture-only; not engine-validated) | `public-safety-policy` |
47
+ | Feedback | `humanish.feedback.v1` | `public-safe-feedback` |
48
+ | Terminal cost ledger | `humanish.terminal-cost-ledger.v1` | see Terminal Cost Ledger below |
49
+ | Terminal no-spend proof | `humanish.terminal-no-spend-proof.v1` | see Terminal Cost Ledger below |
50
+ | Pricing (operator-editable rates) | `humanish.pricing.v1` (`src/run/pricing.ts`; dated per-model + E2B desktop rates) | see Run Cost Summary And Estimated Actor Cost below |
51
+ | Run cost summary | `humanish.run-cost-summary.v1` (additive `RunBundle.cost`; estimate, never a charge) | see Run Cost Summary And Estimated Actor Cost below |
52
+ | Estimated actor cost | `humanish.actor-estimated-cost.v1` (additive `ActorTrace.estimatedCost`) | see Run Cost Summary And Estimated Actor Cost below |
53
+ | Model settings | `humanish.model-settings.v1` (additive `ActorTrace.modelSettings`; the reasoning effort the request carried) | see Actor Trace below |
54
+ | Affordance use | `humanish.affordance-use.v1` (additive `ActorTrace.affordanceUse`; per-class counts of the routes an actor took) | see Affordance Use below |
55
+ | Adapter score | `humanish.adapter-score.v1` (`RunBundle.adapterScore`; namespaced; route-specific acceptance semantics) | see Product-Adapter Extension Seam below |
56
+ | Adapter artifact | `humanish.adapter-artifact.v1` (`RunBundle.adapterArtifacts[]`; namespaced; local relative proof references) | see Product-Adapter Extension Seam below |
57
+ | Shared-world evidence | `humanish.shared-world.v1` (additive `RunBundle.sharedWorld` + `RunBundle.attributionClass`; `topologyMode: sequential \| concurrent`) | see Shared-World Evidence below |
58
+ | Comms thread | `humanish.comms-thread.v1` (off-app email/SMS the app sent, captured; a `kind: log` run-dir artifact of DIGESTS only — from/to/subject/link digests + an OTP count, never raw) | see `comms` under Lab Manifest |
59
+ | Serve result | `humanish.serve-result.v1` (`src/observer/serve.ts` is authoritative) | none (command result envelope; see Serve Result below) |
60
+ | Serve control plane | reserved (`/_humanish/api/*` answers `501` `HUMANISH_SERVE_CONTROL_PLANE_DISABLED` in v1) | none |
61
61
 
62
62
  ## Lab Manifest
63
63
 
64
- Schema: `humanish.lab.v2` (`src/lab-config.ts`). There is deliberately no v1
65
- compatibility: v1 (`kind`, top-level `sims`) had zero real users and was
64
+ Schema: `humanish.lab.v2` (types in `src/lab/types.ts`, parsed by `src/lab/config.ts`). There
65
+ is deliberately no v1 compatibility: v1 (`kind`, top-level `sims`) had zero real users and was
66
66
  deleted when labs became config.
67
67
 
68
68
  A lab is a composition over code primitives, not a hardcoded kind:
69
69
 
70
- - `subject`: what the run acts on — `this-repo`, `clone` (owner/repo slugs,
70
+ - `subject`: what the run acts on: `this-repo`, `clone` (owner/repo slugs,
71
71
  optional in-sandbox `serve` + env var names + `state`), `local-tree` (the
72
72
  operator's own working tree, packed on the host and provisioned in-sandbox
73
73
  in place of a clone; see below), `app-url`
74
74
  (loopback unless `policies.allowPublicTargets` declares an owned deployment),
75
75
  `local-app` (an already-running LOCAL dev server driven IN-PROCESS via a
76
- custom `CuaExecutor`, NO clone and NO E2B desktop — always loopback), or
76
+ custom `CuaExecutor`, NO clone and NO E2B desktop, always loopback),
77
77
  `terminal-product` (a CLI/product a real autonomous terminal agent studies
78
- from PUBLIC surfaces only — see below). A
78
+ from PUBLIC surfaces only; see below), or `desktop-cli` (a computer-use
79
+ participant using a CLI in a terminal on a hosted desktop). A
79
80
  `local-app` subject pairs a computer-use actor with `execution.target: local`
80
81
  (or absent) and is library-assisted: the caller supplies
81
- `cuaHooks.buildExecutor` + `buildProvider`; with no hooks the engine fails
82
+ `RunLabOptions.inProcess.executor` + `createProvider`; with neither the engine fails
82
83
  closed (`HUMANISH_CUA_LAB_LOCAL_APP_NO_EXECUTOR`), never a desktop attempt. See
83
84
  [`docs/architecture/state-driven-executor.md`](../architecture/state-driven-executor.md);
84
85
  - `subject.localTree` (`local-tree` subjects, computer-use route): pack/upload
@@ -86,7 +87,7 @@ A lab is a composition over code primitives, not a hardcoded kind:
86
87
  top of the always-on denylist; entries match as a repo-relative path
87
88
  prefix or an exact basename, absolute paths and glob syntax are rejected
88
89
  at parse time, and leading `./` / trailing `/` are normalized), `keep`
89
- (preserve the sandbox on a failed lane for debugging, mirroring
90
+ (preserve the sandbox on a failed participant for debugging, mirroring
90
91
  `subject.clone.keep`; a kept local-tree sandbox holds the packed working
91
92
  tree, including any file that survived the denylist), and
92
93
  `maxArchiveBytes` (upload size cap override; default 256 MiB). Routing requires `execution.target: e2b-desktop` and a
@@ -98,19 +99,20 @@ A lab is a composition over code primitives, not a hardcoded kind:
98
99
  is a git work tree (`git ls-files --cached --others --exclude-standard`,
99
100
  honoring `.gitignore`) or a denylist-only recursive walk otherwise; an
100
101
  always-on denylist (`.git`, `node_modules`, `.humanish`, `.env*`, key/cert
101
- file patterns, and common credential-shaped names; the authoritative list
102
- is `LOCAL_TREE_DENYLIST_BASENAME_PATTERNS` in `src/source-archive.ts`)
102
+ file patterns, and common credential-shaped names; the authoritative lists
103
+ are `LOCAL_TREE_DENYLIST_PATH_SEGMENTS` and `LOCAL_TREE_DENYLIST_BASENAME_PATTERNS` in
104
+ `src/subject/local-tree-archive.ts`)
103
105
  applies in both modes and is not overridable. The denylist matches names,
104
106
  not contents; a secret in a file it does not name packs like any other
105
107
  file, so review the pack summary line and use `localTree.exclude`. The lab packs
106
- ONCE per run and uploads the identical archive to every fan-out lane. The
108
+ ONCE per run and uploads the identical archive to every fan-out participant. The
107
109
  in-sandbox commit refresh clone subjects use is skipped: `.git` is never
108
110
  uploaded, so identity comes from the host-side archive digest instead. See
109
- [`docs/goals/local-tree-subject/goal.md`](../goals/local-tree-subject/goal.md);
111
+ [`docs/goals/local-tree-subject/goal.md`](https://github.com/danielgwilson/humanish/blob/main/docs/goals/local-tree-subject/goal.md);
110
112
  - `subject.product` (terminal-product subjects): the product the agent studies.
111
113
  `product.name` is a public-safe token (committed fixtures use a NEUTRAL mock
112
114
  name); `product.publicSurfaces[]` is the list of http(s) URLs (docs, llms.txt,
113
- skill manifest) that are the ONLY world the agent sees — the lab does not
115
+ skill manifest) that are the ONLY world the agent sees. The lab does not
114
116
  clone/provision the product, so its provenance is recorded UNPINNED
115
117
  (invariant 5). `serve`/`clone`/`state`/`repos`/`appUrl` are rejected on a
116
118
  terminal-product subject (a field that cannot act on the route is a parse
@@ -119,108 +121,114 @@ A lab is a composition over code primitives, not a hardcoded kind:
119
121
  - `subject.state` (clone or local-tree subjects, computer-use route): the
120
122
  subject's state story. `state.seed[]` declares ordered, bounded
121
123
  seed/migration/fixture steps (`{ name, command, when: before-build |
122
- before-start | after-ready, timeoutMs }`) executed in-sandbox around the
124
+ before-start | after-ready, timeoutMs }`) executed in-sandbox around the
123
125
  serve sequence; `state.external[]` declares env var NAMES (each must also
124
126
  appear in `subject.env`) pointing at state the lab does not control,
125
127
  recorded as UNPINNED in provenance. Commands persist in evidence as
126
128
  sha256-16 digests only, never as text;
127
129
  - `actors`: who drives it. On computer-use (including shared-world),
128
130
  scripted-browser, and terminal-product routes, `actors[0].type` is a real
129
- dispatch key resolved against the actor registry. On synthetic and meta-lab
130
- routes it remains a descriptive label (e.g. `synthetic-persona`). The
131
+ dispatch key resolved against the actor registry. On the synthetic route it
132
+ remains a descriptive label (e.g. `synthetic-persona`). The
131
133
  `codex-exec` descriptor's direct `runSession` member is a fail-closed
132
134
  compatibility entry, not the live runner; the terminal-product lab route
133
135
  owns the live sandbox, auth, cap, evidence, and cleanup lifecycle.
134
- `actors[0].count` carries route-specific meanings: synthetic route lane
136
+ `actors[0].count` carries route-specific meanings: synthetic route participant
135
137
  count (simCount); scripted-browser route surface roster (1 = desktop,
136
138
  2 = desktop + mobile, default 1); computer-use **E2B** route the HOMOGENEOUS
137
- fan-out lane count (N identical lanes, each its own E2B desktop — per-lane
139
+ fan-out participant count (N identical participants, each its own E2B desktop: separate
138
140
  worlds, cap 16). The in-process/local-app computer-use route stays single
139
- lane (no E2B to fan out);
141
+ participant (no E2B to fan out);
140
142
  - `actors[0].lanes[]` (computer-use E2B route): a DIFFERENTIATED fan-out roster,
141
143
  each `{ id?, actorType?, surface?, caseGroup?, persona?, device?,
142
- instruction?, target?, entry? }` becoming one independent E2B desktop (or, on the
143
- shared-world routes, one role/seat against the shared plane). `actorType`,
144
+ instruction?, target?, entry?, host?, reasoningEffort?, stopWhen?, dwell? }` becoming one independent E2B desktop (or, on the
145
+ shared-world routes, one participant against the shared plane). `actorType`,
144
146
  `surface`, and `caseGroup` are adapter-owned public-safe labels for grouping
145
147
  simulated users; they are not core enums, and `actorType` is deliberately
146
148
  separate from the execution dispatch key `actors[0].type`. `lanes` is XOR with
147
149
  `count` (declare a roster OR a homogeneous count) and XOR with
148
- `actors[0].laneFocus` (a roster's per-lane `instruction` is the steer);
149
- `lanes[].device` is XOR with a raw `execution.desktop.resolution`. Lane ids
150
- default `lane-01`..`lane-NN`, must be unique, and name per-lane evidence paths
151
- (`actors/<streamId>.json`, `screenshots/<laneId>/`). Cap 16 lanes. On every
152
- non-cua route `lanes` is inert (warned). `subject.clone.fanout` is REJECTED on
153
- the cua route (declare fan-out via `count`/`lanes`; `clone.fanout` drives the
154
- OSS smoke/meta routes only);
150
+ `actors[0].laneFocus` (a roster's per-participant `instruction` is the steer);
151
+ `lanes[].device` is XOR with a raw `execution.desktop.resolution`. Participant ids
152
+ default `lane-01`..`lane-NN` (`role-01`..`role-NN` for shared-world participants), must be unique, and name per-participant evidence paths
153
+ (`actors/<streamId>.json`, `screenshots/<laneId>/`). Cap 16 participants. On other
154
+ routes `lanes` is inert (warned), except the scripted-browser route, which rejects it. `subject.clone.fanout` is REJECTED on
155
+ the cua, shared-world and scripted-browser routes (declare fan-out via
156
+ `count`/`lanes`). No current route reads `clone.fanout`;
155
157
  - `actors[0].lanes[].target` (app-url × computer-use E2B route only): an
156
- absolute browser URL that lane opens instead of `subject.appUrl`. This is the
158
+ absolute browser URL that participant opens instead of `subject.appUrl`. This is the
157
159
  setup-produced-target handoff for crawler/swarm labs: an adapter may start any
158
160
  topology it needs, then declare exactly which target each actor should drive.
159
- If any lane declares `target`, every lane in that roster must declare one.
161
+ If any participant declares `target`, every participant in that roster must declare one.
160
162
  Public/non-loopback targets still require `policies.allowPublicTargets: true`.
161
163
  `target` is mutually exclusive with `entry`: `target` is an absolute app-url
162
- browser target; `entry` is a shared-world same-origin seat path;
164
+ browser target; `entry` is a shared-world participant's same-origin path;
163
165
  - `actors[0].roster[]` (computer-use E2B route): compact authoring sugar for
164
- repeated lane groups, each `{ id, count, actorType?, surface?, caseGroup?,
165
- persona?, device?, instruction?, target?, entry? }`. The parser expands it into
166
+ repeated participant groups, each `{ id, count, actorType?, surface?, caseGroup?,
167
+ persona?, device?, instruction?, target?, entry?, host?, reasoningEffort?, stopWhen?,
168
+ dwell? }`. The parser expands it into
166
169
  deterministic `lanes[]` before the engine runs (`viewer-01`, `viewer-02`,
167
- ...), so the runtime and run bundle keep one normalized lane shape. `roster`
170
+ ...), so the runtime and run bundle keep one normalized participant shape. `roster`
168
171
  is XOR with explicit `lanes`, homogeneous `count`, and `laneFocus`;
169
172
  - `execution.concurrency` (computer-use E2B routes, including shared-world): a
170
- CAP on lanes in flight at once. When omitted, every declared seat runs
171
- simultaneously (the parser fills `concurrency = laneCount` for multi-seat
172
- labs) — total sessions and spend are identical either way; only wall-clock
173
- and simultaneity differ. Declaring a value below the seat count runs seats in
173
+ CAP on participants in flight at once. When omitted, every participant runs
174
+ simultaneously: independent participants resolve it from the final participant count,
175
+ after any `--count` override, and the parser fills `concurrency = laneCount`
176
+ for multi-participant shared-world labs. Total sessions and spend are identical either way; only wall-clock
177
+ and simultaneity differ. Declaring a value below the participant count runs participants in
174
178
  waves and emits a warning saying so, because a green waved run is otherwise
175
- indistinguishable from the all-live run the author meant. On shared-world
176
- labs this field is also the sequential/concurrent selector: `concurrency: 1`
177
- is the sequential turn-taking PoC; anything higher (including the filled
178
- default) is the concurrent substrate. The env override
179
+ indistinguishable from the all-live run the author meant. Shared-world labs
180
+ need at least 2 (the host and a follower are live together); `concurrency: 1`
181
+ there is refused at parse, since the sequential turn-taking route was removed
182
+ in 0.106.0. The env override
179
183
  `HUMANISH_CUA_MAX_CONCURRENCY` may only LOWER the effective bound, never
180
184
  raise concurrent paid desktops (invariant 3), and a lowering is recorded on
181
185
  the plan (`envLoweredConcurrencyFrom`). Inert (warned) on other routes.
182
- `execution.timeoutMs` is the PER-LANE session budget on this route (semantics
186
+ `execution.timeoutMs` is the PER-PARTICIPANT session budget on this route (semantics
183
187
  change: it was the single-session budget pre-fan-out); there is no run-level
184
188
  wall clock. `policies.allowPublicTargets` cannot combine with N>1 against one
185
189
  implicit public `subject.appUrl` (ambiguous shared-world-ish topology); it may
186
190
  combine with N>1 only when the roster declares explicit `lanes[].target` for
187
- every lane, OR when `subject.topology: shared-world` is ALSO declared — that
191
+ every participant, OR when `subject.topology: shared-world` is ALSO declared. That
188
192
  routes N>1 against one public target to the EXTERNAL-PUBLIC shared-world plane
189
- (see Shared-World Evidence below), not per-lane worlds;
193
+ (see Shared-World Evidence below), not separate worlds;
190
194
  - `subject.publicTarget: { owner, authorized: true }` (external-public shared-world
191
195
  route ONLY): the operator's REQUIRED ownership attestation when a real PUBLIC
192
196
  deployment (`source: app-url` + `topology: shared-world` + `allowPublicTargets` +
193
197
  `concurrency > 1`) is used directly as the shared plane. The harness neither
194
198
  provisions nor exposes the target, so it cannot attest synthetic data; the operator
195
- MUST attest they own/operate it. Author-trust (unverifiable); rejected on every other
196
- route. `actors[0].lanes[].host: true` marks the single designated host seat there;
197
- - `subject.appUrl`: a loopback http(s) URL a computer-use actor drives, OR — on the
198
- external-public shared-world route — the non-loopback public deployment used as the
199
+ MUST attest they own/operate it. Author-trust (unverifiable); rejected on non-app-url
200
+ subjects and inert (warned) on other app-url routes. `actors[0].lanes[].host: true` marks the single designated host participant there;
201
+ - `subject.appUrl`: a loopback http(s) URL a computer-use actor drives, OR (on the
202
+ external-public shared-world route) the non-loopback public deployment used as the
199
203
  shared plane (with `publicTarget` + `allowPublicTargets`);
200
- - `execution`: where it runs — `local`, `e2b-desktop`, or `e2b-terminal`, plus
204
+ - `execution`: where it runs (`local`, `e2b-desktop`, or `e2b-terminal`), plus
201
205
  desktop device/resolution and timeouts. app-url subjects pair `e2b-desktop`
202
- with a computer-use actor, or `local` (or absent) with a scripted-browser
203
- actor; terminal-product subjects pair `e2b-terminal` (or absent → implied)
204
- with a registered terminal actor;
205
- - `execution.desktop.template` (e2b-desktop computer-use routes): a custom E2B
206
- desktop TEMPLATE (image) NAME or ID the run launches on — for a subject that
206
+ or `local` with a computer-use actor, or `local` (or absent) with a
207
+ scripted-browser actor; terminal-product subjects pair `e2b-terminal` (or absent → implied)
208
+ with a registered terminal actor. clone and local-tree subjects require an
209
+ explicit `e2b-desktop`: any other target, or none, fails to parse, and the
210
+ computer-use and scripted-browser routes refuse it when a library caller skips
211
+ the parser;
212
+ - `execution.desktop.template` (e2b-desktop computer-use and clone scripted-browser routes): a custom E2B
213
+ desktop TEMPLATE (image) NAME or ID the run launches on, for a subject that
207
214
  needs runtimes the stock `desktop` image lacks (e.g. node/bun/a local Postgres
208
215
  baked into an adopter-maintained image). Any non-empty string is a valid
209
216
  name/id (no allowlist); a blank/whitespace value is rejected. Threaded to the
210
217
  SDK's `Sandbox.create(template, opts)` on EVERY desktop-creating route (the
211
- single-lane + fan-out cua lanes, the sequential shared-world plane, and the
212
- concurrent shared-world subject AND every actor sandbox); when absent the call
218
+ single-participant and fan-out cua participants, and the shared-world subject AND every actor
219
+ sandbox); when absent the call
213
220
  stays the byte-stable `Sandbox.create(opts)` default (the stock template). The
214
221
  template actually used is recorded in the run bundle as `desktopTemplate`
215
- (public-safe — a template name is not a secret). Inert (warned) on every route
216
- that creates no desktop, incl. the in-process `local-app` cua route and the
217
- meta route — never silently ignored (invariant 6). Custom images need the
218
- Desktop SDK's `xdotool` input support and `xclip` or `xsel` on `PATH` for
219
- clipboard recovery when direct typing fails. If both clipboard utilities are
220
- absent, recovery fails with `clipboard-utility-missing`; a dry-run does not
222
+ (public-safe, since a template name is not a secret). Inert (warned) on every route
223
+ that creates no desktop, incl. the in-process `local-app` cua route, so it is
224
+ never silently ignored (invariant 6). Custom images need the
225
+ Desktop SDK's `xdotool` input support, `mktemp`, and the `C.UTF-8` locale:
226
+ every typed text is written to a private 0600 file and typed with
227
+ `LC_ALL=C.UTF-8 xdotool type --file` in one attempt. Without that locale a
228
+ type action with non-ASCII text fails with `text-command`; a dry-run does not
221
229
  inspect the image's installed tools;
222
230
  - `execution.desktop.browser` (e2b-desktop computer-use/fan-out routes, plus
223
- sequential and concurrent shared-world actor seats): optional browser family
231
+ shared-world participants): optional browser family
224
232
  preference: `default`, `chrome`, `chromium`, or `firefox`. Absent/default
225
233
  preserves the historical desktop opener behavior. A concrete value means
226
234
  launch that browser or fail closed; when configured, the bundle records
@@ -230,86 +238,99 @@ A lab is a composition over code primitives, not a hardcoded kind:
230
238
  when known. Inert (warned) where this route-specific browser launcher is not
231
239
  used;
232
240
  - `execution.terminal` + `execution.runtimeAuth` (terminal-product route):
233
- `terminal.transport` is `exec-stream` — captured NON-interactive exec output
241
+ `terminal.transport` is `exec-stream`: captured NON-interactive exec output
234
242
  (stdin disabled); `pty` is rejected because labeling captured exec output as
235
243
  an interactive PTY would overstate the mechanism (invariant 6; a true duplex
236
244
  PTY transport does not ship). `terminal.stdin` defaults to `disabled`
237
245
  (`sent`/assisted input is rejected until the interventions ledger + a
238
- non-comparable marker exist). `runtimeAuth: openai-env` declares the agent's
239
- runtime-auth channel — recorded as NAMES ONLY. On a live run, the engine
246
+ non-comparable marker exist). `runtimeAuth` (`openai-env`, the default, or `openai-egress`)
247
+ declares the agent's runtime-auth channel, recorded as NAMES ONLY. On a live run, the engine
240
248
  resolves the registered terminal descriptor and requires
241
- `keyPlacement: in-sandbox-command-scoped` before creating a sandbox. The key
242
- is passed only to the agent command, never to `Sandbox.create` or metadata;
243
- a dry-run neither reads nor injects it;
249
+ `keyPlacement: in-sandbox-command-scoped` before creating a sandbox. With `openai-env`
250
+ the key is passed only to the agent command, never to `Sandbox.create` or
251
+ metadata; with `openai-egress` it stays in the host-side E2B header transform
252
+ set at sandbox creation, and the agent gets a placeholder. A dry-run neither
253
+ reads nor injects it;
244
254
  - `scenario`: `mode: dry-run` (contract evidence, no spend) or `live`.
245
255
  `scenario.ref` is CONSUMED (and REQUIRED) on the scripted-browser route: it
246
256
  resolves a committed scenario (`humanish/scenarios/<ref>.yaml` or a repo
247
257
  path) whose `browser.steps` ARE what the actor executes, digest-pinned into
248
258
  bundle provenance; on other routes `ref`/`inline` stay forward-declared
249
259
  warnings. On the scripted route `live` gates real browser ACTUATION against
250
- the declared app — provider spend stays $0 by mechanism (no model runs);
260
+ the declared app. Provider spend stays $0 by mechanism (no model runs);
251
261
  - `scenario.caps` (terminal-product route): `{ maxUsd, maxJobs, maxMinutes }`,
252
- all non-negative numbers (0 = no-spend, the default). The blast-radius budget
253
- that bounds the in-sandbox live key by MECHANISM, not by hope — the live key
254
- is never exercised without a fail-closed cap in force. `maxMinutes` is the
262
+ all non-negative numbers (0 = no-spend, the default). This budget bounds the
263
+ in-sandbox live key by mechanism: the live key is never exercised without a
264
+ fail-closed cap in force. `maxMinutes` is the
255
265
  wall-clock kill; `maxUsd`/`maxJobs` are enforced fail-closed against the cost
256
- ledger (a run whose KNOWN spend exceeds the cap fails closed,
257
- `HUMANISH_TERMINAL_LAB_CAPS_EXCEEDED`). The no-spend proof is derived from that
258
- real ledger, never asserted (see Terminal Cost Ledger And No-Spend Proof).
259
- Inert (warned) on every other route;
260
- - `policies`: `redactRepos`, `redactScreenshots`, `allowPublicTargets`, and the
266
+ ledger after the session (a run whose KNOWN spend exceeds the cap fails closed,
267
+ `HUMANISH_TERMINAL_LAB_CAPS_EXCEEDED`). Core records Codex provider spend as
268
+ unpriced tokens, so without a cost probe no line can trip a positive `maxUsd`:
269
+ a live run refuses `maxUsd > 0` before creating a sandbox
270
+ (`HUMANISH_TERMINAL_LAB_UNPRICED_CAP`) unless the caller passes a `costProbe`
271
+ hook. The sandbox's server-side timeout is the steps before the
272
+ codex command (Node bootstrap, runtime version check, and product setup when
273
+ `subject.product.install` is declared) plus `maxMinutes` plus a 5-minute
274
+ teardown buffer; a live run refuses a `maxMinutes` that would take it past
275
+ E2B's one-hour limit (`HUMANISH_TERMINAL_LAB_CAPS_INVALID`). The no-spend proof is derived from that real ledger, never asserted (see
276
+ Terminal Cost Ledger And No-Spend Proof).
277
+ Inert (warned) on every other route, except that a positive
278
+ `scenario.caps.maxUsd` or `scenario.caps.maxTotalUsd` on a computer-use lab
279
+ is a parse error naming the matching `execution.caps` field, which is what
280
+ that route enforces;
281
+ - `policies`: `redactRepos`, `redactScreenshots`, `allowPublicTargets`,
282
+ `mediaPermission` (`prompt` | `granted`), and the
261
283
  terminal-product credential-boundary booleans `allowPrivateRepoAccess`,
262
284
  `allowProviderCredentials`, `allowPaymentCredentials`, `allowGitHubMutation`
263
- (all DEFAULT FALSE — deny-by-default; only the runtime LLM key enters, and
285
+ (all DEFAULT FALSE, deny-by-default; only the runtime LLM key enters, and
264
286
  only command-scoped). The scripted-browser route is loopback-only and rejects
265
287
  `redactScreenshots: true` (blur unimplemented there) and
266
288
  `allowPublicTargets: true` fail-closed rather than ignoring them.
267
- - `comms` (#297; hosted on the clone/local-tree computer-use lanes and the
268
- concurrent shared-world getHost plane, or connected to an external catch on
269
- app-url/operator-provided subjects; unwired on sequential `concurrency: 1`
270
- shared worlds): off-app
289
+ - `comms` (#297; hosted on the clone/local-tree computer-use route and the
290
+ shared-world getHost plane, or connected to an external catch on
291
+ app-url/operator-provided subjects): off-app
271
292
  email the app itself sends, made a persona-driven testable surface. Lab
272
293
  configuration rejects `comms.sms` and unknown channel names; message-bus SMS
273
294
  types do not imply a supported SMS execution route. SMTP capture is supported
274
- on per-lane provisioned routes and rejected for shared-world studies.
275
- `comms.email` = `{ kind: fake, injectEnv?, port?, recipients?, linkOrigin?, external? }`.
295
+ on provisioned routes with separate worlds and rejected for shared-world studies.
296
+ `comms.email` = `{ kind: fake, injectEnv?, port?, smtp?, recipients?, linkOrigin?, external? }`.
276
297
  `injectEnv` is the ADOPTER-NAMED env var the app reads for its email-API base
277
298
  URL (e.g. `RESEND_API_URL`); the harness sets it to an in-sandbox catch (so it
278
299
  is NOT declared in `subject.env`) that captures the app's sends without touching
279
- the internet — verify the app actually reads that variable, because a run whose
300
+ the internet. Verify the app actually reads that variable, because a run whose
280
301
  catch captured zero sends warns at teardown for exactly that. `kind` must be
281
- `fake` (`real`/provider-backed is rejected until implemented); `port` ≤ 65534
302
+ `fake`; a real inbox names a saved `comms.email.connection` instead; `port` ≤ 65534
282
303
  (the catch reserves `port+1` for the read-only inbox listener the shared-world
283
304
  route getHost-exposes). `recipients[]` = `{ lane, address? }`: OMIT the list
284
- and the parser fills one deterministic address per lane
285
- (`<laneId>@example.test`) so every seat can do email (#351). When declared, a
286
- `lane` must be one of the lab's real lane ids (roster ids, or the generated
287
- `lane-01..lane-NN` under `count`) — an unknown lane is a hard parse error
288
- listing them, zero addressed lanes is a hard error, partial coverage warns
289
- with the uncovered lanes. Each addressed lane's actor prompt is extended with
305
+ and the parser fills one deterministic address per participant
306
+ (`<laneId>@example.test`) so every participant can do email (#351). When declared, a
307
+ `lane` must be one of the lab's real participant ids (roster ids, or the generated
308
+ `lane-01..lane-NN` under `count`). An unknown participant id is a hard parse error
309
+ listing them, zero addressed participants is a hard error, partial coverage warns
310
+ with the uncovered participants. Each addressed participant's actor prompt is extended with
290
311
  the full handoff: its address ("enter exactly that"), the inbox URL, and the
291
312
  wait steering ("waiting for an email is normal, not a blocker").
292
313
  `external` (#328) switches the funnel to an ADOPTER-HOSTED catch, which is what
293
314
  makes comms work on planes humanish does not provision (app-url /
294
315
  operator-provisioned): `{ catchBaseUrl, inboxBaseUrl?, authTokenEnv? }`. The
295
- operator runs the catch — `humanish comms catch` runs the same implementation
296
- humanish deploys in-sandbox, so the capture shape, inbox surface, and drain
297
- contract cannot drift between the two planes — and points their own app's
298
- email-API base URL at it. `injectEnv` is then absent and meaningless, since
316
+ operator runs the catch and points their own app's email-API base URL at it.
317
+ `humanish comms catch` runs the same implementation humanish deploys
318
+ in-sandbox, so the capture shape, inbox surface, and drain contract cannot
319
+ drift between the two planes. `injectEnv` is then absent and meaningless, since
299
320
  there is no subject env for humanish to inject. humanish keeps every other
300
- part: per-lane addresses, the injected inbox handoff, a fail-closed readiness
321
+ part: per-participant addresses, the injected inbox handoff, a fail-closed readiness
301
322
  probe before any actor spend (GET /health must return the
302
323
  `humanish-comms-catch` marker, so a proxy answering 200 for everything cannot
303
324
  pass for a catch), the teardown drain over `GET /deliveries`, and the same
304
325
  digest-only evidence. `authTokenEnv` names an env var holding a bearer token
305
- for the drain read — the NAME is recorded as evidence, the value never
326
+ for the drain read. The NAME is recorded as evidence; the value never
306
327
  persists. Declaring `external` on a harness-provisioned subject warns: two
307
328
  catches would exist and the app would point at humanish's own. `linkOrigin`
308
329
  is an optional operator-declared origin the app bakes into links when it
309
330
  differs from the serve origin; the harness rewrites captured links through it
310
331
  so a clicked link resolves to a reachable host. Captured mail is drained into a
311
332
  digest-only `humanish.comms-thread.v1` artifact (from/to/subject/link DIGESTS +
312
- an OTP COUNT — no raw address/link/code persists); the READABLE proof a
333
+ an OTP COUNT; no raw address/link/code persists). The READABLE proof a
313
334
  persona saw the email is its screenshots of the inbox page. Requires `python3`
314
335
  in the subject sandbox (the stock E2B desktop template has it).
315
336
 
@@ -356,28 +377,30 @@ run local-only regardless of screenshot redaction. See the
356
377
  [receiving contract](../architecture/real-email-receiving.md).
357
378
 
358
379
  Lab backends report results in their own schemas (`humanish.run-result.v1`,
359
- `humanish.oss-lab-result.v1`, `humanish.oss-meta-lab-result.v1`,
360
380
  `humanish.cua-lab-result.v2`, `humanish.scripted-lab-result.v1`,
361
- `humanish.terminal-lab-result.v1`); the evidence record stays
381
+ `humanish.terminal-lab-result.v1`,
382
+ `humanish.concurrent-shared-world-lab-result.v1`); the evidence record stays
362
383
  `humanish.run-bundle.v1` in every case. The computer-use result bumped to v2 for
363
- fan-out: it carries `plan` (the pre-flight lane table — concurrency, waves,
364
- per-lane session budget, worst-case sandbox-minutes), `lanes[]` (ALWAYS present,
365
- length 1 at N=1; per-lane status/session/sandbox/subject), and `laneSummary`
366
- (passed/skipped/harnessError/hollow counts). The top-level `session`/`sandbox`
367
- mirror the first lane and `subject.commit` is unanimity-gated across lanes
368
- (omitted with a divergence warning when lanes resolve different commits). At N=1
384
+ fan-out: it carries `plan` (the pre-flight participant table: concurrency, waves,
385
+ per-participant session budget, worst-case sandbox-minutes), `lanes[]` (ALWAYS present,
386
+ length 1 at N=1; per-participant status/session/sandbox/subject), and `laneSummary`
387
+ (passed/skipped/harnessErrors/hollow counts). The top-level `session`/`sandbox`
388
+ mirror the first participant and `subject.commit` is unanimity-gated across participants
389
+ (omitted with a divergence warning when participants resolve different commits). At N=1
369
390
  the run bundle is byte-stable with the pre-fan-out output; only the result
370
391
  projection changed. A fan-out run records a `cua-lab.fanout.plan` bundle event
371
- (and a `cua-lab.fanout.fail-fast` event when a harness error skips queued lanes);
372
- `ok = observer.ok ∧ no skipped lane ∧ all lanes terminal ∧ no harness error ∧ no
373
- hollow lane`.
392
+ (and a `cua-lab.fanout.fail-fast` event when a harness error skips queued participants);
393
+ `ok = observer.ok ∧ every participant ok ∧ no failed adapter or declared-scorer verdict`,
394
+ where a dry-run participant is ok as contract evidence and a live participant must pass
395
+ `participantPassed` (`src/run/judge.ts`): not skipped, status `passed`, no harness
396
+ error, engaged, and no self-reported blocker.
374
397
 
375
- Explicit failed-lane reruns are supported on the CUA fan-out route via
398
+ Explicit failed-participant reruns are supported on the CUA fan-out route via
376
399
  `humanish lab run <lab> --rerun-failed-from <run-id> [--lanes lane-a,lane-b]`.
377
- The source run must be a live CUA fan-out bundle. Humanish creates a NEW run for
378
- the selected failed/blocked/timed-out/hollow lanes (or explicit lane ids), leaves
400
+ The source run must be a live CUA fan-out bundle. humanish creates a NEW run for
401
+ the selected failed/blocked/timed-out/hollow participants (or explicit participant ids), leaves
379
402
  the source verdict unchanged, and records lineage as `run.rerun` plus a
380
- `cua-lab.fanout.rerun` event: source run id, selected lane ids, and previous lane
403
+ `cua-lab.fanout.rerun` event: source run id, selected participant ids, and previous participant
381
404
  statuses/reasons. This is intentionally not automatic retry; a passing rerun is a
382
405
  nondeterminism candidate for human/product scoring, not a rewrite of the old run.
383
406
 
@@ -407,8 +430,9 @@ defaults:
407
430
 
408
431
  ## Run Bundle
409
432
 
410
- Run bundles are the canonical evidence record. Observer data, review Markdown,
411
- feedback drafts, and issue text are projections from the bundle.
433
+ Run bundles are the evidence record. Observer data, review Markdown, feedback
434
+ drafts, and issue text are projections from the bundle
435
+ ([decision 0001](../decisions/0001-run-bundle-is-the-source-of-truth.md)).
412
436
 
413
437
  Core-owned fields:
414
438
 
@@ -417,6 +441,7 @@ Core-owned fields:
417
441
  - `mode`
418
442
  - `simCount`
419
443
  - `createdAt`
444
+ - `cwd` (always `[target-cwd]`)
420
445
  - `artifactRoot`
421
446
  - `source.git`
422
447
  - `lifecycle`
@@ -427,40 +452,41 @@ Core-owned fields:
427
452
  - `artifacts`
428
453
  - `review`
429
454
  - `feedbackCandidates`
430
- - `lab` (optional, additive): which manifest produced the run —
455
+ - `lab` (optional, additive): which manifest produced the run,
431
456
  `{ id, path?, origin? }`, where `origin` is `committed` (humanish/labs),
432
457
  `ignored` (a local overlay), or `explicit` (a path the operator passed).
433
458
  Absent on bundles written before this contract and on library callers who
434
- hand a `LabConfig` directly — the run is then honestly lab-less rather than
435
- guessed. Readers wanting attribution for an older bundle may fall back to
459
+ hand a `LabConfig` directly. Such a run has no lab, and nothing guesses
460
+ one. Readers wanting attribution for an older bundle may fall back to
436
461
  `inferLegacyLabId`, which reads only the historical
437
462
  `persona.source = "lab:<id>"` convention and nothing else.
438
- - `subject` (optional, additive): structured subject provenance —
463
+ - `subject` (optional, additive): structured subject provenance,
439
464
  `{ source: clone | app-url | local-tree, repo?, commit?, archiveSha256?,
440
- dirty?, envNames?, state }` where `state` is `{ provenance: seeded |
441
- unpinned | declared-not-run | undeclared, seed?: [{ name, when,
442
- commandDigest, ok?, exitCode?, timedOut?, durationMs? }], externalEnvNames?
443
- }`. Emitted by the computer-use backend; absent on pre-existing and other
444
- backends' bundles. `repo`/`commit` are clone-route fields; `archiveSha256`
465
+ dirty?, envNames?, state }` where `state` is `{ provenance: seeded |
466
+ unpinned | declared-not-run | undeclared | external-public, seed?: [{ name, when,
467
+ commandDigest, ok?, exitCode?, timedOut?, durationMs? }], externalEnvNames?
468
+ }`. Emitted by the computer-use and shared-world backends and the clone
469
+ scripted-browser route; absent on pre-existing and other bundles. `repo`/`commit` are clone-route fields; `archiveSha256`
445
470
  (64-hex sha256, the local-tree provenance pin) and `dirty` (host git
446
471
  porcelain status at pack time) are local-tree-route fields, additive under
447
472
  `humanish.run-bundle.v1`: a dirty working tree cannot be commit-pinned, so
448
473
  the archive content digest stands in for it. `commandDigest` is the
449
- sha256-16 of the exact seed command — command text and env values never
474
+ sha256-16 of the exact seed command; command text and env values never
450
475
  appear. `humanish verify` fails closed when a LIVE `local-tree` bundle carries
451
476
  no well-formed `archiveSha256`, in addition to the existing `subject state
452
- provenance` check.
477
+ provenance` check.
453
478
  - `desktopTemplate` (optional, additive): the custom E2B desktop TEMPLATE (image)
454
- the run's sandbox(es) launched on, from `execution.desktop.template` — so the
479
+ the run's sandbox(es) launched on, from `execution.desktop.template`, so the
455
480
  evidence shows WHICH image ran. Present only when a template was configured;
456
481
  absent == the stock `desktop` template, so every pre-existing bundle is
457
482
  byte-stable. Public-safe (a template name is not a secret).
458
483
  - `attributionClass` (optional, additive): `isolated | shared-world`. Absent ==
459
- `isolated`, so every existing bundle is byte-stable. The interaction-attribution
460
- honesty axis (#164) — ORTHOGONAL to the persona-sampling evidence classes. Set
461
- to `shared-world` by the shared-world backend, paired with `sharedWorld`.
484
+ `isolated`, so every existing bundle is byte-stable. It is the
485
+ interaction-attribution axis (#164), independent of the persona-sampling
486
+ evidence classes. Set to `shared-world` by the shared-world backend, paired
487
+ with `sharedWorld`.
462
488
  - `sharedWorld` (optional, additive): the shared-world evidence block
463
- (`humanish.shared-world.v1`) — see [Shared-World Evidence](#shared-world-evidence)
489
+ (`humanish.shared-world.v1`); see [Shared-World Evidence](#shared-world-evidence)
464
490
  below. Present only on shared-world runs; verified fail-closed by the
465
491
  `shared-world evidence` check in `humanish verify`.
466
492
 
@@ -472,7 +498,7 @@ Adapter-owned fields:
472
498
  - `scenario`
473
499
  - target-specific stream labels and public-safe summaries
474
500
 
475
- Synthetic fixture:
501
+ Abbreviated synthetic fixture (omits `cwd`, `simulations`, `streams` and `events`):
476
502
 
477
503
  ```yaml
478
504
  schema: humanish.run-bundle.v1
@@ -531,80 +557,89 @@ feedbackCandidates: []
531
557
 
532
558
  ## Shared-World Evidence
533
559
 
534
- The shared-world topology (#164) is the DECLARED override of the per-lane-worlds
560
+ The shared-world topology (#164) is the DECLARED override of the `per-lane-worlds`
535
561
  default: N distinct actor ROLES drive ONE provisioned, mutable service plane (one
536
562
  app + one seeded DB) so their actions interact through shared state. The ONE
537
563
  subject plane is provisioned via `subject.source: clone` (a fresh `git clone`) or
538
564
  `subject.source: local-tree` (the operator's own working tree, packed on the host
539
565
  and provisioned in-sandbox in place of a clone - see `subject.localTree` above);
540
- both sources are accepted on the sequential AND concurrent shared-world routes. A
541
- shared-world bundle adds TWO additive, optional fields to `humanish.run-bundle.v1`
566
+ both sources are accepted on the shared-world route.
567
+
568
+ Current runs write only the CONCURRENT shape below. The SEQUENTIAL shape came from the
569
+ sequential shared-world route, which 0.106.0 removed. Only bundles written before
570
+ 0.106.0 carry it, and `humanish verify` still checks them
571
+ (`tests/run/legacy-sequential-shared-world.test.ts`). The SEQUENTIAL rules below apply
572
+ to those bundles.
573
+
574
+ A shared-world bundle adds TWO additive, optional fields to `humanish.run-bundle.v1`
542
575
  (absent on every other bundle, so they stay byte-stable):
543
576
 
544
- - `attributionClass: isolated | shared-world` — a new, ORTHOGONAL honesty axis
577
+ - `attributionClass: isolated | shared-world`: a separate attribution axis
545
578
  ("how well did the run attribute INTERACTION?"), distinct from the persona-sampling
546
579
  evidence classes ("how representative is the actor?"). Absent == `isolated`.
547
580
  - `sharedWorld` (`humanish.shared-world.v1`): TWO variants discriminated by
548
- `topologyMode: "sequential" | "concurrent"` (validateSharedWorldEvidence branches on
581
+ `topologyMode: "sequential" | "concurrent"` (`sharedWorldEvidenceFindings` in `src/verify/shared-world.ts` branches on
549
582
  it FIRST; unknown/missing or a mismatched shape fails closed). Common fields:
550
583
  - `topology: shared-world`
551
584
  - `topologyMode: sequential | concurrent`
552
- - `roleCount` — the DECLARED number of role/persona seats.
553
- - `plane: { commit?, seedDigest, envNames, hostDigest?, exposure?, publicOriginDigest? }` — the ONE
585
+ - `roleCount`: the DECLARED number of participants.
586
+ - `plane: { commit?, seedDigest, envNames, hostDigest?, exposure?, publicOriginDigest?, declaredOriginDigest? }`: the ONE
554
587
  shared-plane provenance. `seedDigest` is the sha256-16 of the ordered seed-step
555
588
  command digests (the seed RECIPE identity, not the runtime state); `envNames` are
556
589
  NAMES only. `hostDigest`/`exposure` are CONCURRENT provisioned-getHost-only, and
557
590
  `publicOriginDigest` is CONCURRENT external-public-only (below).
558
591
  - `planeClass?: provisioned-getHost | external-public` and `lobbyConvergenceDigest?` are
559
592
  CONCURRENT-only (below); both absent on the sequential shape.
560
- - `attributionLimits: [...]` — the verify-enforced attribution ceiling (the set
593
+ - `attributionLimits: [...]`: the verify-enforced attribution ceiling (the set
561
594
  differs per `topologyMode`, below).
562
595
 
563
- SEQUENTIAL shape (`topologyMode: sequential`, #164 PR1):
564
- - `sequence: [roleId, …]` — the role ids that actually took a turn, in declared order.
565
- - `skippedTail` (optional, live sequential only) — `{ afterRoleId, roles,
566
- cause, maxTotalUsd?, estimatedTotalUsd? }`. Each ordered `roles` entry names
596
+ SEQUENTIAL shape (`topologyMode: sequential`, #164 PR1; only in bundles written before
597
+ 0.106.0):
598
+ - `sequence: [roleId, …]`: the role ids that actually took a turn, in declared order.
599
+ - `skippedTail` (optional, live sequential only): `{ afterRoleId, roles,
600
+ cause, maxTotalUsd?, estimatedTotalUsd? }`. Each ordered `roles` entry names
567
601
  `{ roleId, simId, streamId }` for an unstarted participant. Together with the
568
602
  executed prefix it must account for the full declared denominator. The
569
603
  predecessor must have a matching `harness_error`, explicit `session_error`,
570
604
  `usage_unreported`, or measured `study_spend_limit`. Only the last cause
571
605
  carries budget figures, using the same per-participant estimates as the
572
- tracker. Blocked seats need matching simulation, stream and blocked-event
606
+ tracker. Blocked participants need matching simulation, stream and blocked-event
573
607
  evidence, with no actor, trace, screenshot or invented timeline turn.
574
608
  Historical bundles without this field still require every role in the timeline.
575
- - `timeline: (checkpoint | turn)[]` — a harness-clocked, strictly alternating
609
+ - `timeline: (checkpoint | turn)[]`: a harness-clocked, strictly alternating
576
610
  timeline that starts `cp-baseline`, alternates checkpoint → turn → checkpoint,
577
611
  and ends on a checkpoint:
578
- - checkpoint = `{ kind: checkpoint, name, digest, deltaFromPrev }` — `digest` is
612
+ - checkpoint = `{ kind: checkpoint, name, digest, deltaFromPrev }`; `digest` is
579
613
  sha256-16(scrub+redact(probe stdout)); the record is DIGEST-ONLY (no
580
614
  value-shaped field). `deltaFromPrev` is true when the observed state changed
581
615
  across the intervening turn.
582
- - turn = `{ kind: turn, roleId, simId, streamId, commit?, seedDigest }` — references
583
- a real RunSimulation/RunStream; carries the plane provenance it observed
584
- (identical across turns by construction — the single-plane proof).
616
+ - turn = `{ kind: turn, roleId, simId, streamId, commit?, seedDigest }` references
617
+ a real `RunBundle["simulations"][number]` and `RunBundle["streams"][number]`; carries the
618
+ plane provenance it observed
619
+ (identical across turns by construction; this is the single-plane proof).
585
620
  - Sequential `attributionLimits` MUST contain `sequential-only`, `no-concurrent-races`,
586
621
  and `delta-attributed-to-turn-not-action`.
587
622
 
588
- CONCURRENT shape (`topologyMode: concurrent`, #164 phase 2 — N personas drive ONE
623
+ CONCURRENT shape (`topologyMode: concurrent`, #164 phase 2: N personas drive ONE
589
624
  getHost-exposed plane AT ONCE; NO `timeline`/`sequence`):
590
- - `plane.hostDigest` — sha256-16 of the harness-minted `getHost` ORIGIN every actor
591
- drove (a first-class provisioned-subject target — invariant 2). A DIGEST, not the raw
625
+ - `plane.hostDigest`: sha256-16 of the harness-minted `getHost` ORIGIN every actor
626
+ drove (a first-class provisioned-subject target; invariant 2). A DIGEST, not the raw
592
627
  URL: a getHost URL embeds the live sandbox id and matches the publish-safety e2b-URL
593
628
  redaction, so it never lands raw in a published bundle (the raw tokenless URL is
594
629
  surfaced only on the ephemeral lab result). The orchestrator confirms the URL is
595
- TOKENLESS (no authKey — invariant 1) before digesting.
596
- - `plane.exposure: synthetic` — the REQUIRED author attestation that the subject behind
630
+ TOKENLESS (no authKey; invariant 1) before digesting.
631
+ - `plane.exposure: synthetic`: the REQUIRED author attestation that the subject behind
597
632
  the internet-reachable getHost URL is synthetic seeded data (author-trust + a
598
633
  provenance gate, NOT a no-real-data guarantee).
599
634
  - `laneWindows: [{ roleId, simId, streamId, startedAt, endedAt, verdict, routeHostDigest,
600
- commit?, seedDigest }]` — one harness-clocked window per actor; OVERLAPPING windows
635
+ commit?, seedDigest }]`: one harness-clocked window per actor; OVERLAPPING windows
601
636
  prove ≥2 personas were active simultaneously. `routeHostDigest` == `plane.hostDigest`
602
637
  (every actor drove exactly the harness-minted host).
603
- - `stateSeries: [{ timestamp, digest }]` — cadence digests of the shared world under
638
+ - `stateSeries: [{ timestamp, digest }]`: cadence digests of the shared world under
604
639
  load (baseline + periodic + final). DIGEST-ONLY: the allowed-keys tripwire permits
605
- ONLY `timestamp` + `digest` (no per-delta→actor field — causation under concurrency is
606
- structurally inexpressible).
607
- - `outcomes: [{ roleId, simId, streamId, status, completionReason?, ok }]` — per-persona
640
+ ONLY `timestamp` + `digest` (no per-delta→actor field, because causation under concurrency
641
+ is structurally inexpressible).
642
+ - `outcomes: [{ roleId, simId, streamId, status, completionReason?, ok }]`: per-persona
608
643
  OUTCOME (the "M of N succeeded" headline).
609
644
  - Concurrent `attributionLimits` MUST contain `concurrent`,
610
645
  `best-effort-causal-attribution`, `non-deterministic-shared-state`,
@@ -619,12 +654,12 @@ end on a checkpoint, turn order == sequence, sequence length == roleCount == tur
619
654
  count, no `laneWindows`); every turn's simId/streamId resolves; every checkpoint digest
620
655
  is sha256-16 with NO value-shaped field; all turns share ONE plane provenance; the
621
656
  mandatory limits are present; and a PASSED run shows ≥1 checkpoint `deltaFromPrev` (the
622
- delta-on-pass gate). CONCURRENT: no `timeline`; laneWindows + stateSeries + outcomes
623
- cover exactly roleCount; the required limits are present AND the forbidden ones absent;
657
+ delta-on-pass gate). CONCURRENT: no `timeline`; laneWindows and outcomes each
658
+ cover exactly roleCount and stateSeries is present; the required limits are present AND the forbidden ones absent;
624
659
  `plane.hostDigest` present and every `routeHostDigest` equals it (invariant 2);
625
660
  `plane.exposure == synthetic` AND `subject.state.provenance == seeded` (the
626
661
  synthetic-subject gate); stateSeries snapshots are digest-only (allowed-keys tripwire);
627
- all laneWindows share ONE plane provenance; and the CONCURRENCY-ON-PASS gate — a PASSED
662
+ all laneWindows share ONE plane provenance; and the CONCURRENCY-ON-PASS gate: a PASSED
628
663
  run MUST show ≥2 overlapping laneWindows AND a stateSeries delta whose timestamp is
629
664
  AT/AFTER an overlap interval start (otherwise it was not actually concurrent, or the
630
665
  world never changed under load). The per-role no-engagement guard applies to both.
@@ -633,8 +668,8 @@ detector lands.
633
668
 
634
669
  WHAT THE BUNDLE CAN / CANNOT CLAIM. SEQUENTIAL: each role's own behavior at full
635
670
  fidelity; the OBSERVED system outcome as an ordered DIGEST sequence; and the
636
- SEQUENCED-INTERACTION proof (role B entered a world already containing role A's mutation
637
- — the checkpoint after A strictly precedes B's turn). It CANNOT claim action-granular
671
+ SEQUENCED-INTERACTION proof (role B entered a world already containing role A's mutation;
672
+ the checkpoint after A strictly precedes B's turn). It CANNOT claim action-granular
638
673
  causation, concurrency/races (sequential-only), or exact-state determinism. CONCURRENT:
639
674
  each persona's own behavior at full fidelity; per-persona OUTCOME against the contended
640
675
  world ("M of N"); PROVEN CONCURRENCY (overlapping windows); and system-state evolution
@@ -653,31 +688,33 @@ The CONCURRENT shape carries a PLANE-class discriminator, `sharedWorld.planeClas
653
688
  concurrent bundle byte-stable). It gates EVERY getHost-specific verify assertion, so a getHost
654
689
  claim can never leak onto the external-public class (or vice versa).
655
690
 
656
- - `provisioned-getHost` — the historical plane described above: a `clone`/`local-tree` subject the
691
+ - `provisioned-getHost`: the historical plane described above: a `clone`/`local-tree` subject the
657
692
  harness serves + getHost-exposes in-sandbox. The harness MINTED the host, so it asserts the
658
693
  synthetic-seeded attestation (`plane.exposure: synthetic` + `subject.state.provenance == seeded`),
659
694
  the harness-minted host identity (`plane.hostDigest`, every `routeHostDigest == it`), and an
660
695
  authoritative in-sandbox checkpoint `stateSeries` with a delta-on-pass.
661
696
 
662
- - `external-public` — a real, operator-OWNED public deployment used DIRECTLY as the shared plane
697
+ - `external-public`: a real, operator-OWNED public deployment used DIRECTLY as the shared plane
663
698
  (`subject.source: app-url` + `topology: shared-world` + `policies.allowPublicTargets: true` +
664
699
  `execution.concurrency > 1`). NO getHost, NO clone, NO subject sandbox, NO seed. The subject
665
- carries the ownership attestation `subject.publicTarget: { owner, authorized: true }` (the honest
666
- analog of `exposure: synthetic` — you cannot attest synthetic on a real site, but you MUST attest
700
+ carries the ownership attestation `subject.publicTarget: { owner, authorized: true }` (the
701
+ analog of `exposure: synthetic`: you cannot attest synthetic on a real site, but you MUST attest
667
702
  you own/operate it; author-trust, unverifiable by the harness). Evidence deltas, all
668
703
  asserted-absent (never silently dropped):
669
- - `plane.publicOriginDigest` — sha256-16 of the operator-DECLARED origin. Every
670
- `laneWindow.routeHostDigest` (computed from that seat's CDP-OBSERVED final-URL origin) equals it.
671
- This proves inter-seat CONVERGENCE on one declared origin, NOT harness control of the plane
704
+ - `plane.publicOriginDigest`: sha256-16 of the one OBSERVED origin the participants converged on. Every
705
+ `laneWindow.routeHostDigest` (computed from that participant's CDP-OBSERVED final-URL origin) equals it.
706
+ `plane.declaredOriginDigest` records the operator-declared origin as evidence only; a redirect
707
+ can make the two differ. This proves inter-participant CONVERGENCE on one origin, NOT harness control of the plane
672
708
  (WEAKER than getHost's `hostDigest`, and disclosed).
673
- - `plane.exposure` is ABSENT (verify fails closed if `synthetic` appears — a lie on a real site);
709
+ - `plane.exposure` is ABSENT (verify fails closed if `synthetic` appears, since that
710
+ attestation would be false on a real site);
674
711
  `plane.hostDigest` is ABSENT (the harness minted no host).
675
- - `subject.state.provenance == "external-public"` — NOT `seeded`, NOT `unpinned`, NOT `undeclared`.
712
+ - `subject.state.provenance == "external-public"` (never `seeded`, `unpinned` or `undeclared`).
676
713
  - `stateSeries` is OMITTED (Option A): no in-sandbox filesystem to authoritatively digest, so there
677
714
  is NO authoritative shared-state proof. Concurrency-on-pass is RELAXED to temporal co-occupancy
678
715
  ONLY (≥2 overlapping `laneWindows`); there is no state-delta requirement.
679
- - `lobbyConvergenceDigest` (optional, strong, cheap) — sha256-16 of the shared `/lobby/CODE` PATH
680
- all seats' CDP URLs converged on; present only when every seat converged on ONE code. Digest-only
716
+ - `lobbyConvergenceDigest` (optional, strong, cheap): sha256-16 of the shared `/lobby/CODE` PATH
717
+ all participants' CDP URLs converged on; present only when every participant converged on ONE code. Digest-only
681
718
  (the raw 6-char code and full URLs are runtime-only and never land).
682
719
  - `attributionLimits` MUST contain the concurrent family PLUS `external-public-plane`,
683
720
  `operator-attested-target-not-harness-controlled`, `no-synthetic-attestation`,
@@ -687,7 +724,7 @@ claim can never leak onto the external-public class (or vice versa).
687
724
  The getHost synthetic gate is deliberately NOT reachable from the app-url branch, and why: that gate
688
725
  exists because getHost is internet-reachable AND harness-owned (real data behind a harness-exposed
689
726
  URL is the hazard). A public site the harness neither provisioned nor exposed has neither property,
690
- so the gate's hazard does not exist there. Attribution stays `shared-world` (N seats, ONE plane); the
727
+ so the gate's hazard does not exist there. Attribution stays `shared-world` (N participants, ONE plane); the
691
728
  plane-control claim degrades from "harness-controlled" to "operator-attested, observed-only".
692
729
 
693
730
  ## Adapter
@@ -766,6 +803,37 @@ scenario:
766
803
  expectation: Verification passes without private data.
767
804
  ```
768
805
 
806
+ ### Rich persona context
807
+
808
+ `humanish.persona.v1` supports optional multiline `background` (maximum 32,768
809
+ UTF-8 bytes). It preserves paragraph breaks and is included in autonomous
810
+ participant prompts. Invalid, empty or oversized backgrounds reject execution;
811
+ existing marker/control-character sanitization still applies. Unknown persona
812
+ fields and shortened legacy fields produce diagnostics. `summary` remains a
813
+ 280-character description; constraints retain their eight-item/160-character
814
+ bounds with warnings.
815
+
816
+ Profiles with background do not acquire implicit patience or skill directives.
817
+ Explicit traits still apply, with a reminder to review possible prose conflicts.
818
+ Legacy profiles retain medium defaults. `none_declared`/`none` access needs are
819
+ omitted. `keyboard_first` allows pointer fallback; `keyboard_only` does not.
820
+ These are prompt instructions, not evidence that a participant complied.
821
+
822
+ `humanish lab inspect` adds `personas: [{ id, resolved, brief? }]`. A brief contains
823
+ `compilerVersion`, persona-section `text`, its pre-redaction `digest`, `redacted`,
824
+ and an optional source-file `sourceDigest`. It excludes task criteria and runtime
825
+ grants. This is authored context; whether a selected actor consumes it depends on
826
+ that route. Scripted checks do not become autonomous studies by declaring a persona.
827
+
828
+ Supported autonomous traces retain the same optional `persona.brief`; old traces
829
+ remain readable without it. Known provisioned values and recognized secret/path
830
+ patterns are scrubbed before persistence. The redacted projection is not an exact
831
+ prompt, and pattern scanning is not a personal-information detector. Recorded
832
+ computer-use context hints are notice items titled `Participant context hint`.
833
+ These disclose guidance supplied on turns that returned a provider response.
834
+ Failed requests may have uncertain delivery and are not included in this list.
835
+ Hints are not participant observations or proof of friction.
836
+
769
837
  ## Actor Trace
770
838
 
771
839
  Failed account participant requests may include an optional `failurePhase` in
@@ -776,50 +844,56 @@ separate dispatch, usage, or cleanup evidence, and does not establish the cause
776
844
  of a timeout. Participant outcome text includes the phase when available.
777
845
 
778
846
  Actors execute or simulate the trial. Actor evidence is the provider-neutral
779
- `humanish.actor-trace.v1` (`src/actor-contract.ts`): Codex app-server items,
780
- Claude Agent SDK blocks, pi events, computer-use cycles, scripted browser
781
- steps, and in-sandbox terminal-agent exec output all map onto one `ActorTrace`.
782
- Registered actors live in
783
- `src/actor-registry.ts` (`codex-app-server`, `pi-agent-core`,
784
- `claude-agent-sdk`, `openai-computer-use`, `scripted-browser`, `codex-exec`).
785
- There is no `humanish.actor.v1`; that name never shipped.
847
+ `humanish.actor-trace.v1` (`src/actors/contract.ts`): Codex app-server items,
848
+ computer-use cycles, scripted browser steps, and in-sandbox terminal-agent exec
849
+ output all map onto one `ActorTrace`. Registered actors live in
850
+ `src/actors/registry.ts` (`codex-app-server`, `openai-computer-use`,
851
+ `local-agent`, `scripted-browser`, `codex-exec`). A lab that names
852
+ `pi-agent-core` or `claude-agent-sdk` fails to parse. There is no
853
+ `humanish.actor.v1`; that name never shipped.
786
854
 
787
855
  Core-owned fields:
788
856
 
789
857
  - `schema`
790
858
  - `provider` / `providerVersion`
791
- - `protocol` (`json-rpc` | `json-stream` | `in-process-sdk` | `cua-loop` |
792
- `scripted-steps` | `terminal-exec`)
793
- - `lane` (`code` | `app` | `computer-use` | `scripted-browser` | `terminal`)
859
+ - `protocol` (`json-rpc` | `json-stream` | `cua-loop` | `scripted-steps` |
860
+ `terminal-exec`)
861
+ - `lane` (`code` | `computer-use` | `scripted-browser` | `terminal`)
794
862
  - `persona` (`id`, `traitsApplied`, `promptDigest`)
795
863
  - `capabilities.keyPlacement` (`external` | `in-sandbox-command-scoped`): WHERE
796
- the actor's runtime key lives — registry metadata the engine enforces. The
864
+ the actor's runtime key lives. It is registry metadata the engine enforces. The
797
865
  terminal agent declares `in-sandbox-command-scoped` (the agent-under-test runs
798
866
  inside the sandbox); every other actor is `external` (absent === external).
799
867
  - `redaction` (`status`, `screenshots: n/a|raw|blurred|ocr_scrubbed`, `notes`)
800
868
  - `startedAt` / `completedAt` / `durationMs`
801
869
  - `status` / `completionReason` / `reason` (`completionReason` includes
802
- `step_failed`: a deterministic scripted step/expectation evaluated false —
803
- the subject failed the script while the harness executed faithfully; and
804
- `budget_reached`: a computer-use session stopped by its time or estimated
805
- spend budget, or an explicit provider token limit — status `incomplete`.
806
- The `reason` distinguishes these causes; none establishes that the goal was
807
- reached. `timed_out` remains the zero-progress wall-clock deadline outcome)
870
+ `step_failed`: a deterministic scripted step/expectation evaluated false,
871
+ meaning the subject failed the script while the harness executed faithfully; and
872
+ `budget_reached`: a computer-use session ended by a limit. The loop
873
+ (`src/actors/computer-use/loop/ending.ts`) emits it when the time budget runs
874
+ out after at least one material action, when `execution.caps.maxUsd` or the
875
+ study's shared spend threshold is crossed, when the adapter reports a local
876
+ admission limit, or when the provider hits its output or context token limit.
877
+ Every `budget_reached` session has status `incomplete`
878
+ (`statusForCompletionReason` in `src/actors/computer-use/loop/trace.ts`), and
879
+ `stopCause` names the limit. Other incomplete provider responses end as
880
+ `harness_error`. None of these establishes that the goal was reached.
881
+ `timed_out` remains the zero-progress wall-clock deadline outcome)
808
882
  - `ids`, `counts`, `items[]`, optional `tokenUsage`, `capabilities`. `tokenUsage`
809
883
  may carry `cacheWriteInput` (tokens billed at the provider's cache-write rate,
810
884
  OpenAI 5.6+) and `turns[]` (per provider-request usage, the recorded fact
811
- long-context tier pricing needs) — both additive and honestly absent on
885
+ long-context tier pricing needs). Both are additive and absent on
812
886
  producers that do not report them (#334). Items may
813
887
  carry `at` (ISO-8601 recording stamp from the loop's clock) and, on
814
- click-like `ui_action` items, structured `coord` (`x`/`y`) — both additive
888
+ click-like `ui_action` items, structured `coord` (`x`/`y`). Both are additive
815
889
  (#441): absent on older bundles and non-stamping producers, and absence means
816
890
  "timing/position unrecorded", never zero
817
891
  - optional `modelSettings` (`humanish.model-settings.v1`, #497): HOW the model was
818
892
  asked to run, alongside `ids.model` which says which model it was.
819
893
  `reasoningEffort` records the value the request ACTUALLY carried,
820
- including the provider default when a lab declared nothing — the resolved
821
- value is what produced the trace, so reporting it is honest where reporting
822
- "unset" would not be. Absent when a provider declares no settings and on every
894
+ including the provider default when a lab declared nothing. The resolved
895
+ value is what produced the trace, and recording "unset" would misdescribe
896
+ the run. Absent when a provider declares no settings and on every
823
897
  pre-existing bundle; tolerated by verify. It exists because effort was
824
898
  unreachable from a lab, which made every run take the default silently. Effort
825
899
  is part of WHO the participant was rather than of how the instrument was tuned
@@ -827,19 +901,28 @@ Core-owned fields:
827
901
  half its sample description
828
902
  - optional `modelSettings.maxOutputTokens`: the declared positive integer
829
903
  `actors[0].maxOutputTokens`, passed to every first-party OpenAI CUA response
830
- request, including reasoning output. Absent when undeclared, with no default
831
- change. Closing reports use `min(maxOutputTokens, 1024)`. Unsupported routes,
832
- custom provider/session hooks, and per-lane overrides fail before allocation.
904
+ request, including reasoning output. Absent when undeclared. The first request
905
+ of a session and closing reports use `min(maxOutputTokens, 1024)`, or 1024 when
906
+ undeclared; the first request also carries the opening screenshot as an
907
+ `input_image` after the instructions. Unsupported routes,
908
+ custom provider/session hooks, and per-participant overrides fail before allocation.
833
909
  This is an output-token limit, not an input-token, request-count or billing cap.
910
+ A reply cut off by it runs no action. The first-party OpenAI provider sets that
911
+ reply aside, and the loop sends the same request once more after booking the
912
+ cut-off reply's usage and checking the spend caps; the trace records a
913
+ “provider reply cut off by the output limit; asking again” notice. A second
914
+ cut-off reply to the same request ends the session with
915
+ `stopCause: provider_output_limit`.
834
916
  - optional `affordanceUse` (`humanish.affordance-use.v1`): which KIND of route this
835
917
  actor took (see Affordance Use below)
836
918
  - optional `estimatedCost` (`humanish.actor-estimated-cost.v1`): a token-derived
837
- cost ESTIMATE for this lane (see Run Cost Summary And Estimated Actor Cost).
919
+ cost ESTIMATE for this participant (see Run Cost Summary And Estimated Actor Cost).
838
920
  It is deliberately a DIFFERENT field from `tokenUsage.costUsd`: a bare
839
921
  `costUsd` is RESERVED for a real provider-returned charge, while
840
922
  `estimatedCost.estimatedCostUsd` is a rate-table multiply, named honestly as
841
923
  an estimate so a reader can never confuse the two (invariant 6). Absent on
842
- codex/scripted lanes and on every pre-existing bundle; a `null`
924
+ the Codex app-server and scripted routes and on every pre-existing bundle; the
925
+ terminal route records a `null` estimate. A `null`
843
926
  `estimatedCostUsd` is DECLARED ABSENT (unknown rate / no usage), never 0.
844
927
 
845
928
  Unexpected actor-loop diagnostics live inside `items[]` as
@@ -850,10 +933,10 @@ values, target URLs, or unredacted provider payloads.
850
933
 
851
934
  Adapter-owned fields:
852
935
 
853
- - the prompt, mission, persona text, and lane focus that produced the trace
936
+ - the prompt, mission, persona text, and participant focus that produced the trace
854
937
  - product-specific acceptance notes
855
938
 
856
- Synthetic fixture (abridged; see `src/actor-contract.ts` for the full type):
939
+ Synthetic fixture (abridged; see `src/actors/contract.ts` for the full type):
857
940
 
858
941
  ```yaml
859
942
  schema: humanish.actor-trace.v1
@@ -882,28 +965,28 @@ items: []
882
965
  ## Substrate
883
966
 
884
967
  Reserved: `humanish.substrate.v1` is named here for layering intent but has
885
- never shipped — no code emits or validates it. Substrate truth today lives
968
+ never shipped; no code emits or validates it. Substrate truth today lives
886
969
  inside run bundles (per-stream transport and status) and lab execution config
887
- (`execution.target: local | e2b-desktop`). Do not emit this schema.
970
+ (`execution.target: local | e2b-desktop | e2b-terminal`). Do not emit this schema.
888
971
 
889
972
  ## Serve Result And Reserved Control-Plane Namespace
890
973
 
891
974
  `humanish serve` reports `humanish.serve-result.v1`. The exported `ServeResult`
892
- type and `SERVE_SCHEMA` constant in `src/observer-serve.ts` are authoritative:
975
+ type and `SERVE_SCHEMA` constant in `src/observer/serve.ts` are authoritative:
893
976
  mode (`loopback | exposed | share-safe-open`), the loopback host/port,
894
977
  `publicUrl`, the `tunnel` provider/url, an `oauth` echo (`provider`,
895
- `allowEmails`, `allowDomains` — operator-supplied allow rules, public-safe to
978
+ `allowEmails`, `allowDomains`: operator-supplied allow rules, public-safe to
896
979
  echo to the operator's own stdout, never persisted into any bundle), runs
897
980
  listed, computed warnings, and the `ServeErrorCode` union. Exposure auth is
898
- tunnel-edge only — as of 0.20.0 there are no `capabilityUrl`/`publicCapabilityUrl`
981
+ tunnel-edge only. As of 0.20.0 there are no `capabilityUrl`/`publicCapabilityUrl`
899
982
  /`ttlMinutes` fields, no `--auth`/`--ttl` flags, and no `capability-link` mode
900
- (the in-process `observer-auth.ts` capability-link was removed as a pre-1.0
983
+ (the in-process capability-link auth was removed as a pre-1.0
901
984
  breaking change).
902
985
 
903
986
  Reserved: `/_humanish/api/*` is the serve control-plane namespace. Any request
904
987
  under it answers `501` with error code `HUMANISH_SERVE_CONTROL_PLANE_DISABLED`.
905
988
  Because the in-process auth gate is gone, a request that clears the edge (or a
906
- loopback caller) reaches the `501` directly — there is no `401`-first anymore.
989
+ loopback caller) reaches the `501` directly; no `401` comes first.
907
990
  The typed `ServeControlPlane` parameter exists in the handler options and is
908
991
  always `undefined` in v1; no code dispatches into it yet. Do not build against
909
992
  the namespace; the reservation guarantees only that no run artifact or observer
@@ -913,29 +996,36 @@ contract.
913
996
 
914
997
  ## Terminal Cost Ledger And No-Spend Proof
915
998
 
916
- The terminal-product lane (`src/e2b-terminal-lab.ts`) passes a real provider key
917
- only to the in-sandbox agent command, never to sandbox-global env or metadata,
918
- so the no-spend claim must be REAL — derived from a ledger, never asserted. The
999
+ The terminal-product route (`src/routes/terminal/route.ts`), under the default
1000
+ `runtimeAuth: openai-env`, passes a real provider key only to the in-sandbox agent
1001
+ command; `openai-egress` gives the command a placeholder and keeps the key in an
1002
+ external E2B header transform. Neither mode puts it in sandbox-global env or
1003
+ metadata, so the no-spend claim must be derived from a ledger, never asserted. The
919
1004
  live run writes both to `terminal-ledgers.json` (a `cost` block + a
920
1005
  `noSpendProof` block, additive to `humanish.terminal-ledgers.v1`).
921
1006
 
922
- The cost ledger (`humanish.terminal-cost-ledger.v1`) has one line per category —
923
- `product`, `media`, `payment`, `provider` — and follows a strict **null
1007
+ The cost ledger (`humanish.terminal-cost-ledger.v1`) has one line per category
1008
+ (`product`, `media`, `payment`, `provider`) and follows a strict **null
924
1009
  discipline** that distinguishes three states and never conflates them:
925
1010
 
926
- - `usd: 0` — **known zero**: the category was metered and billed nothing.
927
- - `usd: null` — **not measured**: no spend signal exists for the category on
1011
+ - `usd: 0` is **known zero**: the category was metered and billed nothing.
1012
+ - `usd: null` is **not measured**: no spend signal exists for the category on
928
1013
  this run. `null` is written explicitly (never `undefined`-omitted, never guessed
929
1014
  to `0`). A line with `null` says "this category exists but we did not measure
930
1015
  it"; the no-spend proof reports it as unmeasured and does NOT claim it is zero.
931
- - line **absent** — **not applicable** (n/a) to the lane/run.
1016
+ - an **absent** line is **not applicable** (n/a) to the participant or run.
932
1017
 
933
1018
  `knownTotalUsd` sums ONLY the non-null lines (a `null` line contributes nothing
934
1019
  and is never coerced to `0`); `fullyMeasured` is true only when no line is null.
935
1020
  Core meters only the `provider` line, populated from the actor trace's
936
1021
  `tokenUsage.costUsd` when present (else `null`); `product`/`media`/`payment`
937
1022
  remain `null` unless an adapter supplies those signals through the shipped
938
- cost-probe seam.
1023
+ cost-probe seam. The terminal route records the model as `codex` and does not pin Codex's
1024
+ model, so a measured token count stays `usd: null` with `source: unpriced-token-usage`, and
1025
+ `knownTotalUsd: 0` with `fullyMeasured: false` means no line of this ledger was priced. E2B
1026
+ time for the terminal sandbox is not a line of this ledger, whose lines are checked against
1027
+ `scenario.caps.maxUsd`. The run bundle's `cost` summary prices it as a `desktop-minutes`
1028
+ line (see Run Cost Summary And Estimated Actor Cost below).
939
1029
 
940
1030
  ```yaml
941
1031
  schema: humanish.terminal-cost-ledger.v1
@@ -953,9 +1043,13 @@ The no-spend proof (`humanish.terminal-no-spend-proof.v1`) is DERIVED from the
953
1043
  ledger. It vouches only for what it measured: `knownZeroLines` (proven zero),
954
1044
  `knownNonZeroLines` (break `satisfied`), and `unmeasuredLines` (the `null` lines
955
1045
  it explicitly CANNOT vouch for). `satisfied` is true only when every KNOWN line
956
- is within `maxUsd` (for a no-spend run, `maxUsd: 0` ⇒ every known line is `0`);
957
- unmeasured lines never make it satisfied. A proof never claims zero on a `null`
958
- line — verification fails closed if it does.
1046
+ is within `maxUsd` (for a no-spend run, `maxUsd: 0` ⇒ every known line is `0`).
1047
+ Unmeasured lines never break it, so a ledger whose lines are all `null` is
1048
+ `satisfied` with nothing proven. The `statement` says which case applies: it
1049
+ names the measured lines and their dollars, provider tokens that were counted
1050
+ but unpriced (with the counts), and the lines with no signal; when no line was
1051
+ measured it says the proof was not established. A proof never claims zero on a
1052
+ `null` line; verification fails closed if it does.
959
1053
 
960
1054
  ```yaml
961
1055
  schema: humanish.terminal-no-spend-proof.v1
@@ -965,7 +1059,7 @@ knownZeroLines: []
965
1059
  knownNonZeroLines: []
966
1060
  unmeasuredLines: [product, media, payment, provider]
967
1061
  knownTotalUsd: 0
968
- statement: "No-spend proof SATISFIED for maxUsd=0: every MEASURED spend line is zero…"
1062
+ statement: "No-spend proof not established for maxUsd=0: no spend line was measured. …"
969
1063
  ```
970
1064
 
971
1065
  **Full caps enforcement (fail-closed, not advisory).** `scenario.caps.maxUsd`
@@ -979,13 +1073,20 @@ proof claims zero on a `null` line, or when known spend exceeds the declared cap
979
1073
 
980
1074
  ## Run Status (identity + liveness index)
981
1075
 
982
- `humanish.run-status.v1` — `status.json`, written inside each run directory by
1076
+ `humanish.run-status.v1` is `status.json`, written inside each run directory by
983
1077
  every backend at run start, refreshed on a fixed cadence while the run is
984
1078
  alive, and finalized when it ends: `{ schema, runId, state: running |
985
1079
  finished, mode, lab?, pid, startedAt, updatedAt, completedAt?, outcome? }`.
1080
+ `outcome` carries the bundle's `verdict`, `participants` and `estimatedCostUsd`
1081
+ when the run finishes, then the result's `ok` and `execution: { succeeded,
1082
+ failures: [{ kind, message }] }` once the Observer has rendered. The verdict is
1083
+ what the participants experienced; `execution` is whether the run worked as an
1084
+ execution (`kind` is `harness`, `provider-cleanup`, `sandbox-cleanup`,
1085
+ `evidence`, `cap` or `run`), and `ok` reads both under the route's policy
1086
+ (`OUTCOME_POLICIES` in `src/run/judge.ts`).
986
1087
 
987
1088
  It answers two questions the filesystem could not answer before: **which lab**
988
- a run belongs to, and **whether it is still alive** — including for runs an
1089
+ a run belongs to, and **whether it is still alive**, including for runs an
989
1090
  agent launched (`lab run --json`) or that were detached, which previously wrote
990
1091
  nothing at all until they completed.
991
1092
 
@@ -993,9 +1094,9 @@ It is a DERIVED INDEX, not evidence. `run.json` remains the evidence-of-record;
993
1094
  `verify` never gates on `status.json`, nothing in it is a claim about what a
994
1095
  participant did, and when the two disagree the bundle wins and the record is
995
1096
  rebuildable from it. A `running` record whose `updatedAt` is older than three
996
- touch intervals is INTERRUPTED, not alive — a dropped connection or a killed
997
- terminal leaves exactly that shape, and reading it as interrupted is the honest
998
- outcome (`classifyRunStatus` is the one shared definition). Fields are
1097
+ touch intervals is INTERRUPTED, not alive. A dropped connection or a killed
1098
+ terminal leaves exactly that shape, so the record reads as interrupted
1099
+ (`classifyRunStatus` is the one shared definition). Fields are
999
1100
  public-safe by construction: no hostname and no user paths, because a run
1000
1101
  directory may be shared.
1001
1102
 
@@ -1006,7 +1107,7 @@ runs without opening evidence for all of them. None is authoritative: `run.json`
1006
1107
  remains the evidence-of-record, `verify` gates on none of these, and nothing in
1007
1108
  them is a claim about what a participant did.
1008
1109
 
1009
- `humanish.run-index.v1` — the listing projection. One entry per run, read
1110
+ `humanish.run-index.v1` is the listing projection. One entry per run, read
1010
1111
  cheapest-source-first: the `status.json` record, else the bundle, else the run
1011
1112
  directory alone. `{ runId, derivedFrom: status | bundle | directory, liveness,
1012
1113
  mode?, pid?, lab?, startedAt?, updatedAt?, completedAt?, verdict?,
@@ -1015,30 +1116,29 @@ every run tree and parsing every bundle measured 167ms on a 25-run project,
1015
1116
  against 16ms cold and 2.8ms warm here, which is what makes a surface that
1016
1117
  refreshes on a cadence affordable. `derivedFrom` is reported so a surprising row
1017
1118
  can be traced to the file it came from. A run with receipts and no outcome is
1018
- `interrupted` — the shape a dropped connection leaves — and so is an
1019
- IN-PROGRESS bundle reached without a status record, because there is no
1020
- freshness to judge and "it started and nothing here says it finished" is the
1021
- honest reading.
1119
+ `interrupted` (the shape a dropped connection leaves), and so is an
1120
+ IN-PROGRESS bundle reached without a status record: there is no freshness to
1121
+ judge, and nothing in it says the run finished.
1022
1122
 
1023
- `humanish.run-detail.v1` — the watching projection, for ONE run. Who is in it
1123
+ `humanish.run-detail.v1` is the watching projection, for ONE run. Who is in it
1024
1124
  and what they are thinking: `{ runId, participants: [{ id, label, personaId?,
1025
1125
  traits, status?, completionReason?, thought?, turns?, actions?, thoughts?,
1026
- estimatedCostUsd? }], observerPath? }`. It reads the actor trace from
1126
+ estimatedCostUsd? }], observerPath?, automaticAnalysis? }`. It reads the actor trace from
1027
1127
  `stream.liveActor` while a run is in flight and `stream.actor` once it has
1028
1128
  finished, preferring the live one, so a single screen renders a run the whole
1029
1129
  way through. A reasoning item still being written is skipped rather than quoted
1030
- half-finished, and the text is carried verbatim — a surface may wrap it, nothing
1031
- paraphrases it. Unlike the index this DOES open the bundle, which is affordable
1130
+ half-finished, and the text is carried verbatim: a surface may wrap it, and
1131
+ nothing paraphrases it. Unlike the index this DOES open the bundle, which is affordable
1032
1132
  only because it is asked for the one run being watched.
1033
1133
 
1034
- `humanish.tui-result.v1` — what `humanish tui` emits when it refuses:
1134
+ `humanish.tui-result.v1` is what `humanish tui` emits when it refuses:
1035
1135
  `{ schema, ok: false, error: { code, message } }` with `HUMANISH_TUI_REQUIRES_TTY`,
1036
1136
  `HUMANISH_TUI_AGENT_SESSION`, `HUMANISH_TUI_UNSUPPORTED_NODE`, or
1037
1137
  `HUMANISH_TUI_BUNDLE_MISSING`. `HUMANISH_TUI_AGENT_SESSION` is the one a TTY
1038
1138
  check could not catch: `codex exec` allocates a PTY for the commands it runs, so
1039
- both streams are terminals and the surface used to open — a study watched an
1040
- agent navigate the labs list and start a run it did not mean to start
1041
- (labs/handed-a-human-surface.yaml). The refusal names the environment variable
1139
+ both streams are terminals and the surface used to open. A study watched an
1140
+ agent move through the labs list and start a run it did not mean to start
1141
+ (humanish/labs/handed-a-human-surface.yaml). The refusal names the environment variable
1042
1142
  that identified the runner, so the reader can check the claim, and `--force` is
1043
1143
  the escape for a person who really is at that keyboard. Every other
1044
1144
  command is built for an agent to drive; this one takes the screen and waits for
@@ -1047,141 +1147,189 @@ that DO answer the question rather than rendering escape codes into a pipe.
1047
1147
 
1048
1148
  ## Run Cost Summary And Estimated Actor Cost
1049
1149
 
1050
- The computer-use (CUA) lane surfaces an ADVISORY, additive cost ESTIMATE. It is
1150
+ The computer-use (CUA) route surfaces an ADVISORY, additive cost ESTIMATE. It is
1051
1151
  never authoritative: every dollar figure is a rate-table multiply, labeled
1052
1152
  "estimated (rates as of `<date>`)", and is NEVER presented as a provider charge
1053
1153
  (invariant 6). Three new `.v1` schema tags ship, all additive and optional so
1054
1154
  `humanish.run-bundle.v1` stays v1 and every pre-existing bundle is byte-stable:
1055
1155
 
1056
- - `humanish.pricing.v1` — the OPERATOR-EDITABLE rate table in `src/pricing.ts`:
1156
+ - `humanish.pricing.v1`: the OPERATOR-EDITABLE rate table in `src/run/pricing.ts`:
1057
1157
  dated per-model input/output USD-per-token rates and E2B CPU/GiB-second
1058
1158
  rates, each with a public pricing-page `source` and an `asOf`
1059
1159
  date. A prominent banner says these are estimates to update when providers
1060
1160
  change pricing. Model rates may carry a `cacheWriteUsdPerToken` (OpenAI 5.6+
1061
1161
  bills cache writes at 1.25x input as the total rate for written tokens) and a
1062
1162
  `longContext` tier (a per-request input threshold that re-prices the whole
1063
- request; priced exactly only from the trace's per-request `turns` ledger —
1064
- totals alone never re-tier, which is the under-estimate direction). Some
1163
+ request; priced exactly only from the trace's per-request `turns` ledger;
1164
+ totals alone never re-tier, which errs toward under-estimating). Some
1065
1165
  entries are `placeholder: true` stand-ins (the legacy desktop helper's
1066
- 8-vCPU/8-GiB planning assumption) — an operator MUST confirm them before trusting
1166
+ 8-vCPU/8-GiB planning assumption); an operator MUST confirm them before trusting
1067
1167
  the magnitude; the flag propagates into every estimate so a stand-in is never
1068
1168
  mistaken for a live rate. An UNKNOWN model/desktop rate is DECLARED ABSENT
1069
1169
  (`estimatedCostUsd: null` + a `reason`), never guessed.
1070
- - `humanish.actor-estimated-cost.v1` — `ActorTrace.estimatedCost`: one lane's
1170
+ - `humanish.actor-estimated-cost.v1` (`ActorTrace.estimatedCost`): one participant's
1071
1171
  token-derived model cost, with `estimatedCostUsd` (or `null` + `reason`
1072
- `no_rate_for_model`/`no_token_usage`), `ratesAsOf`, `source`, `modelId`,
1172
+ `no_rate_for_model`/`no_token_usage`/`account_billing_unknown`), `ratesAsOf`, `source`, `modelId`,
1073
1173
  optional `placeholder`, and a `breakdown`.
1074
- - `humanish.run-cost-summary.v1` — `RunBundle.cost`: the sum of every lane's
1174
+ - `humanish.run-cost-summary.v1` (`RunBundle.cost`): the sum of every participant's
1075
1175
  `model-tokens` lines PLUS `desktop-minutes` lines. New independent CUA runs
1076
- price each owned desktop separately; older single aggregate lines remain readable.
1176
+ price each owned desktop separately; concurrent shared-world runs add one line per participant
1177
+ and a `laneId: subject` desktop line for a provisioned plane; older single aggregate
1178
+ lines remain readable.
1077
1179
  A desktop line's optional `desktop` object records `minutes`,
1078
1180
  `durationBasis: host-acquired-to-cleanup`, observed `resources` (`cpuCount`,
1079
1181
  `memoryMiB`), `resourceSource: e2b.getInfo`, and `usdPerSecond` when priceable.
1080
1182
  Failed metadata reads record `resourceUnavailableReason`; no resource guess is used.
1081
1183
  Resource metadata and missing/unsupported rates produce a null line. A kept or
1082
1184
  unconfirmed allocation adds `desktop_lifetime_incomplete` as a second null line.
1185
+ Live terminal-product runs emit the same summary: one `desktop-minutes` line for
1186
+ the E2B shell sandbox (its acquired-to-cleanup span and `e2b.getInfo` size) and
1187
+ one `model-tokens` line for the Codex participant, which stays `null` with
1188
+ `no_rate_for_model` (model `codex`) or `no_token_usage`. The terminal trace
1189
+ records that same null `estimatedCost`. The sandbox line is not part of the
1190
+ terminal cost ledger, whose lines are checked against `scenario.caps.maxUsd`.
1083
1191
 
1084
1192
  The summary follows the SAME null discipline as the terminal cost ledger above.
1085
1193
  `estimatedTotalUsd` sums ONLY the non-null `breakdown` lines and is `null` iff
1086
1194
  EVERY line is null (never coerced to `0`); a present-but-unpriceable line stays
1087
1195
  in `breakdown` with `estimatedCostUsd: null` + a `reason` (it records that we
1088
1196
  tried and could not price it) and contributes nothing. `fullyEstimated` is
1089
- `false` when any applicable line is null (the total is then a lower bound);
1197
+ `false` when any applicable line is null (the total is then a lower bound). A spend-free
1198
+ live run has no lines and records `estimatedTotalUsd: 0` with `ratesAsOf: null`; verify
1199
+ asks for a rates date only when a line is priced.
1090
1200
  `placeholder` is true when any contributing rate is a stand-in; `ratesAsOf` is
1091
- the MIN (oldest) `asOf` across contributing rates — an aggregate is only as fresh
1201
+ the MIN (oldest) `asOf` across contributing rates. An aggregate is only as fresh
1092
1202
  as its stalest input, so MAX would overclaim freshness (each `breakdown` line
1093
1203
  keeps its own true `asOf`). `desktopMinutes` is a HOST-SIDE
1094
1204
  acquired-handle→cleanup span, excluding allocation/startup before handle acquisition.
1095
1205
  It approximates E2B's server-side billed lifetime. Plan fees, credits, and negotiated
1096
1206
  prices are excluded; unknown remaining lifetime makes `fullyEstimated` false.
1097
- Shared-world, scripted-browser, and terminal routes do not yet emit these desktop lines.
1207
+ Scripted-browser runs add a `laneId: subject` line for a provisioned clone.
1098
1208
 
1099
1209
  ```yaml
1100
1210
  schema: humanish.run-cost-summary.v1
1101
1211
  currency: usd
1102
- estimatedTotalUsd: 11.60167 # sum of KNOWN lines only; null iff every line null
1212
+ estimatedTotalUsd: 11.60167 # sum of KNOWN lines only; null iff every line null
1103
1213
  ratesAsOf: "2026-08-01"
1104
- fullyEstimated: true # both breakdown lines are priced (no null line)
1105
- placeholder: true # a stand-in rate contributed
1214
+ fullyEstimated: true # both breakdown lines are priced (no null line)
1215
+ placeholder: true # a stand-in rate contributed
1106
1216
  breakdown:
1107
- - { kind: model-tokens, laneId: lane-01, modelId: computer-use-preview,
1108
- estimatedCostUsd: 11.60, ratesAsOf: "2026-08-01", source: "openai.com/api/pricing" }
1109
- - { kind: desktop-minutes, estimatedCostUsd: 0.00167, ratesAsOf: "2026-08-01",
1110
- source: "…e2b.dev/pricing", placeholder: true }
1217
+ - {
1218
+ kind: model-tokens,
1219
+ laneId: lane-01,
1220
+ modelId: computer-use-preview,
1221
+ estimatedCostUsd: 11.60,
1222
+ ratesAsOf: "2026-08-01",
1223
+ source: "openai.com/api/pricing",
1224
+ }
1225
+ - {
1226
+ kind: desktop-minutes,
1227
+ estimatedCostUsd: 0.00167,
1228
+ ratesAsOf: "2026-08-01",
1229
+ source: "…e2b.dev/pricing",
1230
+ placeholder: true,
1231
+ }
1111
1232
  tokenUsage: { input: 3843523, output: 5869, total: 3849392 }
1112
1233
  desktopMinutes: 1
1113
1234
  note: "Estimated 11.60167 USD total…"
1114
1235
  ```
1115
1236
 
1116
1237
  `verifyRun` asserts LABELING/provenance, never MAGNITUDE. Absence PASSES
1117
- (fail-open on display): a bundle with no cost, a null estimate, or a lane without
1118
- `estimatedCost` verifies fine. A CLAIMED number FAILS closed when it lacks its
1238
+ (fail-open on display): a bundle with no cost, a null estimate that carries a
1239
+ `reason` and a null `ratesAsOf`, or a participant without `estimatedCost` verifies fine. A CLAIMED number FAILS closed when it lacks its
1119
1240
  `ratesAsOf` date or `source`, or when `estimatedTotalUsd` does not equal the
1120
1241
  rounded sum of its non-null lines (a null line coerced to 0 is a mechanism
1121
1242
  mismatch). A correctly-labeled huge estimate still passes. Cost is neither a
1122
- secret nor a share-blocker, so it never affects `shareSafety`.
1243
+ secret nor a share-blocker: its magnitude never affects `shareSafety`. A labeling
1244
+ failure fails verify, which blocks sharing like any other failed check.
1123
1245
 
1124
1246
  **Computer-use spend thresholds.** `execution.caps.maxUsd` applies independently
1125
- to each lane. `execution.caps.maxTotalUsd` shares an estimated model-spend ledger
1126
- across the study's lanes. Either, both, or neither may be declared. Without a
1127
- shared threshold, N lanes each have their own `maxUsd`; N × `maxUsd` is the sum
1247
+ to each participant. `execution.caps.maxTotalUsd` shares an estimated model-spend ledger
1248
+ across the study's participants. Either, both, or neither may be declared. Without a
1249
+ shared threshold, N participants each have their own `maxUsd`; N × `maxUsd` is the sum
1128
1250
  of those thresholds, not a guaranteed total spending ceiling.
1129
1251
 
1130
1252
  The loop checks reported usage after a model response, before dispatching that
1131
1253
  response's actions or requesting another turn. It does not reserve the next
1132
- request's worst-case cost. In-flight requests, retries, concurrent lanes, and
1133
- unreported usage can exceed or escape these estimates. These thresholds are
1134
- not hard provider billing caps and exclude desktop and target-app charges.
1254
+ request's worst-case cost. In-flight requests and concurrent participants can exceed
1255
+ these estimates. These thresholds are not hard provider billing caps and
1256
+ exclude desktop and target-app charges.
1257
+
1258
+ A capped session sends a further request only while every earlier request's
1259
+ usage is known or bounded:
1260
+
1261
+ - A reply without complete usage, or a provider that reports a dispatch whose
1262
+ usage it could not return (`interactionUsageIncomplete`), stops the session
1263
+ before its next request with `harness_error`, `stopCause: usage_unreported`,
1264
+ and the label “provider usage unavailable”. The reply's own actions still
1265
+ run, and a reply that ends the session ends it normally.
1266
+ - A request lost without a reply (it stalled, or the OpenAI provider's
1267
+ transport threw) is booked at its worst case before it is sent again: the
1268
+ latest reported request's input at the model's highest input rate plus
1269
+ `actors[].maxOutputTokens` at its output rate, both from `src/run/pricing.ts`.
1270
+ The reply to the resent request replaces that input with its own. The
1271
+ request is sent again only when the estimate with that charge stays within
1272
+ `maxUsd` and the study budget. Otherwise the session ends `budget_reached`
1273
+ with the crossed threshold, and the reason counts the booked worst case.
1274
+ - Without `maxOutputTokens` a lost request has no bound, so it is not sent
1275
+ again: the session stops with `stopCause: usage_unreported`.
1276
+
1277
+ The trace records `interactionUsageIncomplete: true` whenever a request's usage
1278
+ is unknown, booked or not. The booked worst case counts toward the thresholds
1279
+ only; `tokenUsage` and the cost summary keep the reported usage.
1135
1280
 
1136
1281
  Crossing `maxUsd` ends `budget_reached` / `incomplete`, including when no
1137
1282
  material action has executed. The recorded reason distinguishes prior progress
1138
1283
  from no material progress; a harness budget stop is not participant abandonment.
1139
1284
  Crossing the shared study threshold ends `budget_reached` / `incomplete`, with
1140
- sibling lanes stopping when their next post-response check sees it. Reaching a
1285
+ sibling participants stopping when their next post-response check sees it. Reaching a
1141
1286
  threshold is not proof of task completion.
1142
1287
 
1143
1288
  An absent threshold is uncapped. A zero threshold can still permit a paid model
1144
1289
  request before reported usage trips it; `maxUsd: 0` is not a no-provider-call
1145
1290
  mode. Use the keyless `humanish run first-run` preview or an explicit
1146
1291
  `humanish lab run <lab> --dry-run` for a path without provider calls. A declared
1147
- threshold on a model `src/pricing.ts` cannot price is refused at preflight
1148
- (`HUMANISH_CUA_LAB_UNPRICED_CAP`) before sandbox allocation. This rate-availability
1292
+ threshold on a model `src/run/pricing.ts` cannot price is refused at preflight
1293
+ (`HUMANISH_CUA_LAB_UNPRICED_CAP`, or `HUMANISH_CONCURRENT_SHARED_WORLD_LAB_UNPRICED_CAP` on a
1294
+ shared-world lab) before sandbox allocation. This rate-availability
1149
1295
  check is separate from the post-response spend check.
1150
1296
 
1151
- Sequential shared-world studies (`subject.topology: shared-world` with
1152
- `execution.concurrency: 1`, using clone or local-tree subjects) enforce these
1153
- same per-participant and shared model thresholds. Final reported usage,
1154
- including a closing request, is reconciled before admitting the next participant.
1155
- After the aggregate threshold is crossed, later participants are `blocked` with
1156
- a recorded skip reason; they make no model requests and add no executed turn to
1157
- the checkpoint timeline. An unpriced model with a declared threshold fails
1158
- before allocation with `HUMANISH_SHARED_WORLD_LAB_INVALID`.
1159
-
1160
- On this sequential route, an otherwise completed capped interaction that returns
1161
- missing or partial usage stops with `harness_error`, `stopCause: usage_unreported`, and the label
1162
- “provider usage unavailable.” It is not recorded as a crossed threshold. A
1163
- stalled or failed request with unknown spend is not retried by the CUA loop.
1164
- The default OpenAI adapter also disables HTTP and policy-negotiation retries for
1165
- these strict capped sessions. The loop cancels its owned request signal when a
1297
+ Library callers can make a capped session stricter by composing it from the loop and the default
1298
+ provider:
1299
+
1300
+ ```ts
1301
+ import { createOpenAiResponsesProvider, defaultRedactionHooks, runComputerUseLoop } from "humanish";
1302
+
1303
+ const result = await runComputerUseLoop({
1304
+ instructions,
1305
+ persona,
1306
+ executor,
1307
+ timeoutMs,
1308
+ // Without singleDispatch the provider may resend a request whose spend is unknown.
1309
+ provider: createOpenAiResponsesProvider({ apiKey, model, singleDispatch: true }),
1310
+ redaction: defaultRedactionHooks,
1311
+ now: Date.now,
1312
+ maxUsd,
1313
+ estimateTurnCostUsd,
1314
+ requireReportedUsageForSpendCap: true,
1315
+ });
1316
+ ```
1317
+
1318
+ `requireReportedUsageForSpendCap` applies together with `maxUsd` or `overRunBudget`. No built-in
1319
+ route enables this policy. With it, a reply that returns missing or partial usage is not acted
1320
+ on, and any failed or stalled request stops the session; both stop with `harness_error`,
1321
+ `stopCause: usage_unreported`, and the label “provider usage unavailable.” It is not recorded as a
1322
+ crossed threshold. `singleDispatch: true` disables the OpenAI adapter's HTTP and
1323
+ policy-negotiation retries, so each turn makes at most one request.
1324
+ `runCuaActorSession({ requireReportedUsageForSpendCap: true })` sets `singleDispatch` itself and
1325
+ is deprecated in this minor. It also attaches `trace.estimatedCost` for an injected
1326
+ account-billed provider, which the composition does not. The loop cancels its owned request signal when a
1166
1327
  request ends or its timeout wins; injected providers must honor cancellation
1167
- and remain responsible for their own internal dispatch. Known usage remains in the
1168
- trace alongside an explicit unknown; subsequent participants do not start when
1169
- the shared budget cannot be established. Reported zero input and output counts
1170
- remain valid zero usage. This stricter unknown-usage policy is specific to
1171
- sequential capped studies; other routes retain their existing behavior. An
1172
- explicitly incomplete provider response retains its original interruption cause
1173
- first, with any missing usage still recorded as unknown.
1174
-
1175
- Sequential traces persist dated model estimates. Their run cost summary marks
1176
- desktop compute as unmeasured, so the displayed model subtotal is a lower bound.
1177
- The sequential route does not provide a running Observer usage stream; its final
1178
- CLI and Observer projections read these persisted estimates.
1179
-
1180
- A capped custom session must return the declared model identity on its trace.
1181
- A mismatch fails orchestration and blocks later participants while preserving
1182
- the participant's original outcome and the estimate for its returned model.
1183
- This check does not establish which model an arbitrary custom runner actually
1184
- called or retrospectively enforce a runner that ignored its cap options.
1328
+ and remain responsible for their own internal dispatch. Known usage remains in
1329
+ the trace alongside an explicit unknown. Reported zero input and output counts
1330
+ remain valid zero usage. An explicitly incomplete provider response retains its
1331
+ original interruption cause first, with any missing usage still recorded as
1332
+ unknown.
1185
1333
 
1186
1334
  These computer-use rules do not replace the terminal route's separate
1187
1335
  `scenario.caps` cost-ledger and product-spend rules described above.
@@ -1191,15 +1339,16 @@ These computer-use rules do not replace the terminal route's separate
1191
1339
  `humanish.affordance-use.v1` (additive `ActorTrace.affordanceUse`) records WHICH
1192
1340
  KIND of route an actor took, per dispatched action, as counts by class:
1193
1341
 
1194
- | Class | What it covers |
1195
- | --- | --- |
1196
- | `pointer` | click, double-click, drag, scroll — interaction with what is rendered |
1197
- | `keyboard` | typed text and key presses into the page |
1198
- | `url-navigation` | typing a URL (the `nav` subset) — a HUMAN affordance, see below |
1199
- | `script-execution` | a `javascript:` or `data:` URL — not a human affordance |
1200
- | `devtools` | developer tooling opened by keyboard chord |
1201
- | `browser-internal` | `chrome://`, `about:`, `view-source:`, `file:` — the browser, not the product |
1202
- | `observation` | screenshots, waits, bare pointer moves — the actor looking rather than acting |
1342
+ | Class | What it covers |
1343
+ | ------------------ | ------------------------------------------------------------------------------------------------------------- |
1344
+ | `pointer` | click, double-click, drag, scroll: interaction with what is rendered |
1345
+ | `keyboard` | typed text and key presses into the page |
1346
+ | `speech` | spoken input from a `speak` action |
1347
+ | `url-navigation` | typing a URL (the `nav` subset); a HUMAN affordance, see below |
1348
+ | `script-execution` | a `javascript:` or `data:` URL; not a human affordance |
1349
+ | `devtools` | developer tooling opened by keyboard chord |
1350
+ | `browser-internal` | `chrome://`, `about:`, `view-source:`, `devtools:`, `file:`, `edge:`, `brave:` (the browser, not the product) |
1351
+ | `observation` | screenshots, waits, bare pointer moves: the actor looking rather than acting |
1203
1352
 
1204
1353
  `counts` omits classes that never occurred; `total` is the denominator for any
1205
1354
  rate; `shortcutTotal` rolls up `script-execution` + `devtools` +
@@ -1209,47 +1358,109 @@ absence.
1209
1358
  Direct URL navigation is deliberately its OWN class and is grouped with the
1210
1359
  naturalistic classes, not with script execution: `load(url)` appears in 99.4% of
1211
1360
  2,337 real human web demonstrations, so address-bar use is ordinary human
1212
- behavior and classifying it as a shortcut would make an ordinary human lane look
1361
+ behavior and classifying it as a shortcut would make an ordinary human participant look
1213
1362
  unfaithful. See [`docs/principles/actor-fidelity.md`](../principles/actor-fidelity.md)
1214
1363
  for the evidence and the scoping of what a fidelity claim can mean.
1215
1364
 
1216
1365
  The record carries a CLASS and at most a scheme-shaped signal (`javascript:`,
1217
- `https:`, a devtools chord) — never the typed text, which can be a password, a
1366
+ `https:`, a devtools chord), never the typed text, which can be a password, a
1218
1367
  session token, or an identifying URL path. Classification runs at dispatch
1219
1368
  because the text exists only there: the trace's own action label deliberately
1220
1369
  renders `type [N chars]`.
1221
1370
 
1222
1371
  The harness states NO verdict about a class. Whether an affordance invalidates a
1223
1372
  study depends on the population that study declares, which is product semantics
1224
- and belongs to the adopter's scorer — which already receives the full trace, so
1225
- `affordanceUse` needs no extra wiring to reach it. Present on computer-use lanes
1373
+ and belongs to the adopter's scorer. That scorer already receives the full trace,
1374
+ so `affordanceUse` needs no extra wiring to reach it. Present on computer-use participants
1226
1375
  that dispatched at least one action; absent elsewhere and on every pre-existing
1227
1376
  bundle, and its absence is tolerated by verify.
1228
1377
 
1378
+ ## Library options (`RunLabOptions`)
1379
+
1380
+ `runLab(config, options)` checks its options against the lab's route before anything runs. A
1381
+ refusal comes back in the route's own result envelope, with no run directory, receipt or sandbox.
1382
+
1383
+ | Option | What it does | Routes |
1384
+ | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1385
+ | `env` | Keys and subject env for the run. Defaults to `process.env` | all |
1386
+ | `scorer` | An `AdapterScorerModule` (`score`, `deriveFeedback`, and `deriveArtifacts` on browser routes) over the finished evidence | computer use, shared world, terminal |
1387
+ | `createProvider(ctx)` | The participant's brain. `ctx` is `ProviderContext`: `config`, `participant { id, index, count }` and `executor` | computer use: E2B, local VM or in process |
1388
+ | `inProcess.executor({ config, appUrl })` | Drives an `app-url` or `local-app` subject in process, one participant. Requires `createProvider` | computer use |
1389
+ | `prepareDesktop(desktop, target)` | Runs on an E2B sandbox before provisioning. `target` is `{ kind: "subject" }` or `{ kind: "participant", participant }` | computer use on E2B (each participant); shared world (provisioned: the subject, then each participant; external-public: each participant); scripted clone (the subject) |
1390
+ | `onEvent(event)` | Observes `LabEvent`s, below | all |
1391
+ | `onStream(event)` | Awaited. `ready` after a participant's live stream starts; its `url` carries an auth key and must never be persisted. `ended` after the participant's sandbox is gone. A rejected `ready` becomes a run warning; an `ended` rejection is swallowed | computer use and shared world on E2B |
1392
+ | `analysisSignal` | Cancels post-run analysis only | routes with post-run analysis |
1393
+ | `onObserverReady(observer)` | Awaited before any participant desktop exists | live computer use; live shared world, where the provisioned subject sandbox is already billed |
1394
+ | `rerun.participantIds` | Participants to rerun from `rerun.sourceRunId` | computer use |
1395
+
1396
+ `LabEvent` has four types:
1397
+
1398
+ - `plan`: the participants (`id`, `persona`, `device`, `instructionDigest`) before any sandbox
1399
+ or provider call. Computer use only; the other routes gain it later.
1400
+ - `subject-phase`: a provisioning boundary with `target`, `name`, `message`, `at`, and `ok` and
1401
+ `durationMs` on completed phases. Computer use sends a participant target, shared world the
1402
+ subject.
1403
+ - `analysis-started` and `analysis-finished`, around post-run analysis. `analysis-finished`
1404
+ fires after success, failure and cancellation.
1405
+
1406
+ `onEvent` is never awaited, and it changes no output: subject phases still print to stderr. A
1407
+ throw or a rejected promise becomes a redacted run warning.
1408
+
1409
+ Refusals:
1410
+
1411
+ - `HUMANISH_LAB_OPTION_UNSUPPORTED`: the route cannot honor the option, for example `scorer` on
1412
+ a preview or scripted lab, `createProvider` off computer use, or `prepareDesktop` where no E2B
1413
+ desktop exists. The message names the option and the route.
1414
+ - `HUMANISH_LAB_OPTION_CONFLICT`: a new option is set together with the older field it replaces.
1415
+
1416
+ The older route hook bags (`cuaHooks`, `scriptedHooks`, `terminalHooks`, `sharedWorldHooks`) and
1417
+ `rerun.laneIds` keep their behavior in this minor and are removed in the next. Each old field in
1418
+ use emits one `DeprecationWarning` (code `HUMANISH_RUN_LAB_OPTION_DEPRECATED`) per process:
1419
+
1420
+ | Old field | New home |
1421
+ | -------------------------------------------------------------------------------------------------- | ---------------------- |
1422
+ | `score`, `deriveFeedback` on `cuaHooks`, `sharedWorldHooks` or `terminalHooks` | `scorer` |
1423
+ | `deriveArtifacts` on `cuaHooks` or `sharedWorldHooks` | `scorer` |
1424
+ | `cuaHooks.buildProvider` | `createProvider` |
1425
+ | `cuaHooks.buildExecutor` | `inProcess.executor` |
1426
+ | `prepareDesktop` on `cuaHooks`, `scriptedHooks` or `sharedWorldHooks` | `prepareDesktop` |
1427
+ | `cuaHooks.onPreflight`; `onPhase` on `cuaHooks` or `sharedWorldHooks`; `automaticAnalysis.onStart` | `onEvent` |
1428
+ | `onRuntimeStreamReady`, `onRuntimeStreamEnded` on `cuaHooks` or `sharedWorldHooks` | `onStream` |
1429
+ | `automaticAnalysis.deps.signal` | `analysisSignal` |
1430
+ | `env` on any bag | `env` |
1431
+ | `rerun.laneIds` | `rerun.participantIds` |
1432
+ | `cuaHooks.createDesktopLane` | none |
1433
+
1434
+ `cuaHooks.createDesktopLane` warns and goes in the next minor with no replacement: a run's desktop
1435
+ is E2B, the local VM or in process. The bags' other fields are test seams with no public
1436
+ replacement, and they do not warn. A
1437
+ `scorer` passed through `RunLabOptions` behaves exactly like the same functions in the old bag,
1438
+ including the route-specific verdict rules in the next section.
1439
+
1229
1440
  ## Product-Adapter Extension Seam
1230
1441
 
1231
- The terminal-product and browser/computer-use lanes let an adopter attach
1442
+ The terminal-product and browser/computer-use routes let an adopter attach
1232
1443
  product-specific scoring + feedback as a THIN in-repo extension WITHOUT forking
1233
- core. The seam is the EXPORTED contract types plus DI hooks:
1234
- `TerminalProductLabHooks` for terminal-product runs, and the browser adapter
1235
- hooks inherited by `CuaActorLabHooks` / `SharedWorldLabHooks` for CUA,
1236
- sequential shared-world, and concurrent shared-world runs. This is never a
1237
- built-in product scorer (the adopter's scorecard lives in the adopter's repo).
1444
+ core. The seam is `RunLabOptions.scorer`, an `AdapterScorerModule`, for terminal-product,
1445
+ computer-use and shared-world runs; the CLI loads the same module with `--scorer`. The older
1446
+ `TerminalProductLabHooks`, `CuaActorLabHooks` and `SharedWorldLabHooks` fields still accept the
1447
+ same functions in this minor. This is never a built-in product scorer (the adopter's scorecard
1448
+ lives in the adopter's repo).
1238
1449
 
1239
1450
  Three product-agnostic carriers keep core's nouns closed while letting the adapter
1240
1451
  record its own:
1241
1452
 
1242
1453
  - **Adapter score** (`humanish.adapter-score.v1`, `RunBundle.adapterScore`).
1243
1454
  A namespaced summary the adapter's `score` hook returns: `{ schema, namespace,
1244
- status, score, summary, data? }`. Core never reads `data` — the adopter's
1245
- component rubric rides there; `namespace` (an adopter slug) scopes the whole
1455
+ status, score, summary, data? }`. Core never reads `data`, where the adopter's
1456
+ component rubric rides; `namespace` (an adopter slug) scopes the whole
1246
1457
  record so a future inert-field audit never misfires.
1247
1458
  - **Namespaced product-noun block** (`RunFeedbackCandidate.adapter`). The
1248
1459
  adapter's `deriveFeedback` hook returns feedback candidates that satisfy core's
1249
1460
  feedback-candidate shape; product-specific concepts (public CLI/product command
1250
1461
  observed, hosted product success-or-blocker, feedback id/draft, media/job/asset
1251
1462
  ids, explicit no-media/no-provider-spend proof, defection/friction risk) are
1252
- recorded ONLY under `adapter: { namespace, data }` — never as core enums. Core
1463
+ recorded ONLY under `adapter: { namespace, data }`, never as core enums. Core
1253
1464
  validates the SHAPE (a non-empty `namespace` + a `data` record); the keys inside
1254
1465
  `data` are the adapter's.
1255
1466
  - **Adapter artifacts** (`humanish.adapter-artifact.v1`,
@@ -1294,8 +1505,11 @@ adapter:
1294
1505
 
1295
1506
  Acceptance semantics are route-specific:
1296
1507
 
1297
- - Terminal-product runs keep the mission-based `review` verdict unchanged; the
1298
- adapter score is additive because the route is a public-product study lane.
1508
+ - Terminal-product runs keep the mission-based `review` verdict unchanged for a
1509
+ library `scorer`; the adapter score is additive. A config-declared scorer
1510
+ (`--scorer` or the lab's `review.scorer.ref`) that returns `status: fail`,
1511
+ throws, or returns a malformed score turns a pass-like verdict into `fail` and
1512
+ fails the run result.
1299
1513
  - Browser/computer-use runs treat `adapterScore.status: fail` as product-red:
1300
1514
  the bundle keeps the adapter score, `review.verdict` becomes `fail` when it
1301
1515
  was pass-like, a generic adapter gap is appended, and the route result returns
@@ -1305,13 +1519,13 @@ Acceptance semantics are route-specific:
1305
1519
 
1306
1520
  The `e2b-terminal` substrate is added to `RunFeedbackCandidate.substrate` so a
1307
1521
  terminal-agent candidate names its substrate honestly; browser candidates use
1308
- the existing `e2b-desktop` substrate. Lanes invoke hooks over FULLY-ASSEMBLED,
1522
+ the existing `e2b-desktop` substrate. The routes invoke hooks over FULLY-ASSEMBLED,
1309
1523
  redacted evidence (`TerminalProductScoringContext` or
1310
1524
  `BrowserLabScoringContext`: `bundle`, runtime-only `runDir`, run identifiers,
1311
1525
  actor/backend metadata; all exported public types), scrub+redact returned
1312
1526
  payloads, and DROP any malformed score, candidate, or artifact reference with a
1313
1527
  warning so a bad extension never poisons a verifiable bundle. On the terminal
1314
- route the context also carries `transcript` — the FULL normalized session
1528
+ route the context also carries `transcript`: the FULL normalized session
1315
1529
  transcript, source-scrubbed then shape-redacted and byte-identical to the
1316
1530
  persisted `terminal-transcript.txt` (the trace's `transcriptTail` is a ~2KB
1317
1531
  projection of it), so an adopter rubric can find command-tier evidence anywhere
@@ -1324,7 +1538,7 @@ including existence for referenced adapter artifacts.
1324
1538
  Reserved: `humanish.evidence-stream.v1` has never shipped as a standalone
1325
1539
  schema, and streams are not standalone artifacts. They are the `streams` array
1326
1540
  inside `humanish.run-bundle.v1`, normalizing UI, browser, terminal, TUI,
1327
- code-agent UI, artifact, and summary lanes — each with transport, terminal
1541
+ code-agent UI, artifact, and summary streams, each with transport, terminal
1328
1542
  tail, completion, meaningful-use verdicts, and artifact pointers. See
1329
1543
  [`run-bundle.md`](run-bundle.md#completion-and-meaningful-use-verdicts) for
1330
1544
  the stream shape, the meaningful-use rubric, and hard-failure rules.
@@ -1380,7 +1594,9 @@ Core-owned fields:
1380
1594
  - `bundlePath`
1381
1595
  - check names
1382
1596
  - check booleans
1383
- - `warnings` (advisory postures, e.g. raw screenshots; never flip `ok`)
1597
+ - `warnings` (advisory postures, e.g. raw screenshots; never flip `ok`). An
1598
+ entry starting with `RUN_NOT_FINISHED` means the run did not finish; see
1599
+ [run-bundle.md](run-bundle.md#verify-result-share-safety).
1384
1600
  - machine-readable error codes
1385
1601
 
1386
1602
  Adapter-owned fields:
@@ -1412,9 +1628,8 @@ shareSafety:
1412
1628
 
1413
1629
  Policy names boundaries before an actor runs or feedback is promoted.
1414
1630
  `humanish.policy.v1` exists today only as an adapter fixture shape
1415
- (`adapters/fixtures/`); the engine does not validate it. The committed policy
1416
- source files scaffolded by `humanish init` use `humanish.redaction-policy.v1`,
1417
- `humanish.network-policy.v1`, and `humanish.credentials-policy.v1`.
1631
+ (`adapters/fixtures/`); the engine does not validate it. `humanish init`
1632
+ scaffolds no policy files.
1418
1633
 
1419
1634
  Core-owned fields:
1420
1635