humanish 0.107.0 → 0.108.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/ARCHITECTURE.md +22 -17
  2. package/CHANGELOG.md +14 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +145 -172
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-ui.js +1 -1
  14. package/dist/actors/codex/codex-admission.d.ts +91 -0
  15. package/dist/actors/codex/codex-admission.js +150 -0
  16. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  17. package/dist/actors/codex/restricted-executable.js +8 -8
  18. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  19. package/dist/actors/codex/restricted-launch.js +1 -1
  20. package/dist/actors/codex/restricted-participant.js +8 -6
  21. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  22. package/dist/actors/codex/restricted-policy.js +2 -2
  23. package/dist/actors/codex/restricted-session.d.ts +2 -2
  24. package/dist/actors/codex/restricted-session.js +10 -5
  25. package/dist/actors/computer-use/actor.d.ts +16 -16
  26. package/dist/actors/computer-use/actor.js +2 -2
  27. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  28. package/dist/actors/computer-use/admission-limit.js +1 -1
  29. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  30. package/dist/actors/computer-use/loop/actions.js +10 -10
  31. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  32. package/dist/actors/computer-use/loop/backstop.js +14 -12
  33. package/dist/actors/computer-use/loop/ending.d.ts +5 -5
  34. package/dist/actors/computer-use/loop/ending.js +7 -7
  35. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  36. package/dist/actors/computer-use/loop/observation.js +9 -9
  37. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  38. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  39. package/dist/actors/computer-use/loop/session.js +3 -3
  40. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  41. package/dist/actors/computer-use/loop/spend.js +1 -1
  42. package/dist/actors/computer-use/loop/trace.js +9 -8
  43. package/dist/actors/computer-use/loop/types.d.ts +25 -23
  44. package/dist/actors/computer-use/loop/usage.js +2 -2
  45. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  46. package/dist/actors/computer-use/openai-context.js +214 -0
  47. package/dist/actors/computer-use/openai-provider.d.ts +11 -8
  48. package/dist/actors/computer-use/openai-provider.js +45 -34
  49. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  50. package/dist/actors/computer-use/openai-requests.js +82 -15
  51. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  52. package/dist/actors/computer-use/openai-wire.js +36 -34
  53. package/dist/actors/contract.d.ts +78 -43
  54. package/dist/actors/contract.js +29 -23
  55. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  56. package/dist/actors/local-agent/claude-session.js +10 -9
  57. package/dist/actors/local-agent/cli.d.ts +8 -6
  58. package/dist/actors/local-agent/cli.js +24 -28
  59. package/dist/actors/local-agent/readiness.d.ts +2 -2
  60. package/dist/actors/local-agent/readiness.js +4 -4
  61. package/dist/actors/reasoning-effort.js +6 -6
  62. package/dist/actors/registry.d.ts +10 -10
  63. package/dist/actors/registry.js +18 -17
  64. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  65. package/dist/actors/scripted-browser/actor.js +16 -16
  66. package/dist/actors/scripted-browser/browser-command.js +1 -1
  67. package/dist/actors/scripted-browser/steps.js +1 -1
  68. package/dist/actors/scripted-browser/types.d.ts +1 -1
  69. package/dist/actors/stop-conditions.d.ts +1 -1
  70. package/dist/analysis/codex-config.d.ts +6 -2
  71. package/dist/analysis/codex-config.js +22 -14
  72. package/dist/analysis/service.js +5 -5
  73. package/dist/cli/commands/analyze.js +19 -16
  74. package/dist/cli/commands/codex.js +9 -9
  75. package/dist/cli/commands/comms.js +54 -33
  76. package/dist/cli/commands/feedback.js +20 -21
  77. package/dist/cli/commands/lab-format.d.ts +5 -4
  78. package/dist/cli/commands/lab-format.js +35 -23
  79. package/dist/cli/commands/lab-route-computer-use.js +6 -7
  80. package/dist/cli/commands/lab-route-preview.js +4 -3
  81. package/dist/cli/commands/lab-route-shared-world.js +3 -3
  82. package/dist/cli/commands/lab-run.js +10 -11
  83. package/dist/cli/commands/lab-scorer.d.ts +2 -2
  84. package/dist/cli/commands/lab-scorer.js +1 -1
  85. package/dist/cli/commands/migrate.d.ts +4 -0
  86. package/dist/cli/commands/migrate.js +65 -0
  87. package/dist/cli/commands/observe.js +147 -108
  88. package/dist/cli/commands/run-command.d.ts +10 -0
  89. package/dist/cli/commands/run-command.js +85 -0
  90. package/dist/cli/commands/runs.js +137 -138
  91. package/dist/cli/commands/setup.d.ts +2 -2
  92. package/dist/cli/commands/setup.js +26 -21
  93. package/dist/cli/commands/study.d.ts +3 -0
  94. package/dist/cli/commands/study.js +182 -0
  95. package/dist/cli/commands/tui.d.ts +4 -4
  96. package/dist/cli/commands/tui.js +21 -21
  97. package/dist/cli/commands/watch.js +60 -75
  98. package/dist/cli/deprecations.d.ts +18 -0
  99. package/dist/cli/deprecations.js +48 -0
  100. package/dist/cli/doctor.d.ts +15 -5
  101. package/dist/cli/doctor.js +103 -48
  102. package/dist/cli/first-run-path.d.ts +12 -10
  103. package/dist/cli/first-run-path.js +30 -28
  104. package/dist/cli/io.d.ts +41 -6
  105. package/dist/cli/io.js +97 -22
  106. package/dist/cli/observer-follow.d.ts +2 -2
  107. package/dist/cli/observer-follow.js +5 -6
  108. package/dist/cli/orientation.d.ts +6 -3
  109. package/dist/cli/orientation.js +43 -39
  110. package/dist/cli/product-sentence.d.ts +6 -0
  111. package/dist/cli/product-sentence.js +6 -0
  112. package/dist/cli/program.d.ts +6 -1
  113. package/dist/cli/program.js +109 -40
  114. package/dist/cli/telemetry.d.ts +15 -15
  115. package/dist/cli/telemetry.js +48 -40
  116. package/dist/cli.js +1 -1
  117. package/dist/comms/capture-surface.d.ts +13 -12
  118. package/dist/comms/capture-surface.js +23 -22
  119. package/dist/comms/catch-host.d.ts +7 -7
  120. package/dist/comms/catch-host.js +14 -14
  121. package/dist/comms/email-catch.d.ts +3 -3
  122. package/dist/comms/email-catch.js +8 -8
  123. package/dist/comms/external-evidence.js +2 -2
  124. package/dist/comms/extract.js +2 -2
  125. package/dist/comms/fake-inbox.d.ts +2 -2
  126. package/dist/comms/fake-inbox.js +2 -2
  127. package/dist/comms/receiving-render.d.ts +1 -1
  128. package/dist/comms/receiving-render.js +2 -2
  129. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  130. package/dist/comms/sandbox-catch-script.js +6 -6
  131. package/dist/comms/sandbox-catch.d.ts +36 -37
  132. package/dist/comms/sandbox-catch.js +34 -35
  133. package/dist/comms/setup.js +42 -8
  134. package/dist/comms/thread-evidence.d.ts +1 -1
  135. package/dist/comms/thread-evidence.js +6 -6
  136. package/dist/comms/types.d.ts +6 -6
  137. package/dist/comms/types.js +3 -3
  138. package/dist/evidence/frame-signature.d.ts +1 -1
  139. package/dist/evidence/frame-signature.js +4 -4
  140. package/dist/evidence/redaction.d.ts +3 -3
  141. package/dist/evidence/redaction.js +4 -4
  142. package/dist/feedback/draft.js +36 -78
  143. package/dist/feedback/export-bundle.js +1 -1
  144. package/dist/feedback/export.d.ts +5 -1
  145. package/dist/feedback/export.js +7 -8
  146. package/dist/feedback/feedback.d.ts +2 -2
  147. package/dist/feedback/feedback.js +21 -3
  148. package/dist/guest/chromium-text.js +2 -2
  149. package/dist/guest/desktop-native.d.ts +1 -1
  150. package/dist/guest/runtime.js +1 -1
  151. package/dist/index.d.ts +12 -10
  152. package/dist/index.js +8 -6
  153. package/dist/keys/key-resolution.d.ts +5 -5
  154. package/dist/keys/key-resolution.js +23 -23
  155. package/dist/lab/adapter-extension.d.ts +7 -7
  156. package/dist/lab/adapter-extension.js +13 -36
  157. package/dist/lab/adapter-scorer-loader.d.ts +7 -7
  158. package/dist/lab/adapter-scorer-loader.js +32 -32
  159. package/dist/lab/composition-rules.js +42 -42
  160. package/dist/lab/config.js +65 -25
  161. package/dist/lab/deprecated-fields.d.ts +10 -0
  162. package/dist/lab/deprecated-fields.js +24 -0
  163. package/dist/lab/device-presets.d.ts +8 -8
  164. package/dist/lab/device-presets.js +11 -11
  165. package/dist/lab/discover.d.ts +13 -9
  166. package/dist/lab/discover.js +117 -57
  167. package/dist/lab/doctor.d.ts +10 -3
  168. package/dist/lab/doctor.js +47 -9
  169. package/dist/lab/init-templates.js +147 -147
  170. package/dist/lab/init.d.ts +1 -1
  171. package/dist/lab/init.js +41 -9
  172. package/dist/lab/keys.d.ts +2 -0
  173. package/dist/lab/keys.js +42 -8
  174. package/dist/lab/lab-deps.d.ts +7 -12
  175. package/dist/lab/parse/actors.js +9 -9
  176. package/dist/lab/parse/comms.js +5 -5
  177. package/dist/lab/parse/execution.js +13 -13
  178. package/dist/lab/parse/study-v3.d.ts +23 -0
  179. package/dist/lab/parse/study-v3.js +259 -0
  180. package/dist/lab/parse/subject-state.d.ts +7 -7
  181. package/dist/lab/parse/subject-state.js +16 -16
  182. package/dist/lab/parse/subject.js +28 -28
  183. package/dist/lab/parse/values.d.ts +1 -1
  184. package/dist/lab/parse/values.js +3 -3
  185. package/dist/lab/persona-resolve.d.ts +4 -4
  186. package/dist/lab/persona-resolve.js +4 -4
  187. package/dist/lab/plan-participants.d.ts +2 -2
  188. package/dist/lab/plan-types.d.ts +4 -4
  189. package/dist/lab/plan.d.ts +1 -7
  190. package/dist/lab/plan.js +10 -41
  191. package/dist/lab/preflight-probes.js +11 -11
  192. package/dist/lab/preflight-result.d.ts +2 -1
  193. package/dist/lab/preflight-result.js +5 -4
  194. package/dist/lab/preflight.d.ts +7 -5
  195. package/dist/lab/preflight.js +5 -5
  196. package/dist/lab/routing.d.ts +31 -25
  197. package/dist/lab/routing.js +60 -29
  198. package/dist/lab/run-lab-events.d.ts +0 -3
  199. package/dist/lab/run-lab-events.js +0 -6
  200. package/dist/lab/run-lab-homes.d.ts +22 -10
  201. package/dist/lab/run-lab-homes.js +5 -1
  202. package/dist/lab/run-lab-options.d.ts +1 -1
  203. package/dist/lab/run-lab-options.js +16 -13
  204. package/dist/lab/summary.d.ts +7 -6
  205. package/dist/lab/summary.js +10 -10
  206. package/dist/lab/tasks.d.ts +15 -15
  207. package/dist/lab/tasks.js +14 -14
  208. package/dist/lab/types.d.ts +101 -95
  209. package/dist/lab/types.js +2 -0
  210. package/dist/lab/validation.d.ts +13 -13
  211. package/dist/lab/validation.js +44 -42
  212. package/dist/lab/warnings.d.ts +10 -0
  213. package/dist/lab/warnings.js +61 -33
  214. package/dist/library-aliases.d.ts +56 -0
  215. package/dist/library-aliases.js +22 -0
  216. package/dist/observer/artifact.d.ts +1 -1
  217. package/dist/observer/artifact.js +6 -6
  218. package/dist/observer/data.d.ts +6 -6
  219. package/dist/observer/data.js +5 -4
  220. package/dist/observer/exposure.d.ts +1 -1
  221. package/dist/observer/exposure.js +11 -11
  222. package/dist/observer/http.js +1 -1
  223. package/dist/observer/library.d.ts +1 -1
  224. package/dist/observer/library.js +4 -2
  225. package/dist/observer/listen.js +5 -4
  226. package/dist/observer/render.d.ts +1 -1
  227. package/dist/observer/render.js +10 -5
  228. package/dist/observer/run-routes.d.ts +3 -3
  229. package/dist/observer/run-routes.js +1 -1
  230. package/dist/observer/serve.js +7 -3
  231. package/dist/observer/tunnel.js +1 -1
  232. package/dist/observer-app.html +4 -4
  233. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  234. package/dist/routes/computer-use/bundle-parts.js +15 -15
  235. package/dist/routes/computer-use/bundle.js +3 -3
  236. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
  238. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  239. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
  240. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  241. package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
  242. package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
  243. package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
  244. package/dist/routes/computer-use/external-comms.d.ts +1 -1
  245. package/dist/routes/computer-use/external-comms.js +1 -1
  246. package/dist/routes/computer-use/fanout-bundle.js +18 -18
  247. package/dist/routes/computer-use/fanout-records.js +10 -11
  248. package/dist/routes/computer-use/live-flush.d.ts +1 -1
  249. package/dist/routes/computer-use/live-flush.js +6 -6
  250. package/dist/routes/computer-use/live-phase.d.ts +4 -2
  251. package/dist/routes/computer-use/live-phase.js +6 -6
  252. package/dist/routes/computer-use/local-vm.js +1 -1
  253. package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
  254. package/dist/routes/computer-use/participant-desktop.js +4 -4
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +9 -9
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +31 -13
  259. package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
  260. package/dist/routes/computer-use/participant-prompt.js +6 -6
  261. package/dist/routes/computer-use/participant-runs.d.ts +7 -7
  262. package/dist/routes/computer-use/participant-runs.js +13 -13
  263. package/dist/routes/computer-use/plan.js +22 -22
  264. package/dist/routes/computer-use/preflight.js +21 -21
  265. package/dist/routes/computer-use/rerun-selection.js +1 -1
  266. package/dist/routes/computer-use/result.js +11 -11
  267. package/dist/routes/computer-use/route.d.ts +2 -1
  268. package/dist/routes/computer-use/route.js +15 -14
  269. package/dist/routes/computer-use/self-report.d.ts +7 -7
  270. package/dist/routes/computer-use/self-report.js +31 -31
  271. package/dist/routes/computer-use/setup.d.ts +1 -1
  272. package/dist/routes/computer-use/setup.js +17 -18
  273. package/dist/routes/computer-use/single-bundle.d.ts +7 -7
  274. package/dist/routes/computer-use/single-bundle.js +28 -30
  275. package/dist/routes/computer-use/subject-projection.d.ts +1 -1
  276. package/dist/routes/computer-use/subject-projection.js +6 -6
  277. package/dist/routes/computer-use/types.d.ts +40 -42
  278. package/dist/routes/computer-use/types.js +10 -10
  279. package/dist/routes/preview.d.ts +8 -2
  280. package/dist/routes/preview.js +8 -4
  281. package/dist/routes/scripted/bundle.d.ts +2 -2
  282. package/dist/routes/scripted/bundle.js +13 -12
  283. package/dist/routes/scripted/plan.d.ts +1 -1
  284. package/dist/routes/scripted/plan.js +9 -9
  285. package/dist/routes/scripted/result.js +5 -5
  286. package/dist/routes/scripted/route.js +5 -6
  287. package/dist/routes/scripted/scenario.js +2 -2
  288. package/dist/routes/scripted/setup.js +7 -7
  289. package/dist/routes/scripted/subject.js +1 -1
  290. package/dist/routes/scripted/surface-records.js +3 -3
  291. package/dist/routes/scripted/types.d.ts +3 -5
  292. package/dist/routes/scripted/types.js +1 -1
  293. package/dist/routes/shared-world/bundle-records.js +9 -8
  294. package/dist/routes/shared-world/bundle.d.ts +5 -5
  295. package/dist/routes/shared-world/bundle.js +40 -38
  296. package/dist/routes/shared-world/checkpoints.d.ts +1 -1
  297. package/dist/routes/shared-world/checkpoints.js +1 -1
  298. package/dist/routes/shared-world/comms.d.ts +5 -5
  299. package/dist/routes/shared-world/comms.js +14 -14
  300. package/dist/routes/shared-world/external-public.d.ts +4 -3
  301. package/dist/routes/shared-world/external-public.js +16 -12
  302. package/dist/routes/shared-world/handoff.d.ts +7 -6
  303. package/dist/routes/shared-world/handoff.js +65 -57
  304. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  305. package/dist/routes/shared-world/lobby-code.js +9 -9
  306. package/dist/routes/shared-world/participant-specs.d.ts +7 -6
  307. package/dist/routes/shared-world/participant-specs.js +31 -24
  308. package/dist/routes/shared-world/plan.js +7 -7
  309. package/dist/routes/shared-world/provenance.d.ts +2 -2
  310. package/dist/routes/shared-world/provenance.js +2 -2
  311. package/dist/routes/shared-world/provisioned.js +14 -13
  312. package/dist/routes/shared-world/result.js +20 -21
  313. package/dist/routes/shared-world/route.js +23 -22
  314. package/dist/routes/shared-world/setup.d.ts +3 -3
  315. package/dist/routes/shared-world/setup.js +4 -4
  316. package/dist/routes/shared-world/types.d.ts +30 -28
  317. package/dist/routes/shared-world/types.js +4 -4
  318. package/dist/routes/terminal/adapter.d.ts +3 -3
  319. package/dist/routes/terminal/adapter.js +5 -5
  320. package/dist/routes/terminal/bundle.d.ts +3 -3
  321. package/dist/routes/terminal/bundle.js +22 -21
  322. package/dist/routes/terminal/credentials.d.ts +4 -4
  323. package/dist/routes/terminal/credentials.js +7 -7
  324. package/dist/routes/terminal/dry-run.js +4 -4
  325. package/dist/routes/terminal/encoding.js +2 -2
  326. package/dist/routes/terminal/ledger.d.ts +3 -3
  327. package/dist/routes/terminal/ledger.js +14 -14
  328. package/dist/routes/terminal/live-finish.js +3 -3
  329. package/dist/routes/terminal/live-sandbox.js +12 -13
  330. package/dist/routes/terminal/persona.js +1 -1
  331. package/dist/routes/terminal/plan.js +11 -11
  332. package/dist/routes/terminal/recorder.js +2 -2
  333. package/dist/routes/terminal/result.js +8 -8
  334. package/dist/routes/terminal/route.js +6 -7
  335. package/dist/routes/terminal/sandbox.d.ts +1 -1
  336. package/dist/routes/terminal/sandbox.js +1 -1
  337. package/dist/routes/terminal/session.js +8 -7
  338. package/dist/routes/terminal/token-usage.d.ts +1 -1
  339. package/dist/routes/terminal/token-usage.js +7 -8
  340. package/dist/routes/terminal/trace.d.ts +2 -2
  341. package/dist/routes/terminal/trace.js +2 -2
  342. package/dist/routes/terminal/types.d.ts +26 -28
  343. package/dist/routes/terminal/types.js +3 -3
  344. package/dist/run/bundle-shape.js +3 -3
  345. package/dist/run/bundle.d.ts +46 -46
  346. package/dist/run/bundle.js +2 -1
  347. package/dist/run/cost-summary.js +3 -3
  348. package/dist/run/costs.js +7 -1
  349. package/dist/run/detail.d.ts +6 -6
  350. package/dist/run/detail.js +4 -4
  351. package/dist/run/dry-run-inputs.js +1 -1
  352. package/dist/run/dry-run.js +18 -18
  353. package/dist/run/judge.d.ts +19 -13
  354. package/dist/run/judge.js +18 -8
  355. package/dist/run/paths.d.ts +1 -1
  356. package/dist/run/paths.js +1 -1
  357. package/dist/run/pricing.d.ts +11 -6
  358. package/dist/run/pricing.js +20 -13
  359. package/dist/run/projection.d.ts +14 -14
  360. package/dist/run/projection.js +15 -15
  361. package/dist/run/reclaim.js +2 -2
  362. package/dist/run/results.d.ts +5 -5
  363. package/dist/run/run-index.d.ts +8 -6
  364. package/dist/run/run-index.js +15 -16
  365. package/dist/run/run-not-found.d.ts +5 -0
  366. package/dist/run/run-not-found.js +15 -0
  367. package/dist/run/run.d.ts +5 -4
  368. package/dist/run/run.js +1 -1
  369. package/dist/run/sandbox-receipts.d.ts +2 -2
  370. package/dist/run/sandbox-receipts.js +3 -3
  371. package/dist/run/shared-world-evidence.d.ts +36 -35
  372. package/dist/run/shared-world-evidence.js +4 -4
  373. package/dist/run/shared-world-shape.d.ts +1 -1
  374. package/dist/run/shared-world-shape.js +6 -6
  375. package/dist/run/stats.d.ts +12 -6
  376. package/dist/run/stats.js +116 -58
  377. package/dist/run/status.d.ts +8 -29
  378. package/dist/run/status.js +5 -27
  379. package/dist/run/stored-runs.js +2 -1
  380. package/dist/run/stream-shape.js +1 -1
  381. package/dist/run/streams.d.ts +6 -6
  382. package/dist/run/study-provenance.d.ts +47 -0
  383. package/dist/run/study-provenance.js +63 -0
  384. package/dist/run/study-result.d.ts +16 -0
  385. package/dist/run/study-result.js +9 -0
  386. package/dist/run/text.d.ts +2 -0
  387. package/dist/run/text.js +4 -0
  388. package/dist/run-lab.d.ts +7 -7
  389. package/dist/run-lab.js +1 -3
  390. package/dist/study/convert.d.ts +33 -0
  391. package/dist/study/convert.js +432 -0
  392. package/dist/study/field-paths.d.ts +12 -0
  393. package/dist/study/field-paths.js +126 -0
  394. package/dist/study/files.d.ts +26 -0
  395. package/dist/study/files.js +43 -0
  396. package/dist/study/migrate.d.ts +48 -0
  397. package/dist/study/migrate.js +408 -0
  398. package/dist/study/owned-files.d.ts +38 -0
  399. package/dist/study/owned-files.js +182 -0
  400. package/dist/subject/clone.d.ts +1 -1
  401. package/dist/subject/desktop-cli.d.ts +1 -1
  402. package/dist/subject/desktop-cli.js +2 -2
  403. package/dist/subject/local-tree-archive.js +1 -1
  404. package/dist/subject/local-tree.d.ts +1 -1
  405. package/dist/subject/node-bootstrap.js +1 -1
  406. package/dist/subject/runtime.js +8 -9
  407. package/dist/subject/serve.d.ts +1 -1
  408. package/dist/subject/serve.js +3 -3
  409. package/dist/subject/state.d.ts +1 -1
  410. package/dist/subject/steps.d.ts +5 -5
  411. package/dist/subject/steps.js +4 -4
  412. package/dist/substrates/command-failure.d.ts +3 -3
  413. package/dist/substrates/command-failure.js +3 -3
  414. package/dist/substrates/detached.d.ts +6 -6
  415. package/dist/substrates/detached.js +7 -7
  416. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  417. package/dist/substrates/e2b/cdp-probe.js +14 -17
  418. package/dist/substrates/e2b/desktop-browser.d.ts +2 -2
  419. package/dist/substrates/e2b/desktop-browser.js +8 -8
  420. package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
  421. package/dist/substrates/e2b/desktop-cdp.js +8 -8
  422. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  423. package/dist/substrates/e2b/desktop-executor.js +1 -1
  424. package/dist/substrates/e2b/desktop-geometry.d.ts +3 -3
  425. package/dist/substrates/e2b/desktop-geometry.js +7 -7
  426. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  427. package/dist/substrates/e2b/desktop-media.js +1 -1
  428. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  429. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  430. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  431. package/dist/substrates/e2b/sandbox.js +1 -1
  432. package/dist/substrates/e2b/sdk.d.ts +11 -11
  433. package/dist/substrates/e2b/sdk.js +6 -6
  434. package/dist/tui/actions.d.ts +1 -1
  435. package/dist/tui/actions.js +13 -13
  436. package/dist/tui/contract.d.ts +16 -16
  437. package/dist/tui/contract.js +10 -10
  438. package/dist/tui/launch.d.ts +4 -4
  439. package/dist/tui/launch.js +18 -19
  440. package/dist/tui/project.js +5 -5
  441. package/dist/tui-app.js +82 -82
  442. package/dist/verify/actor.d.ts +8 -8
  443. package/dist/verify/actor.js +36 -36
  444. package/dist/verify/artifacts.d.ts +2 -2
  445. package/dist/verify/artifacts.js +3 -3
  446. package/dist/verify/context-growth.d.ts +9 -0
  447. package/dist/verify/context-growth.js +62 -0
  448. package/dist/verify/costs.d.ts +6 -6
  449. package/dist/verify/costs.js +8 -8
  450. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  451. package/dist/verify/shared-world-concurrent.js +79 -76
  452. package/dist/verify/shared-world.d.ts +2 -2
  453. package/dist/verify/shared-world.js +16 -16
  454. package/dist/verify/subject.d.ts +4 -4
  455. package/dist/verify/subject.js +18 -18
  456. package/dist/verify/verify.js +92 -43
  457. package/docs/README.md +25 -32
  458. package/docs/architecture/actor-contract.md +56 -87
  459. package/docs/architecture/desktop-sessions.md +7 -7
  460. package/docs/architecture/external-public-shared-world.md +61 -59
  461. package/docs/architecture/github-feedback-loop.md +1 -4
  462. package/docs/architecture/guest-desktop.md +2 -2
  463. package/docs/architecture/observer.md +34 -34
  464. package/docs/architecture/restricted-codex-analysis.md +34 -28
  465. package/docs/architecture/serve.md +34 -37
  466. package/docs/architecture/state-driven-executor.md +55 -58
  467. package/docs/architecture/task-protocol-support.md +5 -5
  468. package/docs/architecture/terminal-product-route.md +67 -107
  469. package/docs/contracts/README.md +24 -0
  470. package/docs/contracts/adapter-admission.md +3 -3
  471. package/docs/contracts/adapter-fixtures.md +2 -5
  472. package/docs/contracts/core.md +1 -3
  473. package/docs/contracts/errors.md +62 -0
  474. package/docs/contracts/feedback.md +8 -9
  475. package/docs/contracts/policy.md +7 -12
  476. package/docs/contracts/run-bundle.md +45 -44
  477. package/docs/contracts/schemas.md +421 -362
  478. package/docs/contracts/study-analysis.md +3 -3
  479. package/docs/contracts/study-costs.md +11 -7
  480. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  481. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  482. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  483. package/docs/principles/actor-fidelity.md +4 -4
  484. package/docs/principles/engineering.md +3 -3
  485. package/docs/principles/invariants-and-defaults.md +38 -38
  486. package/docs/principles/self-driving-harness.md +1 -5
  487. package/docs/principles/three-roles.md +1 -1
  488. package/docs/product/automatic-analysis.md +7 -7
  489. package/examples/participant/README.md +5 -5
  490. package/examples/participant/run.mjs +11 -10
  491. package/examples/scorer/README.md +3 -3
  492. package/examples/scorer/run.mjs +11 -12
  493. package/package.json +16 -17
  494. package/skills/humanish/SKILL.md +60 -58
  495. package/skills/humanish/agents/openai.yaml +1 -1
  496. package/AGENTS.md +0 -99
  497. package/CONTRIBUTING.md +0 -148
  498. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  499. package/dist/actors/codex/qualified-versions.js +0 -132
  500. package/dist/cli/commands/lab.d.ts +0 -3
  501. package/dist/cli/commands/lab.js +0 -199
  502. package/dist/cli/renamed-options.d.ts +0 -11
  503. package/dist/cli/renamed-options.js +0 -18
  504. package/dist/observer/static.d.ts +0 -39
  505. package/dist/observer/static.js +0 -369
  506. package/docs/architecture/comms-inbox.md +0 -122
  507. package/docs/architecture/desktop-recording.md +0 -80
  508. package/docs/architecture/local-browser-runtime.md +0 -178
  509. package/docs/architecture/observer-review.md +0 -144
  510. package/docs/architecture/participant-media.md +0 -90
  511. package/docs/architecture/project-layout.md +0 -62
  512. package/docs/architecture/real-email-receiving.md +0 -136
  513. package/docs/assets/humanish-drawdb-hero.png +0 -0
  514. package/docs/assets/humanish-observer-hero.png +0 -0
  515. package/docs/goals/current.md +0 -207
  516. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  517. package/docs/product/open-source-install-experience.md +0 -240
  518. package/docs/ramp/README.md +0 -295
  519. package/docs/release/open-source-readiness.md +0 -222
  520. package/docs/release/public-readiness-standard.md +0 -210
  521. package/docs/roadmap/world-class-open-source-v0.md +0 -311
@@ -3,17 +3,14 @@
3
3
  // onEvent turned into the emitter. The package's runLab refuses the removed bags
4
4
  // (removedOptionRefusal).
5
5
  import path from "node:path";
6
- import { CUA_ACTOR_LAB_SCHEMA } from "../routes/computer-use/types.js";
7
- import { SCRIPTED_BROWSER_LAB_SCHEMA } from "../routes/scripted/types.js";
8
- import { CONCURRENT_SHARED_WORLD_LAB_SCHEMA } from "../routes/shared-world/types.js";
9
- import { TERMINAL_PRODUCT_LAB_SCHEMA } from "../routes/terminal/types.js";
10
6
  import { isLocalBrowserLab } from "../substrates/local/runtime-config.js";
11
7
  import { resolveLabDryRun } from "./plan.js";
12
8
  import { knownSecretValues, labEventEmitter } from "./run-lab-events.js";
13
9
  import { rosterOf } from "./parse/actors.js";
10
+ import { studyResultIdentity } from "../run/study-result.js";
14
11
  const unsupported = (option, route, reason) => ({
15
12
  ok: false,
16
- code: "HUMANISH_LAB_OPTION_UNSUPPORTED",
13
+ code: "HUMANISH_STUDY_OPTION_UNSUPPORTED",
17
14
  message: `RunLabOptions.${option} is not supported on the ${route} route: ${reason}`,
18
15
  });
19
16
  // Fields RunLabOptions no longer has, and where each one's job went.
@@ -33,7 +30,7 @@ export function removedOptionRefusal(options) {
33
30
  if (options.rerun !== undefined && Reflect.get(options.rerun, "laneIds") !== undefined)
34
31
  return {
35
32
  ok: false,
36
- code: "HUMANISH_LAB_OPTION_UNSUPPORTED",
33
+ code: "HUMANISH_STUDY_OPTION_UNSUPPORTED",
37
34
  message: 'RunLabOptions.rerun.laneIds was removed. Use rerun.participantIds. See docs/contracts/schemas.md, "Library options".',
38
35
  };
39
36
  const field = Object.keys(REMOVED_OPTIONS).find((key) => Reflect.get(options, key) !== undefined);
@@ -41,7 +38,7 @@ export function removedOptionRefusal(options) {
41
38
  return undefined;
42
39
  return {
43
40
  ok: false,
44
- code: "HUMANISH_LAB_OPTION_UNSUPPORTED",
41
+ code: "HUMANISH_STUDY_OPTION_UNSUPPORTED",
45
42
  message: `RunLabOptions.${field} was removed. ${REMOVED_OPTIONS[field]} See docs/contracts/schemas.md, "Library options".`,
46
43
  };
47
44
  }
@@ -110,18 +107,24 @@ export function optionRefusalOutcome(config, route, options, refusal) {
110
107
  const actor = config.actors[0]?.type ?? "";
111
108
  const dryRun = resolveLabDryRun(config, options.dryRun, true) ?? true;
112
109
  const runId = options.runId ?? "not-created";
113
- const common = { ok: false, cwd, labId: config.id, actor, dryRun, runId, warnings: [], error };
110
+ const common = { ok: false, cwd, actor, dryRun, runId, warnings: [], error };
114
111
  switch (route) {
115
112
  case "preview":
116
113
  return {
117
114
  route: "preview",
118
- result: { schema: "humanish.run-result.v1", ok: false, cwd, warnings: [], error },
115
+ result: {
116
+ ...studyResultIdentity("preview", config.id),
117
+ ok: false,
118
+ cwd,
119
+ warnings: [],
120
+ error,
121
+ },
119
122
  };
120
123
  case "computer-use":
121
124
  return {
122
125
  route: "computer-use",
123
126
  result: {
124
- schema: CUA_ACTOR_LAB_SCHEMA,
127
+ ...studyResultIdentity("computer-use", config.id),
125
128
  ...common,
126
129
  ok: false,
127
130
  appUrl: config.subject.appUrl ?? config.subject.serve?.url ?? "",
@@ -132,7 +135,7 @@ export function optionRefusalOutcome(config, route, options, refusal) {
132
135
  return {
133
136
  route: "scripted",
134
137
  result: {
135
- schema: SCRIPTED_BROWSER_LAB_SCHEMA,
138
+ ...studyResultIdentity("scripted", config.id),
136
139
  ...common,
137
140
  ok: false,
138
141
  appUrl: config.subject.appUrl ?? "",
@@ -143,7 +146,7 @@ export function optionRefusalOutcome(config, route, options, refusal) {
143
146
  return {
144
147
  route: "terminal",
145
148
  result: {
146
- schema: TERMINAL_PRODUCT_LAB_SCHEMA,
149
+ ...studyResultIdentity("terminal", config.id),
147
150
  ...common,
148
151
  ok: false,
149
152
  product: config.subject.product?.name ?? "",
@@ -154,7 +157,7 @@ export function optionRefusalOutcome(config, route, options, refusal) {
154
157
  return {
155
158
  route: "shared-world",
156
159
  result: {
157
- schema: CONCURRENT_SHARED_WORLD_LAB_SCHEMA,
160
+ ...studyResultIdentity("shared-world", config.id),
158
161
  ...common,
159
162
  ok: false,
160
163
  topology: "shared-world",
@@ -1,6 +1,6 @@
1
1
  import { type LocalRuntimeStatus } from "../substrates/local/runtime.js";
2
2
  import { type KeyResolutionDeps } from "../keys/key-resolution.js";
3
- export declare const LAB_SUMMARY_SCHEMA = "humanish.lab-summary.v1";
3
+ export declare const STUDY_SUMMARY_SCHEMA = "humanish.study-summary.v1";
4
4
  export interface LabCaps {
5
5
  /** Per-participant blast-radius budget. */
6
6
  laneUsd?: number;
@@ -20,8 +20,9 @@ export interface LabSummary {
20
20
  model: string;
21
21
  maxCostUsd: number | null;
22
22
  };
23
- schema: typeof LAB_SUMMARY_SCHEMA;
24
- labId: string;
23
+ schema: typeof STUDY_SUMMARY_SCHEMA;
24
+ /** The study's `id`. */
25
+ studyId: string;
25
26
  title?: string;
26
27
  description?: string;
27
28
  /** "clone drawdb-io/drawdb", "app-url http://127.0.0.1:3000/", "this-repo". */
@@ -31,11 +32,11 @@ export interface LabSummary {
31
32
  /** The model that will actually run, override or default. */
32
33
  model?: string;
33
34
  /**
34
- * The reasoning effort that will actually run, override or default — and `"per-lane"` when the
35
+ * The reasoning effort that will actually run, override or default, and `"per-lane"` when the
35
36
  * roster declares more than one, because a single value would be a lie about half the participants.
36
37
  *
37
38
  * Shown because it was a silent constant: unreachable from a lab, so every run took the provider
38
- * default. A study variable you cannot see is one nobody chose (#497).
39
+ * default. A study variable you cannot see is one nobody chose.
39
40
  */
40
41
  reasoningEffort?: string;
41
42
  caps: LabCaps;
@@ -59,7 +60,7 @@ export interface ReadLabSummaryOptions {
59
60
  keyDeps?: KeyResolutionDeps;
60
61
  }
61
62
  /**
62
- * Describe one lab. Returns null when the manifest cannot be resolved — the caller already knows
63
+ * Describe one lab. Returns null when the manifest cannot be resolved: the caller already knows
63
64
  * the lab exists from the listing, so this failing means the file changed underneath them.
64
65
  */
65
66
  export declare function readLabSummary(cwd: string, lab: string, options?: ReadLabSummaryOptions): Promise<LabSummary | null>;
@@ -1,9 +1,9 @@
1
1
  import { isLocalBrowserLab } from "../substrates/local/runtime-config.js";
2
2
  import { localRuntimeStatus } from "../substrates/local/runtime.js";
3
- // What a lab IS, for the surface that has to describe it before you spend money (#455).
3
+ // What a lab is, for the surface that has to describe it before you spend money.
4
4
  //
5
- // The run index and run detail answer questions about runs. This answers a question about the LAB
6
- // itself — what it drives, who is in it, which model, and what it is allowed to spend — which is
5
+ // The run index and run detail answer questions about runs. This answers a question about the lab
6
+ // itself (what it drives, who is in it, which model, and what it is allowed to spend), which is
7
7
  // what a stakeholder reads on the screen where they decide whether to press Start.
8
8
  //
9
9
  // Resolved analysis defaults are shown independently of declared participant caps. A cap that is not
@@ -19,10 +19,10 @@ import { isComputerUseComposition } from "./routing.js";
19
19
  import { probeKeySources } from "../keys/key-resolution.js";
20
20
  import { receivingRequiredKey } from "../comms/setup.js";
21
21
  import { rosterOf } from "./parse/actors.js";
22
- export const LAB_SUMMARY_SCHEMA = "humanish.lab-summary.v1";
22
+ export const STUDY_SUMMARY_SCHEMA = "humanish.study-summary.v1";
23
23
  /**
24
24
  * The effort every participant will run at, or `"per-lane"` when they differ. A participant that declares nothing
25
- * inherits the actor's, and an actor that declares nothing gets the provider default — which is
25
+ * inherits the actor's, and an actor that declares nothing gets the provider default, which is
26
26
  * reported as the resolved value, exactly as `model` reports its default rather than hiding it.
27
27
  */
28
28
  function reasoningEffortOf(config) {
@@ -47,7 +47,7 @@ function subjectOf(config) {
47
47
  return `${subject.source} ${subject.appUrl}`;
48
48
  return subject.source;
49
49
  }
50
- /** How many participants, and who — collapsed when they are all the same persona. */
50
+ /** How many participants, and who; collapsed when they are all the same persona. */
51
51
  function participantsOf(config) {
52
52
  const actors = config.actors;
53
53
  const actor = actors?.[0];
@@ -61,7 +61,7 @@ function participantsOf(config) {
61
61
  const unique = [...new Set(personas)];
62
62
  if (unique.length === 0)
63
63
  return `${count} participant${count === 1 ? "" : "s"}`;
64
- // Several participants of ONE persona reads as "3 × skeptical-power-user"; genuinely different people
64
+ // Several participants of one persona reads as "3 × skeptical-power-user"; genuinely different people
65
65
  // are named, because which personas are in a study is the study's design.
66
66
  return unique.length === 1 ? `${count} × ${unique[0]}` : unique.join(" · ");
67
67
  }
@@ -76,7 +76,7 @@ function capsOf(config) {
76
76
  };
77
77
  }
78
78
  /**
79
- * Describe one lab. Returns null when the manifest cannot be resolved — the caller already knows
79
+ * Describe one lab. Returns null when the manifest cannot be resolved: the caller already knows
80
80
  * the lab exists from the listing, so this failing means the file changed underneath them.
81
81
  */
82
82
  export async function readLabSummary(cwd, lab, options = {}) {
@@ -154,13 +154,13 @@ export async function readLabSummary(cwd, lab, options = {}) {
154
154
  },
155
155
  }
156
156
  : {}),
157
- schema: LAB_SUMMARY_SCHEMA,
157
+ schema: STUDY_SUMMARY_SCHEMA,
158
158
  ...(inspected.config.comms?.email?.kind === "real"
159
159
  ? {
160
160
  communications: `Real email · ${inspected.config.comms.email.connection} · fresh inbox per participant · hosted processing · local review only`,
161
161
  }
162
162
  : {}),
163
- labId: String(config.id ?? lab),
163
+ studyId: String(config.id ?? lab),
164
164
  ...(typeof config.title === "string" ? { title: config.title } : {}),
165
165
  ...(typeof config.description === "string" ? { description: config.description.trim() } : {}),
166
166
  ...(subject === undefined ? {} : { subject }),
@@ -4,20 +4,20 @@ declare const TASK_FUNNEL_SCHEMA: "humanish.task-funnel.v1";
4
4
  * One task in a protocol. It has two halves that belong to two different people, and keeping them
5
5
  * apart is the point of the type.
6
6
  *
7
- * `goal` belongs to the PARTICIPANT. It is what they are asked to do, in their language, and it is
7
+ * `goal` belongs to the participant. It is what they are asked to do, in their language, and it is
8
8
  * the only half that reaches the prompt.
9
9
  *
10
- * `success` belongs to the RESEARCHER. It is how the task will be measured, and the participant
11
- * never sees it — a moderator does not read the success criterion aloud, because telling someone
10
+ * `success` belongs to the researcher. It is how the task will be measured, and the participant
11
+ * never sees it. A moderator does not read the success criterion aloud, because telling someone
12
12
  * how they will be judged changes what they do. A persona told "you succeed when the URL contains
13
13
  * /dashboard" will go find that URL, which measures the instruction rather than the product.
14
14
  */
15
15
  export interface LabTask {
16
16
  /** Stable id, used in evidence and in the funnel. Researcher-facing. */
17
17
  id: string;
18
- /** PARTICIPANT-FACING. What they are asked to do. The only half that reaches the prompt. */
18
+ /** Participant-facing. What they are asked to do. The only half that reaches the prompt. */
19
19
  goal: string;
20
- /** RESEARCHER-FACING. Observation-shaped proof the task happened. Never rendered to the
20
+ /** Researcher-facing. Observation-shaped proof the task happened. Never rendered to the
21
21
  * participant. Absent means the task is narrative-only: it is asked for but cannot be measured,
22
22
  * and the funnel says so rather than quietly counting it as failed. */
23
23
  success?: StopWhen;
@@ -38,12 +38,12 @@ export interface TaskFunnel {
38
38
  total: number;
39
39
  /** Tasks observed complete. */
40
40
  completed: number;
41
- /** Declared tasks with no `done` criterion — shown to the participant, never observable. */
41
+ /** Declared tasks with no `done` criterion: shown to the participant, never observable. */
42
42
  unobservable: number;
43
- /** The first task that was NOT observed complete: where this participant stopped. */
43
+ /** The first task that was not observed complete: where this participant stopped. */
44
44
  stoppedAt?: string;
45
45
  /** Per-task, in declaration order. `inputsObserved` is false when the task declares criteria
46
- * whose inputs (url, text, appState) NEVER arrived in any observation this session, so the
46
+ * whose inputs (url, text, appState) never arrived in any observation this session, so the
47
47
  * task was never actually measured. Absent when the task completed or is unobservable. */
48
48
  tasks: Array<{
49
49
  id: string;
@@ -53,20 +53,20 @@ export interface TaskFunnel {
53
53
  inputsObserved?: boolean;
54
54
  }>;
55
55
  /** Observable tasks that were never measured, because the inputs their criteria need never
56
- * arrived. Reported SEPARATELY from failures: a task nobody could observe is a gap in our
57
- * instrument, and reporting it as 0-completed blames the participant for it (#514). */
56
+ * arrived. Reported separately from failures: a task nobody could observe is a gap in our
57
+ * instrument, and reporting it as 0-completed blames the participant for it. */
58
58
  unmeasured: number;
59
59
  }
60
60
  /**
61
- * Tracks task completion across a session. Stateful on purpose: a task completes ONCE, on the first
62
- * observation that satisfies it, and stays complete even if the participant navigates away — you do
61
+ * Tracks task completion across a session. Stateful on purpose: a task completes once, on the first
62
+ * observation that satisfies it, and stays complete even if the participant navigates away; you do
63
63
  * not un-sign-up by going back to the home page.
64
64
  */
65
65
  export declare class TaskTracker {
66
66
  private readonly tasks;
67
67
  private readonly completions;
68
68
  /** Which observation fields were ever populated this session. A criterion whose field never
69
- * arrived was never evaluated against anything, however many turns ran (#514). */
69
+ * arrived was never evaluated against anything, however many turns ran. */
70
70
  private readonly fieldsSeen;
71
71
  constructor(tasks: readonly LabTask[]);
72
72
  /** Evaluate every still-incomplete task against one observation. Returns newly completed tasks. */
@@ -78,10 +78,10 @@ export declare class TaskTracker {
78
78
  funnel(): TaskFunnel;
79
79
  }
80
80
  /**
81
- * The task list as the PARTICIPANT reads it: numbered, in order, in their own language.
81
+ * The task list as the participant reads it: numbered, in order, in their own language.
82
82
  *
83
83
  * Reads `goal` and nothing else. The success criteria are the researcher's instrument and never
84
- * appear here — a participant who is told how they will be measured optimizes for the measurement,
84
+ * appear here: a participant who is told how they will be measured optimizes for the measurement,
85
85
  * and the study stops being about the product. A test pins this, because it is the kind of leak a
86
86
  * later convenience change makes without noticing.
87
87
  */
package/dist/lab/tasks.js CHANGED
@@ -1,32 +1,32 @@
1
1
  // Tasks: the researcher's protocol, expressed as config (docs/principles/three-roles.md).
2
2
  //
3
- // A lab could declare a prose `mission` and nothing else. That is a brief, not a protocol — and it
3
+ // A lab could declare a prose `mission` and nothing else. That is a brief, not a protocol, and it
4
4
  // left "where did people get stuck" answerable only from an actor's own narration, which is the one
5
5
  // source a study should not have to take on faith.
6
6
  //
7
- // Real usability studies are built from discrete TASKS, each with a written success criterion, and
7
+ // Real usability studies are built from discrete tasks, each with a written success criterion, and
8
8
  // the result is a funnel: how far each participant got before they stopped. That funnel is the
9
9
  // finding. A single pass/fail per participant throws it away.
10
10
  //
11
- // The criterion language is `stopWhen`, unchanged and already load-bearing elsewhere: a task is
11
+ // The criterion language is `stopWhen`, unchanged and already used by stop conditions: a task is
12
12
  // done when an observation satisfies it. Reusing it means a task criterion is exactly as expressive
13
13
  // as a stop condition, and an author who knows one knows the other.
14
14
  //
15
- // A task's completion is CORROBORATED, not self-reported. The actor saying "I signed up" does not
15
+ // A task's completion is corroborated, not self-reported. The actor saying "I signed up" does not
16
16
  // complete a task; the observed URL, page text, or app state does. That distinction is the whole
17
17
  // reason to declare tasks at all.
18
18
  import { evaluateStopWhen, } from "../actors/stop-conditions.js";
19
19
  const TASK_FUNNEL_SCHEMA = "humanish.task-funnel.v1";
20
20
  /**
21
- * Tracks task completion across a session. Stateful on purpose: a task completes ONCE, on the first
22
- * observation that satisfies it, and stays complete even if the participant navigates away — you do
21
+ * Tracks task completion across a session. Stateful on purpose: a task completes once, on the first
22
+ * observation that satisfies it, and stays complete even if the participant navigates away; you do
23
23
  * not un-sign-up by going back to the home page.
24
24
  */
25
25
  export class TaskTracker {
26
26
  tasks;
27
27
  completions = new Map();
28
28
  /** Which observation fields were ever populated this session. A criterion whose field never
29
- * arrived was never evaluated against anything, however many turns ran (#514). */
29
+ * arrived was never evaluated against anything, however many turns ran. */
30
30
  fieldsSeen = new Set();
31
31
  constructor(tasks) {
32
32
  this.tasks = tasks;
@@ -77,7 +77,7 @@ export class TaskTracker {
77
77
  const tasks = this.tasks.map((task) => {
78
78
  const completion = this.completions.get(task.id);
79
79
  const observable = task.success !== undefined;
80
- // A task counts as measured when at least ONE field its criteria read was populated by some
80
+ // A task counts as measured when at least one field its criteria read was populated by some
81
81
  // observation. `any` semantics: any satisfiable rule needed a field we actually saw.
82
82
  const required = observable ? this.fieldsRequiredBy(task) : [];
83
83
  const inputsObserved = required.length === 0 ? true : required.some((field) => this.fieldsSeen.has(field));
@@ -91,12 +91,12 @@ export class TaskTracker {
91
91
  ...(observable && completion === undefined ? { inputsObserved } : {}),
92
92
  };
93
93
  });
94
- // Where they stopped is the first task not observed complete — the thing a researcher reads
94
+ // Where they stopped is the first task not observed complete, the thing a researcher reads
95
95
  // first. An unobservable task cannot be "where they stopped", because nothing could have
96
96
  // proven otherwise; skipping it avoids blaming a participant for a gap in the protocol.
97
97
  // A task we never measured cannot be "where they stopped" either, for the same reason an
98
98
  // unobservable one cannot: nothing could have proven otherwise, so naming it blames the
99
- // participant for our gap (#514).
99
+ // participant for our gap.
100
100
  const stoppedAt = tasks.find((task) => task.observable && !task.completed && task.inputsObserved !== false)?.id;
101
101
  return {
102
102
  schema: TASK_FUNNEL_SCHEMA,
@@ -110,10 +110,10 @@ export class TaskTracker {
110
110
  }
111
111
  }
112
112
  /**
113
- * The task list as the PARTICIPANT reads it: numbered, in order, in their own language.
113
+ * The task list as the participant reads it: numbered, in order, in their own language.
114
114
  *
115
115
  * Reads `goal` and nothing else. The success criteria are the researcher's instrument and never
116
- * appear here — a participant who is told how they will be measured optimizes for the measurement,
116
+ * appear here: a participant who is told how they will be measured optimizes for the measurement,
117
117
  * and the study stops being about the product. A test pins this, because it is the kind of leak a
118
118
  * later convenience change makes without noticing.
119
119
  */
@@ -131,9 +131,9 @@ export function formatTaskFunnel(funnel) {
131
131
  const stopped = funnel.stoppedAt === undefined ? "" : `, stopped at "${funnel.stoppedAt}"`;
132
132
  const unobservable = funnel.unobservable === 0 ? "" : `, ${funnel.unobservable} with no completion criterion`;
133
133
  // Named separately from failures. "0/3 completed" alone reads as "no participant managed it",
134
- // which is the wrong story when the criterion was never evaluated against anything (#514).
134
+ // which is the wrong story when the criterion was never evaluated against anything.
135
135
  const unmeasured = funnel.unmeasured === 0
136
136
  ? ""
137
- : `, ${funnel.unmeasured} NEVER MEASURED (the observations their criteria read never arrived)`;
137
+ : `, ${funnel.unmeasured} never measured (the observations their criteria read never arrived)`;
138
138
  return `${base}${stopped}${unobservable}${unmeasured}`;
139
139
  }