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
@@ -5,27 +5,26 @@ import { tmpdir } from "node:os";
5
5
  import { join } from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
7
  import { promisify } from "node:util";
8
- import { LAB_CONFIG_SCHEMA, parseLabConfig, runLab, verifyRun } from "humanish";
8
+ import { STUDY_SCHEMA, parseStudy, runStudy, verifyRun } from "humanish";
9
9
  import { score } from "./scorer.mjs";
10
10
 
11
- // One scorer module, attached two ways to a dry run of a computer-use lab: as library hooks and
11
+ // One scorer module, attached two ways to a dry run of a computer-use study: as library hooks and
12
12
  // through the CLI's --scorer flag. A dry run needs no keys, desktop or running app.
13
- const lab = {
14
- schema: LAB_CONFIG_SCHEMA,
13
+ const study = {
14
+ schema: STUDY_SCHEMA,
15
15
  id: "scorer-example",
16
16
  title: "Score a dry run",
17
+ route: "computer-use",
17
18
  subject: { source: "app-url", appUrl: "http://127.0.0.1:3000/" },
18
- actors: [
19
- { type: "openai-computer-use", persona: "pixel-pat", mission: "Find the pricing page." },
20
- ],
19
+ actor: { type: "openai-computer-use", persona: "pixel-pat", mission: "Find the pricing page." },
21
20
  execution: { target: "e2b-desktop" },
22
21
  review: { analysis: false },
23
22
  };
24
23
 
25
24
  // A throwaway project directory; both runs write their bundles under its .humanish/runs/.
26
25
  const project = await mkdtemp(join(tmpdir(), "humanish-scorer-example-"));
27
- // JSON is valid YAML, so the CLI reads the same manifest the library call uses.
28
- await writeFile(join(project, "lab.yaml"), `${JSON.stringify(lab, null, 2)}\n`);
26
+ // JSON is valid YAML, so the CLI reads the same study file the library call uses.
27
+ await writeFile(join(project, "study.yaml"), `${JSON.stringify(study, null, 2)}\n`);
29
28
  await copyFile(new URL("./scorer.mjs", import.meta.url), join(project, "scorer.mjs"));
30
29
 
31
30
  /** @param {string} runId */
@@ -37,9 +36,9 @@ async function scored(runId) {
37
36
  return { runId, adapterScore: bundle.adapterScore, verified: verification.ok };
38
37
  }
39
38
 
40
- const parsed = parseLabConfig(lab);
39
+ const parsed = parseStudy(study);
41
40
  if (!parsed.ok) throw new Error(parsed.error.message);
42
- const outcome = await runLab(parsed.config, { cwd: project, dryRun: true, scorer: { score } });
41
+ const outcome = await runStudy(parsed.config, { cwd: project, dryRun: true, scorer: { score } });
43
42
  if (outcome.route !== "computer-use" || !outcome.result.ok) {
44
43
  throw new Error(`Library dry run failed: ${JSON.stringify(outcome.result)}`);
45
44
  }
@@ -49,7 +48,7 @@ const library = await scored(outcome.result.runId);
49
48
  const bin = fileURLToPath(new URL("./cli.js", import.meta.resolve("humanish")));
50
49
  const { stdout } = await promisify(execFile)(
51
50
  process.execPath,
52
- [bin, "lab", "run", "lab.yaml", "--dry-run", "--no-open", "--scorer", "scorer.mjs", "--json"],
51
+ [bin, "run", "study.yaml", "--dry-run", "--no-open", "--scorer", "scorer.mjs", "--json"],
53
52
  { cwd: project },
54
53
  );
55
54
  const cli = await scored(JSON.parse(stdout).runId);
@@ -1,8 +1,8 @@
1
1
  // @ts-check
2
2
  // A scorer module: humanish calls `score` over the finished evidence of a computer-use,
3
3
  // shared-world or terminal run and stores the result, under your namespace, as
4
- // `bundle.adapterScore`. The same file works with `humanish lab run <lab> --scorer scorer.mjs` and,
5
- // from a library caller, as the scorer hooks passed to `runLab`.
4
+ // `bundle.adapterScore`. The same file works with `humanish run <study> --scorer scorer.mjs` and,
5
+ // from a library caller, as the scorer hooks passed to `runStudy`.
6
6
 
7
7
  /** @type {NonNullable<import("humanish").AdapterScorerModule["score"]>} */
8
8
  export function score(ctx) {
@@ -14,7 +14,7 @@ export function score(ctx) {
14
14
  // A dry run has no participant behavior to judge, so this rubric withholds a pass.
15
15
  status: dryRun ? "partial" : "pass",
16
16
  score: dryRun ? 50 : 100,
17
- summary: `${participants} participant stream(s) in ${ctx.labId}${dryRun ? " (dry run)" : ""}.`,
17
+ summary: `${participants} participant stream(s) in ${ctx.studyId}${dryRun ? " (dry run)" : ""}.`,
18
18
  data: { participants, runId: ctx.runId },
19
19
  };
20
20
  }
package/package.json CHANGED
@@ -1,12 +1,14 @@
1
1
  {
2
2
  "name": "humanish",
3
- "version": "0.107.0",
4
- "description": "Open-source-safe CLI for persona simulation, observer review, and public-safe feedback drafts.",
3
+ "version": "0.109.0",
4
+ "description": "Synthetic user research for apps, CLIs, and agent-facing product flows.",
5
5
  "keywords": [
6
- "agent-harness",
7
6
  "cli",
8
- "persona-simulation",
7
+ "computer-use",
8
+ "synthetic-users",
9
9
  "ui-testing",
10
+ "usability-testing",
11
+ "user-research",
10
12
  "ux-research"
11
13
  ],
12
14
  "homepage": "https://github.com/danielgwilson/humanish#readme",
@@ -23,25 +25,19 @@
23
25
  "humanish": "./dist/cli.js"
24
26
  },
25
27
  "files": [
26
- "AGENTS.md",
27
28
  "CHANGELOG.md",
28
29
  "dist",
30
+ "docs/README.md",
29
31
  "docs/architecture",
30
- "docs/assets",
31
32
  "docs/contracts",
32
33
  "docs/decisions",
33
- "docs/goals/current.md",
34
34
  "docs/principles",
35
35
  "docs/product",
36
- "docs/ramp",
37
- "docs/release",
38
- "docs/roadmap",
39
36
  "examples",
40
37
  "skills",
41
38
  "README.md",
42
39
  "LICENSE",
43
40
  "SECURITY.md",
44
- "CONTRIBUTING.md",
45
41
  "ARCHITECTURE.md",
46
42
  "CONTEXT.md",
47
43
  "TELEMETRY.md"
@@ -60,7 +56,7 @@
60
56
  },
61
57
  "scripts": {
62
58
  "build": "tsc -p tsconfig.build.json && pnpm --filter humanish-observer build && pnpm --filter humanish-tui build && node scripts/finish-build.mjs",
63
- "check": "pnpm format:check && pnpm lint && pnpm knip && pnpm prose:check && pnpm vocabulary:check && pnpm typecheck && pnpm test && pnpm tui:test && pnpm build && pnpm guest-media:startup:proof && pnpm cli:startup:test && pnpm cli:preflight:test && pnpm tui:smoke",
59
+ "check": "pnpm format:check && pnpm lint && pnpm knip && pnpm prose:check && pnpm vocabulary:check && pnpm site-css:check && pnpm typecheck && pnpm test && pnpm tui:test && pnpm build && pnpm guest-media:startup:proof && pnpm cli:startup:test && pnpm cli:preflight:test && pnpm tui:smoke",
64
60
  "cli:startup:test": "node scripts/terminal-startup-exit-proof.mjs",
65
61
  "cli:preflight:test": "node scripts/task-route-preflight-proof.mjs",
66
62
  "humanish": "tsx src/cli.ts",
@@ -69,7 +65,7 @@
69
65
  "public-surface:scan": "node scripts/public-surface-scan.mjs",
70
66
  "api:proof": "node scripts/public-api-proof.mjs",
71
67
  "release:check": "pnpm check && pnpm api:proof && pnpm public-surface:scan && pnpm skill:check && npm pack --dry-run",
72
- "skill:check": "DISABLE_TELEMETRY=1 npx skills add . --list",
68
+ "skill:check": "DISABLE_TELEMETRY=1 pnpm exec skills add . --list",
73
69
  "test": "vitest run",
74
70
  "typecheck": "tsc -p tsconfig.json --noEmit && pnpm --filter humanish-observer typecheck && pnpm --filter humanish-tui typecheck",
75
71
  "tui:typecheck": "pnpm --filter humanish-tui typecheck",
@@ -80,7 +76,7 @@
80
76
  "docs:generate": "tsx scripts/generate-cli-docs.ts",
81
77
  "docs:check": "tsx scripts/generate-cli-docs.ts --check && tsx scripts/check-doc-paths.ts && tsx scripts/check-doc-symbols.ts && tsx scripts/check-doc-comments.ts",
82
78
  "observer:browser:proof": "node scripts/observer-browser-proof.mjs",
83
- "observer:iframe:proof": "node scripts/observer-iframe-proof.mjs",
79
+ "observer:iframe:proof": "node --import tsx scripts/observer-iframe-proof.mjs",
84
80
  "observer:chrome:proof": "node scripts/observer-chrome-proof.mjs",
85
81
  "observer:reliability:proof": "node scripts/observer-reliability-proof.mjs",
86
82
  "tui:connections:proof": "python3 scripts/tui-connections-proof.py",
@@ -90,10 +86,12 @@
90
86
  "comms:agentmail:contract": "node --import tsx scripts/agentmail-contract-check.mjs",
91
87
  "format": "oxfmt",
92
88
  "format:check": "oxfmt --check",
93
- "lint": "node scripts/check-lint-cap.mjs --max-warnings=442",
89
+ "lint": "node scripts/check-lint-cap.mjs --max-warnings=440",
94
90
  "knip": "knip",
95
- "prose:check": "node scripts/check-code-prose.mjs --max-issue-refs=357 --max-fix-tags=0 --max-caps=804 --max-lane-comments=20",
96
- "vocabulary:check": "tsx scripts/check-retired-words.ts --max-lane=137 --max-seat=4 --max-role=52 --max-sim=33 --max-study=9"
91
+ "prose:check": "node scripts/check-code-prose.mjs",
92
+ "vocabulary:check": "tsx scripts/check-retired-words.ts",
93
+ "site-css:check": "node scripts/check-site-css.mjs",
94
+ "site:hero:proof": "node scripts/site-hero-wrap-proof.mjs"
97
95
  },
98
96
  "dependencies": {
99
97
  "commander": "^15.0.0",
@@ -114,6 +112,7 @@
114
112
  "oxfmt": "0.71.0",
115
113
  "oxlint": "1.86.0",
116
114
  "oxlint-tsgolint": "7.0.2003",
115
+ "skills": "1.7.0",
117
116
  "tsx": "^4.23.15",
118
117
  "typescript": "catalog:",
119
118
  "vitest": "catalog:"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: humanish
3
- description: Install and configure humanish CLI in a JavaScript app as an open-source-safe persona simulation harness. Use when an agent needs to add humanish, run safe first setup, create synthetic personas or scenarios, configure env var names without values, capture the email an app sends so a persona can complete an email-gated flow (e.g. a signup verification link or one-time code), run verification and Observer commands, or draft public-safe feedback issues without GitHub mutation.
3
+ description: Synthetic user research for apps, CLIs, and agent-facing product flows. Install and configure the humanish CLI in a JavaScript app. Use when an agent needs to add humanish, run safe first setup, create synthetic personas or scenarios, configure env var names without values, capture the email an app sends so a persona can complete an email-gated flow (e.g. a signup verification link or one-time code), run verification and Observer commands, or draft public-safe feedback issues without GitHub mutation.
4
4
  ---
5
5
 
6
6
  # humanish CLI
@@ -32,9 +32,9 @@ Everything it shows has a machine-readable equivalent, which is what you want:
32
32
 
33
33
  | Instead of the TUI | Use |
34
34
  | ------------------- | -------------------------------------------------------------------------------------- |
35
- | browsing labs | `npx humanish lab list --json` |
35
+ | browsing studies | `npx humanish study list --json` |
36
36
  | browsing runs | `npx humanish runs --json` |
37
- | starting a run | `npx humanish lab run <lab> --json --no-open` |
37
+ | starting a run | `npx humanish run <study> --json --no-open` |
38
38
  | a run's outcome | `npx humanish review --run <id> --json` |
39
39
  | communication setup | `npx humanish comms providers --json` and `npx humanish comms connections list --json` |
40
40
 
@@ -51,7 +51,7 @@ authorized credential source), followed by
51
51
  and `HUMANISH_STRICT_KEYS=1` still apply. Read installed provider capabilities:
52
52
  use `humanish comms check --online --json` for read-only authentication.
53
53
  Authentication does not establish mailbox permissions, capacity or delivery.
54
- `humanish comms configure --lab <path> --json` previews an ignored lab copy;
54
+ `humanish comms configure --study <path> --json` previews an ignored study copy;
55
55
  add `--apply --plan-token <digest>` to save the reviewed version. Launch its
56
56
  exact returned path, not a basename that could resolve to another manifest.
57
57
 
@@ -87,9 +87,9 @@ exact returned path, not a basename that could resolve to another manifest.
87
87
  5. Confirm the layout:
88
88
  - commit `humanish/` source files;
89
89
  - ignore `.humanish/` runtime artifacts;
90
- - keep committed labs under `humanish/labs/*.yaml`;
91
- - keep private/local labs under ignored `.humanish/labs/*.yaml` or
92
- `.humanish/local/labs/*.yaml`;
90
+ - keep committed studies under `humanish/studies/*.yaml`;
91
+ - keep private/local studies under ignored `.humanish/studies/*.yaml` or
92
+ `.humanish/local/studies/*.yaml`;
93
93
  - keep `.env.example` commit-safe and value-free;
94
94
  - never commit generated run bundles.
95
95
 
@@ -109,34 +109,34 @@ Do not pass numeric `maxCostUsd`/`maxOutputTokens` or their CLI flags to the
109
109
  account branch. It cannot enforce those ceilings and rejects them. Account dollar
110
110
  cost remains unknown even when token usage is reported. There is no fallback to
111
111
  an API key or another provider. `analyze --dry-run --provider codex` validates
112
- local evidence/configuration only; `doctor --lab` checks setup without a model
112
+ local evidence/configuration only; `doctor --study` checks setup without a model
113
113
  request. Inspect a failed attempt before explicitly retrying `--provider codex
114
114
  --rerun`. Opening Observer never starts analysis.
115
115
 
116
116
  ## Local browser setup
117
117
 
118
118
  On Linux x64 with local rootful Docker, KVM and TUN, or a supported M3-or-newer
119
- Mac with native ARM64 Node and Lima 2.2+, an `app-url` lab can set `execution.target: local` and `actors[0].type: local-agent` with
119
+ Mac with native ARM64 Node and Lima 2.2+, an `app-url` study can set `execution.target: local` and `actor.type: local-agent` with
120
120
  `localAgent: codex`. It uses the supported Codex ChatGPT login, not E2B or an
121
121
  OpenAI API key. Inference is remote and consumes account quota. Existing hosted
122
- labs stay hosted; never silently change their execution or billing provider.
122
+ studies stay hosted; never silently change their execution or billing provider.
123
123
 
124
- Use `humanish runtime status --json` and `humanish doctor --lab <path> --json`
124
+ Use `humanish runtime status --json` and `humanish doctor --study <path> --json`
125
125
  for read-only setup inspection. `humanish runtime setup` downloads and verifies
126
126
  the pinned runtime; a live local run also prepares it automatically. The normal
127
- `humanish lab run <path>` command and TUI use the same study runner and Observer.
128
- See [the complete example and limits](../../docs/architecture/local-browser-runtime.md).
127
+ `humanish run <path>` command and TUI use the same study runner and Observer.
128
+ See [the complete example and limits](https://humanish.dev/docs/local-browser).
129
129
 
130
130
  Local browsers currently require a loopback app URL with an explicit port above
131
131
  1023 and use a 960×720 Chromium desktop. For email-gated local apps, start
132
132
  `humanish comms catch`, point the app's email sends at it, and declare
133
- `comms.email.external.catchBaseUrl`. Use `doctor --lab` to check its recipient
133
+ `comms.email.external.catchBaseUrl`. Use `doctor --study` to check its recipient
134
134
  routes. This captures app sends without mailbox-provider credentials; it does
135
135
  not receive arbitrary internet email. Each participant gets only its assigned
136
136
  inbox through the local desktop. Real receiving still needs a supported hosted
137
- route. See [captured inbox setup](../../docs/architecture/comms-inbox.md#local-browser-studies).
137
+ route. See [captured inbox setup](https://humanish.dev/docs/comms-inbox#local-browser-studies).
138
138
  Optional camera and spoken conversation require a separate media
139
- runtime; follow [participant media](../../docs/architecture/participant-media.md)
139
+ runtime; follow [participant media](https://humanish.dev/docs/participant-media)
140
140
  for setup and provider limits. Speech uses the same continuing Codex participant,
141
141
  not a second conversation. Do not claim that installing the CLI also installs
142
142
  Docker or Lima, or qualifies a machine for arbitrary participant counts.
@@ -144,14 +144,14 @@ Docker or Lima, or qualifies a machine for arbitrary participant counts.
144
144
  For continuous desktop playback, independent computer-use participants can opt into
145
145
  `execution.desktop.recording: { audio: true }` (`false` for screen-only video).
146
146
  Screenshots remain the default. Recording does not enable camera or speech;
147
- the raw media stays local-only. See [desktop recording](../../docs/architecture/desktop-recording.md)
147
+ the raw media stays local-only. See [desktop recording](https://humanish.dev/docs/desktop-recording)
148
148
  for runtime requirements and export limits.
149
149
 
150
150
  ## Format Stack
151
151
 
152
152
  When creating or editing humanish files:
153
153
 
154
- - use `.yaml` for human-authored humanish source: labs, personas and scenarios;
154
+ - use `.yaml` for human-authored humanish source: studies, personas and scenarios;
155
155
  - use `.mjs` for executable adopter scorers named by `review.scorer.ref`;
156
156
  - use `.json` or `.ndjson` for generated machine artifacts, Observer data, run
157
157
  bundles, event streams, and synthetic fixtures.
@@ -188,9 +188,9 @@ background: |
188
188
  A profile with `background` receives only explicitly declared trait directives.
189
189
  Legacy profiles without it retain medium defaults for missing patience and
190
190
  technical confidence. Avoid contradictory prose and traits; inspect the compiled
191
- brief with `humanish lab inspect <lab> --json` before running.
191
+ brief with `humanish study show <study> --json` before running.
192
192
 
193
- For an autonomous participant study, use a computer-use/local-agent lab and write
193
+ For an autonomous participant study, use a computer-use/local-agent study and write
194
194
  its `mission` as a believable situation and desired outcome. Supply fixture facts
195
195
  needed to act, but do not supply selectors, click sequences, hidden success rules,
196
196
  expected defects or recovery tricks. For example: “Saturday's event needs two
@@ -230,42 +230,46 @@ and `waitForSelector`. Supported expectations are `text`, `selectorVisible`,
230
230
  values only. Do not write real emails, names, customer data, tickets, logs, or
231
231
  tokens into scenario files.
232
232
 
233
- ## Authoring Labs
233
+ ## Authoring Studies
234
234
 
235
- Create reusable simulation runs as `.yaml` lab manifests:
235
+ Write reusable studies as `.yaml` study files (`humanish.study.v3`):
236
236
 
237
237
  ```yaml
238
- schema: humanish.lab.v2
238
+ schema: humanish.study.v3
239
239
  id: first-run
240
240
  title: First-run synthetic Observer
241
+ route: preview
242
+ mode: dry-run
241
243
  subject:
242
244
  source: this-repo
243
- actors:
244
- - type: synthetic-persona
245
- count: 4
246
- scenario:
247
- mode: dry-run
245
+ actor:
246
+ type: synthetic-persona
247
+ participants: 4
248
248
  defaults:
249
249
  open: true
250
250
  ```
251
251
 
252
- A lab is a composition (`subject` × `actors` × `execution` × `scenario` ×
253
- `policies`), not a hardcoded kind; there is no v1 compatibility. Run
254
- `npx humanish lab inspect <lab>` to see how a manifest parses, including
255
- warnings for fields the engine does not consume yet.
252
+ A study declares its `route` (`preview`, `computer-use`, `shared-world`, `terminal` or
253
+ `scripted`) and composes `subject`, `actor`, `participants`, `caps`, `execution` and
254
+ `policies` for it; a key the route does not read is a parse error that names the route.
255
+ Run `npx humanish study show <study>` to see how a study file parses. humanish
256
+ no longer runs a `humanish.lab.v2` file from 0.107: it fails with
257
+ `HUMANISH_STUDY_V2_UNSUPPORTED`. `npx humanish migrate` rewrites every v2 file as v3
258
+ under `studies/`, and `--dry-run` lists them first. A v3 file left in a `labs/` folder
259
+ fails with `HUMANISH_STUDY_RETIRED_DIRECTORY`; move it to the matching `studies/` folder.
256
260
 
257
261
  ### Many actors at once (fan-out, shared worlds, concurrency)
258
262
 
259
- - **Every declared participant runs live at once by default.** A 6-participant
260
- roster is 6 simultaneous actors; total sessions and spend are the same either
263
+ - **Every declared participant runs live at once by default.** A 6-entry
264
+ `participants` list is 6 simultaneous actors; total sessions and spend are the same either
261
265
  way, only wall-clock and simultaneity differ. `execution.concurrency` is a
262
266
  CAP, not a mode: declare it only to bound simultaneous paid desktops, and
263
267
  expect a parse warning when the cap makes participants run in waves (a green
264
268
  waved run looks identical to the all-live run you meant, so the harness says
265
269
  so up front).
266
270
  - **Separate worlds (`per-lane-worlds`) vs one shared world.** A plain
267
- multi-participant computer-use lab gives each actor its OWN app instance
268
- (independent studies in parallel). Add `subject.topology: shared-world` for N
271
+ multi-participant computer-use study gives each actor its OWN app instance
272
+ (independent studies in parallel). Declare `route: shared-world` for N
269
273
  actors in ONE world (a lobby, a shared DB, actors seeing each other's
270
274
  changes). Shared-world participants run at once; `execution.concurrency` must
271
275
  be at least 2 there.
@@ -274,8 +278,8 @@ warnings for fields the engine does not consume yet.
274
278
  run looks like idle tiles — another reason to leave the cap out unless you
275
279
  need it.
276
280
 
277
- Use committed `humanish/labs/*.yaml` for public-safe, reproducible labs. Use
278
- ignored `.humanish/labs/*.yaml` or `.humanish/local/labs/*.yaml` for private repo
281
+ Use committed `humanish/studies/*.yaml` for public-safe, reproducible studies. Use
282
+ ignored `.humanish/studies/*.yaml` or `.humanish/local/studies/*.yaml` for private repo
279
283
  targets, local-only dogfood, or machine-specific settings. Never commit private
280
284
  repo names, stream URLs, credential values, screenshots, logs, source snippets,
281
285
  or operational details.
@@ -283,10 +287,10 @@ or operational details.
283
287
  Useful commands:
284
288
 
285
289
  ```bash
286
- npx humanish lab list
287
- npx humanish lab inspect first-run
290
+ npx humanish study list
291
+ npx humanish study show first-run
288
292
  npx humanish watch first-run
289
- npx humanish lab run first-run --json --no-open
293
+ npx humanish run first-run --json --no-open
290
294
  ```
291
295
 
292
296
  ### Off-app email verification (comms)
@@ -316,7 +320,7 @@ and model charges are separate. Use `humanish comms recover --json` after an
316
320
  interrupted run, then `humanish comms recover --run <id> --apply --json` for its
317
321
  privately recorded resources. Never derive deletion authority from run artifacts.
318
322
  SMS, participant sending, borrowed inboxes and other providers remain unavailable.
319
- See `docs/architecture/real-email-receiving.md` for limits and recovery.
323
+ See [real email receiving](https://humanish.dev/docs/email-receiving) for limits and recovery.
320
324
 
321
325
  The following configuration selects **local capture**:
322
326
 
@@ -341,9 +345,9 @@ customize addresses or limit which participants do email:
341
345
 
342
346
  ```yaml
343
347
  recipients:
344
- - lane: signup-01 # this lab's REAL participant id: a roster entry's `id`, or the
345
- # generated lane-01..lane-NN names when you use `count`. An unknown id
346
- # is a hard parse error listing the lab's actual participant ids (a mismatch
348
+ - lane: signup-01 # this study's REAL participant id: a `participants` entry's `id`,
349
+ # or the generated lane-01..lane-NN names when you use a count. An unknown id
350
+ # is a hard parse error listing the study's actual participant ids (a mismatch
347
351
  # would silently disable the funnel for that participant, which is how a
348
352
  # 6-actor field run lost every inbox at once). Participants you leave out get
349
353
  # no inbox and are never told one exists — the parser warns which.
@@ -372,8 +376,8 @@ inbox page. See `docs/contracts/schemas.md` for the full `comms:` shape and
372
376
 
373
377
  ## First Proof Run
374
378
 
375
- Run the no-credentials path first. This proves humanish artifact plumbing, not
376
- target app behavior:
379
+ Run the no-credentials path first. It is a dry run: humanish writes a synthetic
380
+ run bundle and tests no target app behavior:
377
381
 
378
382
  ```bash
379
383
  npx humanish doctor
@@ -386,7 +390,7 @@ For CI or non-interactive proof:
386
390
 
387
391
  ```bash
388
392
  npx humanish watch --json --no-open
389
- npx humanish lab run first-run --json --no-open
393
+ npx humanish run first-run --json --no-open
390
394
  ```
391
395
 
392
396
  The feedback command prints a public-safe Markdown draft. It must not call the
@@ -394,31 +398,31 @@ GitHub API, require a token, update Projects, use provider credits, or claim
394
398
  product behavior proof from a dry run.
395
399
 
396
400
  When the target app can run locally, prove a known browser path with a
397
- scripted-browser lab after starting the app on loopback. The lab replays a
401
+ scripted-browser study after starting the app on loopback. The study replays a
398
402
  `browser.steps` scenario (see above) on a desktop surface, plus a mobile one
399
403
  with `count: 2`. The scripted steps make no model requests. Post-run analysis
400
404
  still runs by default when `OPENAI_API_KEY` is set, with a $3 cap; keep
401
405
  `review.analysis: false` to skip it. Copy the shape of
402
- [`humanish/labs/scripted-demo.yaml`](https://github.com/danielgwilson/humanish/blob/main/humanish/labs/scripted-demo.yaml)
406
+ [`humanish/studies/scripted-demo.yaml`](https://github.com/danielgwilson/humanish/blob/main/humanish/studies/scripted-demo.yaml)
403
407
  or the example in the
404
- [lab manifest reference](https://humanish.dev/docs/lab-manifests#scripted-browser-scenarios):
405
- set `subject.appUrl` to the loopback URL, `scenario.ref` to the scenario id,
406
- and `scenario.mode: live`. Without `mode: live` the lab is a dry run that opens
408
+ [study file reference](https://humanish.dev/docs/study-files#scripted-browser-scenarios):
409
+ set `subject.appUrl` to the loopback URL, `scenario` to the scenario id,
410
+ and `mode: live`. Without `mode: live` the study is a dry run that opens
407
411
  no browser.
408
412
 
409
413
  ```bash
410
414
  # in another terminal, start the target app on 127.0.0.1 or localhost
411
- npx humanish lab inspect <lab> --json
412
- npx humanish lab run <lab> --json --no-open
415
+ npx humanish study show <study> --json
416
+ npx humanish run <study> --json --no-open
413
417
  npx humanish verify --run latest --json
414
- npx humanish watch --run latest --detach --no-open --json
418
+ npx humanish observe --run latest --open # for a person; it serves until Ctrl-C
415
419
  ```
416
420
 
417
421
  Do not use `humanish watch --count ...` as a substitute for a scripted-browser
418
- lab. `watch` renders or follows Observer evidence; a live scripted-browser lab
419
- captures desktop and mobile browser evidence against a running app.
422
+ study. `watch` without a study starts a preview run for the Observer; a live scripted-browser
423
+ study captures desktop and mobile browser evidence against a running app.
420
424
 
421
- ## Optional Live E2B Lab
425
+ ## Optional Live E2B Study
422
426
 
423
427
  Live headed E2B desktop participants are optional. Add the substrate dependency only
424
428
  when the user explicitly wants live E2B execution:
@@ -438,7 +442,7 @@ Do not paste values into files, prompts, run bundles, issue drafts, or logs.
438
442
  Load local values only at invocation time:
439
443
 
440
444
  ```bash
441
- npx humanish watch .humanish/labs/local-live.yaml --env-file .humanish/local/provider.env
445
+ npx humanish watch .humanish/studies/local-live.yaml --env-file .humanish/local/provider.env
442
446
  ```
443
447
 
444
448
  When choosing dogfood targets, prefer apps, CLIs, or agent-facing tools with a
@@ -1,7 +1,7 @@
1
1
  interface:
2
2
  display_name: "humanish CLI"
3
3
  short_description: "Set up public-safe persona simulation"
4
- default_prompt: "Use $humanish to install humanish in this repo, scaffold synthetic personas and scenarios, run the safe Observer proof, and report the public-safe artifacts. If the app can run locally, start it on loopback and run a live scripted-browser lab (see https://humanish.dev/docs/lab-manifests#scripted-browser-scenarios; set `scenario.mode: live` and keep `review.analysis: false`) before rendering Observer with `humanish watch --run latest`; do not treat `watch --count` as app behavior proof."
4
+ default_prompt: "Use $humanish to install humanish in this repo, scaffold synthetic personas and scenarios, run the safe Observer proof, and report the public-safe artifacts. If the app can run locally, start it on loopback and run a live scripted study (see https://humanish.dev/docs/study-files#scripted-browser-scenarios; set `mode: live` and keep `review.analysis: false`) before opening the Observer with `humanish observe --run latest`; do not treat `watch --count` as app behavior proof."
5
5
 
6
6
  policy:
7
7
  allow_implicit_invocation: true
package/AGENTS.md DELETED
@@ -1,99 +0,0 @@
1
- # AGENTS.md
2
-
3
- humanish runs persona studies: AI participants use a target app, CLI or agent-facing flow on
4
- hosted or local desktops, and every run leaves a verifiable evidence bundle. Run bundles are the
5
- source of truth; the Observer is their review surface.
6
-
7
- Sub-guides take precedence inside their directories: [observer/](https://github.com/danielgwilson/humanish/blob/main/observer/AGENTS.md),
8
- [tui/](https://github.com/danielgwilson/humanish/blob/main/tui/AGENTS.md), [site/](https://github.com/danielgwilson/humanish/blob/main/site/AGENTS.md). The reasoning behind the rules below is in
9
- [docs/principles/engineering.md](docs/principles/engineering.md). [CONTEXT.md](CONTEXT.md) defines
10
- the domain terms, and [docs/decisions/](docs/decisions/README.md) records the decisions that
11
- shape the code.
12
-
13
- ## Commands
14
-
15
- Node >= 22.19.0, pnpm 12 (`packageManager` pins the version).
16
-
17
- ```bash
18
- pnpm install
19
- pnpm humanish <command> # run the CLI from source (tsx src/cli.ts)
20
- pnpm vitest run tests/<file> # one test file
21
- pnpm format # oxfmt; run before every commit
22
- pnpm check # the full local gate (below)
23
- pnpm release:check # check + API proof + public-surface scan + skill check + pack; CI runs this
24
- ```
25
-
26
- `pnpm check` runs format:check, lint (oxlint, type-aware), knip, prose:check, vocabulary:check,
27
- typecheck, the vitest suite, the TUI tests, build, the startup proofs and a TUI smoke test. After
28
- changing a CLI option, run `pnpm docs:generate`; CI fails on a stale `site/content/docs/cli.mdx`.
29
- Observer changes also need `pnpm build` and the four `observer:*:proof` scripts, which CI's observer
30
- job runs in Chromium. `pnpm api:proof` (after `pnpm build`) installs the packed tarball in a
31
- temporary project, compares its export names with `tests/golden/public-api.json` and runs
32
- `examples/`. After an intended export change, run `pnpm api:proof --update` and review the golden
33
- diff.
34
-
35
- Three counts are held to caps in package.json: oxlint warnings (`lint`, `--max-warnings`), comment
36
- prose (`prose:check`) and the retired words lane, seat, role, sim and study in `src/` identifiers
37
- and file names (`vocabulary:check`). Each checker fails when a count is above its cap or below it,
38
- so the PR that reduces a count lowers its cap to the new count; the failure names the flag and the
39
- value. CI's `caps` workflow fails a PR that raises or removes a cap against the base branch, unless
40
- the PR has the `raise-cap` label and a `Cap raise:` line in its body that says why.
41
-
42
- ## Layout
43
-
44
- [ARCHITECTURE.md](ARCHITECTURE.md#find-the-code-for-each-part-of-the-system) maps each folder to
45
- the file to read first. Keep these layout rules:
46
-
47
- - `src/index.ts` is the package's only library export surface. `src/cli.ts` is its bin.
48
- - `src/guest-runtime-main.ts`, `src/guest-runtime-revision.ts` and `src/guest-media-worker.ts`
49
- stay at the root of `src/`. `scripts/guest-runtime-package.mjs` and the image recipes in
50
- `runtime/` address their `dist/` output by file name. The rest of the guest runtime is in
51
- `src/guest/`.
52
-
53
- ## Conventions
54
-
55
- - TypeScript ESM with strict settings. No `any`; narrow `unknown` at the boundary.
56
- - Keep files under about 700 lines and functions under about 150 (oxlint warns past both). Split
57
- when it helps a reader; do not add to `src/routes/computer-use/route.ts` or
58
- `src/actors/computer-use/loop.ts` when a smaller module fits.
59
- - Comments say why the code is the way it is. History, incident narratives, issue archaeology and
60
- PR numbers go in the commit message. `TODO(#123)` may link an open issue. No all-caps emphasis.
61
- `prose:check` counts violations in `src/`.
62
- - Tests assert behavior. Do not pin prose in docs or comments with `toContain`. The default test
63
- timeout is 20 s. Provider-API fixtures come from captured wire shapes.
64
- - New dependencies go in the pnpm catalog (`pnpm-workspace.yaml`) when more than one workspace
65
- uses them. Stay on the latest release; a comment next to the entry gives the reason for any
66
- older pin. knip fails on unused files, dependencies and exports.
67
- - CLI results are truthful: reject unsupported execution before side effects, and keep useful
68
- evidence when a run is interrupted. Documented bundle schemas and artifact paths are contracts.
69
-
70
- ## Public Boundary
71
-
72
- Assume this repository is public.
73
-
74
- - Never commit or publish secrets, PII/PHI, private customer data, private source, or raw
75
- private transcripts or screenshots. Public examples are synthetic or redacted. Do not copy
76
- credential files or secret values into evidence, comments, docs, issues or PRs.
77
- - Authorized local studies may keep private evidence in gitignored `.humanish/` under the
78
- capture and redaction rules. Local capture is not publication permission. See the
79
- [invariants](docs/principles/invariants-and-defaults.md) and the
80
- [public-readiness standard](docs/release/public-readiness-standard.md).
81
- - Do not commit `.env*`, `.npmrc`, run bundles, runtime caches or packed tarballs.
82
- - Naming the owner's other projects, products or domains in public material needs explicit
83
- sign-off. Use fictional examples. Named public third-party OSS study subjects are fine.
84
-
85
- ## Working
86
-
87
- - Read the files in [CONTRIBUTING.md's reading order](CONTRIBUTING.md#read-these-in-order), then
88
- the current task; read the contract for the boundary you are changing. Historical plans do not
89
- authorize work.
90
- - Keep `main` clean: one worktree and branch per task, reviewable commits, squash merges.
91
- - Before adding a service, protocol, mode or framework, state the concrete need in the PR.
92
- Prefer removing an unnecessary mechanism to documenting around it.
93
- - Verify in proportion to the change. Runtime changes need an execution check; claims of live
94
- behavior need a retained run bundle, since dry runs do not establish live behavior. PRs say
95
- what changed, what was checked and what was not.
96
- - With shipping authority: push, open the PR, address checks, merge when green, fast-forward
97
- main and remove the worktree and branch. Releases follow the
98
- [release procedure](docs/release/open-source-readiness.md). Stay on `0.x` until the maintainer
99
- chooses 1.0; the minor after `0.99.0` is `0.100.0`.