@runcofactor/cli 0.55.0 → 0.56.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/dist/{account-RHHS7HT4.js → account-CZYZD2JS.js} +5 -5
  2. package/dist/{alert-B5WEOKHP.js → alert-JQ4SDEB7.js} +8 -8
  3. package/dist/{api-catalog-UXONX3BR.js → api-catalog-IWQC35P2.js} +5 -5
  4. package/dist/{api-key-J3A4TJKN.js → api-key-GUDXIIEA.js} +5 -5
  5. package/dist/{attachment-ZQW7DR4G.js → attachment-CPZYOBUB.js} +5 -5
  6. package/dist/{auth-HQGKUZBS.js → auth-DS6MBVEI.js} +3 -3
  7. package/dist/{benchmark-TIKJA32J.js → benchmark-6HPCIQHD.js} +5 -5
  8. package/dist/{blackcat-Z5LNV2GS.js → blackcat-V3L63WFE.js} +3 -3
  9. package/dist/{chunk-JQG3V5E3.js → chunk-2E3STBHS.js} +2 -2
  10. package/dist/{chunk-KL2ARGH6.js → chunk-2OHYMT3A.js} +3 -3
  11. package/dist/{chunk-KL2ARGH6.js.map → chunk-2OHYMT3A.js.map} +1 -1
  12. package/dist/{chunk-W6DL4IP6.js → chunk-3LGCHNBC.js} +2 -2
  13. package/dist/{chunk-BJHAVM7Z.js → chunk-4MFMPC5P.js} +46 -2
  14. package/dist/chunk-4MFMPC5P.js.map +1 -0
  15. package/dist/{chunk-MB4FS35J.js → chunk-56HFZHQM.js} +8 -8
  16. package/dist/{chunk-CZDQVQ57.js → chunk-5OYWNS6D.js} +20 -9
  17. package/dist/chunk-5OYWNS6D.js.map +1 -0
  18. package/dist/{chunk-YTXZUWMN.js → chunk-62EXS76C.js} +6 -6
  19. package/dist/{chunk-QVMGXMP5.js → chunk-6ILWJFKY.js} +368 -6
  20. package/dist/chunk-6ILWJFKY.js.map +1 -0
  21. package/dist/{chunk-6X6ZTDXP.js → chunk-BDOL622T.js} +4 -4
  22. package/dist/{chunk-L4JQ236V.js → chunk-C3CXVX2B.js} +4 -4
  23. package/dist/{chunk-33U56YGD.js → chunk-CWICLBLU.js} +2 -1
  24. package/dist/{chunk-33U56YGD.js.map → chunk-CWICLBLU.js.map} +1 -1
  25. package/dist/{chunk-XM3WTJ7Y.js → chunk-DEVD2WD2.js} +2 -2
  26. package/dist/{chunk-WWUEKQLR.js → chunk-EWK44F6V.js} +3 -3
  27. package/dist/chunk-EWK44F6V.js.map +1 -0
  28. package/dist/{chunk-CQSQNDMV.js → chunk-FNHPTTRF.js} +7 -5
  29. package/dist/chunk-FNHPTTRF.js.map +1 -0
  30. package/dist/{chunk-Z72GWGH2.js → chunk-GCD4EHCD.js} +6 -6
  31. package/dist/{chunk-3KBYI6RR.js → chunk-H6ZMKNP7.js} +3 -3
  32. package/dist/{chunk-5OKCT6LF.js → chunk-IEWAH7W3.js} +5 -5
  33. package/dist/{chunk-TGI2AAOZ.js → chunk-IV4HRGKX.js} +77 -12
  34. package/dist/chunk-IV4HRGKX.js.map +1 -0
  35. package/dist/{chunk-635IQV6B.js → chunk-J2ZQULU3.js} +2 -2
  36. package/dist/{chunk-ZZZ33KTO.js → chunk-K2IDR6FR.js} +3 -3
  37. package/dist/{chunk-YEH7UIUY.js → chunk-KTZRI27M.js} +4 -4
  38. package/dist/{chunk-RV7FZ4ID.js → chunk-L644NMDI.js} +3 -3
  39. package/dist/{chunk-RV7FZ4ID.js.map → chunk-L644NMDI.js.map} +1 -1
  40. package/dist/{chunk-3TZABC7D.js → chunk-LFT7GUWS.js} +63 -17
  41. package/dist/chunk-LFT7GUWS.js.map +1 -0
  42. package/dist/{chunk-QHRWXCON.js → chunk-O7B2IYCZ.js} +11 -11
  43. package/dist/chunk-O7B2IYCZ.js.map +1 -0
  44. package/dist/{chunk-U3MRXQZS.js → chunk-RHWPZKRV.js} +24 -1
  45. package/dist/chunk-RHWPZKRV.js.map +1 -0
  46. package/dist/{chunk-OU4I3MEH.js → chunk-UJSW72LG.js} +3 -3
  47. package/dist/{chunk-R2CRH6JQ.js → chunk-VACACCD6.js} +3 -3
  48. package/dist/{chunk-EGWVL5XA.js → chunk-VMAR67FF.js} +2 -2
  49. package/dist/{chunk-ZH7HWVEE.js → chunk-VMJ7TBVM.js} +2 -2
  50. package/dist/chunk-WRRA4ATV.js +332 -0
  51. package/dist/chunk-WRRA4ATV.js.map +1 -0
  52. package/dist/{chunk-XWJJYZQC.js → chunk-XHEVDABB.js} +2 -2
  53. package/dist/{chunk-SCQVBLNR.js → chunk-XHGF6VC6.js} +4 -4
  54. package/dist/{credential-2IEZDTH3.js → credential-GJW7LGYP.js} +5 -5
  55. package/dist/{credential-template-S5WSOI3P.js → credential-template-UWBYKKWD.js} +5 -5
  56. package/dist/dev-PBW7BSOD.js +605 -0
  57. package/dist/dev-PBW7BSOD.js.map +1 -0
  58. package/dist/{digest-HQGL7H6E.js → digest-XEHGCJM4.js} +8 -8
  59. package/dist/{docs-CJQZVERZ.js → docs-KH4BCEQF.js} +5 -5
  60. package/dist/{doctor-EGK5AB77.js → doctor-FOXXE5SK.js} +3 -3
  61. package/dist/{environment-MWVXYEDU.js → environment-EBDPQTIS.js} +7 -7
  62. package/dist/{eval-F4NORBQI.js → eval-QZSSEICV.js} +67 -27
  63. package/dist/eval-QZSSEICV.js.map +1 -0
  64. package/dist/{exploration-JC7R7KTJ.js → exploration-LCGKRGOQ.js} +5 -5
  65. package/dist/{exploratory-test-BHK5FTMJ.js → exploratory-test-SGECQGIX.js} +6 -6
  66. package/dist/{external-run-UL5CKG54.js → external-run-2AJAI5O7.js} +9 -9
  67. package/dist/{feature-flag-NMO25TZN.js → feature-flag-P7N4WQIH.js} +5 -5
  68. package/dist/{feedback-3JNPSUXS.js → feedback-LAT7TQ2T.js} +6 -6
  69. package/dist/{flow-AYE4RTZN.js → flow-NH2DC6AP.js} +5 -5
  70. package/dist/{github-DM2DCXRY.js → github-FCEKBLXI.js} +6 -6
  71. package/dist/index.js +106 -408
  72. package/dist/index.js.map +1 -1
  73. package/dist/{init-CPDT5XAU.js → init-5U5EZOAW.js} +5 -5
  74. package/dist/{install-JZRNCHMO.js → install-X3UNVXKY.js} +5 -5
  75. package/dist/{issues-GRFJB52C.js → issues-4P6I3YQW.js} +8 -8
  76. package/dist/{knobs-3Y4QXWAD.js → knobs-JKTWJ6ZG.js} +5 -5
  77. package/dist/{landing-ABYL5WVG.js → landing-6AGLKI66.js} +7 -7
  78. package/dist/{list-WG5QB4NK.js → list-TWP2RP33.js} +5 -5
  79. package/dist/{local-KX24OR5Z.js → local-D75QE5TB.js} +7 -7
  80. package/dist/{login-MLJQAIFK.js → login-RBET4TIP.js} +5 -5
  81. package/dist/{mcp-DDTO54XD.js → mcp-562SUUMK.js} +11 -11
  82. package/dist/{metrics-BJLLOSPQ.js → metrics-4WF2GEPA.js} +5 -5
  83. package/dist/{monitor-E2CKGHPM.js → monitor-WJXH54H2.js} +5 -5
  84. package/dist/{perf-IX7JOMUE.js → perf-C6N6P7YG.js} +12 -361
  85. package/dist/perf-C6N6P7YG.js.map +1 -0
  86. package/dist/{product-2ECWM2JN.js → product-CYEQ7HOB.js} +5 -5
  87. package/dist/{product-map-O542LZQL.js → product-map-MSDLIFZY.js} +7 -7
  88. package/dist/{prompts-Y7O4XJ5P.js → prompts-ME53WPN4.js} +5 -5
  89. package/dist/{proofs-TNOBLSRP.js → proofs-D3G6ZUFP.js} +11 -9
  90. package/dist/{property-TZCGOZQG.js → property-5GLJNAVB.js} +29 -10
  91. package/dist/property-5GLJNAVB.js.map +1 -0
  92. package/dist/{psql-M66YSUXW.js → psql-EXAUDU3W.js} +5 -5
  93. package/dist/{record-3JINBRAR.js → record-EE7NGNKY.js} +6 -6
  94. package/dist/{redis-FOIBINYA.js → redis-M4EYWKOJ.js} +5 -5
  95. package/dist/{release-B4VWMVEI.js → release-4KUWVWWC.js} +5 -5
  96. package/dist/{runbook-EYMSE37E.js → runbook-AHU77ANQ.js} +5 -5
  97. package/dist/{sandbox-R6EMGOKR.js → sandbox-FBLJEYA2.js} +1910 -1629
  98. package/dist/sandbox-FBLJEYA2.js.map +1 -0
  99. package/dist/{scenarios-W7YNLBVO.js → scenarios-TU656T2B.js} +5 -5
  100. package/dist/{schedule-EDHQJUUZ.js → schedule-DXJI6SYO.js} +8 -8
  101. package/dist/{session-4N62APNQ.js → session-RUFTJHF4.js} +10 -10
  102. package/dist/{skill-XFGMNOVM.js → skill-ZK76GQ47.js} +7 -7
  103. package/dist/{skill-XFGMNOVM.js.map → skill-ZK76GQ47.js.map} +1 -1
  104. package/dist/skills/cofactor-debug-run/SKILL.md +2 -1
  105. package/dist/skills/cofactor-debug-run/history/2.0.10.md +320 -0
  106. package/dist/skills/cofactor-debug-run/version.json +1 -1
  107. package/dist/{slack-RUAXG6TB.js → slack-M3OKDVMY.js} +6 -6
  108. package/dist/{spec-ZZKMW7ER.js → spec-5MXEBLYR.js} +5 -5
  109. package/dist/{src-OKSAEHQS.js → src-2X5OQRPJ.js} +4 -4
  110. package/dist/{src-DGIVA22K.js → src-72EFBA2R.js} +3 -3
  111. package/dist/{src-ECZWYNSV.js → src-KH6WSBJV.js} +5 -5
  112. package/dist/{src-CQ2YAW7F.js → src-VLV36QYH.js} +127 -20
  113. package/dist/src-VLV36QYH.js.map +1 -0
  114. package/dist/{start-OCZGILRL.js → start-PDYBRB5T.js} +5 -5
  115. package/dist/{status-YTJ6YITG.js → status-VMVPVCDA.js} +5 -5
  116. package/dist/{tag-KBG4SWRL.js → tag-7KTDLPVU.js} +6 -6
  117. package/dist/{task-O6XRMHYE.js → task-QLFYZNKR.js} +6 -6
  118. package/dist/{teams-NFUHS7XI.js → teams-Y7BXCY6P.js} +7 -7
  119. package/dist/{test-suite-6BH3DESN.js → test-suite-6U22AYFG.js} +15 -14
  120. package/dist/test-suite-6U22AYFG.js.map +1 -0
  121. package/dist/{tickets-JU2STK4B.js → tickets-CQDJDNPY.js} +5 -5
  122. package/dist/{trace-NMSGKASJ.js → trace-QDORWXYX.js} +8 -8
  123. package/dist/{triage-JGECJJU5.js → triage-GY7M3UGG.js} +6 -6
  124. package/dist/{trigger-OSPEVCCQ.js → trigger-DLFAORX4.js} +9 -9
  125. package/dist/{update-check-FNP6RFZO.js → update-check-ES6XQ7OF.js} +4 -4
  126. package/dist/{upgrade-3PPBXFAT.js → upgrade-WKEOW5GS.js} +5 -5
  127. package/dist/{usage-QMCU2JIO.js → usage-E6FDTR3W.js} +7 -7
  128. package/dist/{utilities-7VHWTSJT.js → utilities-4Z6YX3L5.js} +6 -6
  129. package/dist/{visual-WIZSPTVK.js → visual-TA6LPVDJ.js} +5 -5
  130. package/dist/{workflow-23HKTJLS.js → workflow-B5FXS2CJ.js} +58 -31
  131. package/dist/workflow-B5FXS2CJ.js.map +1 -0
  132. package/dist/{workflow-cache-ACGM3BOI.js → workflow-cache-MNLEMRMM.js} +16 -16
  133. package/dist/{workflow-cache-convergence-resolve-KEQDQMKL.js → workflow-cache-convergence-resolve-G5HJM6MF.js} +5 -5
  134. package/dist/{workflow-debug-TVLBNRCB.js → workflow-debug-TNBUGSBK.js} +11 -11
  135. package/dist/{workflow-feedback-GB5VPGE2.js → workflow-feedback-G2ZXAUGI.js} +5 -5
  136. package/dist/{workflow-fork-2IPJNR76.js → workflow-fork-6HHOMC2D.js} +5 -5
  137. package/dist/{workflow-promotion-QEQUXVUT.js → workflow-promotion-RG7L6JZT.js} +5 -5
  138. package/dist/{workflow-proposals-KHGTPMD4.js → workflow-proposals-ZNF2F3UE.js} +5 -5
  139. package/dist/{workflow-revisions-F5KQEEXB.js → workflow-revisions-TP64Z6FO.js} +5 -5
  140. package/dist/{workflow-status-66HC5MEA.js → workflow-status-5RG3JX56.js} +5 -5
  141. package/package.json +3 -2
  142. package/dist/chunk-3TZABC7D.js.map +0 -1
  143. package/dist/chunk-BJHAVM7Z.js.map +0 -1
  144. package/dist/chunk-CQSQNDMV.js.map +0 -1
  145. package/dist/chunk-CZDQVQ57.js.map +0 -1
  146. package/dist/chunk-QHRWXCON.js.map +0 -1
  147. package/dist/chunk-QVMGXMP5.js.map +0 -1
  148. package/dist/chunk-TGI2AAOZ.js.map +0 -1
  149. package/dist/chunk-U3MRXQZS.js.map +0 -1
  150. package/dist/chunk-WWUEKQLR.js.map +0 -1
  151. package/dist/eval-F4NORBQI.js.map +0 -1
  152. package/dist/perf-IX7JOMUE.js.map +0 -1
  153. package/dist/property-TZCGOZQG.js.map +0 -1
  154. package/dist/sandbox-R6EMGOKR.js.map +0 -1
  155. package/dist/src-CQ2YAW7F.js.map +0 -1
  156. package/dist/test-suite-6BH3DESN.js.map +0 -1
  157. package/dist/workflow-23HKTJLS.js.map +0 -1
  158. /package/dist/{account-RHHS7HT4.js.map → account-CZYZD2JS.js.map} +0 -0
  159. /package/dist/{alert-B5WEOKHP.js.map → alert-JQ4SDEB7.js.map} +0 -0
  160. /package/dist/{api-catalog-UXONX3BR.js.map → api-catalog-IWQC35P2.js.map} +0 -0
  161. /package/dist/{api-key-J3A4TJKN.js.map → api-key-GUDXIIEA.js.map} +0 -0
  162. /package/dist/{attachment-ZQW7DR4G.js.map → attachment-CPZYOBUB.js.map} +0 -0
  163. /package/dist/{auth-HQGKUZBS.js.map → auth-DS6MBVEI.js.map} +0 -0
  164. /package/dist/{benchmark-TIKJA32J.js.map → benchmark-6HPCIQHD.js.map} +0 -0
  165. /package/dist/{blackcat-Z5LNV2GS.js.map → blackcat-V3L63WFE.js.map} +0 -0
  166. /package/dist/{chunk-JQG3V5E3.js.map → chunk-2E3STBHS.js.map} +0 -0
  167. /package/dist/{chunk-W6DL4IP6.js.map → chunk-3LGCHNBC.js.map} +0 -0
  168. /package/dist/{chunk-MB4FS35J.js.map → chunk-56HFZHQM.js.map} +0 -0
  169. /package/dist/{chunk-YTXZUWMN.js.map → chunk-62EXS76C.js.map} +0 -0
  170. /package/dist/{chunk-6X6ZTDXP.js.map → chunk-BDOL622T.js.map} +0 -0
  171. /package/dist/{chunk-L4JQ236V.js.map → chunk-C3CXVX2B.js.map} +0 -0
  172. /package/dist/{chunk-XM3WTJ7Y.js.map → chunk-DEVD2WD2.js.map} +0 -0
  173. /package/dist/{chunk-Z72GWGH2.js.map → chunk-GCD4EHCD.js.map} +0 -0
  174. /package/dist/{chunk-3KBYI6RR.js.map → chunk-H6ZMKNP7.js.map} +0 -0
  175. /package/dist/{chunk-5OKCT6LF.js.map → chunk-IEWAH7W3.js.map} +0 -0
  176. /package/dist/{chunk-635IQV6B.js.map → chunk-J2ZQULU3.js.map} +0 -0
  177. /package/dist/{chunk-ZZZ33KTO.js.map → chunk-K2IDR6FR.js.map} +0 -0
  178. /package/dist/{chunk-YEH7UIUY.js.map → chunk-KTZRI27M.js.map} +0 -0
  179. /package/dist/{chunk-OU4I3MEH.js.map → chunk-UJSW72LG.js.map} +0 -0
  180. /package/dist/{chunk-R2CRH6JQ.js.map → chunk-VACACCD6.js.map} +0 -0
  181. /package/dist/{chunk-EGWVL5XA.js.map → chunk-VMAR67FF.js.map} +0 -0
  182. /package/dist/{chunk-ZH7HWVEE.js.map → chunk-VMJ7TBVM.js.map} +0 -0
  183. /package/dist/{chunk-XWJJYZQC.js.map → chunk-XHEVDABB.js.map} +0 -0
  184. /package/dist/{chunk-SCQVBLNR.js.map → chunk-XHGF6VC6.js.map} +0 -0
  185. /package/dist/{credential-2IEZDTH3.js.map → credential-GJW7LGYP.js.map} +0 -0
  186. /package/dist/{credential-template-S5WSOI3P.js.map → credential-template-UWBYKKWD.js.map} +0 -0
  187. /package/dist/{digest-HQGL7H6E.js.map → digest-XEHGCJM4.js.map} +0 -0
  188. /package/dist/{docs-CJQZVERZ.js.map → docs-KH4BCEQF.js.map} +0 -0
  189. /package/dist/{doctor-EGK5AB77.js.map → doctor-FOXXE5SK.js.map} +0 -0
  190. /package/dist/{environment-MWVXYEDU.js.map → environment-EBDPQTIS.js.map} +0 -0
  191. /package/dist/{exploration-JC7R7KTJ.js.map → exploration-LCGKRGOQ.js.map} +0 -0
  192. /package/dist/{exploratory-test-BHK5FTMJ.js.map → exploratory-test-SGECQGIX.js.map} +0 -0
  193. /package/dist/{external-run-UL5CKG54.js.map → external-run-2AJAI5O7.js.map} +0 -0
  194. /package/dist/{feature-flag-NMO25TZN.js.map → feature-flag-P7N4WQIH.js.map} +0 -0
  195. /package/dist/{feedback-3JNPSUXS.js.map → feedback-LAT7TQ2T.js.map} +0 -0
  196. /package/dist/{flow-AYE4RTZN.js.map → flow-NH2DC6AP.js.map} +0 -0
  197. /package/dist/{github-DM2DCXRY.js.map → github-FCEKBLXI.js.map} +0 -0
  198. /package/dist/{init-CPDT5XAU.js.map → init-5U5EZOAW.js.map} +0 -0
  199. /package/dist/{install-JZRNCHMO.js.map → install-X3UNVXKY.js.map} +0 -0
  200. /package/dist/{issues-GRFJB52C.js.map → issues-4P6I3YQW.js.map} +0 -0
  201. /package/dist/{knobs-3Y4QXWAD.js.map → knobs-JKTWJ6ZG.js.map} +0 -0
  202. /package/dist/{landing-ABYL5WVG.js.map → landing-6AGLKI66.js.map} +0 -0
  203. /package/dist/{list-WG5QB4NK.js.map → list-TWP2RP33.js.map} +0 -0
  204. /package/dist/{local-KX24OR5Z.js.map → local-D75QE5TB.js.map} +0 -0
  205. /package/dist/{login-MLJQAIFK.js.map → login-RBET4TIP.js.map} +0 -0
  206. /package/dist/{mcp-DDTO54XD.js.map → mcp-562SUUMK.js.map} +0 -0
  207. /package/dist/{metrics-BJLLOSPQ.js.map → metrics-4WF2GEPA.js.map} +0 -0
  208. /package/dist/{monitor-E2CKGHPM.js.map → monitor-WJXH54H2.js.map} +0 -0
  209. /package/dist/{product-2ECWM2JN.js.map → product-CYEQ7HOB.js.map} +0 -0
  210. /package/dist/{product-map-O542LZQL.js.map → product-map-MSDLIFZY.js.map} +0 -0
  211. /package/dist/{prompts-Y7O4XJ5P.js.map → prompts-ME53WPN4.js.map} +0 -0
  212. /package/dist/{proofs-TNOBLSRP.js.map → proofs-D3G6ZUFP.js.map} +0 -0
  213. /package/dist/{psql-M66YSUXW.js.map → psql-EXAUDU3W.js.map} +0 -0
  214. /package/dist/{record-3JINBRAR.js.map → record-EE7NGNKY.js.map} +0 -0
  215. /package/dist/{redis-FOIBINYA.js.map → redis-M4EYWKOJ.js.map} +0 -0
  216. /package/dist/{release-B4VWMVEI.js.map → release-4KUWVWWC.js.map} +0 -0
  217. /package/dist/{runbook-EYMSE37E.js.map → runbook-AHU77ANQ.js.map} +0 -0
  218. /package/dist/{scenarios-W7YNLBVO.js.map → scenarios-TU656T2B.js.map} +0 -0
  219. /package/dist/{schedule-EDHQJUUZ.js.map → schedule-DXJI6SYO.js.map} +0 -0
  220. /package/dist/{session-4N62APNQ.js.map → session-RUFTJHF4.js.map} +0 -0
  221. /package/dist/{slack-RUAXG6TB.js.map → slack-M3OKDVMY.js.map} +0 -0
  222. /package/dist/{spec-ZZKMW7ER.js.map → spec-5MXEBLYR.js.map} +0 -0
  223. /package/dist/{src-DGIVA22K.js.map → src-2X5OQRPJ.js.map} +0 -0
  224. /package/dist/{src-ECZWYNSV.js.map → src-72EFBA2R.js.map} +0 -0
  225. /package/dist/{src-OKSAEHQS.js.map → src-KH6WSBJV.js.map} +0 -0
  226. /package/dist/{start-OCZGILRL.js.map → start-PDYBRB5T.js.map} +0 -0
  227. /package/dist/{status-YTJ6YITG.js.map → status-VMVPVCDA.js.map} +0 -0
  228. /package/dist/{tag-KBG4SWRL.js.map → tag-7KTDLPVU.js.map} +0 -0
  229. /package/dist/{task-O6XRMHYE.js.map → task-QLFYZNKR.js.map} +0 -0
  230. /package/dist/{teams-NFUHS7XI.js.map → teams-Y7BXCY6P.js.map} +0 -0
  231. /package/dist/{tickets-JU2STK4B.js.map → tickets-CQDJDNPY.js.map} +0 -0
  232. /package/dist/{trace-NMSGKASJ.js.map → trace-QDORWXYX.js.map} +0 -0
  233. /package/dist/{triage-JGECJJU5.js.map → triage-GY7M3UGG.js.map} +0 -0
  234. /package/dist/{trigger-OSPEVCCQ.js.map → trigger-DLFAORX4.js.map} +0 -0
  235. /package/dist/{update-check-FNP6RFZO.js.map → update-check-ES6XQ7OF.js.map} +0 -0
  236. /package/dist/{upgrade-3PPBXFAT.js.map → upgrade-WKEOW5GS.js.map} +0 -0
  237. /package/dist/{usage-QMCU2JIO.js.map → usage-E6FDTR3W.js.map} +0 -0
  238. /package/dist/{utilities-7VHWTSJT.js.map → utilities-4Z6YX3L5.js.map} +0 -0
  239. /package/dist/{visual-WIZSPTVK.js.map → visual-TA6LPVDJ.js.map} +0 -0
  240. /package/dist/{workflow-cache-ACGM3BOI.js.map → workflow-cache-MNLEMRMM.js.map} +0 -0
  241. /package/dist/{workflow-cache-convergence-resolve-KEQDQMKL.js.map → workflow-cache-convergence-resolve-G5HJM6MF.js.map} +0 -0
  242. /package/dist/{workflow-debug-TVLBNRCB.js.map → workflow-debug-TNBUGSBK.js.map} +0 -0
  243. /package/dist/{workflow-feedback-GB5VPGE2.js.map → workflow-feedback-G2ZXAUGI.js.map} +0 -0
  244. /package/dist/{workflow-fork-2IPJNR76.js.map → workflow-fork-6HHOMC2D.js.map} +0 -0
  245. /package/dist/{workflow-promotion-QEQUXVUT.js.map → workflow-promotion-RG7L6JZT.js.map} +0 -0
  246. /package/dist/{workflow-proposals-KHGTPMD4.js.map → workflow-proposals-ZNF2F3UE.js.map} +0 -0
  247. /package/dist/{workflow-revisions-F5KQEEXB.js.map → workflow-revisions-TP64Z6FO.js.map} +0 -0
  248. /package/dist/{workflow-status-66HC5MEA.js.map → workflow-status-5RG3JX56.js.map} +0 -0
@@ -3,17 +3,17 @@ import {
3
3
  apiRequest,
4
4
  fetchList,
5
5
  getTargetOrg
6
- } from "./chunk-WWUEKQLR.js";
6
+ } from "./chunk-EWK44F6V.js";
7
7
  import "./chunk-S3Q7MDCS.js";
8
8
  import {
9
9
  getArgValue,
10
10
  hasFlag,
11
11
  resolveConfig
12
- } from "./chunk-BJHAVM7Z.js";
12
+ } from "./chunk-4MFMPC5P.js";
13
13
  import {
14
14
  writeRawOutput
15
- } from "./chunk-KL2ARGH6.js";
16
- import "./chunk-U3MRXQZS.js";
15
+ } from "./chunk-2OHYMT3A.js";
16
+ import "./chunk-RHWPZKRV.js";
17
17
  import "./chunk-TOWZAG3I.js";
18
18
 
19
19
  // src/account.ts
@@ -254,4 +254,4 @@ async function runAccount(argv) {
254
254
  export {
255
255
  runAccount
256
256
  };
257
- //# sourceMappingURL=account-RHHS7HT4.js.map
257
+ //# sourceMappingURL=account-CZYZD2JS.js.map
@@ -20,25 +20,25 @@ import {
20
20
  mergeSteps,
21
21
  parseFilters,
22
22
  updateRule
23
- } from "./chunk-YTXZUWMN.js";
24
- import "./chunk-XM3WTJ7Y.js";
25
- import "./chunk-XWJJYZQC.js";
23
+ } from "./chunk-62EXS76C.js";
24
+ import "./chunk-DEVD2WD2.js";
25
+ import "./chunk-XHEVDABB.js";
26
26
  import "./chunk-DEK6B6LX.js";
27
27
  import {
28
28
  fetchList,
29
29
  getPositionalArg
30
- } from "./chunk-WWUEKQLR.js";
30
+ } from "./chunk-EWK44F6V.js";
31
31
  import "./chunk-S3Q7MDCS.js";
32
32
  import {
33
33
  GLOBAL_VALUE_FLAGS,
34
34
  getArgValue,
35
35
  hasFlag,
36
36
  resolveConfig
37
- } from "./chunk-BJHAVM7Z.js";
37
+ } from "./chunk-4MFMPC5P.js";
38
38
  import {
39
39
  writeRawOutput
40
- } from "./chunk-KL2ARGH6.js";
41
- import "./chunk-U3MRXQZS.js";
40
+ } from "./chunk-2OHYMT3A.js";
41
+ import "./chunk-RHWPZKRV.js";
42
42
  import "./chunk-TOWZAG3I.js";
43
43
 
44
44
  // src/alert.ts
@@ -315,4 +315,4 @@ async function runAlert(argv) {
315
315
  export {
316
316
  runAlert
317
317
  };
318
- //# sourceMappingURL=alert-B5WEOKHP.js.map
318
+ //# sourceMappingURL=alert-JQ4SDEB7.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-WWUEKQLR.js";
4
+ } from "./chunk-EWK44F6V.js";
5
5
  import "./chunk-S3Q7MDCS.js";
6
6
  import {
7
7
  getArgValue,
8
8
  hasFlag
9
- } from "./chunk-BJHAVM7Z.js";
9
+ } from "./chunk-4MFMPC5P.js";
10
10
  import {
11
11
  writeRawOutput
12
- } from "./chunk-KL2ARGH6.js";
13
- import "./chunk-U3MRXQZS.js";
12
+ } from "./chunk-2OHYMT3A.js";
13
+ import "./chunk-RHWPZKRV.js";
14
14
  import "./chunk-TOWZAG3I.js";
15
15
 
16
16
  // src/api-catalog.ts
@@ -414,4 +414,4 @@ function exitErr(msg) {
414
414
  export {
415
415
  runApiCatalog
416
416
  };
417
- //# sourceMappingURL=api-catalog-UXONX3BR.js.map
417
+ //# sourceMappingURL=api-catalog-IWQC35P2.js.map
@@ -2,17 +2,17 @@ import { createRequire as __cr } from "module"; import { fileURLToPath as __fup
2
2
  import {
3
3
  apiRequest,
4
4
  getArgValues
5
- } from "./chunk-WWUEKQLR.js";
5
+ } from "./chunk-EWK44F6V.js";
6
6
  import "./chunk-S3Q7MDCS.js";
7
7
  import {
8
8
  getArgValue,
9
9
  hasFlag,
10
10
  resolveConfig
11
- } from "./chunk-BJHAVM7Z.js";
11
+ } from "./chunk-4MFMPC5P.js";
12
12
  import {
13
13
  writeRawOutput
14
- } from "./chunk-KL2ARGH6.js";
15
- import "./chunk-U3MRXQZS.js";
14
+ } from "./chunk-2OHYMT3A.js";
15
+ import "./chunk-RHWPZKRV.js";
16
16
  import "./chunk-TOWZAG3I.js";
17
17
 
18
18
  // src/api-key.ts
@@ -176,4 +176,4 @@ export {
176
176
  createApiKey,
177
177
  runApiKey
178
178
  };
179
- //# sourceMappingURL=api-key-J3A4TJKN.js.map
179
+ //# sourceMappingURL=api-key-GUDXIIEA.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
  apiRequest
4
- } from "./chunk-WWUEKQLR.js";
4
+ } from "./chunk-EWK44F6V.js";
5
5
  import "./chunk-S3Q7MDCS.js";
6
6
  import {
7
7
  getArgValue,
8
8
  hasFlag,
9
9
  resolveConfig
10
- } from "./chunk-BJHAVM7Z.js";
10
+ } from "./chunk-4MFMPC5P.js";
11
11
  import {
12
12
  writeRawOutput
13
- } from "./chunk-KL2ARGH6.js";
14
- import "./chunk-U3MRXQZS.js";
13
+ } from "./chunk-2OHYMT3A.js";
14
+ import "./chunk-RHWPZKRV.js";
15
15
  import "./chunk-TOWZAG3I.js";
16
16
 
17
17
  // src/attachment.ts
@@ -275,4 +275,4 @@ async function runAttachment(argv) {
275
275
  export {
276
276
  runAttachment
277
277
  };
278
- //# sourceMappingURL=attachment-ZQW7DR4G.js.map
278
+ //# sourceMappingURL=attachment-CPZYOBUB.js.map
@@ -27,8 +27,8 @@ import {
27
27
  resolveOrgAppUrl,
28
28
  saveAuth,
29
29
  setDefaultProfile
30
- } from "./chunk-BJHAVM7Z.js";
31
- import "./chunk-KL2ARGH6.js";
30
+ } from "./chunk-4MFMPC5P.js";
31
+ import "./chunk-2OHYMT3A.js";
32
32
  import "./chunk-TOWZAG3I.js";
33
33
  export {
34
34
  ENV_URLS,
@@ -59,4 +59,4 @@ export {
59
59
  saveAuth,
60
60
  setDefaultProfile
61
61
  };
62
- //# sourceMappingURL=auth-HQGKUZBS.js.map
62
+ //# sourceMappingURL=auth-DS6MBVEI.js.map
@@ -3,18 +3,18 @@ import {
3
3
  apiRequest,
4
4
  fetchList,
5
5
  getPositionalArgs
6
- } from "./chunk-WWUEKQLR.js";
6
+ } from "./chunk-EWK44F6V.js";
7
7
  import "./chunk-S3Q7MDCS.js";
8
8
  import {
9
9
  GLOBAL_VALUE_FLAGS,
10
10
  getArgValue,
11
11
  hasFlag,
12
12
  resolveConfig
13
- } from "./chunk-BJHAVM7Z.js";
13
+ } from "./chunk-4MFMPC5P.js";
14
14
  import {
15
15
  writeRawOutput
16
- } from "./chunk-KL2ARGH6.js";
17
- import "./chunk-U3MRXQZS.js";
16
+ } from "./chunk-2OHYMT3A.js";
17
+ import "./chunk-RHWPZKRV.js";
18
18
  import "./chunk-TOWZAG3I.js";
19
19
 
20
20
  // src/benchmark.ts
@@ -437,4 +437,4 @@ export {
437
437
  parseAbArgs,
438
438
  runBenchmark
439
439
  };
440
- //# sourceMappingURL=benchmark-TIKJA32J.js.map
440
+ //# sourceMappingURL=benchmark-6HPCIQHD.js.map
@@ -7,10 +7,10 @@ import {
7
7
  isTerminalFailure,
8
8
  resolveConfig,
9
9
  splitAtSeparator
10
- } from "./chunk-BJHAVM7Z.js";
10
+ } from "./chunk-4MFMPC5P.js";
11
11
  import {
12
12
  writeRawOutput
13
- } from "./chunk-KL2ARGH6.js";
13
+ } from "./chunk-2OHYMT3A.js";
14
14
  import "./chunk-TOWZAG3I.js";
15
15
 
16
16
  // src/blackcat.ts
@@ -268,4 +268,4 @@ export {
268
268
  runBlackcat,
269
269
  waitForBlackcatResume
270
270
  };
271
- //# sourceMappingURL=blackcat-Z5LNV2GS.js.map
271
+ //# sourceMappingURL=blackcat-V3L63WFE.js.map
@@ -2,7 +2,7 @@ import { createRequire as __cr } from "module"; import { fileURLToPath as __fup
2
2
  import {
3
3
  redactCredentialBody,
4
4
  redactJsonInPlace
5
- } from "./chunk-U3MRXQZS.js";
5
+ } from "./chunk-RHWPZKRV.js";
6
6
  import {
7
7
  __commonJS,
8
8
  __require,
@@ -3735,4 +3735,4 @@ export {
3735
3735
  extractScreencastFramesToDir,
3736
3736
  inProcessTraceReader
3737
3737
  };
3738
- //# sourceMappingURL=chunk-JQG3V5E3.js.map
3738
+ //# sourceMappingURL=chunk-2E3STBHS.js.map
@@ -1685,7 +1685,7 @@ var ISSUES_GUIDE_SECTIONS = [
1685
1685
  ];
1686
1686
 
1687
1687
  // ../content/src/proofs-guide/overview.txt
1688
- var overview_default4 = 'PROVE A CHANGE WITH TESTS\n\nUse this guide for a pull request that changes user-visible behavior. The pull\nrequest connects numbered acceptance criteria to passing Workflow evidence.\nPass `--org <org>` on every write to select the organization.\n\nCHOOSING PROOFS\n\nPick the proof that fits the change; one change can need several.\n\n- Functional change: a Workflow run that passes at the pushed commit. The\n procedure below covers it.\n- Performance-sensitive change: a perf run. Read `cofactor perf guide`. A\n query change, for example, needs both a functional proof and a perf proof.\n- UI change: a Workflow with `visual_checkpoint` nodes. Read\n `cofactor workflow guide visual-checkpoints`, and step 7 below for how\n attaching runs the test at the PR base and shows the checkpoint diffs.\n When the organization uses visual regression (its Workflows already carry\n `visual_checkpoint` nodes, or its admin says Visual checkpoints are on), a\n change that alters what a screen looks like must carry UI-test evidence: run a Workflow with a `visual_checkpoint` on that screen, adding or\n extending one if none exists. A manual screenshot does not replace it. With\n visual regression off, skip this and say so in the criterion\'s `--detail`.\n[cli >= 0.54.0]\n- Agent behavior: evals. Read `cofactor eval guide`, then attach a full passing\n eval run with `--eval-run` (see step 6).\n[/cli]\n\nTHE PROCEDURE\n\n1. Find coverage before writing a Workflow:\n cofactor workflow list --search "<words>"\n cofactor workflow get <wf_...> --format markdown\n Read the candidate assertions. If a test already walks the journey, use it.\n Never add near-duplicates or a new test for a changed filter, column or field.\n\n2. Choose the Workflow:\n - If an approved Workflow already proves the criterion without changes (the\n journey must still work, for example after a query or refactor change),\n run it as is and attach its run. It is cited as an existing test: it\n proves the journey still works, it is not new coverage, and it is never\n promoted (it is already in its suites). It cannot prove new behavior: a\n new filter, column or field needs a fork that asserts it. An approved\n fork is still treated as a fork; to cite an existing test, attach the\n approved test that is not a fork.\n - Fork an approved Workflow with\n `cofactor workflow fork fork <wf_...> --org <org>` and edit the fork.\n Never edit the approved original.\n - Create a new draft only when no existing journey fits or it needs its own\n data or role (see `cofactor workflow guide write-a-test`).\n\n3. Configure promotion on the fork or new draft before attaching evidence:\n cofactor workflow set-promotion <workflowId> --promote-on merge|never|deploy:<stage> [--target-suite <suite>]... --org <org>\n Repeat `--target-suite` for multiple suites. The command replaces the target\n suite list; omit it to clear extra suites. Promotion adds target suites and\n the default regression suite when present. An org without one can use the\n **Create default suite** button. Do not choose a layer.\n `never` archives the test at merge instead of adding it to any suite, and\n takes no `--target-suite`; use it when the proof is about the change itself\n (see CURATING THE SUITE). It has no effect on an already-approved test.\n\n4. Prove the change at the exact pushed commit. Start from a clean checkout,\n commit and push the application change, then use the pushed commit from\n `git rev-parse HEAD` as `<sha>` in `--at <sha>`. Claim that SHA and sync it:\n cofactor sandbox claim --application <app> --at <sha> --wait --org <org>\n cofactor sandbox sync <sandboxId> [--build] --org <org>\n cofactor workflow run <workflowId> --sandbox <sandboxId> --stream --org <org>\n Keep the sandbox id. If you lose it, `cofactor sandbox claims --org <org>`\n lists your live claims, and `cofactor sandbox destroy <sandboxId>` tears one\n down when you are done. The run uses the claimed sandbox\'s own environment,\n so do not pass `--environment`.\n Iterate until it passes, then run it once more after the last application or\n Workflow test change and use that passing run ID. An existing test is run the\n same way, at the pushed commit and on its current revision. For application edits,\n commit and push, then sync and rerun. Leave the checkout clean. Attach\n refuses dirty checkouts or missing commit evidence. If the run records a\n synced tree, it must equal `HEAD^{tree}`; otherwise its recorded source SHA\n must equal `HEAD`. The run must exist, belong to the cited Workflow, pass,\n and use its current revision. Attach requires a GitHub-delivered application;\n upload-delivered applications cannot supply this proof.\n\n5. After proving, commit any remaining changes and push the branch. If those\n commits change the application or Workflow tests, return to step 4 and\n prove them before proceeding. Open a DRAFT pull request and note its number\n `<n>`; attach needs that PR number.\n\n6. Write concise numbered acceptance criteria. State observable outcomes\n plainly. One run may support several criteria; multiple runs may support one\n criterion. For each evidence item, use the most specific node or assertion\n ID available and state what it proves as `Asserted that \u2026`. Omit optional\n `--node` only when there is no specific ID.\n A performance run can prove a criterion too, and one criterion can mix\n kinds: for a query change, attach a Workflow run for the behavior and a\n performance run for the speed on the same criterion number. Run it at the pushed head SHA\n and attach it with `--perf-run <prun_...>`; one criterion can carry several\n runs, and every attached item must pass. A performance run must be completed,\n compare different base and head commits, and be at the commit you attach; a\n slower result is refused. Attach a new run at the current head, then detach\n an older stale item when the criterion should become proved again.\n [cli >= 0.54.0]\n An agent eval run can prove a criterion as well (a change to an agent\'s\n behavior): attach it with `--eval-run <aerun_...>`. It must be a full run\n (every case at its repeats), completed, passing its pass bar, and measured at\n the commit you attach; a partial, failing or other-commit run is refused.\n One criterion can carry any number of eval runs, each with its own model, and\n every one must pass.\n [/cli]\n\n7. After the draft PR exists, attach evidence. The server refuses a new\n criterion number without both `--text` and `--detail`; reuse the same text\n and detail for additional evidence on that number:\n cofactor proofs attach --pr <n> --application <app> --criterion <n> --text "<criterion>" --detail "<why this matters>" --test <wf_...> --run <wrun_...> [--node <most-specific-id>] [--base <sha>] --asserted "Asserted that \u2026" --org <org>\n For performance evidence, use `--perf-run` instead of `--test` and `--run`:\n cofactor proofs attach --pr <n> --application <app> --criterion <n> --perf-run <prun_...> --asserted "Asserted that \u2026" --org <org>\n [cli >= 0.54.0]\n For an eval run, use `--eval-run` in the same place:\n cofactor proofs attach --pr <n> --application <app> --criterion <n> --eval-run <aerun_...> --asserted "Asserted that \u2026" --org <org>\n [/cli]\n An approved Workflow that is not a fork is attached the same way; the\n result says `"existing": true`.\n Attach exactly one evidence subject per command. A test containing any\n `visual_checkpoint` node is a UI test, including a test that also has other\n steps. Attaching it runs the same test at the PR base commit and the proof\n page shows each checkpoint\'s base, head, and diff. When `--base` is omitted,\n the CLI uses `git merge-base HEAD origin/<default>` when that ref is available.\n Put checkpoints before\n steps that depend on the new behavior so the base run can reach them.\n\n8. Push first, then render the criteria block:\n cofactor proofs render --pr <n> --org <org>\n The output already includes the markers. Paste the entire output into the\n PR description, verbatim, replacing any existing proof block. Never\n hand-format or edit it, and do not add a prose "Proof notes" section that\n restates it. It looks like this:\n\n <!-- cofactor:proof -->\n\n **Proof of acceptance criteria** \xB7 [View all proofs in Cofactor](<proof page>)\n\n \u{1F7E2} 1 passed \xB7 \u{1F7E1} 1 stale \xB7 \u26AA 1 manual \xB7 as of `a1b2c3d`\n\n \u{1F7E2} **1. The saved filter stays selected after a reload** \xB7 Passed\n - **Tested:** Filter bar keeps its selection \xB7 E2E run in a sandbox \xB7 [View the run](<run page>)\n - Asserted that the Status filter still shows "Open" after a reload.\n\n \u{1F7E1} **2. The list query is no slower** \xB7 Stale (proved at 9f8e7d6)\n - **Tested:** Performance run (prod) \xB7 [See the comparison](<perf run page>)\n - Asserted that the list query is no slower than base.\n\n \u26AA **3. The desktop client shows the badge** \xB7 Manual\n - **Tested:** Manual check, not provable with Cofactor \xB7 [See the proof](<proof page>)\n - Opened the desktop build and checked the badge.\n\n Each criterion leads with a stoplight: \u{1F7E2} passed, \u{1F7E1} passed at an earlier\n commit (stale), \u{1F534} failed, \u26AA shown manually because Cofactor could not prove\n it. Under it, each evidence item names the test (its user goal), how it\n ran, what it asserted, and links to it. The block is a snapshot as of the\n commit in its header: it goes stale after a push, and the live verdict is\n the `cofactor / proofs` check and the proof page. After every push, attach,\n or detach, render again and replace the block. Context for a reviewer goes\n in the criterion\'s `--detail` and in the `Asserted that \u2026` line (the proof\n page shows both), not in a paragraph in the PR body.\n\n9. Inspect or revise the proof:\n cofactor proofs status --repo <owner/repo> --pr <n> --org <org>\n The repo is inferred from `GITHUB_REPOSITORY` or `git remote get-url origin`\n and can be overridden with `--repo`.\n Detaching removes a criterion and all evidence attached to it:\n cofactor proofs detach --pr <n> --criterion <n> --org <org>\n Remove just one item with `--test <wf_...>`, `--perf-run <prun_...>` or\n `--manual`:\n cofactor proofs detach --pr <n> --criterion <n> --perf-run <prun_...> --org <org>\n [cli >= 0.54.0]\n `--eval-run <aerun_...>` removes one eval run the same way.\n [/cli]\n Render again and replace the PR proof block after every attach or detach.\n\nWHEN COFACTOR CANNOT PROVE A CRITERION\n\nManual evidence is for a criterion Cofactor cannot exercise at all (for example\nit needs a desktop client, real hardware or a third-party console). If the\ncriterion is plainly outside a browser or a sandbox, go straight to it;\notherwise try a Cofactor test first. A failing, flaky or hard-to-write test is\nnever a reason for manual evidence: fix the test or the change, and never detach\nfailing evidence to replace it with manual evidence.\n\nSay what you did and why Cofactor could not prove it, from a clean checkout at\nthe pushed commit:\n cofactor proofs attach --pr <n> --application <app> --criterion <n> --text "<criterion>" --detail "<why this matters>" --manual --notes <text|@file> [--artifact <https-url>]... --org <org>\n Notes (up to 10,000 characters) and links (up to 20) are shown to everyone\n who can read the proof: keep notes to what you did and why, and redact\n secrets, tokens and customer data from anything you link. Links must be\n https URLs reviewers can open, never signed or tokenized links and never\n with credentials (an image attached to the pull request works; where your\n organization has Cofactor utilities, `cofactor utilities object upload\n <file> --public --json` returns one).\n A criterion holds one manual item, and attaching again replaces its notes\n and links, so pass the same `--notes` and every `--artifact` again. A\n criterion whose only evidence is manual passes the check with `\u{1F4DD}` and\n `[manual]`, renders \u26AA Manual in the block, and shows a Manual badge with\n your notes on the proof page; a criterion that mixes manual with other kinds\n keeps its stoplight and is decided by its other items. Manual evidence never promotes\n anything and reads stale after a push; attach it again at the new head.\n\nCHECKS AND STALE EVIDENCE\n\nThe App publishes `cofactor / proofs`; the Actions job reports the same server\nverdict. Diagnose with a body file:\n cofactor proofs check --pr <n> --sha <head> --body-file <file> --org <org>\n Or pass `--body -` for stdin. The App queues a refreshed check after attach\nor detach. In the Actions path, rerun the check job after attaching or\ndetaching. Successful stale evidence remains successful and is\nmarked stale. Use Re-run on the Cofactor proof page for stale E2E evidence at\nthe PR head. For stale performance evidence, run it at the new head, attach\nthat run and detach the old item. Cofactor does not rerun automatically. Server and CI own promotion\ntriggers; `cofactor trigger` is not your job.\n\nNo block means no proof check; a block with no criteria fails. When the pull\nrequest has no observable acceptance criterion at all (for example a\ndependency bump or a docs-only change), print the neutral block and paste it\nin place of any proof block:\n cofactor proofs render --none "<why this pull request has no criterion to prove>"\nIt reports a neutral result. A criterion that only Cofactor cannot exercise\ngets manual evidence instead (above).\n\nCURATING THE SUITE\n\nEvery promoted test runs from then on, so keep the suite worth running:\n - Reuse first: attach the run of an existing test or eval that already proves\n the criterion before creating one.\n - Extend an existing test instead of duplicating its journey with a new one.\n - One test per user goal, named for that goal (what the user accomplishes,\n not the component or the ticket).\n - Promote lasting behaviour whose regression would matter.\n - Set a Workflow to `--promote-on never` when its proof is about the change\n itself: a one-time migration, backfill, redirect or flag rollout step,\n behaviour about to be removed, or a one-off visual before/after of a\n redesign.\n - Perf and eval runs never join a suite through proofs: a perf A/B or an\n eval experiment for one decision stays a run. Save a perf test only for a\n hot path (see the perf guide).\n - Don\'t keep a test nobody would miss if it disappeared.\n\nWHAT GOES IN THE PULL REQUEST\n\nPaste the output of `proofs render` and nothing that restates it: no "Proof\nnotes" section. If a reviewer needs to know why a Workflow was forked or what\nstays uncovered, say it once in the criterion\'s `--detail`, or make it a\ncriterion with manual evidence.\n\nUse neutral example names and never include customer names, domains, or\ncredentials. A human approves Workflows by merging the pull request; do not\napprove them yourself.\n';
1688
+ var overview_default4 = 'PROVE A CHANGE WITH TESTS\n\nUse this guide for a pull request that changes user-visible behavior. The pull\nrequest connects numbered acceptance criteria to passing Workflow evidence.\nPass `--org <org>` on every write to select the organization.\n\nCHOOSING PROOFS\n\nPick the proof that fits the change; one change can need several.\n\n- Functional change: a Workflow run that passes at the pushed commit. The\n procedure below covers it.\n- Performance-sensitive change: a perf run. Read `cofactor perf guide`. A\n query change, for example, needs both a functional proof and a perf proof.\n- UI change: a Workflow with `visual_checkpoint` nodes. Read\n `cofactor workflow guide visual-checkpoints`, and step 7 below for how\n attaching runs the test at the PR base and shows the checkpoint diffs.\n For sandbox-only tests, prepare visual data with the test\'s own SQL fixture\n through the app\'s generic loader. That guide covers adding it and API/UI\n setup for tests that must also run against staging or prod.\n When the organization uses visual regression (its Workflows already carry\n `visual_checkpoint` nodes, or its admin says Visual checkpoints are on), a\n change that alters what a screen looks like must carry UI-test evidence: run a Workflow with a `visual_checkpoint` on that screen, adding or\n extending one if none exists. A manual screenshot does not replace it. With\n visual regression off, skip this and say so in the `Asserted that \u2026` line of another item,\n or mark the criterion not proved with that reason (see below).\n[cli >= 0.54.0]\n- Agent behavior: evals. Read `cofactor eval guide`, then attach a full passing\n eval run with `--eval-run` (see step 6).\n[/cli]\n\nTHE PROCEDURE\n\n1. Find coverage before writing a Workflow:\n cofactor workflow list --search "<words>"\n cofactor workflow get <wf_...> --format markdown\n Read the candidate assertions. If a test already walks the journey, use it.\n Never add near-duplicates or a new test for a changed filter, column or field.\n\n2. Choose the Workflow:\n - If an approved Workflow already proves the criterion without changes (the\n journey must still work, for example after a query or refactor change),\n run it as is and attach its run. It is cited as an existing test: it\n proves the journey still works, it is not new coverage, and it is never\n promoted (it is already in its suites). It cannot prove new behavior: a\n new filter, column or field needs a fork that asserts it. An approved\n fork is still treated as a fork; to cite an existing test, attach the\n approved test that is not a fork.\n - Fork an approved Workflow with\n `cofactor workflow fork fork <wf_...> --org <org>` and edit the fork.\n Never edit the approved original.\n - Create a new draft only when no existing journey fits or it needs its own\n data or role (see `cofactor workflow guide write-a-test`).\n\n3. Configure promotion on the fork or new draft before attaching evidence:\n cofactor workflow set-promotion <workflowId> --promote-on merge|never|deploy:<stage> [--target-suite <suite>]... --org <org>\n Repeat `--target-suite` for multiple suites. The command replaces the target\n suite list; omit it to clear extra suites. Promotion adds target suites and\n the default regression suite when present. An org without one can use the\n **Create default suite** button. Do not choose a layer.\n `never` archives the test at merge instead of adding it to any suite, and\n takes no `--target-suite`; use it when the proof is about the change itself\n (see CURATING THE SUITE). It has no effect on an already-approved test.\n\n4. Prove the change at the exact pushed commit. Start from a clean checkout,\n commit and push the application change, then use the pushed commit from\n `git rev-parse HEAD` as `<sha>` in `--at <sha>`. Claim that SHA and sync it:\n cofactor sandbox claim --application <app> --at <sha> --wait --org <org>\n cofactor sandbox sync <sandboxId> [--build] --org <org>\n cofactor workflow run <workflowId> --sandbox <sandboxId> --stream --org <org>\n Keep the sandbox id. If you lose it, `cofactor sandbox claims --org <org>`\n lists your live claims, and `cofactor sandbox destroy <sandboxId>` tears one\n down when you are done. The run uses the claimed sandbox\'s own environment,\n so do not pass `--environment`.\n Iterate until it passes, then run it once more after the last application or\n Workflow test change and use that passing run ID. An existing test is run the\n same way, at the pushed commit and on its current revision. For application edits,\n commit and push, then sync and rerun. Leave the checkout clean. Attach\n refuses dirty checkouts or missing commit evidence. If the run records a\n synced tree, it must equal `HEAD^{tree}`; otherwise its recorded source SHA\n must equal `HEAD`. The run must exist, belong to the cited Workflow, pass,\n and use its current revision. Attach requires a GitHub-delivered application;\n upload-delivered applications cannot supply this proof.\n\n5. After proving, commit any remaining changes and push the branch. If those\n commits change the application or Workflow tests, return to step 4 and\n prove them before proceeding. Open a DRAFT pull request and note its number\n `<n>`; attach needs that PR number.\n\n6. Write concise numbered acceptance criteria. A criterion is one short\n observable outcome a user can see, for example "An external run started with\n triage off stays off". Write the criterion, `--text` and `--asserted` in\n product language a reviewer understands: what the user sees or what the\n product does. Leave out field names, column names, flags, IDs, UUIDs, SHAs\n and code identifiers; the reviewer reads them in the PR and cannot interpret\n them. For example:\n Bad: Asserted that an API-launched external run reads back triageEnabled=false\n Good: Asserted that an external run launched with triage turned off stays\n off, and defaults to on when not specified\n One run may support several criteria; multiple runs may support one\n criterion. For each evidence item, use the most specific node or assertion\n ID available and state what it proves as `Asserted that \u2026`. Omit optional\n `--node` only when there is no specific ID.\n A performance run can prove a criterion too, and one criterion can mix\n kinds: for a query change, attach a Workflow run for the behavior and a\n performance run for the speed on the same criterion number. Run it at the pushed head SHA\n and attach it with `--perf-run <prun_...>`; one criterion can carry several\n runs, and every attached item must pass. A performance run must be completed,\n compare different base and head commits, and be at the commit you attach; a\n slower result is refused. Attach a new run at the current head, then detach\n an older stale item when the criterion should become proved again.\n [cli >= 0.54.0]\n An agent eval run can prove a criterion as well (a change to an agent\'s\n behavior): attach it with `--eval-run <aerun_...>`. It must be a full run\n (every case at its repeats), completed, passing its pass bar, and measured at\n the commit you attach; a partial, failing or other-commit run is refused.\n One criterion can carry any number of eval runs, each with its own model, and\n every one must pass.\n [/cli]\n\n7. After the draft PR exists, attach evidence. The server refuses a new\n criterion number without `--text`; reuse the same text for additional\n evidence on that number. `--detail` is no longer needed or shown. The same\n product language applies to `--text` and `--asserted` here (step 6):\n cofactor proofs attach --pr <n> --application <app> --criterion <n> --text "<criterion>" --test <wf_...> --run <wrun_...> [--node <most-specific-id>] [--base <sha>] --asserted "Asserted that \u2026" --org <org>\n For performance evidence, use `--perf-run` instead of `--test` and `--run`:\n cofactor proofs attach --pr <n> --application <app> --criterion <n> --perf-run <prun_...> --asserted "Asserted that \u2026" --org <org>\n [cli >= 0.54.0]\n For an eval run, use `--eval-run` in the same place:\n cofactor proofs attach --pr <n> --application <app> --criterion <n> --eval-run <aerun_...> --asserted "Asserted that \u2026" --org <org>\n [/cli]\n An approved Workflow that is not a fork is attached the same way; the\n result says `"existing": true`.\n [cli >= 0.56.0]\n When `--text`, `--asserted`, `--notes` or `--not-proved` contains something\n that looks like a code identifier or an id (a name like `triageEnabled=false`,\n a UUID, a `wf_\u2026` or `wrun_\u2026` id, or a commit SHA), attach still records the\n evidence and prints a `warning:` line naming the token. Reword the text in\n product language and attach again.\n [/cli]\n Attach exactly one evidence subject per command. A test containing any\n `visual_checkpoint` node is a UI test, including a test that also has other\n steps. Attaching it runs the same test at the PR base commit and the proof\n page shows each checkpoint\'s base, head, and diff. When `--base` is omitted,\n the CLI uses `git merge-base HEAD origin/<default>` when that ref is available.\n Put checkpoints before\n steps that depend on the new behavior so the base run can reach them.\n\n8. Push first, then render the criteria block:\n cofactor proofs render --pr <n> --org <org>\n The output already includes the markers. Paste the entire output into the\n PR description, verbatim, replacing any existing proof block. Never\n hand-format or edit it, and do not add a prose "Proof notes" section that\n restates it. It looks like this:\n\n <!-- cofactor:proof -->\n\n **Proof of acceptance criteria** \xB7 [View all proofs in Cofactor](<proof page>)\n\n \u{1F7E2} 2 proved (1 stale) \xB7 \u26AA 1 checked another way \xB7 \u{1F7E1} 1 not proved \xB7 as of [`a1b2c3d`](<commit page>)\n\n | Status | # | Criterion | Tested | Asserted | Link |\n | --- | --- | --- | --- | --- | --- |\n | \u{1F7E2} Proved by Cofactor | 1 | The saved filter stays selected after a reload | Filter bar keeps its selection<br>E2E run in a sandbox | Asserted that the Status filter still shows "Open" after a reload. | [View the run](<run page>) |\n | \u{1F7E2} Proved by Cofactor<br>Stale: proved at [`9f8e7d6`](<commit page>) | 2 | The list query is no slower | Performance run (prod) | Asserted that the list query is no slower than base. | [See the comparison](<perf run page>) |\n | \u26AA Checked another way | 3 | The desktop client shows the badge | Checked another way | Opened the desktop build and checked the badge. | [See the proof](<proof page>) |\n | \u{1F7E1} Not proved | 4 | Very large exports finish | | No data set is large enough here; the nightly load job covers it. | [See the proof](<proof page>) |\n\n _\u{1F7E2} proved by Cofactor (stale: proved at an earlier commit) \xB7 \u26AA checked another way \xB7 \u{1F7E1} not proved, with the reason given \xB7 \u{1F534} failed. This block is a snapshot; the live verdict is the `cofactor / proofs` check._\n\n <!-- /cofactor:proof -->\n\n The block is one table, and every criterion is in exactly one state:\n \u{1F7E2} proved by Cofactor (a passing run, visual diff, perf or eval; "Stale"\n means it was proved at an earlier commit), \u26AA checked another way (you say\n how, with links), \u{1F7E1} not proved (you say why), or \u{1F534} failed. The check\n passes on proved and checked another way; not proved is a warning, not a\n failure, so say so honestly. Each evidence item is a row naming the test\n (its user goal), how it ran, what it asserted, and a link to it; a\n criterion with several items continues on rows with blank criterion cells.\n The block is a snapshot as of the\n commit in its header: it goes stale after a push, and the live verdict is\n the `cofactor / proofs` check and the proof page. After every push, attach,\n or detach, render again and replace the block. Context for a reviewer goes\n in the `Asserted that \u2026` line, not in a paragraph in the PR body.\n\n9. Inspect or revise the proof:\n cofactor proofs status --repo <owner/repo> --pr <n> --org <org>\n The repo is inferred from `GITHUB_REPOSITORY` or `git remote get-url origin`\n and can be overridden with `--repo`.\n Detaching removes a criterion and all evidence attached to it:\n cofactor proofs detach --pr <n> --criterion <n> --org <org>\n Remove just one item with `--test <wf_...>`, `--perf-run <prun_...>` or\n `--manual`:\n cofactor proofs detach --pr <n> --criterion <n> --perf-run <prun_...> --org <org>\n [cli >= 0.54.0]\n `--eval-run <aerun_...>` removes one eval run the same way.\n [/cli]\n Render again and replace the PR proof block after every attach or detach.\n\nSTEPS A REVIEWER CAN FOLLOW\n\n[cli >= 0.56.0]\nWhen you attach a Workflow run, also pass `--steps`: what the test does, in\nplain sentences, one per line, written by you from the run you watched. The\nproof page shows them next to the video instead of the test\'s own step list,\nso a reviewer can follow the run without reading the test. One step per action\nor check, in the order it happened, in the language of the product (see step\n6):\n cofactor proofs attach ... --steps @steps.txt --org <org>\n where steps.txt holds:\n Opened the cart\n Added two items\n Checked the total reads $40\n Pass the text directly instead of a file if it is short. Attaching again\n replaces the evidence, steps included, so pass `--steps` again whenever you\n re-attach a run. A re-run from the proof page keeps your steps. Leave\n `--steps` off only for an old CLI; evidence without steps falls back to the\n test\'s own list.\n[/cli]\n\nWHEN COFACTOR CANNOT PROVE A CRITERION\n\nA criterion Cofactor cannot prove is either checked another way or not proved.\nChecked another way (manual evidence) is for a criterion Cofactor cannot exercise at all (for example\nit needs a desktop client, real hardware or a third-party console). If the\ncriterion is plainly outside a browser or a sandbox, go straight to it;\notherwise try a Cofactor test first. A failing, flaky or hard-to-write test is\nnever a reason for manual evidence: fix the test or the change, and never detach\nfailing evidence to replace it with manual evidence.\n\nSay what you did and why Cofactor could not prove it, from a clean checkout at\nthe pushed commit:\n cofactor proofs attach --pr <n> --application <app> --criterion <n> --text "<criterion>" --manual --notes <text|@file> [--artifact <https-url>]... --org <org>\n Notes (up to 10,000 characters) and links (up to 20) are shown to everyone\n who can read the proof: keep notes to what you did and why, and redact\n secrets, tokens and customer data from anything you link. Links must be\n https URLs reviewers can open, never signed or tokenized links and never\n with credentials (an image attached to the pull request works; where your\n organization has Cofactor utilities, `cofactor utilities object upload\n <file> --public --json` returns one).\n A criterion holds one manual item, and attaching again replaces its notes\n and links, so pass the same `--notes` and every `--artifact` again. A\n criterion whose only evidence is manual passes the check with `\u{1F4DD}` and\n `[manual]`, renders \u26AA Checked another way in the block, and shows your notes\n on the proof page; a criterion that mixes manual with other kinds\n keeps its stoplight and is decided by its other items. Manual evidence never promotes\n anything and reads stale after a push; attach it again at the new head.\n [cli >= 0.56.0]\n When you did not check a criterion at all, or could not, say why instead of\n leaving it out or inventing evidence:\n cofactor proofs attach --pr <n> --application <app> --criterion <n> --text "<criterion>" --not-proved "<why it is not proved>" --org <org>\n It renders \u{1F7E1} Not proved with your reason and is a warning on the check,\n never a failure. Use it only on a criterion with no evidence (detach\n evidence first); attaching evidence to the criterion later replaces it.\n Write the reason in product language, like the criterion.\n [/cli]\n\nCHECKS AND STALE EVIDENCE\n\nThe App publishes `cofactor / proofs`; the Actions job reports the same server\nverdict. Diagnose with a body file:\n cofactor proofs check --pr <n> --sha <head> --body-file <file> --org <org>\n Or pass `--body -` for stdin. The App queues a refreshed check after attach\nor detach. In the Actions path, rerun the check job after attaching or\ndetaching. Successful stale evidence remains successful and is\nmarked stale. Use Re-run on the Cofactor proof page for stale E2E evidence at\nthe PR head. For stale performance evidence, run it at the new head, attach\nthat run and detach the old item. Cofactor does not rerun automatically. Server and CI own promotion\ntriggers; `cofactor trigger` is not your job.\n\nNo block means no proof check; a block with no criteria fails. When the pull\nrequest has no observable acceptance criterion at all (for example a\ndependency bump or a docs-only change), print the neutral block and paste it\nin place of any proof block:\n cofactor proofs render --none "<why this pull request has no criterion to prove>"\nIt reports a neutral result. A criterion that only Cofactor cannot exercise\ngets manual evidence instead (above).\n\nCURATING THE SUITE\n\nEvery promoted test runs from then on, so keep the suite worth running:\n - Reuse first: attach the run of an existing test or eval that already proves\n the criterion before creating one.\n - Extend an existing test instead of duplicating its journey with a new one.\n - One test per user goal, named for that goal (what the user accomplishes,\n not the component or the ticket).\n - Promote lasting behaviour whose regression would matter.\n - Set a Workflow to `--promote-on never` when its proof is about the change\n itself: a one-time migration, backfill, redirect or flag rollout step,\n behaviour about to be removed, or a one-off visual before/after of a\n redesign.\n - Perf and eval runs never join a suite through proofs: a perf A/B or an\n eval experiment for one decision stays a run. Save a perf test only for a\n hot path (see the perf guide).\n - Don\'t keep a test nobody would miss if it disappeared.\n\nWHAT GOES IN THE PULL REQUEST\n\nPaste the output of `proofs render` and nothing that restates it: no "Proof\nnotes" section. If a reviewer needs to know why a Workflow was forked or what\nstays uncovered, say it once in the `Asserted that \u2026` line, or make it a\ncriterion that is checked another way or not proved.\n\nUse neutral example names and never include customer names, domains, or\ncredentials. A human approves Workflows by merging the pull request; do not\napprove them yourself.\n';
1689
1689
 
1690
1690
  // ../content/src/proofs-guide/index.ts
1691
1691
  var PROOFS_GUIDE_SECTIONS = [
@@ -1701,7 +1701,7 @@ var PERF_GUIDE_SECTIONS = [
1701
1701
  ];
1702
1702
 
1703
1703
  // ../content/src/eval-guide/overview.txt
1704
- 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: 3 # attempts per case, 1 to 7\n passAtLeast: 2 # a case passes when this many attempts pass\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\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\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 runs <name> [--limit N] recent runs\n cofactor eval list evals and their latest verdicts\n\nA case passes when `passAtLeast` of its `repeats` attempts pass; the eval\npasses when the share of passing cases reaches `passBar`. 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 ## 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';
1704
+ 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\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\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 runs <name> [--limit N] recent runs\n cofactor eval list evals and their latest verdicts\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 ## 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';
1705
1705
 
1706
1706
  // ../content/src/eval-guide/index.ts
1707
1707
  var EVAL_GUIDE_SECTIONS = [
@@ -1970,4 +1970,4 @@ export {
1970
1970
  shouldBrandConsoleOutput,
1971
1971
  installConsoleBranding
1972
1972
  };
1973
- //# sourceMappingURL=chunk-KL2ARGH6.js.map
1973
+ //# sourceMappingURL=chunk-2OHYMT3A.js.map