@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.
Files changed (284) hide show
  1. package/dist/bin.js +8 -4
  2. package/dist/chunk-23XVSEV5.js +49 -0
  3. package/dist/{chunk-ZDPAS56H.js → chunk-24OXGB3P.js} +8 -2
  4. package/dist/{chunk-7EOBHUMC.js → chunk-24XLDU72.js} +4 -3
  5. package/dist/{chunk-CR3MTH32.js → chunk-2F4CYZKJ.js} +86 -11
  6. package/dist/{chunk-6IU67AEK.js → chunk-2GF7OLF3.js} +23 -15
  7. package/dist/chunk-2IIMFOPM.js +41 -0
  8. package/dist/chunk-2LGRMVCA.js +617 -0
  9. package/dist/{chunk-XPCM366L.js → chunk-2MMCFP5C.js} +10 -8
  10. package/dist/{chunk-JBTK5OP2.js → chunk-2Q56PQPS.js} +6 -4
  11. package/dist/{chunk-Z6LF7HQN.js → chunk-2Q5EDGEO.js} +7 -5
  12. package/dist/{chunk-3USYZGRF.js → chunk-2RLKFUUL.js} +38 -27
  13. package/dist/chunk-2SKB4O2E.js +59 -0
  14. package/dist/{chunk-SP2I63OO.js → chunk-34S2WGOB.js} +87 -4
  15. package/dist/{chunk-GQ4N4WKF.js → chunk-3NFFJL5D.js} +33 -27
  16. package/dist/{chunk-SJRGMG6A.js → chunk-3NWDLGG6.js} +28 -25
  17. package/dist/{chunk-4WBVUHXN.js → chunk-3RM4UK6W.js} +20 -18
  18. package/dist/chunk-42SIDKEU.js +583 -0
  19. package/dist/{chunk-GLUX4EEP.js → chunk-4EURQWQD.js} +20 -15
  20. package/dist/chunk-4U276ICE.js +39 -0
  21. package/dist/{chunk-ZMFPW66A.js → chunk-53T4O55J.js} +4 -3
  22. package/dist/{chunk-6J5OKA4Y.js → chunk-57TDNMI3.js} +17 -15
  23. package/dist/chunk-5BD2KYLE.js +57 -0
  24. package/dist/{chunk-7EFILTCI.js → chunk-5F7GFN2F.js} +28 -0
  25. package/dist/chunk-5NMKONLP.js +95 -0
  26. package/dist/{chunk-7ZUIMTOU.js → chunk-5SJZW52K.js} +26 -24
  27. package/dist/{chunk-4RS5KZQD.js → chunk-63YRMR6J.js} +6 -5
  28. package/dist/chunk-66PPNOON.js +62 -0
  29. package/dist/chunk-6H3Z5JHH.js +64 -0
  30. package/dist/{chunk-CEXSU4S6.js → chunk-6MUGR4LS.js} +775 -89
  31. package/dist/{chunk-QSXK2RGH.js → chunk-6OJQOPUN.js} +5 -3
  32. package/dist/{chunk-MVZVGYXH.js → chunk-6PPOWY5E.js} +84 -14
  33. package/dist/{chunk-7EKXJZ2Y.js → chunk-6ZGLAACW.js} +299 -38
  34. package/dist/chunk-6ZJ5A7AF.js +222 -0
  35. package/dist/{chunk-L24C55VN.js → chunk-745DAZ4L.js} +142 -30
  36. package/dist/{chunk-Q4D5X7QB.js → chunk-7ASNL4Q4.js} +46 -24
  37. package/dist/chunk-7BR7IPOH.js +35 -0
  38. package/dist/{chunk-7WD63HU2.js → chunk-7DOR27HL.js} +6 -6
  39. package/dist/chunk-7FTTA3HD.js +341 -0
  40. package/dist/{chunk-OLQJTJJU.js → chunk-7GJS6DNX.js} +12 -3
  41. package/dist/{chunk-7JUKDRSZ.js → chunk-7IGKHZ4Z.js} +347 -226
  42. package/dist/{chunk-G2B4ZQGH.js → chunk-7IOWA5D5.js} +11 -6
  43. package/dist/{chunk-EBEW3XXQ.js → chunk-7JITZFJC.js} +7 -5
  44. package/dist/chunk-7MJSQTL5.js +174 -0
  45. package/dist/{chunk-I4JRCD6M.js → chunk-7UOMVMFG.js} +25 -17
  46. package/dist/{chunk-YY6ZQQBP.js → chunk-AFWUDXEM.js} +19 -7
  47. package/dist/chunk-AFZ3QA6W.js +47 -0
  48. package/dist/chunk-AJQ72EBM.js +420 -0
  49. package/dist/chunk-AJYXNTNZ.js +317 -0
  50. package/dist/chunk-AVTBS4OW.js +49 -0
  51. package/dist/{chunk-FHH4I4ZV.js → chunk-BDKC6H5P.js} +12 -6
  52. package/dist/{chunk-IPKHE5D6.js → chunk-BEVTIBRH.js} +1526 -875
  53. package/dist/chunk-BHT7QK4G.js +162 -0
  54. package/dist/{chunk-6JUBZBMW.js → chunk-BIGDQDHD.js} +6 -4
  55. package/dist/{chunk-2BFCZ3RK.js → chunk-BO4KX37X.js} +20 -18
  56. package/dist/chunk-BPK5P77O.js +115 -0
  57. package/dist/chunk-BQ4SQQC6.js +59 -0
  58. package/dist/chunk-BQGDB6ZL.js +7342 -0
  59. package/dist/{chunk-2ANOROX3.js → chunk-BTGPE6CR.js} +11 -9
  60. package/dist/chunk-BTY3HZBO.js +93 -0
  61. package/dist/{chunk-DPZHZQKE.js → chunk-BXYMYEJ4.js} +44 -10
  62. package/dist/{chunk-2RMYG36Q.js → chunk-C3RY6KU6.js} +309 -346
  63. package/dist/chunk-C4R4JLHE.js +40 -0
  64. package/dist/chunk-CADWLE2T.js +18 -0
  65. package/dist/chunk-CBGGOQWU.js +82 -0
  66. package/dist/chunk-CMDXGQTS.js +47 -0
  67. package/dist/{chunk-MC3H7736.js → chunk-CQDGOPGH.js} +58 -18
  68. package/dist/{chunk-HFQCFSJR.js → chunk-CX4RZ2KS.js} +4 -3
  69. package/dist/{chunk-PAMPPUR6.js → chunk-CXJ6FUKN.js} +1852 -207
  70. package/dist/{chunk-ABWHYWNI.js → chunk-D73UEXYW.js} +3 -3
  71. package/dist/chunk-DCZWQLYT.js +1205 -0
  72. package/dist/chunk-DLOBCJL6.js +48 -0
  73. package/dist/{chunk-4BN53TG3.js → chunk-DOBQKHIF.js} +31 -23
  74. package/dist/chunk-E3ISYXO3.js +423 -0
  75. package/dist/{chunk-7SW2QWLU.js → chunk-E6ZIEVOI.js} +16 -13
  76. package/dist/chunk-EBL2R3YG.js +43 -0
  77. package/dist/{chunk-AIOQPLA5.js → chunk-EGQRREQH.js} +41 -15
  78. package/dist/chunk-EHA7RMZ3.js +58 -0
  79. package/dist/{chunk-M766ZJ6W.js → chunk-EIPTLPFC.js} +38 -27
  80. package/dist/chunk-EMRIQUND.js +517 -0
  81. package/dist/{chunk-DFBCSHVT.js → chunk-EPCJQQWD.js} +6 -4
  82. package/dist/{chunk-RZPYKDWS.js → chunk-F3P7N7SF.js} +1 -1
  83. package/dist/{chunk-R77KLRB3.js → chunk-FFLNS6VP.js} +21 -18
  84. package/dist/chunk-FFTRTL6R.js +26 -0
  85. package/dist/{chunk-IHMLFRVV.js → chunk-FPJPLKDW.js} +62 -16
  86. package/dist/{chunk-JCZIKA4C.js → chunk-FSMSFDLD.js} +5 -4
  87. package/dist/{chunk-AVJDSJ2F.js → chunk-FUJM6RTF.js} +8 -7
  88. package/dist/chunk-FZOJFH7Q.js +132 -0
  89. package/dist/{chunk-QRAOANID.js → chunk-G6X77UJZ.js} +23 -21
  90. package/dist/{chunk-3ALD2W2A.js → chunk-GCWRWSU7.js} +10 -4
  91. package/dist/chunk-GIW4ZVDB.js +39 -0
  92. package/dist/{chunk-B2WLAWNJ.js → chunk-GUX3PTYM.js} +3 -3
  93. package/dist/{chunk-DPUYDDQG.js → chunk-GZY6RUZ6.js} +25 -3
  94. package/dist/chunk-H4VO6WG3.js +10 -0
  95. package/dist/{chunk-MMOSZPWJ.js → chunk-H5HBGNXU.js} +5 -4
  96. package/dist/chunk-H7KM7LZE.js +229 -0
  97. package/dist/{chunk-AA6YULYB.js → chunk-HNM2YQT2.js} +7 -7
  98. package/dist/{chunk-3C7EYRFZ.js → chunk-HYU5VLGA.js} +1 -1
  99. package/dist/{chunk-XY3P7JW7.js → chunk-IDKCWSM5.js} +1032 -172
  100. package/dist/chunk-IFKEI4SA.js +237 -0
  101. package/dist/{chunk-F7HYOUFF.js → chunk-IGOE6KPG.js} +67 -22
  102. package/dist/{chunk-TDD55CJH.js → chunk-IH2XURVQ.js} +6 -5
  103. package/dist/chunk-INQHESFB.js +38 -0
  104. package/dist/chunk-IP74LCOQ.js +57 -0
  105. package/dist/chunk-IPHHDDC6.js +45 -0
  106. package/dist/{chunk-T6AIP7H5.js → chunk-ISUAAMGS.js} +110 -153
  107. package/dist/{chunk-A7UPUQFY.js → chunk-IUPG3UKI.js} +624 -319
  108. package/dist/{chunk-L6SGQIR3.js → chunk-IVBOQAGB.js} +7 -3
  109. package/dist/{chunk-27NKUS3X.js → chunk-J2JAKCIW.js} +2205 -796
  110. package/dist/{chunk-V2YTAIQO.js → chunk-J3IOLXWM.js} +24 -7
  111. package/dist/chunk-JA5FI3QV.js +142 -0
  112. package/dist/chunk-JAVI7JSP.js +49 -0
  113. package/dist/{chunk-HLJAXMM4.js → chunk-JB5LINEM.js} +6 -2
  114. package/dist/{chunk-2VHF7OXM.js → chunk-JENSEMXF.js} +1 -1
  115. package/dist/{chunk-6BVONWJ7.js → chunk-JJF6HALY.js} +4 -3
  116. package/dist/chunk-JLUCKAEL.js +38 -0
  117. package/dist/chunk-JRBFANFE.js +221 -0
  118. package/dist/{chunk-R6XF6UR3.js → chunk-KDNTAPLX.js} +4 -4
  119. package/dist/chunk-KFAVQZSX.js +33 -0
  120. package/dist/chunk-KJXD4PNL.js +50 -0
  121. package/dist/chunk-KN5BXMWN.js +44 -0
  122. package/dist/{chunk-PCVDV3UZ.js → chunk-KQGURXFU.js} +9 -7
  123. package/dist/{chunk-WY6PP6AA.js → chunk-KXITGYLF.js} +40 -6
  124. package/dist/{chunk-66YVAGGM.js → chunk-L27SV425.js} +22 -20
  125. package/dist/{chunk-NE2W3OO7.js → chunk-LDLL7LB3.js} +24 -22
  126. package/dist/chunk-LFGTYX5U.js +379 -0
  127. package/dist/{chunk-EYWIDJFU.js → chunk-LGBMTVNT.js} +7 -5
  128. package/dist/{chunk-Q5AMFEWD.js → chunk-LGFL54FP.js} +3 -2
  129. package/dist/{chunk-6TACQN3N.js → chunk-LJXMYKZJ.js} +7 -5
  130. package/dist/{chunk-BKVWTZ6A.js → chunk-LKOR5UET.js} +29 -26
  131. package/dist/chunk-LNBQOP7D.js +294 -0
  132. package/dist/{chunk-O3WI5KWW.js → chunk-LO6P2VYG.js} +2 -2
  133. package/dist/chunk-LQJPN536.js +122 -0
  134. package/dist/{chunk-YEDDOYSC.js → chunk-LYBNHMVZ.js} +29 -5
  135. package/dist/{chunk-A3GY6SOA.js → chunk-LZ7NUC62.js} +20 -18
  136. package/dist/chunk-M32BLWDH.js +37 -0
  137. package/dist/{chunk-VYDBJ73M.js → chunk-M3NANSDZ.js} +17 -15
  138. package/dist/chunk-MFHL5URL.js +31 -0
  139. package/dist/chunk-MFR5OPBD.js +109 -0
  140. package/dist/{chunk-DE76JROX.js → chunk-MG4ZL5RW.js} +32 -20
  141. package/dist/{chunk-N7IXEHK3.js → chunk-MO6P2JZH.js} +10 -8
  142. package/dist/{chunk-65NYPGRC.js → chunk-MUWDB4R4.js} +1 -1
  143. package/dist/chunk-MZCGSXVR.js +34 -0
  144. package/dist/{chunk-MGYZM27B.js → chunk-N3XIYPU3.js} +51 -23
  145. package/dist/chunk-NDCF4R6S.js +172 -0
  146. package/dist/{chunk-DHPACDG7.js → chunk-NR2UJWOC.js} +10 -8
  147. package/dist/chunk-NXJ5URP6.js +51 -0
  148. package/dist/{chunk-UNM6ZOKP.js → chunk-NY2XSR5K.js} +147 -18
  149. package/dist/{chunk-5GDRCDQB.js → chunk-O45HFTFS.js} +3 -2
  150. package/dist/{chunk-ONLS5QA5.js → chunk-O4GXGGBX.js} +14 -12
  151. package/dist/chunk-O5PXQR67.js +249 -0
  152. package/dist/{chunk-PRPPGYZG.js → chunk-O66DM6DJ.js} +6 -4
  153. package/dist/{chunk-KEM4SDDP.js → chunk-O7FDLW7L.js} +11 -8
  154. package/dist/{chunk-T2UYZSCQ.js → chunk-O7XLYEFA.js} +169 -29
  155. package/dist/{chunk-FITWGOJ2.js → chunk-OHNCWBKF.js} +4 -4
  156. package/dist/{chunk-652QWTLZ.js → chunk-OHVTTOPS.js} +3 -3
  157. package/dist/chunk-OMI6FPPN.js +43 -0
  158. package/dist/chunk-ONUPY3H6.js +53 -0
  159. package/dist/chunk-OTLDSZDV.js +69 -0
  160. package/dist/chunk-OUBGGKDU.js +22 -0
  161. package/dist/chunk-OWNCM4ZN.js +330 -0
  162. package/dist/{chunk-YISXLPHN.js → chunk-P2V7QW4D.js} +235 -35
  163. package/dist/{chunk-CNUKCS2T.js → chunk-P32RUW3B.js} +1632 -93
  164. package/dist/{chunk-BWZ77RQT.js → chunk-PAQ2AS5E.js} +1 -1
  165. package/dist/{chunk-ZMAINWBW.js → chunk-PBPBMP2B.js} +4 -3
  166. package/dist/{chunk-ZVM6AKKM.js → chunk-PJSJPMJI.js} +3 -3
  167. package/dist/{chunk-EFHQ3TWP.js → chunk-PKBHS4AA.js} +233 -56
  168. package/dist/{chunk-GT4I4ZWM.js → chunk-PMUAJGLI.js} +20 -16
  169. package/dist/chunk-PPD7HTDP.js +152 -0
  170. package/dist/chunk-PSOFBQWB.js +42 -0
  171. package/dist/{chunk-S2A7YC3Q.js → chunk-Q2TECDIT.js} +10694 -8896
  172. package/dist/chunk-Q4K5WB2W.js +42 -0
  173. package/dist/{chunk-UGLN7QHV.js → chunk-Q6DFNVRJ.js} +14 -12
  174. package/dist/chunk-QA4O2GGC.js +265 -0
  175. package/dist/chunk-QAXW2N3B.js +1216 -0
  176. package/dist/chunk-QBNWF5ZU.js +19 -0
  177. package/dist/chunk-QFWA2DPH.js +224 -0
  178. package/dist/{chunk-23W7VWKR.js → chunk-QKUJMING.js} +1363 -114
  179. package/dist/{chunk-NXFPS2LR.js → chunk-R44CYFPV.js} +16 -13
  180. package/dist/{chunk-CKSITVS4.js → chunk-R7NYHMUU.js} +2687 -786
  181. package/dist/chunk-REWWDVQB.js +162 -0
  182. package/dist/{chunk-JMSCMUCA.js → chunk-RGERPOIV.js} +145 -21
  183. package/dist/{chunk-6JCPI55B.js → chunk-RLDGWLQ7.js} +49 -7
  184. package/dist/chunk-RUGXBPWI.js +384 -0
  185. package/dist/{chunk-CPA6HPVR.js → chunk-RXPJMEOW.js} +18 -12
  186. package/dist/{chunk-3HI6Z55Y.js → chunk-S4PMJU6H.js} +339 -43
  187. package/dist/chunk-S5LSDXV4.js +40 -0
  188. package/dist/chunk-S7FCV7S5.js +51 -0
  189. package/dist/{chunk-5GGOLAKC.js → chunk-SDKLKB6I.js} +28 -26
  190. package/dist/chunk-SFSPGFCV.js +62 -0
  191. package/dist/{chunk-ZNCEKR4J.js → chunk-SFUP7TTO.js} +12 -8
  192. package/dist/{chunk-64EQYWCA.js → chunk-SLXZOMA6.js} +69 -19
  193. package/dist/chunk-SQV37XO2.js +273 -0
  194. package/dist/{chunk-K65BJIMT.js → chunk-SU74NDMQ.js} +19 -17
  195. package/dist/chunk-SYV5LHML.js +165 -0
  196. package/dist/chunk-T4YPZIQN.js +36 -0
  197. package/dist/chunk-T6DQR5TV.js +323 -0
  198. package/dist/{chunk-JIITQXFB.js → chunk-THDMSZ3R.js} +3075 -802
  199. package/dist/{chunk-JGZCG5VM.js → chunk-TNR75OXT.js} +7 -7
  200. package/dist/{chunk-D3PO4DOZ.js → chunk-TUULXQRW.js} +174 -15
  201. package/dist/chunk-TYQBFTBR.js +516 -0
  202. package/dist/chunk-U76OWS3Q.js +49 -0
  203. package/dist/{chunk-YYQN46FY.js → chunk-UCROWG2D.js} +27 -24
  204. package/dist/{chunk-6M5NK3K3.js → chunk-UF4AZOZB.js} +50 -10
  205. package/dist/chunk-UF4GLFBX.js +345 -0
  206. package/dist/{chunk-OT2O76OS.js → chunk-UGUP3ZM6.js} +240 -39
  207. package/dist/chunk-UNAGJYET.js +45 -0
  208. package/dist/{chunk-5WG5YP4T.js → chunk-UOR2DTHH.js} +16 -14
  209. package/dist/{chunk-S3QNRWYR.js → chunk-UPOY4YSQ.js} +14 -12
  210. package/dist/{chunk-EPTBZ3GP.js → chunk-UPS2DGFC.js} +1 -1
  211. package/dist/{chunk-4AK7IBVP.js → chunk-UUU4CLJG.js} +4 -2
  212. package/dist/{chunk-W3BQAZ3Q.js → chunk-UWMJKX5U.js} +14 -12
  213. package/dist/{chunk-QZSX3F7C.js → chunk-UWOJLHFT.js} +27 -23
  214. package/dist/chunk-VBTP56CE.js +535 -0
  215. package/dist/chunk-VCTWPLAO.js +211 -0
  216. package/dist/chunk-VNU26RCO.js +1215 -0
  217. package/dist/{chunk-CSZ4C5N6.js → chunk-VTZMAJ3W.js} +93 -10
  218. package/dist/{chunk-TXLH6WHQ.js → chunk-VW62D6QE.js} +14 -12
  219. package/dist/{chunk-CAQZUNOH.js → chunk-VY72R2XZ.js} +610 -3
  220. package/dist/{chunk-2DIQQJCB.js → chunk-VZALIKIF.js} +18 -15
  221. package/dist/{chunk-TYAID7B7.js → chunk-W62H2XSO.js} +25 -23
  222. package/dist/{chunk-HVUPKCGJ.js → chunk-W7VWI2YH.js} +9 -6
  223. package/dist/{chunk-TANFV3MZ.js → chunk-WERM6KPJ.js} +7 -4
  224. package/dist/{chunk-BOHJZTEQ.js → chunk-WF7B67YE.js} +208 -87
  225. package/dist/{chunk-7FBGJFEE.js → chunk-WG5U3F5V.js} +14 -12
  226. package/dist/{chunk-4NDAAFQT.js → chunk-WJF2CS6M.js} +8 -5
  227. package/dist/{chunk-XAKWMCXI.js → chunk-WKUJ3KPV.js} +4 -4
  228. package/dist/chunk-WMTRHUI5.js +103 -0
  229. package/dist/chunk-WNKPRSGI.js +36 -0
  230. package/dist/chunk-WXFLMQSR.js +223 -0
  231. package/dist/{chunk-RRTKKSLQ.js → chunk-X3WY6MN3.js} +8 -6
  232. package/dist/{chunk-ZCJDOK2S.js → chunk-X4CXA2IL.js} +47 -23
  233. package/dist/{chunk-UBBC2XSG.js → chunk-X5F3Q5LV.js} +560 -105
  234. package/dist/{chunk-C6EKFH7J.js → chunk-XD75VZIH.js} +9 -7
  235. package/dist/chunk-XERYFDB5.js +297 -0
  236. package/dist/chunk-XI2LCCYQ.js +420 -0
  237. package/dist/chunk-Y2EQNWKV.js +933 -0
  238. package/dist/{chunk-LR3R6Z2A.js → chunk-YHCMZC2J.js} +7 -7
  239. package/dist/chunk-YYY3AZFE.js +122 -0
  240. package/dist/{chunk-GDLULHTC.js → chunk-Z5IA3WDR.js} +19 -31
  241. package/dist/{chunk-T6XQL73F.js → chunk-ZFFYNRIO.js} +63 -23
  242. package/dist/{chunk-EDS2L2LD.js → chunk-ZFL7NY4F.js} +56 -27
  243. package/dist/{chunk-YMZ3TNYB.js → chunk-ZGULQAPZ.js} +7 -4
  244. package/dist/{chunk-4SKZDI62.js → chunk-ZIUFM5HT.js} +3 -1
  245. package/dist/{chunk-DKJA76CJ.js → chunk-ZJFRMSJT.js} +15 -13
  246. package/dist/chunk-ZJXLNDH4.js +239 -0
  247. package/dist/chunk-ZQ3ON2VQ.js +252 -0
  248. package/dist/{chunk-HITVBIJS.js → chunk-ZQ7SKESZ.js} +150 -415
  249. package/dist/{chunk-6QSERWXH.js → chunk-ZQXZ2SES.js} +24 -21
  250. package/dist/chunk-ZX57KSEQ.js +39 -0
  251. package/dist/{chunk-I3E7CX4H.js → chunk-ZZK56BLP.js} +5 -3
  252. package/dist/files.json +664 -368
  253. package/dist/packages/naysayer/constitution/constitution.yaml +19 -0
  254. package/dist/packages/sdk/npm/index.js +6194 -2542
  255. package/dist/packages/ui/dist/assets/{elk-api-tma0MCuh.js → elk-api-CIf-0gz5.js} +2 -2
  256. package/dist/packages/ui/dist/assets/index-CoK_Dl0D.js +47 -0
  257. package/dist/packages/ui/dist/assets/index-Dw20IRhQ.css +1 -0
  258. package/dist/packages/ui/dist/index.html +3 -2
  259. package/package.json +5 -5
  260. package/dist/chunk-2BF2EYJV.js +0 -174
  261. package/dist/chunk-42EVSKME.js +0 -37
  262. package/dist/chunk-4BKGMUIK.js +0 -53
  263. package/dist/chunk-5KLGBXG5.js +0 -48
  264. package/dist/chunk-6BNC6EQ4.js +0 -41
  265. package/dist/chunk-6D2CQ5II.js +0 -41
  266. package/dist/chunk-7AVHLZGD.js +0 -45
  267. package/dist/chunk-D46WUV3T.js +0 -33
  268. package/dist/chunk-E36QOJMD.js +0 -47
  269. package/dist/chunk-FQXYPF7E.js +0 -147
  270. package/dist/chunk-GBRFVT63.js +0 -45
  271. package/dist/chunk-ICY36XCH.js +0 -34
  272. package/dist/chunk-J4K3KVLD.js +0 -131
  273. package/dist/chunk-JZU3H6UQ.js +0 -54
  274. package/dist/chunk-NN2ZQEB4.js +0 -38
  275. package/dist/chunk-PCOCACY3.js +0 -385
  276. package/dist/chunk-RTEYOSJY.js +0 -29
  277. package/dist/chunk-RUVFXE2L.js +0 -666
  278. package/dist/chunk-RVH5SUW5.js +0 -69
  279. package/dist/chunk-VN3DP4LQ.js +0 -43
  280. package/dist/chunk-W5BVQF44.js +0 -36
  281. package/dist/chunk-WVPJSRRJ.js +0 -52
  282. package/dist/chunk-XPTOBS2D.js +0 -48
  283. package/dist/packages/ui/dist/assets/index-B54fm9FQ.js +0 -29
  284. 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-XY3P7JW7.js";
19
+ } from "./chunk-IDKCWSM5.js";
18
20
  import {
19
21
  daysBetween,
20
22
  knowledgeGaps,
21
23
  newestEvidence
22
- } from "./chunk-L24C55VN.js";
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-CNUKCS2T.js";
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
- require_dist,
78
+ readQuestion,
79
+ repoReadOf,
66
80
  runsDirOf,
67
81
  stateDirOf,
68
- toCanonicalYaml
69
- } from "./chunk-S2A7YC3Q.js";
82
+ toCanonicalYaml,
83
+ writeQuestion
84
+ } from "./chunk-Q2TECDIT.js";
70
85
  import {
71
86
  writeFileAtomic
72
- } from "./chunk-D3PO4DOZ.js";
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
- source: file.source,
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.boundaryOf(c.system) === "vendor")
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.boundaryOf(sys) !== "vendor";
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 the vendor's published spec (as read into the catalog).",
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
- if (!sys || ctx.boundaryOf(sys) !== "vendor" || !h.method || !h.path)
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 || ctx.systemOf(r.component) === sys || r.component === sys) && (r.method ?? "").toUpperCase() === h.method && normalizePath(r.normalizedPath ?? r.pathOrTopic) === want);
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/questions.js
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 placeOf(ctx, c) {
1695
- const ifaces = docOf(ctx.files, IFACES2);
1891
+ function placeOf2(ctx, c) {
1892
+ const ifaces = docOf(ctx.files, IFACES3);
1696
1893
  if (c.hop && ifaces)
1697
1894
  return {
1698
- artifact: IFACES2,
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 = placeOf(ctx, c);
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, IFACES2);
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.boundaryOf(calleeSystem) === "vendor")
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: IFACES2,
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: IFACES2,
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: IFACES2,
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: IFACES2,
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, IFACES2);
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: IFACES2, locator: rowLocator2(ifaces, d.hop.line) } : { artifact: "catalog", locator: { record: d.record.id } };
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, IFACES2);
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: IFACES2, locator: rowLocator2(ifaces, d.hop.line) } : { artifact: "catalog", locator: { record: r.id } };
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
- by: q.answer.by,
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 m = await readRoundMeta(root, change, gate, n);
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
- return { hits, runs, discarded, skipped, reviewed };
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 blocking = (await checkFindings(root, change, [gate])).map((r) => r.message);
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 && count(open).gaps > 0 && waiting.length === 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}. The gap stops blocking while the question is open.`;
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 { finding: next.data, path: found.path, ...patched ? { patched } : {}, message };
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
  };