humanish 0.106.1 → 0.108.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (668) hide show
  1. package/ARCHITECTURE.md +38 -32
  2. package/CHANGELOG.md +28 -0
  3. package/CONTEXT.md +51 -41
  4. package/README.md +152 -174
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-client.js +2 -1
  14. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  15. package/dist/actors/codex/app-server-trace.js +1 -3
  16. package/dist/actors/codex/app-server-ui.js +1 -1
  17. package/dist/actors/codex/app-server.js +2 -1
  18. package/dist/actors/codex/codex-admission.d.ts +91 -0
  19. package/dist/actors/codex/codex-admission.js +150 -0
  20. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  21. package/dist/actors/codex/protocol-compat.js +357 -0
  22. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  23. package/dist/actors/codex/protocol-contract.js +471 -0
  24. package/dist/actors/codex/restricted-executable.d.ts +28 -4
  25. package/dist/actors/codex/restricted-executable.js +104 -29
  26. package/dist/actors/codex/restricted-launch.d.ts +9 -2
  27. package/dist/actors/codex/restricted-launch.js +43 -4
  28. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  29. package/dist/actors/codex/restricted-notifications.js +277 -0
  30. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  31. package/dist/actors/codex/restricted-participant.js +66 -6
  32. package/dist/actors/codex/restricted-policy.d.ts +11 -3
  33. package/dist/actors/codex/restricted-policy.js +2 -2
  34. package/dist/actors/codex/restricted-session.d.ts +16 -3
  35. package/dist/actors/codex/restricted-session.js +60 -22
  36. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  37. package/dist/actors/codex/restricted-transport.js +139 -27
  38. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  39. package/dist/actors/codex/restricted-turn.js +43 -30
  40. package/dist/actors/computer-use/actor.d.ts +17 -17
  41. package/dist/actors/computer-use/actor.js +6 -6
  42. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  43. package/dist/actors/computer-use/admission-limit.js +1 -1
  44. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  45. package/dist/actors/computer-use/loop/actions.js +10 -10
  46. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  47. package/dist/actors/computer-use/loop/backstop.js +15 -13
  48. package/dist/actors/computer-use/loop/ending.d.ts +7 -7
  49. package/dist/actors/computer-use/loop/ending.js +9 -9
  50. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  51. package/dist/actors/computer-use/loop/observation.js +9 -9
  52. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  53. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  54. package/dist/actors/computer-use/loop/session.js +3 -3
  55. package/dist/actors/computer-use/loop/spend.d.ts +2 -2
  56. package/dist/actors/computer-use/loop/spend.js +4 -4
  57. package/dist/actors/computer-use/loop/trace.js +11 -10
  58. package/dist/actors/computer-use/loop/types.d.ts +37 -26
  59. package/dist/actors/computer-use/loop/usage.js +2 -2
  60. package/dist/actors/computer-use/loop.js +4 -4
  61. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  62. package/dist/actors/computer-use/openai-context.js +214 -0
  63. package/dist/actors/computer-use/openai-provider.d.ts +12 -9
  64. package/dist/actors/computer-use/openai-provider.js +47 -36
  65. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  66. package/dist/actors/computer-use/openai-requests.js +82 -15
  67. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  68. package/dist/actors/computer-use/openai-wire.js +36 -34
  69. package/dist/actors/contract.d.ts +86 -49
  70. package/dist/actors/contract.js +29 -23
  71. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  72. package/dist/actors/local-agent/claude-session.js +10 -9
  73. package/dist/actors/local-agent/cli.d.ts +8 -6
  74. package/dist/actors/local-agent/cli.js +24 -28
  75. package/dist/actors/local-agent/readiness.d.ts +2 -2
  76. package/dist/actors/local-agent/readiness.js +4 -4
  77. package/dist/actors/reasoning-effort.js +6 -6
  78. package/dist/actors/registry.d.ts +10 -10
  79. package/dist/actors/registry.js +18 -17
  80. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  81. package/dist/actors/scripted-browser/actor.js +16 -16
  82. package/dist/actors/scripted-browser/browser-command.js +1 -1
  83. package/dist/actors/scripted-browser/journey.js +15 -4
  84. package/dist/actors/scripted-browser/steps.js +19 -1
  85. package/dist/actors/scripted-browser/types.d.ts +12 -2
  86. package/dist/actors/stop-conditions.d.ts +1 -1
  87. package/dist/actors/stop-conditions.js +1 -3
  88. package/dist/analysis/automatic-completion.d.ts +13 -8
  89. package/dist/analysis/automatic-completion.js +14 -8
  90. package/dist/analysis/automatic-config.d.ts +1 -1
  91. package/dist/analysis/automatic-config.js +2 -2
  92. package/dist/analysis/automatic.d.ts +10 -4
  93. package/dist/analysis/automatic.js +17 -13
  94. package/dist/analysis/codex-config.d.ts +6 -2
  95. package/dist/analysis/codex-config.js +22 -14
  96. package/dist/analysis/diagnostics.d.ts +23 -0
  97. package/dist/analysis/diagnostics.js +112 -0
  98. package/dist/analysis/evidence-sources.js +2 -2
  99. package/dist/analysis/evidence.js +6 -6
  100. package/dist/analysis/execute.d.ts +7 -1
  101. package/dist/analysis/execute.js +39 -12
  102. package/dist/analysis/job.d.ts +8 -5
  103. package/dist/analysis/job.js +15 -14
  104. package/dist/analysis/load.d.ts +1 -1
  105. package/dist/analysis/load.js +5 -5
  106. package/dist/analysis/provider.d.ts +9 -1
  107. package/dist/analysis/restricted-codex.d.ts +2 -0
  108. package/dist/analysis/restricted-codex.js +10 -1
  109. package/dist/analysis/service.d.ts +2 -0
  110. package/dist/analysis/service.js +35 -16
  111. package/dist/analysis/sharing.d.ts +2 -2
  112. package/dist/analysis/sharing.js +5 -5
  113. package/dist/analysis/store-executions.d.ts +5 -5
  114. package/dist/analysis/store-executions.js +12 -12
  115. package/dist/analysis/store.d.ts +4 -4
  116. package/dist/analysis/store.js +13 -13
  117. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  118. package/dist/cli/commands/analysis-signals.js +4 -1
  119. package/dist/cli/commands/analyze.js +23 -18
  120. package/dist/cli/commands/codex.js +9 -9
  121. package/dist/cli/commands/comms.js +62 -34
  122. package/dist/cli/commands/feedback.js +20 -21
  123. package/dist/cli/commands/lab-format.d.ts +5 -4
  124. package/dist/cli/commands/lab-format.js +35 -23
  125. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  126. package/dist/cli/commands/lab-route-computer-use.js +32 -21
  127. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  128. package/dist/cli/commands/lab-route-preview.js +7 -7
  129. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  130. package/dist/cli/commands/lab-route-run.js +6 -2
  131. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  132. package/dist/cli/commands/lab-route-scripted.js +0 -1
  133. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  134. package/dist/cli/commands/lab-route-shared-world.js +3 -4
  135. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  136. package/dist/cli/commands/lab-route-terminal.js +0 -1
  137. package/dist/cli/commands/lab-run.js +84 -54
  138. package/dist/cli/commands/lab-scorer.d.ts +2 -4
  139. package/dist/cli/commands/lab-scorer.js +1 -1
  140. package/dist/cli/commands/migrate.d.ts +4 -0
  141. package/dist/cli/commands/migrate.js +65 -0
  142. package/dist/cli/commands/observe.js +168 -107
  143. package/dist/cli/commands/run-command.d.ts +10 -0
  144. package/dist/cli/commands/run-command.js +85 -0
  145. package/dist/cli/commands/run-signals.d.ts +30 -0
  146. package/dist/cli/commands/run-signals.js +146 -0
  147. package/dist/cli/commands/runs.js +137 -136
  148. package/dist/cli/commands/setup.d.ts +2 -2
  149. package/dist/cli/commands/setup.js +26 -21
  150. package/dist/cli/commands/study.d.ts +3 -0
  151. package/dist/cli/commands/study.js +182 -0
  152. package/dist/cli/commands/tui.d.ts +4 -4
  153. package/dist/cli/commands/tui.js +21 -21
  154. package/dist/cli/commands/watch.js +64 -77
  155. package/dist/cli/deprecations.d.ts +18 -0
  156. package/dist/cli/deprecations.js +48 -0
  157. package/dist/cli/doctor.d.ts +18 -5
  158. package/dist/cli/doctor.js +111 -48
  159. package/dist/cli/first-run-path.d.ts +12 -10
  160. package/dist/cli/first-run-path.js +30 -28
  161. package/dist/cli/io.d.ts +46 -10
  162. package/dist/cli/io.js +109 -30
  163. package/dist/cli/observer-follow.d.ts +2 -2
  164. package/dist/cli/observer-follow.js +5 -6
  165. package/dist/cli/orientation.d.ts +6 -3
  166. package/dist/cli/orientation.js +43 -39
  167. package/dist/cli/product-sentence.d.ts +6 -0
  168. package/dist/cli/product-sentence.js +6 -0
  169. package/dist/cli/program.d.ts +6 -1
  170. package/dist/cli/program.js +112 -43
  171. package/dist/cli/telemetry.d.ts +17 -17
  172. package/dist/cli/telemetry.js +49 -41
  173. package/dist/cli.js +1 -1
  174. package/dist/comms/capture-surface.d.ts +14 -13
  175. package/dist/comms/capture-surface.js +23 -22
  176. package/dist/comms/catch-host.d.ts +8 -8
  177. package/dist/comms/catch-host.js +14 -14
  178. package/dist/comms/connections.js +4 -4
  179. package/dist/comms/email-catch.d.ts +3 -3
  180. package/dist/comms/email-catch.js +8 -8
  181. package/dist/comms/external-evidence.d.ts +27 -0
  182. package/dist/comms/external-evidence.js +93 -0
  183. package/dist/comms/extract.js +2 -2
  184. package/dist/comms/fake-inbox.d.ts +2 -2
  185. package/dist/comms/fake-inbox.js +2 -2
  186. package/dist/comms/lease-store.js +7 -7
  187. package/dist/comms/receiving-render.d.ts +1 -1
  188. package/dist/comms/receiving-render.js +2 -2
  189. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  190. package/dist/comms/sandbox-catch-script.js +6 -6
  191. package/dist/comms/sandbox-catch.d.ts +36 -37
  192. package/dist/comms/sandbox-catch.js +34 -35
  193. package/dist/comms/setup.js +42 -8
  194. package/dist/comms/thread-evidence.d.ts +1 -1
  195. package/dist/comms/thread-evidence.js +6 -6
  196. package/dist/comms/types.d.ts +6 -6
  197. package/dist/comms/types.js +4 -4
  198. package/dist/evidence/browser-hygiene.d.ts +1 -1
  199. package/dist/evidence/browser-hygiene.js +1 -1
  200. package/dist/evidence/frame-signature.d.ts +1 -1
  201. package/dist/evidence/frame-signature.js +4 -4
  202. package/dist/evidence/redaction.d.ts +3 -3
  203. package/dist/evidence/redaction.js +5 -5
  204. package/dist/evidence/secret-scrub.d.ts +9 -0
  205. package/dist/evidence/secret-scrub.js +96 -0
  206. package/dist/feedback/draft.js +41 -85
  207. package/dist/feedback/export-bundle.js +5 -5
  208. package/dist/feedback/export.d.ts +5 -1
  209. package/dist/feedback/export.js +16 -17
  210. package/dist/feedback/feedback.d.ts +3 -3
  211. package/dist/feedback/feedback.js +21 -3
  212. package/dist/guest/chromium-text.js +2 -2
  213. package/dist/guest/desktop-native.d.ts +1 -1
  214. package/dist/guest/runtime.js +1 -1
  215. package/dist/index.d.ts +14 -15
  216. package/dist/index.js +10 -11
  217. package/dist/keys/key-resolution.d.ts +7 -5
  218. package/dist/keys/key-resolution.js +40 -38
  219. package/dist/lab/adapter-extension.d.ts +35 -13
  220. package/dist/lab/adapter-extension.js +50 -134
  221. package/dist/lab/adapter-scorer-loader.d.ts +32 -12
  222. package/dist/lab/adapter-scorer-loader.js +56 -32
  223. package/dist/lab/composition-rules.js +58 -58
  224. package/dist/lab/config.js +85 -43
  225. package/dist/lab/deprecated-fields.d.ts +10 -0
  226. package/dist/lab/deprecated-fields.js +24 -0
  227. package/dist/lab/device-presets.d.ts +10 -10
  228. package/dist/lab/device-presets.js +11 -11
  229. package/dist/lab/discover.d.ts +13 -9
  230. package/dist/lab/discover.js +118 -60
  231. package/dist/lab/doctor.d.ts +53 -11
  232. package/dist/lab/doctor.js +193 -47
  233. package/dist/lab/init-plan.js +1 -3
  234. package/dist/lab/init-templates.js +147 -147
  235. package/dist/lab/init.d.ts +1 -1
  236. package/dist/lab/init.js +41 -9
  237. package/dist/lab/keys.d.ts +2 -0
  238. package/dist/lab/keys.js +43 -9
  239. package/dist/lab/lab-deps.d.ts +80 -0
  240. package/dist/lab/lab-deps.js +4 -0
  241. package/dist/lab/parse/actors.js +17 -16
  242. package/dist/lab/parse/comms.js +8 -7
  243. package/dist/lab/parse/execution.js +15 -14
  244. package/dist/lab/parse/study-v3.d.ts +23 -0
  245. package/dist/lab/parse/study-v3.js +259 -0
  246. package/dist/lab/parse/subject-state.d.ts +7 -7
  247. package/dist/lab/parse/subject-state.js +18 -17
  248. package/dist/lab/parse/subject.js +30 -29
  249. package/dist/lab/parse/values.d.ts +1 -2
  250. package/dist/lab/parse/values.js +3 -6
  251. package/dist/lab/persona-resolve.d.ts +7 -7
  252. package/dist/lab/persona-resolve.js +8 -8
  253. package/dist/lab/persona.js +1 -3
  254. package/dist/lab/plan-base.d.ts +0 -2
  255. package/dist/lab/plan-base.js +6 -4
  256. package/dist/lab/plan-participants.d.ts +7 -7
  257. package/dist/lab/plan-participants.js +2 -2
  258. package/dist/lab/plan-types.d.ts +26 -8
  259. package/dist/lab/plan.d.ts +4 -18
  260. package/dist/lab/plan.js +24 -79
  261. package/dist/lab/preflight-probes.js +11 -11
  262. package/dist/lab/preflight-result.d.ts +2 -1
  263. package/dist/lab/preflight-result.js +5 -6
  264. package/dist/lab/preflight.d.ts +7 -8
  265. package/dist/lab/preflight.js +6 -6
  266. package/dist/lab/requirements.d.ts +20 -0
  267. package/dist/lab/requirements.js +54 -0
  268. package/dist/lab/route-inputs.d.ts +23 -12
  269. package/dist/lab/route-inputs.js +48 -51
  270. package/dist/lab/routing.d.ts +42 -41
  271. package/dist/lab/routing.js +66 -68
  272. package/dist/lab/run-lab-events.d.ts +3 -11
  273. package/dist/lab/run-lab-events.js +2 -16
  274. package/dist/lab/run-lab-homes.d.ts +76 -0
  275. package/dist/lab/run-lab-homes.js +7 -0
  276. package/dist/lab/run-lab-options.d.ts +12 -66
  277. package/dist/lab/run-lab-options.js +58 -285
  278. package/dist/lab/summary.d.ts +15 -9
  279. package/dist/lab/summary.js +24 -17
  280. package/dist/lab/tasks.d.ts +15 -15
  281. package/dist/lab/tasks.js +14 -14
  282. package/dist/lab/types.d.ts +201 -195
  283. package/dist/lab/types.js +2 -0
  284. package/dist/lab/validation.d.ts +21 -21
  285. package/dist/lab/validation.js +61 -59
  286. package/dist/lab/warnings.d.ts +10 -0
  287. package/dist/lab/warnings.js +70 -41
  288. package/dist/library-aliases.d.ts +56 -0
  289. package/dist/library-aliases.js +22 -0
  290. package/dist/observer/artifact.d.ts +2 -2
  291. package/dist/observer/artifact.js +9 -9
  292. package/dist/observer/data.d.ts +6 -6
  293. package/dist/observer/data.js +7 -6
  294. package/dist/observer/exposure.d.ts +1 -1
  295. package/dist/observer/exposure.js +11 -11
  296. package/dist/observer/http.js +1 -1
  297. package/dist/observer/library.d.ts +1 -1
  298. package/dist/observer/library.js +4 -2
  299. package/dist/observer/listen.js +5 -4
  300. package/dist/observer/render.d.ts +1 -1
  301. package/dist/observer/render.js +12 -7
  302. package/dist/observer/run-routes.d.ts +4 -4
  303. package/dist/observer/run-routes.js +6 -6
  304. package/dist/observer/serve.d.ts +17 -0
  305. package/dist/observer/serve.js +41 -6
  306. package/dist/observer/tunnel.js +1 -1
  307. package/dist/observer-app.html +4 -4
  308. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  309. package/dist/routes/computer-use/bundle-parts.js +24 -17
  310. package/dist/routes/computer-use/bundle.d.ts +4 -11
  311. package/dist/routes/computer-use/bundle.js +12 -18
  312. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  313. package/dist/routes/computer-use/diagnostics.js +1 -1
  314. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
  315. package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
  316. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  317. package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
  318. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
  319. package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
  320. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  321. package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
  322. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  323. package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
  324. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  325. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  326. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  327. package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
  328. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  329. package/dist/routes/computer-use/external-comms.js +19 -43
  330. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  331. package/dist/routes/computer-use/fanout-bundle.js +38 -42
  332. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
  333. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  334. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  335. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  336. package/dist/routes/computer-use/live-flush.js +20 -28
  337. package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
  338. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
  339. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  340. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  341. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  342. package/dist/routes/computer-use/local-vm.js +40 -67
  343. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  344. package/dist/routes/computer-use/participant-desktop.js +5 -25
  345. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
  346. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
  347. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  348. package/dist/routes/computer-use/participant-facts.js +12 -1
  349. package/dist/routes/computer-use/participant-model.d.ts +25 -11
  350. package/dist/routes/computer-use/participant-model.js +76 -34
  351. package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
  352. package/dist/routes/computer-use/participant-prompt.js +8 -8
  353. package/dist/routes/computer-use/participant-runs.d.ts +11 -11
  354. package/dist/routes/computer-use/participant-runs.js +18 -18
  355. package/dist/routes/computer-use/plan.d.ts +21 -29
  356. package/dist/routes/computer-use/plan.js +70 -78
  357. package/dist/routes/computer-use/preflight.d.ts +3 -5
  358. package/dist/routes/computer-use/preflight.js +40 -36
  359. package/dist/routes/computer-use/rerun-selection.js +11 -7
  360. package/dist/routes/computer-use/result.d.ts +1 -1
  361. package/dist/routes/computer-use/result.js +48 -38
  362. package/dist/routes/computer-use/route.d.ts +5 -5
  363. package/dist/routes/computer-use/route.js +36 -33
  364. package/dist/routes/computer-use/self-report.d.ts +8 -8
  365. package/dist/routes/computer-use/self-report.js +33 -33
  366. package/dist/routes/computer-use/setup.d.ts +9 -15
  367. package/dist/routes/computer-use/setup.js +106 -83
  368. package/dist/routes/computer-use/single-bundle.d.ts +13 -16
  369. package/dist/routes/computer-use/single-bundle.js +46 -53
  370. package/dist/routes/computer-use/subject-projection.d.ts +6 -8
  371. package/dist/routes/computer-use/subject-projection.js +24 -23
  372. package/dist/routes/computer-use/types.d.ts +195 -238
  373. package/dist/routes/computer-use/types.js +21 -13
  374. package/dist/routes/preview.d.ts +8 -2
  375. package/dist/routes/preview.js +8 -5
  376. package/dist/routes/scripted/bundle.d.ts +5 -8
  377. package/dist/routes/scripted/bundle.js +23 -27
  378. package/dist/routes/scripted/plan.d.ts +6 -8
  379. package/dist/routes/scripted/plan.js +15 -13
  380. package/dist/routes/scripted/result.d.ts +4 -1
  381. package/dist/routes/scripted/result.js +15 -11
  382. package/dist/routes/scripted/route.js +15 -17
  383. package/dist/routes/scripted/scenario.d.ts +1 -1
  384. package/dist/routes/scripted/scenario.js +3 -3
  385. package/dist/routes/scripted/setup.d.ts +3 -2
  386. package/dist/routes/scripted/setup.js +27 -26
  387. package/dist/routes/scripted/subject.d.ts +8 -3
  388. package/dist/routes/scripted/subject.js +10 -6
  389. package/dist/routes/scripted/surface-records.js +4 -4
  390. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  391. package/dist/routes/scripted/surface-sessions.js +4 -4
  392. package/dist/routes/scripted/types.d.ts +21 -40
  393. package/dist/routes/scripted/types.js +2 -3
  394. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
  395. package/dist/routes/shared-world/bundle.d.ts +7 -7
  396. package/dist/routes/shared-world/bundle.js +60 -62
  397. package/dist/routes/shared-world/checkpoints.d.ts +5 -5
  398. package/dist/routes/shared-world/checkpoints.js +5 -5
  399. package/dist/routes/shared-world/comms.d.ts +8 -7
  400. package/dist/routes/shared-world/comms.js +38 -51
  401. package/dist/routes/shared-world/external-public.d.ts +6 -5
  402. package/dist/routes/shared-world/external-public.js +28 -25
  403. package/dist/routes/shared-world/handoff.d.ts +10 -9
  404. package/dist/routes/shared-world/handoff.js +89 -81
  405. package/dist/routes/shared-world/lobby-code.d.ts +7 -7
  406. package/dist/routes/shared-world/lobby-code.js +22 -22
  407. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
  408. package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
  409. package/dist/routes/shared-world/plan.d.ts +2 -6
  410. package/dist/routes/shared-world/plan.js +8 -9
  411. package/dist/routes/shared-world/provenance.d.ts +4 -4
  412. package/dist/routes/shared-world/provenance.js +4 -4
  413. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  414. package/dist/routes/shared-world/provisioned.js +55 -48
  415. package/dist/routes/shared-world/result.js +47 -36
  416. package/dist/routes/shared-world/route.js +54 -57
  417. package/dist/routes/shared-world/setup.d.ts +6 -5
  418. package/dist/routes/shared-world/setup.js +16 -18
  419. package/dist/routes/shared-world/types.d.ts +70 -141
  420. package/dist/routes/shared-world/types.js +5 -5
  421. package/dist/routes/terminal/adapter.d.ts +10 -10
  422. package/dist/routes/terminal/adapter.js +32 -129
  423. package/dist/routes/terminal/bundle.d.ts +10 -15
  424. package/dist/routes/terminal/bundle.js +43 -52
  425. package/dist/routes/terminal/credentials.d.ts +4 -4
  426. package/dist/routes/terminal/credentials.js +20 -20
  427. package/dist/routes/terminal/dry-run.d.ts +1 -1
  428. package/dist/routes/terminal/dry-run.js +13 -15
  429. package/dist/routes/terminal/encoding.d.ts +1 -1
  430. package/dist/routes/terminal/encoding.js +4 -4
  431. package/dist/routes/terminal/ledger.d.ts +8 -8
  432. package/dist/routes/terminal/ledger.js +22 -22
  433. package/dist/routes/terminal/live-finish.d.ts +1 -2
  434. package/dist/routes/terminal/live-finish.js +24 -23
  435. package/dist/routes/terminal/live-sandbox.d.ts +3 -2
  436. package/dist/routes/terminal/live-sandbox.js +31 -32
  437. package/dist/routes/terminal/participant-text.d.ts +23 -0
  438. package/dist/routes/terminal/participant-text.js +165 -0
  439. package/dist/routes/terminal/persona.js +1 -1
  440. package/dist/routes/terminal/plan.d.ts +2 -6
  441. package/dist/routes/terminal/plan.js +23 -19
  442. package/dist/routes/terminal/recorder.d.ts +6 -1
  443. package/dist/routes/terminal/recorder.js +12 -4
  444. package/dist/routes/terminal/result.js +12 -12
  445. package/dist/routes/terminal/route.js +30 -31
  446. package/dist/routes/terminal/runtime.d.ts +3 -2
  447. package/dist/routes/terminal/runtime.js +3 -3
  448. package/dist/routes/terminal/sandbox.d.ts +4 -4
  449. package/dist/routes/terminal/sandbox.js +10 -10
  450. package/dist/routes/terminal/session.js +22 -19
  451. package/dist/routes/terminal/token-usage.d.ts +1 -1
  452. package/dist/routes/terminal/token-usage.js +10 -11
  453. package/dist/routes/terminal/trace.d.ts +7 -10
  454. package/dist/routes/terminal/trace.js +11 -66
  455. package/dist/routes/terminal/types.d.ts +104 -114
  456. package/dist/routes/terminal/types.js +12 -7
  457. package/dist/run/active-runs.d.ts +13 -0
  458. package/dist/run/active-runs.js +12 -0
  459. package/dist/run/bundle-shape.d.ts +2 -1
  460. package/dist/run/bundle-shape.js +7 -7
  461. package/dist/run/bundle.d.ts +99 -92
  462. package/dist/run/bundle.js +10 -8
  463. package/dist/run/cost-summary.js +6 -5
  464. package/dist/run/costs.d.ts +6 -6
  465. package/dist/run/costs.js +17 -11
  466. package/dist/run/detail.d.ts +9 -9
  467. package/dist/run/detail.js +10 -10
  468. package/dist/run/dry-run-inputs.js +1 -1
  469. package/dist/run/dry-run.js +23 -30
  470. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  471. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  472. package/dist/run/feedback-shape.js +1 -1
  473. package/dist/run/judge.d.ts +34 -16
  474. package/dist/run/judge.js +41 -14
  475. package/dist/run/locate.d.ts +2 -0
  476. package/dist/run/locate.js +3 -1
  477. package/dist/run/outcomes.d.ts +3 -3
  478. package/dist/run/outcomes.js +3 -3
  479. package/dist/run/participant-records.d.ts +2 -2
  480. package/dist/run/participant-records.js +2 -2
  481. package/dist/run/paths.d.ts +1 -1
  482. package/dist/run/paths.js +2 -2
  483. package/dist/run/pricing.d.ts +30 -15
  484. package/dist/run/pricing.js +49 -30
  485. package/dist/run/projection.d.ts +27 -27
  486. package/dist/run/projection.js +23 -23
  487. package/dist/run/reclaim.d.ts +6 -0
  488. package/dist/run/reclaim.js +15 -5
  489. package/dist/run/results.d.ts +5 -5
  490. package/dist/run/run-index.d.ts +9 -7
  491. package/dist/run/run-index.js +24 -25
  492. package/dist/run/run-not-found.d.ts +5 -0
  493. package/dist/run/run-not-found.js +15 -0
  494. package/dist/run/run.d.ts +7 -4
  495. package/dist/run/run.js +10 -6
  496. package/dist/run/sandbox-receipts.d.ts +5 -5
  497. package/dist/run/sandbox-receipts.js +6 -6
  498. package/dist/run/shared-world-evidence.d.ts +67 -66
  499. package/dist/run/shared-world-evidence.js +4 -4
  500. package/dist/run/shared-world-shape.d.ts +3 -3
  501. package/dist/run/shared-world-shape.js +16 -16
  502. package/dist/run/stats.d.ts +17 -11
  503. package/dist/run/stats.js +124 -66
  504. package/dist/run/status.d.ts +21 -32
  505. package/dist/run/status.js +34 -33
  506. package/dist/run/stored-runs.js +2 -1
  507. package/dist/run/stream-shape.js +1 -1
  508. package/dist/run/streams.d.ts +29 -22
  509. package/dist/run/study-provenance.d.ts +47 -0
  510. package/dist/run/study-provenance.js +63 -0
  511. package/dist/run/study-result.d.ts +16 -0
  512. package/dist/run/study-result.js +9 -0
  513. package/dist/run/terminal-contract.d.ts +5 -5
  514. package/dist/run/terminal-contract.js +4 -4
  515. package/dist/run/text.d.ts +2 -0
  516. package/dist/run/text.js +4 -0
  517. package/dist/run/transient-comms-secrets.d.ts +5 -0
  518. package/dist/run/transient-comms-secrets.js +12 -0
  519. package/dist/run-lab.d.ts +40 -38
  520. package/dist/run-lab.js +42 -40
  521. package/dist/study/convert.d.ts +33 -0
  522. package/dist/study/convert.js +432 -0
  523. package/dist/study/field-paths.d.ts +12 -0
  524. package/dist/study/field-paths.js +126 -0
  525. package/dist/study/files.d.ts +26 -0
  526. package/dist/study/files.js +43 -0
  527. package/dist/study/migrate.d.ts +48 -0
  528. package/dist/study/migrate.js +408 -0
  529. package/dist/study/owned-files.d.ts +38 -0
  530. package/dist/study/owned-files.js +182 -0
  531. package/dist/subject/clone.d.ts +1 -1
  532. package/dist/subject/desktop-cli.d.ts +2 -2
  533. package/dist/subject/desktop-cli.js +3 -3
  534. package/dist/subject/local-tree-archive.d.ts +1 -1
  535. package/dist/subject/local-tree-archive.js +5 -5
  536. package/dist/subject/local-tree.d.ts +3 -3
  537. package/dist/subject/local-tree.js +1 -1
  538. package/dist/subject/node-bootstrap.d.ts +1 -1
  539. package/dist/subject/node-bootstrap.js +4 -4
  540. package/dist/subject/runtime.js +10 -11
  541. package/dist/subject/serve.d.ts +1 -1
  542. package/dist/subject/serve.js +4 -4
  543. package/dist/subject/state.d.ts +1 -1
  544. package/dist/subject/steps.d.ts +8 -8
  545. package/dist/subject/steps.js +7 -7
  546. package/dist/substrates/command-failure.d.ts +3 -3
  547. package/dist/substrates/command-failure.js +3 -3
  548. package/dist/substrates/detached.d.ts +6 -6
  549. package/dist/substrates/detached.js +7 -7
  550. package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
  551. package/dist/substrates/e2b/cdp-probe.js +15 -18
  552. package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
  553. package/dist/substrates/e2b/desktop-browser.js +12 -12
  554. package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
  555. package/dist/substrates/e2b/desktop-cdp.js +11 -11
  556. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  557. package/dist/substrates/e2b/desktop-executor.js +1 -1
  558. package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
  559. package/dist/substrates/e2b/desktop-geometry.js +9 -9
  560. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  561. package/dist/substrates/e2b/desktop-media.js +3 -3
  562. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  563. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  564. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  565. package/dist/substrates/e2b/sandbox.js +2 -2
  566. package/dist/substrates/e2b/sdk.d.ts +11 -11
  567. package/dist/substrates/e2b/sdk.js +8 -8
  568. package/dist/substrates/local/runtime-host.d.ts +2 -0
  569. package/dist/substrates/local/runtime-host.js +6 -0
  570. package/dist/tui/actions.d.ts +8 -6
  571. package/dist/tui/actions.js +31 -22
  572. package/dist/tui/contract.d.ts +16 -16
  573. package/dist/tui/contract.js +10 -10
  574. package/dist/tui/launch.d.ts +4 -4
  575. package/dist/tui/launch.js +18 -19
  576. package/dist/tui/project.js +5 -5
  577. package/dist/tui-app.js +83 -83
  578. package/dist/verify/actor.d.ts +14 -14
  579. package/dist/verify/actor.js +45 -45
  580. package/dist/verify/artifacts.d.ts +3 -3
  581. package/dist/verify/artifacts.js +6 -6
  582. package/dist/verify/context-growth.d.ts +9 -0
  583. package/dist/verify/context-growth.js +62 -0
  584. package/dist/verify/costs.d.ts +7 -7
  585. package/dist/verify/costs.js +9 -9
  586. package/dist/verify/liveness.d.ts +1 -1
  587. package/dist/verify/liveness.js +4 -1
  588. package/dist/verify/rerun.d.ts +1 -1
  589. package/dist/verify/rerun.js +1 -1
  590. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  591. package/dist/verify/shared-world-concurrent.js +79 -76
  592. package/dist/verify/shared-world.d.ts +2 -2
  593. package/dist/verify/shared-world.js +18 -18
  594. package/dist/verify/subject.d.ts +4 -4
  595. package/dist/verify/subject.js +18 -18
  596. package/dist/verify/verify.js +98 -49
  597. package/docs/README.md +26 -33
  598. package/docs/architecture/actor-contract.md +105 -98
  599. package/docs/architecture/desktop-sessions.md +14 -14
  600. package/docs/architecture/external-public-shared-world.md +66 -59
  601. package/docs/architecture/github-feedback-loop.md +1 -4
  602. package/docs/architecture/guest-desktop.md +2 -2
  603. package/docs/architecture/observer.md +37 -37
  604. package/docs/architecture/restricted-codex-analysis.md +70 -30
  605. package/docs/architecture/serve.md +34 -37
  606. package/docs/architecture/state-driven-executor.md +55 -59
  607. package/docs/architecture/task-protocol-support.md +7 -9
  608. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
  609. package/docs/contracts/README.md +24 -0
  610. package/docs/contracts/adapter-admission.md +3 -3
  611. package/docs/contracts/adapter-fixtures.md +2 -5
  612. package/docs/contracts/core.md +1 -3
  613. package/docs/contracts/errors.md +62 -0
  614. package/docs/contracts/feedback.md +8 -9
  615. package/docs/contracts/policy.md +7 -12
  616. package/docs/contracts/run-bundle.md +54 -51
  617. package/docs/contracts/schemas.md +505 -390
  618. package/docs/contracts/study-analysis.md +26 -2
  619. package/docs/contracts/study-costs.md +11 -7
  620. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  621. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  622. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  623. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  624. package/docs/principles/actor-fidelity.md +4 -4
  625. package/docs/principles/engineering.md +3 -3
  626. package/docs/principles/invariants-and-defaults.md +38 -38
  627. package/docs/principles/self-driving-harness.md +1 -5
  628. package/docs/principles/three-roles.md +1 -1
  629. package/docs/product/automatic-analysis.md +8 -7
  630. package/examples/participant/README.md +5 -5
  631. package/examples/participant/run.mjs +11 -10
  632. package/examples/scorer/README.md +3 -3
  633. package/examples/scorer/run.mjs +11 -12
  634. package/package.json +16 -17
  635. package/skills/humanish/SKILL.md +63 -60
  636. package/skills/humanish/agents/openai.yaml +1 -1
  637. package/AGENTS.md +0 -99
  638. package/CONTRIBUTING.md +0 -148
  639. package/dist/actors/codex/qualified-versions.d.ts +0 -45
  640. package/dist/actors/codex/qualified-versions.js +0 -87
  641. package/dist/cli/commands/lab.d.ts +0 -3
  642. package/dist/cli/commands/lab.js +0 -193
  643. package/dist/deprecated.d.ts +0 -90
  644. package/dist/deprecated.js +0 -106
  645. package/dist/lab/bag-overrides.d.ts +0 -18
  646. package/dist/lab/bag-overrides.js +0 -121
  647. package/dist/observer/static.d.ts +0 -39
  648. package/dist/observer/static.js +0 -369
  649. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  650. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  651. package/docs/architecture/comms-inbox.md +0 -122
  652. package/docs/architecture/desktop-recording.md +0 -80
  653. package/docs/architecture/local-browser-runtime.md +0 -178
  654. package/docs/architecture/observer-review.md +0 -144
  655. package/docs/architecture/participant-media.md +0 -90
  656. package/docs/architecture/project-layout.md +0 -62
  657. package/docs/architecture/real-email-receiving.md +0 -136
  658. package/docs/assets/humanish-drawdb-hero.png +0 -0
  659. package/docs/assets/humanish-observer-hero.png +0 -0
  660. package/docs/goals/current.md +0 -207
  661. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  662. package/docs/product/open-source-install-experience.md +0 -240
  663. package/docs/ramp/README.md +0 -294
  664. package/docs/release/open-source-readiness.md +0 -222
  665. package/docs/release/public-readiness-standard.md +0 -210
  666. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  667. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  668. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -1,18 +1,15 @@
1
- # State-driven executor (the `CuaExecutor` port)
1
+ # State-driven executor (the `ComputerUseExecutor` port)
2
2
 
3
- Date: 2026-06-15
4
-
5
- Status: shipped (PR1 of issue #148). The library path (a custom executor + a
6
- non-vision provider, driven through the lab with NO E2B and NO vision) is
7
- implemented and proven. A config-only deterministic route and a
8
- `subject.contract.ref` JS-module loader are deferred (see "Deferred", below).
3
+ The library path ships: a custom executor and a non-vision provider, driven through a study with
4
+ no E2B desktop and no vision model. A config-only deterministic route and a `subject.contract.ref`
5
+ module loader are not built (see Not built, below).
9
6
 
10
7
  ## What this is
11
8
 
12
9
  The computer-use (CUA) loop in
13
10
  [`src/actors/computer-use/loop.ts`](https://github.com/danielgwilson/humanish/blob/main/src/actors/computer-use/loop.ts) is provider- and
14
- substrate-agnostic by design: the model lives behind a `CuaProvider` port and the thing
15
- being driven lives behind a `CuaExecutor` port. Both ports are declared in
11
+ substrate-agnostic by design: the model lives behind a `ComputerUseProvider` port and the thing
12
+ being driven lives behind a `ComputerUseExecutor` port. Both ports are declared in
16
13
  `src/actors/computer-use/loop/types.ts`. You do not have to drive a screen with a vision
17
14
  model. You can point the loop at **an already-running local app** and drive it through that
18
15
  app's **in-process JavaScript automation contract** (e.g. `window.app.getState()`,
@@ -27,12 +24,12 @@ This is the "plural harnesses / transport-agnostic" intent of
27
24
  ## The port
28
25
 
29
26
  ```ts
30
- interface CuaExecutor {
31
- observe(): Promise<CuaObservation>; // capture current state
32
- execute(action: CuaAction, signal?: AbortSignal): Promise<void>; // perform one action
27
+ interface ComputerUseExecutor {
28
+ observe(): Promise<ComputerUseObservation>; // capture current state
29
+ execute(action: ComputerUseAction, signal?: AbortSignal): Promise<void>; // perform one action
33
30
  }
34
31
 
35
- interface CuaObservation {
32
+ interface ComputerUseObservation {
36
33
  screenshot?: Buffer; // OPTIONAL — a state executor omits it
37
34
  stateSignature: string; // REQUIRED — the fallback progress key
38
35
  appState?: Record<string, unknown>; // structured state; preferred for progress
@@ -71,9 +68,9 @@ graphically dense (pixel-art) UI. `stableProgressKey(appState)`:
71
68
  - sorts object keys, so key order never counts as progress;
72
69
  - caps depth, key count, array length, string length, and total output;
73
70
  - never throws on a cyclic or huge `appState`; it degrades to a bounded value
74
- (cycles become `"[Circular]"`, over-cap nodes become markers). This is
75
- correctness-load-bearing: a hostile or merely large state blob cannot crash the
76
- loop.
71
+ (cycles become `"[Circular]"`, over-cap nodes become markers). The loop's
72
+ correctness depends on this: a hostile or merely large state blob cannot crash
73
+ it.
77
74
 
78
75
  ## A single desktop command failure is a recoverable skipped action
79
76
 
@@ -102,7 +99,7 @@ skipped: desktop command failed`, text = the public-safe action label + exit cod
102
99
  and any genuine non-`CommandExitError` adapter fault as `actor_error`.
103
100
  - **No infinite loop.** A skipped action changes nothing on screen, so it is not
104
101
  progress. A run that keeps failing every action makes no progress and still
105
- terminates honestly through the existing idle / no-progress backstop
102
+ terminates through the existing idle / no-progress backstop
106
103
  (`gave_up`). The resilience only converts a _single flaky command_ from fatal
107
104
  to survivable; it never masks a genuinely stuck run.
108
105
 
@@ -112,7 +109,7 @@ whitespace-collapsed) and a numeric exit code, and is still run through the loop
112
109
  values, and machine paths never appear. The action label comes from
113
110
  `describeCuaAction`, which never includes typed text.
114
111
 
115
- ## You need a NON-vision provider too
112
+ ## You need a non-vision provider too
116
113
 
117
114
  Swapping the executor is not enough. The default OpenAI computer-use provider is
118
115
  **vision-based**: it sends the screenshot as the `computer_call_output`, so a
@@ -122,7 +119,7 @@ reasons over app state).
122
119
 
123
120
  **Provider-authoring contract:**
124
121
 
125
- - A **vision** provider MUST set `requiresFrame: true` (the OpenAI provider does). When a
122
+ - A **vision** provider must set `requiresFrame: true` (the OpenAI provider does). When a
126
123
  `requiresFrame: true` provider is handed a screenshot-less observation, the loop ends the
127
124
  session with a structured `harness_error` (`missingFrame` in
128
125
  `src/actors/computer-use/loop/ending.ts`). It neither crashes silently nor passes falsely.
@@ -131,10 +128,10 @@ reasons over app state).
131
128
 
132
129
  `requiresFrame` defaulting to falsey is a known third-party-author footgun (a vision
133
130
  provider that forgets to set it would get a blank-frame crash instead of a clean verdict).
134
- This slice accepts it because every in-tree vision provider sets it: OpenAI computer use,
131
+ The loop accepts it because every in-tree vision provider sets it: OpenAI computer use,
135
132
  the local-agent Codex and Claude sessions, and the restricted Codex participant.
136
133
 
137
- ## `appState` is RUNTIME-ONLY (not evidence, in this slice)
134
+ ## `appState` is runtime-only
138
135
 
139
136
  `appState` is an in-memory progress-comparison input, exactly like
140
137
  `stateSignature` (which is itself never written as text). It is **never** copied
@@ -144,35 +141,35 @@ trace. Only the derived progress key is computed in-memory and discarded.
144
141
  Why: the published-evidence scan catches only secret-_shaped_ patterns. A
145
142
  structured app blob (ids, free-form state, possibly user chat or shapeless
146
143
  tokens) is exactly the "value has no shape" gap that pattern redaction cannot
147
- close. So this slice does not treat `appState` as an evidence surface at all.
144
+ close. So `appState` is not an evidence surface at all.
148
145
 
149
- The bundle is self-describing about it (invariant 6): when a state executor
146
+ The bundle says so: when a state executor
150
147
  surfaces `appState`, the trace's `redaction.notes` declares that app state was
151
- observed each turn to drive progress detection and was NOT written to the trace.
148
+ observed each turn to drive progress detection and was not written to the trace.
152
149
 
153
- A future "appState in evidence" slice MUST route a stringified projection through
154
- `redaction.redactText` (and the lab's `scrubText`) AND cap / whitelist fields
150
+ A future change that puts `appState` in evidence must route a stringified projection through
151
+ `redaction.redactText` (and the study's `scrubText`) and cap / whitelist fields
155
152
  before persisting. Pattern + literal redaction alone cannot sanitize an
156
153
  arbitrary blob.
157
154
 
158
- ## Provenance is honestly UNPINNED (invariant 5)
155
+ ## Provenance is declared unpinned
159
156
 
160
157
  An already-running local dev server cannot be commit-pinned. The bundle does not
161
158
  silently omit a subject block. It declares the absence: `subject.source:
162
159
  app-url` with `state.provenance: "undeclared"` (the app-url "absence declared"
163
160
  marker), and a `cua-lab.subject.declared` event that states the entry is a local
164
- dev server driven in-process, caller-provisioned and UNPINNED, with no E2B
161
+ dev server driven in-process, caller-provisioned and unpinned, with no E2B
165
162
  desktop created.
166
163
 
167
164
  ## Two entry points
168
165
 
169
166
  ### 1. Bare `runComputerUseLoop` (lowest level)
170
167
 
171
- Implement `CuaExecutor.observe()/execute()`, derive `stateSignature`/`appState`
172
- from your own state, pair it with a non-vision `CuaProvider`, and call
168
+ Implement `ComputerUseExecutor.observe()/execute()`, derive `stateSignature`/`appState`
169
+ from your own state, pair it with a non-vision `ComputerUseProvider`, and call
173
170
  `runComputerUseLoop`. You own the bundle/redaction wiring.
174
171
 
175
- ### 2. `runLab` + `inProcess` / `createProvider` (keeps the composition)
172
+ ### 2. `runStudy` + `inProcess` / `createProvider` (keeps the composition)
176
173
 
177
174
  The supported library path keeps personas, the Observer, the evidence bundle,
178
175
  redaction, and the friction loop, while skipping E2B entirely. Start with the
@@ -185,48 +182,47 @@ node node_modules/humanish/examples/participant/run.mjs
185
182
  ```
186
183
 
187
184
  The example includes a real loopback app, HTTP state/action bridge, full config
188
- object (`schema: LAB_CONFIG_SCHEMA`), deterministic non-vision provider,
189
- `stableProgressKey`, `runLab`, verification, a printed report and `finally`
185
+ object (`schema: STUDY_SCHEMA`), deterministic non-vision provider,
186
+ `stableProgressKey`, `runStudy`, verification, a printed report and `finally`
190
187
  cleanup. It makes no model calls and does not demonstrate persona efficacy.
191
- `parseLabConfig` accepts a decoded object, not a YAML string; narrow its result
192
- on `.ok`, then narrow `runLab`'s result on `backend === "cua"` before accessing
193
- the CUA result. The example defines all helpers rather than requiring a consumer
194
- to reconstruct them.
188
+ `parseStudy` accepts a decoded object, not a YAML string; narrow its result
189
+ on `.ok`, then narrow `runStudy`'s result on `route === "computer-use"` before
190
+ reading the computer-use result. The example defines all helpers, so a consumer does not
191
+ reconstruct them.
195
192
 
196
- Pass `inProcess: { executor }` and `createProvider` in `RunLabOptions`. The type requires
193
+ Pass `inProcess: { executor }` and `createProvider` in `RunStudyOptions`. The type requires
197
194
  `createProvider` beside `inProcess`: a state executor returns no frame, so it needs a non-vision
198
- provider. With `inProcess` set, `runCuaActorLab` takes a branch that NEVER
195
+ provider. With `inProcess` set, the computer-use route takes a branch that never
199
196
  loads the E2B module, creates a sandbox, runs `prepareDesktop`, provisions a
200
197
  clone, opens a browser, or starts a stream. `sandboxId`/`streamUrl` stay
201
198
  undefined, so `result.sandbox` is omitted. That omission is the verifiable
202
199
  "no E2B SDK call" proof.
203
200
 
204
- Fail-closed guards, all BEFORE any key check, so a CLI invocation never sees a misleading
205
- `HUMANISH_CUA_LAB_KEYS_MISSING` first:
201
+ Fail-closed guards, all before any key check, so a CLI invocation never sees a misleading
202
+ `HUMANISH_COMPUTER_USE_KEYS_MISSING` first:
206
203
 
207
- - `HUMANISH_LAB_OPTION_UNSUPPORTED`: `inProcess` without `createProvider` (from JavaScript,
204
+ - `HUMANISH_STUDY_OPTION_UNSUPPORTED`: `inProcess` without `createProvider` (from JavaScript,
208
205
  where the type does not stop it), or on a subject other than `app-url` or `local-app`.
209
206
  `createProvider` alone is allowed; that is a model swap on the normal E2B route.
210
- - `HUMANISH_CUA_LAB_FANOUT_INVALID`: `inProcess`, or the deprecated `cuaHooks.buildExecutor`,
211
- with more than one participant. The planner refuses it, because fan-out gives each participant
207
+ - `HUMANISH_COMPUTER_USE_FANOUT_INVALID`: `inProcess` with more than one participant. The planner refuses it, because fan-out gives each participant
212
208
  its own E2B desktop and the in-process route has none.
213
- - `HUMANISH_CUA_LAB_LOCAL_APP_NO_EXECUTOR`: a `subject.source: local-app` config run
209
+ - `HUMANISH_COMPUTER_USE_LOCAL_APP_NO_EXECUTOR`: a `subject.source: local-app` config run
214
210
  without `inProcess` (there is no built-in in-process driver yet). A structured error,
215
211
  never a desktop attempt.
216
- - `HUMANISH_CUA_LAB_LOCAL_DESKTOP_MISSING`: an `app-url` lab with `execution.target: local`
217
- and no local desktop. `runLab` gives a local browser study its desktop; a direct route
218
- call or an in-process executor on the same lab has none.
219
- - `HUMANISH_CUA_LAB_EXECUTOR_NO_PROVIDER`: the deprecated `cuaHooks.buildExecutor` without
220
- `cuaHooks.buildProvider`.
212
+ - `HUMANISH_COMPUTER_USE_LOCAL_DESKTOP_MISSING`: an `app-url` study with `execution.target: local`
213
+ and no local desktop. `runStudy` gives a local browser study its desktop; a direct route
214
+ call or an in-process executor on the same study has none.
215
+ - `HUMANISH_COMPUTER_USE_EXECUTOR_NO_PROVIDER`: the route's internal executor hook without its
216
+ provider hook. A package caller gets `HUMANISH_STUDY_OPTION_UNSUPPORTED` above instead.
221
217
 
222
- Key gating is route-aware: the in-process route uses the caller's OWN model and
218
+ Key gating is route-aware: the in-process route uses the caller's own model and
223
219
  executor, so no `OPENAI_API_KEY`/`E2B_API_KEY` is required.
224
220
 
225
221
  ## A note on `appState` typing
226
222
 
227
- `CuaObservation.appState` is `Record<string, unknown> | undefined` under the
223
+ `ComputerUseObservation.appState` is `Record<string, unknown> | undefined` under the
228
224
  repo's strict flags (`exactOptionalPropertyTypes`, `noUncheckedIndexedAccess`).
229
- A value typed as an `interface` does NOT satisfy `Record<string, unknown>`
225
+ A value typed as an `interface` does not satisfy `Record<string, unknown>`
230
226
  (interfaces have no implicit index signature), and a direct `as Record<...>` cast
231
227
  on an interface-typed value is rejected. Use one of:
232
228
 
@@ -237,15 +233,15 @@ on an interface-typed value is rejected. Use one of:
237
233
  Read every optional field defensively, and spread-omit optional fields
238
234
  (`...(x === undefined ? {} : { x })`) rather than assigning `undefined`.
239
235
 
240
- ## Deferred (tracked, not shipped here)
236
+ ## Not built
241
237
 
242
- - **PR2: a config-only deterministic `state-contract` route.** A registered,
238
+ - **A config-only deterministic `state-contract` route.** A registered,
243
239
  model-free route driving a built-in `window.app.*` bridge over the existing
244
- `ScriptedPageLike.evaluate` primitive + a YAML step program, `scenario.mode:
245
- live` gating actuation. It would be deterministic step replay, NOT
240
+ `ScriptedPageLike.evaluate` primitive + a YAML step program, `mode: live`
241
+ gating actuation. It would be deterministic step replay, not
246
242
  `runComputerUseLoop`, and must not overclaim friction-loop reuse.
247
- - **PR3: a `subject.contract.ref` JS-module loader.** A config-referenced module
248
- loaded and run in-process with full harness privileges is a genuinely NEW trust
243
+ - **A `subject.contract.ref` JS-module loader.** A config-referenced module
244
+ loaded and run in-process with full harness privileges is a genuinely new trust
249
245
  surface with no precedent in this repo (the scripted route loads only declarative
250
246
  YAML; serve commands run isolated inside the disposable E2B sandbox). It earns
251
247
  its place only behind its own clamping / trust / digest-pinning design.
@@ -1,6 +1,6 @@
1
1
  # Task protocol support
2
2
 
3
- `actors[0].tasks` adds a participant protocol to the mission. Goals reach the
3
+ `actor.tasks` adds a participant protocol to the mission. Goals reach the
4
4
  participant; hidden success criteria go only to the observation tracker. A route
5
5
  that cannot carry both halves refuses the declaration before execution. Removing
6
6
  `tasks` is an explicit choice to run a mission-only study, not an automatic fallback.
@@ -14,7 +14,7 @@ that cannot carry both halves refuses the declaration before execution. Removing
14
14
  | Shared-world, provisioned or external-public | Rejected | Actor specs omit the protocol before CUA session dispatch |
15
15
  | Terminal-product | Rejected | Terminal prompt and result contract do not implement tasks |
16
16
  | Scripted-browser, local or provisioned | Rejected | Scenario steps drive the participant; no task protocol is consumed |
17
- | Synthetic (`this-repo`) | Rejected | Lab dispatch does not pass task declarations to the dry-run engine |
17
+ | Synthetic (`this-repo`) | Rejected | Study dispatch does not pass task declarations to the dry-run engine |
18
18
  | Any second or later `actors[]` entry | Rejected | Current runners consume only the first actor; declare every participant under the first actor |
19
19
 
20
20
  Both registered CUA actors (`openai-computer-use` and `local-agent`) share the CUA
@@ -22,14 +22,12 @@ session loop. Their task support does not depend on which provider chooses actio
22
22
  Custom session hooks remain caller-owned implementations of that same contract;
23
23
  this preflight does not certify arbitrary hook behavior.
24
24
 
25
- The parser reports `HUMANISH_LAB_INVALID` with the unsupported field path. `runLab`
26
- and the deprecated direct route runners report `HUMANISH_LAB_TASKS_UNSUPPORTED` in
27
- their failure envelopes, from `planLab` (`src/lab/plan.ts`) and each route's plan.
25
+ The parser reports `HUMANISH_STUDY_INVALID` with the unsupported field path. `runStudy`
26
+ reports `HUMANISH_STUDY_TASKS_UNSUPPORTED` in the route's failure envelope, from
27
+ `planLab` (`src/lab/plan.ts`) and each route's plan.
28
28
  Refusal precedes run storage, source preparation, user hooks, local processes,
29
- sandbox allocation, and model calls. No task content appears in the error. The
30
- deprecated synthetic API, `runDryRun`, accepts no lab config or tasks. Its lab
31
- declaration boundary is `runLab`.
29
+ sandbox allocation, and model calls. No task content appears in the error.
32
30
 
33
31
  A future route gains support only after proving participant goals, hidden criteria,
34
- observation-backed completion, honest missing-input treatment, and per-participant
32
+ observation-backed completion, explicit missing-input handling, and per-participant
35
33
  bundle evidence together. Appending goals to a prompt alone is insufficient.
@@ -1,20 +1,14 @@
1
- # Terminal-product real-agent route (issue #154)
1
+ # Terminal-product route
2
2
 
3
- Date: 2026-06-16 (runtime-auth contract updated 2026-09-05)
4
-
5
- Status: live terminal-product route shipped in `0.8.0`. The in-sandbox backend,
6
- command-scoped credential placement, exact-id cleanup proof, an interventions ledger,
7
- cost/no-spend ledger, caps, and product scoring/feedback hooks are implemented;
8
- the kept 2026-07-09 live receipt verifies 15/15 checks and `share_ready` at a
9
- `$0` cap. That capability receipt is not adopter replacement: no deletion
10
- branch has yet removed the reference adopter's bespoke generic study harness.
11
- See the goal packet
12
- ([`docs/goals/terminal-product-lane/goal.md`](https://github.com/danielgwilson/humanish/blob/main/docs/goals/terminal-product-lane/goal.md))
13
- for the full slice plan and the safety contract.
3
+ The live terminal-product route has shipped since `0.8.0`, with the in-sandbox runtime,
4
+ command-scoped credential placement, exact-id cleanup proof, an interventions ledger, a cost and
5
+ no-spend ledger, caps, and product scoring and feedback hooks. The
6
+ [original plan](https://github.com/danielgwilson/humanish/blob/main/docs/history/goals/terminal-product-lane/goal.md)
7
+ holds the build order and the safety contract.
14
8
 
15
9
  ## What this is
16
10
 
17
- A lab route for **terminal-product real-agent studies**: a real autonomous coding
11
+ A study route for **terminal-product real-agent studies**: a real autonomous coding
18
12
  agent (Codex) discovering and using a CLI/product from its **public surfaces
19
13
  only**, running **inside an E2B shell** with declared runtime-auth placement and
20
14
  spend/time caps, emitting durable terminal/substrate/cost/no-spend/cleanup/
@@ -23,38 +17,39 @@ routes. It tests whether an autonomous agent can discover and use a CLI/product
23
17
  surface from public materials. It does not test whether a browser can click a
24
18
  local web app.
25
19
 
26
- It rides the established route-addition pattern (proven by the scripted-browser
27
- and local-app routes): a new `subject.source` × `execution.target`, a routing
28
- predicate, a backend enum + dispatch, a registered actor that declares the run kind in its capabilities,
20
+ It follows the pattern the scripted-browser and local-app routes added: a new
21
+ `subject.source` × `execution.target` pairing, a `terminal` case in `routeOf(config)`
22
+ and its dispatch, a registered actor that declares the run kind in its capabilities,
29
23
  fail-closed cross-validation, and forward-declared warnings.
30
24
 
31
25
  ## The composition
32
26
 
33
- | Axis | Value |
34
- | ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
35
- | `subject.source` | `terminal-product` |
36
- | `subject.product` | `{ name, publicSurfaces[], install?, workdir?, upload? }`: the only world the agent sees |
37
- | `execution.target` | `e2b-terminal` (or absent → implied) |
38
- | `execution.terminal` | `{ transport: exec-stream, stdin: disabled }` |
39
- | `execution.runtimeAuth` | `openai-env` (default) or opt-in `openai-egress`; names-only durable evidence |
40
- | `execution.runtime.version` | Optional exact `@openai/codex` version; observed before keyed execution |
41
- | `actors[0].model` / `reasoningEffort` | Forwarded to Codex; retained as declarations, not observed provider identity |
42
- | `scenario.caps` | `{ maxUsd, maxJobs, maxMinutes }`: the blast-radius budget; `maxUsd > 0` is refused unless a `costProbe` measures spend |
43
- | `policies` | `allowPrivateRepoAccess` / `allowProviderCredentials` / `allowPaymentCredentials` / `allowGitHubMutation`, all DEFAULT FALSE |
44
- | `actors[0].type` | `codex-exec`: a registered terminal actor (`keyPlacement: in-sandbox-command-scoped`) |
45
- | `LabBackend` | `terminal` → `runTerminalProductLab` ([`src/routes/terminal/route.ts`](https://github.com/danielgwilson/humanish/blob/main/src/routes/terminal/route.ts)) |
27
+ | Axis | Value |
28
+ | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
29
+ | `subject.source` | `terminal-product` |
30
+ | `subject.product` | `{ name, publicSurfaces[], install?, workdir?, upload? }`: the only world the agent sees |
31
+ | `execution.target` | `e2b-terminal` (or absent → implied) |
32
+ | `execution.terminal` | `{ transport: exec-stream, stdin: disabled }` |
33
+ | `execution.runtimeAuth` | `openai-env` (default) or opt-in `openai-egress`; names-only durable evidence |
34
+ | `execution.runtime.version` | Optional exact `@openai/codex` version; observed before keyed execution |
35
+ | `actor.model` / `reasoningEffort` | Passed to Codex as `--model` (default `gpt-5.6-sol`) and `-c model_reasoning_effort`; declarations, not observed provider identity |
36
+ | `caps` | `{ maxUsd, maxJobs, maxMinutes }`: the blast-radius budget; `maxUsd > 0` is refused unless a `costProbe` measures spend |
37
+ | `policies` | `allowPrivateRepoAccess` / `allowProviderCredentials` / `allowPaymentCredentials` / `allowGitHubMutation`, all default false |
38
+ | `actor.type` | `codex-exec`: a registered terminal actor (`keyPlacement: in-sandbox-command-scoped`) |
39
+ | route | `terminal` → `runTerminalProductLab` ([`src/routes/terminal/route.ts`](https://github.com/danielgwilson/humanish/blob/main/src/routes/terminal/route.ts)) |
46
40
 
47
41
  Routing is `routeOf` (`src/lab/plan.ts`). It sends every `terminal-product` subject to
48
42
  this route, even with an unregistered actor, so this route refuses the actor.
49
- `routesToTerminalProduct(config)` also feeds the forward-declared warnings.
43
+ `isTerminalProductComposition(config)` (`src/lab/routing.ts`) also feeds the forward-declared
44
+ warnings.
50
45
 
51
46
  ## Repeating a terminal study with the same runtime
52
47
 
53
48
  ```yaml
54
- actors:
55
- - type: codex-exec
56
- model: gpt-5.6-sol
57
- reasoningEffort: low
49
+ actor:
50
+ type: codex-exec
51
+ model: gpt-5.6-sol
52
+ reasoningEffort: low
58
53
  execution:
59
54
  target: e2b-terminal
60
55
  runtime:
@@ -70,16 +65,24 @@ and reclaims its owned sandbox. When the version is omitted, the probe resolves
70
65
 
71
66
  `actor.json`, the bundle's terminal actor, and `terminal-ledgers.json` retain
72
67
  `humanish.actor-runtime.v1`: requested and observed versions, verification status,
73
- declared model/effort, and the usage granularity. The observed executable version
74
- also appears as `providerVersion`. An undeclared model stays explicitly
75
- `runtime_default_unobserved`; humanish does not label the runtime name as a model.
68
+ the requested model and where it came from, declared effort, and the usage granularity.
69
+ The observed executable version also appears as `providerVersion`.
70
+
71
+ Codex's `--json` stream does not name the model it used, and its built-in default can change
72
+ with any release. So the route always passes `--model`: the study's `actor.model`
73
+ (`modelStatus: declared`), or humanish's participant default `gpt-5.6-sol`
74
+ (`modelStatus: humanish_default`). Bundles written before 0.107.0 record
75
+ `runtime_default_unobserved` with no requested model.
76
76
  Dry runs record declarations only, in a `terminal-lab.runtime.declared` event.
77
77
 
78
78
  These settings make a study's request reproducible, but do not attest the actual
79
- provider model or add a provider spending limit. Codex `turn.completed` usage can
80
- aggregate several model requests, so humanish does not use a declared model to
81
- infer per-request pricing tiers or fill in unknown costs. Runtime-token costs
82
- and the studied product's no-spend boundary still need separate interpretation.
79
+ provider model or add a provider spending limit. humanish prices the agent's tokens from the
80
+ requested model. Codex `turn.completed` usage sums every request in a turn, so no request's own
81
+ size is known and no per-request long-context tier can be applied. The estimate prices every token
82
+ at the base tier, with cached input at the cached rate, and says so with
83
+ `basis: aggregated_turns_base_rate`. It is an estimate, not a measurement. The cost ledger
84
+ checked against `caps.maxUsd` keeps the provider line unmeasured, and the studied
85
+ product's no-spend boundary still needs separate interpretation.
83
86
 
84
87
  ## Runtime auth: raw-key placement and remaining provider access
85
88
 
@@ -122,11 +125,11 @@ make authenticated requests to that host from sandbox creation until teardown,
122
125
  including bootstrap/setup commands and commands launched outside Codex. Calls
123
126
  made outside Codex may be absent from its usage ledger. This mode does not impose
124
127
  a provider-side spending limit, restrict models/API paths, or make
125
- `scenario.caps.maxUsd` a preventive provider budget. A hard provider budget needs
128
+ `caps.maxUsd` a preventive provider budget. A hard provider budget needs
126
129
  a separately enforced control; do not infer zero spend from an unmeasured ledger
127
130
  line.
128
131
 
129
- Public internet discovery stays unrestricted unless the lab already declares
132
+ Public internet discovery stays unrestricted unless the study already declares
130
133
  `execution.egressAllow`. The mode preserves that allowlist and its deny-all
131
134
  fallback without adding hosts. If an allowlist omits `api.openai.com`, provider
132
135
  requests can fail. E2B domain allowlists are routing controls rather than strict
@@ -146,7 +149,7 @@ and [E2B's CA installer](https://github.com/e2b-dev/infra/blob/main/packages/env
146
149
  E2B's installed
147
150
  SDK documents that transformed headers override request headers. Deterministic
148
151
  request/redaction tests do not establish live wire behavior. The [2026-09-05
149
- transport receipt](https://github.com/danielgwilson/humanish/blob/main/docs/goals/terminal-product-lane/receipts/2026-09-05-runtime-egress-auth.md)
152
+ transport receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/terminal-product/2026-09-05-runtime-egress-auth.md)
150
153
  records the controlled live header/auth checks and their scope.
151
154
 
152
155
  ## Runtime prerequisite
@@ -171,7 +174,7 @@ checks Node/npm in both ordinary and sudo shells after installation. The existin
171
174
  runtime fast path preserves user-specific installations; a later sudo product
172
175
  install can still fail if that installation is absent from sudo's PATH.
173
176
 
174
- The [global executable receipt](https://github.com/danielgwilson/humanish/blob/main/docs/goals/terminal-product-lane/receipts/2026-09-05-global-npm-prefix.md)
177
+ The [global executable receipt](https://github.com/danielgwilson/humanish/blob/main/docs/evidence/terminal-product/2026-09-05-global-npm-prefix.md)
175
178
  records the regression found after the initial runtime-only proof and its stock
176
179
  desktop checks. npm documents [global executable locations](https://docs.npmjs.com/cli/v10/configuring-npm/folders#executables)
177
180
  and the [distribution built-in configuration](https://docs.npmjs.com/cli/v10/configuring-npm/npmrc#built-in-config-file).
@@ -203,100 +206,65 @@ blast radius is bounded by key scoping and budgets, not by hoping._
203
206
 
204
207
  The inversion is declared as registry metadata, not a code convention: the
205
208
  terminal actor's capabilities carry `keyPlacement: "in-sandbox-command-scoped"`.
206
- SLICE 1 shipped the DECLARED field + value (the contract was honest about where
207
- the key would go); SLICE 2's engine added command-scoped injection (only into the
208
- per-command `envs` of the `codex` invocation, never `Sandbox.create({envs})`)
209
- keyed off that capability, plus the deny-by-default credential allowlist, the
210
- positive-allowlist sandbox metadata, the cleanup proof, the interventions ledger,
211
- and a minimal fail-closed cap.
212
-
213
- ## Historical SLICE 1 scope (DRY-RUN only when shipped)
214
-
215
- At SLICE 1, `runTerminalProductLab` implemented only the dry-run path: it built a valid
216
- `humanish.run-bundle.v1` contract bundle, honestly labeled contract-only, with:
217
-
218
- - the subject declared as a terminal-product with its public surfaces, provenance
219
- **UNPINNED** (the agent drives public surfaces, not a clone; invariant 5);
220
- - the author mission recorded as plaintext (public-safe committed lab text) + a
221
- **digest** of the full composed prompt (nothing beyond the author mission goes
222
- plaintext);
223
- - the caps / deny-by-default policies / runtime-auth channel recorded as
224
- declarations (names only; invariant 1);
225
- - a terminal-kind stream that is an honest **contract placeholder**: stdin
226
- disabled, empty tail, `transport: snapshot`, **not** `pty` (captured
227
- non-interactive exec output is never an interactive PTY; invariant 6 + the
228
- goal packet's PTY ruling). SLICE 2 later added redacted exec-stream capture;
229
- - empty/placeholder ledgers (substrate lifecycle, command log, terminal event
230
- stream, interventions, cost) that SLICE 2/3 later filled.
231
-
232
- The dry-run bundle passed the existing `verifyRun`. Terminal-specific verifier
233
- checks (terminal/transcript presence, lifecycle, cleanup, interventions,
234
- metadata allowlist, no-credential-in-artifacts, no-spend) landed in SLICE 2/3.
235
-
236
- At SLICE 1, a non-dry-run call returned a structured
237
- `HUMANISH_TERMINAL_AGENT_NOT_IMPLEMENTED` failure before launch or spend.
238
- SLICE 2 implemented the real session.
239
-
240
- SLICE 1 declared the DI seams SLICE 2 needed (`loadModule`, `buildSandbox`,
241
- `runtimeAuthEnv`, `detachedTimers`) on `TerminalProductLabHooks`; only the dry-run
242
- path was implemented in that slice. The hook bag now carries `loadModule`, `env`,
243
- `renderObserverFn`, `now`, `costProbe`, `score` and `deriveFeedback`
244
- (`src/routes/terminal/types.ts`), and `TerminalProductLabHooks` itself is deprecated
245
- in favor of `RunLabOptions`.
246
-
247
- ## SLICE 4: the product-adapter extension seam (layer 6)
248
-
249
- This route is proof-roadmap **layer 6**: an adopter attaches product-specific
250
- scoring + feedback as a THIN in-repo extension WITHOUT forking core. SLICE 4
251
- ships the SEAM. Core ships no built-in product scorer; the adopter's scorecard
252
- lives in the adopter's repo:
209
+ The route keys off that capability and injects the key only into the per-command
210
+ `envs` of the `codex` invocation, never `Sandbox.create({envs})`. The route also
211
+ has a deny-by-default credential allowlist, positive-allowlist sandbox metadata,
212
+ the cleanup proof, the interventions ledger and a minimal fail-closed cap.
213
+
214
+ ## Test seams
215
+
216
+ The route reads `env` and `scorer` from its options (`src/routes/terminal/types.ts`), and a test
217
+ passes its seams (`desktopModule`, `renderObserver`, `now`, `costProbe`) as `LabDeps`
218
+ (`src/lab/lab-deps.ts`).
219
+
220
+ ## The product-adapter extension seam
221
+
222
+ An adopter attaches product-specific scoring and feedback as a thin in-repo extension, without
223
+ forking core. Core ships the seam and no built-in product scorer; the adopter's scorecard lives in
224
+ the adopter's repo:
253
225
 
254
226
  - **Exported contract types** a thin adapter types against from the package barrel
255
227
  (`humanish`) alone, never through a deep `src/` import: `RunBundle`,
256
228
  `RunFeedbackCandidate`, `RunAdapterScore`, `RunAdapterArtifact`, `ActorTrace`,
257
229
  `AdapterScorerModule` and `TerminalProductScoringContext`. The ledger, cost and
258
230
  no-spend shapes are reached through that context's fields, as
259
- `TerminalProductScoringContext["ledgers"]`. Before this slice these were not
260
- exported, which forced a fork (a thin adapter could not type against the bundle),
261
- the gap issue #154 acceptance #8 names.
262
- - **A registrable scorer / feedback module**, `RunLabOptions.scorer` (an
231
+ `TerminalProductScoringContext["ledgers"]`.
232
+ - **A registrable scorer / feedback module**, `RunStudyOptions.scorer` (an
263
233
  `AdapterScorerModule`): `score?(ctx) => RunAdapterScore | Promise<…>` and
264
234
  `deriveFeedback?(ctx) => RunFeedbackCandidate[] | Promise<…>`, where this route's
265
235
  `ctx` is a `TerminalProductScoringContext`. The older `terminalHooks.score` and
266
- `terminalHooks.deriveFeedback` still work and warn as deprecated. The route calls the
267
- hooks over the FULLY-ASSEMBLED, redacted evidence and attaches the results
268
- (`bundle.adapterScore`, appended `bundle.feedbackCandidates`) WITHOUT core knowing
236
+ `terminalHooks.deriveFeedback` were removed with the bag. The route calls the
237
+ hooks over the fully-assembled, redacted evidence and attaches the results
238
+ (`bundle.adapterScore`, appended `bundle.feedbackCandidates`) without core knowing
269
239
  any product noun. Default (no hook) behavior is unchanged: the mission-based verdict
270
240
  stands alone.
271
241
  - **Adapter-namespaced product nouns.** Product-specific concepts (public
272
242
  CLI/product command observed, hosted product success-or-blocker, feedback
273
243
  id/draft, media/job/asset ids, no-media/no-provider-spend proof,
274
- defection/friction risk) ride ONLY under a single namespaced field
244
+ defection/friction risk) ride only under a single namespaced field
275
245
  (`RunFeedbackCandidate.adapter: { namespace, data }` and
276
246
  `RunAdapterScore.{namespace, data}`) so core's enums stay product-agnostic and
277
247
  a future inert-field audit never misfires. No adopter noun is hardcoded into a
278
248
  core enum (avoiding closed-taxonomy rot); `e2b-terminal` is added to the
279
- substrate enum so a terminal-agent candidate names its substrate honestly.
249
+ substrate enum so a terminal-agent candidate names the substrate it ran on.
280
250
 
281
- The seam is fail-closed: the route scrubs+redacts the returned payloads and DROPS
251
+ The seam is fail-closed: the route scrubs+redacts the returned payloads and drops
282
252
  any malformed score/candidate with a warning, and `verifyRun` re-checks the
283
253
  surviving shapes, so a bad extension never poisons a verifiable bundle. Proven by
284
254
  `tests/routes/terminal/product-adapter-seam.test.ts` (a thin in-repo example adapter
285
255
  typing against the barrel only, registering a scorer, attaching namespaced nouns,
286
- emitting a candidate; the bundle verifies). At SLICE 4 this was contract proof,
287
- not a live rung; the later end-to-end route receipt is linked from the status
288
- note.
256
+ emitting a candidate; the bundle verifies). That test is a contract proof; the
257
+ live end-to-end route receipt is linked from the status note.
289
258
 
290
- The adopter's real scorecard is its OWN thin extension. The end-to-end route's
291
- live receipt is kept under the terminal-product goal, and true duplex PTY replay
292
- is deferred to SLICE 5.
259
+ The adopter's real scorecard is its own thin extension. The end-to-end route's
260
+ live receipt is kept under the terminal-product goal. Duplex PTY replay is not
261
+ built.
293
262
 
294
263
  ## The reference adopter (codename-neutral)
295
264
 
296
- The requesting adopter is a public creative-CLI product (see issue #154 for its
297
- concrete public surfaces). Committed source and docs here stay codename-neutral
298
- per the public-surface scan; the committed CI fixture
299
- ([`humanish/labs/terminal-product-demo.yaml`](https://github.com/danielgwilson/humanish/blob/main/humanish/labs/terminal-product-demo.yaml))
300
- uses a FICTIONAL mock CLI (`widgetsmith-cli`) with `example.com` surfaces. The
301
- adopter's real public surfaces appear only in operator-run docs and the GitHub
302
- issue, never in scanned committed text.
265
+ The requesting adopter is a public creative-CLI product. Committed source and docs here
266
+ stay codename-neutral per the public-surface scan; the committed CI fixture
267
+ ([`humanish/studies/terminal-product-demo.yaml`](https://github.com/danielgwilson/humanish/blob/main/humanish/studies/terminal-product-demo.yaml))
268
+ uses a fictional mock CLI (`widgetsmith-cli`) with `example.com` surfaces. The adopter's
269
+ real public surfaces appear only in operator-run docs and a GitHub issue, never in
270
+ scanned committed text.
@@ -0,0 +1,24 @@
1
+ # Contracts
2
+
3
+ Each page describes a shape that code outside humanish can depend on. A documented field is API;
4
+ the types, parsers and validators in `src/` are the source of truth when a page and the code
5
+ disagree.
6
+
7
+ - [schemas.md](schemas.md): every `humanish.*` schema id, the study manifest, the library options
8
+ (`RunStudyOptions`) and the exports removed in 0.107.0.
9
+ - [core.md](core.md): the records a run writes under `.humanish/runs/<id>/` and how each route
10
+ starts a run.
11
+ - [run-bundle.md](run-bundle.md): `humanish.run-bundle.v1`, the evidence contract that `verify`
12
+ checks.
13
+ - [policy.md](policy.md): credential, network, spend, redaction, sharing and assisted-run
14
+ boundaries.
15
+ - [feedback.md](feedback.md): feedback candidates, drafts and issue URLs, which never mutate
16
+ GitHub.
17
+ - [study-analysis.md](study-analysis.md): post-run analysis of retained participant evidence.
18
+ - [study-costs.md](study-costs.md): what `humanish stats` counts as spend.
19
+ - [errors.md](errors.md): the error code families, where each code appears, and the human
20
+ error shape on stderr.
21
+ - [adapter-admission.md](adapter-admission.md): the admission limit a custom provider can raise
22
+ before a request is sent.
23
+ - [adapter-fixtures.md](adapter-fixtures.md): the committed adapter fixtures and the parity checks
24
+ over them.
@@ -1,18 +1,18 @@
1
1
  # Adapter admission limits
2
2
 
3
- Library callers can throw `CuaAdmissionLimitError` from a custom `CuaProvider`
3
+ Library callers can throw `ComputerUseAdmissionLimitError` from a custom `ComputerUseProvider`
4
4
  or the `fetchFn` supplied to `createOpenAiResponsesProvider` when a configured
5
5
  local control limit refuses a request **before provider dispatch**:
6
6
 
7
7
  ```ts
8
- import { CuaAdmissionLimitError, createOpenAiResponsesProvider } from "humanish";
8
+ import { ComputerUseAdmissionLimitError, createOpenAiResponsesProvider } from "humanish";
9
9
 
10
10
  const provider = createOpenAiResponsesProvider({
11
11
  apiKey,
12
12
  fetchFn: async (url, init) => {
13
13
  if (localLimitReached()) {
14
14
  await recordLocalAdmissionRefusal();
15
- throw new CuaAdmissionLimitError();
15
+ throw new ComputerUseAdmissionLimitError();
16
16
  }
17
17
  return transport(url, init);
18
18
  },