@maycombhq/atticus 2.0.0-beta.2 → 2.0.0-beta.22
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/dist/bin.js +8 -4
- package/dist/chunk-23XVSEV5.js +49 -0
- package/dist/{chunk-ZDPAS56H.js → chunk-24OXGB3P.js} +8 -2
- package/dist/{chunk-7EOBHUMC.js → chunk-24XLDU72.js} +4 -3
- package/dist/{chunk-CR3MTH32.js → chunk-2F4CYZKJ.js} +86 -11
- package/dist/{chunk-6IU67AEK.js → chunk-2GF7OLF3.js} +23 -15
- package/dist/chunk-2IIMFOPM.js +41 -0
- package/dist/chunk-2LGRMVCA.js +617 -0
- package/dist/{chunk-XPCM366L.js → chunk-2MMCFP5C.js} +10 -8
- package/dist/{chunk-JBTK5OP2.js → chunk-2Q56PQPS.js} +6 -4
- package/dist/{chunk-Z6LF7HQN.js → chunk-2Q5EDGEO.js} +7 -5
- package/dist/{chunk-3USYZGRF.js → chunk-2RLKFUUL.js} +38 -27
- package/dist/chunk-2SKB4O2E.js +59 -0
- package/dist/{chunk-SP2I63OO.js → chunk-34S2WGOB.js} +87 -4
- package/dist/{chunk-GQ4N4WKF.js → chunk-3NFFJL5D.js} +33 -27
- package/dist/{chunk-SJRGMG6A.js → chunk-3NWDLGG6.js} +28 -25
- package/dist/{chunk-4WBVUHXN.js → chunk-3RM4UK6W.js} +20 -18
- package/dist/chunk-42SIDKEU.js +583 -0
- package/dist/{chunk-GLUX4EEP.js → chunk-4EURQWQD.js} +20 -15
- package/dist/chunk-4U276ICE.js +39 -0
- package/dist/{chunk-ZMFPW66A.js → chunk-53T4O55J.js} +4 -3
- package/dist/{chunk-6J5OKA4Y.js → chunk-57TDNMI3.js} +17 -15
- package/dist/chunk-5BD2KYLE.js +57 -0
- package/dist/{chunk-7EFILTCI.js → chunk-5F7GFN2F.js} +28 -0
- package/dist/chunk-5NMKONLP.js +95 -0
- package/dist/{chunk-7ZUIMTOU.js → chunk-5SJZW52K.js} +26 -24
- package/dist/{chunk-4RS5KZQD.js → chunk-63YRMR6J.js} +6 -5
- package/dist/chunk-66PPNOON.js +62 -0
- package/dist/chunk-6H3Z5JHH.js +64 -0
- package/dist/{chunk-CEXSU4S6.js → chunk-6MUGR4LS.js} +775 -89
- package/dist/{chunk-QSXK2RGH.js → chunk-6OJQOPUN.js} +5 -3
- package/dist/{chunk-MVZVGYXH.js → chunk-6PPOWY5E.js} +84 -14
- package/dist/{chunk-7EKXJZ2Y.js → chunk-6ZGLAACW.js} +299 -38
- package/dist/chunk-6ZJ5A7AF.js +222 -0
- package/dist/{chunk-L24C55VN.js → chunk-745DAZ4L.js} +142 -30
- package/dist/{chunk-Q4D5X7QB.js → chunk-7ASNL4Q4.js} +46 -24
- package/dist/chunk-7BR7IPOH.js +35 -0
- package/dist/{chunk-7WD63HU2.js → chunk-7DOR27HL.js} +6 -6
- package/dist/chunk-7FTTA3HD.js +341 -0
- package/dist/{chunk-OLQJTJJU.js → chunk-7GJS6DNX.js} +12 -3
- package/dist/{chunk-7JUKDRSZ.js → chunk-7IGKHZ4Z.js} +347 -226
- package/dist/{chunk-G2B4ZQGH.js → chunk-7IOWA5D5.js} +11 -6
- package/dist/{chunk-EBEW3XXQ.js → chunk-7JITZFJC.js} +7 -5
- package/dist/chunk-7MJSQTL5.js +174 -0
- package/dist/{chunk-I4JRCD6M.js → chunk-7UOMVMFG.js} +25 -17
- package/dist/{chunk-YY6ZQQBP.js → chunk-AFWUDXEM.js} +19 -7
- package/dist/chunk-AFZ3QA6W.js +47 -0
- package/dist/chunk-AJQ72EBM.js +420 -0
- package/dist/chunk-AJYXNTNZ.js +317 -0
- package/dist/chunk-AVTBS4OW.js +49 -0
- package/dist/{chunk-FHH4I4ZV.js → chunk-BDKC6H5P.js} +12 -6
- package/dist/{chunk-IPKHE5D6.js → chunk-BEVTIBRH.js} +1526 -875
- package/dist/chunk-BHT7QK4G.js +162 -0
- package/dist/{chunk-6JUBZBMW.js → chunk-BIGDQDHD.js} +6 -4
- package/dist/{chunk-2BFCZ3RK.js → chunk-BO4KX37X.js} +20 -18
- package/dist/chunk-BPK5P77O.js +115 -0
- package/dist/chunk-BQ4SQQC6.js +59 -0
- package/dist/chunk-BQGDB6ZL.js +7342 -0
- package/dist/{chunk-2ANOROX3.js → chunk-BTGPE6CR.js} +11 -9
- package/dist/chunk-BTY3HZBO.js +93 -0
- package/dist/{chunk-DPZHZQKE.js → chunk-BXYMYEJ4.js} +44 -10
- package/dist/{chunk-2RMYG36Q.js → chunk-C3RY6KU6.js} +309 -346
- package/dist/chunk-C4R4JLHE.js +40 -0
- package/dist/chunk-CADWLE2T.js +18 -0
- package/dist/chunk-CBGGOQWU.js +82 -0
- package/dist/chunk-CMDXGQTS.js +47 -0
- package/dist/{chunk-MC3H7736.js → chunk-CQDGOPGH.js} +58 -18
- package/dist/{chunk-HFQCFSJR.js → chunk-CX4RZ2KS.js} +4 -3
- package/dist/{chunk-PAMPPUR6.js → chunk-CXJ6FUKN.js} +1852 -207
- package/dist/{chunk-ABWHYWNI.js → chunk-D73UEXYW.js} +3 -3
- package/dist/chunk-DCZWQLYT.js +1205 -0
- package/dist/chunk-DLOBCJL6.js +48 -0
- package/dist/{chunk-4BN53TG3.js → chunk-DOBQKHIF.js} +31 -23
- package/dist/chunk-E3ISYXO3.js +423 -0
- package/dist/{chunk-7SW2QWLU.js → chunk-E6ZIEVOI.js} +16 -13
- package/dist/chunk-EBL2R3YG.js +43 -0
- package/dist/{chunk-AIOQPLA5.js → chunk-EGQRREQH.js} +41 -15
- package/dist/chunk-EHA7RMZ3.js +58 -0
- package/dist/{chunk-M766ZJ6W.js → chunk-EIPTLPFC.js} +38 -27
- package/dist/chunk-EMRIQUND.js +517 -0
- package/dist/{chunk-DFBCSHVT.js → chunk-EPCJQQWD.js} +6 -4
- package/dist/{chunk-RZPYKDWS.js → chunk-F3P7N7SF.js} +1 -1
- package/dist/{chunk-R77KLRB3.js → chunk-FFLNS6VP.js} +21 -18
- package/dist/chunk-FFTRTL6R.js +26 -0
- package/dist/{chunk-IHMLFRVV.js → chunk-FPJPLKDW.js} +62 -16
- package/dist/{chunk-JCZIKA4C.js → chunk-FSMSFDLD.js} +5 -4
- package/dist/{chunk-AVJDSJ2F.js → chunk-FUJM6RTF.js} +8 -7
- package/dist/chunk-FZOJFH7Q.js +132 -0
- package/dist/{chunk-QRAOANID.js → chunk-G6X77UJZ.js} +23 -21
- package/dist/{chunk-3ALD2W2A.js → chunk-GCWRWSU7.js} +10 -4
- package/dist/chunk-GIW4ZVDB.js +39 -0
- package/dist/{chunk-B2WLAWNJ.js → chunk-GUX3PTYM.js} +3 -3
- package/dist/{chunk-DPUYDDQG.js → chunk-GZY6RUZ6.js} +25 -3
- package/dist/chunk-H4VO6WG3.js +10 -0
- package/dist/{chunk-MMOSZPWJ.js → chunk-H5HBGNXU.js} +5 -4
- package/dist/chunk-H7KM7LZE.js +229 -0
- package/dist/{chunk-AA6YULYB.js → chunk-HNM2YQT2.js} +7 -7
- package/dist/{chunk-3C7EYRFZ.js → chunk-HYU5VLGA.js} +1 -1
- package/dist/{chunk-XY3P7JW7.js → chunk-IDKCWSM5.js} +1032 -172
- package/dist/chunk-IFKEI4SA.js +237 -0
- package/dist/{chunk-F7HYOUFF.js → chunk-IGOE6KPG.js} +67 -22
- package/dist/{chunk-TDD55CJH.js → chunk-IH2XURVQ.js} +6 -5
- package/dist/chunk-INQHESFB.js +38 -0
- package/dist/chunk-IP74LCOQ.js +57 -0
- package/dist/chunk-IPHHDDC6.js +45 -0
- package/dist/{chunk-T6AIP7H5.js → chunk-ISUAAMGS.js} +110 -153
- package/dist/{chunk-A7UPUQFY.js → chunk-IUPG3UKI.js} +624 -319
- package/dist/{chunk-L6SGQIR3.js → chunk-IVBOQAGB.js} +7 -3
- package/dist/{chunk-27NKUS3X.js → chunk-J2JAKCIW.js} +2205 -796
- package/dist/{chunk-V2YTAIQO.js → chunk-J3IOLXWM.js} +24 -7
- package/dist/chunk-JA5FI3QV.js +142 -0
- package/dist/chunk-JAVI7JSP.js +49 -0
- package/dist/{chunk-HLJAXMM4.js → chunk-JB5LINEM.js} +6 -2
- package/dist/{chunk-2VHF7OXM.js → chunk-JENSEMXF.js} +1 -1
- package/dist/{chunk-6BVONWJ7.js → chunk-JJF6HALY.js} +4 -3
- package/dist/chunk-JLUCKAEL.js +38 -0
- package/dist/chunk-JRBFANFE.js +221 -0
- package/dist/{chunk-R6XF6UR3.js → chunk-KDNTAPLX.js} +4 -4
- package/dist/chunk-KFAVQZSX.js +33 -0
- package/dist/chunk-KJXD4PNL.js +50 -0
- package/dist/chunk-KN5BXMWN.js +44 -0
- package/dist/{chunk-PCVDV3UZ.js → chunk-KQGURXFU.js} +9 -7
- package/dist/{chunk-WY6PP6AA.js → chunk-KXITGYLF.js} +40 -6
- package/dist/{chunk-66YVAGGM.js → chunk-L27SV425.js} +22 -20
- package/dist/{chunk-NE2W3OO7.js → chunk-LDLL7LB3.js} +24 -22
- package/dist/chunk-LFGTYX5U.js +379 -0
- package/dist/{chunk-EYWIDJFU.js → chunk-LGBMTVNT.js} +7 -5
- package/dist/{chunk-Q5AMFEWD.js → chunk-LGFL54FP.js} +3 -2
- package/dist/{chunk-6TACQN3N.js → chunk-LJXMYKZJ.js} +7 -5
- package/dist/{chunk-BKVWTZ6A.js → chunk-LKOR5UET.js} +29 -26
- package/dist/chunk-LNBQOP7D.js +294 -0
- package/dist/{chunk-O3WI5KWW.js → chunk-LO6P2VYG.js} +2 -2
- package/dist/chunk-LQJPN536.js +122 -0
- package/dist/{chunk-YEDDOYSC.js → chunk-LYBNHMVZ.js} +29 -5
- package/dist/{chunk-A3GY6SOA.js → chunk-LZ7NUC62.js} +20 -18
- package/dist/chunk-M32BLWDH.js +37 -0
- package/dist/{chunk-VYDBJ73M.js → chunk-M3NANSDZ.js} +17 -15
- package/dist/chunk-MFHL5URL.js +31 -0
- package/dist/chunk-MFR5OPBD.js +109 -0
- package/dist/{chunk-DE76JROX.js → chunk-MG4ZL5RW.js} +32 -20
- package/dist/{chunk-N7IXEHK3.js → chunk-MO6P2JZH.js} +10 -8
- package/dist/{chunk-65NYPGRC.js → chunk-MUWDB4R4.js} +1 -1
- package/dist/chunk-MZCGSXVR.js +34 -0
- package/dist/{chunk-MGYZM27B.js → chunk-N3XIYPU3.js} +51 -23
- package/dist/chunk-NDCF4R6S.js +172 -0
- package/dist/{chunk-DHPACDG7.js → chunk-NR2UJWOC.js} +10 -8
- package/dist/chunk-NXJ5URP6.js +51 -0
- package/dist/{chunk-UNM6ZOKP.js → chunk-NY2XSR5K.js} +147 -18
- package/dist/{chunk-5GDRCDQB.js → chunk-O45HFTFS.js} +3 -2
- package/dist/{chunk-ONLS5QA5.js → chunk-O4GXGGBX.js} +14 -12
- package/dist/chunk-O5PXQR67.js +249 -0
- package/dist/{chunk-PRPPGYZG.js → chunk-O66DM6DJ.js} +6 -4
- package/dist/{chunk-KEM4SDDP.js → chunk-O7FDLW7L.js} +11 -8
- package/dist/{chunk-T2UYZSCQ.js → chunk-O7XLYEFA.js} +169 -29
- package/dist/{chunk-FITWGOJ2.js → chunk-OHNCWBKF.js} +4 -4
- package/dist/{chunk-652QWTLZ.js → chunk-OHVTTOPS.js} +3 -3
- package/dist/chunk-OMI6FPPN.js +43 -0
- package/dist/chunk-ONUPY3H6.js +53 -0
- package/dist/chunk-OTLDSZDV.js +69 -0
- package/dist/chunk-OUBGGKDU.js +22 -0
- package/dist/chunk-OWNCM4ZN.js +330 -0
- package/dist/{chunk-YISXLPHN.js → chunk-P2V7QW4D.js} +235 -35
- package/dist/{chunk-CNUKCS2T.js → chunk-P32RUW3B.js} +1632 -93
- package/dist/{chunk-BWZ77RQT.js → chunk-PAQ2AS5E.js} +1 -1
- package/dist/{chunk-ZMAINWBW.js → chunk-PBPBMP2B.js} +4 -3
- package/dist/{chunk-ZVM6AKKM.js → chunk-PJSJPMJI.js} +3 -3
- package/dist/{chunk-EFHQ3TWP.js → chunk-PKBHS4AA.js} +233 -56
- package/dist/{chunk-GT4I4ZWM.js → chunk-PMUAJGLI.js} +20 -16
- package/dist/chunk-PPD7HTDP.js +152 -0
- package/dist/chunk-PSOFBQWB.js +42 -0
- package/dist/{chunk-S2A7YC3Q.js → chunk-Q2TECDIT.js} +10694 -8896
- package/dist/chunk-Q4K5WB2W.js +42 -0
- package/dist/{chunk-UGLN7QHV.js → chunk-Q6DFNVRJ.js} +14 -12
- package/dist/chunk-QA4O2GGC.js +265 -0
- package/dist/chunk-QAXW2N3B.js +1216 -0
- package/dist/chunk-QBNWF5ZU.js +19 -0
- package/dist/chunk-QFWA2DPH.js +224 -0
- package/dist/{chunk-23W7VWKR.js → chunk-QKUJMING.js} +1363 -114
- package/dist/{chunk-NXFPS2LR.js → chunk-R44CYFPV.js} +16 -13
- package/dist/{chunk-CKSITVS4.js → chunk-R7NYHMUU.js} +2687 -786
- package/dist/chunk-REWWDVQB.js +162 -0
- package/dist/{chunk-JMSCMUCA.js → chunk-RGERPOIV.js} +145 -21
- package/dist/{chunk-6JCPI55B.js → chunk-RLDGWLQ7.js} +49 -7
- package/dist/chunk-RUGXBPWI.js +384 -0
- package/dist/{chunk-CPA6HPVR.js → chunk-RXPJMEOW.js} +18 -12
- package/dist/{chunk-3HI6Z55Y.js → chunk-S4PMJU6H.js} +339 -43
- package/dist/chunk-S5LSDXV4.js +40 -0
- package/dist/chunk-S7FCV7S5.js +51 -0
- package/dist/{chunk-5GGOLAKC.js → chunk-SDKLKB6I.js} +28 -26
- package/dist/chunk-SFSPGFCV.js +62 -0
- package/dist/{chunk-ZNCEKR4J.js → chunk-SFUP7TTO.js} +12 -8
- package/dist/{chunk-64EQYWCA.js → chunk-SLXZOMA6.js} +69 -19
- package/dist/chunk-SQV37XO2.js +273 -0
- package/dist/{chunk-K65BJIMT.js → chunk-SU74NDMQ.js} +19 -17
- package/dist/chunk-SYV5LHML.js +165 -0
- package/dist/chunk-T4YPZIQN.js +36 -0
- package/dist/chunk-T6DQR5TV.js +323 -0
- package/dist/{chunk-JIITQXFB.js → chunk-THDMSZ3R.js} +3075 -802
- package/dist/{chunk-JGZCG5VM.js → chunk-TNR75OXT.js} +7 -7
- package/dist/{chunk-D3PO4DOZ.js → chunk-TUULXQRW.js} +174 -15
- package/dist/chunk-TYQBFTBR.js +516 -0
- package/dist/chunk-U76OWS3Q.js +49 -0
- package/dist/{chunk-YYQN46FY.js → chunk-UCROWG2D.js} +27 -24
- package/dist/{chunk-6M5NK3K3.js → chunk-UF4AZOZB.js} +50 -10
- package/dist/chunk-UF4GLFBX.js +345 -0
- package/dist/{chunk-OT2O76OS.js → chunk-UGUP3ZM6.js} +240 -39
- package/dist/chunk-UNAGJYET.js +45 -0
- package/dist/{chunk-5WG5YP4T.js → chunk-UOR2DTHH.js} +16 -14
- package/dist/{chunk-S3QNRWYR.js → chunk-UPOY4YSQ.js} +14 -12
- package/dist/{chunk-EPTBZ3GP.js → chunk-UPS2DGFC.js} +1 -1
- package/dist/{chunk-4AK7IBVP.js → chunk-UUU4CLJG.js} +4 -2
- package/dist/{chunk-W3BQAZ3Q.js → chunk-UWMJKX5U.js} +14 -12
- package/dist/{chunk-QZSX3F7C.js → chunk-UWOJLHFT.js} +27 -23
- package/dist/chunk-VBTP56CE.js +535 -0
- package/dist/chunk-VCTWPLAO.js +211 -0
- package/dist/chunk-VNU26RCO.js +1215 -0
- package/dist/{chunk-CSZ4C5N6.js → chunk-VTZMAJ3W.js} +93 -10
- package/dist/{chunk-TXLH6WHQ.js → chunk-VW62D6QE.js} +14 -12
- package/dist/{chunk-CAQZUNOH.js → chunk-VY72R2XZ.js} +610 -3
- package/dist/{chunk-2DIQQJCB.js → chunk-VZALIKIF.js} +18 -15
- package/dist/{chunk-TYAID7B7.js → chunk-W62H2XSO.js} +25 -23
- package/dist/{chunk-HVUPKCGJ.js → chunk-W7VWI2YH.js} +9 -6
- package/dist/{chunk-TANFV3MZ.js → chunk-WERM6KPJ.js} +7 -4
- package/dist/{chunk-BOHJZTEQ.js → chunk-WF7B67YE.js} +208 -87
- package/dist/{chunk-7FBGJFEE.js → chunk-WG5U3F5V.js} +14 -12
- package/dist/{chunk-4NDAAFQT.js → chunk-WJF2CS6M.js} +8 -5
- package/dist/{chunk-XAKWMCXI.js → chunk-WKUJ3KPV.js} +4 -4
- package/dist/chunk-WMTRHUI5.js +103 -0
- package/dist/chunk-WNKPRSGI.js +36 -0
- package/dist/chunk-WXFLMQSR.js +223 -0
- package/dist/{chunk-RRTKKSLQ.js → chunk-X3WY6MN3.js} +8 -6
- package/dist/{chunk-ZCJDOK2S.js → chunk-X4CXA2IL.js} +47 -23
- package/dist/{chunk-UBBC2XSG.js → chunk-X5F3Q5LV.js} +560 -105
- package/dist/{chunk-C6EKFH7J.js → chunk-XD75VZIH.js} +9 -7
- package/dist/chunk-XERYFDB5.js +297 -0
- package/dist/chunk-XI2LCCYQ.js +420 -0
- package/dist/chunk-Y2EQNWKV.js +933 -0
- package/dist/{chunk-LR3R6Z2A.js → chunk-YHCMZC2J.js} +7 -7
- package/dist/chunk-YYY3AZFE.js +122 -0
- package/dist/{chunk-GDLULHTC.js → chunk-Z5IA3WDR.js} +19 -31
- package/dist/{chunk-T6XQL73F.js → chunk-ZFFYNRIO.js} +63 -23
- package/dist/{chunk-EDS2L2LD.js → chunk-ZFL7NY4F.js} +56 -27
- package/dist/{chunk-YMZ3TNYB.js → chunk-ZGULQAPZ.js} +7 -4
- package/dist/{chunk-4SKZDI62.js → chunk-ZIUFM5HT.js} +3 -1
- package/dist/{chunk-DKJA76CJ.js → chunk-ZJFRMSJT.js} +15 -13
- package/dist/chunk-ZJXLNDH4.js +239 -0
- package/dist/chunk-ZQ3ON2VQ.js +252 -0
- package/dist/{chunk-HITVBIJS.js → chunk-ZQ7SKESZ.js} +150 -415
- package/dist/{chunk-6QSERWXH.js → chunk-ZQXZ2SES.js} +24 -21
- package/dist/chunk-ZX57KSEQ.js +39 -0
- package/dist/{chunk-I3E7CX4H.js → chunk-ZZK56BLP.js} +5 -3
- package/dist/files.json +664 -368
- package/dist/packages/naysayer/constitution/constitution.yaml +19 -0
- package/dist/packages/sdk/npm/index.js +6194 -2542
- package/dist/packages/ui/dist/assets/{elk-api-tma0MCuh.js → elk-api-CIf-0gz5.js} +2 -2
- package/dist/packages/ui/dist/assets/index-CoK_Dl0D.js +47 -0
- package/dist/packages/ui/dist/assets/index-Dw20IRhQ.css +1 -0
- package/dist/packages/ui/dist/index.html +3 -2
- package/package.json +5 -5
- package/dist/chunk-2BF2EYJV.js +0 -174
- package/dist/chunk-42EVSKME.js +0 -37
- package/dist/chunk-4BKGMUIK.js +0 -53
- package/dist/chunk-5KLGBXG5.js +0 -48
- package/dist/chunk-6BNC6EQ4.js +0 -41
- package/dist/chunk-6D2CQ5II.js +0 -41
- package/dist/chunk-7AVHLZGD.js +0 -45
- package/dist/chunk-D46WUV3T.js +0 -33
- package/dist/chunk-E36QOJMD.js +0 -47
- package/dist/chunk-FQXYPF7E.js +0 -147
- package/dist/chunk-GBRFVT63.js +0 -45
- package/dist/chunk-ICY36XCH.js +0 -34
- package/dist/chunk-J4K3KVLD.js +0 -131
- package/dist/chunk-JZU3H6UQ.js +0 -54
- package/dist/chunk-NN2ZQEB4.js +0 -38
- package/dist/chunk-PCOCACY3.js +0 -385
- package/dist/chunk-RTEYOSJY.js +0 -29
- package/dist/chunk-RUVFXE2L.js +0 -666
- package/dist/chunk-RVH5SUW5.js +0 -69
- package/dist/chunk-VN3DP4LQ.js +0 -43
- package/dist/chunk-W5BVQF44.js +0 -36
- package/dist/chunk-WVPJSRRJ.js +0 -52
- package/dist/chunk-XPTOBS2D.js +0 -48
- package/dist/packages/ui/dist/assets/index-B54fm9FQ.js +0 -29
- package/dist/packages/ui/dist/assets/index-DD_hufQz.css +0 -1
|
@@ -12,64 +12,82 @@ import {
|
|
|
12
12
|
changeTypeOf,
|
|
13
13
|
checkFindings,
|
|
14
14
|
loadChangeContext,
|
|
15
|
+
outsideKindOf,
|
|
16
|
+
outsideSystemsOf,
|
|
15
17
|
phaseGates,
|
|
16
18
|
statePhase
|
|
17
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-IDKCWSM5.js";
|
|
18
20
|
import {
|
|
19
21
|
daysBetween,
|
|
20
22
|
knowledgeGaps,
|
|
21
23
|
newestEvidence
|
|
22
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-745DAZ4L.js";
|
|
23
25
|
import {
|
|
24
26
|
BREAKING_SPEC,
|
|
25
27
|
INSTRUCTION_RULES,
|
|
26
28
|
PERSONAL_DATA_SPEC,
|
|
27
29
|
buildContextPack,
|
|
28
|
-
estimateTokens,
|
|
29
30
|
personalItem,
|
|
30
31
|
quarantineItems,
|
|
31
32
|
screenText,
|
|
32
33
|
settle,
|
|
33
34
|
toRunSummary
|
|
34
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-P32RUW3B.js";
|
|
35
36
|
import {
|
|
37
|
+
ASKED_GAP_STEP,
|
|
36
38
|
AgentDefinition,
|
|
37
39
|
ChecklistPack,
|
|
38
40
|
ChecklistRule,
|
|
39
41
|
CriticQuestion,
|
|
40
42
|
Finding,
|
|
41
43
|
FindingAction,
|
|
44
|
+
HOSTS_STEP,
|
|
42
45
|
IsoDateTime,
|
|
46
|
+
JOINED_BY_AI,
|
|
43
47
|
LEGACY_LENSES,
|
|
44
48
|
Lens,
|
|
45
49
|
PHASES,
|
|
50
|
+
QUESTION_SCHEMA_VERSION,
|
|
51
|
+
Question,
|
|
46
52
|
RECORD_KINDS,
|
|
47
53
|
RecordId,
|
|
54
|
+
answerByWords,
|
|
48
55
|
answerWords,
|
|
56
|
+
askedGapQuestionId,
|
|
49
57
|
assistantActor,
|
|
58
|
+
callsOfQuestion,
|
|
50
59
|
changesDirOf,
|
|
51
60
|
changesRelOf,
|
|
61
|
+
estimateTokens,
|
|
52
62
|
external_exports,
|
|
53
63
|
fileJudgments,
|
|
54
64
|
findingPath,
|
|
55
65
|
gateRoundLimit,
|
|
66
|
+
hostOfQuestion,
|
|
56
67
|
isAssistantResolution,
|
|
57
68
|
isCriticQuestion,
|
|
69
|
+
isLinkQuestion,
|
|
58
70
|
judgmentKey,
|
|
59
71
|
lensCovers,
|
|
60
72
|
listQuestions,
|
|
61
73
|
orgPackDirOf,
|
|
62
74
|
orgPackRelOf,
|
|
63
75
|
questionOfLens,
|
|
76
|
+
questionsRelOf,
|
|
64
77
|
quotedIn,
|
|
65
|
-
|
|
78
|
+
readQuestion,
|
|
79
|
+
repoReadOf,
|
|
66
80
|
runsDirOf,
|
|
67
81
|
stateDirOf,
|
|
68
|
-
toCanonicalYaml
|
|
69
|
-
|
|
82
|
+
toCanonicalYaml,
|
|
83
|
+
writeQuestion
|
|
84
|
+
} from "./chunk-Q2TECDIT.js";
|
|
70
85
|
import {
|
|
71
86
|
writeFileAtomic
|
|
72
|
-
} from "./chunk-
|
|
87
|
+
} from "./chunk-TUULXQRW.js";
|
|
88
|
+
import {
|
|
89
|
+
require_dist
|
|
90
|
+
} from "./chunk-BQGDB6ZL.js";
|
|
73
91
|
import {
|
|
74
92
|
__toESM
|
|
75
93
|
} from "./chunk-TV45EUGM.js";
|
|
@@ -610,7 +628,8 @@ function catalogEvidence(ctx, id) {
|
|
|
610
628
|
recordEvidence(id),
|
|
611
629
|
...file ? [
|
|
612
630
|
{
|
|
613
|
-
|
|
631
|
+
// ADR 0181: an AI evidence cites the call's own code line; a finding names it as code.
|
|
632
|
+
source: file.source === "ai" ? "code" : file.source,
|
|
614
633
|
path: file.path,
|
|
615
634
|
...file.repo ? { repo: file.repo } : {},
|
|
616
635
|
...file.line ? { line: file.line } : {}
|
|
@@ -637,7 +656,7 @@ var observabilityPresent = {
|
|
|
637
656
|
const design = docOf(ctx.files, "design.md");
|
|
638
657
|
for (const id of ctx.footprint.components) {
|
|
639
658
|
const c = ctx.get("Component", id);
|
|
640
|
-
if (!c || ctx.
|
|
659
|
+
if (!c || ctx.outsideOf(c.system) === "vendor")
|
|
641
660
|
continue;
|
|
642
661
|
const assets = ctx.records.filter((r) => r.kind === "ObservabilityAsset" && r.component === id && kinds.includes(r.assetKind));
|
|
643
662
|
const planned = design && contentLines(design).some((l) => l.text.toLowerCase().includes(id) && kinds.some((k) => l.text.toLowerCase().includes(k)));
|
|
@@ -720,7 +739,7 @@ var knowledgeCheck = {
|
|
|
720
739
|
}
|
|
721
740
|
const subjects = [...fp.components, ...fp.systems].filter((id) => {
|
|
722
741
|
const sys = ctx.systemOf(id);
|
|
723
|
-
return !sys || ctx.
|
|
742
|
+
return !sys || ctx.outsideOf(sys) !== "vendor";
|
|
724
743
|
});
|
|
725
744
|
return { hits, subjects };
|
|
726
745
|
}
|
|
@@ -803,7 +822,7 @@ var factKnown = {
|
|
|
803
822
|
var vendorOperationKnown = {
|
|
804
823
|
id: "vendor-operation-known",
|
|
805
824
|
question: "true",
|
|
806
|
-
description: "Each new or changed call to a vendor uses an operation in
|
|
825
|
+
description: "Each new or changed call to a vendor, or to another team's system, uses an operation in its published spec (as read into the catalog).",
|
|
807
826
|
params: external_exports.strictObject({}),
|
|
808
827
|
run(ctx) {
|
|
809
828
|
const doc = docOf(ctx.files, "interfaces.md");
|
|
@@ -811,15 +830,20 @@ var vendorOperationKnown = {
|
|
|
811
830
|
const subjects = /* @__PURE__ */ new Set();
|
|
812
831
|
if (!doc)
|
|
813
832
|
return { hits, subjects: [] };
|
|
833
|
+
const ofSystem = (component, sys) => ctx.systemOf(component) === sys || component === sys;
|
|
814
834
|
for (const h of ctx.hops) {
|
|
815
835
|
if (h.status !== "planned-new" && h.status !== "planned-modify")
|
|
816
836
|
continue;
|
|
817
837
|
const sys = ctx.systemOf(h.callee);
|
|
818
|
-
|
|
838
|
+
const outside = sys ? ctx.outsideOf(sys) : void 0;
|
|
839
|
+
if (!sys || !outside || !h.method || !h.path)
|
|
840
|
+
continue;
|
|
841
|
+
const vendor = outside === "vendor";
|
|
842
|
+
if (!vendor && !ctx.records.some((r) => r.kind === "Endpoint" && ofSystem(r.component, sys)))
|
|
819
843
|
continue;
|
|
820
844
|
subjects.add(sys);
|
|
821
845
|
const want = normalizePath(h.path);
|
|
822
|
-
const found = ctx.records.some((r) => r.kind === "Endpoint" && (r.component === h.callee ||
|
|
846
|
+
const found = ctx.records.some((r) => r.kind === "Endpoint" && (r.component === h.callee || ofSystem(r.component, sys)) && (r.method ?? "").toUpperCase() === h.method && normalizePath(r.normalizedPath ?? r.pathOrTopic) === want);
|
|
823
847
|
if (found)
|
|
824
848
|
continue;
|
|
825
849
|
const name = ctx.get("System", sys)?.name ?? sys;
|
|
@@ -828,9 +852,9 @@ var vendorOperationKnown = {
|
|
|
828
852
|
artifact: "interfaces.md",
|
|
829
853
|
locator: { line: h.line, record: sys },
|
|
830
854
|
summary: sentence(`${name}'s published spec has no ${h.method} ${h.path}.`),
|
|
831
|
-
why: "The change plans a call to a vendor operation the catalog has never seen in the vendor's spec, so its contract, limits and errors are unknown.",
|
|
855
|
+
why: vendor ? "The change plans a call to a vendor operation the catalog has never seen in the vendor's spec, so its contract, limits and errors are unknown." : "The change plans a call to an operation of another team's system that the catalog has never seen in that team's published spec, so its contract, limits and errors are unknown.",
|
|
832
856
|
fix: {
|
|
833
|
-
text: `Get the operation's spec from ${name} and add it to inputs/partner-specs, or correct the operation.`
|
|
857
|
+
text: vendor ? `Get the operation's spec from ${name} and add it to inputs/partner-specs, or correct the operation.` : `Get the operation's spec from the team that owns ${name} and add it to inputs/partner-specs, or correct the operation.`
|
|
834
858
|
},
|
|
835
859
|
evidence: [lineEvidence(doc, h.line), ...subjectEvidence(ctx, sys)],
|
|
836
860
|
question: {
|
|
@@ -1277,6 +1301,8 @@ function patternProblems(ctx, o) {
|
|
|
1277
1301
|
const doc = docOf(ctx.files, IFACES);
|
|
1278
1302
|
if (!doc)
|
|
1279
1303
|
return [];
|
|
1304
|
+
if (ctx.patterns.size === 0)
|
|
1305
|
+
return [];
|
|
1280
1306
|
const hits = [];
|
|
1281
1307
|
const codes = [...ctx.patterns.keys()].sort();
|
|
1282
1308
|
for (const h of ctx.hops) {
|
|
@@ -1668,7 +1694,8 @@ var interfaceViaMatchesPattern = {
|
|
|
1668
1694
|
evidence: [
|
|
1669
1695
|
recordEvidence(rec.id),
|
|
1670
1696
|
...rec.evidence.filter((e) => e.path).slice(0, 1).map((e) => ({
|
|
1671
|
-
source: e.source,
|
|
1697
|
+
source: e.source === "ai" ? "code" : e.source,
|
|
1698
|
+
// ADR 0181: the call's own line
|
|
1672
1699
|
path: e.path,
|
|
1673
1700
|
...e.repo ? { repo: e.repo } : {},
|
|
1674
1701
|
...e.line ? { line: e.line } : {}
|
|
@@ -1681,8 +1708,178 @@ var interfaceViaMatchesPattern = {
|
|
|
1681
1708
|
}
|
|
1682
1709
|
};
|
|
1683
1710
|
|
|
1684
|
-
// packages/naysayer/dist/checks/
|
|
1711
|
+
// packages/naysayer/dist/checks/links.js
|
|
1685
1712
|
var IFACES2 = "interfaces.md";
|
|
1713
|
+
var GUESSES = {
|
|
1714
|
+
"joined-by-path": "by path",
|
|
1715
|
+
"joined-by-label": "by a host's first label",
|
|
1716
|
+
"joined-by-platform-setting": "by a platform-wide setting nobody set for it",
|
|
1717
|
+
"joined-by-folder-name": "by the folder name of the setting that gives its host",
|
|
1718
|
+
"joined-despite-conflict": "by a host or base path an open conflict disputes",
|
|
1719
|
+
"joined-by-service-name": "by a Kubernetes Service's short name, from a namespace not shown to be its"
|
|
1720
|
+
};
|
|
1721
|
+
var guessOf = (f) => Object.hasOwn(GUESSES, f);
|
|
1722
|
+
function reposOf(ctx) {
|
|
1723
|
+
const out = new Set(ctx.footprint.repos);
|
|
1724
|
+
for (const c of calls(ctx))
|
|
1725
|
+
for (const id of [c.caller, c.callee]) {
|
|
1726
|
+
const repo = ctx.get("Component", id)?.repo;
|
|
1727
|
+
if (repo)
|
|
1728
|
+
out.add(repo);
|
|
1729
|
+
}
|
|
1730
|
+
return [...out].sort();
|
|
1731
|
+
}
|
|
1732
|
+
async function loadEstateReads(root, ctx) {
|
|
1733
|
+
const reads = /* @__PURE__ */ new Map();
|
|
1734
|
+
for (const r of reposOf(ctx))
|
|
1735
|
+
reads.set(r, await repoReadOf(root, r));
|
|
1736
|
+
const facts = new Map([...reads].map(([k, v]) => [k, v.facts]));
|
|
1737
|
+
const open = await listQuestions(root, { state: "open" }).then((l) => l.questions, () => []);
|
|
1738
|
+
return {
|
|
1739
|
+
reads,
|
|
1740
|
+
questions: open.filter((q) => isLinkQuestion(q) && reads.has(q.repo)).map((q) => ({
|
|
1741
|
+
question: q,
|
|
1742
|
+
calls: callsOfQuestion(q, facts),
|
|
1743
|
+
file: `${questionsRelOf(root)}/${q.id}.yaml`
|
|
1744
|
+
}))
|
|
1745
|
+
};
|
|
1746
|
+
}
|
|
1747
|
+
var pathOf = (p) => normalizePath(p.split(/[?#]/)[0].trim()).toLowerCase();
|
|
1748
|
+
function sameCall(f, c) {
|
|
1749
|
+
if (c.record?.evidence.some((e) => e.repo === f.repo && e.path === f.cite.file && e.line === f.cite.line))
|
|
1750
|
+
return true;
|
|
1751
|
+
const path = c.hop?.path ?? c.record?.normalizedPath;
|
|
1752
|
+
const method = c.hop?.method ?? c.record?.method;
|
|
1753
|
+
if (!path)
|
|
1754
|
+
return false;
|
|
1755
|
+
if (method && f.method && method.toUpperCase() !== f.method.toUpperCase())
|
|
1756
|
+
return false;
|
|
1757
|
+
return pathOf(path) === pathOf(f.path);
|
|
1758
|
+
}
|
|
1759
|
+
function placeOf(ctx, c) {
|
|
1760
|
+
const ifaces = docOf(ctx.files, IFACES2);
|
|
1761
|
+
if (c.hop && ifaces)
|
|
1762
|
+
return {
|
|
1763
|
+
artifact: IFACES2,
|
|
1764
|
+
locator: rowLocator2(ifaces, c.hop.line),
|
|
1765
|
+
evidence: [lineEvidence(ifaces, c.hop.line)]
|
|
1766
|
+
};
|
|
1767
|
+
return {
|
|
1768
|
+
artifact: "catalog",
|
|
1769
|
+
locator: { record: c.record?.id ?? c.caller },
|
|
1770
|
+
evidence: c.record ? [recordEvidence(c.record.id)] : []
|
|
1771
|
+
};
|
|
1772
|
+
}
|
|
1773
|
+
var plainWhat = (step, q) => step === HOSTS_STEP ? `which repo answers on ${hostOfQuestion(q) ?? "its host"}` : "which repo or system answers it";
|
|
1774
|
+
var changeLinksKnown = {
|
|
1775
|
+
id: "change-links-known",
|
|
1776
|
+
question: "true",
|
|
1777
|
+
description: "Every call the change plans rests on a link read from code: not one the join guessed (by path, by a host's first label, by a platform-wide setting or a setting's folder name, or despite an open conflict), not one a link question still asks about, and not in a repo whose read is stale or incomplete.",
|
|
1778
|
+
params: external_exports.strictObject({}),
|
|
1779
|
+
run(ctx) {
|
|
1780
|
+
const hits = [];
|
|
1781
|
+
const all = calls(ctx);
|
|
1782
|
+
for (const c of all) {
|
|
1783
|
+
const rec = c.record;
|
|
1784
|
+
const place = placeOf(ctx, c);
|
|
1785
|
+
const flag = rec?.confidence === "inferred" ? rec.flags?.find(guessOf) : void 0;
|
|
1786
|
+
if (rec && flag)
|
|
1787
|
+
hits.push({
|
|
1788
|
+
kind: "knowledge-gap",
|
|
1789
|
+
...place,
|
|
1790
|
+
summary: sentence(`The change rests on a guessed link: the map joined ${c.caller} to ${c.callee} (${c.operation}) ${GUESSES[flag]}, not from code that names ${c.callee}.`),
|
|
1791
|
+
why: `Nobody named ${c.callee} as the target of this call: the join found it ${GUESSES[flag]} (the Interface is inferred, flagged ${flag}). If the guess is wrong, the design is built on a call that goes somewhere else.`,
|
|
1792
|
+
fix: {
|
|
1793
|
+
text: `Confirm the target: name it on the call (the call's target in its facts, or Map \u203A Why is this linked? \u203A This link is wrong), then atticus verify ${ctx.get("Component", c.caller)?.repo ?? c.caller} --write.`
|
|
1794
|
+
},
|
|
1795
|
+
evidence: [
|
|
1796
|
+
...place.evidence.filter((e) => e.source !== "catalog"),
|
|
1797
|
+
recordEvidence(rec.id)
|
|
1798
|
+
],
|
|
1799
|
+
question: {
|
|
1800
|
+
text: `Does ${c.caller}'s ${c.operation} go to ${c.callee}? The map joined them ${GUESSES[flag]}: nothing in ${c.caller}'s code names ${c.callee}.`,
|
|
1801
|
+
owner: questionOwner(ctx, c.caller)
|
|
1802
|
+
},
|
|
1803
|
+
subject: c.caller,
|
|
1804
|
+
key: `link-guess|${rec.id}`
|
|
1805
|
+
});
|
|
1806
|
+
if (rec && !flag && rec.flags?.includes(JOINED_BY_AI)) {
|
|
1807
|
+
const run = rec.evidence.find((e) => e.source === "ai")?.run;
|
|
1808
|
+
hits.push({
|
|
1809
|
+
kind: "knowledge-gap",
|
|
1810
|
+
...place,
|
|
1811
|
+
summary: sentence(`The change rests on a link the AI decided: ${c.caller} to ${c.callee} (${c.operation}), detected by AI${run ? ` (run ${run})` : ""} and not confirmed by a person.`),
|
|
1812
|
+
why: `The AI paired this call with ${c.callee}, and Atticus applied it because its lines checked and its shape agreed; nobody has said it is right. If it is wrong, the design is built on a call that goes somewhere else.`,
|
|
1813
|
+
fix: {
|
|
1814
|
+
text: `Confirm or correct it: atticus questions decisions lists it; atticus questions correct (or Correct on the "Detected by AI" chip) makes it a person's word, then atticus verify ${ctx.get("Component", c.caller)?.repo ?? c.caller} --write.`
|
|
1815
|
+
},
|
|
1816
|
+
evidence: [
|
|
1817
|
+
...place.evidence.filter((e) => e.source !== "catalog"),
|
|
1818
|
+
recordEvidence(rec.id)
|
|
1819
|
+
],
|
|
1820
|
+
question: {
|
|
1821
|
+
text: `Does ${c.caller}'s ${c.operation} go to ${c.callee}? The AI decided so; nobody has confirmed it.`,
|
|
1822
|
+
owner: questionOwner(ctx, c.caller)
|
|
1823
|
+
},
|
|
1824
|
+
subject: c.caller,
|
|
1825
|
+
key: `link-ai|${rec.id}`
|
|
1826
|
+
});
|
|
1827
|
+
}
|
|
1828
|
+
const repo = ctx.get("Component", c.caller)?.repo;
|
|
1829
|
+
for (const q of ctx.estate?.questions ?? []) {
|
|
1830
|
+
if (!repo || q.question.repo !== repo || !q.calls.some((f) => sameCall(f, c)))
|
|
1831
|
+
continue;
|
|
1832
|
+
const id = q.question.id;
|
|
1833
|
+
hits.push({
|
|
1834
|
+
kind: "knowledge-gap",
|
|
1835
|
+
...place,
|
|
1836
|
+
summary: sentence(`The call from ${c.caller} to ${c.callee} (${c.operation}) rests on an open question, ${id}: ${plainWhat(q.question.askedBy.step, q.question)}.`),
|
|
1837
|
+
why: `The map doesn't know yet where this call goes: ${id} asks "${q.question.question}" and nobody has answered. Until it is answered, the link the design draws is a guess.`,
|
|
1838
|
+
fix: {
|
|
1839
|
+
text: `Answer it: atticus questions answer ${id} --option <n> (or on the app's Questions page), then ${q.question.rerun}.`
|
|
1840
|
+
},
|
|
1841
|
+
evidence: [
|
|
1842
|
+
...place.evidence,
|
|
1843
|
+
...rec && place.artifact !== "catalog" ? [recordEvidence(rec.id)] : [],
|
|
1844
|
+
{ source: "manual", path: q.file }
|
|
1845
|
+
],
|
|
1846
|
+
question: { text: q.question.question, owner: questionOwner(ctx, c.caller) },
|
|
1847
|
+
subject: c.caller,
|
|
1848
|
+
key: `link-question|${id}|${c.hop?.line ?? rec?.id}`
|
|
1849
|
+
});
|
|
1850
|
+
}
|
|
1851
|
+
}
|
|
1852
|
+
for (const [repo, r] of ctx.estate?.reads ?? []) {
|
|
1853
|
+
if (r.state !== "stale" && r.state !== "incomplete")
|
|
1854
|
+
continue;
|
|
1855
|
+
const c = all.find((x) => [x.caller, x.callee].some((id) => ctx.get("Component", id)?.repo === repo));
|
|
1856
|
+
const component = ctx.records.find((x) => x.kind === "Component" && x.repo === repo);
|
|
1857
|
+
const place = c ? placeOf(ctx, c) : {
|
|
1858
|
+
artifact: "catalog",
|
|
1859
|
+
locator: { record: component?.id ?? repo },
|
|
1860
|
+
evidence: []
|
|
1861
|
+
};
|
|
1862
|
+
const evidence = [...place.evidence, ...component ? [recordEvidence(component.id)] : []];
|
|
1863
|
+
if (!evidence.length)
|
|
1864
|
+
continue;
|
|
1865
|
+
hits.push({
|
|
1866
|
+
kind: "issue",
|
|
1867
|
+
...place,
|
|
1868
|
+
summary: sentence(`The change rests on ${repo}, whose read is ${r.state}: ${r.why.join("; ")}.`),
|
|
1869
|
+
why: `What the catalog says of ${repo} comes from ${r.state === "stale" ? "an older commit than its checkout" : "a read that is not whole"}, so a link or entry the design relies on may have moved or be missing.`,
|
|
1870
|
+
fix: {
|
|
1871
|
+
text: `Read it again before relying on it: ${r.next ?? `atticus map ${repo}`}${r.next?.startsWith("atticus map") ? `, then atticus verify ${repo} --write` : ""}, and run the critic again.`
|
|
1872
|
+
},
|
|
1873
|
+
evidence,
|
|
1874
|
+
key: `read|${repo}`
|
|
1875
|
+
});
|
|
1876
|
+
}
|
|
1877
|
+
return { hits, subjects: [] };
|
|
1878
|
+
}
|
|
1879
|
+
};
|
|
1880
|
+
|
|
1881
|
+
// packages/naysayer/dist/checks/questions.js
|
|
1882
|
+
var IFACES3 = "interfaces.md";
|
|
1686
1883
|
var ASYNC_ROUTES = /* @__PURE__ */ new Set(["event-bus", "pubsub", "mq", "sftp"]);
|
|
1687
1884
|
function waits(c) {
|
|
1688
1885
|
if (c.record?.sync === "async")
|
|
@@ -1691,11 +1888,11 @@ function waits(c) {
|
|
|
1691
1888
|
return false;
|
|
1692
1889
|
return !(c.via && ASYNC_ROUTES.has(c.via));
|
|
1693
1890
|
}
|
|
1694
|
-
function
|
|
1695
|
-
const ifaces = docOf(ctx.files,
|
|
1891
|
+
function placeOf2(ctx, c) {
|
|
1892
|
+
const ifaces = docOf(ctx.files, IFACES3);
|
|
1696
1893
|
if (c.hop && ifaces)
|
|
1697
1894
|
return {
|
|
1698
|
-
artifact:
|
|
1895
|
+
artifact: IFACES3,
|
|
1699
1896
|
locator: rowLocator2(ifaces, c.hop.line),
|
|
1700
1897
|
evidence: [lineEvidence(ifaces, c.hop.line)]
|
|
1701
1898
|
};
|
|
@@ -1720,7 +1917,7 @@ var callTimeoutStated = {
|
|
|
1720
1917
|
const lines = callLines(ctx, c);
|
|
1721
1918
|
if (setting || lines.some((l) => KIND_WORDS.timeout.test(l.text)))
|
|
1722
1919
|
continue;
|
|
1723
|
-
const place =
|
|
1920
|
+
const place = placeOf2(ctx, c);
|
|
1724
1921
|
if (place.evidence.length === 0)
|
|
1725
1922
|
continue;
|
|
1726
1923
|
hits.push({
|
|
@@ -1783,7 +1980,7 @@ var publicEntryAuth = {
|
|
|
1783
1980
|
description: "Every entry point the change adds or changes that another system or the gateway calls has an auth fact: the Endpoint's or the Interface's auth, or a gateway route that checks scopes. And the scopes hold up (A-gateway2): a route through the gateway that demands none, a caller whose own token can't hold the scope a hop downstream demands, and a scope a story's criteria name that no route demands.",
|
|
1784
1981
|
params: external_exports.strictObject({}),
|
|
1785
1982
|
run(ctx) {
|
|
1786
|
-
const doc = docOf(ctx.files,
|
|
1983
|
+
const doc = docOf(ctx.files, IFACES3);
|
|
1787
1984
|
if (!doc)
|
|
1788
1985
|
return { hits: [], subjects: [] };
|
|
1789
1986
|
const hits = [];
|
|
@@ -1820,7 +2017,7 @@ var publicEntryAuth = {
|
|
|
1820
2017
|
if (h.status !== "planned-new" && h.status !== "planned-modify")
|
|
1821
2018
|
continue;
|
|
1822
2019
|
const calleeSystem = ctx.systemOf(h.callee);
|
|
1823
|
-
if (!calleeSystem || ctx.
|
|
2020
|
+
if (!calleeSystem || ctx.outsideOf(calleeSystem) === "vendor")
|
|
1824
2021
|
continue;
|
|
1825
2022
|
const callerSystem = ctx.systemOf(h.caller);
|
|
1826
2023
|
const rec = interfaceOf(ctx, h);
|
|
@@ -1845,7 +2042,7 @@ var publicEntryAuth = {
|
|
|
1845
2042
|
if (!checked.length)
|
|
1846
2043
|
hits.push({
|
|
1847
2044
|
kind: "issue",
|
|
1848
|
-
artifact:
|
|
2045
|
+
artifact: IFACES3,
|
|
1849
2046
|
locator: { ...rowLocator2(doc, h.line), field: "notes" },
|
|
1850
2047
|
summary: sentence(`The gateway route ${routes.map((r) => r.id).join(", ")} that carries ${op} demands no scope.`),
|
|
1851
2048
|
why: `The route checks who the caller is and nothing about what they may do, so any token the gateway accepts reaches ${h.callee}: ${h.caller} and every other client of ${routes[0].proxy} are let through alike.`,
|
|
@@ -1861,7 +2058,7 @@ var publicEntryAuth = {
|
|
|
1861
2058
|
if (held.length && !wants.some((s) => held.includes(s)))
|
|
1862
2059
|
hits.push({
|
|
1863
2060
|
kind: "knowledge-gap",
|
|
1864
|
-
artifact:
|
|
2061
|
+
artifact: IFACES3,
|
|
1865
2062
|
locator: { ...rowLocator2(doc, h.line), field: "notes" },
|
|
1866
2063
|
summary: sentence(`${op} demands ${wants.join(", ")}, and the token ${h.caller} is itself called with holds ${held.join(", ")}.`),
|
|
1867
2064
|
why: `The routes into ${h.caller} demand ${held.join(", ")}, so a token passed straight through would be refused at ${routes.map((r) => r.id).join(", ")}. Nothing in the catalog says ${h.caller} gets a token that holds ${wants.join(", ")}.`,
|
|
@@ -1883,7 +2080,7 @@ var publicEntryAuth = {
|
|
|
1883
2080
|
if (facts.length) {
|
|
1884
2081
|
hits.push({
|
|
1885
2082
|
kind: "issue",
|
|
1886
|
-
artifact:
|
|
2083
|
+
artifact: IFACES3,
|
|
1887
2084
|
locator: { ...rowLocator2(doc, h.line), field: "notes" },
|
|
1888
2085
|
summary: sentence(`${h.callee} takes ${op} from ${h.caller}, ${crosses ? "in another system" : "through the gateway"}, with no authentication.`),
|
|
1889
2086
|
why: `The catalog records the entry's auth as none, and ${h.caller} calls it ${from}: anyone who can reach it can call it.`,
|
|
@@ -1897,7 +2094,7 @@ var publicEntryAuth = {
|
|
|
1897
2094
|
}
|
|
1898
2095
|
hits.push({
|
|
1899
2096
|
kind: "knowledge-gap",
|
|
1900
|
-
artifact:
|
|
2097
|
+
artifact: IFACES3,
|
|
1901
2098
|
locator: { ...rowLocator2(doc, h.line), field: "notes" },
|
|
1902
2099
|
summary: sentence(`Nothing says how ${h.callee} authenticates callers of ${op}, which ${h.caller} calls ${from}.`),
|
|
1903
2100
|
why: `No Endpoint or Interface in the catalog records the entry's auth, and no gateway route the hop names checks scopes, so nobody can say who may call it.`,
|
|
@@ -2063,7 +2260,7 @@ var breakingDeltaConsumers = {
|
|
|
2063
2260
|
params: external_exports.strictObject({}),
|
|
2064
2261
|
run(ctx) {
|
|
2065
2262
|
const hits = [];
|
|
2066
|
-
const ifaces = docOf(ctx.files,
|
|
2263
|
+
const ifaces = docOf(ctx.files, IFACES3);
|
|
2067
2264
|
const index = callersIndex(ctx);
|
|
2068
2265
|
for (const d of deltas(ctx)) {
|
|
2069
2266
|
const via = routeCallersOf(ctx, d, index);
|
|
@@ -2084,7 +2281,7 @@ var breakingDeltaConsumers = {
|
|
|
2084
2281
|
...via.evidence
|
|
2085
2282
|
];
|
|
2086
2283
|
const through = via.labels.length ? ` They reach it through ${and(via.routes)}${via.declared.length ? `; ${and(via.declared)} ${via.declared.length === 1 ? "is" : "are"} a person's word in the org pack's profile, not read from code` : ""}.` : "";
|
|
2087
|
-
const place = d.hop && ifaces ? { artifact:
|
|
2284
|
+
const place = d.hop && ifaces ? { artifact: IFACES3, locator: rowLocator2(ifaces, d.hop.line) } : { artifact: "catalog", locator: { record: d.record.id } };
|
|
2088
2285
|
const key = `breaking|${d.hop?.line ?? d.record?.id}`;
|
|
2089
2286
|
const repos = [
|
|
2090
2287
|
...new Set(scanned.map((w) => ctx.get("Component", w)?.repo).filter((r) => r !== void 0))
|
|
@@ -2129,7 +2326,7 @@ var routeCallersKnown = {
|
|
|
2129
2326
|
params: external_exports.strictObject({}),
|
|
2130
2327
|
run(ctx) {
|
|
2131
2328
|
const hits = [];
|
|
2132
|
-
const ifaces = docOf(ctx.files,
|
|
2329
|
+
const ifaces = docOf(ctx.files, IFACES3);
|
|
2133
2330
|
const index = callersIndex(ctx);
|
|
2134
2331
|
const asked = /* @__PURE__ */ new Set();
|
|
2135
2332
|
for (const d of deltas(ctx))
|
|
@@ -2141,7 +2338,7 @@ var routeCallersKnown = {
|
|
|
2141
2338
|
if (asked.has(key))
|
|
2142
2339
|
continue;
|
|
2143
2340
|
asked.add(key);
|
|
2144
|
-
const place = d.hop && ifaces ? { artifact:
|
|
2341
|
+
const place = d.hop && ifaces ? { artifact: IFACES3, locator: rowLocator2(ifaces, d.hop.line) } : { artifact: "catalog", locator: { record: r.id } };
|
|
2145
2342
|
hits.push({
|
|
2146
2343
|
kind: "knowledge-gap",
|
|
2147
2344
|
...place,
|
|
@@ -2538,7 +2735,9 @@ var BUILT_IN_CHECKS = [
|
|
|
2538
2735
|
// Who a gateway route lets in (ADR 0124 addendum A-callers).
|
|
2539
2736
|
routeCallersKnown,
|
|
2540
2737
|
// ADR 0113 addendum (2026-10-26): a criterion an attached note gives quotes the note's line.
|
|
2541
|
-
noteCitesOnLine
|
|
2738
|
+
noteCitesOnLine,
|
|
2739
|
+
// ADR 0140: a change that rests on a guessed link, an open link question or a stale read.
|
|
2740
|
+
changeLinksKnown
|
|
2542
2741
|
];
|
|
2543
2742
|
function checkRegistry(extra = []) {
|
|
2544
2743
|
const m = /* @__PURE__ */ new Map();
|
|
@@ -2823,6 +3022,7 @@ function buildContext(o) {
|
|
|
2823
3022
|
return r?.kind === kind ? r : void 0;
|
|
2824
3023
|
};
|
|
2825
3024
|
const profileSystems = new Map(lifecycle.orgPack.profiles.flatMap((p) => p.profile?.systems ?? []).map((s) => [s.id, s]));
|
|
3025
|
+
const outside = outsideSystemsOf(lifecycle.orgPack);
|
|
2826
3026
|
const endpointOwners = new Set(records.filter((r) => r.kind === "Endpoint").map((r) => r.component));
|
|
2827
3027
|
const systemOf = (id) => {
|
|
2828
3028
|
const c = get("Component", id);
|
|
@@ -2866,6 +3066,7 @@ function buildContext(o) {
|
|
|
2866
3066
|
get,
|
|
2867
3067
|
systemOf,
|
|
2868
3068
|
boundaryOf: (s) => get("System", s)?.boundary ?? profileSystems.get(s)?.boundary,
|
|
3069
|
+
outsideOf: (s) => outsideKindOf(outside, s, get("System", s)?.boundary ?? profileSystems.get(s)?.boundary),
|
|
2869
3070
|
ownerOf: (s) => profileSystems.get(s)?.owner ?? get("System", s)?.owner,
|
|
2870
3071
|
isKnown: (id) => get("Component", id) !== void 0 || get("System", id) !== void 0 || profileSystems.has(id) || endpointOwners.has(id),
|
|
2871
3072
|
namesOf: (id) => {
|
|
@@ -3066,7 +3267,8 @@ async function changeAnswers(root, change) {
|
|
|
3066
3267
|
id: q.id,
|
|
3067
3268
|
question: q.question.trim(),
|
|
3068
3269
|
answer: (answerWords(q) ?? "").trim(),
|
|
3069
|
-
|
|
3270
|
+
// ADR 0181: an AI answer reads as the AI's, never a person's word.
|
|
3271
|
+
by: answerByWords(q.answer.by),
|
|
3070
3272
|
at: q.answer.at
|
|
3071
3273
|
})).filter((a) => a.answer.length > 0);
|
|
3072
3274
|
}
|
|
@@ -3364,7 +3566,8 @@ async function roundsOf(root, change, gate) {
|
|
|
3364
3566
|
async function countedRounds(root, change, gate) {
|
|
3365
3567
|
const out = [];
|
|
3366
3568
|
for (const n of await roundsOf(root, change, gate)) {
|
|
3367
|
-
const
|
|
3569
|
+
const m0 = await readRoundMeta(root, change, gate, n);
|
|
3570
|
+
const m = m0?.state === "in-progress" ? void 0 : m0;
|
|
3368
3571
|
if (!m) {
|
|
3369
3572
|
const r = await readRound(root, change, gate, n);
|
|
3370
3573
|
if (!r.findings.length && !r.bad.length)
|
|
@@ -4040,6 +4243,33 @@ async function sinceReview(root, o) {
|
|
|
4040
4243
|
}
|
|
4041
4244
|
|
|
4042
4245
|
// packages/naysayer/dist/ai.js
|
|
4246
|
+
var LENS_BATCH_AGENT = "critic-lenses";
|
|
4247
|
+
var batchingOf = (rt) => typeof rt.prepareBatch === "function" && typeof rt.canBatch === "function" ? rt : void 0;
|
|
4248
|
+
async function batchLenses(ctx, runtime, runs) {
|
|
4249
|
+
const batching = batchingOf(runtime);
|
|
4250
|
+
const waiting = runs.filter((r) => r.state === "waiting" && r.runId);
|
|
4251
|
+
if (!batching || waiting.length < 2)
|
|
4252
|
+
return void 0;
|
|
4253
|
+
const tokens = waiting.reduce((n, r) => n + (r.context?.tokens ?? 0), 0);
|
|
4254
|
+
if (!batching.canBatch(waiting.length, tokens))
|
|
4255
|
+
return void 0;
|
|
4256
|
+
const first = lensAgent(ctx, waiting[0].lens);
|
|
4257
|
+
const batch = await batching.prepareBatch({
|
|
4258
|
+
change: ctx.change.id,
|
|
4259
|
+
agent: {
|
|
4260
|
+
...first,
|
|
4261
|
+
id: LENS_BATCH_AGENT,
|
|
4262
|
+
description: `The critic's ${waiting.map((r) => r.lens).join(", ")} lenses on change ${ctx.change.id}, asked in one prompt: each lens is its own review, answered in its own section.`,
|
|
4263
|
+
allowedRuntimes: ["hand-off"]
|
|
4264
|
+
},
|
|
4265
|
+
parts: waiting.map((r) => ({ name: r.lens, runId: r.runId })),
|
|
4266
|
+
stepClass: "critic"
|
|
4267
|
+
});
|
|
4268
|
+
const run = await runtime.run(batch.runId);
|
|
4269
|
+
for (const r of waiting)
|
|
4270
|
+
r.batch = run.runId;
|
|
4271
|
+
return run.runId;
|
|
4272
|
+
}
|
|
4043
4273
|
var ALL_INPUTS = [
|
|
4044
4274
|
"brief",
|
|
4045
4275
|
"proposal",
|
|
@@ -4784,7 +5014,8 @@ async function runLenses(ctx, rules, o) {
|
|
|
4784
5014
|
runs.push({ ...base, state: "failed", reason: e.message });
|
|
4785
5015
|
}
|
|
4786
5016
|
}
|
|
4787
|
-
|
|
5017
|
+
const batch = o.runtime && o.batch ? await batchLenses(ctx, o.runtime, runs).catch(() => void 0) : void 0;
|
|
5018
|
+
return { hits, runs, discarded, skipped, reviewed, ...batch ? { batch } : {} };
|
|
4788
5019
|
}
|
|
4789
5020
|
|
|
4790
5021
|
// packages/naysayer/dist/gates.js
|
|
@@ -4807,7 +5038,9 @@ async function gateStatusOf(root, lifecycle, change, gate) {
|
|
|
4807
5038
|
return p && f.finding.state === "open" ? { ...f, proposal: p } : f;
|
|
4808
5039
|
});
|
|
4809
5040
|
const open = findings.filter((f) => f.finding.state === "open");
|
|
4810
|
-
const
|
|
5041
|
+
const checked = await checkFindings(root, change, [gate]);
|
|
5042
|
+
const blocking = checked.map((r) => r.message);
|
|
5043
|
+
const onlyGaps = checked.length > 0 && checked.every((r) => r.code === "open-gap");
|
|
4811
5044
|
const waiting = round ? ((await readRoundMeta(root, change.id, gate, round))?.lenses ?? []).filter((l) => l.state === "waiting" && l.runId).map((l) => ({ lens: l.lens, runId: l.runId })) : [];
|
|
4812
5045
|
const proposed = findings.filter((f) => f.proposal && f.finding.severity === "blocking");
|
|
4813
5046
|
const reasons = [
|
|
@@ -4829,7 +5062,7 @@ async function gateStatusOf(root, lifecycle, change, gate) {
|
|
|
4829
5062
|
total: count(findings),
|
|
4830
5063
|
mayProceed: reasons.length === 0,
|
|
4831
5064
|
// An open gap with nothing blocking waits on its owner, not on a person's decision.
|
|
4832
|
-
humanDecides: blocking.length > 0 && usedUp && !(count(open).blocking === 0 &&
|
|
5065
|
+
humanDecides: blocking.length > 0 && usedUp && !(count(open).blocking === 0 && onlyGaps && waiting.length === 0),
|
|
4833
5066
|
checkRound: usedUp && (await checkRoundDue(root, change.id, gate)).length > 0,
|
|
4834
5067
|
checkRoundsRun,
|
|
4835
5068
|
waiting,
|
|
@@ -4946,6 +5179,7 @@ async function prepareLayers(root, g, now, teamPacks, checks = []) {
|
|
|
4946
5179
|
const ctx = buildContext({ root, change, type, lifecycle, footprint, files, gate, now });
|
|
4947
5180
|
ctx.answers = await changeAnswers(root, change.id);
|
|
4948
5181
|
ctx.recorded = await recordedFacts(root, change.id);
|
|
5182
|
+
ctx.estate = await loadEstateReads(root, ctx);
|
|
4949
5183
|
const { sources, problems } = await ruleSources(ctx, teamPacks);
|
|
4950
5184
|
const layered = layerRules(sources);
|
|
4951
5185
|
problems.push(...layered.problems);
|
|
@@ -5129,6 +5363,15 @@ async function runCritic(root, changeId, opts = {}) {
|
|
|
5129
5363
|
problems.push(`Rule ${h.rule.id} produced a finding without evidence; it was discarded: ${h.hit.summary}`);
|
|
5130
5364
|
const merged1 = mergeHits(l1.filter((h) => h.hit.evidence.length > 0), ctx.systemOf);
|
|
5131
5365
|
const failed = new Set(merged1.filter((h) => h.hit.kind === "issue" && h.rule.severity === "blocking" && h.hit.artifact !== "catalog").map((h) => h.hit.artifact));
|
|
5366
|
+
const metaDir = join10(changeFolder(root, change.id), "review", gate.id, String(round), "meta");
|
|
5367
|
+
await writeFileAtomic(join10(metaDir, "round.yaml"), toCanonicalYaml({
|
|
5368
|
+
schemaVersion: 1,
|
|
5369
|
+
change: change.id,
|
|
5370
|
+
gate: gate.id,
|
|
5371
|
+
round,
|
|
5372
|
+
createdAt: now,
|
|
5373
|
+
state: "in-progress"
|
|
5374
|
+
}, ROUND_LEADING));
|
|
5132
5375
|
const lenses = opts.lenses ? questionsOf(opts.lenses) : [...CriticQuestion.options];
|
|
5133
5376
|
const quarantined = [];
|
|
5134
5377
|
const draft = opts.review ? await draftDocs(changeFolder(root, change.id), opts.review.files) : [];
|
|
@@ -5149,6 +5392,7 @@ async function runCritic(root, changeId, opts = {}) {
|
|
|
5149
5392
|
}) : void 0;
|
|
5150
5393
|
const ai = await runLenses(ctx, applicable, {
|
|
5151
5394
|
...opts.runtime ? { runtime: opts.runtime } : {},
|
|
5395
|
+
...opts.batchLenses ? { batch: true } : {},
|
|
5152
5396
|
lenses,
|
|
5153
5397
|
failed,
|
|
5154
5398
|
...opts.maxClassification ? { maxClassification: opts.maxClassification } : {},
|
|
@@ -5212,7 +5456,6 @@ async function runCritic(root, changeId, opts = {}) {
|
|
|
5212
5456
|
];
|
|
5213
5457
|
await keepLensRecords(root, change.id, gate.id, round, ai.runs);
|
|
5214
5458
|
const model = criticModel(lifecycle.orgPack.runtime, opts.authorModel);
|
|
5215
|
-
const metaDir = join10(changeFolder(root, change.id), "review", gate.id, String(round), "meta");
|
|
5216
5459
|
for (const r of ai.runs)
|
|
5217
5460
|
if (r.summary)
|
|
5218
5461
|
await writeFileAtomic(join10(metaDir, "runs", `${r.agent}.yaml`), toCanonicalYaml(r.summary, ["schemaVersion", "runId"]));
|
|
@@ -5243,6 +5486,8 @@ async function runCritic(root, changeId, opts = {}) {
|
|
|
5243
5486
|
artifacts: r.artifacts,
|
|
5244
5487
|
...r.promptSha256 ? { promptSha256: r.promptSha256 } : {},
|
|
5245
5488
|
...r.runId ? { runId: r.runId } : {},
|
|
5489
|
+
// ADR 0185: the one prompt it was asked in with the round's other waiting lenses.
|
|
5490
|
+
...r.batch ? { batch: r.batch } : {},
|
|
5246
5491
|
// What the lens was sent (ADR 0115 addendum, 2026-10-25): its size, what was cut to
|
|
5247
5492
|
// need, and in a redraft the round it was diffed against and what wasn't sent.
|
|
5248
5493
|
...r.context ? { context: r.context } : {}
|
|
@@ -5262,6 +5507,7 @@ async function runCritic(root, changeId, opts = {}) {
|
|
|
5262
5507
|
refused: layered.refused,
|
|
5263
5508
|
problems,
|
|
5264
5509
|
lenses: ai.runs,
|
|
5510
|
+
...ai.batch ? { batch: ai.batch } : {},
|
|
5265
5511
|
discarded: ai.discarded,
|
|
5266
5512
|
failedLayer1: [...failed].sort(),
|
|
5267
5513
|
model,
|
|
@@ -5404,6 +5650,19 @@ async function completeLensRun(root, run, opts = {}) {
|
|
|
5404
5650
|
status: await gateStatusOf(root, lifecycle, change, gateId)
|
|
5405
5651
|
};
|
|
5406
5652
|
}
|
|
5653
|
+
async function completeLensBatch(root, batch, result, opts = {}) {
|
|
5654
|
+
const out = [];
|
|
5655
|
+
for (const p of batch.parts ?? []) {
|
|
5656
|
+
const run = await result(p.runId).catch(() => void 0);
|
|
5657
|
+
if (run?.state !== "validated" || !lensRunOf(run.request))
|
|
5658
|
+
continue;
|
|
5659
|
+
const found = await roundOf(root, run.request.change, run.runId);
|
|
5660
|
+
if (found?.entry.state !== "waiting")
|
|
5661
|
+
continue;
|
|
5662
|
+
out.push(await completeLensRun(root, run, opts));
|
|
5663
|
+
}
|
|
5664
|
+
return out;
|
|
5665
|
+
}
|
|
5407
5666
|
async function failLens(root, change, gate, round, runId, reason) {
|
|
5408
5667
|
const meta = await readRoundMeta(root, change, gate, round);
|
|
5409
5668
|
if (!meta || !meta.lenses.some((l) => l.runId === runId && l.state === "waiting"))
|
|
@@ -5417,6 +5676,29 @@ import { createHash } from "node:crypto";
|
|
|
5417
5676
|
import { readdir as readdir7, readFile as readFile8 } from "node:fs/promises";
|
|
5418
5677
|
import { join as join12, normalize, sep as sep2 } from "node:path";
|
|
5419
5678
|
var import_yaml8 = __toESM(require_dist(), 1);
|
|
5679
|
+
async function raiseAskedQuestion(root, f, askedOf, at) {
|
|
5680
|
+
const id = askedGapQuestionId(f.change, f);
|
|
5681
|
+
if (await readQuestion(root, id).catch(() => void 0))
|
|
5682
|
+
return id;
|
|
5683
|
+
const rel = `${changesRelOf(root)}/${f.change}`;
|
|
5684
|
+
const file = f.artifact === "catalog" ? "change.yaml" : f.artifact;
|
|
5685
|
+
const rerun = `atticus critic ${f.change} --gate ${f.gate}`;
|
|
5686
|
+
await writeQuestion(root, Question.parse({
|
|
5687
|
+
schemaVersion: QUESTION_SCHEMA_VERSION,
|
|
5688
|
+
id,
|
|
5689
|
+
askedBy: { step: ASKED_GAP_STEP, command: `atticus finding ${f.change} ${f.id} ask`, at },
|
|
5690
|
+
repo: f.change,
|
|
5691
|
+
question: f.question?.text ?? f.summary,
|
|
5692
|
+
options: [],
|
|
5693
|
+
evidence: [`${rel}/${file}:${f.artifact === "catalog" ? 1 : f.locator.line ?? 1}`],
|
|
5694
|
+
scope: { level: "repo", id: f.change },
|
|
5695
|
+
askedOf,
|
|
5696
|
+
finding: { change: f.change, gate: f.gate, round: f.round, id: f.id },
|
|
5697
|
+
state: "open",
|
|
5698
|
+
rerun
|
|
5699
|
+
}));
|
|
5700
|
+
return id;
|
|
5701
|
+
}
|
|
5420
5702
|
async function locate(lifecycle, root, change, id, gate) {
|
|
5421
5703
|
const gates = gate ? [gate] : await reviewedGates(root, change);
|
|
5422
5704
|
const order = lifecycle.orgPack.gates.gates.map((g) => g.id);
|
|
@@ -5561,7 +5843,7 @@ async function act(root, changeId, findingId, action, o) {
|
|
|
5561
5843
|
const said = o.reason?.trim().replace(/[.!?]+$/, "");
|
|
5562
5844
|
message = edited.length ? `Recorded your edit to ${edited.join(", ")}.` : said ? `Recorded what you did: ${said}.` : `Recorded your edit to ${f.artifact}.`;
|
|
5563
5845
|
} else if (act2 === "ask")
|
|
5564
|
-
message = `Asked ${askedOf}
|
|
5846
|
+
message = `Asked ${askedOf}.`;
|
|
5565
5847
|
else if (act2 === "waive")
|
|
5566
5848
|
message = `Waived ${f.id}. The waiver, its reason and your name are recorded on the finding; it reaches main with the ${f.gate} hand-off PR, where reviewers see it.`;
|
|
5567
5849
|
else
|
|
@@ -5590,6 +5872,11 @@ async function act(root, changeId, findingId, action, o) {
|
|
|
5590
5872
|
};
|
|
5591
5873
|
}
|
|
5592
5874
|
await writeFinding(root, next.data);
|
|
5875
|
+
let question;
|
|
5876
|
+
if (act2 === "ask" && gap) {
|
|
5877
|
+
question = await raiseAskedQuestion(root, next.data, askedOf, next.data.resolution.at);
|
|
5878
|
+
message = `Asked ${askedOf}: owner question ${question} is in Questions, Owner questions. The ${f.gate} gate waits for its answer.`;
|
|
5879
|
+
}
|
|
5593
5880
|
if (waiting)
|
|
5594
5881
|
await writeProposals(root, change.id, f.gate, f.round, proposals.filter((p) => p.finding !== f.id));
|
|
5595
5882
|
const after = act2 === "ask" ? void 0 : await afterLimit(lifecycle, root, change.id, next.data);
|
|
@@ -5597,7 +5884,13 @@ async function act(root, changeId, findingId, action, o) {
|
|
|
5597
5884
|
message = `${message} ${after}`;
|
|
5598
5885
|
else if (act2 === "apply" || act2 === "edit-and-apply")
|
|
5599
5886
|
message = patched || act2 === "edit-and-apply" ? `${message.replace(/\.$/, "")}; the next critic round checks it.` : `${message} The next critic round checks the fix.`;
|
|
5600
|
-
return {
|
|
5887
|
+
return {
|
|
5888
|
+
finding: next.data,
|
|
5889
|
+
path: found.path,
|
|
5890
|
+
...patched ? { patched } : {},
|
|
5891
|
+
...question ? { question } : {},
|
|
5892
|
+
message
|
|
5893
|
+
};
|
|
5601
5894
|
}
|
|
5602
5895
|
async function afterLimit(ctx, root, change, f) {
|
|
5603
5896
|
const max = gateRoundLimit(ctx.orgPack.gates, f.gate);
|
|
@@ -5649,8 +5942,8 @@ async function editedByPerson(folder) {
|
|
|
5649
5942
|
if (!written || typeof written !== "object")
|
|
5650
5943
|
continue;
|
|
5651
5944
|
for (const [file, hash] of Object.entries(written)) {
|
|
5652
|
-
const now = await readFile8(join12(folder, ...file.split("/"))).catch(() => void 0);
|
|
5653
|
-
const h = now ? createHash("sha256").update(now).digest("hex") : void 0;
|
|
5945
|
+
const now = await readFile8(join12(folder, ...file.split("/")), "utf8").catch(() => void 0);
|
|
5946
|
+
const h = now !== void 0 ? createHash("sha256").update(now.replace(/\r\n?/g, "\n"), "utf8").digest("hex") : void 0;
|
|
5654
5947
|
if (h !== hash)
|
|
5655
5948
|
out.add(file);
|
|
5656
5949
|
}
|
|
@@ -5920,6 +6213,7 @@ export {
|
|
|
5920
6213
|
focusTerms,
|
|
5921
6214
|
trimSources,
|
|
5922
6215
|
sinceReview,
|
|
6216
|
+
LENS_BATCH_AGENT,
|
|
5923
6217
|
lensAgent,
|
|
5924
6218
|
catalogSlice,
|
|
5925
6219
|
lensAnswerProblem,
|
|
@@ -5943,7 +6237,9 @@ export {
|
|
|
5943
6237
|
lensRunOf,
|
|
5944
6238
|
waitingLenses,
|
|
5945
6239
|
completeLensRun,
|
|
6240
|
+
completeLensBatch,
|
|
5946
6241
|
failLens,
|
|
5947
6242
|
act,
|
|
6243
|
+
editedByPerson,
|
|
5948
6244
|
overrideStats
|
|
5949
6245
|
};
|