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
@@ -57,7 +57,7 @@ humanish analyze --run latest --provider codex --dry-run --json
57
57
  humanish analyze --run latest --provider codex --json
58
58
  ```
59
59
 
60
- This branch is qualified on Linux x64 and Apple Silicon macOS with the Codex CLI releases listed for each host in `src/actors/codex/qualified-versions.ts`, a file-backed
60
+ This branch runs on Linux x64 and Apple Silicon macOS with any stable Codex CLI release `src/actors/codex/codex-admission.ts` admits (0.154.0 on, except refused releases), a file-backed
61
61
  ChatGPT account login, and `gpt-6-astra` with low reasoning effort. The participant conversation
62
62
  is never reused. Selected text and screenshots still go to remote inference;
63
63
  this is account authentication, not local inference. No API-key, alternate model
@@ -76,7 +76,7 @@ remain null. Interrupted token observations remain explicitly incomplete.
76
76
 
77
77
  The dry-run validates only local evidence and configuration. It does not check
78
78
  the CLI, login, model access or quota and does not start a provider request.
79
- `doctor --lab <lab>` checks the selected analyst setup without a model call.
79
+ `doctor --study <study>` checks the selected analyst setup without a model call.
80
80
  Failures leave the recording available; inspect `analyze show` and the attempt's
81
81
  accounting before an explicit `analyze --provider codex --rerun`.
82
82
 
@@ -194,7 +194,7 @@ validation exception keeps nothing.
194
194
 
195
195
  The directory sits outside every run directory, and export, verify and the
196
196
  Observer read only run directories. `humanish analyze` returns the file's path as
197
- `rejectedOutputPath` and prints it, and so does a lab run's automatic analysis.
197
+ `rejectedOutputPath` and prints it, and so does a run's automatic analysis.
198
198
  Each write removes all but the newest 20 records across runs. It removes a
199
199
  record only while its directory is still the listed one, so a directory
200
200
  replaced by a symlink after listing is left alone. The record's
@@ -229,7 +229,10 @@ This presentation does not rewrite the saved analysis or reviewer corrections.
229
229
  The frozen `humanish.observer-data.v1` schema is unchanged. A companion
230
230
  `humanish.study-analysis.v1` artifact records source/config/input hashes,
231
231
  participant context, evidence manifest, coverage, provider/model/prompt version,
232
- status, usage and validated findings:
232
+ status, usage and validated findings. The Observer's projection of it,
233
+ `observer/study-analysis.json`, also carries `spend`: what every analysis
234
+ request of the run cost, as [study costs](study-costs.md#one-runs-cost)
235
+ describes:
233
236
 
234
237
  ```text
235
238
  .humanish/runs/<run>/
@@ -7,28 +7,44 @@ All amounts are estimates from retained rate-table accounting, not provider bill
7
7
 
8
8
  ```bash
9
9
  humanish stats
10
- humanish stats --lab sample-study --since 2026-09-01 --json
10
+ humanish stats --study sample-study --since 2026-09-01 --json
11
11
  ```
12
12
 
13
- The filters select runs by lab and run start date. All later analysis reruns
13
+ The filters select runs by study and run start date. All later analysis reruns
14
14
  belong to their source run for filtering and daily grouping. This is study-cost
15
15
  attribution, not a calendar of provider charges.
16
16
 
17
17
  With no filters, a directory whose source metadata is unreadable can still
18
- contribute valid analysis receipts under `(no lab)` and `(undated)`. Lab/date
18
+ contribute valid analysis receipts under `(no study)` and `(undated)`. Study/date
19
19
  filters exclude such unattributable directories; they remain named in
20
- `unreadable`. The command does not guess their date or lab from an analysis.
20
+ `unreadable`. The command does not guess their date or study from an analysis.
21
21
 
22
22
  ## Additive JSON contract
23
23
 
24
- The envelope remains `humanish.stats.v1`. Existing fields keep their meanings:
25
- `totals.estimatedSpendUsd`, `days[].estimatedSpendUsd`, lab `medianCostUsd`,
24
+ The envelope is `humanish.stats.v2`, which says `study` and `studies` where `humanish.stats.v1`
25
+ said `lab` and `labs`. Its fields keep their meanings: `totals.estimatedSpendUsd`,
26
+ `days[].estimatedSpendUsd`, each study's `medianCostUsd`,
26
27
  `costSamples` and `unpricedRuns` describe participant/desktop run estimates.
27
28
  They do not suddenly include a separate analysis request. The bundle's
28
- `cost.estimatedTotalUsd` and the cached run-index estimate also remain unchanged.
29
- Observer and terminal run summaries label this narrower scope.
29
+ `cost.estimatedTotalUsd`, `status.json`'s `outcome.estimatedCostUsd` and the run
30
+ index's `estimatedCostUsd` stay participants and desktops only.
30
31
 
31
- The new `costs` object appears on totals, each lab and each day. `costsByRun`
32
+ ## One run's cost
33
+
34
+ A run's analysis spend has one reader, `readAnalysisAccounting` in
35
+ `src/run/costs.ts`. Stats calls it for `costs.analysisEstimatedUsd`, and the
36
+ surfaces that show one run's cost read it too: the run index's `analysisCost`,
37
+ and the `spend` field of the Observer's companion `observer/study-analysis.json`.
38
+ It counts every distinct attempt the way stats does, so a run analyzed twice
39
+ shows two analyses. `src/run/run-cost.ts` adds that spend to the run's
40
+ participants-and-desktops figure, and the Observer's cost line, the Observer
41
+ library row's `costLabel` and the terminal UI all format the result through it.
42
+ The total is a lower bound, shown as `est. ~$X plus unpriced usage`, while any
43
+ part has an unpriced or incomplete figure. A Codex-account analysis has no
44
+ dollar price and reads "dollar cost unknown". An analysis that sent no request
45
+ adds nothing.
46
+
47
+ The new `costs` object appears on totals, each study and each day. `costsByRun`
32
48
  contains the same accounting per selected run with stable warning codes.
33
49
 
34
50
  | Field | Meaning |
@@ -57,6 +73,9 @@ its report was published, its findings are current, or the original recording
57
73
  later changed. The receipt and report with the same run/analysis ID count once;
58
74
  new IDs from explicit reruns count separately. Reusing a prior result adds no
59
75
  attempt or expense. Conflicting accounting for the same ID stays unresolved.
76
+ A dry run with no recorded cost counts as a known $0, because it makes no model
77
+ request and creates no desktop. A dry run that records an unknown figure stays
78
+ unknown.
60
79
 
61
80
  Older reports without receipts contribute their strictly validated accounting
62
81
  metadata with a legacy warning. Provider requests that left no durable record
@@ -4,7 +4,7 @@ Accepted.
4
4
 
5
5
  ## Context
6
6
 
7
- Several surfaces read a finished or running study: the Observer, `humanish tui`, `serve`,
7
+ Several surfaces read a finished or running study: the Observer, `humanish tui`, `observe --all`,
8
8
  `export`, feedback drafts and study analysis. Each of them wants a smaller, faster view than the
9
9
  full bundle, and a view that can drift from the evidence would let a surface show a result the
10
10
  evidence does not support.
@@ -12,7 +12,7 @@ exactly those cases.
12
12
 
13
13
  The `observer/` workspace builds with Vite into a single HTML file with fonts inlined and no
14
14
  network references. The root build copies it to `dist/observer-app.html`. `renderObserverHtml`
15
- is the one path every surface (observe, watch, serve, labs) uses; it injects the run's
15
+ is the one path every surface (observe, observe --all, watch, studies) uses; it injects the run's
16
16
  `humanish.observer-data.v1` snapshot into that file. There is no second renderer and no feature
17
17
  flag; rolling back means pinning an older package version.
18
18
 
@@ -21,7 +21,7 @@ flag; rolling back means pinning an older package version.
21
21
  - An Observer page opens from disk, and an exported bundle carries its own viewer.
22
22
  - Every dependency the Observer adds ships inside each rendered page, so page weight is a cost
23
23
  reviewers check.
24
- - Live views (`watch`, `serve`) use the same file and poll for new snapshots.
24
+ - Live views (`watch`, `observe --all`) use the same file and poll for new snapshots.
25
25
 
26
26
  ## Enforced by
27
27
 
@@ -1,6 +1,6 @@
1
1
  # 0003: Managed paths bind to physical identities; cleanup uses create-time receipts
2
2
 
3
- Accepted in 0.15.1 (#280), extended in 0.36.0 (`humanish reclaim`).
3
+ Accepted in 0.15.1, extended in 0.36.0 (`humanish reclaim`).
4
4
 
5
5
  ## Context
6
6
 
@@ -11,7 +11,7 @@ Separately, an account-wide provider operation once destroyed unrelated infrastr
11
11
 
12
12
  ## Decision
13
13
 
14
- - Managed run, Observer, feedback, lab, actor-output, git-metadata and source-archive paths bind
14
+ - Managed run, Observer, feedback, study, actor-output, git-metadata and source-archive paths bind
15
15
  to validated physical filesystem identities. Traversal-shaped ids, unsafe links, special files
16
16
  and root retargeting are rejected before any write.
17
17
  - Provider ids in `run.json` are evidence. Nothing mutates a provider resource because of them.
@@ -32,4 +32,4 @@ Separately, an account-wide provider operation once destroyed unrelated infrastr
32
32
  - `src/run/paths.ts` and `src/run/contained-output.ts`, with `tests/run/path-containment.test.ts`.
33
33
  - `src/run/git-workspace.ts`, with `tests/run/git-state.test.ts`.
34
34
  - `src/run/reclaim.ts`, with `tests/run/reclaim.test.ts`.
35
- - Invariant 7 in [invariants and defaults](../principles/invariants-and-defaults.md).
35
+ - Reclamation by exact created id, in [invariants and defaults](../principles/invariants-and-defaults.md).
@@ -1,7 +1,7 @@
1
1
  # Actor Fidelity: whose behavior is this evidence about?
2
2
 
3
- Status: research digest + design position. Sources are public papers and open-source
4
- harnesses; every claim below carries its citation so a reader can check it.
3
+ This page is a research digest and a design position. Its sources are public papers and
4
+ open-source harnesses, and each claim carries its citation so a reader can check it.
5
5
 
6
6
  ## The question
7
7
 
@@ -21,7 +21,7 @@ Whether that is a defect depends entirely on a question the harness never asked:
21
21
  finding about how legible the surface is to its actual users.
22
22
 
23
23
  The proof roadmap already anticipated this: its strongest evidence class,
24
- `user-census`, is defined as "the users of the product ARE agents, and the lab runs
24
+ `user-census`, is defined as "the users of the product are agents, and the study runs
25
25
  real production harnesses." This page is the layer that makes the distinction
26
26
  operable.
27
27
 
@@ -104,7 +104,7 @@ a green run proves nothing.
104
104
 
105
105
  **Declare, record, and let the adopter judge.**
106
106
 
107
- 1. **Declared population is a property of a persona, not of a lab.** One study program
107
+ 1. **Declared population is a property of a persona, not of a study.** One study program
108
108
  can legitimately run agents and people against the same surface; the comparison
109
109
  between them is itself a finding. Prior art runs both populations
110
110
  through one instrument and reports the difference
@@ -1,6 +1,6 @@
1
1
  # Engineering principles
2
2
 
3
- These are the judgment calls behind the rules in [AGENTS.md](../../AGENTS.md). Read them
3
+ These are the judgment calls behind the rules in [AGENTS.md](https://github.com/danielgwilson/humanish/blob/main/AGENTS.md). Read them
4
4
  before adding a service, mode, dependency or new boundary.
5
5
 
6
6
  ## Engineering Judgment
@@ -48,7 +48,7 @@ low maintenance cost, alongside correctness, privacy and security.
48
48
 
49
49
  ## Working And Resuming
50
50
 
51
- - Read the [ramp](../ramp/README.md), current task and relevant component
51
+ - Read the [ramp](https://github.com/danielgwilson/humanish/blob/main/docs/ramp/README.md), current task and relevant component
52
52
  instructions. Read detailed contracts for the boundary being changed, not every
53
53
  historical roadmap. Consult the invariants for security/evidence changes and the
54
54
  release procedure before publishing.
@@ -58,7 +58,7 @@ low maintenance cost, alongside correctness, privacy and security.
58
58
  treat an old plan as authorization to resume paused or rejected work.
59
59
  - When granted autonomous shipping authority, push, open the PR, address reviews
60
60
  and required checks, merge when green, fast-forward main and clean up the task
61
- worktree/branch. Follow [release gates](../release/open-source-readiness.md)
61
+ worktree/branch. Follow [the release procedure](https://github.com/danielgwilson/humanish/blob/main/docs/release/publish.md)
62
62
  when a release is authorized; do not add new approval steps on your own.
63
63
  - Stay on `0.x` until the maintainer explicitly chooses 1.0. The next minor
64
64
  after `0.99.0` is `0.100.0`; routine shipping authority does not authorize 1.0.
@@ -1,6 +1,6 @@
1
1
  # Invariants and Defaults
2
2
 
3
- humanish's safety and honesty rules come in exactly two strengths. Confusing them causes
3
+ humanish's safety and evidence rules come in exactly two strengths. Confusing them causes
4
4
  two failures: a route-scoped default gets written down as if it held on every route, then the
5
5
  next legitimate use case looks like a violation and either gets blocked (capability loss) or
6
6
  waved through ad hoc (safety loss). This page draws the line between the two.
@@ -11,7 +11,7 @@ True on every route, enforced in code, never overridable by config. A feature th
11
11
  satisfy these does not ship; a third-party extension that cannot satisfy these does not
12
12
  certify (see the conformance suite).
13
13
 
14
- 1. **Secret values never reach PUBLISHED evidence.** No key, token, credential value, or
14
+ 1. **Secret values never reach published evidence.** No key, token, credential value, or
15
15
  session-secret may appear in any artifact that leaves the operator's machine: a committed
16
16
  file, a shared bundle, a feedback issue. Names of provisioned environment variables are
17
17
  evidence; their values never are. Harness-level errors pass through redaction before
@@ -27,8 +27,8 @@ certify (see the conformance suite).
27
27
  separately verified copy while preserving readable local evidence. (See "the
28
28
  capture-vs-publish rule" below: blurring frames at _capture_ was a default mistaken for
29
29
  this invariant.)
30
- - Scope note: the literal scrub of KNOWN provisioned values runs on harness log-tails,
31
- errors, AND model-authored narration (reasoning/message) before it persists; secret-SHAPED
30
+ - Scope note: the literal scrub of known provisioned values runs on harness log-tails,
31
+ errors, and model-authored narration (reasoning/message) before it persists; secret-shaped
32
32
  values are caught everywhere by pattern redaction. The text artifacts are local
33
33
  (gitignored) regardless.
34
34
  2. **Actors only drive harness-minted URLs.** A model with input control (mouse, keyboard,
@@ -47,35 +47,35 @@ certify (see the conformance suite).
47
47
  5. **Provenance is recorded or its absence is declared.** Every bundle states what the
48
48
  subject was (commit, image, fixture, or an explicit "unpinned" marker). Evidence that
49
49
  cannot say what it measured cannot support a decision.
50
- - External-public plane class (#164 phase 2, 0.20.0): when a real operator-owned public
51
- deployment is used DIRECTLY as a concurrent shared-world plane (`source: app-url` +
52
- `topology: shared-world` + `allowPublicTargets` + `concurrency > 1`), provenance is the
53
- marker `external-public`; humanish neither provisioned nor seeded it, so it is NOT `seeded`
54
- and NOT `unpinned`. Attribution stays `shared-world` (N participants, ONE plane), but every strength
55
- claim degrades HONESTLY and is asserted-ABSENT, never silently dropped: a synthetic attestation
56
- is FORBIDDEN (you cannot claim synthetic on a real site; the honest analog is the
50
+ - External-public plane class: when a real operator-owned public
51
+ deployment is used directly as a concurrent shared-world plane (`source: app-url` +
52
+ `route: shared-world` + `allowPublicTargets` + `concurrency > 1`), provenance is the
53
+ marker `external-public`; humanish neither provisioned nor seeded it, so it is not `seeded`
54
+ and not `unpinned`. Attribution stays `shared-world` (N participants, one plane), but every strength
55
+ claim is downgraded and asserted-absent, never silently dropped: a synthetic attestation
56
+ is forbidden (you cannot claim synthetic on a real site; its real-site counterpart is the
57
57
  operator-ownership attestation `subject.publicTarget`, author-trust and unverifiable); plane
58
58
  control is "operator-attested, observed-only" (`plane.publicOriginDigest`) not
59
- "harness-controlled" (`plane.hostDigest`); there is NO authoritative shared-state proof
59
+ "harness-controlled" (`plane.hostDigest`); there is no authoritative shared-state proof
60
60
  (`stateSeries` omitted); and concurrency is proven by temporal co-occupancy + observed lobby
61
- convergence only. Verify FAILS CLOSED if any honest-downgrade limit is missing or if a
61
+ convergence only. Verify fails closed if any external-public disclosure limit is missing or if a
62
62
  getHost-only claim (`exposure: synthetic`, `hostDigest`, a `seeded`/`synthetic` limit) appears
63
63
  on this class. The getHost synthetic gate is deliberately unreachable here. It exists because
64
- getHost is internet-reachable AND harness-owned; a public site the harness neither provisioned
64
+ getHost is internet-reachable and harness-owned; a public site the harness neither provisioned
65
65
  nor exposed is neither.
66
66
  6. **Claims match mechanism.** A config field that is parsed but not consumed warns; a
67
67
  document that overstates behavior is a defect; an evidence artifact never claims a
68
68
  stronger evidence class than its actor and scenario can support.
69
69
  7. **Reclamation is by exact created id, never account-wide enumeration.** A route that
70
70
  creates a provider resource (an E2B sandbox, for example) tracks the exact id it created and
71
- reclaims and PROVES cleanup against that id alone (a returned found-and-killed boolean, a
71
+ reclaims and proves cleanup against that id alone (a returned found-and-killed boolean, a
72
72
  getInfo-by-id NotFound check). No route ever calls a provider's list-everything endpoint to
73
73
  discover or verify its own cleanup, because that endpoint enumerates the whole account/team,
74
74
  including resources humanish did not create. This is what makes a single shared operator key
75
75
  safe: humanish only ever reaches a resource it created, never anything else the key's owner
76
76
  is running.
77
77
  The one narrow exception is an explicit, maintainer-run orphan sweep (never a default, never
78
- reachable by a normal lab run) that is itself opt-in gated (an explicit flag or env var) and
78
+ reachable by a normal run) that is itself opt-in gated (an explicit flag or env var) and
79
79
  documented as such at its call site.
80
80
 
81
81
  ## Defaults
@@ -84,20 +84,20 @@ Right most of the time, overridable with declared friction (an explicit config f
84
84
  env gate, a warning in the run output). Overriding a default is a supported use case;
85
85
  silently drifting from one is not.
86
86
 
87
- | Default | Why it is the default | Legitimate override |
88
- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
89
- | Dry-run | Spend safety (invariant 3 sets the floor; dry-run keeps the floor far away) | `scenario.mode: live` |
90
- | Post-run analysis on supported live studies | Findings accompany the recording; a separate $3 admission estimate limit is visible before execution | `review.analysis: false` disables it; an explicit mapping sets another analysis budget. Dry-run and unsupported routes never dispatch; missing default credentials produce a recorded skip |
91
- | Separate worlds (`per-lane-worlds`) | Isolation, attribution, reproducibility | `subject.topology: shared-world`: N participants against ONE mutable plane for scenarios that ARE about interaction between roles (#164). Every participant runs at once: `execution.concurrency` must be 2 or more, and an omitted value fills to the participant count (#350). The plane is one getHost-exposed subject sandbox with synthetic seeded data, or an operator-owned public deployment (external-public), driven by N actor sandboxes. The bundle declares the weaker `attributionClass: shared-world` and a verify-enforced `attributionLimits` ceiling (`best-effort-causal-attribution` and the rest of the concurrent set). Sequential turns at `execution.concurrency: 1` were removed in 0.106.0. |
92
- | External key placement | Smallest blast radius: when the keyed process (e.g. a computer-use provider loop) runs outside the sandbox, its key never enters | In-sandbox placement when the keyed process runs inside (an agent harness under test); declared per actor type, with a spend budget |
93
- | Loopback entry URLs | Public-safety: never drive third-party sites unbidden | `policies.allowPublicTargets` for an owner-declared deployment/preview (a Vercel preview of your own app). Multi-participant public/preview fan-out needs explicit `actors[0].lanes[].target` for every participant, so the adapter-owned topology is declared rather than inferred. Provisioned clone subjects always serve in-sandbox on loopback |
94
- | Full-fidelity screenshots, local | The common case is watching a run of your OWN app locally; blur destroys the deliverable. Raw frames live in gitignored `.humanish/` (this repo's CI adds a binary-asset commit scan; downstream projects rely on the scaffolded `.gitignore` and their own review) | `policies.redactScreenshots: true` blurs at capture; `export --format bundle --redact-screenshots` produces a separate verified copy of a completed run |
95
- | Synthetic, seeded state | Pinned provenance; no real user data in evidence paths | Declared external state, recorded as UNPINNED in provenance |
96
- | Single participant | Cost + evidence simplicity | Declared fan-out where the backend supports it: `actors[0].count: N` (homogeneous), explicit `actors[0].lanes[]` (differentiated persona/device/instruction), or compact `actors[0].roster[]` groups that normalize into `lanes[]` entries on the computer-use E2B route (separate worlds, cap 16; `execution.concurrency` bounds concurrent paid participants) |
97
- | Stock `desktop` template | The stock E2B desktop image is right for most subjects; absent `execution.desktop.template` keeps `Sandbox.create(opts)` byte-stable | `execution.desktop.template` names a custom E2B desktop image (any name/id, no allowlist) for a subject needing baked-in runtimes the stock image lacks (e.g. node/bun/a local Postgres); it is threaded to `Sandbox.create(template, opts)` on every desktop-creating route and recorded in the bundle as `desktopTemplate` (public-safe) |
98
- | Desktop default URL opener | Preserve the route/image's historical browser/default opener behavior when unset | `execution.desktop.browser` set to `chrome`, `chromium` or `firefox` makes the hosted CUA/shared-world browser choice explicit, fail-closed, and recorded as `desktopBrowser` in the run bundle |
99
- | Loopback-only observer serving | Run bundles are local by default (public-safety plank 3); the serve/watch surfaces bind `127.0.0.1` unconditionally, and exposing them is publishing-adjacent, so exposure is fail-closed and carries declared friction | `humanish serve --expose` behind tunnel-edge auth (ngrok `--oauth google` with `--allow-email`/`--allow-domain` allow rules, or an operator `--public-url` you secure), or `--expose --safe` (open, gated on verify-`share_ready` runs only). `watch --expose` streams a live run behind edge auth (a live run is never `share_ready`, so `--safe` alone is refused). humanish carries no in-process auth; both print computed warnings naming exactly what became reachable |
100
- | Generous wall-clock safety cap | `execution.timeoutMs` bounds runaway spend, not a goal; ~30 min is reasonable for open-ended "watch it play" | A session that reaches the cap AFTER productive activity is recorded as `budget_reached` (status `passed`, a NON-FAILURE completion, exit `0`), distinct from a zero-progress `timed_out` (a failure, exit `2`). Goal-directed labs set a tight `timeoutMs` and read `completionReason` to confirm the goal, not the cap |
87
+ | Default | Why it is the default | Legitimate override |
88
+ | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
89
+ | Dry-run | Spend safety (the live-spend rule sets the floor; dry-run keeps it far away) | `mode: live` |
90
+ | Post-run analysis on supported live studies | Findings accompany the recording; a separate $3 admission estimate limit is visible before execution | `review.analysis: false` disables it; an explicit mapping sets another analysis budget. Dry-run and unsupported routes never dispatch; missing default credentials produce a recorded skip |
91
+ | Separate worlds (`per-lane-worlds`) | Isolation, attribution, reproducibility | `route: shared-world`: N participants against one mutable plane for scenarios that are about interaction between participants. Every participant runs at once: `execution.concurrency` must be two or more, and an omitted value fills to the number of participants. The plane is one getHost-exposed subject sandbox with synthetic seeded data, or an operator-owned public deployment (external-public), driven by N actor sandboxes. The bundle declares the weaker `attributionClass: shared-world` and a verify-enforced `attributionLimits` ceiling (`best-effort-causal-attribution` and the rest of the concurrent set). Sequential turns at `execution.concurrency: 1` were removed in 0.106.0. |
92
+ | External key placement | Smallest blast radius: when the keyed process (e.g. a computer-use provider loop) runs outside the sandbox, its key never enters | In-sandbox placement when the keyed process runs inside (an agent harness under test); declared per actor type, with a spend budget |
93
+ | Loopback entry URLs | Public-safety: never drive third-party sites unbidden | `policies.allowPublicTargets` for an owner-declared deployment/preview (a Vercel preview of your own app). Multi-participant public/preview fan-out needs explicit `participants[].target` for every participant, so the adapter-owned topology is declared rather than inferred. Provisioned clone subjects always serve in-sandbox on loopback |
94
+ | Full-fidelity screenshots, local | The common case is watching a run of your own app locally; blur destroys the deliverable. Raw frames live in gitignored `.humanish/` (this repo's CI adds a binary-asset commit scan; downstream projects rely on the scaffolded `.gitignore` and their own review) | `policies.redactScreenshots: true` blurs at capture; `export --format bundle --redact-screenshots` produces a separate verified copy of a completed run |
95
+ | Synthetic, seeded state | Pinned provenance; no real user data in evidence paths | Declared external state, recorded as unpinned in provenance |
96
+ | Single participant | Cost + evidence simplicity | Declared fan-out where the route supports it: `participants: N` (homogeneous), an explicit `participants` list (differentiated persona/device/instruction), or list entries with a `count` that expand into one entry per participant on the computer-use E2B route (separate worlds, cap 16; `execution.concurrency` bounds concurrent paid participants) |
97
+ | Stock `desktop` template | The stock E2B desktop image is right for most subjects; absent `execution.desktop.template` keeps `Sandbox.create(opts)` byte-stable | `execution.desktop.template` names a custom E2B desktop image (any name/id, no allowlist) for a subject needing baked-in runtimes the stock image lacks (e.g. node/bun/a local Postgres); it is threaded to `Sandbox.create(template, opts)` on every desktop-creating route and recorded in the bundle as `desktopTemplate` (public-safe) |
98
+ | Desktop default URL opener | Preserve the route/image's historical browser/default opener behavior when unset | `execution.desktop.browser` set to `chrome`, `chromium` or `firefox` makes the hosted CUA/shared-world browser choice explicit, fail-closed, and recorded as `desktopBrowser` in the run bundle |
99
+ | Loopback-only observer serving | Run bundles are local by default (public-safety plank 3); the serve/watch surfaces bind `127.0.0.1` unconditionally, and exposing them is publishing-adjacent, so exposure is fail-closed and carries declared friction | `humanish observe --all --expose` behind tunnel-edge auth (ngrok `--oauth google` with `--allow-email`/`--allow-domain` allow rules, or an operator `--public-url` you secure), or `--expose --safe` (open, gated on verify-`share_ready` runs only). `watch --expose` streams a live run behind edge auth (a live run is never `share_ready`, so `--safe` alone is refused). humanish carries no in-process auth; both print computed warnings naming exactly what became reachable |
100
+ | Generous wall-clock safety cap | `execution.timeoutMs` bounds runaway spend, not a goal; ~30 min is reasonable for open-ended "watch it play" | A session that reaches the cap after productive activity is recorded as `budget_reached` (status `passed`, a non-failure completion, exit `0`), distinct from a zero-progress `timed_out` (a failure, exit `2`). Goal-directed studies set a tight `timeoutMs` and read `completionReason` to confirm the goal, not the cap |
101
101
 
102
102
  ## The placement rule (worked example)
103
103
 
@@ -105,7 +105,7 @@ silently drifting from one is not.
105
105
  external-placement _default_ as instantiated on the computer-use route, where the
106
106
  model's brain runs outside the sandbox. The underlying invariant-level principle is:
107
107
 
108
- > **Keys live where the keyed process runs — and nowhere else. Names go in evidence; values
108
+ > **Keys live where the keyed process runs, and nowhere else. Names go in evidence; values
109
109
  > never. Blast radius is bounded by key scoping and budgets, not by hoping.**
110
110
 
111
111
  Consequences:
@@ -113,7 +113,7 @@ Consequences:
113
113
  - A computer-use provider loop runs outside → forwarding env into its sandbox is rejected.
114
114
  - A subject app (a real web app under test) runs inside → its declared env names are
115
115
  provisioned in, values never persisted.
116
- - An agent harness under test runs inside with real keys → that is the point of the lab;
116
+ - An agent harness under test runs inside with real keys → that is the point of the study;
117
117
  the keys are presumed exfiltratable by the agent (key scoping and spend budgets protect
118
118
  them; sandboxing does not), and the participant carries a budget/ledger.
119
119
 
@@ -121,27 +121,27 @@ Placement is registry metadata per actor type, and the engine enforces it.
121
121
 
122
122
  Two corollaries:
123
123
 
124
- - **Serve commands are author-trusted.** A lab's `serve` steps execute inside the disposable
124
+ - **Serve commands are author-trusted.** A study's `serve` steps execute inside the disposable
125
125
  sandbox with the declared subject env present, in the same trust class as the repo's own
126
- package.json scripts. Run only lab configs you trust; declare only the env names the
126
+ package.json scripts. Run only study configs you trust; declare only the env names the
127
127
  subject genuinely needs.
128
128
  - **Pattern redaction is not enough for provisioned values.** A provisioned value (a database
129
129
  password, an arbitrary token) has no detectable "shape," so the harness scrubs every value
130
- it provisioned by LITERAL match before any log tail or error can persist. Pattern-based
130
+ it provisioned by literal match before any log tail or error can persist. Pattern-based
131
131
  redaction is the second pass.
132
132
 
133
133
  ## The capture-vs-publish rule (worked example)
134
134
 
135
135
  "Every screenshot is blurred to a 128px thumbnail" was once enforced at _capture_: the
136
136
  loop never retained a usable frame. That destroyed the core deliverable for the common case
137
- (a developer watching a run of their OWN app locally) to defend against a leak that can only
137
+ (a developer watching a run of their own app locally) to defend against a leak that can only
138
138
  happen at _publish_. The proof it was a default, not an invariant: the same product already
139
139
  shipped raw full-resolution frames on the meta route (since removed) with only a "do not publish" warning +
140
140
  the `.humanish/` gitignore + the binary-asset scan. Two routes, opposite policies, identical
141
141
  threat. The corrected principle:
142
142
 
143
- > **A default's enforcement point belongs at the PUBLISH/VERIFY boundary, never at
144
- > CAPTURE/RUNTIME — unless capture-time is the only physically possible point.**
143
+ > **A default's enforcement point belongs at the publish/verify boundary, never at
144
+ > capture/runtime, unless capture-time is the only physically possible point.**
145
145
 
146
146
  Consequences:
147
147
 
@@ -1,9 +1,5 @@
1
1
  # Self-Driving Harness Principles
2
2
 
3
- Date: 2026-06-01
4
-
5
- Status: initial principles for `humanish`.
6
-
7
3
  ## Thesis
8
4
 
9
5
  `humanish` should be a closed-loop product simulation system. Launching agents
@@ -27,7 +23,7 @@ context.
27
23
 
28
24
  ## Public Boundary
29
25
 
30
- This repo must be designed as if it will become public.
26
+ This repository is public.
31
27
 
32
28
  No PII, PHI, secrets, keys, tokens, raw private transcripts, real patient data,
33
29
  real customer data, or private product artifacts belong here. Examples,
@@ -14,7 +14,7 @@ They care about rigor and control, and they need output they can reason over and
14
14
  adjust.
15
15
 
16
16
  **The stakeholder** watches. In a real study they sit behind the glass in the
17
- viewing room; here they open Observer, `watch`, or `serve`. They want none of the
17
+ viewing room; here they open Observer, `watch`, or `observe --all`. They want none of the
18
18
  protocol. They want to know what happened, where people got stuck, how bad it is,
19
19
  and whether anyone succeeded: moments, severity, and the denominator.
20
20
 
@@ -32,7 +32,7 @@ includes reasoning as well as the report; exhausting it does not produce a usabl
32
32
  report and never starts an automatic retry. Analysis
33
33
  sends selected retained text and captures to OpenAI using `OPENAI_API_KEY`.
34
34
  Analysis runs in the humanish runner using its credentials. This setting adds no
35
- credential channel to the target application; each participant backend retains
35
+ credential channel to the target application; each participant's route keeps
36
36
  its existing authentication boundary. Review the separate analysis budget before running a manifest live; an actor's
37
37
  zero-dollar cap does not cap post-run analysis. The bundled first-contact
38
38
  zero-spend product fixture explicitly disables analysis.
@@ -47,19 +47,19 @@ review:
47
47
  timeoutMs: 600000
48
48
  ```
49
49
 
50
- This requires Linux x64, a Codex CLI release qualified for it (`src/actors/codex/qualified-versions.ts`), and a file-backed ChatGPT account login; the analyst
50
+ This requires Linux x64, a stable Codex CLI release from 0.154.0 on (`src/actors/codex/codex-admission.ts`), and a file-backed ChatGPT account login; the analyst
51
51
  uses low reasoning effort and remote inference. Dollar cost and a provider
52
52
  enforced output-token ceiling are unknown, so omit `maxCostUsd` and
53
53
  `maxOutputTokens`. Numeric values are rejected before participant resources are
54
54
  allocated. There is no API fallback. Missing or unsupported account setup leaves
55
55
  an explicit failed analysis state and the original recording intact. Use
56
- `humanish doctor --lab <lab>` for setup checks; account allowance and model access
56
+ `humanish doctor --study <study>` for setup checks; account allowance and model access
57
57
  remain untested until a request. An omitted provider still means OpenAI, including
58
58
  hosted studies whose participant uses a local Codex or Claude login. This setting
59
59
  does not enable managed local desktops.
60
60
 
61
- The same configuration works through `humanish run <lab>`, `lab run <lab>`,
62
- `watch <lab>`, and TUI live starts. Direct library calls to the five recording
61
+ The same configuration works through `humanish run <study>`,
62
+ `watch <study>`, and TUI live starts. Direct library calls to the five recording
63
63
  producers honor it too. Supported routes are computer-use, scripted-browser,
64
64
  terminal-product and shared-world. The synthetic route
65
65
  never enables analysis by default and rejects an explicit analysis mapping
@@ -75,7 +75,7 @@ with no retained participant activity. A desktop startup failure does not start
75
75
  an analysis request. The original failure remains visible.
76
76
 
77
77
  CLI live starts disclose the selected analyst and its separate admission estimate limit or unknown account dollars before execution.
78
- `humanish lab preflight <lab> --json` and the TUI lab screen also expose the
78
+ `humanish study check <study> --json` and the TUI study screen also expose the
79
79
  resolved budget without dispatching analysis. Library callers can inspect
80
80
  `resolveAutomaticAnalysis` or `automaticAnalysisBudget` before running.
81
81
 
@@ -96,7 +96,7 @@ action writes a cancellation request for that recording; it does not signal the
96
96
  finished participant process. Cancelling cannot undo provider work already
97
97
  accepted. Known usage is retained; missing usage remains unknown.
98
98
 
99
- The CLI's JSON keeps `runOk` for the original backend result, `automaticAnalysis`
99
+ The CLI's JSON keeps `runOk` for the route's own result, `automaticAnalysis`
100
100
  for post-run analysis, and `ok` for the overall request. Failed, cancelled or
101
101
  unknown analysis produces exit code 2 without discarding the recording. A missing
102
102
  `OPENAI_API_KEY` skips default analysis and preserves a successful run exit;
@@ -5,7 +5,7 @@ one from `node_modules/humanish/examples/`. Both need Node.js 22.19 or newer, an
5
5
  key. `pnpm api:proof`, part of `pnpm release:check`, runs both against the packed package.
6
6
 
7
7
  - [participant/](participant/README.md): bring your own participant. A synthetic loopback app is
8
- driven through its state contract by a `CuaExecutor` and a deterministic provider, with no
8
+ driven through its state contract by a `ComputerUseExecutor` and a deterministic provider, with no
9
9
  browser, screenshots or E2B.
10
10
  - [scorer/](scorer/README.md): score a run with your own rubric. One scorer module is attached to a
11
11
  dry run from a library caller and from the CLI, with no desktop or running app.
@@ -1,8 +1,8 @@
1
1
  # Bring your own participant: a local app through its state contract
2
2
 
3
3
  This complete library example starts a synthetic loopback HTTP app, reads its
4
- state with a `CuaExecutor`, sends a greeting through its action endpoint, and
5
- verifies the resulting humanish run. It uses a deterministic `CuaProvider` with
4
+ state with a `ComputerUseExecutor`, sends a greeting through its action endpoint, and
5
+ verifies the resulting humanish run. It uses a deterministic `ComputerUseProvider` with
6
6
  no model calls, API keys, browser, screenshots or E2B resources. It demonstrates
7
7
  the integration; it does not test persona behavior or the quality of an app's UI.
8
8
 
@@ -56,9 +56,9 @@ provider. Your replacement owns its model credentials and costs. The
56
56
  `openai-computer-use` actor id selects the registered CUA route; `createProvider`
57
57
  chooses the actual provider, so this example never invokes OpenAI.
58
58
 
59
- The runner shows both required discriminant checks: `parseLabConfig` receives
60
- an object containing `schema: LAB_CONFIG_SCHEMA` and is narrowed on `.ok`;
61
- `runLab` is narrowed on `route === "computer-use"` before inspecting its result.
59
+ The runner shows both required discriminant checks: `parseStudy` receives
60
+ an object containing `schema: STUDY_SCHEMA` and is narrowed on `.ok`;
61
+ `runStudy` is narrowed on `route === "computer-use"` before inspecting its result.
62
62
  Supplying `inProcess.executor` and `createProvider` selects the library-assisted
63
63
  route. It is not a config-only CLI actor or an out-of-tree actor registration API.
64
64
 
@@ -1,8 +1,8 @@
1
1
  // @ts-check
2
- import { LAB_CONFIG_SCHEMA, parseLabConfig, runLab, stableProgressKey, verifyRun } from "humanish";
2
+ import { STUDY_SCHEMA, parseStudy, runStudy, stableProgressKey, verifyRun } from "humanish";
3
3
  import { startLocalApp } from "./app.mjs";
4
4
 
5
- /** @param {string} appUrl @returns {import("humanish").CuaExecutor} */
5
+ /** @param {string} appUrl @returns {import("humanish").ComputerUseExecutor} */
6
6
  function createAppContractExecutor(appUrl) {
7
7
  return {
8
8
  async observe() {
@@ -29,7 +29,7 @@ function createAppContractExecutor(appUrl) {
29
29
  }
30
30
 
31
31
  // A deterministic rule, not an AI participant: no model SDK, requests or credentials.
32
- /** @type {import("humanish").CuaProvider} */
32
+ /** @type {import("humanish").ComputerUseProvider} */
33
33
  const provider = {
34
34
  id: "local-app-deterministic-example",
35
35
  version: "1.0.0",
@@ -59,20 +59,21 @@ const provider = {
59
59
 
60
60
  const app = await startLocalApp();
61
61
  try {
62
- // parseLabConfig accepts a decoded OBJECT, not a YAML string.
63
- const parsed = parseLabConfig({
64
- schema: LAB_CONFIG_SCHEMA,
62
+ // parseStudy accepts a decoded object, not a YAML string.
63
+ const parsed = parseStudy({
64
+ schema: STUDY_SCHEMA,
65
65
  id: "participant-example",
66
66
  title: "Deterministic local-app integration example",
67
+ route: "computer-use",
68
+ mode: "live",
67
69
  subject: { source: "local-app", appUrl: app.appUrl },
68
- // This registry id selects the CUA loop. createProvider supplies the actual provider.
69
- actors: [{ type: "openai-computer-use", persona: "pixel-pat", mission: "Greet the app." }],
70
- scenario: { mode: "live" },
70
+ // This registry id selects the computer-use loop. createProvider supplies the actual provider.
71
+ actor: { type: "openai-computer-use", persona: "pixel-pat", mission: "Greet the app." },
71
72
  review: { analysis: false }, // Keep this deterministic example free of provider requests.
72
73
  execution: { timeoutMs: 15_000 },
73
74
  });
74
75
  if (!parsed.ok) throw new Error(parsed.error.message);
75
- const outcome = await runLab(parsed.config, {
76
+ const outcome = await runStudy(parsed.config, {
76
77
  cwd: process.cwd(),
77
78
  dryRun: false,
78
79
  // An in-process executor returns app state, not a screenshot, so it needs a provider that
@@ -5,10 +5,10 @@ evidence of a computer-use, shared-world or terminal run and stores the result a
5
5
  `bundle.adapterScore`, under your namespace. A module may also export `deriveFeedback` and
6
6
  `deriveArtifacts`; the `AdapterScorerModule` type describes all three.
7
7
 
8
- [run.mjs](run.mjs) attaches the same module to a dry run of one computer-use lab in two ways:
8
+ [run.mjs](run.mjs) attaches the same module to a dry run of one computer-use study in two ways:
9
9
 
10
- - from a library caller, as `runLab(config, { scorer: { score } })`;
11
- - from the CLI, as `humanish lab run lab.yaml --dry-run --scorer scorer.mjs`.
10
+ - from a library caller, as `runStudy(config, { scorer: { score } })`;
11
+ - from the CLI, as `humanish run study.yaml --dry-run --scorer scorer.mjs`.
12
12
 
13
13
  A dry run needs no keys, desktop or running app. Each run's bundle carries the score, and
14
14
  `verifyRun` checks it. The CLI run also records which module it loaded, as