humanish 0.107.0 → 0.108.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/ARCHITECTURE.md +22 -17
  2. package/CHANGELOG.md +14 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +145 -172
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-ui.js +1 -1
  14. package/dist/actors/codex/codex-admission.d.ts +91 -0
  15. package/dist/actors/codex/codex-admission.js +150 -0
  16. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  17. package/dist/actors/codex/restricted-executable.js +8 -8
  18. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  19. package/dist/actors/codex/restricted-launch.js +1 -1
  20. package/dist/actors/codex/restricted-participant.js +8 -6
  21. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  22. package/dist/actors/codex/restricted-policy.js +2 -2
  23. package/dist/actors/codex/restricted-session.d.ts +2 -2
  24. package/dist/actors/codex/restricted-session.js +10 -5
  25. package/dist/actors/computer-use/actor.d.ts +16 -16
  26. package/dist/actors/computer-use/actor.js +2 -2
  27. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  28. package/dist/actors/computer-use/admission-limit.js +1 -1
  29. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  30. package/dist/actors/computer-use/loop/actions.js +10 -10
  31. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  32. package/dist/actors/computer-use/loop/backstop.js +14 -12
  33. package/dist/actors/computer-use/loop/ending.d.ts +5 -5
  34. package/dist/actors/computer-use/loop/ending.js +7 -7
  35. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  36. package/dist/actors/computer-use/loop/observation.js +9 -9
  37. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  38. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  39. package/dist/actors/computer-use/loop/session.js +3 -3
  40. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  41. package/dist/actors/computer-use/loop/spend.js +1 -1
  42. package/dist/actors/computer-use/loop/trace.js +9 -8
  43. package/dist/actors/computer-use/loop/types.d.ts +25 -23
  44. package/dist/actors/computer-use/loop/usage.js +2 -2
  45. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  46. package/dist/actors/computer-use/openai-context.js +214 -0
  47. package/dist/actors/computer-use/openai-provider.d.ts +11 -8
  48. package/dist/actors/computer-use/openai-provider.js +45 -34
  49. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  50. package/dist/actors/computer-use/openai-requests.js +82 -15
  51. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  52. package/dist/actors/computer-use/openai-wire.js +36 -34
  53. package/dist/actors/contract.d.ts +78 -43
  54. package/dist/actors/contract.js +29 -23
  55. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  56. package/dist/actors/local-agent/claude-session.js +10 -9
  57. package/dist/actors/local-agent/cli.d.ts +8 -6
  58. package/dist/actors/local-agent/cli.js +24 -28
  59. package/dist/actors/local-agent/readiness.d.ts +2 -2
  60. package/dist/actors/local-agent/readiness.js +4 -4
  61. package/dist/actors/reasoning-effort.js +6 -6
  62. package/dist/actors/registry.d.ts +10 -10
  63. package/dist/actors/registry.js +18 -17
  64. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  65. package/dist/actors/scripted-browser/actor.js +16 -16
  66. package/dist/actors/scripted-browser/browser-command.js +1 -1
  67. package/dist/actors/scripted-browser/steps.js +1 -1
  68. package/dist/actors/scripted-browser/types.d.ts +1 -1
  69. package/dist/actors/stop-conditions.d.ts +1 -1
  70. package/dist/analysis/codex-config.d.ts +6 -2
  71. package/dist/analysis/codex-config.js +22 -14
  72. package/dist/analysis/service.js +5 -5
  73. package/dist/cli/commands/analyze.js +19 -16
  74. package/dist/cli/commands/codex.js +9 -9
  75. package/dist/cli/commands/comms.js +54 -33
  76. package/dist/cli/commands/feedback.js +20 -21
  77. package/dist/cli/commands/lab-format.d.ts +5 -4
  78. package/dist/cli/commands/lab-format.js +35 -23
  79. package/dist/cli/commands/lab-route-computer-use.js +6 -7
  80. package/dist/cli/commands/lab-route-preview.js +4 -3
  81. package/dist/cli/commands/lab-route-shared-world.js +3 -3
  82. package/dist/cli/commands/lab-run.js +10 -11
  83. package/dist/cli/commands/lab-scorer.d.ts +2 -2
  84. package/dist/cli/commands/lab-scorer.js +1 -1
  85. package/dist/cli/commands/migrate.d.ts +4 -0
  86. package/dist/cli/commands/migrate.js +65 -0
  87. package/dist/cli/commands/observe.js +147 -108
  88. package/dist/cli/commands/run-command.d.ts +10 -0
  89. package/dist/cli/commands/run-command.js +85 -0
  90. package/dist/cli/commands/runs.js +137 -138
  91. package/dist/cli/commands/setup.d.ts +2 -2
  92. package/dist/cli/commands/setup.js +26 -21
  93. package/dist/cli/commands/study.d.ts +3 -0
  94. package/dist/cli/commands/study.js +182 -0
  95. package/dist/cli/commands/tui.d.ts +4 -4
  96. package/dist/cli/commands/tui.js +21 -21
  97. package/dist/cli/commands/watch.js +60 -75
  98. package/dist/cli/deprecations.d.ts +18 -0
  99. package/dist/cli/deprecations.js +48 -0
  100. package/dist/cli/doctor.d.ts +15 -5
  101. package/dist/cli/doctor.js +103 -48
  102. package/dist/cli/first-run-path.d.ts +12 -10
  103. package/dist/cli/first-run-path.js +30 -28
  104. package/dist/cli/io.d.ts +41 -6
  105. package/dist/cli/io.js +97 -22
  106. package/dist/cli/observer-follow.d.ts +2 -2
  107. package/dist/cli/observer-follow.js +5 -6
  108. package/dist/cli/orientation.d.ts +6 -3
  109. package/dist/cli/orientation.js +43 -39
  110. package/dist/cli/product-sentence.d.ts +6 -0
  111. package/dist/cli/product-sentence.js +6 -0
  112. package/dist/cli/program.d.ts +6 -1
  113. package/dist/cli/program.js +109 -40
  114. package/dist/cli/telemetry.d.ts +15 -15
  115. package/dist/cli/telemetry.js +48 -40
  116. package/dist/cli.js +1 -1
  117. package/dist/comms/capture-surface.d.ts +13 -12
  118. package/dist/comms/capture-surface.js +23 -22
  119. package/dist/comms/catch-host.d.ts +7 -7
  120. package/dist/comms/catch-host.js +14 -14
  121. package/dist/comms/email-catch.d.ts +3 -3
  122. package/dist/comms/email-catch.js +8 -8
  123. package/dist/comms/external-evidence.js +2 -2
  124. package/dist/comms/extract.js +2 -2
  125. package/dist/comms/fake-inbox.d.ts +2 -2
  126. package/dist/comms/fake-inbox.js +2 -2
  127. package/dist/comms/receiving-render.d.ts +1 -1
  128. package/dist/comms/receiving-render.js +2 -2
  129. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  130. package/dist/comms/sandbox-catch-script.js +6 -6
  131. package/dist/comms/sandbox-catch.d.ts +36 -37
  132. package/dist/comms/sandbox-catch.js +34 -35
  133. package/dist/comms/setup.js +42 -8
  134. package/dist/comms/thread-evidence.d.ts +1 -1
  135. package/dist/comms/thread-evidence.js +6 -6
  136. package/dist/comms/types.d.ts +6 -6
  137. package/dist/comms/types.js +3 -3
  138. package/dist/evidence/frame-signature.d.ts +1 -1
  139. package/dist/evidence/frame-signature.js +4 -4
  140. package/dist/evidence/redaction.d.ts +3 -3
  141. package/dist/evidence/redaction.js +4 -4
  142. package/dist/feedback/draft.js +36 -78
  143. package/dist/feedback/export-bundle.js +1 -1
  144. package/dist/feedback/export.d.ts +5 -1
  145. package/dist/feedback/export.js +7 -8
  146. package/dist/feedback/feedback.d.ts +2 -2
  147. package/dist/feedback/feedback.js +21 -3
  148. package/dist/guest/chromium-text.js +2 -2
  149. package/dist/guest/desktop-native.d.ts +1 -1
  150. package/dist/guest/runtime.js +1 -1
  151. package/dist/index.d.ts +12 -10
  152. package/dist/index.js +8 -6
  153. package/dist/keys/key-resolution.d.ts +5 -5
  154. package/dist/keys/key-resolution.js +23 -23
  155. package/dist/lab/adapter-extension.d.ts +7 -7
  156. package/dist/lab/adapter-extension.js +13 -36
  157. package/dist/lab/adapter-scorer-loader.d.ts +7 -7
  158. package/dist/lab/adapter-scorer-loader.js +32 -32
  159. package/dist/lab/composition-rules.js +42 -42
  160. package/dist/lab/config.js +65 -25
  161. package/dist/lab/deprecated-fields.d.ts +10 -0
  162. package/dist/lab/deprecated-fields.js +24 -0
  163. package/dist/lab/device-presets.d.ts +8 -8
  164. package/dist/lab/device-presets.js +11 -11
  165. package/dist/lab/discover.d.ts +13 -9
  166. package/dist/lab/discover.js +117 -57
  167. package/dist/lab/doctor.d.ts +10 -3
  168. package/dist/lab/doctor.js +47 -9
  169. package/dist/lab/init-templates.js +147 -147
  170. package/dist/lab/init.d.ts +1 -1
  171. package/dist/lab/init.js +41 -9
  172. package/dist/lab/keys.d.ts +2 -0
  173. package/dist/lab/keys.js +42 -8
  174. package/dist/lab/lab-deps.d.ts +7 -12
  175. package/dist/lab/parse/actors.js +9 -9
  176. package/dist/lab/parse/comms.js +5 -5
  177. package/dist/lab/parse/execution.js +13 -13
  178. package/dist/lab/parse/study-v3.d.ts +23 -0
  179. package/dist/lab/parse/study-v3.js +259 -0
  180. package/dist/lab/parse/subject-state.d.ts +7 -7
  181. package/dist/lab/parse/subject-state.js +16 -16
  182. package/dist/lab/parse/subject.js +28 -28
  183. package/dist/lab/parse/values.d.ts +1 -1
  184. package/dist/lab/parse/values.js +3 -3
  185. package/dist/lab/persona-resolve.d.ts +4 -4
  186. package/dist/lab/persona-resolve.js +4 -4
  187. package/dist/lab/plan-participants.d.ts +2 -2
  188. package/dist/lab/plan-types.d.ts +4 -4
  189. package/dist/lab/plan.d.ts +1 -7
  190. package/dist/lab/plan.js +10 -41
  191. package/dist/lab/preflight-probes.js +11 -11
  192. package/dist/lab/preflight-result.d.ts +2 -1
  193. package/dist/lab/preflight-result.js +5 -4
  194. package/dist/lab/preflight.d.ts +7 -5
  195. package/dist/lab/preflight.js +5 -5
  196. package/dist/lab/routing.d.ts +31 -25
  197. package/dist/lab/routing.js +60 -29
  198. package/dist/lab/run-lab-events.d.ts +0 -3
  199. package/dist/lab/run-lab-events.js +0 -6
  200. package/dist/lab/run-lab-homes.d.ts +22 -10
  201. package/dist/lab/run-lab-homes.js +5 -1
  202. package/dist/lab/run-lab-options.d.ts +1 -1
  203. package/dist/lab/run-lab-options.js +16 -13
  204. package/dist/lab/summary.d.ts +7 -6
  205. package/dist/lab/summary.js +10 -10
  206. package/dist/lab/tasks.d.ts +15 -15
  207. package/dist/lab/tasks.js +14 -14
  208. package/dist/lab/types.d.ts +101 -95
  209. package/dist/lab/types.js +2 -0
  210. package/dist/lab/validation.d.ts +13 -13
  211. package/dist/lab/validation.js +44 -42
  212. package/dist/lab/warnings.d.ts +10 -0
  213. package/dist/lab/warnings.js +61 -33
  214. package/dist/library-aliases.d.ts +56 -0
  215. package/dist/library-aliases.js +22 -0
  216. package/dist/observer/artifact.d.ts +1 -1
  217. package/dist/observer/artifact.js +6 -6
  218. package/dist/observer/data.d.ts +6 -6
  219. package/dist/observer/data.js +5 -4
  220. package/dist/observer/exposure.d.ts +1 -1
  221. package/dist/observer/exposure.js +11 -11
  222. package/dist/observer/http.js +1 -1
  223. package/dist/observer/library.d.ts +1 -1
  224. package/dist/observer/library.js +4 -2
  225. package/dist/observer/listen.js +5 -4
  226. package/dist/observer/render.d.ts +1 -1
  227. package/dist/observer/render.js +10 -5
  228. package/dist/observer/run-routes.d.ts +3 -3
  229. package/dist/observer/run-routes.js +1 -1
  230. package/dist/observer/serve.js +7 -3
  231. package/dist/observer/tunnel.js +1 -1
  232. package/dist/observer-app.html +4 -4
  233. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  234. package/dist/routes/computer-use/bundle-parts.js +15 -15
  235. package/dist/routes/computer-use/bundle.js +3 -3
  236. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
  238. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  239. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
  240. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  241. package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
  242. package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
  243. package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
  244. package/dist/routes/computer-use/external-comms.d.ts +1 -1
  245. package/dist/routes/computer-use/external-comms.js +1 -1
  246. package/dist/routes/computer-use/fanout-bundle.js +18 -18
  247. package/dist/routes/computer-use/fanout-records.js +10 -11
  248. package/dist/routes/computer-use/live-flush.d.ts +1 -1
  249. package/dist/routes/computer-use/live-flush.js +6 -6
  250. package/dist/routes/computer-use/live-phase.d.ts +4 -2
  251. package/dist/routes/computer-use/live-phase.js +6 -6
  252. package/dist/routes/computer-use/local-vm.js +1 -1
  253. package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
  254. package/dist/routes/computer-use/participant-desktop.js +4 -4
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +9 -9
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +31 -13
  259. package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
  260. package/dist/routes/computer-use/participant-prompt.js +6 -6
  261. package/dist/routes/computer-use/participant-runs.d.ts +7 -7
  262. package/dist/routes/computer-use/participant-runs.js +13 -13
  263. package/dist/routes/computer-use/plan.js +22 -22
  264. package/dist/routes/computer-use/preflight.js +21 -21
  265. package/dist/routes/computer-use/rerun-selection.js +1 -1
  266. package/dist/routes/computer-use/result.js +11 -11
  267. package/dist/routes/computer-use/route.d.ts +2 -1
  268. package/dist/routes/computer-use/route.js +15 -14
  269. package/dist/routes/computer-use/self-report.d.ts +7 -7
  270. package/dist/routes/computer-use/self-report.js +31 -31
  271. package/dist/routes/computer-use/setup.d.ts +1 -1
  272. package/dist/routes/computer-use/setup.js +17 -18
  273. package/dist/routes/computer-use/single-bundle.d.ts +7 -7
  274. package/dist/routes/computer-use/single-bundle.js +28 -30
  275. package/dist/routes/computer-use/subject-projection.d.ts +1 -1
  276. package/dist/routes/computer-use/subject-projection.js +6 -6
  277. package/dist/routes/computer-use/types.d.ts +40 -42
  278. package/dist/routes/computer-use/types.js +10 -10
  279. package/dist/routes/preview.d.ts +8 -2
  280. package/dist/routes/preview.js +8 -4
  281. package/dist/routes/scripted/bundle.d.ts +2 -2
  282. package/dist/routes/scripted/bundle.js +13 -12
  283. package/dist/routes/scripted/plan.d.ts +1 -1
  284. package/dist/routes/scripted/plan.js +9 -9
  285. package/dist/routes/scripted/result.js +5 -5
  286. package/dist/routes/scripted/route.js +5 -6
  287. package/dist/routes/scripted/scenario.js +2 -2
  288. package/dist/routes/scripted/setup.js +7 -7
  289. package/dist/routes/scripted/subject.js +1 -1
  290. package/dist/routes/scripted/surface-records.js +3 -3
  291. package/dist/routes/scripted/types.d.ts +3 -5
  292. package/dist/routes/scripted/types.js +1 -1
  293. package/dist/routes/shared-world/bundle-records.js +9 -8
  294. package/dist/routes/shared-world/bundle.d.ts +5 -5
  295. package/dist/routes/shared-world/bundle.js +40 -38
  296. package/dist/routes/shared-world/checkpoints.d.ts +1 -1
  297. package/dist/routes/shared-world/checkpoints.js +1 -1
  298. package/dist/routes/shared-world/comms.d.ts +5 -5
  299. package/dist/routes/shared-world/comms.js +14 -14
  300. package/dist/routes/shared-world/external-public.d.ts +4 -3
  301. package/dist/routes/shared-world/external-public.js +16 -12
  302. package/dist/routes/shared-world/handoff.d.ts +7 -6
  303. package/dist/routes/shared-world/handoff.js +65 -57
  304. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  305. package/dist/routes/shared-world/lobby-code.js +9 -9
  306. package/dist/routes/shared-world/participant-specs.d.ts +7 -6
  307. package/dist/routes/shared-world/participant-specs.js +31 -24
  308. package/dist/routes/shared-world/plan.js +7 -7
  309. package/dist/routes/shared-world/provenance.d.ts +2 -2
  310. package/dist/routes/shared-world/provenance.js +2 -2
  311. package/dist/routes/shared-world/provisioned.js +14 -13
  312. package/dist/routes/shared-world/result.js +20 -21
  313. package/dist/routes/shared-world/route.js +23 -22
  314. package/dist/routes/shared-world/setup.d.ts +3 -3
  315. package/dist/routes/shared-world/setup.js +4 -4
  316. package/dist/routes/shared-world/types.d.ts +30 -28
  317. package/dist/routes/shared-world/types.js +4 -4
  318. package/dist/routes/terminal/adapter.d.ts +3 -3
  319. package/dist/routes/terminal/adapter.js +5 -5
  320. package/dist/routes/terminal/bundle.d.ts +3 -3
  321. package/dist/routes/terminal/bundle.js +22 -21
  322. package/dist/routes/terminal/credentials.d.ts +4 -4
  323. package/dist/routes/terminal/credentials.js +7 -7
  324. package/dist/routes/terminal/dry-run.js +4 -4
  325. package/dist/routes/terminal/encoding.js +2 -2
  326. package/dist/routes/terminal/ledger.d.ts +3 -3
  327. package/dist/routes/terminal/ledger.js +14 -14
  328. package/dist/routes/terminal/live-finish.js +3 -3
  329. package/dist/routes/terminal/live-sandbox.js +12 -13
  330. package/dist/routes/terminal/persona.js +1 -1
  331. package/dist/routes/terminal/plan.js +11 -11
  332. package/dist/routes/terminal/recorder.js +2 -2
  333. package/dist/routes/terminal/result.js +8 -8
  334. package/dist/routes/terminal/route.js +6 -7
  335. package/dist/routes/terminal/sandbox.d.ts +1 -1
  336. package/dist/routes/terminal/sandbox.js +1 -1
  337. package/dist/routes/terminal/session.js +8 -7
  338. package/dist/routes/terminal/token-usage.d.ts +1 -1
  339. package/dist/routes/terminal/token-usage.js +7 -8
  340. package/dist/routes/terminal/trace.d.ts +2 -2
  341. package/dist/routes/terminal/trace.js +2 -2
  342. package/dist/routes/terminal/types.d.ts +26 -28
  343. package/dist/routes/terminal/types.js +3 -3
  344. package/dist/run/bundle-shape.js +3 -3
  345. package/dist/run/bundle.d.ts +46 -46
  346. package/dist/run/bundle.js +2 -1
  347. package/dist/run/cost-summary.js +3 -3
  348. package/dist/run/costs.js +7 -1
  349. package/dist/run/detail.d.ts +6 -6
  350. package/dist/run/detail.js +4 -4
  351. package/dist/run/dry-run-inputs.js +1 -1
  352. package/dist/run/dry-run.js +18 -18
  353. package/dist/run/judge.d.ts +19 -13
  354. package/dist/run/judge.js +18 -8
  355. package/dist/run/paths.d.ts +1 -1
  356. package/dist/run/paths.js +1 -1
  357. package/dist/run/pricing.d.ts +11 -6
  358. package/dist/run/pricing.js +20 -13
  359. package/dist/run/projection.d.ts +14 -14
  360. package/dist/run/projection.js +15 -15
  361. package/dist/run/reclaim.js +2 -2
  362. package/dist/run/results.d.ts +5 -5
  363. package/dist/run/run-index.d.ts +8 -6
  364. package/dist/run/run-index.js +15 -16
  365. package/dist/run/run-not-found.d.ts +5 -0
  366. package/dist/run/run-not-found.js +15 -0
  367. package/dist/run/run.d.ts +5 -4
  368. package/dist/run/run.js +1 -1
  369. package/dist/run/sandbox-receipts.d.ts +2 -2
  370. package/dist/run/sandbox-receipts.js +3 -3
  371. package/dist/run/shared-world-evidence.d.ts +36 -35
  372. package/dist/run/shared-world-evidence.js +4 -4
  373. package/dist/run/shared-world-shape.d.ts +1 -1
  374. package/dist/run/shared-world-shape.js +6 -6
  375. package/dist/run/stats.d.ts +12 -6
  376. package/dist/run/stats.js +116 -58
  377. package/dist/run/status.d.ts +8 -29
  378. package/dist/run/status.js +5 -27
  379. package/dist/run/stored-runs.js +2 -1
  380. package/dist/run/stream-shape.js +1 -1
  381. package/dist/run/streams.d.ts +6 -6
  382. package/dist/run/study-provenance.d.ts +47 -0
  383. package/dist/run/study-provenance.js +63 -0
  384. package/dist/run/study-result.d.ts +16 -0
  385. package/dist/run/study-result.js +9 -0
  386. package/dist/run/text.d.ts +2 -0
  387. package/dist/run/text.js +4 -0
  388. package/dist/run-lab.d.ts +7 -7
  389. package/dist/run-lab.js +1 -3
  390. package/dist/study/convert.d.ts +33 -0
  391. package/dist/study/convert.js +432 -0
  392. package/dist/study/field-paths.d.ts +12 -0
  393. package/dist/study/field-paths.js +126 -0
  394. package/dist/study/files.d.ts +26 -0
  395. package/dist/study/files.js +43 -0
  396. package/dist/study/migrate.d.ts +48 -0
  397. package/dist/study/migrate.js +408 -0
  398. package/dist/study/owned-files.d.ts +38 -0
  399. package/dist/study/owned-files.js +182 -0
  400. package/dist/subject/clone.d.ts +1 -1
  401. package/dist/subject/desktop-cli.d.ts +1 -1
  402. package/dist/subject/desktop-cli.js +2 -2
  403. package/dist/subject/local-tree-archive.js +1 -1
  404. package/dist/subject/local-tree.d.ts +1 -1
  405. package/dist/subject/node-bootstrap.js +1 -1
  406. package/dist/subject/runtime.js +8 -9
  407. package/dist/subject/serve.d.ts +1 -1
  408. package/dist/subject/serve.js +3 -3
  409. package/dist/subject/state.d.ts +1 -1
  410. package/dist/subject/steps.d.ts +5 -5
  411. package/dist/subject/steps.js +4 -4
  412. package/dist/substrates/command-failure.d.ts +3 -3
  413. package/dist/substrates/command-failure.js +3 -3
  414. package/dist/substrates/detached.d.ts +6 -6
  415. package/dist/substrates/detached.js +7 -7
  416. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  417. package/dist/substrates/e2b/cdp-probe.js +14 -17
  418. package/dist/substrates/e2b/desktop-browser.d.ts +2 -2
  419. package/dist/substrates/e2b/desktop-browser.js +8 -8
  420. package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
  421. package/dist/substrates/e2b/desktop-cdp.js +8 -8
  422. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  423. package/dist/substrates/e2b/desktop-executor.js +1 -1
  424. package/dist/substrates/e2b/desktop-geometry.d.ts +3 -3
  425. package/dist/substrates/e2b/desktop-geometry.js +7 -7
  426. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  427. package/dist/substrates/e2b/desktop-media.js +1 -1
  428. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  429. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  430. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  431. package/dist/substrates/e2b/sandbox.js +1 -1
  432. package/dist/substrates/e2b/sdk.d.ts +11 -11
  433. package/dist/substrates/e2b/sdk.js +6 -6
  434. package/dist/tui/actions.d.ts +1 -1
  435. package/dist/tui/actions.js +13 -13
  436. package/dist/tui/contract.d.ts +16 -16
  437. package/dist/tui/contract.js +10 -10
  438. package/dist/tui/launch.d.ts +4 -4
  439. package/dist/tui/launch.js +18 -19
  440. package/dist/tui/project.js +5 -5
  441. package/dist/tui-app.js +82 -82
  442. package/dist/verify/actor.d.ts +8 -8
  443. package/dist/verify/actor.js +36 -36
  444. package/dist/verify/artifacts.d.ts +2 -2
  445. package/dist/verify/artifacts.js +3 -3
  446. package/dist/verify/context-growth.d.ts +9 -0
  447. package/dist/verify/context-growth.js +62 -0
  448. package/dist/verify/costs.d.ts +6 -6
  449. package/dist/verify/costs.js +8 -8
  450. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  451. package/dist/verify/shared-world-concurrent.js +79 -76
  452. package/dist/verify/shared-world.d.ts +2 -2
  453. package/dist/verify/shared-world.js +16 -16
  454. package/dist/verify/subject.d.ts +4 -4
  455. package/dist/verify/subject.js +18 -18
  456. package/dist/verify/verify.js +92 -43
  457. package/docs/README.md +25 -32
  458. package/docs/architecture/actor-contract.md +56 -87
  459. package/docs/architecture/desktop-sessions.md +7 -7
  460. package/docs/architecture/external-public-shared-world.md +61 -59
  461. package/docs/architecture/github-feedback-loop.md +1 -4
  462. package/docs/architecture/guest-desktop.md +2 -2
  463. package/docs/architecture/observer.md +34 -34
  464. package/docs/architecture/restricted-codex-analysis.md +34 -28
  465. package/docs/architecture/serve.md +34 -37
  466. package/docs/architecture/state-driven-executor.md +55 -58
  467. package/docs/architecture/task-protocol-support.md +5 -5
  468. package/docs/architecture/terminal-product-route.md +67 -107
  469. package/docs/contracts/README.md +24 -0
  470. package/docs/contracts/adapter-admission.md +3 -3
  471. package/docs/contracts/adapter-fixtures.md +2 -5
  472. package/docs/contracts/core.md +1 -3
  473. package/docs/contracts/errors.md +62 -0
  474. package/docs/contracts/feedback.md +8 -9
  475. package/docs/contracts/policy.md +7 -12
  476. package/docs/contracts/run-bundle.md +45 -44
  477. package/docs/contracts/schemas.md +421 -362
  478. package/docs/contracts/study-analysis.md +3 -3
  479. package/docs/contracts/study-costs.md +11 -7
  480. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  481. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  482. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  483. package/docs/principles/actor-fidelity.md +4 -4
  484. package/docs/principles/engineering.md +3 -3
  485. package/docs/principles/invariants-and-defaults.md +38 -38
  486. package/docs/principles/self-driving-harness.md +1 -5
  487. package/docs/principles/three-roles.md +1 -1
  488. package/docs/product/automatic-analysis.md +7 -7
  489. package/examples/participant/README.md +5 -5
  490. package/examples/participant/run.mjs +11 -10
  491. package/examples/scorer/README.md +3 -3
  492. package/examples/scorer/run.mjs +11 -12
  493. package/package.json +16 -17
  494. package/skills/humanish/SKILL.md +60 -58
  495. package/skills/humanish/agents/openai.yaml +1 -1
  496. package/AGENTS.md +0 -99
  497. package/CONTRIBUTING.md +0 -148
  498. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  499. package/dist/actors/codex/qualified-versions.js +0 -132
  500. package/dist/cli/commands/lab.d.ts +0 -3
  501. package/dist/cli/commands/lab.js +0 -199
  502. package/dist/cli/renamed-options.d.ts +0 -11
  503. package/dist/cli/renamed-options.js +0 -18
  504. package/dist/observer/static.d.ts +0 -39
  505. package/dist/observer/static.js +0 -369
  506. package/docs/architecture/comms-inbox.md +0 -122
  507. package/docs/architecture/desktop-recording.md +0 -80
  508. package/docs/architecture/local-browser-runtime.md +0 -178
  509. package/docs/architecture/observer-review.md +0 -144
  510. package/docs/architecture/participant-media.md +0 -90
  511. package/docs/architecture/project-layout.md +0 -62
  512. package/docs/architecture/real-email-receiving.md +0 -136
  513. package/docs/assets/humanish-drawdb-hero.png +0 -0
  514. package/docs/assets/humanish-observer-hero.png +0 -0
  515. package/docs/goals/current.md +0 -207
  516. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  517. package/docs/product/open-source-install-experience.md +0 -240
  518. package/docs/ramp/README.md +0 -295
  519. package/docs/release/open-source-readiness.md +0 -222
  520. package/docs/release/public-readiness-standard.md +0 -210
  521. package/docs/roadmap/world-class-open-source-v0.md +0 -311
@@ -1,21 +1,22 @@
1
- // The run index (#455 PR 2): list and classify every run in a project without parsing bundles.
1
+ // The run index: list and classify every run in a project without parsing bundles.
2
2
  //
3
- // The existing `listRuns` walks each run tree — screenshots included — validating symlinks and
3
+ // The existing `listRuns` walks each run tree, screenshots included, validating symlinks and
4
4
  // then parses each `run.json`: measured 197ms cold / 152ms warm at 25 runs. That is fine for a
5
5
  // command that prints once and exits, and much too hot for a surface that refreshes on a cadence
6
6
  // over SSH. This module reads the small `status.json` record each run now writes (586 bytes beside
7
7
  // a 92KB bundle) and caches per-run entries keyed on the stat of the file each was derived from.
8
8
  //
9
- // Honesty rules, unchanged from the record itself:
9
+ // Rules, unchanged from the record itself:
10
10
  // - `run.json` is the evidence-of-record. Every field here is a projection for listing and
11
11
  // classification; nothing here is a claim about what a participant did.
12
12
  // - A run with no status record is not assumed finished. It is classified from what is on disk:
13
- // a bundle means finished, receipts without a bundle mean interrupted. That is the honest
14
- // reading of a run whose process died — and, before this contract existed, of every run.
13
+ // a bundle means finished, receipts without a bundle mean interrupted. That is the
14
+ // reading of a run whose process died (and, before this contract existed, of every run).
15
15
  // - One unreadable run directory degrades that run, never the listing.
16
16
  import { readdir, readFile, stat } from "node:fs/promises";
17
17
  import path from "node:path";
18
- import { RUN_STATUS_FILE, classifyRunStatus, inferLegacyLabId, isRunStatusRecord, } from "./status.js";
18
+ import { RUN_STATUS_FILE, classifyRunStatus, isRunStatusRecord, } from "./status.js";
19
+ import { studyProvenanceOf } from "./study-provenance.js";
19
20
  import { RUN_BUNDLE_FILE } from "./bundle.js";
20
21
  const RUN_INDEX_SCHEMA = "humanish.run-index.v1";
21
22
  /**
@@ -78,7 +79,7 @@ function entryFromStatus(record, nowMs) {
78
79
  liveness: classifyRunStatus(record, nowMs),
79
80
  mode: record.mode,
80
81
  ...(typeof record.pid === "number" ? { pid: record.pid } : {}),
81
- ...(record.lab === undefined ? {} : { lab: record.lab }),
82
+ ...studyEntry(studyProvenanceOf(record)),
82
83
  startedAt: record.startedAt,
83
84
  updatedAt: record.updatedAt,
84
85
  ...(record.completedAt === undefined ? {} : { completedAt: record.completedAt }),
@@ -98,9 +99,9 @@ function usableStatusRecord(raw, runId) {
98
99
  }
99
100
  /**
100
101
  * The bundle-only reading, for a run with no usable status record. A bundle on disk usually means
101
- * the run reached its final write. But a live run now flushes an IN-PROGRESS bundle as it goes (so
102
+ * the run reached its final write. But a live run now flushes an in-progress bundle as it goes (so
102
103
  * anything asking what a participant is doing has something to read), and that bundle marks its
103
- * simulations `running`. With no status record there is no freshness to judge, and the honest
104
+ * simulations `running`. With no status record there is no freshness to judge, and the
104
105
  * reading of "it started, and nothing here says it finished" is interrupted, not finished.
105
106
  */
106
107
  function bundleLiveness(bundle) {
@@ -117,18 +118,16 @@ export function runLiveness(runId, status, bundle, nowMs) {
117
118
  ? { liveness: classifyRunStatus(status, nowMs), record: status }
118
119
  : { liveness: bundleLiveness(bundle) };
119
120
  }
121
+ function studyEntry(study) {
122
+ return study === undefined ? {} : { study };
123
+ }
120
124
  function entryFromBundle(runId, bundle) {
121
- const legacyLabId = bundle.lab === undefined ? inferLegacyLabId(bundle) : undefined;
122
125
  return {
123
126
  runId,
124
127
  derivedFrom: "bundle",
125
128
  liveness: bundleLiveness(bundle),
126
129
  ...(bundle.mode === "dry-run" || bundle.mode === "live" ? { mode: bundle.mode } : {}),
127
- ...(bundle.lab !== undefined
128
- ? { lab: bundle.lab }
129
- : legacyLabId === undefined
130
- ? {}
131
- : { lab: { id: legacyLabId } }),
130
+ ...studyEntry(studyProvenanceOf(bundle)),
132
131
  ...(bundle.createdAt === undefined ? {} : { startedAt: bundle.createdAt }),
133
132
  ...(bundle.review?.verdict === undefined ? {} : { verdict: bundle.review.verdict }),
134
133
  ...(bundle.review?.participants === undefined
@@ -210,7 +209,7 @@ export async function readRunIndex(cwdInput, options = {}) {
210
209
  continue;
211
210
  }
212
211
  // Neither record nor bundle: receipts without an outcome. That is precisely an interrupted
213
- // run — the shape a dropped connection leaves — and saying so is more useful than hiding it.
212
+ // run (the shape a dropped connection leaves), and saying so is more useful than hiding it.
214
213
  runs.push({ runId, derivedFrom: "directory", liveness: "interrupted" });
215
214
  }
216
215
  cache?.retain(runIds);
@@ -0,0 +1,5 @@
1
+ /**
2
+ * The message for a run that is not there: how to start one when the project has no runs, or how
3
+ * to list them when it has. Only the runs directory's entry names are read.
4
+ */
5
+ export declare function runNotFoundMessage(cwdInput: string, runInput: string): Promise<string>;
@@ -0,0 +1,15 @@
1
+ import { readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { resolveRunsRoot } from "./paths.js";
4
+ /**
5
+ * The message for a run that is not there: how to start one when the project has no runs, or how
6
+ * to list them when it has. Only the runs directory's entry names are read.
7
+ */
8
+ export async function runNotFoundMessage(cwdInput, runInput) {
9
+ const cwd = path.resolve(cwdInput);
10
+ const entries = await readdir(resolveRunsRoot(cwd)).catch(() => []);
11
+ const hasRun = entries.some((name) => !name.startsWith(".") && !name.endsWith(".json"));
12
+ return hasRun
13
+ ? `No run ${runInput}; humanish runs lists them.`
14
+ : `No runs in ${cwd} yet; start one with humanish run first-run.`;
15
+ }
package/dist/run/run.d.ts CHANGED
@@ -2,7 +2,8 @@ import { renderObserver, type ObserverResult } from "../observer/render.js";
2
2
  import { type RunBundle } from "./bundle.js";
3
3
  import type { ExecutionOutcome } from "./judge.js";
4
4
  import { type PreparedRunArtifactPaths, type RunIdInUse } from "./paths.js";
5
- import { type RunLabProvenance, type RunStatusHandle } from "./status.js";
5
+ import { type RunStatusHandle } from "./status.js";
6
+ import type { RunStudyProvenance } from "./study-provenance.js";
6
7
  interface StartRunOptions {
7
8
  /** Project directory, in the form the route resolved it. */
8
9
  cwd: string;
@@ -10,7 +11,7 @@ interface StartRunOptions {
10
11
  runId?: string | undefined;
11
12
  mintRunId: () => string;
12
13
  mode: "dry-run" | "live";
13
- lab?: RunLabProvenance | undefined;
14
+ lab?: RunStudyProvenance | undefined;
14
15
  /** review.md for the published bundle. */
15
16
  renderReview: (bundle: RunBundle) => string;
16
17
  /** Used by `FinishedRun.renderObserver`; `render` is the `LabDeps.renderObserver` seam. */
@@ -25,8 +26,8 @@ interface Run {
25
26
  readonly runId: string;
26
27
  readonly createdAt: string;
27
28
  readonly mode: "dry-run" | "live";
28
- /** The manifest the run came from (#455); bundleHead copies it into the bundle. */
29
- readonly lab?: RunLabProvenance;
29
+ /** The manifest the run came from; bundleHead copies it into the bundle. */
30
+ readonly lab?: RunStudyProvenance;
30
31
  /** Routes write their evidence files through these and hand them to participants. */
31
32
  readonly paths: PreparedRunArtifactPaths;
32
33
  /**
package/dist/run/run.js CHANGED
@@ -9,7 +9,7 @@ import {} from "./results.js";
9
9
  import { createRunArtifactPaths, validatePreparedRunArtifactPaths, } from "./paths.js";
10
10
  import { registerActiveRun } from "./active-runs.js";
11
11
  import { writeContainedOutputFile, writePreparedRunLatestPointer } from "./contained-output.js";
12
- import { beginRunStatus, runStatusOutcome, } from "./status.js";
12
+ import { beginRunStatus, runStatusOutcome } from "./status.js";
13
13
  /** An entry point called in a state that does not admit it. */
14
14
  class RunLifecycleError extends Error {
15
15
  name = "RunLifecycleError";
@@ -9,7 +9,7 @@ export interface SandboxReceipt {
9
9
  /** Who allocated the sandbox. Receipts written before this field existed have none. */
10
10
  provider?: SandboxProviderId;
11
11
  sandboxId: string;
12
- /** The create-time sandbox TTL (ms), when known — how long the server-side backstop runs. */
12
+ /** The create-time sandbox TTL (ms), when known: how long the server-side backstop runs. */
13
13
  timeoutMs?: number;
14
14
  }
15
15
  /**
@@ -22,7 +22,7 @@ export interface ParsedSandboxReceipt extends Omit<SandboxReceipt, "provider"> {
22
22
  }
23
23
  /**
24
24
  * Append one receipt. Best-effort by design: the receipt exists to protect the run, so a failed
25
- * receipt write must never fail the participant — the only cost of a miss is that `reclaim` cannot see
25
+ * receipt write must never fail the participant. The only cost of a miss is that `reclaim` cannot see
26
26
  * this id and the TTL backstop covers it instead. Containment is the same prepare step every
27
27
  * artifact write uses; append (not atomic-replace) keeps racing participants' receipts intact.
28
28
  */
@@ -6,7 +6,7 @@ import { prepareContainedOutputFile } from "./contained-output.js";
6
6
  export const SANDBOX_RECEIPTS_ARTIFACT = "sandbox-receipts.ndjson";
7
7
  /**
8
8
  * Append one receipt. Best-effort by design: the receipt exists to protect the run, so a failed
9
- * receipt write must never fail the participant — the only cost of a miss is that `reclaim` cannot see
9
+ * receipt write must never fail the participant. The only cost of a miss is that `reclaim` cannot see
10
10
  * this id and the TTL backstop covers it instead. Containment is the same prepare step every
11
11
  * artifact write uses; append (not atomic-replace) keeps racing participants' receipts intact.
12
12
  */
@@ -16,7 +16,7 @@ export async function appendSandboxReceipt(root, receipt) {
16
16
  await appendFile(filePath, `${JSON.stringify(receipt)}\n`, "utf8");
17
17
  }
18
18
  catch {
19
- // Swallowed on purpose — see the contract above.
19
+ // Swallowed on purpose; see the contract above.
20
20
  }
21
21
  }
22
22
  /** Parse a receipts file leniently: a torn final line (crash mid-append) drops, valid lines keep. */
@@ -42,7 +42,7 @@ export function parseSandboxReceipts(text) {
42
42
  }
43
43
  }
44
44
  catch {
45
- // torn line — skip
45
+ // A torn line: skip it.
46
46
  }
47
47
  }
48
48
  return receipts;
@@ -1,6 +1,6 @@
1
1
  import type { ParticipantIds } from "./participant-records.js";
2
2
  export declare const SHARED_WORLD_SCHEMA = "humanish.shared-world.v1";
3
- /** The shared service-plane provenance for a shared-world run (#164): single commit + a
3
+ /** The shared service-plane provenance for a shared-world run: single commit + a
4
4
  * seed-recipe digest + the provisioned env names (never values). */
5
5
  export interface SharedWorldPlane {
6
6
  /** The cloned commit SHA of the shared plane (when the clone resolved one). */
@@ -11,13 +11,13 @@ export interface SharedWorldPlane {
11
11
  /** Declared env names provisioned for the shared plane (values never surface). */
12
12
  envNames: string[];
13
13
  /**
14
- * Concurrent route only (#164 phase 2): sha256-16 of the harness-minted `getHost` URL's origin
15
- * (the first-class provisioned-subject target every actor drove, per invariant 2). A digest replaces the
14
+ * Concurrent route only: sha256-16 of the harness-minted `getHost` URL's origin
15
+ * (the first-class provisioned-subject target every actor drove). A digest replaces the
16
16
  * raw URL: a getHost URL embeds the (live) sandbox id and matches the publish-safety e2b-URL
17
- * redaction, so — like the stream URL and like sandbox ids — it never lands raw in a published
17
+ * redaction, so, like the stream URL and sandbox ids, it never lands raw in a published
18
18
  * bundle (the raw tokenless URL is surfaced only on the ephemeral lab result). The orchestrator
19
- * confirms the URL is tokenless (no authKey, per invariant 1) before digesting. verify proves every
20
- * actor drove this host by digest equality. Absent on the sequential route.
19
+ * confirms the URL is tokenless (no authKey, so no secret reaches the bundle) before digesting.
20
+ * verify proves every actor drove this host by digest equality. Absent on the sequential route.
21
21
  */
22
22
  hostDigest?: string;
23
23
  /**
@@ -30,17 +30,17 @@ export interface SharedWorldPlane {
30
30
  */
31
31
  exposure?: "synthetic";
32
32
  /**
33
- * External-public plane class only (#164 phase 2): sha256-16 of the observed origin the seats
33
+ * External-public plane class only: sha256-16 of the observed origin the participants
34
34
  * converged on. It is the counterpart of hostDigest with a weaker, disclosed claim: the harness only
35
- * observes that each seat reached this origin and never minted it. It is derived from what the
36
- * seats actually reached; the declared appUrl does not feed it. verify proves every laneWindow.routeHostDigest
37
- * (that seat's CDP-observed final URL origin) equals it, which shows inter-seat convergence on one observed
38
- * origin, not harness control of the plane. A digest, not the raw origin (kept consistent with
39
- * hostDigest hygiene). Absent on getHost.
35
+ * observes that each participant reached this origin and never minted it. It is derived from what
36
+ * the participants actually reached; the declared appUrl does not feed it. verify proves every
37
+ * laneWindow.routeHostDigest (that participant's CDP-observed final URL origin) equals it, which
38
+ * shows cross-participant convergence on one observed origin, not harness control of the plane. A
39
+ * digest, not the raw origin (kept consistent with hostDigest hygiene). Absent on getHost.
40
40
  */
41
41
  publicOriginDigest?: string;
42
42
  /**
43
- * EXTERNAL-PUBLIC plane class only: sha256-16 of the operator-DECLARED origin (from subject.appUrl),
43
+ * External-public plane class only: sha256-16 of the operator-declared origin (from subject.appUrl),
44
44
  * recorded for reference/evidence only. It is never asserted equal to publicOriginDigest: a normal
45
45
  * cross-origin redirect (apex->www, http->https) makes the observed origin differ from the declared
46
46
  * one, which is expected. Operator ownership rests on the subject.publicTarget.authorized attestation
@@ -49,7 +49,7 @@ export interface SharedWorldPlane {
49
49
  declaredOriginDigest?: string;
50
50
  }
51
51
  /**
52
- * Concurrent shape (#164 phase 2): one actor's harness-clocked activity window against the one
52
+ * Concurrent shape: one actor's harness-clocked activity window against the one
53
53
  * shared plane. Overlapping windows mechanically prove ≥2 personas were active simultaneously.
54
54
  * `laneWindows` and `stateSeries` are independent series. There is deliberately no per-delta→actor
55
55
  * field, because under concurrency the evidence cannot say which actor caused a state change.
@@ -68,9 +68,9 @@ export interface SharedWorldParticipantWindow {
68
68
  endedAt: number;
69
69
  /** The actor's terminal session verdict (per-persona). */
70
70
  verdict: string;
71
- /** sha256-16 of the origin of the getHost seat URL this actor drove. verify confirms it equals
72
- * plane.hostDigest, so the actor drove exactly the harness-minted host (invariant 2).
73
- * A digest, not the raw URL (a getHost URL is not publish-safe — see SharedWorldPlane.hostDigest). */
71
+ /** sha256-16 of the origin of the getHost participant URL this actor drove. verify confirms it
72
+ * equals plane.hostDigest, so the actor drove exactly the harness-minted host. A digest, not the
73
+ * raw URL (a getHost URL is not publish-safe; see SharedWorldPlane.hostDigest). */
74
74
  routeHostDigest: string;
75
75
  /** The shared plane's commit this actor observed (omitted when unresolved). */
76
76
  commit?: string;
@@ -109,19 +109,19 @@ export declare function sharedWorldParticipantKeys(ids: ParticipantIds, particip
109
109
  readonly caseGroup?: string;
110
110
  }): Pick<SharedWorldOutcome, "roleId" | "actorType" | "surface" | "caseGroup" | "simId" | "streamId">;
111
111
  /** A timeline checkpoint: a read-only digest probe of the shared plane at one moment. Persisted
112
- * DIGEST-ONLY — `digest` is sha256-16(scrub+redact(stdout)); no raw value ever lands. */
112
+ * digest-only: `digest` is sha256-16(scrub+redact(stdout)); no raw value ever lands. */
113
113
  export interface SharedWorldCheckpoint {
114
114
  kind: "checkpoint";
115
115
  /** "cp-baseline" for the baseline snapshot; "cp-after-<roleId>" after each role's turn. */
116
116
  name: string;
117
117
  /** sha256-16 of the (scrubbed, redacted) combined probe output at this snapshot. */
118
118
  digest: string;
119
- /** True when this snapshot's digest differs from the previous checkpoint's — the observed
119
+ /** True when this snapshot's digest differs from the previous checkpoint's, meaning the observed
120
120
  * state changed across the intervening turn (the delta is attributed to the whole turn). */
121
121
  deltaFromPrev: boolean;
122
122
  }
123
- /** A timeline turn: one role's seat session against the shared plane. Carries the plane
124
- * provenance it observed (identical across turns by construction — the single-plane proof). */
123
+ /** A timeline turn: one participant's session against the shared plane. Carries the plane
124
+ * provenance it observed (identical across turns by construction: the single-plane proof). */
125
125
  interface SharedWorldTurn {
126
126
  kind: "turn";
127
127
  roleId: string;
@@ -135,8 +135,8 @@ interface SharedWorldTurn {
135
135
  seedDigest: string;
136
136
  }
137
137
  type SharedWorldTimelineEntry = SharedWorldCheckpoint | SharedWorldTurn;
138
- /** Declared seats that were never started after one executed sequential role stopped the run.
139
- * The executed timeline plus this ordered tail must account for every declared sim/stream. */
138
+ /** Declared participants that were never started after one executed sequential role stopped the
139
+ * run. The executed timeline plus this ordered tail must account for every declared sim/stream. */
140
140
  interface SharedWorldSkippedTail {
141
141
  afterRoleId: string;
142
142
  roles: Array<{
@@ -156,10 +156,10 @@ interface SharedWorldSkippedTail {
156
156
  * - Sequential (`topologyMode: "sequential"`): `sequence` + an alternating `timeline`
157
157
  * (cp-baseline → turn → cp → … → cp); limits `sequential-only` etc. No route writes it since
158
158
  * 0.106.0; verify still reads it so older bundles keep verifying.
159
- * - Concurrent (`topologyMode: "concurrent"`, #164 phase 2): `laneWindows` + `stateSeries` +
159
+ * - Concurrent (`topologyMode: "concurrent"`): `laneWindows` + `stateSeries` +
160
160
  * `outcomes`; limits `concurrent` etc. No `timeline`.
161
161
  *
162
- * Additive + optional on `humanish.run-bundle.v1` — absent on every non-shared-world bundle.
162
+ * Additive + optional on `humanish.run-bundle.v1`: absent on every non-shared-world bundle.
163
163
  * The mandatory `attributionLimits` are verify-enforced (fail closed on a missing required or a
164
164
  * present forbidden limit).
165
165
  */
@@ -169,26 +169,27 @@ export interface SharedWorldEvidence {
169
169
  /** The substrate discriminator. Branched on first by sharedWorldEvidenceFindings. */
170
170
  topologyMode: "sequential" | "concurrent";
171
171
  /**
172
- * Concurrent route only (#164 phase 2): the plane-class discriminator. Absent == the historical
173
- * "provisioned-getHost" plane (a clone/local-tree subject served + getHost-exposed in-sandbox — the
172
+ * Concurrent route only: the plane-class discriminator. Absent == the historical
173
+ * "provisioned-getHost" plane (a clone/local-tree subject served + getHost-exposed in-sandbox; the
174
174
  * harness minted the host; synthetic-seeded attestation + authoritative in-sandbox checkpoint
175
175
  * stateSeries). "external-public" == a real operator-owned public deployment used directly as the
176
176
  * plane (no getHost/clone/seed; the operator attests it and the harness does not control it; no authoritative
177
- * shared-state proof — concurrency evidenced by temporal co-occupancy + observed lobby convergence).
177
+ * shared-state proof: concurrency evidenced by temporal co-occupancy + observed lobby convergence).
178
178
  * verify gates every getHost-specific assertion on this discriminator; existing bundles omit it and
179
179
  * default to provisioned-getHost, byte-stable.
180
180
  */
181
181
  planeClass?: "provisioned-getHost" | "external-public";
182
- /** The declared number of role seats. */
182
+ /** The declared number of participants. */
183
183
  roleCount: number;
184
184
  plane: SharedWorldPlane;
185
185
  /** The pinned, verify-enforced attribution ceiling (the set differs per topologyMode/planeClass). */
186
186
  attributionLimits: string[];
187
187
  /**
188
- * EXTERNAL-PUBLIC plane class only (#164 phase 2, optional-but-strong): sha256-16 of the shared
189
- * `/lobby/CODE` path every seat's CDP-observed URL converged on: the concrete "they were in one
190
- * shared world" proof, observation-derived and needing no subject change. Digest-only (the raw
191
- * 6-char lobby code and full URLs are runtime-only and never land). Absent when seats did not converge.
188
+ * External-public plane class only (optional-but-strong): sha256-16 of the shared
189
+ * `/lobby/CODE` path every participant's CDP-observed URL converged on: the concrete "they were
190
+ * in one shared world" proof, observation-derived and needing no subject change. Digest-only (the
191
+ * raw 6-char lobby code and full URLs are runtime-only and never land). Absent when participants
192
+ * did not converge.
192
193
  */
193
194
  lobbyConvergenceDigest?: string;
194
195
  /** The role ids that actually took a turn, in declared order. */
@@ -210,8 +211,8 @@ interface ParticipantWindow {
210
211
  }
211
212
  /**
212
213
  * What a shared-world run shows about concurrency, as verify's pass gate and the judge both read
213
- * it: whether two or more seats were live at once, and, when the plane keeps a state series (the
214
- * provisioned plane), whether the state changed at or after the first overlap started.
214
+ * it: whether two or more participants were live at once, and, when the plane keeps a state series
215
+ * (the provisioned plane), whether the state changed at or after the first overlap started.
215
216
  */
216
217
  export declare function concurrencyFacts(windows: readonly ParticipantWindow[], stateSeries: readonly SharedWorldStateSnapshot[] | undefined): {
217
218
  overlap: boolean;
@@ -1,5 +1,5 @@
1
- // The sharedWorld block of run.json (humanish.shared-world.v1): the one shared plane, each seat's
2
- // window, state snapshots and the interleaved timeline of checkpoints and turns.
1
+ // The sharedWorld block of run.json (humanish.shared-world.v1): the one shared plane, each
2
+ // participant's window, state snapshots and the interleaved timeline of checkpoints and turns.
3
3
  export const SHARED_WORLD_SCHEMA = "humanish.shared-world.v1";
4
4
  /**
5
5
  * The fields a window and an outcome start with, in the saved order: the participant id saved as
@@ -30,8 +30,8 @@ function overlapStarts(windows) {
30
30
  }
31
31
  /**
32
32
  * What a shared-world run shows about concurrency, as verify's pass gate and the judge both read
33
- * it: whether two or more seats were live at once, and, when the plane keeps a state series (the
34
- * provisioned plane), whether the state changed at or after the first overlap started.
33
+ * it: whether two or more participants were live at once, and, when the plane keeps a state series
34
+ * (the provisioned plane), whether the state changed at or after the first overlap started.
35
35
  */
36
36
  export function concurrencyFacts(windows, stateSeries) {
37
37
  const starts = overlapStarts(windows);
@@ -18,7 +18,7 @@ export declare function planeProvenanceFindings(items: readonly Record<string, u
18
18
  /** Common shape findings shared by both topologyMode branches. */
19
19
  export declare function sharedWorldCommonFindings(bundle: RunBundle, sw: SharedWorldEvidence): string[];
20
20
  /**
21
- * Tolerant shape guard for the shared-world evidence block (#164). Validates required fields +
21
+ * Tolerant shape guard for the shared-world evidence block. Validates required fields +
22
22
  * types and tolerates extra keys (additive): the strict value-shape/timeline checks are
23
23
  * sharedWorldEvidenceFindings' job (an injected value-shaped checkpoint field must pass the shape
24
24
  * guard so verify can catch it fail-closed, not silently bounce off isRunBundle).
@@ -8,14 +8,14 @@ export const COMMAND_DIGEST_PATTERN = /^[0-9a-f]{16}$/;
8
8
  // must hold names only: a value sneaking into the list trips this check (a free secret tripwire).
9
9
  export const SUBJECT_ENV_NAME_PATTERN = /^[A-Z][A-Z0-9_]*$/;
10
10
  // Sequential: the three disclosures a sequential shared-world bundle must pin (verify fails closed
11
- // if any is absent — omission overclaims): sequential turns only, no concurrency/races handled, and
11
+ // if any is absent, because omission overclaims): sequential turns only, no concurrency/races handled, and
12
12
  // a checkpoint delta is attributed to the turn it followed, never a specific action (correlation).
13
13
  export const MANDATORY_ATTRIBUTION_LIMITS = [
14
14
  "sequential-only",
15
15
  "no-concurrent-races",
16
16
  "delta-attributed-to-turn-not-action",
17
17
  ];
18
- // A shared-world checkpoint record persists DIGEST-ONLY: exactly these keys, nothing value-shaped.
18
+ // A shared-world checkpoint record persists digest-only: exactly these keys, nothing value-shaped.
19
19
  export const SHARED_WORLD_CHECKPOINT_KEYS = new Set(["kind", "name", "digest", "deltaFromPrev"]);
20
20
  // A concurrent stateSeries record is digest-only too: it permits a numeric timestamp + the
21
21
  // sha256-16 digest; any other key is a value-shaped leak / a smuggled per-delta→actor field.
@@ -30,7 +30,7 @@ export function planeProvenanceFindings(items, plane, labels) {
30
30
  const findings = [];
31
31
  const keys = new Set(items.map((item) => `${text(item.commit)}::${text(item.seedDigest)}`));
32
32
  if (keys.size > 1) {
33
- findings.push(`${labels.items} reference divergent plane provenance (commit/seedDigest) — a ${labels.run} run drives ONE plane`);
33
+ findings.push(`${labels.items} reference different plane provenance (commit or seedDigest), but a ${labels.run} run uses one plane`);
34
34
  }
35
35
  if (!isRecord(plane))
36
36
  return findings;
@@ -63,14 +63,14 @@ export function sharedWorldCommonFindings(bundle, sw) {
63
63
  for (const name of plane.envNames) {
64
64
  if (typeof name !== "string" || !SUBJECT_ENV_NAME_PATTERN.test(name)) {
65
65
  // Never echoes the entry: a malformed entry may be a value.
66
- findings.push("sharedWorld.plane.envNames carries an entry that is not an env var NAME shape (values must never appear in evidence)");
66
+ findings.push("sharedWorld.plane.envNames has an entry that is not an environment variable name; evidence may hold names only, never values");
67
67
  }
68
68
  }
69
69
  }
70
70
  return findings;
71
71
  }
72
72
  /**
73
- * Tolerant shape guard for the shared-world evidence block (#164). Validates required fields +
73
+ * Tolerant shape guard for the shared-world evidence block. Validates required fields +
74
74
  * types and tolerates extra keys (additive): the strict value-shape/timeline checks are
75
75
  * sharedWorldEvidenceFindings' job (an injected value-shaped checkpoint field must pass the shape
76
76
  * guard so verify can catch it fail-closed, not silently bounce off isRunBundle).
@@ -110,7 +110,7 @@ export function isSharedWorldEvidence(value) {
110
110
  value.attributionLimits.every((limit) => typeof limit === "string")))
111
111
  return false;
112
112
  // Tolerant: validate the type of each present field only (the coherence + topologyMode dispatch
113
- // are the job of sharedWorldEvidenceFindings — an injected value-shaped field must pass this
113
+ // are the job of sharedWorldEvidenceFindings; an injected value-shaped field must pass this
114
114
  // guard so verify catches it fail-closed). A bundle must carry at least one of the two shapes.
115
115
  if (value.sequence !== undefined &&
116
116
  !(Array.isArray(value.sequence) && value.sequence.every((id) => typeof id === "string")))
@@ -1,12 +1,13 @@
1
1
  import { type CostTotals, type CostRow } from "./costs.js";
2
- declare const STATS_SCHEMA = "humanish.stats.v1";
2
+ declare const STATS_SCHEMA = "humanish.stats.v2";
3
3
  interface StatsParticipants {
4
4
  total: number;
5
5
  reachedGoal: number;
6
6
  reportedFriction: number;
7
7
  }
8
8
  interface StatsLabRow {
9
- lab: string;
9
+ /** The study's `id`. */
10
+ study: string;
10
11
  runs: number;
11
12
  live: number;
12
13
  dryRun: number;
@@ -40,7 +41,8 @@ export interface StatsResult {
40
41
  ok: true;
41
42
  cwd: string;
42
43
  since?: string;
43
- lab?: string;
44
+ /** The study the stats are limited to, when one was given. */
45
+ study?: string;
44
46
  totals: {
45
47
  runs: number;
46
48
  live: number;
@@ -53,11 +55,11 @@ export interface StatsResult {
53
55
  verdicts: Record<string, number>;
54
56
  costs: CostTotals;
55
57
  };
56
- labs: StatsLabRow[];
58
+ studies: StatsLabRow[];
57
59
  days: StatsDayRow[];
58
60
  /** Same selected runs; individual accounting gaps are inspectable without reading private evidence. */
59
61
  costsByRun: CostRow[];
60
- /** Directories that could not be read, by name — surfaced, never silently dropped. */
62
+ /** Directories that could not be read, by name: surfaced, never silently dropped. */
61
63
  unreadable: string[];
62
64
  note: string;
63
65
  }
@@ -78,5 +80,9 @@ export interface StatsFailure {
78
80
  };
79
81
  }
80
82
  export declare function computeStats(cwdInput: string, options?: StatsOptions): Promise<StatsResult | StatsFailure>;
81
- export declare function formatStatsHuman(result: StatsResult | StatsFailure): string;
83
+ /** Human output; a failure is an error the CLI prints on stderr (HumanOutput in src/cli/io.ts). */
84
+ export declare function formatStatsHuman(result: StatsResult): string;
85
+ export declare function formatStatsHuman(result: StatsResult | StatsFailure): string | {
86
+ error: StatsFailure["error"];
87
+ };
82
88
  export {};