@ebrindley/build 0.0.0-stage → 1.42.1-rc28
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.
- package/.build-project/providers/catalog.json +13951 -0
- package/.build-project/providers/pricing.json +1978 -0
- package/.build-project/providers/registry.json +4103 -0
- package/.github/SECURITY.md +75 -0
- package/.nvmrc +1 -0
- package/CHANGELOG.md +661 -0
- package/CODE_OF_CONDUCT.md +44 -0
- package/CONTRIBUTING.md +24 -0
- package/INSTALL.md +623 -0
- package/LICENSE +21 -0
- package/README.md +118 -2
- package/THIRD_PARTY_NOTICES.txt +26 -0
- package/dist/ai-judge-UE5UOYOO.js +191 -0
- package/dist/allowlist-grounding-KPLN6NC5.js +16 -0
- package/dist/allowlist-utils-MZZKKXRD.js +31 -0
- package/dist/apply-completion-mode-EM37UZHB.js +110 -0
- package/dist/artifact-migrator-WPACNSEP.js +276 -0
- package/dist/ask-2OZ4JFQR.js +176 -0
- package/dist/auth-6UKBTJUQ.js +185 -0
- package/dist/auth-H5KJL6HL.js +165 -0
- package/dist/auth-LVJRJDMU.js +12 -0
- package/dist/auth-NHZOCNRR.js +94 -0
- package/dist/auth-PBXHWXGW.js +95 -0
- package/dist/auth-T7Y5DCAH.js +91 -0
- package/dist/auth-TVVKCHQW.js +13 -0
- package/dist/auth-UHB2UCSS.js +97 -0
- package/dist/auth-VACA3VUL.js +98 -0
- package/dist/auth-VVLC77S3.js +44 -0
- package/dist/auth-liveness-XO4AGDDD.js +53 -0
- package/dist/autoloop-cleanup-SI3VGAAR.js +106 -0
- package/dist/autoloop-evidence-gates-J5GG5YQB.js +39 -0
- package/dist/autoloop-gate-policy-SUNAEP6Q.js +169 -0
- package/dist/autoloop-helpers-VQGQNTT6.js +52 -0
- package/dist/autoloop-ledger-P6TIDP7C.js +96 -0
- package/dist/autoloop-ledger-subscriber-HFAGOZXH.js +161 -0
- package/dist/autoloop-run-defaults-GWGZBNT7.js +27 -0
- package/dist/autoloop-run-lock-GBWRM5A2.js +197 -0
- package/dist/autoloop-success-C32QVWOP.js +93 -0
- package/dist/autoloop-termination-summary-GI6IBQWD.js +58 -0
- package/dist/autoloop-trajectory-AMKSQISD.js +70 -0
- package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
- package/dist/automatic-branch-cleanup-R62X2C5O.js +49 -0
- package/dist/autonomous-loop-controller-2WL363LW.js +4386 -0
- package/dist/backend-YUTFDZXZ.js +30 -0
- package/dist/background-executor-Z3ODTMD7.js +260 -0
- package/dist/backlog-75QPEAMW.js +403 -0
- package/dist/backlog-execution-intent-GWUV5TUK.js +19 -0
- package/dist/backup-active-store-XHWLN34M.js +16 -0
- package/dist/backup-machine-stores-UI4LTJOY.js +251 -0
- package/dist/backup-telemetry-db-Z4ICYCNW.js +26 -0
- package/dist/branch-archive-manager-FMSQ7YJF.js +18 -0
- package/dist/branch-cleanup-manager-ST6FJGND.js +35 -0
- package/dist/build-gate-7NKWPY62.js +68 -0
- package/dist/build-root-S7DINODY.js +18 -0
- package/dist/change-summary-R6CB6VXJ.js +50 -0
- package/dist/chunk-24MNKKOM.js +173 -0
- package/dist/chunk-2H6VZFIO.js +235 -0
- package/dist/chunk-2JIX3EKV.js +39 -0
- package/dist/chunk-2KO7HVZM.js +106 -0
- package/dist/chunk-2L36U25O.js +100 -0
- package/dist/chunk-2NMNFUQA.js +475 -0
- package/dist/chunk-2OUAEH67.js +83 -0
- package/dist/chunk-2VLJUXJU.js +115 -0
- package/dist/chunk-2VUEDIUM.js +77 -0
- package/dist/chunk-2Y2IIHPI.js +430 -0
- package/dist/chunk-2YRG3LHZ.js +220 -0
- package/dist/chunk-2Z5Q3SUY.js +65 -0
- package/dist/chunk-32IYXIE5.js +873 -0
- package/dist/chunk-33IGPPUI.js +292 -0
- package/dist/chunk-352PCJLK.js +283 -0
- package/dist/chunk-35J4NE6S.js +226 -0
- package/dist/chunk-3C7WBIVK.js +1016 -0
- package/dist/chunk-3H3EY6U7.js +1225 -0
- package/dist/chunk-3H4MWYIC.js +198 -0
- package/dist/chunk-3HHWQR3N.js +2479 -0
- package/dist/chunk-3JKNRYEE.js +14 -0
- package/dist/chunk-3LECCYZY.js +128 -0
- package/dist/chunk-3LOY6YZI.js +852 -0
- package/dist/chunk-3M57DADF.js +44 -0
- package/dist/chunk-3NOTLVLG.js +3803 -0
- package/dist/chunk-3OPP2OZB.js +1480 -0
- package/dist/chunk-3P5IN5E7.js +9 -0
- package/dist/chunk-3PL22IYZ.js +20 -0
- package/dist/chunk-3REDAJUJ.js +14 -0
- package/dist/chunk-3S2R4XJI.js +203 -0
- package/dist/chunk-3UBZI5DW.js +61 -0
- package/dist/chunk-3VV5OBGG.js +308 -0
- package/dist/chunk-3WY5TU2O.js +823 -0
- package/dist/chunk-43OKHTW4.js +82 -0
- package/dist/chunk-45KUJBDI.js +112 -0
- package/dist/chunk-47X5LM7B.js +224 -0
- package/dist/chunk-4B6FQJ77.js +268 -0
- package/dist/chunk-4BTDUT2S.js +42 -0
- package/dist/chunk-4DJL2VXA.js +24 -0
- package/dist/chunk-4EBSXZ73.js +48 -0
- package/dist/chunk-4QKP6I4C.js +294 -0
- package/dist/chunk-4U6XK2DG.js +300 -0
- package/dist/chunk-4UMRUFBD.js +132 -0
- package/dist/chunk-4US4SYJ4.js +569 -0
- package/dist/chunk-4ZPLWEZO.js +154 -0
- package/dist/chunk-56WPYDJH.js +624 -0
- package/dist/chunk-57WRCJJW.js +50 -0
- package/dist/chunk-5AW4RMNG.js +24 -0
- package/dist/chunk-5EQN56OZ.js +155 -0
- package/dist/chunk-5F43TUIN.js +38 -0
- package/dist/chunk-5FKHIKTS.js +115 -0
- package/dist/chunk-5HDP7XZG.js +91 -0
- package/dist/chunk-5KQETTNS.js +152 -0
- package/dist/chunk-5PDVN2KO.js +498 -0
- package/dist/chunk-5UBIFVRD.js +509 -0
- package/dist/chunk-5YDE3Q62.js +46 -0
- package/dist/chunk-626AJVMU.js +302 -0
- package/dist/chunk-633XZ7UF.js +3583 -0
- package/dist/chunk-63DHNHGA.js +236 -0
- package/dist/chunk-666656AR.js +568 -0
- package/dist/chunk-67YRJPJO.js +19 -0
- package/dist/chunk-6CAU7VBA.js +20 -0
- package/dist/chunk-6CB3KJRY.js +21 -0
- package/dist/chunk-6DBMALXL.js +29 -0
- package/dist/chunk-6E25C4IA.js +269 -0
- package/dist/chunk-6FIBNIQU.js +73 -0
- package/dist/chunk-6G57FYBV.js +189 -0
- package/dist/chunk-6KZKRTG3.js +4885 -0
- package/dist/chunk-6LAH2UV2.js +525 -0
- package/dist/chunk-6PZY2TTU.js +921 -0
- package/dist/chunk-6T6NHXK4.js +230 -0
- package/dist/chunk-6TBEX4R4.js +432 -0
- package/dist/chunk-6TRD7TEE.js +911 -0
- package/dist/chunk-6XCP2RAI.js +47 -0
- package/dist/chunk-726G6WDL.js +351 -0
- package/dist/chunk-75EMT7BF.js +616 -0
- package/dist/chunk-762ACDZJ.js +4696 -0
- package/dist/chunk-77I6G4CO.js +1 -0
- package/dist/chunk-7DJ6SQH3.js +510 -0
- package/dist/chunk-7HPCIOMA.js +1383 -0
- package/dist/chunk-7HYBSRPZ.js +17503 -0
- package/dist/chunk-7KBEOPVB.js +73 -0
- package/dist/chunk-7LHJDJB3.js +2222 -0
- package/dist/chunk-7NVJMH52.js +306 -0
- package/dist/chunk-7RMARDVH.js +33 -0
- package/dist/chunk-7SEWU4QG.js +36 -0
- package/dist/chunk-7TUTZTI2.js +911 -0
- package/dist/chunk-7VBDFPUM.js +340 -0
- package/dist/chunk-7VRJHTGZ.js +6406 -0
- package/dist/chunk-7YAOUUKK.js +493 -0
- package/dist/chunk-AAAODV76.js +860 -0
- package/dist/chunk-AB4HUJVQ.js +339 -0
- package/dist/chunk-AEQWV746.js +611 -0
- package/dist/chunk-AHU3FKPA.js +11639 -0
- package/dist/chunk-AISTV5XU.js +226 -0
- package/dist/chunk-AJBTKGJZ.js +48 -0
- package/dist/chunk-AJJNW7XT.js +248 -0
- package/dist/chunk-AJN5Y5YZ.js +160 -0
- package/dist/chunk-ALDTFNZ3.js +150 -0
- package/dist/chunk-ARARVIZK.js +281 -0
- package/dist/chunk-ATBM6AW5.js +53 -0
- package/dist/chunk-ATKEKM3E.js +206 -0
- package/dist/chunk-AUJLW6JZ.js +92 -0
- package/dist/chunk-AY3MHEFM.js +24 -0
- package/dist/chunk-B7PYTV72.js +236 -0
- package/dist/chunk-B7YRSULE.js +1423 -0
- package/dist/chunk-BAWJNMWF.js +339 -0
- package/dist/chunk-BBPIILO2.js +88 -0
- package/dist/chunk-BD3PGW6A.js +957 -0
- package/dist/chunk-BDPYFAB4.js +44 -0
- package/dist/chunk-BIUV23HH.js +729 -0
- package/dist/chunk-BQ3VAGXH.js +243 -0
- package/dist/chunk-BQJOGAWT.js +31 -0
- package/dist/chunk-BT7EG7CO.js +68 -0
- package/dist/chunk-BV3XQQLU.js +27 -0
- package/dist/chunk-BY6ODHNZ.js +78 -0
- package/dist/chunk-BZRLSZNV.js +79 -0
- package/dist/chunk-C3DH3NCY.js +2773 -0
- package/dist/chunk-C3KCMAJP.js +756 -0
- package/dist/chunk-C7AGUJ5K.js +267 -0
- package/dist/chunk-CBSWKQCX.js +342 -0
- package/dist/chunk-CE5OZBYY.js +21 -0
- package/dist/chunk-CFCVYHSW.js +373 -0
- package/dist/chunk-CHA2HDE5.js +126 -0
- package/dist/chunk-CIHWPGS5.js +146 -0
- package/dist/chunk-CJBSZX3F.js +127 -0
- package/dist/chunk-CLA6QIJM.js +43 -0
- package/dist/chunk-CPSVQR2I.js +365 -0
- package/dist/chunk-CRPRVNQ4.js +254 -0
- package/dist/chunk-CSIE4Y7C.js +1093 -0
- package/dist/chunk-CSOPSYDY.js +142 -0
- package/dist/chunk-CSXLLEGB.js +205 -0
- package/dist/chunk-CTDLERWU.js +293 -0
- package/dist/chunk-CULBXMSK.js +110 -0
- package/dist/chunk-D2M2Y5ID.js +21 -0
- package/dist/chunk-D37WY7SH.js +1060 -0
- package/dist/chunk-D4VJFCGZ.js +89 -0
- package/dist/chunk-D6WTZMZB.js +48 -0
- package/dist/chunk-DBHOWDUH.js +976 -0
- package/dist/chunk-DCACX7BV.js +19364 -0
- package/dist/chunk-DFHX4XYA.js +128 -0
- package/dist/chunk-DIKBRRKE.js +176 -0
- package/dist/chunk-DJG5RIOR.js +9 -0
- package/dist/chunk-DNIOIISW.js +616 -0
- package/dist/chunk-DOA5G7IA.js +315 -0
- package/dist/chunk-DP7FKP6W.js +855 -0
- package/dist/chunk-DS2JZ677.js +79 -0
- package/dist/chunk-DSRLVYBS.js +82 -0
- package/dist/chunk-EAEVKNJA.js +209 -0
- package/dist/chunk-EEUESN3T.js +575 -0
- package/dist/chunk-EJ4LUU5Y.js +73 -0
- package/dist/chunk-EJIWTPSZ.js +1063 -0
- package/dist/chunk-EJVCDTAN.js +116 -0
- package/dist/chunk-EKLUBDBQ.js +627 -0
- package/dist/chunk-EN62WLFD.js +849 -0
- package/dist/chunk-ENYRCL43.js +26 -0
- package/dist/chunk-EP22ZMFO.js +273 -0
- package/dist/chunk-EP4SVAVI.js +87 -0
- package/dist/chunk-EPAMVGI3.js +1562 -0
- package/dist/chunk-EPRMH6HO.js +24 -0
- package/dist/chunk-ES6NWJ36.js +4057 -0
- package/dist/chunk-ETA2K4KI.js +30 -0
- package/dist/chunk-ETAD4NKD.js +31 -0
- package/dist/chunk-EUWIIDQ7.js +93 -0
- package/dist/chunk-EVE3OD2W.js +141 -0
- package/dist/chunk-EXA26FFC.js +459 -0
- package/dist/chunk-EXSPAA35.js +244 -0
- package/dist/chunk-F55YABKV.js +258 -0
- package/dist/chunk-F5DNGU5W.js +27 -0
- package/dist/chunk-F622MJYV.js +103 -0
- package/dist/chunk-F6NIQD74.js +5111 -0
- package/dist/chunk-FAWJTC34.js +43 -0
- package/dist/chunk-FAZBRHGG.js +47 -0
- package/dist/chunk-FIEUSGNJ.js +39 -0
- package/dist/chunk-FKCG7K6H.js +1146 -0
- package/dist/chunk-FOVVXV45.js +229 -0
- package/dist/chunk-FRBPKBFE.js +30 -0
- package/dist/chunk-FSA5BPFI.js +268 -0
- package/dist/chunk-FSJ5TTZ3.js +29 -0
- package/dist/chunk-FT7SGLXT.js +193 -0
- package/dist/chunk-FUUVZZUB.js +62 -0
- package/dist/chunk-FYMRVUNZ.js +1697 -0
- package/dist/chunk-FYTAA5FG.js +162 -0
- package/dist/chunk-G3VB2UCZ.js +3892 -0
- package/dist/chunk-G6OIMVXH.js +405 -0
- package/dist/chunk-G7PQCXVH.js +228 -0
- package/dist/chunk-GAB6UW52.js +1087 -0
- package/dist/chunk-GAFJEYLK.js +29 -0
- package/dist/chunk-GC4CRMTS.js +642 -0
- package/dist/chunk-GFHSIWHL.js +5297 -0
- package/dist/chunk-GI5M67YA.js +735 -0
- package/dist/chunk-GIJWHUWF.js +191 -0
- package/dist/chunk-GO6DRECI.js +1 -0
- package/dist/chunk-GOFVBTMN.js +314 -0
- package/dist/chunk-GQIP72ZJ.js +13 -0
- package/dist/chunk-GQXLXRFA.js +28 -0
- package/dist/chunk-GT6HFKJB.js +48 -0
- package/dist/chunk-GVJGSSKM.js +174 -0
- package/dist/chunk-GWHGTG37.js +36 -0
- package/dist/chunk-GZAJHLKO.js +18 -0
- package/dist/chunk-GZK62I3N.js +314 -0
- package/dist/chunk-H3HGMISG.js +483 -0
- package/dist/chunk-H3ISZJMJ.js +403 -0
- package/dist/chunk-H4HXVWEC.js +9 -0
- package/dist/chunk-H6MJGKAW.js +120 -0
- package/dist/chunk-HBTTGVR5.js +353 -0
- package/dist/chunk-HBZ322WZ.js +35 -0
- package/dist/chunk-HEP3ILP4.js +34 -0
- package/dist/chunk-HGFXODKO.js +106 -0
- package/dist/chunk-HHWDTB6S.js +59 -0
- package/dist/chunk-HKO45NLZ.js +286 -0
- package/dist/chunk-HLVTEA6A.js +89 -0
- package/dist/chunk-HS3SY6HN.js +160 -0
- package/dist/chunk-HT5OCGKN.js +899 -0
- package/dist/chunk-HXIIEMGF.js +78 -0
- package/dist/chunk-I56TH7VM.js +46 -0
- package/dist/chunk-I6FN3R5D.js +352 -0
- package/dist/chunk-I7SCBHJN.js +655 -0
- package/dist/chunk-IJM4GKAT.js +529 -0
- package/dist/chunk-IMEYU36R.js +344 -0
- package/dist/chunk-INJ3SS6A.js +936 -0
- package/dist/chunk-IUKOPCCE.js +441 -0
- package/dist/chunk-IVEPZQJO.js +33 -0
- package/dist/chunk-IVZEONFC.js +43 -0
- package/dist/chunk-IWBHRSG7.js +936 -0
- package/dist/chunk-IYY3HQAD.js +484 -0
- package/dist/chunk-J2ICMYDA.js +48 -0
- package/dist/chunk-J2QCFLUN.js +505 -0
- package/dist/chunk-J5HM6V5P.js +1039 -0
- package/dist/chunk-J6NZX6QH.js +398 -0
- package/dist/chunk-JBBB2Y47.js +432 -0
- package/dist/chunk-JDCZQZU7.js +42 -0
- package/dist/chunk-JEDNXGSS.js +169 -0
- package/dist/chunk-JHP7OT6K.js +89 -0
- package/dist/chunk-JLS65NUQ.js +14 -0
- package/dist/chunk-JNMWYMC6.js +38 -0
- package/dist/chunk-JNSTWNNW.js +25 -0
- package/dist/chunk-JOSK6GEU.js +9564 -0
- package/dist/chunk-JQUMSIGC.js +100 -0
- package/dist/chunk-JVHGMURQ.js +1106 -0
- package/dist/chunk-JYXS47FQ.js +951 -0
- package/dist/chunk-K2ZMW2Z5.js +2147 -0
- package/dist/chunk-K7FAFORM.js +14 -0
- package/dist/chunk-KBJXX3ON.js +333 -0
- package/dist/chunk-KHFKVQWY.js +486 -0
- package/dist/chunk-KHMEI3DQ.js +173 -0
- package/dist/chunk-KHW3UD7B.js +69 -0
- package/dist/chunk-KKQKWAMF.js +365 -0
- package/dist/chunk-KOKXJV2U.js +455 -0
- package/dist/chunk-KQ4NGOJI.js +14 -0
- package/dist/chunk-KQYQOXMS.js +342 -0
- package/dist/chunk-KTMW65UX.js +14 -0
- package/dist/chunk-KUEWV2JH.js +593 -0
- package/dist/chunk-KXYDV3HP.js +1523 -0
- package/dist/chunk-KZ4JMGZ5.js +96 -0
- package/dist/chunk-KZWGBUIO.js +2659 -0
- package/dist/chunk-L2CBG5IX.js +1892 -0
- package/dist/chunk-L2S235CU.js +314 -0
- package/dist/chunk-L32WD57F.js +98 -0
- package/dist/chunk-LDJCKAJP.js +123 -0
- package/dist/chunk-LDWNBEN7.js +541 -0
- package/dist/chunk-LJVH57G2.js +241 -0
- package/dist/chunk-LPQ7NZEN.js +209 -0
- package/dist/chunk-LRGH3CCV.js +148 -0
- package/dist/chunk-LULOGMMM.js +1133 -0
- package/dist/chunk-LWGKN2GY.js +8284 -0
- package/dist/chunk-LX4F24ZH.js +157 -0
- package/dist/chunk-M4BUEXXF.js +839 -0
- package/dist/chunk-M6UHOC4I.js +553 -0
- package/dist/chunk-MCBNWZNO.js +657 -0
- package/dist/chunk-MEMSY6VY.js +223 -0
- package/dist/chunk-MHLEZQQI.js +145 -0
- package/dist/chunk-MJ6WNSIX.js +192 -0
- package/dist/chunk-MKASIKWZ.js +442 -0
- package/dist/chunk-MNOVBYFU.js +60 -0
- package/dist/chunk-MO2BYAAF.js +2896 -0
- package/dist/chunk-MP6P7Y2A.js +180 -0
- package/dist/chunk-MQ4TFJAG.js +3365 -0
- package/dist/chunk-MT2WAIR3.js +131 -0
- package/dist/chunk-MTU7VTNN.js +1122 -0
- package/dist/chunk-MULMXX4V.js +150 -0
- package/dist/chunk-MW2DWWVA.js +147 -0
- package/dist/chunk-MY3ZPUN4.js +151 -0
- package/dist/chunk-MYLH2S4G.js +64 -0
- package/dist/chunk-MZ5WYKNA.js +28 -0
- package/dist/chunk-N3Q2JNPV.js +249 -0
- package/dist/chunk-N5DX4JAK.js +12 -0
- package/dist/chunk-NAINGKHF.js +35 -0
- package/dist/chunk-NEQUQHOX.js +223 -0
- package/dist/chunk-NHNPEZS4.js +1408 -0
- package/dist/chunk-NHTIXJCR.js +17 -0
- package/dist/chunk-NKLPMBNV.js +1154 -0
- package/dist/chunk-NMVZ5YES.js +199 -0
- package/dist/chunk-NRFRY3GE.js +256 -0
- package/dist/chunk-NTD6CSI6.js +1266 -0
- package/dist/chunk-NUO7B3SH.js +318 -0
- package/dist/chunk-NVOHIJKG.js +1319 -0
- package/dist/chunk-NXH3RX7O.js +523 -0
- package/dist/chunk-NXZ3DURF.js +257 -0
- package/dist/chunk-O26L6F7F.js +209 -0
- package/dist/chunk-O5RRIUEP.js +124 -0
- package/dist/chunk-O5X6BKAO.js +10 -0
- package/dist/chunk-O6ZQUVTR.js +31 -0
- package/dist/chunk-O7FE75QZ.js +306 -0
- package/dist/chunk-OC7Z6AJQ.js +81 -0
- package/dist/chunk-OH7IEZ63.js +307 -0
- package/dist/chunk-OI734GRS.js +115 -0
- package/dist/chunk-OJBH62DK.js +684 -0
- package/dist/chunk-OKJLVSTJ.js +247 -0
- package/dist/chunk-OMX5VL43.js +79 -0
- package/dist/chunk-ONHAMBN6.js +12 -0
- package/dist/chunk-ONYPLIVE.js +753 -0
- package/dist/chunk-OSK7QWPD.js +637 -0
- package/dist/chunk-OTXLMJKP.js +438 -0
- package/dist/chunk-OV5PKQMA.js +213 -0
- package/dist/chunk-OXK5HA4B.js +31 -0
- package/dist/chunk-OYDWFQA4.js +272 -0
- package/dist/chunk-OZAUKWHB.js +22 -0
- package/dist/chunk-P5P2EKGH.js +94 -0
- package/dist/chunk-P6SSWAKY.js +29 -0
- package/dist/chunk-P7CQGPLS.js +30 -0
- package/dist/chunk-P7RVCHQV.js +197 -0
- package/dist/chunk-PEBWDYIW.js +726 -0
- package/dist/chunk-PFCXFO7A.js +9193 -0
- package/dist/chunk-PFLDWMX6.js +168 -0
- package/dist/chunk-PHZGLQSK.js +15883 -0
- package/dist/chunk-PNFTPNSR.js +20 -0
- package/dist/chunk-PPHXX4W7.js +175 -0
- package/dist/chunk-PPZESPJT.js +262 -0
- package/dist/chunk-PRDHI2L5.js +296 -0
- package/dist/chunk-PSTKWHHN.js +32 -0
- package/dist/chunk-PV53ODOT.js +555 -0
- package/dist/chunk-PVJBTI7P.js +24 -0
- package/dist/chunk-PXKERBKX.js +100 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-Q3DHEZA5.js +85 -0
- package/dist/chunk-Q5RZDVQK.js +204 -0
- package/dist/chunk-Q64IR2Z2.js +4933 -0
- package/dist/chunk-Q6Z5UGPL.js +398 -0
- package/dist/chunk-QAMAV4DT.js +627 -0
- package/dist/chunk-QBWF4444.js +112 -0
- package/dist/chunk-QDKYT4CI.js +22805 -0
- package/dist/chunk-QFLBRWCJ.js +126 -0
- package/dist/chunk-QILAQACE.js +107 -0
- package/dist/chunk-QJ6OEH4K.js +3683 -0
- package/dist/chunk-QK3NLYTV.js +320 -0
- package/dist/chunk-QOFLUS24.js +535 -0
- package/dist/chunk-QOIASNEJ.js +98 -0
- package/dist/chunk-QP4UTSOV.js +3587 -0
- package/dist/chunk-QP5ST7RI.js +904 -0
- package/dist/chunk-QS5AGRZN.js +167 -0
- package/dist/chunk-QTAOU53N.js +107 -0
- package/dist/chunk-QTCLJHLZ.js +351 -0
- package/dist/chunk-QTOLTG4L.js +119 -0
- package/dist/chunk-QWDV4OSL.js +142 -0
- package/dist/chunk-QWMQ74KD.js +508 -0
- package/dist/chunk-QX6LOMMH.js +158 -0
- package/dist/chunk-QXBKIHY7.js +238 -0
- package/dist/chunk-QXBKTJT6.js +270 -0
- package/dist/chunk-QYQOVOLR.js +196 -0
- package/dist/chunk-R2CKS6WT.js +73 -0
- package/dist/chunk-R2TIYG7U.js +68 -0
- package/dist/chunk-R2W3LESH.js +465 -0
- package/dist/chunk-R5EXHMUN.js +100 -0
- package/dist/chunk-RBBTBCHX.js +289 -0
- package/dist/chunk-RBKLOUXA.js +121 -0
- package/dist/chunk-RCP2Y6DQ.js +86 -0
- package/dist/chunk-RCYEJSD5.js +260 -0
- package/dist/chunk-RFDVSI4N.js +134 -0
- package/dist/chunk-RGJU63FV.js +1717 -0
- package/dist/chunk-RI4EX2QE.js +18 -0
- package/dist/chunk-RIMARPCF.js +152 -0
- package/dist/chunk-RJ6RSNT6.js +42 -0
- package/dist/chunk-RNI2GUIF.js +131 -0
- package/dist/chunk-RPHUWJ3K.js +264 -0
- package/dist/chunk-RPIMAMV7.js +361 -0
- package/dist/chunk-RQFX6YRN.js +49 -0
- package/dist/chunk-RRC5BL7B.js +285 -0
- package/dist/chunk-RSYTSBOO.js +79 -0
- package/dist/chunk-RWQQIKIC.js +35 -0
- package/dist/chunk-RZUBOZH2.js +373 -0
- package/dist/chunk-S2E632FQ.js +380 -0
- package/dist/chunk-S2VQCZO4.js +22 -0
- package/dist/chunk-S2XIMQJQ.js +681 -0
- package/dist/chunk-S47ISY27.js +183 -0
- package/dist/chunk-S6I4KISU.js +142 -0
- package/dist/chunk-S6TAFQI5.js +2403 -0
- package/dist/chunk-SBBNT5ZJ.js +27 -0
- package/dist/chunk-SDJV2DTQ.js +491 -0
- package/dist/chunk-SDPIFNLD.js +33 -0
- package/dist/chunk-SF6YK3JI.js +835 -0
- package/dist/chunk-SK3ZFONO.js +976 -0
- package/dist/chunk-SKTFRFQ7.js +1775 -0
- package/dist/chunk-SNGM452K.js +2002 -0
- package/dist/chunk-STW7OFOA.js +581 -0
- package/dist/chunk-SU6UFUQY.js +1351 -0
- package/dist/chunk-SVJM3LJA.js +27 -0
- package/dist/chunk-SVUNZOPG.js +129 -0
- package/dist/chunk-T5XLUYV3.js +34 -0
- package/dist/chunk-T7E5JS6N.js +57 -0
- package/dist/chunk-TA3N5MMO.js +450 -0
- package/dist/chunk-TAJPCXSB.js +13 -0
- package/dist/chunk-TDEMDRN2.js +1639 -0
- package/dist/chunk-TDSEX5CF.js +24 -0
- package/dist/chunk-TGCVL74Y.js +28 -0
- package/dist/chunk-TGXXYDL4.js +1012 -0
- package/dist/chunk-TIKTYUJO.js +296 -0
- package/dist/chunk-TIZAJD4M.js +6029 -0
- package/dist/chunk-TLSEZZCG.js +5549 -0
- package/dist/chunk-TMBDRHAX.js +19 -0
- package/dist/chunk-TRURQUBP.js +1217 -0
- package/dist/chunk-TSQ256N5.js +152 -0
- package/dist/chunk-TUQMMFEQ.js +2244 -0
- package/dist/chunk-U424MJLC.js +81 -0
- package/dist/chunk-U4DRS6ZW.js +11 -0
- package/dist/chunk-U5KS22IN.js +204 -0
- package/dist/chunk-UAPHFJPN.js +673 -0
- package/dist/chunk-UB7LQITD.js +1040 -0
- package/dist/chunk-UBVRHGAZ.js +237 -0
- package/dist/chunk-UDNNAQN5.js +98 -0
- package/dist/chunk-UJP3XM54.js +342 -0
- package/dist/chunk-UJYDH2MW.js +305 -0
- package/dist/chunk-UKMPASIC.js +399 -0
- package/dist/chunk-UKUL3EHK.js +763 -0
- package/dist/chunk-UPHU64NB.js +1327 -0
- package/dist/chunk-URMSZXAD.js +43 -0
- package/dist/chunk-US3RT6CY.js +525 -0
- package/dist/chunk-UTDEOPKV.js +30 -0
- package/dist/chunk-UUUDKV7N.js +13 -0
- package/dist/chunk-UVKWU3SM.js +39 -0
- package/dist/chunk-V2TVPO3X.js +521 -0
- package/dist/chunk-V3KLVK7B.js +398 -0
- package/dist/chunk-V3YFFHDR.js +17 -0
- package/dist/chunk-VAG6GUBR.js +1162 -0
- package/dist/chunk-VBENAHDA.js +1814 -0
- package/dist/chunk-VBNCKCCI.js +16 -0
- package/dist/chunk-VCGSWN5M.js +1300 -0
- package/dist/chunk-VE2O2I7M.js +115 -0
- package/dist/chunk-VIFHYTI5.js +31 -0
- package/dist/chunk-VJER3FUS.js +5080 -0
- package/dist/chunk-VLMDM56Q.js +268 -0
- package/dist/chunk-VMFZEVVX.js +99 -0
- package/dist/chunk-VNDPQVUZ.js +1853 -0
- package/dist/chunk-VSPJRLGA.js +4783 -0
- package/dist/chunk-VSWC5ZXI.js +103 -0
- package/dist/chunk-VYI4DSZP.js +2017 -0
- package/dist/chunk-W4BAIQ6L.js +1212 -0
- package/dist/chunk-W7VQAL2K.js +2203 -0
- package/dist/chunk-WEI3ZDZH.js +33 -0
- package/dist/chunk-WEIUS5NT.js +26 -0
- package/dist/chunk-WEW7UFWE.js +546 -0
- package/dist/chunk-WGQAXLNA.js +384 -0
- package/dist/chunk-WJAL4JL3.js +206 -0
- package/dist/chunk-WKFOJ5ZG.js +141 -0
- package/dist/chunk-WMWQEFLN.js +2177 -0
- package/dist/chunk-WNECKKO2.js +154 -0
- package/dist/chunk-WPKLYOAM.js +195 -0
- package/dist/chunk-WSH37YQN.js +243 -0
- package/dist/chunk-WV3KQDPE.js +84 -0
- package/dist/chunk-WZFC4V4U.js +389 -0
- package/dist/chunk-XCOIBNET.js +13 -0
- package/dist/chunk-XDM65LBX.js +53 -0
- package/dist/chunk-XGU6PBO5.js +645 -0
- package/dist/chunk-XHOI4V62.js +43 -0
- package/dist/chunk-XIBVFMLQ.js +6858 -0
- package/dist/chunk-XJ2E7YEJ.js +117 -0
- package/dist/chunk-XON4ZCYX.js +69 -0
- package/dist/chunk-XQPEWJPI.js +127 -0
- package/dist/chunk-XSJTIFUY.js +31 -0
- package/dist/chunk-XT7OVWM3.js +64 -0
- package/dist/chunk-XTXYIISX.js +1104 -0
- package/dist/chunk-XV7NZL4B.js +57 -0
- package/dist/chunk-XWIZ6B5S.js +109 -0
- package/dist/chunk-XWLIKOBX.js +240 -0
- package/dist/chunk-XZOXEIN4.js +156 -0
- package/dist/chunk-XZRS7I7W.js +3673 -0
- package/dist/chunk-Y4ZDDHB6.js +44 -0
- package/dist/chunk-Y733RB7T.js +194 -0
- package/dist/chunk-YBHUB4XR.js +14931 -0
- package/dist/chunk-YKC75XK4.js +147 -0
- package/dist/chunk-YKMXFVK7.js +27 -0
- package/dist/chunk-YO5BAJ55.js +225 -0
- package/dist/chunk-YPDCLXNZ.js +568 -0
- package/dist/chunk-YSQPGVFK.js +116 -0
- package/dist/chunk-YTVVTIWJ.js +716 -0
- package/dist/chunk-YVCMDVBB.js +698 -0
- package/dist/chunk-YYTOA6DP.js +114 -0
- package/dist/chunk-Z5WGNULV.js +88 -0
- package/dist/chunk-Z6NGVVXG.js +66 -0
- package/dist/chunk-Z7CDQNH3.js +20 -0
- package/dist/chunk-ZH4G3FU5.js +187 -0
- package/dist/chunk-ZJB6SQPA.js +257 -0
- package/dist/chunk-ZL6E4HMY.js +42 -0
- package/dist/chunk-ZMLOC3DW.js +62 -0
- package/dist/chunk-ZORW64QH.js +101 -0
- package/dist/chunk-ZVVD2XGV.js +1369 -0
- package/dist/cli-utils-ER33ODC5.js +31 -0
- package/dist/cli-validation-6CHPTANV.js +146 -0
- package/dist/commit-utils-3STAY7C7.js +49 -0
- package/dist/compatibility-notice-IHNXR2JR.js +21 -0
- package/dist/compete-config-resolver-V3GDNJMM.js +125 -0
- package/dist/compete-results-XUM3PJHS.js +318 -0
- package/dist/competition-outcome-tracker-NWSMVUPG.js +62 -0
- package/dist/config-4HHE4OIK.js +238 -0
- package/dist/config-D6YAZASH.js +10 -0
- package/dist/config-MIPRDYYV.js +46 -0
- package/dist/config-audit-GA5DCUAI.js +371 -0
- package/dist/config-explain-4LMO556H.js +71 -0
- package/dist/config-loader-RGP634PC.js +51 -0
- package/dist/config-manager-J2UTO635.js +114 -0
- package/dist/config-merger-TVUJBZTS.js +14 -0
- package/dist/config-validator-H4ZVIE56.js +122 -0
- package/dist/cost-HSIV5U2Y.js +85 -0
- package/dist/data-migration-state-OAUL2WPQ.js +35 -0
- package/dist/db-migrator-NUOW5NKR.js +34 -0
- package/dist/default-paths-UILB62BN.js +49 -0
- package/dist/discovery-V6GYUJUC.js +53 -0
- package/dist/doctor-BBSMCDWE.js +271 -0
- package/dist/doctor-context-blocks-LPY75VZA.js +231 -0
- package/dist/doctor-instructions-import-JXHDDOE5.js +70 -0
- package/dist/doctor-purpose-6YJOXPBE.js +30 -0
- package/dist/domain-analyzer-S35ABUNA.js +48 -0
- package/dist/ensure-initialized-Q6PEU55O.js +78 -0
- package/dist/entry.js +922 -0
- package/dist/error-parser-core-MZFMFANN.js +70 -0
- package/dist/evaluation-context-GQBYDAEV.js +63 -0
- package/dist/evidence-plan-resolver-5FUAP3SA.js +111 -0
- package/dist/execution-data-writer-YCG5UH37.js +72 -0
- package/dist/execution-policy-applier-PWZM5LNA.js +63 -0
- package/dist/execution-preflight-DASJWWQF.js +223 -0
- package/dist/execution-roles-KNSNNB2D.js +112 -0
- package/dist/exit-code-error-QIY5DOKF.js +18 -0
- package/dist/external-temp-cleanup-CAW7LQ6R.js +360 -0
- package/dist/factory-YCYCB7AE.js +209 -0
- package/dist/file-utils-ZQYNBQBW.js +45 -0
- package/dist/flywheel-allowlist-revert-H22HA6JE.js +21 -0
- package/dist/flywheel-autoloop-executor-PDOASJEZ.js +316 -0
- package/dist/flywheel-autoloop-unverified-TOKYFCDC.js +36 -0
- package/dist/flywheel-competition-executor-YJUMMEJO.js +320 -0
- package/dist/flywheel-executor-JWU43KAY.js +437 -0
- package/dist/flywheel-git-isolation-FQ2TRWMB.js +56 -0
- package/dist/flywheel-manifest-HDPNMWWF.js +114 -0
- package/dist/flywheel-model-defaults-UHAKTZT3.js +110 -0
- package/dist/flywheel-preflight-III2C7TH.js +163 -0
- package/dist/flywheel-resume-2O45MS7Y.js +31 -0
- package/dist/flywheel-resume-execution-lease-P2BK257J.js +59 -0
- package/dist/flywheel-safety-AVAVFXIJ.js +19 -0
- package/dist/flywheel-scope-decision-ALJUUNGG.js +14 -0
- package/dist/get-telemetry-logger-MPDVO2JA.js +155 -0
- package/dist/git-message-style-KCXGMTDT.js +104 -0
- package/dist/guidance-profile-config-G3K5YQOO.js +113 -0
- package/dist/guidance-profile-renderer-TX4TNDFL.js +23 -0
- package/dist/identity-XLQJ4YJF.js +25 -0
- package/dist/index-query-6NUY4FKX.js +37 -0
- package/dist/index.js +85588 -0
- package/dist/indexer-DL54CM3K.js +44 -0
- package/dist/init-OUZ72344.js +245 -0
- package/dist/instructions-import-offer-NSYXSITC.js +363 -0
- package/dist/instructions-run-NBII7W36.js +114 -0
- package/dist/interrupted-work-E4TLKJLE.js +43 -0
- package/dist/invoke-provider-auth-NEWEIHCI.js +38 -0
- package/dist/judge-scoring.json +64 -0
- package/dist/lab-mode-YXQ2Y3NG.js +44 -0
- package/dist/lab-utils-5QAMDJR5.js +29 -0
- package/dist/linux-host-class-YDWQX65O.js +31 -0
- package/dist/llm-judge-executor-OJSNCTFJ.js +179 -0
- package/dist/local-ci-config-VZ4WWDT5.js +48 -0
- package/dist/local-executor-DCMDDRX2.js +280 -0
- package/dist/logger-5KNKS3O4.js +154 -0
- package/dist/matrix-prompt-builder-4ZBOGZSB.js +527 -0
- package/dist/matrix-result-parser-EZJM4YXP.js +14 -0
- package/dist/merge-batch-RTEEMVDB.js +313 -0
- package/dist/merge-batch-members-VIWGVRHP.js +24 -0
- package/dist/merge-queue-TIIUSOY6.js +126 -0
- package/dist/merge-queue-trust-DUNZ4J65.js +21 -0
- package/dist/metadata-UKSMWM6J.js +29 -0
- package/dist/model-catalog-readiness-R5KJBP5M.js +202 -0
- package/dist/model-invocations-db-XTUPPQ34.js +70 -0
- package/dist/model-resolver-JFZ2MHOJ.js +39 -0
- package/dist/model-resolver-SCQ57KAQ.js +217 -0
- package/dist/model-roles-D3OR4NAH.js +110 -0
- package/dist/monitor-F4SIU5G2.js +96 -0
- package/dist/nested-worktrees-2WUWQ75N.js +23 -0
- package/dist/next-S3IRLVER.js +96 -0
- package/dist/next-UKPFRXOO.js +148 -0
- package/dist/opportunistic-TL4S26VX.js +86 -0
- package/dist/optimization-config-resolver-NAEIYU6A.js +148 -0
- package/dist/package-HJR4QJT4.js +10 -0
- package/dist/parse-git-status-7PIYFPS2.js +21 -0
- package/dist/path-security-5WJSY56G.js +41 -0
- package/dist/paths-JUI7C4KU.js +45 -0
- package/dist/plan-backlog-list-fast-SSTQL5XP.js +89 -0
- package/dist/plan-backlog-show-fast-PFRAQ3JB.js +114 -0
- package/dist/plan-sprint-list-fast-HD2KBZSY.js +110 -0
- package/dist/plan-sprint-status-fast-YFYH7WQF.js +116 -0
- package/dist/plan-task-status-fast-JU5PNLUU.js +114 -0
- package/dist/plan-to-flywheel-PY5MSY2H.js +529 -0
- package/dist/preflight-PJHGTJNZ.js +12 -0
- package/dist/process-registry-B4ZUCN7T.js +28 -0
- package/dist/process-scanner-TU3QHWVB.js +23 -0
- package/dist/processes-6FHVGT72.js +28 -0
- package/dist/processes-json-fast-YWTMUWXB.js +72 -0
- package/dist/profile-HWTC56SG.js +209 -0
- package/dist/project-runtime-paths-2UQNG5Y4.js +41 -0
- package/dist/protected-branches-N36LDBFY.js +71 -0
- package/dist/provider-aware-resource-manager-YTFAHNGJ.js +40 -0
- package/dist/provider-matrix-2KO2V5OM.js +214 -0
- package/dist/provider-matrix-renderer-MEC3PER7.js +139 -0
- package/dist/provider-output-forwarding-2AHL7YMA.js +26 -0
- package/dist/provider-registry-WCZ65QHC.js +136 -0
- package/dist/provider-temp-cleanup-IUNPJCZF.js +14 -0
- package/dist/prune-engine-EOQVWEP6.js +448 -0
- package/dist/publication-turn-S42RZTQF.js +44 -0
- package/dist/quality-gate-JQMVCKOO.js +72 -0
- package/dist/quickstart-3O6FRCFB.js +105 -0
- package/dist/readiness-GW6ABRHB.js +139 -0
- package/dist/readiness-KFZCXDTT.js +215 -0
- package/dist/registry-7XG376SY.js +217 -0
- package/dist/repair-helpers-TTV5FEF4.js +117 -0
- package/dist/repo-root-YG6MQZDW.js +28 -0
- package/dist/resolution-engine-FFEK7HQ2.js +187 -0
- package/dist/resolve-provider-cli-ZEXVZKET.js +44 -0
- package/dist/restore-telemetry-db-E7BR5PO7.js +459 -0
- package/dist/routing-events-AW6SRZ6G.js +13 -0
- package/dist/routing-history-store-FMDDQL6W.js +39 -0
- package/dist/routing-planner-C6OHO3EY.js +221 -0
- package/dist/runner-KHDNQ5KU.js +1194 -0
- package/dist/runner-PIS2BW7Y.js +1801 -0
- package/dist/safety-E3JJVSFL.js +67 -0
- package/dist/safety-stanza-HE6GXP4G.js +49 -0
- package/dist/sandbox-7LBZC5PE.js +72 -0
- package/dist/sandbox-ASWCDYZL.js +80 -0
- package/dist/schema-extensions.sql +234 -0
- package/dist/security-JI22TBEB.js +17 -0
- package/dist/setup-bb-plugin-FQXLA76Y.js +531 -0
- package/dist/setup-claude-code-NF4ZSHVE.js +197 -0
- package/dist/setup-temp-cleanup-2APZ4HMA.js +29 -0
- package/dist/shared-utils-34HJZ6JX.js +40 -0
- package/dist/simple-artifact-goal-MQLDDMMX.js +29 -0
- package/dist/sprint-N7JFTEGL.js +403 -0
- package/dist/sprint-bridge-KJXIBNRJ.js +117 -0
- package/dist/sprint-completion-dependents-34SR7JVL.js +43 -0
- package/dist/sprint-execution-service-A6JPUBWY.js +376 -0
- package/dist/sprint-manager-MU2ZUWN2.js +140 -0
- package/dist/sqlite-timeout-config-U2CT4LKU.js +13 -0
- package/dist/sqlite-wrapper-FSGJ2QEW.js +19 -0
- package/dist/stale-cleanup-orchestrator-4X6324VF.js +71 -0
- package/dist/storage-access-I3V5LER7.js +31 -0
- package/dist/store-XVG64ZR2.js +25 -0
- package/dist/task-classifier-MN2DYE5R.js +558 -0
- package/dist/task-list-fast-7AT6LTTA.js +112 -0
- package/dist/task-manager-LHPBBRRE.js +136 -0
- package/dist/task-report-OLPAWBTK.js +64 -0
- package/dist/task-type-detector-6RG3YNZF.js +27 -0
- package/dist/task-type-resolver-EQHOUIHT.js +64 -0
- package/dist/telemetry-5VYSK772.js +212 -0
- package/dist/telemetry-health-tracker-4GFW2EMP.js +12 -0
- package/dist/telemetry-path-resolver-H3NFHHQY.js +34 -0
- package/dist/telemetry-reliability-URJDTNPZ.js +76 -0
- package/dist/transports-NREZQTJK.js +106 -0
- package/dist/unified-cost-tracker-5MTBJ2CL.js +59 -0
- package/dist/unified-state-cleanup-GGAXLHXF.js +292 -0
- package/dist/universal-cost-calculator-JTFEJVWK.js +70 -0
- package/dist/user-agents-QLIGPLP2.js +30 -0
- package/dist/variant-execution-I4ZZUAWY.js +319 -0
- package/dist/variant-opt-parser-JHCXKY2K.js +251 -0
- package/dist/variant-request-input-PL37N3AN.js +11 -0
- package/dist/variant-state-cleanup-KHMXRBZN.js +287 -0
- package/dist/variant-worker-COB5YTJX.js +4517 -0
- package/dist/variant-worker.js +26 -0
- package/dist/variants-XGDSXYG3.js +267 -0
- package/dist/verification-command-YSPU4VBH.js +66 -0
- package/dist/verify-command-timeout-DQUYH33Z.js +11 -0
- package/dist/verify-commands-LOHMOFKC.js +65 -0
- package/dist/warning-JSKSFKBT.js +13 -0
- package/dist/work-edge-K65NHVWY.js +50 -0
- package/dist/work-item-writer-KY5ZWZWW.js +30 -0
- package/dist/worker-JNXXEIT6.js +1504 -0
- package/dist/worker.js +21 -0
- package/dist/workspace-tree-identity-JO5PSKTW.js +52 -0
- package/dist/worktree-environment-WTVABAQW.js +64 -0
- package/dist/worktree-metrics-VZRQI26T.js +66 -0
- package/dist/writeback-TQFQBJNU.js +50 -0
- package/docs/CLI_REFERENCE.md +8287 -0
- package/docs/PROVIDER_SETUP.md +1737 -0
- package/docs/README.md +96 -0
- package/docs/TROUBLESHOOTING.md +2209 -0
- package/docs/getting-started/QUICK_START.md +260 -0
- package/docs/getting-started/README.md +198 -0
- package/docs/getting-started/SETUP.md +25 -0
- package/docs/reference/AGENT_CONTEXT.md +84 -0
- package/docs/reference/DELIVERY_ONBOARDING.md +198 -0
- package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
- package/docs/reference/SECURITY.md +291 -0
- package/docs/reference/TELEMETRY_PRIVACY.md +259 -0
- package/integrations/bb-plugin-build/README.md +391 -0
- package/integrations/bb-plugin-build/app.css +431 -0
- package/integrations/bb-plugin-build/app.tsx +6210 -0
- package/integrations/bb-plugin-build/package.json +45 -0
- package/integrations/bb-plugin-build/server.ts +488 -0
- package/integrations/bb-plugin-build/src/adapter.ts +3672 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-model.ts +150 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-schema.ts +458 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-service.ts +467 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-view.ts +1025 -0
- package/integrations/bb-plugin-build/src/command-evidence-schema.ts +13 -0
- package/integrations/bb-plugin-build/src/competition-defaults-schema.ts +122 -0
- package/integrations/bb-plugin-build/src/competition-defaults-service.ts +105 -0
- package/integrations/bb-plugin-build/src/competition-defaults-view.ts +138 -0
- package/integrations/bb-plugin-build/src/contract.ts +718 -0
- package/integrations/bb-plugin-build/src/execution-activity-view.ts +98 -0
- package/integrations/bb-plugin-build/src/finalize-model.ts +205 -0
- package/integrations/bb-plugin-build/src/finalize-schema.ts +150 -0
- package/integrations/bb-plugin-build/src/finalize-service.ts +330 -0
- package/integrations/bb-plugin-build/src/finalize-view.ts +159 -0
- package/integrations/bb-plugin-build/src/judge-operations-readback.ts +303 -0
- package/integrations/bb-plugin-build/src/judge-operations-schema.ts +33 -0
- package/integrations/bb-plugin-build/src/judge-operations-view.ts +459 -0
- package/integrations/bb-plugin-build/src/model.ts +1318 -0
- package/integrations/bb-plugin-build/src/monitor-service.ts +233 -0
- package/integrations/bb-plugin-build/src/panel-read-ux.ts +97 -0
- package/integrations/bb-plugin-build/src/patch-preview-schema.ts +166 -0
- package/integrations/bb-plugin-build/src/patch-preview-service.ts +480 -0
- package/integrations/bb-plugin-build/src/patch-preview-view.ts +109 -0
- package/integrations/bb-plugin-build/src/planning-readback.ts +228 -0
- package/integrations/bb-plugin-build/src/planning-service.ts +647 -0
- package/integrations/bb-plugin-build/src/planning-sync-evidence.ts +37 -0
- package/integrations/bb-plugin-build/src/planning-workspace-readback.ts +33 -0
- package/integrations/bb-plugin-build/src/planning-workspace-schema.ts +131 -0
- package/integrations/bb-plugin-build/src/planning-workspace.ts +333 -0
- package/integrations/bb-plugin-build/src/poll-handoff.ts +136 -0
- package/integrations/bb-plugin-build/src/project-target-server.ts +21 -0
- package/integrations/bb-plugin-build/src/project-target.ts +45 -0
- package/integrations/bb-plugin-build/src/reference-index.ts +218 -0
- package/integrations/bb-plugin-build/src/repository-identity.ts +17 -0
- package/integrations/bb-plugin-build/src/repository-schema.ts +30 -0
- package/integrations/bb-plugin-build/src/result-explorer-view.ts +597 -0
- package/integrations/bb-plugin-build/src/result-readback-model.ts +163 -0
- package/integrations/bb-plugin-build/src/result-readback-schema.ts +319 -0
- package/integrations/bb-plugin-build/src/result-readback-service.ts +333 -0
- package/integrations/bb-plugin-build/src/run-page-view.ts +332 -0
- package/integrations/bb-plugin-build/src/setup-config-schema.ts +293 -0
- package/integrations/bb-plugin-build/src/setup-config-service.ts +620 -0
- package/integrations/bb-plugin-build/src/setup-config-view.ts +388 -0
- package/integrations/bb-plugin-build/src/sprint-close-model.ts +150 -0
- package/integrations/bb-plugin-build/src/sprint-close-schema.ts +128 -0
- package/integrations/bb-plugin-build/src/sprint-close-service.ts +293 -0
- package/integrations/bb-plugin-build/src/sprint-close-view.ts +116 -0
- package/integrations/bb-plugin-build/src/sprint-composition-model.ts +709 -0
- package/integrations/bb-plugin-build/src/sprint-composition-readback.ts +231 -0
- package/integrations/bb-plugin-build/src/sprint-composition-schema.ts +597 -0
- package/integrations/bb-plugin-build/src/sprint-composition-service.ts +773 -0
- package/integrations/bb-plugin-build/src/sprint-composition-view.ts +1221 -0
- package/integrations/bb-plugin-build/src/sprint-execution-schema.ts +188 -0
- package/integrations/bb-plugin-build/src/sprint-execution-service.ts +289 -0
- package/integrations/bb-plugin-build/src/sprint-execution-view.ts +54 -0
- package/integrations/bb-plugin-build/src/task-authoring-model.ts +563 -0
- package/integrations/bb-plugin-build/src/task-authoring-schema.ts +629 -0
- package/integrations/bb-plugin-build/src/task-authoring-service.ts +842 -0
- package/integrations/bb-plugin-build/src/task-authoring-view.ts +1227 -0
- package/integrations/bb-plugin-build/src/task-catalog-schema.ts +46 -0
- package/integrations/bb-plugin-build/src/task-catalog-service.ts +44 -0
- package/integrations/bb-plugin-build/src/task-detail-readback.ts +56 -0
- package/integrations/bb-plugin-build/src/task-detail-schema.ts +171 -0
- package/integrations/bb-plugin-build/src/task-navigation.ts +446 -0
- package/integrations/bb-plugin-build/src/workbench-route.ts +74 -0
- package/package.json +306 -4
- package/schemas/README.md +80 -0
- package/schemas/build.config.schema.json +2110 -0
- package/schemas/config-v1.schema.json +136 -0
- package/schemas/execution-config.schema.json +47 -0
- package/schemas/judge-scoring.schema.json +257 -0
- package/schemas/provider-config.schema.json +179 -0
- package/schemas/telemetry-config.schema.json +79 -0
- package/schemas/user-preferences.schema.json +141 -0
- package/scripts/assert-node-runtime.mjs +146 -0
- package/scripts/preflight-native.mjs +49 -0
- package/scripts/setup-git-hooks.mjs +39 -0
- package/scripts/sync.sh +2871 -0
- package/scripts/write-node-launcher.sh +138 -0
- package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
- package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
- package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
- package/templates/.build-project/README.md +41 -0
- package/templates/.build-project/agents/README.md +50 -0
- package/templates/.build-project/agents/architect.md +10 -0
- package/templates/.build-project/agents/code-reviewer.md +10 -0
- package/templates/.build-project/agents/debugger.md +10 -0
- package/templates/.build-project/agents/documenter.md +10 -0
- package/templates/.build-project/agents/test-automator.md +10 -0
- package/templates/.build-project/config/build.config.jsonc +64 -0
- package/templates/.build-project/config/project-context.template.json +6 -0
- package/templates/.build-project/config/task-type-aliases.presets/kanban.yaml +14 -0
- package/templates/.build-project/config/task-type-aliases.presets/scrum.yaml +17 -0
- package/templates/.build-project/config/task-type-aliases.presets/xp.yaml +12 -0
- package/templates/.build-project/config/task-type-aliases.yaml +29 -0
- package/templates/.build-project/gitignore.template +70 -0
- package/templates/.build-project/task-types/analysis.yaml +38 -0
- package/templates/.build-project/task-types/architecture.yaml +35 -0
- package/templates/.build-project/task-types/doc.yaml +34 -0
- package/templates/.build-project/task-types/feature.yaml +22 -0
- package/templates/.build-project/task-types/general.yaml +4 -0
- package/templates/.build-project/task-types/security.yaml +38 -0
- package/templates/AGENTS.template.md +85 -0
- package/templates/CLAUDE.template.md +1 -0
- package/templates/GEMINI.template.md +1 -0
- package/templates/builtin-workflows/code-review.yaml +73 -0
- package/templates/builtin-workflows/skills/code-review/SKILL.md +61 -0
- package/templates/builtin-workflows/skills/execution-contract-analysis/SKILL.md +24 -0
- package/templates/builtin-workflows/skills/execution-contract-code/SKILL.md +19 -0
- package/templates/builtin-workflows/skills/execution-contract-structured/SKILL.md +17 -0
- package/templates/ci/incident-intake.mjs +787 -0
- package/templates/ci/incidents.yml.template +103 -0
- package/templates/ci/node.yml.template +17 -0
- package/templates/ci/python.yml.template +17 -0
- package/templates/guard-kit/GUARD_SETUP.md.template +258 -0
- package/templates/guard-kit/build-guard.yml.template +189 -0
- package/templates/guard-kit/check.mjs.template +932 -0
- package/templates/guard-kit/config.json.template +7 -0
- package/templates/guard-kit/policy.json.template +1 -0
- package/templates/profiles/README.md +57 -0
- package/templates/profiles/frontier-claude.json +23 -0
- package/templates/profiles/frontier-codex.json +23 -0
|
@@ -0,0 +1,1480 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isUnavailableVerificationFinding,
|
|
3
|
+
parseVerificationErrorsForChannel
|
|
4
|
+
} from "./chunk-PXKERBKX.js";
|
|
5
|
+
import {
|
|
6
|
+
channelsFailingIdenticallyOnBase,
|
|
7
|
+
parseFailureOutput
|
|
8
|
+
} from "./chunk-AHU3FKPA.js";
|
|
9
|
+
import {
|
|
10
|
+
IssueSet,
|
|
11
|
+
UNPARSEABLE_BUILD_SENTINEL,
|
|
12
|
+
UNPARSEABLE_LINT_SENTINEL,
|
|
13
|
+
UNPARSEABLE_TEST_SENTINEL,
|
|
14
|
+
compareVerificationStates,
|
|
15
|
+
detectEmptyRun,
|
|
16
|
+
extractStableVerificationState,
|
|
17
|
+
parseGenericPassFailOutput
|
|
18
|
+
} from "./chunk-TUQMMFEQ.js";
|
|
19
|
+
import {
|
|
20
|
+
describeVerificationCommand,
|
|
21
|
+
detectZeroCollectedTests,
|
|
22
|
+
wrapperReportsInnerMissingLaunch
|
|
23
|
+
} from "./chunk-EPAMVGI3.js";
|
|
24
|
+
import {
|
|
25
|
+
isTelemetryDebug
|
|
26
|
+
} from "./chunk-7VRJHTGZ.js";
|
|
27
|
+
|
|
28
|
+
// src/core/verification/comparison-identity.ts
|
|
29
|
+
var CHANNEL_SENTINEL = {
|
|
30
|
+
build: UNPARSEABLE_BUILD_SENTINEL,
|
|
31
|
+
lint: UNPARSEABLE_LINT_SENTINEL,
|
|
32
|
+
test: UNPARSEABLE_TEST_SENTINEL
|
|
33
|
+
};
|
|
34
|
+
function isUnparseableSentinel(code, channel) {
|
|
35
|
+
const sentinel = CHANNEL_SENTINEL[channel];
|
|
36
|
+
return code === sentinel || code.startsWith(`${sentinel}:`);
|
|
37
|
+
}
|
|
38
|
+
function setHasUnparseableSentinel(issues, channel) {
|
|
39
|
+
return issues.toArray().some((issue) => isUnparseableSentinel(issue.code, channel));
|
|
40
|
+
}
|
|
41
|
+
function channelIdentityUnavailable(delta, channel) {
|
|
42
|
+
return setHasUnparseableSentinel(delta.persistingIssues, channel) || delta.regradedImprovements !== void 0 && setHasUnparseableSentinel(delta.regradedImprovements, channel);
|
|
43
|
+
}
|
|
44
|
+
function storedComparisonUnavailableChannels(comparison) {
|
|
45
|
+
if (comparison.summary.comparisonUnavailable !== true) return [];
|
|
46
|
+
if (comparison.summary.comparisonUnavailableChannels) {
|
|
47
|
+
return [...comparison.summary.comparisonUnavailableChannels];
|
|
48
|
+
}
|
|
49
|
+
const dimensions = [
|
|
50
|
+
["build", comparison.types],
|
|
51
|
+
["lint", comparison.lint],
|
|
52
|
+
["test", comparison.tests]
|
|
53
|
+
];
|
|
54
|
+
return dimensions.filter(
|
|
55
|
+
([channel, dimension]) => [...dimension?.persistingIssues ?? [], ...dimension?.fixedIssues ?? []].some(
|
|
56
|
+
(label) => label.includes(CHANNEL_SENTINEL[channel])
|
|
57
|
+
)
|
|
58
|
+
).map(([channel]) => channel);
|
|
59
|
+
}
|
|
60
|
+
function assessComparisonIdentityAvailability(delta, contexts = {}) {
|
|
61
|
+
const channels = [];
|
|
62
|
+
for (const channel of ["build", "lint", "test"]) {
|
|
63
|
+
if (contexts[channel]?.skip === true) continue;
|
|
64
|
+
if (channelIdentityUnavailable(delta[channel], channel)) {
|
|
65
|
+
channels.push(channel);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (channels.length === 0) {
|
|
69
|
+
return { unavailable: false, channels };
|
|
70
|
+
}
|
|
71
|
+
const detail = channels.map((channel) => `${channel} (language '${contexts[channel]?.language ?? "unknown"}')`).join(", ");
|
|
72
|
+
return {
|
|
73
|
+
unavailable: true,
|
|
74
|
+
channels,
|
|
75
|
+
reason: `Issue identity could not be established for: ${detail}. Both sides failed with output no structured parser recognised, so the comparison proves neither a regression nor its absence.`
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// src/core/verification/types.ts
|
|
80
|
+
function isVerificationAccepted(status) {
|
|
81
|
+
return status === "passed" || status === "baseline_clean";
|
|
82
|
+
}
|
|
83
|
+
var VERIFICATION_OUTCOME_CONTRACT_VERSION = 1;
|
|
84
|
+
function outcomeStatus(status, exitCode) {
|
|
85
|
+
return status ?? (exitCode === 0 ? "passed" : "failed");
|
|
86
|
+
}
|
|
87
|
+
function outcomeLanguage(language) {
|
|
88
|
+
return language ?? "unknown";
|
|
89
|
+
}
|
|
90
|
+
function verificationOutcomesFromGateArtifacts(gates, options = {}) {
|
|
91
|
+
const testTotals = gates.tests ? comparableTestTotals(gates.tests) : void 0;
|
|
92
|
+
const build = {
|
|
93
|
+
channel: "build",
|
|
94
|
+
status: outcomeStatus(gates.build.status, gates.build.exitCode),
|
|
95
|
+
exitCode: gates.build.exitCode,
|
|
96
|
+
outputTail: gates.build.outputTail,
|
|
97
|
+
language: outcomeLanguage(gates.build.language),
|
|
98
|
+
parserVersion: VERIFICATION_OUTCOME_CONTRACT_VERSION,
|
|
99
|
+
command: gates.build.command,
|
|
100
|
+
commandProvenance: {
|
|
101
|
+
command: gates.build.command,
|
|
102
|
+
cwd: options.cwd,
|
|
103
|
+
source: options.source ?? "deterministic-gate"
|
|
104
|
+
},
|
|
105
|
+
stdoutTail: gates.build.stdoutTail,
|
|
106
|
+
stderrTail: gates.build.stderrTail,
|
|
107
|
+
verificationCoverage: gates.build.verificationCoverage,
|
|
108
|
+
commandResults: gates.build.commandResults
|
|
109
|
+
};
|
|
110
|
+
return {
|
|
111
|
+
build,
|
|
112
|
+
lint: gates.lint ? {
|
|
113
|
+
channel: "lint",
|
|
114
|
+
status: outcomeStatus(gates.lint.status, gates.lint.exitCode),
|
|
115
|
+
exitCode: gates.lint.exitCode,
|
|
116
|
+
outputTail: gates.lint.outputTail,
|
|
117
|
+
language: outcomeLanguage(gates.lint.language),
|
|
118
|
+
parserVersion: VERIFICATION_OUTCOME_CONTRACT_VERSION,
|
|
119
|
+
command: gates.lint.command,
|
|
120
|
+
commandProvenance: {
|
|
121
|
+
command: gates.lint.command,
|
|
122
|
+
cwd: options.cwd,
|
|
123
|
+
source: options.source ?? "deterministic-gate"
|
|
124
|
+
},
|
|
125
|
+
verificationCoverage: gates.lint.verificationCoverage,
|
|
126
|
+
commandResults: gates.lint.commandResults
|
|
127
|
+
} : void 0,
|
|
128
|
+
tests: gates.tests ? {
|
|
129
|
+
channel: "test",
|
|
130
|
+
status: outcomeStatus(gates.tests.status, gates.tests.exitCode),
|
|
131
|
+
exitCode: gates.tests.exitCode,
|
|
132
|
+
outputTail: gates.tests.outputTail,
|
|
133
|
+
language: outcomeLanguage(gates.tests.language),
|
|
134
|
+
parserVersion: VERIFICATION_OUTCOME_CONTRACT_VERSION,
|
|
135
|
+
command: gates.tests.command,
|
|
136
|
+
commandProvenance: {
|
|
137
|
+
command: gates.tests.command,
|
|
138
|
+
cwd: options.cwd,
|
|
139
|
+
source: options.source ?? "deterministic-gate"
|
|
140
|
+
},
|
|
141
|
+
failingTests: gates.tests.failingTests,
|
|
142
|
+
...gates.tests.failingTestIdentities ? { failingTestIdentities: gates.tests.failingTestIdentities } : {},
|
|
143
|
+
...testTotals ?? {},
|
|
144
|
+
verificationCoverage: gates.tests.verificationCoverage,
|
|
145
|
+
commandResults: gates.tests.commandResults
|
|
146
|
+
} : void 0
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function comparableTestTotals(tests) {
|
|
150
|
+
const evidence = tests.commandResults && tests.commandResults.length > 0 ? tests.commandResults.map((result) => ({
|
|
151
|
+
command: result.command,
|
|
152
|
+
output: result.outputTail
|
|
153
|
+
})) : [{ command: tests.command, output: tests.outputTail }];
|
|
154
|
+
let testsRun = 0;
|
|
155
|
+
let testsPassed = 0;
|
|
156
|
+
let testsSkipped = 0;
|
|
157
|
+
for (const item of evidence) {
|
|
158
|
+
const parsed = parseFailureOutput(item.command, item.output, "test");
|
|
159
|
+
if (!parsed.parsed || parsed.errorCount === null || !parsed.suiteFootprint) {
|
|
160
|
+
return void 0;
|
|
161
|
+
}
|
|
162
|
+
testsRun += parsed.suiteFootprint.executed + parsed.suiteFootprint.skipped;
|
|
163
|
+
testsPassed += Math.max(0, parsed.suiteFootprint.executed - parsed.errorCount);
|
|
164
|
+
testsSkipped += parsed.suiteFootprint.skipped;
|
|
165
|
+
}
|
|
166
|
+
return { testsRun, testsPassed, testsSkipped };
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// src/core/verification/baseline-comparison.ts
|
|
170
|
+
var VALID_VERIFICATION_LANGUAGES = /* @__PURE__ */ new Set([
|
|
171
|
+
"node",
|
|
172
|
+
"python",
|
|
173
|
+
"native",
|
|
174
|
+
"go",
|
|
175
|
+
"rust",
|
|
176
|
+
"jvm",
|
|
177
|
+
"dotnet",
|
|
178
|
+
"swift",
|
|
179
|
+
"dart",
|
|
180
|
+
"ruby",
|
|
181
|
+
"php",
|
|
182
|
+
"shell",
|
|
183
|
+
"r",
|
|
184
|
+
"sql",
|
|
185
|
+
"unknown"
|
|
186
|
+
]);
|
|
187
|
+
function languageFor(value) {
|
|
188
|
+
if (value == null || value.length === 0) return "unknown";
|
|
189
|
+
return VALID_VERIFICATION_LANGUAGES.has(value) ? value : "unknown";
|
|
190
|
+
}
|
|
191
|
+
function generateSummaryMessage(comparison) {
|
|
192
|
+
const parts = [];
|
|
193
|
+
const totalNew = comparison.tests.newFailures.length + comparison.types.newFailures.length + comparison.lint.newFailures.length;
|
|
194
|
+
const totalFixed = comparison.tests.fixedIssues.length + comparison.types.fixedIssues.length + comparison.lint.fixedIssues.length;
|
|
195
|
+
const totalPersisting = comparison.tests.persistingIssues.length + comparison.types.persistingIssues.length + comparison.lint.persistingIssues.length;
|
|
196
|
+
switch (comparison.verdict) {
|
|
197
|
+
case "pass":
|
|
198
|
+
parts.push("No verification issues");
|
|
199
|
+
break;
|
|
200
|
+
case "regression":
|
|
201
|
+
parts.push(`Introduced ${totalNew} new failure(s)`);
|
|
202
|
+
if (comparison.tests.newFailures.length > 0) {
|
|
203
|
+
parts.push(` - ${comparison.tests.newFailures.length} test failure(s)`);
|
|
204
|
+
}
|
|
205
|
+
if (comparison.types.newFailures.length > 0) {
|
|
206
|
+
parts.push(` - ${comparison.types.newFailures.length} type error(s)`);
|
|
207
|
+
}
|
|
208
|
+
if (comparison.lint.newFailures.length > 0) {
|
|
209
|
+
parts.push(` - ${comparison.lint.newFailures.length} lint error(s)`);
|
|
210
|
+
}
|
|
211
|
+
break;
|
|
212
|
+
case "improvement":
|
|
213
|
+
parts.push(`Fixed ${totalFixed} pre-existing issue(s)`);
|
|
214
|
+
break;
|
|
215
|
+
case "neutral":
|
|
216
|
+
parts.push(`No change (${totalPersisting} pre-existing issue(s) unchanged)`);
|
|
217
|
+
break;
|
|
218
|
+
case "comparison-unavailable":
|
|
219
|
+
parts.push(
|
|
220
|
+
"Baseline comparison unavailable: execution or issue identity could not be established"
|
|
221
|
+
);
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
if (totalPersisting > 0 && comparison.verdict !== "neutral" && comparison.verdict !== "comparison-unavailable") {
|
|
225
|
+
parts.push(`${totalPersisting} pre-existing issue(s) not penalized`);
|
|
226
|
+
}
|
|
227
|
+
return parts.join("\n");
|
|
228
|
+
}
|
|
229
|
+
function statusDidNotRun(status) {
|
|
230
|
+
return status === "skipped" || status === "unavailable" || status === "not_run";
|
|
231
|
+
}
|
|
232
|
+
function detectGateRegressions(baseline, currentGates, baselineState) {
|
|
233
|
+
const build = currentGates.build != null && !statusDidNotRun(currentGates.build.status) && currentGates.build.exitCode !== 0 && baseline.typeErrors.exitCode === 0 && baselineState.gates.build.availability !== "unavailable";
|
|
234
|
+
const lint = currentGates.lint != null && !statusDidNotRun(currentGates.lint.status) && currentGates.lint.exitCode !== 0 && baseline.lintErrors.exitCode === 0 && baselineState.gates.lint.availability !== "unavailable";
|
|
235
|
+
const test = currentGates.tests != null && !statusDidNotRun(currentGates.tests.status) && currentGates.tests.exitCode !== 0 && baseline.testResults.exitCode === 0 && baselineState.gates.test.availability !== "unavailable";
|
|
236
|
+
return {
|
|
237
|
+
build,
|
|
238
|
+
lint,
|
|
239
|
+
test,
|
|
240
|
+
total: Number(build) + Number(lint) + Number(test)
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
function statusFromCommandSummaryExitCode(exitCode) {
|
|
244
|
+
if (exitCode === 0) return "passed";
|
|
245
|
+
if (exitCode === 124) return "timeout";
|
|
246
|
+
return "failed";
|
|
247
|
+
}
|
|
248
|
+
function commandResultsFromSummaries(commands) {
|
|
249
|
+
if (!commands || commands.length === 0) return void 0;
|
|
250
|
+
return commands.map((command) => ({
|
|
251
|
+
command: command.command,
|
|
252
|
+
language: languageFor(command.language),
|
|
253
|
+
status: command.status ?? statusFromCommandSummaryExitCode(command.exitCode),
|
|
254
|
+
exitCode: command.exitCode,
|
|
255
|
+
outputTail: command.outputTail,
|
|
256
|
+
parsed: command.parsed,
|
|
257
|
+
failingTests: command.failedTests
|
|
258
|
+
}));
|
|
259
|
+
}
|
|
260
|
+
function matchedExecutedCommandIssues(channel, baselineCommands, currentCommands) {
|
|
261
|
+
const key = (command) => `${command.language}\0${command.command}`;
|
|
262
|
+
const baselineByCommand = new Map(
|
|
263
|
+
(commandResultsFromSummaries(baselineCommands) ?? []).filter((command) => command.command.trim() && !statusDidNotRun(command.status)).map((command) => [key(command), command])
|
|
264
|
+
);
|
|
265
|
+
const current = (currentCommands ?? []).filter(
|
|
266
|
+
(command) => !statusDidNotRun(command.status) && baselineByCommand.has(key(command))
|
|
267
|
+
);
|
|
268
|
+
const baseline = current.map((command) => baselineByCommand.get(key(command)));
|
|
269
|
+
const issues = (commands) => {
|
|
270
|
+
const representative = commands.find((command) => command.exitCode !== 0) ?? commands[0];
|
|
271
|
+
if (!representative) return new IssueSet();
|
|
272
|
+
const gate = {
|
|
273
|
+
...representative,
|
|
274
|
+
failingTests: representative.failingTestIdentities ?? representative.failingTests ?? [],
|
|
275
|
+
commandResults: commands
|
|
276
|
+
};
|
|
277
|
+
const state = extractStableVerificationState({
|
|
278
|
+
[channel === "test" ? "tests" : channel]: gate
|
|
279
|
+
});
|
|
280
|
+
return channel === "build" ? state.buildIssues : channel === "lint" ? state.lintIssues : state.testIssues;
|
|
281
|
+
};
|
|
282
|
+
return [issues(baseline), issues(current)];
|
|
283
|
+
}
|
|
284
|
+
function baselineToStableState(baseline) {
|
|
285
|
+
const buildCommands = baseline.summary?.gates.build.commands;
|
|
286
|
+
const lintCommands = baseline.summary?.gates.lint.commands;
|
|
287
|
+
const testCommands = baseline.summary?.gates.test.commands;
|
|
288
|
+
const multiBuild = buildCommands && buildCommands.length > 1;
|
|
289
|
+
const multiLint = lintCommands && lintCommands.length > 1;
|
|
290
|
+
const multiTest = testCommands && testCommands.length > 1;
|
|
291
|
+
const singleBuild = buildCommands && buildCommands.length === 1 ? buildCommands[0] : void 0;
|
|
292
|
+
const singleLint = lintCommands && lintCommands.length === 1 ? lintCommands[0] : void 0;
|
|
293
|
+
const singleTest = testCommands && testCommands.length === 1 ? testCommands[0] : void 0;
|
|
294
|
+
const state = extractStableVerificationState({
|
|
295
|
+
build: {
|
|
296
|
+
status: baseline.summary?.gates.build.availability === "unavailable" ? "unavailable" : baseline.summary?.gates.build.availability === "out_of_scope" ? "skipped" : singleBuild?.status,
|
|
297
|
+
exitCode: multiBuild ? buildCommands.some((c) => c.exitCode !== 0) ? 1 : 0 : singleBuild?.exitCode ?? baseline.typeErrors.exitCode,
|
|
298
|
+
outputTail: multiBuild ? "" : singleBuild?.outputTail ?? baseline.typeErrors.outputTail,
|
|
299
|
+
language: languageFor(
|
|
300
|
+
multiBuild ? baseline.summary?.gates.build.language : singleBuild?.language ?? baseline.summary?.gates.build.language
|
|
301
|
+
),
|
|
302
|
+
commandResults: multiBuild ? commandResultsFromSummaries(buildCommands) : void 0
|
|
303
|
+
},
|
|
304
|
+
lint: {
|
|
305
|
+
status: baseline.summary?.gates.lint.availability === "unavailable" ? "unavailable" : baseline.summary?.gates.lint.availability === "out_of_scope" ? "skipped" : singleLint?.status,
|
|
306
|
+
exitCode: multiLint ? lintCommands.some((c) => c.exitCode !== 0) ? 1 : 0 : singleLint?.exitCode ?? baseline.lintErrors.exitCode,
|
|
307
|
+
outputTail: multiLint ? "" : singleLint?.outputTail ?? baseline.lintErrors.outputTail,
|
|
308
|
+
language: languageFor(
|
|
309
|
+
multiLint ? baseline.summary?.gates.lint.language : singleLint?.language ?? baseline.summary?.gates.lint.language
|
|
310
|
+
),
|
|
311
|
+
commandResults: multiLint ? commandResultsFromSummaries(lintCommands) : void 0
|
|
312
|
+
},
|
|
313
|
+
tests: {
|
|
314
|
+
status: baseline.summary?.gates.test.availability === "unavailable" ? "unavailable" : baseline.summary?.gates.test.availability === "out_of_scope" ? "skipped" : singleTest?.status,
|
|
315
|
+
exitCode: multiTest ? testCommands.some((c) => c.exitCode !== 0) ? 1 : 0 : singleTest?.exitCode ?? baseline.testResults.exitCode,
|
|
316
|
+
outputTail: multiTest ? "" : singleTest?.outputTail ?? baseline.testResults.outputTail,
|
|
317
|
+
language: languageFor(
|
|
318
|
+
multiTest ? baseline.summary?.gates.test.language : singleTest?.language ?? baseline.summary?.gates.test.language
|
|
319
|
+
),
|
|
320
|
+
failingTests: multiTest ? Array.from(new Set(testCommands.flatMap((c) => c.failedTests ?? []))) : singleTest?.failedTests ?? baseline.testResults.failedTests,
|
|
321
|
+
commandResults: multiTest ? commandResultsFromSummaries(testCommands) : void 0
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
if (!multiBuild && !multiLint && !multiTest && !singleBuild && !singleLint && !singleTest) {
|
|
325
|
+
const buildFailed = baseline.typeErrors.exitCode !== 0 && !state.gates.build.unavailable && state.gates.build.availability !== "out_of_scope";
|
|
326
|
+
const lintFailed = baseline.lintErrors.exitCode !== 0 && !state.gates.lint.unavailable && state.gates.lint.availability !== "out_of_scope";
|
|
327
|
+
const testFailed = baseline.testResults.exitCode !== 0 && !state.gates.test.unavailable && state.gates.test.availability !== "out_of_scope";
|
|
328
|
+
const buildIssues = parseVerificationErrorsForChannel(
|
|
329
|
+
"build",
|
|
330
|
+
languageFor(baseline.summary?.gates.build.language),
|
|
331
|
+
state.gates.build.availability === "executed" ? baseline.typeErrors.outputTail : "",
|
|
332
|
+
buildFailed
|
|
333
|
+
).issues;
|
|
334
|
+
const lintIssues = parseVerificationErrorsForChannel(
|
|
335
|
+
"lint",
|
|
336
|
+
languageFor(baseline.summary?.gates.lint.language),
|
|
337
|
+
state.gates.lint.availability === "executed" ? baseline.lintErrors.outputTail : "",
|
|
338
|
+
lintFailed
|
|
339
|
+
).issues;
|
|
340
|
+
const testIssues = parseVerificationErrorsForChannel(
|
|
341
|
+
"test",
|
|
342
|
+
languageFor(baseline.summary?.gates.test.language),
|
|
343
|
+
state.gates.test.availability === "executed" ? baseline.testResults.outputTail : "",
|
|
344
|
+
testFailed,
|
|
345
|
+
state.gates.test.availability === "executed" ? baseline.testResults.failedTests : []
|
|
346
|
+
).issues;
|
|
347
|
+
return {
|
|
348
|
+
buildIssues,
|
|
349
|
+
lintIssues,
|
|
350
|
+
testIssues,
|
|
351
|
+
totalIssues: buildIssues.size + lintIssues.size + testIssues.size,
|
|
352
|
+
gates: state.gates
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
return state;
|
|
356
|
+
}
|
|
357
|
+
function determineStableVerdict(delta) {
|
|
358
|
+
if (delta.hasAnyRegressions) {
|
|
359
|
+
return "regression";
|
|
360
|
+
}
|
|
361
|
+
if (delta.hasAnyImprovements) {
|
|
362
|
+
return "improvement";
|
|
363
|
+
}
|
|
364
|
+
if (delta.totalPersistingIssues > 0) {
|
|
365
|
+
return "neutral";
|
|
366
|
+
}
|
|
367
|
+
return "pass";
|
|
368
|
+
}
|
|
369
|
+
function formatStableIssueLabel(issue) {
|
|
370
|
+
if (issue.gate === "test") {
|
|
371
|
+
return issue.file ? `${issue.file}: ${issue.code}` : issue.code;
|
|
372
|
+
}
|
|
373
|
+
const loc = issue.line ? `:${issue.line}${issue.col ? `:${issue.col}` : ""}` : "";
|
|
374
|
+
if (issue.originalMessage) {
|
|
375
|
+
return `${issue.file}${loc}: ${issue.code} - ${issue.originalMessage}`;
|
|
376
|
+
}
|
|
377
|
+
return `${issue.file}${loc}: ${issue.code}`;
|
|
378
|
+
}
|
|
379
|
+
function issueSetToDimensionComparison(issueDelta) {
|
|
380
|
+
return {
|
|
381
|
+
newFailures: issueDelta.newIssues.toArray().map(formatStableIssueLabel),
|
|
382
|
+
fixedIssues: issueDelta.fixedIssues.toArray().map(formatStableIssueLabel),
|
|
383
|
+
persistingIssues: issueDelta.persistingIssues.toArray().map(formatStableIssueLabel),
|
|
384
|
+
netChange: issueDelta.netChange
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
function stableComparisonToBaselineComparison(stable) {
|
|
388
|
+
const tests = issueSetToDimensionComparison(stable.delta.test);
|
|
389
|
+
const types = issueSetToDimensionComparison(stable.delta.build);
|
|
390
|
+
const lint = issueSetToDimensionComparison(stable.delta.lint);
|
|
391
|
+
const totalNewFailures = tests.newFailures.length + types.newFailures.length + lint.newFailures.length;
|
|
392
|
+
const totalFixedIssues = tests.fixedIssues.length + types.fixedIssues.length + lint.fixedIssues.length;
|
|
393
|
+
const totalPersistingIssues = tests.persistingIssues.length + types.persistingIssues.length + lint.persistingIssues.length;
|
|
394
|
+
return {
|
|
395
|
+
verdict: stable.verdict,
|
|
396
|
+
tests,
|
|
397
|
+
types,
|
|
398
|
+
lint,
|
|
399
|
+
summary: {
|
|
400
|
+
totalNewFailures,
|
|
401
|
+
totalFixedIssues,
|
|
402
|
+
totalPersistingIssues,
|
|
403
|
+
// `shouldPenalize` keeps its documented meaning: PROVEN new failures, so a proven
|
|
404
|
+
// regression stays penalisable even when a sibling channel's identity gap is also
|
|
405
|
+
// reported. Uncertainty alone never penalises — `comparisonUnavailable` carries it
|
|
406
|
+
// instead, and `baselineComparisonProvesClean` keeps it out of clean promotions.
|
|
407
|
+
shouldPenalize: stable.provenNewFailures,
|
|
408
|
+
comparisonUnavailable: stable.comparisonIdentityUnavailable || (stable.comparisonExecutionUnavailableChannels?.length ?? 0) > 0,
|
|
409
|
+
comparisonUnavailableChannels: ["build", "lint", "test"].filter(
|
|
410
|
+
(channel) => stable.comparisonIdentityUnavailableChannels.includes(channel) || (stable.comparisonExecutionUnavailableChannels ?? []).includes(channel)
|
|
411
|
+
),
|
|
412
|
+
comparisonIdentityUnavailableChannels: [...stable.comparisonIdentityUnavailableChannels],
|
|
413
|
+
// Only a skipped or absent test run is substituted; an unavailable one is already
|
|
414
|
+
// an execution gap on the test channel.
|
|
415
|
+
...stable.testVerificationUnavailable && !(stable.comparisonExecutionUnavailableChannels ?? []).includes("test") ? { testChannelNotCompared: true } : {},
|
|
416
|
+
scoreAdjustment: 0,
|
|
417
|
+
message: generateSummaryMessage({ verdict: stable.verdict, tests, types, lint })
|
|
418
|
+
},
|
|
419
|
+
baselineRef: stable.baselineRef
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
function compareVerificationOutcomeToBaseline(baseline, currentGates) {
|
|
423
|
+
return compareCurrentGatesToBaseline(baseline, currentGates);
|
|
424
|
+
}
|
|
425
|
+
function compareCurrentGatesToBaseline(baseline, currentGates) {
|
|
426
|
+
const baselineState = baselineToStableState(baseline);
|
|
427
|
+
const currentState = extractStableVerificationState(currentGates);
|
|
428
|
+
const testVerificationUnavailable = currentGates.tests == null || currentGates.tests.status === "skipped" || currentGates.tests.status === "unavailable" || currentGates.tests.status === "not_run";
|
|
429
|
+
if (testVerificationUnavailable && currentGates.tests?.status !== "unavailable" && currentGates.tests?.status !== "not_run") {
|
|
430
|
+
currentState.testIssues = baselineState.testIssues;
|
|
431
|
+
currentState.totalIssues = currentState.buildIssues.size + currentState.lintIssues.size + currentState.testIssues.size;
|
|
432
|
+
}
|
|
433
|
+
const comparisonExecutionUnavailableChannels = ["build", "lint", "test"].filter(
|
|
434
|
+
(channel) => baselineState.gates[channel].availability === "unavailable" || currentState.gates[channel].availability === "unavailable"
|
|
435
|
+
);
|
|
436
|
+
const comparableBaseline = { ...baselineState };
|
|
437
|
+
const comparableCurrent = { ...currentState };
|
|
438
|
+
for (const channel of comparisonExecutionUnavailableChannels) {
|
|
439
|
+
const key = channel === "build" ? "buildIssues" : channel === "lint" ? "lintIssues" : "testIssues";
|
|
440
|
+
const baselineCommands = baseline.summary?.gates[channel].commands;
|
|
441
|
+
const currentGate = currentGates[channel === "test" ? "tests" : channel];
|
|
442
|
+
const currentCommands = currentGate?.commandResults ?? (currentGate?.command?.trim() && currentGate.language !== "unknown" && !statusDidNotRun(currentGate.status) ? [
|
|
443
|
+
{
|
|
444
|
+
...currentGate,
|
|
445
|
+
command: currentGate.command,
|
|
446
|
+
status: currentGate.status === "not_run" ? "unavailable" : currentGate.status
|
|
447
|
+
}
|
|
448
|
+
] : void 0);
|
|
449
|
+
if (baselineState.gates[channel].availability === "unavailable" || baselineCommands?.length && currentCommands?.length) {
|
|
450
|
+
[comparableBaseline[key], comparableCurrent[key]] = matchedExecutedCommandIssues(
|
|
451
|
+
channel,
|
|
452
|
+
baselineCommands,
|
|
453
|
+
currentCommands
|
|
454
|
+
);
|
|
455
|
+
} else if (currentState[key].size === 0) {
|
|
456
|
+
comparableBaseline[key] = new IssueSet();
|
|
457
|
+
comparableCurrent[key] = new IssueSet();
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
const delta = compareVerificationStates(comparableBaseline, comparableCurrent);
|
|
461
|
+
const baseVerdict = determineStableVerdict(delta);
|
|
462
|
+
const gateRegressions = detectGateRegressions(baseline, currentGates, baselineState);
|
|
463
|
+
const comparableTestTotalRegressed = !testVerificationUnavailable && baselineState.gates.test.availability !== "unavailable" && baseline.testResults.run !== void 0 && currentGates.tests?.testsRun !== void 0 && currentGates.tests.testsRun < baseline.testResults.run;
|
|
464
|
+
const gateRegressed = gateRegressions.total > 0 || comparableTestTotalRegressed;
|
|
465
|
+
const identity = assessComparisonIdentityAvailability(delta, {
|
|
466
|
+
build: {
|
|
467
|
+
language: currentGates.build?.language,
|
|
468
|
+
skip: currentGates.build?.status === "timeout"
|
|
469
|
+
},
|
|
470
|
+
lint: {
|
|
471
|
+
language: currentGates.lint?.language,
|
|
472
|
+
skip: currentGates.lint?.status === "timeout"
|
|
473
|
+
},
|
|
474
|
+
test: {
|
|
475
|
+
language: currentGates.tests?.language,
|
|
476
|
+
skip: testVerificationUnavailable || currentGates.tests?.status === "timeout"
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
const provenNewFailures = delta.hasAnyRegressions || gateRegressed;
|
|
480
|
+
const comparisonIdentityUnavailable = identity.unavailable;
|
|
481
|
+
const verdict = provenNewFailures ? "regression" : comparisonIdentityUnavailable || comparisonExecutionUnavailableChannels.length > 0 ? "comparison-unavailable" : baseVerdict;
|
|
482
|
+
return {
|
|
483
|
+
delta,
|
|
484
|
+
baseline: baselineState,
|
|
485
|
+
current: currentState,
|
|
486
|
+
baselineRef: baseline.baselineRef,
|
|
487
|
+
passed: !provenNewFailures && !comparisonIdentityUnavailable && comparisonExecutionUnavailableChannels.length === 0,
|
|
488
|
+
testVerificationUnavailable,
|
|
489
|
+
comparisonExecutionUnavailableChannels,
|
|
490
|
+
comparisonIdentityUnavailable,
|
|
491
|
+
comparisonIdentityUnavailableChannels: identity.channels,
|
|
492
|
+
...comparisonIdentityUnavailable && identity.reason ? { comparisonIdentityUnavailableReason: identity.reason } : {},
|
|
493
|
+
provenNewFailures,
|
|
494
|
+
comparableTestTotalRegressed,
|
|
495
|
+
verdict,
|
|
496
|
+
scoreAdjustment: 0
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
// src/core/verification/baseline-attribution.ts
|
|
501
|
+
function baseOnlyIssuesByGate(comparison, identicalToBase = []) {
|
|
502
|
+
const only = (gate, issues) => {
|
|
503
|
+
if (issues.newIssues.size > 0) return [];
|
|
504
|
+
const labels = issues.persistingIssues.toArray().map(formatStableIssueLabel);
|
|
505
|
+
return labels.length === 0 && identicalToBase.includes(gate) ? [identicalToBaseLabel(gate)] : labels;
|
|
506
|
+
};
|
|
507
|
+
const { build, lint, test } = comparison.delta;
|
|
508
|
+
return { build: only("build", build), lint: only("lint", lint), test: only("test", test) };
|
|
509
|
+
}
|
|
510
|
+
function persistingIssuesOnBase(comparison, baseline, gates) {
|
|
511
|
+
return baseOnlyIssuesByGate(
|
|
512
|
+
comparison,
|
|
513
|
+
baseline ? channelsFailingIdenticallyOnBase(baseline, gates, ["lint"]) : []
|
|
514
|
+
);
|
|
515
|
+
}
|
|
516
|
+
function identicalToBaseLabel(gate) {
|
|
517
|
+
return `${gate} failure identical to the base commit`;
|
|
518
|
+
}
|
|
519
|
+
function markLintIdenticalToBase(comparison, identicalToBase) {
|
|
520
|
+
const { lint, summary } = comparison;
|
|
521
|
+
if (lint && identicalToBase.includes("lint") && lint.newFailures.length === 0 && lint.persistingIssues.length === 0) {
|
|
522
|
+
lint.persistingIssues = [identicalToBaseLabel("lint")];
|
|
523
|
+
summary.totalPersistingIssues += 1;
|
|
524
|
+
const notLint = (channels) => channels?.filter((c) => c !== "lint");
|
|
525
|
+
summary.comparisonIdentityUnavailableChannels = notLint(
|
|
526
|
+
summary.comparisonIdentityUnavailableChannels
|
|
527
|
+
);
|
|
528
|
+
summary.comparisonUnavailableChannels = notLint(summary.comparisonUnavailableChannels);
|
|
529
|
+
if (summary.comparisonUnavailable && !summary.comparisonUnavailableChannels?.length) {
|
|
530
|
+
summary.comparisonUnavailable = false;
|
|
531
|
+
if (comparison.verdict === "comparison-unavailable") comparison.verdict = "neutral";
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
return comparison;
|
|
535
|
+
}
|
|
536
|
+
function trustedLoopBaselineComparison(baselineRef, last) {
|
|
537
|
+
const persisting = last.persistingIssues ?? { build: [], lint: [], test: [] };
|
|
538
|
+
return {
|
|
539
|
+
verdict: "pass",
|
|
540
|
+
baselineRef,
|
|
541
|
+
summary: {
|
|
542
|
+
totalNewFailures: 0,
|
|
543
|
+
totalFixedIssues: last.fixedIssueCount ?? 0,
|
|
544
|
+
totalPersistingIssues: Object.values(persisting).flat().length,
|
|
545
|
+
shouldPenalize: false,
|
|
546
|
+
// A trusted verification-loop pass IS an established comparison.
|
|
547
|
+
comparisonUnavailable: false,
|
|
548
|
+
scoreAdjustment: 0,
|
|
549
|
+
message: "Verification loop passed baseline comparison"
|
|
550
|
+
},
|
|
551
|
+
tests: { newFailures: [], fixedIssues: [], persistingIssues: persisting.test },
|
|
552
|
+
types: { newFailures: [], fixedIssues: [], persistingIssues: persisting.build },
|
|
553
|
+
lint: { newFailures: [], fixedIssues: [], persistingIssues: persisting.lint }
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
function variantGatesAlsoFailingOnBase(variant) {
|
|
557
|
+
const outcome = variant.outcome?.verification;
|
|
558
|
+
return failedGatesAlsoFailingOnBase(variant.baselineComparison, {
|
|
559
|
+
buildStatus: variant.buildStatus ?? outcome?.buildStatus,
|
|
560
|
+
lintStatus: variant.lintStatus ?? outcome?.lintStatus,
|
|
561
|
+
testStatus: variant.testStatus ?? outcome?.testStatus
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
function failedGatesAlsoFailingOnBase(comparison, gates) {
|
|
565
|
+
if (!comparison) return [];
|
|
566
|
+
const dimensions = [
|
|
567
|
+
["build", gates.buildStatus, comparison.types],
|
|
568
|
+
["lint", gates.lintStatus, comparison.lint],
|
|
569
|
+
["test", gates.testStatus, comparison.tests]
|
|
570
|
+
];
|
|
571
|
+
return dimensions.filter(
|
|
572
|
+
([, status, dimension]) => status === "failed" && dimension !== void 0 && dimension.newFailures.length === 0 && dimension.persistingIssues.length > 0
|
|
573
|
+
).map(([gate]) => gate);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
// src/core/verification/baseline-clean-claim.ts
|
|
577
|
+
function baselineComparisonProvesClean(comparison) {
|
|
578
|
+
if (!comparison) return false;
|
|
579
|
+
return comparison.summary.shouldPenalize === false && comparison.summary.comparisonUnavailable !== true;
|
|
580
|
+
}
|
|
581
|
+
function baselineComparisonProvesCleanForChannels(comparison, channels) {
|
|
582
|
+
if (!comparison || comparison.summary.shouldPenalize !== false) return false;
|
|
583
|
+
if (channels.includes("test") && comparison.summary.testChannelNotCompared === true) {
|
|
584
|
+
return false;
|
|
585
|
+
}
|
|
586
|
+
if (comparison.summary.comparisonUnavailable !== true) return true;
|
|
587
|
+
const gaps = comparison.summary.comparisonUnavailableChannels;
|
|
588
|
+
const identityGaps = comparison.summary.comparisonIdentityUnavailableChannels;
|
|
589
|
+
if (!gaps || !identityGaps) return false;
|
|
590
|
+
const identityBlocks = identityGaps.some(
|
|
591
|
+
(channel) => channel !== "lint" || channels.includes("lint")
|
|
592
|
+
);
|
|
593
|
+
const executionBlocks = gaps.some(
|
|
594
|
+
(channel) => !identityGaps.includes(channel) && channels.includes(channel)
|
|
595
|
+
);
|
|
596
|
+
return !identityBlocks && !executionBlocks;
|
|
597
|
+
}
|
|
598
|
+
function stableBaselineProvesClean(comparison, provenNewFailures, hardChannels) {
|
|
599
|
+
const identityGap = [
|
|
600
|
+
...comparison.comparisonIdentityUnavailableChannels,
|
|
601
|
+
...comparison.comparisonExecutionUnavailableChannels ?? []
|
|
602
|
+
].some((channel) => hardChannels.includes(channel));
|
|
603
|
+
return baselineComparisonProvesClean({
|
|
604
|
+
summary: { shouldPenalize: provenNewFailures, comparisonUnavailable: identityGap }
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
function applyKnownFailureDowngrade(comparison, downgradedFailureCount) {
|
|
608
|
+
comparison.summary.shouldPenalize = false;
|
|
609
|
+
const identityStillUnavailable = comparison.summary.comparisonUnavailable === true;
|
|
610
|
+
comparison.verdict = identityStillUnavailable ? "comparison-unavailable" : "neutral";
|
|
611
|
+
const note = identityStillUnavailable ? `[registry] All ${downgradedFailureCount} new test failure(s) matched known-pre-existing-failures registry, but the baseline comparison remains unavailable: issue identity could not be established.` : `[registry] All ${downgradedFailureCount} new test failure(s) matched known-pre-existing-failures registry \u2014 downgraded to baseline_clean.`;
|
|
612
|
+
comparison.summary.message = [comparison.summary.message, note].filter(Boolean).join("\n");
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
// src/core/project/direct-test-command.ts
|
|
616
|
+
var OPAQUE_VERIFICATION_WRAPPER_HEADS = /* @__PURE__ */ new Set([
|
|
617
|
+
"make",
|
|
618
|
+
"just",
|
|
619
|
+
"task",
|
|
620
|
+
"turbo",
|
|
621
|
+
"nx",
|
|
622
|
+
"npm",
|
|
623
|
+
"pnpm",
|
|
624
|
+
"yarn",
|
|
625
|
+
"bun",
|
|
626
|
+
"npx",
|
|
627
|
+
"pnpx",
|
|
628
|
+
"bunx",
|
|
629
|
+
"composer",
|
|
630
|
+
"rake"
|
|
631
|
+
]);
|
|
632
|
+
var EXEC_LAUNCHER_PREFIX = /^(?:bundle\s+exec|poetry\s+run|uv\s+run|pipenv\s+run|pdm\s+run|hatch\s+run)\s+/i;
|
|
633
|
+
function commandHeadBase(command) {
|
|
634
|
+
const head = command.trim().split(/\s+/)[0] ?? "";
|
|
635
|
+
return head.replace(/^.*[/\\]/, "").replace(/\.(?:cmd|exe|bat)$/i, "").toLowerCase();
|
|
636
|
+
}
|
|
637
|
+
function isOpaqueVerificationWrapper(command) {
|
|
638
|
+
if (OPAQUE_VERIFICATION_WRAPPER_HEADS.has(commandHeadBase(command))) return true;
|
|
639
|
+
const nested = command.trim().replace(EXEC_LAUNCHER_PREFIX, "");
|
|
640
|
+
return nested !== command.trim() && OPAQUE_VERIFICATION_WRAPPER_HEADS.has(commandHeadBase(nested));
|
|
641
|
+
}
|
|
642
|
+
function isDirectTestCommand(command) {
|
|
643
|
+
if (!command.trim() || isOpaqueVerificationWrapper(command)) return false;
|
|
644
|
+
const descriptor = describeVerificationCommand(command);
|
|
645
|
+
return descriptor.language !== "unknown" && descriptor.kind === "test";
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
// src/core/judge/test-command-output.ts
|
|
649
|
+
function inferSuccessStatusFromMetrics(metrics) {
|
|
650
|
+
if (metrics.testsRun === 0) {
|
|
651
|
+
return "error";
|
|
652
|
+
}
|
|
653
|
+
return metrics.testsFailed === 0 ? "passed" : "failed";
|
|
654
|
+
}
|
|
655
|
+
function classifyExitZeroTestMetrics(command, metrics) {
|
|
656
|
+
if (metrics.testsFailed > 0) return "failed";
|
|
657
|
+
if (metrics.metricsMeasured) {
|
|
658
|
+
const measured = inferSuccessStatusFromMetrics(metrics);
|
|
659
|
+
if (measured !== "error") return measured;
|
|
660
|
+
}
|
|
661
|
+
if (metrics.successProse && isDirectTestCommand(command)) return "passed";
|
|
662
|
+
return "unavailable";
|
|
663
|
+
}
|
|
664
|
+
function classifyTestCommandOutput(command, output, exitCode) {
|
|
665
|
+
if (exitCode === 0 ? detectEmptyRun(command, output, 0, { bucket: "test" }) : detectZeroCollectedTests(command, output, { bucket: "test" })) {
|
|
666
|
+
return {
|
|
667
|
+
status: "unavailable",
|
|
668
|
+
testsRun: 0,
|
|
669
|
+
testsPassed: 0,
|
|
670
|
+
testsFailed: 0,
|
|
671
|
+
metricsMeasured: false
|
|
672
|
+
};
|
|
673
|
+
}
|
|
674
|
+
const metrics = parseGenericPassFailOutput(output, command);
|
|
675
|
+
if (exitCode === 0) {
|
|
676
|
+
const status = classifyExitZeroTestMetrics(command, metrics);
|
|
677
|
+
if (status === "unavailable") {
|
|
678
|
+
return {
|
|
679
|
+
status,
|
|
680
|
+
testsRun: 0,
|
|
681
|
+
testsPassed: 0,
|
|
682
|
+
testsFailed: 0,
|
|
683
|
+
metricsMeasured: false
|
|
684
|
+
};
|
|
685
|
+
}
|
|
686
|
+
return {
|
|
687
|
+
status,
|
|
688
|
+
testsRun: metrics.testsRun,
|
|
689
|
+
testsPassed: metrics.testsPassed,
|
|
690
|
+
testsFailed: metrics.testsFailed,
|
|
691
|
+
metricsMeasured: metrics.metricsMeasured
|
|
692
|
+
};
|
|
693
|
+
}
|
|
694
|
+
if (metrics.testsFailed > 0 || metrics.testsRun >= 1) {
|
|
695
|
+
return {
|
|
696
|
+
status: "failed",
|
|
697
|
+
testsRun: metrics.testsRun,
|
|
698
|
+
testsPassed: metrics.testsPassed,
|
|
699
|
+
testsFailed: metrics.testsFailed,
|
|
700
|
+
metricsMeasured: metrics.metricsMeasured
|
|
701
|
+
};
|
|
702
|
+
}
|
|
703
|
+
return {
|
|
704
|
+
status: "unavailable",
|
|
705
|
+
testsRun: 0,
|
|
706
|
+
testsPassed: 0,
|
|
707
|
+
testsFailed: 0,
|
|
708
|
+
metricsMeasured: false
|
|
709
|
+
};
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
// src/core/judge/test-provenance.ts
|
|
713
|
+
function recordedTestResultPredatesRepair(variant) {
|
|
714
|
+
const repair = variant.repairOutcome;
|
|
715
|
+
return repair?.attempted === true && repair.classification !== "none";
|
|
716
|
+
}
|
|
717
|
+
function hasTestExecutionProvenance(variant) {
|
|
718
|
+
const testsExecuted = variant.testsExecuted;
|
|
719
|
+
if (!testsExecuted || testsExecuted.scope === "none") return false;
|
|
720
|
+
return true;
|
|
721
|
+
}
|
|
722
|
+
var RECORDED_TEST_STATUSES = /* @__PURE__ */ new Set(["passed", "failed", "error", "timeout", "not_run"]);
|
|
723
|
+
function normalizeRecordedTestStatus(status) {
|
|
724
|
+
if (typeof status !== "string") return void 0;
|
|
725
|
+
const normalized = status.trim().toLowerCase();
|
|
726
|
+
if (normalized === "unavailable") return "not_run";
|
|
727
|
+
return RECORDED_TEST_STATUSES.has(normalized) ? normalized : void 0;
|
|
728
|
+
}
|
|
729
|
+
function hasUnrecognizedRecordedTestStatus(status) {
|
|
730
|
+
if (typeof status !== "string") return false;
|
|
731
|
+
return normalizeRecordedTestStatus(status) === void 0;
|
|
732
|
+
}
|
|
733
|
+
function hasRecordedTestExecutionEvidence(params) {
|
|
734
|
+
const hasCommand = (params.command?.trim().length ?? 0) > 0;
|
|
735
|
+
const hasFiles = (params.filesTested?.length ?? 0) > 0;
|
|
736
|
+
const hasTestCount = params.totalTests > 0;
|
|
737
|
+
if (hasCommand && params.exitCode !== void 0 && params.exitCode !== 0) {
|
|
738
|
+
return true;
|
|
739
|
+
}
|
|
740
|
+
const signalCount = (hasCommand ? 1 : 0) + (hasFiles ? 1 : 0) + (hasTestCount ? 1 : 0);
|
|
741
|
+
return signalCount >= 2;
|
|
742
|
+
}
|
|
743
|
+
function recordedTestCommands(command, commands) {
|
|
744
|
+
const split = (value) => value.split("\n").map((line) => line.trim()).filter((line) => line.length > 0);
|
|
745
|
+
const fromCommand = split(command ?? "");
|
|
746
|
+
if (fromCommand.length > 0) return fromCommand;
|
|
747
|
+
return (commands ?? []).flatMap(split);
|
|
748
|
+
}
|
|
749
|
+
function isDirectRunnerCleanPassRecord(params) {
|
|
750
|
+
if (!params.scope || params.scope === "none") return false;
|
|
751
|
+
if (params.skipReason) return false;
|
|
752
|
+
if (params.exitCode !== 0) return false;
|
|
753
|
+
if (normalizeRecordedTestStatus(params.testStatus) !== "passed") return false;
|
|
754
|
+
const commands = recordedTestCommands(params.command, params.commands);
|
|
755
|
+
if (commands.length !== 1) return false;
|
|
756
|
+
const [command] = commands;
|
|
757
|
+
if (!isDirectTestCommand(command) || !params.outputTail?.trim()) return false;
|
|
758
|
+
return classifyTestCommandOutput(command, params.outputTail, 0).status === "passed";
|
|
759
|
+
}
|
|
760
|
+
function isUnavailableStatus(status) {
|
|
761
|
+
return status === "unavailable";
|
|
762
|
+
}
|
|
763
|
+
function hasUnavailableCoverage(gate) {
|
|
764
|
+
if (typeof gate !== "object" || gate === null) {
|
|
765
|
+
return false;
|
|
766
|
+
}
|
|
767
|
+
const verificationCoverage = gate.verificationCoverage;
|
|
768
|
+
if (typeof verificationCoverage !== "object" || verificationCoverage === null) {
|
|
769
|
+
return false;
|
|
770
|
+
}
|
|
771
|
+
return verificationCoverage.status === "skipped_tool_unavailable";
|
|
772
|
+
}
|
|
773
|
+
function hasUnavailableGateEvidence(gate) {
|
|
774
|
+
if (typeof gate !== "object" || gate === null) {
|
|
775
|
+
return false;
|
|
776
|
+
}
|
|
777
|
+
return isUnavailableStatus(gate.status) || hasUnavailableCoverage(gate);
|
|
778
|
+
}
|
|
779
|
+
function latestVerificationIteration(loop) {
|
|
780
|
+
if (!loop?.enabled || !Array.isArray(loop.iterations) || loop.iterations.length === 0) {
|
|
781
|
+
return null;
|
|
782
|
+
}
|
|
783
|
+
return loop.iterations.reduce(
|
|
784
|
+
(best, current) => (current.iteration ?? 0) > (best.iteration ?? 0) ? current : best
|
|
785
|
+
);
|
|
786
|
+
}
|
|
787
|
+
function hasUnavailableVerificationGateEvidence(variant) {
|
|
788
|
+
if (variant.verification?.status === "unavailable") {
|
|
789
|
+
return true;
|
|
790
|
+
}
|
|
791
|
+
const last = latestVerificationIteration(variant.verificationLoop);
|
|
792
|
+
if (hasUnavailableGateEvidence(last?.build) || hasUnavailableGateEvidence(last?.lint) || hasUnavailableGateEvidence(last?.tests)) {
|
|
793
|
+
return true;
|
|
794
|
+
}
|
|
795
|
+
if (isUnavailableStatus(variant.testStatus)) {
|
|
796
|
+
return true;
|
|
797
|
+
}
|
|
798
|
+
return variant.testsExecuted?.skipReason === "verification-unavailable";
|
|
799
|
+
}
|
|
800
|
+
function isNoCoveringCommandGate(gate) {
|
|
801
|
+
if (typeof gate !== "object" || gate === null) return false;
|
|
802
|
+
const { status, verificationCoverage } = gate;
|
|
803
|
+
return isUnavailableStatus(status) && verificationCoverage?.status === "skipped_no_command";
|
|
804
|
+
}
|
|
805
|
+
function hasVetoingUnavailableVerificationGateEvidence(variant) {
|
|
806
|
+
if (!hasUnavailableVerificationGateEvidence(variant)) return false;
|
|
807
|
+
if (variant.verification?.status === "unavailable") return true;
|
|
808
|
+
if (hasUnavailableTestVerificationEvidence(variant)) return true;
|
|
809
|
+
const last = latestVerificationIteration(variant.verificationLoop);
|
|
810
|
+
if (!last || last.tests?.status !== "passed" || last.tests.exitCode !== 0) return true;
|
|
811
|
+
if (last.tests.testsRun === 0) return true;
|
|
812
|
+
return [last.build, last.lint].some(
|
|
813
|
+
(gate) => hasUnavailableGateEvidence(gate) && !isNoCoveringCommandGate(gate)
|
|
814
|
+
);
|
|
815
|
+
}
|
|
816
|
+
function hasUnavailableTestVerificationEvidence(variant) {
|
|
817
|
+
const last = latestVerificationIteration(variant.verificationLoop);
|
|
818
|
+
if (hasUnavailableGateEvidence(last?.tests)) return true;
|
|
819
|
+
if (isUnavailableStatus(variant.testStatus)) {
|
|
820
|
+
return true;
|
|
821
|
+
}
|
|
822
|
+
return variant.testsExecuted?.skipReason === "verification-unavailable";
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
// src/utils/structured-logger.ts
|
|
826
|
+
var StructuredLogger = class _StructuredLogger {
|
|
827
|
+
component;
|
|
828
|
+
/**
|
|
829
|
+
* Create a new structured logger
|
|
830
|
+
*
|
|
831
|
+
* @param component - Component or module name for log identification
|
|
832
|
+
*/
|
|
833
|
+
constructor(component) {
|
|
834
|
+
this.component = component;
|
|
835
|
+
}
|
|
836
|
+
/**
|
|
837
|
+
* Internal logging method that creates structured log entries
|
|
838
|
+
*
|
|
839
|
+
* @param level - Log severity level
|
|
840
|
+
* @param message - Human-readable message
|
|
841
|
+
* @param context - Additional structured context
|
|
842
|
+
* @param error - Error object (for error-level logs)
|
|
843
|
+
*/
|
|
844
|
+
log(level, message, context, error) {
|
|
845
|
+
const entry = {
|
|
846
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
847
|
+
level,
|
|
848
|
+
component: this.component,
|
|
849
|
+
message,
|
|
850
|
+
context: { ...context }
|
|
851
|
+
};
|
|
852
|
+
if (error) {
|
|
853
|
+
entry.error = {
|
|
854
|
+
message: error.message,
|
|
855
|
+
stack: error.stack,
|
|
856
|
+
name: error.name,
|
|
857
|
+
// Include error code if present (common in Node.js errors)
|
|
858
|
+
code: "code" in error ? String(error.code) : void 0
|
|
859
|
+
};
|
|
860
|
+
}
|
|
861
|
+
const formatted = JSON.stringify(entry);
|
|
862
|
+
switch (level) {
|
|
863
|
+
case "debug":
|
|
864
|
+
if (isTelemetryDebug() || process.env.DEBUG === "build:*") {
|
|
865
|
+
console.debug(formatted);
|
|
866
|
+
}
|
|
867
|
+
break;
|
|
868
|
+
case "info":
|
|
869
|
+
console.log(formatted);
|
|
870
|
+
break;
|
|
871
|
+
case "warn":
|
|
872
|
+
console.warn(formatted);
|
|
873
|
+
break;
|
|
874
|
+
case "error":
|
|
875
|
+
console.error(formatted);
|
|
876
|
+
break;
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
/**
|
|
880
|
+
* Log debug message (only visible when BUILD_DEBUG_TELEMETRY=1)
|
|
881
|
+
*
|
|
882
|
+
* @param message - Debug message
|
|
883
|
+
* @param context - Additional context
|
|
884
|
+
*/
|
|
885
|
+
debug(message, context) {
|
|
886
|
+
this.log("debug", message, context);
|
|
887
|
+
}
|
|
888
|
+
/**
|
|
889
|
+
* Log informational message
|
|
890
|
+
*
|
|
891
|
+
* @param message - Info message
|
|
892
|
+
* @param context - Additional context
|
|
893
|
+
*/
|
|
894
|
+
info(message, context) {
|
|
895
|
+
this.log("info", message, context);
|
|
896
|
+
}
|
|
897
|
+
/**
|
|
898
|
+
* Log warning message
|
|
899
|
+
*
|
|
900
|
+
* @param message - Warning message
|
|
901
|
+
* @param context - Additional context
|
|
902
|
+
*/
|
|
903
|
+
warn(message, context) {
|
|
904
|
+
this.log("warn", message, context);
|
|
905
|
+
}
|
|
906
|
+
/**
|
|
907
|
+
* Log error message with optional error object
|
|
908
|
+
*
|
|
909
|
+
* @param message - Error message
|
|
910
|
+
* @param error - Error object (optional)
|
|
911
|
+
* @param context - Additional context
|
|
912
|
+
*/
|
|
913
|
+
error(message, error, context) {
|
|
914
|
+
this.log("error", message, context, error);
|
|
915
|
+
}
|
|
916
|
+
/**
|
|
917
|
+
* Create a child logger with additional context
|
|
918
|
+
*
|
|
919
|
+
* Useful for adding persistent context to all logs from a specific operation.
|
|
920
|
+
*
|
|
921
|
+
* @param childComponent - Child component name (appended to parent)
|
|
922
|
+
* @returns New logger instance
|
|
923
|
+
*
|
|
924
|
+
* @example
|
|
925
|
+
* ```typescript
|
|
926
|
+
* const masterLogger = new StructuredLogger('CompetitionMaster');
|
|
927
|
+
* const variantLogger = masterLogger.child('VariantExecution');
|
|
928
|
+
* // Logs will show component as 'CompetitionMaster:VariantExecution'
|
|
929
|
+
* ```
|
|
930
|
+
*/
|
|
931
|
+
child(childComponent) {
|
|
932
|
+
return new _StructuredLogger(`${this.component}:${childComponent}`);
|
|
933
|
+
}
|
|
934
|
+
/**
|
|
935
|
+
* Measure and log operation duration
|
|
936
|
+
*
|
|
937
|
+
* @param operation - Operation name
|
|
938
|
+
* @param fn - Function to measure
|
|
939
|
+
* @returns Function result
|
|
940
|
+
*
|
|
941
|
+
* @example
|
|
942
|
+
* ```typescript
|
|
943
|
+
* const result = await logger.measure('database_query', async () => {
|
|
944
|
+
* return await db.query('SELECT * FROM variants');
|
|
945
|
+
* });
|
|
946
|
+
* // Logs: "Operation completed: database_query (duration_ms: 145)"
|
|
947
|
+
* ```
|
|
948
|
+
*/
|
|
949
|
+
async measure(operation, fn) {
|
|
950
|
+
const startTime = Date.now();
|
|
951
|
+
this.debug(`Operation started: ${operation}`);
|
|
952
|
+
try {
|
|
953
|
+
const result = await fn();
|
|
954
|
+
const duration = Date.now() - startTime;
|
|
955
|
+
this.debug(`Operation completed: ${operation}`, { duration_ms: duration });
|
|
956
|
+
return result;
|
|
957
|
+
} catch (error) {
|
|
958
|
+
const duration = Date.now() - startTime;
|
|
959
|
+
this.error(`Operation failed: ${operation}`, error, { duration_ms: duration });
|
|
960
|
+
throw error;
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
/**
|
|
964
|
+
* Measure synchronous operation duration
|
|
965
|
+
*
|
|
966
|
+
* @param operation - Operation name
|
|
967
|
+
* @param fn - Function to measure
|
|
968
|
+
* @returns Function result
|
|
969
|
+
*/
|
|
970
|
+
measureSync(operation, fn) {
|
|
971
|
+
const startTime = Date.now();
|
|
972
|
+
this.debug(`Operation started: ${operation}`);
|
|
973
|
+
try {
|
|
974
|
+
const result = fn();
|
|
975
|
+
const duration = Date.now() - startTime;
|
|
976
|
+
this.debug(`Operation completed: ${operation}`, { duration_ms: duration });
|
|
977
|
+
return result;
|
|
978
|
+
} catch (error) {
|
|
979
|
+
const duration = Date.now() - startTime;
|
|
980
|
+
this.error(`Operation failed: ${operation}`, error, { duration_ms: duration });
|
|
981
|
+
throw error;
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
};
|
|
985
|
+
function createLogger(component) {
|
|
986
|
+
return new StructuredLogger(component);
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
// src/core/synthesis/ignored-planning-artifact-path.ts
|
|
990
|
+
function normalizeIgnoredArtifactPath(candidate) {
|
|
991
|
+
let normalized = candidate.trim().replace(/\\/g, "/");
|
|
992
|
+
if (!normalized) return null;
|
|
993
|
+
while (normalized.startsWith("./")) {
|
|
994
|
+
normalized = normalized.slice(2);
|
|
995
|
+
}
|
|
996
|
+
if (normalized.startsWith("/")) {
|
|
997
|
+
const marker = "/.build-project/planning";
|
|
998
|
+
const markerIndex = normalized.indexOf(marker);
|
|
999
|
+
if (markerIndex < 0) return null;
|
|
1000
|
+
normalized = normalized.slice(markerIndex + 1);
|
|
1001
|
+
}
|
|
1002
|
+
const parts = [];
|
|
1003
|
+
for (const part of normalized.split("/")) {
|
|
1004
|
+
if (!part || part === ".") continue;
|
|
1005
|
+
if (part === "..") {
|
|
1006
|
+
if (parts.length === 0) return null;
|
|
1007
|
+
parts.pop();
|
|
1008
|
+
continue;
|
|
1009
|
+
}
|
|
1010
|
+
parts.push(part);
|
|
1011
|
+
}
|
|
1012
|
+
return parts.length > 0 ? parts.join("/") : null;
|
|
1013
|
+
}
|
|
1014
|
+
function isIgnoredPlanningArtifactPath(candidate) {
|
|
1015
|
+
const normalized = normalizeIgnoredArtifactPath(candidate);
|
|
1016
|
+
return normalized === ".build-project/planning" || normalized?.startsWith(".build-project/planning/") === true;
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
// src/core/judge/executed-gate-failure.ts
|
|
1020
|
+
var TOOL_NOT_FOUND_EXIT_CODES = /* @__PURE__ */ new Set([126, 127]);
|
|
1021
|
+
function isToolNotFoundExit(exitCode) {
|
|
1022
|
+
return exitCode !== void 0 && TOOL_NOT_FOUND_EXIT_CODES.has(exitCode);
|
|
1023
|
+
}
|
|
1024
|
+
function hasRecordedExecutedTestFailure(result) {
|
|
1025
|
+
const exitCode = result.testsExecuted?.exitCode;
|
|
1026
|
+
return (result.testStatus === "failed" || result.testStatus === "timeout") && typeof exitCode === "number" && exitCode !== 0 && !isToolNotFoundExit(exitCode);
|
|
1027
|
+
}
|
|
1028
|
+
function reportsUnavailableTool(exitCode, outputTail = "", unavailableReason) {
|
|
1029
|
+
return isToolNotFoundExit(exitCode) || isUnavailableVerificationFinding({ severity: "warning", outputTail, unavailableReason }) || wrapperReportsInnerMissingLaunch(outputTail) || exitCode === void 0 && /\bcommand not found\b/i.test(outputTail);
|
|
1030
|
+
}
|
|
1031
|
+
function isConcreteGateFailure(gate) {
|
|
1032
|
+
if (gate?.status !== "failed" && gate?.status !== "error" && gate?.status !== "timeout") {
|
|
1033
|
+
return false;
|
|
1034
|
+
}
|
|
1035
|
+
if (gate.status === "timeout") return true;
|
|
1036
|
+
return !reportsUnavailableTool(gate.exitCode, gate.outputTail);
|
|
1037
|
+
}
|
|
1038
|
+
function verificationLoopHasConcreteFailure(lastIteration) {
|
|
1039
|
+
return [lastIteration?.build, lastIteration?.lint, lastIteration?.tests].some(
|
|
1040
|
+
(gate) => isConcreteGateFailure(gate)
|
|
1041
|
+
);
|
|
1042
|
+
}
|
|
1043
|
+
function verificationFindingHasConcreteFailure(result) {
|
|
1044
|
+
return result.verification?.findings?.some(
|
|
1045
|
+
(finding) => finding.severity === "error" && !reportsUnavailableTool(finding.exitCode, finding.outputTail, finding.unavailableReason)
|
|
1046
|
+
) === true;
|
|
1047
|
+
}
|
|
1048
|
+
function concreteExecutedFailureChannels(result, options) {
|
|
1049
|
+
const channels = /* @__PURE__ */ new Set();
|
|
1050
|
+
if (options.directTestFailure === true) channels.add("test");
|
|
1051
|
+
if (isConcreteGateFailure(options.lastIteration?.build)) channels.add("build");
|
|
1052
|
+
if (isConcreteGateFailure(options.lastIteration?.lint)) channels.add("lint");
|
|
1053
|
+
if (isConcreteGateFailure(options.lastIteration?.tests)) channels.add("test");
|
|
1054
|
+
for (const finding of result.verification?.findings ?? []) {
|
|
1055
|
+
if (finding.severity === "error" && !reportsUnavailableTool(finding.exitCode, finding.outputTail, finding.unavailableReason)) {
|
|
1056
|
+
channels.add(
|
|
1057
|
+
finding.kind === "build" || finding.kind === "lint" || finding.kind === "test" ? finding.kind : "other"
|
|
1058
|
+
);
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
return [...channels];
|
|
1062
|
+
}
|
|
1063
|
+
function hasConcreteExecutedGateFailure(result, options) {
|
|
1064
|
+
return options.directTestFailure === true || verificationFindingHasConcreteFailure(result) || verificationLoopHasConcreteFailure(options.lastIteration);
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
// src/core/judge/judge-types-core.ts
|
|
1068
|
+
var directRunnerTrustLogger = createLogger("judge-types-core");
|
|
1069
|
+
function hasVariantFileChangeEvidence(result) {
|
|
1070
|
+
return Boolean(
|
|
1071
|
+
(result.filesChanged ?? 0) > 0 || (result.linesAdded ?? 0) > 0 || (result.linesRemoved ?? 0) > 0 || (result.gitMetrics?.filesChanged ?? 0) > 0 || (result.gitMetrics?.linesAdded ?? 0) > 0 || (result.gitMetrics?.linesDeleted ?? 0) > 0 || (result.worktreeSummary?.filesChanged ?? 0) > 0 || (result.worktreeSummary?.insertions ?? 0) > 0 || (result.worktreeSummary?.deletions ?? 0) > 0 || (result.workspaceEditsApplied ?? 0) > 0
|
|
1072
|
+
);
|
|
1073
|
+
}
|
|
1074
|
+
function hasIgnoredPlanningArtifactEvidence(result) {
|
|
1075
|
+
const paths = result.ignoredPathEvidence?.paths;
|
|
1076
|
+
if (!Array.isArray(paths) || paths.length === 0) return false;
|
|
1077
|
+
return paths.some(isIgnoredPlanningArtifactPath);
|
|
1078
|
+
}
|
|
1079
|
+
function hasVariantChangeEvidence(result) {
|
|
1080
|
+
if (hasVariantFileChangeEvidence(result)) return true;
|
|
1081
|
+
if (hasIgnoredPlanningArtifactEvidence(result)) return true;
|
|
1082
|
+
if (result.executionIntent === "analysis" || result.allowEmptyResults === true || result.intentionalNoOp === true) {
|
|
1083
|
+
return false;
|
|
1084
|
+
}
|
|
1085
|
+
return result.partialEdits === true || result.emptyChanges === false;
|
|
1086
|
+
}
|
|
1087
|
+
function deriveExecutionStatus(result) {
|
|
1088
|
+
if (result.timedOut === true || result.terminationReason === "timeout") {
|
|
1089
|
+
return "timed_out";
|
|
1090
|
+
}
|
|
1091
|
+
if (result.terminationReason === "canceled_early_exit" || result.terminationReason === "canceled_budget" || result.terminationReason === "canceled_user") {
|
|
1092
|
+
return "canceled";
|
|
1093
|
+
}
|
|
1094
|
+
if (result.terminationReason === "failed_crash") {
|
|
1095
|
+
return "crashed";
|
|
1096
|
+
}
|
|
1097
|
+
if (result.terminationReason === "failed_error") {
|
|
1098
|
+
return "failed";
|
|
1099
|
+
}
|
|
1100
|
+
if (result.terminationReason === "completed") {
|
|
1101
|
+
return "completed";
|
|
1102
|
+
}
|
|
1103
|
+
if (result.success === false) {
|
|
1104
|
+
return "failed";
|
|
1105
|
+
}
|
|
1106
|
+
return "completed";
|
|
1107
|
+
}
|
|
1108
|
+
function deriveDeliveryStatus(score, hasChanges) {
|
|
1109
|
+
if (score >= 95) return "complete";
|
|
1110
|
+
if (score >= 60) return "substantial";
|
|
1111
|
+
if (score > 0 || hasChanges) return "partial";
|
|
1112
|
+
return "none";
|
|
1113
|
+
}
|
|
1114
|
+
function gateStatusFromArtifact(status, exitCode) {
|
|
1115
|
+
if (status === "error") return "failed";
|
|
1116
|
+
return RECORDED_GATE_STATUS[verdictStatus(status === "not_run" ? void 0 : status, exitCode)];
|
|
1117
|
+
}
|
|
1118
|
+
var RECORDED_GATE_STATUS = {
|
|
1119
|
+
passed: "passed",
|
|
1120
|
+
failed: "failed",
|
|
1121
|
+
timeout: "failed",
|
|
1122
|
+
unavailable: "not_run",
|
|
1123
|
+
not_run: "not_run"
|
|
1124
|
+
};
|
|
1125
|
+
function verdictStatus(status, exitCode) {
|
|
1126
|
+
if (status === "passed" || status === "failed" || status === "timeout") return status;
|
|
1127
|
+
if (status === "unavailable" || status === "not_run") return status;
|
|
1128
|
+
if (status === "skipped") return "not_run";
|
|
1129
|
+
const realExit = typeof exitCode === "number" && exitCode !== 0 && !isToolNotFoundExit(exitCode);
|
|
1130
|
+
if (status === "error") return realExit ? "failed" : "unavailable";
|
|
1131
|
+
return typeof exitCode !== "number" ? "not_run" : exitCode === 0 ? "passed" : "failed";
|
|
1132
|
+
}
|
|
1133
|
+
function gateAttempt(status, evidence, unavailableReason) {
|
|
1134
|
+
return {
|
|
1135
|
+
status,
|
|
1136
|
+
...status === "unavailable" && unavailableReason ? { unavailableReason } : {},
|
|
1137
|
+
...evidence?.command ? { command: evidence.command } : {},
|
|
1138
|
+
...typeof evidence?.exitCode === "number" ? { exitCode: evidence.exitCode } : {}
|
|
1139
|
+
};
|
|
1140
|
+
}
|
|
1141
|
+
function findingGateAttempt(result, kind) {
|
|
1142
|
+
const finding = result.verification?.findings?.find((entry) => entry.kind === kind);
|
|
1143
|
+
if (!finding) return { status: "not_run" };
|
|
1144
|
+
const status = isUnavailableVerificationFinding(finding) ? "unavailable" : verdictStatus(void 0, finding.exitCode);
|
|
1145
|
+
return gateAttempt(status, finding, finding.unavailableReason);
|
|
1146
|
+
}
|
|
1147
|
+
function testGateVerdict(result, last, rawTouchedFailureStands) {
|
|
1148
|
+
const reason = result.verification?.findings?.find(
|
|
1149
|
+
(entry) => entry.kind === "test"
|
|
1150
|
+
)?.unavailableReason;
|
|
1151
|
+
const executed = result.testsExecuted;
|
|
1152
|
+
const raw = executed?.skipReason === "verification-unavailable" ? gateAttempt("unavailable", executed, reason) : executed?.scope === "none" ? gateAttempt("not_run", executed, reason) : gateAttempt(verdictStatus(result.testStatus, executed?.exitCode), executed, reason);
|
|
1153
|
+
const ran = (gate) => gate.status !== "unavailable" && gate.status !== "not_run";
|
|
1154
|
+
if (rawTouchedFailureStands && ran(raw) && raw.status !== "passed" || !last?.tests) return raw;
|
|
1155
|
+
const loop = gateAttempt(
|
|
1156
|
+
verdictStatus(last.tests.status, last.tests.exitCode),
|
|
1157
|
+
last.tests,
|
|
1158
|
+
reason
|
|
1159
|
+
);
|
|
1160
|
+
if (ran(loop)) return loop;
|
|
1161
|
+
return ran(raw) || raw.status === "unavailable" && loop.status === "not_run" ? raw : loop;
|
|
1162
|
+
}
|
|
1163
|
+
function gateSubject(channel, gate) {
|
|
1164
|
+
if (!gate.command) return channel;
|
|
1165
|
+
const lines = gate.command.split(/\s*\n\s*/).filter(Boolean);
|
|
1166
|
+
const label = channel === "build" && lines.length > 0 && lines.every((line) => describeVerificationCommand(line).kind === "typecheck") ? "typecheck" : channel;
|
|
1167
|
+
return `${label}: ${lines.join("; ")}`;
|
|
1168
|
+
}
|
|
1169
|
+
function describeGate(channel, gate) {
|
|
1170
|
+
const subject = gateSubject(channel, gate);
|
|
1171
|
+
const exit = gate.exitCode !== void 0 ? ` (exit ${gate.exitCode})` : "";
|
|
1172
|
+
if (gate.status === "timeout") return `${subject} timed out${exit}`;
|
|
1173
|
+
if (gate.status === "failed") return `${subject} failed${exit}`;
|
|
1174
|
+
return `${subject} unavailable${gate.unavailableReason ? ` (${gate.unavailableReason})` : ""}`;
|
|
1175
|
+
}
|
|
1176
|
+
function describePassedGate(channel, gate) {
|
|
1177
|
+
const subject = gateSubject(channel, gate);
|
|
1178
|
+
return `${subject} exited ${gate.exitCode ?? 0}`;
|
|
1179
|
+
}
|
|
1180
|
+
function verificationReason(status, gates, context) {
|
|
1181
|
+
if (status === "passed") return void 0;
|
|
1182
|
+
if (context.failedBeforeDelivery) return "execution failed before verification";
|
|
1183
|
+
if (context.baselineRegression) return "new failures compared with the base commit";
|
|
1184
|
+
const deciding = status === "not_run" ? ["unavailable"] : ["failed", "timeout"];
|
|
1185
|
+
for (const channel of ["test", "build", "lint"]) {
|
|
1186
|
+
if (!deciding.includes(gates[channel].status)) continue;
|
|
1187
|
+
const line = describeGate(channel, gates[channel]);
|
|
1188
|
+
return status === "baseline_clean" ? `${line}; the base commit fails the same way` : line;
|
|
1189
|
+
}
|
|
1190
|
+
if (status === "baseline_clean") return "the same failures are present on the base commit";
|
|
1191
|
+
if (status === "not_run") {
|
|
1192
|
+
const ranChannel = ["test", "build", "lint"].find(
|
|
1193
|
+
(channel) => gates[channel].status === "passed"
|
|
1194
|
+
);
|
|
1195
|
+
if (ranChannel) {
|
|
1196
|
+
return `${describePassedGate(ranChannel, gates[ranChannel])} but nothing corroborated that it ran, so it is not counted as verification`;
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
return status === "failed" ? "verification reported a failure" : "no verification ran";
|
|
1200
|
+
}
|
|
1201
|
+
function normalizeTestScope(scope) {
|
|
1202
|
+
return scope === "targeted" ? "touched" : scope ?? "none";
|
|
1203
|
+
}
|
|
1204
|
+
function hasVerifiedTouchedTestFailure(result) {
|
|
1205
|
+
if (normalizeTestScope(result.testsExecuted?.scope) !== "touched") return false;
|
|
1206
|
+
if (result.testStatus !== "failed" && result.testStatus !== "error" && result.testStatus !== "timeout") {
|
|
1207
|
+
return false;
|
|
1208
|
+
}
|
|
1209
|
+
if (result.testStatus === "timeout") return true;
|
|
1210
|
+
return typeof result.testsExecuted?.exitCode === "number" ? result.testsExecuted.exitCode !== 0 : true;
|
|
1211
|
+
}
|
|
1212
|
+
function repairOutcomeCanSupersedeRawTouchedFailure(result) {
|
|
1213
|
+
if (result.repairOutcome?.attempted !== true || result.repairOutcome.passed !== true) {
|
|
1214
|
+
return false;
|
|
1215
|
+
}
|
|
1216
|
+
return result.repairOutcome.classification === "mechanical" || result.repairOutcome.classification === "substantive_in_scope" || result.repairOutcome.classification === "scope_expanded";
|
|
1217
|
+
}
|
|
1218
|
+
function deriveVerificationStatus(result) {
|
|
1219
|
+
const executionStatus = deriveExecutionStatus(result);
|
|
1220
|
+
const hasChanges = hasVariantChangeEvidence(result);
|
|
1221
|
+
const failedBeforeDelivery = result.success === false && !hasChanges && (executionStatus === "crashed" || executionStatus === "failed" || executionStatus === "timed_out" || executionStatus === "canceled");
|
|
1222
|
+
const last = latestVerificationIteration(result.verificationLoop);
|
|
1223
|
+
const loopPassed = result.verificationLoop?.enabled ? result.verificationLoop.passed : null;
|
|
1224
|
+
const loopPromotable = result.verificationLoop?.enabled ? result.verificationLoop.bestIterationPromotable ?? result.verificationLoop.passed ?? false : null;
|
|
1225
|
+
const verificationPassed = loopPassed !== null ? loopPassed : result.verification?.passed ?? null;
|
|
1226
|
+
const testsExecuted = result.testsExecuted;
|
|
1227
|
+
const testsScope = testsExecuted?.scope;
|
|
1228
|
+
const rawTestStatus = result.testStatus;
|
|
1229
|
+
const corroboratedTestExecutionEvidence = Boolean(
|
|
1230
|
+
testsExecuted && testsScope !== "none" && hasRecordedTestExecutionEvidence({
|
|
1231
|
+
command: testsExecuted.command,
|
|
1232
|
+
filesTested: testsExecuted.filesTested,
|
|
1233
|
+
totalTests: result.testMetrics?.totalTests ?? 0,
|
|
1234
|
+
exitCode: testsExecuted.exitCode
|
|
1235
|
+
})
|
|
1236
|
+
);
|
|
1237
|
+
const directRunnerCleanPass = isDirectRunnerCleanPassRecord({
|
|
1238
|
+
scope: testsScope,
|
|
1239
|
+
command: testsExecuted?.command,
|
|
1240
|
+
commands: testsExecuted?.commands,
|
|
1241
|
+
exitCode: testsExecuted?.exitCode,
|
|
1242
|
+
testStatus: rawTestStatus,
|
|
1243
|
+
skipReason: testsExecuted?.skipReason,
|
|
1244
|
+
outputTail: testsExecuted?.outputTail
|
|
1245
|
+
});
|
|
1246
|
+
if (directRunnerCleanPass && !corroboratedTestExecutionEvidence) {
|
|
1247
|
+
directRunnerTrustLogger.debug("trusted direct-runner exit 0 pass without count corroboration", {
|
|
1248
|
+
command: testsExecuted?.command
|
|
1249
|
+
});
|
|
1250
|
+
}
|
|
1251
|
+
const hasTrustedTestExecutionEvidence = corroboratedTestExecutionEvidence || directRunnerCleanPass;
|
|
1252
|
+
const unrepairedTouchedTestFailure = hasVerifiedTouchedTestFailure(result) && !repairOutcomeCanSupersedeRawTouchedFailure(result);
|
|
1253
|
+
const rawTestExitFailure = typeof testsExecuted?.exitCode === "number" && testsExecuted.exitCode !== 0;
|
|
1254
|
+
const rawTestCountFailure = (result.testMetrics?.failedTests ?? 0) > 0;
|
|
1255
|
+
const rawTestStatusFailure = rawTestStatus === "failed" || rawTestStatus === "error" || rawTestStatus === "timeout";
|
|
1256
|
+
const verificationLoopTestsPassed = result.verificationLoop?.enabled === true && result.verificationLoop.passed === true && last?.tests !== void 0 && last.tests.status !== "unavailable" && last.tests.status !== "skipped" && last.tests.exitCode === 0;
|
|
1257
|
+
const staleRawTestArtifactFailure = !rawTestStatusFailure && verificationLoopTestsPassed && (rawTestExitFailure || rawTestCountFailure);
|
|
1258
|
+
const unrepairedRawTestFailure = (rawTestStatusFailure || rawTestExitFailure || rawTestCountFailure) && !staleRawTestArtifactFailure && (!hasUnavailableTestVerificationEvidence(result) || hasRecordedExecutedTestFailure(result)) && !repairOutcomeCanSupersedeRawTouchedFailure(result);
|
|
1259
|
+
const trustedTestStatus = unrepairedTouchedTestFailure ? "failed" : last?.tests !== void 0 ? last.tests.status === "unavailable" || last.tests.status === "skipped" ? null : last.tests.exitCode === 0 ? "passed" : "failed" : hasTrustedTestExecutionEvidence ? hasUnavailableTestVerificationEvidence(result) ? null : rawTestStatus === "passed" ? "passed" : rawTestStatus === "failed" || rawTestStatus === "error" || rawTestStatus === "timeout" ? "failed" : typeof testsExecuted?.exitCode === "number" ? testsExecuted.exitCode === 0 ? "passed" : "failed" : null : null;
|
|
1260
|
+
const buildGate = last?.build ? gateAttempt(verdictStatus(last.build.status, last.build.exitCode), last.build, void 0) : findingGateAttempt(result, "build");
|
|
1261
|
+
const lintGate = last?.lint ? gateAttempt(verdictStatus(last.lint.status, last.lint.exitCode), last.lint, void 0) : findingGateAttempt(result, "lint");
|
|
1262
|
+
const buildStatus = last?.build ? gateStatusFromArtifact(last.build.status, last.build.exitCode) : RECORDED_GATE_STATUS[buildGate.status];
|
|
1263
|
+
const lintStatus = last?.lint ? gateStatusFromArtifact(last.lint.status, last.lint.exitCode) : RECORDED_GATE_STATUS[lintGate.status];
|
|
1264
|
+
const testStatus = unrepairedTouchedTestFailure || unrepairedRawTestFailure ? "failed" : last?.tests !== void 0 ? last.tests.status === "unavailable" || last.tests.status === "skipped" ? "not_run" : gateStatusFromArtifact(last.tests.status, last.tests.exitCode) : testsScope === "none" ? "not_run" : trustedTestStatus ?? (verificationPassed === true && result.testsExecuted ? "passed" : "not_run");
|
|
1265
|
+
const baselineRegression = result.baselineComparison?.summary.shouldPenalize === true;
|
|
1266
|
+
const unavailableVerificationGate = hasVetoingUnavailableVerificationGateEvidence(result);
|
|
1267
|
+
const finalLintFailure = lintStatus === "failed" && result.verificationLoop?.enabled !== true;
|
|
1268
|
+
const directTestHasConcreteFailure = hasTrustedTestExecutionEvidence && (trustedTestStatus === "failed" || unrepairedRawTestFailure) && !isToolNotFoundExit(result.testsExecuted?.exitCode);
|
|
1269
|
+
const unavailableVerificationHasExecutedFailure = unavailableVerificationGate && hasConcreteExecutedGateFailure(result, {
|
|
1270
|
+
directTestFailure: directTestHasConcreteFailure,
|
|
1271
|
+
lastIteration: last
|
|
1272
|
+
});
|
|
1273
|
+
const failedChannels = new Set(
|
|
1274
|
+
unavailableVerificationHasExecutedFailure ? concreteExecutedFailureChannels(result, {
|
|
1275
|
+
directTestFailure: directTestHasConcreteFailure,
|
|
1276
|
+
lastIteration: last
|
|
1277
|
+
}) : []
|
|
1278
|
+
);
|
|
1279
|
+
if (trustedTestStatus === "failed" || unrepairedRawTestFailure) failedChannels.add("test");
|
|
1280
|
+
if (buildStatus === "failed") failedChannels.add("build");
|
|
1281
|
+
if (finalLintFailure) failedChannels.add("lint");
|
|
1282
|
+
const failuresExplainedByBase = failedChannels.size > 0 && !failedChannels.has("other") && baselineComparisonProvesCleanForChannels(result.baselineComparison, [
|
|
1283
|
+
...failedChannels
|
|
1284
|
+
]);
|
|
1285
|
+
const verificationIncompleteWithoutFailure = verificationPassed === false && result.verificationLoop?.enabled === true && result.verificationLoop.passedBaseline === true && (result.verification?.findings?.length ?? 0) === 0;
|
|
1286
|
+
let status;
|
|
1287
|
+
if (failedBeforeDelivery) {
|
|
1288
|
+
status = "not_run";
|
|
1289
|
+
} else if (baselineRegression) {
|
|
1290
|
+
status = "failed";
|
|
1291
|
+
} else if (unavailableVerificationHasExecutedFailure) {
|
|
1292
|
+
status = failuresExplainedByBase && result.baselineComparison?.summary.comparisonUnavailable !== void 0 ? "baseline_clean" : "failed";
|
|
1293
|
+
} else if (unavailableVerificationGate) {
|
|
1294
|
+
status = "not_run";
|
|
1295
|
+
} else if (trustedTestStatus === "failed" || unrepairedRawTestFailure) {
|
|
1296
|
+
status = failuresExplainedByBase ? "baseline_clean" : "failed";
|
|
1297
|
+
} else if (buildStatus === "failed") {
|
|
1298
|
+
status = failuresExplainedByBase ? "baseline_clean" : "failed";
|
|
1299
|
+
} else if (finalLintFailure) {
|
|
1300
|
+
status = failuresExplainedByBase ? "baseline_clean" : "failed";
|
|
1301
|
+
} else if (verificationPassed === true && testStatus === "passed") {
|
|
1302
|
+
status = "passed";
|
|
1303
|
+
} else if (verificationPassed === true && testStatus === "not_run") {
|
|
1304
|
+
status = "not_run";
|
|
1305
|
+
} else if (verificationPassed === false) {
|
|
1306
|
+
if (result.verificationLoop?.enabled && result.verificationLoop.iterations.length > 0) {
|
|
1307
|
+
status = loopPromotable === true ? "baseline_clean" : "not_run";
|
|
1308
|
+
} else {
|
|
1309
|
+
status = baselineComparisonProvesClean(result.baselineComparison) ? "baseline_clean" : "failed";
|
|
1310
|
+
}
|
|
1311
|
+
} else if (trustedTestStatus === "passed") {
|
|
1312
|
+
status = "passed";
|
|
1313
|
+
} else if ((!result.verificationLoop?.enabled || result.verificationLoop.iterations.length === 0) && baselineComparisonProvesClean(result.baselineComparison)) {
|
|
1314
|
+
status = "baseline_clean";
|
|
1315
|
+
} else {
|
|
1316
|
+
status = "not_run";
|
|
1317
|
+
}
|
|
1318
|
+
const offScopeGateConfig = result.offScopeGateConfig;
|
|
1319
|
+
const gateConfigUnverified = offScopeGateConfig !== void 0 && offScopeGateConfig.paths.length > 0 && isVerificationAccepted(status);
|
|
1320
|
+
if (gateConfigUnverified) status = "not_run";
|
|
1321
|
+
const deterministicGatesPassed = failedBeforeDelivery ? null : baselineRegression ? false : status === "not_run" ? null : status === "baseline_clean" ? null : buildStatus === "failed" ? false : finalLintFailure ? false : trustedTestStatus === "failed" || unrepairedRawTestFailure ? false : verificationPassed !== null && testStatus === "passed" ? verificationIncompleteWithoutFailure ? null : verificationPassed : trustedTestStatus === "passed" ? true : null;
|
|
1322
|
+
const deterministicVerdict = status === "baseline_clean" ? "baseline_clean" : deterministicGatesPassed === true ? "passed" : deterministicGatesPassed === false ? "failed" : status === "not_run" ? "not_run" : "no_data";
|
|
1323
|
+
const testGate = testGateVerdict(result, last, unrepairedTouchedTestFailure);
|
|
1324
|
+
const gates = { build: buildGate, lint: lintGate, test: testGate };
|
|
1325
|
+
for (const gate of failedGatesAlsoFailingOnBase(result.baselineComparison, {
|
|
1326
|
+
buildStatus: gates.build.status,
|
|
1327
|
+
lintStatus: gates.lint.status,
|
|
1328
|
+
testStatus: gates.test.status
|
|
1329
|
+
})) {
|
|
1330
|
+
gates[gate].alsoFailingOnBase = true;
|
|
1331
|
+
}
|
|
1332
|
+
return {
|
|
1333
|
+
status,
|
|
1334
|
+
reason: gateConfigUnverified ? offScopeGateConfig.reason : verificationReason(status, gates, { failedBeforeDelivery, baselineRegression }),
|
|
1335
|
+
gates,
|
|
1336
|
+
deterministicGatesPassed,
|
|
1337
|
+
outcome: deterministicVerdict,
|
|
1338
|
+
buildStatus,
|
|
1339
|
+
buildOutcome: buildStatus,
|
|
1340
|
+
lintStatus,
|
|
1341
|
+
testStatus,
|
|
1342
|
+
testOutcome: testStatus,
|
|
1343
|
+
testsScope
|
|
1344
|
+
};
|
|
1345
|
+
}
|
|
1346
|
+
function deriveRequirementOutcome(probeValidation) {
|
|
1347
|
+
if (!probeValidation) return void 0;
|
|
1348
|
+
const totalCount = Math.max(0, probeValidation.totalExamples ?? 0);
|
|
1349
|
+
const satisfiedCount = Math.max(0, Math.min(totalCount, probeValidation.matchedExamples ?? 0));
|
|
1350
|
+
let status;
|
|
1351
|
+
if (probeValidation.status === "passed") {
|
|
1352
|
+
status = "satisfied";
|
|
1353
|
+
} else if (probeValidation.status === "not_run" || probeValidation.status === "unavailable") {
|
|
1354
|
+
status = "unknown";
|
|
1355
|
+
} else if (satisfiedCount > 0 && satisfiedCount < totalCount) {
|
|
1356
|
+
status = "partial";
|
|
1357
|
+
} else {
|
|
1358
|
+
status = "unsatisfied";
|
|
1359
|
+
}
|
|
1360
|
+
return {
|
|
1361
|
+
status,
|
|
1362
|
+
source: "probe_validation",
|
|
1363
|
+
satisfiedCount,
|
|
1364
|
+
totalCount
|
|
1365
|
+
};
|
|
1366
|
+
}
|
|
1367
|
+
function deriveVariantOutcome(result) {
|
|
1368
|
+
const score = Number.isFinite(result.completeness) ? result.completeness : 0;
|
|
1369
|
+
const hasChanges = hasVariantChangeEvidence(result);
|
|
1370
|
+
return {
|
|
1371
|
+
execution: {
|
|
1372
|
+
status: deriveExecutionStatus(result),
|
|
1373
|
+
reason: result.terminationReason,
|
|
1374
|
+
exitCode: result.result?.exitCode
|
|
1375
|
+
},
|
|
1376
|
+
delivery: {
|
|
1377
|
+
status: deriveDeliveryStatus(score, hasChanges),
|
|
1378
|
+
score,
|
|
1379
|
+
hasChanges
|
|
1380
|
+
},
|
|
1381
|
+
requirements: deriveRequirementOutcome(result.probeValidation),
|
|
1382
|
+
verification: deriveVerificationStatus(result)
|
|
1383
|
+
};
|
|
1384
|
+
}
|
|
1385
|
+
function readVariantVerification(record) {
|
|
1386
|
+
const result = record;
|
|
1387
|
+
const stored = result.outcome?.verification;
|
|
1388
|
+
if (stored?.gates) return stored;
|
|
1389
|
+
const derived = deriveVerificationStatus(result);
|
|
1390
|
+
if (!stored) return derived;
|
|
1391
|
+
const gates = { ...derived.gates };
|
|
1392
|
+
const statusField = { build: "buildStatus", lint: "lintStatus", test: "testStatus" };
|
|
1393
|
+
for (const channel of ["build", "lint", "test"]) {
|
|
1394
|
+
const field = stored[statusField[channel]];
|
|
1395
|
+
if (field === void 0) continue;
|
|
1396
|
+
const recorded = verdictStatus(field);
|
|
1397
|
+
const rebuilt = RECORDED_GATE_STATUS[gates[channel].status];
|
|
1398
|
+
if (rebuilt !== RECORDED_GATE_STATUS[recorded] && rebuilt !== "failed") {
|
|
1399
|
+
gates[channel] = { status: recorded };
|
|
1400
|
+
}
|
|
1401
|
+
}
|
|
1402
|
+
for (const gate of failedGatesAlsoFailingOnBase(result.baselineComparison, {
|
|
1403
|
+
buildStatus: gates.build.status,
|
|
1404
|
+
lintStatus: gates.lint.status,
|
|
1405
|
+
testStatus: gates.test.status
|
|
1406
|
+
})) {
|
|
1407
|
+
gates[gate] = { ...gates[gate], alsoFailingOnBase: true };
|
|
1408
|
+
}
|
|
1409
|
+
return {
|
|
1410
|
+
...stored,
|
|
1411
|
+
gates,
|
|
1412
|
+
reason: stored.status === derived.status ? derived.reason : stored.reason
|
|
1413
|
+
};
|
|
1414
|
+
}
|
|
1415
|
+
function hasMeaningfulCompetitionProgress(result) {
|
|
1416
|
+
const outcome = result.outcome ?? deriveVariantOutcome(result);
|
|
1417
|
+
return isVerificationAccepted(outcome.verification.status) || outcome.execution.status === "completed" || outcome.delivery.hasChanges;
|
|
1418
|
+
}
|
|
1419
|
+
function deriveWinnerSelectionSource(judgeType, result) {
|
|
1420
|
+
const metadata = result?.metadata;
|
|
1421
|
+
const winnerSource = typeof metadata?.audit?.winnerSource === "string" ? metadata.audit.winnerSource : null;
|
|
1422
|
+
const selectionMode = typeof metadata?.winnerSelectionMetadata?.selectionMode === "string" ? metadata.winnerSelectionMetadata.selectionMode : null;
|
|
1423
|
+
const fromRanking = winnerSource === "ranking" || winnerSource === "ranking_first" || selectionMode === "ranking";
|
|
1424
|
+
if (judgeType === "ai") return fromRanking ? "ai-judge-ranking" : "ai-judge";
|
|
1425
|
+
if (judgeType === "multi-lens") return fromRanking ? "multi-lens-ranking" : "multi-lens";
|
|
1426
|
+
return "ai-judge";
|
|
1427
|
+
}
|
|
1428
|
+
function buildRejudgeResult(winner, decision, judged) {
|
|
1429
|
+
const metadata = judged?.find((variant) => variant.judgeEvaluation)?.judgeEvaluation?.metadata;
|
|
1430
|
+
return {
|
|
1431
|
+
winner,
|
|
1432
|
+
decision,
|
|
1433
|
+
...metadata?.model ? { model: metadata.model } : {},
|
|
1434
|
+
...metadata?.reportedModel ? { reportedModel: metadata.reportedModel } : {}
|
|
1435
|
+
};
|
|
1436
|
+
}
|
|
1437
|
+
|
|
1438
|
+
export {
|
|
1439
|
+
storedComparisonUnavailableChannels,
|
|
1440
|
+
isVerificationAccepted,
|
|
1441
|
+
verificationOutcomesFromGateArtifacts,
|
|
1442
|
+
detectGateRegressions,
|
|
1443
|
+
stableComparisonToBaselineComparison,
|
|
1444
|
+
compareVerificationOutcomeToBaseline,
|
|
1445
|
+
persistingIssuesOnBase,
|
|
1446
|
+
identicalToBaseLabel,
|
|
1447
|
+
markLintIdenticalToBase,
|
|
1448
|
+
trustedLoopBaselineComparison,
|
|
1449
|
+
variantGatesAlsoFailingOnBase,
|
|
1450
|
+
failedGatesAlsoFailingOnBase,
|
|
1451
|
+
createLogger,
|
|
1452
|
+
isIgnoredPlanningArtifactPath,
|
|
1453
|
+
baselineComparisonProvesClean,
|
|
1454
|
+
baselineComparisonProvesCleanForChannels,
|
|
1455
|
+
stableBaselineProvesClean,
|
|
1456
|
+
applyKnownFailureDowngrade,
|
|
1457
|
+
isToolNotFoundExit,
|
|
1458
|
+
isConcreteGateFailure,
|
|
1459
|
+
concreteExecutedFailureChannels,
|
|
1460
|
+
hasConcreteExecutedGateFailure,
|
|
1461
|
+
classifyExitZeroTestMetrics,
|
|
1462
|
+
recordedTestResultPredatesRepair,
|
|
1463
|
+
hasTestExecutionProvenance,
|
|
1464
|
+
normalizeRecordedTestStatus,
|
|
1465
|
+
hasUnrecognizedRecordedTestStatus,
|
|
1466
|
+
hasRecordedTestExecutionEvidence,
|
|
1467
|
+
recordedTestCommands,
|
|
1468
|
+
latestVerificationIteration,
|
|
1469
|
+
hasUnavailableVerificationGateEvidence,
|
|
1470
|
+
hasVetoingUnavailableVerificationGateEvidence,
|
|
1471
|
+
hasUnavailableTestVerificationEvidence,
|
|
1472
|
+
hasVerifiedTouchedTestFailure,
|
|
1473
|
+
repairOutcomeCanSupersedeRawTouchedFailure,
|
|
1474
|
+
deriveVariantOutcome,
|
|
1475
|
+
readVariantVerification,
|
|
1476
|
+
hasMeaningfulCompetitionProgress,
|
|
1477
|
+
deriveWinnerSelectionSource,
|
|
1478
|
+
buildRejudgeResult
|
|
1479
|
+
};
|
|
1480
|
+
//# sourceMappingURL=chunk-3OPP2OZB.js.map
|