@poetic-ai/poetic 1.42.1-bootstrap.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 (781) hide show
  1. package/.github/SECURITY.md +47 -0
  2. package/.nvmrc +1 -0
  3. package/.poetic/README.md +37 -0
  4. package/.poetic/providers/catalog.json +12051 -0
  5. package/.poetic/providers/pricing.json +1272 -0
  6. package/.poetic/providers/registry.json +3369 -0
  7. package/CHANGELOG.md +552 -0
  8. package/CODE_OF_CONDUCT.md +40 -0
  9. package/CONTRIBUTING.md +23 -0
  10. package/INSTALL.md +454 -0
  11. package/LICENSE +21 -0
  12. package/README.md +474 -0
  13. package/dist/BasicOptimizationCompetitionRunner-5H5TBYO4.js +153 -0
  14. package/dist/ExecutionTracker-UVONC4C6.js +16 -0
  15. package/dist/OptimizationConfig-7DFY2TST.js +17 -0
  16. package/dist/OptimizationEngine-MXTSOSST.js +1597 -0
  17. package/dist/PromptStore-U6ZD3ZMQ.js +18 -0
  18. package/dist/actions-M3AESHFF.js +322 -0
  19. package/dist/agent-ingest-HO77TH26.js +53 -0
  20. package/dist/aggregator-DNCBINFO.js +12 -0
  21. package/dist/ai-judge-LDWHURKK.js +156 -0
  22. package/dist/allowlist-grounding-RO6HKUFI.js +16 -0
  23. package/dist/allowlist-utils-23V7TJ3G.js +28 -0
  24. package/dist/anchored-turn-service-GFYU6GCQ.js +489 -0
  25. package/dist/api-transport-FS3CQRMN.js +1087 -0
  26. package/dist/apply-completion-mode-JBT2CTQO.js +89 -0
  27. package/dist/artifact-migrator-23L45ISD.js +267 -0
  28. package/dist/ask-UYVZY7JH.js +135 -0
  29. package/dist/auth-CSQP5RHJ.js +67 -0
  30. package/dist/auth-E6XUNZ5M.js +68 -0
  31. package/dist/auth-KQLJPZ2E.js +134 -0
  32. package/dist/auth-OC4E6633.js +71 -0
  33. package/dist/auth-R3NQ2ZF5.js +78 -0
  34. package/dist/auth-S4CTX4GQ.js +44 -0
  35. package/dist/auth-YLH3S7EY.js +69 -0
  36. package/dist/auth-liveness-TDDEZY3T.js +46 -0
  37. package/dist/auto-optimizer-HA3T23SF.js +80 -0
  38. package/dist/autoloop-cleanup-JOGKTLWA.js +109 -0
  39. package/dist/autoloop-evidence-gates-ACB5YW5G.js +36 -0
  40. package/dist/autoloop-gate-policy-XZA5EQFN.js +175 -0
  41. package/dist/autoloop-helpers-EFJLBQUP.js +22 -0
  42. package/dist/autoloop-ledger-W7QO62PX.js +96 -0
  43. package/dist/autoloop-ledger-subscriber-Z5RW5EIE.js +162 -0
  44. package/dist/autoloop-run-defaults-FERGRZGP.js +19 -0
  45. package/dist/autoloop-run-lock-CT2NWSV3.js +197 -0
  46. package/dist/autoloop-success-OPR74YEX.js +85 -0
  47. package/dist/autoloop-termination-summary-RN75F422.js +58 -0
  48. package/dist/autoloop-trajectory-K5I45UBR.js +282 -0
  49. package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
  50. package/dist/autonomous-loop-controller-4QJMOIIN.js +4120 -0
  51. package/dist/backend-P3DAYRP7.js +29 -0
  52. package/dist/background-executor-CBN552V4.js +257 -0
  53. package/dist/backlog-execution-intent-U4XYPTV6.js +15 -0
  54. package/dist/backup-active-store-5WXG6SXT.js +17 -0
  55. package/dist/backup-telemetry-db-XGLXAA3N.js +254 -0
  56. package/dist/basic-competition-master-WXZHUT42.js +344 -0
  57. package/dist/branch-archive-manager-RP6FP3ZC.js +254 -0
  58. package/dist/branch-cleanup-manager-RSHAI7YR.js +20 -0
  59. package/dist/build-gate-YFASRB5Z.js +71 -0
  60. package/dist/change-summary-WY7J5TOX.js +33 -0
  61. package/dist/chunk-25QL3M3L.js +899 -0
  62. package/dist/chunk-2ABC6SEC.js +2626 -0
  63. package/dist/chunk-2AICM4P3.js +1763 -0
  64. package/dist/chunk-2AQUWJPW.js +225 -0
  65. package/dist/chunk-2DY5KNVM.js +276 -0
  66. package/dist/chunk-2QJ3H3L7.js +42 -0
  67. package/dist/chunk-2UH6VQRZ.js +328 -0
  68. package/dist/chunk-2VSQMRCB.js +18 -0
  69. package/dist/chunk-2XQXYBM2.js +130 -0
  70. package/dist/chunk-2YFUIER7.js +426 -0
  71. package/dist/chunk-2YXZCZTX.js +1160 -0
  72. package/dist/chunk-32VLDFRT.js +797 -0
  73. package/dist/chunk-34CNP2HB.js +148 -0
  74. package/dist/chunk-35P3W3JX.js +456 -0
  75. package/dist/chunk-36PEBZAF.js +18 -0
  76. package/dist/chunk-3733QTI7.js +6818 -0
  77. package/dist/chunk-3A5PDH5L.js +12513 -0
  78. package/dist/chunk-3AOKYKA7.js +22 -0
  79. package/dist/chunk-3BCUNHKF.js +475 -0
  80. package/dist/chunk-3C26DPFK.js +566 -0
  81. package/dist/chunk-3FLXLLB7.js +26 -0
  82. package/dist/chunk-3FOZ2VHV.js +100 -0
  83. package/dist/chunk-3G6FZCRF.js +106 -0
  84. package/dist/chunk-3JWNRJSB.js +736 -0
  85. package/dist/chunk-3LUMR3D3.js +156 -0
  86. package/dist/chunk-3M57DADF.js +44 -0
  87. package/dist/chunk-3S62LLWJ.js +543 -0
  88. package/dist/chunk-3VABAKT2.js +1784 -0
  89. package/dist/chunk-44N5WZZH.js +45 -0
  90. package/dist/chunk-45FPSA3B.js +125 -0
  91. package/dist/chunk-4BIPZBT7.js +791 -0
  92. package/dist/chunk-4BJ3O4RQ.js +929 -0
  93. package/dist/chunk-4BTDUT2S.js +42 -0
  94. package/dist/chunk-4CSS7WVI.js +143 -0
  95. package/dist/chunk-4CUY7AFY.js +247 -0
  96. package/dist/chunk-4HN6DF7V.js +1027 -0
  97. package/dist/chunk-4HXKHDNH.js +1064 -0
  98. package/dist/chunk-4KKI477Q.js +44 -0
  99. package/dist/chunk-4NA7FSTV.js +595 -0
  100. package/dist/chunk-4NXPXE62.js +84 -0
  101. package/dist/chunk-4SALLK63.js +9831 -0
  102. package/dist/chunk-4SHKPCGK.js +110 -0
  103. package/dist/chunk-4VJITV4P.js +445 -0
  104. package/dist/chunk-4W2NRXQL.js +1205 -0
  105. package/dist/chunk-4XICK3HN.js +784 -0
  106. package/dist/chunk-55EJVV3C.js +385 -0
  107. package/dist/chunk-5DLKYTQX.js +4003 -0
  108. package/dist/chunk-5EERLVZB.js +139 -0
  109. package/dist/chunk-5HDP7XZG.js +91 -0
  110. package/dist/chunk-5LAMRH4X.js +969 -0
  111. package/dist/chunk-5REDMNLZ.js +310 -0
  112. package/dist/chunk-5UCJARII.js +1984 -0
  113. package/dist/chunk-5WCQRDRB.js +588 -0
  114. package/dist/chunk-5WRLK5KW.js +700 -0
  115. package/dist/chunk-66AGFTBQ.js +131 -0
  116. package/dist/chunk-66CIO2SV.js +48 -0
  117. package/dist/chunk-6BM72ZMG.js +31 -0
  118. package/dist/chunk-6BTFXYRO.js +276 -0
  119. package/dist/chunk-6EDAJH2I.js +68 -0
  120. package/dist/chunk-6EQKFDBH.js +457 -0
  121. package/dist/chunk-6KMJKHIQ.js +2193 -0
  122. package/dist/chunk-6MFRHTRI.js +115 -0
  123. package/dist/chunk-6QMUKUHH.js +632 -0
  124. package/dist/chunk-6TZJRKNW.js +321 -0
  125. package/dist/chunk-6V7HGQFZ.js +20 -0
  126. package/dist/chunk-6Y5TWI7H.js +146 -0
  127. package/dist/chunk-6Y5U7UFY.js +91 -0
  128. package/dist/chunk-6ZLAK3XG.js +14 -0
  129. package/dist/chunk-72XCRQED.js +34 -0
  130. package/dist/chunk-72YTZMAM.js +589 -0
  131. package/dist/chunk-73NCTWKL.js +188 -0
  132. package/dist/chunk-77I6G4CO.js +1 -0
  133. package/dist/chunk-7D7QT3BE.js +688 -0
  134. package/dist/chunk-7DNSNKJV.js +78 -0
  135. package/dist/chunk-7FMJVYBS.js +307 -0
  136. package/dist/chunk-7GDRQBQC.js +419 -0
  137. package/dist/chunk-7IL4A2PP.js +948 -0
  138. package/dist/chunk-7NPSXSHO.js +975 -0
  139. package/dist/chunk-7PS6INZP.js +302 -0
  140. package/dist/chunk-7QCZSLBH.js +1 -0
  141. package/dist/chunk-7R2WLDOS.js +62 -0
  142. package/dist/chunk-7XV3QXLT.js +878 -0
  143. package/dist/chunk-A2WKSVX7.js +43 -0
  144. package/dist/chunk-A3YGID55.js +133 -0
  145. package/dist/chunk-A5MRWHMI.js +1604 -0
  146. package/dist/chunk-A722DEVA.js +14 -0
  147. package/dist/chunk-AG2Z2SUZ.js +554 -0
  148. package/dist/chunk-AHWAZ2MU.js +137 -0
  149. package/dist/chunk-AIAQ3HS3.js +119 -0
  150. package/dist/chunk-ALAB3PBR.js +2206 -0
  151. package/dist/chunk-APPNGGN7.js +365 -0
  152. package/dist/chunk-APV6MK5E.js +137 -0
  153. package/dist/chunk-AQNPGRWS.js +395 -0
  154. package/dist/chunk-ASEP3M2W.js +968 -0
  155. package/dist/chunk-AT4TNPWW.js +2931 -0
  156. package/dist/chunk-ATVKCSGT.js +250 -0
  157. package/dist/chunk-AX6GWE7V.js +47 -0
  158. package/dist/chunk-AZQILSNQ.js +1376 -0
  159. package/dist/chunk-B76KHLX6.js +13 -0
  160. package/dist/chunk-BAV2HJXS.js +194 -0
  161. package/dist/chunk-BBHRN366.js +89 -0
  162. package/dist/chunk-BCZAENOH.js +448 -0
  163. package/dist/chunk-BIGSACCY.js +19527 -0
  164. package/dist/chunk-BPYMCIVD.js +9243 -0
  165. package/dist/chunk-BSE4R6XD.js +322 -0
  166. package/dist/chunk-BVPWRDCO.js +2321 -0
  167. package/dist/chunk-BXI4NXL3.js +507 -0
  168. package/dist/chunk-C3L6YQ7P.js +147 -0
  169. package/dist/chunk-C57KJOUQ.js +121 -0
  170. package/dist/chunk-CCV7BPSY.js +118 -0
  171. package/dist/chunk-CD7ISXA4.js +826 -0
  172. package/dist/chunk-CE5OZBYY.js +21 -0
  173. package/dist/chunk-CFBIG37O.js +154 -0
  174. package/dist/chunk-CHQV73H5.js +408 -0
  175. package/dist/chunk-CJC6GZ46.js +457 -0
  176. package/dist/chunk-CJHRFSNY.js +924 -0
  177. package/dist/chunk-CKP2Q3TP.js +1905 -0
  178. package/dist/chunk-CLKSETWE.js +10 -0
  179. package/dist/chunk-CQM3A35X.js +844 -0
  180. package/dist/chunk-CSLAS5GW.js +4007 -0
  181. package/dist/chunk-CTLUBNCW.js +622 -0
  182. package/dist/chunk-CVMVZWG4.js +3544 -0
  183. package/dist/chunk-CYB6QDCT.js +263 -0
  184. package/dist/chunk-D5EP5D2W.js +26 -0
  185. package/dist/chunk-DC4ZYMXJ.js +115 -0
  186. package/dist/chunk-DCAVAABI.js +348 -0
  187. package/dist/chunk-DCYF7EKG.js +26 -0
  188. package/dist/chunk-DF5SLDE4.js +966 -0
  189. package/dist/chunk-DN7UMLF7.js +5678 -0
  190. package/dist/chunk-DSFM56OA.js +1203 -0
  191. package/dist/chunk-DTY4APYV.js +218 -0
  192. package/dist/chunk-E3NTPHEO.js +194 -0
  193. package/dist/chunk-E74LUIID.js +302 -0
  194. package/dist/chunk-EJ42BNGY.js +2904 -0
  195. package/dist/chunk-EJ4ZAWLV.js +305 -0
  196. package/dist/chunk-EJGCZGUF.js +1483 -0
  197. package/dist/chunk-EK2U3YEG.js +486 -0
  198. package/dist/chunk-ELMFYNV7.js +109 -0
  199. package/dist/chunk-ENRGKNR5.js +25 -0
  200. package/dist/chunk-EQGIDAUF.js +62 -0
  201. package/dist/chunk-EX3OM35G.js +20414 -0
  202. package/dist/chunk-F5JO7HAS.js +94 -0
  203. package/dist/chunk-F7ER6ANO.js +174 -0
  204. package/dist/chunk-FATUVIIN.js +374 -0
  205. package/dist/chunk-FC23CTXV.js +322 -0
  206. package/dist/chunk-FCNAS3W2.js +1033 -0
  207. package/dist/chunk-FD4ERYEG.js +22 -0
  208. package/dist/chunk-FDVZLG6Z.js +3104 -0
  209. package/dist/chunk-FEPIFY7D.js +511 -0
  210. package/dist/chunk-FEQ4HXL7.js +412 -0
  211. package/dist/chunk-FFH5HHJU.js +5351 -0
  212. package/dist/chunk-FH7WOJAE.js +79 -0
  213. package/dist/chunk-FKAUPHMR.js +96 -0
  214. package/dist/chunk-FRG57FPM.js +240 -0
  215. package/dist/chunk-FUVP64ER.js +31 -0
  216. package/dist/chunk-G2PTLLEL.js +284 -0
  217. package/dist/chunk-G35UYQ6Z.js +69 -0
  218. package/dist/chunk-G36W2T2S.js +1143 -0
  219. package/dist/chunk-G4THLFV3.js +148 -0
  220. package/dist/chunk-GAFJEYLK.js +29 -0
  221. package/dist/chunk-GCCAPO3S.js +118 -0
  222. package/dist/chunk-GG6KJYW6.js +85 -0
  223. package/dist/chunk-GHHFDU2U.js +55 -0
  224. package/dist/chunk-GHTZSQB7.js +57 -0
  225. package/dist/chunk-GJTWJNLV.js +1374 -0
  226. package/dist/chunk-GKN3HMN4.js +2809 -0
  227. package/dist/chunk-GNH3QGTL.js +1342 -0
  228. package/dist/chunk-GOAQ2I7Y.js +7000 -0
  229. package/dist/chunk-GSGD5E4C.js +30 -0
  230. package/dist/chunk-GXWAJQOJ.js +5011 -0
  231. package/dist/chunk-H2AYQIHW.js +224 -0
  232. package/dist/chunk-H6G7QRMQ.js +35 -0
  233. package/dist/chunk-H7JAGHZT.js +59 -0
  234. package/dist/chunk-HAC6EHZZ.js +79 -0
  235. package/dist/chunk-HE2KH6EQ.js +161 -0
  236. package/dist/chunk-HIHENQDX.js +66 -0
  237. package/dist/chunk-HIO33P3G.js +19 -0
  238. package/dist/chunk-HK4AQZSR.js +438 -0
  239. package/dist/chunk-HMVQIPH3.js +547 -0
  240. package/dist/chunk-HOYBYAOA.js +257 -0
  241. package/dist/chunk-HQLGXODD.js +123 -0
  242. package/dist/chunk-HQXYYUNY.js +1231 -0
  243. package/dist/chunk-HY3ESWCA.js +708 -0
  244. package/dist/chunk-I46EG2XQ.js +65 -0
  245. package/dist/chunk-I4NPDSCB.js +279 -0
  246. package/dist/chunk-I5WRT7ZR.js +514 -0
  247. package/dist/chunk-I6BL3PDH.js +1024 -0
  248. package/dist/chunk-IATQ7NBI.js +679 -0
  249. package/dist/chunk-IC7I6YIJ.js +301 -0
  250. package/dist/chunk-IDCSOZVN.js +78 -0
  251. package/dist/chunk-IEXU4RR6.js +5742 -0
  252. package/dist/chunk-IFCBYECK.js +112 -0
  253. package/dist/chunk-IFZCPEY2.js +66 -0
  254. package/dist/chunk-IKFP2KUR.js +48 -0
  255. package/dist/chunk-IP7BYVUV.js +338 -0
  256. package/dist/chunk-IRJ2I6KH.js +166 -0
  257. package/dist/chunk-IUXNGKA6.js +152 -0
  258. package/dist/chunk-IZYIQQ7X.js +53 -0
  259. package/dist/chunk-IZZK3H6I.js +2175 -0
  260. package/dist/chunk-J3J4P7RW.js +353 -0
  261. package/dist/chunk-J62KPGII.js +464 -0
  262. package/dist/chunk-J6P3FWWW.js +130 -0
  263. package/dist/chunk-JD6SIZED.js +712 -0
  264. package/dist/chunk-JEV6UI7H.js +537 -0
  265. package/dist/chunk-JKBHJQMT.js +434 -0
  266. package/dist/chunk-JLS65NUQ.js +14 -0
  267. package/dist/chunk-JOSYEJKY.js +141 -0
  268. package/dist/chunk-JPKSXKNB.js +94 -0
  269. package/dist/chunk-JQD5VYKR.js +483 -0
  270. package/dist/chunk-JSOWEFEQ.js +351 -0
  271. package/dist/chunk-JSWMRQYG.js +28 -0
  272. package/dist/chunk-K4XK7SGB.js +6783 -0
  273. package/dist/chunk-K54Y7MLK.js +160 -0
  274. package/dist/chunk-KAT4RXUT.js +521 -0
  275. package/dist/chunk-KDMKKIRK.js +103 -0
  276. package/dist/chunk-KM3F7SYE.js +702 -0
  277. package/dist/chunk-KNDYMVWN.js +102 -0
  278. package/dist/chunk-KNT72VR6.js +132 -0
  279. package/dist/chunk-KQEBSK3T.js +274 -0
  280. package/dist/chunk-KT6VHSPF.js +84 -0
  281. package/dist/chunk-KTMW65UX.js +14 -0
  282. package/dist/chunk-L4427KOE.js +26 -0
  283. package/dist/chunk-L6OM4A22.js +189 -0
  284. package/dist/chunk-L7E6XCRA.js +1042 -0
  285. package/dist/chunk-L7JZLXQL.js +173 -0
  286. package/dist/chunk-LAMKBTXX.js +40 -0
  287. package/dist/chunk-LDCF2MKN.js +132 -0
  288. package/dist/chunk-LEIIWPWQ.js +78 -0
  289. package/dist/chunk-LFTQVYBB.js +31 -0
  290. package/dist/chunk-LGHII5ET.js +23 -0
  291. package/dist/chunk-LH34OGSB.js +265 -0
  292. package/dist/chunk-LO3X5NLS.js +326 -0
  293. package/dist/chunk-LPITVM7M.js +339 -0
  294. package/dist/chunk-LR5IJIGV.js +810 -0
  295. package/dist/chunk-LUVKFFWR.js +315 -0
  296. package/dist/chunk-LWCBNGH6.js +35 -0
  297. package/dist/chunk-LWTN3WRV.js +260 -0
  298. package/dist/chunk-LZBBXYWF.js +1004 -0
  299. package/dist/chunk-M34PS4NE.js +2213 -0
  300. package/dist/chunk-M3HQYKQX.js +308 -0
  301. package/dist/chunk-MCPQNJMK.js +482 -0
  302. package/dist/chunk-MF5HP6XV.js +221 -0
  303. package/dist/chunk-MFADRRTR.js +112 -0
  304. package/dist/chunk-MN6PL4AN.js +120 -0
  305. package/dist/chunk-MQ4WA34C.js +206 -0
  306. package/dist/chunk-MTVZITQ2.js +185 -0
  307. package/dist/chunk-MWHF5V7U.js +223 -0
  308. package/dist/chunk-MWHLBPNU.js +211 -0
  309. package/dist/chunk-MWK5UZQ3.js +1068 -0
  310. package/dist/chunk-MYLH2S4G.js +64 -0
  311. package/dist/chunk-MZ5WYKNA.js +28 -0
  312. package/dist/chunk-N5DX4JAK.js +12 -0
  313. package/dist/chunk-NEDCMN7E.js +415 -0
  314. package/dist/chunk-NEQUQHOX.js +223 -0
  315. package/dist/chunk-NGK6PEOG.js +25 -0
  316. package/dist/chunk-NM6PMYY4.js +768 -0
  317. package/dist/chunk-NOZGR2QO.js +2373 -0
  318. package/dist/chunk-NP2V3L7K.js +226 -0
  319. package/dist/chunk-NPZJMUZ4.js +194 -0
  320. package/dist/chunk-NRLY536M.js +260 -0
  321. package/dist/chunk-NS33V3IM.js +51 -0
  322. package/dist/chunk-NWOYOA6H.js +378 -0
  323. package/dist/chunk-NWRUSEXG.js +322 -0
  324. package/dist/chunk-O6V4PNLO.js +63 -0
  325. package/dist/chunk-OGMSYL6J.js +227 -0
  326. package/dist/chunk-OIS7J26S.js +319 -0
  327. package/dist/chunk-OKBTRSZI.js +205 -0
  328. package/dist/chunk-OMX5VL43.js +79 -0
  329. package/dist/chunk-ON3G73BU.js +264 -0
  330. package/dist/chunk-OPYFYTWQ.js +220 -0
  331. package/dist/chunk-OQ6K46CK.js +1734 -0
  332. package/dist/chunk-OSDYVKHW.js +2440 -0
  333. package/dist/chunk-OUM5S64R.js +3429 -0
  334. package/dist/chunk-OWB7JXUS.js +751 -0
  335. package/dist/chunk-OYZYO7TV.js +47 -0
  336. package/dist/chunk-P47VN5F4.js +282 -0
  337. package/dist/chunk-P6VQROCO.js +594 -0
  338. package/dist/chunk-P7CQGPLS.js +30 -0
  339. package/dist/chunk-PA6BCSOX.js +2872 -0
  340. package/dist/chunk-PGSPX4SU.js +15 -0
  341. package/dist/chunk-PIKLF7BM.js +432 -0
  342. package/dist/chunk-PJWJ3SAV.js +22 -0
  343. package/dist/chunk-PKIFMV72.js +100 -0
  344. package/dist/chunk-PTH5E5XO.js +195 -0
  345. package/dist/chunk-PYITM4N2.js +79 -0
  346. package/dist/chunk-PZ5AY32C.js +10 -0
  347. package/dist/chunk-Q3RO7N35.js +45 -0
  348. package/dist/chunk-Q3WIC6GQ.js +2670 -0
  349. package/dist/chunk-QGJDMEOV.js +34 -0
  350. package/dist/chunk-QJYIHVXT.js +100 -0
  351. package/dist/chunk-QNOB37UH.js +58 -0
  352. package/dist/chunk-QOCOVLUH.js +462 -0
  353. package/dist/chunk-QTCJ5CC5.js +172 -0
  354. package/dist/chunk-QU6JQJMH.js +3063 -0
  355. package/dist/chunk-QVFV5IP2.js +232 -0
  356. package/dist/chunk-QVZMFDYG.js +29 -0
  357. package/dist/chunk-R2ZYWNW3.js +1581 -0
  358. package/dist/chunk-R4UWBC35.js +200 -0
  359. package/dist/chunk-R6W23LKN.js +254 -0
  360. package/dist/chunk-RAK5HOIJ.js +459 -0
  361. package/dist/chunk-RDFRCT64.js +168 -0
  362. package/dist/chunk-RE5VZDFQ.js +58 -0
  363. package/dist/chunk-RGROYC2G.js +638 -0
  364. package/dist/chunk-RGWHUI5E.js +68 -0
  365. package/dist/chunk-RHVG6UNL.js +205 -0
  366. package/dist/chunk-RI4EX2QE.js +18 -0
  367. package/dist/chunk-RIKFAWZF.js +71 -0
  368. package/dist/chunk-RJAAKDRX.js +17 -0
  369. package/dist/chunk-RSXSD4MH.js +1016 -0
  370. package/dist/chunk-RW7RVSDV.js +79 -0
  371. package/dist/chunk-RWREC3KJ.js +517 -0
  372. package/dist/chunk-RZY7RKM5.js +500 -0
  373. package/dist/chunk-S2MNWFAG.js +52 -0
  374. package/dist/chunk-S2VQCZO4.js +22 -0
  375. package/dist/chunk-S54MKU6V.js +117 -0
  376. package/dist/chunk-S77XPALC.js +239 -0
  377. package/dist/chunk-SCW4ZF6R.js +150 -0
  378. package/dist/chunk-SKHGYQ7W.js +405 -0
  379. package/dist/chunk-SNLBO4BF.js +247 -0
  380. package/dist/chunk-SP3LFU6B.js +60 -0
  381. package/dist/chunk-SQZRPY23.js +5181 -0
  382. package/dist/chunk-SSB5UQHA.js +4128 -0
  383. package/dist/chunk-STJOHHSF.js +605 -0
  384. package/dist/chunk-STV6LYYE.js +45 -0
  385. package/dist/chunk-SUN4OFTW.js +740 -0
  386. package/dist/chunk-SURZ2WFE.js +326 -0
  387. package/dist/chunk-SUZ7UYZH.js +1972 -0
  388. package/dist/chunk-SZ7DL357.js +1047 -0
  389. package/dist/chunk-T2SZELJL.js +624 -0
  390. package/dist/chunk-T6VPI2XP.js +10338 -0
  391. package/dist/chunk-TAJPCXSB.js +13 -0
  392. package/dist/chunk-TAOOYK3P.js +358 -0
  393. package/dist/chunk-TDSEX5CF.js +24 -0
  394. package/dist/chunk-TFTGP7Z7.js +174 -0
  395. package/dist/chunk-TGON4N4O.js +197 -0
  396. package/dist/chunk-TIBZPAD2.js +9924 -0
  397. package/dist/chunk-TK644IOG.js +1813 -0
  398. package/dist/chunk-TRSVUPCX.js +25 -0
  399. package/dist/chunk-TSPQONRT.js +4533 -0
  400. package/dist/chunk-TSXGRLPR.js +107 -0
  401. package/dist/chunk-TWYLVAS2.js +152 -0
  402. package/dist/chunk-U2S3YEX3.js +224 -0
  403. package/dist/chunk-U32HWI76.js +437 -0
  404. package/dist/chunk-U45RTRGY.js +818 -0
  405. package/dist/chunk-U62VCQGR.js +49 -0
  406. package/dist/chunk-UDMS5AD3.js +307 -0
  407. package/dist/chunk-UGX7GI37.js +94 -0
  408. package/dist/chunk-UH3JJSHK.js +1 -0
  409. package/dist/chunk-UHRBTZYY.js +208 -0
  410. package/dist/chunk-UHT2KRG5.js +193 -0
  411. package/dist/chunk-UI2F6DJ5.js +118 -0
  412. package/dist/chunk-UKMAFG7A.js +189 -0
  413. package/dist/chunk-UUH2RVKS.js +585 -0
  414. package/dist/chunk-UVBBFDFQ.js +270 -0
  415. package/dist/chunk-UXZF3B7T.js +75 -0
  416. package/dist/chunk-V6YLL5WA.js +3746 -0
  417. package/dist/chunk-V72RMBM4.js +48 -0
  418. package/dist/chunk-VBNCKCCI.js +16 -0
  419. package/dist/chunk-VCAUV5XQ.js +3679 -0
  420. package/dist/chunk-VDSH7O4Y.js +152 -0
  421. package/dist/chunk-VNSYKC25.js +24 -0
  422. package/dist/chunk-VTLNJQ44.js +133 -0
  423. package/dist/chunk-VV6HOXRC.js +302 -0
  424. package/dist/chunk-VVGEPBPS.js +218 -0
  425. package/dist/chunk-VXF4Q3FW.js +20 -0
  426. package/dist/chunk-W3ZGW3C5.js +331 -0
  427. package/dist/chunk-W4OMESPG.js +271 -0
  428. package/dist/chunk-WDUORIHF.js +877 -0
  429. package/dist/chunk-WDVTY4U6.js +148 -0
  430. package/dist/chunk-WGXYDLMX.js +4386 -0
  431. package/dist/chunk-WMPU2UOV.js +82 -0
  432. package/dist/chunk-WOEVVPDP.js +1125 -0
  433. package/dist/chunk-WTLMSPBQ.js +256 -0
  434. package/dist/chunk-X43NMU4Z.js +1124 -0
  435. package/dist/chunk-X5NTI5U5.js +368 -0
  436. package/dist/chunk-X6UIEADS.js +949 -0
  437. package/dist/chunk-XAONGNST.js +57 -0
  438. package/dist/chunk-XB5YLCLB.js +13 -0
  439. package/dist/chunk-XGYF2QMZ.js +351 -0
  440. package/dist/chunk-XHEKQENB.js +255 -0
  441. package/dist/chunk-XPHKYHO4.js +878 -0
  442. package/dist/chunk-XQD2B6BB.js +507 -0
  443. package/dist/chunk-XT2ZQVTC.js +558 -0
  444. package/dist/chunk-XUSRFFA7.js +1859 -0
  445. package/dist/chunk-XUXVDPSZ.js +50 -0
  446. package/dist/chunk-XV7NZL4B.js +57 -0
  447. package/dist/chunk-XXCGJGSQ.js +121 -0
  448. package/dist/chunk-XYGDZCB5.js +659 -0
  449. package/dist/chunk-XZAMZUX5.js +992 -0
  450. package/dist/chunk-XZE4XARH.js +563 -0
  451. package/dist/chunk-Y34DUC4A.js +1356 -0
  452. package/dist/chunk-Y3J4JMTU.js +61 -0
  453. package/dist/chunk-Y4RC2YFX.js +1270 -0
  454. package/dist/chunk-Y55LZN5U.js +52 -0
  455. package/dist/chunk-Y5677NDO.js +183 -0
  456. package/dist/chunk-YESZJFK6.js +220 -0
  457. package/dist/chunk-YGXKOBQQ.js +292 -0
  458. package/dist/chunk-YMX76IOS.js +31 -0
  459. package/dist/chunk-YOTXESEH.js +257 -0
  460. package/dist/chunk-YQAAKTVH.js +712 -0
  461. package/dist/chunk-YVORHQ2S.js +579 -0
  462. package/dist/chunk-YWNAHW24.js +1552 -0
  463. package/dist/chunk-Z476RATD.js +1689 -0
  464. package/dist/chunk-ZDTGECTN.js +235 -0
  465. package/dist/chunk-ZDTMICNY.js +316 -0
  466. package/dist/chunk-ZIPWI2LY.js +151 -0
  467. package/dist/chunk-ZIVYXF7A.js +2344 -0
  468. package/dist/chunk-ZX65UI5W.js +78 -0
  469. package/dist/chunk-ZYG7GGKO.js +218 -0
  470. package/dist/chunk-ZZZUL4OF.js +38 -0
  471. package/dist/cli-utils-HUOTBRM3.js +40 -0
  472. package/dist/cli-validation-WLXWLUJL.js +111 -0
  473. package/dist/commit-utils-3QV2P6RA.js +202 -0
  474. package/dist/compete-config-resolver-SNH3TT2Q.js +76 -0
  475. package/dist/compete-request-XWNPOARL.js +364 -0
  476. package/dist/compete-results-PAP67LDR.js +208 -0
  477. package/dist/competition-outcome-tracker-GOZXNAQU.js +38 -0
  478. package/dist/config-HWHUNA72.js +166 -0
  479. package/dist/config-audit-EL3GHXS7.js +360 -0
  480. package/dist/config-explain-TNILDEVJ.js +12 -0
  481. package/dist/config-loader-VPFPFO4B.js +38 -0
  482. package/dist/config-manager-L3VRNTSG.js +67 -0
  483. package/dist/config-validator-SIIQEOFQ.js +72 -0
  484. package/dist/cost-7CX37DU3.js +53 -0
  485. package/dist/coverage-orchestrator-MNKHD6YC.js +772 -0
  486. package/dist/coverage-scanner-YVD62MLH.js +12 -0
  487. package/dist/createCompetitionRunner-LJG6ZQSO.js +46 -0
  488. package/dist/data-migration-state-VJK64DLT.js +31 -0
  489. package/dist/db-migrator-XSEIOGWY.js +34 -0
  490. package/dist/discovery-JGYGDD25.js +25 -0
  491. package/dist/doctor-CGBCD7IQ.js +186 -0
  492. package/dist/domain-analyzer-DL6BDR2N.js +29 -0
  493. package/dist/ensure-initialized-4BY73HLE.js +52 -0
  494. package/dist/entry.js +940 -0
  495. package/dist/environment-IGVH5X53.js +81 -0
  496. package/dist/error-parser-core-PPZ36A4S.js +50 -0
  497. package/dist/escalation-ladder-NWY5BJ57.js +130 -0
  498. package/dist/evaluation-context-KMWDSDYD.js +35 -0
  499. package/dist/evidence-plan-resolver-YIVH76PU.js +85 -0
  500. package/dist/execution-data-writer-OHAQ7G5H.js +53 -0
  501. package/dist/execution-policy-applier-ZHD3DCF3.js +31 -0
  502. package/dist/execution-preflight-Z4Y64V3I.js +209 -0
  503. package/dist/execution-roles-KBH2MC3M.js +66 -0
  504. package/dist/exit-code-error-Z4SW2DVK.js +14 -0
  505. package/dist/external-temp-cleanup-N2RZH4QP.js +311 -0
  506. package/dist/factory-IYBMCZG7.js +149 -0
  507. package/dist/file-utils-XIVR2ZMA.js +47 -0
  508. package/dist/flywheel-autoloop-executor-R3KD2G4D.js +249 -0
  509. package/dist/flywheel-competition-executor-XCFGVJSK.js +259 -0
  510. package/dist/flywheel-executor-LTSIZN2L.js +369 -0
  511. package/dist/flywheel-git-isolation-CZ5YVVZY.js +48 -0
  512. package/dist/flywheel-manifest-5UC4VBMA.js +108 -0
  513. package/dist/flywheel-model-defaults-7CVKP53V.js +27 -0
  514. package/dist/flywheel-preflight-6E33DJDK.js +104 -0
  515. package/dist/flywheel-resume-7HELH7QS.js +23 -0
  516. package/dist/flywheel-safety-7U7DPOAP.js +28 -0
  517. package/dist/flywheel-scope-decision-ZHKF6ZIN.js +11 -0
  518. package/dist/get-telemetry-logger-AZ46EPRP.js +73 -0
  519. package/dist/git-worktree-IY6V6DUO.js +18 -0
  520. package/dist/github-pr-manager-4XUO2YTM.js +211 -0
  521. package/dist/guidance-profile-config-E7XJL2VP.js +117 -0
  522. package/dist/guidance-profile-renderer-QK2YMAAP.js +21 -0
  523. package/dist/index-query-4JEUKA44.js +31 -0
  524. package/dist/index.js +108644 -0
  525. package/dist/instructions-CM6THDV7.js +64 -0
  526. package/dist/invoke-provider-auth-V5TC5UDS.js +223 -0
  527. package/dist/judge-scoring.json +80 -0
  528. package/dist/judge-test.js +555 -0
  529. package/dist/lab-mode-OTWVHN63.js +39 -0
  530. package/dist/lab-utils-VA6VXNOV.js +23 -0
  531. package/dist/linux-host-class-UY4KVLFD.js +29 -0
  532. package/dist/llm-judge-executor-34YPIRJ7.js +133 -0
  533. package/dist/local-executor-LJJSCWZX.js +223 -0
  534. package/dist/logger-6PRYM56M.js +72 -0
  535. package/dist/loop-spec-XTLQAVZ7.js +191 -0
  536. package/dist/manager-2HJG5CLT.js +25 -0
  537. package/dist/matrix-prompt-builder-LHDTJ4TY.js +497 -0
  538. package/dist/matrix-result-parser-7W35EUOV.js +15 -0
  539. package/dist/metadata-HQ43NDEK.js +22 -0
  540. package/dist/model-invocations-db-QBO4Y7WZ.js +38 -0
  541. package/dist/monitor-MCI3F4PX.js +72 -0
  542. package/dist/next-HQKDXIIR.js +90 -0
  543. package/dist/next-JC3V2UCS.js +69 -0
  544. package/dist/optimization-config-resolver-QPSFLCJU.js +75 -0
  545. package/dist/package-3YCWIQQ5.js +10 -0
  546. package/dist/parallel-orchestrator-NL7YJJU2.js +297 -0
  547. package/dist/parallel-worker.js +279 -0
  548. package/dist/parse-git-status-PIAF3OTP.js +10 -0
  549. package/dist/path-security-ETTH6TZL.js +39 -0
  550. package/dist/pattern-bank-UNJR5ADV.js +15 -0
  551. package/dist/plan-backlog-list-fast-DZK24LSZ.js +270 -0
  552. package/dist/plan-backlog-show-fast-63GBBH6Q.js +406 -0
  553. package/dist/plan-sprint-list-fast-TJ6ZUF5E.js +162 -0
  554. package/dist/plan-sprint-status-fast-YWE5X3NG.js +208 -0
  555. package/dist/plan-task-status-fast-K22BTTBW.js +349 -0
  556. package/dist/plan-to-flywheel-VFGCPINA.js +456 -0
  557. package/dist/planning-backlog-Y6TIJYWU.js +319 -0
  558. package/dist/poetic-root-V5DNXEAE.js +17 -0
  559. package/dist/preflight-OPANWMME.js +12 -0
  560. package/dist/process-registry-PDZJPTAS.js +27 -0
  561. package/dist/process-scanner-C22SYXYD.js +22 -0
  562. package/dist/processes-KMQUD7HY.js +29 -0
  563. package/dist/processes-json-fast-IBDXZ6WW.js +135 -0
  564. package/dist/profile-2XP3FWH2.js +149 -0
  565. package/dist/prompts-EPAAAMMF.js +168 -0
  566. package/dist/protected-branches-RNTEX7ET.js +57 -0
  567. package/dist/provider-aware-resource-manager-QBTZJMNP.js +18 -0
  568. package/dist/provider-matrix-KWTYA5QV.js +154 -0
  569. package/dist/provider-matrix-renderer-MZDWKKID.js +139 -0
  570. package/dist/provider-output-forwarding-DERID3TP.js +30 -0
  571. package/dist/provider-registry-J5NRBJKI.js +128 -0
  572. package/dist/provider-temp-cleanup-KYGLF6YU.js +14 -0
  573. package/dist/prune-engine-Q6E2DXBN.js +451 -0
  574. package/dist/quality-gate-33SHK43X.js +70 -0
  575. package/dist/quickstart-E32SODTA.js +62 -0
  576. package/dist/readiness-REWW7OSV.js +96 -0
  577. package/dist/registry-N6L36RE2.js +153 -0
  578. package/dist/repair-helpers-TTV5FEF4.js +117 -0
  579. package/dist/repo-root-2IGD4H7X.js +22 -0
  580. package/dist/resolution-engine-LXQYDSKS.js +127 -0
  581. package/dist/resolve-provider-cli-O2P6XZBZ.js +35 -0
  582. package/dist/restore-telemetry-db-BQL6DTQF.js +360 -0
  583. package/dist/result-streamer-WEHW476R.js +19 -0
  584. package/dist/routing-events-DHPUZDDF.js +27 -0
  585. package/dist/routing-history-store-UWCEXAP3.js +46 -0
  586. package/dist/routing-planner-VGQU35QM.js +160 -0
  587. package/dist/run-poetic-tui-ZZXFDOQ4.js +13517 -0
  588. package/dist/run-simulation.js +376 -0
  589. package/dist/runner-2YPKOJ6A.js +1092 -0
  590. package/dist/runner-HEJJ65AJ.js +1571 -0
  591. package/dist/safety-OCC4KJJR.js +64 -0
  592. package/dist/safety-stanza-BSVE6OJU.js +60 -0
  593. package/dist/sandbox-3AG2WJLM.js +94 -0
  594. package/dist/sandbox-5JOFBS75.js +81 -0
  595. package/dist/schema-extensions.sql +234 -0
  596. package/dist/security-2KI5XNDG.js +17 -0
  597. package/dist/setup-bb-plugin-QAQWZCV5.js +738 -0
  598. package/dist/setup-claude-code-P7BTTSPO.js +317 -0
  599. package/dist/setup-temp-cleanup-GASCWZ2I.js +20 -0
  600. package/dist/shared-utils-D6U6UREP.js +37 -0
  601. package/dist/simple-artifact-goal-OTXNGZY6.js +25 -0
  602. package/dist/sprint-QGXLN3SO.js +338 -0
  603. package/dist/sprint-bridge-FNKQCJGL.js +68 -0
  604. package/dist/sprint-execution-service-4ELKNJDS.js +311 -0
  605. package/dist/sprint-manager-7TNCXCIX.js +91 -0
  606. package/dist/sqlite-wrapper-UDWCTNLJ.js +17 -0
  607. package/dist/stale-cleanup-orchestrator-H5XKGZP2.js +62 -0
  608. package/dist/storage-access-F6ALDN4S.js +22 -0
  609. package/dist/synthesis-TGQUVAW3.js +185 -0
  610. package/dist/task-classifier-DZIRBSS2.js +494 -0
  611. package/dist/task-list-fast-PJ2EXVZE.js +147 -0
  612. package/dist/task-manager-5742GMJK.js +93 -0
  613. package/dist/task-splitter-6MBXSWF6.js +79 -0
  614. package/dist/task-type-detector-OLVOMXZO.js +21 -0
  615. package/dist/task-type-resolver-4HG6TXFV.js +42 -0
  616. package/dist/telemetry-JX7EMNOZ.js +131 -0
  617. package/dist/telemetry-health-tracker-DMSSGBZ2.js +11 -0
  618. package/dist/telemetry-path-resolver-7ICSG276.js +28 -0
  619. package/dist/telemetry-reliability-2MLJ4J6B.js +125 -0
  620. package/dist/token-estimator-PDU345YE.js +37 -0
  621. package/dist/transports-3UEO6C5Y.js +255 -0
  622. package/dist/unified-cost-tracker-F3W5NMPG.js +35 -0
  623. package/dist/unified-state-cleanup-LJPF2BOW.js +276 -0
  624. package/dist/universal-cost-calculator-BAJV35GA.js +42 -0
  625. package/dist/user-agents-GHUGCSKN.js +22 -0
  626. package/dist/variant-delivery-state-XCOYVCM4.js +33 -0
  627. package/dist/variant-state-cleanup-QIEKRULB.js +280 -0
  628. package/dist/variant-success-PJXWE3ZV.js +12 -0
  629. package/dist/variant-worker-HPTUA37Z.js +4196 -0
  630. package/dist/variant-worker.js +24 -0
  631. package/dist/variants-2HDYZOCG.js +233 -0
  632. package/dist/verification-toolchains-VVKT3GBF.js +28 -0
  633. package/dist/verify-commands-5F6CJV4B.js +37 -0
  634. package/dist/warning-EGQGUUIO.js +12 -0
  635. package/dist/work-edge-RWEDWJZF.js +49 -0
  636. package/dist/work-item-writer-WHAVZXAY.js +19 -0
  637. package/dist/worker-AGWHD4D2.js +1435 -0
  638. package/dist/worker.js +19 -0
  639. package/dist/worktree-metrics-3DFUYVYE.js +26 -0
  640. package/dist/writeback-VZKHYHSN.js +44 -0
  641. package/docs/CLI_REFERENCE.md +7040 -0
  642. package/docs/PROVIDER_SETUP.md +1570 -0
  643. package/docs/README.md +96 -0
  644. package/docs/TROUBLESHOOTING.md +2232 -0
  645. package/docs/getting-started/QUICK_START.md +294 -0
  646. package/docs/getting-started/README.md +188 -0
  647. package/docs/getting-started/SETUP.md +52 -0
  648. package/docs/reference/AGENT_CONTEXT.md +38 -0
  649. package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
  650. package/docs/reference/README.md +381 -0
  651. package/docs/reference/SECURITY.md +262 -0
  652. package/integrations/bb-plugin-poetic/README.md +362 -0
  653. package/integrations/bb-plugin-poetic/app.css +341 -0
  654. package/integrations/bb-plugin-poetic/app.tsx +5059 -0
  655. package/integrations/bb-plugin-poetic/package.json +45 -0
  656. package/integrations/bb-plugin-poetic/server.ts +444 -0
  657. package/integrations/bb-plugin-poetic/src/adapter.ts +3312 -0
  658. package/integrations/bb-plugin-poetic/src/backlog-authoring-model.ts +150 -0
  659. package/integrations/bb-plugin-poetic/src/backlog-authoring-schema.ts +355 -0
  660. package/integrations/bb-plugin-poetic/src/backlog-authoring-service.ts +419 -0
  661. package/integrations/bb-plugin-poetic/src/backlog-authoring-view.ts +1026 -0
  662. package/integrations/bb-plugin-poetic/src/competition-defaults-schema.ts +122 -0
  663. package/integrations/bb-plugin-poetic/src/competition-defaults-service.ts +105 -0
  664. package/integrations/bb-plugin-poetic/src/competition-defaults-view.ts +138 -0
  665. package/integrations/bb-plugin-poetic/src/contract.ts +615 -0
  666. package/integrations/bb-plugin-poetic/src/finalize-model.ts +205 -0
  667. package/integrations/bb-plugin-poetic/src/finalize-schema.ts +158 -0
  668. package/integrations/bb-plugin-poetic/src/finalize-service.ts +382 -0
  669. package/integrations/bb-plugin-poetic/src/finalize-view.ts +159 -0
  670. package/integrations/bb-plugin-poetic/src/judge-operations-readback.ts +303 -0
  671. package/integrations/bb-plugin-poetic/src/judge-operations-schema.ts +33 -0
  672. package/integrations/bb-plugin-poetic/src/judge-operations-view.ts +459 -0
  673. package/integrations/bb-plugin-poetic/src/model.ts +1302 -0
  674. package/integrations/bb-plugin-poetic/src/monitor-service.ts +233 -0
  675. package/integrations/bb-plugin-poetic/src/panel-read-ux.ts +97 -0
  676. package/integrations/bb-plugin-poetic/src/patch-preview-schema.ts +166 -0
  677. package/integrations/bb-plugin-poetic/src/patch-preview-service.ts +480 -0
  678. package/integrations/bb-plugin-poetic/src/patch-preview-view.ts +109 -0
  679. package/integrations/bb-plugin-poetic/src/planning-readback.ts +204 -0
  680. package/integrations/bb-plugin-poetic/src/planning-service.ts +594 -0
  681. package/integrations/bb-plugin-poetic/src/planning-workspace-schema.ts +95 -0
  682. package/integrations/bb-plugin-poetic/src/planning-workspace.ts +323 -0
  683. package/integrations/bb-plugin-poetic/src/poll-handoff.ts +136 -0
  684. package/integrations/bb-plugin-poetic/src/project-target-server.ts +21 -0
  685. package/integrations/bb-plugin-poetic/src/project-target.ts +45 -0
  686. package/integrations/bb-plugin-poetic/src/reference-index.ts +192 -0
  687. package/integrations/bb-plugin-poetic/src/repository-schema.ts +30 -0
  688. package/integrations/bb-plugin-poetic/src/result-explorer-view.ts +597 -0
  689. package/integrations/bb-plugin-poetic/src/result-readback-model.ts +163 -0
  690. package/integrations/bb-plugin-poetic/src/result-readback-schema.ts +319 -0
  691. package/integrations/bb-plugin-poetic/src/result-readback-service.ts +333 -0
  692. package/integrations/bb-plugin-poetic/src/run-page-view.ts +177 -0
  693. package/integrations/bb-plugin-poetic/src/setup-config-schema.ts +291 -0
  694. package/integrations/bb-plugin-poetic/src/setup-config-service.ts +590 -0
  695. package/integrations/bb-plugin-poetic/src/setup-config-view.ts +413 -0
  696. package/integrations/bb-plugin-poetic/src/sprint-close-model.ts +150 -0
  697. package/integrations/bb-plugin-poetic/src/sprint-close-schema.ts +136 -0
  698. package/integrations/bb-plugin-poetic/src/sprint-close-service.ts +341 -0
  699. package/integrations/bb-plugin-poetic/src/sprint-close-view.ts +116 -0
  700. package/integrations/bb-plugin-poetic/src/sprint-composition-model.ts +714 -0
  701. package/integrations/bb-plugin-poetic/src/sprint-composition-readback.ts +231 -0
  702. package/integrations/bb-plugin-poetic/src/sprint-composition-schema.ts +601 -0
  703. package/integrations/bb-plugin-poetic/src/sprint-composition-service.ts +775 -0
  704. package/integrations/bb-plugin-poetic/src/sprint-composition-view.ts +1221 -0
  705. package/integrations/bb-plugin-poetic/src/task-authoring-model.ts +567 -0
  706. package/integrations/bb-plugin-poetic/src/task-authoring-schema.ts +635 -0
  707. package/integrations/bb-plugin-poetic/src/task-authoring-service.ts +842 -0
  708. package/integrations/bb-plugin-poetic/src/task-authoring-view.ts +1227 -0
  709. package/integrations/bb-plugin-poetic/src/task-detail-readback.ts +56 -0
  710. package/integrations/bb-plugin-poetic/src/task-detail-schema.ts +144 -0
  711. package/integrations/bb-plugin-poetic/src/task-navigation.ts +446 -0
  712. package/integrations/bb-plugin-poetic/src/workbench-route.ts +74 -0
  713. package/integrations/bb-plugin-poetic/tests/host-contract.test.ts +773 -0
  714. package/integrations/bb-plugin-poetic/tsconfig.json +18 -0
  715. package/integrations/bb-plugin-poetic/types/PROVENANCE.json +52 -0
  716. package/integrations/bb-plugin-poetic/types/bb-plugin-sdk-app.d.ts +1444 -0
  717. package/integrations/bb-plugin-poetic/types/bb-plugin-sdk.d.ts +13030 -0
  718. package/integrations/bb-plugin-poetic/vitest.host.config.ts +71 -0
  719. package/package.json +331 -0
  720. package/schemas/README.md +80 -0
  721. package/schemas/config-v1.schema.json +136 -0
  722. package/schemas/execution-config.schema.json +47 -0
  723. package/schemas/judge-scoring.schema.json +370 -0
  724. package/schemas/poetic.config.schema.json +2214 -0
  725. package/schemas/provider-config.schema.json +203 -0
  726. package/schemas/telemetry-config.schema.json +79 -0
  727. package/schemas/user-preferences.schema.json +141 -0
  728. package/scripts/assert-node-runtime.mjs +140 -0
  729. package/scripts/preflight-native.mjs +49 -0
  730. package/scripts/preinstall-node-check.mjs +78 -0
  731. package/scripts/setup-git-hooks.mjs +24 -0
  732. package/scripts/sync.sh +2722 -0
  733. package/scripts/write-node-launcher.sh +108 -0
  734. package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
  735. package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
  736. package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
  737. package/templates/.poetic/README.md +37 -0
  738. package/templates/.poetic/agents/README.md +296 -0
  739. package/templates/.poetic/agents/api-documenter.md +147 -0
  740. package/templates/.poetic/agents/backend-architect.md +31 -0
  741. package/templates/.poetic/agents/code-reviewer.md +157 -0
  742. package/templates/.poetic/agents/data-scientist.md +179 -0
  743. package/templates/.poetic/agents/database-optimizer.md +145 -0
  744. package/templates/.poetic/agents/debugger.md +31 -0
  745. package/templates/.poetic/agents/deployment-engineer.md +164 -0
  746. package/templates/.poetic/agents/devops-troubleshooter.md +139 -0
  747. package/templates/.poetic/agents/frontend-developer.md +150 -0
  748. package/templates/.poetic/agents/javascript-pro.md +36 -0
  749. package/templates/.poetic/agents/performance-engineer.md +151 -0
  750. package/templates/.poetic/agents/python-pro.md +137 -0
  751. package/templates/.poetic/agents/test-automator.md +147 -0
  752. package/templates/.poetic/agents/typescript-pro.md +34 -0
  753. package/templates/.poetic/config/poetic.config.jsonc +69 -0
  754. package/templates/.poetic/config/project-context.template.json +6 -0
  755. package/templates/.poetic/config/task-type-aliases.presets/kanban.yaml +14 -0
  756. package/templates/.poetic/config/task-type-aliases.presets/scrum.yaml +17 -0
  757. package/templates/.poetic/config/task-type-aliases.presets/xp.yaml +12 -0
  758. package/templates/.poetic/config/task-type-aliases.yaml +28 -0
  759. package/templates/.poetic/gitignore.template +55 -0
  760. package/templates/.poetic/task-types/analysis.yaml +40 -0
  761. package/templates/.poetic/task-types/architecture.yaml +38 -0
  762. package/templates/.poetic/task-types/doc.yaml +35 -0
  763. package/templates/.poetic/task-types/feature.yaml +23 -0
  764. package/templates/.poetic/task-types/general.yaml +6 -0
  765. package/templates/.poetic/task-types/security.yaml +39 -0
  766. package/templates/AGENTS.template.md +99 -0
  767. package/templates/CLAUDE.template.md +1 -0
  768. package/templates/GEMINI.template.md +1 -0
  769. package/templates/builtin-workflows/code-review.yaml +73 -0
  770. package/templates/builtin-workflows/compete-streak.yaml +78 -0
  771. package/templates/builtin-workflows/hello-verify.yaml +10 -0
  772. package/templates/builtin-workflows/judge-regression.yaml +114 -0
  773. package/templates/builtin-workflows/skills/code-review/SKILL.md +60 -0
  774. package/templates/builtin-workflows/skills/hello-verify/SKILL.md +6 -0
  775. package/templates/guard-kit/GUARD_SETUP.md.template +255 -0
  776. package/templates/guard-kit/check.mjs.template +777 -0
  777. package/templates/guard-kit/config.json.template +6 -0
  778. package/templates/guard-kit/poetic-guard.yml.template +189 -0
  779. package/templates/profiles/README.md +56 -0
  780. package/templates/profiles/frontier-claude.json +27 -0
  781. package/templates/profiles/frontier-codex.json +26 -0
@@ -0,0 +1,1604 @@
1
+ import {
2
+ findLabRun,
3
+ findLatestLabRun,
4
+ listLabRuns
5
+ } from "./chunk-MTVZITQ2.js";
6
+ import {
7
+ readCompetitionState
8
+ } from "./chunk-32VLDFRT.js";
9
+ import {
10
+ ExitCodeError
11
+ } from "./chunk-FUVP64ER.js";
12
+ import {
13
+ deriveTestVerificationDisplay
14
+ } from "./chunk-QNOB37UH.js";
15
+ import {
16
+ LabPathResolver
17
+ } from "./chunk-7GDRQBQC.js";
18
+ import {
19
+ resolveCliRepoRoot
20
+ } from "./chunk-L7JZLXQL.js";
21
+
22
+ // src/cli/commands/telemetry-reliability.ts
23
+ import * as fs from "fs";
24
+ import * as path from "path";
25
+ import chalk from "chalk";
26
+ import { Command } from "commander";
27
+ import { z } from "zod";
28
+ var RELIABILITY_PROFILES = ["advisory", "strict"];
29
+ var PROVIDER_SPIKE_MIN_TOTAL = 3;
30
+ var PROVIDER_SPIKE_MIN_FAILURES = 2;
31
+ var PROVIDER_SPIKE_FAILURE_RATE = 0.5;
32
+ var FALLBACK_RATE_MIN_ATTEMPTS = 3;
33
+ var FALLBACK_RATE_WARNING = 0.5;
34
+ var DELIVERY_TREND_WINDOW_SIZE = 5;
35
+ var DELIVERY_TREND_WARNING_RATE = 0.9;
36
+ var TelemetryReliabilityOptionsSchema = z.object({
37
+ campaignLabId: z.string().optional(),
38
+ campaignRuns: z.string().optional(),
39
+ includeTestFixtures: z.boolean().optional(),
40
+ json: z.boolean().optional(),
41
+ lab: z.union([z.string(), z.boolean()]).optional(),
42
+ labId: z.string().optional(),
43
+ limit: z.string().optional(),
44
+ profile: z.enum(RELIABILITY_PROFILES).optional(),
45
+ runId: z.string().optional(),
46
+ since: z.string().optional()
47
+ }).strict();
48
+ function parseLimit(raw) {
49
+ if (raw === void 0) return 20;
50
+ const parsed = Number.parseInt(raw, 10);
51
+ if (!Number.isFinite(parsed) || parsed <= 0) {
52
+ throw new Error(`Invalid --limit value "${raw}". Expected a positive integer.`);
53
+ }
54
+ return parsed;
55
+ }
56
+ function parseSinceCutoff(raw, nowMs = Date.now()) {
57
+ if (!raw) return null;
58
+ const trimmed = raw.trim();
59
+ const durationMatch = /^(\d+)([smhd])$/.exec(trimmed);
60
+ if (durationMatch) {
61
+ const amount = Number.parseInt(durationMatch[1] ?? "0", 10);
62
+ const unit = durationMatch[2];
63
+ const multiplier = unit === "s" ? 1e3 : unit === "m" ? 6e4 : unit === "h" ? 60 * 6e4 : 24 * 60 * 6e4;
64
+ return nowMs - amount * multiplier;
65
+ }
66
+ const timestamp = Date.parse(trimmed);
67
+ if (Number.isNaN(timestamp)) {
68
+ throw new Error(`Invalid --since value "${raw}". Expected duration like 2h or ISO timestamp.`);
69
+ }
70
+ return timestamp;
71
+ }
72
+ function resolveProfile(raw) {
73
+ return raw ?? "advisory";
74
+ }
75
+ function readJsonObjectWithDiagnostics(filePath) {
76
+ try {
77
+ const parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
78
+ return {
79
+ value: parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null
80
+ };
81
+ } catch (error) {
82
+ return {
83
+ value: null,
84
+ parseError: error instanceof Error ? error.message : String(error),
85
+ filePath
86
+ };
87
+ }
88
+ }
89
+ function optionalBoolean(value) {
90
+ return typeof value === "boolean" ? value : void 0;
91
+ }
92
+ function optionalString(value) {
93
+ return typeof value === "string" ? value : void 0;
94
+ }
95
+ function optionalNumber(value) {
96
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
97
+ }
98
+ function synthesisFromRecord(record) {
99
+ if (!record) return void 0;
100
+ return {
101
+ success: optionalBoolean(record.success),
102
+ prNumber: typeof record.prNumber === "number" ? record.prNumber : void 0,
103
+ prUrl: optionalString(record.prUrl),
104
+ error: optionalString(record.error),
105
+ mergedVariants: Array.isArray(record.mergedVariants) ? record.mergedVariants.filter((value) => typeof value === "string") : [],
106
+ donorSelectionDecisions: Array.isArray(record.donorSelectionDecisions) ? record.donorSelectionDecisions : void 0,
107
+ deliverySucceeded: optionalBoolean(record.deliverySucceeded),
108
+ synthesisApplied: optionalBoolean(record.synthesisApplied),
109
+ complementaryPatchApplied: optionalBoolean(record.complementaryPatchApplied),
110
+ applyMode: optionalString(record.applyMode),
111
+ winnerFallback: optionalBoolean(record.winnerFallback),
112
+ fallbackReason: optionalString(record.fallbackReason),
113
+ patchApplyValidated: optionalBoolean(record.patchApplyValidated),
114
+ gatesPassed: optionalBoolean(record.gatesPassed),
115
+ gateFailureDetails: record.gateFailureDetails,
116
+ intentFilteredHunkCount: optionalNumber(record.intentFilteredHunkCount),
117
+ excludedHunkCount: optionalNumber(record.excludedHunkCount),
118
+ unknownIncludedHunkCount: optionalNumber(record.unknownIncludedHunkCount),
119
+ overlapRejectedHunkCount: optionalNumber(record.overlapRejectedHunkCount),
120
+ aiGuidedFallbackAttempted: optionalBoolean(record.aiGuidedFallbackAttempted),
121
+ aiGuidedFallbackOutcome: optionalString(record.aiGuidedFallbackOutcome)
122
+ };
123
+ }
124
+ function extractGateFailure(details) {
125
+ if (!details || typeof details !== "object" || Array.isArray(details)) return null;
126
+ const record = details;
127
+ const gate = typeof record.gate === "string" && record.gate.length > 0 ? record.gate : "unknown";
128
+ const status = typeof record.status === "string" && record.status.length > 0 ? record.status : "failed";
129
+ return { gate, status };
130
+ }
131
+ function incrementProvider(providers, provider, failureType) {
132
+ const summary = providers[provider] ?? { total: 0, failures: 0, failureTypes: {} };
133
+ providers[provider] = summary;
134
+ summary.total += 1;
135
+ if (failureType) {
136
+ summary.failures += 1;
137
+ summary.failureTypes[failureType] = (summary.failureTypes[failureType] ?? 0) + 1;
138
+ }
139
+ }
140
+ function incrementFailureType(report, failureType) {
141
+ report.failures.byType[failureType] = (report.failures.byType[failureType] ?? 0) + 1;
142
+ }
143
+ function incrementGateFailure(gateFailures, gate, status) {
144
+ const summary = gateFailures[gate] ?? { count: 0, statuses: {} };
145
+ gateFailures[gate] = summary;
146
+ summary.count += 1;
147
+ summary.statuses[status] = (summary.statuses[status] ?? 0) + 1;
148
+ }
149
+ function isTestFixtureCompetitionId(id) {
150
+ return /^test[-_]/.test(id);
151
+ }
152
+ function listRecentCompetitionIds(stateDir, limit, options = {}) {
153
+ let entries = [];
154
+ try {
155
+ entries = fs.readdirSync(stateDir, { withFileTypes: true }).filter((entry) => entry.isFile() && entry.name.endsWith(".json")).map((entry) => {
156
+ const filePath = path.join(stateDir, entry.name);
157
+ return {
158
+ id: entry.name.replace(/\.json$/, ""),
159
+ mtimeMs: fs.statSync(filePath).mtimeMs
160
+ };
161
+ });
162
+ } catch {
163
+ return [];
164
+ }
165
+ return entries.filter((entry) => options.includeTestFixtures || !isTestFixtureCompetitionId(entry.id)).filter(
166
+ (entry) => options.sinceMs === null || options.sinceMs === void 0 || entry.mtimeMs >= options.sinceMs
167
+ ).sort((a, b) => b.mtimeMs - a.mtimeMs).slice(0, limit).map((entry) => entry.id);
168
+ }
169
+ function listRecentLabVariantCompetitionIds(variantDir, limit, options = {}) {
170
+ let entries = [];
171
+ try {
172
+ entries = fs.readdirSync(variantDir, { withFileTypes: true }).filter((entry) => entry.isFile() && entry.name.endsWith(".adaptive-setup.json")).map((entry) => {
173
+ const filePath = path.join(variantDir, entry.name);
174
+ return {
175
+ id: entry.name.replace(/\.adaptive-setup\.json$/, ""),
176
+ mtimeMs: fs.statSync(filePath).mtimeMs
177
+ };
178
+ });
179
+ } catch {
180
+ return [];
181
+ }
182
+ return entries.filter((entry) => options.includeTestFixtures || !isTestFixtureCompetitionId(entry.id)).filter(
183
+ (entry) => options.sinceMs === null || options.sinceMs === void 0 || entry.mtimeMs >= options.sinceMs
184
+ ).sort((a, b) => b.mtimeMs - a.mtimeMs).slice(0, limit).map((entry) => entry.id);
185
+ }
186
+ function formatObservedAt(ms) {
187
+ return new Date(ms).toISOString();
188
+ }
189
+ function observedCompetitionBounds(stateDir, competitionIds) {
190
+ const timestamps = competitionIds.map((id) => {
191
+ try {
192
+ return fs.statSync(path.join(stateDir, `${id}.json`)).mtimeMs;
193
+ } catch {
194
+ return null;
195
+ }
196
+ }).filter((value) => value !== null);
197
+ if (timestamps.length === 0) {
198
+ return { oldestObservedAt: null, newestObservedAt: null };
199
+ }
200
+ return {
201
+ oldestObservedAt: formatObservedAt(Math.min(...timestamps)),
202
+ newestObservedAt: formatObservedAt(Math.max(...timestamps))
203
+ };
204
+ }
205
+ function observedLabVariantBounds(variantDir, competitionIds) {
206
+ const timestamps = competitionIds.map((id) => {
207
+ try {
208
+ return fs.statSync(path.join(variantDir, `${id}.adaptive-setup.json`)).mtimeMs;
209
+ } catch {
210
+ return null;
211
+ }
212
+ }).filter((value) => value !== null);
213
+ if (timestamps.length === 0) {
214
+ return { oldestObservedAt: null, newestObservedAt: null };
215
+ }
216
+ return {
217
+ oldestObservedAt: formatObservedAt(Math.min(...timestamps)),
218
+ newestObservedAt: formatObservedAt(Math.max(...timestamps))
219
+ };
220
+ }
221
+ function labVariantFiles(variantDir, competitionId) {
222
+ try {
223
+ return fs.readdirSync(variantDir, { withFileTypes: true }).filter(
224
+ (entry) => entry.isFile() && entry.name.startsWith(`${competitionId}-`) && entry.name.endsWith(".json") && !entry.name.endsWith(".lifecycle.json")
225
+ ).map((entry) => path.join(variantDir, entry.name));
226
+ } catch {
227
+ return [];
228
+ }
229
+ }
230
+ function labVariantStateFromRecord(record) {
231
+ const result = getRecordValue(record, "result");
232
+ const outcome = getRecordValue(record, "outcome");
233
+ const verification = getRecordValue(outcome, "verification");
234
+ return {
235
+ provider: optionalString(record.provider) ?? "unknown",
236
+ model: optionalString(record.model),
237
+ resolvedModel: optionalString(record.resolvedModel),
238
+ strategy: optionalString(record.strategy) ?? "unknown",
239
+ executionMode: optionalString(record.executionMode),
240
+ success: optionalBoolean(record.success),
241
+ outcome: verification && typeof verification === "object" && !Array.isArray(verification) ? {
242
+ verification: {
243
+ status: optionalString(getRecordValue(verification, "status")),
244
+ buildStatus: optionalString(getRecordValue(verification, "buildStatus")),
245
+ testStatus: optionalString(getRecordValue(verification, "testStatus"))
246
+ }
247
+ } : void 0,
248
+ testStatus: optionalString(record.testStatus),
249
+ testMetrics: typeof record.testMetrics === "object" && record.testMetrics !== null ? record.testMetrics : void 0,
250
+ testsExecuted: typeof record.testsExecuted === "object" && record.testsExecuted !== null ? record.testsExecuted : void 0,
251
+ completeness: optionalNumber(record.completeness),
252
+ duration: optionalNumber(record.duration),
253
+ errorMessage: optionalString(record.errorMessage) ?? optionalString(getRecordValue(result, "error")) ?? optionalString(getRecordValue(result, "stderr")),
254
+ timedOut: optionalBoolean(record.timedOut),
255
+ terminationReason: optionalString(record.terminationReason)
256
+ };
257
+ }
258
+ function readLabVariantCompetitionState(competitionId, variantDir) {
259
+ const records = labVariantFiles(variantDir, competitionId).map((filePath) => readJsonObjectWithDiagnostics(filePath).value).filter((record) => record !== null);
260
+ const variants = records.map(labVariantStateFromRecord);
261
+ if (variants.length === 0) return null;
262
+ const winner = variants.find((variant) => variant.success === true) ?? null;
263
+ const allAnalysis = records.every(
264
+ (record) => getRecordValue(record, "executionIntent") === "analysis"
265
+ );
266
+ return {
267
+ taskId: competitionId,
268
+ primarySource: "competition_handle",
269
+ status: variants.every((variant) => variant.success === false) ? "failed" : "completed",
270
+ outcome: winner ? "winner_selected" : "all_failed",
271
+ winner: winner ? {
272
+ provider: winner.provider,
273
+ model: winner.model,
274
+ resolvedModel: winner.resolvedModel,
275
+ strategy: winner.strategy,
276
+ executionMode: winner.executionMode
277
+ } : null,
278
+ variants,
279
+ sources: {
280
+ competitionHandle: {
281
+ path: variantDir,
282
+ readAt: (/* @__PURE__ */ new Date()).toISOString(),
283
+ exists: true
284
+ },
285
+ backgroundHandle: {
286
+ path: "",
287
+ readAt: (/* @__PURE__ */ new Date()).toISOString(),
288
+ exists: false
289
+ },
290
+ unifiedState: {
291
+ path: "",
292
+ readAt: (/* @__PURE__ */ new Date()).toISOString(),
293
+ exists: false
294
+ }
295
+ },
296
+ rawHandle: allAnalysis ? { deliverableContract: { editsExpected: false, executionIntentEffective: "analysis" } } : void 0
297
+ };
298
+ }
299
+ function classifyVariantFailure(variant) {
300
+ if (variant.success !== false) return null;
301
+ const terminationReason = variant.terminationReason?.toLowerCase() ?? "";
302
+ const message = variant.errorMessage?.toLowerCase() ?? "";
303
+ const crashSignalPattern = /\b(sigkill|sigsegv|sigabrt|sigbus|sigill|sigquit)\b/;
304
+ if (variant.timedOut === true || terminationReason.includes("timeout") || message.includes("timeout") || message.includes("timed out") || message.includes("sigterm")) {
305
+ return "timeout";
306
+ }
307
+ if (message.includes("invalid json") || message.includes("not valid json") || message.includes("malformed json") || message.includes("unexpected token")) {
308
+ return "malformed_json";
309
+ }
310
+ if (terminationReason.includes("crash")) {
311
+ return "process_crash";
312
+ }
313
+ if (crashSignalPattern.test(terminationReason) || crashSignalPattern.test(message) || message.includes("segmentation fault") || message.includes("killed by signal") || message.includes("exited with code 137")) {
314
+ return "process_crash";
315
+ }
316
+ if (terminationReason.includes("failed_error") || message.length > 0) {
317
+ return "provider_error";
318
+ }
319
+ return "unknown_provider_failure";
320
+ }
321
+ function getVerificationStatus(variant) {
322
+ const status = variant.outcome?.verification?.status;
323
+ const normalized = typeof status === "string" && status.length > 0 ? status : null;
324
+ const hasRawTestSignal = variant.outcome?.verification?.testStatus !== void 0 || variant.testStatus !== void 0 || typeof variant.testsExecuted?.exitCode === "number" || typeof variant.testMetrics?.failedTests === "number";
325
+ if (normalized !== "passed" && !hasRawTestSignal) return normalized;
326
+ const testVerdict = deriveTestVerificationDisplay({
327
+ testStatus: variant.outcome?.verification?.testStatus,
328
+ rawTestStatus: variant.testStatus,
329
+ exitCode: typeof variant.testsExecuted?.exitCode === "number" ? variant.testsExecuted.exitCode : null,
330
+ failedTests: typeof variant.testMetrics?.failedTests === "number" ? variant.testMetrics.failedTests : null
331
+ });
332
+ if (normalized === "passed") return testVerdict === "passed" ? normalized : testVerdict;
333
+ if (testVerdict === "failed") return "failed";
334
+ return normalized ?? testVerdict;
335
+ }
336
+ function getVerificationFailure(variant) {
337
+ const status = getVerificationStatus(variant);
338
+ if (status !== "failed") return null;
339
+ return {
340
+ provider: variant.provider,
341
+ strategy: variant.strategy ?? null,
342
+ executionMode: variant.executionMode ?? null,
343
+ status,
344
+ buildStatus: variant.outcome?.verification?.buildStatus ?? null,
345
+ testStatus: variant.testStatus ?? variant.outcome?.verification?.testStatus ?? null
346
+ };
347
+ }
348
+ function variantMatchesWinner(variant, winner) {
349
+ if (!winner) return false;
350
+ if (variant.provider !== winner.provider) return false;
351
+ if (variant.strategy !== winner.strategy) return false;
352
+ if (winner.executionMode && variant.executionMode && variant.executionMode !== winner.executionMode) {
353
+ return false;
354
+ }
355
+ const winnerModels = [winner.resolvedModel, winner.model].filter(
356
+ (model) => typeof model === "string" && model.length > 0
357
+ );
358
+ const variantModels = [variant.resolvedModel, variant.model].filter(
359
+ (model) => typeof model === "string" && model.length > 0
360
+ );
361
+ if (winnerModels.length === 0 || variantModels.length === 0) return true;
362
+ return winnerModels.some((model) => variantModels.includes(model));
363
+ }
364
+ function getWinnerVerificationFailure(state) {
365
+ if (!state.winner) return null;
366
+ const winnerVariant = state.variants.find(
367
+ (variant) => variantMatchesWinner(variant, state.winner)
368
+ );
369
+ return winnerVariant ? getVerificationFailure(winnerVariant) : null;
370
+ }
371
+ function getWinnerVerificationStatus(state) {
372
+ if (!state.winner) return null;
373
+ const winnerVariant = state.variants.find(
374
+ (variant) => variantMatchesWinner(variant, state.winner)
375
+ );
376
+ return winnerVariant ? getVerificationStatus(winnerVariant) : null;
377
+ }
378
+ function incrementVerificationSummary(summary, status) {
379
+ if (status === "passed") summary.passed += 1;
380
+ else if (status === "failed") summary.failed += 1;
381
+ else if (status === "baseline_clean") summary.baselineClean += 1;
382
+ else if (status === "not_run" || status === "unavailable") summary.notRun += 1;
383
+ }
384
+ function classifySynthesisFailure(synthesis) {
385
+ if (synthesis.success === false) return "synthesis_failure";
386
+ if (synthesis.gatesPassed !== false) return null;
387
+ const gateFailure = extractGateFailure(synthesis.gateFailureDetails);
388
+ if (gateFailure?.gate === "patch_apply") return "patch_apply_failure";
389
+ return "gate_rejection";
390
+ }
391
+ function summarizeRunSynthesis(synthesis) {
392
+ return {
393
+ attempted: Boolean(synthesis),
394
+ applied: synthesis?.synthesisApplied ?? null,
395
+ complementaryPatchApplied: synthesis?.complementaryPatchApplied ?? null,
396
+ applyMode: synthesis?.applyMode ?? null,
397
+ winnerFallback: synthesis?.winnerFallback ?? null,
398
+ deliverySucceeded: synthesis?.deliverySucceeded ?? null,
399
+ gatesPassed: synthesis?.gatesPassed ?? null,
400
+ fallbackReason: synthesis?.fallbackReason ?? null,
401
+ error: synthesis?.error ?? null,
402
+ gateFailure: extractGateFailure(synthesis?.gateFailureDetails),
403
+ donorSelectionDecisions: synthesis?.donorSelectionDecisions ?? null,
404
+ intentFilteredHunkCount: synthesis?.intentFilteredHunkCount ?? null,
405
+ excludedHunkCount: synthesis?.excludedHunkCount ?? null,
406
+ unknownIncludedHunkCount: synthesis?.unknownIncludedHunkCount ?? null,
407
+ overlapRejectedHunkCount: synthesis?.overlapRejectedHunkCount ?? null,
408
+ aiGuidedFallbackAttempted: synthesis?.aiGuidedFallbackAttempted ?? null,
409
+ aiGuidedFallbackOutcome: synthesis?.aiGuidedFallbackOutcome ?? null
410
+ };
411
+ }
412
+ function summarizeSafeDelivery(state, synthesis, runKind) {
413
+ const winnerVerificationStatus = getWinnerVerificationStatus(state);
414
+ if (state.winner && (state.outcome === "winner_selected" || state.status === "completed")) {
415
+ return { safe: true, basis: "winner_selected", reason: null, winnerVerificationStatus };
416
+ }
417
+ if (synthesis?.deliverySucceeded === true) {
418
+ return { safe: true, basis: "synthesis_delivery", reason: null, winnerVerificationStatus };
419
+ }
420
+ if (runKind === "analysis") {
421
+ const hasSuccessfulAnalysisOutput = state.status === "completed" && state.variants.some(
422
+ (variant) => variant.success === true && !variant.errorMessage && variant.timedOut !== true && variant.terminationReason !== "timeout"
423
+ );
424
+ return {
425
+ safe: hasSuccessfulAnalysisOutput,
426
+ basis: hasSuccessfulAnalysisOutput ? "analysis_result" : "analysis_no_result",
427
+ reason: hasSuccessfulAnalysisOutput ? null : state.errorMessage ?? synthesis?.error ?? "No successful analysis output preserved",
428
+ winnerVerificationStatus
429
+ };
430
+ }
431
+ const reason = state.errorMessage ?? synthesis?.error ?? synthesis?.fallbackReason ?? "No winner preserved";
432
+ return {
433
+ safe: false,
434
+ basis: state.winner ? "delivery_failed" : "no_winner",
435
+ reason,
436
+ winnerVerificationStatus
437
+ };
438
+ }
439
+ function getRecordValue(value, key) {
440
+ return value && typeof value === "object" && !Array.isArray(value) ? value[key] : void 0;
441
+ }
442
+ function classifyRunKind(state) {
443
+ const deliverableContract = getRecordValue(state.rawHandle, "deliverableContract");
444
+ const editsExpected = getRecordValue(deliverableContract, "editsExpected");
445
+ const executionIntentEffective = getRecordValue(deliverableContract, "executionIntentEffective");
446
+ if (editsExpected === false && executionIntentEffective === "analysis") {
447
+ return "analysis";
448
+ }
449
+ return "delivery";
450
+ }
451
+ function summarizeRun(taskId, state, synthesis, providerFailures, verificationFailures, incompleteSpecInputs, observedAt) {
452
+ const winner = state.winner ? {
453
+ provider: state.winner.provider ?? null,
454
+ model: state.winner.resolvedModel ?? state.winner.model ?? null,
455
+ strategy: state.winner.strategy ?? null,
456
+ variant: state.winner.variant ?? null
457
+ } : null;
458
+ const runKind = classifyRunKind(state);
459
+ return {
460
+ taskId,
461
+ runKind,
462
+ observedAt,
463
+ status: state.status ?? null,
464
+ outcome: state.outcome ?? null,
465
+ winner,
466
+ safeDelivery: summarizeSafeDelivery(state, synthesis, runKind),
467
+ providerFailures,
468
+ verificationFailures,
469
+ incompleteSpecInputs,
470
+ synthesis: summarizeRunSynthesis(synthesis)
471
+ };
472
+ }
473
+ function observedCompetitionAt(stateDir, competitionId) {
474
+ try {
475
+ return formatObservedAt(fs.statSync(path.join(stateDir, `${competitionId}.json`)).mtimeMs);
476
+ } catch {
477
+ return null;
478
+ }
479
+ }
480
+ function readSynthesisArtifactRecord(synthesisDirs, taskId) {
481
+ for (const synthesisDir of synthesisDirs) {
482
+ const artifactPath = path.join(synthesisDir, `${taskId}.json`);
483
+ if (fs.existsSync(artifactPath)) {
484
+ return readJsonObjectWithDiagnostics(artifactPath);
485
+ }
486
+ }
487
+ return { value: null };
488
+ }
489
+ function addAdvisorySignal(report, signal) {
490
+ report.advisory.signals.push(signal);
491
+ }
492
+ function calculateSafeDeliveryRate(runs) {
493
+ const deliveryRuns = runs.filter((run) => run.runKind === "delivery");
494
+ if (deliveryRuns.length === 0) return null;
495
+ return deliveryRuns.filter((run) => run.safeDelivery.safe).length / deliveryRuns.length;
496
+ }
497
+ function isVerifiedDelivery(run) {
498
+ return run.safeDelivery.safe && (run.safeDelivery.winnerVerificationStatus === "passed" || run.safeDelivery.winnerVerificationStatus === "baseline_clean");
499
+ }
500
+ function calculateVerifiedDeliveryRate(runs) {
501
+ const deliveryRuns = runs.filter((run) => run.runKind === "delivery");
502
+ if (deliveryRuns.length === 0) return null;
503
+ return deliveryRuns.filter(isVerifiedDelivery).length / deliveryRuns.length;
504
+ }
505
+ function calculateDeliveryTrend(runs) {
506
+ const deliveryRuns = runs.filter((run) => run.runKind === "delivery");
507
+ const recentRuns = deliveryRuns.slice(0, DELIVERY_TREND_WINDOW_SIZE);
508
+ const previousRuns = deliveryRuns.slice(
509
+ DELIVERY_TREND_WINDOW_SIZE,
510
+ DELIVERY_TREND_WINDOW_SIZE * 2
511
+ );
512
+ const recentRate = calculateSafeDeliveryRate(recentRuns);
513
+ const previousRate = previousRuns.length === DELIVERY_TREND_WINDOW_SIZE ? calculateSafeDeliveryRate(previousRuns) : null;
514
+ return {
515
+ windowSize: DELIVERY_TREND_WINDOW_SIZE,
516
+ sampleSize: recentRuns.length + previousRuns.length,
517
+ recentRate,
518
+ previousRate,
519
+ delta: recentRate !== null && previousRate !== null ? recentRate - previousRate : null,
520
+ threshold: DELIVERY_TREND_WARNING_RATE,
521
+ status: recentRuns.length < DELIVERY_TREND_WINDOW_SIZE ? "insufficient_data" : recentRate !== null && recentRate < DELIVERY_TREND_WARNING_RATE ? "warning" : "ok"
522
+ };
523
+ }
524
+ function hasIncompleteInputSpec(variant) {
525
+ const warning = variant.inputSpecWarning;
526
+ if (!warning) return false;
527
+ return warning.hasFillPlaceholders === true || (warning.missingFields?.length ?? 0) > 0;
528
+ }
529
+ function populateReliabilityAdvisory(report) {
530
+ const deliveryRuns = report.runs.filter((run) => run.runKind === "delivery");
531
+ const unsafeRuns = deliveryRuns.filter((run) => !run.safeDelivery.safe);
532
+ const fallbackRuns = report.runs.filter((run) => run.synthesis.winnerFallback === true);
533
+ const incompleteSpecRuns = report.runs.filter((run) => run.incompleteSpecInputs > 0);
534
+ const verificationFailedRuns = report.runs.filter((run) => run.verificationFailures.length > 0);
535
+ report.advisory.unsafeRuns = unsafeRuns.length;
536
+ report.advisory.fallbackRuns = fallbackRuns.length;
537
+ report.advisory.fallbackRate = report.synthesis.attempted > 0 ? fallbackRuns.length / report.synthesis.attempted : null;
538
+ report.advisory.deliveryTrend = calculateDeliveryTrend(report.runs);
539
+ for (const [provider, summary] of Object.entries(report.providers)) {
540
+ const rate = summary.total > 0 ? summary.failures / summary.total : null;
541
+ report.advisory.providerFailureRates[provider] = {
542
+ total: summary.total,
543
+ failures: summary.failures,
544
+ rate
545
+ };
546
+ if (summary.total >= PROVIDER_SPIKE_MIN_TOTAL && summary.failures >= PROVIDER_SPIKE_MIN_FAILURES && rate !== null && rate >= PROVIDER_SPIKE_FAILURE_RATE) {
547
+ addAdvisorySignal(report, {
548
+ code: "provider_failure_spike",
549
+ severity: "warning",
550
+ message: `${provider} failed ${summary.failures}/${summary.total} recent variants.`,
551
+ value: rate,
552
+ threshold: PROVIDER_SPIKE_FAILURE_RATE,
553
+ provider,
554
+ taskIds: report.runs.filter((run) => run.providerFailures.some((failure) => failure.provider === provider)).map((run) => run.taskId)
555
+ });
556
+ }
557
+ }
558
+ if (unsafeRuns.length > 0) {
559
+ addAdvisorySignal(report, {
560
+ code: "unsafe_runs_observed",
561
+ severity: "warning",
562
+ message: `${unsafeRuns.length} recent competition(s) did not preserve safe delivery.`,
563
+ value: unsafeRuns.length,
564
+ threshold: 0,
565
+ provider: null,
566
+ taskIds: unsafeRuns.map((run) => run.taskId)
567
+ });
568
+ }
569
+ if (incompleteSpecRuns.length > 0) {
570
+ addAdvisorySignal(report, {
571
+ code: "incomplete_spec_inputs_observed",
572
+ severity: "warning",
573
+ message: `${report.inputQuality.incompleteVariants} recent variant(s) used incomplete input specs.`,
574
+ value: report.inputQuality.incompleteVariants,
575
+ threshold: 0,
576
+ provider: null,
577
+ taskIds: incompleteSpecRuns.map((run) => run.taskId)
578
+ });
579
+ }
580
+ if (verificationFailedRuns.length > 0) {
581
+ addAdvisorySignal(report, {
582
+ code: "verification_failures_observed",
583
+ severity: "warning",
584
+ message: `${report.verification.failed} recent variant(s) failed deterministic verification.`,
585
+ value: report.verification.failed,
586
+ threshold: 0,
587
+ provider: null,
588
+ taskIds: verificationFailedRuns.map((run) => run.taskId)
589
+ });
590
+ }
591
+ if (report.advisory.deliveryTrend.status === "warning") {
592
+ const recentRate = report.advisory.deliveryTrend.recentRate ?? 0;
593
+ const recentDeliveryRuns = deliveryRuns.slice(0, DELIVERY_TREND_WINDOW_SIZE);
594
+ addAdvisorySignal(report, {
595
+ code: "safe_delivery_trend_degraded",
596
+ severity: "warning",
597
+ message: `Recent safe-delivery rate is ${formatPercent(recentRate)} across the last ${report.advisory.deliveryTrend.windowSize} competition(s).`,
598
+ value: recentRate,
599
+ threshold: DELIVERY_TREND_WARNING_RATE,
600
+ provider: null,
601
+ taskIds: recentDeliveryRuns.filter((run) => !run.safeDelivery.safe).map((run) => run.taskId)
602
+ });
603
+ }
604
+ if (report.synthesis.attempted >= FALLBACK_RATE_MIN_ATTEMPTS && report.advisory.fallbackRate !== null && report.advisory.fallbackRate >= FALLBACK_RATE_WARNING) {
605
+ addAdvisorySignal(report, {
606
+ code: "fallback_rate_elevated",
607
+ severity: "info",
608
+ message: `${fallbackRuns.length}/${report.synthesis.attempted} recent synthesis attempts fell back to the winner.`,
609
+ value: report.advisory.fallbackRate,
610
+ threshold: FALLBACK_RATE_WARNING,
611
+ provider: null,
612
+ taskIds: fallbackRuns.map((run) => run.taskId)
613
+ });
614
+ }
615
+ }
616
+ function hasCompleteGateFailureDetails(synthesis) {
617
+ if (synthesis.gatesPassed !== false) return true;
618
+ if (!synthesis.gateFailureDetails || typeof synthesis.gateFailureDetails !== "object" || Array.isArray(synthesis.gateFailureDetails)) {
619
+ return false;
620
+ }
621
+ const details = synthesis.gateFailureDetails;
622
+ return typeof details.gate === "string" && details.gate.length > 0 && typeof details.status === "string" && details.status.length > 0;
623
+ }
624
+ function addGuardrailFinding(report, finding) {
625
+ if (finding.severity === "hard") {
626
+ report.guardrails.hardFailures.push(finding);
627
+ return;
628
+ }
629
+ report.guardrails.warnings.push(finding);
630
+ }
631
+ function addCorruptSourceWarning(report, taskId, code, sourceLabel, parseError, filePath) {
632
+ if (!parseError) return;
633
+ if (filePath) {
634
+ console.error(`Warning: ${filePath}: ${parseError}`);
635
+ }
636
+ report.inputQuality.corruptedFiles += 1;
637
+ addGuardrailFinding(report, {
638
+ code,
639
+ severity: "warning",
640
+ taskId,
641
+ message: `${sourceLabel} could not be read: ${parseError}`
642
+ });
643
+ incrementFailureType(report, code);
644
+ }
645
+ function evaluateCompetitionGuardrails(report, taskId, state, synthesis) {
646
+ addCorruptSourceWarning(
647
+ report,
648
+ taskId,
649
+ "competition_state_corrupt",
650
+ "Competition state",
651
+ state.sources.competitionHandle.parseError,
652
+ state.sources.competitionHandle.path || void 0
653
+ );
654
+ addCorruptSourceWarning(
655
+ report,
656
+ taskId,
657
+ "background_state_corrupt",
658
+ "Background state",
659
+ state.sources.backgroundHandle.parseError,
660
+ state.sources.backgroundHandle.path || void 0
661
+ );
662
+ addCorruptSourceWarning(
663
+ report,
664
+ taskId,
665
+ "unified_state_corrupt",
666
+ "Unified state",
667
+ state.sources.unifiedState.parseError,
668
+ state.sources.unifiedState.path || void 0
669
+ );
670
+ if (state.status === "completed" && state.outcome === "winner_selected" && !state.winner) {
671
+ addGuardrailFinding(report, {
672
+ code: "winner_selected_without_winner",
673
+ severity: "hard",
674
+ taskId,
675
+ message: "Competition reports winner_selected but has no winner payload."
676
+ });
677
+ }
678
+ const winnerVerificationFailure = getWinnerVerificationFailure(state);
679
+ if (winnerVerificationFailure) {
680
+ addGuardrailFinding(report, {
681
+ code: "winner_failed_verification",
682
+ severity: "warning",
683
+ taskId,
684
+ message: `Judged winner ${winnerVerificationFailure.provider}:${winnerVerificationFailure.strategy ?? "unknown"} failed deterministic verification; delivery remains based on the judge-selected winner.`
685
+ });
686
+ }
687
+ if (synthesis?.synthesisApplied === true && (synthesis.deliverySucceeded !== true || synthesis.gatesPassed !== true || synthesis.patchApplyValidated !== true || synthesis.winnerFallback === true || synthesis.mergedVariants.length === 0)) {
688
+ addGuardrailFinding(report, {
689
+ code: "applied_synthesis_incoherent",
690
+ severity: "hard",
691
+ taskId,
692
+ message: "Applied synthesis must have deliverySucceeded=true, gatesPassed=true, patchApplyValidated=true, no winner fallback, and at least one merged variant."
693
+ });
694
+ }
695
+ if (synthesis?.winnerFallback === true && (synthesis.synthesisApplied === true || synthesis.deliverySucceeded !== true)) {
696
+ addGuardrailFinding(report, {
697
+ code: "winner_fallback_incoherent",
698
+ severity: "hard",
699
+ taskId,
700
+ message: "Winner fallback must preserve delivery and must not also report synthesisApplied=true."
701
+ });
702
+ }
703
+ if (synthesis && !hasCompleteGateFailureDetails(synthesis)) {
704
+ addGuardrailFinding(report, {
705
+ code: "gate_failure_details_missing",
706
+ severity: state.winner && synthesis.winnerFallback === true && synthesis.deliverySucceeded === true ? "warning" : "hard",
707
+ taskId,
708
+ message: "gatesPassed=false requires gateFailureDetails.gate and gateFailureDetails.status."
709
+ });
710
+ }
711
+ const rejectedOrFailedSynthesis = synthesis?.success === false || synthesis?.gatesPassed === false;
712
+ if (rejectedOrFailedSynthesis && synthesis?.deliverySucceeded !== true && synthesis?.winnerFallback !== true && !state.winner) {
713
+ addGuardrailFinding(report, {
714
+ code: "synthesis_failure_without_winner_preservation",
715
+ severity: "hard",
716
+ taskId,
717
+ message: "Synthesis failed or was rejected without explicit fallback or a preserved judged winner."
718
+ });
719
+ }
720
+ if ((synthesis?.gatesPassed === false || synthesis?.winnerFallback === true) && state.winner) {
721
+ addGuardrailFinding(report, {
722
+ code: "synthesis_rejected_winner_preserved",
723
+ severity: "warning",
724
+ taskId,
725
+ message: "Synthesis did not apply, but the judged winner remains available."
726
+ });
727
+ }
728
+ }
729
+ function resolveReliabilityPaths(cwd, labPathResolver) {
730
+ const poeticDir = path.join(cwd, ".poetic");
731
+ const stateRootDir = labPathResolver.getStateDir(poeticDir);
732
+ const defaultTelemetryStateDir = path.join(poeticDir, "telemetry", "state");
733
+ const unifiedStateDir = stateRootDir === defaultTelemetryStateDir ? path.join(poeticDir, "state") : stateRootDir;
734
+ return {
735
+ stateDir: path.join(stateRootDir, "competitions"),
736
+ variantDir: path.join(stateRootDir, "variants"),
737
+ backgroundDir: path.join(stateRootDir, "background"),
738
+ unifiedStateDir,
739
+ synthesisDir: path.join(labPathResolver.getTelemetryDir(poeticDir), "synthesis")
740
+ };
741
+ }
742
+ function buildTelemetryReliabilityReport(options) {
743
+ const cwd = options.cwd ?? resolveCliRepoRoot(process.cwd());
744
+ const limit = options.limit ?? 20;
745
+ const profile = resolveProfile(options.profile);
746
+ const sinceMs = parseSinceCutoff(options.since);
747
+ const paths = resolveReliabilityPaths(
748
+ cwd,
749
+ options.labPathResolver ?? LabPathResolver.getInstance()
750
+ );
751
+ const { stateDir, synthesisDir } = paths;
752
+ const synthesisDirs = options.synthesisDirs?.length ? options.synthesisDirs : [synthesisDir];
753
+ let competitionIds = listRecentCompetitionIds(stateDir, limit, {
754
+ includeTestFixtures: options.includeTestFixtures,
755
+ sinceMs
756
+ });
757
+ const useLabVariantFallback = competitionIds.length === 0 && fs.existsSync(paths.variantDir);
758
+ if (useLabVariantFallback) {
759
+ competitionIds = listRecentLabVariantCompetitionIds(paths.variantDir, limit, {
760
+ includeTestFixtures: options.includeTestFixtures,
761
+ sinceMs
762
+ });
763
+ }
764
+ const observedBounds = useLabVariantFallback ? observedLabVariantBounds(paths.variantDir, competitionIds) : observedCompetitionBounds(stateDir, competitionIds);
765
+ const report = {
766
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
767
+ profile,
768
+ scanned: {
769
+ stateDir,
770
+ synthesisDir,
771
+ competitions: competitionIds.length,
772
+ limit,
773
+ since: options.since ?? null,
774
+ oldestObservedAt: observedBounds.oldestObservedAt,
775
+ newestObservedAt: observedBounds.newestObservedAt
776
+ },
777
+ delivery: {
778
+ completed: 0,
779
+ winnerSelected: 0,
780
+ failed: 0,
781
+ deliveryRate: null,
782
+ verifiedDeliveryRate: null
783
+ },
784
+ synthesis: {
785
+ attempted: 0,
786
+ applied: 0,
787
+ winnerFallback: 0,
788
+ deliverySucceeded: 0,
789
+ gatesFailed: 0,
790
+ gateFailures: {}
791
+ },
792
+ verification: {
793
+ passed: 0,
794
+ failed: 0,
795
+ baselineClean: 0,
796
+ notRun: 0
797
+ },
798
+ providers: {},
799
+ failures: {
800
+ byType: {}
801
+ },
802
+ inputQuality: {
803
+ incompleteRuns: 0,
804
+ incompleteVariants: 0,
805
+ corruptedFiles: 0
806
+ },
807
+ guardrails: {
808
+ hardFailures: [],
809
+ warnings: []
810
+ },
811
+ runs: [],
812
+ advisory: {
813
+ unsafeRuns: 0,
814
+ fallbackRuns: 0,
815
+ fallbackRate: null,
816
+ deliveryTrend: {
817
+ windowSize: DELIVERY_TREND_WINDOW_SIZE,
818
+ sampleSize: 0,
819
+ recentRate: null,
820
+ previousRate: null,
821
+ delta: null,
822
+ threshold: DELIVERY_TREND_WARNING_RATE,
823
+ status: "insufficient_data"
824
+ },
825
+ providerFailureRates: {},
826
+ signals: []
827
+ }
828
+ };
829
+ for (const id of competitionIds) {
830
+ const state = useLabVariantFallback ? readLabVariantCompetitionState(id, paths.variantDir) : readCompetitionState(id, {
831
+ cwd,
832
+ stateDir: paths.stateDir,
833
+ backgroundDir: paths.backgroundDir,
834
+ backgroundDirs: options.backgroundDirs,
835
+ unifiedStateDir: paths.unifiedStateDir
836
+ });
837
+ if (!state) continue;
838
+ const runKind = classifyRunKind(state);
839
+ if (runKind === "delivery") {
840
+ if (state.status === "completed") report.delivery.completed += 1;
841
+ if (state.outcome === "winner_selected" || state.winner) report.delivery.winnerSelected += 1;
842
+ if (state.status === "failed" || state.outcome === "failed") report.delivery.failed += 1;
843
+ }
844
+ const providerFailures = [];
845
+ const verificationFailures = [];
846
+ let incompleteSpecInputs = 0;
847
+ for (const variant of state.variants) {
848
+ if (hasIncompleteInputSpec(variant)) incompleteSpecInputs += 1;
849
+ const verificationStatus = getVerificationStatus(variant);
850
+ incrementVerificationSummary(report.verification, verificationStatus);
851
+ const verificationFailure = getVerificationFailure(variant);
852
+ if (verificationFailure) {
853
+ verificationFailures.push(verificationFailure);
854
+ incrementFailureType(report, "verification_failed");
855
+ }
856
+ const failureType = classifyVariantFailure(variant);
857
+ incrementProvider(report.providers, variant.provider, failureType);
858
+ if (failureType) {
859
+ incrementFailureType(report, failureType);
860
+ providerFailures.push({
861
+ provider: variant.provider,
862
+ strategy: variant.strategy ?? null,
863
+ executionMode: variant.executionMode ?? null,
864
+ type: failureType,
865
+ errorMessage: variant.errorMessage ?? null,
866
+ terminationReason: variant.terminationReason ?? null,
867
+ timedOut: variant.timedOut ?? null
868
+ });
869
+ }
870
+ }
871
+ if (incompleteSpecInputs > 0) {
872
+ report.inputQuality.incompleteRuns += 1;
873
+ report.inputQuality.incompleteVariants += incompleteSpecInputs;
874
+ }
875
+ const artifactRecord = readSynthesisArtifactRecord(synthesisDirs, id);
876
+ addCorruptSourceWarning(
877
+ report,
878
+ id,
879
+ "synthesis_artifact_corrupt",
880
+ "Synthesis artifact",
881
+ artifactRecord.parseError,
882
+ artifactRecord.filePath
883
+ );
884
+ const artifact = synthesisFromRecord(artifactRecord.value);
885
+ const synthesis = artifact ?? state.synthesis;
886
+ evaluateCompetitionGuardrails(report, id, state, synthesis);
887
+ report.runs.push(
888
+ summarizeRun(
889
+ id,
890
+ state,
891
+ synthesis,
892
+ providerFailures,
893
+ verificationFailures,
894
+ incompleteSpecInputs,
895
+ useLabVariantFallback ? observedLabVariantBounds(paths.variantDir, [id]).newestObservedAt : observedCompetitionAt(paths.stateDir, id)
896
+ )
897
+ );
898
+ if (!synthesis) continue;
899
+ report.synthesis.attempted += 1;
900
+ if (synthesis.synthesisApplied === true) report.synthesis.applied += 1;
901
+ if (synthesis.winnerFallback === true) report.synthesis.winnerFallback += 1;
902
+ if (synthesis.deliverySucceeded === true) report.synthesis.deliverySucceeded += 1;
903
+ if (synthesis.gatesPassed === false) {
904
+ report.synthesis.gatesFailed += 1;
905
+ }
906
+ const synthesisFailureType = classifySynthesisFailure(synthesis);
907
+ if (synthesisFailureType) incrementFailureType(report, synthesisFailureType);
908
+ const gateFailure = extractGateFailure(synthesis.gateFailureDetails);
909
+ if (gateFailure) {
910
+ incrementGateFailure(report.synthesis.gateFailures, gateFailure.gate, gateFailure.status);
911
+ }
912
+ }
913
+ const hasDeliveryRuns = report.runs.some((run) => run.runKind === "delivery");
914
+ report.delivery.deliveryRate = hasDeliveryRuns ? calculateSafeDeliveryRate(report.runs) : null;
915
+ report.delivery.verifiedDeliveryRate = hasDeliveryRuns ? calculateVerifiedDeliveryRate(report.runs) : null;
916
+ populateReliabilityAdvisory(report);
917
+ return report;
918
+ }
919
+ function resolveCampaignRuns(params) {
920
+ const selection = params.selection ?? "latest:5";
921
+ const poeticDir = path.join(params.cwd, ".poetic");
922
+ const labRuns = listLabRuns(poeticDir).filter((run) => run.labId === params.labId).sort((a, b) => b.runId.localeCompare(a.runId));
923
+ const warnings = [];
924
+ if (labRuns.length === 0) {
925
+ warnings.push(`No lab runs found for lab id "${params.labId}".`);
926
+ return { runs: [], selection, warnings };
927
+ }
928
+ if (selection === "all") {
929
+ return { runs: labRuns, selection, warnings };
930
+ }
931
+ const latestMatch = /^latest:(\d+)$/.exec(selection);
932
+ if (latestMatch) {
933
+ const count = Number.parseInt(latestMatch[1] ?? "0", 10);
934
+ if (!Number.isFinite(count) || count <= 0) {
935
+ throw new Error(
936
+ `Invalid --campaign-runs value "${selection}". Expected latest:<positive n>.`
937
+ );
938
+ }
939
+ return { runs: labRuns.slice(0, count), selection, warnings };
940
+ }
941
+ const requestedIds = selection.split(",").map((runId) => runId.trim()).filter(Boolean);
942
+ if (requestedIds.length === 0) {
943
+ throw new Error(
944
+ `Invalid --campaign-runs value "${selection}". Use all, latest:<n>, or comma-separated run ids.`
945
+ );
946
+ }
947
+ const byRunId = new Map(labRuns.map((run) => [run.runId, run]));
948
+ const selectedRuns = [];
949
+ for (const runId of requestedIds) {
950
+ const run = byRunId.get(runId);
951
+ if (run) {
952
+ selectedRuns.push(run);
953
+ } else {
954
+ warnings.push(`Run "${runId}" was not found under lab "${params.labId}".`);
955
+ }
956
+ }
957
+ return { runs: selectedRuns, selection, warnings };
958
+ }
959
+ function failReliabilityLabOptions(message) {
960
+ throw new Error(`${message}. Run \`poetic lab list\` to browse available lab runs.`);
961
+ }
962
+ function resolveReliabilityLabRun(params) {
963
+ if (params.lab && (params.labId || params.runId)) {
964
+ failReliabilityLabOptions("--lab cannot be combined with --lab-id/--run-id");
965
+ }
966
+ if (params.labId && !params.runId) {
967
+ failReliabilityLabOptions("--lab-id requires --run-id");
968
+ }
969
+ if (params.runId && !params.labId) {
970
+ failReliabilityLabOptions("--run-id requires --lab-id");
971
+ }
972
+ const poeticDir = path.join(params.cwd, ".poetic");
973
+ if (params.lab) {
974
+ const selector = typeof params.lab === "string" ? params.lab.trim().toLowerCase() : params.lab === true ? "latest" : null;
975
+ if (!selector || selector === "latest") {
976
+ const latest = findLatestLabRun(poeticDir);
977
+ if (!latest) {
978
+ failReliabilityLabOptions(
979
+ "No lab runs found. Start a lab run with `poetic compete --lab` before querying telemetry"
980
+ );
981
+ }
982
+ return latest;
983
+ }
984
+ failReliabilityLabOptions("Unsupported --lab value. Supported value: latest");
985
+ }
986
+ if (params.labId && params.runId) {
987
+ const run = findLabRun(params.labId, params.runId, poeticDir);
988
+ if (!run) {
989
+ failReliabilityLabOptions(`Lab run not found: ${params.labId}/${params.runId}`);
990
+ }
991
+ return run;
992
+ }
993
+ return null;
994
+ }
995
+ function labRunPathResolver(run) {
996
+ return {
997
+ getStateDir: () => path.join(run.runPath, "state"),
998
+ getTelemetryDir: () => path.join(run.runPath, "telemetry")
999
+ };
1000
+ }
1001
+ function labRunSynthesisDirs(cwd, run) {
1002
+ return [
1003
+ path.join(run.runPath, "telemetry", "synthesis"),
1004
+ path.join(cwd, ".poetic", "telemetry", "synthesis")
1005
+ ];
1006
+ }
1007
+ function labRunBackgroundDirs(cwd, run) {
1008
+ return [
1009
+ path.join(run.runPath, "state", "background"),
1010
+ path.join(cwd, ".poetic", "telemetry", "state", "background")
1011
+ ];
1012
+ }
1013
+ function addLabNoDataAdvisory(report, run) {
1014
+ if (report.scanned.competitions > 0) return;
1015
+ addAdvisorySignal(report, {
1016
+ code: "lab_reliability_no_competitions",
1017
+ severity: "info",
1018
+ message: `Lab run ${run.labId}/${run.runId} has no persisted competition records for reliability analysis.`,
1019
+ value: 0,
1020
+ threshold: null,
1021
+ provider: null,
1022
+ taskIds: []
1023
+ });
1024
+ }
1025
+ function createEmptyCampaignAggregate(params) {
1026
+ return {
1027
+ generatedAt: params.generatedAt,
1028
+ profile: params.profile,
1029
+ scanned: {
1030
+ stateDir: params.stateDir,
1031
+ synthesisDir: params.synthesisDir,
1032
+ competitions: 0,
1033
+ limit: params.limit,
1034
+ since: params.since ?? null,
1035
+ oldestObservedAt: null,
1036
+ newestObservedAt: null
1037
+ },
1038
+ delivery: {
1039
+ completed: 0,
1040
+ winnerSelected: 0,
1041
+ failed: 0,
1042
+ deliveryRate: null,
1043
+ verifiedDeliveryRate: null
1044
+ },
1045
+ synthesis: {
1046
+ attempted: 0,
1047
+ applied: 0,
1048
+ winnerFallback: 0,
1049
+ deliverySucceeded: 0,
1050
+ gatesFailed: 0,
1051
+ gateFailures: {}
1052
+ },
1053
+ verification: {
1054
+ passed: 0,
1055
+ failed: 0,
1056
+ baselineClean: 0,
1057
+ notRun: 0
1058
+ },
1059
+ providers: {},
1060
+ failures: { byType: {} },
1061
+ inputQuality: {
1062
+ incompleteRuns: 0,
1063
+ incompleteVariants: 0,
1064
+ corruptedFiles: 0
1065
+ },
1066
+ guardrails: {
1067
+ hardFailures: [],
1068
+ warnings: []
1069
+ },
1070
+ runs: [],
1071
+ advisory: {
1072
+ unsafeRuns: 0,
1073
+ fallbackRuns: 0,
1074
+ fallbackRate: null,
1075
+ deliveryTrend: {
1076
+ windowSize: DELIVERY_TREND_WINDOW_SIZE,
1077
+ sampleSize: 0,
1078
+ recentRate: null,
1079
+ previousRate: null,
1080
+ delta: null,
1081
+ threshold: DELIVERY_TREND_WARNING_RATE,
1082
+ status: "insufficient_data"
1083
+ },
1084
+ providerFailureRates: {},
1085
+ signals: []
1086
+ }
1087
+ };
1088
+ }
1089
+ function mergeProviderSummaries(target, source) {
1090
+ for (const [provider, summary] of Object.entries(source)) {
1091
+ const targetSummary = target[provider] ?? { total: 0, failures: 0, failureTypes: {} };
1092
+ target[provider] = targetSummary;
1093
+ targetSummary.total += summary.total;
1094
+ targetSummary.failures += summary.failures;
1095
+ for (const [type, count] of Object.entries(summary.failureTypes)) {
1096
+ targetSummary.failureTypes[type] = (targetSummary.failureTypes[type] ?? 0) + count;
1097
+ }
1098
+ }
1099
+ }
1100
+ function mergeGateFailureSummaries(target, source) {
1101
+ for (const [gate, summary] of Object.entries(source)) {
1102
+ const targetSummary = target[gate] ?? { count: 0, statuses: {} };
1103
+ target[gate] = targetSummary;
1104
+ targetSummary.count += summary.count;
1105
+ for (const [status, count] of Object.entries(summary.statuses)) {
1106
+ targetSummary.statuses[status] = (targetSummary.statuses[status] ?? 0) + count;
1107
+ }
1108
+ }
1109
+ }
1110
+ function mergeFailureTypes(target, source) {
1111
+ for (const [type, count] of Object.entries(source)) {
1112
+ target[type] = (target[type] ?? 0) + count;
1113
+ }
1114
+ }
1115
+ function mergeObservedBounds(aggregate, report) {
1116
+ const oldest = report.scanned.oldestObservedAt;
1117
+ const newest = report.scanned.newestObservedAt;
1118
+ if (oldest && (!aggregate.scanned.oldestObservedAt || oldest < aggregate.scanned.oldestObservedAt)) {
1119
+ aggregate.scanned.oldestObservedAt = oldest;
1120
+ }
1121
+ if (newest && (!aggregate.scanned.newestObservedAt || newest > aggregate.scanned.newestObservedAt)) {
1122
+ aggregate.scanned.newestObservedAt = newest;
1123
+ }
1124
+ }
1125
+ function mergeReliabilityReport(aggregate, report) {
1126
+ aggregate.scanned.competitions += report.scanned.competitions;
1127
+ mergeObservedBounds(aggregate, report);
1128
+ aggregate.delivery.completed += report.delivery.completed;
1129
+ aggregate.delivery.winnerSelected += report.delivery.winnerSelected;
1130
+ aggregate.delivery.failed += report.delivery.failed;
1131
+ aggregate.synthesis.attempted += report.synthesis.attempted;
1132
+ aggregate.synthesis.applied += report.synthesis.applied;
1133
+ aggregate.synthesis.winnerFallback += report.synthesis.winnerFallback;
1134
+ aggregate.synthesis.deliverySucceeded += report.synthesis.deliverySucceeded;
1135
+ aggregate.synthesis.gatesFailed += report.synthesis.gatesFailed;
1136
+ mergeGateFailureSummaries(aggregate.synthesis.gateFailures, report.synthesis.gateFailures);
1137
+ aggregate.verification.passed += report.verification.passed;
1138
+ aggregate.verification.failed += report.verification.failed;
1139
+ aggregate.verification.baselineClean += report.verification.baselineClean;
1140
+ aggregate.verification.notRun += report.verification.notRun;
1141
+ mergeProviderSummaries(aggregate.providers, report.providers);
1142
+ mergeFailureTypes(aggregate.failures.byType, report.failures.byType);
1143
+ aggregate.inputQuality.incompleteRuns += report.inputQuality.incompleteRuns;
1144
+ aggregate.inputQuality.incompleteVariants += report.inputQuality.incompleteVariants;
1145
+ aggregate.inputQuality.corruptedFiles += report.inputQuality.corruptedFiles;
1146
+ aggregate.guardrails.hardFailures.push(...report.guardrails.hardFailures);
1147
+ aggregate.guardrails.warnings.push(...report.guardrails.warnings);
1148
+ aggregate.runs.push(...report.runs);
1149
+ }
1150
+ function buildCampaignReliabilityReport(options) {
1151
+ const cwd = options.cwd ?? resolveCliRepoRoot(process.cwd());
1152
+ const limit = options.limit ?? 20;
1153
+ const profile = resolveProfile(options.profile);
1154
+ const generatedAt = (/* @__PURE__ */ new Date()).toISOString();
1155
+ const selection = resolveCampaignRuns({
1156
+ cwd,
1157
+ labId: options.campaignLabId,
1158
+ selection: options.campaignRuns
1159
+ });
1160
+ const aggregate = createEmptyCampaignAggregate({
1161
+ generatedAt,
1162
+ profile,
1163
+ limit,
1164
+ since: options.since,
1165
+ stateDir: `campaign:${options.campaignLabId}`,
1166
+ synthesisDir: `campaign:${options.campaignLabId}`
1167
+ });
1168
+ const reports = selection.runs.map((run) => {
1169
+ const report = buildTelemetryReliabilityReport({
1170
+ backgroundDirs: labRunBackgroundDirs(cwd, run),
1171
+ cwd,
1172
+ includeTestFixtures: options.includeTestFixtures,
1173
+ limit,
1174
+ labPathResolver: labRunPathResolver(run),
1175
+ profile,
1176
+ since: options.since,
1177
+ synthesisDirs: labRunSynthesisDirs(cwd, run)
1178
+ });
1179
+ if (report.scanned.competitions === 0) {
1180
+ selection.warnings.push(`Run "${run.runId}" has no competition records.`);
1181
+ }
1182
+ mergeReliabilityReport(aggregate, report);
1183
+ return {
1184
+ labId: run.labId,
1185
+ runId: run.runId,
1186
+ taskSummary: run.taskSummary,
1187
+ report
1188
+ };
1189
+ });
1190
+ aggregate.scanned.limit = limit * selection.runs.length;
1191
+ aggregate.runs.sort((a, b) => {
1192
+ if (a.observedAt && b.observedAt) return b.observedAt.localeCompare(a.observedAt);
1193
+ if (a.observedAt) return -1;
1194
+ if (b.observedAt) return 1;
1195
+ return a.taskId.localeCompare(b.taskId);
1196
+ });
1197
+ aggregate.delivery.deliveryRate = aggregate.scanned.competitions > 0 ? calculateSafeDeliveryRate(aggregate.runs) : null;
1198
+ aggregate.delivery.verifiedDeliveryRate = aggregate.scanned.competitions > 0 ? calculateVerifiedDeliveryRate(aggregate.runs) : null;
1199
+ populateReliabilityAdvisory(aggregate);
1200
+ if (aggregate.runs.length < DELIVERY_TREND_WINDOW_SIZE) {
1201
+ selection.warnings.push(
1202
+ `Campaign has ${aggregate.runs.length} competition sample(s); delivery trend requires ${DELIVERY_TREND_WINDOW_SIZE}.`
1203
+ );
1204
+ }
1205
+ return {
1206
+ generatedAt,
1207
+ profile,
1208
+ campaign: {
1209
+ labId: options.campaignLabId,
1210
+ runs: reports.length,
1211
+ runIds: reports.map((entry) => entry.runId),
1212
+ selection: selection.selection,
1213
+ warnings: selection.warnings
1214
+ },
1215
+ aggregate,
1216
+ reports
1217
+ };
1218
+ }
1219
+ function formatPercent(value) {
1220
+ return value === null ? "n/a" : `${(value * 100).toFixed(1)}%`;
1221
+ }
1222
+ function formatPercentagePointDelta(value) {
1223
+ if (value === null) return "n/a";
1224
+ const sign = value > 0 ? "+" : "";
1225
+ return `${sign}${(value * 100).toFixed(1)}pp`;
1226
+ }
1227
+ function isExpectedFallbackFinding(finding) {
1228
+ return finding.code === "synthesis_rejected_winner_preserved";
1229
+ }
1230
+ function formatRunWinner(winner) {
1231
+ if (!winner) return "none";
1232
+ if (winner.variant) return winner.variant;
1233
+ return [winner.provider, winner.strategy].filter(Boolean).join(":") || "unknown";
1234
+ }
1235
+ function classifyDonorMaterial(synthesis) {
1236
+ const matched = synthesis.intentFilteredHunkCount;
1237
+ const excluded = synthesis.excludedHunkCount;
1238
+ const unknownIncluded = synthesis.unknownIncludedHunkCount;
1239
+ const overlapRejected = synthesis.overlapRejectedHunkCount;
1240
+ const hasAnyCount = typeof matched === "number" || typeof excluded === "number" || typeof unknownIncluded === "number" || typeof overlapRejected === "number";
1241
+ if (!hasAnyCount) {
1242
+ const thresholdMissCount = countSemanticThresholdMissDonors(synthesis.donorSelectionDecisions);
1243
+ if (thresholdMissCount > 0) {
1244
+ return `semantic-threshold-miss (${thresholdMissCount} donor${thresholdMissCount === 1 ? "" : "s"} below threshold)`;
1245
+ }
1246
+ return null;
1247
+ }
1248
+ const matchedCount = matched ?? 0;
1249
+ const excludedCount = excluded ?? 0;
1250
+ const unknownIncludedCount = unknownIncluded ?? 0;
1251
+ const overlapRejectedCount = overlapRejected ?? 0;
1252
+ const details = [`matched=${matchedCount}`, `excluded=${excludedCount}`];
1253
+ if (unknownIncludedCount > 0) details.push(`unknownIncluded=${unknownIncludedCount}`);
1254
+ if (overlapRejectedCount > 0) details.push(`overlapRejected=${overlapRejectedCount}`);
1255
+ if (matchedCount === 0 && excludedCount === 0) {
1256
+ return `no-donor-material (${details.join(", ")})`;
1257
+ }
1258
+ if (matchedCount === 0 && excludedCount > 0) {
1259
+ return `donor-rejected-by-intent-filter (${details.join(", ")})`;
1260
+ }
1261
+ const applied = synthesis.complementaryPatchApplied ?? synthesis.applied;
1262
+ if (applied === true) {
1263
+ const modeSuffix = synthesis.applyMode ? `; applyMode=${synthesis.applyMode}` : "";
1264
+ return `donor-applied (${details.join(", ")}${modeSuffix})`;
1265
+ }
1266
+ if (applied === false) {
1267
+ const modeSuffix = synthesis.applyMode ? `; applyMode=${synthesis.applyMode}` : "";
1268
+ return `donor-attempted-not-applied (${details.join(", ")}${modeSuffix})`;
1269
+ }
1270
+ return `donor-attempted (${details.join(", ")})`;
1271
+ }
1272
+ function countSemanticThresholdMissDonors(decisions) {
1273
+ if (!Array.isArray(decisions)) return 0;
1274
+ return decisions.filter((entry) => {
1275
+ if (typeof entry !== "object" || entry === null) return false;
1276
+ const decision = entry;
1277
+ if (decision.winner === true) return false;
1278
+ const reasons = Array.isArray(decision.reasons) ? decision.reasons.filter((reason) => typeof reason === "string") : [];
1279
+ return reasons.some((reason) => {
1280
+ const normalized = reason.toLowerCase();
1281
+ return normalized.includes("semantic donor rejected") && normalized.includes("threshold");
1282
+ });
1283
+ }).length;
1284
+ }
1285
+ function formatAiGuidedFallbackClass(synthesis) {
1286
+ if (synthesis.aiGuidedFallbackAttempted !== true) return null;
1287
+ switch (synthesis.aiGuidedFallbackOutcome) {
1288
+ case "donor_augmented":
1289
+ return "agentic-fallback-applied";
1290
+ case "winner_equivalent":
1291
+ return "agentic-fallback-winner-equivalent";
1292
+ case "candidate_rejected":
1293
+ return "agentic-fallback-rejected-by-apply-or-gates";
1294
+ case "generation_failed":
1295
+ return "agentic-fallback-generation-failed";
1296
+ default:
1297
+ return "agentic-fallback-attempted";
1298
+ }
1299
+ }
1300
+ function formatGateFailure(gateFailure) {
1301
+ if (!gateFailure) return null;
1302
+ return `${gateFailure.gate} ${gateFailure.status}`;
1303
+ }
1304
+ function formatRunSynthesis(synthesis) {
1305
+ if (!synthesis.attempted) return "not attempted";
1306
+ const aiGuidedClass = formatAiGuidedFallbackClass(synthesis);
1307
+ if (synthesis.applied === true) {
1308
+ const donorClass = classifyDonorMaterial(synthesis);
1309
+ const details = [aiGuidedClass, donorClass].filter(
1310
+ (value) => typeof value === "string" && value.length > 0
1311
+ );
1312
+ if (details.length > 0) return `applied (${details.join("; ")})`;
1313
+ return "applied";
1314
+ }
1315
+ if (synthesis.winnerFallback === true) {
1316
+ const reason = synthesis.fallbackReason ?? "winner preserved";
1317
+ const gateFailure = formatGateFailure(synthesis.gateFailure);
1318
+ const donorClass = classifyDonorMaterial(synthesis);
1319
+ const details = [reason, gateFailure, aiGuidedClass, donorClass].filter(
1320
+ (value) => typeof value === "string" && value.length > 0
1321
+ );
1322
+ if (details.length > 0) return `winner fallback (${details.join("; ")})`;
1323
+ return `winner fallback (${reason})`;
1324
+ }
1325
+ if (synthesis.gatesPassed === false) {
1326
+ const gateFailure = formatGateFailure(synthesis.gateFailure) ?? "gate failed";
1327
+ const donorClass = classifyDonorMaterial(synthesis);
1328
+ const details = [gateFailure, aiGuidedClass, donorClass].filter(
1329
+ (value) => typeof value === "string" && value.length > 0
1330
+ );
1331
+ if (details.length > 0) return `rejected (${details.join("; ")})`;
1332
+ return `rejected (${gateFailure})`;
1333
+ }
1334
+ if (synthesis.error) return `failed (${synthesis.error})`;
1335
+ return "attempted";
1336
+ }
1337
+ function isNotableRun(run) {
1338
+ return !run.safeDelivery.safe || run.providerFailures.length > 0 || run.verificationFailures.length > 0 || run.incompleteSpecInputs > 0 || run.synthesis.winnerFallback === true || run.synthesis.gatesPassed === false || run.synthesis.error !== null;
1339
+ }
1340
+ function formatRunProviderFailures(providerFailures) {
1341
+ if (providerFailures.length === 0) return "none";
1342
+ return providerFailures.map((failure) => `${failure.provider}:${failure.type}`).join(", ");
1343
+ }
1344
+ function formatRunVerificationFailures(verificationFailures) {
1345
+ if (verificationFailures.length === 0) return "none";
1346
+ return verificationFailures.map((failure) => {
1347
+ const variant = [failure.provider, failure.strategy, failure.executionMode].filter((value) => typeof value === "string" && value.length > 0).join(":");
1348
+ const details = [
1349
+ failure.buildStatus ? `build=${failure.buildStatus}` : null,
1350
+ failure.testStatus ? `test=${failure.testStatus}` : null,
1351
+ `status=${failure.status}`
1352
+ ].filter((value) => value !== null);
1353
+ return `${variant || "unknown"} (${details.join(", ")})`;
1354
+ }).join(", ");
1355
+ }
1356
+ function formatRunDeliveryStatus(run) {
1357
+ if (run.runKind === "analysis") {
1358
+ return run.safeDelivery.safe ? "analysis-complete" : "analysis-incomplete";
1359
+ }
1360
+ if (!run.safeDelivery.safe) return "unsafe";
1361
+ return isVerifiedDelivery(run) ? "verified-safe" : "safe-unverified";
1362
+ }
1363
+ function renderHumanReport(report) {
1364
+ console.log(chalk.bold.cyan("\nReliability Report\n"));
1365
+ console.log(chalk.gray(`Profile: ${report.profile}`));
1366
+ console.log(chalk.gray(`Scanned: ${report.scanned.competitions} competitions`));
1367
+ console.log(chalk.gray(`Limit: ${report.scanned.limit}`));
1368
+ if (report.scanned.since) {
1369
+ console.log(chalk.gray(`Since: ${report.scanned.since}`));
1370
+ }
1371
+ if (report.scanned.newestObservedAt) {
1372
+ console.log(
1373
+ chalk.gray(
1374
+ `Observed: ${report.scanned.oldestObservedAt ?? "n/a"} to ${report.scanned.newestObservedAt}`
1375
+ )
1376
+ );
1377
+ }
1378
+ console.log(chalk.bold("\nDelivery"));
1379
+ console.log(` Winner Selected: ${report.delivery.winnerSelected}`);
1380
+ console.log(` Completed: ${report.delivery.completed}`);
1381
+ console.log(` Failed: ${report.delivery.failed}`);
1382
+ console.log(` Delivery Rate: ${formatPercent(report.delivery.deliveryRate)}`);
1383
+ console.log(` Verified Delivery Rate: ${formatPercent(report.delivery.verifiedDeliveryRate)}`);
1384
+ console.log(chalk.bold("\nSynthesis"));
1385
+ console.log(` Attempted: ${report.synthesis.attempted}`);
1386
+ console.log(` Applied: ${report.synthesis.applied}`);
1387
+ console.log(` Winner Fallback: ${report.synthesis.winnerFallback}`);
1388
+ console.log(` Delivery Succeeded: ${report.synthesis.deliverySucceeded}`);
1389
+ console.log(` Gates Failed: ${report.synthesis.gatesFailed}`);
1390
+ console.log(chalk.bold("\nVerification"));
1391
+ console.log(` Passed: ${report.verification.passed}`);
1392
+ console.log(` Failed: ${report.verification.failed}`);
1393
+ console.log(` Baseline Clean: ${report.verification.baselineClean}`);
1394
+ console.log(` Not Run: ${report.verification.notRun}`);
1395
+ const gateEntries = Object.entries(report.synthesis.gateFailures);
1396
+ if (gateEntries.length > 0) {
1397
+ console.log(chalk.bold("\nGate Failures"));
1398
+ for (const [gate, summary] of gateEntries) {
1399
+ const statuses = Object.entries(summary.statuses).map(([status, count]) => `${status}=${count}`).join(", ");
1400
+ console.log(` ${gate}: ${summary.count}${statuses ? ` (${statuses})` : ""}`);
1401
+ }
1402
+ }
1403
+ const providerEntries = Object.entries(report.providers).sort((a, b) => a[0].localeCompare(b[0]));
1404
+ if (providerEntries.length > 0) {
1405
+ console.log(chalk.bold("\nProvider Failures"));
1406
+ for (const [provider, summary] of providerEntries) {
1407
+ const failureTypes = Object.entries(summary.failureTypes).map(([type, count]) => `${type}=${count}`).join(", ");
1408
+ console.log(` ${provider}: ${summary.failures}/${summary.total}`);
1409
+ if (failureTypes) {
1410
+ console.log(chalk.gray(` ${failureTypes}`));
1411
+ }
1412
+ }
1413
+ }
1414
+ const failureTypeEntries = Object.entries(report.failures.byType).sort(
1415
+ (a, b) => a[0].localeCompare(b[0])
1416
+ );
1417
+ if (failureTypeEntries.length > 0) {
1418
+ console.log(chalk.bold("\nFailure Types"));
1419
+ for (const [type, count] of failureTypeEntries) {
1420
+ console.log(` ${type}: ${count}`);
1421
+ }
1422
+ }
1423
+ if (report.inputQuality.incompleteVariants > 0 || report.inputQuality.corruptedFiles > 0) {
1424
+ console.log(chalk.bold("\nInput Quality"));
1425
+ console.log(` Incomplete Runs: ${report.inputQuality.incompleteRuns}`);
1426
+ console.log(` Incomplete Variants: ${report.inputQuality.incompleteVariants}`);
1427
+ console.log(` Corrupted Files: ${report.inputQuality.corruptedFiles}`);
1428
+ }
1429
+ const notableRuns = report.runs.filter(isNotableRun);
1430
+ if (notableRuns.length > 0) {
1431
+ console.log(chalk.bold("\nRuns"));
1432
+ for (const run of notableRuns) {
1433
+ const status = formatRunDeliveryStatus(run);
1434
+ console.log(
1435
+ ` ${run.taskId}: ${status} (${run.safeDelivery.basis}) | winner=${formatRunWinner(
1436
+ run.winner
1437
+ )} | synthesis=${formatRunSynthesis(run.synthesis)} | failures=${formatRunProviderFailures(
1438
+ run.providerFailures
1439
+ )} | candidateVerificationFailures=${formatRunVerificationFailures(
1440
+ run.verificationFailures
1441
+ )} | incompleteSpecInputs=${run.incompleteSpecInputs}`
1442
+ );
1443
+ }
1444
+ }
1445
+ if (report.advisory.signals.length > 0) {
1446
+ console.log(chalk.bold("\nAdvisory Signals"));
1447
+ console.log(` Unsafe Runs: ${report.advisory.unsafeRuns}`);
1448
+ console.log(` Winner Fallback Rate: ${formatPercent(report.advisory.fallbackRate)}`);
1449
+ console.log(
1450
+ ` Safe Delivery Trend: recent=${formatPercent(
1451
+ report.advisory.deliveryTrend.recentRate
1452
+ )}, previous=${formatPercent(
1453
+ report.advisory.deliveryTrend.previousRate
1454
+ )}, delta=${formatPercentagePointDelta(
1455
+ report.advisory.deliveryTrend.delta
1456
+ )}, threshold=${formatPercent(report.advisory.deliveryTrend.threshold)}`
1457
+ );
1458
+ for (const signal of report.advisory.signals) {
1459
+ const taskIds = signal.taskIds.length > 0 ? ` (${signal.taskIds.join(", ")})` : "";
1460
+ const color = signal.severity === "warning" ? chalk.yellow : chalk.gray;
1461
+ console.log(color(` ${signal.code}: ${signal.message}${taskIds}`));
1462
+ }
1463
+ }
1464
+ const expectedFallbacks = report.guardrails.warnings.filter(isExpectedFallbackFinding);
1465
+ const warnings = report.guardrails.warnings.filter(
1466
+ (finding) => !isExpectedFallbackFinding(finding)
1467
+ );
1468
+ if (report.guardrails.hardFailures.length > 0 || expectedFallbacks.length > 0 || warnings.length > 0) {
1469
+ console.log(chalk.bold("\nGuardrails"));
1470
+ if (report.guardrails.hardFailures.length > 0) {
1471
+ console.log(chalk.red(` Hard Failures: ${report.guardrails.hardFailures.length}`));
1472
+ for (const finding of report.guardrails.hardFailures) {
1473
+ console.log(chalk.red(` ${finding.taskId}: ${finding.code} - ${finding.message}`));
1474
+ }
1475
+ }
1476
+ if (expectedFallbacks.length > 0) {
1477
+ console.log(chalk.green(` Expected Fallbacks: ${expectedFallbacks.length}`));
1478
+ for (const finding of expectedFallbacks) {
1479
+ console.log(chalk.green(` ${finding.taskId}: ${finding.code} - ${finding.message}`));
1480
+ }
1481
+ }
1482
+ if (warnings.length > 0) {
1483
+ console.log(chalk.yellow(` Warnings: ${warnings.length}`));
1484
+ for (const finding of warnings) {
1485
+ console.log(chalk.yellow(` ${finding.taskId}: ${finding.code} - ${finding.message}`));
1486
+ }
1487
+ }
1488
+ }
1489
+ console.log(chalk.gray(`
1490
+ Generated: ${report.generatedAt}`));
1491
+ }
1492
+ function renderHumanCampaignReport(report) {
1493
+ console.log(chalk.bold.cyan("\nCampaign Reliability Report\n"));
1494
+ console.log(chalk.gray(`Profile: ${report.profile}`));
1495
+ console.log(chalk.gray(`Lab: ${report.campaign.labId}`));
1496
+ console.log(chalk.gray(`Selection: ${report.campaign.selection}`));
1497
+ console.log(chalk.gray(`Runs: ${report.campaign.runs}`));
1498
+ if (report.campaign.runIds.length > 0) {
1499
+ console.log(chalk.gray(`Run IDs: ${report.campaign.runIds.join(", ")}`));
1500
+ }
1501
+ if (report.campaign.warnings.length > 0) {
1502
+ console.log(chalk.yellow("\nCampaign Warnings"));
1503
+ for (const warning of report.campaign.warnings) {
1504
+ console.log(chalk.yellow(` ${warning}`));
1505
+ }
1506
+ }
1507
+ renderHumanReport(report.aggregate);
1508
+ }
1509
+ function createTelemetryReliabilityCommand(deps = {}) {
1510
+ const command = new Command("reliability");
1511
+ command.description("Summarize recent competition reliability from local persisted state").addHelpText(
1512
+ "after",
1513
+ [
1514
+ "",
1515
+ "Lab examples:",
1516
+ " $ poetic telemetry reliability --lab latest --since 2h --limit 50",
1517
+ " $ poetic telemetry --lab latest reliability --since 2h --limit 50",
1518
+ " $ poetic telemetry --lab-id <lab-id> --run-id <run-id> reliability --json",
1519
+ " $ poetic telemetry reliability --lab-id <lab-id> --run-id <run-id> --json",
1520
+ " $ poetic telemetry reliability --campaign-lab-id <lab-id> --campaign-runs latest:5",
1521
+ ""
1522
+ ].join("\n")
1523
+ ).option("--campaign-lab-id <id>", "Aggregate reliability across runs in a lab id").option(
1524
+ "--campaign-runs <selection>",
1525
+ "Campaign run selection: latest:<n>, all, or comma-separated run ids",
1526
+ "latest:5"
1527
+ ).option("--include-test-fixtures", "Include persisted test fixture competitions").option("--json", "Output as JSON").option("--lab [selector]", "Use lab telemetry data (value: latest)").option("--lab-id <labId>", "(OPTIONAL) Specify lab ID (requires --run-id)").option("--limit <n>", "Maximum number of recent competitions to scan", "20").option("--profile <profile>", "Guardrail profile: advisory|strict", "advisory").option("--run-id <runId>", "(OPTIONAL) Specify run ID (requires --lab-id)").option(
1528
+ "--since <duration|iso>",
1529
+ "Only scan competitions observed since a duration (2h) or ISO timestamp"
1530
+ ).action((options) => {
1531
+ const parsed = TelemetryReliabilityOptionsSchema.parse(options);
1532
+ const limit = parseLimit(parsed.limit);
1533
+ const profile = resolveProfile(parsed.profile);
1534
+ const cwd = deps.cwd ?? resolveCliRepoRoot(process.cwd());
1535
+ if (parsed.campaignRuns && !parsed.campaignLabId && parsed.campaignRuns !== "latest:5") {
1536
+ throw new Error("--campaign-runs requires --campaign-lab-id.");
1537
+ }
1538
+ if (parsed.campaignLabId && (parsed.lab || parsed.labId || parsed.runId)) {
1539
+ throw new Error("--campaign-lab-id cannot be combined with --lab/--lab-id/--run-id.");
1540
+ }
1541
+ if (parsed.campaignLabId) {
1542
+ const campaignReport = buildCampaignReliabilityReport({
1543
+ cwd,
1544
+ campaignLabId: parsed.campaignLabId,
1545
+ campaignRuns: parsed.campaignRuns,
1546
+ includeTestFixtures: parsed.includeTestFixtures,
1547
+ limit,
1548
+ profile,
1549
+ since: parsed.since
1550
+ });
1551
+ if (parsed.json) {
1552
+ console.log(JSON.stringify(campaignReport, null, 2));
1553
+ } else {
1554
+ renderHumanCampaignReport(campaignReport);
1555
+ }
1556
+ if (profile === "strict" && campaignReport.aggregate.guardrails.hardFailures.length > 0) {
1557
+ throw new ExitCodeError(
1558
+ 1,
1559
+ `${campaignReport.aggregate.guardrails.hardFailures.length} reliability guardrail failure(s)`
1560
+ );
1561
+ }
1562
+ return;
1563
+ }
1564
+ const labRun = resolveReliabilityLabRun({
1565
+ cwd,
1566
+ lab: parsed.lab,
1567
+ labId: parsed.labId,
1568
+ runId: parsed.runId
1569
+ });
1570
+ const report = buildTelemetryReliabilityReport({
1571
+ backgroundDirs: labRun ? labRunBackgroundDirs(cwd, labRun) : void 0,
1572
+ cwd,
1573
+ includeTestFixtures: parsed.includeTestFixtures,
1574
+ limit,
1575
+ labPathResolver: labRun ? labRunPathResolver(labRun) : deps.labPathResolver,
1576
+ profile,
1577
+ since: parsed.since,
1578
+ synthesisDirs: labRun ? labRunSynthesisDirs(cwd, labRun) : void 0
1579
+ });
1580
+ if (labRun) {
1581
+ addLabNoDataAdvisory(report, labRun);
1582
+ }
1583
+ if (parsed.json) {
1584
+ console.log(JSON.stringify(report, null, 2));
1585
+ } else {
1586
+ renderHumanReport(report);
1587
+ }
1588
+ if (profile === "strict" && report.guardrails.hardFailures.length > 0) {
1589
+ throw new ExitCodeError(
1590
+ 1,
1591
+ `${report.guardrails.hardFailures.length} reliability guardrail failure(s)`
1592
+ );
1593
+ }
1594
+ });
1595
+ return command;
1596
+ }
1597
+
1598
+ export {
1599
+ buildTelemetryReliabilityReport,
1600
+ buildCampaignReliabilityReport,
1601
+ formatRunSynthesis,
1602
+ createTelemetryReliabilityCommand
1603
+ };
1604
+ //# sourceMappingURL=chunk-A5MRWHMI.js.map