humanish 0.106.1 → 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 (668) hide show
  1. package/ARCHITECTURE.md +38 -32
  2. package/CHANGELOG.md +28 -0
  3. package/CONTEXT.md +51 -41
  4. package/README.md +152 -174
  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-client.js +2 -1
  14. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  15. package/dist/actors/codex/app-server-trace.js +1 -3
  16. package/dist/actors/codex/app-server-ui.js +1 -1
  17. package/dist/actors/codex/app-server.js +2 -1
  18. package/dist/actors/codex/codex-admission.d.ts +91 -0
  19. package/dist/actors/codex/codex-admission.js +150 -0
  20. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  21. package/dist/actors/codex/protocol-compat.js +357 -0
  22. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  23. package/dist/actors/codex/protocol-contract.js +471 -0
  24. package/dist/actors/codex/restricted-executable.d.ts +28 -4
  25. package/dist/actors/codex/restricted-executable.js +104 -29
  26. package/dist/actors/codex/restricted-launch.d.ts +9 -2
  27. package/dist/actors/codex/restricted-launch.js +43 -4
  28. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  29. package/dist/actors/codex/restricted-notifications.js +277 -0
  30. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  31. package/dist/actors/codex/restricted-participant.js +66 -6
  32. package/dist/actors/codex/restricted-policy.d.ts +11 -3
  33. package/dist/actors/codex/restricted-policy.js +2 -2
  34. package/dist/actors/codex/restricted-session.d.ts +16 -3
  35. package/dist/actors/codex/restricted-session.js +60 -22
  36. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  37. package/dist/actors/codex/restricted-transport.js +139 -27
  38. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  39. package/dist/actors/codex/restricted-turn.js +43 -30
  40. package/dist/actors/computer-use/actor.d.ts +17 -17
  41. package/dist/actors/computer-use/actor.js +6 -6
  42. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  43. package/dist/actors/computer-use/admission-limit.js +1 -1
  44. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  45. package/dist/actors/computer-use/loop/actions.js +10 -10
  46. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  47. package/dist/actors/computer-use/loop/backstop.js +15 -13
  48. package/dist/actors/computer-use/loop/ending.d.ts +7 -7
  49. package/dist/actors/computer-use/loop/ending.js +9 -9
  50. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  51. package/dist/actors/computer-use/loop/observation.js +9 -9
  52. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  53. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  54. package/dist/actors/computer-use/loop/session.js +3 -3
  55. package/dist/actors/computer-use/loop/spend.d.ts +2 -2
  56. package/dist/actors/computer-use/loop/spend.js +4 -4
  57. package/dist/actors/computer-use/loop/trace.js +11 -10
  58. package/dist/actors/computer-use/loop/types.d.ts +37 -26
  59. package/dist/actors/computer-use/loop/usage.js +2 -2
  60. package/dist/actors/computer-use/loop.js +4 -4
  61. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  62. package/dist/actors/computer-use/openai-context.js +214 -0
  63. package/dist/actors/computer-use/openai-provider.d.ts +12 -9
  64. package/dist/actors/computer-use/openai-provider.js +47 -36
  65. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  66. package/dist/actors/computer-use/openai-requests.js +82 -15
  67. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  68. package/dist/actors/computer-use/openai-wire.js +36 -34
  69. package/dist/actors/contract.d.ts +86 -49
  70. package/dist/actors/contract.js +29 -23
  71. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  72. package/dist/actors/local-agent/claude-session.js +10 -9
  73. package/dist/actors/local-agent/cli.d.ts +8 -6
  74. package/dist/actors/local-agent/cli.js +24 -28
  75. package/dist/actors/local-agent/readiness.d.ts +2 -2
  76. package/dist/actors/local-agent/readiness.js +4 -4
  77. package/dist/actors/reasoning-effort.js +6 -6
  78. package/dist/actors/registry.d.ts +10 -10
  79. package/dist/actors/registry.js +18 -17
  80. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  81. package/dist/actors/scripted-browser/actor.js +16 -16
  82. package/dist/actors/scripted-browser/browser-command.js +1 -1
  83. package/dist/actors/scripted-browser/journey.js +15 -4
  84. package/dist/actors/scripted-browser/steps.js +19 -1
  85. package/dist/actors/scripted-browser/types.d.ts +12 -2
  86. package/dist/actors/stop-conditions.d.ts +1 -1
  87. package/dist/actors/stop-conditions.js +1 -3
  88. package/dist/analysis/automatic-completion.d.ts +13 -8
  89. package/dist/analysis/automatic-completion.js +14 -8
  90. package/dist/analysis/automatic-config.d.ts +1 -1
  91. package/dist/analysis/automatic-config.js +2 -2
  92. package/dist/analysis/automatic.d.ts +10 -4
  93. package/dist/analysis/automatic.js +17 -13
  94. package/dist/analysis/codex-config.d.ts +6 -2
  95. package/dist/analysis/codex-config.js +22 -14
  96. package/dist/analysis/diagnostics.d.ts +23 -0
  97. package/dist/analysis/diagnostics.js +112 -0
  98. package/dist/analysis/evidence-sources.js +2 -2
  99. package/dist/analysis/evidence.js +6 -6
  100. package/dist/analysis/execute.d.ts +7 -1
  101. package/dist/analysis/execute.js +39 -12
  102. package/dist/analysis/job.d.ts +8 -5
  103. package/dist/analysis/job.js +15 -14
  104. package/dist/analysis/load.d.ts +1 -1
  105. package/dist/analysis/load.js +5 -5
  106. package/dist/analysis/provider.d.ts +9 -1
  107. package/dist/analysis/restricted-codex.d.ts +2 -0
  108. package/dist/analysis/restricted-codex.js +10 -1
  109. package/dist/analysis/service.d.ts +2 -0
  110. package/dist/analysis/service.js +35 -16
  111. package/dist/analysis/sharing.d.ts +2 -2
  112. package/dist/analysis/sharing.js +5 -5
  113. package/dist/analysis/store-executions.d.ts +5 -5
  114. package/dist/analysis/store-executions.js +12 -12
  115. package/dist/analysis/store.d.ts +4 -4
  116. package/dist/analysis/store.js +13 -13
  117. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  118. package/dist/cli/commands/analysis-signals.js +4 -1
  119. package/dist/cli/commands/analyze.js +23 -18
  120. package/dist/cli/commands/codex.js +9 -9
  121. package/dist/cli/commands/comms.js +62 -34
  122. package/dist/cli/commands/feedback.js +20 -21
  123. package/dist/cli/commands/lab-format.d.ts +5 -4
  124. package/dist/cli/commands/lab-format.js +35 -23
  125. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  126. package/dist/cli/commands/lab-route-computer-use.js +32 -21
  127. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  128. package/dist/cli/commands/lab-route-preview.js +7 -7
  129. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  130. package/dist/cli/commands/lab-route-run.js +6 -2
  131. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  132. package/dist/cli/commands/lab-route-scripted.js +0 -1
  133. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  134. package/dist/cli/commands/lab-route-shared-world.js +3 -4
  135. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  136. package/dist/cli/commands/lab-route-terminal.js +0 -1
  137. package/dist/cli/commands/lab-run.js +84 -54
  138. package/dist/cli/commands/lab-scorer.d.ts +2 -4
  139. package/dist/cli/commands/lab-scorer.js +1 -1
  140. package/dist/cli/commands/migrate.d.ts +4 -0
  141. package/dist/cli/commands/migrate.js +65 -0
  142. package/dist/cli/commands/observe.js +168 -107
  143. package/dist/cli/commands/run-command.d.ts +10 -0
  144. package/dist/cli/commands/run-command.js +85 -0
  145. package/dist/cli/commands/run-signals.d.ts +30 -0
  146. package/dist/cli/commands/run-signals.js +146 -0
  147. package/dist/cli/commands/runs.js +137 -136
  148. package/dist/cli/commands/setup.d.ts +2 -2
  149. package/dist/cli/commands/setup.js +26 -21
  150. package/dist/cli/commands/study.d.ts +3 -0
  151. package/dist/cli/commands/study.js +182 -0
  152. package/dist/cli/commands/tui.d.ts +4 -4
  153. package/dist/cli/commands/tui.js +21 -21
  154. package/dist/cli/commands/watch.js +64 -77
  155. package/dist/cli/deprecations.d.ts +18 -0
  156. package/dist/cli/deprecations.js +48 -0
  157. package/dist/cli/doctor.d.ts +18 -5
  158. package/dist/cli/doctor.js +111 -48
  159. package/dist/cli/first-run-path.d.ts +12 -10
  160. package/dist/cli/first-run-path.js +30 -28
  161. package/dist/cli/io.d.ts +46 -10
  162. package/dist/cli/io.js +109 -30
  163. package/dist/cli/observer-follow.d.ts +2 -2
  164. package/dist/cli/observer-follow.js +5 -6
  165. package/dist/cli/orientation.d.ts +6 -3
  166. package/dist/cli/orientation.js +43 -39
  167. package/dist/cli/product-sentence.d.ts +6 -0
  168. package/dist/cli/product-sentence.js +6 -0
  169. package/dist/cli/program.d.ts +6 -1
  170. package/dist/cli/program.js +112 -43
  171. package/dist/cli/telemetry.d.ts +17 -17
  172. package/dist/cli/telemetry.js +49 -41
  173. package/dist/cli.js +1 -1
  174. package/dist/comms/capture-surface.d.ts +14 -13
  175. package/dist/comms/capture-surface.js +23 -22
  176. package/dist/comms/catch-host.d.ts +8 -8
  177. package/dist/comms/catch-host.js +14 -14
  178. package/dist/comms/connections.js +4 -4
  179. package/dist/comms/email-catch.d.ts +3 -3
  180. package/dist/comms/email-catch.js +8 -8
  181. package/dist/comms/external-evidence.d.ts +27 -0
  182. package/dist/comms/external-evidence.js +93 -0
  183. package/dist/comms/extract.js +2 -2
  184. package/dist/comms/fake-inbox.d.ts +2 -2
  185. package/dist/comms/fake-inbox.js +2 -2
  186. package/dist/comms/lease-store.js +7 -7
  187. package/dist/comms/receiving-render.d.ts +1 -1
  188. package/dist/comms/receiving-render.js +2 -2
  189. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  190. package/dist/comms/sandbox-catch-script.js +6 -6
  191. package/dist/comms/sandbox-catch.d.ts +36 -37
  192. package/dist/comms/sandbox-catch.js +34 -35
  193. package/dist/comms/setup.js +42 -8
  194. package/dist/comms/thread-evidence.d.ts +1 -1
  195. package/dist/comms/thread-evidence.js +6 -6
  196. package/dist/comms/types.d.ts +6 -6
  197. package/dist/comms/types.js +4 -4
  198. package/dist/evidence/browser-hygiene.d.ts +1 -1
  199. package/dist/evidence/browser-hygiene.js +1 -1
  200. package/dist/evidence/frame-signature.d.ts +1 -1
  201. package/dist/evidence/frame-signature.js +4 -4
  202. package/dist/evidence/redaction.d.ts +3 -3
  203. package/dist/evidence/redaction.js +5 -5
  204. package/dist/evidence/secret-scrub.d.ts +9 -0
  205. package/dist/evidence/secret-scrub.js +96 -0
  206. package/dist/feedback/draft.js +41 -85
  207. package/dist/feedback/export-bundle.js +5 -5
  208. package/dist/feedback/export.d.ts +5 -1
  209. package/dist/feedback/export.js +16 -17
  210. package/dist/feedback/feedback.d.ts +3 -3
  211. package/dist/feedback/feedback.js +21 -3
  212. package/dist/guest/chromium-text.js +2 -2
  213. package/dist/guest/desktop-native.d.ts +1 -1
  214. package/dist/guest/runtime.js +1 -1
  215. package/dist/index.d.ts +14 -15
  216. package/dist/index.js +10 -11
  217. package/dist/keys/key-resolution.d.ts +7 -5
  218. package/dist/keys/key-resolution.js +40 -38
  219. package/dist/lab/adapter-extension.d.ts +35 -13
  220. package/dist/lab/adapter-extension.js +50 -134
  221. package/dist/lab/adapter-scorer-loader.d.ts +32 -12
  222. package/dist/lab/adapter-scorer-loader.js +56 -32
  223. package/dist/lab/composition-rules.js +58 -58
  224. package/dist/lab/config.js +85 -43
  225. package/dist/lab/deprecated-fields.d.ts +10 -0
  226. package/dist/lab/deprecated-fields.js +24 -0
  227. package/dist/lab/device-presets.d.ts +10 -10
  228. package/dist/lab/device-presets.js +11 -11
  229. package/dist/lab/discover.d.ts +13 -9
  230. package/dist/lab/discover.js +118 -60
  231. package/dist/lab/doctor.d.ts +53 -11
  232. package/dist/lab/doctor.js +193 -47
  233. package/dist/lab/init-plan.js +1 -3
  234. package/dist/lab/init-templates.js +147 -147
  235. package/dist/lab/init.d.ts +1 -1
  236. package/dist/lab/init.js +41 -9
  237. package/dist/lab/keys.d.ts +2 -0
  238. package/dist/lab/keys.js +43 -9
  239. package/dist/lab/lab-deps.d.ts +80 -0
  240. package/dist/lab/lab-deps.js +4 -0
  241. package/dist/lab/parse/actors.js +17 -16
  242. package/dist/lab/parse/comms.js +8 -7
  243. package/dist/lab/parse/execution.js +15 -14
  244. package/dist/lab/parse/study-v3.d.ts +23 -0
  245. package/dist/lab/parse/study-v3.js +259 -0
  246. package/dist/lab/parse/subject-state.d.ts +7 -7
  247. package/dist/lab/parse/subject-state.js +18 -17
  248. package/dist/lab/parse/subject.js +30 -29
  249. package/dist/lab/parse/values.d.ts +1 -2
  250. package/dist/lab/parse/values.js +3 -6
  251. package/dist/lab/persona-resolve.d.ts +7 -7
  252. package/dist/lab/persona-resolve.js +8 -8
  253. package/dist/lab/persona.js +1 -3
  254. package/dist/lab/plan-base.d.ts +0 -2
  255. package/dist/lab/plan-base.js +6 -4
  256. package/dist/lab/plan-participants.d.ts +7 -7
  257. package/dist/lab/plan-participants.js +2 -2
  258. package/dist/lab/plan-types.d.ts +26 -8
  259. package/dist/lab/plan.d.ts +4 -18
  260. package/dist/lab/plan.js +24 -79
  261. package/dist/lab/preflight-probes.js +11 -11
  262. package/dist/lab/preflight-result.d.ts +2 -1
  263. package/dist/lab/preflight-result.js +5 -6
  264. package/dist/lab/preflight.d.ts +7 -8
  265. package/dist/lab/preflight.js +6 -6
  266. package/dist/lab/requirements.d.ts +20 -0
  267. package/dist/lab/requirements.js +54 -0
  268. package/dist/lab/route-inputs.d.ts +23 -12
  269. package/dist/lab/route-inputs.js +48 -51
  270. package/dist/lab/routing.d.ts +42 -41
  271. package/dist/lab/routing.js +66 -68
  272. package/dist/lab/run-lab-events.d.ts +3 -11
  273. package/dist/lab/run-lab-events.js +2 -16
  274. package/dist/lab/run-lab-homes.d.ts +76 -0
  275. package/dist/lab/run-lab-homes.js +7 -0
  276. package/dist/lab/run-lab-options.d.ts +12 -66
  277. package/dist/lab/run-lab-options.js +58 -285
  278. package/dist/lab/summary.d.ts +15 -9
  279. package/dist/lab/summary.js +24 -17
  280. package/dist/lab/tasks.d.ts +15 -15
  281. package/dist/lab/tasks.js +14 -14
  282. package/dist/lab/types.d.ts +201 -195
  283. package/dist/lab/types.js +2 -0
  284. package/dist/lab/validation.d.ts +21 -21
  285. package/dist/lab/validation.js +61 -59
  286. package/dist/lab/warnings.d.ts +10 -0
  287. package/dist/lab/warnings.js +70 -41
  288. package/dist/library-aliases.d.ts +56 -0
  289. package/dist/library-aliases.js +22 -0
  290. package/dist/observer/artifact.d.ts +2 -2
  291. package/dist/observer/artifact.js +9 -9
  292. package/dist/observer/data.d.ts +6 -6
  293. package/dist/observer/data.js +7 -6
  294. package/dist/observer/exposure.d.ts +1 -1
  295. package/dist/observer/exposure.js +11 -11
  296. package/dist/observer/http.js +1 -1
  297. package/dist/observer/library.d.ts +1 -1
  298. package/dist/observer/library.js +4 -2
  299. package/dist/observer/listen.js +5 -4
  300. package/dist/observer/render.d.ts +1 -1
  301. package/dist/observer/render.js +12 -7
  302. package/dist/observer/run-routes.d.ts +4 -4
  303. package/dist/observer/run-routes.js +6 -6
  304. package/dist/observer/serve.d.ts +17 -0
  305. package/dist/observer/serve.js +41 -6
  306. package/dist/observer/tunnel.js +1 -1
  307. package/dist/observer-app.html +4 -4
  308. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  309. package/dist/routes/computer-use/bundle-parts.js +24 -17
  310. package/dist/routes/computer-use/bundle.d.ts +4 -11
  311. package/dist/routes/computer-use/bundle.js +12 -18
  312. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  313. package/dist/routes/computer-use/diagnostics.js +1 -1
  314. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
  315. package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
  316. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  317. package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
  318. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
  319. package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
  320. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  321. package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
  322. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  323. package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
  324. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  325. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  326. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  327. package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
  328. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  329. package/dist/routes/computer-use/external-comms.js +19 -43
  330. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  331. package/dist/routes/computer-use/fanout-bundle.js +38 -42
  332. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
  333. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  334. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  335. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  336. package/dist/routes/computer-use/live-flush.js +20 -28
  337. package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
  338. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
  339. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  340. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  341. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  342. package/dist/routes/computer-use/local-vm.js +40 -67
  343. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  344. package/dist/routes/computer-use/participant-desktop.js +5 -25
  345. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
  346. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
  347. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  348. package/dist/routes/computer-use/participant-facts.js +12 -1
  349. package/dist/routes/computer-use/participant-model.d.ts +25 -11
  350. package/dist/routes/computer-use/participant-model.js +76 -34
  351. package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
  352. package/dist/routes/computer-use/participant-prompt.js +8 -8
  353. package/dist/routes/computer-use/participant-runs.d.ts +11 -11
  354. package/dist/routes/computer-use/participant-runs.js +18 -18
  355. package/dist/routes/computer-use/plan.d.ts +21 -29
  356. package/dist/routes/computer-use/plan.js +70 -78
  357. package/dist/routes/computer-use/preflight.d.ts +3 -5
  358. package/dist/routes/computer-use/preflight.js +40 -36
  359. package/dist/routes/computer-use/rerun-selection.js +11 -7
  360. package/dist/routes/computer-use/result.d.ts +1 -1
  361. package/dist/routes/computer-use/result.js +48 -38
  362. package/dist/routes/computer-use/route.d.ts +5 -5
  363. package/dist/routes/computer-use/route.js +36 -33
  364. package/dist/routes/computer-use/self-report.d.ts +8 -8
  365. package/dist/routes/computer-use/self-report.js +33 -33
  366. package/dist/routes/computer-use/setup.d.ts +9 -15
  367. package/dist/routes/computer-use/setup.js +106 -83
  368. package/dist/routes/computer-use/single-bundle.d.ts +13 -16
  369. package/dist/routes/computer-use/single-bundle.js +46 -53
  370. package/dist/routes/computer-use/subject-projection.d.ts +6 -8
  371. package/dist/routes/computer-use/subject-projection.js +24 -23
  372. package/dist/routes/computer-use/types.d.ts +195 -238
  373. package/dist/routes/computer-use/types.js +21 -13
  374. package/dist/routes/preview.d.ts +8 -2
  375. package/dist/routes/preview.js +8 -5
  376. package/dist/routes/scripted/bundle.d.ts +5 -8
  377. package/dist/routes/scripted/bundle.js +23 -27
  378. package/dist/routes/scripted/plan.d.ts +6 -8
  379. package/dist/routes/scripted/plan.js +15 -13
  380. package/dist/routes/scripted/result.d.ts +4 -1
  381. package/dist/routes/scripted/result.js +15 -11
  382. package/dist/routes/scripted/route.js +15 -17
  383. package/dist/routes/scripted/scenario.d.ts +1 -1
  384. package/dist/routes/scripted/scenario.js +3 -3
  385. package/dist/routes/scripted/setup.d.ts +3 -2
  386. package/dist/routes/scripted/setup.js +27 -26
  387. package/dist/routes/scripted/subject.d.ts +8 -3
  388. package/dist/routes/scripted/subject.js +10 -6
  389. package/dist/routes/scripted/surface-records.js +4 -4
  390. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  391. package/dist/routes/scripted/surface-sessions.js +4 -4
  392. package/dist/routes/scripted/types.d.ts +21 -40
  393. package/dist/routes/scripted/types.js +2 -3
  394. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
  395. package/dist/routes/shared-world/bundle.d.ts +7 -7
  396. package/dist/routes/shared-world/bundle.js +60 -62
  397. package/dist/routes/shared-world/checkpoints.d.ts +5 -5
  398. package/dist/routes/shared-world/checkpoints.js +5 -5
  399. package/dist/routes/shared-world/comms.d.ts +8 -7
  400. package/dist/routes/shared-world/comms.js +38 -51
  401. package/dist/routes/shared-world/external-public.d.ts +6 -5
  402. package/dist/routes/shared-world/external-public.js +28 -25
  403. package/dist/routes/shared-world/handoff.d.ts +10 -9
  404. package/dist/routes/shared-world/handoff.js +89 -81
  405. package/dist/routes/shared-world/lobby-code.d.ts +7 -7
  406. package/dist/routes/shared-world/lobby-code.js +22 -22
  407. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
  408. package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
  409. package/dist/routes/shared-world/plan.d.ts +2 -6
  410. package/dist/routes/shared-world/plan.js +8 -9
  411. package/dist/routes/shared-world/provenance.d.ts +4 -4
  412. package/dist/routes/shared-world/provenance.js +4 -4
  413. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  414. package/dist/routes/shared-world/provisioned.js +55 -48
  415. package/dist/routes/shared-world/result.js +47 -36
  416. package/dist/routes/shared-world/route.js +54 -57
  417. package/dist/routes/shared-world/setup.d.ts +6 -5
  418. package/dist/routes/shared-world/setup.js +16 -18
  419. package/dist/routes/shared-world/types.d.ts +70 -141
  420. package/dist/routes/shared-world/types.js +5 -5
  421. package/dist/routes/terminal/adapter.d.ts +10 -10
  422. package/dist/routes/terminal/adapter.js +32 -129
  423. package/dist/routes/terminal/bundle.d.ts +10 -15
  424. package/dist/routes/terminal/bundle.js +43 -52
  425. package/dist/routes/terminal/credentials.d.ts +4 -4
  426. package/dist/routes/terminal/credentials.js +20 -20
  427. package/dist/routes/terminal/dry-run.d.ts +1 -1
  428. package/dist/routes/terminal/dry-run.js +13 -15
  429. package/dist/routes/terminal/encoding.d.ts +1 -1
  430. package/dist/routes/terminal/encoding.js +4 -4
  431. package/dist/routes/terminal/ledger.d.ts +8 -8
  432. package/dist/routes/terminal/ledger.js +22 -22
  433. package/dist/routes/terminal/live-finish.d.ts +1 -2
  434. package/dist/routes/terminal/live-finish.js +24 -23
  435. package/dist/routes/terminal/live-sandbox.d.ts +3 -2
  436. package/dist/routes/terminal/live-sandbox.js +31 -32
  437. package/dist/routes/terminal/participant-text.d.ts +23 -0
  438. package/dist/routes/terminal/participant-text.js +165 -0
  439. package/dist/routes/terminal/persona.js +1 -1
  440. package/dist/routes/terminal/plan.d.ts +2 -6
  441. package/dist/routes/terminal/plan.js +23 -19
  442. package/dist/routes/terminal/recorder.d.ts +6 -1
  443. package/dist/routes/terminal/recorder.js +12 -4
  444. package/dist/routes/terminal/result.js +12 -12
  445. package/dist/routes/terminal/route.js +30 -31
  446. package/dist/routes/terminal/runtime.d.ts +3 -2
  447. package/dist/routes/terminal/runtime.js +3 -3
  448. package/dist/routes/terminal/sandbox.d.ts +4 -4
  449. package/dist/routes/terminal/sandbox.js +10 -10
  450. package/dist/routes/terminal/session.js +22 -19
  451. package/dist/routes/terminal/token-usage.d.ts +1 -1
  452. package/dist/routes/terminal/token-usage.js +10 -11
  453. package/dist/routes/terminal/trace.d.ts +7 -10
  454. package/dist/routes/terminal/trace.js +11 -66
  455. package/dist/routes/terminal/types.d.ts +104 -114
  456. package/dist/routes/terminal/types.js +12 -7
  457. package/dist/run/active-runs.d.ts +13 -0
  458. package/dist/run/active-runs.js +12 -0
  459. package/dist/run/bundle-shape.d.ts +2 -1
  460. package/dist/run/bundle-shape.js +7 -7
  461. package/dist/run/bundle.d.ts +99 -92
  462. package/dist/run/bundle.js +10 -8
  463. package/dist/run/cost-summary.js +6 -5
  464. package/dist/run/costs.d.ts +6 -6
  465. package/dist/run/costs.js +17 -11
  466. package/dist/run/detail.d.ts +9 -9
  467. package/dist/run/detail.js +10 -10
  468. package/dist/run/dry-run-inputs.js +1 -1
  469. package/dist/run/dry-run.js +23 -30
  470. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  471. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  472. package/dist/run/feedback-shape.js +1 -1
  473. package/dist/run/judge.d.ts +34 -16
  474. package/dist/run/judge.js +41 -14
  475. package/dist/run/locate.d.ts +2 -0
  476. package/dist/run/locate.js +3 -1
  477. package/dist/run/outcomes.d.ts +3 -3
  478. package/dist/run/outcomes.js +3 -3
  479. package/dist/run/participant-records.d.ts +2 -2
  480. package/dist/run/participant-records.js +2 -2
  481. package/dist/run/paths.d.ts +1 -1
  482. package/dist/run/paths.js +2 -2
  483. package/dist/run/pricing.d.ts +30 -15
  484. package/dist/run/pricing.js +49 -30
  485. package/dist/run/projection.d.ts +27 -27
  486. package/dist/run/projection.js +23 -23
  487. package/dist/run/reclaim.d.ts +6 -0
  488. package/dist/run/reclaim.js +15 -5
  489. package/dist/run/results.d.ts +5 -5
  490. package/dist/run/run-index.d.ts +9 -7
  491. package/dist/run/run-index.js +24 -25
  492. package/dist/run/run-not-found.d.ts +5 -0
  493. package/dist/run/run-not-found.js +15 -0
  494. package/dist/run/run.d.ts +7 -4
  495. package/dist/run/run.js +10 -6
  496. package/dist/run/sandbox-receipts.d.ts +5 -5
  497. package/dist/run/sandbox-receipts.js +6 -6
  498. package/dist/run/shared-world-evidence.d.ts +67 -66
  499. package/dist/run/shared-world-evidence.js +4 -4
  500. package/dist/run/shared-world-shape.d.ts +3 -3
  501. package/dist/run/shared-world-shape.js +16 -16
  502. package/dist/run/stats.d.ts +17 -11
  503. package/dist/run/stats.js +124 -66
  504. package/dist/run/status.d.ts +21 -32
  505. package/dist/run/status.js +34 -33
  506. package/dist/run/stored-runs.js +2 -1
  507. package/dist/run/stream-shape.js +1 -1
  508. package/dist/run/streams.d.ts +29 -22
  509. package/dist/run/study-provenance.d.ts +47 -0
  510. package/dist/run/study-provenance.js +63 -0
  511. package/dist/run/study-result.d.ts +16 -0
  512. package/dist/run/study-result.js +9 -0
  513. package/dist/run/terminal-contract.d.ts +5 -5
  514. package/dist/run/terminal-contract.js +4 -4
  515. package/dist/run/text.d.ts +2 -0
  516. package/dist/run/text.js +4 -0
  517. package/dist/run/transient-comms-secrets.d.ts +5 -0
  518. package/dist/run/transient-comms-secrets.js +12 -0
  519. package/dist/run-lab.d.ts +40 -38
  520. package/dist/run-lab.js +42 -40
  521. package/dist/study/convert.d.ts +33 -0
  522. package/dist/study/convert.js +432 -0
  523. package/dist/study/field-paths.d.ts +12 -0
  524. package/dist/study/field-paths.js +126 -0
  525. package/dist/study/files.d.ts +26 -0
  526. package/dist/study/files.js +43 -0
  527. package/dist/study/migrate.d.ts +48 -0
  528. package/dist/study/migrate.js +408 -0
  529. package/dist/study/owned-files.d.ts +38 -0
  530. package/dist/study/owned-files.js +182 -0
  531. package/dist/subject/clone.d.ts +1 -1
  532. package/dist/subject/desktop-cli.d.ts +2 -2
  533. package/dist/subject/desktop-cli.js +3 -3
  534. package/dist/subject/local-tree-archive.d.ts +1 -1
  535. package/dist/subject/local-tree-archive.js +5 -5
  536. package/dist/subject/local-tree.d.ts +3 -3
  537. package/dist/subject/local-tree.js +1 -1
  538. package/dist/subject/node-bootstrap.d.ts +1 -1
  539. package/dist/subject/node-bootstrap.js +4 -4
  540. package/dist/subject/runtime.js +10 -11
  541. package/dist/subject/serve.d.ts +1 -1
  542. package/dist/subject/serve.js +4 -4
  543. package/dist/subject/state.d.ts +1 -1
  544. package/dist/subject/steps.d.ts +8 -8
  545. package/dist/subject/steps.js +7 -7
  546. package/dist/substrates/command-failure.d.ts +3 -3
  547. package/dist/substrates/command-failure.js +3 -3
  548. package/dist/substrates/detached.d.ts +6 -6
  549. package/dist/substrates/detached.js +7 -7
  550. package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
  551. package/dist/substrates/e2b/cdp-probe.js +15 -18
  552. package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
  553. package/dist/substrates/e2b/desktop-browser.js +12 -12
  554. package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
  555. package/dist/substrates/e2b/desktop-cdp.js +11 -11
  556. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  557. package/dist/substrates/e2b/desktop-executor.js +1 -1
  558. package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
  559. package/dist/substrates/e2b/desktop-geometry.js +9 -9
  560. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  561. package/dist/substrates/e2b/desktop-media.js +3 -3
  562. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  563. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  564. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  565. package/dist/substrates/e2b/sandbox.js +2 -2
  566. package/dist/substrates/e2b/sdk.d.ts +11 -11
  567. package/dist/substrates/e2b/sdk.js +8 -8
  568. package/dist/substrates/local/runtime-host.d.ts +2 -0
  569. package/dist/substrates/local/runtime-host.js +6 -0
  570. package/dist/tui/actions.d.ts +8 -6
  571. package/dist/tui/actions.js +31 -22
  572. package/dist/tui/contract.d.ts +16 -16
  573. package/dist/tui/contract.js +10 -10
  574. package/dist/tui/launch.d.ts +4 -4
  575. package/dist/tui/launch.js +18 -19
  576. package/dist/tui/project.js +5 -5
  577. package/dist/tui-app.js +83 -83
  578. package/dist/verify/actor.d.ts +14 -14
  579. package/dist/verify/actor.js +45 -45
  580. package/dist/verify/artifacts.d.ts +3 -3
  581. package/dist/verify/artifacts.js +6 -6
  582. package/dist/verify/context-growth.d.ts +9 -0
  583. package/dist/verify/context-growth.js +62 -0
  584. package/dist/verify/costs.d.ts +7 -7
  585. package/dist/verify/costs.js +9 -9
  586. package/dist/verify/liveness.d.ts +1 -1
  587. package/dist/verify/liveness.js +4 -1
  588. package/dist/verify/rerun.d.ts +1 -1
  589. package/dist/verify/rerun.js +1 -1
  590. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  591. package/dist/verify/shared-world-concurrent.js +79 -76
  592. package/dist/verify/shared-world.d.ts +2 -2
  593. package/dist/verify/shared-world.js +18 -18
  594. package/dist/verify/subject.d.ts +4 -4
  595. package/dist/verify/subject.js +18 -18
  596. package/dist/verify/verify.js +98 -49
  597. package/docs/README.md +26 -33
  598. package/docs/architecture/actor-contract.md +105 -98
  599. package/docs/architecture/desktop-sessions.md +14 -14
  600. package/docs/architecture/external-public-shared-world.md +66 -59
  601. package/docs/architecture/github-feedback-loop.md +1 -4
  602. package/docs/architecture/guest-desktop.md +2 -2
  603. package/docs/architecture/observer.md +37 -37
  604. package/docs/architecture/restricted-codex-analysis.md +70 -30
  605. package/docs/architecture/serve.md +34 -37
  606. package/docs/architecture/state-driven-executor.md +55 -59
  607. package/docs/architecture/task-protocol-support.md +7 -9
  608. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
  609. package/docs/contracts/README.md +24 -0
  610. package/docs/contracts/adapter-admission.md +3 -3
  611. package/docs/contracts/adapter-fixtures.md +2 -5
  612. package/docs/contracts/core.md +1 -3
  613. package/docs/contracts/errors.md +62 -0
  614. package/docs/contracts/feedback.md +8 -9
  615. package/docs/contracts/policy.md +7 -12
  616. package/docs/contracts/run-bundle.md +54 -51
  617. package/docs/contracts/schemas.md +505 -390
  618. package/docs/contracts/study-analysis.md +26 -2
  619. package/docs/contracts/study-costs.md +11 -7
  620. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  621. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  622. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  623. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  624. package/docs/principles/actor-fidelity.md +4 -4
  625. package/docs/principles/engineering.md +3 -3
  626. package/docs/principles/invariants-and-defaults.md +38 -38
  627. package/docs/principles/self-driving-harness.md +1 -5
  628. package/docs/principles/three-roles.md +1 -1
  629. package/docs/product/automatic-analysis.md +8 -7
  630. package/examples/participant/README.md +5 -5
  631. package/examples/participant/run.mjs +11 -10
  632. package/examples/scorer/README.md +3 -3
  633. package/examples/scorer/run.mjs +11 -12
  634. package/package.json +16 -17
  635. package/skills/humanish/SKILL.md +63 -60
  636. package/skills/humanish/agents/openai.yaml +1 -1
  637. package/AGENTS.md +0 -99
  638. package/CONTRIBUTING.md +0 -148
  639. package/dist/actors/codex/qualified-versions.d.ts +0 -45
  640. package/dist/actors/codex/qualified-versions.js +0 -87
  641. package/dist/cli/commands/lab.d.ts +0 -3
  642. package/dist/cli/commands/lab.js +0 -193
  643. package/dist/deprecated.d.ts +0 -90
  644. package/dist/deprecated.js +0 -106
  645. package/dist/lab/bag-overrides.d.ts +0 -18
  646. package/dist/lab/bag-overrides.js +0 -121
  647. package/dist/observer/static.d.ts +0 -39
  648. package/dist/observer/static.js +0 -369
  649. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  650. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  651. package/docs/architecture/comms-inbox.md +0 -122
  652. package/docs/architecture/desktop-recording.md +0 -80
  653. package/docs/architecture/local-browser-runtime.md +0 -178
  654. package/docs/architecture/observer-review.md +0 -144
  655. package/docs/architecture/participant-media.md +0 -90
  656. package/docs/architecture/project-layout.md +0 -62
  657. package/docs/architecture/real-email-receiving.md +0 -136
  658. package/docs/assets/humanish-drawdb-hero.png +0 -0
  659. package/docs/assets/humanish-observer-hero.png +0 -0
  660. package/docs/goals/current.md +0 -207
  661. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  662. package/docs/product/open-source-install-experience.md +0 -240
  663. package/docs/ramp/README.md +0 -294
  664. package/docs/release/open-source-readiness.md +0 -222
  665. package/docs/release/public-readiness-standard.md +0 -210
  666. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  667. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  668. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
package/dist/run/run.js CHANGED
@@ -7,8 +7,9 @@ import { renderObserver } from "../observer/render.js";
7
7
  import { RUN_BUNDLE_FILE, PUBLIC_TARGET_CWD } from "./bundle.js";
8
8
  import {} from "./results.js";
9
9
  import { createRunArtifactPaths, validatePreparedRunArtifactPaths, } from "./paths.js";
10
+ import { registerActiveRun } from "./active-runs.js";
10
11
  import { writeContainedOutputFile, writePreparedRunLatestPointer } from "./contained-output.js";
11
- import { beginRunStatus, runStatusOutcome, } from "./status.js";
12
+ import { beginRunStatus, runStatusOutcome } from "./status.js";
12
13
  /** An entry point called in a state that does not admit it. */
13
14
  class RunLifecycleError extends Error {
14
15
  name = "RunLifecycleError";
@@ -66,6 +67,7 @@ export async function runScope(fn) {
66
67
  let closed = false;
67
68
  let started = false;
68
69
  let status;
70
+ let unregister;
69
71
  let finished;
70
72
  const admitted = new Set();
71
73
  const admit = (operation) => {
@@ -86,11 +88,11 @@ export async function runScope(fn) {
86
88
  const created = await createRunArtifactPaths(options.cwd, runId);
87
89
  if (!created.ok)
88
90
  return created;
89
- status = beginRunStatus(created.paths, {
90
- runId,
91
- mode: options.mode,
92
- ...(options.lab === undefined ? {} : { lab: options.lab }),
93
- });
91
+ // beginRunStatus reads only the mode and the lab provenance from the run's options.
92
+ status = beginRunStatus(created.paths, { ...options, runId });
93
+ // Registered before the first write lands: a signal while it is still settling reaches
94
+ // the handle, whose interrupt queues behind that write.
95
+ unregister = registerActiveRun({ cwd: options.cwd, runId, paths: created.paths, status });
94
96
  await status.started;
95
97
  return { ok: true, run: openRun(options, runId, created.paths, status) };
96
98
  })());
@@ -154,6 +156,7 @@ export async function runScope(fn) {
154
156
  runId,
155
157
  createdAt,
156
158
  mode: options.mode,
159
+ ...(options.lab === undefined ? {} : { lab: options.lab }),
157
160
  paths,
158
161
  writeSnapshot(bundle) {
159
162
  if (closed)
@@ -193,6 +196,7 @@ export async function runScope(fn) {
193
196
  finally {
194
197
  if (finished === undefined)
195
198
  await status?.finish();
199
+ unregister?.();
196
200
  }
197
201
  }
198
202
  return { result: outcome.result, finished };
@@ -4,12 +4,12 @@ export declare const SANDBOX_RECEIPTS_ARTIFACT = "sandbox-receipts.ndjson";
4
4
  export type SandboxProviderId = "e2b";
5
5
  export interface SandboxReceipt {
6
6
  at: string;
7
- /** The lane/role/subject label the sandbox belongs to (public-safe token). */
7
+ /** The participant or subject label the sandbox belongs to (public-safe token). */
8
8
  laneId: string;
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
  /**
@@ -21,10 +21,10 @@ export interface ParsedSandboxReceipt extends Omit<SandboxReceipt, "provider"> {
21
21
  provider: string;
22
22
  }
23
23
  /**
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 lane — the only cost of a miss is that `reclaim` cannot see
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
26
26
  * this id and the TTL backstop covers it instead. Containment is the same prepare step every
27
- * artifact write uses; append (not atomic-replace) keeps racing lanes' receipts intact.
27
+ * artifact write uses; append (not atomic-replace) keeps racing participants' receipts intact.
28
28
  */
29
29
  export declare function appendSandboxReceipt(root: PreparedOutputRoot, receipt: SandboxReceipt): Promise<void>;
30
30
  /** Parse a receipts file leniently: a torn final line (crash mid-append) drops, valid lines keep. */
@@ -1,14 +1,14 @@
1
1
  // Every created sandbox id is journaled to the run dir the moment create returns, before any work
2
- // happens in it. The lane loop lives in the caller's local process, so a sleeping laptop, crash or
2
+ // happens in it. The participant loop lives in the caller's local process, so a sleeping laptop, crash or
3
3
  // kill loses every in-memory id; this append-only file keeps them for `humanish reclaim`.
4
4
  import { appendFile } from "node:fs/promises";
5
5
  import { prepareContainedOutputFile } from "./contained-output.js";
6
6
  export const SANDBOX_RECEIPTS_ARTIFACT = "sandbox-receipts.ndjson";
7
7
  /**
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 lane — the only cost of a miss is that `reclaim` cannot see
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
10
10
  * this id and the TTL backstop covers it instead. Containment is the same prepare step every
11
- * artifact write uses; append (not atomic-replace) keeps racing lanes' receipts intact.
11
+ * artifact write uses; append (not atomic-replace) keeps racing participants' receipts intact.
12
12
  */
13
13
  export async function appendSandboxReceipt(root, receipt) {
14
14
  try {
@@ -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,58 +1,58 @@
1
1
  import type { ParticipantIds } from "./participant-records.js";
2
2
  export declare const SHARED_WORLD_SCHEMA = "humanish.shared-world.v1";
3
- /** The ONE shared service-plane provenance for a shared-world run (#164): single commit + a
4
- * seed-recipe digest + the provisioned env NAMES (values never). */
3
+ /** The shared service-plane provenance for a shared-world run: single commit + a
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). */
7
7
  commit?: string;
8
- /** sha256-16 over the ordered seed-step command digests — the seeded-state RECIPE identity
8
+ /** sha256-16 over the ordered seed-step command digests: the seeded-state recipe identity
9
9
  * (not the runtime state). Pins "same seed recipe" across bundles. */
10
10
  seedDigest: string;
11
- /** Declared env NAMES provisioned for the shared plane (values never surface). */
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 — invariant 2). A DIGEST, not 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 — 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
  /**
24
- * CONCURRENT route only: the author's REQUIRED attestation that the subject behind the
25
- * internet-reachable getHost URL is synthetic seeded data (FIX-3). This is author-trust + a
26
- * provenance gate, NOT a no-real-data guarantee. Verify fails closed if absent on the concurrent route.
24
+ * Concurrent route only: the author's required attestation that the subject behind the
25
+ * internet-reachable getHost URL is synthetic seeded data. This is author-trust + a
26
+ * provenance gate; it does not guarantee the data is synthetic. Verify fails closed if absent on the concurrent route.
27
27
  *
28
- * FORBIDDEN on the external-public plane class: claiming synthetic on a real public site the
29
- * harness neither provisioned nor exposed would be a lie (verify asserts it ABSENT there).
28
+ * Forbidden on the external-public plane class: claiming synthetic on a real public site the
29
+ * harness neither provisioned nor exposed would be false (verify asserts it is absent there).
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
34
- * CONVERGED on (the honest analog of hostDigest, but WEAKER and disclosed — the harness only
35
- * OBSERVES that each seat reached this origin; it never MINTED it). It is derived from what the
36
- * seats actually reached, NOT from the declared appUrl: verify proves every laneWindow.routeHostDigest
37
- * (that seat's CDP-observed final URL origin) equals it — 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.
33
+ * External-public plane class only: sha256-16 of the observed origin the participants
34
+ * converged on. It is the counterpart of hostDigest with a weaker, disclosed claim: the harness only
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),
44
- * recorded for reference/evidence ONLY. It is NEVER asserted equal to publicOriginDigest: a normal
45
- * cross-origin redirect (apex->www, http->https) makes the OBSERVED origin differ from the declared
46
- * one, which is expected. Operator OWNERSHIP rests on the subject.publicTarget.authorized attestation
47
- * + the declared appUrl, NOT on digest equality. A digest, not the raw origin. Absent on getHost.
43
+ * External-public plane class only: sha256-16 of the operator-declared origin (from subject.appUrl),
44
+ * recorded for reference/evidence only. It is never asserted equal to publicOriginDigest: a normal
45
+ * cross-origin redirect (apex->www, http->https) makes the observed origin differ from the declared
46
+ * one, which is expected. Operator ownership rests on the subject.publicTarget.authorized attestation
47
+ * + the declared appUrl; digest equality plays no part. Only the digest is stored. Absent on getHost.
48
48
  */
49
49
  declaredOriginDigest?: string;
50
50
  }
51
51
  /**
52
- * CONCURRENT shape (#164 phase 2): one actor's harness-clocked activity window against the ONE
53
- * shared plane. OVERLAPPING windows mechanically prove ≥2 personas were active simultaneously.
54
- * `laneWindows` and `stateSeries` are INDEPENDENT series — there is deliberately NO per-delta→actor
55
- * field (causation under concurrency is structurally inexpressible — FIX-7).
52
+ * Concurrent shape: one actor's harness-clocked activity window against the one
53
+ * shared plane. Overlapping windows mechanically prove ≥2 personas were active simultaneously.
54
+ * `laneWindows` and `stateSeries` are independent series. There is deliberately no per-delta→actor
55
+ * field, because under concurrency the evidence cannot say which actor caused a state change.
56
56
  */
57
57
  export interface SharedWorldParticipantWindow {
58
58
  roleId: string;
@@ -63,29 +63,29 @@ export interface SharedWorldParticipantWindow {
63
63
  simId: string;
64
64
  /** Resolves to a real RunStream (the actor's trace) in this bundle. */
65
65
  streamId: string;
66
- /** ms on the ONE harness clock — the wrapped [start,end] the orchestrator MEASURED (FIX-1). */
66
+ /** ms on the one harness clock: the wrapped [start,end] the orchestrator measured. */
67
67
  startedAt: number;
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 — i.e. the actor drove EXACTLY the harness-minted host (invariant 2; FIX-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;
77
77
  /** The shared plane's seed-recipe digest this actor observed. */
78
78
  seedDigest: string;
79
79
  }
80
- /** CONCURRENT shape: one cadence checkpoint of the shared world under load. DIGEST-ONLY — the
81
- * allowed-keys tripwire (SHARED_WORLD_STATESERIES_KEYS) permits ONLY {timestamp, digest}. */
80
+ /** Concurrent shape: one cadence checkpoint of the shared world under load. Digest-only: the
81
+ * allowed-keys tripwire (SHARED_WORLD_STATESERIES_KEYS) permits only {timestamp, digest}. */
82
82
  export interface SharedWorldStateSnapshot {
83
- /** ms on the ONE harness clock. */
83
+ /** ms on the one harness clock. */
84
84
  timestamp: number;
85
85
  /** sha256-16 of the (scrubbed, redacted) combined probe output at this snapshot. */
86
86
  digest: string;
87
87
  }
88
- /** CONCURRENT shape: one persona's OUTCOME against the contended world (the "M of N" headline). */
88
+ /** Concurrent shape: one persona's outcome against the contended world (the "M of N" headline). */
89
89
  export interface SharedWorldOutcome {
90
90
  roleId: string;
91
91
  actorType?: 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
120
- * state changed across the intervening turn (delta attributed to the TURN, not an action). */
119
+ /** True when this snapshot's digest differs from the previous checkpoint's, meaning the observed
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<{
@@ -150,45 +150,46 @@ interface SharedWorldSkippedTail {
150
150
  estimatedTotalUsd?: number;
151
151
  }
152
152
  /**
153
- * The shared-world evidence block (`humanish.shared-world.v1`). TWO variants discriminated by
154
- * `topologyMode` (FIX-8 — renamed off `RunBundle.mode` to avoid the dry-run|live collision):
153
+ * The shared-world evidence block (`humanish.shared-world.v1`). Two variants discriminated by
154
+ * `topologyMode`, which is named so it does not collide with `RunBundle.mode` (dry-run|live):
155
155
  *
156
- * - SEQUENTIAL (`topologyMode: "sequential"`): `sequence` + an alternating `timeline`
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` +
160
- * `outcomes`; limits `concurrent` etc. NO `timeline`.
159
+ * - Concurrent (`topologyMode: "concurrent"`): `laneWindows` + `stateSeries` +
160
+ * `outcomes`; limits `concurrent` etc. No `timeline`.
161
161
  *
162
- * Additive + optional on `humanish.run-bundle.v1` — absent on every non-shared-world bundle.
163
- * The mandatory `attributionLimits` are verify-enforced (FAIL CLOSED on a missing required or a
162
+ * Additive + optional on `humanish.run-bundle.v1`: absent on every non-shared-world bundle.
163
+ * The mandatory `attributionLimits` are verify-enforced (fail closed on a missing required or a
164
164
  * present forbidden limit).
165
165
  */
166
166
  export interface SharedWorldEvidence {
167
167
  schema: typeof SHARED_WORLD_SCHEMA;
168
168
  topology: "shared-world";
169
- /** The substrate discriminator (FIX-8). Branched on first by sharedWorldEvidenceFindings. */
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
174
- * harness MINTED the host; synthetic-seeded attestation + authoritative in-sandbox checkpoint
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
+ * 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
- * plane (NO getHost/clone/seed; operator-attested, not harness-controlled; NO authoritative
177
- * shared-state proof — concurrency evidenced by temporal co-occupancy + observed lobby convergence).
178
- * verify gates EVERY getHost-specific assertion on this discriminator; existing bundles omit it and
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).
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 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);
@@ -6,7 +6,7 @@ export declare const MANDATORY_ATTRIBUTION_LIMITS: readonly ["sequential-only",
6
6
  export declare const SHARED_WORLD_CHECKPOINT_KEYS: Set<string>;
7
7
  export declare const SHARED_WORLD_STATESERIES_KEYS: Set<string>;
8
8
  /**
9
- * Single-plane provenance: every item shares ONE (commit, seedDigest), and that pair matches
9
+ * Single-plane provenance: every item shares one (commit, seedDigest), and that pair matches
10
10
  * sharedWorld.plane. Only the first item that diverges from the plane is reported. The shape guard
11
11
  * has already typed both fields as strings (commit may be absent).
12
12
  */
@@ -18,8 +18,8 @@ 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 +
22
- * types but TOLERATES extra keys (additive): the strict value-shape/timeline checks are
21
+ * Tolerant shape guard for the shared-world evidence block. Validates required fields +
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).
25
25
  */
@@ -4,24 +4,24 @@ import { isNonNegativeSafeInteger, isRecord } from "./type-guards.js";
4
4
  // The promptDigest convention: sha256 hex, first 16 chars. A "seeded" record without a real
5
5
  // digest cannot pin "same recipe" across bundles, so verify treats it as a hollow claim.
6
6
  export const COMMAND_DIGEST_PATTERN = /^[0-9a-f]{16}$/;
7
- // Env var NAME shape (mirrors ENV_NAME_PATTERN in src/lab/parse/values.ts). externalEnvNames
8
- // must hold NAMES only — a value sneaking into the list trips this check (a free secret tripwire).
7
+ // Env var name shape (mirrors ENV_NAME_PATTERN in src/lab/parse/values.ts). externalEnvNames
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
- // 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
12
- // a checkpoint delta is attributed to the TURN it followed, not a specific action (correlation).
10
+ // Sequential: the three disclosures a sequential shared-world bundle must pin (verify fails closed
11
+ // if any is absent, because omission overclaims): sequential turns only, no concurrency/races handled, and
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
- // CONCURRENT stateSeries record is DIGEST-ONLY too (FIX-7): permit ONLY a numeric timestamp + the
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.
22
22
  export const SHARED_WORLD_STATESERIES_KEYS = new Set(["timestamp", "digest"]);
23
23
  /**
24
- * Single-plane provenance: every item shares ONE (commit, seedDigest), and that pair matches
24
+ * Single-plane provenance: every item shares one (commit, seedDigest), and that pair matches
25
25
  * sharedWorld.plane. Only the first item that diverges from the plane is reported. The shape guard
26
26
  * has already typed both fields as strings (commit may be absent).
27
27
  */
@@ -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;
@@ -62,16 +62,16 @@ export function sharedWorldCommonFindings(bundle, sw) {
62
62
  if (isRecord(plane) && Array.isArray(plane.envNames)) {
63
63
  for (const name of plane.envNames) {
64
64
  if (typeof name !== "string" || !SUBJECT_ENV_NAME_PATTERN.test(name)) {
65
- // Does NOT echo 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)");
65
+ // Never echoes the entry: a malformed entry may be a value.
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 +
74
- * types but TOLERATES extra keys (additive): the strict value-shape/timeline checks are
73
+ * Tolerant shape guard for the shared-world evidence block. Validates required fields +
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).
77
77
  */
@@ -109,8 +109,8 @@ export function isSharedWorldEvidence(value) {
109
109
  if (!(Array.isArray(value.attributionLimits) &&
110
110
  value.attributionLimits.every((limit) => typeof limit === "string")))
111
111
  return false;
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
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
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")))
@@ -148,7 +148,7 @@ function isSharedWorldTimelineEntry(value) {
148
148
  }
149
149
  return false;
150
150
  }
151
- // Tolerant shape guards for the CONCURRENT series (extra keys tolerated — the digest-only /
151
+ // Tolerant shape guards for the concurrent series (extra keys tolerated; the digest-only /
152
152
  // allowed-keys tripwires are the strict job of sharedWorldEvidenceFindings).
153
153
  function isSharedWorldLaneWindow(value) {
154
154
  return (isRecord(value) &&
@@ -1,12 +1,13 @@
1
- import { type StudyCosts, type StudyCostRow } from "./costs.js";
2
- declare const STATS_SCHEMA = "humanish.stats.v1";
1
+ import { type CostTotals, type CostRow } from "./costs.js";
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;
@@ -24,7 +25,7 @@ interface StatsLabRow {
24
25
  /** Runs with no estimate: a subscription brain, an interrupted run, an old bundle. Never zero. */
25
26
  unpricedRuns: number;
26
27
  participants: StatsParticipants;
27
- costs: StudyCosts;
28
+ costs: CostTotals;
28
29
  }
29
30
  interface StatsDayRow {
30
31
  day: string;
@@ -33,14 +34,15 @@ interface StatsDayRow {
33
34
  /** Participant and desktop subtotal; `costs` also includes retained analysis. */
34
35
  estimatedSpendUsd: number;
35
36
  unpricedRuns: number;
36
- costs: StudyCosts;
37
+ costs: CostTotals;
37
38
  }
38
39
  export interface StatsResult {
39
40
  schema: typeof STATS_SCHEMA;
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;
@@ -51,13 +53,13 @@ export interface StatsResult {
51
53
  unpricedRuns: number;
52
54
  participants: StatsParticipants;
53
55
  verdicts: Record<string, number>;
54
- costs: StudyCosts;
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
- costsByRun: StudyCostRow[];
60
- /** Directories that could not be read, by name — surfaced, never silently dropped. */
61
+ costsByRun: CostRow[];
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 {};