@runcofactor/cli 0.52.0 → 0.53.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 (225) hide show
  1. package/README.md +2 -0
  2. package/dist/{account-3ZG24MOE.js → account-MRZ54P5P.js} +5 -5
  3. package/dist/{alert-5G7PTAX2.js → alert-XBHELHEI.js} +8 -8
  4. package/dist/{api-catalog-IBYAFKKQ.js → api-catalog-GWYRX53L.js} +5 -5
  5. package/dist/{api-key-UXC44BDR.js → api-key-FH6JN447.js} +5 -5
  6. package/dist/{attachment-T6IRFQW3.js → attachment-J7GRVT5F.js} +5 -5
  7. package/dist/{auth-SHOCJE6Z.js → auth-VZZQXRDR.js} +3 -3
  8. package/dist/{benchmark-NJ2U6VTC.js → benchmark-A3SNDARF.js} +5 -5
  9. package/dist/{blackcat-RQJVFGXQ.js → blackcat-UM6TBQBN.js} +3 -3
  10. package/dist/{chunk-DHAGRM2F.js → chunk-33U56YGD.js} +14 -5
  11. package/dist/{chunk-DHAGRM2F.js.map → chunk-33U56YGD.js.map} +1 -1
  12. package/dist/{chunk-M752EUK3.js → chunk-3JU4UYYN.js} +5 -5
  13. package/dist/{chunk-G6BCST3G.js → chunk-3ZOUNCA5.js} +7 -7
  14. package/dist/{chunk-76Z6E7XX.js → chunk-4UZN6TVT.js} +74 -131
  15. package/dist/chunk-4UZN6TVT.js.map +1 -0
  16. package/dist/{chunk-ABT3BLRC.js → chunk-5TKXHS3X.js} +3 -3
  17. package/dist/{chunk-QCYSONXI.js → chunk-CRYHWO4M.js} +2 -2
  18. package/dist/{chunk-QTYUM4ZB.js → chunk-EJ3ZPH5U.js} +23 -187
  19. package/dist/chunk-EJ3ZPH5U.js.map +1 -0
  20. package/dist/{chunk-I5RHTCPY.js → chunk-EL6KJ4PO.js} +4 -4
  21. package/dist/{chunk-ZL4O6C42.js → chunk-HXBK3AGD.js} +2 -2
  22. package/dist/{chunk-PRERH4DN.js → chunk-I2SOHQ2C.js} +3 -3
  23. package/dist/{chunk-CYSPCGO6.js → chunk-JEHHEMUL.js} +5 -5
  24. package/dist/{chunk-LIEADTEF.js → chunk-LJFVRJCA.js} +2 -2
  25. package/dist/{chunk-UEJ2HTKU.js → chunk-MJVUMVLO.js} +19 -1
  26. package/dist/chunk-MJVUMVLO.js.map +1 -0
  27. package/dist/chunk-N55RKCGR.js +24 -0
  28. package/dist/chunk-N55RKCGR.js.map +1 -0
  29. package/dist/{chunk-PHNH3CEU.js → chunk-O4Z44BR7.js} +5 -5
  30. package/dist/{chunk-QA37WVF6.js → chunk-OQFCZERZ.js} +6 -6
  31. package/dist/{chunk-EUVB6Y3C.js → chunk-P7L5KELH.js} +8 -8
  32. package/dist/chunk-P7L5KELH.js.map +1 -0
  33. package/dist/{chunk-Z3MDQSZG.js → chunk-PJFFGQSB.js} +2 -2
  34. package/dist/{chunk-IY3ZK46I.js → chunk-QOVJUSSL.js} +2 -2
  35. package/dist/{chunk-RPJMQBB5.js → chunk-QXU4G4YN.js} +3 -3
  36. package/dist/{chunk-SZSTJIYU.js → chunk-RRSUKARV.js} +4 -4
  37. package/dist/{chunk-775FI436.js → chunk-RVD6J6IZ.js} +2 -2
  38. package/dist/{chunk-5UUIBY6E.js → chunk-TAVBFLCR.js} +3 -3
  39. package/dist/{chunk-ROX7N3RK.js → chunk-V7HB5LAU.js} +10 -7
  40. package/dist/chunk-V7HB5LAU.js.map +1 -0
  41. package/dist/{chunk-LL6TSQWV.js → chunk-VKZOHJCE.js} +3 -3
  42. package/dist/chunk-VKZOHJCE.js.map +1 -0
  43. package/dist/{chunk-3HI6QC4V.js → chunk-WRBU6TX7.js} +2 -2
  44. package/dist/{proofs-TXJGAP5F.js → chunk-X7SUSIY3.js} +118 -20
  45. package/dist/chunk-X7SUSIY3.js.map +1 -0
  46. package/dist/{chunk-BF3IPGMP.js → chunk-XSSZMG65.js} +4 -4
  47. package/dist/{credential-TWSWV64F.js → credential-4RFRU6OH.js} +5 -5
  48. package/dist/{credential-template-XO5D5AI3.js → credential-template-36PFUTBN.js} +5 -5
  49. package/dist/{digest-SLEFOLPV.js → digest-THMKFMP7.js} +8 -8
  50. package/dist/{docs-IDC4V4WQ.js → docs-ZGM53L67.js} +5 -5
  51. package/dist/{doctor-SDAYEA6C.js → doctor-Z2XBGBM3.js} +3 -3
  52. package/dist/{environment-VBUIBQ6O.js → environment-5YVZXBN7.js} +7 -7
  53. package/dist/eval-SO5TPD37.js +1177 -0
  54. package/dist/eval-SO5TPD37.js.map +1 -0
  55. package/dist/{exploration-IREIR5PO.js → exploration-GZ4WUJJH.js} +5 -5
  56. package/dist/{exploratory-test-4Q7BMEFT.js → exploratory-test-Y7P4ZDLD.js} +5 -5
  57. package/dist/{external-run-S7LULKPT.js → external-run-IJGGZOGI.js} +7 -7
  58. package/dist/{feature-flag-IASHTUGU.js → feature-flag-UH6Z7774.js} +5 -5
  59. package/dist/{flow-IBEZFZTU.js → flow-MRWAQYZZ.js} +5 -5
  60. package/dist/{github-HAEZRULP.js → github-VDJU3PU3.js} +6 -6
  61. package/dist/index.js +101 -82
  62. package/dist/index.js.map +1 -1
  63. package/dist/{init-LT2TZMQY.js → init-CROSTPA6.js} +5 -5
  64. package/dist/{install-RTEYH6TK.js → install-ECR7OLAY.js} +5 -5
  65. package/dist/{issues-5GE277R2.js → issues-K5TL2S4Z.js} +7 -7
  66. package/dist/{knobs-AMIWGYUZ.js → knobs-OKQFBQLK.js} +5 -5
  67. package/dist/{landing-3VLVVQL5.js → landing-XANIBPVM.js} +7 -7
  68. package/dist/{list-GDJR6UY6.js → list-64GX47Q4.js} +5 -5
  69. package/dist/{local-4R6GVW7U.js → local-QMQY2ZUX.js} +7 -7
  70. package/dist/{login-IXVAWTLO.js → login-I7UQ3GTM.js} +5 -5
  71. package/dist/{mcp-BM2MJWX4.js → mcp-XZV63DX5.js} +11 -11
  72. package/dist/{mcp-BM2MJWX4.js.map → mcp-XZV63DX5.js.map} +1 -1
  73. package/dist/{metrics-SSIP5CEB.js → metrics-KBTQ3KGZ.js} +5 -5
  74. package/dist/{monitor-ESZYHXT2.js → monitor-UGWY43IU.js} +5 -5
  75. package/dist/perf-CCHWHCSR.js +961 -0
  76. package/dist/perf-CCHWHCSR.js.map +1 -0
  77. package/dist/{product-VCGUV5TH.js → product-KLG2ZTHC.js} +5 -5
  78. package/dist/{product-map-AXKZNQDM.js → product-map-AMEZ76EQ.js} +5 -5
  79. package/dist/{prompts-FVPSON2N.js → prompts-ZVQNGL7X.js} +5 -5
  80. package/dist/proofs-QCNSQAPX.js +20 -0
  81. package/dist/{property-XEPCC7KQ.js → property-PJDQFHAL.js} +6 -6
  82. package/dist/{psql-JKF3OYYJ.js → psql-AURAN27C.js} +5 -5
  83. package/dist/{record-REQ37S54.js → record-SYWBTUOB.js} +6 -6
  84. package/dist/{redis-WGHT2GJB.js → redis-2H752SKO.js} +5 -5
  85. package/dist/{release-SNDIVIA6.js → release-OSIYUXSC.js} +5 -5
  86. package/dist/{runbook-XFJG2LFC.js → runbook-7LVHF6KV.js} +5 -5
  87. package/dist/{sandbox-DYCKLCMY.js → sandbox-TJQPMRGS.js} +18 -30
  88. package/dist/sandbox-TJQPMRGS.js.map +1 -0
  89. package/dist/{scenarios-PVHCKP55.js → scenarios-P2ABU4HK.js} +5 -5
  90. package/dist/{schedule-DGC7CX23.js → schedule-XLS56NP5.js} +8 -8
  91. package/dist/{session-ERGUFDDI.js → session-ACSFC3UB.js} +8 -8
  92. package/dist/{skill-6QO2E3TB.js → skill-F7I5P6AI.js} +43 -28
  93. package/dist/{skill-6QO2E3TB.js.map → skill-F7I5P6AI.js.map} +1 -1
  94. package/dist/{slack-WE7THLLH.js → slack-ZEK4GRND.js} +6 -6
  95. package/dist/{spec-SEOY7N3L.js → spec-XPIRRSV6.js} +5 -5
  96. package/dist/{src-CCK3TKBX.js → src-N7ZCYCXU.js} +4 -4
  97. package/dist/{src-AEWV5HYH.js → src-XSBBMVGW.js} +3 -3
  98. package/dist/{start-EPGLHTND.js → start-DKWLOQI6.js} +5 -5
  99. package/dist/{status-DTE2GXM2.js → status-K7KH5DI3.js} +5 -5
  100. package/dist/{tag-GIFEWGBL.js → tag-2Y3OMQQC.js} +6 -6
  101. package/dist/{task-VLJCHSFB.js → task-4PIOC4QV.js} +6 -6
  102. package/dist/{teams-J2OOJBL4.js → teams-KUM56BE2.js} +83 -47
  103. package/dist/teams-KUM56BE2.js.map +1 -0
  104. package/dist/{test-suite-CTACGIAZ.js → test-suite-SW25YGJV.js} +138 -96
  105. package/dist/test-suite-SW25YGJV.js.map +1 -0
  106. package/dist/{trace-RWQDYL4K.js → trace-QPXHYBLA.js} +7 -7
  107. package/dist/{triage-6UAXLCGU.js → triage-EZABRZZM.js} +6 -6
  108. package/dist/trigger-7C7KX5KH.js +137 -0
  109. package/dist/trigger-7C7KX5KH.js.map +1 -0
  110. package/dist/{update-check-QRREAM3N.js → update-check-E3X7UIY6.js} +3 -3
  111. package/dist/{upgrade-5Y655TQ6.js → upgrade-EJGTMW44.js} +4 -4
  112. package/dist/{usage-KCXFY46V.js → usage-GZCQDULF.js} +7 -7
  113. package/dist/{utilities-SUON2KZK.js → utilities-RIITD53A.js} +6 -6
  114. package/dist/{visual-GJZVJC32.js → visual-FH67OKS2.js} +5 -5
  115. package/dist/{workflow-R5QAXWBX.js → workflow-34YJZ2QQ.js} +38 -86
  116. package/dist/workflow-34YJZ2QQ.js.map +1 -0
  117. package/dist/{workflow-cache-PFBTWLGM.js → workflow-cache-YQ3BGJIG.js} +17 -17
  118. package/dist/{workflow-cache-convergence-resolve-UZGRPC3B.js → workflow-cache-convergence-resolve-SPLBRSNK.js} +5 -5
  119. package/dist/{workflow-debug-RACNWWOL.js → workflow-debug-HZB7TJGK.js} +10 -10
  120. package/dist/workflow-debug-HZB7TJGK.js.map +1 -0
  121. package/dist/{workflow-feedback-RJIQ5R3R.js → workflow-feedback-6UOTIWIQ.js} +5 -5
  122. package/dist/{workflow-fork-LINDCYJ3.js → workflow-fork-IDYHAHCX.js} +5 -5
  123. package/dist/workflow-promotion-U6WYFY5U.js +62 -0
  124. package/dist/workflow-promotion-U6WYFY5U.js.map +1 -0
  125. package/dist/{workflow-proposals-E4EXKAGM.js → workflow-proposals-MMVNIQT3.js} +5 -5
  126. package/dist/{workflow-revisions-5M6APN6R.js → workflow-revisions-BPUOLCZB.js} +5 -5
  127. package/dist/{workflow-status-7KL73WS2.js → workflow-status-RA3IEMEW.js} +5 -5
  128. package/package.json +3 -2
  129. package/dist/chat-target-IZ7YLLU3.js +0 -502
  130. package/dist/chat-target-IZ7YLLU3.js.map +0 -1
  131. package/dist/chunk-76Z6E7XX.js.map +0 -1
  132. package/dist/chunk-EUVB6Y3C.js.map +0 -1
  133. package/dist/chunk-LL6TSQWV.js.map +0 -1
  134. package/dist/chunk-QTYUM4ZB.js.map +0 -1
  135. package/dist/chunk-ROX7N3RK.js.map +0 -1
  136. package/dist/chunk-UEJ2HTKU.js.map +0 -1
  137. package/dist/proofs-TXJGAP5F.js.map +0 -1
  138. package/dist/sandbox-DYCKLCMY.js.map +0 -1
  139. package/dist/teams-J2OOJBL4.js.map +0 -1
  140. package/dist/test-suite-CTACGIAZ.js.map +0 -1
  141. package/dist/workflow-R5QAXWBX.js.map +0 -1
  142. /package/dist/{account-3ZG24MOE.js.map → account-MRZ54P5P.js.map} +0 -0
  143. /package/dist/{alert-5G7PTAX2.js.map → alert-XBHELHEI.js.map} +0 -0
  144. /package/dist/{api-catalog-IBYAFKKQ.js.map → api-catalog-GWYRX53L.js.map} +0 -0
  145. /package/dist/{api-key-UXC44BDR.js.map → api-key-FH6JN447.js.map} +0 -0
  146. /package/dist/{attachment-T6IRFQW3.js.map → attachment-J7GRVT5F.js.map} +0 -0
  147. /package/dist/{auth-SHOCJE6Z.js.map → auth-VZZQXRDR.js.map} +0 -0
  148. /package/dist/{benchmark-NJ2U6VTC.js.map → benchmark-A3SNDARF.js.map} +0 -0
  149. /package/dist/{blackcat-RQJVFGXQ.js.map → blackcat-UM6TBQBN.js.map} +0 -0
  150. /package/dist/{chunk-M752EUK3.js.map → chunk-3JU4UYYN.js.map} +0 -0
  151. /package/dist/{chunk-G6BCST3G.js.map → chunk-3ZOUNCA5.js.map} +0 -0
  152. /package/dist/{chunk-ABT3BLRC.js.map → chunk-5TKXHS3X.js.map} +0 -0
  153. /package/dist/{chunk-QCYSONXI.js.map → chunk-CRYHWO4M.js.map} +0 -0
  154. /package/dist/{chunk-I5RHTCPY.js.map → chunk-EL6KJ4PO.js.map} +0 -0
  155. /package/dist/{chunk-ZL4O6C42.js.map → chunk-HXBK3AGD.js.map} +0 -0
  156. /package/dist/{chunk-PRERH4DN.js.map → chunk-I2SOHQ2C.js.map} +0 -0
  157. /package/dist/{chunk-CYSPCGO6.js.map → chunk-JEHHEMUL.js.map} +0 -0
  158. /package/dist/{chunk-LIEADTEF.js.map → chunk-LJFVRJCA.js.map} +0 -0
  159. /package/dist/{chunk-PHNH3CEU.js.map → chunk-O4Z44BR7.js.map} +0 -0
  160. /package/dist/{chunk-QA37WVF6.js.map → chunk-OQFCZERZ.js.map} +0 -0
  161. /package/dist/{chunk-Z3MDQSZG.js.map → chunk-PJFFGQSB.js.map} +0 -0
  162. /package/dist/{chunk-IY3ZK46I.js.map → chunk-QOVJUSSL.js.map} +0 -0
  163. /package/dist/{chunk-RPJMQBB5.js.map → chunk-QXU4G4YN.js.map} +0 -0
  164. /package/dist/{chunk-SZSTJIYU.js.map → chunk-RRSUKARV.js.map} +0 -0
  165. /package/dist/{chunk-775FI436.js.map → chunk-RVD6J6IZ.js.map} +0 -0
  166. /package/dist/{chunk-5UUIBY6E.js.map → chunk-TAVBFLCR.js.map} +0 -0
  167. /package/dist/{chunk-3HI6QC4V.js.map → chunk-WRBU6TX7.js.map} +0 -0
  168. /package/dist/{chunk-BF3IPGMP.js.map → chunk-XSSZMG65.js.map} +0 -0
  169. /package/dist/{credential-TWSWV64F.js.map → credential-4RFRU6OH.js.map} +0 -0
  170. /package/dist/{credential-template-XO5D5AI3.js.map → credential-template-36PFUTBN.js.map} +0 -0
  171. /package/dist/{digest-SLEFOLPV.js.map → digest-THMKFMP7.js.map} +0 -0
  172. /package/dist/{docs-IDC4V4WQ.js.map → docs-ZGM53L67.js.map} +0 -0
  173. /package/dist/{doctor-SDAYEA6C.js.map → doctor-Z2XBGBM3.js.map} +0 -0
  174. /package/dist/{environment-VBUIBQ6O.js.map → environment-5YVZXBN7.js.map} +0 -0
  175. /package/dist/{exploration-IREIR5PO.js.map → exploration-GZ4WUJJH.js.map} +0 -0
  176. /package/dist/{exploratory-test-4Q7BMEFT.js.map → exploratory-test-Y7P4ZDLD.js.map} +0 -0
  177. /package/dist/{external-run-S7LULKPT.js.map → external-run-IJGGZOGI.js.map} +0 -0
  178. /package/dist/{feature-flag-IASHTUGU.js.map → feature-flag-UH6Z7774.js.map} +0 -0
  179. /package/dist/{flow-IBEZFZTU.js.map → flow-MRWAQYZZ.js.map} +0 -0
  180. /package/dist/{github-HAEZRULP.js.map → github-VDJU3PU3.js.map} +0 -0
  181. /package/dist/{init-LT2TZMQY.js.map → init-CROSTPA6.js.map} +0 -0
  182. /package/dist/{install-RTEYH6TK.js.map → install-ECR7OLAY.js.map} +0 -0
  183. /package/dist/{issues-5GE277R2.js.map → issues-K5TL2S4Z.js.map} +0 -0
  184. /package/dist/{knobs-AMIWGYUZ.js.map → knobs-OKQFBQLK.js.map} +0 -0
  185. /package/dist/{landing-3VLVVQL5.js.map → landing-XANIBPVM.js.map} +0 -0
  186. /package/dist/{list-GDJR6UY6.js.map → list-64GX47Q4.js.map} +0 -0
  187. /package/dist/{local-4R6GVW7U.js.map → local-QMQY2ZUX.js.map} +0 -0
  188. /package/dist/{login-IXVAWTLO.js.map → login-I7UQ3GTM.js.map} +0 -0
  189. /package/dist/{metrics-SSIP5CEB.js.map → metrics-KBTQ3KGZ.js.map} +0 -0
  190. /package/dist/{monitor-ESZYHXT2.js.map → monitor-UGWY43IU.js.map} +0 -0
  191. /package/dist/{product-VCGUV5TH.js.map → product-KLG2ZTHC.js.map} +0 -0
  192. /package/dist/{product-map-AXKZNQDM.js.map → product-map-AMEZ76EQ.js.map} +0 -0
  193. /package/dist/{prompts-FVPSON2N.js.map → prompts-ZVQNGL7X.js.map} +0 -0
  194. /package/dist/{src-AEWV5HYH.js.map → proofs-QCNSQAPX.js.map} +0 -0
  195. /package/dist/{property-XEPCC7KQ.js.map → property-PJDQFHAL.js.map} +0 -0
  196. /package/dist/{psql-JKF3OYYJ.js.map → psql-AURAN27C.js.map} +0 -0
  197. /package/dist/{record-REQ37S54.js.map → record-SYWBTUOB.js.map} +0 -0
  198. /package/dist/{redis-WGHT2GJB.js.map → redis-2H752SKO.js.map} +0 -0
  199. /package/dist/{release-SNDIVIA6.js.map → release-OSIYUXSC.js.map} +0 -0
  200. /package/dist/{runbook-XFJG2LFC.js.map → runbook-7LVHF6KV.js.map} +0 -0
  201. /package/dist/{scenarios-PVHCKP55.js.map → scenarios-P2ABU4HK.js.map} +0 -0
  202. /package/dist/{schedule-DGC7CX23.js.map → schedule-XLS56NP5.js.map} +0 -0
  203. /package/dist/{session-ERGUFDDI.js.map → session-ACSFC3UB.js.map} +0 -0
  204. /package/dist/{slack-WE7THLLH.js.map → slack-ZEK4GRND.js.map} +0 -0
  205. /package/dist/{spec-SEOY7N3L.js.map → spec-XPIRRSV6.js.map} +0 -0
  206. /package/dist/{src-CCK3TKBX.js.map → src-N7ZCYCXU.js.map} +0 -0
  207. /package/dist/{tag-GIFEWGBL.js.map → src-XSBBMVGW.js.map} +0 -0
  208. /package/dist/{start-EPGLHTND.js.map → start-DKWLOQI6.js.map} +0 -0
  209. /package/dist/{status-DTE2GXM2.js.map → status-K7KH5DI3.js.map} +0 -0
  210. /package/dist/{trace-RWQDYL4K.js.map → tag-2Y3OMQQC.js.map} +0 -0
  211. /package/dist/{task-VLJCHSFB.js.map → task-4PIOC4QV.js.map} +0 -0
  212. /package/dist/{triage-6UAXLCGU.js.map → trace-QPXHYBLA.js.map} +0 -0
  213. /package/dist/{update-check-QRREAM3N.js.map → triage-EZABRZZM.js.map} +0 -0
  214. /package/dist/{upgrade-5Y655TQ6.js.map → update-check-E3X7UIY6.js.map} +0 -0
  215. /package/dist/{utilities-SUON2KZK.js.map → upgrade-EJGTMW44.js.map} +0 -0
  216. /package/dist/{usage-KCXFY46V.js.map → usage-GZCQDULF.js.map} +0 -0
  217. /package/dist/{workflow-debug-RACNWWOL.js.map → utilities-RIITD53A.js.map} +0 -0
  218. /package/dist/{visual-GJZVJC32.js.map → visual-FH67OKS2.js.map} +0 -0
  219. /package/dist/{workflow-cache-PFBTWLGM.js.map → workflow-cache-YQ3BGJIG.js.map} +0 -0
  220. /package/dist/{workflow-cache-convergence-resolve-UZGRPC3B.js.map → workflow-cache-convergence-resolve-SPLBRSNK.js.map} +0 -0
  221. /package/dist/{workflow-feedback-RJIQ5R3R.js.map → workflow-feedback-6UOTIWIQ.js.map} +0 -0
  222. /package/dist/{workflow-fork-LINDCYJ3.js.map → workflow-fork-IDYHAHCX.js.map} +0 -0
  223. /package/dist/{workflow-proposals-E4EXKAGM.js.map → workflow-proposals-MMVNIQT3.js.map} +0 -0
  224. /package/dist/{workflow-revisions-5M6APN6R.js.map → workflow-revisions-BPUOLCZB.js.map} +0 -0
  225. /package/dist/{workflow-status-7KL73WS2.js.map → workflow-status-RA3IEMEW.js.map} +0 -0
@@ -2,12 +2,12 @@ import { createRequire as __cr } from "module"; import { fileURLToPath as __fup
2
2
  import {
3
3
  installCommandLine,
4
4
  runUpgrade
5
- } from "./chunk-PRERH4DN.js";
6
- import "./chunk-QCYSONXI.js";
7
- import "./chunk-UEJ2HTKU.js";
5
+ } from "./chunk-I2SOHQ2C.js";
6
+ import "./chunk-CRYHWO4M.js";
7
+ import "./chunk-MJVUMVLO.js";
8
8
  import "./chunk-TOWZAG3I.js";
9
9
  export {
10
10
  installCommandLine,
11
11
  runUpgrade
12
12
  };
13
- //# sourceMappingURL=upgrade-5Y655TQ6.js.map
13
+ //# sourceMappingURL=upgrade-EJGTMW44.js.map
@@ -1,21 +1,21 @@
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
  parseSinceFlag
4
- } from "./chunk-M752EUK3.js";
5
- import "./chunk-ROX7N3RK.js";
4
+ } from "./chunk-3JU4UYYN.js";
5
+ import "./chunk-V7HB5LAU.js";
6
6
  import {
7
7
  apiRequest
8
- } from "./chunk-LL6TSQWV.js";
8
+ } from "./chunk-VKZOHJCE.js";
9
9
  import "./chunk-S3Q7MDCS.js";
10
- import "./chunk-76Z6E7XX.js";
10
+ import "./chunk-4UZN6TVT.js";
11
11
  import {
12
12
  getArgValue,
13
13
  hasFlag,
14
14
  resolveConfig
15
- } from "./chunk-3HI6QC4V.js";
15
+ } from "./chunk-WRBU6TX7.js";
16
16
  import {
17
17
  writeRawOutput
18
- } from "./chunk-UEJ2HTKU.js";
18
+ } from "./chunk-MJVUMVLO.js";
19
19
  import "./chunk-TOWZAG3I.js";
20
20
 
21
21
  // src/usage.ts
@@ -126,4 +126,4 @@ export {
126
126
  formatUsageSummary,
127
127
  runUsage
128
128
  };
129
- //# sourceMappingURL=usage-KCXFY46V.js.map
129
+ //# sourceMappingURL=usage-GZCQDULF.js.map
@@ -2,15 +2,15 @@ import { createRequire as __cr } from "module"; import { fileURLToPath as __fup
2
2
  import {
3
3
  parseDurationSeconds,
4
4
  runUtilities
5
- } from "./chunk-BF3IPGMP.js";
6
- import "./chunk-LL6TSQWV.js";
5
+ } from "./chunk-XSSZMG65.js";
6
+ import "./chunk-VKZOHJCE.js";
7
7
  import "./chunk-S3Q7MDCS.js";
8
- import "./chunk-76Z6E7XX.js";
9
- import "./chunk-3HI6QC4V.js";
10
- import "./chunk-UEJ2HTKU.js";
8
+ import "./chunk-4UZN6TVT.js";
9
+ import "./chunk-WRBU6TX7.js";
10
+ import "./chunk-MJVUMVLO.js";
11
11
  import "./chunk-TOWZAG3I.js";
12
12
  export {
13
13
  parseDurationSeconds,
14
14
  runUtilities
15
15
  };
16
- //# sourceMappingURL=utilities-SUON2KZK.js.map
16
+ //# sourceMappingURL=utilities-RIITD53A.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-LL6TSQWV.js";
4
+ } from "./chunk-VKZOHJCE.js";
5
5
  import "./chunk-S3Q7MDCS.js";
6
6
  import {
7
7
  VISUAL_CHECKPOINT_STATUSES
8
- } from "./chunk-76Z6E7XX.js";
8
+ } from "./chunk-4UZN6TVT.js";
9
9
  import {
10
10
  getArgValue,
11
11
  hasFlag,
12
12
  resolveConfig
13
- } from "./chunk-3HI6QC4V.js";
14
- import "./chunk-UEJ2HTKU.js";
13
+ } from "./chunk-WRBU6TX7.js";
14
+ import "./chunk-MJVUMVLO.js";
15
15
  import "./chunk-TOWZAG3I.js";
16
16
 
17
17
  // src/visual.ts
@@ -104,4 +104,4 @@ async function runVisual(argv) {
104
104
  export {
105
105
  runVisual
106
106
  };
107
- //# sourceMappingURL=visual-GJZVJC32.js.map
107
+ //# sourceMappingURL=visual-FH67OKS2.js.map
@@ -10,25 +10,25 @@ import {
10
10
  } from "./chunk-2TIRL6ZK.js";
11
11
  import {
12
12
  resolveWorkflowIdForRun
13
- } from "./chunk-G6BCST3G.js";
14
- import "./chunk-Z3MDQSZG.js";
15
- import "./chunk-PHNH3CEU.js";
16
- import {
17
- resolveApplicationId
18
- } from "./chunk-CYSPCGO6.js";
19
- import "./chunk-775FI436.js";
13
+ } from "./chunk-3ZOUNCA5.js";
14
+ import "./chunk-PJFFGQSB.js";
20
15
  import {
21
16
  applyWorkflowTagFlags
22
- } from "./chunk-I5RHTCPY.js";
17
+ } from "./chunk-EL6KJ4PO.js";
18
+ import "./chunk-O4Z44BR7.js";
19
+ import {
20
+ resolveApplicationId
21
+ } from "./chunk-JEHHEMUL.js";
22
+ import "./chunk-RVD6J6IZ.js";
23
23
  import {
24
24
  workflowToSpec
25
- } from "./chunk-ZL4O6C42.js";
25
+ } from "./chunk-HXBK3AGD.js";
26
26
  import {
27
27
  alignSnapshotNodeIds,
28
28
  topoOrderNodes
29
29
  } from "./chunk-DEK6B6LX.js";
30
- import "./chunk-IY3ZK46I.js";
31
- import "./chunk-ABT3BLRC.js";
30
+ import "./chunk-QOVJUSSL.js";
31
+ import "./chunk-5TKXHS3X.js";
32
32
  import {
33
33
  apiRequest,
34
34
  fetchWorkflowEnvironments,
@@ -37,7 +37,7 @@ import {
37
37
  renderWorkflowUserError,
38
38
  resolveEnvironmentByNameOrId,
39
39
  stripOneTrailingNewline
40
- } from "./chunk-LL6TSQWV.js";
40
+ } from "./chunk-VKZOHJCE.js";
41
41
  import "./chunk-S3Q7MDCS.js";
42
42
  import {
43
43
  NODE_TYPE_LABEL,
@@ -47,7 +47,7 @@ import {
47
47
  isBrowserViewportPreset,
48
48
  isWorkflowFlowType,
49
49
  normalizeNodeType
50
- } from "./chunk-76Z6E7XX.js";
50
+ } from "./chunk-4UZN6TVT.js";
51
51
  import {
52
52
  apiFetch,
53
53
  exitOnFailure,
@@ -56,12 +56,12 @@ import {
56
56
  hasFlag,
57
57
  resolveConfig,
58
58
  resolveOrgAppUrl
59
- } from "./chunk-3HI6QC4V.js";
59
+ } from "./chunk-WRBU6TX7.js";
60
60
  import {
61
61
  printGuide,
62
62
  specExtension,
63
63
  writeRawOutput
64
- } from "./chunk-UEJ2HTKU.js";
64
+ } from "./chunk-MJVUMVLO.js";
65
65
  import "./chunk-AK7WEGGB.js";
66
66
  import "./chunk-NQ7LMSSS.js";
67
67
  import "./chunk-5QHORHJT.js";
@@ -2289,7 +2289,7 @@ function printSeedCreateHelp() {
2289
2289
  }
2290
2290
 
2291
2291
  // ../content/src/workflow-guide/overview.txt
2292
- var overview_default = "Workflows are visual test sequences that model user journeys through your application. Each workflow is a directed graph of nodes \u2014 login, navigate, action, assertion, wait, condition, seed, and more \u2014 connected to form a testable path.\n\nWhen to use workflows:\n\n- Critical paths: signup, checkout, billing, onboarding\n- High-risk areas: features that regress often or have complex logic\n- Multi-step journeys: flows spanning multiple pages or user roles\n\nFor visual regression coverage, add one Visual checkpoint for each meaningful\nstate. Seed the state in Sandboxes v2 before capturing it. See\n`cofactor workflow guide visual-checkpoints` for native and Playwright examples.\n\nFLOW TYPES\n\n standard The default. Models a single user journey end-to-end.\n Login \u2192 Navigate \u2192 Actions \u2192 Assertions \u2192 Cleanup.\n\n setup Deprecated. Formerly a prerequisite workflow referenced by a\n setup node; use a seed workflow for shared data and suite\n layers for ordering instead.\n\n seed A data-seeding workflow that generates test data and exports\n variables for downstream workflows. Seed outputs are declared\n in the workflow definition and available as $var.{dataKey}\n in any workflow that references the seed.\n\n teardown A cleanup workflow that runs after a seed workflow completes.\n Automatically invoked to remove data the seed created.\n\n eval A chat eval: one chat_scenario node holding a scripted\n conversation against a chat target, each reply graded by an\n LLM judge. Runs browserless. See the CHAT SCENARIO node type.\n\nEXECUTION MODEL\n\n 1. Login node provisions an authenticated browser session\n 2. Nodes execute in sequence (or branch at condition nodes)\n 3. Each action node interacts with the live application\n 4. Assertions verify expected outcomes\n 5. Additional login nodes switch to a different user \u2014 each starts a\n new segment with a fresh session (great for multi-role testing)\n 6. Wait nodes pause execution (minutes, hours, days) \u2014 also creating\n segments. After a wait, a login re-establishes the session.\n 7. On completion, the run is marked success or failure\n\nVERSION HISTORY\n\n Workflows maintain version history. Publishing creates a versioned\n snapshot. Previous versions can be previewed or restored to draft.\n Seed nodes reference a specific published version of the seed workflow.\n";
2292
+ var overview_default = "Workflows are visual test sequences that model user journeys through your application. Each workflow is a directed graph of nodes \u2014 login, navigate, action, assertion, wait, condition, seed, and more \u2014 connected to form a testable path.\n\nWhen to use workflows:\n\n- Critical paths: signup, checkout, billing, onboarding\n- High-risk areas: features that regress often or have complex logic\n- Multi-step journeys: flows spanning multiple pages or user roles\n\nFor visual regression coverage, add one Visual checkpoint for each meaningful\nstate. Seed the state in Sandboxes v2 before capturing it. See\n`cofactor workflow guide visual-checkpoints` for native and Playwright examples.\n\nFLOW TYPES\n\n standard The default. Models a single user journey end-to-end.\n Login \u2192 Navigate \u2192 Actions \u2192 Assertions \u2192 Cleanup.\n\n setup Deprecated. Formerly a prerequisite workflow referenced by a\n setup node; use a seed workflow for shared data and suite\n layers for ordering instead.\n\n seed A data-seeding workflow that generates test data and exports\n variables for downstream workflows. Seed outputs are declared\n in the workflow definition and available as $var.{dataKey}\n in any workflow that references the seed.\n\n teardown A cleanup workflow that runs after a seed workflow completes.\n Automatically invoked to remove data the seed created.\n\nEXECUTION MODEL\n\n 1. Login node provisions an authenticated browser session\n 2. Nodes execute in sequence (or branch at condition nodes)\n 3. Each action node interacts with the live application\n 4. Assertions verify expected outcomes\n 5. Additional login nodes switch to a different user \u2014 each starts a\n new segment with a fresh session (great for multi-role testing)\n 6. Wait nodes pause execution (minutes, hours, days) \u2014 also creating\n segments. After a wait, a login re-establishes the session.\n 7. On completion, the run is marked success or failure\n\nVERSION HISTORY\n\n Workflows maintain version history. Publishing creates a versioned\n snapshot. Previous versions can be previewed or restored to draft.\n Seed nodes reference a specific published version of the seed workflow.\n";
2293
2293
 
2294
2294
  // ../content/src/workflow-guide/node-types.txt
2295
2295
  var node_types_default = `Every workflow is built from nodes. Each node has a type, a title, a description,
@@ -2570,53 +2570,6 @@ MCP
2570
2570
  (set alwaysUseAgent in config to skip replay). Requires the mcp.testing
2571
2571
  feature flag for the organization.
2572
2572
 
2573
- CHAT SCENARIO
2574
- Runs a scripted conversation against a chat target \u2014 a saved description
2575
- of how to talk to an AI chat \u2014 and grades each reply with an LLM judge.
2576
- No browser involved. This is the node a chat eval is built around: a flow
2577
- of flowType "eval" holds the conversation in one chat_scenario node, and
2578
- may chain other nodes either side of it \u2014 an api_sequence before it to
2579
- establish ground truth a rubric compares against, a call_flow after it to
2580
- have a browser flow verify what the assistant claims it did.
2581
-
2582
- When to use: the thing under test is what an assistant SAYS. It suits
2583
- binary invariants ("declines a cross-org request", "says a capability is
2584
- unavailable rather than inventing data"), not scoring or benchmarking.
2585
-
2586
- Each turn sends one user message and judges the reply against that turn's
2587
- assertions plus every global invariant declared on the chat target \u2014 one
2588
- batched judge call per reply. An assertion is a plain-language rubric and
2589
- the verdict is binary; severity decides whether a failure fails the step
2590
- ("fail") or only warns ("warn").
2591
-
2592
- Config:
2593
- chatTargetId Chat target to talk to (required). Manage targets under
2594
- Test Data -> Applications -> <app> -> Chat.
2595
- turns Ordered list, at least one. Each turn is
2596
- { id, message, assertions: [{ id, rubric, severity }] }.
2597
-
2598
- Messages AND rubrics interpolate $var.{name}, so an upstream api_sequence
2599
- node can establish ground truth and a rubric can compare against it \u2014
2600
- "Reports a status matching $var.expected_status". Rubrics resolve against
2601
- non-credential variables only, so $var.credential.* can never reach the
2602
- judge. A rubric still holding an unresolved $var after expansion is
2603
- withheld from the judge and recorded as a failure naming the missing
2604
- variable, rather than being graded as literal template text.
2605
-
2606
- One asymmetry: a message is expanded on the way OUT, but the transcript
2607
- and the judge see it as authored \u2014 a bubble can read "\u2026order
2608
- $var.order_id" though the target got the value. The judge grades the
2609
- RESPONSE, so this is usually cosmetic; when a rubric compares the reply
2610
- against the message, put the $var in the rubric too.
2611
-
2612
- Chat scenarios are start-node eligible and run browserless, like mcp and
2613
- api_sequence, so a [chat_scenario, call_flow] flow boots no browser of its
2614
- own while the called child still drives a real one.
2615
-
2616
- The evals feature flag gates chat targets \u2014 creating, listing and editing
2617
- them \u2014 so in practice an org needs it before a chat scenario has anything
2618
- to point at.
2619
-
2620
2573
  CALL FLOW
2621
2574
  Runs another flow from inside this one, passing arguments in and getting
2622
2575
  that flow's declared outputs back as variables. The child executes as its
@@ -2626,7 +2579,7 @@ CALL FLOW
2626
2579
  When to use: a check you want to reuse. Unlike seed nodes \u2014
2627
2580
  which are hoisted out of the chain and run before everything else \u2014 a
2628
2581
  call_flow node runs exactly where you put it, which is what makes it
2629
- usable AFTER a chat_scenario or an action node.
2582
+ usable after an action node.
2630
2583
 
2631
2584
  The flow picker in the designer lists only approved-and-promoted (or
2632
2585
  eligible) flows, so a draft is not offered \u2014 but that is a picker filter,
@@ -2678,7 +2631,7 @@ END
2678
2631
  should stop execution rather than continue.`;
2679
2632
 
2680
2633
  // ../content/src/workflow-guide/spec-grammar.txt
2681
- var spec_grammar_default = 'This is the exact syntax of a `.cofactor.md` spec file \u2014 what the parser actually matches, not\na loose description. A spec that reads as good prose but drifts from this grammar does NOT\nerror at parse time in most cases: the parser drops the line/bullet it can\'t match and reports\nonly a warn-severity issue. A spec can validate as "ok" while silently missing content the\nauthor wrote. When in doubt, match the grammar below character-for-character rather than\nwriting what merely reads naturally.\n\nFRONTMATTER\n\n A `---`-fenced YAML block, first thing in the file:\n\n ---\n name: Org onboarding \u2014 invite a member\n workflowId: <uuid> # present only once compiled; NEVER remove or edit it by hand\n status: draft # draft | approved\n flowType: standard # standard | seed | teardown | eval (setup is deprecated)\n actor: admin # persona name (or "persona <role>"), "credential <name>"\n # for one fixed account, or "seed-output <dataKey>" for a\n # seed\'s credential output \u2014 see ACTOR FORMS below\n authenticated: true\n tags: [smoke, p0]\n requirementRef: LIN-4421\n ---\n\n `workflowId` binds the file to a live workflow: present \u2192 `spec_compile` diffs/updates that\n workflow; absent \u2192 `spec_compile` creates a new one. If it\'s present, treat it as immutable \u2014\n removing it turns your next compile into a duplicate-creating CREATE instead of an UPDATE.\n\nSECTION HEADINGS (H2, in this order)\n\n ## Spirit \u2014 one blockquote paragraph: the user-visible promise this flow proves.\n Becomes the workflow\'s description, so it carries no capability codes,\n preconditions, issue ids, status, step narration or raw IDs.\n ## Preflight \u2014 plain prose or bullets: non-seedable preconditions the environment must\n already satisfy, including pre-existing data the test reads but does not\n own, and external systems (flags, payments, third parties) it relies on.\n Becomes the workflow\'s preflight field. Name things, never IDs.\n ## Cleanup \u2014 plain prose or bullets: how the run\'s side effects get reset. Becomes\n the workflow\'s cleanup field.\n ## Inputs \u2014 bullets: `- <name>: <defaultValue>` or `- credential <name>: <value>`.\n ## Declared Outputs \u2014 seed flows only: `- <dataKey>` bullets with optional indented\n `- label:` / `- property:` / `- description:` sub-bullets. A\n credentialOutput block is NOT authorable here \u2014 it is preserved from\n the live seed (rendered as an HTML comment on pull) and set via the\n Flow Designer or `workflow seed create --from-file` / `workflow patch\n --seed-outputs-file` (see `workflow guide seed-users`).\n ## Scenarios \u2014 H3 sub-blocks per scenario: `### <Name> *(default)*` or `*(skip: <reason>)*`,\n with `- values: {...}` / `- credentials: {...}` YAML underneath.\n ## Journey \u2014 the linear sequence of nodes described below. Required \u2014 a spec with no\n Journey nodes fails to parse.\n\nJOURNEY LEAD-INS\n\n Every Journey line is either a bold lead-in (`**...**`) or a blockquote/bullet attached to\n the preceding lead-in. Blank lines between a lead-in, its description, and its bullets are\n fine \u2014 the parser skips them.\n\n **Navigate to** /path/here\n **Action \u2014 Fill out the signup form**\n **Assert** the confirmation toast is visible\n **Wait** 30s (also accepts 5m, 2h)\n **End** (add "fail" anywhere in the line for a failing End)\n **Seed** seed-workflow-name\n **Setup** setup-workflow-name (deprecated \u2014 still parses; author **Seed** instead)\n **Switch role to** admin (or **Switch role to admin** \u2014 both forms work)\n **Sandbox action \u2014 provision-org**\n **Api sequence \u2014 Create via API**\n **Visual checkpoint \u2014 Invoice list after seeding**\n **If** $var.status is "blocked"\n **Then:**\n <nested nodes, indented 2 spaces>\n **Else:**\n <nested nodes, indented 2 spaces>\n\n CRITICAL: for `Action`, `Sandbox action`, and `Api sequence`, the title goes AFTER an em-dash\n (`\u2014`) or hyphen INSIDE the bold span: `**Action \u2014 Title**`. Writing `**Action** Title` (title\n outside the bold) used to silently lose the title; it is now tolerated as a fallback, but the\n em-dash-inside-bold form is canonical \u2014 use it. Do not invent a form for a lead-in not listed\n above (e.g. there is no `**Click**` or `**Type**` lead-in) \u2014 express it as an Action instead.\n\nACTOR FORMS (frontmatter `actor:` and `**Switch role to** <ref>` take the same forms)\n\n actor: Admin persona named "Admin" (default form)\n actor: persona Admin same, explicit\n actor: credential admin-bob one specific stored credential by name\n actor: seed-output new_user the credential output `new_user` of a **Seed** node\n earlier in the Journey (credentialSource: from_seed)\n\n `template <name>` is a legacy alias for `persona <name>`. `seed-output` binds to the\n nearest **Seed** node that precedes the login, so the Seed must come first in the\n Journey (for `actor:`, as the leading node); compile fails if no Seed precedes it.\n\nDESCRIPTION (optional, any lead-in)\n\n A blockquote line immediately after the lead-in (or after a blank line) becomes the node\'s\n description \u2014 free prose is fine and expected here:\n\n **Action \u2014 Create the org**\n > Fill the org form with orgName and plan, then submit.\n - field name: $orgName\n\nACTION BULLET GRAMMAR (exact \u2014 only these forms parse; everything else is DROPPED)\n\n - field <name> [(type)]: <value> e.g. - field plan (select): $plan\n - capture: <name> e.g. - capture: createdOrgId\n - assert (warn|fail|fatal[, agentic]): <condition>\n e.g. - assert (fail): URL ends with `/dashboard`\n e.g. - assert (warn, agentic): chart looks right\n - alwaysUseAgent: true\n - captureAudio: true\n - captureLabel: <label>\n - captureExtraMs: <number>\n\n A standalone `**Assert**` node takes its own kv option bullet the same way:\n\n - severity: warn|fail|fatal (assert nodes only; NOT `- severity: warn \u2014 text`,\n which is an unparseable kv bullet, not an assert)\n\n `Seed`/`Setup` bullets: `- version: latest`, `- mode: ...`, `- onFailure: block|warn`,\n `- input.<name>: <value>`. `Sandbox action` bullets: `- label: ...`, `- outputs: a, b`,\n `- param.<name>: <value>`. `Visual checkpoint` bullets: `- target: <plain-English element>`,\n `- expected: <visible expected state>`, and `- severity: record|fail`.\n\nCOMPLETE MINIMAL EXAMPLE\n\n ---\n name: Login smoke\n actor: admin\n authenticated: true\n requirementRef: LIN-101\n ---\n\n ## Spirit\n > A returning admin can sign in and reach the dashboard.\n\n ## Inputs\n - adminEmail: $EMAIL()\n\n ## Journey\n\n **Navigate to** `/login`.\n\n **Action \u2014 Sign in**\n > Enter email and password, submit.\n - field email: $adminEmail\n - field password: $CREDENTIAL\n - assert (fail): URL ends with `/dashboard`\n\n **End**.\n\nCOMMON MISTAKES (each of these compiles into an empty or half-empty node \u2014 no parse error)\n\n - A free-text bullet ("- Should reach the dashboard eventually") is not `field`/`capture`/\n `assert (...)`/a known kv key \u2014 it is DROPPED. Put prose in the `>` description instead of\n inventing a bullet shape.\n - `- severity: warn \u2014 should show a toast` is a kv bullet with key `severity`; it is not a\n recognized action option, so it is DROPPED. Use `- assert (warn): should show a toast`.\n - `**Action** Do the thing` (title outside the bold) is tolerated but non-canonical \u2014 prefer\n `**Action \u2014 Do the thing**`.\n - Any Journey line that doesn\'t start with a recognized bold lead-in is DROPPED with only a\n warn-severity "Unexpected line in Journey" issue \u2014 it will not error your compile.\n - After authoring or editing a spec, always run `spec_validate` and inspect its\n `droppedContent` field. Non-empty `droppedContent` means real content is about to be lost \u2014\n treat it as a blocking error, not a warning, even though its underlying severity is `warn`.\n';
2634
+ var spec_grammar_default = 'This is the exact syntax of a `.cofactor.md` spec file \u2014 what the parser actually matches, not\na loose description. A spec that reads as good prose but drifts from this grammar does NOT\nerror at parse time in most cases: the parser drops the line/bullet it can\'t match and reports\nonly a warn-severity issue. A spec can validate as "ok" while silently missing content the\nauthor wrote. When in doubt, match the grammar below character-for-character rather than\nwriting what merely reads naturally.\n\nFRONTMATTER\n\n A `---`-fenced YAML block, first thing in the file:\n\n ---\n name: Org onboarding \u2014 invite a member\n workflowId: <uuid> # present only once compiled; NEVER remove or edit it by hand\n status: draft # draft | approved\n flowType: standard # standard | seed | teardown (setup is deprecated)\n actor: admin # persona name (or "persona <role>"), "credential <name>"\n # for one fixed account, or "seed-output <dataKey>" for a\n # seed\'s credential output \u2014 see ACTOR FORMS below\n authenticated: true\n tags: [smoke, p0]\n requirementRef: LIN-4421\n ---\n\n `workflowId` binds the file to a live workflow: present \u2192 `spec_compile` diffs/updates that\n workflow; absent \u2192 `spec_compile` creates a new one. If it\'s present, treat it as immutable \u2014\n removing it turns your next compile into a duplicate-creating CREATE instead of an UPDATE.\n\nSECTION HEADINGS (H2, in this order)\n\n ## Spirit \u2014 one blockquote paragraph: the user-visible promise this flow proves.\n Becomes the workflow\'s description, so it carries no capability codes,\n preconditions, issue ids, status, step narration or raw IDs.\n ## Preflight \u2014 plain prose or bullets: non-seedable preconditions the environment must\n already satisfy, including pre-existing data the test reads but does not\n own, and external systems (flags, payments, third parties) it relies on.\n Becomes the workflow\'s preflight field. Name things, never IDs.\n ## Cleanup \u2014 plain prose or bullets: how the run\'s side effects get reset. Becomes\n the workflow\'s cleanup field.\n ## Inputs \u2014 bullets: `- <name>: <defaultValue>` or `- credential <name>: <value>`.\n ## Declared Outputs \u2014 seed flows only: `- <dataKey>` bullets with optional indented\n `- label:` / `- property:` / `- description:` sub-bullets. A\n credentialOutput block is NOT authorable here \u2014 it is preserved from\n the live seed (rendered as an HTML comment on pull) and set via the\n Flow Designer or `workflow seed create --from-file` / `workflow patch\n --seed-outputs-file` (see `workflow guide seed-users`).\n ## Scenarios \u2014 H3 sub-blocks per scenario: `### <Name> *(default)*` or `*(skip: <reason>)*`,\n with `- values: {...}` / `- credentials: {...}` YAML underneath.\n ## Journey \u2014 the linear sequence of nodes described below. Required \u2014 a spec with no\n Journey nodes fails to parse.\n\nJOURNEY LEAD-INS\n\n Every Journey line is either a bold lead-in (`**...**`) or a blockquote/bullet attached to\n the preceding lead-in. Blank lines between a lead-in, its description, and its bullets are\n fine \u2014 the parser skips them.\n\n **Navigate to** /path/here\n **Action \u2014 Fill out the signup form**\n **Assert** the confirmation toast is visible\n **Wait** 30s (also accepts 5m, 2h)\n **End** (add "fail" anywhere in the line for a failing End)\n **Seed** seed-workflow-name\n **Setup** setup-workflow-name (deprecated \u2014 still parses; author **Seed** instead)\n **Switch role to** admin (or **Switch role to admin** \u2014 both forms work)\n **Sandbox action \u2014 provision-org**\n **Api sequence \u2014 Create via API**\n **Visual checkpoint \u2014 Invoice list after seeding**\n **If** $var.status is "blocked"\n **Then:**\n <nested nodes, indented 2 spaces>\n **Else:**\n <nested nodes, indented 2 spaces>\n\n CRITICAL: for `Action`, `Sandbox action`, and `Api sequence`, the title goes AFTER an em-dash\n (`\u2014`) or hyphen INSIDE the bold span: `**Action \u2014 Title**`. Writing `**Action** Title` (title\n outside the bold) used to silently lose the title; it is now tolerated as a fallback, but the\n em-dash-inside-bold form is canonical \u2014 use it. Do not invent a form for a lead-in not listed\n above (e.g. there is no `**Click**` or `**Type**` lead-in) \u2014 express it as an Action instead.\n\nACTOR FORMS (frontmatter `actor:` and `**Switch role to** <ref>` take the same forms)\n\n actor: Admin persona named "Admin" (default form)\n actor: persona Admin same, explicit\n actor: credential admin-bob one specific stored credential by name\n actor: seed-output new_user the credential output `new_user` of a **Seed** node\n earlier in the Journey (credentialSource: from_seed)\n\n `template <name>` is a legacy alias for `persona <name>`. `seed-output` binds to the\n nearest **Seed** node that precedes the login, so the Seed must come first in the\n Journey (for `actor:`, as the leading node); compile fails if no Seed precedes it.\n\nDESCRIPTION (optional, any lead-in)\n\n A blockquote line immediately after the lead-in (or after a blank line) becomes the node\'s\n description \u2014 free prose is fine and expected here:\n\n **Action \u2014 Create the org**\n > Fill the org form with orgName and plan, then submit.\n - field name: $orgName\n\nACTION BULLET GRAMMAR (exact \u2014 only these forms parse; everything else is DROPPED)\n\n - field <name> [(type)]: <value> e.g. - field plan (select): $plan\n - capture: <name> e.g. - capture: createdOrgId\n - assert (warn|fail|fatal[, agentic]): <condition>\n e.g. - assert (fail): URL ends with `/dashboard`\n e.g. - assert (warn, agentic): chart looks right\n - alwaysUseAgent: true\n - captureAudio: true\n - captureLabel: <label>\n - captureExtraMs: <number>\n\n A standalone `**Assert**` node takes its own kv option bullet the same way:\n\n - severity: warn|fail|fatal (assert nodes only; NOT `- severity: warn \u2014 text`,\n which is an unparseable kv bullet, not an assert)\n\n `Seed`/`Setup` bullets: `- version: latest`, `- mode: ...`, `- onFailure: block|warn`,\n `- input.<name>: <value>`. `Sandbox action` bullets: `- label: ...`, `- outputs: a, b`,\n `- param.<name>: <value>`. `Visual checkpoint` bullets: `- target: <plain-English element>`,\n `- expected: <visible expected state>`, and `- severity: record|fail`.\n\nCOMPLETE MINIMAL EXAMPLE\n\n ---\n name: Login smoke\n actor: admin\n authenticated: true\n requirementRef: LIN-101\n ---\n\n ## Spirit\n > A returning admin can sign in and reach the dashboard.\n\n ## Inputs\n - adminEmail: $EMAIL()\n\n ## Journey\n\n **Navigate to** `/login`.\n\n **Action \u2014 Sign in**\n > Enter email and password, submit.\n - field email: $adminEmail\n - field password: $CREDENTIAL\n - assert (fail): URL ends with `/dashboard`\n\n **End**.\n\nCOMMON MISTAKES (each of these compiles into an empty or half-empty node \u2014 no parse error)\n\n - A free-text bullet ("- Should reach the dashboard eventually") is not `field`/`capture`/\n `assert (...)`/a known kv key \u2014 it is DROPPED. Put prose in the `>` description instead of\n inventing a bullet shape.\n - `- severity: warn \u2014 should show a toast` is a kv bullet with key `severity`; it is not a\n recognized action option, so it is DROPPED. Use `- assert (warn): should show a toast`.\n - `**Action** Do the thing` (title outside the bold) is tolerated but non-canonical \u2014 prefer\n `**Action \u2014 Do the thing**`.\n - Any Journey line that doesn\'t start with a recognized bold lead-in is DROPPED with only a\n warn-severity "Unexpected line in Journey" issue \u2014 it will not error your compile.\n - After authoring or editing a spec, always run `spec_validate` and inspect its\n `droppedContent` field. Non-empty `droppedContent` means real content is about to be lost \u2014\n treat it as a blocking error, not a warning, even though its underlying severity is `warn`.\n';
2682
2635
 
2683
2636
  // ../content/src/workflow-guide/action-nodes.txt
2684
2637
  var action_nodes_default = `WHAT A STRONG ACTION NODE LOOKS LIKE
@@ -4022,15 +3975,9 @@ var cli_seeds_default = 'Use this section when you need to create or inspect see
4022
3975
  // ../content/src/workflow-guide/cli-api-sequences.txt
4023
3976
  var cli_api_sequences_default = 'Use this section when you need to drive API sequence authoring from the\nCofactor CLI. The conceptual model lives in `api-sequences`; this section is\nonly command orientation. Prefer each command\'s `--help` output for the\ncurrent flag list.\n\nCOMMON FLOW\n\n 1. Inspect the API catalog for candidate endpoints.\n\n cofactor api-catalog sources list\n cofactor api-catalog endpoints list --search <keyword>\n cofactor api-catalog endpoints get <apiRequestId>\n\n 2. Compose a sequence JSON file locally. Reference endpoints by\n apiRequestId and chain steps with {{stepId.response.path}}.\n\n 3. Create an API-only workflow from the sequence file.\n\n cofactor workflow create --api-only --name "smoke: create project" \\\n --sequence-from-file seq.json\n\n The command returns the workflow, sequence, and node IDs.\n\n To attach a sequence to an existing workflow that has none, run\n `cofactor workflow api-sequence update <workflowId> --from-file seq.json`;\n it creates the sequence when absent and replaces the config otherwise.\n\n 4. Execute immediately to surface template warnings and API failures.\n\n cofactor workflow api-sequence execute <workflowId>\n\n 5. Inspect the run and iterate on the sequence file.\n\n cofactor workflow runs list <workflowId> --side api\n cofactor workflow runs get <workflowId> <runId>\n cofactor workflow runs get <workflowId> <runId> --step <runStepId> --api-call <apiStepId>\n Add --json for JSON; the flags print stored (capped) request/response bodies.\n Get <runStepId> from runs get <workflowId> <runId> --json (steps[].id).\n cofactor workflow api-sequence update <workflowId> --from-file seq.json\n\nREFERENCE\n\n - Command help: `cofactor workflow api-sequence --help`\n - Workflow creation help: `cofactor workflow create --help`\n - API catalog help: `cofactor api-catalog --help`\n';
4024
3977
 
4025
- // ../content/src/workflow-guide/cli-chat-evals.txt
4026
- var cli_chat_evals_default = 'Use this section to author a chat eval from the Cofactor CLI. The conceptual\nmodel lives in the CHAT SCENARIO and CALL FLOW node types; this section is only\ncommand orientation. Prefer each command\'s `--help` output for the current flag\nlist.\n\nAn eval is a workflow of flowType "eval" built around one chat_scenario node.\nIt needs a chat target first \u2014 the saved description of how to talk to the AI\nchat under test. Both require the `evals` feature flag.\n\nCREATE THE CHAT TARGET\n\n A chat target is application-scoped like a credential, and describes one\n endpoint: how to send a message, how to read the reply, who to send it as.\n\n cofactor chat-target create \\\n --application "Acme App" --environment "Staging" \\\n --credential "Support Agent" \\\n --name "Acme support assistant" \\\n --config ./target.json \\\n --invariant "No cross-org data=Never reveals another organization\'s data."\n\n `--config` takes a file or `-` for stdin, holding `message` (method,\n urlTemplate, historyMode, bodyTemplate, optional headersTemplate) and\n `response` (transport `ai-sdk-v5`, or `sse` with deltaPath, or `json` with\n textPath).\n\n Only three slots are substituted per turn: {{message}}, {{messages}} and\n {{conversationId}}. There is NO {{baseUrl}} slot \u2014 write the endpoint as a\n literal URL.\n\n `$var.ENV.<name>` also resolves in a urlTemplate, which lets one target\n follow whichever environment a run picks. But it resolves only during a\n RUN: the live-chat path behind `chat-target chat` supplies no workflow\n variables, so a target written that way cannot be smoke-tested with the\n command below. Prefer a literal URL unless you need one target across\n several environments, and know the tradeoff if you do.\n\n `--invariant` is repeatable and declares a rubric judged against EVERY reply\n in every scenario run against this target \u2014 the cheapest coverage available.\n Severity defaults to fail; append `:warn` to the name to soften one.\n\nPROVE THE TARGET BEFORE BUILDING ON IT\n\n cofactor chat-target chat "Acme support assistant" --message "What can you do?"\n\n This sends one real turn down the same executor path a scenario uses, so a\n reply here is evidence the config, credential binding and transport all work.\n Expect 10-30s for a credentialed target \u2014 each message resolves an\n authenticated session server-side. A failed turn exits non-zero.\n\nAUTHOR AND RUN THE EVAL\n\n Author it like any other flow \u2014 `cofactor workflow create --from-file eval.json`\n with `"flowType": "eval"` and one `chat_scenario` node whose configJson holds\n `chatTargetId` and `turns` (see the CHAT SCENARIO entry for the shape).\n\n Put an api_sequence node BEFORE the chat node to establish ground truth and\n reference its exports from a rubric \u2014 "Reports a count matching\n $var.expected_count". Put a call_flow node AFTER it to have a browser flow\n verify something the assistant claims it did.\n\n Watch the two path forms in an api_sequence: a `validations` entry\'s `left`\n is step-qualified (`myStep.response.items.0.name`), while an `exports`\n entry\'s `responsePath` is relative to that step\'s response body\n (`items.0.name`) because it already names its `stepId`. Carrying the\n `response.` prefix into an export silently yields nothing \u2014 the step still\n passes, and the failure only surfaces later as a rubric that references a\n variable no step produced.\n\n Give the ground-truth step a `validations` entry as well as an export. An\n export that resolves to nothing does not fail the step, so without a\n validation the first sign of trouble is a withheld rubric further down.\n\n cofactor workflow run <workflowId>\n cofactor workflow runs get <runId>\n\n Per-turn judge verdicts persist on the chat_scenario step as\n `metadataJson.chatTranscript`, so the graded transcript is readable without\n opening the browser.\n\nREFERENCE\n\n - Chat target help: `cofactor chat-target --help`\n - Node config shapes: `cofactor workflow guide node-types`\n';
4027
-
4028
3978
  // ../content/src/workflow-guide/write-a-test.txt
4029
3979
  var write_a_test_default = 'Use this section to author a test straight from the CLI: plan the journey, check\nfor duplicates, create or update the workflow, run it, and hand back its URL.\nNo spec files are needed.\n\nAUTHORING LOOP\n\n 1. Understand the requirement. Read the ticket, PRD, or the user\'s intent, and\n explore the real UI first (see `best-practices` and `cofactor session guide`).\n 2. Avoid duplicates:\n cofactor workflow list --search "<keywords>"\n If a workflow already covers the journey, update it instead of creating one.\n 3. Create it (JSON on stdin or from a file; shapes are in `node-types`):\n cofactor workflow create --from-file test.json\n cofactor workflow create --from-file test.json --tags "p0,checkout"\n Input: { "name": "...", "nodes": [{ "nodeType": "...", "configJson": {...} }] }\n 4. Change an existing workflow:\n cofactor workflow get <workflowId> (read it first)\n cofactor workflow sync <workflowId> --from-file test.json (replace all nodes)\n cofactor workflow node patch <workflowId> <nodeId> --set-input key=value\n cofactor workflow patch <workflowId> --name "..." --description "..."\n cofactor workflow patch <workflowId> --preflight @preflight.md --cleanup @cleanup.md\n Reuse each existing node `id` in sync to keep a minimal diff. Add --propose\n to sync to open a proposal for review instead of applying directly.\n 5. Run it and look at the result:\n cofactor workflow run <workflowId> --stream\n cofactor workflow runs list <workflowId>\n cofactor workflow debug <runId> (when a run fails)\n 6. Return the workflow URL printed by the CLI to the user verbatim. Never\n build the URL yourself.\n\n Approving a test asserts that a human verified it checks the right thing. Do\n not pass --yes to `workflow approve` until the user has confirmed.\n\nTHE RUBRIC: EVERY TEST MUST SATISFY ALL OF THESE\n\n 1. One coherent journey per workflow\n One user objective, possibly with several verifications along the way.\n "Atomic" means coherent, not minimal. If isolating a check would force you\n to duplicate most of another test\'s setup, fold it in as an inline\n assertion on the larger journey.\n Good: create org -> invite a user -> claim invite -> land on dashboard.\n Good: submit a ticket and confirm it appears in the queue.\n Bad: submit a ticket, edit a user, generate a report (three journeys,\n three workflows).\n Split only when the setup is genuinely different or the failure modes are\n independent. A long single journey stays together; independent journeys\n become separate workflows so they run in parallel and fail independently.\n\n 2. Specific, observable expected results\n Every assertion is something a stranger could verify without judgement,\n and comes from the requirement or confirmed user intent, not incidental\n DOM details seen while exploring. Keep conditions about user-visible\n behavior; do not invent ARIA/SVG checks or pixel thresholds.\n Good: "URL ends with /dashboard." "A row named X appears in the table."\n Bad: "The page looks correct." "It works."\n Attach assertions inline to the action that produced the result (see\n `assertions`). Pick severity deliberately: fatal ends the run (gating\n preconditions), fail marks the run failed but continues (feature claims),\n warn records without failing (cosmetics). A test with no run-failing\n assertion proves nothing.\n Relative checks ("the count dropped by 2") must reference a value captured\n upstream and used via $var.<name>, never rely on memory of the earlier state.\n\n 3. Idempotent, self-owned, isolated\n - Rerunning passes without a manual reset: use macros ($EMAIL(), $UUID(),\n "QA Test $RANDOM_STRING(6)") for anything that must be unique (see `macros`).\n - The test creates the records it operates on, inline. A seed workflow is\n for data that several tests share; a seed with one consumer is overhead.\n Data the test only reads may pre-exist, but never mutate it.\n - Never modify shared resources (billing, integrations, API keys, org\n config) as a side effect.\n - Tests that depend on one another run as ordered suite layers, never by\n implicit ordering.\n - A fatal assertion halts the run before trailing cleanup. Anything that\n must be gone after a failure belongs in a seed with a teardown (see\n `seed-workflows`, `data-lifecycle`).\n\n 4. Traceable\n Link the test to the product-map capability it proves:\n cofactor product-map link <CAP-code> <workflowId>\n Traceability comes from that link, not from text: do not write capability\n codes, ticket ids or requirement references into the name or description.\n If no capability covers the test, tell the user; untraceable tests rot.\n\n 5. Risk-prioritized\n Tag each test p0, p1, or p2 with --tags / --tags-add:\n p0 happy path of the core promise; if it breaks the feature is broken\n p1 primary edge cases, validation, role variants, common error states\n p2 rare conditions, visual or agentic checks, low-frequency edges\n\n 6. Preconditions, data, and cleanup are explicit\n Auth and role: use a persona (cofactor persona list --application "<app>")\n rather than raw usernames and passwords. Shared setup: a seed node, placed\n before login. Test data: workflow inputs with macros. Anything else the\n test depends on (pre-existing data it reads, flags, third-party systems)\n goes in the workflow\'s preflight, and how its side effects get reset goes\n in its cleanup. Write each as a short markdown bullet list:\n cofactor workflow patch <workflowId> --preflight @preflight.md\n cofactor workflow patch <workflowId> --cleanup @cleanup.md\n\n 7. The description says what the test is for\n Read together with the name, the description gives the spirit of the\n test: what we are doing and why it matters, in one or two plain\n sentences. It never holds capability codes, preconditions, issue ids,\n status ("expected red", "blocked"), step narration, endpoints, payloads,\n timings or cache details. Each of those lives elsewhere: the product-map\n link, the preflight, the linked issue, the run history, the nodes.\n People read the description, preflight and cleanup in the web UI, so\n never put a raw ID in them: no UUID, UUID prefix, wf_/prule_ or other\n prefixed id, issue id or run id. Name the thing instead (the seed\n workflow\'s name, the teardown\'s name, the connection\'s name, the\n record\'s name).\n Good: name "Invite a teammate to Acme"\n description "An admin invites a new teammate by email and the\n teammate can sign in. Growing a team depends on invites\n reaching people."\n Bad: description "CAP-ORG-004. Needs seed org + admin persona. Steps:\n open /settings/team, POST /api/invites, wait 5s, check inbox.\n Expected red until ISSUE-812 ships. Cache warm."\n Bad preflight:\n Seed 5e055090 creates an empty layer. Paired teardown d9a44386\n deletes the flow.\n Good preflight:\n - The "Acme empty layer" seed creates an empty layer\n - Its paired teardown, "Acme empty layer teardown", deletes the flow\n\n 8. Written as human intent, not UI mechanics\n Action titles say what the user is trying to do ("Assign the ticket to\n Support"), not click-by-click steps. Each action is one coherent,\n assertable step: usually broader than one click, ends at a visible\n boundary (modal gone, URL changed, row appeared), and has no conditionals\n inside it. If the data might not exist, seed it instead of branching.\n\nCHOOSING VALUES\n\n - Names existing data in the target app (a property, persona, credential, a\n seeded record): do not guess. Look it up with `cofactor property list`,\n `cofactor persona list --application "<app>"`, or\n `cofactor workflow list --search <term>`, and ask the user when several\n candidates fit.\n - Synthesizable (email, UUID, throwaway string, date): use a macro and move on.\n - Auth or role: prefer a persona over a raw credential.\n\nCOVERAGE CHECKLIST\n\n Before handing work back, for each item either include a test or say why it\n does not apply: happy path (p0); primary edges and boundary inputs; negative\n paths and validation errors; permission and role variants; empty, loading,\n and error states; cross-entity side effects (does this change something\n visible elsewhere?); cleanup or undo.\n\n Aim for the smallest set that proves the feature works. Five sharp tests beat\n twenty fuzzy ones.\n';
4030
3980
 
4031
- // ../content/src/workflow-guide/prove-changes.txt
4032
- var prove_changes_default = 'Use this section to prove a change to the application with Cofactor tests, so a\npull request carries the tests that cover it and merging it adds them to the\nregression suite.\n\nTHE RULE\n\n If a test already walks the journey, edit it (through a fork). Never add a new\n test for a changed filter, column or field: the suite fills with near-duplicates.\n\nTHE LOOP\n\n 1. Find coverage first:\n cofactor workflow list --search "<words>"\n cofactor workflow get <workflowId> --format markdown (read its assertions)\n 2. Choose:\n A test covers the journey -> fork it, edit the fork, never the original:\n cofactor workflow fork fork <workflowId>\n Nothing covers it, or it needs its own data or role -> write a new test\n (see `write-a-test`, `data-lifecycle`, `assertions`).\n No test is possible -> say so (step 5).\n 3. Run it on a sandbox of your change until it passes. After your last change,\n run it once more: that passing run is your proof, and the command prints its\n run id (a uuid or wrun_...; either works):\n cofactor sandbox claim --application <app> --wait\n cofactor sandbox sync <id> [--build]\n cofactor workflow run <fork> --sandbox <id> --stream\n 4. Push and open a draft pull request.\n 5. List each test with the run of it that passed. Print the block, never\n hand-format it:\n cofactor proofs block <workflowId> <runId> [<workflowId> <runId> ...]\n or, when no test is possible, say why and what would make one possible:\n cofactor proofs block --none "<reason>"\n Paste the printed block into the pull request description:\n <!-- cofactor:proofs -->\n - wf_... <run id> <name> (new | fork of <original>)\n <!-- /cofactor:proofs -->\n A listed test must be a new draft test or a fork of an approved test; an\n approved test cannot be changed by listing it directly.\n 6. Cofactor does not run the tests again. It checks that each listed run\n exists, belongs to its test, passed and ran the test as it is now (an edit\n after the run makes it no proof), and reports one `cofactor / proofs` check.\n It does not check which commit the run was against, so run the test after\n your last change. The check is evaluated again when you push, edit the\n description or press "Re-run all checks", and once more at merge. See what a\n pull request lists:\n cofactor proofs status --application <app> --pr <pr>\n 7. Merge. Merging is the approval: a new test whose run is proof is approved\n ("approved by merge of #N by @login") and added to suite runs, and a fork\n whose run is proof is merged into its original (added to suite runs if it was\n not) and deleted, unless the original changed after the fork was\n taken: then the proposal is left open in the original\'s proposals and the pull\n request gets a comment. A test whose run is not proof is left as a draft and\n runs in no suite. Cofactor does not require the check; it blocks a merge only\n if the repository makes it a required check.\n\n Closing the pull request without merging promotes nothing. The drafts and forks\n it lists are archived 14 days later (undoable); reopening it within that window\n keeps them.\n\nRECORD WHAT WAS UNCLEAR\n\n In the pull request description add `## Proof notes`: each decision you were\n unsure about (fork or new, what to assert, what you left uncovered) and why you\n chose as you did.\n';
4033
-
4034
3981
  // ../content/src/workflow-guide/visual-checkpoints.txt
4035
3982
  var visual_checkpoints_default = "Visual checkpoints capture a meaningful screen state and compare it with the\nrolling baseline for that checkpoint. Add one checkpoint at each state whose\nappearance matters to the user; avoid taking several screenshots of the same\nstate just because the journey has several steps.\n\nNATIVE WORKFLOW CHECKPOINTS\n\n Checkpoints run in Sandboxes v2. Seed the sandbox into the exact state to\n compare, then capture it. A standalone visual regression test is a short\n workflow that prepares one state and takes its checkpoint. Examples include\n seeding a populated list before capturing it, or submitting invalid input and\n capturing the resulting validation error.\n\n The `target` is optional plain English describing an element, such as\n `the invoices table`; omit it to capture the whole page. Never put a CSS,\n XPath, or Playwright selector in `target`.\n\n `expected` is optional plain language describing the correct visible state.\n It guides the AI in deciding whether the current state is correct and whether\n a visual change is real or can be healed. Use a specific observable\n description, for example, \"Three invoices are listed, each marked Paid, with\n no error banner.\"\n\n `record` is the default. It records visual findings without changing the\n workflow result, and compares after the suite finishes. Choose `fail` when an\n unresolved visual change should fail this workflow step; it compares inline.\n Under either severity, a `target` that cannot be found is reported as a\n checkpoint that could not be compared, and under `fail` it fails the step.\n Both severities appear in Visual results.\n\n Dynamic text is masked automatically. If the AI heals a difference, it saves\n an element mask and its reason on the checkpoint. The review shows the heal;\n a reviewer can revert the mask or mark the change as a regression. Masks are\n automatic or healed; never author mask rules yourself.\n\nSTANDALONE VISUAL REGRESSION SPECS\n\n These complete `.cofactor.md` examples use the current spec grammar. Replace\n the illustrative seed name, persona, and routes with the published seed,\n persona, and paths used by your application. In each, prepare one meaningful\n state and capture it. Sandboxes v2 supplies the run.\n\n Seed a populated invoice list, then checkpoint it:\n\n ---\n name: Invoice list visual regression\n actor: admin\n authenticated: true\n ---\n\n ## Spirit\n > An admin can see the seeded invoices and their payment status.\n\n ## Journey\n\n **Seed** invoice-list-state\n\n **Navigate to** `/invoices`\n\n **Visual checkpoint \u2014 Populated invoice list**\n - target: the invoices table\n - expected: Three invoices are listed, each marked Paid, with no error banner.\n - severity: fail\n\n **End**.\n\n Submit invalid form data and checkpoint the validation state:\n\n ---\n name: Signup validation visual regression\n authenticated: false\n ---\n\n ## Spirit\n > A visitor sees clear validation feedback when required signup fields are missing.\n\n ## Journey\n\n **Navigate to** `/signup`\n\n **Action \u2014 Submit the empty signup form**\n > Submit without entering any values so the required-field messages appear.\n - assert (fail): A required-field validation message is visible.\n\n **Visual checkpoint \u2014 Required-field validation**\n - target: the signup form\n - expected: Required fields have clear validation messages and the form has not been submitted.\n - severity: record\n\n **End**.\n\nPLAYWRIGHT ATTACHMENT CHECKPOINTS\n\n In an external Playwright suite running on Sandboxes v2, an attached PNG is a\n visual checkpoint:\n\n await testInfo.attach(name, { body: await page.screenshot({ mask }), contentType: 'image/png' })\n\n Its identity is the spec file, test title, and attachment name. Keep masking\n in the test code with Playwright's `mask` option. The service explains and\n reports Playwright changes but never fails the Playwright test. Failure\n screenshots, trace frames, and `toHaveScreenshot` actuals are excluded. Do\n not use `toHaveScreenshot` for this feature; attach the screenshot instead.\n\nREVIEW RESULTS\n\n Review changes and comparisons on the Visual page. From the CLI, use\n `cofactor visual list` to find captures. Mark or clear a regression with\n `cofactor visual regression <captureId>` or\n `cofactor visual regression <captureId> --clear`.\n";
4036
3983
 
@@ -4053,9 +4000,7 @@ var WORKFLOW_GUIDE_CONCEPT_SECTIONS = [
4053
4000
  var WORKFLOW_GUIDE_CLI_SECTIONS = [
4054
4001
  { title: "CLI: Seed Workflows", slug: "cli-seeds", content: cli_seeds_default },
4055
4002
  { title: "CLI: API Sequences", slug: "cli-api-sequences", content: cli_api_sequences_default },
4056
- { title: "CLI: Chat Evals", slug: "cli-chat-evals", content: cli_chat_evals_default },
4057
- { title: "Write a Test from the CLI", slug: "write-a-test", content: write_a_test_default },
4058
- { title: "Prove a Change with Tests", slug: "prove-changes", content: prove_changes_default }
4003
+ { title: "Write a Test from the CLI", slug: "write-a-test", content: write_a_test_default }
4059
4004
  ];
4060
4005
  var WORKFLOW_GUIDE_SECTIONS = [
4061
4006
  ...WORKFLOW_GUIDE_CONCEPT_SECTIONS,
@@ -4601,6 +4546,7 @@ function printWorkflowHelp() {
4601
4546
  " patch <workflowId> [options] Update workflow properties",
4602
4547
  " approve <workflowId> [--yes] [--json] Mark the test as human-verified (spec is right)",
4603
4548
  " promote <workflowId> [--force] [--json] Include the test in suite runs (promotion model; requires approval)",
4549
+ " set-promotion <workflowId> --promote-on merge|never|deploy:<stage> [--target-suite <suite>]... Configure proof promotion (never: archived at merge); target suites replace the current list",
4604
4550
  " status <workflowId> [--set <status>] Show or change the management status (blocked, paused, \u2026)",
4605
4551
  " events <workflowId> [--limit <n>] [--json] Audit timeline: status changes + node (de)activations",
4606
4552
  " revisions <list|get|restore> <workflowId> [number] Immutable definition history",
@@ -4803,7 +4749,7 @@ async function runWorkflow(argv) {
4803
4749
  return;
4804
4750
  }
4805
4751
  if (subCommand === "debug" && hasFlag(rest, "--help", "-h")) {
4806
- const { handleWorkflowDebug } = await import("./workflow-debug-RACNWWOL.js");
4752
+ const { handleWorkflowDebug } = await import("./workflow-debug-HZB7TJGK.js");
4807
4753
  await handleWorkflowDebug(rest, "", "");
4808
4754
  return;
4809
4755
  }
@@ -4817,6 +4763,12 @@ async function runWorkflow(argv) {
4817
4763
  printGuide(WORKFLOW_GUIDE_SECTIONS, sectionSlug, jsonOutput);
4818
4764
  return;
4819
4765
  }
4766
+ if (subCommand === "set-promotion") {
4767
+ const { apiUrl: apiUrl2, token: token2 } = await resolveConfig(argv);
4768
+ const { handleWorkflowPromotion } = await import("./workflow-promotion-U6WYFY5U.js");
4769
+ await handleWorkflowPromotion(rest, apiUrl2, token2);
4770
+ return;
4771
+ }
4820
4772
  const { apiUrl, token, appSubdomain } = await resolveConfig(argv);
4821
4773
  switch (subCommand) {
4822
4774
  case "list":
@@ -4859,24 +4811,24 @@ async function runWorkflow(argv) {
4859
4811
  await runWorkflowRuns(rest, apiUrl, token);
4860
4812
  break;
4861
4813
  case "status": {
4862
- const { handleWorkflowStatus } = await import("./workflow-status-7KL73WS2.js");
4814
+ const { handleWorkflowStatus } = await import("./workflow-status-RA3IEMEW.js");
4863
4815
  await handleWorkflowStatus(rest, apiUrl, token);
4864
4816
  break;
4865
4817
  }
4866
4818
  case "events": {
4867
- const { handleWorkflowEvents } = await import("./workflow-status-7KL73WS2.js");
4819
+ const { handleWorkflowEvents } = await import("./workflow-status-RA3IEMEW.js");
4868
4820
  await handleWorkflowEvents(rest, apiUrl, token);
4869
4821
  break;
4870
4822
  }
4871
4823
  case "revisions": {
4872
- const { handleWorkflowRevisions } = await import("./workflow-revisions-5M6APN6R.js");
4824
+ const { handleWorkflowRevisions } = await import("./workflow-revisions-BPUOLCZB.js");
4873
4825
  await handleWorkflowRevisions(rest, apiUrl, token);
4874
4826
  break;
4875
4827
  }
4876
4828
  case "event": {
4877
4829
  const [eventSub, ...eventRest] = rest;
4878
4830
  if (eventSub === "ticket") {
4879
- const { handleWorkflowEventTicket } = await import("./workflow-status-7KL73WS2.js");
4831
+ const { handleWorkflowEventTicket } = await import("./workflow-status-RA3IEMEW.js");
4880
4832
  await handleWorkflowEventTicket(eventRest, apiUrl, token);
4881
4833
  } else {
4882
4834
  console.error(`Unknown event sub-command: ${eventSub ?? "(none)"}`);
@@ -4890,7 +4842,7 @@ async function runWorkflow(argv) {
4890
4842
  if (nodeSub === "patch") {
4891
4843
  await handleNodePatch(nodeRest, apiUrl, token);
4892
4844
  } else if (nodeSub === "deactivate" || nodeSub === "activate") {
4893
- const { handleNodeDeactivateToggle } = await import("./workflow-status-7KL73WS2.js");
4845
+ const { handleNodeDeactivateToggle } = await import("./workflow-status-RA3IEMEW.js");
4894
4846
  await handleNodeDeactivateToggle(nodeRest, apiUrl, token, nodeSub === "deactivate");
4895
4847
  } else {
4896
4848
  console.error(`Unknown node sub-command: ${nodeSub ?? "(none)"}`);
@@ -4914,12 +4866,12 @@ async function runWorkflow(argv) {
4914
4866
  await handleWorkflowSync(rest, apiUrl, token);
4915
4867
  break;
4916
4868
  case "fork": {
4917
- const { handleWorkflowFork } = await import("./workflow-fork-LINDCYJ3.js");
4869
+ const { handleWorkflowFork } = await import("./workflow-fork-IDYHAHCX.js");
4918
4870
  await handleWorkflowFork(rest, apiUrl, token);
4919
4871
  break;
4920
4872
  }
4921
4873
  case "proposals": {
4922
- const { handleWorkflowProposals } = await import("./workflow-proposals-E4EXKAGM.js");
4874
+ const { handleWorkflowProposals } = await import("./workflow-proposals-MMVNIQT3.js");
4923
4875
  await handleWorkflowProposals(rest, apiUrl, token);
4924
4876
  break;
4925
4877
  }
@@ -4930,17 +4882,17 @@ async function runWorkflow(argv) {
4930
4882
  await handleWorkflowApiSequence(rest, apiUrl, token);
4931
4883
  break;
4932
4884
  case "cache": {
4933
- const { handleWorkflowCache } = await import("./workflow-cache-PFBTWLGM.js");
4885
+ const { handleWorkflowCache } = await import("./workflow-cache-YQ3BGJIG.js");
4934
4886
  await handleWorkflowCache(rest, apiUrl, token);
4935
4887
  break;
4936
4888
  }
4937
4889
  case "debug": {
4938
- const { handleWorkflowDebug } = await import("./workflow-debug-RACNWWOL.js");
4890
+ const { handleWorkflowDebug } = await import("./workflow-debug-HZB7TJGK.js");
4939
4891
  await handleWorkflowDebug(rest, apiUrl, token);
4940
4892
  break;
4941
4893
  }
4942
4894
  case "feedback": {
4943
- const { handleWorkflowFeedback } = await import("./workflow-feedback-RJIQ5R3R.js");
4895
+ const { handleWorkflowFeedback } = await import("./workflow-feedback-6UOTIWIQ.js");
4944
4896
  await handleWorkflowFeedback(rest, apiUrl, token);
4945
4897
  break;
4946
4898
  }
@@ -4956,4 +4908,4 @@ export {
4956
4908
  runWorkflow,
4957
4909
  shouldPrintWorkflowUrlTrailer
4958
4910
  };
4959
- //# sourceMappingURL=workflow-R5QAXWBX.js.map
4911
+ //# sourceMappingURL=workflow-34YJZ2QQ.js.map