@poetic-ai/poetic 1.42.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 (782) 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-JIMGP3LY.js +1597 -0
  17. package/dist/PromptStore-U6ZD3ZMQ.js +18 -0
  18. package/dist/actions-LUJPINLJ.js +322 -0
  19. package/dist/agent-ingest-3DJUJ7FU.js +53 -0
  20. package/dist/aggregator-DNCBINFO.js +12 -0
  21. package/dist/ai-judge-5QT5QJVU.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-JULUCUIK.js +489 -0
  25. package/dist/api-transport-4TYTNLTJ.js +1087 -0
  26. package/dist/apply-completion-mode-AW2MOS3R.js +89 -0
  27. package/dist/artifact-migrator-23L45ISD.js +267 -0
  28. package/dist/ask-HWVV6QFR.js +135 -0
  29. package/dist/auth-5KEDKAPP.js +67 -0
  30. package/dist/auth-7TT3JINV.js +78 -0
  31. package/dist/auth-E6XUNZ5M.js +68 -0
  32. package/dist/auth-H3XDZE22.js +134 -0
  33. package/dist/auth-OC4E6633.js +71 -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-VPRWOWGU.js +80 -0
  38. package/dist/autoloop-cleanup-JOGKTLWA.js +109 -0
  39. package/dist/autoloop-evidence-gates-PCDALGVJ.js +38 -0
  40. package/dist/autoloop-gate-policy-Z7FVJVXV.js +175 -0
  41. package/dist/autoloop-helpers-2KTK43GL.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-J2VKKBXQ.js +85 -0
  47. package/dist/autoloop-termination-summary-RN75F422.js +58 -0
  48. package/dist/autoloop-trajectory-XFIEXP5Z.js +282 -0
  49. package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
  50. package/dist/autonomous-loop-controller-PW4XVFGQ.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-VCSBJVRN.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-YHGRB4QB.js +71 -0
  60. package/dist/change-summary-WY7J5TOX.js +33 -0
  61. package/dist/chunk-23A26CSN.js +123 -0
  62. package/dist/chunk-27UTJD3M.js +265 -0
  63. package/dist/chunk-2A5CILN3.js +310 -0
  64. package/dist/chunk-2AQUWJPW.js +225 -0
  65. package/dist/chunk-2BZ53J6J.js +2344 -0
  66. package/dist/chunk-2DY5KNVM.js +276 -0
  67. package/dist/chunk-2EIA4RBE.js +659 -0
  68. package/dist/chunk-2IUXIGQD.js +1064 -0
  69. package/dist/chunk-2N42MS2Z.js +2193 -0
  70. package/dist/chunk-2QJ3H3L7.js +42 -0
  71. package/dist/chunk-2QLYTVYX.js +791 -0
  72. package/dist/chunk-2VSQMRCB.js +18 -0
  73. package/dist/chunk-2XQXYBM2.js +130 -0
  74. package/dist/chunk-2YFUIER7.js +426 -0
  75. package/dist/chunk-34CNP2HB.js +148 -0
  76. package/dist/chunk-35P3W3JX.js +456 -0
  77. package/dist/chunk-36PEBZAF.js +18 -0
  78. package/dist/chunk-3AOKYKA7.js +22 -0
  79. package/dist/chunk-3BCUNHKF.js +475 -0
  80. package/dist/chunk-3FLXLLB7.js +26 -0
  81. package/dist/chunk-3FOZ2VHV.js +100 -0
  82. package/dist/chunk-3G6FZCRF.js +106 -0
  83. package/dist/chunk-3M57DADF.js +44 -0
  84. package/dist/chunk-3S62LLWJ.js +543 -0
  85. package/dist/chunk-3ZPQLGV7.js +2904 -0
  86. package/dist/chunk-44N5WZZH.js +45 -0
  87. package/dist/chunk-45FPSA3B.js +125 -0
  88. package/dist/chunk-4BJ3O4RQ.js +929 -0
  89. package/dist/chunk-4BOP7T6L.js +2321 -0
  90. package/dist/chunk-4BTDUT2S.js +42 -0
  91. package/dist/chunk-4CSS7WVI.js +143 -0
  92. package/dist/chunk-4CUY7AFY.js +247 -0
  93. package/dist/chunk-4GSN5O5J.js +62 -0
  94. package/dist/chunk-4HN6DF7V.js +1027 -0
  95. package/dist/chunk-4IAPOG5V.js +415 -0
  96. package/dist/chunk-4IYIZQWV.js +48 -0
  97. package/dist/chunk-4NXPXE62.js +84 -0
  98. package/dist/chunk-4RCCF5BR.js +712 -0
  99. package/dist/chunk-4V7NAQ4R.js +19527 -0
  100. package/dist/chunk-4VJITV4P.js +445 -0
  101. package/dist/chunk-4YX7J6QL.js +1859 -0
  102. package/dist/chunk-527OBWQB.js +338 -0
  103. package/dist/chunk-5D4A7E3D.js +448 -0
  104. package/dist/chunk-5DLKYTQX.js +4003 -0
  105. package/dist/chunk-5EERLVZB.js +139 -0
  106. package/dist/chunk-5H72XE4H.js +256 -0
  107. package/dist/chunk-5HDP7XZG.js +91 -0
  108. package/dist/chunk-5LAMRH4X.js +969 -0
  109. package/dist/chunk-5LTN43AS.js +1972 -0
  110. package/dist/chunk-5RBHQYDB.js +2206 -0
  111. package/dist/chunk-5WCQRDRB.js +588 -0
  112. package/dist/chunk-5WRLK5KW.js +700 -0
  113. package/dist/chunk-5ZCXC23G.js +595 -0
  114. package/dist/chunk-6BM72ZMG.js +31 -0
  115. package/dist/chunk-6EDAJH2I.js +68 -0
  116. package/dist/chunk-6EQKFDBH.js +457 -0
  117. package/dist/chunk-6MFRHTRI.js +115 -0
  118. package/dist/chunk-6TZJRKNW.js +321 -0
  119. package/dist/chunk-6V7HGQFZ.js +20 -0
  120. package/dist/chunk-6VWVO2TU.js +3746 -0
  121. package/dist/chunk-6Y5TWI7H.js +146 -0
  122. package/dist/chunk-6Y5U7UFY.js +91 -0
  123. package/dist/chunk-6ZLAK3XG.js +14 -0
  124. package/dist/chunk-72XCRQED.js +34 -0
  125. package/dist/chunk-72YTZMAM.js +589 -0
  126. package/dist/chunk-73BBJOKA.js +263 -0
  127. package/dist/chunk-73NCTWKL.js +188 -0
  128. package/dist/chunk-77I6G4CO.js +1 -0
  129. package/dist/chunk-7DHRDWFS.js +3104 -0
  130. package/dist/chunk-7DNSNKJV.js +78 -0
  131. package/dist/chunk-7FMJVYBS.js +307 -0
  132. package/dist/chunk-7GDRQBQC.js +419 -0
  133. package/dist/chunk-7GPCEFUV.js +270 -0
  134. package/dist/chunk-7IL4A2PP.js +948 -0
  135. package/dist/chunk-7MMLMXO6.js +3679 -0
  136. package/dist/chunk-7QCZSLBH.js +1 -0
  137. package/dist/chunk-7R2WLDOS.js +62 -0
  138. package/dist/chunk-7T7RUJI7.js +949 -0
  139. package/dist/chunk-A2WKSVX7.js +43 -0
  140. package/dist/chunk-A3YGID55.js +133 -0
  141. package/dist/chunk-A722DEVA.js +14 -0
  142. package/dist/chunk-ACDIT7OP.js +1376 -0
  143. package/dist/chunk-ACKIPAOJ.js +302 -0
  144. package/dist/chunk-APPNGGN7.js +365 -0
  145. package/dist/chunk-APV6MK5E.js +137 -0
  146. package/dist/chunk-ASEP3M2W.js +968 -0
  147. package/dist/chunk-AT4TNPWW.js +2931 -0
  148. package/dist/chunk-ATVKCSGT.js +250 -0
  149. package/dist/chunk-AURFMVCD.js +899 -0
  150. package/dist/chunk-AX6GWE7V.js +47 -0
  151. package/dist/chunk-AY5EWJPF.js +385 -0
  152. package/dist/chunk-BAV2HJXS.js +194 -0
  153. package/dist/chunk-BBHRN366.js +89 -0
  154. package/dist/chunk-BBPSTTPA.js +1004 -0
  155. package/dist/chunk-BDATUDDJ.js +992 -0
  156. package/dist/chunk-BKE5PG5L.js +20414 -0
  157. package/dist/chunk-BLPHWMDK.js +797 -0
  158. package/dist/chunk-BSE4R6XD.js +322 -0
  159. package/dist/chunk-BXGMAU4A.js +396 -0
  160. package/dist/chunk-BXI4NXL3.js +507 -0
  161. package/dist/chunk-BZU2O43F.js +1125 -0
  162. package/dist/chunk-C3L6YQ7P.js +147 -0
  163. package/dist/chunk-C57KJOUQ.js +121 -0
  164. package/dist/chunk-CCV7BPSY.js +118 -0
  165. package/dist/chunk-CD7ISXA4.js +826 -0
  166. package/dist/chunk-CE5OZBYY.js +21 -0
  167. package/dist/chunk-CFBIG37O.js +154 -0
  168. package/dist/chunk-CJC6GZ46.js +457 -0
  169. package/dist/chunk-CKCDGXIV.js +408 -0
  170. package/dist/chunk-CKNX3TTP.js +10338 -0
  171. package/dist/chunk-CLKSETWE.js +10 -0
  172. package/dist/chunk-CP7H3HSP.js +1552 -0
  173. package/dist/chunk-CPLEWXNZ.js +66 -0
  174. package/dist/chunk-CQM3A35X.js +844 -0
  175. package/dist/chunk-CS6P76D3.js +103 -0
  176. package/dist/chunk-CTLUBNCW.js +622 -0
  177. package/dist/chunk-CUSRN6RJ.js +632 -0
  178. package/dist/chunk-D5EP5D2W.js +26 -0
  179. package/dist/chunk-D5RYINO7.js +412 -0
  180. package/dist/chunk-DBFS4HMH.js +751 -0
  181. package/dist/chunk-DC4ZYMXJ.js +115 -0
  182. package/dist/chunk-DCBZP442.js +9243 -0
  183. package/dist/chunk-DCYF7EKG.js +26 -0
  184. package/dist/chunk-DDMAFNUK.js +5351 -0
  185. package/dist/chunk-DF5SLDE4.js +966 -0
  186. package/dist/chunk-DJFW7SMX.js +348 -0
  187. package/dist/chunk-DQFLLBJW.js +121 -0
  188. package/dist/chunk-DSFM56OA.js +1203 -0
  189. package/dist/chunk-DTY4APYV.js +218 -0
  190. package/dist/chunk-DXH5JBRS.js +437 -0
  191. package/dist/chunk-E3NTPHEO.js +194 -0
  192. package/dist/chunk-E74LUIID.js +302 -0
  193. package/dist/chunk-EI57M5BI.js +194 -0
  194. package/dist/chunk-EJ4ZAWLV.js +305 -0
  195. package/dist/chunk-EJGCZGUF.js +1483 -0
  196. package/dist/chunk-EK2U3YEG.js +486 -0
  197. package/dist/chunk-ELMFYNV7.js +109 -0
  198. package/dist/chunk-ENRGKNR5.js +25 -0
  199. package/dist/chunk-ETYDXCK7.js +679 -0
  200. package/dist/chunk-EYRH3W74.js +239 -0
  201. package/dist/chunk-F23DIWNN.js +1024 -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-FD4ERYEG.js +22 -0
  207. package/dist/chunk-FH7WOJAE.js +79 -0
  208. package/dist/chunk-FHOWVDF5.js +1342 -0
  209. package/dist/chunk-FKAUPHMR.js +96 -0
  210. package/dist/chunk-FONNFJXA.js +137 -0
  211. package/dist/chunk-FQ7FSZRW.js +75 -0
  212. package/dist/chunk-FRG57FPM.js +240 -0
  213. package/dist/chunk-FUVP64ER.js +31 -0
  214. package/dist/chunk-FYOILAN5.js +6818 -0
  215. package/dist/chunk-G35UYQ6Z.js +69 -0
  216. package/dist/chunk-G36W2T2S.js +1143 -0
  217. package/dist/chunk-G3L2L5XZ.js +49 -0
  218. package/dist/chunk-G4THLFV3.js +148 -0
  219. package/dist/chunk-GAFJEYLK.js +29 -0
  220. package/dist/chunk-GFGYB2ZU.js +1689 -0
  221. package/dist/chunk-GG6KJYW6.js +85 -0
  222. package/dist/chunk-GHHFDU2U.js +55 -0
  223. package/dist/chunk-GHTZSQB7.js +57 -0
  224. package/dist/chunk-GK37ILCX.js +1231 -0
  225. package/dist/chunk-GKN3HMN4.js +2809 -0
  226. package/dist/chunk-GNVDBVJP.js +156 -0
  227. package/dist/chunk-GPEL3FBM.js +924 -0
  228. package/dist/chunk-GPSNGPZS.js +1604 -0
  229. package/dist/chunk-GSGD5E4C.js +30 -0
  230. package/dist/chunk-GSUQJJXQ.js +331 -0
  231. package/dist/chunk-GSV226X6.js +110 -0
  232. package/dist/chunk-H2AYQIHW.js +224 -0
  233. package/dist/chunk-H66DXFS5.js +1374 -0
  234. package/dist/chunk-H6G7QRMQ.js +35 -0
  235. package/dist/chunk-H7JAGHZT.js +59 -0
  236. package/dist/chunk-H7ZEFECA.js +316 -0
  237. package/dist/chunk-HAC6EHZZ.js +79 -0
  238. package/dist/chunk-HIO33P3G.js +19 -0
  239. package/dist/chunk-HMVQIPH3.js +547 -0
  240. package/dist/chunk-HOYBYAOA.js +257 -0
  241. package/dist/chunk-HX5P3CSP.js +1784 -0
  242. package/dist/chunk-I46EG2XQ.js +65 -0
  243. package/dist/chunk-I4NPDSCB.js +279 -0
  244. package/dist/chunk-I5WRT7ZR.js +514 -0
  245. package/dist/chunk-IC7I6YIJ.js +301 -0
  246. package/dist/chunk-IDCSOZVN.js +78 -0
  247. package/dist/chunk-IFCBYECK.js +112 -0
  248. package/dist/chunk-IFZCPEY2.js +66 -0
  249. package/dist/chunk-IKFP2KUR.js +48 -0
  250. package/dist/chunk-IRFBN336.js +878 -0
  251. package/dist/chunk-IUXNGKA6.js +152 -0
  252. package/dist/chunk-IV2RVAN7.js +1356 -0
  253. package/dist/chunk-IZYIQQ7X.js +53 -0
  254. package/dist/chunk-J3UUR7DE.js +210 -0
  255. package/dist/chunk-J54VUAY2.js +566 -0
  256. package/dist/chunk-J62KPGII.js +464 -0
  257. package/dist/chunk-J6P3FWWW.js +130 -0
  258. package/dist/chunk-JKBHJQMT.js +434 -0
  259. package/dist/chunk-JLS65NUQ.js +14 -0
  260. package/dist/chunk-JOSYEJKY.js +141 -0
  261. package/dist/chunk-JPKSXKNB.js +94 -0
  262. package/dist/chunk-JQNJB2BB.js +2440 -0
  263. package/dist/chunk-JRVNSWSQ.js +2626 -0
  264. package/dist/chunk-JSWMRQYG.js +28 -0
  265. package/dist/chunk-JZKNBBIB.js +152 -0
  266. package/dist/chunk-K54Y7MLK.js +160 -0
  267. package/dist/chunk-K65546RE.js +183 -0
  268. package/dist/chunk-KM3F7SYE.js +702 -0
  269. package/dist/chunk-KNDYMVWN.js +102 -0
  270. package/dist/chunk-KNT72VR6.js +132 -0
  271. package/dist/chunk-KP6YILMU.js +482 -0
  272. package/dist/chunk-KQEBSK3T.js +274 -0
  273. package/dist/chunk-KT6VHSPF.js +84 -0
  274. package/dist/chunk-KTMW65UX.js +14 -0
  275. package/dist/chunk-KZ5CJVBP.js +1813 -0
  276. package/dist/chunk-L4427KOE.js +26 -0
  277. package/dist/chunk-L6OM4A22.js +189 -0
  278. package/dist/chunk-L7E6XCRA.js +1042 -0
  279. package/dist/chunk-L7JZLXQL.js +173 -0
  280. package/dist/chunk-LAMKBTXX.js +40 -0
  281. package/dist/chunk-LDCF2MKN.js +132 -0
  282. package/dist/chunk-LEIIWPWQ.js +78 -0
  283. package/dist/chunk-LFTQVYBB.js +31 -0
  284. package/dist/chunk-LG3PDRTR.js +2872 -0
  285. package/dist/chunk-LGHII5ET.js +23 -0
  286. package/dist/chunk-LH5QY22X.js +1205 -0
  287. package/dist/chunk-LIVJ6266.js +438 -0
  288. package/dist/chunk-LKRAR3IH.js +276 -0
  289. package/dist/chunk-LO23NABI.js +3063 -0
  290. package/dist/chunk-LO3X5NLS.js +326 -0
  291. package/dist/chunk-LPITVM7M.js +339 -0
  292. package/dist/chunk-LR5IJIGV.js +810 -0
  293. package/dist/chunk-LRGMHROI.js +79 -0
  294. package/dist/chunk-LUVKFFWR.js +315 -0
  295. package/dist/chunk-LWCBNGH6.js +35 -0
  296. package/dist/chunk-LWTN3WRV.js +260 -0
  297. package/dist/chunk-M3HQYKQX.js +308 -0
  298. package/dist/chunk-M6GVSPEH.js +1016 -0
  299. package/dist/chunk-MF5HP6XV.js +221 -0
  300. package/dist/chunk-MHLCBZJB.js +328 -0
  301. package/dist/chunk-MN6PL4AN.js +120 -0
  302. package/dist/chunk-MOEY65Z6.js +5678 -0
  303. package/dist/chunk-MQ4WA34C.js +206 -0
  304. package/dist/chunk-MWHF5V7U.js +223 -0
  305. package/dist/chunk-MWHLBPNU.js +211 -0
  306. package/dist/chunk-MWK5UZQ3.js +1068 -0
  307. package/dist/chunk-MYLH2S4G.js +64 -0
  308. package/dist/chunk-MZ5WYKNA.js +28 -0
  309. package/dist/chunk-N4VTRA7K.js +131 -0
  310. package/dist/chunk-N5DX4JAK.js +12 -0
  311. package/dist/chunk-N65O4XTH.js +5011 -0
  312. package/dist/chunk-NEQUQHOX.js +223 -0
  313. package/dist/chunk-NGK6PEOG.js +25 -0
  314. package/dist/chunk-NJVD4PWE.js +1033 -0
  315. package/dist/chunk-NM6PMYY4.js +768 -0
  316. package/dist/chunk-NN4PJDHP.js +708 -0
  317. package/dist/chunk-NP2V3L7K.js +226 -0
  318. package/dist/chunk-NRLY536M.js +260 -0
  319. package/dist/chunk-NRNE225N.js +1270 -0
  320. package/dist/chunk-NS2K2GTP.js +605 -0
  321. package/dist/chunk-NS33V3IM.js +51 -0
  322. package/dist/chunk-NSHASMZZ.js +71 -0
  323. package/dist/chunk-NWOYOA6H.js +378 -0
  324. package/dist/chunk-NWRUSEXG.js +322 -0
  325. package/dist/chunk-NZGDAWIP.js +1905 -0
  326. package/dist/chunk-O47UOKU3.js +395 -0
  327. package/dist/chunk-O4G2W3ST.js +9831 -0
  328. package/dist/chunk-O6V4PNLO.js +63 -0
  329. package/dist/chunk-OA4GPILI.js +624 -0
  330. package/dist/chunk-OGMSYL6J.js +227 -0
  331. package/dist/chunk-OIS7J26S.js +319 -0
  332. package/dist/chunk-OMX5VL43.js +79 -0
  333. package/dist/chunk-ON3G73BU.js +264 -0
  334. package/dist/chunk-OPYFYTWQ.js +220 -0
  335. package/dist/chunk-OQ6K46CK.js +1734 -0
  336. package/dist/chunk-OYZYO7TV.js +47 -0
  337. package/dist/chunk-OZ4REHIN.js +4386 -0
  338. package/dist/chunk-P47VN5F4.js +282 -0
  339. package/dist/chunk-P5I4X7A7.js +353 -0
  340. package/dist/chunk-P6VQROCO.js +594 -0
  341. package/dist/chunk-P7CQGPLS.js +30 -0
  342. package/dist/chunk-PCAGC5MR.js +1763 -0
  343. package/dist/chunk-PFTQBXS6.js +5181 -0
  344. package/dist/chunk-PGSPX4SU.js +15 -0
  345. package/dist/chunk-PIKLF7BM.js +432 -0
  346. package/dist/chunk-PJWJ3SAV.js +22 -0
  347. package/dist/chunk-PKIFMV72.js +100 -0
  348. package/dist/chunk-PL37JDNA.js +189 -0
  349. package/dist/chunk-PTH5E5XO.js +195 -0
  350. package/dist/chunk-PW6AXLQC.js +4128 -0
  351. package/dist/chunk-PYITM4N2.js +79 -0
  352. package/dist/chunk-PZ5AY32C.js +10 -0
  353. package/dist/chunk-Q3RO7N35.js +45 -0
  354. package/dist/chunk-Q3WIC6GQ.js +2670 -0
  355. package/dist/chunk-Q5XIXSHX.js +271 -0
  356. package/dist/chunk-QGJDMEOV.js +34 -0
  357. package/dist/chunk-QNOB37UH.js +58 -0
  358. package/dist/chunk-QOCOVLUH.js +462 -0
  359. package/dist/chunk-QTCJ5CC5.js +172 -0
  360. package/dist/chunk-QVFV5IP2.js +232 -0
  361. package/dist/chunk-QVZMFDYG.js +29 -0
  362. package/dist/chunk-R35PEUKH.js +511 -0
  363. package/dist/chunk-R4UWBC35.js +200 -0
  364. package/dist/chunk-R6MLCREW.js +44 -0
  365. package/dist/chunk-R6W23LKN.js +254 -0
  366. package/dist/chunk-R7XDDX2A.js +4007 -0
  367. package/dist/chunk-RDFRCT64.js +168 -0
  368. package/dist/chunk-RE5VZDFQ.js +58 -0
  369. package/dist/chunk-RGROYC2G.js +638 -0
  370. package/dist/chunk-RGWHUI5E.js +68 -0
  371. package/dist/chunk-RHVG6UNL.js +205 -0
  372. package/dist/chunk-RI4EX2QE.js +18 -0
  373. package/dist/chunk-RJAAKDRX.js +17 -0
  374. package/dist/chunk-ROMHOSMQ.js +185 -0
  375. package/dist/chunk-RWREC3KJ.js +517 -0
  376. package/dist/chunk-RYNETRDJ.js +118 -0
  377. package/dist/chunk-RZY7RKM5.js +500 -0
  378. package/dist/chunk-S2MNWFAG.js +52 -0
  379. package/dist/chunk-S2VQCZO4.js +22 -0
  380. package/dist/chunk-S54MKU6V.js +117 -0
  381. package/dist/chunk-S5OIDFRM.js +302 -0
  382. package/dist/chunk-SCW4ZF6R.js +150 -0
  383. package/dist/chunk-SLS2N4PH.js +2213 -0
  384. package/dist/chunk-SNLBO4BF.js +247 -0
  385. package/dist/chunk-SP3LFU6B.js +60 -0
  386. package/dist/chunk-SQQTDDQA.js +537 -0
  387. package/dist/chunk-STV6LYYE.js +45 -0
  388. package/dist/chunk-SURZ2WFE.js +326 -0
  389. package/dist/chunk-SZ7DL357.js +1047 -0
  390. package/dist/chunk-T5E4NQCM.js +5742 -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-TGQZHDY2.js +2373 -0
  397. package/dist/chunk-TJJZ2OKV.js +6783 -0
  398. package/dist/chunk-TRSVUPCX.js +25 -0
  399. package/dist/chunk-TSXGRLPR.js +107 -0
  400. package/dist/chunk-U2S3YEX3.js +224 -0
  401. package/dist/chunk-U45RTRGY.js +818 -0
  402. package/dist/chunk-U6C3VVWS.js +13 -0
  403. package/dist/chunk-UDMS5AD3.js +307 -0
  404. package/dist/chunk-UGX7GI37.js +94 -0
  405. package/dist/chunk-UH3JJSHK.js +1 -0
  406. package/dist/chunk-UHRBTZYY.js +208 -0
  407. package/dist/chunk-UHT2KRG5.js +193 -0
  408. package/dist/chunk-UI2F6DJ5.js +118 -0
  409. package/dist/chunk-UMAKSB4Z.js +284 -0
  410. package/dist/chunk-UR2IBGIM.js +521 -0
  411. package/dist/chunk-UUH2RVKS.js +585 -0
  412. package/dist/chunk-UVJ4PJDK.js +4533 -0
  413. package/dist/chunk-V53UG2OT.js +9924 -0
  414. package/dist/chunk-V72RMBM4.js +48 -0
  415. package/dist/chunk-VBNCKCCI.js +16 -0
  416. package/dist/chunk-VNSYKC25.js +24 -0
  417. package/dist/chunk-VPHVFK4A.js +1984 -0
  418. package/dist/chunk-VTLNJQ44.js +133 -0
  419. package/dist/chunk-VTW7HP3R.js +100 -0
  420. package/dist/chunk-VVGEPBPS.js +218 -0
  421. package/dist/chunk-VVLLL7I4.js +166 -0
  422. package/dist/chunk-VX3UMWB7.js +483 -0
  423. package/dist/chunk-VXF4Q3FW.js +20 -0
  424. package/dist/chunk-W3JMT2YY.js +712 -0
  425. package/dist/chunk-WDUORIHF.js +877 -0
  426. package/dist/chunk-WDVTY4U6.js +148 -0
  427. package/dist/chunk-WIFZCHEG.js +12566 -0
  428. package/dist/chunk-WIRN3F75.js +736 -0
  429. package/dist/chunk-WMPU2UOV.js +82 -0
  430. package/dist/chunk-WTOKKE2V.js +784 -0
  431. package/dist/chunk-WX5IRLF6.js +740 -0
  432. package/dist/chunk-WZ6U3O7I.js +1581 -0
  433. package/dist/chunk-XAONGNST.js +57 -0
  434. package/dist/chunk-XB5YLCLB.js +13 -0
  435. package/dist/chunk-XEP5NQ5Y.js +688 -0
  436. package/dist/chunk-XGYF2QMZ.js +351 -0
  437. package/dist/chunk-XHEKQENB.js +255 -0
  438. package/dist/chunk-XNO4FM6X.js +1124 -0
  439. package/dist/chunk-XPHKYHO4.js +878 -0
  440. package/dist/chunk-XPK2I4NC.js +405 -0
  441. package/dist/chunk-XPU2XADL.js +2175 -0
  442. package/dist/chunk-XQD2B6BB.js +507 -0
  443. package/dist/chunk-XT2ZQVTC.js +558 -0
  444. package/dist/chunk-XTXJGGUV.js +351 -0
  445. package/dist/chunk-XUXVDPSZ.js +50 -0
  446. package/dist/chunk-XV7NZL4B.js +57 -0
  447. package/dist/chunk-XZE4XARH.js +563 -0
  448. package/dist/chunk-XZYR5EDO.js +152 -0
  449. package/dist/chunk-Y3J4JMTU.js +61 -0
  450. package/dist/chunk-Y55LZN5U.js +52 -0
  451. package/dist/chunk-Y5VN7DMP.js +112 -0
  452. package/dist/chunk-Y67VAHN4.js +459 -0
  453. package/dist/chunk-YAXSKEUH.js +3544 -0
  454. package/dist/chunk-YB3JD4E6.js +975 -0
  455. package/dist/chunk-YESZJFK6.js +220 -0
  456. package/dist/chunk-YGXKOBQQ.js +292 -0
  457. package/dist/chunk-YMX76IOS.js +31 -0
  458. package/dist/chunk-YOTXESEH.js +257 -0
  459. package/dist/chunk-YTYIEZQY.js +119 -0
  460. package/dist/chunk-YVORHQ2S.js +579 -0
  461. package/dist/chunk-Z2CUQDAR.js +3429 -0
  462. package/dist/chunk-Z2KYOFHS.js +7000 -0
  463. package/dist/chunk-Z6PC7QX6.js +161 -0
  464. package/dist/chunk-ZDTGECTN.js +235 -0
  465. package/dist/chunk-ZIPWI2LY.js +151 -0
  466. package/dist/chunk-ZSKKMTQJ.js +554 -0
  467. package/dist/chunk-ZTT5IVPY.js +1160 -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-IXL26KJT.js +40 -0
  472. package/dist/cli-validation-WLXWLUJL.js +111 -0
  473. package/dist/commit-utils-P7CRJF5N.js +202 -0
  474. package/dist/compete-config-resolver-R5ULXMYH.js +76 -0
  475. package/dist/compete-request-62JESVET.js +364 -0
  476. package/dist/compete-results-QEPG6FZX.js +208 -0
  477. package/dist/competition-outcome-tracker-R32OOZ43.js +38 -0
  478. package/dist/config-JCOKXOQT.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-7T4E2BQO.js +67 -0
  483. package/dist/config-validator-KKOHOW7O.js +72 -0
  484. package/dist/cost-YC42XUF3.js +53 -0
  485. package/dist/coverage-orchestrator-CISNKJC2.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-GJOYE7AE.js +186 -0
  492. package/dist/domain-analyzer-AWF3RP6E.js +29 -0
  493. package/dist/ensure-initialized-744DIZEZ.js +52 -0
  494. package/dist/entry.js +940 -0
  495. package/dist/environment-YS45U5ZI.js +81 -0
  496. package/dist/error-parser-core-PPZ36A4S.js +50 -0
  497. package/dist/escalation-ladder-MKTCEGSA.js +130 -0
  498. package/dist/evaluation-context-KV4GZNN7.js +35 -0
  499. package/dist/evidence-plan-resolver-GBSYSAPX.js +85 -0
  500. package/dist/execution-data-writer-3ODTBDLH.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-R3DPPMD3.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-XBN7DFIM.js +149 -0
  507. package/dist/file-utils-XIVR2ZMA.js +47 -0
  508. package/dist/flywheel-autoloop-executor-UILGOFFK.js +249 -0
  509. package/dist/flywheel-competition-executor-JOBEXTRB.js +259 -0
  510. package/dist/flywheel-executor-6JFLA6J5.js +369 -0
  511. package/dist/flywheel-git-isolation-UC5NIEVU.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-XEY5SHM6.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-DPVWWIYY.js +73 -0
  519. package/dist/git-worktree-IY6V6DUO.js +18 -0
  520. package/dist/github-pr-manager-4LXEKJTA.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 +108661 -0
  525. package/dist/instructions-6BURLQJC.js +64 -0
  526. package/dist/invoke-provider-auth-GRUYP44M.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-BJRFLGK4.js +23 -0
  531. package/dist/linux-host-class-UY4KVLFD.js +29 -0
  532. package/dist/llm-judge-executor-F7Z3HO77.js +133 -0
  533. package/dist/local-executor-CEHWE2PL.js +223 -0
  534. package/dist/logger-33TR6EE5.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-6UDN5X3F.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-XGYBG2DW.js +72 -0
  542. package/dist/next-PB5ZXZKB.js +90 -0
  543. package/dist/next-ZBDK725T.js +69 -0
  544. package/dist/optimization-config-resolver-O6WKR47U.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-VAGYBV3J.js +270 -0
  552. package/dist/plan-backlog-show-fast-SG2CZPW3.js +406 -0
  553. package/dist/plan-sprint-list-fast-LURAX47V.js +162 -0
  554. package/dist/plan-sprint-status-fast-FJAODCHD.js +208 -0
  555. package/dist/plan-task-status-fast-HNYBMQI4.js +349 -0
  556. package/dist/plan-to-flywheel-Z4U3GWPN.js +456 -0
  557. package/dist/planning-backlog-3CQ5QQBQ.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-SE5EVXAP.js +149 -0
  565. package/dist/prompts-WZZPGWBX.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-N5X57V3Y.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-YRHMQAEI.js +70 -0
  575. package/dist/quickstart-FIRLKGJI.js +62 -0
  576. package/dist/readiness-VZTMSG6J.js +96 -0
  577. package/dist/registry-YODFY77A.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-D6TX6FRG.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-F5WQEUOM.js +160 -0
  587. package/dist/run-poetic-tui-J6LWRJUP.js +13517 -0
  588. package/dist/run-simulation.js +376 -0
  589. package/dist/runner-CS2TNGHA.js +1092 -0
  590. package/dist/runner-HHH7ZN2Z.js +1571 -0
  591. package/dist/safety-OCC4KJJR.js +64 -0
  592. package/dist/safety-stanza-7SV3HGG3.js +60 -0
  593. package/dist/sandbox-32QXJEMV.js +81 -0
  594. package/dist/sandbox-RSO7VP6V.js +94 -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-UIXPYOXQ.js +338 -0
  603. package/dist/sprint-bridge-4BHMSC3M.js +68 -0
  604. package/dist/sprint-execution-service-2B7WHL5L.js +311 -0
  605. package/dist/sprint-manager-IDQUDNQI.js +91 -0
  606. package/dist/sqlite-wrapper-UDWCTNLJ.js +17 -0
  607. package/dist/stale-cleanup-orchestrator-XWXV7KCZ.js +62 -0
  608. package/dist/storage-access-F6ALDN4S.js +22 -0
  609. package/dist/synthesis-XD6EDVHF.js +185 -0
  610. package/dist/task-classifier-LNLXSHOM.js +494 -0
  611. package/dist/task-list-fast-PTMA4LUC.js +147 -0
  612. package/dist/task-manager-XAT7GOWB.js +93 -0
  613. package/dist/task-splitter-U7DJ7W6A.js +79 -0
  614. package/dist/task-type-detector-OLVOMXZO.js +21 -0
  615. package/dist/task-type-resolver-KKNQYSB4.js +42 -0
  616. package/dist/telemetry-5HWBBXLX.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-XUOZNZZ6.js +125 -0
  620. package/dist/token-estimator-MEQUL3EJ.js +37 -0
  621. package/dist/transports-KNSSV2V4.js +255 -0
  622. package/dist/unified-cost-tracker-4TFRBVPR.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-KLRNG6XA.js +33 -0
  627. package/dist/variant-state-cleanup-MZGGLQAJ.js +280 -0
  628. package/dist/variant-success-PJXWE3ZV.js +12 -0
  629. package/dist/variant-worker-KUWKBLAH.js +4196 -0
  630. package/dist/variant-worker.js +24 -0
  631. package/dist/variants-JE2FSAQS.js +233 -0
  632. package/dist/verification-toolchains-V24UHW6Q.js +28 -0
  633. package/dist/verify-commands-H3DTCSGI.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-7SA2VS2Y.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 +7042 -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/npm-shrinkwrap.json +4950 -0
  720. package/package.json +331 -0
  721. package/schemas/README.md +80 -0
  722. package/schemas/config-v1.schema.json +136 -0
  723. package/schemas/execution-config.schema.json +47 -0
  724. package/schemas/judge-scoring.schema.json +370 -0
  725. package/schemas/poetic.config.schema.json +2214 -0
  726. package/schemas/provider-config.schema.json +203 -0
  727. package/schemas/telemetry-config.schema.json +79 -0
  728. package/schemas/user-preferences.schema.json +141 -0
  729. package/scripts/assert-node-runtime.mjs +140 -0
  730. package/scripts/preflight-native.mjs +49 -0
  731. package/scripts/preinstall-node-check.mjs +78 -0
  732. package/scripts/setup-git-hooks.mjs +24 -0
  733. package/scripts/sync.sh +2722 -0
  734. package/scripts/write-node-launcher.sh +108 -0
  735. package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
  736. package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
  737. package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
  738. package/templates/.poetic/README.md +37 -0
  739. package/templates/.poetic/agents/README.md +296 -0
  740. package/templates/.poetic/agents/api-documenter.md +147 -0
  741. package/templates/.poetic/agents/backend-architect.md +31 -0
  742. package/templates/.poetic/agents/code-reviewer.md +157 -0
  743. package/templates/.poetic/agents/data-scientist.md +179 -0
  744. package/templates/.poetic/agents/database-optimizer.md +145 -0
  745. package/templates/.poetic/agents/debugger.md +31 -0
  746. package/templates/.poetic/agents/deployment-engineer.md +164 -0
  747. package/templates/.poetic/agents/devops-troubleshooter.md +139 -0
  748. package/templates/.poetic/agents/frontend-developer.md +150 -0
  749. package/templates/.poetic/agents/javascript-pro.md +36 -0
  750. package/templates/.poetic/agents/performance-engineer.md +151 -0
  751. package/templates/.poetic/agents/python-pro.md +137 -0
  752. package/templates/.poetic/agents/test-automator.md +147 -0
  753. package/templates/.poetic/agents/typescript-pro.md +34 -0
  754. package/templates/.poetic/config/poetic.config.jsonc +69 -0
  755. package/templates/.poetic/config/project-context.template.json +6 -0
  756. package/templates/.poetic/config/task-type-aliases.presets/kanban.yaml +14 -0
  757. package/templates/.poetic/config/task-type-aliases.presets/scrum.yaml +17 -0
  758. package/templates/.poetic/config/task-type-aliases.presets/xp.yaml +12 -0
  759. package/templates/.poetic/config/task-type-aliases.yaml +28 -0
  760. package/templates/.poetic/gitignore.template +55 -0
  761. package/templates/.poetic/task-types/analysis.yaml +40 -0
  762. package/templates/.poetic/task-types/architecture.yaml +38 -0
  763. package/templates/.poetic/task-types/doc.yaml +35 -0
  764. package/templates/.poetic/task-types/feature.yaml +23 -0
  765. package/templates/.poetic/task-types/general.yaml +6 -0
  766. package/templates/.poetic/task-types/security.yaml +39 -0
  767. package/templates/AGENTS.template.md +99 -0
  768. package/templates/CLAUDE.template.md +1 -0
  769. package/templates/GEMINI.template.md +1 -0
  770. package/templates/builtin-workflows/code-review.yaml +73 -0
  771. package/templates/builtin-workflows/compete-streak.yaml +78 -0
  772. package/templates/builtin-workflows/hello-verify.yaml +10 -0
  773. package/templates/builtin-workflows/judge-regression.yaml +114 -0
  774. package/templates/builtin-workflows/skills/code-review/SKILL.md +60 -0
  775. package/templates/builtin-workflows/skills/hello-verify/SKILL.md +6 -0
  776. package/templates/guard-kit/GUARD_SETUP.md.template +255 -0
  777. package/templates/guard-kit/check.mjs.template +777 -0
  778. package/templates/guard-kit/config.json.template +6 -0
  779. package/templates/guard-kit/poetic-guard.yml.template +189 -0
  780. package/templates/profiles/README.md +56 -0
  781. package/templates/profiles/frontier-claude.json +27 -0
  782. package/templates/profiles/frontier-codex.json +26 -0
@@ -0,0 +1,1026 @@
1
+ /**
2
+ * Pure BB presentation and interaction for backlog authoring over BPAU-01.
3
+ *
4
+ * This module is presentation only. It composes forms, proportionate
5
+ * confirmations, and one typed BPAU-01 request per confirmed submission, and it
6
+ * renders the outcome BPAU-01 returned. It holds the same authority boundary the
7
+ * rest of this plugin holds:
8
+ *
9
+ * - Poetic is authoritative. Nothing here predicts a resulting status,
10
+ * completeness score, identity, priority, or sync state, and nothing here
11
+ * re-labels one Poetic published.
12
+ * - Changed facts are displayed only from Poetic's own authoritative reread.
13
+ * While that reread is unavailable the view reports `awaiting-reread`
14
+ * instead of echoing the values BB submitted.
15
+ * - Absent evidence renders as an explicit `unavailable`. A missing field is
16
+ * never replaced by a default, a guess, or an empty success state.
17
+ * - Nothing here runs a command, touches the filesystem, reads Git, or
18
+ * mutates managed planning state. Every function is deterministic in its
19
+ * inputs; the BPAU-01 service owns execution.
20
+ *
21
+ * Scope is create, whitelisted update, review, and prioritize only. There is no
22
+ * defer/parking, archive, execution, finalization, optimistic state, or retry
23
+ * here, and this module wires no application shell.
24
+ */
25
+
26
+ import type {
27
+ BacklogAuthoringOutcome,
28
+ BacklogAuthoringResult,
29
+ BacklogDetailEvidence,
30
+ BacklogEvidence,
31
+ } from './backlog-authoring-model.js';
32
+ import {
33
+ type BacklogAuthoringRequest,
34
+ backlogAuthoringRequestSchema,
35
+ } from './backlog-authoring-schema.js';
36
+
37
+ export const BACKLOG_AUTHORING_VIEW_VERSION = '1.0.0' as const;
38
+
39
+ /**
40
+ * Bound on any single emitted row value, mirroring the sibling view modules.
41
+ *
42
+ * Disclosures, notes, sync warnings, and Poetic's own diagnostics are never
43
+ * truncated: shortening a consent disclosure or a warning Poetic published would
44
+ * hide part of what the operator is being told.
45
+ */
46
+ export const BACKLOG_AUTHORING_MAX_LINE_CHARS = 200;
47
+
48
+ /** Plain label for evidence Poetic did not publish. */
49
+ const UNAVAILABLE = 'unavailable';
50
+
51
+ export type BacklogAuthoringAction = BacklogAuthoringRequest['action'];
52
+ type BacklogAuthoringConsentPayload = BacklogAuthoringRequest['consent'];
53
+ /** One request per action with its consent removed, distributed over the union. */
54
+ type BacklogRequestDraft = BacklogAuthoringRequest extends infer Request
55
+ ? Request extends { consent: unknown }
56
+ ? Omit<Request, 'consent'>
57
+ : never
58
+ : never;
59
+ type BacklogPriority = Extract<
60
+ BacklogAuthoringRequest,
61
+ { action: 'prioritizeBacklogItem' }
62
+ >['input']['priority'];
63
+
64
+ export interface BacklogAuthoringRow {
65
+ /** Stable row id, usable as a render key. */
66
+ id: string;
67
+ label: string;
68
+ value: string;
69
+ }
70
+
71
+ /** The repository and branch one form is bound to, as BB selected them. */
72
+ export interface BacklogAuthoringTarget {
73
+ projectId: string;
74
+ sourceId: string;
75
+ repositoryPath: string;
76
+ /** Null when Poetic reports no named branch; authoring is then unavailable. */
77
+ branch: string | null;
78
+ }
79
+
80
+ function truncateLine(text: string): string {
81
+ const normalized = text.replace(/\s+/g, ' ').trim();
82
+ if (normalized.length <= BACKLOG_AUTHORING_MAX_LINE_CHARS) return normalized;
83
+ return `${normalized.slice(0, BACKLOG_AUTHORING_MAX_LINE_CHARS - 3)}...`;
84
+ }
85
+
86
+ function row(id: string, label: string, value: string): BacklogAuthoringRow {
87
+ return { id, label, value: truncateLine(value) };
88
+ }
89
+
90
+ function normalizeTags(tags: readonly string[] | undefined): string[] {
91
+ if (tags === undefined) return [];
92
+ const present = tags.map((tag) => tag.trim()).filter((tag) => tag.length > 0);
93
+ return [...new Set(present)];
94
+ }
95
+
96
+ /** Control labels. Each names the one product it submits. */
97
+ export const BACKLOG_AUTHORING_LABELS: Readonly<Record<BacklogAuthoringAction, string>> = {
98
+ createBacklogItem: 'Capture backlog item',
99
+ updateBacklogItem: 'Edit backlog item',
100
+ reviewBacklogItem: 'Mark backlog item reviewed',
101
+ prioritizeBacklogItem: 'Set backlog item priority',
102
+ };
103
+
104
+ /**
105
+ * What each command is asked to do. These describe the request, never a
106
+ * predicted result, and each one names what it does not do so an authoring
107
+ * control can never read as execution or archival.
108
+ */
109
+ export const BACKLOG_AUTHORING_EFFECTS: Readonly<Record<BacklogAuthoringAction, string>> = {
110
+ createBacklogItem:
111
+ 'Asks Poetic to create a new backlog item from the sections you entered. Poetic mints the id and scores completeness. Nothing is executed, deferred, or archived.',
112
+ updateBacklogItem:
113
+ 'Asks Poetic to update only the backlog fields you changed. It sets no status, and it never defers, archives, or executes the item.',
114
+ reviewBacklogItem:
115
+ 'Asks Poetic to mark this backlog item reviewed. It changes no priority and executes nothing.',
116
+ prioritizeBacklogItem:
117
+ 'Asks Poetic to set this backlog item priority. Poetic decides the resulting status; nothing is executed.',
118
+ };
119
+
120
+ /**
121
+ * Whole-body replacement disclosure, stated once. A backlog update sends
122
+ * `--body`, which replaces the entire item body rather than one section, so this
123
+ * copy must never read as a partial edit.
124
+ */
125
+ export const BACKLOG_FULL_BODY_REPLACEMENT_NOTICE =
126
+ 'Saving replaces the entire body of this backlog item with the text above, including any section Poetic itself added. The editor was prepopulated from the current canonical body; BB will not submit a replacement it could not prepopulate.';
127
+
128
+ /**
129
+ * Prioritize can promote an inbox item, which is a launch-eligibility change and
130
+ * is disclosed as one before submission.
131
+ */
132
+ export const BACKLOG_PRIORITIZE_LAUNCH_ELIGIBILITY_NOTICE =
133
+ 'Setting a priority may also move an inbox item to reviewed, which can make it launch-eligible for execution. Poetic decides the resulting status; BB reports only what Poetic rereads afterwards.';
134
+
135
+ export const BACKLOG_REVIEW_LAUNCH_ELIGIBILITY_NOTICE =
136
+ 'Marking this item reviewed can make it launch-eligible for execution. Poetic decides the resulting status; BB reports only what Poetic rereads afterwards.';
137
+
138
+ export const BACKLOG_CAPTURE_COMPLETENESS_NOTICE =
139
+ 'Poetic scores completeness after creation. An incomplete item is still created; Poetic then reports what is missing and the refine command that finishes it.';
140
+
141
+ /** Consent checkboxes exactly as the operator left them; plain booleans. */
142
+ export interface BacklogAuthoringConsentState {
143
+ hostExecution: boolean;
144
+ managedPlanningMutation: boolean;
145
+ automaticCommitAndPush: boolean;
146
+ selectedRepositoryAndBranch: boolean;
147
+ /** Required for capture only. */
148
+ newIdentityCreation: boolean;
149
+ /** Required for review and prioritize only. */
150
+ launchEligibilityChange: boolean;
151
+ /** Required when an update replaces the whole body. */
152
+ fullSectionReplacement: boolean;
153
+ }
154
+
155
+ export const EMPTY_BACKLOG_AUTHORING_CONSENT: Readonly<BacklogAuthoringConsentState> = {
156
+ hostExecution: false,
157
+ managedPlanningMutation: false,
158
+ automaticCommitAndPush: false,
159
+ selectedRepositoryAndBranch: false,
160
+ newIdentityCreation: false,
161
+ launchEligibilityChange: false,
162
+ fullSectionReplacement: false,
163
+ };
164
+
165
+ export const BACKLOG_AUTHORING_CONSENT_LABELS: Readonly<
166
+ Record<keyof BacklogAuthoringConsentState, string>
167
+ > = {
168
+ hostExecution: 'Poetic runs as my host user in the repository shown above.',
169
+ managedPlanningMutation: 'This mutates managed planning state that Poetic owns.',
170
+ automaticCommitAndPush:
171
+ "Poetic's built-in managed sync commits and pushes these planning changes.",
172
+ selectedRepositoryAndBranch: 'I mean this repository path and this branch.',
173
+ newIdentityCreation: 'A new Poetic-minted backlog id will exist after this action.',
174
+ launchEligibilityChange:
175
+ 'This may change launch eligibility: the item can become reviewed and executable.',
176
+ fullSectionReplacement: 'This replaces the entire body of the backlog item.',
177
+ };
178
+
179
+ /**
180
+ * Which acknowledgement lines one action requires, given the fields being sent.
181
+ * Confirmation is proportionate: an action never collects an acknowledgement for
182
+ * an effect that is not happening.
183
+ */
184
+ export function backlogAuthoringRequiredConsentKeys(
185
+ action: BacklogAuthoringAction,
186
+ replacesBody = false
187
+ ): Array<keyof BacklogAuthoringConsentState> {
188
+ const base: Array<keyof BacklogAuthoringConsentState> = [
189
+ 'hostExecution',
190
+ 'managedPlanningMutation',
191
+ 'automaticCommitAndPush',
192
+ 'selectedRepositoryAndBranch',
193
+ ];
194
+ switch (action) {
195
+ case 'createBacklogItem':
196
+ return [...base, 'newIdentityCreation'];
197
+ case 'updateBacklogItem':
198
+ return replacesBody ? [...base, 'fullSectionReplacement'] : base;
199
+ default:
200
+ return [...base, 'launchEligibilityChange'];
201
+ }
202
+ }
203
+
204
+ /**
205
+ * Convert collected consent into the exact shape the BPAU-01 schema requires, or
206
+ * null when the acknowledgement is incomplete. Returning null is the enforcement
207
+ * point: no request is emitted without proportionate consent, and no literal is
208
+ * added for an effect that is not happening.
209
+ */
210
+ function backlogAuthoringConsentPayload(
211
+ action: BacklogAuthoringAction,
212
+ replacesBody: boolean,
213
+ consent: BacklogAuthoringConsentState
214
+ ): BacklogAuthoringConsentPayload | null {
215
+ if (backlogAuthoringRequiredConsentKeys(action, replacesBody).some((key) => !consent[key])) {
216
+ return null;
217
+ }
218
+ const base = {
219
+ hostExecution: true,
220
+ managedPlanningMutation: true,
221
+ automaticCommitAndPush: true,
222
+ selectedRepositoryAndBranch: true,
223
+ } as const;
224
+ switch (action) {
225
+ case 'createBacklogItem':
226
+ return { ...base, newIdentityCreation: true };
227
+ case 'updateBacklogItem':
228
+ return replacesBody ? { ...base, fullSectionReplacement: true } : base;
229
+ default:
230
+ return { ...base, launchEligibilityChange: true };
231
+ }
232
+ }
233
+
234
+ function outstandingConsentLabels(
235
+ action: BacklogAuthoringAction,
236
+ replacesBody: boolean,
237
+ consent: BacklogAuthoringConsentState
238
+ ): string[] {
239
+ return backlogAuthoringRequiredConsentKeys(action, replacesBody)
240
+ .filter((key) => !consent[key])
241
+ .map((key) => BACKLOG_AUTHORING_CONSENT_LABELS[key]);
242
+ }
243
+
244
+ /** The required inline sections of a complete backlog body. */
245
+ export interface BacklogCaptureSectionSpec {
246
+ id: 'scope' | 'acceptance-criteria' | 'how-to-verify';
247
+ /** Heading Poetic's completeness check looks for, on its own line. */
248
+ heading: string;
249
+ label: string;
250
+ field: 'scope' | 'acceptanceCriteria' | 'howToVerify';
251
+ }
252
+
253
+ export const BACKLOG_CAPTURE_SECTIONS: readonly BacklogCaptureSectionSpec[] = [
254
+ {
255
+ id: 'scope',
256
+ heading: '## Scope / Surfaces Affected',
257
+ label: 'Scope / surfaces affected',
258
+ field: 'scope',
259
+ },
260
+ {
261
+ id: 'acceptance-criteria',
262
+ heading: '## Acceptance Criteria',
263
+ label: 'Acceptance criteria',
264
+ field: 'acceptanceCriteria',
265
+ },
266
+ {
267
+ id: 'how-to-verify',
268
+ heading: '## How to Verify',
269
+ label: 'How to verify',
270
+ field: 'howToVerify',
271
+ },
272
+ ];
273
+
274
+ /** Capture form state exactly as the operator left it. */
275
+ export interface BacklogCaptureDraft {
276
+ title: string;
277
+ summary: string;
278
+ scope: string;
279
+ acceptanceCriteria: string;
280
+ howToVerify: string;
281
+ priority?: BacklogPriority;
282
+ declaredType?: string;
283
+ tags?: readonly string[];
284
+ complexity?: number;
285
+ domain?: string;
286
+ expectedRuntimeMinutes?: number;
287
+ }
288
+
289
+ export const EMPTY_BACKLOG_CAPTURE_DRAFT: Readonly<BacklogCaptureDraft> = {
290
+ title: '',
291
+ summary: '',
292
+ scope: '',
293
+ acceptanceCriteria: '',
294
+ howToVerify: '',
295
+ };
296
+
297
+ /**
298
+ * Compose the complete inline markdown body from the collected sections. Every
299
+ * required heading is emitted on its own line so Poetic's own completeness check
300
+ * reads the body BB submitted; BB never scores completeness itself.
301
+ */
302
+ export function composeBacklogCaptureBody(draft: BacklogCaptureDraft): string {
303
+ const blocks: string[] = [];
304
+ const summary = draft.summary.trim();
305
+ if (summary.length > 0) blocks.push(summary);
306
+ for (const section of BACKLOG_CAPTURE_SECTIONS) {
307
+ blocks.push(`${section.heading}\n\n${draft[section.field].trim()}`);
308
+ }
309
+ return blocks.join('\n\n');
310
+ }
311
+
312
+ function numberProblems(
313
+ complexity: number | undefined,
314
+ expectedRuntimeMinutes: number | undefined
315
+ ): string[] {
316
+ const problems: string[] = [];
317
+ if (
318
+ complexity !== undefined &&
319
+ (!Number.isFinite(complexity) || complexity < 0 || complexity > 1)
320
+ ) {
321
+ problems.push('Complexity must be a number between 0 and 1.');
322
+ }
323
+ if (
324
+ expectedRuntimeMinutes !== undefined &&
325
+ (!Number.isInteger(expectedRuntimeMinutes) || expectedRuntimeMinutes <= 0)
326
+ ) {
327
+ problems.push('Expected runtime must be a whole number of minutes above zero.');
328
+ }
329
+ return problems;
330
+ }
331
+
332
+ /**
333
+ * What the operator must still supply or correct before capture can be
334
+ * submitted. This is input validation only: it never scores completeness, which
335
+ * is Poetic's own result reported after creation.
336
+ */
337
+ export function backlogCaptureMissingFields(draft: BacklogCaptureDraft): string[] {
338
+ const missing: string[] = [];
339
+ const title = draft.title.trim();
340
+ if (title.length === 0) missing.push('Title');
341
+ else if (title === '-' || title.startsWith('-')) {
342
+ missing.push('Title must not begin with a dash.');
343
+ }
344
+ for (const section of BACKLOG_CAPTURE_SECTIONS) {
345
+ if (draft[section.field].trim().length === 0) missing.push(section.label);
346
+ }
347
+ missing.push(...numberProblems(draft.complexity, draft.expectedRuntimeMinutes));
348
+ return missing;
349
+ }
350
+
351
+ /** Whitelisted update fields. Body replacement has its own prepopulated form. */
352
+ export interface BacklogFieldUpdateDraft {
353
+ title?: string;
354
+ complexity?: number;
355
+ expectedRuntimeMinutes?: number;
356
+ domain?: string;
357
+ rationale?: string;
358
+ addTags?: readonly string[];
359
+ removeTags?: readonly string[];
360
+ }
361
+
362
+ /**
363
+ * Why a form cannot emit a request yet. `duplicate-submission` and
364
+ * `invalid-request` mirror BPAU-01 refusal reasons so the operator sees the same
365
+ * distinction before and after launch.
366
+ */
367
+ export type BacklogAuthoringSubmissionBlock =
368
+ | 'target-not-ready'
369
+ | 'incomplete-input'
370
+ | 'acknowledgement-incomplete'
371
+ | 'prepopulation-unavailable'
372
+ | 'duplicate-submission'
373
+ | 'invalid-request';
374
+
375
+ /** Proportionate confirmation shown before one mutation is submitted. */
376
+ export interface BacklogAuthoringConfirmation {
377
+ /** Repository path and branch always appear in a mutation confirmation. */
378
+ repositoryPath: string;
379
+ branch: string;
380
+ /** What the command is asked to do, never a predicted result. */
381
+ effect: string;
382
+ /** Only the acknowledgements this effect actually requires. */
383
+ acknowledgements: readonly string[];
384
+ /** Required acknowledgements the operator has not given yet. */
385
+ outstanding: readonly string[];
386
+ disclosures: readonly string[];
387
+ }
388
+
389
+ export interface BacklogAuthoringFormView {
390
+ viewVersion: typeof BACKLOG_AUTHORING_VIEW_VERSION;
391
+ action: BacklogAuthoringAction;
392
+ state: 'blocked' | 'incomplete' | 'ready';
393
+ headline: string;
394
+ /** Plain `label: value` rows describing what will be sent. */
395
+ fields: readonly BacklogAuthoringRow[];
396
+ /** What the operator must still supply or correct. */
397
+ missing: readonly string[];
398
+ confirmation: BacklogAuthoringConfirmation | null;
399
+ notes: readonly string[];
400
+ /** Why this form cannot submit; null when it is ready. */
401
+ blockReason: BacklogAuthoringSubmissionBlock | null;
402
+ /** The typed BPAU-01 request this form would submit; null until ready. */
403
+ request: BacklogAuthoringRequest | null;
404
+ }
405
+
406
+ function blockedForm(
407
+ action: BacklogAuthoringAction,
408
+ blockReason: BacklogAuthoringSubmissionBlock,
409
+ headline: string,
410
+ notes: readonly string[]
411
+ ): BacklogAuthoringFormView {
412
+ return {
413
+ viewVersion: BACKLOG_AUTHORING_VIEW_VERSION,
414
+ action,
415
+ state: 'blocked',
416
+ headline,
417
+ fields: [],
418
+ missing: [],
419
+ confirmation: null,
420
+ notes,
421
+ blockReason,
422
+ request: null,
423
+ };
424
+ }
425
+
426
+ interface FormBuild {
427
+ action: BacklogAuthoringAction;
428
+ target: BacklogAuthoringTarget;
429
+ consent: BacklogAuthoringConsentState;
430
+ replacesBody: boolean;
431
+ fields: readonly BacklogAuthoringRow[];
432
+ missing: readonly string[];
433
+ disclosures: readonly string[];
434
+ notes: readonly string[];
435
+ /** Request body without consent; consent is attached only when complete. */
436
+ requestWithoutConsent: (branch: string) => BacklogRequestDraft;
437
+ }
438
+
439
+ /**
440
+ * Assemble one form view. The request is emitted only when the input is usable,
441
+ * the acknowledgements are proportionate and complete, and the resulting payload
442
+ * still validates against the BPAU-01 request schema, so an invalid request is
443
+ * never handed to the service.
444
+ */
445
+ function buildForm(build: FormBuild): BacklogAuthoringFormView {
446
+ const branch = build.target.branch;
447
+ if (branch === null || branch.trim().length === 0 || build.target.repositoryPath.length === 0) {
448
+ return blockedForm(build.action, 'target-not-ready', 'Backlog authoring unavailable', [
449
+ 'Poetic reports no selected repository on a named branch, so no backlog mutation can be confirmed.',
450
+ ]);
451
+ }
452
+
453
+ const outstanding = outstandingConsentLabels(build.action, build.replacesBody, build.consent);
454
+ const confirmation: BacklogAuthoringConfirmation = {
455
+ repositoryPath: build.target.repositoryPath,
456
+ branch,
457
+ effect: BACKLOG_AUTHORING_EFFECTS[build.action],
458
+ acknowledgements: backlogAuthoringRequiredConsentKeys(build.action, build.replacesBody).map(
459
+ (key) => BACKLOG_AUTHORING_CONSENT_LABELS[key]
460
+ ),
461
+ outstanding,
462
+ disclosures: build.disclosures,
463
+ };
464
+
465
+ const consentPayload = backlogAuthoringConsentPayload(
466
+ build.action,
467
+ build.replacesBody,
468
+ build.consent
469
+ );
470
+ let request: BacklogAuthoringRequest | null = null;
471
+ let blockReason: BacklogAuthoringSubmissionBlock | null = null;
472
+ if (build.missing.length > 0) blockReason = 'incomplete-input';
473
+ else if (consentPayload === null) blockReason = 'acknowledgement-incomplete';
474
+ else {
475
+ const parsed = backlogAuthoringRequestSchema.safeParse({
476
+ ...build.requestWithoutConsent(branch),
477
+ consent: consentPayload,
478
+ });
479
+ if (parsed.success) request = parsed.data;
480
+ else blockReason = 'invalid-request';
481
+ }
482
+
483
+ return {
484
+ viewVersion: BACKLOG_AUTHORING_VIEW_VERSION,
485
+ action: build.action,
486
+ state: request === null ? 'incomplete' : 'ready',
487
+ headline: BACKLOG_AUTHORING_LABELS[build.action],
488
+ fields: build.fields,
489
+ missing: build.missing,
490
+ confirmation,
491
+ notes: build.notes,
492
+ blockReason,
493
+ request,
494
+ };
495
+ }
496
+
497
+ /** Build the capture form for a new backlog item. */
498
+ export function buildBacklogCaptureForm(
499
+ target: BacklogAuthoringTarget,
500
+ draft: BacklogCaptureDraft,
501
+ consent: BacklogAuthoringConsentState
502
+ ): BacklogAuthoringFormView {
503
+ const body = composeBacklogCaptureBody(draft);
504
+ const tags = normalizeTags(draft.tags);
505
+ const fields: BacklogAuthoringRow[] = [
506
+ row('title', 'Title', draft.title.trim().length === 0 ? UNAVAILABLE : draft.title.trim()),
507
+ row('priority', 'Priority', draft.priority ?? UNAVAILABLE),
508
+ row('declared-type', 'Type', draft.declaredType?.trim() || UNAVAILABLE),
509
+ row('tags', 'Tags', tags.length === 0 ? 'none' : tags.join(', ')),
510
+ row(
511
+ 'complexity',
512
+ 'Complexity',
513
+ draft.complexity === undefined ? UNAVAILABLE : String(draft.complexity)
514
+ ),
515
+ row('domain', 'Domain', draft.domain?.trim() || UNAVAILABLE),
516
+ row(
517
+ 'expected-runtime',
518
+ 'Expected runtime (minutes)',
519
+ draft.expectedRuntimeMinutes === undefined
520
+ ? UNAVAILABLE
521
+ : String(draft.expectedRuntimeMinutes)
522
+ ),
523
+ ];
524
+ for (const section of BACKLOG_CAPTURE_SECTIONS) {
525
+ const content = draft[section.field].trim();
526
+ fields.push(
527
+ row(`section-${section.id}`, section.label, content.length === 0 ? 'empty' : content)
528
+ );
529
+ }
530
+
531
+ return buildForm({
532
+ action: 'createBacklogItem',
533
+ target,
534
+ consent,
535
+ replacesBody: false,
536
+ fields,
537
+ missing: backlogCaptureMissingFields(draft),
538
+ disclosures: [BACKLOG_CAPTURE_COMPLETENESS_NOTICE],
539
+ notes: [BACKLOG_CAPTURE_COMPLETENESS_NOTICE],
540
+ requestWithoutConsent: (branch) => ({
541
+ projectId: target.projectId,
542
+ sourceId: target.sourceId,
543
+ action: 'createBacklogItem',
544
+ input: {
545
+ title: draft.title.trim(),
546
+ body,
547
+ ...(draft.priority === undefined ? {} : { priority: draft.priority }),
548
+ ...(draft.declaredType?.trim() ? { declaredType: draft.declaredType.trim() } : {}),
549
+ ...(tags.length === 0 ? {} : { tags }),
550
+ ...(draft.complexity === undefined ? {} : { complexity: draft.complexity }),
551
+ ...(draft.domain?.trim() ? { domain: draft.domain.trim() } : {}),
552
+ ...(draft.expectedRuntimeMinutes === undefined
553
+ ? {}
554
+ : { expectedRuntimeMinutes: draft.expectedRuntimeMinutes }),
555
+ },
556
+ expected: { repository: target.repositoryPath, branch },
557
+ }),
558
+ });
559
+ }
560
+
561
+ /**
562
+ * The body editor, prepopulated from Poetic's canonical detail.
563
+ *
564
+ * BB refuses a replacement it could not prepopulate: submitting an
565
+ * unprepopulated editor would silently discard whatever Poetic currently holds.
566
+ */
567
+ export type BacklogBodyEditor =
568
+ | { state: 'prepopulated'; backlogItemId: string; canonicalBody: string; body: string }
569
+ | { state: 'unavailable'; backlogItemId: string; reason: string };
570
+
571
+ export function buildBacklogBodyEditor(
572
+ backlogItemId: string,
573
+ detail: BacklogEvidence<BacklogDetailEvidence>
574
+ ): BacklogBodyEditor {
575
+ if (detail.state === 'unavailable') {
576
+ return {
577
+ state: 'unavailable',
578
+ backlogItemId,
579
+ reason: `Poetic did not publish the canonical body for backlog item ${backlogItemId} (${detail.reason}), so BB will not replace it.`,
580
+ };
581
+ }
582
+ if (detail.value.id !== backlogItemId) {
583
+ return {
584
+ state: 'unavailable',
585
+ backlogItemId,
586
+ reason: `Poetic published a body for ${detail.value.id} while BB asked for ${backlogItemId}, so BB will not replace it.`,
587
+ };
588
+ }
589
+ return {
590
+ state: 'prepopulated',
591
+ backlogItemId,
592
+ canonicalBody: detail.value.body,
593
+ body: detail.value.body,
594
+ };
595
+ }
596
+
597
+ /**
598
+ * Build the whole-body replacement form. `replacementBody` is the edited text;
599
+ * the canonical body the editor was prepopulated from is carried through as
600
+ * `expected.canonicalBody` so BPAU-01 can refuse a stale replacement.
601
+ */
602
+ export function buildBacklogBodyReplacementForm(
603
+ target: BacklogAuthoringTarget,
604
+ editor: BacklogBodyEditor,
605
+ replacementBody: string,
606
+ consent: BacklogAuthoringConsentState
607
+ ): BacklogAuthoringFormView {
608
+ if (editor.state === 'unavailable') {
609
+ return blockedForm(
610
+ 'updateBacklogItem',
611
+ 'prepopulation-unavailable',
612
+ 'Body replacement unavailable',
613
+ [editor.reason]
614
+ );
615
+ }
616
+ const missing = replacementBody.trim().length === 0 ? ['Body'] : [];
617
+ return buildForm({
618
+ action: 'updateBacklogItem',
619
+ target,
620
+ consent,
621
+ replacesBody: true,
622
+ fields: [
623
+ row('backlog-item', 'Backlog item', editor.backlogItemId),
624
+ row('body-length', 'Replacement length (characters)', String(replacementBody.length)),
625
+ row(
626
+ 'body-changed',
627
+ 'Differs from canonical body',
628
+ replacementBody === editor.canonicalBody ? 'no' : 'yes'
629
+ ),
630
+ ],
631
+ missing,
632
+ disclosures: [BACKLOG_FULL_BODY_REPLACEMENT_NOTICE],
633
+ notes: [BACKLOG_FULL_BODY_REPLACEMENT_NOTICE],
634
+ requestWithoutConsent: (branch) => ({
635
+ projectId: target.projectId,
636
+ sourceId: target.sourceId,
637
+ action: 'updateBacklogItem',
638
+ input: { backlogItemId: editor.backlogItemId, body: replacementBody },
639
+ expected: {
640
+ repository: target.repositoryPath,
641
+ branch,
642
+ canonicalBody: editor.canonicalBody,
643
+ },
644
+ }),
645
+ });
646
+ }
647
+
648
+ /** Build the whitelisted field-update form. No body, so no replacement consent. */
649
+ export function buildBacklogFieldUpdateForm(
650
+ target: BacklogAuthoringTarget,
651
+ backlogItemId: string,
652
+ draft: BacklogFieldUpdateDraft,
653
+ consent: BacklogAuthoringConsentState
654
+ ): BacklogAuthoringFormView {
655
+ const title = draft.title?.trim();
656
+ const domain = draft.domain?.trim();
657
+ const rationale = draft.rationale?.trim();
658
+ const addTags = normalizeTags(draft.addTags);
659
+ const removeTags = normalizeTags(draft.removeTags);
660
+ const input = {
661
+ backlogItemId,
662
+ ...(title ? { title } : {}),
663
+ ...(draft.complexity === undefined ? {} : { complexity: draft.complexity }),
664
+ ...(draft.expectedRuntimeMinutes === undefined
665
+ ? {}
666
+ : { expectedRuntimeMinutes: draft.expectedRuntimeMinutes }),
667
+ ...(domain ? { domain } : {}),
668
+ ...(rationale ? { rationale } : {}),
669
+ ...(addTags.length === 0 ? {} : { addTags }),
670
+ ...(removeTags.length === 0 ? {} : { removeTags }),
671
+ };
672
+ const missing =
673
+ Object.keys(input).length === 1 ? ['At least one field to change'] : ([] as string[]);
674
+ missing.push(...numberProblems(draft.complexity, draft.expectedRuntimeMinutes));
675
+
676
+ return buildForm({
677
+ action: 'updateBacklogItem',
678
+ target,
679
+ consent,
680
+ replacesBody: false,
681
+ fields: [
682
+ row('backlog-item', 'Backlog item', backlogItemId),
683
+ row('title', 'Title', title || 'unchanged'),
684
+ row(
685
+ 'complexity',
686
+ 'Complexity',
687
+ draft.complexity === undefined ? 'unchanged' : String(draft.complexity)
688
+ ),
689
+ row(
690
+ 'expected-runtime',
691
+ 'Expected runtime (minutes)',
692
+ draft.expectedRuntimeMinutes === undefined
693
+ ? 'unchanged'
694
+ : String(draft.expectedRuntimeMinutes)
695
+ ),
696
+ row('domain', 'Domain', domain || 'unchanged'),
697
+ row('rationale', 'Rationale', rationale || 'unchanged'),
698
+ row('add-tags', 'Tags added', addTags.length === 0 ? 'none' : addTags.join(', ')),
699
+ row('remove-tags', 'Tags removed', removeTags.length === 0 ? 'none' : removeTags.join(', ')),
700
+ ],
701
+ missing,
702
+ disclosures: [
703
+ 'This edit changes only the fields listed above. The item body is left as Poetic has it.',
704
+ ],
705
+ notes: [],
706
+ requestWithoutConsent: (branch) => ({
707
+ projectId: target.projectId,
708
+ sourceId: target.sourceId,
709
+ action: 'updateBacklogItem',
710
+ input,
711
+ expected: { repository: target.repositoryPath, branch },
712
+ }),
713
+ });
714
+ }
715
+
716
+ /** Build the review confirmation, disclosing the launch-eligibility change. */
717
+ export function buildBacklogReviewForm(
718
+ target: BacklogAuthoringTarget,
719
+ backlogItemId: string,
720
+ consent: BacklogAuthoringConsentState
721
+ ): BacklogAuthoringFormView {
722
+ return buildForm({
723
+ action: 'reviewBacklogItem',
724
+ target,
725
+ consent,
726
+ replacesBody: false,
727
+ fields: [row('backlog-item', 'Backlog item', backlogItemId)],
728
+ missing: backlogItemId.trim().length === 0 ? ['Backlog item'] : [],
729
+ disclosures: [BACKLOG_REVIEW_LAUNCH_ELIGIBILITY_NOTICE],
730
+ notes: [BACKLOG_REVIEW_LAUNCH_ELIGIBILITY_NOTICE],
731
+ requestWithoutConsent: (branch) => ({
732
+ projectId: target.projectId,
733
+ sourceId: target.sourceId,
734
+ action: 'reviewBacklogItem',
735
+ input: { backlogItemId },
736
+ expected: { repository: target.repositoryPath, branch },
737
+ }),
738
+ });
739
+ }
740
+
741
+ /**
742
+ * Build the prioritize confirmation. It discloses that an inbox item may become
743
+ * reviewed and launch-eligible, without predicting the resulting status.
744
+ */
745
+ export function buildBacklogPrioritizeForm(
746
+ target: BacklogAuthoringTarget,
747
+ backlogItemId: string,
748
+ priority: BacklogPriority,
749
+ consent: BacklogAuthoringConsentState,
750
+ currentStatus: string | null = null
751
+ ): BacklogAuthoringFormView {
752
+ return buildForm({
753
+ action: 'prioritizeBacklogItem',
754
+ target,
755
+ consent,
756
+ replacesBody: false,
757
+ fields: [
758
+ row('backlog-item', 'Backlog item', backlogItemId),
759
+ row('current-status', 'Current status', currentStatus?.trim() || UNAVAILABLE),
760
+ row('priority', 'Requested priority', priority),
761
+ ],
762
+ missing: backlogItemId.trim().length === 0 ? ['Backlog item'] : [],
763
+ disclosures: [BACKLOG_PRIORITIZE_LAUNCH_ELIGIBILITY_NOTICE],
764
+ notes: [BACKLOG_PRIORITIZE_LAUNCH_ELIGIBILITY_NOTICE],
765
+ requestWithoutConsent: (branch) => ({
766
+ projectId: target.projectId,
767
+ sourceId: target.sourceId,
768
+ action: 'prioritizeBacklogItem',
769
+ input: { backlogItemId, priority },
770
+ expected: { repository: target.repositoryPath, branch },
771
+ }),
772
+ });
773
+ }
774
+
775
+ export type BacklogAuthoringSubmission =
776
+ | { state: 'submitted'; request: BacklogAuthoringRequest }
777
+ | { state: 'blocked'; reason: BacklogAuthoringSubmissionBlock; problems: readonly string[] };
778
+
779
+ /**
780
+ * Emit exactly one typed BPAU-01 request from a confirmed form.
781
+ *
782
+ * A submission already in flight is refused as a duplicate before anything else
783
+ * is considered, so a second confirmation never produces a second request. There
784
+ * is no retry here: a blocked submission reports why and stops.
785
+ */
786
+ export function submitBacklogAuthoringForm(
787
+ form: BacklogAuthoringFormView,
788
+ options: { pending: boolean }
789
+ ): BacklogAuthoringSubmission {
790
+ if (options.pending) {
791
+ return {
792
+ state: 'blocked',
793
+ reason: 'duplicate-submission',
794
+ problems: [
795
+ 'A backlog authoring submission is already in progress. BB waits for Poetic rather than sending it twice.',
796
+ ],
797
+ };
798
+ }
799
+ if (form.request !== null) return { state: 'submitted', request: form.request };
800
+ const reason: BacklogAuthoringSubmissionBlock = form.blockReason ?? 'incomplete-input';
801
+ const problems =
802
+ reason === 'acknowledgement-incomplete'
803
+ ? (form.confirmation?.outstanding ?? [])
804
+ : form.missing.length > 0
805
+ ? form.missing
806
+ : form.notes;
807
+ return { state: 'blocked', reason, problems };
808
+ }
809
+
810
+ /** Poetic's own completeness result for a created item, carried through as-is. */
811
+ export interface BacklogCompletenessView {
812
+ complete: boolean;
813
+ missing: readonly string[];
814
+ /** Poetic's refine follow-up; null when Poetic published none. */
815
+ refineCommand: string | null;
816
+ }
817
+
818
+ /**
819
+ * Outcome states. They stay distinct so refusal before launch, a refused command,
820
+ * a partial effect, and an unknown result after a timeout never read alike.
821
+ */
822
+ export type BacklogAuthoringOutcomeState =
823
+ | 'refused'
824
+ | 'applied'
825
+ | 'applied-incomplete'
826
+ | 'refused-before-effect'
827
+ | 'partial-effect'
828
+ | 'unknown-after-timeout';
829
+
830
+ export interface BacklogAuthoringOutcomeView {
831
+ viewVersion: typeof BACKLOG_AUTHORING_VIEW_VERSION;
832
+ state: BacklogAuthoringOutcomeState;
833
+ /** One bounded plain-language summary line. */
834
+ headline: string;
835
+ /**
836
+ * `fresh` only when Poetic's authoritative reread is available. Until then no
837
+ * changed fact is displayed, and nothing BB submitted is echoed as a result.
838
+ */
839
+ facts: 'fresh' | 'awaiting-reread';
840
+ rows: readonly BacklogAuthoringRow[];
841
+ /** Poetic's completeness result for a creation; null for other actions. */
842
+ completeness: BacklogCompletenessView | null;
843
+ syncWarnings: readonly string[];
844
+ /** Poetic's own command diagnostics, kept separate from sync evidence. */
845
+ diagnostics: string | null;
846
+ notes: readonly string[];
847
+ degraded: boolean;
848
+ }
849
+
850
+ const REFUSAL_HEADLINES: Readonly<
851
+ Record<Extract<BacklogAuthoringResult, { state: 'refused' }>['reason'], string>
852
+ > = {
853
+ 'invalid-request': 'Refused before launch: the request was invalid',
854
+ 'repository-mismatch': 'Refused before launch: the request named another repository',
855
+ 'repository-not-ready': 'Refused before launch: the repository is not ready',
856
+ 'stale-repository': 'Refused before launch: the repository or branch changed',
857
+ 'missing-identity': 'Refused before launch: Poetic could not confirm the backlog item',
858
+ 'canonical-prepopulation-mismatch':
859
+ 'Refused before launch: the canonical body changed after prepopulation',
860
+ 'duplicate-submission': 'Refused before launch: a submission is already in progress',
861
+ };
862
+
863
+ function outcomeState(outcome: BacklogAuthoringOutcome): BacklogAuthoringOutcomeState {
864
+ switch (outcome.effect.phase) {
865
+ case 'applied':
866
+ return 'applied';
867
+ case 'applied-incomplete':
868
+ return 'applied-incomplete';
869
+ case 'refused-before-launch':
870
+ case 'refused-before-effect':
871
+ return 'refused-before-effect';
872
+ case 'failed-after-partial-effect':
873
+ return 'partial-effect';
874
+ case 'unknown-after-timeout':
875
+ return 'unknown-after-timeout';
876
+ }
877
+ }
878
+
879
+ function outcomeHeadline(
880
+ outcome: BacklogAuthoringOutcome,
881
+ state: BacklogAuthoringOutcomeState
882
+ ): string {
883
+ const label = BACKLOG_AUTHORING_LABELS[outcome.action];
884
+ switch (state) {
885
+ case 'applied':
886
+ return `${label}: Poetic applied the change`;
887
+ case 'applied-incomplete':
888
+ return `${label}: Poetic created the item and reported it incomplete`;
889
+ case 'refused-before-effect':
890
+ return `${label}: Poetic refused the command; nothing was changed`;
891
+ case 'partial-effect':
892
+ return `${label}: Poetic failed after a partial effect`;
893
+ default:
894
+ return `${label}: the command timed out, so its effect is unknown`;
895
+ }
896
+ }
897
+
898
+ function changedFactRows(detail: BacklogEvidence<BacklogDetailEvidence>): BacklogAuthoringRow[] {
899
+ if (detail.state === 'unavailable') return [];
900
+ const value = detail.value;
901
+ return [
902
+ row('reread-id', 'Backlog id (reread)', value.id),
903
+ row('reread-title', 'Title (reread)', value.title),
904
+ row('reread-status', 'Status (reread)', value.status),
905
+ row('reread-priority', 'Priority (reread)', value.priority ?? UNAVAILABLE),
906
+ row(
907
+ 'reread-complexity',
908
+ 'Complexity (reread)',
909
+ value.complexity === null ? UNAVAILABLE : String(value.complexity)
910
+ ),
911
+ row('reread-path', 'File (reread)', value.filePath),
912
+ ];
913
+ }
914
+
915
+ function formatList(values: readonly string[]): string {
916
+ return values.length === 0 ? 'none' : values.join(', ');
917
+ }
918
+
919
+ /**
920
+ * Render one BPAU-01 result. Pure and deterministic: every field comes from the
921
+ * result itself, and no state, identity, or sync fact is re-derived here.
922
+ */
923
+ export function buildBacklogAuthoringOutcomeView(
924
+ result: BacklogAuthoringResult
925
+ ): BacklogAuthoringOutcomeView {
926
+ if ('state' in result) {
927
+ return {
928
+ viewVersion: BACKLOG_AUTHORING_VIEW_VERSION,
929
+ state: 'refused',
930
+ headline: truncateLine(REFUSAL_HEADLINES[result.reason]),
931
+ facts: 'awaiting-reread',
932
+ rows: [row('refusal-reason', 'Refusal reason', result.reason)],
933
+ completeness: null,
934
+ syncWarnings: [],
935
+ diagnostics: null,
936
+ notes: [result.message, 'No command was launched, so nothing was changed.'],
937
+ degraded: false,
938
+ };
939
+ }
940
+
941
+ const state = outcomeState(result);
942
+ const detail = result.canonicalRereads.detail;
943
+ const facts = detail.state === 'available' ? 'fresh' : 'awaiting-reread';
944
+ const rows: BacklogAuthoringRow[] = [
945
+ row('repository', 'Repository', result.repository.path),
946
+ row('branch', 'Branch', result.repository.branch ?? UNAVAILABLE),
947
+ row('action', 'Action', BACKLOG_AUTHORING_LABELS[result.action]),
948
+ row(
949
+ 'requested-item',
950
+ 'Requested backlog item',
951
+ result.requestedIdentities.backlogItemId ?? 'new item'
952
+ ),
953
+ row('created-items', 'Created', formatList(result.effect.createdIdentities)),
954
+ row('affected-items', 'Affected', formatList(result.effect.affectedIdentities)),
955
+ row('command-state', 'Command', result.command.state),
956
+ row(
957
+ 'command-exit',
958
+ 'Exit code',
959
+ result.command.exitCode === null ? UNAVAILABLE : String(result.command.exitCode)
960
+ ),
961
+ row('sync-state', 'Planning sync', result.sync.state),
962
+ row('sync-detail', 'Sync detail', result.sync.detail ?? UNAVAILABLE),
963
+ ...changedFactRows(detail),
964
+ ];
965
+
966
+ const identity = result.identityOutcome;
967
+ const completeness: BacklogCompletenessView | null =
968
+ identity === null
969
+ ? null
970
+ : {
971
+ complete: identity.complete,
972
+ missing: identity.missing,
973
+ refineCommand: identity.refineCommand,
974
+ };
975
+
976
+ const notes: string[] = [];
977
+ if (detail.state === 'unavailable') {
978
+ notes.push(
979
+ `Poetic's authoritative reread is unavailable (${detail.reason}), so no changed backlog fact is shown here.`
980
+ );
981
+ }
982
+ if (state === 'unknown-after-timeout') {
983
+ notes.push(
984
+ 'The command timed out and was not retried. Poetic may or may not have applied it; reread before acting.'
985
+ );
986
+ }
987
+ if (state === 'partial-effect') {
988
+ notes.push(
989
+ 'Poetic reports a partial effect: part of this change may exist. Inspect the item in Poetic before resubmitting.'
990
+ );
991
+ }
992
+ if (completeness !== null && !completeness.complete) {
993
+ notes.push(
994
+ completeness.refineCommand === null
995
+ ? `Poetic reports the item incomplete (missing: ${formatList(completeness.missing)}) and published no refine command.`
996
+ : `Poetic reports the item incomplete (missing: ${formatList(completeness.missing)}). Finish it with: ${completeness.refineCommand}`
997
+ );
998
+ }
999
+ if (result.fullBodyReplacement) {
1000
+ notes.push('This update replaced the entire body of the backlog item.');
1001
+ }
1002
+ if (result.prioritizeMayReviewAndBecomeLaunchEligible) {
1003
+ notes.push(BACKLOG_PRIORITIZE_LAUNCH_ELIGIBILITY_NOTICE);
1004
+ }
1005
+ notes.push(...result.integrityNotes);
1006
+ notes.push(
1007
+ 'A zero exit code is not remote sync confirmation; the planning sync state above comes from Poetic.'
1008
+ );
1009
+
1010
+ return {
1011
+ viewVersion: BACKLOG_AUTHORING_VIEW_VERSION,
1012
+ state,
1013
+ headline: truncateLine(outcomeHeadline(result, state)),
1014
+ facts,
1015
+ rows,
1016
+ completeness,
1017
+ syncWarnings: result.syncWarnings,
1018
+ diagnostics: result.command.diagnostics,
1019
+ notes,
1020
+ degraded:
1021
+ facts === 'awaiting-reread' ||
1022
+ state !== 'applied' ||
1023
+ result.syncWarnings.length > 0 ||
1024
+ result.integrityNotes.length > 0,
1025
+ };
1026
+ }