@runcofactor/cli 0.57.0 → 0.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/README.md +40 -0
  2. package/dist/{account-S7VHLHYX.js → account-CWSADXJD.js} +5 -5
  3. package/dist/{alert-DZUI3JEU.js → alert-VEZZJPIH.js} +8 -8
  4. package/dist/{api-catalog-WP6AQYUG.js → api-catalog-OBE6ITCJ.js} +5 -5
  5. package/dist/{api-key-U57EC2YF.js → api-key-265DBPSR.js} +5 -5
  6. package/dist/{attachment-MICVVXUW.js → attachment-QE65VNDG.js} +5 -5
  7. package/dist/{auth-UDD77PG6.js → auth-DG6RD4UA.js} +3 -3
  8. package/dist/{benchmark-Q5BVGQ3I.js → benchmark-3R75GENH.js} +5 -5
  9. package/dist/billing-AGY6VUCA.js +64 -0
  10. package/dist/billing-AGY6VUCA.js.map +1 -0
  11. package/dist/{blackcat-TZNSDQAC.js → blackcat-EKZS3TBD.js} +3 -3
  12. package/dist/{chunk-AHS2HMEH.js → chunk-4KFJQPJF.js} +3 -3
  13. package/dist/{chunk-LP4X7TWI.js → chunk-56WV7CFM.js} +2 -2
  14. package/dist/{chunk-3EKIGWMN.js → chunk-A6VDLUMH.js} +3 -3
  15. package/dist/{chunk-XQZJWDM4.js → chunk-B7G4TOYC.js} +5 -5
  16. package/dist/{chunk-U3MXJTTD.js → chunk-BDPNJKUZ.js} +10 -10
  17. package/dist/{chunk-IIDQM4MY.js → chunk-BMFD4OPC.js} +2 -2
  18. package/dist/{chunk-EYHJ5FIA.js → chunk-C6SNLHVE.js} +10 -1
  19. package/dist/chunk-C6SNLHVE.js.map +1 -0
  20. package/dist/{chunk-T5MU76RA.js → chunk-C77XIO2W.js} +4 -4
  21. package/dist/{chunk-FBEQNW2P.js → chunk-DFN2NH37.js} +2 -2
  22. package/dist/{chunk-4SQKKD3R.js → chunk-EDX47DXT.js} +2 -2
  23. package/dist/{chunk-BSCEOIYX.js → chunk-FQ6P522C.js} +2 -2
  24. package/dist/{chunk-6IMNRYC3.js → chunk-GQSW6ZY3.js} +5 -5
  25. package/dist/{chunk-4GDEKB5S.js → chunk-GVNSCSIC.js} +4 -4
  26. package/dist/{chunk-W4P6BGJ7.js → chunk-IN3AF6LI.js} +4 -4
  27. package/dist/{chunk-CZOYFKTY.js → chunk-IVJU3LP6.js} +3 -3
  28. package/dist/{chunk-H2K3ABPO.js → chunk-K54XL64A.js} +6 -6
  29. package/dist/{chunk-T6ZNIMI4.js → chunk-LRIP5IQD.js} +3 -3
  30. package/dist/chunk-LRIP5IQD.js.map +1 -0
  31. package/dist/{chunk-T6KTBHWD.js → chunk-LZLSRN5Q.js} +6 -6
  32. package/dist/{chunk-YILSW5ZY.js → chunk-MCJOF3JX.js} +4 -4
  33. package/dist/{chunk-SBQLD7X6.js → chunk-PN5IK7CJ.js} +2 -2
  34. package/dist/{chunk-K3MG2ZMH.js → chunk-RIBSXEAM.js} +2 -2
  35. package/dist/{chunk-DTB5HUD2.js → chunk-SPTLZJOF.js} +5 -4
  36. package/dist/chunk-SPTLZJOF.js.map +1 -0
  37. package/dist/{chunk-K2USFSTX.js → chunk-T7NZHHC5.js} +3 -3
  38. package/dist/{chunk-5MFHNT56.js → chunk-TWPCN4DV.js} +2 -2
  39. package/dist/chunk-UPP4F2BE.js +519 -0
  40. package/dist/chunk-UPP4F2BE.js.map +1 -0
  41. package/dist/{chunk-KD7VGZX7.js → chunk-UZZ5OHXT.js} +7 -7
  42. package/dist/{chunk-N55RKCGR.js → chunk-V22CGGHO.js} +6 -1
  43. package/dist/chunk-V22CGGHO.js.map +1 -0
  44. package/dist/{chunk-YFXTMFYB.js → chunk-V6OC2WQL.js} +5 -5
  45. package/dist/{chunk-YV4RASGX.js → chunk-W43YGZOP.js} +18 -6
  46. package/dist/chunk-W43YGZOP.js.map +1 -0
  47. package/dist/{chunk-TG32WC4J.js → chunk-W6TPKE5S.js} +2 -2
  48. package/dist/{chunk-72Y65NWI.js → chunk-WY4R4IL5.js} +3 -3
  49. package/dist/{chunk-XGGHOHZS.js → chunk-XD3PSGFG.js} +3 -3
  50. package/dist/chunk-XD3PSGFG.js.map +1 -0
  51. package/dist/{chunk-ETXIGTS7.js → chunk-XKR275VJ.js} +3 -3
  52. package/dist/{credential-HM4THJOS.js → credential-DPUCDGYC.js} +5 -5
  53. package/dist/{credential-template-JBV3FZBY.js → credential-template-67RQWMH2.js} +5 -5
  54. package/dist/{dev-D2HS5XXN.js → dev-MU45HWAN.js} +456 -170
  55. package/dist/dev-MU45HWAN.js.map +1 -0
  56. package/dist/{digest-54VJ7KTF.js → digest-4PABSK2F.js} +8 -8
  57. package/dist/{docs-PPQSNRP6.js → docs-ZL5QOHCB.js} +5 -5
  58. package/dist/{doctor-CXFGSPWH.js → doctor-J5X2HSLJ.js} +3 -3
  59. package/dist/{environment-6MXRQV5L.js → environment-7Q6WDKMM.js} +7 -7
  60. package/dist/{eval-HCDXL4QT.js → eval-37P36M53.js} +51 -358
  61. package/dist/eval-37P36M53.js.map +1 -0
  62. package/dist/{exploration-U2WMYBZ3.js → exploration-7PHVC753.js} +5 -5
  63. package/dist/{exploratory-test-FD7VGUKE.js → exploratory-test-NE7ECFWS.js} +6 -6
  64. package/dist/{external-run-THSD26B7.js → external-run-KZGHVSHY.js} +134 -11
  65. package/dist/external-run-KZGHVSHY.js.map +1 -0
  66. package/dist/{feature-flag-D5IZ6OEG.js → feature-flag-YFWCPWIR.js} +5 -5
  67. package/dist/{feedback-6YCQMQQ3.js → feedback-HVR7LMFL.js} +6 -6
  68. package/dist/{flow-OVEA7273.js → flow-M6QBA4WR.js} +5 -5
  69. package/dist/{github-L2AFIEVN.js → github-HUBAWWFS.js} +6 -6
  70. package/dist/index.js +87 -80
  71. package/dist/index.js.map +1 -1
  72. package/dist/{init-ADOE2D6R.js → init-5A7VDZU4.js} +5 -5
  73. package/dist/{install-SB6NLXDQ.js → install-HM3USHVU.js} +5 -5
  74. package/dist/{issues-V2DSZXAN.js → issues-W6WIQ4RX.js} +8 -8
  75. package/dist/{knobs-MR4H55EB.js → knobs-NR52HEAL.js} +5 -5
  76. package/dist/{landing-KTYDL7QJ.js → landing-FHE7RWCR.js} +7 -7
  77. package/dist/{list-DFBHWU77.js → list-6J6BCU2L.js} +5 -5
  78. package/dist/{local-QXSTGDFN.js → local-DNRUTJBN.js} +7 -7
  79. package/dist/{login-KGIZAZCR.js → login-K7CNO4QS.js} +5 -5
  80. package/dist/{mcp-EDYHUOFI.js → mcp-G72SEYO5.js} +10 -10
  81. package/dist/mcp-eval-X4AGPFWW.js +450 -0
  82. package/dist/mcp-eval-X4AGPFWW.js.map +1 -0
  83. package/dist/{metrics-JUONV7EL.js → metrics-WXQPVDQY.js} +5 -5
  84. package/dist/{monitor-F7F7EJAL.js → monitor-URPOJOER.js} +5 -5
  85. package/dist/{perf-L2YL4Z2L.js → perf-WG6DAZBT.js} +11 -11
  86. package/dist/{product-UBLNRF5Y.js → product-TGOCFPCC.js} +5 -5
  87. package/dist/{product-map-7K5I5TVU.js → product-map-PKDPF2FB.js} +7 -7
  88. package/dist/{prompts-3JNN4M46.js → prompts-63KKMXLZ.js} +5 -5
  89. package/dist/{proofs-MJ7MGBCW.js → proofs-XRQ3BMM2.js} +9 -9
  90. package/dist/{property-TCDBREZL.js → property-O3PMHQLJ.js} +6 -6
  91. package/dist/{psql-YD54GQMP.js → psql-SUE2TORV.js} +5 -5
  92. package/dist/{record-OWBURAZ4.js → record-C245ESQA.js} +6 -6
  93. package/dist/{redis-3SIKQULP.js → redis-CAOX2ODS.js} +5 -5
  94. package/dist/{release-DMCBRVA5.js → release-ALUGJZTN.js} +5 -5
  95. package/dist/{runbook-ZRKWCLZE.js → runbook-63HBD7WH.js} +5 -5
  96. package/dist/{sandbox-HMZR6SKM.js → sandbox-IC5E53CC.js} +9 -9
  97. package/dist/{scenarios-2QHT5A4F.js → scenarios-JR2H7SZC.js} +5 -5
  98. package/dist/{schedule-4L7LOUDB.js → schedule-FHMCSKPL.js} +8 -8
  99. package/dist/{session-JHLYECKM.js → session-BKHVVZS3.js} +9 -9
  100. package/dist/{skill-ARJSVWCZ.js → skill-TZE27TIN.js} +3 -3
  101. package/dist/{slack-T7CR4SAU.js → slack-3BQ2T3ZS.js} +6 -6
  102. package/dist/{spec-RDNTNUE2.js → spec-PCAK2BX5.js} +5 -5
  103. package/dist/{src-DJETLMXP.js → src-BCJZMHSQ.js} +3 -3
  104. package/dist/{src-H7IBLPDW.js → src-BPKBSXKX.js} +4 -4
  105. package/dist/{src-DPJGVNYG.js → src-PNV4HGUY.js} +3 -3
  106. package/dist/{src-UKPMEXXT.js → src-ZJGBNWYB.js} +5 -5
  107. package/dist/{start-NR7W2LIP.js → start-BA5UEI3W.js} +5 -5
  108. package/dist/{status-UDNXR5GK.js → status-TUXK57H4.js} +5 -5
  109. package/dist/{tag-ADP2MZ3V.js → tag-IBDEJZM7.js} +6 -6
  110. package/dist/{task-KQOUTIJU.js → task-WXZQM4BW.js} +6 -6
  111. package/dist/{teams-D4QXSVDA.js → teams-656T2IHZ.js} +7 -7
  112. package/dist/{test-suite-DYMY4YAG.js → test-suite-ETXWE5HB.js} +12 -12
  113. package/dist/{tickets-BX3LFWUS.js → tickets-LWP3XIHG.js} +5 -5
  114. package/dist/{trace-MBRU6DLE.js → trace-RNEY6XCJ.js} +8 -8
  115. package/dist/{triage-IXAU73VL.js → triage-VZIIN7KB.js} +6 -6
  116. package/dist/{trigger-CHSWCUV3.js → trigger-KTTSNSRU.js} +10 -10
  117. package/dist/{update-check-LLETICM4.js → update-check-SLGKNOUC.js} +4 -4
  118. package/dist/{upgrade-35WVNUEG.js → upgrade-2KSYA4GE.js} +5 -5
  119. package/dist/{usage-YUYXUNF2.js → usage-SC4NWQ5A.js} +99 -14
  120. package/dist/usage-SC4NWQ5A.js.map +1 -0
  121. package/dist/{utilities-MOHIKBBF.js → utilities-O4VVADHM.js} +6 -6
  122. package/dist/{visual-RNYERKX4.js → visual-ZWQTVXTM.js} +5 -5
  123. package/dist/{workflow-NM5IC7ZQ.js → workflow-7HKA2WKO.js} +30 -30
  124. package/dist/{workflow-cache-JNN7BS2K.js → workflow-cache-FDN2N5HH.js} +18 -18
  125. package/dist/{workflow-cache-convergence-resolve-4SO2MP7T.js → workflow-cache-convergence-resolve-BGEUM7WV.js} +5 -5
  126. package/dist/{workflow-debug-E7BXSSOG.js → workflow-debug-KNE7SVXQ.js} +11 -11
  127. package/dist/{workflow-feedback-EWAK45AB.js → workflow-feedback-YY2FZTV4.js} +5 -5
  128. package/dist/{workflow-fork-NO5IFBD4.js → workflow-fork-FH5KBVWP.js} +5 -5
  129. package/dist/{workflow-promotion-NWIZNAR4.js → workflow-promotion-RRI53FB6.js} +5 -5
  130. package/dist/{workflow-proposals-XMAZJT3X.js → workflow-proposals-5XGCOTEU.js} +5 -5
  131. package/dist/{workflow-revisions-4EQMLZGY.js → workflow-revisions-M6WPGXAT.js} +5 -5
  132. package/dist/{workflow-status-AZMXQZLC.js → workflow-status-I5BSSWHY.js} +5 -5
  133. package/package.json +2 -2
  134. package/dist/chunk-DTB5HUD2.js.map +0 -1
  135. package/dist/chunk-EYHJ5FIA.js.map +0 -1
  136. package/dist/chunk-N55RKCGR.js.map +0 -1
  137. package/dist/chunk-T6ZNIMI4.js.map +0 -1
  138. package/dist/chunk-XGGHOHZS.js.map +0 -1
  139. package/dist/chunk-YV4RASGX.js.map +0 -1
  140. package/dist/dev-D2HS5XXN.js.map +0 -1
  141. package/dist/eval-HCDXL4QT.js.map +0 -1
  142. package/dist/external-run-THSD26B7.js.map +0 -1
  143. package/dist/mcp-eval-YT2RFIC5.js +0 -196
  144. package/dist/mcp-eval-YT2RFIC5.js.map +0 -1
  145. package/dist/usage-YUYXUNF2.js.map +0 -1
  146. /package/dist/{account-S7VHLHYX.js.map → account-CWSADXJD.js.map} +0 -0
  147. /package/dist/{alert-DZUI3JEU.js.map → alert-VEZZJPIH.js.map} +0 -0
  148. /package/dist/{api-catalog-WP6AQYUG.js.map → api-catalog-OBE6ITCJ.js.map} +0 -0
  149. /package/dist/{api-key-U57EC2YF.js.map → api-key-265DBPSR.js.map} +0 -0
  150. /package/dist/{attachment-MICVVXUW.js.map → attachment-QE65VNDG.js.map} +0 -0
  151. /package/dist/{auth-UDD77PG6.js.map → auth-DG6RD4UA.js.map} +0 -0
  152. /package/dist/{benchmark-Q5BVGQ3I.js.map → benchmark-3R75GENH.js.map} +0 -0
  153. /package/dist/{blackcat-TZNSDQAC.js.map → blackcat-EKZS3TBD.js.map} +0 -0
  154. /package/dist/{chunk-AHS2HMEH.js.map → chunk-4KFJQPJF.js.map} +0 -0
  155. /package/dist/{chunk-LP4X7TWI.js.map → chunk-56WV7CFM.js.map} +0 -0
  156. /package/dist/{chunk-3EKIGWMN.js.map → chunk-A6VDLUMH.js.map} +0 -0
  157. /package/dist/{chunk-XQZJWDM4.js.map → chunk-B7G4TOYC.js.map} +0 -0
  158. /package/dist/{chunk-U3MXJTTD.js.map → chunk-BDPNJKUZ.js.map} +0 -0
  159. /package/dist/{chunk-IIDQM4MY.js.map → chunk-BMFD4OPC.js.map} +0 -0
  160. /package/dist/{chunk-T5MU76RA.js.map → chunk-C77XIO2W.js.map} +0 -0
  161. /package/dist/{chunk-FBEQNW2P.js.map → chunk-DFN2NH37.js.map} +0 -0
  162. /package/dist/{chunk-4SQKKD3R.js.map → chunk-EDX47DXT.js.map} +0 -0
  163. /package/dist/{chunk-BSCEOIYX.js.map → chunk-FQ6P522C.js.map} +0 -0
  164. /package/dist/{chunk-6IMNRYC3.js.map → chunk-GQSW6ZY3.js.map} +0 -0
  165. /package/dist/{chunk-4GDEKB5S.js.map → chunk-GVNSCSIC.js.map} +0 -0
  166. /package/dist/{chunk-W4P6BGJ7.js.map → chunk-IN3AF6LI.js.map} +0 -0
  167. /package/dist/{chunk-CZOYFKTY.js.map → chunk-IVJU3LP6.js.map} +0 -0
  168. /package/dist/{chunk-H2K3ABPO.js.map → chunk-K54XL64A.js.map} +0 -0
  169. /package/dist/{chunk-T6KTBHWD.js.map → chunk-LZLSRN5Q.js.map} +0 -0
  170. /package/dist/{chunk-YILSW5ZY.js.map → chunk-MCJOF3JX.js.map} +0 -0
  171. /package/dist/{chunk-SBQLD7X6.js.map → chunk-PN5IK7CJ.js.map} +0 -0
  172. /package/dist/{chunk-K3MG2ZMH.js.map → chunk-RIBSXEAM.js.map} +0 -0
  173. /package/dist/{chunk-K2USFSTX.js.map → chunk-T7NZHHC5.js.map} +0 -0
  174. /package/dist/{chunk-5MFHNT56.js.map → chunk-TWPCN4DV.js.map} +0 -0
  175. /package/dist/{chunk-KD7VGZX7.js.map → chunk-UZZ5OHXT.js.map} +0 -0
  176. /package/dist/{chunk-YFXTMFYB.js.map → chunk-V6OC2WQL.js.map} +0 -0
  177. /package/dist/{chunk-TG32WC4J.js.map → chunk-W6TPKE5S.js.map} +0 -0
  178. /package/dist/{chunk-72Y65NWI.js.map → chunk-WY4R4IL5.js.map} +0 -0
  179. /package/dist/{chunk-ETXIGTS7.js.map → chunk-XKR275VJ.js.map} +0 -0
  180. /package/dist/{credential-HM4THJOS.js.map → credential-DPUCDGYC.js.map} +0 -0
  181. /package/dist/{credential-template-JBV3FZBY.js.map → credential-template-67RQWMH2.js.map} +0 -0
  182. /package/dist/{digest-54VJ7KTF.js.map → digest-4PABSK2F.js.map} +0 -0
  183. /package/dist/{docs-PPQSNRP6.js.map → docs-ZL5QOHCB.js.map} +0 -0
  184. /package/dist/{doctor-CXFGSPWH.js.map → doctor-J5X2HSLJ.js.map} +0 -0
  185. /package/dist/{environment-6MXRQV5L.js.map → environment-7Q6WDKMM.js.map} +0 -0
  186. /package/dist/{exploration-U2WMYBZ3.js.map → exploration-7PHVC753.js.map} +0 -0
  187. /package/dist/{exploratory-test-FD7VGUKE.js.map → exploratory-test-NE7ECFWS.js.map} +0 -0
  188. /package/dist/{feature-flag-D5IZ6OEG.js.map → feature-flag-YFWCPWIR.js.map} +0 -0
  189. /package/dist/{feedback-6YCQMQQ3.js.map → feedback-HVR7LMFL.js.map} +0 -0
  190. /package/dist/{flow-OVEA7273.js.map → flow-M6QBA4WR.js.map} +0 -0
  191. /package/dist/{github-L2AFIEVN.js.map → github-HUBAWWFS.js.map} +0 -0
  192. /package/dist/{init-ADOE2D6R.js.map → init-5A7VDZU4.js.map} +0 -0
  193. /package/dist/{install-SB6NLXDQ.js.map → install-HM3USHVU.js.map} +0 -0
  194. /package/dist/{issues-V2DSZXAN.js.map → issues-W6WIQ4RX.js.map} +0 -0
  195. /package/dist/{knobs-MR4H55EB.js.map → knobs-NR52HEAL.js.map} +0 -0
  196. /package/dist/{landing-KTYDL7QJ.js.map → landing-FHE7RWCR.js.map} +0 -0
  197. /package/dist/{list-DFBHWU77.js.map → list-6J6BCU2L.js.map} +0 -0
  198. /package/dist/{local-QXSTGDFN.js.map → local-DNRUTJBN.js.map} +0 -0
  199. /package/dist/{login-KGIZAZCR.js.map → login-K7CNO4QS.js.map} +0 -0
  200. /package/dist/{mcp-EDYHUOFI.js.map → mcp-G72SEYO5.js.map} +0 -0
  201. /package/dist/{metrics-JUONV7EL.js.map → metrics-WXQPVDQY.js.map} +0 -0
  202. /package/dist/{monitor-F7F7EJAL.js.map → monitor-URPOJOER.js.map} +0 -0
  203. /package/dist/{perf-L2YL4Z2L.js.map → perf-WG6DAZBT.js.map} +0 -0
  204. /package/dist/{product-UBLNRF5Y.js.map → product-TGOCFPCC.js.map} +0 -0
  205. /package/dist/{product-map-7K5I5TVU.js.map → product-map-PKDPF2FB.js.map} +0 -0
  206. /package/dist/{prompts-3JNN4M46.js.map → prompts-63KKMXLZ.js.map} +0 -0
  207. /package/dist/{proofs-MJ7MGBCW.js.map → proofs-XRQ3BMM2.js.map} +0 -0
  208. /package/dist/{property-TCDBREZL.js.map → property-O3PMHQLJ.js.map} +0 -0
  209. /package/dist/{psql-YD54GQMP.js.map → psql-SUE2TORV.js.map} +0 -0
  210. /package/dist/{record-OWBURAZ4.js.map → record-C245ESQA.js.map} +0 -0
  211. /package/dist/{redis-3SIKQULP.js.map → redis-CAOX2ODS.js.map} +0 -0
  212. /package/dist/{release-DMCBRVA5.js.map → release-ALUGJZTN.js.map} +0 -0
  213. /package/dist/{runbook-ZRKWCLZE.js.map → runbook-63HBD7WH.js.map} +0 -0
  214. /package/dist/{sandbox-HMZR6SKM.js.map → sandbox-IC5E53CC.js.map} +0 -0
  215. /package/dist/{scenarios-2QHT5A4F.js.map → scenarios-JR2H7SZC.js.map} +0 -0
  216. /package/dist/{schedule-4L7LOUDB.js.map → schedule-FHMCSKPL.js.map} +0 -0
  217. /package/dist/{session-JHLYECKM.js.map → session-BKHVVZS3.js.map} +0 -0
  218. /package/dist/{skill-ARJSVWCZ.js.map → skill-TZE27TIN.js.map} +0 -0
  219. /package/dist/{slack-T7CR4SAU.js.map → slack-3BQ2T3ZS.js.map} +0 -0
  220. /package/dist/{spec-RDNTNUE2.js.map → spec-PCAK2BX5.js.map} +0 -0
  221. /package/dist/{src-DJETLMXP.js.map → src-BCJZMHSQ.js.map} +0 -0
  222. /package/dist/{src-H7IBLPDW.js.map → src-BPKBSXKX.js.map} +0 -0
  223. /package/dist/{src-DPJGVNYG.js.map → src-PNV4HGUY.js.map} +0 -0
  224. /package/dist/{src-UKPMEXXT.js.map → src-ZJGBNWYB.js.map} +0 -0
  225. /package/dist/{start-NR7W2LIP.js.map → start-BA5UEI3W.js.map} +0 -0
  226. /package/dist/{status-UDNXR5GK.js.map → status-TUXK57H4.js.map} +0 -0
  227. /package/dist/{tag-ADP2MZ3V.js.map → tag-IBDEJZM7.js.map} +0 -0
  228. /package/dist/{task-KQOUTIJU.js.map → task-WXZQM4BW.js.map} +0 -0
  229. /package/dist/{teams-D4QXSVDA.js.map → teams-656T2IHZ.js.map} +0 -0
  230. /package/dist/{test-suite-DYMY4YAG.js.map → test-suite-ETXWE5HB.js.map} +0 -0
  231. /package/dist/{tickets-BX3LFWUS.js.map → tickets-LWP3XIHG.js.map} +0 -0
  232. /package/dist/{trace-MBRU6DLE.js.map → trace-RNEY6XCJ.js.map} +0 -0
  233. /package/dist/{triage-IXAU73VL.js.map → triage-VZIIN7KB.js.map} +0 -0
  234. /package/dist/{trigger-CHSWCUV3.js.map → trigger-KTTSNSRU.js.map} +0 -0
  235. /package/dist/{update-check-LLETICM4.js.map → update-check-SLGKNOUC.js.map} +0 -0
  236. /package/dist/{upgrade-35WVNUEG.js.map → upgrade-2KSYA4GE.js.map} +0 -0
  237. /package/dist/{utilities-MOHIKBBF.js.map → utilities-O4VVADHM.js.map} +0 -0
  238. /package/dist/{visual-RNYERKX4.js.map → visual-ZWQTVXTM.js.map} +0 -0
  239. /package/dist/{workflow-NM5IC7ZQ.js.map → workflow-7HKA2WKO.js.map} +0 -0
  240. /package/dist/{workflow-cache-JNN7BS2K.js.map → workflow-cache-FDN2N5HH.js.map} +0 -0
  241. /package/dist/{workflow-cache-convergence-resolve-4SO2MP7T.js.map → workflow-cache-convergence-resolve-BGEUM7WV.js.map} +0 -0
  242. /package/dist/{workflow-debug-E7BXSSOG.js.map → workflow-debug-KNE7SVXQ.js.map} +0 -0
  243. /package/dist/{workflow-feedback-EWAK45AB.js.map → workflow-feedback-YY2FZTV4.js.map} +0 -0
  244. /package/dist/{workflow-fork-NO5IFBD4.js.map → workflow-fork-FH5KBVWP.js.map} +0 -0
  245. /package/dist/{workflow-promotion-NWIZNAR4.js.map → workflow-promotion-RRI53FB6.js.map} +0 -0
  246. /package/dist/{workflow-proposals-XMAZJT3X.js.map → workflow-proposals-5XGCOTEU.js.map} +0 -0
  247. /package/dist/{workflow-revisions-4EQMLZGY.js.map → workflow-revisions-M6WPGXAT.js.map} +0 -0
  248. /package/dist/{workflow-status-AZMXQZLC.js.map → workflow-status-I5BSSWHY.js.map} +0 -0
@@ -3,16 +3,16 @@ import {
3
3
  apiRequest,
4
4
  getPositionalArgs,
5
5
  readStdin
6
- } from "./chunk-72Y65NWI.js";
6
+ } from "./chunk-WY4R4IL5.js";
7
7
  import {
8
8
  GLOBAL_VALUE_FLAGS,
9
9
  getArgValue,
10
10
  hasFlag,
11
11
  resolveConfig
12
- } from "./chunk-IIDQM4MY.js";
12
+ } from "./chunk-BMFD4OPC.js";
13
13
  import {
14
14
  writeRawOutput
15
- } from "./chunk-T6ZNIMI4.js";
15
+ } from "./chunk-LRIP5IQD.js";
16
16
 
17
17
  // src/utilities.ts
18
18
  import fs from "fs/promises";
@@ -499,4 +499,4 @@ export {
499
499
  parseDurationSeconds,
500
500
  runUtilities
501
501
  };
502
- //# sourceMappingURL=chunk-T5MU76RA.js.map
502
+ //# sourceMappingURL=chunk-C77XIO2W.js.map
@@ -9,7 +9,7 @@ import {
9
9
  PRODUCT_MAP_STATUSES,
10
10
  WORKFLOW_FLOW_TYPES,
11
11
  WORKFLOW_MANAGEMENT_STATUSES
12
- } from "./chunk-EYHJ5FIA.js";
12
+ } from "./chunk-C6SNLHVE.js";
13
13
 
14
14
  // ../mcp-tools/src/issue-evidence.ts
15
15
  var MEDIA_FIELDS = {
@@ -5508,4 +5508,4 @@ export {
5508
5508
  resolveTeamsChannelRefs,
5509
5509
  sharedGroups
5510
5510
  };
5511
- //# sourceMappingURL=chunk-FBEQNW2P.js.map
5511
+ //# sourceMappingURL=chunk-DFN2NH37.js.map
@@ -9,7 +9,7 @@ import {
9
9
  slugifySeedName,
10
10
  validateMacroReferences,
11
11
  validateWorkflowInputExpressions
12
- } from "./chunk-EYHJ5FIA.js";
12
+ } from "./chunk-C6SNLHVE.js";
13
13
 
14
14
  // ../canary-spec/src/parse.ts
15
15
  import yaml2 from "yaml";
@@ -3256,4 +3256,4 @@ export {
3256
3256
  writeWorkflowId,
3257
3257
  writeNodeIds
3258
3258
  };
3259
- //# sourceMappingURL=chunk-4SQKKD3R.js.map
3259
+ //# sourceMappingURL=chunk-EDX47DXT.js.map
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __cr } from "module"; import { fileURLToPath as __fup } from "url"; import { dirname as __dn } from "path"; const require = __cr(import.meta.url); const __filename = __fup(import.meta.url); const __dirname = __dn(__filename);
2
2
  import {
3
3
  command
4
- } from "./chunk-T6ZNIMI4.js";
4
+ } from "./chunk-LRIP5IQD.js";
5
5
 
6
6
  // src/teardown-summary.ts
7
7
  var ICONS = {
@@ -35,4 +35,4 @@ function formatTeardownLines(teardowns) {
35
35
  export {
36
36
  formatTeardownLines
37
37
  };
38
- //# sourceMappingURL=chunk-BSCEOIYX.js.map
38
+ //# sourceMappingURL=chunk-FQ6P522C.js.map
@@ -2,10 +2,10 @@ import { createRequire as __cr } from "module"; import { fileURLToPath as __fup
2
2
  import {
3
3
  resolveIsSuperadmin,
4
4
  showGlobalHelp
5
- } from "./chunk-DTB5HUD2.js";
5
+ } from "./chunk-SPTLZJOF.js";
6
6
  import {
7
7
  apiRequest
8
- } from "./chunk-72Y65NWI.js";
8
+ } from "./chunk-WY4R4IL5.js";
9
9
  import {
10
10
  getSubDir
11
11
  } from "./chunk-S3Q7MDCS.js";
@@ -14,10 +14,10 @@ import {
14
14
  getArgValue,
15
15
  hasFlag,
16
16
  resolveConfig
17
- } from "./chunk-IIDQM4MY.js";
17
+ } from "./chunk-BMFD4OPC.js";
18
18
  import {
19
19
  writeRawOutput
20
- } from "./chunk-T6ZNIMI4.js";
20
+ } from "./chunk-LRIP5IQD.js";
21
21
 
22
22
  // src/landing.ts
23
23
  import { readFile, writeFile, mkdir } from "fs/promises";
@@ -623,4 +623,4 @@ export {
623
623
  buildLandingUrl,
624
624
  runLanding
625
625
  };
626
- //# sourceMappingURL=chunk-6IMNRYC3.js.map
626
+ //# sourceMappingURL=chunk-GQSW6ZY3.js.map
@@ -1,16 +1,16 @@
1
1
  import { createRequire as __cr } from "module"; import { fileURLToPath as __fup } from "url"; import { dirname as __dn } from "path"; const require = __cr(import.meta.url); const __filename = __fup(import.meta.url); const __dirname = __dn(__filename);
2
2
  import {
3
3
  apiRequest
4
- } from "./chunk-72Y65NWI.js";
4
+ } from "./chunk-WY4R4IL5.js";
5
5
  import {
6
6
  getArgValue,
7
7
  hasFlag,
8
8
  resolveConfig
9
- } from "./chunk-IIDQM4MY.js";
9
+ } from "./chunk-BMFD4OPC.js";
10
10
  import {
11
11
  writeRawOutput,
12
12
  writeUntrustedText
13
- } from "./chunk-T6ZNIMI4.js";
13
+ } from "./chunk-LRIP5IQD.js";
14
14
 
15
15
  // src/triage.ts
16
16
  import process from "process";
@@ -274,4 +274,4 @@ export {
274
274
  printTriageSummary,
275
275
  runTriage
276
276
  };
277
- //# sourceMappingURL=chunk-4GDEKB5S.js.map
277
+ //# sourceMappingURL=chunk-GVNSCSIC.js.map
@@ -3,21 +3,21 @@ import {
3
3
  captureSubstrateV2,
4
4
  parseRunCodeStrict,
5
5
  parseSnapshot
6
- } from "./chunk-CZOYFKTY.js";
6
+ } from "./chunk-IVJU3LP6.js";
7
7
  import {
8
8
  consoleLogger
9
9
  } from "./chunk-5QHORHJT.js";
10
10
  import {
11
11
  reconstructSnapshots,
12
12
  toMutationIndex
13
- } from "./chunk-LP4X7TWI.js";
13
+ } from "./chunk-56WV7CFM.js";
14
14
  import {
15
15
  MACRO_PATTERN,
16
16
  cacheActionContractIssues,
17
17
  isVolatileIdentifier,
18
18
  stableAttrSelector,
19
19
  stableIdentifierPrefix
20
- } from "./chunk-EYHJ5FIA.js";
20
+ } from "./chunk-C6SNLHVE.js";
21
21
 
22
22
  // ../workflow-cache/src/logger.ts
23
23
  var activeLogger = consoleLogger;
@@ -9779,4 +9779,4 @@ export {
9779
9779
  judgeNodeReplayProof,
9780
9780
  judgeCacheOnlyRunClean
9781
9781
  };
9782
- //# sourceMappingURL=chunk-W4P6BGJ7.js.map
9782
+ //# sourceMappingURL=chunk-IN3AF6LI.js.map
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-5QHORHJT.js";
11
11
  import {
12
12
  redactTraceArchive
13
- } from "./chunk-LP4X7TWI.js";
13
+ } from "./chunk-56WV7CFM.js";
14
14
  import {
15
15
  BROWSER_VIEWPORT_PRESETS,
16
16
  DEFAULT_BROWSER_ENGINE,
@@ -20,7 +20,7 @@ import {
20
20
  isVolatileIdentifier,
21
21
  redactSecretsWithCount,
22
22
  sensitiveNeedles
23
- } from "./chunk-EYHJ5FIA.js";
23
+ } from "./chunk-C6SNLHVE.js";
24
24
  import {
25
25
  __commonJS,
26
26
  __esm,
@@ -310834,4 +310834,4 @@ playwright-extra/dist/index.esm.js:
310834
310834
  * @license MIT
310835
310835
  *)
310836
310836
  */
310837
- //# sourceMappingURL=chunk-CZOYFKTY.js.map
310837
+ //# sourceMappingURL=chunk-IVJU3LP6.js.map
@@ -1,17 +1,17 @@
1
1
  import { createRequire as __cr } from "module"; import { fileURLToPath as __fup } from "url"; import { dirname as __dn } from "path"; const require = __cr(import.meta.url); const __filename = __fup(import.meta.url); const __dirname = __dn(__filename);
2
2
  import {
3
3
  formatSemanticSnapshot
4
- } from "./chunk-CZOYFKTY.js";
4
+ } from "./chunk-IVJU3LP6.js";
5
5
  import {
6
6
  getPositionalArgs
7
- } from "./chunk-72Y65NWI.js";
7
+ } from "./chunk-WY4R4IL5.js";
8
8
  import {
9
9
  GLOBAL_VALUE_FLAGS,
10
10
  getArgValue
11
- } from "./chunk-IIDQM4MY.js";
11
+ } from "./chunk-BMFD4OPC.js";
12
12
  import {
13
13
  writeRawOutput
14
- } from "./chunk-T6ZNIMI4.js";
14
+ } from "./chunk-LRIP5IQD.js";
15
15
 
16
16
  // src/trace.ts
17
17
  import fs from "fs";
@@ -62,7 +62,7 @@ async function runTraceSnapshot(argv) {
62
62
  process.exit(1);
63
63
  }
64
64
  const filter = filterArg;
65
- const { reconstructSnapshots, parseTraceArchive, downloadTrace, cleanupTrace } = await import("./src-DJETLMXP.js");
65
+ const { reconstructSnapshots, parseTraceArchive, downloadTrace, cleanupTrace } = await import("./src-BCJZMHSQ.js");
66
66
  let localPath = tracePath;
67
67
  let isTemp = false;
68
68
  if (tracePath.startsWith("http://") || tracePath.startsWith("https://")) {
@@ -183,4 +183,4 @@ function slugify(text) {
183
183
  export {
184
184
  runTrace
185
185
  };
186
- //# sourceMappingURL=chunk-H2K3ABPO.js.map
186
+ //# sourceMappingURL=chunk-K54XL64A.js.map
@@ -1613,7 +1613,7 @@ var SANDBOX_GUIDE_SECTIONS = [
1613
1613
  ];
1614
1614
 
1615
1615
  // ../content/src/external-run-guide/overview.txt
1616
- var overview_default = "External-run diagnosis is a customer-accessible workflow. It requires a normal\nCofactor login with external-run read access; it does not require psql, Sentry,\nAWS, Redis, or superadmin commands.\n\nStart with:\n\n cofactor external-run get <run-id>\n cofactor external-run failures <run-id> [--area <label|index>]\n cofactor external-run triage <run-id> [--area <label|index>]\n cofactor external-run skips <run-id>\n cofactor external-run debug overview <run-id>\n\nUse the result rows to answer what the test framework observed. Use lifecycle\ntelemetry to answer whether the harness timed out, retried, or recovered. Use\nartifacts and a focused rerun to distinguish an application bug from a test or\nharness issue.\n\nCofactor's own AI findings are readable too: `triage` groups a run's failures\ninto ranked findings, and `diagnosis --item` shows one test's root-cause\ndiagnosis (see the `ai-findings` section). Treat both as leads to verify\nagainst the evidence, not as conclusions. A developer or local coding agent can\ninspect the materialized workspace alongside the customer's test source and\napplication source.\n";
1616
+ var overview_default = "External-run diagnosis is a customer-accessible workflow. It requires a normal\nCofactor login with external-run read access; it does not require psql, Sentry,\nAWS, Redis, or superadmin commands.\n\nStart with:\n\n cofactor external-run comments <run-id> --item <item-id>\n cofactor external-run comment <run-id> --item <item-id> --body \"Setup failed\" --org Acme\n cofactor external-run comments --test <test-id> --json\n cofactor external-run comment --test <test-id> --body \"Waiting for a fix\" --org Acme\n cofactor external-run get <run-id>\n cofactor external-run failures <run-id> [--area <label|index>]\n cofactor external-run triage <run-id> [--area <label|index>]\n cofactor external-run skips <run-id>\n cofactor external-run debug overview <run-id>\n\nUse the result rows to answer what the test framework observed. Use lifecycle\ntelemetry to answer whether the harness timed out, retried, or recovered. Use\nartifacts and a focused rerun to distinguish an application bug from a test or\nharness issue.\n\nCofactor's own AI findings are readable too: `triage` groups a run's failures\ninto ranked findings, and `diagnosis --item` shows one test's root-cause\ndiagnosis (see the `ai-findings` section). Treat both as leads to verify\nagainst the evidence, not as conclusions. A developer or local coding agent can\ninspect the materialized workspace alongside the customer's test source and\napplication source.\n\nExternal test comments follow the test across runs, newest first, with author and time.\nA run-item comment defaults to that result and includes its run link; pass `--about test`\nto leave a general note. Bodies accept text or @file (1\u201320000 characters).\nRead comments with external-test-comment:read; add them with external-test-comment:create.\nItem targets additionally need external-test-run:read to resolve the durable test.\nLists accept --page (1\u201310000) and --page-size (1\u2013200, default 25); --json includes pagination.\nOut-of-range paging values are rejected. --about accepts test or run only when\nadding a comment addressed by a run item. A denied item lookup explains that\nexternal-test-run:read is needed; use --test to address the thread directly instead.\nThe only comment route is /external-tests/tests/:testId/comments; item detail exposes\nexternalTestId for resolving the thread. POST accepts { body, runItemId? }; omitting\nrunItemId leaves a general note. GET returns { ok, data: comments, pagination };\nComments contain { id, runItemId, authorId, authorName, body, createdAt, run };\nrun is null or { runId, createdAt }. Clients use runItemId to build the result link.\n";
1617
1617
 
1618
1618
  // ../content/src/external-run-guide/materialize.txt
1619
1619
  var materialize_default = "Create a bounded local workspace:\n\n cofactor external-run debug materialize <run-id>\n\nThe default downloads run logs plus first-failure screenshots and DOM evidence\nfor failed/flaky scenarios. Video is excluded by default because it is large:\n\n --include-video\n --artifacts none|failures|all\n --out <directory>\n\nThe output directory must be new or empty; the command refuses to overwrite an\nexisting workspace.\n\nNarrow the workspace when one scenario or one area is under investigation:\n\n cofactor external-run debug materialize <run-id> --item <item-id-or-text>\n cofactor external-run debug materialize <run-id> --area <label|index>\n\nEvery selected scenario with a Playwright trace gets a full diagnostic\nworkspace under traces/<scenario>/: timeline/test-steps.jsonl (the test's step\ntree with times, source locations and the failing step's error),\nbrowser/actions.jsonl with a DOM, screenshot and accessibility snapshot after\neach call, browser/error-context.md (Playwright's page snapshot at the failure),\nlogs/test-output.jsonl (stdout/stderr), source/, and the raw browser/trace.zip.\n\nFor one test's trace alone:\n\n cofactor external-run trace <run-id> --item <item-id-or-text> [--out <dir>]\n\nOnly retried attempts are traced unless the suite records every attempt, so a\ntest that failed without retrying has no trace; work from its error, steps,\nlogs and video.\n\nThe workspace contains summary.md, manifest.json, JSONL result rows, folded\nscenarios, skip explanations, lifecycle telemetry, scenario histories,\ndiagnostics, and an artifact manifest. Downloads are best-effort: a retained row\nwhose artifact has expired is recorded as unavailable instead of aborting the\nwhole materialization.\n\nA scenario whose test reported its own stdout, stderr, or a text attachment\n(tags and source location included) gets output/<scenario>.txt \u2014 Playwright's\nprimary-source capture of what the test itself printed, distinct from the\ncontainer's run.log under logs/.\n";
@@ -1917,7 +1917,7 @@ var PERF_GUIDE_SECTIONS = [
1917
1917
  ];
1918
1918
 
1919
1919
  // ../content/src/eval-guide/overview.txt
1920
- var overview_default6 = 'Use an eval to measure an AI agent your product ships: run its command against a\nset of cases at a commit, grade every attempt, and get a pass rate, cost and\ntime per task. Run, grade and compare models with the CLI; no GitHub setup is\nneeded beyond the commit you evaluate. Pass `--org <org>` on every write.\n\nWHEN TO WRITE AN EVAL\n\n- An agent\'s behavior is the thing that can regress: a prompt, a tool set, a\n model change, a retrieval change.\n- A workflow test cannot decide it, because the output is free text or a\n judgment (a diagnosis, a summary, a support reply), not a click path.\n- You can name real cases and what a good answer looks like. Without cases,\n write a workflow test (`cofactor workflow guide write-a-test`) instead.\n- Do not eval deterministic code; unit-test it.\n\nSTART\n\n cofactor eval init <name> --application <app> --capability CAP-XXX-001\n\nThis writes evals/<name>.eval.yaml, evals/<name>.runbook.md and\nevals/.gitignore, and refuses to overwrite. Edit them, commit them with the\nagent code, then push:\n\n cofactor eval push evals/<name>.eval.yaml --application <app> --org <org>\n\nPush validates the template locally, stores it with its runbook and is\nidempotent. `cofactor eval show <name>` reads it back.\n\nTHE TEMPLATE\n\n version: 1\n name: diag-smoke # 2 to 40 lowercase letters, digits, dashes\n description: One sentence on what the agent must get right.\n proves:\n capabilities: [CAP-XXX-001] # product-map codes in the pushed application\n runbook: diag-smoke.runbook.md # path relative to the YAML\n mode: single-turn # or multi-turn (needs simulator)\n run: ./scripts/run-agent.sh # shell command at the repo root of the commit\n input:\n description: What the files in a case\'s input directory contain.\n require: [input.json] # every case bundle must contain these paths\n agent:\n models:\n sonnet: { provider: anthropic, model: claude-sonnet-4-6 }\n default: sonnet # aliases are what --model takes\n providers: # optional: only when the agent reads non-standard\n azure: # names (see CONFIGURE THE AGENT\'S MODEL below)\n env: { apiKey: LLM_API_KEY, baseUrl: LLM_BASE_URL, model: LLM_MODEL }\n graders: # at least one\n - { id: answer-matches, kind: script, command: ./scripts/grade.sh }\n - id: quality\n kind: ai-judge\n rubric: "At least 20 characters: what each score means."\n scale: 1-5 # or binary\n passAt: 4 # required for 1-5, 2 to 5\n judge: { provider: anthropic, model: claude-opus-4-8 }\n repeats: 1 # attempts per case, 1 to 7 (default 1; for a stochastic agent raise it with passAtLeast)\n passAtLeast: 1 # a case passes when this many attempts pass (default 1, at most repeats)\n passBar: 0.5 # share of cases that must pass, 0.1 to 1\n attemptSeconds: 600 # per attempt, 30 to 1700\n\nUnknown fields are rejected. Set passBar from a measured baseline and treat it\nas a regression ratchet, not an aspiration.\n\nTHE STANDARD ENVIRONMENT\n\nEvery attempt runs `run` in the repository root of the evaluated commit, in an\nisolated sandbox, with:\n\n EVAL_INPUT the case\'s input directory (read only what you need)\n EVAL_OUTPUT the directory to write the answer to\n EVAL_MODEL the model id for this run\n EVAL_PROVIDER anthropic or azure\n EVAL_CASE the case key\n EVAL_ATTEMPT the attempt index\n EVAL_RUN_ID the run id\n EVAL_ATTEMPT_SECONDS the time limit\n EVAL_TRACE_CAPTURE full (default) or metadata\n EVAL_NODE the runner\'s trusted Node binary\n\nplus, for the selected model\'s provider only, a key, a base URL that routes\nmodel calls through Cofactor (which meters cost and latency) and the model id.\nBy default they use the standard names:\n\n anthropic: ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN, ANTHROPIC_BASE_URL,\n ANTHROPIC_MODEL\n azure: OPENAI_API_KEY, AZURE_OPENAI_API_KEY, OPENAI_BASE_URL,\n AZURE_OPENAI_BASE_URL, OPENAI_MODEL\n\nThe key holds a short-lived token for that proxy, never a real provider key.\nThe base URL speaks the provider\'s own wire: the Anthropic Messages API for\nanthropic, the OpenAI v1 API (chat completions and responses) for azure.\nEvery other provider-key secret your sandbox declares (the other provider\'s,\nGemini\'s and Google\'s, and with an agent.providers entry also the selected\nprovider\'s standard names) arrives empty (set, not absent), so a call to a\nprovider you did not select fails. Plain `env:` values in your sandbox\ndefinition (not secrets) reach the attempt unchanged. Do not\nhard-code a key, a URL or a model id; read them from the environment. The case\'s\nexpected value is withheld from the agent and only reaches the graders.\n\nCONFIGURE THE AGENT\'S MODEL\n\nMost agents need nothing here. Add an `agent.providers` entry only for a\nprovider whose agent reads names other than the standard ones (an entry for a\nprovider no model uses is an error). An entry replaces all of that provider\'s\nstandard names: the attempt then sets exactly these three, and nothing else.\n\n agent:\n providers:\n azure:\n env:\n apiKey: LLM_API_KEY # gets the proxy token\n baseUrl: LLM_BASE_URL # gets the proxy URL\n model: LLM_MODEL # gets the model id\n\nNames are upper case, distinct, and never EVAL_*. A mapped key name that your\nsandbox also declares as a secret is replaced for the whole attempt (with the\ntoken, or emptied when another provider runs), so never map onto a secret the\napplication itself needs. Fill the entry from the\nagent\'s own config code, not by guessing: find where it builds its model client\nand copy the names it reads. For example, if the agent has\n\n createAzure({\n apiKey: process.env.LLM_API_KEY,\n baseURL: process.env.LLM_BASE_URL,\n })\n const model = process.env.LLM_MODEL\n\nthen the entry above is right. Map baseUrl to the name the client really reads:\na client that ignores it calls the vendor directly with the proxy token, and\nthe call fails. If the client takes no base URL setting, add one first.\n\nWRITE THE ENTRYPOINT\n\nRead the case from `$EVAL_INPUT`, call the agent exactly as production does,\nand write the final answer to `$EVAL_OUTPUT/answer.<ext>` (answer.json for\nstructured output, answer.txt for prose). The first `answer.*` file in sorted\norder is graded (so write exactly one), up to 256 KiB. No answer file is a\nfailed attempt. Anything the script prints goes to stdout.log in the output\ndirectory, which helps when debugging; do not print secrets or dump the\nenvironment.\n\n #!/usr/bin/env bash\n set -euo pipefail\n bun run scripts/my-agent.ts \\\n --input "$EVAL_INPUT/input.json" --out "$EVAL_OUTPUT/answer.json"\n\nRun the real code path, not a mock of it. Exit non-zero when the agent breaks\n(it is recorded for debugging; the answer file decides the grade).\n\nCHOOSE GRADERS\n\nScript first. Use a judge only for what code cannot decide. A case passes an\nattempt only when every grader passes.\n\n- Script grader: runs after the agent exits, with EVAL_INPUT, EVAL_OUTPUT and\n EVAL_EXPECTED (the case\'s expected value as a JSON file), in the repo root,\n with a fixed 120 second limit. Its last stdout line must be\n {"pass": true, "score": 1, "reason": "why"}. Anything else is a grader\n error, which is reported as an error, never as a pass or a fail. Use scripts\n for categories, ids, exact fields, schema checks and state.\n- ai-judge grader: scores a rubric against the answer and the expected value.\n Use binary for a fact ("names the same cause: yes or no") and 1 to 5 for a\n quality (completeness, tone), with the meaning of each score in the rubric\n and `passAt` set. Always pin the judge model; never leave it to a default.\n Judge the content, not the wording.\n\nBUILD CASES\n\nEach case is an input directory, an expected JSON value, and a provenance.\n\n cofactor eval add-case <name> --key <k> --input <dir|file.tar.gz> \\\n --expected <file|-> --source "<provenance>" [--title <t>] --org <org>\n\n- Read the runbook first: `cofactor eval runbook <name>` works with no checkout.\n- One idea per case. A case that tests three things hides which one broke.\n- Prefer real inputs. Sanitize them before upload: no customer names, domains,\n people, tokens or ids. Use neutral names (Acme, example.com). Customer data\n stays in the database, never in a case.\n- Label from something other than the agent\'s own output (a human decision, a\n fix that landed, a recorded outcome). Say what corroborates it in `--source`.\n- When no real case exists, mutate a frozen real input and mark it synthetic in\n `--source`.\n- Add every failing case you find, as you find it. The set should grow from\n real misses.\n- `--input` takes a directory (tarred deterministically) or a .tar.gz; the\n template\'s `input.require` paths are checked first. `--expected -` reads\n stdin. A bundle already stored is deduplicated.\n- `cofactor eval cases <name>` lists them; `cofactor eval rm-case <name> <key>`\n removes one no run has used.\n[cli >= 0.56.0]\n- A wrong label or input is corrected with a new version, not by deleting the\n case: `cofactor eval add-case <name> --key <k> --input <dir|file.tar.gz> \\\n --expected <file|-> --source "<provenance>" --replace --reason "<why>" --org <org>`\n stores version N+1 with who, when and the reason. Without `--replace` an\n existing key is still an error. Runs that already used the case keep the\n version they graded and show it as `key (vN)`; new runs use the latest.\n `cofactor eval compare` refuses runs that graded different case versions, so\n re-run the baseline after a correction.\n- `cofactor eval case <name> <key> [--version N]` prints a case\'s expected\n label, provenance and version history (newest first).\n[/cli]\n\nCASE FIDELITY AND EVIDENCE MAP (REQUIRED)\n\nThe label is verified truth: what actually happened, established with certainty\nfrom any reliable source, including a fixing diff, tested source or later\ninvestigation. Production\'s answer is not an oracle. If you cannot establish\ntruth with certainty, the case is not ready: report it and keep collecting.\n\nBefore collecting, write the correct answer and the facts that establish it.\nTrace the original agent\'s tool calls, and the tools a successful agent would\nneed. Inventory the full retained environment: this trace, earlier runs and\ncomparisons, history up to the failure, source at the tested commit, config,\nlogs and media. Package it at full fidelity with time provenance. Hindsight is\nexcluded by time, not by deleting categories. Later fixes and investigations\nmay corroborate the label but never enter the agent\'s input.\n\nMissing evidence stays missing; label what a good agent should conclude given\nit. Never recreate missing DOM, logs or state and present them as historical\nevidence. Record the absence and the specific check that would decide it.\n\nKeep an evidence-map in case metadata, alongside the withheld expected value:\n\n "evidence-map": {\n "certainty": "Truth verified by fixing diff #123 and source at the tested commit.",\n "facts": [\n {"status":"proven", "fact":"The request failed", "path":"logs/network.jsonl",\n "proof":"The request returned the recorded error before the cutoff."},\n {"status":"absent", "fact":"The exact rendered state", "missing":"No DOM retained",\n "expectedConclusion":"Name the missing DOM and the check it would settle."}\n ]\n }\n\nEvery label fact must be proven by a bundled path or explicitly absent with\nwhat a good agent should say. The certainty note can cite later investigation;\nthe map and expected answer stay outside the agent input. Self-check every\npath and explanation, and verify that no retained artifact is newer than the\nfailure cutoff. Do not use filesystem download times as evidence timestamps.\n\nGive full credit for reaching verified truth, or for identifying the specific\nmissing evidence that would decide it without asserting a contradictory cause.\nRequire the correct category where retained evidence supports it. Configure\nthat distinction in your grader; a vague request for more logs earns no gap\ncredit. `eval push` warns for stored cases without an evidence-map.\n\nMULTI-TURN\n\nSet `mode: multi-turn` and add `simulator: { provider, model }` (pinned). `run`\nis then the agent process, not a one-shot command. It speaks JSONL on stdin and\nstdout: read one line per user message, answer with one line.\n\n stdin {"user": "message"}\n stdout {"reply": "answer"}\n either side may end it with {"done": true}\n\nNo answer file is needed in multi-turn mode; the graded input is the\nconversation. stdout belongs to the protocol, so any other line you print on\nstdout (a debug message, a log) is a protocol error that errors the attempt;\nlog to stderr. An agent that exits before replying, or writes an over-long line,\nis also a protocol error. As in single-turn mode, a multi-turn attempt that runs\nout of time is not an error: it is graded on the turns completed so far, and\ncounts as a fail if none completed. Multi-turn output also lands in\nstdout.log. A protocol error is not retried.\n\nEach case needs a conversation: `--conversation <file.json>`, either\n`{"kind":"scripted","turns":["first message", "second message"]}` or\n`{"kind":"simulated","persona":"\u2026","goal":"\u2026","facts":["\u2026"],"stopWhen":"\u2026",\n"maxTurns":8}`. A simulated user is another model playing the persona, and the\ngoal and facts never reach the agent. Prefer a script grader that inspects the\nresulting state; use a judge over the transcript for process rules. Read a\ntranscript with `cofactor eval get <run-id> --case <key> --transcript`.\n\nRUN\n\n cofactor eval run <name> [--model <alias>]... [--environment <env>]\n [--at <sha>] [--case <key>]... [--repeats N]\n [--parallel N] [--no-wait] --org <org>\n\nOne run per `--model` (none means the default). Attempts run `--parallel` at a\ntime; raise it before cutting cases when a large set times out. Cost and time\ngrow with cases x repeats x models. It waits, then prints a\nsection per model and a comparison grid. `--at <sha>` evaluates a commit; push\nthe commit first. `--case` (a subset of cases) and a `--repeats` that differs\nfrom the template make a partial run, useful for iterating, which never counts\nas coverage or proof. Ids are\nprinted to stderr first; `--no-wait` prints them and exits 0.\n\nEXIT CODES (run)\n\n 0 every run\'s verdict is pass\n 3 at least one run\'s verdict is fail (the agent missed the pass bar)\n 1 a failed or cancelled run, a polling timeout, or any error\nExit 1 wins over 3: if any run failed or was cancelled, the code is 1 even when\nanother run\'s verdict is fail. A polling timeout leaves the runs going; read\nthem later with `cofactor eval get`. All other sub-commands exit 0 on success\nand 1 on error. Gate on 0.\n\nREAD RESULTS\n\n cofactor eval get <run-id> summary, cases, grader reasons\n cofactor eval get <run-id> --case <key> one case, every attempt\n cofactor eval get <run-id> --case <key> --trace\n model/tool timeline, errors and body links\n cofactor eval runs <name> [--limit N] recent runs\n cofactor eval list evals and their latest verdicts\n\nModel request and response bodies are captured by default for new runs. Add\n`traces: { capture: metadata }` to a template to retain usage and capture state\nwithout storing bodies. `--trace` reads one case\'s trace a page at a time;\nlarge body content may be marked omitted while its individual body link remains\navailable. It also shows partial/capture errors and non-success model HTTP\nstatuses. `--json` returns the structured timeline and body references.\n\nA case passes when `passAtLeast` of its `repeats` attempts pass; the eval\npasses when the share of passing cases reaches `passBar`. With the defaults (one\nrepeat, one to pass) a case passes when its single attempt passes. Read the grader\n`reason` before changing anything.\n\nA single-turn attempt is graded on its answer file. The agent command\'s exit code\nand a timeout are recorded but do not by themselves fail the attempt: a crash\nor a timeout that left no `answer.*` is a counted fail ("no answer written"),\nand one that left a good answer can still pass. An attempt is errored, not\nfailed, when a grader failed (a script grader printed no parsable last line or\nran past its limit, since its own exit code is ignored and only its last line\ncounts; or an ai-judge call failed), the answer file is over 256 KiB, a\nmulti-turn protocol error occurred, or the sandbox failed (infrastructure\nfailures are retried once). One errored attempt makes the whole run `failed`\nwith no verdict, however many cases passed, and `run` exits 1, not 3. Fix the\ngrader, answer size or infrastructure problem and run again; the error text\nnames the case and attempt. The summary counts errored attempts as\n`infraFailures`.\n\nCOMPARE MODELS\n\n cofactor eval run <name> --model sonnet --model haiku --org <org>\n cofactor eval compare <run-id> <run-id>\n cofactor eval compare --batch <id>\n\nOne grid, one row per case, one column per model, with pass rate, cost per task\nand time per task. Compare on the same commit and the same cases; the output\nshows the commit and a digest of the case set. Only a full run of the\ntemplate\'s default model alias counts as coverage; runs of other aliases are\nfor comparing.\n\nLINK WHAT IT PROVES\n\n- Capabilities: `proves.capabilities` in the template links them when you push.\n Add or remove links later with\n `cofactor product-map capability link-eval <CODE|id> --eval <name> --application <app> --org <org>`\n (and `unlink-eval`), but `eval push` makes `proves.capabilities` the source\n of truth: the next push unlinks any capability not listed there. Edit the\n template, not the link.\n- Rules: `cofactor product-map rule link-eval <prule_\u2026> --eval <name> --org <org>`\n ties an eval to a rule in a capability (and `unlink-eval`). The rule must be\n active, its capability must sit in an area, and that capability and area must\n belong to the eval\'s application. Pushing does not touch rule links.\n- An agent as a product-map area, for what an agent can do and evals prove:\n `cofactor product-map area create <title> --kind agent --application <app> --org <org>`.\n- A pull request: attach a full run at the PR head commit with\n `cofactor proofs attach --pr <n> --application <app> --criterion <n> --eval-run <aerun_\u2026> --asserted "Asserted that \u2026" --org <org>`.\n The run must be completed, at the commit you pushed, full (not partial) and\n passing its pass bar. The default-alias rule above is about product-map\n coverage only; it does not apply to attachment: no model is privileged, and a\n full passing run of any model alias proves the criterion (each item shows its\n model). Attach as many runs as you have; every one must pass. Read\n `cofactor proofs guide` for the whole procedure.\n\nTHE HILL-CLIMB LOOP\n\nThe hill-climb loop uses `--json` to climb on measured cases, not on feel.\n\n1. Run the eval at the current commit and note the pass rate.\n cofactor eval run <name> --json --org <org> > run.json\n2. List the failing cases (run --json is an array, one entry per --model;\n .[0] is the first model. A run whose status is failed has a null verdict:\n read .[0].error, and the attempts in .[0].cases[].attempts[] whose status is\n error. A run that never produced a result prints only id, status, verdict and\n error, with no `cases`):\n jq \'[.[0].cases[] | select(.passed|not) | .key]\' run.json\n For a run id, `cofactor eval get <run-id> --json` returns the result\n directly: jq \'[.cases[] | select(.passed|not) | .key]\'\n3. Read one case: `cofactor eval get <run-id> --case <key>`.\n4. Make one change to the agent that explains the failures, commit and push it.\n5. Iterate on the failing cases only (`--case <key>`), then run the full set at\n the new head. Keep the change only if the full pass rate goes up and cost or\n time did not regress. When it does not, revert and try another idea.\n\nNever tune `passBar`, a rubric or a grader to turn a failing run green; fix the\nagent, or fix a wrong label and say why in the commit. Never trust a pass\nfrom a partial run. Add a case for each new failure you meet.\n\nTHE RUNBOOK FORMAT\n\nEvery eval has a runbook at evals/<name>.runbook.md, stored with the eval and\nprinted by `cofactor eval runbook <name>`. Its headings are fixed so an agent\ncan rely on them. `cofactor eval init` writes all of them, each starting with a\n`<!-- cofactor:todo -->` line and a hint:\n\n # <eval name> runbook\n ## What this eval proves the agent\'s job in one paragraph and the capabilities it backs\n ## Anatomy of a case the files in $EVAL_INPUT, what expected holds, what a good case teaches\n ## Finding real data where in prod the inputs live: exact cofactor commands, ids, how to pick varied cases\n ## Labeling how expected is decided and what must corroborate it; never the agent\'s own output alone\n ## Evidence map verified certainty; each label fact proven by a path or explicitly absent\n ## Sanitizing what to strip or replace before upload; the check to run; neutral names to use\n ## Synthesizing scenarios how to make a case when no real one exists, and how to mark it synthetic in --source\n ## Adding the case the exact eval add-case command shape for this eval\n ## Known traps what has gone wrong before\n\nWrite each section, then delete its marker line. `eval push` refuses a runbook\nwhere any section still has the marker, warns when a heading is missing, and\nerrors when "Finding real data" or "Sanitizing" is empty. Keep the runbook true:\nadd a trap when a case goes wrong.\n\nSCOPES AND ACCESS\n\nThe sandbox-v2 organization flag must be on. API keys need explicit scopes:\n\n run: sandbox:create and sandbox:exec, named\n explicitly (sandbox:* does not grant exec)\n push, add-case, rm-case: sandbox:edit\n show, list, cases, runbook, get,\n runs, compare: sandbox:read\n\n`cofactor eval --help` lists every flag. `cofactor eval guide` needs no login.\n\n\nTOOL EXECUTION AND EXTRA TRACES\n\nFull capture also keeps separate stdout/stderr prefixes (1 MiB each), the actual\nlast 16 KiB of combined output, and regular files under $EVAL_OUTPUT/traces/.\nWrite additional execution details there, for example:\n\n mkdir -p "$EVAL_OUTPUT/traces"\n printf \'%s\\n\' \'{"event":"tool_started","tool":"read_file"}\' >> "$EVAL_OUTPUT/traces/tools.jsonl"\n\nFiles are capped at 1 MiB each. Symlinks, hard links and non-regular files are\nrejected. One collection visits at most 128 entries; an execution accepts at\nmost 512 evidence artifacts plus a single count-limit marker. All artifacts\nshare the 64 MiB raw budget with model bodies. Truncation, interrupted streams,\nrejected files and storage failures remain visible; capture never turns a\npassing grade into a failure.\n\nAgents already configured for OpenTelemetry OTLP/HTTP tracing can use the\ninjected environment without adding export code:\n\n OTEL_EXPORTER_OTLP_ENDPOINT storage-only receiver base\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT exact /otlp/v1/traces endpoint\n OTEL_EXPORTER_OTLP_PROTOCOL http/protobuf\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL http/protobuf\n OTEL_EXPORTER_OTLP_HEADERS scoped Authorization header\n OTEL_EXPORTER_OTLP_TRACES_HEADERS same scoped header\n\nThe receiver accepts OTLP JSON or protobuf, with optional gzip; each batch is\nlimited to 1 MiB compressed and 1 MiB raw, and intake is capped at 120 requests\nper minute. Tokens bind the org, attempt and execution generation. Capture\ncloses when the agent exits, so flush the agent\'s OTel provider before exiting.\nA hard-killed exporter can lose unflushed spans. No data is forwarded to a\nvendor, collector or monitoring service.\n\nIn metadata mode no endpoint or token is injected, process log bodies/tails\nand trace files are not retained, and OTLP payloads are rejected before parsing.\nOnly aggregate authenticated OTLP receipt counts are stored.\n\nREAD THE EVIDENCE\n\n cofactor eval get <run-id> --case <key> --trace\n cofactor eval get <run-id> --case <key> --trace --json\n\nThe output includes the model/tool timeline, failed tools, stdout/stderr,\nextra files and OTLP batch references with span counts. Body references are\nauthenticated API paths returning short-lived downloads of gzip objects.\nEarlier execution generations remain accessible through the API paths shown\nby the CLI.\n\nAfter the agent exits, script graders also receive EVAL_TRACE: a local JSON\nmanifest with a bounded timeline, capture errors, truncation status, local\nlog/file locations and API references. Its timeline reads at most 12 MiB raw\nand retains at most 768 KiB of entries. Follow API references when investigating\nan omitted body. This evidence is not automatically added to AI judge prompts;\nthe expected label still becomes available only during grading.\n\nCofactor\'s diagnostic eval writes tool-start/result/error events and its\nreasoning trail to these files. A start without an end identifies a stalled\nor interrupted tool. Reconstructed reasoning is labeled as reconstructed.\n';
1920
+ var overview_default6 = 'Use an eval to measure an AI agent your product ships: run its command against a\nset of cases at a commit, grade every attempt, and get a pass rate, cost and\ntime per task. Run, grade and compare models with the CLI; no GitHub setup is\nneeded beyond the commit you evaluate. Pass `--org <org>` on every write.\n\nWHEN TO WRITE AN EVAL\n\n- An agent\'s behavior is the thing that can regress: a prompt, a tool set, a\n model change, a retrieval change.\n- A workflow test cannot decide it, because the output is free text or a\n judgment (a diagnosis, a summary, a support reply), not a click path.\n- You can name real cases and what a good answer looks like. Without cases,\n write a workflow test (`cofactor workflow guide write-a-test`) instead.\n- Do not eval deterministic code; unit-test it.\n\nSTART\n\n cofactor eval init <name> --application <app> --capability CAP-XXX-001\n\nThis writes evals/<name>.eval.yaml, evals/<name>.runbook.md and\nevals/.gitignore, and refuses to overwrite. Edit them, commit them with the\nagent code, then push:\n\n cofactor eval push evals/<name>.eval.yaml --application <app> --org <org>\n\nPush validates the template locally, stores it with its runbook and is\nidempotent. `cofactor eval show <name>` reads it back.\n\nTHE TEMPLATE\n\n version: 1\n name: diag-smoke # 2 to 40 lowercase letters, digits, dashes\n description: One sentence on what the agent must get right.\n proves:\n capabilities: [CAP-XXX-001] # product-map codes in the pushed application\n runbook: diag-smoke.runbook.md # path relative to the YAML\n mode: single-turn # or multi-turn (needs simulator)\n run: ./scripts/run-agent.sh # shell command at the repo root of the commit\n input:\n description: What the files in a case\'s input directory contain.\n require: [input.json] # every case bundle must contain these paths\n agent:\n models:\n sonnet: { provider: anthropic, model: claude-sonnet-4-6 }\n default: sonnet # aliases are what --model takes\n providers: # optional: only when the agent reads non-standard\n azure: # names (see CONFIGURE THE AGENT\'S MODEL below)\n env: { apiKey: LLM_API_KEY, baseUrl: LLM_BASE_URL, model: LLM_MODEL }\n graders: # at least one\n - { id: answer-matches, kind: script, command: ./scripts/grade.sh }\n - id: quality\n kind: ai-judge\n rubric: "At least 20 characters: what each score means."\n scale: 1-5 # or binary\n passAt: 4 # required for 1-5, 2 to 5\n judge: { provider: anthropic, model: claude-opus-4-8 }\n repeats: 1 # attempts per case, 1 to 7 (default 1; for a stochastic agent raise it with passAtLeast)\n passAtLeast: 1 # a case passes when this many attempts pass (default 1, at most repeats)\n passBar: 0.5 # share of cases that must pass, 0.1 to 1\n attemptSeconds: 600 # per attempt, 30 to 1700\n\nUnknown fields are rejected. Set passBar from a measured baseline and treat it\nas a regression ratchet, not an aspiration.\n\nTHE STANDARD ENVIRONMENT\n\nEvery attempt runs `run` in the repository root of the evaluated commit, in an\nisolated sandbox, with:\n\n EVAL_INPUT the case\'s input directory (read only what you need)\n EVAL_OUTPUT the directory to write the answer to\n EVAL_MODEL the model id for this run\n EVAL_PROVIDER anthropic or azure\n EVAL_CASE the case key\n EVAL_ATTEMPT the attempt index\n EVAL_RUN_ID the run id\n EVAL_ATTEMPT_SECONDS the time limit\n EVAL_TRACE_CAPTURE full (default) or metadata\n EVAL_NODE the runner\'s trusted Node binary\n\nplus, for the selected model\'s provider only, a key, a base URL that routes\nmodel calls through Cofactor (which meters cost and latency) and the model id.\nBy default they use the standard names:\n\n anthropic: ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN, ANTHROPIC_BASE_URL,\n ANTHROPIC_MODEL\n azure: OPENAI_API_KEY, AZURE_OPENAI_API_KEY, OPENAI_BASE_URL,\n AZURE_OPENAI_BASE_URL, OPENAI_MODEL\n\nThe key holds a short-lived token for that proxy, never a real provider key.\nThe base URL speaks the provider\'s own wire: the Anthropic Messages API for\nanthropic, the OpenAI v1 API (chat completions and responses) for azure.\nEvery other provider-key secret your sandbox declares (the other provider\'s,\nGemini\'s and Google\'s, and with an agent.providers entry also the selected\nprovider\'s standard names) arrives empty (set, not absent), so a call to a\nprovider you did not select fails. Plain `env:` values in your sandbox\ndefinition (not secrets) reach the attempt unchanged. Do not\nhard-code a key, a URL or a model id; read them from the environment. The case\'s\nexpected value is withheld from the agent and only reaches the graders.\n\nCONFIGURE THE AGENT\'S MODEL\n\nMost agents need nothing here. Add an `agent.providers` entry only for a\nprovider whose agent reads names other than the standard ones (an entry for a\nprovider no model uses is an error). An entry replaces all of that provider\'s\nstandard names: the attempt then sets exactly these three, and nothing else.\n\n agent:\n providers:\n azure:\n env:\n apiKey: LLM_API_KEY # gets the proxy token\n baseUrl: LLM_BASE_URL # gets the proxy URL\n model: LLM_MODEL # gets the model id\n\nNames are upper case, distinct, and never EVAL_*. A mapped key name that your\nsandbox also declares as a secret is replaced for the whole attempt (with the\ntoken, or emptied when another provider runs), so never map onto a secret the\napplication itself needs. Fill the entry from the\nagent\'s own config code, not by guessing: find where it builds its model client\nand copy the names it reads. For example, if the agent has\n\n createAzure({\n apiKey: process.env.LLM_API_KEY,\n baseURL: process.env.LLM_BASE_URL,\n })\n const model = process.env.LLM_MODEL\n\nthen the entry above is right. Map baseUrl to the name the client really reads:\na client that ignores it calls the vendor directly with the proxy token, and\nthe call fails. If the client takes no base URL setting, add one first.\n\nWRITE THE ENTRYPOINT\n\nRead the case from `$EVAL_INPUT`, call the agent exactly as production does,\nand write the final answer to `$EVAL_OUTPUT/answer.<ext>` (answer.json for\nstructured output, answer.txt for prose). The first `answer.*` file in sorted\norder is graded (so write exactly one), up to 256 KiB. No answer file is a\nfailed attempt. Anything the script prints goes to stdout.log in the output\ndirectory, which helps when debugging; do not print secrets or dump the\nenvironment.\n\n #!/usr/bin/env bash\n set -euo pipefail\n bun run scripts/my-agent.ts \\\n --input "$EVAL_INPUT/input.json" --out "$EVAL_OUTPUT/answer.json"\n\nRun the real code path, not a mock of it. Exit non-zero when the agent breaks\n(it is recorded for debugging; the answer file decides the grade).\n\nCHOOSE GRADERS\n\nScript first. Use a judge only for what code cannot decide. A case passes an\nattempt only when every grader passes.\n\n- Script grader: runs after the agent exits, with EVAL_INPUT, EVAL_OUTPUT and\n EVAL_EXPECTED (the case\'s expected value as a JSON file), in the repo root,\n with a fixed 120 second limit. Its last stdout line must be\n {"pass": true, "score": 1, "reason": "why"}. Anything else is a grader\n error, which is reported as an error, never as a pass or a fail. Use scripts\n for categories, ids, exact fields, schema checks and state.\n- ai-judge grader: scores a rubric against the answer and the expected value.\n Use binary for a fact ("names the same cause: yes or no") and 1 to 5 for a\n quality (completeness, tone), with the meaning of each score in the rubric\n and `passAt` set. Always pin the judge model; never leave it to a default.\n Judge the content, not the wording.\n\nBUILD CASES\n\nEach case is an input directory, an expected JSON value, and a provenance.\n\n cofactor eval add-case <name> --key <k> --input <dir|file.tar.gz> \\\n --expected <file|-> --source "<provenance>" [--title <t>] --org <org>\n\n- Read the runbook first: `cofactor eval runbook <name>` works with no checkout.\n- One idea per case. A case that tests three things hides which one broke.\n- Prefer real inputs. Sanitize them before upload: no customer names, domains,\n people, tokens or ids. Use neutral names (Acme, example.com). Customer data\n stays in the database, never in a case.\n- Label from something other than the agent\'s own output (a human decision, a\n fix that landed, a recorded outcome). Say what corroborates it in `--source`.\n- When no real case exists, mutate a frozen real input and mark it synthetic in\n `--source`.\n- Add every failing case you find, as you find it. The set should grow from\n real misses.\n- `--input` takes a directory (tarred deterministically) or a .tar.gz; the\n template\'s `input.require` paths are checked first. `--expected -` reads\n stdin. A bundle already stored is deduplicated.\n- `cofactor eval cases <name>` lists them; `cofactor eval rm-case <name> <key>`\n removes one no run has used.\n[cli >= 0.56.0]\n- A wrong label or input is corrected with a new version, not by deleting the\n case: `cofactor eval add-case <name> --key <k> --input <dir|file.tar.gz> \\\n --expected <file|-> --source "<provenance>" --replace --reason "<why>" --org <org>`\n stores version N+1 with who, when and the reason. Without `--replace` an\n existing key is still an error. Runs that already used the case keep the\n version they graded and show it as `key (vN)`; new runs use the latest.\n `cofactor eval compare` refuses runs that graded different case versions, so\n re-run the baseline after a correction.\n- `cofactor eval case <name> <key> [--version N]` prints a case\'s expected\n label, provenance and version history (newest first).\n[/cli]\n\nCASE FIDELITY AND EVIDENCE MAP (REQUIRED)\n\nKeep three things separate:\n\n- The label is verified truth: what actually happened, established with\n certainty by reliable evidence such as tested source, a verified fixing diff\n or a later investigation. Production\'s answer is not an oracle. Neither is\n the agent\'s own answer. If truth is still uncertain, report that the case is\n not ready; do not turn a guess into a label.\n- The bundle is the environment as actually retained at failure time. It may\n be incomplete even when the label is certain. Later findings may establish\n the label but must not be supplied to the agent as failure-time evidence.\n- Missing evidence stays missing. Never reproduce missing DOM, logs, video or\n state for the case. A later reproduction is not the original evidence. A\n case can test whether the agent identifies exactly what it cannot know.\n\nBUILD THE BUNDLE\n\n1. Write the verified answer and how you verified it in a separate expected\n JSON file. List the facts needed to reach that answer. Keep this file out\n of the input directory and out of the repository used by the agent.\n2. Set the failure cutoff and record the tested commit. Inventory what was\n actually retained: the original tool calls and results, earlier runs and\n comparisons, history up to the cutoff, tested-commit source, configuration,\n logs, screenshots and recordings. Include what a successful agent\'s tools\n would need, not just the files the failing agent happened to read.\n3. Collect the full retained artifacts, including earlier-run context. Keep\n timestamps and source/version provenance. Exclude later outcomes, fixes and\n investigation notes from input. Use event/capture times, not filesystem\n download times. History and archives are valid evidence when cutoff-bounded.\n4. Distinguish an original absence from a collection failure. If a retained\n recording cannot be downloaded, fix collection before uploading the case;\n do not describe it as never retained. Record genuinely absent artifacts,\n partial capture and truncation as such. Never fill the gaps by rerunning.\n5. Sanitize consistently across text, source, images, video and archives.\n Replace names and domains with Acme and example.com; remove credentials and\n identifying data. Preserve timing, relationships and behavior. Review\n images and binaries as well as text. If removing sensitive material loses\n a decisive fact, mark it absent and adjust the expected conclusion, or hold\n the case back. Do not silently replace evidence with a summary.\n6. Record each artifact\'s relative path, origin, capture time, byte count,\n hash and availability in the bundle inventory. Choose a byte budget before\n packaging; retain full files rather than excerpts. If the environment will\n not fit, report the limit rather than silently dropping evidence. Document\n any explicitly dispensable removal and why it cannot affect the answer.\n7. Build the evidence map below. Open every proven path, check its contents\n against the claimed proof, and verify the cutoff. Confirm that expected,\n the map and later corroboration are outside the input and unreachable by\n the agent\'s tools. Point historical tools at captured files, not live data.\n\nBUILD THE EVIDENCE MAP\n\nStore the map inside the withheld expected JSON as expected["evidence-map"].\nIt is grading metadata, never an agent input or an extra YAML template field.\nThe input inventory describes what is available; the map explains what that\nevidence proves about the label.\n\n- certainty: how truth was independently verified; may cite later findings.\n- facts: one entry for every fact the label relies on, with one of two states:\n - proven: fact, path relative to the input directory, and proof explaining\n exactly what in that file establishes the fact.\n - absent: fact, missing naming the specific evidence unavailable in input,\n and expectedConclusion saying what the agent should conclude or check.\n\nAn absent fact means the bundle cannot establish it, not that it is false.\nDo not mark a cause proven just because the label\'s author knows it. Map all\nfacts needed for the cause, not only the visible symptom. `eval push` warns\nfor stored cases without an evidence-map; that warning does not validate a\nmap\'s paths, completeness or truth. Review them yourself.\n\nWORKED EXAMPLE: VERIFIED LABEL\n\nThese are invented, neutral teaching cases. Mark them synthetic in --source;\ndo not describe them as captured production incidents. Paths and expected\nfields are examples for your own entrypoint and graders, not a required schema\nbeyond the evidence-map shape.\n\nAcme\'s checkout at https://example.com/checkout failed. The production agent\nsaid the session had expired. Independently checked source and retained config\nshow that checkout was disabled, and the response names that reason. Label the\ndisabled checkout, even though it disagrees with production\'s diagnosis.\n\nKeep the full retained files in a layout such as:\n\n verified-label/\n input/\n input.json request, failure cutoff and tested commit\n config/checkout.json {"checkoutEnabled":false}\n logs/network.jsonl response: 403, reason: checkout_disabled\n source/checkout.ts tested source: disabled checkout returns that reason\n traces/tools.jsonl original tool calls and results\n history/ earlier runs/comparisons, if retained\n media/ original images/recordings, if retained\n inventory.json artifact provenance, sizes, hashes and absences\n expected.json withheld; never inside input/\n\nThe short file descriptions above explain the example; package the full files.\nFor this teaching case, expected.json contains:\n\n {\n "rootCause": "Checkout was disabled in Acme\'s configuration.",\n "evidence-map": {\n "certainty": "Independently checked the retained config, response and tested source; production\'s expired-session diagnosis was wrong.",\n "facts": [\n {"status":"proven", "fact":"Checkout was disabled",\n "path":"config/checkout.json", "proof":"checkoutEnabled is false."},\n {"status":"proven", "fact":"The request was rejected because checkout was disabled",\n "path":"logs/network.jsonl", "proof":"The checkout response is 403 with reason checkout_disabled."},\n {"status":"proven", "fact":"That response reason identifies the disabled-checkout branch",\n "path":"source/checkout.ts", "proof":"At the tested commit, that reason is returned only when checkoutEnabled is false."}\n ]\n }\n }\n\nA passing answer cites the config and response and explains the disabled\ncheckout. Repeating the production diagnosis fails. Judge the evidence and\nmeaning, not whether the answer copies the label\'s words.\n\n cofactor eval add-case acme-diagnostics --key checkout-disabled \\\n --input ./verified-label/input --expected ./verified-label/expected.json \\\n --source "Synthetic teaching case: independently checked config, response and tested source" --org <org>\n\nWORKED EXAMPLE: MISSING EVIDENCE\n\nAcme\'s Save click at https://example.com/settings timed out. The retained tool\ntrace records a timeout, but no DOM snapshot or recording from the failed click\nwas retained. In this invented case, a later incident investigation and verified\nfix established that a loading overlay intercepted the click. That establishes\nthe label; it does not give the agent the missing failure-time evidence.\n\nBuild missing-evidence/input with input.json, the complete traces/tools.jsonl,\nthe retained tested source/config/history and an inventory of what is present\nor absent. Do not create a replacement DOM or recording. Keep the later\ninvestigation and fix outside input. In missing-evidence/expected.json, write:\n\n {\n "rootCause": "A loading overlay intercepted the Save click.",\n "evidence-map": {\n "certainty": "The later incident investigation and verified fix established the overlay interception; neither is in the agent input.",\n "facts": [\n {"status":"proven", "fact":"The Save click timed out",\n "path":"traces/tools.jsonl", "proof":"The Save click tool result records a timeout."},\n {"status":"absent", "fact":"An overlay intercepted the failed click",\n "missing":"No failure-time DOM with hit-target information or recording of the Save click was retained.",\n "expectedConclusion":"Name the missing failure-time DOM/hit-target evidence or recording. Explain that inspecting what covered Save at the click would distinguish an intercepting overlay from a disabled button or a stale target. Keep the cause unresolved without it."}\n ]\n }\n }\n\nA passing answer says, for example: "The Save click timed out. There is no DOM\nwith hit-target information or recording from that click, so I cannot tell\nwhether an overlay covered Save, the button was disabled or the target was\nstale. That evidence would show which element received or blocked the click."\nIt names a check; it does not rerun the page to manufacture the missing past.\n\n"Need more logs" is too vague. "An overlay definitely blocked Save" also fails:\nit guesses the withheld truth without support. A tentative hypothesis must\nremain tentative and still name the decisive missing evidence and check.\n\n cofactor eval add-case acme-diagnostics --key save-evidence-missing \\\n --input ./missing-evidence/input --expected ./missing-evidence/expected.json \\\n --source "Synthetic teaching case: truth verified later; failure-time DOM and recording absent" --org <org>\n\nWRITE THE JUDGE\'S RULE\n\nConfigure your grader to use the evidence map. Give full credit for a verified\ncause supported by retained evidence, or for naming the specific decisive\nmissing evidence and the check that distinguishes competing causes. Do not\nreward a lucky guess at withheld truth. Unrelated absences do not disqualify\nan otherwise proven cause. Require the correct category when retained evidence\nsupports it; do not force a category the agent could not determine.\n\nThe judge\'s own explanation must name the specific missing evidence and the\ncheck, not just say "insufficient evidence". A rubric for these examples can say:\n\n Pass when the answer either explains the verified cause using retained\n evidence, or identifies the decisive missing evidence from the evidence map\n and explains how checking it would distinguish the competing causes. Fail\n generic requests for more data and unsupported certain causes, even if a\n guess matches the label. In your grading reason, name the particular missing\n evidence and distinguishing check whenever absence affects the grade.\n\nFor a 1-5 diagnostic judge with passAt 4, vague or incomplete gaps and\nunsupported certain causes score at most 3 when decisive evidence is absent.\nCheck the rubric against the passing and failing answers above before using it.\n\nMULTI-TURN\n\nSet `mode: multi-turn` and add `simulator: { provider, model }` (pinned). `run`\nis then the agent process, not a one-shot command. It speaks JSONL on stdin and\nstdout: read one line per user message, answer with one line.\n\n stdin {"user": "message"}\n stdout {"reply": "answer"}\n either side may end it with {"done": true}\n\nNo answer file is needed in multi-turn mode; the graded input is the\nconversation. stdout belongs to the protocol, so any other line you print on\nstdout (a debug message, a log) is a protocol error that errors the attempt;\nlog to stderr. An agent that exits before replying, or writes an over-long line,\nis also a protocol error. As in single-turn mode, a multi-turn attempt that runs\nout of time is not an error: it is graded on the turns completed so far, and\ncounts as a fail if none completed. Multi-turn output also lands in\nstdout.log. A protocol error is not retried.\n\nEach case needs a conversation: `--conversation <file.json>`, either\n`{"kind":"scripted","turns":["first message", "second message"]}` or\n`{"kind":"simulated","persona":"\u2026","goal":"\u2026","facts":["\u2026"],"stopWhen":"\u2026",\n"maxTurns":8}`. A simulated user is another model playing the persona, and the\ngoal and facts never reach the agent. Prefer a script grader that inspects the\nresulting state; use a judge over the transcript for process rules. Read a\ntranscript with `cofactor eval get <run-id> --case <key> --transcript`.\n\nRUN\n\n cofactor eval run <name> [--model <alias>]... [--environment <env>]\n [--at <sha>] [--case <key>]... [--repeats N]\n [--parallel N] [--no-wait] --org <org>\n\nOne run per `--model` (none means the default). Attempts run `--parallel` at a\ntime; raise it before cutting cases when a large set times out. Cost and time\ngrow with cases x repeats x models. It waits, then prints a\nsection per model and a comparison grid. `--at <sha>` evaluates a commit; push\nthe commit first. `--case` (a subset of cases) and a `--repeats` that differs\nfrom the template make a partial run, useful for iterating, which never counts\nas coverage or proof. Ids are\nprinted to stderr first; `--no-wait` prints them and exits 0.\n\nEXIT CODES (run)\n\n 0 every run\'s verdict is pass\n 3 at least one run\'s verdict is fail (the agent missed the pass bar)\n 1 a failed or cancelled run, a polling timeout, or any error\nExit 1 wins over 3: if any run failed or was cancelled, the code is 1 even when\nanother run\'s verdict is fail. A polling timeout leaves the runs going; read\nthem later with `cofactor eval get`. All other sub-commands exit 0 on success\nand 1 on error. Gate on 0.\n\nREAD RESULTS\n\n cofactor eval get <run-id> summary, cases, grader reasons\n cofactor eval get <run-id> --case <key> one case, every attempt\n cofactor eval get <run-id> --case <key> --trace\n model/tool timeline, errors and body links\n cofactor eval runs <name> [--limit N] recent runs\n cofactor eval list evals and their latest verdicts\n\nModel request and response bodies are captured by default for new runs. Add\n`traces: { capture: metadata }` to a template to retain usage and capture state\nwithout storing bodies. `--trace` reads one case\'s trace a page at a time;\nlarge body content may be marked omitted while its individual body link remains\navailable. It also shows partial/capture errors and non-success model HTTP\nstatuses. `--json` returns the structured timeline and body references.\n\nA case passes when `passAtLeast` of its `repeats` attempts pass; the eval\npasses when the share of passing cases reaches `passBar`. With the defaults (one\nrepeat, one to pass) a case passes when its single attempt passes. Read the grader\n`reason` before changing anything.\n\nA single-turn attempt is graded on its answer file. The agent command\'s exit code\nand a timeout are recorded but do not by themselves fail the attempt: a crash\nor a timeout that left no `answer.*` is a counted fail ("no answer written"),\nand one that left a good answer can still pass. An attempt is errored, not\nfailed, when a grader failed (a script grader printed no parsable last line or\nran past its limit, since its own exit code is ignored and only its last line\ncounts; or an ai-judge call failed), the answer file is over 256 KiB, a\nmulti-turn protocol error occurred, or the sandbox failed (infrastructure\nfailures are retried once). One errored attempt makes the whole run `failed`\nwith no verdict, however many cases passed, and `run` exits 1, not 3. Fix the\ngrader, answer size or infrastructure problem and run again; the error text\nnames the case and attempt. The summary counts errored attempts as\n`infraFailures`.\n\nCOMPARE MODELS\n\n cofactor eval run <name> --model sonnet --model haiku --org <org>\n cofactor eval compare <run-id> <run-id>\n cofactor eval compare --batch <id>\n\nOne grid, one row per case, one column per model, with pass rate, cost per task\nand time per task. Compare on the same commit and the same cases; the output\nshows the commit and a digest of the case set. Only a full run of the\ntemplate\'s default model alias counts as coverage; runs of other aliases are\nfor comparing.\n\nLINK WHAT IT PROVES\n\n- Capabilities: `proves.capabilities` in the template links them when you push.\n Add or remove links later with\n `cofactor product-map capability link-eval <CODE|id> --eval <name> --application <app> --org <org>`\n (and `unlink-eval`), but `eval push` makes `proves.capabilities` the source\n of truth: the next push unlinks any capability not listed there. Edit the\n template, not the link.\n- Rules: `cofactor product-map rule link-eval <prule_\u2026> --eval <name> --org <org>`\n ties an eval to a rule in a capability (and `unlink-eval`). The rule must be\n active, its capability must sit in an area, and that capability and area must\n belong to the eval\'s application. Pushing does not touch rule links.\n- An agent as a product-map area, for what an agent can do and evals prove:\n `cofactor product-map area create <title> --kind agent --application <app> --org <org>`.\n- A pull request: attach a full run at the PR head commit with\n `cofactor proofs attach --pr <n> --application <app> --criterion <n> --eval-run <aerun_\u2026> --asserted "Asserted that \u2026" --org <org>`.\n The run must be completed, at the commit you pushed, full (not partial) and\n passing its pass bar. The default-alias rule above is about product-map\n coverage only; it does not apply to attachment: no model is privileged, and a\n full passing run of any model alias proves the criterion (each item shows its\n model). Attach as many runs as you have; every one must pass. Read\n `cofactor proofs guide` for the whole procedure.\n\nTHE HILL-CLIMB LOOP\n\nThe hill-climb loop uses `--json` to climb on measured cases, not on feel.\n\n1. Run the eval at the current commit and note the pass rate.\n cofactor eval run <name> --json --org <org> > run.json\n2. List the failing cases (run --json is an array, one entry per --model;\n .[0] is the first model. A run whose status is failed has a null verdict:\n read .[0].error, and the attempts in .[0].cases[].attempts[] whose status is\n error. A run that never produced a result prints only id, status, verdict and\n error, with no `cases`):\n jq \'[.[0].cases[] | select(.passed|not) | .key]\' run.json\n For a run id, `cofactor eval get <run-id> --json` returns the result\n directly: jq \'[.cases[] | select(.passed|not) | .key]\'\n3. Read one case: `cofactor eval get <run-id> --case <key>`.\n4. Make one change to the agent that explains the failures, commit and push it.\n5. Iterate on the failing cases only (`--case <key>`), then run the full set at\n the new head. Keep the change only if the full pass rate goes up and cost or\n time did not regress. When it does not, revert and try another idea.\n\nNever tune `passBar`, a rubric or a grader to turn a failing run green; fix the\nagent, or fix a wrong label and say why in the commit. Never trust a pass\nfrom a partial run. Add a case for each new failure you meet.\n\nTHE RUNBOOK FORMAT\n\nEvery eval has a runbook at evals/<name>.runbook.md, stored with the eval and\nprinted by `cofactor eval runbook <name>`. Its headings are fixed so an agent\ncan rely on them. `cofactor eval init` writes all of them, each starting with a\n`<!-- cofactor:todo -->` line and a hint:\n\n # <eval name> runbook\n ## What this eval proves the agent\'s job in one paragraph and the capabilities it backs\n ## Anatomy of a case the files in $EVAL_INPUT, what expected holds, what a good case teaches\n ## Finding real data where in prod the inputs live: exact cofactor commands, ids, how to pick varied cases\n ## Labeling how expected is decided and what must corroborate it; never the agent\'s own output alone\n ## Evidence map verified certainty; each label fact proven by a path or explicitly absent\n ## Sanitizing what to strip or replace before upload; the check to run; neutral names to use\n ## Synthesizing scenarios how to make a case when no real one exists, and how to mark it synthetic in --source\n ## Adding the case the exact eval add-case command shape for this eval\n ## Known traps what has gone wrong before\n\nWrite each section, then delete its marker line. `eval push` refuses a runbook\nwhere any section still has the marker, warns when a heading is missing, and\nerrors when "Finding real data" or "Sanitizing" is empty. Keep the runbook true:\nadd a trap when a case goes wrong.\n\nSCOPES AND ACCESS\n\nThe sandbox-v2 organization flag must be on. API keys need explicit scopes:\n\n run: sandbox:create and sandbox:exec, named\n explicitly (sandbox:* does not grant exec)\n push, add-case, rm-case: sandbox:edit\n show, list, cases, runbook, get,\n runs, compare: sandbox:read\n\n`cofactor eval --help` lists every flag. `cofactor eval guide` needs no login.\n\n\nTOOL EXECUTION AND EXTRA TRACES\n\nFull capture also keeps separate stdout/stderr prefixes (1 MiB each), the actual\nlast 16 KiB of combined output, and regular files under $EVAL_OUTPUT/traces/.\nWrite additional execution details there, for example:\n\n mkdir -p "$EVAL_OUTPUT/traces"\n printf \'%s\\n\' \'{"event":"tool_started","tool":"read_file"}\' >> "$EVAL_OUTPUT/traces/tools.jsonl"\n\nFiles are capped at 1 MiB each. Symlinks, hard links and non-regular files are\nrejected. One collection visits at most 128 entries; an execution accepts at\nmost 512 evidence artifacts plus a single count-limit marker. All artifacts\nshare the 64 MiB raw budget with model bodies. Truncation, interrupted streams,\nrejected files and storage failures remain visible; capture never turns a\npassing grade into a failure.\n\nAgents already configured for OpenTelemetry OTLP/HTTP tracing can use the\ninjected environment without adding export code:\n\n OTEL_EXPORTER_OTLP_ENDPOINT storage-only receiver base\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT exact /otlp/v1/traces endpoint\n OTEL_EXPORTER_OTLP_PROTOCOL http/protobuf\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL http/protobuf\n OTEL_EXPORTER_OTLP_HEADERS scoped Authorization header\n OTEL_EXPORTER_OTLP_TRACES_HEADERS same scoped header\n\nThe receiver accepts OTLP JSON or protobuf, with optional gzip; each batch is\nlimited to 1 MiB compressed and 1 MiB raw, and intake is capped at 120 requests\nper minute. Tokens bind the org, attempt and execution generation. Capture\ncloses when the agent exits, so flush the agent\'s OTel provider before exiting.\nA hard-killed exporter can lose unflushed spans. No data is forwarded to a\nvendor, collector or monitoring service.\n\nIn metadata mode no endpoint or token is injected, process log bodies/tails\nand trace files are not retained, and OTLP payloads are rejected before parsing.\nOnly aggregate authenticated OTLP receipt counts are stored.\n\nREAD THE EVIDENCE\n\n cofactor eval get <run-id> --case <key> --trace\n cofactor eval get <run-id> --case <key> --trace --json\n\nThe output includes the model/tool timeline, failed tools, stdout/stderr,\nextra files and OTLP batch references with span counts. Body references are\nauthenticated API paths returning short-lived downloads of gzip objects.\nEarlier execution generations remain accessible through the API paths shown\nby the CLI.\n\nAfter the agent exits, script graders also receive EVAL_TRACE: a local JSON\nmanifest with a bounded timeline, capture errors, truncation status, local\nlog/file locations and API references. Its timeline reads at most 12 MiB raw\nand retains at most 768 KiB of entries. Follow API references when investigating\nan omitted body. This evidence is not automatically added to AI judge prompts;\nthe expected label still becomes available only during grading.\n\nCofactor\'s diagnostic eval writes tool-start/result/error events and its\nreasoning trail to these files. A start without an end identifies a stalled\nor interrupted tool. Reconstructed reasoning is labeled as reconstructed.\n';
1921
1921
 
1922
1922
  // ../content/src/eval-guide/index.ts
1923
1923
  var EVAL_GUIDE_SECTIONS = [
@@ -2186,4 +2186,4 @@ export {
2186
2186
  shouldBrandConsoleOutput,
2187
2187
  installConsoleBranding
2188
2188
  };
2189
- //# sourceMappingURL=chunk-T6ZNIMI4.js.map
2189
+ //# sourceMappingURL=chunk-LRIP5IQD.js.map