humanish 0.107.0 → 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 (521) hide show
  1. package/ARCHITECTURE.md +22 -17
  2. package/CHANGELOG.md +14 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +145 -172
  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-ui.js +1 -1
  14. package/dist/actors/codex/codex-admission.d.ts +91 -0
  15. package/dist/actors/codex/codex-admission.js +150 -0
  16. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  17. package/dist/actors/codex/restricted-executable.js +8 -8
  18. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  19. package/dist/actors/codex/restricted-launch.js +1 -1
  20. package/dist/actors/codex/restricted-participant.js +8 -6
  21. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  22. package/dist/actors/codex/restricted-policy.js +2 -2
  23. package/dist/actors/codex/restricted-session.d.ts +2 -2
  24. package/dist/actors/codex/restricted-session.js +10 -5
  25. package/dist/actors/computer-use/actor.d.ts +16 -16
  26. package/dist/actors/computer-use/actor.js +2 -2
  27. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  28. package/dist/actors/computer-use/admission-limit.js +1 -1
  29. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  30. package/dist/actors/computer-use/loop/actions.js +10 -10
  31. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  32. package/dist/actors/computer-use/loop/backstop.js +14 -12
  33. package/dist/actors/computer-use/loop/ending.d.ts +5 -5
  34. package/dist/actors/computer-use/loop/ending.js +7 -7
  35. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  36. package/dist/actors/computer-use/loop/observation.js +9 -9
  37. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  38. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  39. package/dist/actors/computer-use/loop/session.js +3 -3
  40. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  41. package/dist/actors/computer-use/loop/spend.js +1 -1
  42. package/dist/actors/computer-use/loop/trace.js +9 -8
  43. package/dist/actors/computer-use/loop/types.d.ts +25 -23
  44. package/dist/actors/computer-use/loop/usage.js +2 -2
  45. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  46. package/dist/actors/computer-use/openai-context.js +214 -0
  47. package/dist/actors/computer-use/openai-provider.d.ts +11 -8
  48. package/dist/actors/computer-use/openai-provider.js +45 -34
  49. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  50. package/dist/actors/computer-use/openai-requests.js +82 -15
  51. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  52. package/dist/actors/computer-use/openai-wire.js +36 -34
  53. package/dist/actors/contract.d.ts +78 -43
  54. package/dist/actors/contract.js +29 -23
  55. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  56. package/dist/actors/local-agent/claude-session.js +10 -9
  57. package/dist/actors/local-agent/cli.d.ts +8 -6
  58. package/dist/actors/local-agent/cli.js +24 -28
  59. package/dist/actors/local-agent/readiness.d.ts +2 -2
  60. package/dist/actors/local-agent/readiness.js +4 -4
  61. package/dist/actors/reasoning-effort.js +6 -6
  62. package/dist/actors/registry.d.ts +10 -10
  63. package/dist/actors/registry.js +18 -17
  64. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  65. package/dist/actors/scripted-browser/actor.js +16 -16
  66. package/dist/actors/scripted-browser/browser-command.js +1 -1
  67. package/dist/actors/scripted-browser/steps.js +1 -1
  68. package/dist/actors/scripted-browser/types.d.ts +1 -1
  69. package/dist/actors/stop-conditions.d.ts +1 -1
  70. package/dist/analysis/codex-config.d.ts +6 -2
  71. package/dist/analysis/codex-config.js +22 -14
  72. package/dist/analysis/service.js +5 -5
  73. package/dist/cli/commands/analyze.js +19 -16
  74. package/dist/cli/commands/codex.js +9 -9
  75. package/dist/cli/commands/comms.js +54 -33
  76. package/dist/cli/commands/feedback.js +20 -21
  77. package/dist/cli/commands/lab-format.d.ts +5 -4
  78. package/dist/cli/commands/lab-format.js +35 -23
  79. package/dist/cli/commands/lab-route-computer-use.js +6 -7
  80. package/dist/cli/commands/lab-route-preview.js +4 -3
  81. package/dist/cli/commands/lab-route-shared-world.js +3 -3
  82. package/dist/cli/commands/lab-run.js +10 -11
  83. package/dist/cli/commands/lab-scorer.d.ts +2 -2
  84. package/dist/cli/commands/lab-scorer.js +1 -1
  85. package/dist/cli/commands/migrate.d.ts +4 -0
  86. package/dist/cli/commands/migrate.js +65 -0
  87. package/dist/cli/commands/observe.js +147 -108
  88. package/dist/cli/commands/run-command.d.ts +10 -0
  89. package/dist/cli/commands/run-command.js +85 -0
  90. package/dist/cli/commands/runs.js +137 -138
  91. package/dist/cli/commands/setup.d.ts +2 -2
  92. package/dist/cli/commands/setup.js +26 -21
  93. package/dist/cli/commands/study.d.ts +3 -0
  94. package/dist/cli/commands/study.js +182 -0
  95. package/dist/cli/commands/tui.d.ts +4 -4
  96. package/dist/cli/commands/tui.js +21 -21
  97. package/dist/cli/commands/watch.js +60 -75
  98. package/dist/cli/deprecations.d.ts +18 -0
  99. package/dist/cli/deprecations.js +48 -0
  100. package/dist/cli/doctor.d.ts +15 -5
  101. package/dist/cli/doctor.js +103 -48
  102. package/dist/cli/first-run-path.d.ts +12 -10
  103. package/dist/cli/first-run-path.js +30 -28
  104. package/dist/cli/io.d.ts +41 -6
  105. package/dist/cli/io.js +97 -22
  106. package/dist/cli/observer-follow.d.ts +2 -2
  107. package/dist/cli/observer-follow.js +5 -6
  108. package/dist/cli/orientation.d.ts +6 -3
  109. package/dist/cli/orientation.js +43 -39
  110. package/dist/cli/product-sentence.d.ts +6 -0
  111. package/dist/cli/product-sentence.js +6 -0
  112. package/dist/cli/program.d.ts +6 -1
  113. package/dist/cli/program.js +109 -40
  114. package/dist/cli/telemetry.d.ts +15 -15
  115. package/dist/cli/telemetry.js +48 -40
  116. package/dist/cli.js +1 -1
  117. package/dist/comms/capture-surface.d.ts +13 -12
  118. package/dist/comms/capture-surface.js +23 -22
  119. package/dist/comms/catch-host.d.ts +7 -7
  120. package/dist/comms/catch-host.js +14 -14
  121. package/dist/comms/email-catch.d.ts +3 -3
  122. package/dist/comms/email-catch.js +8 -8
  123. package/dist/comms/external-evidence.js +2 -2
  124. package/dist/comms/extract.js +2 -2
  125. package/dist/comms/fake-inbox.d.ts +2 -2
  126. package/dist/comms/fake-inbox.js +2 -2
  127. package/dist/comms/receiving-render.d.ts +1 -1
  128. package/dist/comms/receiving-render.js +2 -2
  129. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  130. package/dist/comms/sandbox-catch-script.js +6 -6
  131. package/dist/comms/sandbox-catch.d.ts +36 -37
  132. package/dist/comms/sandbox-catch.js +34 -35
  133. package/dist/comms/setup.js +42 -8
  134. package/dist/comms/thread-evidence.d.ts +1 -1
  135. package/dist/comms/thread-evidence.js +6 -6
  136. package/dist/comms/types.d.ts +6 -6
  137. package/dist/comms/types.js +3 -3
  138. package/dist/evidence/frame-signature.d.ts +1 -1
  139. package/dist/evidence/frame-signature.js +4 -4
  140. package/dist/evidence/redaction.d.ts +3 -3
  141. package/dist/evidence/redaction.js +4 -4
  142. package/dist/feedback/draft.js +36 -78
  143. package/dist/feedback/export-bundle.js +1 -1
  144. package/dist/feedback/export.d.ts +5 -1
  145. package/dist/feedback/export.js +7 -8
  146. package/dist/feedback/feedback.d.ts +2 -2
  147. package/dist/feedback/feedback.js +21 -3
  148. package/dist/guest/chromium-text.js +2 -2
  149. package/dist/guest/desktop-native.d.ts +1 -1
  150. package/dist/guest/runtime.js +1 -1
  151. package/dist/index.d.ts +12 -10
  152. package/dist/index.js +8 -6
  153. package/dist/keys/key-resolution.d.ts +5 -5
  154. package/dist/keys/key-resolution.js +23 -23
  155. package/dist/lab/adapter-extension.d.ts +7 -7
  156. package/dist/lab/adapter-extension.js +13 -36
  157. package/dist/lab/adapter-scorer-loader.d.ts +7 -7
  158. package/dist/lab/adapter-scorer-loader.js +32 -32
  159. package/dist/lab/composition-rules.js +42 -42
  160. package/dist/lab/config.js +65 -25
  161. package/dist/lab/deprecated-fields.d.ts +10 -0
  162. package/dist/lab/deprecated-fields.js +24 -0
  163. package/dist/lab/device-presets.d.ts +8 -8
  164. package/dist/lab/device-presets.js +11 -11
  165. package/dist/lab/discover.d.ts +13 -9
  166. package/dist/lab/discover.js +117 -57
  167. package/dist/lab/doctor.d.ts +10 -3
  168. package/dist/lab/doctor.js +47 -9
  169. package/dist/lab/init-templates.js +147 -147
  170. package/dist/lab/init.d.ts +1 -1
  171. package/dist/lab/init.js +41 -9
  172. package/dist/lab/keys.d.ts +2 -0
  173. package/dist/lab/keys.js +42 -8
  174. package/dist/lab/lab-deps.d.ts +7 -12
  175. package/dist/lab/parse/actors.js +9 -9
  176. package/dist/lab/parse/comms.js +5 -5
  177. package/dist/lab/parse/execution.js +13 -13
  178. package/dist/lab/parse/study-v3.d.ts +23 -0
  179. package/dist/lab/parse/study-v3.js +259 -0
  180. package/dist/lab/parse/subject-state.d.ts +7 -7
  181. package/dist/lab/parse/subject-state.js +16 -16
  182. package/dist/lab/parse/subject.js +28 -28
  183. package/dist/lab/parse/values.d.ts +1 -1
  184. package/dist/lab/parse/values.js +3 -3
  185. package/dist/lab/persona-resolve.d.ts +4 -4
  186. package/dist/lab/persona-resolve.js +4 -4
  187. package/dist/lab/plan-participants.d.ts +2 -2
  188. package/dist/lab/plan-types.d.ts +4 -4
  189. package/dist/lab/plan.d.ts +1 -7
  190. package/dist/lab/plan.js +10 -41
  191. package/dist/lab/preflight-probes.js +11 -11
  192. package/dist/lab/preflight-result.d.ts +2 -1
  193. package/dist/lab/preflight-result.js +5 -4
  194. package/dist/lab/preflight.d.ts +7 -5
  195. package/dist/lab/preflight.js +5 -5
  196. package/dist/lab/routing.d.ts +31 -25
  197. package/dist/lab/routing.js +60 -29
  198. package/dist/lab/run-lab-events.d.ts +0 -3
  199. package/dist/lab/run-lab-events.js +0 -6
  200. package/dist/lab/run-lab-homes.d.ts +22 -10
  201. package/dist/lab/run-lab-homes.js +5 -1
  202. package/dist/lab/run-lab-options.d.ts +1 -1
  203. package/dist/lab/run-lab-options.js +16 -13
  204. package/dist/lab/summary.d.ts +7 -6
  205. package/dist/lab/summary.js +10 -10
  206. package/dist/lab/tasks.d.ts +15 -15
  207. package/dist/lab/tasks.js +14 -14
  208. package/dist/lab/types.d.ts +101 -95
  209. package/dist/lab/types.js +2 -0
  210. package/dist/lab/validation.d.ts +13 -13
  211. package/dist/lab/validation.js +44 -42
  212. package/dist/lab/warnings.d.ts +10 -0
  213. package/dist/lab/warnings.js +61 -33
  214. package/dist/library-aliases.d.ts +56 -0
  215. package/dist/library-aliases.js +22 -0
  216. package/dist/observer/artifact.d.ts +1 -1
  217. package/dist/observer/artifact.js +6 -6
  218. package/dist/observer/data.d.ts +6 -6
  219. package/dist/observer/data.js +5 -4
  220. package/dist/observer/exposure.d.ts +1 -1
  221. package/dist/observer/exposure.js +11 -11
  222. package/dist/observer/http.js +1 -1
  223. package/dist/observer/library.d.ts +1 -1
  224. package/dist/observer/library.js +4 -2
  225. package/dist/observer/listen.js +5 -4
  226. package/dist/observer/render.d.ts +1 -1
  227. package/dist/observer/render.js +10 -5
  228. package/dist/observer/run-routes.d.ts +3 -3
  229. package/dist/observer/run-routes.js +1 -1
  230. package/dist/observer/serve.js +7 -3
  231. package/dist/observer/tunnel.js +1 -1
  232. package/dist/observer-app.html +4 -4
  233. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  234. package/dist/routes/computer-use/bundle-parts.js +15 -15
  235. package/dist/routes/computer-use/bundle.js +3 -3
  236. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
  238. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  239. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
  240. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  241. package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
  242. package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
  243. package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
  244. package/dist/routes/computer-use/external-comms.d.ts +1 -1
  245. package/dist/routes/computer-use/external-comms.js +1 -1
  246. package/dist/routes/computer-use/fanout-bundle.js +18 -18
  247. package/dist/routes/computer-use/fanout-records.js +10 -11
  248. package/dist/routes/computer-use/live-flush.d.ts +1 -1
  249. package/dist/routes/computer-use/live-flush.js +6 -6
  250. package/dist/routes/computer-use/live-phase.d.ts +4 -2
  251. package/dist/routes/computer-use/live-phase.js +6 -6
  252. package/dist/routes/computer-use/local-vm.js +1 -1
  253. package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
  254. package/dist/routes/computer-use/participant-desktop.js +4 -4
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +9 -9
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +31 -13
  259. package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
  260. package/dist/routes/computer-use/participant-prompt.js +6 -6
  261. package/dist/routes/computer-use/participant-runs.d.ts +7 -7
  262. package/dist/routes/computer-use/participant-runs.js +13 -13
  263. package/dist/routes/computer-use/plan.js +22 -22
  264. package/dist/routes/computer-use/preflight.js +21 -21
  265. package/dist/routes/computer-use/rerun-selection.js +1 -1
  266. package/dist/routes/computer-use/result.js +11 -11
  267. package/dist/routes/computer-use/route.d.ts +2 -1
  268. package/dist/routes/computer-use/route.js +15 -14
  269. package/dist/routes/computer-use/self-report.d.ts +7 -7
  270. package/dist/routes/computer-use/self-report.js +31 -31
  271. package/dist/routes/computer-use/setup.d.ts +1 -1
  272. package/dist/routes/computer-use/setup.js +17 -18
  273. package/dist/routes/computer-use/single-bundle.d.ts +7 -7
  274. package/dist/routes/computer-use/single-bundle.js +28 -30
  275. package/dist/routes/computer-use/subject-projection.d.ts +1 -1
  276. package/dist/routes/computer-use/subject-projection.js +6 -6
  277. package/dist/routes/computer-use/types.d.ts +40 -42
  278. package/dist/routes/computer-use/types.js +10 -10
  279. package/dist/routes/preview.d.ts +8 -2
  280. package/dist/routes/preview.js +8 -4
  281. package/dist/routes/scripted/bundle.d.ts +2 -2
  282. package/dist/routes/scripted/bundle.js +13 -12
  283. package/dist/routes/scripted/plan.d.ts +1 -1
  284. package/dist/routes/scripted/plan.js +9 -9
  285. package/dist/routes/scripted/result.js +5 -5
  286. package/dist/routes/scripted/route.js +5 -6
  287. package/dist/routes/scripted/scenario.js +2 -2
  288. package/dist/routes/scripted/setup.js +7 -7
  289. package/dist/routes/scripted/subject.js +1 -1
  290. package/dist/routes/scripted/surface-records.js +3 -3
  291. package/dist/routes/scripted/types.d.ts +3 -5
  292. package/dist/routes/scripted/types.js +1 -1
  293. package/dist/routes/shared-world/bundle-records.js +9 -8
  294. package/dist/routes/shared-world/bundle.d.ts +5 -5
  295. package/dist/routes/shared-world/bundle.js +40 -38
  296. package/dist/routes/shared-world/checkpoints.d.ts +1 -1
  297. package/dist/routes/shared-world/checkpoints.js +1 -1
  298. package/dist/routes/shared-world/comms.d.ts +5 -5
  299. package/dist/routes/shared-world/comms.js +14 -14
  300. package/dist/routes/shared-world/external-public.d.ts +4 -3
  301. package/dist/routes/shared-world/external-public.js +16 -12
  302. package/dist/routes/shared-world/handoff.d.ts +7 -6
  303. package/dist/routes/shared-world/handoff.js +65 -57
  304. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  305. package/dist/routes/shared-world/lobby-code.js +9 -9
  306. package/dist/routes/shared-world/participant-specs.d.ts +7 -6
  307. package/dist/routes/shared-world/participant-specs.js +31 -24
  308. package/dist/routes/shared-world/plan.js +7 -7
  309. package/dist/routes/shared-world/provenance.d.ts +2 -2
  310. package/dist/routes/shared-world/provenance.js +2 -2
  311. package/dist/routes/shared-world/provisioned.js +14 -13
  312. package/dist/routes/shared-world/result.js +20 -21
  313. package/dist/routes/shared-world/route.js +23 -22
  314. package/dist/routes/shared-world/setup.d.ts +3 -3
  315. package/dist/routes/shared-world/setup.js +4 -4
  316. package/dist/routes/shared-world/types.d.ts +30 -28
  317. package/dist/routes/shared-world/types.js +4 -4
  318. package/dist/routes/terminal/adapter.d.ts +3 -3
  319. package/dist/routes/terminal/adapter.js +5 -5
  320. package/dist/routes/terminal/bundle.d.ts +3 -3
  321. package/dist/routes/terminal/bundle.js +22 -21
  322. package/dist/routes/terminal/credentials.d.ts +4 -4
  323. package/dist/routes/terminal/credentials.js +7 -7
  324. package/dist/routes/terminal/dry-run.js +4 -4
  325. package/dist/routes/terminal/encoding.js +2 -2
  326. package/dist/routes/terminal/ledger.d.ts +3 -3
  327. package/dist/routes/terminal/ledger.js +14 -14
  328. package/dist/routes/terminal/live-finish.js +3 -3
  329. package/dist/routes/terminal/live-sandbox.js +12 -13
  330. package/dist/routes/terminal/persona.js +1 -1
  331. package/dist/routes/terminal/plan.js +11 -11
  332. package/dist/routes/terminal/recorder.js +2 -2
  333. package/dist/routes/terminal/result.js +8 -8
  334. package/dist/routes/terminal/route.js +6 -7
  335. package/dist/routes/terminal/sandbox.d.ts +1 -1
  336. package/dist/routes/terminal/sandbox.js +1 -1
  337. package/dist/routes/terminal/session.js +8 -7
  338. package/dist/routes/terminal/token-usage.d.ts +1 -1
  339. package/dist/routes/terminal/token-usage.js +7 -8
  340. package/dist/routes/terminal/trace.d.ts +2 -2
  341. package/dist/routes/terminal/trace.js +2 -2
  342. package/dist/routes/terminal/types.d.ts +26 -28
  343. package/dist/routes/terminal/types.js +3 -3
  344. package/dist/run/bundle-shape.js +3 -3
  345. package/dist/run/bundle.d.ts +46 -46
  346. package/dist/run/bundle.js +2 -1
  347. package/dist/run/cost-summary.js +3 -3
  348. package/dist/run/costs.js +7 -1
  349. package/dist/run/detail.d.ts +6 -6
  350. package/dist/run/detail.js +4 -4
  351. package/dist/run/dry-run-inputs.js +1 -1
  352. package/dist/run/dry-run.js +18 -18
  353. package/dist/run/judge.d.ts +19 -13
  354. package/dist/run/judge.js +18 -8
  355. package/dist/run/paths.d.ts +1 -1
  356. package/dist/run/paths.js +1 -1
  357. package/dist/run/pricing.d.ts +11 -6
  358. package/dist/run/pricing.js +20 -13
  359. package/dist/run/projection.d.ts +14 -14
  360. package/dist/run/projection.js +15 -15
  361. package/dist/run/reclaim.js +2 -2
  362. package/dist/run/results.d.ts +5 -5
  363. package/dist/run/run-index.d.ts +8 -6
  364. package/dist/run/run-index.js +15 -16
  365. package/dist/run/run-not-found.d.ts +5 -0
  366. package/dist/run/run-not-found.js +15 -0
  367. package/dist/run/run.d.ts +5 -4
  368. package/dist/run/run.js +1 -1
  369. package/dist/run/sandbox-receipts.d.ts +2 -2
  370. package/dist/run/sandbox-receipts.js +3 -3
  371. package/dist/run/shared-world-evidence.d.ts +36 -35
  372. package/dist/run/shared-world-evidence.js +4 -4
  373. package/dist/run/shared-world-shape.d.ts +1 -1
  374. package/dist/run/shared-world-shape.js +6 -6
  375. package/dist/run/stats.d.ts +12 -6
  376. package/dist/run/stats.js +116 -58
  377. package/dist/run/status.d.ts +8 -29
  378. package/dist/run/status.js +5 -27
  379. package/dist/run/stored-runs.js +2 -1
  380. package/dist/run/stream-shape.js +1 -1
  381. package/dist/run/streams.d.ts +6 -6
  382. package/dist/run/study-provenance.d.ts +47 -0
  383. package/dist/run/study-provenance.js +63 -0
  384. package/dist/run/study-result.d.ts +16 -0
  385. package/dist/run/study-result.js +9 -0
  386. package/dist/run/text.d.ts +2 -0
  387. package/dist/run/text.js +4 -0
  388. package/dist/run-lab.d.ts +7 -7
  389. package/dist/run-lab.js +1 -3
  390. package/dist/study/convert.d.ts +33 -0
  391. package/dist/study/convert.js +432 -0
  392. package/dist/study/field-paths.d.ts +12 -0
  393. package/dist/study/field-paths.js +126 -0
  394. package/dist/study/files.d.ts +26 -0
  395. package/dist/study/files.js +43 -0
  396. package/dist/study/migrate.d.ts +48 -0
  397. package/dist/study/migrate.js +408 -0
  398. package/dist/study/owned-files.d.ts +38 -0
  399. package/dist/study/owned-files.js +182 -0
  400. package/dist/subject/clone.d.ts +1 -1
  401. package/dist/subject/desktop-cli.d.ts +1 -1
  402. package/dist/subject/desktop-cli.js +2 -2
  403. package/dist/subject/local-tree-archive.js +1 -1
  404. package/dist/subject/local-tree.d.ts +1 -1
  405. package/dist/subject/node-bootstrap.js +1 -1
  406. package/dist/subject/runtime.js +8 -9
  407. package/dist/subject/serve.d.ts +1 -1
  408. package/dist/subject/serve.js +3 -3
  409. package/dist/subject/state.d.ts +1 -1
  410. package/dist/subject/steps.d.ts +5 -5
  411. package/dist/subject/steps.js +4 -4
  412. package/dist/substrates/command-failure.d.ts +3 -3
  413. package/dist/substrates/command-failure.js +3 -3
  414. package/dist/substrates/detached.d.ts +6 -6
  415. package/dist/substrates/detached.js +7 -7
  416. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  417. package/dist/substrates/e2b/cdp-probe.js +14 -17
  418. package/dist/substrates/e2b/desktop-browser.d.ts +2 -2
  419. package/dist/substrates/e2b/desktop-browser.js +8 -8
  420. package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
  421. package/dist/substrates/e2b/desktop-cdp.js +8 -8
  422. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  423. package/dist/substrates/e2b/desktop-executor.js +1 -1
  424. package/dist/substrates/e2b/desktop-geometry.d.ts +3 -3
  425. package/dist/substrates/e2b/desktop-geometry.js +7 -7
  426. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  427. package/dist/substrates/e2b/desktop-media.js +1 -1
  428. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  429. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  430. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  431. package/dist/substrates/e2b/sandbox.js +1 -1
  432. package/dist/substrates/e2b/sdk.d.ts +11 -11
  433. package/dist/substrates/e2b/sdk.js +6 -6
  434. package/dist/tui/actions.d.ts +1 -1
  435. package/dist/tui/actions.js +13 -13
  436. package/dist/tui/contract.d.ts +16 -16
  437. package/dist/tui/contract.js +10 -10
  438. package/dist/tui/launch.d.ts +4 -4
  439. package/dist/tui/launch.js +18 -19
  440. package/dist/tui/project.js +5 -5
  441. package/dist/tui-app.js +82 -82
  442. package/dist/verify/actor.d.ts +8 -8
  443. package/dist/verify/actor.js +36 -36
  444. package/dist/verify/artifacts.d.ts +2 -2
  445. package/dist/verify/artifacts.js +3 -3
  446. package/dist/verify/context-growth.d.ts +9 -0
  447. package/dist/verify/context-growth.js +62 -0
  448. package/dist/verify/costs.d.ts +6 -6
  449. package/dist/verify/costs.js +8 -8
  450. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  451. package/dist/verify/shared-world-concurrent.js +79 -76
  452. package/dist/verify/shared-world.d.ts +2 -2
  453. package/dist/verify/shared-world.js +16 -16
  454. package/dist/verify/subject.d.ts +4 -4
  455. package/dist/verify/subject.js +18 -18
  456. package/dist/verify/verify.js +92 -43
  457. package/docs/README.md +25 -32
  458. package/docs/architecture/actor-contract.md +56 -87
  459. package/docs/architecture/desktop-sessions.md +7 -7
  460. package/docs/architecture/external-public-shared-world.md +61 -59
  461. package/docs/architecture/github-feedback-loop.md +1 -4
  462. package/docs/architecture/guest-desktop.md +2 -2
  463. package/docs/architecture/observer.md +34 -34
  464. package/docs/architecture/restricted-codex-analysis.md +34 -28
  465. package/docs/architecture/serve.md +34 -37
  466. package/docs/architecture/state-driven-executor.md +55 -58
  467. package/docs/architecture/task-protocol-support.md +5 -5
  468. package/docs/architecture/terminal-product-route.md +67 -107
  469. package/docs/contracts/README.md +24 -0
  470. package/docs/contracts/adapter-admission.md +3 -3
  471. package/docs/contracts/adapter-fixtures.md +2 -5
  472. package/docs/contracts/core.md +1 -3
  473. package/docs/contracts/errors.md +62 -0
  474. package/docs/contracts/feedback.md +8 -9
  475. package/docs/contracts/policy.md +7 -12
  476. package/docs/contracts/run-bundle.md +45 -44
  477. package/docs/contracts/schemas.md +421 -362
  478. package/docs/contracts/study-analysis.md +3 -3
  479. package/docs/contracts/study-costs.md +11 -7
  480. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  481. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  482. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  483. package/docs/principles/actor-fidelity.md +4 -4
  484. package/docs/principles/engineering.md +3 -3
  485. package/docs/principles/invariants-and-defaults.md +38 -38
  486. package/docs/principles/self-driving-harness.md +1 -5
  487. package/docs/principles/three-roles.md +1 -1
  488. package/docs/product/automatic-analysis.md +7 -7
  489. package/examples/participant/README.md +5 -5
  490. package/examples/participant/run.mjs +11 -10
  491. package/examples/scorer/README.md +3 -3
  492. package/examples/scorer/run.mjs +11 -12
  493. package/package.json +16 -17
  494. package/skills/humanish/SKILL.md +60 -58
  495. package/skills/humanish/agents/openai.yaml +1 -1
  496. package/AGENTS.md +0 -99
  497. package/CONTRIBUTING.md +0 -148
  498. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  499. package/dist/actors/codex/qualified-versions.js +0 -132
  500. package/dist/cli/commands/lab.d.ts +0 -3
  501. package/dist/cli/commands/lab.js +0 -199
  502. package/dist/cli/renamed-options.d.ts +0 -11
  503. package/dist/cli/renamed-options.js +0 -18
  504. package/dist/observer/static.d.ts +0 -39
  505. package/dist/observer/static.js +0 -369
  506. package/docs/architecture/comms-inbox.md +0 -122
  507. package/docs/architecture/desktop-recording.md +0 -80
  508. package/docs/architecture/local-browser-runtime.md +0 -178
  509. package/docs/architecture/observer-review.md +0 -144
  510. package/docs/architecture/participant-media.md +0 -90
  511. package/docs/architecture/project-layout.md +0 -62
  512. package/docs/architecture/real-email-receiving.md +0 -136
  513. package/docs/assets/humanish-drawdb-hero.png +0 -0
  514. package/docs/assets/humanish-observer-hero.png +0 -0
  515. package/docs/goals/current.md +0 -207
  516. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  517. package/docs/product/open-source-install-experience.md +0 -240
  518. package/docs/ramp/README.md +0 -295
  519. package/docs/release/open-source-readiness.md +0 -222
  520. package/docs/release/public-readiness-standard.md +0 -210
  521. package/docs/roadmap/world-class-open-source-v0.md +0 -311
@@ -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,26 +17,26 @@ 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)) |
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.
@@ -52,10 +46,10 @@ warnings.
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 `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:
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
 
@@ -1,8 +1,6 @@
1
1
  # Core Contract
2
2
 
3
- Date: 2026-06-02 (current-state note updated 2026-09-30)
4
-
5
- Status: each route mints its run id and builds its bundle, and starts the run
3
+ Each route mints its run id and builds its bundle, and starts the run
6
4
  through the run scope in `src/run/run.ts`. `startRun` creates
7
5
  `.humanish/runs/<id>` and begins `status.json`; the `Run` it returns publishes
8
6
  `run.json`, its projections and the latest pointer. `src/run/paths.ts` holds the
@@ -0,0 +1,62 @@
1
+ # Error codes
2
+
3
+ A failed command or library call reports a code and a message. The code is the stable part: a
4
+ rename or removal gets a CHANGELOG entry in the release that makes it. Messages may change in any
5
+ release.
6
+
7
+ ## Where a code appears
8
+
9
+ - `--json`: the envelope has `ok: false` and `error: { code, message }`, and the command exits 2.
10
+ This output is the interface for scripts and agents. Two exceptions:
11
+ - A command-line usage error, such as an unknown option or a missing argument, prints
12
+ Commander's message on stderr, exits 1 and prints no JSON.
13
+ - `keys` and the `comms` connection commands report a failure as `ok: false` with a `message`
14
+ and no `error` field.
15
+ - Human mode: two or three lines on stderr.
16
+
17
+ ```text
18
+ humanish run failed: Study not found: nope. Look in humanish/studies/ or humanish/labs/, or pass a .yaml path.
19
+ code: HUMANISH_STUDY_NOT_FOUND
20
+ next: humanish study list
21
+ ```
22
+
23
+ A result with no code (`keys`, `comms`) prints no `code:` line. The `next:` line comes from a
24
+ table in `src/cli/io.ts` keyed by code, which today holds `HUMANISH_STUDY_NOT_FOUND`. Other
25
+ codes get no `next:` line, though some messages name a command, as the run-not-found message
26
+ names `humanish runs`. Stdout keeps a result's other lines: a failed run
27
+ prints its run id, route and participants there, and a failed `verify` prints its failing
28
+ checks there, since they are its result. Before 0.108.0, human mode printed the code and message
29
+ on stdout.
30
+
31
+ - Library: the result objects `runStudy` and the analysis entry points return carry the same
32
+ `error.code`.
33
+
34
+ ## Families
35
+
36
+ | Family | Codes | Emitted by | Appears in |
37
+ | ---------------------- | ----- | ------------------------------------------------------------------------ | ----------------------------------------------------------------------- |
38
+ | `HUMANISH_*` | 137 | every CLI command and route result | JSON `error.code`, library `error.code`, human `code:` line |
39
+ | `ANALYSIS_*` | 86 | `humanish analyze` and the analysis service (`src/analysis/`) | JSON `error.code` of analysis results |
40
+ | `AUTOMATIC_ANALYSIS_*` | 21 | the post-run analysis job | `automaticAnalysis.reason` on a run result and the job record |
41
+ | `analysis_*` lowercase | 29 | analysis execution | `error` fields in analysis artifacts and execution receipts |
42
+ | `codex_*` lowercase | 13 | the Codex CLI readiness check (`src/actors/codex/`, `src/lab/doctor.ts`) | doctor rows and analysis readiness, such as `codex_unsupported_version` |
43
+
44
+ Counts are the distinct quoted codes in `src/` on 2026-10-03.
45
+
46
+ The lowercase families are values recorded inside artifacts and receipts, and an artifact keeps
47
+ the code it was written with. Automatic analysis reads two of them back:
48
+ `analysis_admission_estimate_exceeded` becomes the reason `AUTOMATIC_ANALYSIS_ADMISSION_EXCEEDED`,
49
+ and `analysis_budget_exceeded` on a default analysis prints the hint to rerun with
50
+ `humanish analyze --max-cost`. Validation also accepts a partial artifact whose error is
51
+ `analysis_admission_estimate_exceeded`.
52
+
53
+ Share-safety reasons in `humanish verify` (`VERIFY_FAILED`, `RAW_SCREENSHOTS` and the rest) are
54
+ grades, not errors; [run-bundle.md](run-bundle.md) lists them.
55
+
56
+ ## Renames
57
+
58
+ 0.108.0 renamed the codes that said lab: `HUMANISH_LAB_*` is `HUMANISH_STUDY_*`,
59
+ `HUMANISH_CUA_LAB_*` is `HUMANISH_COMPUTER_USE_*`, `HUMANISH_CONCURRENT_SHARED_WORLD_LAB_*` is
60
+ `HUMANISH_SHARED_WORLD_*`, and the terminal and scripted families drop `_LAB`. It also renamed
61
+ `HUMANISH_INVALID_SIM_COUNT` to `HUMANISH_INVALID_PARTICIPANT_COUNT`. A run saved before a rename
62
+ keeps the codes it was written with.
@@ -1,10 +1,7 @@
1
1
  # Feedback Contract
2
2
 
3
- Date: 2026-06-01 (current-state note updated 2026-07-14)
4
-
5
- Status: local feedback candidate, draft, verification, Markdown, and issue-URL
6
- generation are shipped. These commands do not mutate GitHub, and public output
7
- fails closed unless the run verifies as `share_ready`.
3
+ Feedback candidates, drafts, verification, Markdown and issue URLs ship. These commands never
4
+ mutate GitHub, and public output fails closed unless the run verifies as `share_ready`.
8
5
 
9
6
  ## Purpose
10
7
 
@@ -78,10 +75,12 @@ was not repeated in the message trace.
78
75
  ### `draft`
79
76
 
80
77
  Builds structured feedback from the first usable run candidate, or the candidate
81
- selected with `--candidate`. With no candidate, a dry run produces a contract
82
- follow-up and a live run produces a summary of its recorded review. These
83
- fallbacks do not add a finding to the candidate list. All drafts require a
84
- verified `share_ready` run and are written under the run bundle, not GitHub.
78
+ selected with `--candidate`. With no candidate, a live run produces a summary of
79
+ its recorded review; that fallback does not add a finding to the candidate list.
80
+ A dry run tests no product behavior, so `draft`, `verify`, `issue` and
81
+ `issue-url` refuse it with `HUMANISH_FEEDBACK_REQUIRES_LIVE_RUN`. All drafts
82
+ require a verified `share_ready` live run and are written under the run bundle,
83
+ not GitHub.
85
84
 
86
85
  ### `verify`
87
86
 
@@ -1,14 +1,9 @@
1
1
  # Policy Contract
2
2
 
3
- Date: 2026-06-02 (current-state note updated 2026-07-14)
4
-
5
- Status: shipped policy reference for credential, network, spend, redaction,
6
- sharing, and assisted-run boundaries. Support remains route-specific; the
7
- parser, route validation, and verifier determine whether a declared field is
8
- consumed, rejected, or reported as a warning.
9
-
10
- Safety amendment (2026-07-14): beginning with `0.15.1`, stored provider IDs are
11
- evidence and never authorize core provider mutation.
3
+ This page is the policy reference for credential, network, spend, redaction, sharing and
4
+ assisted-run boundaries. Support is route-specific: the parser, route validation and the verifier
5
+ decide whether a declared field is consumed, rejected or reported as a warning. Stored provider
6
+ ids are evidence and never authorize core provider mutation.
12
7
 
13
8
  ## Purpose
14
9
 
@@ -112,7 +107,7 @@ Spend policy names when provider costs may be incurred.
112
107
  | Mode | Meaning |
113
108
  | ------------------------ | -------------------------------------------------------------------------------------------------- |
114
109
  | `no_spend` | No provider calls that can bill. |
115
- | `dry_run_only` | Only local contract proof; no live substrate. |
110
+ | `dry_run_only` | Only a local dry run; no live substrate. |
116
111
  | `explicit_live_provider` | Provider calls allowed because required env var names are present and operator intent is explicit. |
117
112
  | `maintainer_approved` | Reserved for publish, billing, or high-risk mutation workflows. |
118
113
 
@@ -126,7 +121,7 @@ providerClasses:
126
121
  - model
127
122
  - desktop_substrate
128
123
  operatorIntent:
129
- command: humanish lab run my-lab --json --no-open
124
+ command: humanish run my-study --json --no-open
130
125
  explicit: true
131
126
  budget:
132
127
  limit: unspecified
@@ -148,7 +143,7 @@ shapes, and fails closed on a match. It does **not** detect free-form PII/PHI
148
143
  those depends on using synthetic data and on reviewer judgment. Accordingly,
149
144
  `redaction: passed` means the automated secret/path scan found no matches, not a
150
145
  certification that the artifact is free of every class in the policy below. A
151
- first-class PII/PHI detector is planned (issue #108) and would move the listed
146
+ first-class PII/PHI detector is [planned](https://github.com/danielgwilson/humanish/issues/108) and would move the listed
152
147
  PII classes from author-responsibility to enforced.
153
148
 
154
149
  Required redaction gates: