humanish 0.105.0 → 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 (1408) 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 +563 -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 -50
  789. package/docs/principles/actor-fidelity.md +37 -40
  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 -218
  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 +72 -60
  809. package/skills/humanish/agents/openai.yaml +2 -2
  810. package/dist/actor-contract.d.ts +0 -296
  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 -1751
  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 -2181
  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 -3543
  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 -383
  1022. package/dist/e2b-terminal-lab.js +0 -2000
  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 -541
  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 -66
  1104. package/dist/labs.js +0 -401
  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 -99
  1176. package/dist/persona-resolve.js.map +0 -1
  1177. package/dist/persona.d.ts +0 -39
  1178. package/dist/persona.js +0 -144
  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 -4030
  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 -5949
  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 -1424
  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.105.0-participant-backgrounds.md +0 -50
  1363. package/docs/release/0.20.0-external-public-shared-world.md +0 -43
  1364. package/docs/release/0.84.0-redacted-evidence.md +0 -42
  1365. package/docs/release/0.84.1-portable-feedback.md +0 -20
  1366. package/docs/release/0.85.0-observer-review.md +0 -56
  1367. package/docs/release/0.85.1-observer-continuity.md +0 -20
  1368. package/docs/release/0.86.0-participant-evidence.md +0 -50
  1369. package/docs/release/0.86.1-task-preflight-saved-recordings.md +0 -40
  1370. package/docs/release/0.87.0-participant-endings-and-phone-review.md +0 -64
  1371. package/docs/release/0.88.0-study-diagnostics.md +0 -43
  1372. package/docs/release/0.88.1-completion-evidence-and-local-app.md +0 -79
  1373. package/docs/release/0.88.2-sequential-study-budgets.md +0 -57
  1374. package/docs/release/0.89.0-study-findings.md +0 -79
  1375. package/docs/release/0.89.1-analysis-finished-notice.md +0 -24
  1376. package/docs/release/0.90.0-automatic-analysis.md +0 -21
  1377. package/docs/release/0.91.0-analysis-quality-and-defaults.md +0 -33
  1378. package/docs/release/0.91.1-study-review-polish.md +0 -28
  1379. package/docs/release/0.92.0-grid-playback.md +0 -22
  1380. package/docs/release/0.93.0-global-playback.md +0 -26
  1381. package/docs/release/0.93.1-observer-review-controls.md +0 -24
  1382. package/docs/release/0.94.0-reliability.md +0 -48
  1383. package/docs/release/0.95.0-connections-setup.md +0 -38
  1384. package/docs/release/0.96.0-real-email-receiving.md +0 -47
  1385. package/docs/release/0.96.1-browser-navigation.md +0 -22
  1386. package/docs/release/0.97.0-codex-account-analysis.md +0 -45
  1387. package/docs/release/0.98.0-local-browser-studies.md +0 -31
  1388. package/docs/release/0.99.0-local-browser-mac.md +0 -34
  1389. package/docs/release/0.99.1-action-recovery.md +0 -19
  1390. /package/dist/{agent-session.d.ts → actors/agent-session.d.ts} +0 -0
  1391. /package/dist/{cua-executor-error.d.ts → actors/computer-use/executor-error.d.ts} +0 -0
  1392. /package/dist/{cua-speech.d.ts → actors/computer-use/speech.d.ts} +0 -0
  1393. /package/dist/{actor-goal-source.d.ts → actors/goal-source.d.ts} +0 -0
  1394. /package/dist/{output-token-limit.d.ts → actors/output-token-limit.d.ts} +0 -0
  1395. /package/dist/{reasoning-effort.d.ts → actors/reasoning-effort.d.ts} +0 -0
  1396. /package/dist/{secret-prompt.d.ts → cli/secret-prompt.d.ts} +0 -0
  1397. /package/dist/{telemetry.d.ts → cli/telemetry.d.ts} +0 -0
  1398. /package/dist/{browser-evidence-hygiene.d.ts → evidence/browser-hygiene.d.ts} +0 -0
  1399. /package/dist/{serve-http.d.ts → observer/http.d.ts} +0 -0
  1400. /package/dist/{observer-library.d.ts → observer/library.d.ts} +0 -0
  1401. /package/dist/{listen.d.ts → observer/listen.d.ts} +0 -0
  1402. /package/dist/{observer-static.d.ts → observer/static.d.ts} +0 -0
  1403. /package/dist/{serve-tunnel.d.ts → observer/tunnel.d.ts} +0 -0
  1404. /package/dist/{terminal-encoding.d.ts → routes/terminal/encoding.d.ts} +0 -0
  1405. /package/dist/{concurrency.d.ts → run/concurrency.d.ts} +0 -0
  1406. /package/dist/{study-costs.d.ts → run/costs.d.ts} +0 -0
  1407. /package/dist/{run-narration-secrets.d.ts → run/transient-comms-secrets.d.ts} +0 -0
  1408. /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.105.0`; 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
@@ -807,50 +844,56 @@ separate dispatch, usage, or cleanup evidence, and does not establish the cause
807
844
  of a timeout. Participant outcome text includes the phase when available.
808
845
 
809
846
  Actors execute or simulate the trial. Actor evidence is the provider-neutral
810
- `humanish.actor-trace.v1` (`src/actor-contract.ts`): Codex app-server items,
811
- Claude Agent SDK blocks, pi events, computer-use cycles, scripted browser
812
- steps, and in-sandbox terminal-agent exec output all map onto one `ActorTrace`.
813
- Registered actors live in
814
- `src/actor-registry.ts` (`codex-app-server`, `pi-agent-core`,
815
- `claude-agent-sdk`, `openai-computer-use`, `scripted-browser`, `codex-exec`).
816
- 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.
817
854
 
818
855
  Core-owned fields:
819
856
 
820
857
  - `schema`
821
858
  - `provider` / `providerVersion`
822
- - `protocol` (`json-rpc` | `json-stream` | `in-process-sdk` | `cua-loop` |
823
- `scripted-steps` | `terminal-exec`)
824
- - `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`)
825
862
  - `persona` (`id`, `traitsApplied`, `promptDigest`)
826
863
  - `capabilities.keyPlacement` (`external` | `in-sandbox-command-scoped`): WHERE
827
- 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
828
865
  terminal agent declares `in-sandbox-command-scoped` (the agent-under-test runs
829
866
  inside the sandbox); every other actor is `external` (absent === external).
830
867
  - `redaction` (`status`, `screenshots: n/a|raw|blurred|ocr_scrubbed`, `notes`)
831
868
  - `startedAt` / `completedAt` / `durationMs`
832
869
  - `status` / `completionReason` / `reason` (`completionReason` includes
833
- `step_failed`: a deterministic scripted step/expectation evaluated false —
834
- the subject failed the script while the harness executed faithfully; and
835
- `budget_reached`: a computer-use session stopped by its time or estimated
836
- spend budget, or an explicit provider token limit — status `incomplete`.
837
- The `reason` distinguishes these causes; none establishes that the goal was
838
- 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)
839
882
  - `ids`, `counts`, `items[]`, optional `tokenUsage`, `capabilities`. `tokenUsage`
840
883
  may carry `cacheWriteInput` (tokens billed at the provider's cache-write rate,
841
884
  OpenAI 5.6+) and `turns[]` (per provider-request usage, the recorded fact
842
- long-context tier pricing needs) — both additive and honestly absent on
885
+ long-context tier pricing needs). Both are additive and absent on
843
886
  producers that do not report them (#334). Items may
844
887
  carry `at` (ISO-8601 recording stamp from the loop's clock) and, on
845
- click-like `ui_action` items, structured `coord` (`x`/`y`) — both additive
888
+ click-like `ui_action` items, structured `coord` (`x`/`y`). Both are additive
846
889
  (#441): absent on older bundles and non-stamping producers, and absence means
847
890
  "timing/position unrecorded", never zero
848
891
  - optional `modelSettings` (`humanish.model-settings.v1`, #497): HOW the model was
849
892
  asked to run, alongside `ids.model` which says which model it was.
850
893
  `reasoningEffort` records the value the request ACTUALLY carried,
851
- including the provider default when a lab declared nothing — the resolved
852
- value is what produced the trace, so reporting it is honest where reporting
853
- "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
854
897
  pre-existing bundle; tolerated by verify. It exists because effort was
855
898
  unreachable from a lab, which made every run take the default silently. Effort
856
899
  is part of WHO the participant was rather than of how the instrument was tuned
@@ -858,19 +901,28 @@ Core-owned fields:
858
901
  half its sample description
859
902
  - optional `modelSettings.maxOutputTokens`: the declared positive integer
860
903
  `actors[0].maxOutputTokens`, passed to every first-party OpenAI CUA response
861
- request, including reasoning output. Absent when undeclared, with no default
862
- change. Closing reports use `min(maxOutputTokens, 1024)`. Unsupported routes,
863
- 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.
864
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`.
865
916
  - optional `affordanceUse` (`humanish.affordance-use.v1`): which KIND of route this
866
917
  actor took (see Affordance Use below)
867
918
  - optional `estimatedCost` (`humanish.actor-estimated-cost.v1`): a token-derived
868
- 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).
869
920
  It is deliberately a DIFFERENT field from `tokenUsage.costUsd`: a bare
870
921
  `costUsd` is RESERVED for a real provider-returned charge, while
871
922
  `estimatedCost.estimatedCostUsd` is a rate-table multiply, named honestly as
872
923
  an estimate so a reader can never confuse the two (invariant 6). Absent on
873
- 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`
874
926
  `estimatedCostUsd` is DECLARED ABSENT (unknown rate / no usage), never 0.
875
927
 
876
928
  Unexpected actor-loop diagnostics live inside `items[]` as
@@ -881,10 +933,10 @@ values, target URLs, or unredacted provider payloads.
881
933
 
882
934
  Adapter-owned fields:
883
935
 
884
- - 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
885
937
  - product-specific acceptance notes
886
938
 
887
- 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):
888
940
 
889
941
  ```yaml
890
942
  schema: humanish.actor-trace.v1
@@ -913,28 +965,28 @@ items: []
913
965
  ## Substrate
914
966
 
915
967
  Reserved: `humanish.substrate.v1` is named here for layering intent but has
916
- 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
917
969
  inside run bundles (per-stream transport and status) and lab execution config
918
- (`execution.target: local | e2b-desktop`). Do not emit this schema.
970
+ (`execution.target: local | e2b-desktop | e2b-terminal`). Do not emit this schema.
919
971
 
920
972
  ## Serve Result And Reserved Control-Plane Namespace
921
973
 
922
974
  `humanish serve` reports `humanish.serve-result.v1`. The exported `ServeResult`
923
- 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:
924
976
  mode (`loopback | exposed | share-safe-open`), the loopback host/port,
925
977
  `publicUrl`, the `tunnel` provider/url, an `oauth` echo (`provider`,
926
- `allowEmails`, `allowDomains` — operator-supplied allow rules, public-safe to
978
+ `allowEmails`, `allowDomains`: operator-supplied allow rules, public-safe to
927
979
  echo to the operator's own stdout, never persisted into any bundle), runs
928
980
  listed, computed warnings, and the `ServeErrorCode` union. Exposure auth is
929
- 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`
930
982
  /`ttlMinutes` fields, no `--auth`/`--ttl` flags, and no `capability-link` mode
931
- (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
932
984
  breaking change).
933
985
 
934
986
  Reserved: `/_humanish/api/*` is the serve control-plane namespace. Any request
935
987
  under it answers `501` with error code `HUMANISH_SERVE_CONTROL_PLANE_DISABLED`.
936
988
  Because the in-process auth gate is gone, a request that clears the edge (or a
937
- loopback caller) reaches the `501` directly — there is no `401`-first anymore.
989
+ loopback caller) reaches the `501` directly; no `401` comes first.
938
990
  The typed `ServeControlPlane` parameter exists in the handler options and is
939
991
  always `undefined` in v1; no code dispatches into it yet. Do not build against
940
992
  the namespace; the reservation guarantees only that no run artifact or observer
@@ -944,29 +996,36 @@ contract.
944
996
 
945
997
  ## Terminal Cost Ledger And No-Spend Proof
946
998
 
947
- The terminal-product lane (`src/e2b-terminal-lab.ts`) passes a real provider key
948
- only to the in-sandbox agent command, never to sandbox-global env or metadata,
949
- 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
950
1004
  live run writes both to `terminal-ledgers.json` (a `cost` block + a
951
1005
  `noSpendProof` block, additive to `humanish.terminal-ledgers.v1`).
952
1006
 
953
- The cost ledger (`humanish.terminal-cost-ledger.v1`) has one line per category —
954
- `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
955
1009
  discipline** that distinguishes three states and never conflates them:
956
1010
 
957
- - `usd: 0` — **known zero**: the category was metered and billed nothing.
958
- - `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
959
1013
  this run. `null` is written explicitly (never `undefined`-omitted, never guessed
960
1014
  to `0`). A line with `null` says "this category exists but we did not measure
961
1015
  it"; the no-spend proof reports it as unmeasured and does NOT claim it is zero.
962
- - line **absent** — **not applicable** (n/a) to the lane/run.
1016
+ - an **absent** line is **not applicable** (n/a) to the participant or run.
963
1017
 
964
1018
  `knownTotalUsd` sums ONLY the non-null lines (a `null` line contributes nothing
965
1019
  and is never coerced to `0`); `fullyMeasured` is true only when no line is null.
966
1020
  Core meters only the `provider` line, populated from the actor trace's
967
1021
  `tokenUsage.costUsd` when present (else `null`); `product`/`media`/`payment`
968
1022
  remain `null` unless an adapter supplies those signals through the shipped
969
- 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).
970
1029
 
971
1030
  ```yaml
972
1031
  schema: humanish.terminal-cost-ledger.v1
@@ -984,9 +1043,13 @@ The no-spend proof (`humanish.terminal-no-spend-proof.v1`) is DERIVED from the
984
1043
  ledger. It vouches only for what it measured: `knownZeroLines` (proven zero),
985
1044
  `knownNonZeroLines` (break `satisfied`), and `unmeasuredLines` (the `null` lines
986
1045
  it explicitly CANNOT vouch for). `satisfied` is true only when every KNOWN line
987
- is within `maxUsd` (for a no-spend run, `maxUsd: 0` ⇒ every known line is `0`);
988
- unmeasured lines never make it satisfied. A proof never claims zero on a `null`
989
- 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.
990
1053
 
991
1054
  ```yaml
992
1055
  schema: humanish.terminal-no-spend-proof.v1
@@ -996,7 +1059,7 @@ knownZeroLines: []
996
1059
  knownNonZeroLines: []
997
1060
  unmeasuredLines: [product, media, payment, provider]
998
1061
  knownTotalUsd: 0
999
- 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. …"
1000
1063
  ```
1001
1064
 
1002
1065
  **Full caps enforcement (fail-closed, not advisory).** `scenario.caps.maxUsd`
@@ -1010,13 +1073,20 @@ proof claims zero on a `null` line, or when known spend exceeds the declared cap
1010
1073
 
1011
1074
  ## Run Status (identity + liveness index)
1012
1075
 
1013
- `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
1014
1077
  every backend at run start, refreshed on a fixed cadence while the run is
1015
1078
  alive, and finalized when it ends: `{ schema, runId, state: running |
1016
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`).
1017
1087
 
1018
1088
  It answers two questions the filesystem could not answer before: **which lab**
1019
- 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
1020
1090
  agent launched (`lab run --json`) or that were detached, which previously wrote
1021
1091
  nothing at all until they completed.
1022
1092
 
@@ -1024,9 +1094,9 @@ It is a DERIVED INDEX, not evidence. `run.json` remains the evidence-of-record;
1024
1094
  `verify` never gates on `status.json`, nothing in it is a claim about what a
1025
1095
  participant did, and when the two disagree the bundle wins and the record is
1026
1096
  rebuildable from it. A `running` record whose `updatedAt` is older than three
1027
- touch intervals is INTERRUPTED, not alive — a dropped connection or a killed
1028
- terminal leaves exactly that shape, and reading it as interrupted is the honest
1029
- 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
1030
1100
  public-safe by construction: no hostname and no user paths, because a run
1031
1101
  directory may be shared.
1032
1102
 
@@ -1037,7 +1107,7 @@ runs without opening evidence for all of them. None is authoritative: `run.json`
1037
1107
  remains the evidence-of-record, `verify` gates on none of these, and nothing in
1038
1108
  them is a claim about what a participant did.
1039
1109
 
1040
- `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
1041
1111
  cheapest-source-first: the `status.json` record, else the bundle, else the run
1042
1112
  directory alone. `{ runId, derivedFrom: status | bundle | directory, liveness,
1043
1113
  mode?, pid?, lab?, startedAt?, updatedAt?, completedAt?, verdict?,
@@ -1046,30 +1116,29 @@ every run tree and parsing every bundle measured 167ms on a 25-run project,
1046
1116
  against 16ms cold and 2.8ms warm here, which is what makes a surface that
1047
1117
  refreshes on a cadence affordable. `derivedFrom` is reported so a surprising row
1048
1118
  can be traced to the file it came from. A run with receipts and no outcome is
1049
- `interrupted` — the shape a dropped connection leaves — and so is an
1050
- IN-PROGRESS bundle reached without a status record, because there is no
1051
- freshness to judge and "it started and nothing here says it finished" is the
1052
- 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.
1053
1122
 
1054
- `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
1055
1124
  and what they are thinking: `{ runId, participants: [{ id, label, personaId?,
1056
1125
  traits, status?, completionReason?, thought?, turns?, actions?, thoughts?,
1057
- estimatedCostUsd? }], observerPath? }`. It reads the actor trace from
1126
+ estimatedCostUsd? }], observerPath?, automaticAnalysis? }`. It reads the actor trace from
1058
1127
  `stream.liveActor` while a run is in flight and `stream.actor` once it has
1059
1128
  finished, preferring the live one, so a single screen renders a run the whole
1060
1129
  way through. A reasoning item still being written is skipped rather than quoted
1061
- half-finished, and the text is carried verbatim — a surface may wrap it, nothing
1062
- 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
1063
1132
  only because it is asked for the one run being watched.
1064
1133
 
1065
- `humanish.tui-result.v1` — what `humanish tui` emits when it refuses:
1134
+ `humanish.tui-result.v1` is what `humanish tui` emits when it refuses:
1066
1135
  `{ schema, ok: false, error: { code, message } }` with `HUMANISH_TUI_REQUIRES_TTY`,
1067
1136
  `HUMANISH_TUI_AGENT_SESSION`, `HUMANISH_TUI_UNSUPPORTED_NODE`, or
1068
1137
  `HUMANISH_TUI_BUNDLE_MISSING`. `HUMANISH_TUI_AGENT_SESSION` is the one a TTY
1069
1138
  check could not catch: `codex exec` allocates a PTY for the commands it runs, so
1070
- both streams are terminals and the surface used to open — a study watched an
1071
- agent navigate the labs list and start a run it did not mean to start
1072
- (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
1073
1142
  that identified the runner, so the reader can check the claim, and `--force` is
1074
1143
  the escape for a person who really is at that keyboard. Every other
1075
1144
  command is built for an agent to drive; this one takes the screen and waits for
@@ -1078,141 +1147,189 @@ that DO answer the question rather than rendering escape codes into a pipe.
1078
1147
 
1079
1148
  ## Run Cost Summary And Estimated Actor Cost
1080
1149
 
1081
- 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
1082
1151
  never authoritative: every dollar figure is a rate-table multiply, labeled
1083
1152
  "estimated (rates as of `<date>`)", and is NEVER presented as a provider charge
1084
1153
  (invariant 6). Three new `.v1` schema tags ship, all additive and optional so
1085
1154
  `humanish.run-bundle.v1` stays v1 and every pre-existing bundle is byte-stable:
1086
1155
 
1087
- - `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`:
1088
1157
  dated per-model input/output USD-per-token rates and E2B CPU/GiB-second
1089
1158
  rates, each with a public pricing-page `source` and an `asOf`
1090
1159
  date. A prominent banner says these are estimates to update when providers
1091
1160
  change pricing. Model rates may carry a `cacheWriteUsdPerToken` (OpenAI 5.6+
1092
1161
  bills cache writes at 1.25x input as the total rate for written tokens) and a
1093
1162
  `longContext` tier (a per-request input threshold that re-prices the whole
1094
- request; priced exactly only from the trace's per-request `turns` ledger —
1095
- 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
1096
1165
  entries are `placeholder: true` stand-ins (the legacy desktop helper's
1097
- 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
1098
1167
  the magnitude; the flag propagates into every estimate so a stand-in is never
1099
1168
  mistaken for a live rate. An UNKNOWN model/desktop rate is DECLARED ABSENT
1100
1169
  (`estimatedCostUsd: null` + a `reason`), never guessed.
1101
- - `humanish.actor-estimated-cost.v1` — `ActorTrace.estimatedCost`: one lane's
1170
+ - `humanish.actor-estimated-cost.v1` (`ActorTrace.estimatedCost`): one participant's
1102
1171
  token-derived model cost, with `estimatedCostUsd` (or `null` + `reason`
1103
- `no_rate_for_model`/`no_token_usage`), `ratesAsOf`, `source`, `modelId`,
1172
+ `no_rate_for_model`/`no_token_usage`/`account_billing_unknown`), `ratesAsOf`, `source`, `modelId`,
1104
1173
  optional `placeholder`, and a `breakdown`.
1105
- - `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
1106
1175
  `model-tokens` lines PLUS `desktop-minutes` lines. New independent CUA runs
1107
- 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.
1108
1179
  A desktop line's optional `desktop` object records `minutes`,
1109
1180
  `durationBasis: host-acquired-to-cleanup`, observed `resources` (`cpuCount`,
1110
1181
  `memoryMiB`), `resourceSource: e2b.getInfo`, and `usdPerSecond` when priceable.
1111
1182
  Failed metadata reads record `resourceUnavailableReason`; no resource guess is used.
1112
1183
  Resource metadata and missing/unsupported rates produce a null line. A kept or
1113
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`.
1114
1191
 
1115
1192
  The summary follows the SAME null discipline as the terminal cost ledger above.
1116
1193
  `estimatedTotalUsd` sums ONLY the non-null `breakdown` lines and is `null` iff
1117
1194
  EVERY line is null (never coerced to `0`); a present-but-unpriceable line stays
1118
1195
  in `breakdown` with `estimatedCostUsd: null` + a `reason` (it records that we
1119
1196
  tried and could not price it) and contributes nothing. `fullyEstimated` is
1120
- `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.
1121
1200
  `placeholder` is true when any contributing rate is a stand-in; `ratesAsOf` is
1122
- 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
1123
1202
  as its stalest input, so MAX would overclaim freshness (each `breakdown` line
1124
1203
  keeps its own true `asOf`). `desktopMinutes` is a HOST-SIDE
1125
1204
  acquired-handle→cleanup span, excluding allocation/startup before handle acquisition.
1126
1205
  It approximates E2B's server-side billed lifetime. Plan fees, credits, and negotiated
1127
1206
  prices are excluded; unknown remaining lifetime makes `fullyEstimated` false.
1128
- 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.
1129
1208
 
1130
1209
  ```yaml
1131
1210
  schema: humanish.run-cost-summary.v1
1132
1211
  currency: usd
1133
- 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
1134
1213
  ratesAsOf: "2026-08-01"
1135
- fullyEstimated: true # both breakdown lines are priced (no null line)
1136
- 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
1137
1216
  breakdown:
1138
- - { kind: model-tokens, laneId: lane-01, modelId: computer-use-preview,
1139
- estimatedCostUsd: 11.60, ratesAsOf: "2026-08-01", source: "openai.com/api/pricing" }
1140
- - { kind: desktop-minutes, estimatedCostUsd: 0.00167, ratesAsOf: "2026-08-01",
1141
- 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
+ }
1142
1232
  tokenUsage: { input: 3843523, output: 5869, total: 3849392 }
1143
1233
  desktopMinutes: 1
1144
1234
  note: "Estimated 11.60167 USD total…"
1145
1235
  ```
1146
1236
 
1147
1237
  `verifyRun` asserts LABELING/provenance, never MAGNITUDE. Absence PASSES
1148
- (fail-open on display): a bundle with no cost, a null estimate, or a lane without
1149
- `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
1150
1240
  `ratesAsOf` date or `source`, or when `estimatedTotalUsd` does not equal the
1151
1241
  rounded sum of its non-null lines (a null line coerced to 0 is a mechanism
1152
1242
  mismatch). A correctly-labeled huge estimate still passes. Cost is neither a
1153
- 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.
1154
1245
 
1155
1246
  **Computer-use spend thresholds.** `execution.caps.maxUsd` applies independently
1156
- to each lane. `execution.caps.maxTotalUsd` shares an estimated model-spend ledger
1157
- across the study's lanes. Either, both, or neither may be declared. Without a
1158
- 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
1159
1250
  of those thresholds, not a guaranteed total spending ceiling.
1160
1251
 
1161
1252
  The loop checks reported usage after a model response, before dispatching that
1162
1253
  response's actions or requesting another turn. It does not reserve the next
1163
- request's worst-case cost. In-flight requests, retries, concurrent lanes, and
1164
- unreported usage can exceed or escape these estimates. These thresholds are
1165
- 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.
1166
1280
 
1167
1281
  Crossing `maxUsd` ends `budget_reached` / `incomplete`, including when no
1168
1282
  material action has executed. The recorded reason distinguishes prior progress
1169
1283
  from no material progress; a harness budget stop is not participant abandonment.
1170
1284
  Crossing the shared study threshold ends `budget_reached` / `incomplete`, with
1171
- 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
1172
1286
  threshold is not proof of task completion.
1173
1287
 
1174
1288
  An absent threshold is uncapped. A zero threshold can still permit a paid model
1175
1289
  request before reported usage trips it; `maxUsd: 0` is not a no-provider-call
1176
1290
  mode. Use the keyless `humanish run first-run` preview or an explicit
1177
1291
  `humanish lab run <lab> --dry-run` for a path without provider calls. A declared
1178
- threshold on a model `src/pricing.ts` cannot price is refused at preflight
1179
- (`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
1180
1295
  check is separate from the post-response spend check.
1181
1296
 
1182
- Sequential shared-world studies (`subject.topology: shared-world` with
1183
- `execution.concurrency: 1`, using clone or local-tree subjects) enforce these
1184
- same per-participant and shared model thresholds. Final reported usage,
1185
- including a closing request, is reconciled before admitting the next participant.
1186
- After the aggregate threshold is crossed, later participants are `blocked` with
1187
- a recorded skip reason; they make no model requests and add no executed turn to
1188
- the checkpoint timeline. An unpriced model with a declared threshold fails
1189
- before allocation with `HUMANISH_SHARED_WORLD_LAB_INVALID`.
1190
-
1191
- On this sequential route, an otherwise completed capped interaction that returns
1192
- missing or partial usage stops with `harness_error`, `stopCause: usage_unreported`, and the label
1193
- “provider usage unavailable.” It is not recorded as a crossed threshold. A
1194
- stalled or failed request with unknown spend is not retried by the CUA loop.
1195
- The default OpenAI adapter also disables HTTP and policy-negotiation retries for
1196
- 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
1197
1327
  request ends or its timeout wins; injected providers must honor cancellation
1198
- and remain responsible for their own internal dispatch. Known usage remains in the
1199
- trace alongside an explicit unknown; subsequent participants do not start when
1200
- the shared budget cannot be established. Reported zero input and output counts
1201
- remain valid zero usage. This stricter unknown-usage policy is specific to
1202
- sequential capped studies; other routes retain their existing behavior. An
1203
- explicitly incomplete provider response retains its original interruption cause
1204
- first, with any missing usage still recorded as unknown.
1205
-
1206
- Sequential traces persist dated model estimates. Their run cost summary marks
1207
- desktop compute as unmeasured, so the displayed model subtotal is a lower bound.
1208
- The sequential route does not provide a running Observer usage stream; its final
1209
- CLI and Observer projections read these persisted estimates.
1210
-
1211
- A capped custom session must return the declared model identity on its trace.
1212
- A mismatch fails orchestration and blocks later participants while preserving
1213
- the participant's original outcome and the estimate for its returned model.
1214
- This check does not establish which model an arbitrary custom runner actually
1215
- 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.
1216
1333
 
1217
1334
  These computer-use rules do not replace the terminal route's separate
1218
1335
  `scenario.caps` cost-ledger and product-spend rules described above.
@@ -1222,15 +1339,16 @@ These computer-use rules do not replace the terminal route's separate
1222
1339
  `humanish.affordance-use.v1` (additive `ActorTrace.affordanceUse`) records WHICH
1223
1340
  KIND of route an actor took, per dispatched action, as counts by class:
1224
1341
 
1225
- | Class | What it covers |
1226
- | --- | --- |
1227
- | `pointer` | click, double-click, drag, scroll — interaction with what is rendered |
1228
- | `keyboard` | typed text and key presses into the page |
1229
- | `url-navigation` | typing a URL (the `nav` subset) — a HUMAN affordance, see below |
1230
- | `script-execution` | a `javascript:` or `data:` URL — not a human affordance |
1231
- | `devtools` | developer tooling opened by keyboard chord |
1232
- | `browser-internal` | `chrome://`, `about:`, `view-source:`, `file:` — the browser, not the product |
1233
- | `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 |
1234
1352
 
1235
1353
  `counts` omits classes that never occurred; `total` is the denominator for any
1236
1354
  rate; `shortcutTotal` rolls up `script-execution` + `devtools` +
@@ -1240,47 +1358,109 @@ absence.
1240
1358
  Direct URL navigation is deliberately its OWN class and is grouped with the
1241
1359
  naturalistic classes, not with script execution: `load(url)` appears in 99.4% of
1242
1360
  2,337 real human web demonstrations, so address-bar use is ordinary human
1243
- 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
1244
1362
  unfaithful. See [`docs/principles/actor-fidelity.md`](../principles/actor-fidelity.md)
1245
1363
  for the evidence and the scoping of what a fidelity claim can mean.
1246
1364
 
1247
1365
  The record carries a CLASS and at most a scheme-shaped signal (`javascript:`,
1248
- `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
1249
1367
  session token, or an identifying URL path. Classification runs at dispatch
1250
1368
  because the text exists only there: the trace's own action label deliberately
1251
1369
  renders `type [N chars]`.
1252
1370
 
1253
1371
  The harness states NO verdict about a class. Whether an affordance invalidates a
1254
1372
  study depends on the population that study declares, which is product semantics
1255
- and belongs to the adopter's scorer — which already receives the full trace, so
1256
- `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
1257
1375
  that dispatched at least one action; absent elsewhere and on every pre-existing
1258
1376
  bundle, and its absence is tolerated by verify.
1259
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
+
1260
1440
  ## Product-Adapter Extension Seam
1261
1441
 
1262
- 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
1263
1443
  product-specific scoring + feedback as a THIN in-repo extension WITHOUT forking
1264
- core. The seam is the EXPORTED contract types plus DI hooks:
1265
- `TerminalProductLabHooks` for terminal-product runs, and the browser adapter
1266
- hooks inherited by `CuaActorLabHooks` / `SharedWorldLabHooks` for CUA,
1267
- sequential shared-world, and concurrent shared-world runs. This is never a
1268
- 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).
1269
1449
 
1270
1450
  Three product-agnostic carriers keep core's nouns closed while letting the adapter
1271
1451
  record its own:
1272
1452
 
1273
1453
  - **Adapter score** (`humanish.adapter-score.v1`, `RunBundle.adapterScore`).
1274
1454
  A namespaced summary the adapter's `score` hook returns: `{ schema, namespace,
1275
- status, score, summary, data? }`. Core never reads `data` — the adopter's
1276
- 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
1277
1457
  record so a future inert-field audit never misfires.
1278
1458
  - **Namespaced product-noun block** (`RunFeedbackCandidate.adapter`). The
1279
1459
  adapter's `deriveFeedback` hook returns feedback candidates that satisfy core's
1280
1460
  feedback-candidate shape; product-specific concepts (public CLI/product command
1281
1461
  observed, hosted product success-or-blocker, feedback id/draft, media/job/asset
1282
1462
  ids, explicit no-media/no-provider-spend proof, defection/friction risk) are
1283
- recorded ONLY under `adapter: { namespace, data }` — never as core enums. Core
1463
+ recorded ONLY under `adapter: { namespace, data }`, never as core enums. Core
1284
1464
  validates the SHAPE (a non-empty `namespace` + a `data` record); the keys inside
1285
1465
  `data` are the adapter's.
1286
1466
  - **Adapter artifacts** (`humanish.adapter-artifact.v1`,
@@ -1325,8 +1505,11 @@ adapter:
1325
1505
 
1326
1506
  Acceptance semantics are route-specific:
1327
1507
 
1328
- - Terminal-product runs keep the mission-based `review` verdict unchanged; the
1329
- 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.
1330
1513
  - Browser/computer-use runs treat `adapterScore.status: fail` as product-red:
1331
1514
  the bundle keeps the adapter score, `review.verdict` becomes `fail` when it
1332
1515
  was pass-like, a generic adapter gap is appended, and the route result returns
@@ -1336,13 +1519,13 @@ Acceptance semantics are route-specific:
1336
1519
 
1337
1520
  The `e2b-terminal` substrate is added to `RunFeedbackCandidate.substrate` so a
1338
1521
  terminal-agent candidate names its substrate honestly; browser candidates use
1339
- the existing `e2b-desktop` substrate. Lanes invoke hooks over FULLY-ASSEMBLED,
1522
+ the existing `e2b-desktop` substrate. The routes invoke hooks over FULLY-ASSEMBLED,
1340
1523
  redacted evidence (`TerminalProductScoringContext` or
1341
1524
  `BrowserLabScoringContext`: `bundle`, runtime-only `runDir`, run identifiers,
1342
1525
  actor/backend metadata; all exported public types), scrub+redact returned
1343
1526
  payloads, and DROP any malformed score, candidate, or artifact reference with a
1344
1527
  warning so a bad extension never poisons a verifiable bundle. On the terminal
1345
- route the context also carries `transcript` — the FULL normalized session
1528
+ route the context also carries `transcript`: the FULL normalized session
1346
1529
  transcript, source-scrubbed then shape-redacted and byte-identical to the
1347
1530
  persisted `terminal-transcript.txt` (the trace's `transcriptTail` is a ~2KB
1348
1531
  projection of it), so an adopter rubric can find command-tier evidence anywhere
@@ -1355,7 +1538,7 @@ including existence for referenced adapter artifacts.
1355
1538
  Reserved: `humanish.evidence-stream.v1` has never shipped as a standalone
1356
1539
  schema, and streams are not standalone artifacts. They are the `streams` array
1357
1540
  inside `humanish.run-bundle.v1`, normalizing UI, browser, terminal, TUI,
1358
- code-agent UI, artifact, and summary lanes — each with transport, terminal
1541
+ code-agent UI, artifact, and summary streams, each with transport, terminal
1359
1542
  tail, completion, meaningful-use verdicts, and artifact pointers. See
1360
1543
  [`run-bundle.md`](run-bundle.md#completion-and-meaningful-use-verdicts) for
1361
1544
  the stream shape, the meaningful-use rubric, and hard-failure rules.
@@ -1411,7 +1594,9 @@ Core-owned fields:
1411
1594
  - `bundlePath`
1412
1595
  - check names
1413
1596
  - check booleans
1414
- - `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).
1415
1600
  - machine-readable error codes
1416
1601
 
1417
1602
  Adapter-owned fields:
@@ -1443,9 +1628,8 @@ shareSafety:
1443
1628
 
1444
1629
  Policy names boundaries before an actor runs or feedback is promoted.
1445
1630
  `humanish.policy.v1` exists today only as an adapter fixture shape
1446
- (`adapters/fixtures/`); the engine does not validate it. The committed policy
1447
- source files scaffolded by `humanish init` use `humanish.redaction-policy.v1`,
1448
- `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.
1449
1633
 
1450
1634
  Core-owned fields:
1451
1635