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
@@ -2,26 +2,26 @@ import { type PreparedRunArtifactPaths } from "../run/paths.js";
2
2
  import { type RunBundle } from "../run/bundle.js";
3
3
  export declare function isZeroEventTerminalTrace(value: unknown): boolean;
4
4
  /**
5
- * Verifier for the terminal-product real-agent lane (the in-sandbox command-scoped key route). A
6
- * LIVE terminal stream must carry the durable proof the safety contract requires, and must FAIL
7
- * CLOSED when any of it is missing — a blocked/failed agent run stays structurally verifiable (the
8
- * failure is the evidence) ONLY when the substrate/cleanup/interventions ledgers are present; it
5
+ * Verifier for the terminal-product real-agent route (the in-sandbox command-scoped key route). A
6
+ * live terminal stream must carry the durable proof the safety contract requires, and must fail
7
+ * closed when any of it is missing. A blocked/failed agent run stays structurally verifiable (the
8
+ * failure is the evidence) only when the substrate/cleanup/interventions ledgers are present; it
9
9
  * must never become a hollow pass. Credential-shape leakage across every artifact file is already
10
- * caught by scanRunPublicSafetyArtifacts; this check enforces the STRUCTURAL evidence + the
10
+ * caught by scanRunPublicSafetyArtifacts; this check enforces the structural evidence + the
11
11
  * proven-teardown invariant. Dry-run/contract bundles are exempt (mode !== live).
12
12
  */
13
13
  export declare function validateTerminalProductEvidence(runPaths: PreparedRunArtifactPaths, bundle: RunBundle): Promise<string[]>;
14
14
  export declare function validateCodexAppServerEvidence(runPaths: PreparedRunArtifactPaths, bundle: RunBundle): Promise<string[]>;
15
15
  /**
16
- * Independent mirror of the producer-side no-engagement guard (routes/computer-use/lanes.ts): a
17
- * LIVE actor trace claiming goal_satisfied while carrying zero action-bearing items AND zero
18
- * message items is a hollow run — the actor neither did nor said anything — and must not verify as
19
- * evidence (invariant 4: evidence verifies fail-closed). Live-vs-dry-run is judged exactly as the
20
- * producer judges it, from bundle.mode alone; dry-run/contract bundles legitimately carry no
21
- * actions and stay exempt. Engagement is accepted from EITHER surface — itemized trace items or the
22
- * producer's counts — because providers differ in what they itemize; a hollow run reports zero on
23
- * both. The trace is read defensively: isRunStream does not validate the actor seam, and verify
24
- * must not throw on a malformed one.
16
+ * Independent mirror of the producer-side no-engagement guard
17
+ * (routes/computer-use/participant-execution.ts): a live actor trace claiming goal_satisfied while
18
+ * carrying zero action-bearing items and zero message items is a hollow run (the actor neither did
19
+ * nor said anything) and must not verify as evidence: evidence verifies fail-closed.
20
+ * Live-vs-dry-run is judged exactly as the producer judges it, from bundle.mode alone;
21
+ * dry-run/contract bundles legitimately carry no actions and stay exempt. Engagement is accepted
22
+ * from either surface (itemized trace items or the producer's counts), because providers differ in
23
+ * what they itemize; a hollow run reports zero on both. The trace is read defensively: isRunStream
24
+ * does not validate the actor seam, and verify must not throw on a malformed one.
25
25
  */
26
26
  export declare function noEngagementActorFindings(bundle: RunBundle): string[];
27
27
  export declare function actorVerdictConsistencyFindings(bundle: RunBundle): string[];
@@ -14,12 +14,12 @@ export function isZeroEventTerminalTrace(value) {
14
14
  value.counts.terminalEvents === 0);
15
15
  }
16
16
  /**
17
- * Verifier for the terminal-product real-agent lane (the in-sandbox command-scoped key route). A
18
- * LIVE terminal stream must carry the durable proof the safety contract requires, and must FAIL
19
- * CLOSED when any of it is missing — a blocked/failed agent run stays structurally verifiable (the
20
- * failure is the evidence) ONLY when the substrate/cleanup/interventions ledgers are present; it
17
+ * Verifier for the terminal-product real-agent route (the in-sandbox command-scoped key route). A
18
+ * live terminal stream must carry the durable proof the safety contract requires, and must fail
19
+ * closed when any of it is missing. A blocked/failed agent run stays structurally verifiable (the
20
+ * failure is the evidence) only when the substrate/cleanup/interventions ledgers are present; it
21
21
  * must never become a hollow pass. Credential-shape leakage across every artifact file is already
22
- * caught by scanRunPublicSafetyArtifacts; this check enforces the STRUCTURAL evidence + the
22
+ * caught by scanRunPublicSafetyArtifacts; this check enforces the structural evidence + the
23
23
  * proven-teardown invariant. Dry-run/contract bundles are exempt (mode !== live).
24
24
  */
25
25
  export async function validateTerminalProductEvidence(runPaths, bundle) {
@@ -27,20 +27,20 @@ export async function validateTerminalProductEvidence(runPaths, bundle) {
27
27
  return [];
28
28
  }
29
29
  const findings = [];
30
- // Detect the terminal-PRODUCT lane by its unique actor-trace protocol ("terminal-exec"), NOT by
31
- // the broad stream.kind "terminal" — the existing local codex-exec/TUI lanes also use terminal
32
- // streams (with a different protocol) and must not be held to this lane's ledger contract.
30
+ // Detect the terminal-product route by its unique actor-trace protocol ("terminal-exec") instead of
31
+ // the broad stream.kind "terminal": the existing local codex-exec/TUI routes also use terminal
32
+ // streams (with a different protocol) and must not be held to this route's ledger contract.
33
33
  const terminalStreams = bundle.streams.filter((stream) => stream.actor?.protocol === "terminal-exec" && stream.status !== "contract_proof_only");
34
34
  if (terminalStreams.length === 0) {
35
35
  return findings;
36
36
  }
37
- // The lane writes exactly one terminal run's ledgers/evidence at fixed paths in the run root.
37
+ // The route writes exactly one terminal run's ledgers/evidence at fixed paths in the run root.
38
38
  const ledgers = await readSafeRunArtifactJson(runPaths, TERMINAL_LEDGERS_ARTIFACT);
39
39
  if (!isRecord(ledgers) || ledgers.schema !== "humanish.terminal-ledgers.v1") {
40
40
  findings.push(`missing or malformed ${TERMINAL_LEDGERS_ARTIFACT} (humanish.terminal-ledgers.v1)`);
41
41
  return findings;
42
42
  }
43
- // Substrate lifecycle ledger: must record at least sandbox creation AND teardown.
43
+ // Substrate lifecycle ledger: must record at least sandbox creation and teardown.
44
44
  const lifecycle = Array.isArray(ledgers.lifecycle) ? ledgers.lifecycle : [];
45
45
  if (lifecycle.length === 0) {
46
46
  findings.push("substrate lifecycle ledger is empty (expected create -> ready -> exec -> cleanup events)");
@@ -50,25 +50,25 @@ export async function validateTerminalProductEvidence(runPaths, bundle) {
50
50
  if (!Array.isArray(ledgers.commandLog)) {
51
51
  findings.push("command log ledger is missing or not an array");
52
52
  }
53
- // Interventions ledger: must be PRESENT (an array). Empty is valid and expected (stdin disabled,
54
- // no assisted-input path) — but absent fails, so an assisted run can never masquerade as one
53
+ // Interventions ledger: must be present (an array). Empty is valid and expected (stdin disabled,
54
+ // no assisted-input path), but absent fails, so an assisted run can never masquerade as one
55
55
  // without an interventions record.
56
56
  if (!Array.isArray(ledgers.interventions)) {
57
57
  findings.push("interventions ledger is missing (an empty array is required-present, not optional)");
58
58
  }
59
- // Cleanup proof: the sandbox must be killed and proven reclaimed BY EXACT ID (remaining===0).
59
+ // Cleanup proof: the sandbox must be killed and proven reclaimed by exact ID (remaining===0).
60
60
  // humanish never calls Sandbox.list to derive this field; a live run that cannot prove teardown
61
61
  // fails closed (remaining===1 still-present-unconfirmed, remaining===-1 kill(id) itself
62
- // failed -- the server-side kill-on-timeout is the backstop for both).
62
+ // failed; the server-side kill-on-timeout is the backstop for both).
63
63
  const cleanup = isRecord(ledgers.cleanup) ? ledgers.cleanup : undefined;
64
64
  if (!cleanup) {
65
65
  findings.push("cleanup proof is missing");
66
66
  }
67
67
  else if (cleanup.killed !== true || cleanup.remaining !== 0) {
68
- findings.push(`cleanup not proven by id (killed=${String(cleanup.killed)}, remaining=${String(cleanup.remaining)}); a run that cannot prove sandbox teardown fails closed`);
68
+ findings.push(`sandbox cleanup is not proven by id (killed=${String(cleanup.killed)}, remaining=${String(cleanup.remaining)}), so the run cannot pass`);
69
69
  }
70
- // The redacted exec-stream + normalized transcript artifacts must be WRITTEN (the producer
71
- // always writes them on the live path, even empty for a no-output blocked run — so absence is a
70
+ // The redacted exec-stream + normalized transcript artifacts must be written (the producer
71
+ // always writes them on the live path, even empty for a no-output blocked run, so absence is a
72
72
  // real evidence gap, while emptiness is legitimate and keeps blocked runs verifiable).
73
73
  if (!(await readSafeRunArtifactBytes(runPaths, TERMINAL_EVENTS_ARTIFACT))) {
74
74
  findings.push(`missing terminal event stream artifact (${TERMINAL_EVENTS_ARTIFACT})`);
@@ -76,7 +76,7 @@ export async function validateTerminalProductEvidence(runPaths, bundle) {
76
76
  if (!(await readSafeRunArtifactBytes(runPaths, TERMINAL_TRANSCRIPT_ARTIFACT))) {
77
77
  findings.push(`missing normalized terminal transcript artifact (${TERMINAL_TRANSCRIPT_ARTIFACT})`);
78
78
  }
79
- // The provider-neutral actor trace must be on the terminal lane with redaction passed.
79
+ // The provider-neutral actor trace must have `lane: "terminal"` with redaction passed.
80
80
  for (const stream of terminalStreams) {
81
81
  const traceArtifact = stream.artifacts.find((artifact) => artifact.kind === "trace");
82
82
  const tracePath = traceArtifact?.path ?? "actor.json";
@@ -94,19 +94,19 @@ export async function validateTerminalProductEvidence(runPaths, bundle) {
94
94
  return findings;
95
95
  }
96
96
  /**
97
- * Verifier for the terminal cost ledger and no-spend proof. A LIVE terminal-product bundle MUST
98
- * carry both (fail closed if absent on a live run). The load-bearing honesty check: the no-spend
99
- * proof may NOT claim zero on a line the ledger marks `null`
100
- * (UNMEASURED) — a proof can never claim more than the ledger measured. And the observed KNOWN
101
- * spend may not exceed the declared cap (the proof's own maxUsd) — fail-closed, not advisory.
102
- * The null discipline is enforced here too: a present line's `usd` must be a number OR literally
97
+ * Verifier for the terminal cost ledger and no-spend proof. A live terminal-product bundle must
98
+ * carry both (fail closed if absent on a live run). The main check: the no-spend
99
+ * proof may not claim zero on a line the ledger marks `null`
100
+ * (unmeasured): a proof can never claim more than the ledger measured. And the observed known
101
+ * spend may not exceed the declared cap (the proof's own maxUsd): fail-closed, not advisory.
102
+ * The null discipline is enforced here too: a present line's `usd` must be a number or literally
103
103
  * null (never undefined/omitted), so "not measured" can never be silently dropped.
104
104
  */
105
105
  function validateTerminalCostEvidence(ledgers) {
106
106
  const findings = [];
107
107
  const cost = isRecord(ledgers.cost) ? ledgers.cost : undefined;
108
108
  if (!cost || cost.schema !== "humanish.terminal-cost-ledger.v1") {
109
- findings.push("missing or malformed cost ledger (humanish.terminal-cost-ledger.v1) — a live terminal-product run must derive a cost ledger");
109
+ findings.push("missing or malformed cost ledger (humanish.terminal-cost-ledger.v1): a live terminal-product run must record one");
110
110
  return findings;
111
111
  }
112
112
  const lines = isRecord(cost.lines) ? cost.lines : undefined;
@@ -114,8 +114,8 @@ function validateTerminalCostEvidence(ledgers) {
114
114
  findings.push("cost ledger has no lines block");
115
115
  return findings;
116
116
  }
117
- // The null discipline: every applicable category line must be PRESENT with `usd` as a number or
118
- // literally null. `undefined`/omitted is forbidden — that would silently lose the "not measured"
117
+ // The null discipline: every applicable category line must be present with `usd` as a number or
118
+ // literally null. `undefined`/omitted is forbidden because it would silently lose the "not measured"
119
119
  // distinction. Track which categories the ledger marks null so the no-spend proof cannot lie about them.
120
120
  const nullCategories = new Set();
121
121
  for (const category of COST_CATEGORIES) {
@@ -136,28 +136,28 @@ function validateTerminalCostEvidence(ledgers) {
136
136
  }
137
137
  const proof = isRecord(ledgers.noSpendProof) ? ledgers.noSpendProof : undefined;
138
138
  if (!proof || proof.schema !== "humanish.terminal-no-spend-proof.v1") {
139
- findings.push("missing or malformed no-spend proof (humanish.terminal-no-spend-proof.v1) — the no-spend proof must be derived from the ledger");
139
+ findings.push("missing or malformed no-spend proof (humanish.terminal-no-spend-proof.v1): a live terminal-product run must derive one from its cost ledger");
140
140
  return findings;
141
141
  }
142
- // HONESTY CHECK: the no-spend proof must NOT claim zero on a line the ledger marks `null`. A
142
+ // Claim check: the no-spend proof must not claim zero on a line the ledger marks `null`. A
143
143
  // knownZeroLines entry that is actually unmeasured in the ledger means the proof claimed more than
144
- // it measured — fail closed.
144
+ // it measured, so it fails closed.
145
145
  const knownZeroLines = Array.isArray(proof.knownZeroLines) ? proof.knownZeroLines : [];
146
146
  for (const category of knownZeroLines) {
147
147
  if (nullCategories.has(String(category))) {
148
- findings.push(`no-spend proof claims zero on line "${String(category)}" but the cost ledger marks it null (UNMEASURED); a proof may not claim zero on a line it did not measure`);
148
+ findings.push(`the no-spend proof claims zero on line "${String(category)}", but the cost ledger marks that line unmeasured (null), and a proof may not claim zero for a line it did not measure`);
149
149
  }
150
150
  }
151
- // FAIL-CLOSED CAP: observed KNOWN spend may not exceed the declared cap (the proof's maxUsd). The
151
+ // Fail-closed cap: observed known spend may not exceed the declared cap (the proof's maxUsd). The
152
152
  // ledger's knownTotalUsd is the measured spend; null lines do not count toward it (and the proof
153
153
  // reports them as unmeasured). A satisfied proof whose known total exceeds its cap is contradictory.
154
154
  const knownTotalUsd = typeof cost.knownTotalUsd === "number" ? cost.knownTotalUsd : Number.NaN;
155
155
  const maxUsd = typeof proof.maxUsd === "number" ? proof.maxUsd : null;
156
156
  if (maxUsd !== null && Number.isFinite(knownTotalUsd) && knownTotalUsd > maxUsd) {
157
- findings.push(`observed KNOWN spend ${knownTotalUsd} USD exceeds the declared cap maxUsd=${maxUsd}; the run must fail closed, not verify green`);
157
+ findings.push(`measured spend ${knownTotalUsd} USD is over the declared cap maxUsd=${maxUsd}, so the run cannot pass verification`);
158
158
  }
159
159
  // A proof that asserts `satisfied:true` while a known line is non-zero (knownNonZeroLines) is
160
- // self-contradictory — reject it (the proof's own derived state must be internally consistent).
160
+ // self-contradictory; reject it (the proof's own derived state must be internally consistent).
161
161
  const knownNonZeroLines = Array.isArray(proof.knownNonZeroLines) ? proof.knownNonZeroLines : [];
162
162
  if (proof.satisfied === true && knownNonZeroLines.length > 0) {
163
163
  findings.push(`no-spend proof claims satisfied:true but reports known non-zero spend lines (${knownNonZeroLines.map(String).join(", ")})`);
@@ -205,7 +205,7 @@ export async function validateCodexAppServerEvidence(runPaths, bundle) {
205
205
  }
206
206
  return findings;
207
207
  }
208
- // Trace item kinds that show the actor DID something (drove UI, ran a command, called a tool,
208
+ // Trace item kinds that show the actor did something (drove UI, ran a command, called a tool,
209
209
  // changed a file). reasoning/screenshot/plan/notice items are observation, not engagement.
210
210
  const ACTION_BEARING_ACTOR_ITEM_KINDS = new Set([
211
211
  "ui_action",
@@ -214,15 +214,15 @@ const ACTION_BEARING_ACTOR_ITEM_KINDS = new Set([
214
214
  "file_change",
215
215
  ]);
216
216
  /**
217
- * Independent mirror of the producer-side no-engagement guard (routes/computer-use/lanes.ts): a
218
- * LIVE actor trace claiming goal_satisfied while carrying zero action-bearing items AND zero
219
- * message items is a hollow run — the actor neither did nor said anything — and must not verify as
220
- * evidence (invariant 4: evidence verifies fail-closed). Live-vs-dry-run is judged exactly as the
221
- * producer judges it, from bundle.mode alone; dry-run/contract bundles legitimately carry no
222
- * actions and stay exempt. Engagement is accepted from EITHER surface — itemized trace items or the
223
- * producer's counts — because providers differ in what they itemize; a hollow run reports zero on
224
- * both. The trace is read defensively: isRunStream does not validate the actor seam, and verify
225
- * must not throw on a malformed one.
217
+ * Independent mirror of the producer-side no-engagement guard
218
+ * (routes/computer-use/participant-execution.ts): a live actor trace claiming goal_satisfied while
219
+ * carrying zero action-bearing items and zero message items is a hollow run (the actor neither did
220
+ * nor said anything) and must not verify as evidence: evidence verifies fail-closed.
221
+ * Live-vs-dry-run is judged exactly as the producer judges it, from bundle.mode alone;
222
+ * dry-run/contract bundles legitimately carry no actions and stay exempt. Engagement is accepted
223
+ * from either surface (itemized trace items or the producer's counts), because providers differ in
224
+ * what they itemize; a hollow run reports zero on both. The trace is read defensively: isRunStream
225
+ * does not validate the actor seam, and verify must not throw on a malformed one.
226
226
  */
227
227
  export function noEngagementActorFindings(bundle) {
228
228
  if (bundle.mode !== "live") {
@@ -264,7 +264,7 @@ function hasStopWhenObservationEvidence(items, screenshotCount) {
264
264
  item.screenshotRef.path.length > 0);
265
265
  if (!hasScreenshot)
266
266
  return false;
267
- // A matched stopWhen, or a declared dwell window that ended the session (#510): both are
267
+ // A matched stopWhen, or a declared dwell window that ended the session: both are
268
268
  // structured, harness-owned completion, with frames behind them.
269
269
  return items.some((item) => isRecord(item) &&
270
270
  item.kind === "notice" &&
@@ -6,15 +6,15 @@ export declare function missingLocalEvidenceArtifacts(runPaths: PreparedRunArtif
6
6
  /**
7
7
  * The PNG frames that actor traces register as stream screenshots, relative to the run root.
8
8
  * RAW_SCREENSHOTS grades these, so the public-safety scan does not report them as unread. Only
9
- * frames under screenshots/ count: the computer-use lane writer and the scripted-browser steps
9
+ * frames under screenshots/ count: the computer-use frame writer and the scripted-browser steps
10
10
  * write every frame there, and nothing else in the harness does. A trace reference elsewhere (an
11
11
  * adapter's PNG, say) stays required evidence but goes to UNSCANNED_ARTIFACT.
12
12
  */
13
13
  export declare function streamScreenshotPaths(bundle: RunBundle): Set<string>;
14
14
  export declare function invalidRunEvidenceReferences(bundle: RunBundle): string[];
15
15
  /**
16
- * redaction.screenshots: "raw" is the SUPPORTED local default (full-fidelity frames in
17
- * gitignored .humanish), not a verify failure — but ok: true must never read as "share-ready",
16
+ * redaction.screenshots: "raw" is the supported local default (full-fidelity frames in
17
+ * gitignored .humanish), not a verify failure, but ok: true must never read as "share-ready",
18
18
  * so verify surfaces the posture as a warning in both human and JSON output. Read defensively
19
19
  * for the same reason as noEngagementActorFindings.
20
20
  */
@@ -1,7 +1,7 @@
1
1
  import { lstat, readdir } from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import { isRedactedFrameShape, screenshotEvidenceError } from "../evidence/image.js";
4
- import { isStudyAnalysisRecordPath } from "../analysis/sharing.js";
4
+ import { isAnalysisRecordPath } from "../analysis/sharing.js";
5
5
  import { scanEncodedTextCached } from "../evidence/encoded-text.js";
6
6
  import { readPlainText } from "../evidence/plain-text.js";
7
7
  import { containsSensitive } from "../evidence/redaction.js";
@@ -130,7 +130,7 @@ function declaredActorScreenshotReferences(stream) {
130
130
  /**
131
131
  * The PNG frames that actor traces register as stream screenshots, relative to the run root.
132
132
  * RAW_SCREENSHOTS grades these, so the public-safety scan does not report them as unread. Only
133
- * frames under screenshots/ count: the computer-use lane writer and the scripted-browser steps
133
+ * frames under screenshots/ count: the computer-use frame writer and the scripted-browser steps
134
134
  * write every frame there, and nothing else in the harness does. A trace reference elsewhere (an
135
135
  * adapter's PNG, say) stays required evidence but goes to UNSCANNED_ARTIFACT.
136
136
  */
@@ -213,8 +213,8 @@ export function invalidRunEvidenceReferences(bundle) {
213
213
  return findings.slice(0, MAX_REPORTED_FINDINGS);
214
214
  }
215
215
  /**
216
- * redaction.screenshots: "raw" is the SUPPORTED local default (full-fidelity frames in
217
- * gitignored .humanish), not a verify failure — but ok: true must never read as "share-ready",
216
+ * redaction.screenshots: "raw" is the supported local default (full-fidelity frames in
217
+ * gitignored .humanish), not a verify failure, but ok: true must never read as "share-ready",
218
218
  * so verify surfaces the posture as a warning in both human and JSON output. Read defensively
219
219
  * for the same reason as noEngagementActorFindings.
220
220
  */
@@ -224,7 +224,7 @@ export function rawScreenshotPostureWarnings(bundle, redactedShapeFrames) {
224
224
  return [];
225
225
  }
226
226
  return [
227
- `Screenshots are FULL-FIDELITY (raw) or carry no redaction claim on ${rawStreamIds.join(", ")} — supported for local use, NOT publish-safe as-is. Verify ok does not mean share-ready; set policies.redactScreenshots: true to blur a share-as-is bundle.`,
227
+ `Screenshots on ${rawStreamIds.join(", ")} are unblurred, or do not say whether they were blurred. That is fine for local use, but the bundle is not safe to publish as it is: verify ok does not mean share-ready. Set policies.redactScreenshots: true to blur screenshots in a bundle you plan to share.`,
228
228
  ];
229
229
  }
230
230
  /**
@@ -302,7 +302,7 @@ async function scanRunPublicSafetyDirectory(runPaths, relativeDirectory, finding
302
302
  const relativePath = relativeDirectory ? `${relativeDirectory}/${entryName}` : entryName;
303
303
  const stats = await lstat(path.join(current, entryName), { bigint: true }).catch(() => null);
304
304
  const selectedFindings = !stats?.isDirectory() &&
305
- (relativePath === "observer/study-analysis.json" || isStudyAnalysisRecordPath(relativePath))
305
+ (relativePath === "observer/study-analysis.json" || isAnalysisRecordPath(relativePath))
306
306
  ? derivedFindings
307
307
  : findings;
308
308
  if (isRiskyPublicArtifactPath(relativePath) || containsSensitive(relativePath)) {
@@ -0,0 +1,9 @@
1
+ import type { RunBundle } from "../run/bundle.js";
2
+ /**
3
+ * The median prompt of the last three turns over that of turns 2 to 4, from a trace's
4
+ * `tokenUsage.turns`. Turn 1 is left out: it carries the instructions alone. Undefined when fewer
5
+ * than six turns report their input.
6
+ */
7
+ export declare function contextGrowth(turns: readonly unknown[]): number | undefined;
8
+ /** One warning per live participant whose prompt stayed the same size from turn 2 on. */
9
+ export declare function flatContextWarnings(bundle: RunBundle): string[];
@@ -0,0 +1,62 @@
1
+ import { ACTOR_TRACE_SCHEMA } from "../actors/contract.js";
2
+ import { isRecord } from "../run/type-guards.js";
3
+ /** Fewer turns with usage than this say nothing about whether the prompt grew. */
4
+ const MIN_TURNS = 6;
5
+ /**
6
+ * A participant that remembers sends a longer prompt each turn: every turn adds a screenshot and a
7
+ * reply. Over 113 participant traces from live runs (OpenAI computer-use, the Codex participant and
8
+ * the Claude session), the median prompt of the last three turns was at least 1.21 times that of
9
+ * turns 2 to 4. A participant that carries only its last turn stays flat: about 3,100 tokens from
10
+ * turn 2 to turn 527 in one zero-data-retention run, a ratio near 1.0.
11
+ */
12
+ const MIN_GROWTH = 1.1;
13
+ /**
14
+ * The whole prompt one turn sent. `input` includes the cached parts, except in Claude session
15
+ * traces written before that was fixed, which recorded the uncached part alone; there the cached
16
+ * parts are larger than `input`, and the three are added.
17
+ */
18
+ function promptTokens(turn) {
19
+ if (!isRecord(turn) || typeof turn.input !== "number")
20
+ return undefined;
21
+ const cached = typeof turn.cachedInput === "number" ? turn.cachedInput : 0;
22
+ const written = typeof turn.cacheWriteInput === "number" ? turn.cacheWriteInput : 0;
23
+ return cached + written > turn.input ? turn.input + cached + written : turn.input;
24
+ }
25
+ function median(values) {
26
+ const sorted = [...values].sort((a, b) => a - b);
27
+ const middle = Math.floor(sorted.length / 2);
28
+ return sorted.length % 2 === 1 ? sorted[middle] : (sorted[middle - 1] + sorted[middle]) / 2;
29
+ }
30
+ /**
31
+ * The median prompt of the last three turns over that of turns 2 to 4, from a trace's
32
+ * `tokenUsage.turns`. Turn 1 is left out: it carries the instructions alone. Undefined when fewer
33
+ * than six turns report their input.
34
+ */
35
+ export function contextGrowth(turns) {
36
+ const sizes = turns.map(promptTokens);
37
+ if (sizes.length < MIN_TURNS || sizes.some((size) => size === undefined))
38
+ return undefined;
39
+ const later = sizes.slice(1);
40
+ const early = median(later.slice(0, 3));
41
+ return early > 0 ? median(later.slice(-3)) / early : undefined;
42
+ }
43
+ /** One warning per live participant whose prompt stayed the same size from turn 2 on. */
44
+ export function flatContextWarnings(bundle) {
45
+ if (bundle.mode !== "live")
46
+ return [];
47
+ const warnings = [];
48
+ for (const stream of bundle.streams) {
49
+ const trace = stream.actor;
50
+ if (!isRecord(trace) || trace.schema !== ACTOR_TRACE_SCHEMA)
51
+ continue;
52
+ const turns = isRecord(trace.tokenUsage) ? trace.tokenUsage.turns : undefined;
53
+ if (!Array.isArray(turns))
54
+ continue;
55
+ const growth = contextGrowth(turns);
56
+ if (growth === undefined || growth >= MIN_GROWTH)
57
+ continue;
58
+ const near = Math.round(median(turns.slice(1).map((turn) => promptTokens(turn))));
59
+ warnings.push(`${stream.id}: its context did not grow. Its prompt stayed near ${near} tokens from turn 2 to turn ${turns.length}, so it likely answered each turn without the earlier ones.`);
60
+ }
61
+ return warnings;
62
+ }
@@ -1,5 +1,5 @@
1
1
  import type { RunBundle } from "../run/bundle.js";
2
- /** Account lanes must never acquire a price through an aggregate or ambiguous model line. */
2
+ /** Account-billed participants must never acquire a price through an aggregate or ambiguous model line. */
3
3
  export declare function contradictsAccountBilling(streams: readonly {
4
4
  id?: string;
5
5
  laneId?: string;
@@ -18,12 +18,12 @@ export declare function contradictsAccountBilling(streams: readonly {
18
18
  breakdown?: unknown;
19
19
  } | undefined): boolean;
20
20
  /**
21
- * Verify the LABELING/provenance of any cost figure a bundle CLAIMS — never its magnitude. Returns
22
- * [] (pass) unless a dollar claim lacks its provenance (invariant 6) or a total misreports its
23
- * known lines. ABSENCE always passes (fail-open on display, discipline #3): a bundle with no cost,
24
- * a null estimate, or a lane without estimatedCost is fine. A NON-NULL figure must carry its
25
- * ratesAsOf date + source; a NUMBER total must equal round6(sum of ONLY the non-null lines) and a
26
- * null line may never be coerced to 0. A null estimate must be declared honestly (a reason + null
21
+ * Verify the labeling/provenance of any cost figure a bundle claims, and never its magnitude. Returns
22
+ * [] (pass) unless a dollar claim lacks its provenance or a total misreports its
23
+ * known lines. Absence always passes (fail-open on display): a bundle with no cost,
24
+ * a null estimate, or a participant without estimatedCost is fine. A non-null figure must carry its
25
+ * ratesAsOf date + source; a number total must equal round6(sum of only the non-null lines) and a
26
+ * null line may never be coerced to 0. A null estimate must be declared (a reason + null
27
27
  * ratesAsOf), mirroring the terminal no-spend proof's null-discipline. Account-billed participants
28
28
  * also have their execution profile and provider request receipts checked here.
29
29
  */
@@ -2,7 +2,7 @@
2
2
  // totals match their known lines, and account-billed participants never acquire a price.
3
3
  import { validActorExecutionProfile, validActorProviderRequests } from "../actors/contract.js";
4
4
  import { round6 } from "../run/pricing.js";
5
- /** Account lanes must never acquire a price through an aggregate or ambiguous model line. */
5
+ /** Account-billed participants must never acquire a price through an aggregate or ambiguous model line. */
6
6
  export function contradictsAccountBilling(streams, cost) {
7
7
  const account = (stream) => (stream.liveActor?.executionProfile ?? stream.actor?.executionProfile)?.billing ===
8
8
  "account-unknown";
@@ -22,12 +22,12 @@ export function contradictsAccountBilling(streams, cost) {
22
22
  });
23
23
  }
24
24
  /**
25
- * Verify the LABELING/provenance of any cost figure a bundle CLAIMS — never its magnitude. Returns
26
- * [] (pass) unless a dollar claim lacks its provenance (invariant 6) or a total misreports its
27
- * known lines. ABSENCE always passes (fail-open on display, discipline #3): a bundle with no cost,
28
- * a null estimate, or a lane without estimatedCost is fine. A NON-NULL figure must carry its
29
- * ratesAsOf date + source; a NUMBER total must equal round6(sum of ONLY the non-null lines) and a
30
- * null line may never be coerced to 0. A null estimate must be declared honestly (a reason + null
25
+ * Verify the labeling/provenance of any cost figure a bundle claims, and never its magnitude. Returns
26
+ * [] (pass) unless a dollar claim lacks its provenance or a total misreports its
27
+ * known lines. Absence always passes (fail-open on display): a bundle with no cost,
28
+ * a null estimate, or a participant without estimatedCost is fine. A non-null figure must carry its
29
+ * ratesAsOf date + source; a number total must equal round6(sum of only the non-null lines) and a
30
+ * null line may never be coerced to 0. A null estimate must be declared (a reason + null
31
31
  * ratesAsOf), mirroring the terminal no-spend proof's null-discipline. Account-billed participants
32
32
  * also have their execution profile and provider request receipts checked here.
33
33
  */
@@ -76,7 +76,7 @@ function costSummaryFindings(cost) {
76
76
  }
77
77
  }
78
78
  else if (anyKnown) {
79
- // Every-line-null is the only honest null total; a null total beside a known line hides spend.
79
+ // Every-line-null is the only valid null total; a null total beside a known line hides spend.
80
80
  findings.push("run cost estimatedTotalUsd is null but a breakdown line carries a known (non-null) cost");
81
81
  }
82
82
  return findings;
@@ -117,7 +117,7 @@ function participantEstimateFindings(stream) {
117
117
  }
118
118
  }
119
119
  else {
120
- // Declared-absent honesty (invariant 5): a null estimate must say WHY and carry null ratesAsOf.
120
+ // Declared absence: a null estimate must say why and carry null ratesAsOf.
121
121
  if (estimate.reason === undefined) {
122
122
  findings.push(`participant ${participantLabel} records a null cost estimate without a reason`);
123
123
  }
@@ -2,6 +2,6 @@ import type { RunBundle } from "../run/bundle.js";
2
2
  import type { PreparedRunArtifactPaths } from "../run/paths.js";
3
3
  /**
4
4
  * One warning when the run is not finished, by the run index's rule: its status record when it
5
- * has a usable one, else a simulation still `running` in its bundle. Empty for a finished run.
5
+ * has a usable one, else a participant still `running` in its bundle's `simulations[]`. Empty for a finished run.
6
6
  */
7
7
  export declare function runNotFinishedWarnings(runPaths: PreparedRunArtifactPaths, bundle: RunBundle, nowMs?: number): Promise<string[]>;
@@ -13,7 +13,7 @@ const RUN_NOT_FINISHED = "RUN_NOT_FINISHED";
13
13
  const GONE_STATES = new Set(["killed", "already-gone"]);
14
14
  /**
15
15
  * One warning when the run is not finished, by the run index's rule: its status record when it
16
- * has a usable one, else a simulation still `running` in its bundle. Empty for a finished run.
16
+ * has a usable one, else a participant still `running` in its bundle's `simulations[]`. Empty for a finished run.
17
17
  */
18
18
  export async function runNotFinishedWarnings(runPaths, bundle, nowMs = Date.now()) {
19
19
  const runId = path.basename(runPaths.absoluteRunRoot);
@@ -29,6 +29,9 @@ export async function runNotFinishedWarnings(runPaths, bundle, nowMs = Date.now(
29
29
  else if (liveness === "running") {
30
30
  seen.push(`${RUN_STATUS_FILE} state is ${record.state} and its owner updated it at ${record.updatedAt}, so the run may still be writing`);
31
31
  }
32
+ else if (record.state === "interrupted") {
33
+ seen.push(`${RUN_STATUS_FILE} state is interrupted${record.signal === undefined ? "" : ` by ${record.signal}`} at ${record.updatedAt}`);
34
+ }
32
35
  else {
33
36
  seen.push(`${RUN_STATUS_FILE} state is ${record.state} and its owner stopped updating it at ${record.updatedAt}`);
34
37
  }
@@ -1,3 +1,3 @@
1
1
  import type { RunBundle } from "../run/bundle.js";
2
- /** A rerun bundle must link each selected lane to its prior status and a fan-out rerun event. */
2
+ /** A rerun bundle must link each selected participant to its prior status and a fan-out rerun event. */
3
3
  export declare function rerunLineageFindings(bundle: RunBundle): string[];
@@ -1,4 +1,4 @@
1
- /** A rerun bundle must link each selected lane to its prior status and a fan-out rerun event. */
1
+ /** A rerun bundle must link each selected participant to its prior status and a fan-out rerun event. */
2
2
  export function rerunLineageFindings(bundle) {
3
3
  const rerun = bundle.rerun;
4
4
  if (!rerun) {
@@ -1,8 +1,8 @@
1
1
  import type { RunBundle } from "../run/bundle.js";
2
2
  import { type SharedWorldEvidence } from "../run/shared-world-evidence.js";
3
3
  /**
4
- * CONCURRENT branch: N personas drove ONE getHost-exposed plane at once. Verify fail-closed: the
5
- * shape (laneWindows + stateSeries + outcomes, NO timeline); the required and forbidden
4
+ * Concurrent branch: N personas drove one getHost-exposed plane at once. Verify fail-closed: the
5
+ * shape (laneWindows + stateSeries + outcomes, no timeline); the required and forbidden
6
6
  * attributionLimits; the harness-minted getHost target every actor drove; the synthetic-subject
7
7
  * provenance gate; digest-only state series with the allowed-keys tripwire; single-plane
8
8
  * provenance; and the concurrency-on-pass gate (genuine overlap and a state delta at or after an