humanish 0.107.0 → 0.109.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 (671) hide show
  1. package/ARCHITECTURE.md +73 -69
  2. package/CHANGELOG.md +27 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +148 -175
  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-trace.js +2 -1
  14. package/dist/actors/codex/app-server-ui.js +1 -1
  15. package/dist/actors/codex/codex-admission.d.ts +91 -0
  16. package/dist/actors/codex/codex-admission.js +150 -0
  17. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  18. package/dist/actors/codex/restricted-executable.js +8 -8
  19. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  20. package/dist/actors/codex/restricted-launch.js +1 -1
  21. package/dist/actors/codex/restricted-participant.js +20 -18
  22. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  23. package/dist/actors/codex/restricted-policy.js +2 -2
  24. package/dist/actors/codex/restricted-session.d.ts +3 -3
  25. package/dist/actors/codex/restricted-session.js +10 -5
  26. package/dist/actors/computer-use/actor.d.ts +18 -18
  27. package/dist/actors/computer-use/actor.js +4 -4
  28. package/dist/actors/computer-use/admission-limit.d.ts +3 -3
  29. package/dist/actors/computer-use/admission-limit.js +4 -4
  30. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  31. package/dist/actors/computer-use/executor-error.js +3 -3
  32. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  33. package/dist/actors/computer-use/loop/actions.js +15 -15
  34. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  35. package/dist/actors/computer-use/loop/backstop.js +14 -12
  36. package/dist/actors/computer-use/loop/debrief.js +2 -2
  37. package/dist/actors/computer-use/loop/ending.d.ts +6 -6
  38. package/dist/actors/computer-use/loop/ending.js +18 -17
  39. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  40. package/dist/actors/computer-use/loop/observation.js +15 -14
  41. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  42. package/dist/actors/computer-use/loop/provider-call.js +12 -12
  43. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  44. package/dist/actors/computer-use/loop/session.js +4 -4
  45. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  46. package/dist/actors/computer-use/loop/spend.js +1 -1
  47. package/dist/actors/computer-use/loop/trace.js +11 -9
  48. package/dist/actors/computer-use/loop/types.d.ts +47 -45
  49. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  50. package/dist/actors/computer-use/loop/usage.js +2 -2
  51. package/dist/actors/computer-use/loop.d.ts +6 -1
  52. package/dist/actors/computer-use/loop.js +26 -4
  53. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  54. package/dist/actors/computer-use/openai-context.js +214 -0
  55. package/dist/actors/computer-use/openai-provider.d.ts +13 -10
  56. package/dist/actors/computer-use/openai-provider.js +52 -41
  57. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  58. package/dist/actors/computer-use/openai-requests.js +82 -15
  59. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  60. package/dist/actors/computer-use/openai-wire.js +36 -34
  61. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  62. package/dist/actors/computer-use/provider-error.js +6 -6
  63. package/dist/actors/contract.d.ts +82 -47
  64. package/dist/actors/contract.js +30 -24
  65. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  66. package/dist/actors/local-agent/claude-session.js +13 -12
  67. package/dist/actors/local-agent/cli.d.ts +9 -7
  68. package/dist/actors/local-agent/cli.js +24 -28
  69. package/dist/actors/local-agent/readiness.d.ts +2 -2
  70. package/dist/actors/local-agent/readiness.js +4 -4
  71. package/dist/actors/reasoning-effort.js +8 -8
  72. package/dist/actors/registry.d.ts +12 -12
  73. package/dist/actors/registry.js +21 -20
  74. package/dist/actors/scripted-browser/actor.d.ts +10 -10
  75. package/dist/actors/scripted-browser/actor.js +17 -17
  76. package/dist/actors/scripted-browser/browser-command.js +1 -1
  77. package/dist/actors/scripted-browser/steps.js +1 -1
  78. package/dist/actors/scripted-browser/types.d.ts +1 -1
  79. package/dist/actors/stop-conditions.d.ts +1 -1
  80. package/dist/analysis/automatic-completion.d.ts +7 -7
  81. package/dist/analysis/automatic-completion.js +1 -1
  82. package/dist/analysis/automatic-config.d.ts +6 -6
  83. package/dist/analysis/automatic-config.js +1 -1
  84. package/dist/analysis/codex-config.d.ts +6 -2
  85. package/dist/analysis/codex-config.js +22 -14
  86. package/dist/analysis/execute.d.ts +1 -1
  87. package/dist/analysis/execute.js +1 -1
  88. package/dist/analysis/service.js +5 -5
  89. package/dist/analysis/types.d.ts +6 -0
  90. package/dist/browser-control/client.js +16 -16
  91. package/dist/browser-control/dispatcher.js +4 -4
  92. package/dist/browser-control/protocol.js +14 -14
  93. package/dist/browser-control/recording-transfer.js +4 -4
  94. package/dist/browser-control/transport.js +7 -7
  95. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  96. package/dist/cli/commands/analyze.js +19 -16
  97. package/dist/cli/commands/codex.js +9 -9
  98. package/dist/cli/commands/comms.js +48 -35
  99. package/dist/cli/commands/feedback.js +20 -21
  100. package/dist/cli/commands/migrate.d.ts +4 -0
  101. package/dist/cli/commands/migrate.js +65 -0
  102. package/dist/cli/commands/observe.d.ts +0 -1
  103. package/dist/cli/commands/observe.js +136 -112
  104. package/dist/cli/commands/run-command.d.ts +10 -0
  105. package/dist/cli/commands/run-command.js +85 -0
  106. package/dist/cli/commands/runs.js +136 -139
  107. package/dist/cli/commands/setup.d.ts +2 -2
  108. package/dist/cli/commands/setup.js +27 -24
  109. package/dist/cli/commands/study-format.d.ts +9 -0
  110. package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
  111. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  112. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
  113. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  114. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  115. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  116. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
  117. package/dist/cli/commands/study-route-run.d.ts +19 -0
  118. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  119. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  120. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  121. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  122. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
  123. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  124. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  125. package/dist/cli/commands/study-run.d.ts +9 -0
  126. package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
  127. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
  128. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
  129. package/dist/cli/commands/study.d.ts +3 -0
  130. package/dist/cli/commands/study.js +146 -0
  131. package/dist/cli/commands/tui.d.ts +4 -4
  132. package/dist/cli/commands/tui.js +31 -31
  133. package/dist/cli/commands/watch.js +71 -121
  134. package/dist/cli/deprecations.d.ts +6 -0
  135. package/dist/cli/deprecations.js +18 -0
  136. package/dist/cli/doctor.d.ts +18 -8
  137. package/dist/cli/doctor.js +114 -59
  138. package/dist/cli/first-run-path.d.ts +15 -13
  139. package/dist/cli/first-run-path.js +35 -33
  140. package/dist/cli/io.d.ts +44 -9
  141. package/dist/cli/io.js +98 -23
  142. package/dist/cli/observer-follow.d.ts +3 -3
  143. package/dist/cli/observer-follow.js +6 -7
  144. package/dist/cli/orientation.d.ts +10 -7
  145. package/dist/cli/orientation.js +89 -47
  146. package/dist/cli/product-sentence.d.ts +6 -0
  147. package/dist/cli/product-sentence.js +6 -0
  148. package/dist/cli/program.d.ts +6 -1
  149. package/dist/cli/program.js +111 -43
  150. package/dist/cli/telemetry.d.ts +16 -16
  151. package/dist/cli/telemetry.js +46 -44
  152. package/dist/cli.js +1 -1
  153. package/dist/comms/capture-surface.d.ts +13 -12
  154. package/dist/comms/capture-surface.js +23 -22
  155. package/dist/comms/catch-host.d.ts +7 -7
  156. package/dist/comms/catch-host.js +17 -17
  157. package/dist/comms/connections.d.ts +1 -1
  158. package/dist/comms/connections.js +2 -2
  159. package/dist/comms/email-catch.d.ts +3 -3
  160. package/dist/comms/email-catch.js +8 -8
  161. package/dist/comms/external-evidence.d.ts +5 -5
  162. package/dist/comms/external-evidence.js +5 -4
  163. package/dist/comms/extract.js +2 -2
  164. package/dist/comms/fake-inbox.d.ts +3 -3
  165. package/dist/comms/fake-inbox.js +3 -3
  166. package/dist/comms/receiving-render.d.ts +1 -1
  167. package/dist/comms/receiving-render.js +2 -2
  168. package/dist/comms/receiving-runtime.d.ts +4 -4
  169. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  170. package/dist/comms/sandbox-catch-script.js +6 -6
  171. package/dist/comms/sandbox-catch.d.ts +38 -39
  172. package/dist/comms/sandbox-catch.js +36 -37
  173. package/dist/comms/setup.d.ts +2 -2
  174. package/dist/comms/setup.js +56 -25
  175. package/dist/comms/thread-evidence.d.ts +1 -1
  176. package/dist/comms/thread-evidence.js +6 -6
  177. package/dist/comms/types.d.ts +6 -6
  178. package/dist/comms/types.js +3 -3
  179. package/dist/evidence/frame-signature.d.ts +1 -1
  180. package/dist/evidence/frame-signature.js +4 -4
  181. package/dist/evidence/redaction.d.ts +3 -3
  182. package/dist/evidence/redaction.js +4 -4
  183. package/dist/feedback/draft.js +38 -80
  184. package/dist/feedback/export-bundle.js +1 -1
  185. package/dist/feedback/export.d.ts +5 -1
  186. package/dist/feedback/export.js +10 -10
  187. package/dist/feedback/feedback.d.ts +2 -2
  188. package/dist/feedback/feedback.js +21 -3
  189. package/dist/feedback/proof.d.ts +1 -1
  190. package/dist/feedback/proof.js +2 -2
  191. package/dist/guest/bootstrap.js +6 -6
  192. package/dist/guest/browser-tools.js +8 -8
  193. package/dist/guest/chromium-text.js +19 -19
  194. package/dist/guest/desktop-executor.d.ts +2 -2
  195. package/dist/guest/desktop-executor.js +20 -20
  196. package/dist/guest/desktop-keys.js +4 -4
  197. package/dist/guest/desktop-media.d.ts +2 -2
  198. package/dist/guest/desktop-media.js +16 -16
  199. package/dist/guest/desktop-native.d.ts +1 -1
  200. package/dist/guest/desktop-native.js +10 -10
  201. package/dist/guest/runtime-desktop.js +2 -2
  202. package/dist/guest/runtime-processes.d.ts +2 -2
  203. package/dist/guest/runtime-processes.js +2 -2
  204. package/dist/guest/runtime.js +6 -6
  205. package/dist/index.d.ts +14 -14
  206. package/dist/index.js +8 -8
  207. package/dist/keys/key-resolution.d.ts +5 -5
  208. package/dist/keys/key-resolution.js +23 -23
  209. package/dist/observer/artifact.d.ts +2 -2
  210. package/dist/observer/artifact.js +7 -7
  211. package/dist/observer/data.d.ts +6 -6
  212. package/dist/observer/data.js +5 -4
  213. package/dist/observer/exposure.d.ts +1 -1
  214. package/dist/observer/exposure.js +11 -11
  215. package/dist/observer/http.js +1 -1
  216. package/dist/observer/library.d.ts +3 -1
  217. package/dist/observer/library.js +8 -3
  218. package/dist/observer/listen.js +5 -4
  219. package/dist/observer/render.d.ts +1 -1
  220. package/dist/observer/render.js +17 -6
  221. package/dist/observer/run-routes.d.ts +4 -3
  222. package/dist/observer/run-routes.js +38 -13
  223. package/dist/observer/serve.d.ts +1 -1
  224. package/dist/observer/serve.js +7 -3
  225. package/dist/observer/tunnel.js +1 -1
  226. package/dist/observer-app.html +4 -4
  227. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  228. package/dist/routes/computer-use/bundle-parts.js +18 -17
  229. package/dist/routes/computer-use/bundle.d.ts +2 -2
  230. package/dist/routes/computer-use/bundle.js +10 -9
  231. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
  232. package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
  233. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  234. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
  235. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  236. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
  238. package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
  239. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  240. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
  241. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  242. package/dist/routes/computer-use/external-comms.js +1 -1
  243. package/dist/routes/computer-use/fanout-bundle.js +27 -26
  244. package/dist/routes/computer-use/fanout-records.js +12 -13
  245. package/dist/routes/computer-use/live-flush.d.ts +4 -4
  246. package/dist/routes/computer-use/live-flush.js +6 -6
  247. package/dist/routes/computer-use/live-phase.d.ts +5 -4
  248. package/dist/routes/computer-use/live-phase.js +8 -8
  249. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  250. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  251. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  252. package/dist/routes/computer-use/local-vm.js +3 -3
  253. package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
  254. package/dist/routes/computer-use/participant-desktop.js +5 -5
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +10 -10
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +33 -15
  259. package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
  260. package/dist/routes/computer-use/participant-prompt.js +9 -9
  261. package/dist/routes/computer-use/participant-runs.d.ts +16 -16
  262. package/dist/routes/computer-use/participant-runs.js +26 -25
  263. package/dist/routes/computer-use/plan.d.ts +12 -12
  264. package/dist/routes/computer-use/plan.js +42 -42
  265. package/dist/routes/computer-use/preflight.d.ts +5 -5
  266. package/dist/routes/computer-use/preflight.js +25 -25
  267. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  268. package/dist/routes/computer-use/rerun-selection.js +4 -3
  269. package/dist/routes/computer-use/result.d.ts +4 -4
  270. package/dist/routes/computer-use/result.js +22 -21
  271. package/dist/routes/computer-use/route.d.ts +12 -11
  272. package/dist/routes/computer-use/route.js +31 -30
  273. package/dist/routes/computer-use/self-report.d.ts +7 -7
  274. package/dist/routes/computer-use/self-report.js +32 -32
  275. package/dist/routes/computer-use/setup.d.ts +23 -23
  276. package/dist/routes/computer-use/setup.js +28 -29
  277. package/dist/routes/computer-use/single-bundle.d.ts +11 -11
  278. package/dist/routes/computer-use/single-bundle.js +40 -41
  279. package/dist/routes/computer-use/subject-projection.d.ts +4 -4
  280. package/dist/routes/computer-use/subject-projection.js +6 -6
  281. package/dist/routes/computer-use/types.d.ts +71 -73
  282. package/dist/routes/computer-use/types.js +12 -12
  283. package/dist/routes/preview.d.ts +13 -7
  284. package/dist/routes/preview.js +11 -7
  285. package/dist/routes/scripted/bundle.d.ts +7 -7
  286. package/dist/routes/scripted/bundle.js +20 -18
  287. package/dist/routes/scripted/plan.d.ts +8 -8
  288. package/dist/routes/scripted/plan.js +13 -13
  289. package/dist/routes/scripted/result.d.ts +3 -3
  290. package/dist/routes/scripted/result.js +13 -13
  291. package/dist/routes/scripted/route.d.ts +9 -9
  292. package/dist/routes/scripted/route.js +15 -16
  293. package/dist/routes/scripted/scenario.d.ts +1 -1
  294. package/dist/routes/scripted/scenario.js +5 -5
  295. package/dist/routes/scripted/setup.d.ts +6 -6
  296. package/dist/routes/scripted/setup.js +8 -8
  297. package/dist/routes/scripted/subject.d.ts +5 -5
  298. package/dist/routes/scripted/subject.js +4 -4
  299. package/dist/routes/scripted/surface-records.d.ts +1 -1
  300. package/dist/routes/scripted/surface-records.js +4 -4
  301. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  302. package/dist/routes/scripted/types.d.ts +18 -20
  303. package/dist/routes/scripted/types.js +2 -2
  304. package/dist/routes/shared-world/bundle-records.js +11 -10
  305. package/dist/routes/shared-world/bundle.d.ts +5 -5
  306. package/dist/routes/shared-world/bundle.js +46 -43
  307. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  308. package/dist/routes/shared-world/checkpoints.js +2 -2
  309. package/dist/routes/shared-world/comms.d.ts +14 -14
  310. package/dist/routes/shared-world/comms.js +19 -18
  311. package/dist/routes/shared-world/external-public.d.ts +4 -3
  312. package/dist/routes/shared-world/external-public.js +16 -12
  313. package/dist/routes/shared-world/handoff.d.ts +7 -6
  314. package/dist/routes/shared-world/handoff.js +65 -57
  315. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  316. package/dist/routes/shared-world/lobby-code.js +9 -9
  317. package/dist/routes/shared-world/participant-specs.d.ts +10 -9
  318. package/dist/routes/shared-world/participant-specs.js +38 -31
  319. package/dist/routes/shared-world/plan.d.ts +9 -9
  320. package/dist/routes/shared-world/plan.js +16 -16
  321. package/dist/routes/shared-world/provenance.d.ts +2 -2
  322. package/dist/routes/shared-world/provenance.js +2 -2
  323. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  324. package/dist/routes/shared-world/provisioned.js +18 -17
  325. package/dist/routes/shared-world/result.d.ts +6 -6
  326. package/dist/routes/shared-world/result.js +29 -29
  327. package/dist/routes/shared-world/route.d.ts +11 -11
  328. package/dist/routes/shared-world/route.js +40 -39
  329. package/dist/routes/shared-world/setup.d.ts +16 -16
  330. package/dist/routes/shared-world/setup.js +23 -23
  331. package/dist/routes/shared-world/types.d.ts +55 -53
  332. package/dist/routes/shared-world/types.js +4 -4
  333. package/dist/routes/terminal/adapter.d.ts +5 -5
  334. package/dist/routes/terminal/adapter.js +9 -9
  335. package/dist/routes/terminal/bundle.d.ts +13 -13
  336. package/dist/routes/terminal/bundle.js +28 -27
  337. package/dist/routes/terminal/credentials.d.ts +8 -8
  338. package/dist/routes/terminal/credentials.js +12 -12
  339. package/dist/routes/terminal/dry-run.d.ts +4 -4
  340. package/dist/routes/terminal/dry-run.js +12 -12
  341. package/dist/routes/terminal/encoding.js +2 -2
  342. package/dist/routes/terminal/ledger.d.ts +5 -5
  343. package/dist/routes/terminal/ledger.js +14 -14
  344. package/dist/routes/terminal/lifetime.d.ts +1 -1
  345. package/dist/routes/terminal/lifetime.js +1 -1
  346. package/dist/routes/terminal/live-finish.d.ts +2 -2
  347. package/dist/routes/terminal/live-finish.js +10 -10
  348. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  349. package/dist/routes/terminal/live-sandbox.js +15 -15
  350. package/dist/routes/terminal/participant-text.js +2 -1
  351. package/dist/routes/terminal/persona.d.ts +2 -2
  352. package/dist/routes/terminal/persona.js +3 -3
  353. package/dist/routes/terminal/plan.d.ts +7 -7
  354. package/dist/routes/terminal/plan.js +15 -15
  355. package/dist/routes/terminal/recorder.js +2 -2
  356. package/dist/routes/terminal/result.d.ts +5 -5
  357. package/dist/routes/terminal/result.js +14 -14
  358. package/dist/routes/terminal/route.d.ts +9 -9
  359. package/dist/routes/terminal/route.js +19 -20
  360. package/dist/routes/terminal/sandbox.d.ts +1 -1
  361. package/dist/routes/terminal/sandbox.js +1 -1
  362. package/dist/routes/terminal/session.d.ts +5 -5
  363. package/dist/routes/terminal/session.js +14 -13
  364. package/dist/routes/terminal/token-usage.d.ts +1 -1
  365. package/dist/routes/terminal/token-usage.js +7 -8
  366. package/dist/routes/terminal/trace.d.ts +4 -4
  367. package/dist/routes/terminal/trace.js +2 -2
  368. package/dist/routes/terminal/types.d.ts +48 -50
  369. package/dist/routes/terminal/types.js +5 -5
  370. package/dist/run/bundle-shape.js +3 -3
  371. package/dist/run/bundle.d.ts +49 -49
  372. package/dist/run/bundle.js +3 -2
  373. package/dist/run/cost-summary.js +3 -3
  374. package/dist/run/costs.d.ts +23 -0
  375. package/dist/run/costs.js +79 -44
  376. package/dist/run/detail.d.ts +6 -6
  377. package/dist/run/detail.js +4 -4
  378. package/dist/run/dry-run-inputs.d.ts +1 -1
  379. package/dist/run/dry-run-inputs.js +2 -2
  380. package/dist/run/dry-run.js +20 -20
  381. package/dist/run/judge.d.ts +19 -13
  382. package/dist/run/judge.js +18 -8
  383. package/dist/run/outcomes.d.ts +1 -1
  384. package/dist/run/participant.d.ts +1 -1
  385. package/dist/run/paths.d.ts +1 -1
  386. package/dist/run/paths.js +1 -1
  387. package/dist/run/preflight-receipts.js +1 -1
  388. package/dist/run/pricing.d.ts +11 -6
  389. package/dist/run/pricing.js +22 -15
  390. package/dist/run/projection.d.ts +46 -46
  391. package/dist/run/projection.js +57 -57
  392. package/dist/run/reclaim.d.ts +1 -1
  393. package/dist/run/reclaim.js +3 -3
  394. package/dist/run/results.d.ts +5 -5
  395. package/dist/run/run-cost.d.ts +53 -0
  396. package/dist/run/run-cost.js +105 -0
  397. package/dist/run/run-index-analysis.d.ts +15 -0
  398. package/dist/run/run-index-analysis.js +77 -0
  399. package/dist/run/run-index.d.ts +19 -7
  400. package/dist/run/run-index.js +77 -64
  401. package/dist/run/run-not-found.d.ts +5 -0
  402. package/dist/run/run-not-found.js +15 -0
  403. package/dist/run/run.d.ts +6 -5
  404. package/dist/run/run.js +3 -3
  405. package/dist/run/sandbox-receipts.d.ts +2 -2
  406. package/dist/run/sandbox-receipts.js +3 -3
  407. package/dist/run/shared-world-evidence.d.ts +37 -36
  408. package/dist/run/shared-world-evidence.js +4 -4
  409. package/dist/run/shared-world-shape.d.ts +1 -1
  410. package/dist/run/shared-world-shape.js +7 -7
  411. package/dist/run/stats.d.ts +14 -8
  412. package/dist/run/stats.js +121 -63
  413. package/dist/run/status.d.ts +16 -29
  414. package/dist/run/status.js +10 -29
  415. package/dist/run/stored-runs.js +2 -1
  416. package/dist/run/stream-shape.js +1 -1
  417. package/dist/run/streams.d.ts +7 -7
  418. package/dist/run/study-provenance.d.ts +49 -0
  419. package/dist/run/study-provenance.js +66 -0
  420. package/dist/run/study-result.d.ts +11 -0
  421. package/dist/run/study-result.js +9 -0
  422. package/dist/run/text.d.ts +2 -0
  423. package/dist/run/text.js +4 -0
  424. package/dist/run-study.d.ts +112 -0
  425. package/dist/{run-lab.js → run-study.js} +52 -47
  426. package/dist/{lab → study}/adapter-extension.d.ts +15 -27
  427. package/dist/{lab → study}/adapter-extension.js +10 -45
  428. package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
  429. package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
  430. package/dist/study/composition-rules.d.ts +7 -0
  431. package/dist/{lab → study}/composition-rules.js +53 -53
  432. package/dist/study/config.d.ts +15 -0
  433. package/dist/{lab → study}/config.js +98 -41
  434. package/dist/study/convert.d.ts +33 -0
  435. package/dist/study/convert.js +432 -0
  436. package/dist/{lab → study}/device-presets.d.ts +10 -10
  437. package/dist/{lab → study}/device-presets.js +11 -11
  438. package/dist/study/discover.d.ts +75 -0
  439. package/dist/{lab → study}/discover.js +134 -95
  440. package/dist/{lab → study}/doctor.d.ts +19 -12
  441. package/dist/{lab → study}/doctor.js +58 -20
  442. package/dist/study/field-paths.d.ts +12 -0
  443. package/dist/study/field-paths.js +126 -0
  444. package/dist/study/files.d.ts +26 -0
  445. package/dist/study/files.js +44 -0
  446. package/dist/{lab → study}/init-templates.d.ts +2 -2
  447. package/dist/study/init-templates.js +421 -0
  448. package/dist/{lab → study}/init.d.ts +2 -2
  449. package/dist/{lab → study}/init.js +46 -11
  450. package/dist/study/keys.d.ts +4 -0
  451. package/dist/{lab → study}/keys.js +46 -12
  452. package/dist/study/migrate.d.ts +48 -0
  453. package/dist/study/migrate.js +408 -0
  454. package/dist/study/owned-files.d.ts +38 -0
  455. package/dist/study/owned-files.js +182 -0
  456. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  457. package/dist/{lab → study}/parse/actors.js +14 -14
  458. package/dist/study/parse/comms.d.ts +12 -0
  459. package/dist/{lab → study}/parse/comms.js +5 -5
  460. package/dist/study/parse/execution.d.ts +19 -0
  461. package/dist/{lab → study}/parse/execution.js +13 -13
  462. package/dist/study/parse/study-v3.d.ts +21 -0
  463. package/dist/study/parse/study-v3.js +259 -0
  464. package/dist/study/parse/subject-state.d.ts +30 -0
  465. package/dist/{lab → study}/parse/subject-state.js +19 -19
  466. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  467. package/dist/{lab → study}/parse/subject.js +34 -34
  468. package/dist/{lab → study}/parse/values.d.ts +3 -3
  469. package/dist/{lab → study}/parse/values.js +3 -3
  470. package/dist/{lab → study}/persona-resolve.d.ts +8 -8
  471. package/dist/{lab → study}/persona-resolve.js +6 -6
  472. package/dist/{lab → study}/plan-base.d.ts +7 -7
  473. package/dist/{lab → study}/plan-base.js +1 -1
  474. package/dist/{lab → study}/plan-participants.d.ts +12 -12
  475. package/dist/{lab → study}/plan-participants.js +4 -4
  476. package/dist/{lab → study}/plan-types.d.ts +31 -31
  477. package/dist/{lab → study}/plan-types.js +2 -2
  478. package/dist/study/plan.d.ts +13 -0
  479. package/dist/study/plan.js +101 -0
  480. package/dist/study/preflight-probes.d.ts +3 -0
  481. package/dist/{lab → study}/preflight-probes.js +20 -19
  482. package/dist/study/preflight-result.d.ts +8 -0
  483. package/dist/{lab → study}/preflight-result.js +5 -4
  484. package/dist/study/preflight.d.ts +94 -0
  485. package/dist/{lab → study}/preflight.js +12 -12
  486. package/dist/{lab → study}/requirements.d.ts +3 -3
  487. package/dist/{lab → study}/requirements.js +1 -1
  488. package/dist/study/route-inputs.d.ts +28 -0
  489. package/dist/{lab → study}/route-inputs.js +1 -1
  490. package/dist/{lab → study}/routing.d.ts +39 -33
  491. package/dist/{lab → study}/routing.js +60 -29
  492. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
  493. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
  494. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
  495. package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
  496. package/dist/study/run-study-options.d.ts +28 -0
  497. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
  498. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
  499. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  500. package/dist/{lab → study}/summary.d.ts +16 -15
  501. package/dist/{lab → study}/summary.js +21 -21
  502. package/dist/{lab → study}/tasks.d.ts +18 -18
  503. package/dist/{lab → study}/tasks.js +14 -14
  504. package/dist/{lab → study}/types.d.ts +202 -196
  505. package/dist/{lab → study}/types.js +3 -1
  506. package/dist/{lab → study}/validation.d.ts +27 -27
  507. package/dist/{lab → study}/validation.js +53 -51
  508. package/dist/study/warnings.d.ts +12 -0
  509. package/dist/{lab → study}/warnings.js +62 -34
  510. package/dist/subject/clone.d.ts +7 -7
  511. package/dist/subject/clone.js +2 -2
  512. package/dist/subject/desktop-cli.d.ts +1 -1
  513. package/dist/subject/desktop-cli.js +2 -2
  514. package/dist/subject/local-tree-archive.d.ts +2 -2
  515. package/dist/subject/local-tree-archive.js +4 -4
  516. package/dist/subject/local-tree.d.ts +4 -4
  517. package/dist/subject/node-bootstrap.js +1 -1
  518. package/dist/subject/runtime.js +9 -10
  519. package/dist/subject/serve.d.ts +5 -5
  520. package/dist/subject/serve.js +3 -3
  521. package/dist/subject/state.d.ts +4 -4
  522. package/dist/subject/state.js +1 -1
  523. package/dist/subject/steps.d.ts +6 -6
  524. package/dist/subject/steps.js +5 -5
  525. package/dist/substrates/command-failure.d.ts +3 -3
  526. package/dist/substrates/command-failure.js +3 -3
  527. package/dist/substrates/desktop-session.js +2 -2
  528. package/dist/substrates/detached.d.ts +6 -6
  529. package/dist/substrates/detached.js +7 -7
  530. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  531. package/dist/substrates/e2b/cdp-probe.js +14 -17
  532. package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
  533. package/dist/substrates/e2b/desktop-browser.js +9 -9
  534. package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
  535. package/dist/substrates/e2b/desktop-cdp.js +9 -9
  536. package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
  537. package/dist/substrates/e2b/desktop-executor.js +13 -13
  538. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  539. package/dist/substrates/e2b/desktop-geometry.js +8 -8
  540. package/dist/substrates/e2b/desktop-media.d.ts +4 -4
  541. package/dist/substrates/e2b/desktop-media.js +1 -1
  542. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  543. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  544. package/dist/substrates/e2b/lifetime.js +1 -1
  545. package/dist/substrates/e2b/sandbox.d.ts +4 -4
  546. package/dist/substrates/e2b/sandbox.js +2 -2
  547. package/dist/substrates/e2b/sdk.d.ts +12 -12
  548. package/dist/substrates/e2b/sdk.js +7 -7
  549. package/dist/substrates/local/runtime-config.d.ts +4 -4
  550. package/dist/substrates/local/runtime-config.js +4 -4
  551. package/dist/tui/actions.d.ts +1 -1
  552. package/dist/tui/actions.js +13 -13
  553. package/dist/tui/contract.d.ts +23 -23
  554. package/dist/tui/contract.js +11 -11
  555. package/dist/tui/launch.d.ts +7 -7
  556. package/dist/tui/launch.js +36 -31
  557. package/dist/tui/project.js +5 -5
  558. package/dist/tui-app.js +139 -139
  559. package/dist/verify/actor.d.ts +8 -8
  560. package/dist/verify/actor.js +36 -36
  561. package/dist/verify/artifacts.d.ts +2 -2
  562. package/dist/verify/artifacts.js +3 -3
  563. package/dist/verify/context-growth.d.ts +9 -0
  564. package/dist/verify/context-growth.js +62 -0
  565. package/dist/verify/costs.d.ts +6 -6
  566. package/dist/verify/costs.js +8 -8
  567. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  568. package/dist/verify/shared-world-concurrent.js +79 -76
  569. package/dist/verify/shared-world.d.ts +2 -2
  570. package/dist/verify/shared-world.js +16 -16
  571. package/dist/verify/subject.d.ts +5 -5
  572. package/dist/verify/subject.js +19 -19
  573. package/dist/verify/verify.js +94 -44
  574. package/docs/README.md +25 -32
  575. package/docs/architecture/actor-contract.md +60 -91
  576. package/docs/architecture/browser-control.md +1 -1
  577. package/docs/architecture/desktop-sessions.md +7 -7
  578. package/docs/architecture/external-public-shared-world.md +68 -65
  579. package/docs/architecture/github-feedback-loop.md +2 -5
  580. package/docs/architecture/guest-desktop.md +2 -2
  581. package/docs/architecture/observer.md +34 -34
  582. package/docs/architecture/restricted-codex-analysis.md +34 -28
  583. package/docs/architecture/serve.md +34 -37
  584. package/docs/architecture/state-driven-executor.md +55 -58
  585. package/docs/architecture/task-protocol-support.md +6 -6
  586. package/docs/architecture/terminal-product-route.md +70 -110
  587. package/docs/contracts/README.md +24 -0
  588. package/docs/contracts/adapter-admission.md +3 -3
  589. package/docs/contracts/adapter-fixtures.md +4 -7
  590. package/docs/contracts/core.md +1 -3
  591. package/docs/contracts/errors.md +62 -0
  592. package/docs/contracts/feedback.md +8 -9
  593. package/docs/contracts/policy.md +7 -12
  594. package/docs/contracts/run-bundle.md +42 -44
  595. package/docs/contracts/schemas.md +446 -368
  596. package/docs/contracts/study-analysis.md +7 -4
  597. package/docs/contracts/study-costs.md +28 -9
  598. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  599. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  600. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  601. package/docs/principles/actor-fidelity.md +4 -4
  602. package/docs/principles/engineering.md +3 -3
  603. package/docs/principles/invariants-and-defaults.md +38 -38
  604. package/docs/principles/self-driving-harness.md +1 -5
  605. package/docs/principles/three-roles.md +1 -1
  606. package/docs/product/automatic-analysis.md +7 -7
  607. package/examples/README.md +1 -1
  608. package/examples/participant/README.md +5 -5
  609. package/examples/participant/run.mjs +11 -10
  610. package/examples/scorer/README.md +3 -3
  611. package/examples/scorer/run.mjs +11 -12
  612. package/examples/scorer/scorer.mjs +3 -3
  613. package/package.json +16 -17
  614. package/skills/humanish/SKILL.md +64 -60
  615. package/skills/humanish/agents/openai.yaml +1 -1
  616. package/AGENTS.md +0 -99
  617. package/CONTRIBUTING.md +0 -148
  618. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  619. package/dist/actors/codex/qualified-versions.js +0 -132
  620. package/dist/cli/commands/lab-format.d.ts +0 -8
  621. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  622. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  623. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  624. package/dist/cli/commands/lab-run.d.ts +0 -9
  625. package/dist/cli/commands/lab.d.ts +0 -3
  626. package/dist/cli/commands/lab.js +0 -199
  627. package/dist/cli/renamed-options.d.ts +0 -11
  628. package/dist/cli/renamed-options.js +0 -18
  629. package/dist/lab/composition-rules.d.ts +0 -7
  630. package/dist/lab/config.d.ts +0 -7
  631. package/dist/lab/discover.d.ts +0 -65
  632. package/dist/lab/init-templates.js +0 -416
  633. package/dist/lab/keys.d.ts +0 -2
  634. package/dist/lab/parse/comms.d.ts +0 -12
  635. package/dist/lab/parse/execution.d.ts +0 -19
  636. package/dist/lab/parse/subject-state.d.ts +0 -30
  637. package/dist/lab/plan.d.ts +0 -19
  638. package/dist/lab/plan.js +0 -132
  639. package/dist/lab/preflight-probes.d.ts +0 -3
  640. package/dist/lab/preflight-result.d.ts +0 -7
  641. package/dist/lab/preflight.d.ts +0 -92
  642. package/dist/lab/route-inputs.d.ts +0 -28
  643. package/dist/lab/run-lab-options.d.ts +0 -28
  644. package/dist/lab/warnings.d.ts +0 -2
  645. package/dist/observer/static.d.ts +0 -39
  646. package/dist/observer/static.js +0 -369
  647. package/dist/run-lab.d.ts +0 -112
  648. package/docs/architecture/comms-inbox.md +0 -122
  649. package/docs/architecture/desktop-recording.md +0 -80
  650. package/docs/architecture/local-browser-runtime.md +0 -178
  651. package/docs/architecture/observer-review.md +0 -144
  652. package/docs/architecture/participant-media.md +0 -90
  653. package/docs/architecture/project-layout.md +0 -62
  654. package/docs/architecture/real-email-receiving.md +0 -136
  655. package/docs/assets/humanish-drawdb-hero.png +0 -0
  656. package/docs/assets/humanish-observer-hero.png +0 -0
  657. package/docs/goals/current.md +0 -207
  658. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  659. package/docs/product/open-source-install-experience.md +0 -240
  660. package/docs/ramp/README.md +0 -295
  661. package/docs/release/open-source-readiness.md +0 -222
  662. package/docs/release/public-readiness-standard.md +0 -210
  663. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  664. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  665. /package/dist/{lab → study}/init-paths.js +0 -0
  666. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  667. /package/dist/{lab → study}/init-plan.js +0 -0
  668. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  669. /package/dist/{lab → study}/participant-assignment.js +0 -0
  670. /package/dist/{lab → study}/persona.d.ts +0 -0
  671. /package/dist/{lab → study}/persona.js +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,47 +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, the computer-use route 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` 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
211
208
  its own E2B desktop and the in-process route has none.
212
- - `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
213
210
  without `inProcess` (there is no built-in in-process driver yet). A structured error,
214
211
  never a desktop attempt.
215
- - `HUMANISH_CUA_LAB_LOCAL_DESKTOP_MISSING`: an `app-url` lab with `execution.target: local`
216
- and no local desktop. `runLab` gives a local browser study its desktop; a direct route
217
- call or an in-process executor on the same lab has none.
218
- - `HUMANISH_CUA_LAB_EXECUTOR_NO_PROVIDER`: the route's internal executor hook without its
219
- provider hook. A package caller gets `HUMANISH_LAB_OPTION_UNSUPPORTED` above instead.
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.
220
217
 
221
- 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
222
219
  executor, so no `OPENAI_API_KEY`/`E2B_API_KEY` is required.
223
220
 
224
221
  ## A note on `appState` typing
225
222
 
226
- `CuaObservation.appState` is `Record<string, unknown> | undefined` under the
223
+ `ComputerUseObservation.appState` is `Record<string, unknown> | undefined` under the
227
224
  repo's strict flags (`exactOptionalPropertyTypes`, `noUncheckedIndexedAccess`).
228
- 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>`
229
226
  (interfaces have no implicit index signature), and a direct `as Record<...>` cast
230
227
  on an interface-typed value is rejected. Use one of:
231
228
 
@@ -236,15 +233,15 @@ on an interface-typed value is rejected. Use one of:
236
233
  Read every optional field defensively, and spread-omit optional fields
237
234
  (`...(x === undefined ? {} : { x })`) rather than assigning `undefined`.
238
235
 
239
- ## Deferred (tracked, not shipped here)
236
+ ## Not built
240
237
 
241
- - **PR2: a config-only deterministic `state-contract` route.** A registered,
238
+ - **A config-only deterministic `state-contract` route.** A registered,
242
239
  model-free route driving a built-in `window.app.*` bridge over the existing
243
- `ScriptedPageLike.evaluate` primitive + a YAML step program, `scenario.mode:
244
- 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
245
242
  `runComputerUseLoop`, and must not overclaim friction-loop reuse.
246
- - **PR3: a `subject.contract.ref` JS-module loader.** A config-referenced module
247
- 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
248
245
  surface with no precedent in this repo (the scripted route loads only declarative
249
246
  YAML; serve commands run isolated inside the disposable E2B sandbox). It earns
250
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,12 +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
- reports `HUMANISH_LAB_TASKS_UNSUPPORTED` in the route's failure envelope, from
27
- `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
+ `planStudy` (`src/study/plan.ts`) and each route's plan.
28
28
  Refusal precedes run storage, source preparation, user hooks, local processes,
29
29
  sandbox allocation, and model calls. No task content appears in the error.
30
30
 
31
31
  A future route gains support only after proving participant goals, hidden criteria,
32
- observation-backed completion, honest missing-input treatment, and per-participant
32
+ observation-backed completion, explicit missing-input handling, and per-participant
33
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,39 +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` | Passed to Codex as `--model` (default `gpt-5.6-sol`) and `-c model_reasoning_effort`; 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
- | route | `terminal` → `runTerminalProductLab` ([`src/routes/terminal/route.ts`](https://github.com/danielgwilson/humanish/blob/main/src/routes/terminal/route.ts)) |
46
-
47
- Routing is `routeOf` (`src/lab/plan.ts`). It sends every `terminal-product` subject to
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` → `runTerminalProductStudy` ([`src/routes/terminal/route.ts`](https://github.com/danielgwilson/humanish/blob/main/src/routes/terminal/route.ts)) |
40
+
41
+ Routing is `routeOf` (`src/study/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
- `isTerminalProductComposition(config)` (`src/lab/routing.ts`) also feeds the forward-declared
43
+ `isTerminalProductComposition(config)` (`src/study/routing.ts`) also feeds the forward-declared
50
44
  warnings.
51
45
 
52
46
  ## Repeating a terminal study with the same runtime
53
47
 
54
48
  ```yaml
55
- actors:
56
- - type: codex-exec
57
- model: gpt-5.6-sol
58
- reasoningEffort: low
49
+ actor:
50
+ type: codex-exec
51
+ model: gpt-5.6-sol
52
+ reasoningEffort: low
59
53
  execution:
60
54
  target: e2b-terminal
61
55
  runtime:
@@ -75,7 +69,7 @@ the requested model and where it came from, declared effort, and the usage granu
75
69
  The observed executable version also appears as `providerVersion`.
76
70
 
77
71
  Codex's `--json` stream does not name the model it used, and its built-in default can change
78
- with any release. So the route always passes `--model`: the lab's `actors[0].model`
72
+ with any release. So the route always passes `--model`: the study's `actor.model`
79
73
  (`modelStatus: declared`), or humanish's participant default `gpt-5.6-sol`
80
74
  (`modelStatus: humanish_default`). Bundles written before 0.107.0 record
81
75
  `runtime_default_unobserved` with no requested model.
@@ -87,7 +81,7 @@ requested model. Codex `turn.completed` usage sums every request in a turn, so n
87
81
  size is known and no per-request long-context tier can be applied. The estimate prices every token
88
82
  at the base tier, with cached input at the cached rate, and says so with
89
83
  `basis: aggregated_turns_base_rate`. It is an estimate, not a measurement. The cost ledger
90
- checked against `scenario.caps.maxUsd` keeps the provider line unmeasured, and the studied
84
+ checked against `caps.maxUsd` keeps the provider line unmeasured, and the studied
91
85
  product's no-spend boundary still needs separate interpretation.
92
86
 
93
87
  ## Runtime auth: raw-key placement and remaining provider access
@@ -131,11 +125,11 @@ make authenticated requests to that host from sandbox creation until teardown,
131
125
  including bootstrap/setup commands and commands launched outside Codex. Calls
132
126
  made outside Codex may be absent from its usage ledger. This mode does not impose
133
127
  a provider-side spending limit, restrict models/API paths, or make
134
- `scenario.caps.maxUsd` a preventive provider budget. A hard provider budget needs
128
+ `caps.maxUsd` a preventive provider budget. A hard provider budget needs
135
129
  a separately enforced control; do not infer zero spend from an unmeasured ledger
136
130
  line.
137
131
 
138
- Public internet discovery stays unrestricted unless the lab already declares
132
+ Public internet discovery stays unrestricted unless the study already declares
139
133
  `execution.egressAllow`. The mode preserves that allowlist and its deny-all
140
134
  fallback without adding hosts. If an allowlist omits `api.openai.com`, provider
141
135
  requests can fail. E2B domain allowlists are routing controls rather than strict
@@ -155,7 +149,7 @@ and [E2B's CA installer](https://github.com/e2b-dev/infra/blob/main/packages/env
155
149
  E2B's installed
156
150
  SDK documents that transformed headers override request headers. Deterministic
157
151
  request/redaction tests do not establish live wire behavior. The [2026-09-05
158
- 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)
159
153
  records the controlled live header/auth checks and their scope.
160
154
 
161
155
  ## Runtime prerequisite
@@ -180,7 +174,7 @@ checks Node/npm in both ordinary and sudo shells after installation. The existin
180
174
  runtime fast path preserves user-specific installations; a later sudo product
181
175
  install can still fail if that installation is absent from sudo's PATH.
182
176
 
183
- 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)
184
178
  records the regression found after the initial runtime-only proof and its stock
185
179
  desktop checks. npm documents [global executable locations](https://docs.npmjs.com/cli/v10/configuring-npm/folders#executables)
186
180
  and the [distribution built-in configuration](https://docs.npmjs.com/cli/v10/configuring-npm/npmrc#built-in-config-file).
@@ -212,99 +206,65 @@ blast radius is bounded by key scoping and budgets, not by hoping._
212
206
 
213
207
  The inversion is declared as registry metadata, not a code convention: the
214
208
  terminal actor's capabilities carry `keyPlacement: "in-sandbox-command-scoped"`.
215
- SLICE 1 shipped the DECLARED field + value (the contract was honest about where
216
- the key would go); SLICE 2's engine added command-scoped injection (only into the
217
- per-command `envs` of the `codex` invocation, never `Sandbox.create({envs})`)
218
- keyed off that capability, plus the deny-by-default credential allowlist, the
219
- positive-allowlist sandbox metadata, the cleanup proof, the interventions ledger,
220
- and a minimal fail-closed cap.
221
-
222
- ## Historical SLICE 1 scope (DRY-RUN only when shipped)
223
-
224
- At SLICE 1, `runTerminalProductLab` implemented only the dry-run path: it built a valid
225
- `humanish.run-bundle.v1` contract bundle, honestly labeled contract-only, with:
226
-
227
- - the subject declared as a terminal-product with its public surfaces, provenance
228
- **UNPINNED** (the agent drives public surfaces, not a clone; invariant 5);
229
- - the author mission recorded as plaintext (public-safe committed lab text) + a
230
- **digest** of the full composed prompt (nothing beyond the author mission goes
231
- plaintext);
232
- - the caps / deny-by-default policies / runtime-auth channel recorded as
233
- declarations (names only; invariant 1);
234
- - a terminal-kind stream that is an honest **contract placeholder**: stdin
235
- disabled, empty tail, `transport: snapshot`, **not** `pty` (captured
236
- non-interactive exec output is never an interactive PTY; invariant 6 + the
237
- goal packet's PTY ruling). SLICE 2 later added redacted exec-stream capture;
238
- - empty/placeholder ledgers (substrate lifecycle, command log, terminal event
239
- stream, interventions, cost) that SLICE 2/3 later filled.
240
-
241
- The dry-run bundle passed the existing `verifyRun`. Terminal-specific verifier
242
- checks (terminal/transcript presence, lifecycle, cleanup, interventions,
243
- metadata allowlist, no-credential-in-artifacts, no-spend) landed in SLICE 2/3.
244
-
245
- At SLICE 1, a non-dry-run call returned a structured
246
- `HUMANISH_TERMINAL_AGENT_NOT_IMPLEMENTED` failure before launch or spend.
247
- SLICE 2 implemented the real session.
248
-
249
- SLICE 1 declared the DI seams SLICE 2 needed (`loadModule`, `buildSandbox`,
250
- `runtimeAuthEnv`, `detachedTimers`) on a terminal hook bag; only the dry-run path was
251
- implemented in that slice. The bag is gone. The route reads `env` and `scorer` from its
252
- options (`src/routes/terminal/types.ts`), and a test passes its seams (`desktopModule`,
253
- `renderObserver`, `now`, `costProbe`) as `LabDeps` (`src/lab/lab-deps.ts`).
254
-
255
- ## SLICE 4: the product-adapter extension seam (layer 6)
256
-
257
- This route is proof-roadmap **layer 6**: an adopter attaches product-specific
258
- scoring + feedback as a THIN in-repo extension WITHOUT forking core. SLICE 4
259
- ships the SEAM. Core ships no built-in product scorer; the adopter's scorecard
260
- 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 `StudyDeps`
218
+ (`src/study/study-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:
261
225
 
262
226
  - **Exported contract types** a thin adapter types against from the package barrel
263
227
  (`humanish`) alone, never through a deep `src/` import: `RunBundle`,
264
228
  `RunFeedbackCandidate`, `RunAdapterScore`, `RunAdapterArtifact`, `ActorTrace`,
265
229
  `AdapterScorerModule` and `TerminalProductScoringContext`. The ledger, cost and
266
230
  no-spend shapes are reached through that context's fields, as
267
- `TerminalProductScoringContext["ledgers"]`. Before this slice these were not
268
- exported, which forced a fork (a thin adapter could not type against the bundle),
269
- the gap issue #154 acceptance #8 names.
270
- - **A registrable scorer / feedback module**, `RunLabOptions.scorer` (an
231
+ `TerminalProductScoringContext["ledgers"]`.
232
+ - **A registrable scorer / feedback module**, `RunStudyOptions.scorer` (an
271
233
  `AdapterScorerModule`): `score?(ctx) => RunAdapterScore | Promise<…>` and
272
234
  `deriveFeedback?(ctx) => RunFeedbackCandidate[] | Promise<…>`, where this route's
273
235
  `ctx` is a `TerminalProductScoringContext`. The older `terminalHooks.score` and
274
236
  `terminalHooks.deriveFeedback` were removed with the bag. The route calls the
275
- hooks over the FULLY-ASSEMBLED, redacted evidence and attaches the results
276
- (`bundle.adapterScore`, appended `bundle.feedbackCandidates`) WITHOUT core knowing
237
+ hooks over the fully-assembled, redacted evidence and attaches the results
238
+ (`bundle.adapterScore`, appended `bundle.feedbackCandidates`) without core knowing
277
239
  any product noun. Default (no hook) behavior is unchanged: the mission-based verdict
278
240
  stands alone.
279
241
  - **Adapter-namespaced product nouns.** Product-specific concepts (public
280
242
  CLI/product command observed, hosted product success-or-blocker, feedback
281
243
  id/draft, media/job/asset ids, no-media/no-provider-spend proof,
282
- defection/friction risk) ride ONLY under a single namespaced field
244
+ defection/friction risk) ride only under a single namespaced field
283
245
  (`RunFeedbackCandidate.adapter: { namespace, data }` and
284
246
  `RunAdapterScore.{namespace, data}`) so core's enums stay product-agnostic and
285
247
  a future inert-field audit never misfires. No adopter noun is hardcoded into a
286
248
  core enum (avoiding closed-taxonomy rot); `e2b-terminal` is added to the
287
- 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.
288
250
 
289
- 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
290
252
  any malformed score/candidate with a warning, and `verifyRun` re-checks the
291
253
  surviving shapes, so a bad extension never poisons a verifiable bundle. Proven by
292
254
  `tests/routes/terminal/product-adapter-seam.test.ts` (a thin in-repo example adapter
293
255
  typing against the barrel only, registering a scorer, attaching namespaced nouns,
294
- emitting a candidate; the bundle verifies). At SLICE 4 this was contract proof,
295
- not a live rung; the later end-to-end route receipt is linked from the status
296
- 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.
297
258
 
298
- The adopter's real scorecard is its OWN thin extension. The end-to-end route's
299
- live receipt is kept under the terminal-product goal, and true duplex PTY replay
300
- 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.
301
262
 
302
263
  ## The reference adopter (codename-neutral)
303
264
 
304
- The requesting adopter is a public creative-CLI product (see issue #154 for its
305
- concrete public surfaces). Committed source and docs here stay codename-neutral
306
- per the public-surface scan; the committed CI fixture
307
- ([`humanish/labs/terminal-product-demo.yaml`](https://github.com/danielgwilson/humanish/blob/main/humanish/labs/terminal-product-demo.yaml))
308
- uses a FICTIONAL mock CLI (`widgetsmith-cli`) with `example.com` surfaces. The
309
- adopter's real public surfaces appear only in operator-run docs and the GitHub
310
- 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
  },
@@ -1,10 +1,7 @@
1
1
  # Adapter Fixture Parity Contract
2
2
 
3
- Date: 2026-06-02 (current-state note updated 2026-07-14)
4
-
5
- Status: committed contract fixtures with passing parity checks. A fixture
6
- proves that core can carry an adapter-owned evidence shape; it does not prove a
7
- live adopter integration or satisfy a deletion-branch depth phase.
3
+ The committed fixtures pass their parity checks. A fixture proves that core can carry an
4
+ adapter-owned evidence shape; it does not prove a live adopter integration.
8
5
 
9
6
  ## Purpose
10
7
 
@@ -42,7 +39,7 @@ A fixture can be promoted only when:
42
39
  - credential policy records env var names only, never values;
43
40
  - adapter-owned nouns do not appear in core schema docs or core runtime code;
44
41
  - public feedback material states that GitHub mutation was not performed;
45
- - the fixture can be checked with `pnpm test tests/lab/adapter-fixtures.test.ts`
42
+ - the fixture can be checked with `pnpm test tests/study/adapter-fixtures.test.ts`
46
43
  and `pnpm public-surface:scan`.
47
44
 
48
45
  ## Dry-Run Web-App Fixture Shape
@@ -77,6 +74,6 @@ This keeps terminal and feedback parity independent from browser screenshots.
77
74
  ## Proof Commands
78
75
 
79
76
  ```bash
80
- pnpm test tests/lab/adapter-fixtures.test.ts
77
+ pnpm test tests/study/adapter-fixtures.test.ts
81
78
  pnpm public-surface:scan
82
79
  ```