humanish 0.106.0 → 0.107.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 (459) hide show
  1. package/AGENTS.md +4 -2
  2. package/ARCHITECTURE.md +17 -16
  3. package/CHANGELOG.md +24 -0
  4. package/CONTEXT.md +42 -39
  5. package/CONTRIBUTING.md +8 -6
  6. package/README.md +8 -3
  7. package/dist/actors/codex/app-server-client.js +2 -1
  8. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  9. package/dist/actors/codex/app-server-trace.js +1 -3
  10. package/dist/actors/codex/app-server.js +2 -1
  11. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  12. package/dist/actors/codex/protocol-compat.js +357 -0
  13. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  14. package/dist/actors/codex/protocol-contract.js +471 -0
  15. package/dist/actors/codex/qualified-versions.d.ts +31 -4
  16. package/dist/actors/codex/qualified-versions.js +51 -6
  17. package/dist/actors/codex/restricted-executable.d.ts +24 -0
  18. package/dist/actors/codex/restricted-executable.js +97 -22
  19. package/dist/actors/codex/restricted-launch.d.ts +7 -1
  20. package/dist/actors/codex/restricted-launch.js +42 -3
  21. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  22. package/dist/actors/codex/restricted-notifications.js +277 -0
  23. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  24. package/dist/actors/codex/restricted-participant.js +60 -2
  25. package/dist/actors/codex/restricted-policy.d.ts +9 -1
  26. package/dist/actors/codex/restricted-session.d.ts +14 -1
  27. package/dist/actors/codex/restricted-session.js +50 -17
  28. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  29. package/dist/actors/codex/restricted-transport.js +139 -27
  30. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  31. package/dist/actors/codex/restricted-turn.js +43 -30
  32. package/dist/actors/computer-use/actor.d.ts +1 -1
  33. package/dist/actors/computer-use/actor.js +4 -4
  34. package/dist/actors/computer-use/loop/backstop.js +1 -1
  35. package/dist/actors/computer-use/loop/ending.d.ts +2 -2
  36. package/dist/actors/computer-use/loop/ending.js +2 -2
  37. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  38. package/dist/actors/computer-use/loop/spend.js +3 -3
  39. package/dist/actors/computer-use/loop/trace.js +2 -2
  40. package/dist/actors/computer-use/loop/types.d.ts +14 -5
  41. package/dist/actors/computer-use/loop.js +4 -4
  42. package/dist/actors/computer-use/openai-provider.d.ts +1 -1
  43. package/dist/actors/computer-use/openai-provider.js +2 -2
  44. package/dist/actors/contract.d.ts +10 -8
  45. package/dist/actors/contract.js +7 -1
  46. package/dist/actors/local-agent/cli.js +1 -1
  47. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  48. package/dist/actors/scripted-browser/journey.js +15 -4
  49. package/dist/actors/scripted-browser/steps.js +18 -0
  50. package/dist/actors/scripted-browser/types.d.ts +11 -1
  51. package/dist/actors/stop-conditions.js +1 -3
  52. package/dist/analysis/automatic-completion.d.ts +13 -8
  53. package/dist/analysis/automatic-completion.js +14 -8
  54. package/dist/analysis/automatic-config.d.ts +1 -1
  55. package/dist/analysis/automatic-config.js +2 -2
  56. package/dist/analysis/automatic.d.ts +10 -4
  57. package/dist/analysis/automatic.js +17 -13
  58. package/dist/analysis/diagnostics.d.ts +23 -0
  59. package/dist/analysis/diagnostics.js +112 -0
  60. package/dist/analysis/evidence-sources.js +2 -2
  61. package/dist/analysis/evidence.js +6 -6
  62. package/dist/analysis/execute.d.ts +7 -1
  63. package/dist/analysis/execute.js +39 -12
  64. package/dist/analysis/job.d.ts +8 -5
  65. package/dist/analysis/job.js +15 -14
  66. package/dist/analysis/load.d.ts +1 -1
  67. package/dist/analysis/load.js +5 -5
  68. package/dist/analysis/provider.d.ts +9 -1
  69. package/dist/analysis/restricted-codex.d.ts +2 -0
  70. package/dist/analysis/restricted-codex.js +10 -1
  71. package/dist/analysis/service.d.ts +2 -0
  72. package/dist/analysis/service.js +31 -12
  73. package/dist/analysis/sharing.d.ts +2 -2
  74. package/dist/analysis/sharing.js +5 -5
  75. package/dist/analysis/store-executions.d.ts +5 -5
  76. package/dist/analysis/store-executions.js +12 -12
  77. package/dist/analysis/store.d.ts +4 -4
  78. package/dist/analysis/store.js +13 -13
  79. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  80. package/dist/cli/commands/analysis-signals.js +4 -1
  81. package/dist/cli/commands/analyze.js +4 -2
  82. package/dist/cli/commands/comms.js +8 -1
  83. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  84. package/dist/cli/commands/lab-route-computer-use.js +26 -14
  85. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  86. package/dist/cli/commands/lab-route-preview.js +3 -4
  87. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  88. package/dist/cli/commands/lab-route-run.js +6 -2
  89. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  90. package/dist/cli/commands/lab-route-scripted.js +0 -1
  91. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  92. package/dist/cli/commands/lab-route-shared-world.js +0 -1
  93. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  94. package/dist/cli/commands/lab-route-terminal.js +0 -1
  95. package/dist/cli/commands/lab-run.js +76 -45
  96. package/dist/cli/commands/lab-scorer.d.ts +0 -2
  97. package/dist/cli/commands/lab.js +12 -6
  98. package/dist/cli/commands/observe.js +22 -0
  99. package/dist/cli/commands/run-signals.d.ts +30 -0
  100. package/dist/cli/commands/run-signals.js +146 -0
  101. package/dist/cli/commands/runs.js +10 -8
  102. package/dist/cli/commands/watch.js +12 -10
  103. package/dist/cli/doctor.d.ts +3 -0
  104. package/dist/cli/doctor.js +10 -2
  105. package/dist/cli/io.d.ts +5 -4
  106. package/dist/cli/io.js +12 -8
  107. package/dist/cli/program.js +3 -3
  108. package/dist/cli/renamed-options.d.ts +11 -0
  109. package/dist/cli/renamed-options.js +18 -0
  110. package/dist/cli/telemetry.d.ts +2 -2
  111. package/dist/cli/telemetry.js +1 -1
  112. package/dist/comms/capture-surface.d.ts +1 -1
  113. package/dist/comms/catch-host.d.ts +1 -1
  114. package/dist/comms/connections.js +4 -4
  115. package/dist/comms/external-evidence.d.ts +27 -0
  116. package/dist/comms/external-evidence.js +93 -0
  117. package/dist/comms/lease-store.js +7 -7
  118. package/dist/comms/types.js +1 -1
  119. package/dist/evidence/browser-hygiene.d.ts +1 -1
  120. package/dist/evidence/browser-hygiene.js +1 -1
  121. package/dist/evidence/redaction.js +1 -1
  122. package/dist/evidence/secret-scrub.d.ts +9 -0
  123. package/dist/evidence/secret-scrub.js +96 -0
  124. package/dist/feedback/draft.js +7 -9
  125. package/dist/feedback/export-bundle.js +4 -4
  126. package/dist/feedback/export.js +9 -9
  127. package/dist/feedback/feedback.d.ts +1 -1
  128. package/dist/index.d.ts +3 -6
  129. package/dist/index.js +3 -6
  130. package/dist/keys/key-resolution.d.ts +3 -1
  131. package/dist/keys/key-resolution.js +18 -16
  132. package/dist/lab/adapter-extension.d.ts +28 -6
  133. package/dist/lab/adapter-extension.js +65 -126
  134. package/dist/lab/adapter-scorer-loader.d.ts +25 -5
  135. package/dist/lab/adapter-scorer-loader.js +24 -0
  136. package/dist/lab/composition-rules.d.ts +2 -0
  137. package/dist/lab/composition-rules.js +35 -26
  138. package/dist/lab/config.js +28 -26
  139. package/dist/lab/device-presets.d.ts +2 -2
  140. package/dist/lab/discover.js +1 -3
  141. package/dist/lab/doctor.d.ts +44 -9
  142. package/dist/lab/doctor.js +149 -41
  143. package/dist/lab/init-plan.js +1 -3
  144. package/dist/lab/keys.js +1 -1
  145. package/dist/lab/lab-deps.d.ts +85 -0
  146. package/dist/lab/lab-deps.js +4 -0
  147. package/dist/lab/parse/actors.js +8 -7
  148. package/dist/lab/parse/comms.js +3 -2
  149. package/dist/lab/parse/execution.js +3 -2
  150. package/dist/lab/parse/subject-state.js +2 -1
  151. package/dist/lab/parse/subject.js +2 -1
  152. package/dist/lab/parse/values.d.ts +0 -1
  153. package/dist/lab/parse/values.js +0 -3
  154. package/dist/lab/persona-resolve.d.ts +3 -3
  155. package/dist/lab/persona-resolve.js +4 -4
  156. package/dist/lab/persona.js +1 -3
  157. package/dist/lab/plan-base.d.ts +6 -2
  158. package/dist/lab/plan-base.js +22 -7
  159. package/dist/lab/plan-participants.d.ts +5 -5
  160. package/dist/lab/plan-participants.js +2 -2
  161. package/dist/lab/plan-types.d.ts +33 -7
  162. package/dist/lab/plan.d.ts +3 -11
  163. package/dist/lab/plan.js +18 -42
  164. package/dist/lab/preflight-result.js +0 -2
  165. package/dist/lab/preflight.d.ts +0 -3
  166. package/dist/lab/preflight.js +1 -1
  167. package/dist/lab/requirements.d.ts +20 -0
  168. package/dist/lab/requirements.js +54 -0
  169. package/dist/lab/route-inputs.d.ts +23 -12
  170. package/dist/lab/route-inputs.js +48 -51
  171. package/dist/lab/routing.d.ts +19 -24
  172. package/dist/lab/routing.js +14 -47
  173. package/dist/lab/run-lab-events.d.ts +6 -11
  174. package/dist/lab/run-lab-events.js +3 -11
  175. package/dist/lab/run-lab-homes.d.ts +64 -0
  176. package/dist/lab/run-lab-homes.js +3 -0
  177. package/dist/lab/run-lab-options.d.ts +12 -66
  178. package/dist/lab/run-lab-options.js +45 -275
  179. package/dist/lab/summary.d.ts +9 -4
  180. package/dist/lab/summary.js +15 -8
  181. package/dist/lab/types.d.ts +132 -132
  182. package/dist/lab/validation.d.ts +15 -15
  183. package/dist/lab/validation.js +28 -28
  184. package/dist/lab/warnings.js +20 -19
  185. package/dist/observer/artifact.d.ts +1 -1
  186. package/dist/observer/artifact.js +3 -3
  187. package/dist/observer/data.js +2 -2
  188. package/dist/observer/render.js +2 -2
  189. package/dist/observer/run-routes.d.ts +1 -1
  190. package/dist/observer/run-routes.js +5 -5
  191. package/dist/observer/serve.d.ts +17 -0
  192. package/dist/observer/serve.js +34 -3
  193. package/dist/observer-app.html +1 -1
  194. package/dist/routes/computer-use/bundle-parts.d.ts +1 -1
  195. package/dist/routes/computer-use/bundle-parts.js +10 -3
  196. package/dist/routes/computer-use/bundle.d.ts +4 -11
  197. package/dist/routes/computer-use/bundle.js +9 -15
  198. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  199. package/dist/routes/computer-use/diagnostics.js +1 -1
  200. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +10 -10
  201. package/dist/routes/computer-use/e2b-desktop/comms.js +11 -14
  202. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  203. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -7
  204. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +13 -13
  205. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -11
  206. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  207. package/dist/routes/computer-use/e2b-desktop/prepare.js +33 -36
  208. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  209. package/dist/routes/computer-use/e2b-desktop/start.js +24 -23
  210. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  211. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  212. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  213. package/dist/routes/computer-use/e2b-desktop/teardown.js +29 -17
  214. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  215. package/dist/routes/computer-use/external-comms.js +19 -43
  216. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  217. package/dist/routes/computer-use/fanout-bundle.js +25 -29
  218. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +25 -19
  219. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  220. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  221. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  222. package/dist/routes/computer-use/live-flush.js +19 -27
  223. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +14 -13
  224. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  225. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  226. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  227. package/dist/routes/computer-use/local-vm.js +39 -66
  228. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  229. package/dist/routes/computer-use/participant-desktop.js +5 -25
  230. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +10 -10
  231. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +35 -22
  232. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  233. package/dist/routes/computer-use/participant-facts.js +12 -1
  234. package/dist/routes/computer-use/participant-model.d.ts +19 -11
  235. package/dist/routes/computer-use/participant-model.js +58 -33
  236. package/dist/routes/computer-use/participant-prompt.d.ts +3 -3
  237. package/dist/routes/computer-use/participant-prompt.js +4 -4
  238. package/dist/routes/computer-use/participant-runs.d.ts +6 -6
  239. package/dist/routes/computer-use/participant-runs.js +8 -8
  240. package/dist/routes/computer-use/plan.d.ts +21 -29
  241. package/dist/routes/computer-use/plan.js +59 -65
  242. package/dist/routes/computer-use/preflight.d.ts +6 -11
  243. package/dist/routes/computer-use/preflight.js +26 -18
  244. package/dist/routes/computer-use/rerun-selection.js +10 -6
  245. package/dist/routes/computer-use/result.d.ts +1 -1
  246. package/dist/routes/computer-use/result.js +40 -30
  247. package/dist/routes/computer-use/route.d.ts +3 -4
  248. package/dist/routes/computer-use/route.js +21 -19
  249. package/dist/routes/computer-use/self-report.d.ts +2 -2
  250. package/dist/routes/computer-use/self-report.js +4 -4
  251. package/dist/routes/computer-use/setup.d.ts +8 -17
  252. package/dist/routes/computer-use/setup.js +98 -86
  253. package/dist/routes/computer-use/single-bundle.d.ts +8 -11
  254. package/dist/routes/computer-use/single-bundle.js +20 -25
  255. package/dist/routes/computer-use/subject-projection.d.ts +5 -7
  256. package/dist/routes/computer-use/subject-projection.js +20 -19
  257. package/dist/routes/computer-use/types.d.ts +169 -211
  258. package/dist/routes/computer-use/types.js +13 -6
  259. package/dist/routes/preview.js +0 -1
  260. package/dist/routes/scripted/bundle.d.ts +3 -6
  261. package/dist/routes/scripted/bundle.js +11 -16
  262. package/dist/routes/scripted/plan.d.ts +5 -7
  263. package/dist/routes/scripted/plan.js +6 -4
  264. package/dist/routes/scripted/result.d.ts +4 -1
  265. package/dist/routes/scripted/result.js +10 -6
  266. package/dist/routes/scripted/route.js +10 -11
  267. package/dist/routes/scripted/scenario.d.ts +1 -1
  268. package/dist/routes/scripted/scenario.js +1 -1
  269. package/dist/routes/scripted/setup.d.ts +3 -2
  270. package/dist/routes/scripted/setup.js +22 -21
  271. package/dist/routes/scripted/subject.d.ts +8 -3
  272. package/dist/routes/scripted/subject.js +11 -6
  273. package/dist/routes/scripted/surface-records.js +1 -1
  274. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  275. package/dist/routes/scripted/surface-sessions.js +4 -4
  276. package/dist/routes/scripted/types.d.ts +19 -36
  277. package/dist/routes/scripted/types.js +1 -2
  278. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +8 -8
  279. package/dist/routes/shared-world/bundle.d.ts +2 -2
  280. package/dist/routes/shared-world/bundle.js +22 -26
  281. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  282. package/dist/routes/shared-world/checkpoints.js +4 -4
  283. package/dist/routes/shared-world/comms.d.ts +5 -4
  284. package/dist/routes/shared-world/comms.js +28 -41
  285. package/dist/routes/shared-world/external-public.d.ts +5 -5
  286. package/dist/routes/shared-world/external-public.js +19 -20
  287. package/dist/routes/shared-world/handoff.d.ts +4 -4
  288. package/dist/routes/shared-world/handoff.js +50 -50
  289. package/dist/routes/shared-world/lobby-code.d.ts +5 -5
  290. package/dist/routes/shared-world/lobby-code.js +13 -13
  291. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +8 -6
  292. package/dist/routes/shared-world/{seats.js → participant-specs.js} +46 -51
  293. package/dist/routes/shared-world/plan.d.ts +2 -6
  294. package/dist/routes/shared-world/plan.js +1 -2
  295. package/dist/routes/shared-world/provenance.d.ts +4 -4
  296. package/dist/routes/shared-world/provenance.js +4 -4
  297. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  298. package/dist/routes/shared-world/provisioned.js +48 -41
  299. package/dist/routes/shared-world/result.js +31 -19
  300. package/dist/routes/shared-world/route.js +37 -41
  301. package/dist/routes/shared-world/setup.d.ts +5 -4
  302. package/dist/routes/shared-world/setup.js +12 -14
  303. package/dist/routes/shared-world/types.d.ts +53 -126
  304. package/dist/routes/shared-world/types.js +2 -2
  305. package/dist/routes/terminal/adapter.d.ts +8 -8
  306. package/dist/routes/terminal/adapter.js +28 -125
  307. package/dist/routes/terminal/bundle.d.ts +7 -12
  308. package/dist/routes/terminal/bundle.js +24 -34
  309. package/dist/routes/terminal/credentials.d.ts +2 -2
  310. package/dist/routes/terminal/credentials.js +16 -16
  311. package/dist/routes/terminal/dry-run.d.ts +1 -1
  312. package/dist/routes/terminal/dry-run.js +9 -11
  313. package/dist/routes/terminal/encoding.d.ts +1 -1
  314. package/dist/routes/terminal/encoding.js +2 -2
  315. package/dist/routes/terminal/ledger.d.ts +6 -6
  316. package/dist/routes/terminal/ledger.js +9 -9
  317. package/dist/routes/terminal/live-finish.d.ts +1 -2
  318. package/dist/routes/terminal/live-finish.js +21 -20
  319. package/dist/routes/terminal/live-sandbox.d.ts +4 -2
  320. package/dist/routes/terminal/live-sandbox.js +25 -21
  321. package/dist/routes/terminal/participant-text.d.ts +23 -0
  322. package/dist/routes/terminal/participant-text.js +165 -0
  323. package/dist/routes/terminal/plan.d.ts +2 -6
  324. package/dist/routes/terminal/plan.js +13 -9
  325. package/dist/routes/terminal/recorder.d.ts +6 -1
  326. package/dist/routes/terminal/recorder.js +12 -4
  327. package/dist/routes/terminal/result.js +4 -4
  328. package/dist/routes/terminal/route.js +26 -26
  329. package/dist/routes/terminal/runtime.d.ts +3 -2
  330. package/dist/routes/terminal/runtime.js +3 -3
  331. package/dist/routes/terminal/sandbox.d.ts +5 -3
  332. package/dist/routes/terminal/sandbox.js +13 -16
  333. package/dist/routes/terminal/session.js +16 -14
  334. package/dist/routes/terminal/token-usage.js +5 -5
  335. package/dist/routes/terminal/trace.d.ts +5 -8
  336. package/dist/routes/terminal/trace.js +9 -64
  337. package/dist/routes/terminal/types.d.ts +85 -93
  338. package/dist/routes/terminal/types.js +9 -4
  339. package/dist/run/active-runs.d.ts +13 -0
  340. package/dist/run/active-runs.js +12 -0
  341. package/dist/run/bundle-shape.d.ts +2 -1
  342. package/dist/run/bundle-shape.js +4 -4
  343. package/dist/run/bundle.d.ts +63 -56
  344. package/dist/run/bundle.js +9 -8
  345. package/dist/run/cost-summary.js +3 -2
  346. package/dist/run/costs.d.ts +6 -6
  347. package/dist/run/costs.js +10 -10
  348. package/dist/run/detail.d.ts +5 -5
  349. package/dist/run/detail.js +6 -6
  350. package/dist/run/dry-run.js +5 -12
  351. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  352. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  353. package/dist/run/feedback-shape.js +1 -1
  354. package/dist/run/judge.d.ts +16 -4
  355. package/dist/run/judge.js +24 -7
  356. package/dist/run/locate.d.ts +2 -0
  357. package/dist/run/locate.js +3 -1
  358. package/dist/run/outcomes.d.ts +3 -3
  359. package/dist/run/outcomes.js +3 -3
  360. package/dist/run/participant-records.d.ts +2 -2
  361. package/dist/run/participant-records.js +2 -2
  362. package/dist/run/paths.js +1 -1
  363. package/dist/run/pricing.d.ts +19 -9
  364. package/dist/run/pricing.js +30 -18
  365. package/dist/run/projection.d.ts +13 -13
  366. package/dist/run/projection.js +8 -8
  367. package/dist/run/reclaim.d.ts +7 -1
  368. package/dist/run/reclaim.js +24 -4
  369. package/dist/run/results.d.ts +1 -1
  370. package/dist/run/run-index.d.ts +1 -1
  371. package/dist/run/run-index.js +11 -11
  372. package/dist/run/run.d.ts +4 -2
  373. package/dist/run/run.js +9 -5
  374. package/dist/run/sandbox-receipts.d.ts +4 -4
  375. package/dist/run/sandbox-receipts.js +4 -4
  376. package/dist/run/shared-world-evidence.d.ts +47 -47
  377. package/dist/run/shared-world-shape.d.ts +3 -3
  378. package/dist/run/shared-world-shape.js +11 -11
  379. package/dist/run/stats.d.ts +5 -5
  380. package/dist/run/stats.js +8 -8
  381. package/dist/run/status.d.ts +16 -6
  382. package/dist/run/status.js +31 -8
  383. package/dist/run/streams.d.ts +26 -19
  384. package/dist/run/terminal-contract.d.ts +5 -5
  385. package/dist/run/terminal-contract.js +4 -4
  386. package/dist/run/transient-comms-secrets.d.ts +5 -0
  387. package/dist/run/transient-comms-secrets.js +12 -0
  388. package/dist/run-lab.d.ts +36 -34
  389. package/dist/run-lab.js +41 -37
  390. package/dist/subject/desktop-cli.d.ts +1 -1
  391. package/dist/subject/desktop-cli.js +1 -1
  392. package/dist/subject/local-tree-archive.d.ts +1 -1
  393. package/dist/subject/local-tree-archive.js +4 -4
  394. package/dist/subject/local-tree.d.ts +2 -2
  395. package/dist/subject/local-tree.js +1 -1
  396. package/dist/subject/node-bootstrap.d.ts +1 -1
  397. package/dist/subject/node-bootstrap.js +4 -4
  398. package/dist/subject/runtime.js +5 -5
  399. package/dist/subject/serve.js +1 -1
  400. package/dist/subject/steps.d.ts +4 -4
  401. package/dist/subject/steps.js +5 -5
  402. package/dist/substrates/desktop-session.d.ts +2 -0
  403. package/dist/substrates/e2b/cdp-probe.d.ts +2 -2
  404. package/dist/substrates/e2b/cdp-probe.js +1 -1
  405. package/dist/substrates/e2b/desktop-browser.d.ts +3 -3
  406. package/dist/substrates/e2b/desktop-browser.js +4 -4
  407. package/dist/substrates/e2b/desktop-cdp.d.ts +7 -7
  408. package/dist/substrates/e2b/desktop-cdp.js +4 -4
  409. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  410. package/dist/substrates/e2b/desktop-geometry.js +3 -3
  411. package/dist/substrates/e2b/desktop-media.js +2 -2
  412. package/dist/substrates/e2b/sandbox.d.ts +2 -0
  413. package/dist/substrates/e2b/sandbox.js +22 -8
  414. package/dist/substrates/e2b/sdk.d.ts +12 -1
  415. package/dist/substrates/e2b/sdk.js +30 -9
  416. package/dist/substrates/local/runtime-host.d.ts +2 -0
  417. package/dist/substrates/local/runtime-host.js +6 -0
  418. package/dist/tui/actions.d.ts +7 -5
  419. package/dist/tui/actions.js +18 -9
  420. package/dist/tui-app.js +42 -42
  421. package/dist/verify/actor.d.ts +10 -10
  422. package/dist/verify/actor.js +15 -15
  423. package/dist/verify/artifacts.d.ts +1 -1
  424. package/dist/verify/artifacts.js +3 -3
  425. package/dist/verify/costs.d.ts +2 -2
  426. package/dist/verify/costs.js +2 -2
  427. package/dist/verify/liveness.d.ts +1 -1
  428. package/dist/verify/liveness.js +4 -1
  429. package/dist/verify/rerun.d.ts +1 -1
  430. package/dist/verify/rerun.js +1 -1
  431. package/dist/verify/shared-world.js +2 -2
  432. package/dist/verify/verify.js +6 -6
  433. package/docs/README.md +1 -1
  434. package/docs/architecture/actor-contract.md +60 -22
  435. package/docs/architecture/desktop-sessions.md +9 -9
  436. package/docs/architecture/external-public-shared-world.md +5 -0
  437. package/docs/architecture/observer.md +4 -4
  438. package/docs/architecture/restricted-codex-analysis.md +40 -4
  439. package/docs/architecture/state-driven-executor.md +4 -5
  440. package/docs/architecture/task-protocol-support.md +3 -5
  441. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +24 -16
  442. package/docs/contracts/run-bundle.md +10 -8
  443. package/docs/contracts/schemas.md +109 -53
  444. package/docs/contracts/study-analysis.md +24 -0
  445. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  446. package/docs/product/automatic-analysis.md +1 -0
  447. package/docs/ramp/README.md +2 -1
  448. package/package.json +4 -4
  449. package/skills/humanish/SKILL.md +3 -2
  450. package/skills/humanish/agents/openai.yaml +1 -1
  451. package/dist/deprecated.d.ts +0 -90
  452. package/dist/deprecated.js +0 -106
  453. package/dist/lab/bag-overrides.d.ts +0 -18
  454. package/dist/lab/bag-overrides.js +0 -121
  455. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  456. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  457. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  458. /package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +0 -0
  459. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -8,6 +8,8 @@ import { ANALYSIS_ID_PATTERN, ANALYSIS_SCHEMA, } from "./types.js";
8
8
  import { INPUT_IMAGE_DATA_URL, createAnalysisProvider, } from "./provider.js";
9
9
  import { checkAnalysisResult, hashAnalysisValue, analysisResponseSchema, analysisResultJsonSchema, validateAnalysisInputMetadata, } from "./validation.js";
10
10
  import { EVIDENCE_LIMITS } from "./evidence.js";
11
+ import { truncatedFrameWarning, unknownNotificationsWarning, } from "../actors/codex/restricted-notifications.js";
12
+ import { protocolAdditionsWarning, protocolIncompatibilityMessage, } from "../actors/codex/protocol-compat.js";
11
13
  export const ANALYSIS_PROMPT_VERSION = "study-evidence-6";
12
14
  const SUPPORTED_ANALYSIS_MODELS = Object.freeze([
13
15
  "gpt-6-astra",
@@ -119,7 +121,7 @@ function inputError(input) {
119
121
  return null;
120
122
  }
121
123
  /**
122
- * Local admission ESTIMATE, not a provider-enforced billed-spend guarantee. No token-count API
124
+ * Local admission estimate, not a provider-enforced billed-spend guarantee. No token-count API
123
125
  * call, credential, or network access. One UTF-8 byte/token for all text/schema plus framing is
124
126
  * intentionally conservative. Each high-detail image is priced from its PNG size by the vision
125
127
  * guide's patch formula (see image-tokens.ts), or at the 3,000-token ceiling when its size or the
@@ -296,26 +298,33 @@ const VALIDATION_FAILURES = Object.freeze({
296
298
  function checkProviderAnalysis(input, value) {
297
299
  try {
298
300
  const parsed = analysisResponseSchema.safeParse(value);
299
- if (!parsed.success)
300
- return { ok: false, error: VALIDATION_FAILURES.ANALYSIS_RESULT_SCHEMA_INVALID };
301
+ if (!parsed.success) {
302
+ const error = VALIDATION_FAILURES.ANALYSIS_RESULT_SCHEMA_INVALID;
303
+ return { ok: false, error, rejected: { error, errors: [], output: value } };
304
+ }
301
305
  let scrubbed;
302
306
  try {
303
307
  scrubbed = scrubGeneratedNarrative(parsed.data);
304
308
  }
305
309
  catch (error) {
310
+ if (!(error instanceof Error && error.message === "ANALYSIS_TRANSIENT_SECRET_IN_STRUCTURE"))
311
+ return { ok: false, error: "analysis_validation_failed_unexpected" };
312
+ const rejected = "analysis_validation_failed_scrub_rejected";
306
313
  return {
307
314
  ok: false,
308
- error: error instanceof Error && error.message === "ANALYSIS_TRANSIENT_SECRET_IN_STRUCTURE"
309
- ? "analysis_validation_failed_scrub_rejected"
310
- : "analysis_validation_failed_unexpected",
315
+ error: rejected,
316
+ rejected: { error: rejected, errors: [], output: value },
311
317
  };
312
318
  }
313
319
  const checked = checkAnalysisResult(input, scrubbed);
314
- if (!checked.ok)
320
+ if (!checked.ok) {
321
+ const error = VALIDATION_FAILURES[checked.errors[0] ?? ""] ?? "analysis_validation_failed_unexpected";
315
322
  return {
316
323
  ok: false,
317
- error: VALIDATION_FAILURES[checked.errors[0] ?? ""] ?? "analysis_validation_failed_unexpected",
324
+ error,
325
+ rejected: { error, errors: [...checked.errors], output: scrubbed },
318
326
  };
327
+ }
319
328
  return checked;
320
329
  }
321
330
  catch {
@@ -403,14 +412,21 @@ function recordProviderUsage(artifact, config, response) {
403
412
  /**
404
413
  * Settle a completed response. Parse the bounded shape first, then scrub and validate again.
405
414
  * Changed exact quotes or expanded field lengths fail closed under the original validator; source
406
- * bytes stay intact. Only an allowlisted stage or first rule code survives; rejected output and
407
- * exceptions do not.
415
+ * bytes stay intact. Only an allowlisted stage or first rule code reaches the artifact; rejected
416
+ * output goes to the caller's diagnostic callback and exceptions go nowhere.
408
417
  */
409
- function settleCompletedOutput(artifact, input, config, admission, response) {
418
+ function settleCompletedOutput(artifact, input, config, admission, response, onRejectedOutput) {
410
419
  const checked = checkProviderAnalysis(input, response.output);
411
420
  if (!checked.ok) {
412
421
  artifact.result = null;
413
422
  artifact.error = checked.error;
423
+ if (checked.rejected)
424
+ try {
425
+ onRejectedOutput?.(checked.rejected);
426
+ }
427
+ catch {
428
+ /* Diagnosis does not own the attempt's outcome. */
429
+ }
414
430
  return;
415
431
  }
416
432
  artifact.result = checked.result;
@@ -493,12 +509,23 @@ export async function runAnalysis(input, config, options) {
493
509
  ...(options.signal === undefined ? {} : { signal: options.signal }),
494
510
  });
495
511
  recordProviderUsage(artifact, config, response);
512
+ if (config.provider === "codex")
513
+ for (const warning of [
514
+ response.protocolIncompatibilities === undefined
515
+ ? undefined
516
+ : protocolIncompatibilityMessage(config.identity.cliVersion, response.protocolIncompatibilities),
517
+ protocolAdditionsWarning(config.identity.cliVersion, response.protocolAdditions),
518
+ unknownNotificationsWarning(response.unknownNotifications, config.identity.cliVersion),
519
+ truncatedFrameWarning(response.truncatedFrameBytes),
520
+ ])
521
+ if (warning !== undefined)
522
+ options.warnings?.push(warning);
496
523
  if (response.status !== "completed") {
497
524
  artifact.status = response.status === "cancelled" ? "cancelled" : "failed";
498
525
  artifact.error = `analysis_${response.errorCode ?? "provider_failed"}`;
499
526
  return finish();
500
527
  }
501
528
  progress("validating");
502
- settleCompletedOutput(artifact, input, config, admission, response);
529
+ settleCompletedOutput(artifact, input, config, admission, response, options.onRejectedOutput);
503
530
  return finish();
504
531
  }
@@ -21,6 +21,8 @@ export interface AutomaticAnalysisCancellation {
21
21
  requested: boolean;
22
22
  reason: string | null;
23
23
  }
24
+ /** A route's reason not to analyze a run it recorded, persisted as the job's skip reason. */
25
+ export type AutomaticAnalysisRefusal = "AUTOMATIC_ANALYSIS_CLEANUP_UNCONFIRMED";
24
26
  declare const jobSchema: z.ZodObject<{
25
27
  schema: z.ZodLiteral<"humanish.automatic-study-analysis.v1">;
26
28
  runId: z.ZodString;
@@ -45,6 +47,7 @@ declare const jobSchema: z.ZodObject<{
45
47
  AUTOMATIC_ANALYSIS_BUSY: "AUTOMATIC_ANALYSIS_BUSY";
46
48
  AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE: "AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE";
47
49
  AUTOMATIC_ANALYSIS_CANCELLED: "AUTOMATIC_ANALYSIS_CANCELLED";
50
+ AUTOMATIC_ANALYSIS_CLEANUP_UNCONFIRMED: "AUTOMATIC_ANALYSIS_CLEANUP_UNCONFIRMED";
48
51
  AUTOMATIC_ANALYSIS_CODEX_UNAVAILABLE: "AUTOMATIC_ANALYSIS_CODEX_UNAVAILABLE";
49
52
  AUTOMATIC_ANALYSIS_FAILED: "AUTOMATIC_ANALYSIS_FAILED";
50
53
  AUTOMATIC_ANALYSIS_KEY_MISSING: "AUTOMATIC_ANALYSIS_KEY_MISSING";
@@ -69,9 +72,9 @@ declare const jobSchema: z.ZodObject<{
69
72
  }, z.core.$strict>;
70
73
  type JobRecord = z.infer<typeof jobSchema>;
71
74
  /** Also guards direct HTML projection callers, not only the contained-file reader. */
72
- export declare function projectAutomaticStudyAnalysisView(value: unknown): AutomaticAnalysisView | undefined;
75
+ export declare function projectAutomaticAnalysisView(value: unknown): AutomaticAnalysisView | undefined;
73
76
  /** Minimal historical accounting, without source validation, execution or liveness inference. */
74
- export declare function readAutomaticStudyAnalysisAccounting(prepared: PreparedRunArtifactPaths): Promise<{
77
+ export declare function readAutomaticAnalysisAccounting(prepared: PreparedRunArtifactPaths): Promise<{
75
78
  attemptId: string;
76
79
  analysisId: string | null;
77
80
  started: boolean;
@@ -79,7 +82,7 @@ export declare function readAutomaticStudyAnalysisAccounting(prepared: PreparedR
79
82
  uncertain: boolean;
80
83
  } | "unknown" | undefined>;
81
84
  /** Read-only projection. A stale timestamp or persisted claim never authorizes execution. */
82
- export declare function readAutomaticStudyAnalysisPrepared(prepared: PreparedRunArtifactPaths, now?: number): Promise<AutomaticAnalysisView | undefined>;
85
+ export declare function readAutomaticAnalysisPrepared(prepared: PreparedRunArtifactPaths, now?: number): Promise<AutomaticAnalysisView | undefined>;
83
86
  export interface AutomaticAnalysisJob {
84
87
  readonly attemptId: string;
85
88
  /** Serialized, awaited durability boundary. A failed write must prevent dispatch. */
@@ -88,10 +91,10 @@ export interface AutomaticAnalysisJob {
88
91
  cancellationRequested(): Promise<boolean>;
89
92
  }
90
93
  /** The directory is permanent, including after interrupted/failed writes. Never re-open it as a writer. */
91
- export declare function claimAutomaticStudyAnalysis(prepared: PreparedRunArtifactPaths, metadata: {
94
+ export declare function claimAutomaticAnalysis(prepared: PreparedRunArtifactPaths, metadata: {
92
95
  configDigest: string;
93
96
  promptVersion: string;
94
97
  }): Promise<AutomaticAnalysisJob | null>;
95
98
  /** A scoped cancellation request, never a PID signal and never permission to create a new job. */
96
- export declare function requestAutomaticStudyAnalysisCancellationPrepared(prepared: PreparedRunArtifactPaths): Promise<AutomaticAnalysisCancellation>;
99
+ export declare function requestAutomaticAnalysisCancellationPrepared(prepared: PreparedRunArtifactPaths): Promise<AutomaticAnalysisCancellation>;
97
100
  export {};
@@ -4,10 +4,10 @@ import path from "node:path";
4
4
  import { z } from "zod";
5
5
  import { physicalCwdOf, runIdOf, validatePreparedRunRootIdentity, } from "../run/paths.js";
6
6
  import { assertPreparedSelectedOutputDirectory, bindExistingManagedHumanishOutputDirectory, prepareContainedOutputDirectoryRoot, writeContainedOutputFile, } from "../run/contained-output.js";
7
- import { pathMissing, readBoundedStudyFile } from "../run/study-files.js";
7
+ import { pathMissing, readBoundedFile } from "../run/evidence-files.js";
8
8
  import { containsSensitive } from "../evidence/redaction.js";
9
- import { readStudyAnalysisVersion } from "./store.js";
10
- import { readStudyAnalysisExecution } from "./store-executions.js";
9
+ import { readAnalysisVersion } from "./store.js";
10
+ import { readAnalysisExecution } from "./store-executions.js";
11
11
  import { hashAnalysisValue } from "./validation.js";
12
12
  import { ANALYSIS_ID_PATTERN, SHA256_HEX_PATTERN } from "./types.js";
13
13
  export const AUTOMATIC_ANALYSIS_DIRECTORY = "analysis-automatic";
@@ -47,6 +47,7 @@ const reasons = [
47
47
  "AUTOMATIC_ANALYSIS_ADMISSION_EXCEEDED",
48
48
  "AUTOMATIC_ANALYSIS_ACTOR_CANCELLED",
49
49
  "AUTOMATIC_ANALYSIS_NO_PARTICIPANT_EVIDENCE",
50
+ "AUTOMATIC_ANALYSIS_CLEANUP_UNCONFIRMED",
50
51
  ];
51
52
  const id = z.string().regex(ANALYSIS_ID_PATTERN);
52
53
  const date = z.iso.datetime();
@@ -106,7 +107,7 @@ function parseJob(bytes, runId) {
106
107
  return record;
107
108
  }
108
109
  /** Also guards direct HTML projection callers, not only the contained-file reader. */
109
- export function projectAutomaticStudyAnalysisView(value) {
110
+ export function projectAutomaticAnalysisView(value) {
110
111
  if (value === undefined)
111
112
  return undefined;
112
113
  const parsed = jobSchema
@@ -123,12 +124,12 @@ async function bindJob(prepared) {
123
124
  return root ? Object.freeze({ ...root, parentRun: prepared }) : null;
124
125
  }
125
126
  /** Minimal historical accounting, without source validation, execution or liveness inference. */
126
- export async function readAutomaticStudyAnalysisAccounting(prepared) {
127
+ export async function readAutomaticAnalysisAccounting(prepared) {
127
128
  try {
128
129
  const root = await bindJob(prepared);
129
130
  if (!root)
130
131
  return undefined;
131
- const bytes = await readBoundedStudyFile(root, JOB_FILE, MAX_JOB_BYTES);
132
+ const bytes = await readBoundedFile(root, JOB_FILE, MAX_JOB_BYTES);
132
133
  if (!bytes)
133
134
  return "unknown";
134
135
  const record = parseJob(bytes, runIdOf(prepared));
@@ -145,14 +146,14 @@ export async function readAutomaticStudyAnalysisAccounting(prepared) {
145
146
  }
146
147
  }
147
148
  /** Read-only projection. A stale timestamp or persisted claim never authorizes execution. */
148
- export async function readAutomaticStudyAnalysisPrepared(prepared, now = Date.now()) {
149
+ export async function readAutomaticAnalysisPrepared(prepared, now = Date.now()) {
149
150
  try {
150
151
  const root = await bindJob(prepared);
151
152
  if (!root) {
152
153
  const missing = await pathMissing(path.join(prepared.physicalRunRoot, AUTOMATIC_ANALYSIS_DIRECTORY));
153
154
  return missing ? undefined : unknown();
154
155
  }
155
- const bytes = await readBoundedStudyFile(root, JOB_FILE, MAX_JOB_BYTES);
156
+ const bytes = await readBoundedFile(root, JOB_FILE, MAX_JOB_BYTES);
156
157
  if (!bytes)
157
158
  return unknown();
158
159
  const record = parseJob(bytes, runIdOf(prepared));
@@ -185,7 +186,7 @@ async function terminalResultMatches(prepared, record) {
185
186
  value.inputDigest === record.inputDigest &&
186
187
  value.configDigest === record.configDigest &&
187
188
  value.promptVersion === record.promptVersion;
188
- const receipt = await readStudyAnalysisExecution(prepared, record.analysisId);
189
+ const receipt = await readAnalysisExecution(prepared, record.analysisId);
189
190
  if (!receipt || !matches(receipt) || hashAnalysisValue(receipt) !== record.receiptSha256)
190
191
  return false;
191
192
  if (record.state === "failed" && record.reason === "AUTOMATIC_ANALYSIS_PUBLICATION_FAILED")
@@ -194,7 +195,7 @@ async function terminalResultMatches(prepared, record) {
194
195
  return false;
195
196
  if (record.state === "failed" || record.state === "cancelled")
196
197
  return true;
197
- const entry = await readStudyAnalysisVersion(prepared, record.analysisId);
198
+ const entry = await readAnalysisVersion(prepared, record.analysisId);
198
199
  return (entry?.state === "ready" &&
199
200
  entry.analysis !== null &&
200
201
  matches(entry.analysis) &&
@@ -202,7 +203,7 @@ async function terminalResultMatches(prepared, record) {
202
203
  hashAnalysisValue(entry.analysis) === record.analysisSha256);
203
204
  }
204
205
  /** The directory is permanent, including after interrupted/failed writes. Never re-open it as a writer. */
205
- export async function claimAutomaticStudyAnalysis(prepared, metadata) {
206
+ export async function claimAutomaticAnalysis(prepared, metadata) {
206
207
  await validatePreparedRunRootIdentity(prepared);
207
208
  const target = path.join(prepared.physicalRunRoot, AUTOMATIC_ANALYSIS_DIRECTORY);
208
209
  try {
@@ -271,7 +272,7 @@ export async function claimAutomaticStudyAnalysis(prepared, metadata) {
271
272
  touch: () => update({}),
272
273
  async cancellationRequested() {
273
274
  await assertPreparedSelectedOutputDirectory(root);
274
- const bytes = await readBoundedStudyFile(root, CANCEL_FILE, MAX_CANCEL_BYTES);
275
+ const bytes = await readBoundedFile(root, CANCEL_FILE, MAX_CANCEL_BYTES);
275
276
  if (!bytes) {
276
277
  if (!(await pathMissing(path.join(root.physicalPath, CANCEL_FILE))))
277
278
  throw new Error("AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE");
@@ -285,12 +286,12 @@ export async function claimAutomaticStudyAnalysis(prepared, metadata) {
285
286
  };
286
287
  }
287
288
  /** A scoped cancellation request, never a PID signal and never permission to create a new job. */
288
- export async function requestAutomaticStudyAnalysisCancellationPrepared(prepared) {
289
+ export async function requestAutomaticAnalysisCancellationPrepared(prepared) {
289
290
  try {
290
291
  const root = await bindJob(prepared);
291
292
  if (!root)
292
293
  return { requested: false, reason: "AUTOMATIC_ANALYSIS_SOURCE_UNAVAILABLE" };
293
- const bytes = await readBoundedStudyFile(root, JOB_FILE, MAX_JOB_BYTES);
294
+ const bytes = await readBoundedFile(root, JOB_FILE, MAX_JOB_BYTES);
294
295
  if (!bytes)
295
296
  throw new Error("Unavailable job.");
296
297
  const record = parseJob(bytes, runIdOf(prepared));
@@ -1,3 +1,3 @@
1
1
  import type { PreparedRunArtifactPaths } from "../run/paths.js";
2
2
  import type { LoadedAnalysis } from "./types.js";
3
- export declare function loadStudyAnalysis(prepared: PreparedRunArtifactPaths, id?: string): Promise<LoadedAnalysis>;
3
+ export declare function loadAnalysis(prepared: PreparedRunArtifactPaths, id?: string): Promise<LoadedAnalysis>;
@@ -1,11 +1,11 @@
1
1
  // Loads a run's study analysis together with the automatic analysis job's view of it. The store
2
2
  // and the job module each stay importable without the other.
3
- import { readAutomaticStudyAnalysisPrepared } from "./job.js";
4
- import { loadStudyAnalysisRecord } from "./store.js";
5
- export async function loadStudyAnalysis(prepared, id) {
3
+ import { readAutomaticAnalysisPrepared } from "./job.js";
4
+ import { loadAnalysisRecord } from "./store.js";
5
+ export async function loadAnalysis(prepared, id) {
6
6
  const [loaded, automatic] = await Promise.all([
7
- loadStudyAnalysisRecord(prepared, id),
8
- readAutomaticStudyAnalysisPrepared(prepared),
7
+ loadAnalysisRecord(prepared, id),
8
+ readAutomaticAnalysisPrepared(prepared),
9
9
  ]);
10
10
  return automatic === undefined ? loaded : { ...loaded, automatic };
11
11
  }
@@ -28,8 +28,16 @@ export interface AnalysisProviderResult {
28
28
  dispatched: boolean;
29
29
  /** Omitted preserves complete API-response accounting; account snapshots must state this. */
30
30
  usageComplete?: boolean;
31
- errorCode: "invalid_request" | "provider_http_error" | "provider_network_error" | "invalid_response" | "provider_headers_timeout" | "provider_body_timeout" | "provider_connect_timeout" | "provider_connection_reset" | "provider_dns_error" | "codex_busy" | "codex_unavailable" | "codex_unsupported_version" | "codex_unsupported_platform" | "codex_login_required" | "codex_unsupported_auth" | "codex_unsafe_configuration" | "codex_model_unavailable" | "codex_protocol_error" | "codex_tool_call" | "codex_process_failed" | "codex_cleanup_failed" | "response_too_large" | "output_incomplete" | "refusal" | "cancelled" | "timeout" | null;
31
+ errorCode: "invalid_request" | "provider_http_error" | "provider_network_error" | "invalid_response" | "provider_headers_timeout" | "provider_body_timeout" | "provider_connect_timeout" | "provider_connection_reset" | "provider_dns_error" | "codex_busy" | "codex_unavailable" | "codex_unsupported_version" | "codex_incompatible_release" | "codex_unsupported_platform" | "codex_login_required" | "codex_unsupported_auth" | "codex_unsafe_configuration" | "codex_model_unavailable" | "codex_protocol_error" | "codex_tool_call" | "codex_process_failed" | "codex_cleanup_failed" | "response_too_large" | "output_incomplete" | "refusal" | "cancelled" | "timeout" | null;
32
32
  httpStatus?: number;
33
+ /** Codex only: notification methods humanish does not know that carried no item, by count. */
34
+ unknownNotifications?: Readonly<Record<string, number>>;
35
+ /** Codex only: bytes of a last frame cut off when humanish stopped the app-server. */
36
+ truncatedFrameBytes?: number;
37
+ /** Codex only: how the release's app-server schema differs from the fields humanish reads. */
38
+ protocolIncompatibilities?: readonly string[];
39
+ /** Codex only: schema values beyond the baseline humanish knows. */
40
+ protocolAdditions?: readonly string[];
33
41
  }
34
42
  export type AnalysisProvider = (request: AnalysisProviderRequest) => Promise<AnalysisProviderResult>;
35
43
  /** An input image the provider accepts; the groups are the image type and its base64 bytes. */
@@ -16,4 +16,6 @@ export declare function checkRestrictedCodexAnalysisReadiness(input?: {
16
16
  }, options?: RestrictedCodexSessionOptions): Promise<{
17
17
  ready: boolean;
18
18
  errorCode: RestrictedCodexAnalysisErrorCode | null;
19
+ protocolIncompatibilities?: readonly string[];
20
+ protocolAdditions?: readonly string[];
19
21
  }>;
@@ -19,5 +19,14 @@ export async function bindCodexAnalysisCliVersion(config, detect = async () => (
19
19
  /** Does not submit a model turn. Readiness is not a quota/access guarantee. */
20
20
  export async function checkRestrictedCodexAnalysisReadiness(input = {}, options = {}) {
21
21
  const result = await checkRestrictedCodexSessionReadiness(input, options);
22
- return { ready: result.status === "completed", errorCode: result.errorCode };
22
+ return {
23
+ ready: result.status === "completed",
24
+ errorCode: result.errorCode,
25
+ ...(result.protocolIncompatibilities === undefined
26
+ ? {}
27
+ : { protocolIncompatibilities: result.protocolIncompatibilities }),
28
+ ...(result.protocolAdditions === undefined
29
+ ? {}
30
+ : { protocolAdditions: result.protocolAdditions }),
31
+ };
23
32
  }
@@ -19,6 +19,8 @@ export interface AnalyzeResult {
19
19
  analysisId?: string;
20
20
  artifactPath?: string;
21
21
  executionReceiptPath?: string;
22
+ /** A rejected response kept for local diagnosis, outside the run directory. */
23
+ rejectedOutputPath?: string;
22
24
  status?: AnalysisArtifact["status"];
23
25
  usage?: AnalysisArtifact["usage"];
24
26
  admission?: AnalysisAdmission;
@@ -10,11 +10,12 @@ import { loadRunBundlePrepared, resolveRunPath } from "../run/locate.js";
10
10
  import { physicalCwdOf, runIdOf, resolvePhysicalCwd, validatePreparedRunRootIdentity, } from "../run/paths.js";
11
11
  import { isRunStatusRecord, RUN_STATUS_FILE } from "../run/status.js";
12
12
  import { captureEvidence, EVIDENCE_LIMITS } from "./evidence.js";
13
- import { pathMissing, readBoundedStudyFile } from "../run/study-files.js";
13
+ import { pathMissing, readBoundedFile } from "../run/evidence-files.js";
14
14
  import { estimateAnalysisAdmission, preferLargerAnalysisOutput, runAnalysis, ANALYSIS_PROMPT_VERSION, } from "./execute.js";
15
- import { appendStudyAnalysisCorrection, assertAnalysisPublicationCapacity, listAnalyses, writeStudyAnalysis, } from "./store.js";
16
- import { beginStudyAnalysisExecution, writeStudyAnalysisExecutionReceipt, } from "./store-executions.js";
17
- import { loadStudyAnalysis } from "./load.js";
15
+ import { appendAnalysisCorrection, assertAnalysisPublicationCapacity, listAnalyses, writeAnalysis, } from "./store.js";
16
+ import { beginAnalysisExecution, writeAnalysisExecutionReceipt } from "./store-executions.js";
17
+ import { keepRejectedAnalysisOutput } from "./diagnostics.js";
18
+ import { loadAnalysis } from "./load.js";
18
19
  import { hashAnalysisValue } from "./validation.js";
19
20
  import { ANALYSIS_CORRECTION_SCHEMA, } from "./types.js";
20
21
  import { RUN_BUNDLE_FILE } from "../run/bundle.js";
@@ -57,6 +58,7 @@ const codexRecovery = {
57
58
  analysis_codex_busy: "Another restricted Codex analyst or setup check is active in this process. Wait for it to finish, then explicitly retry.",
58
59
  analysis_codex_unavailable: `The qualified Codex CLI is unavailable. Install a qualified Codex CLI (${describeQualifiedCodexCliVersions()}) and sign in with a ChatGPT account, then retry --provider codex.`,
59
60
  analysis_codex_unsupported_version: `Codex account analysis requires a qualified CLI version (${describeQualifiedCodexCliVersions()}). Other versions have not passed this tool-policy contract.`,
61
+ analysis_codex_incompatible_release: `This Codex CLI release changed app-server protocol fields humanish reads, so no request was sent; the warnings name each change. Install a release humanish was tested with (${describeQualifiedCodexCliVersions()}), then retry.`,
60
62
  analysis_codex_unsupported_platform: "This platform has not qualified the restricted Codex account launcher.",
61
63
  analysis_codex_login_required: "Sign in to Codex with a ChatGPT account, then retry humanish analyze --provider codex --rerun.",
62
64
  analysis_codex_unsupported_auth: "Codex analysis requires ChatGPT account authentication; API-key and custom provider authentication are not used as fallbacks.",
@@ -140,7 +142,7 @@ export async function withAnalysisLock(prepared, action) {
140
142
  }
141
143
  /** The completion gate: the run verifies, is live and finished, and has participants. */
142
144
  export async function readCompletedAnalysisSource(cwd, prepared) {
143
- const bytes = await readBoundedStudyFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes);
145
+ const bytes = await readBoundedFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes);
144
146
  if (!bytes)
145
147
  throw new Error("ANALYSIS_SOURCE_UNAVAILABLE");
146
148
  const verified = await verifyRunPrepared(cwd, runIdOf(prepared), prepared);
@@ -151,7 +153,7 @@ export async function readCompletedAnalysisSource(cwd, prepared) {
151
153
  throw new Error("ANALYSIS_NO_PARTICIPANTS");
152
154
  if (loaded.bundle.mode !== "live")
153
155
  throw new Error("ANALYSIS_REQUIRES_LIVE_RUN");
154
- const statusBytes = await readBoundedStudyFile(prepared, RUN_STATUS_FILE, MAX_STATUS_BYTES);
156
+ const statusBytes = await readBoundedFile(prepared, RUN_STATUS_FILE, MAX_STATUS_BYTES);
155
157
  if (!statusBytes) {
156
158
  const missing = await pathMissing(path.join(prepared.physicalRunRoot, RUN_STATUS_FILE)).catch(() => {
157
159
  throw new Error("ANALYSIS_SOURCE_UNAVAILABLE");
@@ -258,9 +260,9 @@ async function publishAttempt(prepared, analysis, result, finalizeExecution) {
258
260
  if (finalizeExecution)
259
261
  await finalizeExecution(analysis);
260
262
  else
261
- await writeStudyAnalysisExecutionReceipt(prepared, analysis);
263
+ await writeAnalysisExecutionReceipt(prepared, analysis);
262
264
  result.executionReceiptPath = path.join(prepared.relativeRunRoot, "analysis-attempts", analysis.id, "receipt.json");
263
- await writeStudyAnalysis(prepared, analysis);
265
+ await writeAnalysis(prepared, analysis);
264
266
  result.artifactPath = path.join(prepared.relativeRunRoot, "analysis", analysis.id, "analysis.json");
265
267
  return true;
266
268
  }
@@ -308,19 +310,36 @@ async function executeAnalysis(attempt) {
308
310
  if (config.provider !== "codex" && !apiKey.trim())
309
311
  return { ...fail(input.runId, false, "ANALYSIS_API_KEY_MISSING"), admission };
310
312
  let finalizeExecution;
313
+ const rejection = {};
311
314
  const analysis = await runAnalysis(input, config, {
312
315
  apiKey,
313
316
  ...(deps.codexProvider === undefined ? {} : { codexProvider: deps.codexProvider }),
314
317
  ...(deps.analysisId === undefined ? {} : { analysisId: deps.analysisId }),
315
318
  beforeDispatch: async (context) => {
316
319
  await deps.beforeDispatch?.(context);
317
- finalizeExecution = await beginStudyAnalysisExecution(prepared, context);
320
+ finalizeExecution = await beginAnalysisExecution(prepared, context);
318
321
  },
319
322
  ...(deps.signal === undefined ? {} : { signal: deps.signal }),
320
323
  ...(deps.onProgress === undefined ? {} : { onProgress: deps.onProgress }),
321
324
  ...(deps.fetch === undefined ? {} : { fetch: deps.fetch }),
325
+ warnings: base.warnings,
326
+ onRejectedOutput: (output) => {
327
+ rejection.output = output;
328
+ },
322
329
  });
323
330
  const result = attemptResult(base, analysis);
331
+ if (rejection.output)
332
+ try {
333
+ result.rejectedOutputPath = await keepRejectedAnalysisOutput(cwd, {
334
+ runId: analysis.runId,
335
+ analysisId: analysis.id,
336
+ model: config.model,
337
+ promptVersion: analysis.promptVersion,
338
+ }, rejection.output);
339
+ }
340
+ catch {
341
+ result.warnings.push("The rejected analyst output could not be kept under .humanish/analysis-diagnostics.");
342
+ }
324
343
  if (!(await publishAttempt(prepared, analysis, result, finalizeExecution)))
325
344
  return {
326
345
  ...result,
@@ -365,7 +384,7 @@ export async function analyzeRun(cwdInput, run, options, deps = {}) {
365
384
  export async function showAnalysis(cwd, run, id) {
366
385
  const prepared = await resolveRunPath(await resolvePhysicalCwd(cwd), run).catch(() => null);
367
386
  return prepared
368
- ? loadStudyAnalysis(prepared, id)
387
+ ? loadAnalysis(prepared, id)
369
388
  : { state: "invalid", analysis: null, corrections: [], warnings: ["ANALYSIS_RUN_NOT_FOUND"] };
370
389
  }
371
390
  export async function correctAnalysis(cwd, run, options) {
@@ -373,7 +392,7 @@ export async function correctAnalysis(cwd, run, options) {
373
392
  if (!prepared)
374
393
  throw new Error("ANALYSIS_RUN_NOT_FOUND");
375
394
  return withAnalysisLock(prepared, async () => {
376
- const loaded = await loadStudyAnalysis(prepared, options.analysisId);
395
+ const loaded = await loadAnalysis(prepared, options.analysisId);
377
396
  const analysis = loaded.analysis;
378
397
  const finding = analysis?.result?.findings.find((item) => item.id === options.findingId);
379
398
  if (loaded.state !== "ready" || !analysis || !finding)
@@ -392,7 +411,7 @@ export async function correctAnalysis(cwd, run, options) {
392
411
  reason: options.reason,
393
412
  replacementClaim: options.replacementClaim ?? null,
394
413
  };
395
- await appendStudyAnalysisCorrection(prepared, correction);
414
+ await appendAnalysisCorrection(prepared, correction);
396
415
  await refreshObserver(cwd, runIdOf(prepared), prepared);
397
416
  return correction;
398
417
  });
@@ -1,9 +1,9 @@
1
1
  import type { LoadedAnalysis } from "./types.js";
2
2
  /** True for the analysis record files, matched by name inside their directories. Any other file
3
3
  * under analysis/ is ordinary evidence and follows the ordinary evidence policy. */
4
- export declare function isStudyAnalysisRecordPath(relativePath: string): boolean;
4
+ export declare function isAnalysisRecordPath(relativePath: string): boolean;
5
5
  /** Check the exact in-memory snapshot being projected; a prior filesystem scan cannot approve a later write. */
6
- export declare function studyAnalysisSharingProblems(loaded: LoadedAnalysis): {
6
+ export declare function analysisSharingProblems(loaded: LoadedAnalysis): {
7
7
  sensitive: boolean;
8
8
  unverified: boolean;
9
9
  };
@@ -1,9 +1,9 @@
1
1
  import { containsSensitive } from "../evidence/redaction.js";
2
- import { AUTOMATIC_ANALYSIS_DIRECTORY, projectAutomaticStudyAnalysisView } from "./job.js";
2
+ import { AUTOMATIC_ANALYSIS_DIRECTORY, projectAutomaticAnalysisView } from "./job.js";
3
3
  import { ANALYSIS_DIRECTORY, ANALYSIS_EXECUTION_DIRECTORY } from "./store.js";
4
4
  /** True for the analysis record files, matched by name inside their directories. Any other file
5
5
  * under analysis/ is ordinary evidence and follows the ordinary evidence policy. */
6
- export function isStudyAnalysisRecordPath(relativePath) {
6
+ export function isAnalysisRecordPath(relativePath) {
7
7
  const parts = relativePath.split("/");
8
8
  const leaf = parts.at(-1);
9
9
  const directory = parts[0];
@@ -14,7 +14,7 @@ export function isStudyAnalysisRecordPath(relativePath) {
14
14
  leaf.startsWith(".humanish-write-")));
15
15
  }
16
16
  /** Check the exact in-memory snapshot being projected; a prior filesystem scan cannot approve a later write. */
17
- export function studyAnalysisSharingProblems(loaded) {
17
+ export function analysisSharingProblems(loaded) {
18
18
  // Job metadata never approves evidence, nor does uncertain liveness revoke its approval.
19
19
  const { automatic: _automatic, ...evidence } = loaded;
20
20
  const benignAttempt = loaded.analysis?.result === null &&
@@ -30,9 +30,9 @@ export function studyAnalysisSharingProblems(loaded) {
30
30
  /** Unsafe generated text is quarantined without hiding the original recording. */
31
31
  export function projectShareCheckedAnalysis(loaded) {
32
32
  const { automatic: _automatic, ...evidence } = loaded;
33
- const automatic = projectAutomaticStudyAnalysisView(loaded.automatic);
33
+ const automatic = projectAutomaticAnalysisView(loaded.automatic);
34
34
  const safe = automatic === undefined ? evidence : { ...evidence, automatic };
35
- return studyAnalysisSharingProblems(safe).sensitive
35
+ return analysisSharingProblems(safe).sensitive
36
36
  ? {
37
37
  state: "invalid",
38
38
  analysis: null,
@@ -2,15 +2,15 @@ import { type PreparedRunArtifactPaths } from "../run/paths.js";
2
2
  import { type AnalysisExecutionReceipt, type AnalysisExecutionStart } from "./validation.js";
3
3
  import type { AnalysisArtifact } from "./types.js";
4
4
  /** Exact bounded receipt lookup for an already claimed execution, never a dispatch decision. */
5
- export declare function readStudyAnalysisExecution(prepared: PreparedRunArtifactPaths, id: string): Promise<AnalysisExecutionReceipt | null>;
5
+ export declare function readAnalysisExecution(prepared: PreparedRunArtifactPaths, id: string): Promise<AnalysisExecutionReceipt | null>;
6
6
  /**
7
7
  * Publish accounting first. Unlike a usable report, this receipt does not claim
8
8
  * the source still matches; its digests name the exact input that was attempted.
9
9
  */
10
- export declare function writeStudyAnalysisExecutionReceipt(prepared: PreparedRunArtifactPaths, value: AnalysisArtifact): Promise<void>;
10
+ export declare function writeAnalysisExecutionReceipt(prepared: PreparedRunArtifactPaths, value: AnalysisArtifact): Promise<void>;
11
11
  /** The returned closure owns one exact directory; persisted IDs never authorize overwriting it. */
12
- export declare function beginStudyAnalysisExecution(prepared: PreparedRunArtifactPaths, context: Omit<AnalysisExecutionStart, "schema" | "createdAt">): Promise<(value: AnalysisArtifact) => Promise<void>>;
13
- export declare function listStudyAnalysisExecutions(prepared: PreparedRunArtifactPaths): Promise<{
12
+ export declare function beginAnalysisExecution(prepared: PreparedRunArtifactPaths, context: Omit<AnalysisExecutionStart, "schema" | "createdAt">): Promise<(value: AnalysisArtifact) => Promise<void>>;
13
+ export declare function listAnalysisExecutions(prepared: PreparedRunArtifactPaths): Promise<{
14
14
  receipts: AnalysisExecutionReceipt[];
15
15
  warnings: string[];
16
16
  }>;
@@ -21,7 +21,7 @@ export interface AnalysisAccountingRecord {
21
21
  legacy: boolean;
22
22
  }
23
23
  /** Accounting is independent of source freshness and findings validation. No evidence is opened. */
24
- export declare function readStudyAnalysisAccountingRecords(prepared: PreparedRunArtifactPaths): Promise<{
24
+ export declare function readAnalysisAccountingRecords(prepared: PreparedRunArtifactPaths): Promise<{
25
25
  records: AnalysisAccountingRecord[];
26
26
  warnings: string[];
27
27
  }>;