@tangle-network/agent-eval 0.221.8 → 0.222.1

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 (579) hide show
  1. package/CHANGELOG.md +168 -0
  2. package/dist/adapters/http.d.ts +3 -5
  3. package/dist/adapters/http.d.ts.map +1 -1
  4. package/dist/adapters/http.js +1 -2
  5. package/dist/{adversarial-smnADNFS.d.ts → adversarial-DnQQFqTR.d.ts} +1 -3
  6. package/dist/adversarial-DnQQFqTR.d.ts.map +1 -0
  7. package/dist/{agent-profile-CNmwfaqq.d.ts → agent-profile-CSEQRC9l.d.ts} +4 -10
  8. package/dist/agent-profile-CSEQRC9l.d.ts.map +1 -0
  9. package/dist/agent-profile-Dngk3LZ0.js +153 -0
  10. package/dist/agent-profile-Dngk3LZ0.js.map +1 -0
  11. package/dist/{agent-profile-cell-BcpFbNd5.d.ts → agent-profile-cell-3kYxUsK2.d.ts} +3 -5
  12. package/dist/agent-profile-cell-3kYxUsK2.d.ts.map +1 -0
  13. package/dist/{agent-profile-cell-B1V1gUZs.js → agent-profile-cell-CT5JYueM.js} +5 -7
  14. package/dist/{agent-profile-cell-B1V1gUZs.js.map → agent-profile-cell-CT5JYueM.js.map} +1 -1
  15. package/dist/{agreement-irr-BhAqjluA.js → agreement-irr-BTjDN0i6.js} +4 -5
  16. package/dist/{agreement-irr-BhAqjluA.js.map → agreement-irr-BTjDN0i6.js.map} +1 -1
  17. package/dist/analyst/index.d.ts +95 -159
  18. package/dist/analyst/index.d.ts.map +1 -1
  19. package/dist/analyst/index.js +28 -39
  20. package/dist/analyst/index.js.map +1 -1
  21. package/dist/{analyze-runs-DfX6dHP0.d.ts → analyze-runs-CGLRgZGd.d.ts} +7 -13
  22. package/dist/analyze-runs-CGLRgZGd.d.ts.map +1 -0
  23. package/dist/{analyze-runs-CHmsykNJ.js → analyze-runs-CTheASYV.js} +23 -32
  24. package/dist/{analyze-runs-CHmsykNJ.js.map → analyze-runs-CTheASYV.js.map} +1 -1
  25. package/dist/{attribute-vocabulary-CcXqHODT.d.ts → attribute-vocabulary-5oo8ykIx.d.ts} +2 -4
  26. package/dist/attribute-vocabulary-5oo8ykIx.d.ts.map +1 -0
  27. package/dist/authenticity/index.d.ts +0 -2
  28. package/dist/authenticity/index.d.ts.map +1 -1
  29. package/dist/authenticity/index.js +1 -2
  30. package/dist/{benchmark-command-Cnjfo0Zh.js → benchmark-command-Cr7i7YSX.js} +61 -94
  31. package/dist/benchmark-command-Cr7i7YSX.js.map +1 -0
  32. package/dist/benchmarks/index.d.ts +5 -15
  33. package/dist/benchmarks/index.d.ts.map +1 -1
  34. package/dist/benchmarks/index.js +27 -38
  35. package/dist/benchmarks/index.js.map +1 -1
  36. package/dist/{bounded-process-Cj9YjXbE.js → bounded-process-BZrWXIKW.js} +2 -3
  37. package/dist/{bounded-process-Cj9YjXbE.js.map → bounded-process-BZrWXIKW.js.map} +1 -1
  38. package/dist/builder-eval/index.d.ts +5 -14
  39. package/dist/builder-eval/index.d.ts.map +1 -1
  40. package/dist/builder-eval/index.js +11 -17
  41. package/dist/builder-eval/index.js.map +1 -1
  42. package/dist/{calibration-CTwxpJ-t.js → calibration-6usfVYYo.js} +4 -5
  43. package/dist/{calibration-CTwxpJ-t.js.map → calibration-6usfVYYo.js.map} +1 -1
  44. package/dist/campaign/index.d.ts +9 -9
  45. package/dist/campaign/index.js +15 -14
  46. package/dist/{campaign-uddTlFg5.js → campaign-ddr1N3yD.js} +61 -58
  47. package/dist/campaign-ddr1N3yD.js.map +1 -0
  48. package/dist/{campaign-evidence-DunzcJGv.js → campaign-evidence-DN8rWuBj.js} +20 -322
  49. package/dist/campaign-evidence-DN8rWuBj.js.map +1 -0
  50. package/dist/{canonical-Dq2hOQ8L.js → canonical-CicJlINA.js} +3 -4
  51. package/dist/{canonical-Dq2hOQ8L.js.map → canonical-CicJlINA.js.map} +1 -1
  52. package/dist/{canonical-CFpojCN5.d.ts → canonical-gLeHiqzd.d.ts} +2 -4
  53. package/dist/canonical-gLeHiqzd.d.ts.map +1 -0
  54. package/dist/{cell-spend-DEWR3nj-.js → cell-spend-zxmzg4GH.js} +3 -4
  55. package/dist/{cell-spend-DEWR3nj-.js.map → cell-spend-zxmzg4GH.js.map} +1 -1
  56. package/dist/{chat-client-BNATB3rJ.js → chat-client-CO3uB33i.js} +3 -4
  57. package/dist/{chat-client-BNATB3rJ.js.map → chat-client-CO3uB33i.js.map} +1 -1
  58. package/dist/{chat-json-call-BzWYp18J.js → chat-json-call-8yUv4LFO.js} +4 -5
  59. package/dist/{chat-json-call-BzWYp18J.js.map → chat-json-call-8yUv4LFO.js.map} +1 -1
  60. package/dist/{claim-BPVuyHuy.js → claim-Dod_mjk3.js} +5 -6
  61. package/dist/{claim-BPVuyHuy.js.map → claim-Dod_mjk3.js.map} +1 -1
  62. package/dist/cli.js +179 -23
  63. package/dist/cli.js.map +1 -1
  64. package/dist/{client-hwo3cJjR.d.ts → client-BIFwUg7I.d.ts} +6 -12
  65. package/dist/client-BIFwUg7I.d.ts.map +1 -0
  66. package/dist/{cluster-bootstrap-DEwwhl0C.js → cluster-bootstrap-SbaeM44s.js} +4 -5
  67. package/dist/{cluster-bootstrap-DEwwhl0C.js.map → cluster-bootstrap-SbaeM44s.js.map} +1 -1
  68. package/dist/completion-verifier-7KEfroqx.d.ts +168 -0
  69. package/dist/completion-verifier-7KEfroqx.d.ts.map +1 -0
  70. package/dist/{completion-verifier-asaV1nSj.js → completion-verifier-rqbMh5-4.js} +9 -160
  71. package/dist/completion-verifier-rqbMh5-4.js.map +1 -0
  72. package/dist/contract/index.d.ts +13 -13
  73. package/dist/contract/index.js +41 -60
  74. package/dist/contract/index.js.map +1 -1
  75. package/dist/{cost-ledger-BGZB6yY2.js → cost-ledger-CS8R3IZj.js} +10 -17
  76. package/dist/{cost-ledger-BGZB6yY2.js.map → cost-ledger-CS8R3IZj.js.map} +1 -1
  77. package/dist/{cost-ledger-C1W3ICmP.d.ts → cost-ledger-Czro9wmo.d.ts} +1 -5
  78. package/dist/cost-ledger-Czro9wmo.d.ts.map +1 -0
  79. package/dist/{dataset-DQqhOCPt.d.ts → dataset-DThC1S6G.d.ts} +1 -3
  80. package/dist/dataset-DThC1S6G.d.ts.map +1 -0
  81. package/dist/{decision-point-0nJubuoM.js → decision-point-lhMgODOR.js} +14 -18
  82. package/dist/{decision-point-0nJubuoM.js.map → decision-point-lhMgODOR.js.map} +1 -1
  83. package/dist/{deep-freeze-CurcOQg3.js → deep-freeze-CK8-2W7p.js} +2 -3
  84. package/dist/{deep-freeze-CurcOQg3.js.map → deep-freeze-CK8-2W7p.js.map} +1 -1
  85. package/dist/{default-registry-CLG5YqGS.d.ts → default-registry-1f4ukAIX.d.ts} +53 -61
  86. package/dist/default-registry-1f4ukAIX.d.ts.map +1 -0
  87. package/dist/{default-registry-BBTDgkDM.js → default-registry-C1tPEjZ4.js} +29 -45
  88. package/dist/{default-registry-BBTDgkDM.js.map → default-registry-C1tPEjZ4.js.map} +1 -1
  89. package/dist/{define-agent-eval-CCbT7Kfr.js → define-agent-eval-BLoP4Lf9.js} +15 -18
  90. package/dist/{define-agent-eval-CCbT7Kfr.js.map → define-agent-eval-BLoP4Lf9.js.map} +1 -1
  91. package/dist/{define-agent-eval-JKt3gMQr.d.ts → define-agent-eval-sUYh9BFA.d.ts} +19 -27
  92. package/dist/define-agent-eval-sUYh9BFA.d.ts.map +1 -0
  93. package/dist/{descriptive-CVNy48rR.js → descriptive-cPwITVfy.js} +30 -8
  94. package/dist/descriptive-cPwITVfy.js.map +1 -0
  95. package/dist/diagnosis/index.d.ts +5 -15
  96. package/dist/diagnosis/index.d.ts.map +1 -1
  97. package/dist/diagnosis/index.js +13 -19
  98. package/dist/diagnosis/index.js.map +1 -1
  99. package/dist/{dspy-rlm-engine-DN1p_5jx.js → dspy-rlm-engine-jDiWkul6.js} +7 -10
  100. package/dist/{dspy-rlm-engine-DN1p_5jx.js.map → dspy-rlm-engine-jDiWkul6.js.map} +1 -1
  101. package/dist/{emitter-DbMXUIVP.js → emitter-DhQ65mza.js} +3 -4
  102. package/dist/{emitter-DbMXUIVP.js.map → emitter-DhQ65mza.js.map} +1 -1
  103. package/dist/{emitter-DABYYTcH.d.ts → emitter-mAXC5PSN.d.ts} +3 -5
  104. package/dist/emitter-mAXC5PSN.d.ts.map +1 -0
  105. package/dist/{engine-dtRVeuQs.d.ts → engine-BITiErg-.d.ts} +10 -18
  106. package/dist/engine-BITiErg-.d.ts.map +1 -0
  107. package/dist/{equal-terms-DbPGcVtI.js → equal-terms-K11VHmR3.js} +3 -4
  108. package/dist/{equal-terms-DbPGcVtI.js.map → equal-terms-K11VHmR3.js.map} +1 -1
  109. package/dist/{errors-BcOs5MKW.js → errors-DeEEV9Vx.js} +2 -3
  110. package/dist/{errors-BcOs5MKW.js.map → errors-DeEEV9Vx.js.map} +1 -1
  111. package/dist/{errors-DEE6u6ot.d.ts → errors-E9I2hldP.d.ts} +1 -3
  112. package/dist/errors-E9I2hldP.d.ts.map +1 -0
  113. package/dist/{eval-campaign-DoX5vz3E.js → eval-campaign-Cgixrvf7.js} +8 -9
  114. package/dist/{eval-campaign-DoX5vz3E.js.map → eval-campaign-Cgixrvf7.js.map} +1 -1
  115. package/dist/{evaluation-wdGyZ7jV.js → evaluation-B8H3GYej.js} +4 -6
  116. package/dist/{evaluation-wdGyZ7jV.js.map → evaluation-B8H3GYej.js.map} +1 -1
  117. package/dist/{evaluation-DblGquCB.d.ts → evaluation-Djq7-Ybj.d.ts} +4 -6
  118. package/dist/evaluation-Djq7-Ybj.d.ts.map +1 -0
  119. package/dist/evaluation.d.ts +1 -1
  120. package/dist/evaluation.js +1 -2
  121. package/dist/{exact-types-Do63KoKn.d.ts → exact-types-CndDT_h7.d.ts} +8 -10
  122. package/dist/exact-types-CndDT_h7.d.ts.map +1 -0
  123. package/dist/{exec-CpbtOXVt.js → exec-C0_AkLUv.js} +3 -5
  124. package/dist/{exec-CpbtOXVt.js.map → exec-C0_AkLUv.js.map} +1 -1
  125. package/dist/{execution-tracks-CpgFPpS5.js → execution-tracks-DaDXYwAq.js} +2 -3
  126. package/dist/{execution-tracks-CpgFPpS5.js.map → execution-tracks-DaDXYwAq.js.map} +1 -1
  127. package/dist/experiment/index.d.ts +9 -37
  128. package/dist/experiment/index.d.ts.map +1 -1
  129. package/dist/experiment/index.js +29 -40
  130. package/dist/experiment/index.js.map +1 -1
  131. package/dist/{exporters-Dk3oEbK_.d.ts → exporters-B5Ze_RKh.d.ts} +4 -4
  132. package/dist/exporters-B5Ze_RKh.d.ts.map +1 -0
  133. package/dist/{exporters-DWvM16LE.js → exporters-ByLcILYU.js} +23 -5
  134. package/dist/exporters-ByLcILYU.js.map +1 -0
  135. package/dist/{external-optimizer-process-DEzJ2CGX.js → external-optimizer-process-BRVmaDFe.js} +5 -6
  136. package/dist/{external-optimizer-process-DEzJ2CGX.js.map → external-optimizer-process-BRVmaDFe.js.map} +1 -1
  137. package/dist/{external-optimizer-subprocess-B_ukPtRD.js → external-optimizer-subprocess-U616hV_l.js} +24 -37
  138. package/dist/{external-optimizer-subprocess-B_ukPtRD.js.map → external-optimizer-subprocess-U616hV_l.js.map} +1 -1
  139. package/dist/{extract-usage-BZLU01kR.js → extract-usage-ISFqhfDz.js} +2 -3
  140. package/dist/{extract-usage-BZLU01kR.js.map → extract-usage-ISFqhfDz.js.map} +1 -1
  141. package/dist/{failure-cluster-DN0t63Z0.d.ts → failure-cluster-DOoa7CBg.d.ts} +3 -7
  142. package/dist/failure-cluster-DOoa7CBg.d.ts.map +1 -0
  143. package/dist/{failure-taxonomy-Bx5oWqaW.js → failure-taxonomy-9eQfXKoW.js} +2 -3
  144. package/dist/{failure-taxonomy-Bx5oWqaW.js.map → failure-taxonomy-9eQfXKoW.js.map} +1 -1
  145. package/dist/{feedback-trajectory-CYVJXolG.d.ts → feedback-trajectory-DsHR9krG.d.ts} +7 -13
  146. package/dist/feedback-trajectory-DsHR9krG.d.ts.map +1 -0
  147. package/dist/{finding-composition-8n0fFgVI.js → finding-composition-DlvE1Qul.js} +4 -6
  148. package/dist/{finding-composition-8n0fFgVI.js.map → finding-composition-DlvE1Qul.js.map} +1 -1
  149. package/dist/{findings-store-Bg4sdS-e.js → findings-store-B75Dspaq.js} +11 -14
  150. package/dist/{findings-store-Bg4sdS-e.js.map → findings-store-B75Dspaq.js.map} +1 -1
  151. package/dist/fuzz.d.ts +3 -17
  152. package/dist/fuzz.d.ts.map +1 -1
  153. package/dist/fuzz.js +30 -29
  154. package/dist/fuzz.js.map +1 -1
  155. package/dist/{hf-dataset-CKxIJQba.js → hf-dataset-DPVQXW5n.js} +362 -21
  156. package/dist/hf-dataset-DPVQXW5n.js.map +1 -0
  157. package/dist/hosted/index.d.ts +2 -6
  158. package/dist/hosted/index.d.ts.map +1 -1
  159. package/dist/hosted/index.js +1 -2
  160. package/dist/{index-CalAsXMR.d.ts → index-B1Bm9oJA.d.ts} +3 -15
  161. package/dist/index-B1Bm9oJA.d.ts.map +1 -0
  162. package/dist/{index-D7fmC-1K.d.ts → index-BdKzYYkC.d.ts} +183 -36
  163. package/dist/index-BdKzYYkC.d.ts.map +1 -0
  164. package/dist/{index-CdEVr8-O.d.ts → index-Bdcpx2s8.d.ts} +24 -299
  165. package/dist/index-Bdcpx2s8.d.ts.map +1 -0
  166. package/dist/{index-jnuFLxOs.d.ts → index-Cu12qxJb.d.ts} +11 -39
  167. package/dist/index-Cu12qxJb.d.ts.map +1 -0
  168. package/dist/{index-CfJULcW5.d.ts → index-DAk2quYu.d.ts} +18 -38
  169. package/dist/index-DAk2quYu.d.ts.map +1 -0
  170. package/dist/{index-CHxwfW5g.d.ts → index-DwUGehqX.d.ts} +3 -9
  171. package/dist/index-DwUGehqX.d.ts.map +1 -0
  172. package/dist/{index-CTIRz-AB.d.ts → index-IzWTz5EP.d.ts} +14 -36
  173. package/dist/index-IzWTz5EP.d.ts.map +1 -0
  174. package/dist/index.d.ts +55 -188
  175. package/dist/index.d.ts.map +1 -1
  176. package/dist/index.js +122 -195
  177. package/dist/index.js.map +1 -1
  178. package/dist/{integrity-D-s2iHiT.js → integrity-B1V6klyO.js} +12 -363
  179. package/dist/integrity-B1V6klyO.js.map +1 -0
  180. package/dist/{integrity-D9lBnv_K.d.ts → integrity-BAdVzT8u.d.ts} +4 -6
  181. package/dist/integrity-BAdVzT8u.d.ts.map +1 -0
  182. package/dist/{integrity-W4CADcFc.js → integrity-DOHt1mwU.js} +3 -4
  183. package/dist/{integrity-W4CADcFc.js.map → integrity-DOHt1mwU.js.map} +1 -1
  184. package/dist/{internal-BTK91Bqt.js → internal-v6XfOeJW.js} +6 -8
  185. package/dist/{internal-BTK91Bqt.js.map → internal-v6XfOeJW.js.map} +1 -1
  186. package/dist/{interval-Dq9gt7jx.js → interval-Bd2f4CRT.js} +6 -8
  187. package/dist/{interval-Dq9gt7jx.js.map → interval-Bd2f4CRT.js.map} +1 -1
  188. package/dist/{interval-ohuOJurX.d.ts → interval-CWyxqDpE.d.ts} +1 -5
  189. package/dist/interval-CWyxqDpE.d.ts.map +1 -0
  190. package/dist/{journal-C7om8Gum.js → journal-C1uLJi0w.js} +115 -121
  191. package/dist/{journal-C7om8Gum.js.map → journal-C1uLJi0w.js.map} +1 -1
  192. package/dist/{json-BhdsJaOQ.js → json-DtvZNAU9.js} +4 -6
  193. package/dist/{json-BhdsJaOQ.js.map → json-DtvZNAU9.js.map} +1 -1
  194. package/dist/json-recovery-DK4MDm5r.js +296 -0
  195. package/dist/json-recovery-DK4MDm5r.js.map +1 -0
  196. package/dist/{judge-calibration-BkXMIWA4.js → judge-calibration-DGqlfWW8.js} +5 -6
  197. package/dist/{judge-calibration-BkXMIWA4.js.map → judge-calibration-DGqlfWW8.js.map} +1 -1
  198. package/dist/{judge-calibration-DFtEMlde.d.ts → judge-calibration-DnrbQaXI.d.ts} +1 -3
  199. package/dist/judge-calibration-DnrbQaXI.d.ts.map +1 -0
  200. package/dist/{judge-gate-BVvmP00P.js → judge-gate-C2BCOt-M.js} +8 -12
  201. package/dist/{judge-gate-BVvmP00P.js.map → judge-gate-C2BCOt-M.js.map} +1 -1
  202. package/dist/judges-BLxg5p8E.js +20 -0
  203. package/dist/judges-BLxg5p8E.js.map +1 -0
  204. package/dist/{kind-factory-Dl0PmNQL.js → kind-factory-VKysp1ds.js} +23 -39
  205. package/dist/{kind-factory-Dl0PmNQL.js.map → kind-factory-VKysp1ds.js.map} +1 -1
  206. package/dist/ledger-core/index.d.ts +2 -2
  207. package/dist/ledger-core/index.js +3 -3
  208. package/dist/ledger-core/lock-holder.d.ts +1 -1
  209. package/dist/ledger-core/lock-holder.js +1 -2
  210. package/dist/{ledger-core-CAxUdDk0.js → ledger-core-CfT-FzPf.js} +5 -6
  211. package/dist/{ledger-core-CAxUdDk0.js.map → ledger-core-CfT-FzPf.js.map} +1 -1
  212. package/dist/{llm-client-b1ysZVIU.js → llm-client-kJ9EOqjt.js} +22 -30
  213. package/dist/{llm-client-b1ysZVIU.js.map → llm-client-kJ9EOqjt.js.map} +1 -1
  214. package/dist/{llm-judge-Cybq29bL.js → llm-judge-cgbhTKQp.js} +108 -164
  215. package/dist/llm-judge-cgbhTKQp.js.map +1 -0
  216. package/dist/{lock-holder-DaJbfpci.d.ts → lock-holder-DoxlZFkQ.d.ts} +1 -3
  217. package/dist/lock-holder-DoxlZFkQ.d.ts.map +1 -0
  218. package/dist/matrix/index.d.ts +3 -3
  219. package/dist/matrix/index.js +2 -2
  220. package/dist/{matrix-DtkZLD_3.d.ts → matrix-8X6i5kJ6.d.ts} +4 -12
  221. package/dist/matrix-8X6i5kJ6.d.ts.map +1 -0
  222. package/dist/{matrix-B8l-Nsxd.js → matrix-CgpX8wdm.js} +8 -13
  223. package/dist/matrix-CgpX8wdm.js.map +1 -0
  224. package/dist/{mean-BbA_JCzW.js → mean-CdDYG-us.js} +6 -9
  225. package/dist/{mean-BbA_JCzW.js.map → mean-CdDYG-us.js.map} +1 -1
  226. package/dist/meta-eval/index.d.ts +3 -3
  227. package/dist/meta-eval/index.js +17 -21
  228. package/dist/meta-eval/index.js.map +1 -1
  229. package/dist/{metrics-BKaPBtIG.js → metrics-DNCAUtuB.js} +2 -3
  230. package/dist/{metrics-BKaPBtIG.js.map → metrics-DNCAUtuB.js.map} +1 -1
  231. package/dist/{mint-CbdwjTPW.js → mint-D9ZysYtY.js} +7 -8
  232. package/dist/{mint-CbdwjTPW.js.map → mint-D9ZysYtY.js.map} +1 -1
  233. package/dist/{multi-layer-verifier-DEgMUk6v.d.ts → multi-layer-verifier-lM4aVN78.d.ts} +2 -4
  234. package/dist/multi-layer-verifier-lM4aVN78.d.ts.map +1 -0
  235. package/dist/{multiplicity-Sg0U7h8j.js → multiplicity-DAd4xaDC.js} +3 -4
  236. package/dist/{multiplicity-Sg0U7h8j.js.map → multiplicity-DAd4xaDC.js.map} +1 -1
  237. package/dist/{multiplicity-DIWHvysC.d.ts → multiplicity-D_SEsc5j.d.ts} +1 -3
  238. package/dist/multiplicity-D_SEsc5j.d.ts.map +1 -0
  239. package/dist/multishot/golden/index.d.ts +1 -17
  240. package/dist/multishot/golden/index.d.ts.map +1 -1
  241. package/dist/multishot/golden/index.js +10 -17
  242. package/dist/multishot/golden/index.js.map +1 -1
  243. package/dist/multishot/index.d.ts +2 -10
  244. package/dist/multishot/index.d.ts.map +1 -1
  245. package/dist/multishot/index.js +11 -18
  246. package/dist/multishot/index.js.map +1 -1
  247. package/dist/{nonnegative-number-DvdMxg_f.js → nonnegative-number-lEYbOsuh.js} +2 -3
  248. package/dist/{nonnegative-number-DvdMxg_f.js.map → nonnegative-number-lEYbOsuh.js.map} +1 -1
  249. package/dist/openapi.json +1 -1
  250. package/dist/{otel-spans-64hmQqON.js → otel-spans-BsGzTWIK.js} +5 -6
  251. package/dist/{otel-spans-64hmQqON.js.map → otel-spans-BsGzTWIK.js.map} +1 -1
  252. package/dist/{otlp-attributes-D9ptWaIJ.js → otlp-attributes-Boeb7gtH.js} +2 -3
  253. package/dist/{otlp-attributes-D9ptWaIJ.js.map → otlp-attributes-Boeb7gtH.js.map} +1 -1
  254. package/dist/{outcome-observations-FLmRpgYa.js → outcome-observations-D4snOtUb.js} +4 -5
  255. package/dist/{outcome-observations-FLmRpgYa.js.map → outcome-observations-D4snOtUb.js.map} +1 -1
  256. package/dist/{outcome-store-DUcMj-3D.js → outcome-store-TarrcfHG.js} +2 -3
  257. package/dist/{outcome-store-DUcMj-3D.js.map → outcome-store-TarrcfHG.js.map} +1 -1
  258. package/dist/{package-version-D7lQHt_-.js → package-version-CJl_pY9W.js} +2 -3
  259. package/dist/{package-version-D7lQHt_-.js.map → package-version-CJl_pY9W.js.map} +1 -1
  260. package/dist/{paired-arms-B2ttLc0_.js → paired-arms-D-54hO-k.js} +10 -14
  261. package/dist/{paired-arms-B2ttLc0_.js.map → paired-arms-D-54hO-k.js.map} +1 -1
  262. package/dist/{paired-binary-B_nejA44.js → paired-binary-BR0nwHOA.js} +3 -4
  263. package/dist/{paired-binary-B_nejA44.js.map → paired-binary-BR0nwHOA.js.map} +1 -1
  264. package/dist/{paired-promotion-decision-CQMJ5xGN.d.ts → paired-promotion-decision-BDnqepZ1.d.ts} +1 -5
  265. package/dist/paired-promotion-decision-BDnqepZ1.d.ts.map +1 -0
  266. package/dist/{paired-promotion-decision-D0SHb-ZL.js → paired-promotion-decision-FGvHA4p_.js} +5 -7
  267. package/dist/{paired-promotion-decision-D0SHb-ZL.js.map → paired-promotion-decision-FGvHA4p_.js.map} +1 -1
  268. package/dist/{pareto-BiBnQXAE.js → pareto-B9udAt2i.js} +28 -50
  269. package/dist/pareto-B9udAt2i.js.map +1 -0
  270. package/dist/pipelines/index.d.ts +5 -11
  271. package/dist/pipelines/index.d.ts.map +1 -1
  272. package/dist/pipelines/index.js +6 -8
  273. package/dist/pipelines/index.js.map +1 -1
  274. package/dist/{power-and-mde-CQX-0weG.js → power-and-mde-ClI6RWw4.js} +4 -5
  275. package/dist/{power-and-mde-CQX-0weG.js.map → power-and-mde-ClI6RWw4.js.map} +1 -1
  276. package/dist/{predicate-FdKmElA_.js → predicate-BYHA4MBn.js} +2 -3
  277. package/dist/{predicate-FdKmElA_.js.map → predicate-BYHA4MBn.js.map} +1 -1
  278. package/dist/{prime-bridge-transport-6feEglLf.d.ts → prime-bridge-transport-Cfqir_Im.d.ts} +1 -3
  279. package/dist/prime-bridge-transport-Cfqir_Im.d.ts.map +1 -0
  280. package/dist/{prime-bridge-transport-Z3cpKGoV.js → prime-bridge-transport-Csd5SQg7.js} +2 -3
  281. package/dist/{prime-bridge-transport-Z3cpKGoV.js.map → prime-bridge-transport-Csd5SQg7.js.map} +1 -1
  282. package/dist/{prime-protocol-BGxjfhM4.d.ts → prime-protocol-BpQlTowq.d.ts} +4 -8
  283. package/dist/prime-protocol-BpQlTowq.d.ts.map +1 -0
  284. package/dist/{prime-protocol-BFgGrEMP.js → prime-protocol-CrhpXRz9.js} +4 -6
  285. package/dist/{prime-protocol-BFgGrEMP.js.map → prime-protocol-CrhpXRz9.js.map} +1 -1
  286. package/dist/profile-cell.d.ts +1 -1
  287. package/dist/profile-cell.js +1 -2
  288. package/dist/{promotion-gate-CkVZHagC.d.ts → promotion-gate-CixshGI8.d.ts} +5 -11
  289. package/dist/promotion-gate-CixshGI8.d.ts.map +1 -0
  290. package/dist/{promotion-policy-6A8osGr_.js → promotion-policy-CBYeD4zi.js} +5 -6
  291. package/dist/{promotion-policy-6A8osGr_.js.map → promotion-policy-CBYeD4zi.js.map} +1 -1
  292. package/dist/{proposal-findings-DqLUWsAG.js → proposal-findings-WFQrxnfe.js} +3 -4
  293. package/dist/{proposal-findings-DqLUWsAG.js.map → proposal-findings-WFQrxnfe.js.map} +1 -1
  294. package/dist/{quantile--0yb07pD.js → quantile-CncXP-Ss.js} +2 -3
  295. package/dist/{quantile--0yb07pD.js.map → quantile-CncXP-Ss.js.map} +1 -1
  296. package/dist/{query-B_RZ36an.js → query-CGXzO9d4.js} +5 -6
  297. package/dist/{query-B_RZ36an.js.map → query-CGXzO9d4.js.map} +1 -1
  298. package/dist/{query-Cmv_U8vf.d.ts → query-UD0B08Sb.d.ts} +4 -6
  299. package/dist/query-UD0B08Sb.d.ts.map +1 -0
  300. package/dist/{random-DGEyr3zG.d.ts → random-BN150Q_X.d.ts} +1 -5
  301. package/dist/random-BN150Q_X.d.ts.map +1 -0
  302. package/dist/{random-DDDcC7YU.js → random-DrzcgC7F.js} +3 -4
  303. package/dist/{random-DDDcC7YU.js.map → random-DrzcgC7F.js.map} +1 -1
  304. package/dist/{raw-provider-sink-75w4FWBj.js → raw-provider-sink-DDLkP_eF.js} +3 -4
  305. package/dist/{raw-provider-sink-75w4FWBj.js.map → raw-provider-sink-DDLkP_eF.js.map} +1 -1
  306. package/dist/{record-id-DUgsK5qp.js → record-id-CWZXFh58.js} +2 -3
  307. package/dist/{record-id-DUgsK5qp.js.map → record-id-CWZXFh58.js.map} +1 -1
  308. package/dist/{redact-DXdlFb_U.d.ts → redact-C_wzC4c_.d.ts} +1 -3
  309. package/dist/redact-C_wzC4c_.d.ts.map +1 -0
  310. package/dist/{redact-mtkTiJVk.js → redact-D6APJS1d.js} +3 -5
  311. package/dist/{redact-mtkTiJVk.js.map → redact-D6APJS1d.js.map} +1 -1
  312. package/dist/{registry-BcdJmyoU.d.ts → registry-D9A7Tybn.d.ts} +5 -11
  313. package/dist/registry-D9A7Tybn.d.ts.map +1 -0
  314. package/dist/{release-confidence-CYIFH-fp.js → release-confidence-CTUJz5mM.js} +10 -16
  315. package/dist/release-confidence-CTUJz5mM.js.map +1 -0
  316. package/dist/{render-BhJqXoBH.js → render-pfAZ7IR4.js} +266 -33
  317. package/dist/render-pfAZ7IR4.js.map +1 -0
  318. package/dist/{reporting-html-Kvlc8oMt.js → reporting-html-DMXIjATy.js} +2 -3
  319. package/dist/{reporting-html-Kvlc8oMt.js.map → reporting-html-DMXIjATy.js.map} +1 -1
  320. package/dist/reporting.d.ts +6 -6
  321. package/dist/reporting.js +7 -7
  322. package/dist/{researcher-DKWtoMWk.d.ts → researcher-CLnNJ7Or.d.ts} +8 -12
  323. package/dist/researcher-CLnNJ7Or.d.ts.map +1 -0
  324. package/dist/{reward-nw2xZGZG.js → reward-P0VD_Aft.js} +2 -3
  325. package/dist/{reward-nw2xZGZG.js.map → reward-P0VD_Aft.js.map} +1 -1
  326. package/dist/{reward-BeUgVVC_.d.ts → reward-ST4PXNXF.d.ts} +2 -4
  327. package/dist/reward-ST4PXNXF.d.ts.map +1 -0
  328. package/dist/{reward-hacking-WTxUbtbb.d.ts → reward-hacking-C9hPVT0Q.d.ts} +4 -8
  329. package/dist/reward-hacking-C9hPVT0Q.d.ts.map +1 -0
  330. package/dist/{reward-hacking-ByuETaIb.js → reward-hacking-DZzHZlS1.js} +5 -7
  331. package/dist/{reward-hacking-ByuETaIb.js.map → reward-hacking-DZzHZlS1.js.map} +1 -1
  332. package/dist/rl.d.ts +26 -63
  333. package/dist/rl.d.ts.map +1 -1
  334. package/dist/rl.js +35 -52
  335. package/dist/rl.js.map +1 -1
  336. package/dist/{rolldown-runtime-8H4AJuhK.js → rolldown-runtime-BJohB4LM.js} +1 -2
  337. package/dist/rollout/index.d.ts +6 -6
  338. package/dist/rollout/index.js +7 -7
  339. package/dist/{rollout-Dd1ucT_M.js → rollout-BhkMpAJT.js} +279 -16
  340. package/dist/rollout-BhkMpAJT.js.map +1 -0
  341. package/dist/{terminal-record-CB9BFtjS.js → rollout-nodes-BHR9Q5jP.js} +351 -11
  342. package/dist/rollout-nodes-BHR9Q5jP.js.map +1 -0
  343. package/dist/{round-decimal-COrKglMh.js → round-decimal-ZmjAQPo1.js} +2 -3
  344. package/dist/{round-decimal-COrKglMh.js.map → round-decimal-ZmjAQPo1.js.map} +1 -1
  345. package/dist/{rubric-predictive-validity-Cd5SCtAf.d.ts → rubric-predictive-validity-B3RzbwOx.d.ts} +2 -8
  346. package/dist/rubric-predictive-validity-B3RzbwOx.d.ts.map +1 -0
  347. package/dist/{rubric-predictive-validity-CeKW2GQN.js → rubric-predictive-validity-CQp_M0vy.js} +3 -4
  348. package/dist/{rubric-predictive-validity-CeKW2GQN.js.map → rubric-predictive-validity-CQp_M0vy.js.map} +1 -1
  349. package/dist/{run-record-CysKLB93.js → run-record-CZy4-TnZ.js} +4 -5
  350. package/dist/{run-record-CysKLB93.js.map → run-record-CZy4-TnZ.js.map} +1 -1
  351. package/dist/{run-record-C3awiXPf.d.ts → run-record-D2BFMPGl.d.ts} +5 -7
  352. package/dist/run-record-D2BFMPGl.d.ts.map +1 -0
  353. package/dist/{run-record-DhEJgoPz.js → run-record-DEjx43cI.js} +6 -7
  354. package/dist/{run-record-DhEJgoPz.js.map → run-record-DEjx43cI.js.map} +1 -1
  355. package/dist/{sandbox-harness-BlSOu4LX.d.ts → sandbox-harness-B3Kx1fOA.d.ts} +1 -3
  356. package/dist/sandbox-harness-B3Kx1fOA.d.ts.map +1 -0
  357. package/dist/{schema-D6EVKzTB.d.ts → schema-CkIvnmLU.d.ts} +2 -43
  358. package/dist/schema-CkIvnmLU.d.ts.map +1 -0
  359. package/dist/{schema-Bt2vLFm3.js → schema-D-xu3MU_.js} +2 -3
  360. package/dist/{schema-Bt2vLFm3.js.map → schema-D-xu3MU_.js.map} +1 -1
  361. package/dist/{schema-C-ziyJD7.d.ts → schema-DkFJr3Y8.d.ts} +111 -48
  362. package/dist/schema-DkFJr3Y8.d.ts.map +1 -0
  363. package/dist/{schema-CvhfLjtZ.js → schema-YUIXT8iW.js} +37 -7
  364. package/dist/schema-YUIXT8iW.js.map +1 -0
  365. package/dist/search/index.d.ts +3 -35
  366. package/dist/search/index.d.ts.map +1 -1
  367. package/dist/search/index.js +4 -5
  368. package/dist/{search-kernel-CctpiDd2.d.ts → search-kernel-B77eE7Ac.d.ts} +10 -36
  369. package/dist/search-kernel-B77eE7Ac.d.ts.map +1 -0
  370. package/dist/{search-ledger-CZRqtFbW.js → search-ledger-BsVi-Ngv.js} +17 -26
  371. package/dist/{search-ledger-CZRqtFbW.js.map → search-ledger-BsVi-Ngv.js.map} +1 -1
  372. package/dist/{search-ledger-file-Bd5Tioq6.js → search-ledger-file-DTBD6X-y.js} +6 -8
  373. package/dist/{search-ledger-file-Bd5Tioq6.js.map → search-ledger-file-DTBD6X-y.js.map} +1 -1
  374. package/dist/{search-ledger-types-p2xKfiDJ.d.ts → search-ledger-types-qiYRUo_N.d.ts} +5 -9
  375. package/dist/search-ledger-types-qiYRUo_N.d.ts.map +1 -0
  376. package/dist/{search-shipper-Dn3NLsuH.js → search-shipper-pdg4viK7.js} +8 -13
  377. package/dist/{search-shipper-Dn3NLsuH.js.map → search-shipper-pdg4viK7.js.map} +1 -1
  378. package/dist/{search-summary-D4bwYnAE.js → search-summary-Ct7SrmVc.js} +6 -7
  379. package/dist/{search-summary-D4bwYnAE.js.map → search-summary-Ct7SrmVc.js.map} +1 -1
  380. package/dist/{sequential-CimQrbjv.js → sequential-B1I0tRfL.js} +6 -7
  381. package/dist/{sequential-CimQrbjv.js.map → sequential-B1I0tRfL.js.map} +1 -1
  382. package/dist/{sequential-KwGspfeR.d.ts → sequential-Bb_pdTqG.d.ts} +1 -3
  383. package/dist/sequential-Bb_pdTqG.d.ts.map +1 -0
  384. package/dist/{sequential-BVv1sjsw.js → sequential-Bjs5roiK.js} +2 -3
  385. package/dist/{sequential-BVv1sjsw.js.map → sequential-Bjs5roiK.js.map} +1 -1
  386. package/dist/{sequential-eprocess-DodI6RoF.js → sequential-eprocess-C1YLwFaz.js} +3 -4
  387. package/dist/{sequential-eprocess-DodI6RoF.js.map → sequential-eprocess-C1YLwFaz.js.map} +1 -1
  388. package/dist/{server-ChhXPCgX.js → server-DA6h3co5.js} +11 -17
  389. package/dist/{server-ChhXPCgX.js.map → server-DA6h3co5.js.map} +1 -1
  390. package/dist/{single-run-lock-Dekd8_Wv.js → single-run-lock-BGlW3OSk.js} +3 -4
  391. package/dist/{single-run-lock-Dekd8_Wv.js.map → single-run-lock-BGlW3OSk.js.map} +1 -1
  392. package/dist/{skillopt-optimization-method-sB_-yi1G.js → skillopt-optimization-method-qB1M554K.js} +38 -57
  393. package/dist/{skillopt-optimization-method-sB_-yi1G.js.map → skillopt-optimization-method-qB1M554K.js.map} +1 -1
  394. package/dist/{spans-CVngGij3.d.ts → spans-vZoW__3q.d.ts} +2 -4
  395. package/dist/spans-vZoW__3q.d.ts.map +1 -0
  396. package/dist/{statistical-heldout-BjzSOmLH.d.ts → statistical-heldout-BYxHe3KO.d.ts} +9 -37
  397. package/dist/statistical-heldout-BYxHe3KO.d.ts.map +1 -0
  398. package/dist/{statistical-heldout-Bksv92Th.js → statistical-heldout-TP6ndL0B.js} +4 -5
  399. package/dist/{statistical-heldout-Bksv92Th.js.map → statistical-heldout-TP6ndL0B.js.map} +1 -1
  400. package/dist/{steps-DlepJPwD.d.ts → steps-B8fYY_Vo.d.ts} +1 -3
  401. package/dist/steps-B8fYY_Vo.d.ts.map +1 -0
  402. package/dist/{store-B3nWRy3B.d.ts → store-CMs5wGXP.d.ts} +2 -4
  403. package/dist/store-CMs5wGXP.d.ts.map +1 -0
  404. package/dist/{store-BhNuLdJw.js → store-ZykIyQmy.js} +2 -3
  405. package/dist/{store-BhNuLdJw.js.map → store-ZykIyQmy.js.map} +1 -1
  406. package/dist/{store-otlp-CFf27E8_.js → store-otlp-DmLm65XW.js} +8 -13
  407. package/dist/{store-otlp-CFf27E8_.js.map → store-otlp-DmLm65XW.js.map} +1 -1
  408. package/dist/{store-tool-spans-BK_8FjGG.js → store-tool-spans-C2g8UYm-.js} +17 -41
  409. package/dist/{store-tool-spans-BK_8FjGG.js.map → store-tool-spans-C2g8UYm-.js.map} +1 -1
  410. package/dist/{store-tool-spans-DxsFwtdr.d.ts → store-tool-spans-DMM6wMwB.d.ts} +11 -29
  411. package/dist/store-tool-spans-DMM6wMwB.d.ts.map +1 -0
  412. package/dist/storyboard/index.d.ts +1 -5
  413. package/dist/storyboard/index.d.ts.map +1 -1
  414. package/dist/storyboard/index.js +3 -5
  415. package/dist/storyboard/index.js.map +1 -1
  416. package/dist/{summary-report-C8V49Jt3.d.ts → summary-report-0La5vejY.d.ts} +5 -13
  417. package/dist/summary-report-0La5vejY.d.ts.map +1 -0
  418. package/dist/{summary-report-DHDWxe6p.js → summary-report-CPfsrLac.js} +21 -30
  419. package/dist/summary-report-CPfsrLac.js.map +1 -0
  420. package/dist/supervisor-run/index.d.ts +30 -29
  421. package/dist/supervisor-run/index.d.ts.map +1 -1
  422. package/dist/supervisor-run/index.js +6 -7
  423. package/dist/{systemone-CHnqwmYg.d.ts → systemone-UHbKD6LH.d.ts} +12 -24
  424. package/dist/systemone-UHbKD6LH.d.ts.map +1 -0
  425. package/dist/{systemone-protocol-Bl2EI2KQ.d.ts → systemone-protocol-C4t7JH4Y.d.ts} +1 -3
  426. package/dist/systemone-protocol-C4t7JH4Y.d.ts.map +1 -0
  427. package/dist/systemone-protocol.d.ts +1 -1
  428. package/dist/systemone-protocol.js +2 -3
  429. package/dist/{systemone-review-cQ9acAsb.d.ts → systemone-review-Cn9Uj0xG.d.ts} +8 -10
  430. package/dist/systemone-review-Cn9Uj0xG.d.ts.map +1 -0
  431. package/dist/{systemone-review-DFGtIUcf.js → systemone-review-S49gsy_y.js} +5 -6
  432. package/dist/{systemone-review-DFGtIUcf.js.map → systemone-review-S49gsy_y.js.map} +1 -1
  433. package/dist/systemone.d.ts +4 -4
  434. package/dist/systemone.js +3 -3
  435. package/dist/{task-failure-attributes-oIK3BhCR.js → task-failure-attributes-CC6VuIpk.js} +7 -10
  436. package/dist/{task-failure-attributes-oIK3BhCR.js.map → task-failure-attributes-CC6VuIpk.js.map} +1 -1
  437. package/dist/{tool-groups-b3oU_D88.d.ts → tool-groups-CFWmAGCV.d.ts} +3 -5
  438. package/dist/tool-groups-CFWmAGCV.d.ts.map +1 -0
  439. package/dist/{tool-waste-CkjzWmeY.d.ts → tool-waste-BFG1vwTV.d.ts} +4 -16
  440. package/dist/tool-waste-BFG1vwTV.d.ts.map +1 -0
  441. package/dist/{tool-waste-DLsjS_p-.js → tool-waste-CLJ46AbT.js} +10 -26
  442. package/dist/{tool-waste-DLsjS_p-.js.map → tool-waste-CLJ46AbT.js.map} +1 -1
  443. package/dist/trace-attributes.d.ts +1 -1
  444. package/dist/trace-attributes.js +1 -2
  445. package/dist/{trace-questions-BmT8M6UQ.d.ts → trace-questions-BFCQAzoT.d.ts} +4 -6
  446. package/dist/trace-questions-BFCQAzoT.d.ts.map +1 -0
  447. package/dist/trace-repair/index.d.ts +46 -92
  448. package/dist/trace-repair/index.d.ts.map +1 -1
  449. package/dist/trace-repair/index.js +32 -54
  450. package/dist/trace-repair/index.js.map +1 -1
  451. package/dist/traces.d.ts +13 -29
  452. package/dist/traces.d.ts.map +1 -1
  453. package/dist/traces.js +18 -22
  454. package/dist/traces.js.map +1 -1
  455. package/dist/{trajectory-D_7rLrvE.js → trajectory-O3GDHmev.js} +2 -3
  456. package/dist/{trajectory-D_7rLrvE.js.map → trajectory-O3GDHmev.js.map} +1 -1
  457. package/dist/trajectory-replay/index.d.ts +2 -22
  458. package/dist/trajectory-replay/index.d.ts.map +1 -1
  459. package/dist/trajectory-replay/index.js +19 -30
  460. package/dist/trajectory-replay/index.js.map +1 -1
  461. package/dist/{tree-DSqwJpL9.js → tree-DrIChF4a.js} +39 -68
  462. package/dist/{tree-DSqwJpL9.js.map → tree-DrIChF4a.js.map} +1 -1
  463. package/dist/{types-B_IFcKp5.d.ts → types-0KglnQ9o.d.ts} +3 -15
  464. package/dist/types-0KglnQ9o.d.ts.map +1 -0
  465. package/dist/{types-6Lfdlshp.d.ts → types-BEvjDziM.d.ts} +50 -62
  466. package/dist/types-BEvjDziM.d.ts.map +1 -0
  467. package/dist/{types-CnWmj8NW.js → types-BK0blWhe.js} +3 -4
  468. package/dist/{types-CnWmj8NW.js.map → types-BK0blWhe.js.map} +1 -1
  469. package/dist/{types-CmXY0PQf.d.ts → types-C-aOqgt2.d.ts} +2 -5
  470. package/dist/types-C-aOqgt2.d.ts.map +1 -0
  471. package/dist/{types-BXgASBCL.js → types-DK4vNv5q.js} +2 -3
  472. package/dist/{types-BXgASBCL.js.map → types-DK4vNv5q.js.map} +1 -1
  473. package/dist/{types-DZ0mYVw9.d.ts → types-DUR0dqET.d.ts} +3 -5
  474. package/dist/types-DUR0dqET.d.ts.map +1 -0
  475. package/dist/{types-M6eF9m-r.d.ts → types-e3HGaI7P.d.ts} +84 -24
  476. package/dist/types-e3HGaI7P.d.ts.map +1 -0
  477. package/dist/{verdict-BGQmxQ8A.js → verdict-C8TcdwfD.js} +3 -4
  478. package/dist/{verdict-BGQmxQ8A.js.map → verdict-C8TcdwfD.js.map} +1 -1
  479. package/dist/{verdict-C24NELtN.d.ts → verdict-D_qiBQ6_.d.ts} +1 -5
  480. package/dist/verdict-D_qiBQ6_.d.ts.map +1 -0
  481. package/dist/{verdict-cache-CL_7tePD.js → verdict-cache-BVH-fl18.js} +3 -4
  482. package/dist/{verdict-cache-CL_7tePD.js.map → verdict-cache-BVH-fl18.js.map} +1 -1
  483. package/dist/wire/index.d.ts +43 -51
  484. package/dist/wire/index.d.ts.map +1 -1
  485. package/dist/wire/index.js +1 -2
  486. package/docs/eval-surface-map.md +15 -0
  487. package/docs/rollout.md +132 -6
  488. package/package.json +18 -18
  489. package/dist/adversarial-smnADNFS.d.ts.map +0 -1
  490. package/dist/agent-profile-CNmwfaqq.d.ts.map +0 -1
  491. package/dist/agent-profile-cell-BcpFbNd5.d.ts.map +0 -1
  492. package/dist/analyze-runs-DfX6dHP0.d.ts.map +0 -1
  493. package/dist/attribute-vocabulary-CcXqHODT.d.ts.map +0 -1
  494. package/dist/benchmark-command-Cnjfo0Zh.js.map +0 -1
  495. package/dist/campaign-evidence-DunzcJGv.js.map +0 -1
  496. package/dist/campaign-uddTlFg5.js.map +0 -1
  497. package/dist/canonical-CFpojCN5.d.ts.map +0 -1
  498. package/dist/client-hwo3cJjR.d.ts.map +0 -1
  499. package/dist/completion-verifier-asaV1nSj.js.map +0 -1
  500. package/dist/cost-ledger-C1W3ICmP.d.ts.map +0 -1
  501. package/dist/dataset-DQqhOCPt.d.ts.map +0 -1
  502. package/dist/default-registry-CLG5YqGS.d.ts.map +0 -1
  503. package/dist/define-agent-eval-JKt3gMQr.d.ts.map +0 -1
  504. package/dist/descriptive-B2iPaT9J.d.ts +0 -89
  505. package/dist/descriptive-B2iPaT9J.d.ts.map +0 -1
  506. package/dist/descriptive-CVNy48rR.js.map +0 -1
  507. package/dist/emitter-DABYYTcH.d.ts.map +0 -1
  508. package/dist/engine-dtRVeuQs.d.ts.map +0 -1
  509. package/dist/errors-DEE6u6ot.d.ts.map +0 -1
  510. package/dist/evaluation-DblGquCB.d.ts.map +0 -1
  511. package/dist/exact-types-Do63KoKn.d.ts.map +0 -1
  512. package/dist/exporters-DWvM16LE.js.map +0 -1
  513. package/dist/exporters-Dk3oEbK_.d.ts.map +0 -1
  514. package/dist/failure-cluster-DN0t63Z0.d.ts.map +0 -1
  515. package/dist/feedback-trajectory-CYVJXolG.d.ts.map +0 -1
  516. package/dist/hf-dataset-CKxIJQba.js.map +0 -1
  517. package/dist/index-CHxwfW5g.d.ts.map +0 -1
  518. package/dist/index-CTIRz-AB.d.ts.map +0 -1
  519. package/dist/index-CalAsXMR.d.ts.map +0 -1
  520. package/dist/index-CdEVr8-O.d.ts.map +0 -1
  521. package/dist/index-CfJULcW5.d.ts.map +0 -1
  522. package/dist/index-D7fmC-1K.d.ts.map +0 -1
  523. package/dist/index-jnuFLxOs.d.ts.map +0 -1
  524. package/dist/integrity-D-s2iHiT.js.map +0 -1
  525. package/dist/integrity-D9lBnv_K.d.ts.map +0 -1
  526. package/dist/interval-ohuOJurX.d.ts.map +0 -1
  527. package/dist/judge-calibration-DFtEMlde.d.ts.map +0 -1
  528. package/dist/llm-judge-Cybq29bL.js.map +0 -1
  529. package/dist/lock-holder-DaJbfpci.d.ts.map +0 -1
  530. package/dist/matrix-B8l-Nsxd.js.map +0 -1
  531. package/dist/matrix-DtkZLD_3.d.ts.map +0 -1
  532. package/dist/mint-CkzpVPdz.d.ts +0 -81
  533. package/dist/mint-CkzpVPdz.d.ts.map +0 -1
  534. package/dist/multi-layer-verifier-DEgMUk6v.d.ts.map +0 -1
  535. package/dist/multiplicity-DIWHvysC.d.ts.map +0 -1
  536. package/dist/paired-promotion-decision-CQMJ5xGN.d.ts.map +0 -1
  537. package/dist/pareto-BiBnQXAE.js.map +0 -1
  538. package/dist/prime-bridge-transport-6feEglLf.d.ts.map +0 -1
  539. package/dist/prime-protocol-BGxjfhM4.d.ts.map +0 -1
  540. package/dist/promotion-gate-CkVZHagC.d.ts.map +0 -1
  541. package/dist/query-Cmv_U8vf.d.ts.map +0 -1
  542. package/dist/random-DGEyr3zG.d.ts.map +0 -1
  543. package/dist/redact-DXdlFb_U.d.ts.map +0 -1
  544. package/dist/registry-BcdJmyoU.d.ts.map +0 -1
  545. package/dist/release-confidence-CYIFH-fp.js.map +0 -1
  546. package/dist/render-BhJqXoBH.js.map +0 -1
  547. package/dist/researcher-DKWtoMWk.d.ts.map +0 -1
  548. package/dist/reward-BeUgVVC_.d.ts.map +0 -1
  549. package/dist/reward-hacking-WTxUbtbb.d.ts.map +0 -1
  550. package/dist/rollout-Dd1ucT_M.js.map +0 -1
  551. package/dist/rubric-predictive-validity-Cd5SCtAf.d.ts.map +0 -1
  552. package/dist/run-record-C3awiXPf.d.ts.map +0 -1
  553. package/dist/sandbox-harness-BlSOu4LX.d.ts.map +0 -1
  554. package/dist/schema-C-ziyJD7.d.ts.map +0 -1
  555. package/dist/schema-CvhfLjtZ.js.map +0 -1
  556. package/dist/schema-D6EVKzTB.d.ts.map +0 -1
  557. package/dist/search-kernel-CctpiDd2.d.ts.map +0 -1
  558. package/dist/search-ledger-types-p2xKfiDJ.d.ts.map +0 -1
  559. package/dist/sequential-KwGspfeR.d.ts.map +0 -1
  560. package/dist/spans-CVngGij3.d.ts.map +0 -1
  561. package/dist/statistical-heldout-BjzSOmLH.d.ts.map +0 -1
  562. package/dist/steps-DlepJPwD.d.ts.map +0 -1
  563. package/dist/store-B3nWRy3B.d.ts.map +0 -1
  564. package/dist/store-tool-spans-DxsFwtdr.d.ts.map +0 -1
  565. package/dist/summary-report-C8V49Jt3.d.ts.map +0 -1
  566. package/dist/summary-report-DHDWxe6p.js.map +0 -1
  567. package/dist/systemone-CHnqwmYg.d.ts.map +0 -1
  568. package/dist/systemone-protocol-Bl2EI2KQ.d.ts.map +0 -1
  569. package/dist/systemone-review-cQ9acAsb.d.ts.map +0 -1
  570. package/dist/terminal-record-CB9BFtjS.js.map +0 -1
  571. package/dist/tool-groups-b3oU_D88.d.ts.map +0 -1
  572. package/dist/tool-waste-CkjzWmeY.d.ts.map +0 -1
  573. package/dist/trace-questions-BmT8M6UQ.d.ts.map +0 -1
  574. package/dist/types-6Lfdlshp.d.ts.map +0 -1
  575. package/dist/types-B_IFcKp5.d.ts.map +0 -1
  576. package/dist/types-CmXY0PQf.d.ts.map +0 -1
  577. package/dist/types-DZ0mYVw9.d.ts.map +0 -1
  578. package/dist/types-M6eF9m-r.d.ts.map +0 -1
  579. package/dist/verdict-C24NELtN.d.ts.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { SSEChunkParser } from "@tangle-network/agent-core/sse";
2
2
  import { TOKEN_USAGE_INPUT_KEYS, TOKEN_USAGE_OUTPUT_KEYS, firstTokenCount, tokenUsageSource } from "@tangle-network/agent-core/telemetry";
3
- //#region src/trace/extract-usage.ts
3
+ // src/trace/extract-usage.ts
4
4
  /**
5
5
  * Provider response and SSE usage extraction.
6
6
  *
@@ -129,7 +129,6 @@ function parseSseJson(raw) {
129
129
  return null;
130
130
  }
131
131
  }
132
- //#endregion
133
132
  export { extractUsageFromSse as n, extractUsage as t };
134
133
 
135
- //# sourceMappingURL=extract-usage-BZLU01kR.js.map
134
+ //# sourceMappingURL=extract-usage-ISFqhfDz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"extract-usage-BZLU01kR.js","names":["obj"],"sources":["../src/trace/extract-usage.ts"],"sourcesContent":["/**\n * Provider response and SSE usage extraction.\n *\n * Missing usage returns `null`; reported zeroes and cache-only activity remain\n * distinguishable from absent telemetry.\n */\n\nimport { SSEChunkParser } from '@tangle-network/agent-core/sse'\nimport {\n firstTokenCount,\n TOKEN_USAGE_INPUT_KEYS,\n TOKEN_USAGE_OUTPUT_KEYS,\n tokenUsageSource,\n} from '@tangle-network/agent-core/telemetry'\nimport type { RunTokenUsage } from '../run-record'\n\nexport type ExtractedUsage = RunTokenUsage\nexport type SseUsageMode = 'cumulative' | 'delta'\n\nexport interface ExtractUsageFromSseOptions {\n /** Provider usage events are cumulative snapshots unless explicitly marked as deltas. */\n mode?: SseUsageMode\n}\n\nconst INPUT_OTHER_KEYS = ['input_other'] as const\nconst EXCLUSIVE_REASONING_KEYS = ['reasoning', 'reasoning_tokens', 'reasoningTokens'] as const\nconst INCLUSIVE_REASONING_KEYS = ['reasoning_output_tokens', 'reasoningOutputTokens'] as const\nconst INPUT_DETAIL_KEYS = ['prompt_tokens_details', 'input_tokens_details'] as const\nconst OUTPUT_DETAIL_KEYS = ['completion_tokens_details', 'output_tokens_details'] as const\nconst CACHED_KEYS = [\n 'cache',\n 'cached_tokens',\n 'cached_input_tokens',\n 'cache_read_tokens',\n 'cache_read_input_tokens',\n 'cachedTokens',\n 'cachedInputTokens',\n 'cacheReadTokens',\n 'cacheReadInputTokens',\n 'input_cache_read',\n] as const\nconst CACHE_WRITE_KEYS = [\n 'cache_creation_tokens',\n 'cache_creation_input_tokens',\n 'cacheCreationTokens',\n 'cacheCreationInputTokens',\n 'input_cache_creation',\n] as const\n\nfunction nestedRecord(\n source: Record<string, unknown>,\n key: string,\n): Record<string, unknown> | undefined {\n const value = source[key]\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined\n}\n\nfunction nestedNumber(\n source: Record<string, unknown>,\n recordKeys: readonly string[],\n valueKeys: readonly string[],\n): number | undefined {\n for (const recordKey of recordKeys) {\n const value = firstTokenCount(nestedRecord(source, recordKey), valueKeys)\n if (value !== undefined) return value\n }\n return undefined\n}\n\n/**\n * Pull `{ input, output, cached?, cacheWrite? }` from a parsed response\n * body. Accepts a top-level `usage` object (the common case) or a body that IS\n * the usage object. Returns null only when none of those categories is present.\n */\nexport function extractUsage(body: unknown): ExtractedUsage | null {\n if (!body || typeof body !== 'object') return null\n const obj = body as Record<string, unknown>\n const usage = tokenUsageSource(obj)\n const input = firstTokenCount(usage, TOKEN_USAGE_INPUT_KEYS)\n const inputOther = firstTokenCount(usage, INPUT_OTHER_KEYS)\n const output = firstTokenCount(usage, TOKEN_USAGE_OUTPUT_KEYS)\n const exclusiveReasoning = firstTokenCount(usage, EXCLUSIVE_REASONING_KEYS)\n const inclusiveReasoning =\n firstTokenCount(usage, INCLUSIVE_REASONING_KEYS) ??\n nestedNumber(usage, OUTPUT_DETAIL_KEYS, ['reasoning_tokens', 'reasoningTokens'])\n const reasoning = exclusiveReasoning ?? inclusiveReasoning\n const nestedCache = nestedRecord(usage, 'cache')\n const promptCache = nestedRecord(usage, 'prompt_cache')\n const cached =\n firstTokenCount(usage, CACHED_KEYS) ??\n firstTokenCount(nestedCache, ['read']) ??\n nestedNumber(usage, INPUT_DETAIL_KEYS, ['cached_tokens', 'cachedTokens']) ??\n firstTokenCount(promptCache, ['read_tokens'])\n const cacheWrite =\n firstTokenCount(usage, CACHE_WRITE_KEYS) ??\n firstTokenCount(nestedCache, ['write']) ??\n nestedNumber(usage, INPUT_DETAIL_KEYS, ['cache_write_tokens', 'cacheWriteTokens']) ??\n firstTokenCount(promptCache, ['write_tokens'])\n if (\n input === undefined &&\n inputOther === undefined &&\n output === undefined &&\n reasoning === undefined &&\n cached === undefined &&\n cacheWrite === undefined\n )\n return null\n const result: ExtractedUsage = {\n input: (input ?? 0) + (inputOther ?? 0),\n output:\n (output ?? (inclusiveReasoning !== undefined ? inclusiveReasoning : 0)) +\n (exclusiveReasoning ?? 0),\n }\n if (reasoning !== undefined) result.reasoning = reasoning\n if (cached !== undefined) result.cached = cached\n if (cacheWrite !== undefined) result.cacheWrite = cacheWrite\n return result\n}\n\n/**\n * Extract token usage from a complete SSE response body using the shared SSE\n * frame parser. Cumulative snapshots are the fail-safe default because summing\n * them inflates billing; callers with explicit delta events opt into `mode: 'delta'`.\n */\nexport function extractUsageFromSse(\n text: string,\n options: ExtractUsageFromSseOptions = {},\n): ExtractedUsage | null {\n const mode = options.mode ?? 'cumulative'\n let input = 0\n let output = 0\n let reasoning = 0\n let sawReasoning = false\n let cached = 0\n let sawCached = false\n let cacheWrite = 0\n let sawCacheWrite = false\n let found = false\n const parser = new SSEChunkParser<unknown>({ transform: parseSseJson })\n const events = [...parser.push(text), ...parser.flush()]\n const merge = mode === 'delta' ? (current: number, next: number) => current + next : Math.max\n\n for (const event of events) {\n const usage = extractUsage(event.data)\n if (!usage) continue\n input = merge(input, usage.input)\n output = merge(output, usage.output)\n if (usage.reasoning !== undefined) {\n reasoning = merge(reasoning, usage.reasoning)\n sawReasoning = true\n }\n if (usage.cached !== undefined) {\n cached = merge(cached, usage.cached)\n sawCached = true\n }\n if (usage.cacheWrite !== undefined) {\n cacheWrite = merge(cacheWrite, usage.cacheWrite)\n sawCacheWrite = true\n }\n found = true\n }\n if (!found) return null\n return {\n input,\n output,\n ...(sawReasoning ? { reasoning } : {}),\n ...(sawCached ? { cached } : {}),\n ...(sawCacheWrite ? { cacheWrite } : {}),\n }\n}\n\nfunction parseSseJson(raw: string): unknown | null {\n const payload = raw.trim()\n if (!payload || payload === '[DONE]') return null\n try {\n return JSON.parse(payload)\n } catch {\n return null\n }\n}\n\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"extract-usage-ISFqhfDz.js","names":["obj"],"sources":["../src/trace/extract-usage.ts"],"sourcesContent":["/**\n * Provider response and SSE usage extraction.\n *\n * Missing usage returns `null`; reported zeroes and cache-only activity remain\n * distinguishable from absent telemetry.\n */\n\nimport { SSEChunkParser } from '@tangle-network/agent-core/sse'\nimport {\n firstTokenCount,\n TOKEN_USAGE_INPUT_KEYS,\n TOKEN_USAGE_OUTPUT_KEYS,\n tokenUsageSource,\n} from '@tangle-network/agent-core/telemetry'\nimport type { RunTokenUsage } from '../run-record'\n\nexport type ExtractedUsage = RunTokenUsage\nexport type SseUsageMode = 'cumulative' | 'delta'\n\nexport interface ExtractUsageFromSseOptions {\n /** Provider usage events are cumulative snapshots unless explicitly marked as deltas. */\n mode?: SseUsageMode\n}\n\nconst INPUT_OTHER_KEYS = ['input_other'] as const\nconst EXCLUSIVE_REASONING_KEYS = ['reasoning', 'reasoning_tokens', 'reasoningTokens'] as const\nconst INCLUSIVE_REASONING_KEYS = ['reasoning_output_tokens', 'reasoningOutputTokens'] as const\nconst INPUT_DETAIL_KEYS = ['prompt_tokens_details', 'input_tokens_details'] as const\nconst OUTPUT_DETAIL_KEYS = ['completion_tokens_details', 'output_tokens_details'] as const\nconst CACHED_KEYS = [\n 'cache',\n 'cached_tokens',\n 'cached_input_tokens',\n 'cache_read_tokens',\n 'cache_read_input_tokens',\n 'cachedTokens',\n 'cachedInputTokens',\n 'cacheReadTokens',\n 'cacheReadInputTokens',\n 'input_cache_read',\n] as const\nconst CACHE_WRITE_KEYS = [\n 'cache_creation_tokens',\n 'cache_creation_input_tokens',\n 'cacheCreationTokens',\n 'cacheCreationInputTokens',\n 'input_cache_creation',\n] as const\n\nfunction nestedRecord(\n source: Record<string, unknown>,\n key: string,\n): Record<string, unknown> | undefined {\n const value = source[key]\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined\n}\n\nfunction nestedNumber(\n source: Record<string, unknown>,\n recordKeys: readonly string[],\n valueKeys: readonly string[],\n): number | undefined {\n for (const recordKey of recordKeys) {\n const value = firstTokenCount(nestedRecord(source, recordKey), valueKeys)\n if (value !== undefined) return value\n }\n return undefined\n}\n\n/**\n * Pull `{ input, output, cached?, cacheWrite? }` from a parsed response\n * body. Accepts a top-level `usage` object (the common case) or a body that IS\n * the usage object. Returns null only when none of those categories is present.\n */\nexport function extractUsage(body: unknown): ExtractedUsage | null {\n if (!body || typeof body !== 'object') return null\n const obj = body as Record<string, unknown>\n const usage = tokenUsageSource(obj)\n const input = firstTokenCount(usage, TOKEN_USAGE_INPUT_KEYS)\n const inputOther = firstTokenCount(usage, INPUT_OTHER_KEYS)\n const output = firstTokenCount(usage, TOKEN_USAGE_OUTPUT_KEYS)\n const exclusiveReasoning = firstTokenCount(usage, EXCLUSIVE_REASONING_KEYS)\n const inclusiveReasoning =\n firstTokenCount(usage, INCLUSIVE_REASONING_KEYS) ??\n nestedNumber(usage, OUTPUT_DETAIL_KEYS, ['reasoning_tokens', 'reasoningTokens'])\n const reasoning = exclusiveReasoning ?? inclusiveReasoning\n const nestedCache = nestedRecord(usage, 'cache')\n const promptCache = nestedRecord(usage, 'prompt_cache')\n const cached =\n firstTokenCount(usage, CACHED_KEYS) ??\n firstTokenCount(nestedCache, ['read']) ??\n nestedNumber(usage, INPUT_DETAIL_KEYS, ['cached_tokens', 'cachedTokens']) ??\n firstTokenCount(promptCache, ['read_tokens'])\n const cacheWrite =\n firstTokenCount(usage, CACHE_WRITE_KEYS) ??\n firstTokenCount(nestedCache, ['write']) ??\n nestedNumber(usage, INPUT_DETAIL_KEYS, ['cache_write_tokens', 'cacheWriteTokens']) ??\n firstTokenCount(promptCache, ['write_tokens'])\n if (\n input === undefined &&\n inputOther === undefined &&\n output === undefined &&\n reasoning === undefined &&\n cached === undefined &&\n cacheWrite === undefined\n )\n return null\n const result: ExtractedUsage = {\n input: (input ?? 0) + (inputOther ?? 0),\n output:\n (output ?? (inclusiveReasoning !== undefined ? inclusiveReasoning : 0)) +\n (exclusiveReasoning ?? 0),\n }\n if (reasoning !== undefined) result.reasoning = reasoning\n if (cached !== undefined) result.cached = cached\n if (cacheWrite !== undefined) result.cacheWrite = cacheWrite\n return result\n}\n\n/**\n * Extract token usage from a complete SSE response body using the shared SSE\n * frame parser. Cumulative snapshots are the fail-safe default because summing\n * them inflates billing; callers with explicit delta events opt into `mode: 'delta'`.\n */\nexport function extractUsageFromSse(\n text: string,\n options: ExtractUsageFromSseOptions = {},\n): ExtractedUsage | null {\n const mode = options.mode ?? 'cumulative'\n let input = 0\n let output = 0\n let reasoning = 0\n let sawReasoning = false\n let cached = 0\n let sawCached = false\n let cacheWrite = 0\n let sawCacheWrite = false\n let found = false\n const parser = new SSEChunkParser<unknown>({ transform: parseSseJson })\n const events = [...parser.push(text), ...parser.flush()]\n const merge = mode === 'delta' ? (current: number, next: number) => current + next : Math.max\n\n for (const event of events) {\n const usage = extractUsage(event.data)\n if (!usage) continue\n input = merge(input, usage.input)\n output = merge(output, usage.output)\n if (usage.reasoning !== undefined) {\n reasoning = merge(reasoning, usage.reasoning)\n sawReasoning = true\n }\n if (usage.cached !== undefined) {\n cached = merge(cached, usage.cached)\n sawCached = true\n }\n if (usage.cacheWrite !== undefined) {\n cacheWrite = merge(cacheWrite, usage.cacheWrite)\n sawCacheWrite = true\n }\n found = true\n }\n if (!found) return null\n return {\n input,\n output,\n ...(sawReasoning ? { reasoning } : {}),\n ...(sawCached ? { cached } : {}),\n ...(sawCacheWrite ? { cacheWrite } : {}),\n }\n}\n\nfunction parseSseJson(raw: string): unknown | null {\n const payload = raw.trim()\n if (!payload || payload === '[DONE]') return null\n try {\n return JSON.parse(payload)\n } catch {\n return null\n }\n}\n\n\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
- import { S as TraceEvent, _ as Span, f as Run, o as FailureClass } from "./schema-D6EVKzTB.js";
2
- import { s as TraceStore } from "./store-B3nWRy3B.js";
3
- //#region src/failure-taxonomy.d.ts
1
+ import { S as TraceEvent, _ as Span, f as Run, o as FailureClass } from "./schema-CkIvnmLU.js";
2
+ import { s as TraceStore } from "./store-CMs5wGXP.js";
4
3
  /**
5
4
  * Who a failure is charged to. This is the axis a comparison reads before it
6
5
  * counts a loss.
@@ -81,8 +80,6 @@ declare function classifyFailureReason(reason: string | null | undefined, rules?
81
80
  * would already have returned `unknown` can change class this way.
82
81
  */
83
82
  declare function classifyFailure(ctx: FailureContext, rules?: FailureRule[], reasonRules?: readonly FailureReasonRule[]): FailureClassification;
84
- //#endregion
85
- //#region src/pipelines/failure-cluster.d.ts
86
83
  interface FailureCluster {
87
84
  failureClass: FailureClass;
88
85
  /** Tool name when the trigger was a tool span, else undefined. */
@@ -110,6 +107,5 @@ declare function failureClusterView(store: TraceStore, options?: {
110
107
  rules?: FailureRule[];
111
108
  minClusterSize?: number;
112
109
  }): Promise<FailureClusterReport>;
113
- //#endregion
114
110
  export { FailureClassification as a, FailureRule as c, failureBlame as d, FailureBlame as i, classifyFailure as l, FailureClusterReport as n, FailureContext as o, failureClusterView as r, FailureReasonRule as s, FailureCluster as t, classifyFailureReason as u };
115
- //# sourceMappingURL=failure-cluster-DN0t63Z0.d.ts.map
111
+ //# sourceMappingURL=failure-cluster-DOoa7CBg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure-cluster-DOoa7CBg.d.ts","names":[],"sources":["../src/failure-taxonomy.ts","../src/pipelines/failure-cluster.ts"],"mappings":";;;;;;;;;;;;;;;;;;;KA6CY;;iBAuHI,aAAa,cAAc,eAAe;UAIzC;EACf,KAAK;EACL,OAAO;EACP,QAAQ;;UAGO;EACf,cAAc;;EAEd,OAAO;EACP;EACA;EACA;;;UAIe;EACf;EACA,QAAQ,KAAK;IACX,cAAc;IACd;;IAEA,QAAQ;IACR;IACA;;;;;;;;;;UAWa;;EAEf,cAAc;EACd,SAAS;;EAET,QAAQ;;;;;;;;;;;;iBAwEM,sBACd,mCACA,iBAAgB,sBACf;;;;;;;;;;iBAkba,gBACd,KAAK,gBACL,QAAO,eACP,uBAAsB,sBACrB;UCpsBc;EACf,cAAc;;EAEd;;EAEA;;;;;;;EAOA;EACA;EACA;EACA;EACA;;UAGe;EACf,UAAU;EACV;EACA;;iBAGoB,mBACpB,OAAO,YACP;EAAW,QAAQ;EAAe;IACjC,QAAQ"}
@@ -1,4 +1,4 @@
1
- //#region src/failure-taxonomy.ts
1
+ // src/failure-taxonomy.ts
2
2
  /**
3
3
  * Blame for every canonical class. The `Record` is exhaustive on purpose: a
4
4
  * class added to `FAILURE_CLASSES` without a blame here fails to compile, so
@@ -515,7 +515,6 @@ function recordedReasons(ctx) {
515
515
  if (typeof notes === "string" && notes.trim()) found.push({ text: notes });
516
516
  return found;
517
517
  }
518
- //#endregion
519
518
  export { failureBlame as i, classifyFailure as n, classifyFailureReason as r, DEFAULT_RULES as t };
520
519
 
521
- //# sourceMappingURL=failure-taxonomy-Bx5oWqaW.js.map
520
+ //# sourceMappingURL=failure-taxonomy-9eQfXKoW.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"failure-taxonomy-Bx5oWqaW.js","names":[],"sources":["../src/failure-taxonomy.ts"],"sourcesContent":["/**\n * Failure taxonomy — canonical classes, who each one is charged to, and two\n * default classifiers.\n *\n * Every failed run should end up in a named class. The classifiers here are\n * rule-based (fast, deterministic); an LLM fallback can be added by the\n * consumer for novel cases and trained into the rule base over time.\n *\n * Two entry points, because a dead run does not always leave a trace:\n * - `classifyFailure(ctx)` reads a run with its spans and events, and\n * persists as `Run.outcome.failureClass`;\n * - `classifyFailureReason(text)` reads the one thing a run that died before\n * any span always leaves — a reason string on its terminal record.\n * `classifyFailure` calls the reason classifier itself when no structural rule\n * matches, so a run whose only evidence is `ECONNREFUSED` no longer lands in\n * `unknown`.\n *\n * Every classification carries a `blame`. Without it a comparison charges\n * infrastructure outages to the agent under test: a run that never reached a\n * model is not evidence about the agent and must be voided, not counted as a\n * loss.\n */\n\nimport type { FailureClass, Run, Span, TraceEvent } from './trace/schema'\nimport { FAILURE_CLASSES } from './trace/schema'\n\nexport { FAILURE_CLASSES, type FailureClass }\n\n/**\n * Who a failure is charged to. This is the axis a comparison reads before it\n * counts a loss.\n *\n * `machine` — the run never reached a model. The bridge refused, its lane was\n * full, the box never provisioned, the credential was absent. An\n * agent cannot route around this, so a run that recorded nothing\n * behind only machine failures is not evidence about the agent.\n * `provider` — the model was reached and the turn did not complete: an empty\n * completion, a torn stream, a killed process. Every arm faces\n * the same provider on the same day, so this stays charged.\n * `agent` — the agent's own reasoning, tool use, budgeting, or scheduling\n * produced the failure. Charged.\n * `unknown` — the record does not say. Never voids a run: an unread reason is\n * not a proven outage.\n * `none` — no failure to charge.\n */\nexport type FailureBlame = 'none' | 'machine' | 'provider' | 'agent' | 'unknown'\n\n/**\n * Blame for every canonical class. The `Record` is exhaustive on purpose: a\n * class added to `FAILURE_CLASSES` without a blame here fails to compile, so\n * the axis cannot silently acquire a hole that reads as `undefined` — and a\n * missing blame would void or charge a run by accident.\n *\n * The assignment rule, applied member by member: a class is `machine` only\n * when the run demonstrably never reached a model. An environment that refuses\n * one specific action the agent chose (a denied write, an out-of-scope call,\n * an approval hold) stays `agent`, because the agent selected the action and\n * every arm faces the same policy.\n */\nexport const FAILURE_BLAME: Readonly<Record<FailureClass, FailureBlame>> = {\n success: 'none',\n\n // Behaviour: the agent ran and its own work is what failed.\n reasoning_error: 'agent',\n tool_selection_error: 'agent',\n tool_argument_error: 'agent',\n tool_recovery_failure: 'agent',\n hallucination: 'agent',\n instruction_following: 'agent',\n safety_refusal_miss: 'agent',\n policy_violation: 'agent',\n budget_exceeded: 'agent',\n format_drift: 'agent',\n permission_escalation: 'agent',\n pii_leak: 'agent',\n cost_overrun: 'agent',\n timeout: 'agent',\n // A command the agent ran exited non-zero inside a live box. The box worked.\n sandbox_failure: 'agent',\n\n // Knowledge and evidence: a model answered, and how the agent handled the\n // gap is exactly what is under test. Every arm faces the same gap.\n missing_user_data: 'agent',\n missing_domain_data: 'agent',\n missing_codebase_context: 'agent',\n missing_runtime_context: 'agent',\n stale_external_data: 'agent',\n bad_retrieval: 'agent',\n insufficient_evidence: 'agent',\n contradictory_evidence: 'agent',\n ambiguous_user_intent: 'agent',\n\n // Environment provisioning: the run could not reach the model or was stopped\n // before execution, through no act of the agent.\n missing_credentials: 'machine',\n missing_integration_connection: 'machine',\n integration_auth_expired: 'machine',\n bad_integration_manifest: 'machine',\n knowledge_readiness_blocked: 'machine',\n\n // Environment refusing one action the agent chose.\n missing_integration_scope: 'agent',\n integration_approval_required: 'agent',\n unsafe_integration_write_denied: 'agent',\n\n // A third-party invocation the agent reached and that did not complete.\n integration_provider_failure: 'provider',\n\n // Transport: never reached a model.\n bridge_unreachable: 'machine',\n bridge_lane_saturated: 'machine',\n router_usage_mismatch: 'machine',\n session_profile_conflict: 'machine',\n runtime_restart: 'machine',\n root_driver_failed: 'machine',\n box_provision_failure: 'machine',\n box_teardown_failure: 'machine',\n\n // The agent wrote the broken instrument, so the run is charged: the machine\n // answered, and a run dying on its own profile is not an outage.\n profile_refused: 'agent',\n\n // Transport: reached the model, the turn did not complete.\n empty_completion: 'provider',\n stream_protocol_error: 'provider',\n stream_incomplete: 'provider',\n message_sealed: 'provider',\n process_killed: 'provider',\n terminated: 'provider',\n\n // An operator stopping a run is not the machine, the provider or the agent.\n // Charging it to any of the three would make a deliberate stop read as a\n // failure of the thing that was stopped, and counting it as infrastructure\n // would turn a cancelled batch into an outage streak.\n cancelled: 'unknown',\n\n traversal_cap_exhausted: 'agent',\n\n unreported: 'unknown',\n unknown: 'unknown',\n}\n\n/**\n * The blames that mean the run got no usable turn out of the machine or the\n * provider.\n *\n * This answers a different question from `machine` alone, and the two must not\n * be confused. \"Is this run evidence about the agent?\" is answered by `machine`\n * and by nothing else — a `provider` death stays charged, because every arm\n * faces the same provider on the same day. \"Is this seat producing usable turns\n * at all?\" is answered by this set, because a seat that only ever returns empty\n * completions and torn streams is as dead as one whose bridge refuses, however\n * the individual runs are charged.\n *\n * So a reader counting an outage streak counts these; a reader deciding whether\n * to void a run reads `machine`. Nothing an operator did lands here: `cancelled`\n * is blamed `unknown` for exactly that reason.\n */\nexport const INFRA_FAILURE_BLAMES: ReadonlySet<FailureBlame> = new Set<FailureBlame>([\n 'machine',\n 'provider',\n])\n\n/** Who the named class is charged to. */\nexport function failureBlame(failureClass: FailureClass): FailureBlame {\n return FAILURE_BLAME[failureClass]\n}\n\nexport interface FailureContext {\n run: Run\n spans: Span[]\n events: TraceEvent[]\n}\n\nexport interface FailureClassification {\n failureClass: FailureClass\n /** Who the failure is charged to. Derived from the class unless a rule overrode it. */\n blame: FailureBlame\n reason: string\n triggerSpanId?: string\n triggerEventId?: string\n}\n\n/** Ordered rules — first match wins. */\nexport interface FailureRule {\n id: string\n match: (ctx: FailureContext) => {\n failureClass: FailureClass\n reason: string\n /** Overrides the class's canonical blame. State why at the call site. */\n blame?: FailureBlame\n triggerSpanId?: string\n triggerEventId?: string\n } | null\n}\n\n/**\n * One ordered rule over a failure reason string.\n *\n * Order is load-bearing, because one reason string carries two signals: a seat\n * killed by SIGKILL while the bridge refuses connections is a bridge failure,\n * not a process failure, so the bridge patterns are tested first.\n */\nexport interface FailureReasonRule {\n /** The class the first matching pattern names. */\n failureClass: FailureClass\n pattern: RegExp\n /** Overrides the class's canonical blame. State why at the call site. */\n blame?: FailureBlame\n}\n\n/**\n * The default ordered reason rules, measured against the transport death\n * strings this stack records — runtime settle reasons, bridge errors, sandbox\n * provisioning errors, and provider stream errors.\n *\n * A consumer with a different transport passes its own set to\n * `classifyFailureReason`; nothing here is a gate.\n */\nexport const DEFAULT_FAILURE_REASON_RULES: readonly FailureReasonRule[] = [\n {\n failureClass: 'bridge_unreachable',\n pattern: /ECONNREFUSED|disconnected before terminal acknowledgement|bridge .* unreachable/i,\n },\n {\n failureClass: 'bridge_lane_saturated',\n pattern: /acquire timeout after \\d+ms|in_flight=\\d+\\/\\d+/i,\n },\n { failureClass: 'router_usage_mismatch', pattern: /did not match its recorded usage/i },\n {\n failureClass: 'session_profile_conflict',\n pattern:\n /bound to a different AgentProfile|profile materialization changed across session turns/i,\n },\n { failureClass: 'runtime_restart', pattern: /agent runtime restarted/i },\n { failureClass: 'root_driver_failed', pattern: /root driver failed/i },\n {\n failureClass: 'box_provision_failure',\n pattern:\n /Sandbox create did not complete within|failed to (create|provision) (a )?box|box .*: (create|provision) failed/i,\n },\n { failureClass: 'box_teardown_failure', pattern: /teardown reported destroyed=false/i },\n {\n failureClass: 'profile_refused',\n pattern:\n /workspace materialization failed|cannot replace its harness's system prompt|has no explicit entry in .*models\\.json|conflicts with agent_profile\\.model/i,\n },\n { failureClass: 'empty_completion', pattern: /without emitting any visible output/i },\n { failureClass: 'stream_protocol_error', pattern: /JSON error injected into SSE stream/i },\n {\n failureClass: 'stream_incomplete',\n pattern: /Prompt stream ended before a terminal event/i,\n },\n { failureClass: 'message_sealed', pattern: /already rolled up \\(sealed\\)/i },\n { failureClass: 'process_killed', pattern: /killed by SIGKILL|exited with code null/i },\n { failureClass: 'cancelled', pattern: /cancelled by user/i },\n { failureClass: 'terminated', pattern: /(^|: )terminated\\b/i },\n { failureClass: 'budget_exceeded', pattern: /budget pool: ticket \\d+ spent/i },\n // Deliberately last and deliberately broad: by the time a reason reaches this\n // rule every transport pattern above has declined it, so what remains is the\n // agent's own clock. That boundary is the rule set's, not a fact about the\n // word: a transport whose deadline wording is not matched above would be\n // charged to the agent here, which is the mis-charge this taxonomy exists to\n // stop. A consumer whose machine has its own deadline wording adds a rule for\n // it AHEAD of this one rather than widening this one — inventing patterns for\n // strings nobody has recorded is how a rule set stops describing anything.\n { failureClass: 'timeout', pattern: /deadline|timed out|timeout/i },\n { failureClass: 'traversal_cap_exhausted', pattern: /traversal|iteration cap|exhausted/i },\n]\n\n/**\n * Name the failure one reason string describes.\n *\n * This is the entry point for a run that died before it produced a span: a\n * terminal record, a settle row, a spawn journal line. An unmatched reason is\n * never dropped — it returns `unknown` and keeps the text, so a new failure\n * mode shows up as a named gap instead of a silent bucket. An absent reason\n * returns `unreported`, which is a different fact: the record itself is\n * incomplete.\n */\nexport function classifyFailureReason(\n reason: string | null | undefined,\n rules: readonly FailureReasonRule[] = DEFAULT_FAILURE_REASON_RULES,\n): FailureClassification {\n const text = String(reason ?? '').trim()\n if (text === '') {\n return { failureClass: 'unreported', blame: FAILURE_BLAME.unreported, reason: '' }\n }\n for (const rule of rules) {\n if (rule.pattern.test(text)) {\n return {\n failureClass: rule.failureClass,\n blame: rule.blame ?? FAILURE_BLAME[rule.failureClass],\n reason: text,\n }\n }\n }\n return { failureClass: 'unknown', blame: FAILURE_BLAME.unknown, reason: text }\n}\n\nexport const DEFAULT_RULES: FailureRule[] = [\n // Outcome already named? Respect it.\n {\n id: 'explicit-outcome',\n match: ({ run }) => {\n const fc = run.outcome?.failureClass\n if (fc && fc !== 'unknown')\n return { failureClass: fc, reason: 'outcome.failureClass set explicitly' }\n return null\n },\n },\n {\n id: 'knowledge-readiness-blocked',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'readiness_scored' &&\n e.payload.passed === false,\n )\n return event\n ? {\n failureClass: 'knowledge_readiness_blocked',\n reason: 'knowledge readiness report blocked execution',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'bad-integration-manifest',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n ((e.payload.kind === 'integration_manifest_validated' && e.payload.valid === false) ||\n (e.payload.kind === 'integration_invoke_failed' &&\n e.payload.code === 'manifest_invalid')),\n )\n return event\n ? {\n failureClass: 'bad_integration_manifest',\n reason: 'integration manifest validation failed before launch',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'missing-integration-connection',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'integration_manifest_resolved' &&\n hasResolutionStatus(e.payload, 'missing_connection'),\n )\n return event\n ? {\n failureClass: 'missing_integration_connection',\n reason: 'required integration connection was missing',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'missing-integration-scope',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n ((e.payload.kind === 'integration_manifest_resolved' && hasMissingScopes(e.payload)) ||\n (e.payload.kind === 'integration_invoke_failed' && e.payload.code === 'scope_denied')),\n )\n return event\n ? {\n failureClass: 'missing_integration_scope',\n reason: 'integration grant or connection lacks required scopes',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'integration-approval-required',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n ((e.payload.kind === 'integration_invoke' && e.payload.status === 'approval_required') ||\n (e.payload.kind === 'integration_invoke_failed' &&\n e.payload.code === 'approval_required') ||\n e.payload.kind === 'integration_approval_required'),\n )\n return event\n ? {\n failureClass: 'integration_approval_required',\n reason: 'integration write paused for user approval',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'integration-auth-expired',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'integration_invoke_failed' &&\n (e.payload.code === 'auth_expired' ||\n e.payload.code === 'connection_not_active' ||\n e.payload.code === 'capability_expired' ||\n e.payload.status === 'expired'),\n )\n return event\n ? {\n failureClass: 'integration_auth_expired',\n reason: 'integration connection or capability expired',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'unsafe-integration-write-denied',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'integration_invoke_failed' &&\n (e.payload.code === 'unsafe_write_denied' ||\n e.payload.code === 'policy_denied' ||\n e.payload.code === 'action_denied'),\n )\n return event\n ? {\n failureClass: 'unsafe_integration_write_denied',\n reason: 'integration write was denied by policy or capability scope',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'integration-provider-failure',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'integration_invoke_failed' &&\n ![\n 'scope_denied',\n 'approval_required',\n 'auth_expired',\n 'connection_not_active',\n 'capability_expired',\n 'unsafe_write_denied',\n 'policy_denied',\n 'action_denied',\n 'manifest_invalid',\n ].includes(String(e.payload.code)),\n )\n return event\n ? {\n failureClass: 'integration_provider_failure',\n reason: 'integration provider invocation failed',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'missing-credentials',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'knowledge_gap' &&\n e.payload.category === 'credential_or_secret',\n )\n return event\n ? {\n failureClass: 'missing_credentials',\n reason: 'required credential or secret was missing',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'bad-retrieval',\n match: ({ run, spans }) => {\n if (run.outcome?.pass !== false) return null\n const retrieval = spans.find(\n (s) =>\n s.kind === 'retrieval' && (s.hits.length === 0 || s.hits.every((hit) => hit.score <= 0)),\n )\n return retrieval\n ? {\n failureClass: 'bad_retrieval',\n reason: 'retrieval returned no useful hits for a failed run',\n triggerSpanId: retrieval.spanId,\n }\n : null\n },\n },\n {\n id: 'insufficient-evidence',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'knowledge_gap' &&\n e.payload.reason === 'insufficient_evidence',\n )\n return event\n ? {\n failureClass: 'insufficient_evidence',\n reason: 'task proceeded with insufficient supporting evidence',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'contradictory-evidence',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'knowledge_gap' &&\n e.payload.reason === 'contradictory_evidence',\n )\n return event\n ? {\n failureClass: 'contradictory_evidence',\n reason: 'supporting evidence contradicted itself',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n // Budget breach events\n {\n id: 'budget-breach',\n match: ({ events }) => {\n const breach = events.find((e) => e.kind === 'budget_breach')\n return breach\n ? {\n failureClass: 'budget_exceeded',\n reason: `budget breached on ${breach.payload.dimension ?? 'unknown dimension'}`,\n triggerEventId: breach.eventId,\n }\n : null\n },\n },\n // Policy violations\n {\n id: 'policy-violation',\n match: ({ events }) => {\n const e = events.find((x) => x.kind === 'policy_violation')\n return e\n ? {\n failureClass: 'policy_violation',\n reason: 'policy_violation event emitted',\n triggerEventId: e.eventId,\n }\n : null\n },\n },\n // Sandbox non-zero exit code\n {\n id: 'sandbox-failure',\n match: ({ spans }) => {\n const s = spans.find(\n (x) => x.kind === 'sandbox' && typeof x.exitCode === 'number' && x.exitCode !== 0,\n )\n if (!s) return null\n return {\n failureClass: 'sandbox_failure',\n reason: `sandbox exited ${(s as Extract<Span, { kind: 'sandbox' }>).exitCode}`,\n triggerSpanId: s.spanId,\n }\n },\n },\n // Timeout: run aborted by external signal\n {\n id: 'timeout',\n match: ({ run, events }) => {\n if (run.status !== 'aborted') return null\n const hasTimeout = events.some(\n (e) =>\n e.kind === 'error' &&\n String(e.payload.reason ?? '')\n .toLowerCase()\n .includes('timeout'),\n )\n const note = (run.outcome?.notes ?? '').toLowerCase()\n if (hasTimeout || note.includes('timeout') || note.includes('deadline')) {\n return { failureClass: 'timeout', reason: 'timeout signal observed' }\n }\n return null\n },\n },\n // Tool recovery failure: many consecutive tool errors on the same tool\n {\n id: 'tool-recovery-failure',\n match: ({ spans }) => {\n const tools = spans.filter((s) => s.kind === 'tool')\n const byTool = new Map<string, Span[]>()\n for (const t of tools) {\n const name = (t as Extract<Span, { kind: 'tool' }>).toolName\n const arr = byTool.get(name) ?? []\n arr.push(t)\n byTool.set(name, arr)\n }\n for (const [name, arr] of byTool) {\n const errs = arr.filter((s) => s.status === 'error')\n if (errs.length >= 3 && errs.length === arr.length) {\n return {\n failureClass: 'tool_recovery_failure',\n reason: `${errs.length} consecutive errors on tool \"${name}\"`,\n triggerSpanId: errs[errs.length - 1]!.spanId,\n }\n }\n }\n return null\n },\n },\n // Tool selection error: the run failed and agent called zero tools despite having them\n {\n id: 'tool-selection-error',\n match: ({ run, spans }) => {\n if (run.outcome?.pass !== false) return null\n const hasToolsAvailable = spans.some(\n (s) =>\n s.kind === 'agent' &&\n (s.attributes?.toolsAvailable as number | undefined) !== undefined &&\n (s.attributes?.toolsAvailable as number) > 0,\n )\n const tools = spans.filter((s) => s.kind === 'tool')\n if (hasToolsAvailable && tools.length === 0) {\n return {\n failureClass: 'tool_selection_error',\n reason: 'tools were available but none were called',\n }\n }\n return null\n },\n },\n // Format drift: scored by a judge with dimension='format' below threshold\n {\n id: 'format-drift',\n match: ({ spans }) => {\n const judge = spans.find(\n (s) =>\n s.kind === 'judge' &&\n (s as Extract<Span, { kind: 'judge' }>).dimension === 'format' &&\n (s as Extract<Span, { kind: 'judge' }>).score < 0.5,\n )\n return judge\n ? {\n failureClass: 'format_drift',\n reason: 'format judge scored below 0.5',\n triggerSpanId: judge.spanId,\n }\n : null\n },\n },\n]\n\nfunction hasResolutionStatus(payload: Record<string, unknown>, status: string): boolean {\n if (status === 'missing_connection' && stringArray(payload.missingConnections).length > 0)\n return true\n return resolutionItems(payload).some((item) => item.status === status)\n}\n\nfunction hasMissingScopes(payload: Record<string, unknown>): boolean {\n if (stringArray(payload.missingScopes).length > 0) return true\n return resolutionItems(payload).some(\n (item) => Array.isArray(item.missingScopes) && item.missingScopes.length > 0,\n )\n}\n\nfunction resolutionItems(payload: Record<string, unknown>): Array<Record<string, unknown>> {\n return [\n ...records(payload.missing),\n ...records(payload.optionalMissing),\n ...records(payload.ready),\n ]\n}\n\nfunction records(value: unknown): Array<Record<string, unknown>> {\n if (!Array.isArray(value)) return []\n return value.filter(\n (item): item is Record<string, unknown> =>\n Boolean(item) && typeof item === 'object' && !Array.isArray(item),\n )\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : []\n}\n\n/**\n * Classify the failure mode of a run using an ordered rule list.\n *\n * Structural rules run first, in their declared order. When none matches, the\n * reason strings the run did record are classified with\n * `classifyFailureReason`, so a run whose only evidence is a transport error\n * on an error event is named instead of landing in `unknown`. Only a run that\n * would already have returned `unknown` can change class this way.\n */\nexport function classifyFailure(\n ctx: FailureContext,\n rules: FailureRule[] = DEFAULT_RULES,\n reasonRules: readonly FailureReasonRule[] = DEFAULT_FAILURE_REASON_RULES,\n): FailureClassification {\n if (ctx.run.outcome?.pass !== false && ctx.run.status === 'completed') {\n return {\n failureClass: 'success',\n blame: FAILURE_BLAME.success,\n reason: 'run completed with pass=true (or no explicit fail)',\n }\n }\n for (const rule of rules) {\n const hit = rule.match(ctx)\n if (hit) return { ...hit, blame: hit.blame ?? FAILURE_BLAME[hit.failureClass] }\n }\n for (const candidate of recordedReasons(ctx)) {\n const classified = classifyFailureReason(candidate.text, reasonRules)\n if (classified.failureClass === 'unknown' || classified.failureClass === 'unreported') continue\n return {\n ...classified,\n ...(candidate.eventId === undefined ? {} : { triggerEventId: candidate.eventId }),\n }\n }\n return {\n failureClass: 'unknown',\n blame: FAILURE_BLAME.unknown,\n reason: 'no rule matched; run failed for unclassified reason',\n }\n}\n\n/**\n * The reason strings a failed run recorded, error events first because they\n * sit closest to the failure, then the outcome notes.\n */\nfunction recordedReasons(ctx: FailureContext): Array<{ text: string; eventId?: string }> {\n const found: Array<{ text: string; eventId?: string }> = []\n for (const event of ctx.events) {\n if (event.kind !== 'error') continue\n for (const field of ['reason', 'message', 'error'] as const) {\n const value = event.payload[field]\n if (typeof value === 'string' && value.trim()) {\n found.push({ text: value, eventId: event.eventId })\n }\n }\n }\n const notes = ctx.run.outcome?.notes\n if (typeof notes === 'string' && notes.trim()) found.push({ text: notes })\n return found\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"failure-taxonomy-9eQfXKoW.js","names":[],"sources":["../src/failure-taxonomy.ts"],"sourcesContent":["/**\n * Failure taxonomy — canonical classes, who each one is charged to, and two\n * default classifiers.\n *\n * Every failed run should end up in a named class. The classifiers here are\n * rule-based (fast, deterministic); an LLM fallback can be added by the\n * consumer for novel cases and trained into the rule base over time.\n *\n * Two entry points, because a dead run does not always leave a trace:\n * - `classifyFailure(ctx)` reads a run with its spans and events, and\n * persists as `Run.outcome.failureClass`;\n * - `classifyFailureReason(text)` reads the one thing a run that died before\n * any span always leaves — a reason string on its terminal record.\n * `classifyFailure` calls the reason classifier itself when no structural rule\n * matches, so a run whose only evidence is `ECONNREFUSED` no longer lands in\n * `unknown`.\n *\n * Every classification carries a `blame`. Without it a comparison charges\n * infrastructure outages to the agent under test: a run that never reached a\n * model is not evidence about the agent and must be voided, not counted as a\n * loss.\n */\n\nimport type { FailureClass, Run, Span, TraceEvent } from './trace/schema'\nimport { FAILURE_CLASSES } from './trace/schema'\n\nexport { FAILURE_CLASSES, type FailureClass }\n\n/**\n * Who a failure is charged to. This is the axis a comparison reads before it\n * counts a loss.\n *\n * `machine` — the run never reached a model. The bridge refused, its lane was\n * full, the box never provisioned, the credential was absent. An\n * agent cannot route around this, so a run that recorded nothing\n * behind only machine failures is not evidence about the agent.\n * `provider` — the model was reached and the turn did not complete: an empty\n * completion, a torn stream, a killed process. Every arm faces\n * the same provider on the same day, so this stays charged.\n * `agent` — the agent's own reasoning, tool use, budgeting, or scheduling\n * produced the failure. Charged.\n * `unknown` — the record does not say. Never voids a run: an unread reason is\n * not a proven outage.\n * `none` — no failure to charge.\n */\nexport type FailureBlame = 'none' | 'machine' | 'provider' | 'agent' | 'unknown'\n\n/**\n * Blame for every canonical class. The `Record` is exhaustive on purpose: a\n * class added to `FAILURE_CLASSES` without a blame here fails to compile, so\n * the axis cannot silently acquire a hole that reads as `undefined` — and a\n * missing blame would void or charge a run by accident.\n *\n * The assignment rule, applied member by member: a class is `machine` only\n * when the run demonstrably never reached a model. An environment that refuses\n * one specific action the agent chose (a denied write, an out-of-scope call,\n * an approval hold) stays `agent`, because the agent selected the action and\n * every arm faces the same policy.\n */\nexport const FAILURE_BLAME: Readonly<Record<FailureClass, FailureBlame>> = {\n success: 'none',\n\n // Behaviour: the agent ran and its own work is what failed.\n reasoning_error: 'agent',\n tool_selection_error: 'agent',\n tool_argument_error: 'agent',\n tool_recovery_failure: 'agent',\n hallucination: 'agent',\n instruction_following: 'agent',\n safety_refusal_miss: 'agent',\n policy_violation: 'agent',\n budget_exceeded: 'agent',\n format_drift: 'agent',\n permission_escalation: 'agent',\n pii_leak: 'agent',\n cost_overrun: 'agent',\n timeout: 'agent',\n // A command the agent ran exited non-zero inside a live box. The box worked.\n sandbox_failure: 'agent',\n\n // Knowledge and evidence: a model answered, and how the agent handled the\n // gap is exactly what is under test. Every arm faces the same gap.\n missing_user_data: 'agent',\n missing_domain_data: 'agent',\n missing_codebase_context: 'agent',\n missing_runtime_context: 'agent',\n stale_external_data: 'agent',\n bad_retrieval: 'agent',\n insufficient_evidence: 'agent',\n contradictory_evidence: 'agent',\n ambiguous_user_intent: 'agent',\n\n // Environment provisioning: the run could not reach the model or was stopped\n // before execution, through no act of the agent.\n missing_credentials: 'machine',\n missing_integration_connection: 'machine',\n integration_auth_expired: 'machine',\n bad_integration_manifest: 'machine',\n knowledge_readiness_blocked: 'machine',\n\n // Environment refusing one action the agent chose.\n missing_integration_scope: 'agent',\n integration_approval_required: 'agent',\n unsafe_integration_write_denied: 'agent',\n\n // A third-party invocation the agent reached and that did not complete.\n integration_provider_failure: 'provider',\n\n // Transport: never reached a model.\n bridge_unreachable: 'machine',\n bridge_lane_saturated: 'machine',\n router_usage_mismatch: 'machine',\n session_profile_conflict: 'machine',\n runtime_restart: 'machine',\n root_driver_failed: 'machine',\n box_provision_failure: 'machine',\n box_teardown_failure: 'machine',\n\n // The agent wrote the broken instrument, so the run is charged: the machine\n // answered, and a run dying on its own profile is not an outage.\n profile_refused: 'agent',\n\n // Transport: reached the model, the turn did not complete.\n empty_completion: 'provider',\n stream_protocol_error: 'provider',\n stream_incomplete: 'provider',\n message_sealed: 'provider',\n process_killed: 'provider',\n terminated: 'provider',\n\n // An operator stopping a run is not the machine, the provider or the agent.\n // Charging it to any of the three would make a deliberate stop read as a\n // failure of the thing that was stopped, and counting it as infrastructure\n // would turn a cancelled batch into an outage streak.\n cancelled: 'unknown',\n\n traversal_cap_exhausted: 'agent',\n\n unreported: 'unknown',\n unknown: 'unknown',\n}\n\n/**\n * The blames that mean the run got no usable turn out of the machine or the\n * provider.\n *\n * This answers a different question from `machine` alone, and the two must not\n * be confused. \"Is this run evidence about the agent?\" is answered by `machine`\n * and by nothing else — a `provider` death stays charged, because every arm\n * faces the same provider on the same day. \"Is this seat producing usable turns\n * at all?\" is answered by this set, because a seat that only ever returns empty\n * completions and torn streams is as dead as one whose bridge refuses, however\n * the individual runs are charged.\n *\n * So a reader counting an outage streak counts these; a reader deciding whether\n * to void a run reads `machine`. Nothing an operator did lands here: `cancelled`\n * is blamed `unknown` for exactly that reason.\n */\nexport const INFRA_FAILURE_BLAMES: ReadonlySet<FailureBlame> = new Set<FailureBlame>([\n 'machine',\n 'provider',\n])\n\n/** Who the named class is charged to. */\nexport function failureBlame(failureClass: FailureClass): FailureBlame {\n return FAILURE_BLAME[failureClass]\n}\n\nexport interface FailureContext {\n run: Run\n spans: Span[]\n events: TraceEvent[]\n}\n\nexport interface FailureClassification {\n failureClass: FailureClass\n /** Who the failure is charged to. Derived from the class unless a rule overrode it. */\n blame: FailureBlame\n reason: string\n triggerSpanId?: string\n triggerEventId?: string\n}\n\n/** Ordered rules — first match wins. */\nexport interface FailureRule {\n id: string\n match: (ctx: FailureContext) => {\n failureClass: FailureClass\n reason: string\n /** Overrides the class's canonical blame. State why at the call site. */\n blame?: FailureBlame\n triggerSpanId?: string\n triggerEventId?: string\n } | null\n}\n\n/**\n * One ordered rule over a failure reason string.\n *\n * Order is load-bearing, because one reason string carries two signals: a seat\n * killed by SIGKILL while the bridge refuses connections is a bridge failure,\n * not a process failure, so the bridge patterns are tested first.\n */\nexport interface FailureReasonRule {\n /** The class the first matching pattern names. */\n failureClass: FailureClass\n pattern: RegExp\n /** Overrides the class's canonical blame. State why at the call site. */\n blame?: FailureBlame\n}\n\n/**\n * The default ordered reason rules, measured against the transport death\n * strings this stack records — runtime settle reasons, bridge errors, sandbox\n * provisioning errors, and provider stream errors.\n *\n * A consumer with a different transport passes its own set to\n * `classifyFailureReason`; nothing here is a gate.\n */\nexport const DEFAULT_FAILURE_REASON_RULES: readonly FailureReasonRule[] = [\n {\n failureClass: 'bridge_unreachable',\n pattern: /ECONNREFUSED|disconnected before terminal acknowledgement|bridge .* unreachable/i,\n },\n {\n failureClass: 'bridge_lane_saturated',\n pattern: /acquire timeout after \\d+ms|in_flight=\\d+\\/\\d+/i,\n },\n { failureClass: 'router_usage_mismatch', pattern: /did not match its recorded usage/i },\n {\n failureClass: 'session_profile_conflict',\n pattern:\n /bound to a different AgentProfile|profile materialization changed across session turns/i,\n },\n { failureClass: 'runtime_restart', pattern: /agent runtime restarted/i },\n { failureClass: 'root_driver_failed', pattern: /root driver failed/i },\n {\n failureClass: 'box_provision_failure',\n pattern:\n /Sandbox create did not complete within|failed to (create|provision) (a )?box|box .*: (create|provision) failed/i,\n },\n { failureClass: 'box_teardown_failure', pattern: /teardown reported destroyed=false/i },\n {\n failureClass: 'profile_refused',\n pattern:\n /workspace materialization failed|cannot replace its harness's system prompt|has no explicit entry in .*models\\.json|conflicts with agent_profile\\.model/i,\n },\n { failureClass: 'empty_completion', pattern: /without emitting any visible output/i },\n { failureClass: 'stream_protocol_error', pattern: /JSON error injected into SSE stream/i },\n {\n failureClass: 'stream_incomplete',\n pattern: /Prompt stream ended before a terminal event/i,\n },\n { failureClass: 'message_sealed', pattern: /already rolled up \\(sealed\\)/i },\n { failureClass: 'process_killed', pattern: /killed by SIGKILL|exited with code null/i },\n { failureClass: 'cancelled', pattern: /cancelled by user/i },\n { failureClass: 'terminated', pattern: /(^|: )terminated\\b/i },\n { failureClass: 'budget_exceeded', pattern: /budget pool: ticket \\d+ spent/i },\n // Deliberately last and deliberately broad: by the time a reason reaches this\n // rule every transport pattern above has declined it, so what remains is the\n // agent's own clock. That boundary is the rule set's, not a fact about the\n // word: a transport whose deadline wording is not matched above would be\n // charged to the agent here, which is the mis-charge this taxonomy exists to\n // stop. A consumer whose machine has its own deadline wording adds a rule for\n // it AHEAD of this one rather than widening this one — inventing patterns for\n // strings nobody has recorded is how a rule set stops describing anything.\n { failureClass: 'timeout', pattern: /deadline|timed out|timeout/i },\n { failureClass: 'traversal_cap_exhausted', pattern: /traversal|iteration cap|exhausted/i },\n]\n\n/**\n * Name the failure one reason string describes.\n *\n * This is the entry point for a run that died before it produced a span: a\n * terminal record, a settle row, a spawn journal line. An unmatched reason is\n * never dropped — it returns `unknown` and keeps the text, so a new failure\n * mode shows up as a named gap instead of a silent bucket. An absent reason\n * returns `unreported`, which is a different fact: the record itself is\n * incomplete.\n */\nexport function classifyFailureReason(\n reason: string | null | undefined,\n rules: readonly FailureReasonRule[] = DEFAULT_FAILURE_REASON_RULES,\n): FailureClassification {\n const text = String(reason ?? '').trim()\n if (text === '') {\n return { failureClass: 'unreported', blame: FAILURE_BLAME.unreported, reason: '' }\n }\n for (const rule of rules) {\n if (rule.pattern.test(text)) {\n return {\n failureClass: rule.failureClass,\n blame: rule.blame ?? FAILURE_BLAME[rule.failureClass],\n reason: text,\n }\n }\n }\n return { failureClass: 'unknown', blame: FAILURE_BLAME.unknown, reason: text }\n}\n\nexport const DEFAULT_RULES: FailureRule[] = [\n // Outcome already named? Respect it.\n {\n id: 'explicit-outcome',\n match: ({ run }) => {\n const fc = run.outcome?.failureClass\n if (fc && fc !== 'unknown')\n return { failureClass: fc, reason: 'outcome.failureClass set explicitly' }\n return null\n },\n },\n {\n id: 'knowledge-readiness-blocked',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'readiness_scored' &&\n e.payload.passed === false,\n )\n return event\n ? {\n failureClass: 'knowledge_readiness_blocked',\n reason: 'knowledge readiness report blocked execution',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'bad-integration-manifest',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n ((e.payload.kind === 'integration_manifest_validated' && e.payload.valid === false) ||\n (e.payload.kind === 'integration_invoke_failed' &&\n e.payload.code === 'manifest_invalid')),\n )\n return event\n ? {\n failureClass: 'bad_integration_manifest',\n reason: 'integration manifest validation failed before launch',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'missing-integration-connection',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'integration_manifest_resolved' &&\n hasResolutionStatus(e.payload, 'missing_connection'),\n )\n return event\n ? {\n failureClass: 'missing_integration_connection',\n reason: 'required integration connection was missing',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'missing-integration-scope',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n ((e.payload.kind === 'integration_manifest_resolved' && hasMissingScopes(e.payload)) ||\n (e.payload.kind === 'integration_invoke_failed' && e.payload.code === 'scope_denied')),\n )\n return event\n ? {\n failureClass: 'missing_integration_scope',\n reason: 'integration grant or connection lacks required scopes',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'integration-approval-required',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n ((e.payload.kind === 'integration_invoke' && e.payload.status === 'approval_required') ||\n (e.payload.kind === 'integration_invoke_failed' &&\n e.payload.code === 'approval_required') ||\n e.payload.kind === 'integration_approval_required'),\n )\n return event\n ? {\n failureClass: 'integration_approval_required',\n reason: 'integration write paused for user approval',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'integration-auth-expired',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'integration_invoke_failed' &&\n (e.payload.code === 'auth_expired' ||\n e.payload.code === 'connection_not_active' ||\n e.payload.code === 'capability_expired' ||\n e.payload.status === 'expired'),\n )\n return event\n ? {\n failureClass: 'integration_auth_expired',\n reason: 'integration connection or capability expired',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'unsafe-integration-write-denied',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'integration_invoke_failed' &&\n (e.payload.code === 'unsafe_write_denied' ||\n e.payload.code === 'policy_denied' ||\n e.payload.code === 'action_denied'),\n )\n return event\n ? {\n failureClass: 'unsafe_integration_write_denied',\n reason: 'integration write was denied by policy or capability scope',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'integration-provider-failure',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'integration_invoke_failed' &&\n ![\n 'scope_denied',\n 'approval_required',\n 'auth_expired',\n 'connection_not_active',\n 'capability_expired',\n 'unsafe_write_denied',\n 'policy_denied',\n 'action_denied',\n 'manifest_invalid',\n ].includes(String(e.payload.code)),\n )\n return event\n ? {\n failureClass: 'integration_provider_failure',\n reason: 'integration provider invocation failed',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'missing-credentials',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'knowledge_gap' &&\n e.payload.category === 'credential_or_secret',\n )\n return event\n ? {\n failureClass: 'missing_credentials',\n reason: 'required credential or secret was missing',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'bad-retrieval',\n match: ({ run, spans }) => {\n if (run.outcome?.pass !== false) return null\n const retrieval = spans.find(\n (s) =>\n s.kind === 'retrieval' && (s.hits.length === 0 || s.hits.every((hit) => hit.score <= 0)),\n )\n return retrieval\n ? {\n failureClass: 'bad_retrieval',\n reason: 'retrieval returned no useful hits for a failed run',\n triggerSpanId: retrieval.spanId,\n }\n : null\n },\n },\n {\n id: 'insufficient-evidence',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'knowledge_gap' &&\n e.payload.reason === 'insufficient_evidence',\n )\n return event\n ? {\n failureClass: 'insufficient_evidence',\n reason: 'task proceeded with insufficient supporting evidence',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n {\n id: 'contradictory-evidence',\n match: ({ events }) => {\n const event = events.find(\n (e) =>\n e.kind === 'custom' &&\n e.payload.kind === 'knowledge_gap' &&\n e.payload.reason === 'contradictory_evidence',\n )\n return event\n ? {\n failureClass: 'contradictory_evidence',\n reason: 'supporting evidence contradicted itself',\n triggerEventId: event.eventId,\n }\n : null\n },\n },\n // Budget breach events\n {\n id: 'budget-breach',\n match: ({ events }) => {\n const breach = events.find((e) => e.kind === 'budget_breach')\n return breach\n ? {\n failureClass: 'budget_exceeded',\n reason: `budget breached on ${breach.payload.dimension ?? 'unknown dimension'}`,\n triggerEventId: breach.eventId,\n }\n : null\n },\n },\n // Policy violations\n {\n id: 'policy-violation',\n match: ({ events }) => {\n const e = events.find((x) => x.kind === 'policy_violation')\n return e\n ? {\n failureClass: 'policy_violation',\n reason: 'policy_violation event emitted',\n triggerEventId: e.eventId,\n }\n : null\n },\n },\n // Sandbox non-zero exit code\n {\n id: 'sandbox-failure',\n match: ({ spans }) => {\n const s = spans.find(\n (x) => x.kind === 'sandbox' && typeof x.exitCode === 'number' && x.exitCode !== 0,\n )\n if (!s) return null\n return {\n failureClass: 'sandbox_failure',\n reason: `sandbox exited ${(s as Extract<Span, { kind: 'sandbox' }>).exitCode}`,\n triggerSpanId: s.spanId,\n }\n },\n },\n // Timeout: run aborted by external signal\n {\n id: 'timeout',\n match: ({ run, events }) => {\n if (run.status !== 'aborted') return null\n const hasTimeout = events.some(\n (e) =>\n e.kind === 'error' &&\n String(e.payload.reason ?? '')\n .toLowerCase()\n .includes('timeout'),\n )\n const note = (run.outcome?.notes ?? '').toLowerCase()\n if (hasTimeout || note.includes('timeout') || note.includes('deadline')) {\n return { failureClass: 'timeout', reason: 'timeout signal observed' }\n }\n return null\n },\n },\n // Tool recovery failure: many consecutive tool errors on the same tool\n {\n id: 'tool-recovery-failure',\n match: ({ spans }) => {\n const tools = spans.filter((s) => s.kind === 'tool')\n const byTool = new Map<string, Span[]>()\n for (const t of tools) {\n const name = (t as Extract<Span, { kind: 'tool' }>).toolName\n const arr = byTool.get(name) ?? []\n arr.push(t)\n byTool.set(name, arr)\n }\n for (const [name, arr] of byTool) {\n const errs = arr.filter((s) => s.status === 'error')\n if (errs.length >= 3 && errs.length === arr.length) {\n return {\n failureClass: 'tool_recovery_failure',\n reason: `${errs.length} consecutive errors on tool \"${name}\"`,\n triggerSpanId: errs[errs.length - 1]!.spanId,\n }\n }\n }\n return null\n },\n },\n // Tool selection error: the run failed and agent called zero tools despite having them\n {\n id: 'tool-selection-error',\n match: ({ run, spans }) => {\n if (run.outcome?.pass !== false) return null\n const hasToolsAvailable = spans.some(\n (s) =>\n s.kind === 'agent' &&\n (s.attributes?.toolsAvailable as number | undefined) !== undefined &&\n (s.attributes?.toolsAvailable as number) > 0,\n )\n const tools = spans.filter((s) => s.kind === 'tool')\n if (hasToolsAvailable && tools.length === 0) {\n return {\n failureClass: 'tool_selection_error',\n reason: 'tools were available but none were called',\n }\n }\n return null\n },\n },\n // Format drift: scored by a judge with dimension='format' below threshold\n {\n id: 'format-drift',\n match: ({ spans }) => {\n const judge = spans.find(\n (s) =>\n s.kind === 'judge' &&\n (s as Extract<Span, { kind: 'judge' }>).dimension === 'format' &&\n (s as Extract<Span, { kind: 'judge' }>).score < 0.5,\n )\n return judge\n ? {\n failureClass: 'format_drift',\n reason: 'format judge scored below 0.5',\n triggerSpanId: judge.spanId,\n }\n : null\n },\n },\n]\n\nfunction hasResolutionStatus(payload: Record<string, unknown>, status: string): boolean {\n if (status === 'missing_connection' && stringArray(payload.missingConnections).length > 0)\n return true\n return resolutionItems(payload).some((item) => item.status === status)\n}\n\nfunction hasMissingScopes(payload: Record<string, unknown>): boolean {\n if (stringArray(payload.missingScopes).length > 0) return true\n return resolutionItems(payload).some(\n (item) => Array.isArray(item.missingScopes) && item.missingScopes.length > 0,\n )\n}\n\nfunction resolutionItems(payload: Record<string, unknown>): Array<Record<string, unknown>> {\n return [\n ...records(payload.missing),\n ...records(payload.optionalMissing),\n ...records(payload.ready),\n ]\n}\n\nfunction records(value: unknown): Array<Record<string, unknown>> {\n if (!Array.isArray(value)) return []\n return value.filter(\n (item): item is Record<string, unknown> =>\n Boolean(item) && typeof item === 'object' && !Array.isArray(item),\n )\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : []\n}\n\n/**\n * Classify the failure mode of a run using an ordered rule list.\n *\n * Structural rules run first, in their declared order. When none matches, the\n * reason strings the run did record are classified with\n * `classifyFailureReason`, so a run whose only evidence is a transport error\n * on an error event is named instead of landing in `unknown`. Only a run that\n * would already have returned `unknown` can change class this way.\n */\nexport function classifyFailure(\n ctx: FailureContext,\n rules: FailureRule[] = DEFAULT_RULES,\n reasonRules: readonly FailureReasonRule[] = DEFAULT_FAILURE_REASON_RULES,\n): FailureClassification {\n if (ctx.run.outcome?.pass !== false && ctx.run.status === 'completed') {\n return {\n failureClass: 'success',\n blame: FAILURE_BLAME.success,\n reason: 'run completed with pass=true (or no explicit fail)',\n }\n }\n for (const rule of rules) {\n const hit = rule.match(ctx)\n if (hit) return { ...hit, blame: hit.blame ?? FAILURE_BLAME[hit.failureClass] }\n }\n for (const candidate of recordedReasons(ctx)) {\n const classified = classifyFailureReason(candidate.text, reasonRules)\n if (classified.failureClass === 'unknown' || classified.failureClass === 'unreported') continue\n return {\n ...classified,\n ...(candidate.eventId === undefined ? {} : { triggerEventId: candidate.eventId }),\n }\n }\n return {\n failureClass: 'unknown',\n blame: FAILURE_BLAME.unknown,\n reason: 'no rule matched; run failed for unclassified reason',\n }\n}\n\n/**\n * The reason strings a failed run recorded, error events first because they\n * sit closest to the failure, then the outcome notes.\n */\nfunction recordedReasons(ctx: FailureContext): Array<{ text: string; eventId?: string }> {\n const found: Array<{ text: string; eventId?: string }> = []\n for (const event of ctx.events) {\n if (event.kind !== 'error') continue\n for (const field of ['reason', 'message', 'error'] as const) {\n const value = event.payload[field]\n if (typeof value === 'string' && value.trim()) {\n found.push({ text: value, eventId: event.eventId })\n }\n }\n }\n const notes = ctx.run.outcome?.notes\n if (typeof notes === 'string' && notes.trim()) found.push({ text: notes })\n return found\n}\n"],"mappings":"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"}
@@ -1,10 +1,9 @@
1
- import { o as FailureClass } from "./schema-D6EVKzTB.js";
2
- import { i as AnalystFinding, m as EvidenceRef, u as AnalystRunResult } from "./types-6Lfdlshp.js";
3
- import { s as TraceStore } from "./store-B3nWRy3B.js";
4
- import { i as DatasetSplit, r as DatasetScenario } from "./dataset-DQqhOCPt.js";
5
- import "./exact-types-Do63KoKn.js";
6
- import { o as TraceEmitter } from "./emitter-DABYYTcH.js";
7
- //#region src/control-runtime/contract.d.ts
1
+ import { o as FailureClass } from "./schema-CkIvnmLU.js";
2
+ import { i as AnalystFinding, m as EvidenceRef, u as AnalystRunResult } from "./types-BEvjDziM.js";
3
+ import { s as TraceStore } from "./store-CMs5wGXP.js";
4
+ import { i as DatasetSplit, r as DatasetScenario } from "./dataset-DThC1S6G.js";
5
+ import "./exact-types-CndDT_h7.js";
6
+ import { o as TraceEmitter } from "./emitter-mAXC5PSN.js";
8
7
  type ControlSeverity = 'info' | 'warning' | 'error' | 'critical';
9
8
  type ControlActionFailureMode = 'continue' | 'stop';
10
9
  interface ControlEvalResult {
@@ -165,8 +164,6 @@ interface ControlRuntimeConfig<TState, TAction, TActionResult, TEval extends Con
165
164
  projectId?: string;
166
165
  variantId?: string;
167
166
  }
168
- //#endregion
169
- //#region src/feedback-trajectory-review.d.ts
170
167
  type AnalystReviewSource = Exclude<FeedbackLabelSource, 'system'>;
171
168
  type AnalystFindingDigest = `sha256:${string}`;
172
169
  type AnalystRunDigest = `sha256:${string}`;
@@ -196,8 +193,6 @@ type AnalystReviewDecision = (AnalystReviewDecisionBase & {
196
193
  });
197
194
  /** Bind the complete analyst result to one immutable review target. */
198
195
  declare function analystRunDigest(run: AnalystRunResult): AnalystRunDigest;
199
- //#endregion
200
- //#region src/feedback-trajectory.d.ts
201
196
  type FeedbackArtifactType = 'text' | 'code' | 'plan' | 'research' | 'action' | 'ui' | 'decision' | 'data' | 'other';
202
197
  type FeedbackLabelSource = 'user' | 'judge' | 'environment' | 'metric' | 'policy' | 'system';
203
198
  type FeedbackLabelKind = 'approve' | 'reject' | 'select' | 'edit' | 'rank' | 'rate' | 'comment' | 'metric_outcome' | 'policy_block' | 'revision_request';
@@ -387,6 +382,5 @@ declare function controlRunToFeedbackTrajectory<TState, TAction, TActionResult>(
387
382
  proposedActionFromStep?: (step: ControlStep<TState, TAction, TActionResult>) => ProposedSideEffect | undefined;
388
383
  createdAt?: string;
389
384
  }): FeedbackTrajectory;
390
- //#endregion
391
385
  export { AnalystFindingDigest as A, ControlRuntimeConfig as B, createFeedbackTrajectory as C, renderPreferenceMemoryMarkdown as D, feedbackTrajectoryToOptimizerRow as E, ControlBudget as F, ControlSeverity as H, ControlContext as I, ControlDecision as L, AnalystRunDigest as M, analystRunDigest as N, summarizePreferenceMemory as O, ControlActionOutcome as P, ControlEvalResult as R, controlRunToFeedbackTrajectory as S, feedbackTrajectoriesToOptimizerRows as T, ControlStep as U, ControlRuntimeError as V, StopDecision as W, PreferenceMemoryEntry as _, FeedbackLabel as a, analystRunToReviewRequests as b, FeedbackOptimizerRow as c, FeedbackTask as d, FeedbackTrajectory as f, InMemoryFeedbackTrajectoryStore as g, FileSystemFeedbackTrajectoryStore as h, FeedbackAttempt as i, AnalystReviewDecision as j, withAssignedFeedbackSplit as k, FeedbackOutcome as l, FeedbackTrajectoryStore as m, AnalystReviewRequest as n, FeedbackLabelKind as o, FeedbackTrajectoryFilter as p, FeedbackArtifactType as r, FeedbackLabelSource as s, AnalystFeedbackTrajectoryOptions as t, FeedbackSplitPolicy as u, ProposedSideEffect as v, feedbackTrajectoriesToDatasetScenarios as w, assignFeedbackSplit as x, analystRunToFeedbackTrajectory as y, ControlRunResult as z };
392
- //# sourceMappingURL=feedback-trajectory-CYVJXolG.d.ts.map
386
+ //# sourceMappingURL=feedback-trajectory-DsHR9krG.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-trajectory-DsHR9krG.d.ts","names":[],"sources":["../src/control-runtime/contract.ts","../src/feedback-trajectory-review.ts","../src/feedback-trajectory.ts"],"mappings":";;;;;;KAIY;KAEA;UAEK;;EAEf;;EAEA;;EAEA;;EAEA,WAAW;;EAEX;;EAEA;;EAEA;;EAEA,WAAW;;UAGI;EACf;EACA;EACA;;UAGe,oBAAoB,QAAQ;;;;;EAK3C;;;;;EAKA;;EAEA;;EAEA,oBAAoB,OAAO;;EAE3B,qBAAqB,QAAQ;;UAGd,eACf,QACA,SACA,eACA,cAAc,oBAAoB;EAElC;EACA,OAAO;EACP,OAAO;EACP,SAAS,YAAY,QAAQ,SAAS,eAAe;EACrD,QAAQ;EACR;EACA;EACA;EACA;EACA,aAAa;EACb,UAAU;;KAGA,gBAAgB;EAEtB;EACA,QAAQ;EACR;;EAGA;EACA;EACA;EACA;;EAEA,eAAe;;UAGJ;EACf;EACA;EACA;EACA;EACA,eAAe;;UAGA,qBAAqB;EACpC;EACA,SAAS;EACT;EACA;EACA;;UAGe;EACf;EACA;EACA;;UAGe,YACf,QACA,SACA,eACA,cAAc,oBAAoB;EAElC;EACA,UAAU,gBAAgB;EAC1B,aAAa;EACb,YAAY;EACZ,aAAa;EACb,YAAY;EACZ,gBAAgB,qBAAqB;EACrC;EACA;;UAGe,iBACf,QACA,SACA,eACA,cAAc,oBAAoB;EAElC;EACA;EACA;EACA;EACA;EACA,OAAO,YAAY,QAAQ,SAAS,eAAe;EACnD,YAAY;EACZ,YAAY;EACZ;EACA;;EAEA;EACA,eAAe;EACf,eAAe;EACf;;UAGe,qBACf,QACA,SACA,eACA,cAAc,oBAAoB;EAElC;EACA,SAAS,QAAQ;EACjB,SAAS;;EAET,gBAAgB;;;;;EAKhB,oBAAoB;IAClB,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,OAAO;IACP,SAAS,YAAY,QAAQ,SAAS,eAAe;;;EAIvD,UAAU;IACR,SAAS,YAAY,QAAQ,SAAS,eAAe;IACrD,aAAa;QACT,QAAQ,UAAU;;EAGxB,WAAW;IACT;IACA,OAAO;IACP,SAAS,YAAY,QAAQ,SAAS,eAAe;IACrD,aAAa;QACT,QAAQ,WAAW;;EAGzB,SACE,KAAK,eAAe,QAAQ,SAAS,eAAe,WACjD,QAAQ,gBAAgB,YAAY,gBAAgB;;EAGzD,MACE,QAAQ,SACR,KAAK,eAAe,QAAQ,SAAS,eAAe,WACjD,QAAQ,iBAAiB;;EAG9B,cACE,KAAK,eAAe,QAAQ,SAAS,eAAe,WACjD,QAAQ,gBAAgB;;EAG7B,UAAU,MAAM,YAAY,QAAQ,SAAS,eAAe,WAAW;;EAGvE,eAAe,oBAAoB,QAAQ;;EAG3C,QAAQ;EACR;EACA;EACA;;KCtMG,sBAAsB,QAAQ;KACvB;KACA;UAEK;EACf;EACA;EACA,WAAW;;UAGH;EACR,WAAW;EACX,QAAQ;EACR;EACA;EACA;EACA;;KAGU,yBACP;EACC;EACA,eAAe;EACf;EACA;MAED;EACC;EACA,cAAc;EACd;EACA;;;iBAgCU,iBAAiB,KAAK,mBAAmB;KCrD7C;KAWA;KAEA;KAYA;UAEK;EACf;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA,WAAW;;UAGI;EACf;EACA,QAAQ;EACR,MAAM;EACN;EACA;EACA,WAAW;EACX;EACA,WAAW;;UAGI;EACf;EACA;EACA,cAAc;EACd;EACA;EACA,iBAAiB;EACjB,QAAQ;EACR,WAAW;EACX;EACA,WAAW;;UAGI;EACf;EACA;EACA,UAAU;EACV;EACA;EACA;EACA,WAAW;;UAGI;EACf;EACA;EACA;EACA,MAAM;EACN,UAAU;EACV,QAAQ;EACR,UAAU;EACV,QAAQ;EACR,OAAO;EACP;EACA;EACA,WAAW;;UAGI;EACf,KAAK,YAAY,qBAAqB;EACtC,IAAI,aAAa,QAAQ;EACzB,KAAK,SAAS,2BAA2B,QAAQ;EACjD,cAAc,YAAY,SAAS,kBAAkB,QAAQ;EAC7D,YAAY,YAAY,OAAO,eAAe,qBAAqB,QAAQ;;UAG5D;EACf;EACA;EACA,QAAQ;EACR;;UAGe;EACf;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA,YAAY;EACZ;EACA,WAAW;;UAoBI;EACf,MAAM;EACN,kBAAkB;EAClB,0BAA0B;EAC1B,2BAA2B;EAC3B,UAAU;EACV;EACA;EACA;EACA,QAAQ;EACR,OAAO;EACP;EACA;IACE;IACA;IACA;;EAEF,WAAW;;UAGI;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAU;EACV;EACA;EACA,UAAU;EACV;EACA;;cAUW,2CAA2C;mBACrC;EAEX,KAAK,YAAY,qBAAqB;EAItC,IAAI,aAAa,QAAQ;EAKzB,KAAK,SAAQ,2BAAgC,QAAQ;EAMrD,cAAc,YAAY,SAAS,kBAAkB,QAAQ;EAa7D,YACJ,YACA,OAAO,eACP,qBACC,QAAQ;;cAsBA,6CAA6C;mBACvC;mBACA;UACT;EAEI,YAAA;IAAW;;EAIjB,KAAK,YAAY,qBAAqB;EAMtC,IAAI,aAAa,QAAQ;EAKzB,KAAK,SAAQ,2BAAgC,QAAQ;EAKrD,cAAc,YAAY,SAAS,kBAAkB,QAAQ;EAO7D,YACJ,YACA,OAAO,eACP,qBACC,QAAQ;UAOG;UAWA;;iBA8BA,yBAAyB;EACvC;EACA;EACA;EACA,MAAM;EACN,WAAW;EACX,SAAS;EACT,UAAU;EACV,QAAQ;EACR,OAAO;EACP;EACA,WAAW;IACT;;iBAqBY,+BACd,KAAK,kBACL,SAAS,mCACR;;iBAsFa,2BACd,KAAK,kBACL;EAAW;IACV;iBA4Da,oBACd,YAAY,KAAK,iEACjB,SAAQ,sBACP;iBAca,0BACd,YAAY,oBACZ,SAAS,sBACR;iBAuBa,uCACd,cAAc,uBACb;iBAIa,iCACd,YAAY,qBACX;iBA6Ca,oCACd,cAAc,uBACb;iBAyCa,0BACd,cAAc,sBACd;EAAW;IACV;iBA2Ba,+BAA+B,SAAS;iBAWxC,+BAA+B,QAAQ,SAAS,eAC9D,KAAK,iBAAiB,QAAQ,SAAS,gBACvC;EACE;EACA;EACA,eAAe;EACf,oBAAoB,MAAM,YAAY,QAAQ,SAAS;EACvD,0BACE,MAAM,YAAY,QAAQ,SAAS,mBAChC;EACL;IAED"}
@@ -1,6 +1,6 @@
1
- import { a as hashCanonical } from "./canonical-Dq2hOQ8L.js";
1
+ import { a as hashCanonical } from "./canonical-CicJlINA.js";
2
2
  import { z } from "zod";
3
- //#region src/analyst/finding-primitives.ts
3
+ // src/analyst/finding-primitives.ts
4
4
  const nonEmpty = z.string().refine((value) => value.trim().length > 0, { message: "must be a non-empty string" });
5
5
  const finite = z.number().refine(Number.isFinite, { message: "must be finite" });
6
6
  const unitRate = finite.refine((value) => value >= 0 && value <= 1, { message: "must be in [0,1]" });
@@ -22,8 +22,7 @@ const findingEvidenceRefSchema = z.object({
22
22
  uri: nonEmpty,
23
23
  excerpt: z.string().optional()
24
24
  }).strict();
25
- //#endregion
26
- //#region src/analyst/finding-composition.ts
25
+ // src/analyst/finding-composition.ts
27
26
  /** What was deliberately changed; this is separate from a finding's event-to-meta scope. */
28
27
  const TREATMENT_LAYERS = [
29
28
  "Task",
@@ -125,7 +124,6 @@ function mergeFindingComposition(findings) {
125
124
  if (first.conditions !== void 0) result.conditions = conditionSnapshots(findings);
126
125
  return result;
127
126
  }
128
- //#endregion
129
127
  export { findingTreatmentSchema as a, findingEvidenceRefSchema as c, findingConditionsSchema as i, assertConsistentFindingConditions as n, mergeFindingComposition as o, findingCompositionKey as r, findingCalibrationSchema as s, TREATMENT_LAYERS as t };
130
128
 
131
- //# sourceMappingURL=finding-composition-8n0fFgVI.js.map
129
+ //# sourceMappingURL=finding-composition-DlvE1Qul.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"finding-composition-8n0fFgVI.js","names":[],"sources":["../src/analyst/finding-primitives.ts","../src/analyst/finding-composition.ts"],"sourcesContent":["import { z } from 'zod'\n\nconst nonEmpty = z\n .string()\n .refine((value) => value.trim().length > 0, { message: 'must be a non-empty string' })\nconst finite = z.number().refine(Number.isFinite, { message: 'must be finite' })\nconst unitRate = finite.refine((value) => value >= 0 && value <= 1, { message: 'must be in [0,1]' })\n\n/** Shared validation for every independently scored finding method. */\nexport const findingCalibrationSchema = z\n .object({\n gold_n: z.number().int().positive(),\n agreement: unitRate,\n kappa: finite.refine((value) => value >= -1 && value <= 1, {\n message: 'must be in [-1,1]',\n }),\n })\n .strict()\n\n/** Evidence references have one shape on definitions and stored findings. */\nexport const findingEvidenceRefSchema = z\n .object({\n kind: z.enum(['span', 'event', 'artifact', 'finding', 'metric']),\n uri: nonEmpty,\n excerpt: z.string().optional(),\n })\n .strict()\n","import { z } from 'zod'\nimport { hashCanonical } from '../ledger-core/canonical'\nimport { findingEvidenceRefSchema } from './finding-primitives'\nimport type { AnalystFinding } from './types'\n\n/** What was deliberately changed; this is separate from a finding's event-to-meta scope. */\nexport const TREATMENT_LAYERS = [\n 'Task',\n 'Model',\n 'Budget',\n 'Team',\n 'Roles',\n 'Tools',\n 'Memory',\n 'Process',\n 'Oversight',\n] as const\nexport type TreatmentLayer = (typeof TREATMENT_LAYERS)[number]\nconst identity = z\n .string()\n .min(1)\n .refine((s) => s.trim() === s)\nconst timestamp = z.string().refine((s) => Number.isFinite(Date.parse(s)))\nconst uniqueIdentities = z\n .array(identity)\n .min(1)\n .refine((xs) => new Set(xs).size === xs.length)\n\nexport const findingTreatmentSchema = z\n .object({\n id: identity,\n definition_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),\n definition_refs: z.array(findingEvidenceRefSchema).min(1),\n layers: z\n .array(z.enum(TREATMENT_LAYERS))\n .min(1)\n .refine((xs) => new Set(xs).size === xs.length),\n })\n .strict()\n\n/** Required nullable values distinguish an unavailable observation from observed absence. */\nexport const findingConditionsSchema = z\n .object({\n id: identity,\n population: uniqueIdentities,\n observed_at: timestamp,\n evidence_refs: z.array(findingEvidenceRefSchema).min(1),\n runtime_version: identity.nullable(),\n lab_commit: identity.nullable(),\n model_version: identity.nullable(),\n provider_version: identity.nullable(),\n seat: identity.nullable(),\n host_load: z.number().finite().nonnegative().nullable(),\n started_at: timestamp.nullable(),\n operator_steers: z\n .array(\n z\n .object({\n id: identity,\n at: timestamp.nullable(),\n planned: z.boolean().nullable(),\n evidence_ref: findingEvidenceRefSchema,\n })\n .strict(),\n )\n .refine((xs) => new Set(xs.map((x) => x.id)).size === xs.length)\n .nullable(),\n })\n .strict()\n\nexport type FindingTreatment = z.infer<typeof findingTreatmentSchema>\nexport type FindingConditions = z.infer<typeof findingConditionsSchema>\ntype Composition = Pick<AnalystFinding, 'treatment' | 'conditions'>\n\nfunction sortedTreatments(values: readonly FindingTreatment[]): FindingTreatment[] {\n return values\n .map((value) => ({ ...value, layers: [...value.layers].sort() }))\n .sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))\n}\n\n/** Fixed environment differences partition claims; varying covariates retain their full provenance. */\nexport function findingCompositionKey(finding: Composition): string {\n if (finding.treatment === undefined && finding.conditions === undefined) return ''\n const fixed =\n finding.conditions === undefined\n ? null\n : [\n ...new Set(\n finding.conditions.map((c) =>\n hashCanonical({\n runtime_version: c.runtime_version,\n lab_commit: c.lab_commit,\n model_version: c.model_version,\n provider_version: c.provider_version,\n seat: c.seat,\n operator_steers:\n c.operator_steers === null\n ? 'unknown'\n : c.operator_steers.some((s) => s.planned !== true)\n ? 'unplanned-or-unknown'\n : 'no-unplanned-steers',\n }),\n ),\n ),\n ].sort()\n return `:composition:${hashCanonical({ treatment: finding.treatment === undefined ? null : sortedTreatments(finding.treatment).map(({ definition_refs: _refs, ...identity }) => identity), fixed })}`\n}\n\nfunction conditionSnapshots(findings: readonly Composition[]): FindingConditions[] {\n const byId = new Map<string, FindingConditions>()\n for (const finding of findings)\n for (const value of finding.conditions ?? []) {\n const snapshot = structuredClone(value)\n const normalized = {\n ...snapshot,\n population: [...value.population].sort(),\n evidence_refs: [...snapshot.evidence_refs].sort((a, b) =>\n hashCanonical(a) < hashCanonical(b) ? -1 : hashCanonical(a) > hashCanonical(b) ? 1 : 0,\n ),\n operator_steers:\n snapshot.operator_steers === null\n ? null\n : [...snapshot.operator_steers].sort((a, b) =>\n a.id < b.id ? -1 : a.id > b.id ? 1 : 0,\n ),\n }\n const prior = byId.get(value.id)\n if (prior && hashCanonical(prior) !== hashCanonical(normalized))\n throw new TypeError('Conflicting immutable condition snapshot')\n byId.set(value.id, normalized)\n }\n return [...byId.values()].sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))\n}\n\n/** A snapshot ID must have one meaning across an aggregation input, before partitioning. */\nexport function assertConsistentFindingConditions(findings: readonly Composition[]): void {\n conditionSnapshots(findings)\n}\n\n/** All aggregation paths reuse this union, including promotion's underlying-run re-pooling. */\nexport function mergeFindingComposition(findings: readonly Composition[]): Composition {\n const first = findings[0]\n if (!first) return {}\n for (const finding of findings)\n for (const values of [finding.treatment, finding.conditions]) {\n if (values && new Set(values.map((value) => value.id)).size !== values.length)\n throw new TypeError('Duplicate finding composition id')\n }\n const key = findingCompositionKey(first)\n if (findings.some((f) => findingCompositionKey(f) !== key))\n throw new TypeError('Cannot pool different finding compositions')\n const result: Composition = {}\n if (first.treatment !== undefined)\n result.treatment = sortedTreatments(first.treatment).map((value) => {\n const refs = new Map(\n findings\n .flatMap((f) => f.treatment!.find((t) => t.id === value.id)!.definition_refs)\n .map((ref) => [hashCanonical(ref), ref] as const),\n )\n return {\n ...value,\n definition_refs: [...refs.entries()]\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([, ref]) => structuredClone(ref)),\n }\n })\n if (first.conditions !== undefined) {\n result.conditions = conditionSnapshots(findings)\n }\n return result\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"finding-composition-DlvE1Qul.js","names":[],"sources":["../src/analyst/finding-primitives.ts","../src/analyst/finding-composition.ts"],"sourcesContent":["import { z } from 'zod'\n\nconst nonEmpty = z\n .string()\n .refine((value) => value.trim().length > 0, { message: 'must be a non-empty string' })\nconst finite = z.number().refine(Number.isFinite, { message: 'must be finite' })\nconst unitRate = finite.refine((value) => value >= 0 && value <= 1, { message: 'must be in [0,1]' })\n\n/** Shared validation for every independently scored finding method. */\nexport const findingCalibrationSchema = z\n .object({\n gold_n: z.number().int().positive(),\n agreement: unitRate,\n kappa: finite.refine((value) => value >= -1 && value <= 1, {\n message: 'must be in [-1,1]',\n }),\n })\n .strict()\n\n/** Evidence references have one shape on definitions and stored findings. */\nexport const findingEvidenceRefSchema = z\n .object({\n kind: z.enum(['span', 'event', 'artifact', 'finding', 'metric']),\n uri: nonEmpty,\n excerpt: z.string().optional(),\n })\n .strict()\n","import { z } from 'zod'\nimport { hashCanonical } from '../ledger-core/canonical'\nimport { findingEvidenceRefSchema } from './finding-primitives'\nimport type { AnalystFinding } from './types'\n\n/** What was deliberately changed; this is separate from a finding's event-to-meta scope. */\nexport const TREATMENT_LAYERS = [\n 'Task',\n 'Model',\n 'Budget',\n 'Team',\n 'Roles',\n 'Tools',\n 'Memory',\n 'Process',\n 'Oversight',\n] as const\nexport type TreatmentLayer = (typeof TREATMENT_LAYERS)[number]\nconst identity = z\n .string()\n .min(1)\n .refine((s) => s.trim() === s)\nconst timestamp = z.string().refine((s) => Number.isFinite(Date.parse(s)))\nconst uniqueIdentities = z\n .array(identity)\n .min(1)\n .refine((xs) => new Set(xs).size === xs.length)\n\nexport const findingTreatmentSchema = z\n .object({\n id: identity,\n definition_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),\n definition_refs: z.array(findingEvidenceRefSchema).min(1),\n layers: z\n .array(z.enum(TREATMENT_LAYERS))\n .min(1)\n .refine((xs) => new Set(xs).size === xs.length),\n })\n .strict()\n\n/** Required nullable values distinguish an unavailable observation from observed absence. */\nexport const findingConditionsSchema = z\n .object({\n id: identity,\n population: uniqueIdentities,\n observed_at: timestamp,\n evidence_refs: z.array(findingEvidenceRefSchema).min(1),\n runtime_version: identity.nullable(),\n lab_commit: identity.nullable(),\n model_version: identity.nullable(),\n provider_version: identity.nullable(),\n seat: identity.nullable(),\n host_load: z.number().finite().nonnegative().nullable(),\n started_at: timestamp.nullable(),\n operator_steers: z\n .array(\n z\n .object({\n id: identity,\n at: timestamp.nullable(),\n planned: z.boolean().nullable(),\n evidence_ref: findingEvidenceRefSchema,\n })\n .strict(),\n )\n .refine((xs) => new Set(xs.map((x) => x.id)).size === xs.length)\n .nullable(),\n })\n .strict()\n\nexport type FindingTreatment = z.infer<typeof findingTreatmentSchema>\nexport type FindingConditions = z.infer<typeof findingConditionsSchema>\ntype Composition = Pick<AnalystFinding, 'treatment' | 'conditions'>\n\nfunction sortedTreatments(values: readonly FindingTreatment[]): FindingTreatment[] {\n return values\n .map((value) => ({ ...value, layers: [...value.layers].sort() }))\n .sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))\n}\n\n/** Fixed environment differences partition claims; varying covariates retain their full provenance. */\nexport function findingCompositionKey(finding: Composition): string {\n if (finding.treatment === undefined && finding.conditions === undefined) return ''\n const fixed =\n finding.conditions === undefined\n ? null\n : [\n ...new Set(\n finding.conditions.map((c) =>\n hashCanonical({\n runtime_version: c.runtime_version,\n lab_commit: c.lab_commit,\n model_version: c.model_version,\n provider_version: c.provider_version,\n seat: c.seat,\n operator_steers:\n c.operator_steers === null\n ? 'unknown'\n : c.operator_steers.some((s) => s.planned !== true)\n ? 'unplanned-or-unknown'\n : 'no-unplanned-steers',\n }),\n ),\n ),\n ].sort()\n return `:composition:${hashCanonical({ treatment: finding.treatment === undefined ? null : sortedTreatments(finding.treatment).map(({ definition_refs: _refs, ...identity }) => identity), fixed })}`\n}\n\nfunction conditionSnapshots(findings: readonly Composition[]): FindingConditions[] {\n const byId = new Map<string, FindingConditions>()\n for (const finding of findings)\n for (const value of finding.conditions ?? []) {\n const snapshot = structuredClone(value)\n const normalized = {\n ...snapshot,\n population: [...value.population].sort(),\n evidence_refs: [...snapshot.evidence_refs].sort((a, b) =>\n hashCanonical(a) < hashCanonical(b) ? -1 : hashCanonical(a) > hashCanonical(b) ? 1 : 0,\n ),\n operator_steers:\n snapshot.operator_steers === null\n ? null\n : [...snapshot.operator_steers].sort((a, b) =>\n a.id < b.id ? -1 : a.id > b.id ? 1 : 0,\n ),\n }\n const prior = byId.get(value.id)\n if (prior && hashCanonical(prior) !== hashCanonical(normalized))\n throw new TypeError('Conflicting immutable condition snapshot')\n byId.set(value.id, normalized)\n }\n return [...byId.values()].sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))\n}\n\n/** A snapshot ID must have one meaning across an aggregation input, before partitioning. */\nexport function assertConsistentFindingConditions(findings: readonly Composition[]): void {\n conditionSnapshots(findings)\n}\n\n/** All aggregation paths reuse this union, including promotion's underlying-run re-pooling. */\nexport function mergeFindingComposition(findings: readonly Composition[]): Composition {\n const first = findings[0]\n if (!first) return {}\n for (const finding of findings)\n for (const values of [finding.treatment, finding.conditions]) {\n if (values && new Set(values.map((value) => value.id)).size !== values.length)\n throw new TypeError('Duplicate finding composition id')\n }\n const key = findingCompositionKey(first)\n if (findings.some((f) => findingCompositionKey(f) !== key))\n throw new TypeError('Cannot pool different finding compositions')\n const result: Composition = {}\n if (first.treatment !== undefined)\n result.treatment = sortedTreatments(first.treatment).map((value) => {\n const refs = new Map(\n findings\n .flatMap((f) => f.treatment!.find((t) => t.id === value.id)!.definition_refs)\n .map((ref) => [hashCanonical(ref), ref] as const),\n )\n return {\n ...value,\n definition_refs: [...refs.entries()]\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([, ref]) => structuredClone(ref)),\n }\n })\n if (first.conditions !== undefined) {\n result.conditions = conditionSnapshots(findings)\n }\n return result\n}\n"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
- import { c as errorMessage } from "./errors-BcOs5MKW.js";
2
- import { i as Mutex } from "./journal-C7om8Gum.js";
3
- import { t as extractJsonPayload } from "./json-BhdsJaOQ.js";
4
- import { A as RawAnalystFindingSchema } from "./kind-factory-Dl0PmNQL.js";
5
- import "./llm-client-b1ysZVIU.js";
6
- import { t as paidChat } from "./chat-json-call-BzWYp18J.js";
7
- import { n as decodeRawFindingArray } from "./dspy-rlm-engine-DN1p_5jx.js";
1
+ import { c as errorMessage } from "./errors-DeEEV9Vx.js";
2
+ import { u as Mutex } from "./journal-C1uLJi0w.js";
3
+ import { t as extractJsonPayload } from "./json-DtvZNAU9.js";
4
+ import { A as RawAnalystFindingSchema } from "./kind-factory-VKysp1ds.js";
5
+ import "./llm-client-kJ9EOqjt.js";
6
+ import { t as paidChat } from "./chat-json-call-8yUv4LFO.js";
7
+ import { n as decodeRawFindingArray } from "./dspy-rlm-engine-jDiWkul6.js";
8
8
  import { z } from "zod";
9
9
  import { appendFileSync, existsSync, mkdirSync, readFileSync } from "node:fs";
10
10
  import { dirname } from "node:path";
11
- //#region src/analyst/chat-trace-engine.ts
11
+ // src/analyst/chat-trace-engine.ts
12
12
  /**
13
13
  * A `TraceAnalysisEngine` that runs entirely inside Node against a
14
14
  * caller-owned `ChatClient`.
@@ -398,8 +398,7 @@ function resolveModel(options) {
398
398
  if (typeof model !== "string" || !model.trim() || model !== model.trim()) throw new TypeError("chat trace engine needs a model: pass ChatTraceEngineOptions.model or bind defaultModel on the ChatClient");
399
399
  return model;
400
400
  }
401
- //#endregion
402
- //#region src/locked-jsonl-appender.ts
401
+ // src/locked-jsonl-appender.ts
403
402
  /**
404
403
  * LockedJsonlAppender — mutex-serialized JSONL append helper for arbitrary
405
404
  * payloads. The reference-replay store does the same thing for typed
@@ -434,8 +433,7 @@ var LockedJsonlAppender = class {
434
433
  });
435
434
  }
436
435
  };
437
- //#endregion
438
- //#region src/analyst/findings-store.ts
436
+ // src/analyst/findings-store.ts
439
437
  /**
440
438
  * FindingsStore — durable persistence for AnalystFinding rows + a diff
441
439
  * helper so we can answer "what changed since the last run?" without
@@ -532,7 +530,6 @@ function diffFindings(previous, current, policy = {}) {
532
530
  changed
533
531
  };
534
532
  }
535
- //#endregion
536
533
  export { diffFindings as n, createChatTraceEngine as r, FindingsStore as t };
537
534
 
538
- //# sourceMappingURL=findings-store-Bg4sdS-e.js.map
535
+ //# sourceMappingURL=findings-store-B75Dspaq.js.map