scip-query 0.19.1 → 0.19.4

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 (273) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +18 -2
  3. package/dist/augment-vue-worker.js +1 -1
  4. package/dist/{chunk-FHLYJVXF.js → chunk-25LPM4DG.js} +2 -2
  5. package/dist/chunk-2CTX5CMX.js +4 -0
  6. package/dist/chunk-2Y373BDD.js +2 -0
  7. package/dist/{chunk-24ET4VLC.js → chunk-2YU7I3QO.js} +2 -2
  8. package/dist/{chunk-63P42UR6.js → chunk-3MJ5YA4Y.js} +2 -2
  9. package/dist/{chunk-ZNK6K3LB.js → chunk-3SVWW4PN.js} +2 -2
  10. package/dist/{chunk-WWCZCH7W.js → chunk-4333ETTV.js} +2 -2
  11. package/dist/{chunk-Q2WEWIKX.js → chunk-4RSI5EMG.js} +2 -2
  12. package/dist/{chunk-CIYUFF24.js → chunk-4SALD7RU.js} +2 -2
  13. package/dist/{chunk-DCDOGW32.js → chunk-4T3LTWUS.js} +2 -2
  14. package/dist/{chunk-34MLC6UI.js → chunk-4XTA5OMB.js} +2 -2
  15. package/dist/chunk-52ZYCAEO.js +2 -0
  16. package/dist/{chunk-SJ6XSCG7.js → chunk-54HA4ZXH.js} +2 -2
  17. package/dist/{chunk-J4MYRIYT.js → chunk-64RFXJT5.js} +2 -2
  18. package/dist/{chunk-FUFNRZFJ.js → chunk-6E7UTQY7.js} +2 -2
  19. package/dist/{chunk-PNESKY2Z.js → chunk-6NSFJYRC.js} +2 -2
  20. package/dist/{chunk-AOSFSYEA.js → chunk-7B3UPBVA.js} +2 -2
  21. package/dist/{chunk-XCPE3G75.js → chunk-7GXM52MI.js} +2 -2
  22. package/dist/{chunk-6O5JOS7T.js → chunk-A2EZV2UM.js} +2 -2
  23. package/dist/{chunk-4BU54UJG.js → chunk-ABMYA4TN.js} +2 -2
  24. package/dist/{chunk-64QITTX7.js → chunk-B5NLK2B3.js} +2 -2
  25. package/dist/{chunk-OLG2YPLS.js → chunk-BTEE5NZQ.js} +2 -2
  26. package/dist/{chunk-MP43RX4O.js → chunk-C7NIYIQ4.js} +1 -1
  27. package/dist/{chunk-AEM24WSF.js → chunk-CFMXJPHH.js} +2 -2
  28. package/dist/{chunk-JJZRS2OP.js → chunk-CNKAGUPL.js} +2 -2
  29. package/dist/{chunk-MQ2B33LQ.js → chunk-D4U5Q3FT.js} +2 -2
  30. package/dist/{chunk-YZXV3CU3.js → chunk-DGAGY7RJ.js} +1 -1
  31. package/dist/{chunk-FRXB74RQ.js → chunk-DLWR3NUU.js} +5 -5
  32. package/dist/{chunk-YGQBJUS6.js → chunk-DZ74OMG6.js} +2 -2
  33. package/dist/{chunk-APLNTJPJ.js → chunk-EOOJGLDU.js} +2 -2
  34. package/dist/{chunk-TYEGFDOP.js → chunk-F6O7AAC3.js} +2 -2
  35. package/dist/{chunk-HFBNIIZX.js → chunk-FECYOO5O.js} +2 -2
  36. package/dist/{chunk-V7J4A3AH.js → chunk-FWUUZTIO.js} +2 -2
  37. package/dist/{chunk-KMOMNTB4.js → chunk-GBQ5NYPR.js} +2 -2
  38. package/dist/{chunk-JBZXJXIS.js → chunk-GPBBJ5Y4.js} +2 -2
  39. package/dist/{chunk-OOUJBAKJ.js → chunk-H7UKLTWJ.js} +2 -2
  40. package/dist/{chunk-YILKXTIY.js → chunk-HEXVUYFQ.js} +2 -2
  41. package/dist/{chunk-J5XJWCB3.js → chunk-HKEHS2AS.js} +2 -2
  42. package/dist/{chunk-5TEUKVSM.js → chunk-I5AWSI2G.js} +2 -2
  43. package/dist/{chunk-XYBNOILR.js → chunk-I5RJM53C.js} +2 -2
  44. package/dist/{chunk-WCZAABYF.js → chunk-IG7N5ZIK.js} +2 -2
  45. package/dist/{chunk-C3KCSAQ4.js → chunk-IUFDSKGG.js} +2 -2
  46. package/dist/{chunk-OQ6TCHBB.js → chunk-IZKFSVBV.js} +2 -2
  47. package/dist/{chunk-5OZCNAVM.js → chunk-J77UIT3I.js} +2 -2
  48. package/dist/{chunk-B2WQKQKP.js → chunk-K2ERX4UT.js} +2 -2
  49. package/dist/{chunk-PYMZU5EG.js → chunk-KP6XRY5Z.js} +2 -2
  50. package/dist/{chunk-FC5K7T35.js → chunk-L7SPDE73.js} +1 -1
  51. package/dist/{chunk-DZXFZAZO.js → chunk-LBMJEAEW.js} +2 -2
  52. package/dist/chunk-LHMNRHGV.js +3 -0
  53. package/dist/{chunk-CKFMZE77.js → chunk-M7AIS73L.js} +2 -2
  54. package/dist/{chunk-53SUJOJA.js → chunk-M7MTH5NR.js} +2 -2
  55. package/dist/{chunk-6PKO2TNZ.js → chunk-MITTUCEH.js} +2 -2
  56. package/dist/chunk-MSWVMDAH.js +122 -0
  57. package/dist/chunk-NH5ALKPW.js +2 -0
  58. package/dist/{chunk-3WLRW5TC.js → chunk-NPKYOIFM.js} +3 -3
  59. package/dist/{chunk-GIHVWNKQ.js → chunk-NRCXJDHL.js} +2 -2
  60. package/dist/{chunk-5GOBZI34.js → chunk-NSS46APD.js} +2 -2
  61. package/dist/{chunk-HCS5LB6U.js → chunk-NZL2DBT7.js} +2 -2
  62. package/dist/{chunk-SYGAA54M.js → chunk-OMPZHGHO.js} +2 -2
  63. package/dist/{chunk-AGTATREV.js → chunk-P2PC2WGR.js} +2 -2
  64. package/dist/{chunk-CAKPEQZB.js → chunk-Q3AFUTGB.js} +2 -2
  65. package/dist/{chunk-ZJGZCBYT.js → chunk-Q4IIEGXJ.js} +2 -2
  66. package/dist/chunk-QDV6RDCP.js +4 -0
  67. package/dist/{chunk-FTRNGQGR.js → chunk-QGXBRIM5.js} +2 -2
  68. package/dist/{chunk-WXVGNFAO.js → chunk-QOKYJ33H.js} +1 -1
  69. package/dist/{chunk-FB6IKAKZ.js → chunk-QRGV2F7L.js} +2 -2
  70. package/dist/chunk-QVWS2VWZ.js +7 -0
  71. package/dist/{chunk-DFQNE73Y.js → chunk-R4FQGQ4X.js} +2 -2
  72. package/dist/{chunk-4CZJ4YJB.js → chunk-RV2FQIX3.js} +2 -2
  73. package/dist/{chunk-4FMT4HPC.js → chunk-S44IULR6.js} +2 -2
  74. package/dist/{chunk-LQUDSHLB.js → chunk-SOAT6NLA.js} +2 -2
  75. package/dist/{chunk-QHKXGMOI.js → chunk-STOL2BTL.js} +2 -2
  76. package/dist/chunk-SVLTAG5O.js +927 -0
  77. package/dist/{chunk-2WCXKANA.js → chunk-U6WNH5GC.js} +2 -2
  78. package/dist/chunk-U7DSEKOM.js +30 -0
  79. package/dist/{chunk-KMUFGAIK.js → chunk-UKZBVX4U.js} +2 -2
  80. package/dist/chunk-UOAV44HR.js +38 -0
  81. package/dist/chunk-V27BEQJN.js +7 -0
  82. package/dist/{chunk-VIKEPD4D.js → chunk-VGRICIQI.js} +2 -2
  83. package/dist/chunk-VMNZB6WI.js +4 -0
  84. package/dist/{chunk-LF5CIKWZ.js → chunk-VTKGCT3V.js} +5 -5
  85. package/dist/{chunk-WFRET75Z.js → chunk-VXQNNXJE.js} +2 -2
  86. package/dist/{chunk-V5WBVF6K.js → chunk-WER3B7MI.js} +2 -2
  87. package/dist/{chunk-SSXEYWN3.js → chunk-WQTAC523.js} +2 -2
  88. package/dist/{chunk-GAE7WCBK.js → chunk-X6D5IC6I.js} +2 -2
  89. package/dist/{chunk-FBUNGRKI.js → chunk-XLTP42QA.js} +2 -2
  90. package/dist/chunk-XTX6QHOF.js +4 -0
  91. package/dist/{chunk-AYRHVJXW.js → chunk-XYADIZHU.js} +5 -5
  92. package/dist/{chunk-WAU7HVDI.js → chunk-YGAGTIDK.js} +2 -2
  93. package/dist/{chunk-BMTBVMA3.js → chunk-YIJ7ZAA4.js} +3 -3
  94. package/dist/{chunk-BBBKPOIT.js → chunk-YNRNA5LK.js} +2 -2
  95. package/dist/{chunk-BCMOTIB6.js → chunk-YVVCVR2L.js} +2 -2
  96. package/dist/{chunk-RPEA7P5Z.js → chunk-ZAIILQNP.js} +3 -3
  97. package/dist/{chunk-7SGOWD2Y.js → chunk-ZGZUZ7XE.js} +2 -2
  98. package/dist/{chunk-YCSTKIYU.js → chunk-ZXJYMGD3.js} +2 -2
  99. package/dist/cli.js +2 -2
  100. package/dist/{command-descriptors-3EJHQLQZ.js → command-descriptors-MFU4BCJ7.js} +174 -167
  101. package/dist/{config-types-BA3xLCfG.d.ts → config-types-D20KuvvZ.d.ts} +67 -0
  102. package/dist/{db-CzA-9_rL.d.ts → db-G_II8yXU.d.ts} +1 -1
  103. package/dist/diff-gate-types-C9BoYwYD.d.ts +10 -0
  104. package/dist/direct-navigation-MRMQFIRB.js +3 -0
  105. package/dist/{health-DYy13GAe.d.ts → health-oblXYgkF.d.ts} +1 -1
  106. package/dist/index.d.ts +2 -2
  107. package/dist/index.js +1 -1
  108. package/dist/queries/affected.d.ts +2 -2
  109. package/dist/queries/affected.js +1 -1
  110. package/dist/queries/architecture.d.ts +86 -4
  111. package/dist/queries/architecture.js +1 -1
  112. package/dist/queries/bottlenecks.d.ts +2 -2
  113. package/dist/queries/bottlenecks.js +1 -1
  114. package/dist/queries/by-kind.d.ts +2 -2
  115. package/dist/queries/by-kind.js +1 -1
  116. package/dist/queries/call-graph.d.ts +2 -2
  117. package/dist/queries/call-graph.js +1 -1
  118. package/dist/queries/change-surface.d.ts +2 -2
  119. package/dist/queries/change-surface.js +1 -1
  120. package/dist/queries/cleanup-plan.d.ts +2 -2
  121. package/dist/queries/cleanup-plan.js +1 -1
  122. package/dist/queries/co-change.d.ts +2 -2
  123. package/dist/queries/co-change.js +1 -1
  124. package/dist/queries/code.d.ts +2 -2
  125. package/dist/queries/code.js +1 -1
  126. package/dist/queries/complexity-hotspots.d.ts +2 -2
  127. package/dist/queries/complexity-hotspots.js +1 -1
  128. package/dist/queries/complexity.d.ts +2 -2
  129. package/dist/queries/complexity.js +1 -1
  130. package/dist/queries/convergence.d.ts +2 -2
  131. package/dist/queries/convergence.js +1 -1
  132. package/dist/queries/coupling.d.ts +2 -2
  133. package/dist/queries/coupling.js +1 -1
  134. package/dist/queries/cycles.d.ts +2 -2
  135. package/dist/queries/cycles.js +1 -1
  136. package/dist/queries/dataflow.d.ts +2 -2
  137. package/dist/queries/dataflow.js +1 -1
  138. package/dist/queries/dead.d.ts +2 -2
  139. package/dist/queries/dead.js +1 -1
  140. package/dist/queries/decorative-checkers.d.ts +2 -2
  141. package/dist/queries/decorative-checkers.js +1 -1
  142. package/dist/queries/deep-chains.d.ts +2 -2
  143. package/dist/queries/deep-chains.js +1 -1
  144. package/dist/queries/deps.d.ts +2 -2
  145. package/dist/queries/deps.js +1 -1
  146. package/dist/queries/diff-gate.d.ts +3 -3
  147. package/dist/queries/diff-gate.js +1 -1
  148. package/dist/queries/diff-impact.d.ts +4 -8
  149. package/dist/queries/diff-impact.js +1 -1
  150. package/dist/queries/doc-drift.d.ts +3 -3
  151. package/dist/queries/doc-drift.js +1 -1
  152. package/dist/queries/drift.d.ts +2 -2
  153. package/dist/queries/drift.js +1 -1
  154. package/dist/queries/duplicate-bodies.d.ts +2 -2
  155. package/dist/queries/duplicate-bodies.js +1 -1
  156. package/dist/queries/extract-candidates.d.ts +2 -2
  157. package/dist/queries/extract-candidates.js +1 -1
  158. package/dist/queries/fan.d.ts +2 -2
  159. package/dist/queries/fan.js +1 -1
  160. package/dist/queries/files.d.ts +2 -2
  161. package/dist/queries/health.d.ts +3 -3
  162. package/dist/queries/health.js +1 -1
  163. package/dist/queries/hierarchy.d.ts +2 -2
  164. package/dist/queries/hierarchy.js +1 -1
  165. package/dist/queries/hotspots.d.ts +2 -2
  166. package/dist/queries/hotspots.js +1 -1
  167. package/dist/queries/imports.d.ts +2 -2
  168. package/dist/queries/imports.js +1 -1
  169. package/dist/queries/incomplete-migration.d.ts +3 -2
  170. package/dist/queries/incomplete-migration.js +1 -1
  171. package/dist/queries/index.d.ts +21 -5
  172. package/dist/queries/index.js +1 -1
  173. package/dist/queries/isolated.d.ts +2 -2
  174. package/dist/queries/isolated.js +1 -1
  175. package/dist/queries/locality-candidates.d.ts +2 -2
  176. package/dist/queries/locality-candidates.js +1 -1
  177. package/dist/queries/members.d.ts +2 -2
  178. package/dist/queries/members.js +1 -1
  179. package/dist/queries/methods.d.ts +2 -2
  180. package/dist/queries/methods.js +1 -1
  181. package/dist/queries/not-implemented.d.ts +2 -2
  182. package/dist/queries/not-implemented.js +1 -1
  183. package/dist/queries/outline.d.ts +2 -2
  184. package/dist/queries/outline.js +1 -1
  185. package/dist/queries/passthrough-candidates.d.ts +2 -2
  186. package/dist/queries/passthrough-candidates.js +1 -1
  187. package/dist/queries/plan-context.d.ts +2 -2
  188. package/dist/queries/plan-context.js +1 -1
  189. package/dist/queries/react-component-duplicates.d.ts +2 -2
  190. package/dist/queries/react-component-duplicates.js +1 -1
  191. package/dist/queries/react-hook-candidates.d.ts +2 -2
  192. package/dist/queries/react-hook-candidates.js +1 -1
  193. package/dist/queries/react-large-component-pressure.d.ts +2 -2
  194. package/dist/queries/react-large-component-pressure.js +1 -1
  195. package/dist/queries/recent-duplicates.d.ts +2 -2
  196. package/dist/queries/recent-duplicates.js +1 -1
  197. package/dist/queries/redundant-reexports.d.ts +2 -2
  198. package/dist/queries/redundant-reexports.js +1 -1
  199. package/dist/queries/refs.d.ts +2 -2
  200. package/dist/queries/refs.js +1 -1
  201. package/dist/queries/self-audit.d.ts +2 -2
  202. package/dist/queries/self-audit.js +1 -1
  203. package/dist/queries/similar-chains.d.ts +2 -2
  204. package/dist/queries/similar-chains.js +1 -1
  205. package/dist/queries/similar-files.d.ts +2 -2
  206. package/dist/queries/similar-files.js +1 -1
  207. package/dist/queries/similar-signatures.d.ts +2 -2
  208. package/dist/queries/similar-signatures.js +1 -1
  209. package/dist/queries/similar.d.ts +2 -2
  210. package/dist/queries/similar.js +1 -1
  211. package/dist/queries/slice.d.ts +2 -2
  212. package/dist/queries/slice.js +1 -1
  213. package/dist/queries/stale-abstractions.d.ts +2 -2
  214. package/dist/queries/stale-abstractions.js +1 -1
  215. package/dist/queries/stats.d.ts +2 -2
  216. package/dist/queries/surface.d.ts +2 -2
  217. package/dist/queries/surface.js +1 -1
  218. package/dist/queries/symbols.d.ts +2 -2
  219. package/dist/queries/symbols.js +1 -1
  220. package/dist/queries/system.d.ts +2 -2
  221. package/dist/queries/system.js +1 -1
  222. package/dist/queries/test-quality.d.ts +2 -2
  223. package/dist/queries/test-quality.js +1 -1
  224. package/dist/queries/trace.d.ts +2 -2
  225. package/dist/queries/trace.js +1 -1
  226. package/dist/queries/twin-ab.d.ts +2 -2
  227. package/dist/queries/twin-ab.js +1 -1
  228. package/dist/queries/twin-drift.d.ts +2 -2
  229. package/dist/queries/twin-drift.js +1 -1
  230. package/dist/queries/unused-imports.d.ts +2 -2
  231. package/dist/queries/unused-imports.js +1 -1
  232. package/dist/queries/unused-params.d.ts +2 -2
  233. package/dist/queries/unused-params.js +1 -1
  234. package/dist/queries/vue-component-duplicates.d.ts +2 -2
  235. package/dist/queries/vue-component-duplicates.js +1 -1
  236. package/dist/queries/vue-composable-candidates.d.ts +2 -2
  237. package/dist/queries/vue-composable-candidates.js +1 -1
  238. package/dist/queries/vue-large-view-pressure.d.ts +2 -2
  239. package/dist/queries/vue-large-view-pressure.js +1 -1
  240. package/dist/queries/wrapper-candidates.d.ts +2 -2
  241. package/dist/queries/wrapper-candidates.js +1 -1
  242. package/dist/reindex-worker.js +24 -24
  243. package/dist/reindex.d.ts +3 -3
  244. package/dist/reindex.js +38 -38
  245. package/dist/runtime.d.ts +9 -4
  246. package/dist/runtime.js +2 -2
  247. package/dist/rust-semantic-session-worker.js +1 -1
  248. package/dist/rust-semantic-worker.js +1 -1
  249. package/dist/{scip-cli-1bVKJgXi.d.ts → scip-cli-kRpaexVJ.d.ts} +1 -1
  250. package/dist/watch-server.js +5 -5
  251. package/docs/AI_FAILURE_MODES.md +1 -1
  252. package/docs/COMMAND_REFERENCE.md +1 -1
  253. package/docs/DETECTOR_GUIDE.md +1 -1
  254. package/docs/analyzer-inventory.md +1 -1
  255. package/docs/analyzer-validation-ledger.md +131 -1
  256. package/docs/architecture-coherence-vision.md +29 -0
  257. package/package.json +2 -2
  258. package/dist/chunk-2NA6TYP4.js +0 -120
  259. package/dist/chunk-5W2VAEVR.js +0 -4
  260. package/dist/chunk-7TJJY2C3.js +0 -2
  261. package/dist/chunk-DO775SYA.js +0 -2
  262. package/dist/chunk-DRH3AD7W.js +0 -4
  263. package/dist/chunk-E3KWOHH7.js +0 -5
  264. package/dist/chunk-EMIIOOTM.js +0 -38
  265. package/dist/chunk-ESNRT7QN.js +0 -927
  266. package/dist/chunk-IOOCKVUA.js +0 -6
  267. package/dist/chunk-KC2IFAAU.js +0 -3
  268. package/dist/chunk-NTOBQK5H.js +0 -4
  269. package/dist/chunk-UJKZQLDB.js +0 -2
  270. package/dist/chunk-US44MEVU.js +0 -29
  271. package/dist/chunk-XZXUMGAA.js +0 -7
  272. package/dist/diff-gate-types-CG2YQ_ei.d.ts +0 -4
  273. package/dist/direct-navigation-C2A44KFT.js +0 -3
@@ -177,7 +177,7 @@ enforce (see `docs/plans/2026-07-02-followups.md` items 6 and 9).
177
177
  Followup #6 closed the one confirmed gap in an otherwise-wired battery command: `co-change`
178
178
  (`src/runtime/query-commands/impact.ts`) used the plain `dbCommand` and never disclosed a budget,
179
179
  even though its per-pair classification loop in `queries.coChange`
180
- (`src/queries/impact/co-change.ts`) does real filesystem/graph work whose cost scales with
180
+ (`src/queries/cleanup/co-change.ts`) does real filesystem/graph work whose cost scales with
181
181
  candidate-pair count on a large repository. It now flows through `budgetedDbCommand` and
182
182
  `coChange` accepts a `scanLimit` option that truncates the (already priority-sorted) candidate
183
183
  pairs before classification, so the disclosed budget is truthful rather than cosmetic.
@@ -92,7 +92,7 @@ coverage, reciprocity, and connected-group signals.
92
92
  | `co-change-partner` | Historically coupled files that usually change together but are missing from this diff. | Default diff gate. |
93
93
  | `twin-partner` | A changed symbol has a same-(near-)name twin (identical or already-divergent) elsewhere that this diff left untouched. | Default diff gate. Advisory: findings print but never cause a nonzero exit by themselves. |
94
94
  | `coverage-contract` | A configured `coverageContracts` entry (.scipquery.json) drifted: its declared key set no longer matches its ground-truth source. | Default diff gate, only when either side of a configured contract changed. |
95
- | `architecture` | A declared architecture boundary rule has a violation absent from the committed health baseline. | Default diff gate when closed dependency rows, requireCompletePolicy, or requireAcyclic are configured and a baseline exists. |
95
+ | `architecture` | A declared architecture boundary rule has a violation absent from the committed health baseline. | Default diff gate when closed dependency rows, requireCompletePolicy, requireAcyclic, requireResolvedBoundaries, requireMinimalPolicy, maxBoundaryFanOut, global maxBoundaryFiles, per-boundary maxFiles, or testPaths are configured and a baseline exists. |
96
96
  | `doc-reference` | Docs that cite changed files and may need a matching update. Dated snapshot docs (docs.snapshotPaths) are excluded by policy. | Default diff gate. Advisory (21.2) for bare file-mention citations; blocking when the citation has a line anchor or the cited file was deleted/renamed. |
97
97
  | `unused-params` | Fresh trailing parameters or options that no changed body uses. | Default diff gate. |
98
98
  | `new-dead` | Changed production symbols with zero indexed consumers. | Default diff gate. |
@@ -94,7 +94,7 @@ The declared-coupling config has been refreshed after the inventory surfaced old
94
94
  | `hotspots` | Most referenced symbols | Support/contextual signal | Identifies choke points. Not a smell alone. |
95
95
  | `fan-in` / `fan-out` | Reference counts into symbols or out of files | Support analysis | Raw graph metrics. |
96
96
  | `coupling` | Shared symbols between two files or top coupled pairs, coupling kind, action tier, evidence reasons, recommendation | Contextual signal | May reveal boundary problems, but shared symbols can be intended. Output now makes the coordination-pressure interpretation explicit. |
97
- | `architecture` | Project-owned boundary paths and dependency rules applied to resolved import and re-export edges, with mapping coverage, policy-row coverage, edge breadth, reciprocity, and SCCs | Split by evidence | Forbidden edges, required-but-missing policy rows, and cycles under `requireAcyclic` are direct policy findings. Unmapped files, reciprocity, and advisory cycles remain report-only signals. |
97
+ | `architecture` | Project-owned boundary paths and dependency rules applied to resolved import and re-export edges, with mapping coverage, policy-row coverage, edge breadth, reciprocity, and SCCs | Split by evidence | Forbidden edges, required-but-missing policy rows, cycles under `requireAcyclic`, and boundaries hiding an internal sub-directory cycle under `requireResolvedBoundaries` are direct policy findings. Unmapped files, reciprocity, and advisory cycles remain report-only signals. |
98
98
  | `deep-chains` | Longest dependency chains after SCC condensation, suffix de-duplication, chain kind, action tier, evidence reasons, recommendation | Contextual signal | Long chains imply propagation risk, but action depends on layers and ownership. Strict suffix duplicates are now removed from top results. |
99
99
  | `complexity` | Branch count, cyclomatic estimate, callee count, fan-in, fan-out for one symbol | Direct repair pressure | This is closer to the user-specified "cyclomatic complexity" analyzer than `complexity-hotspots`. Should score strongly when branches/cyclomatic exceed thresholds. |
100
100
  | `self-audit` | Cheap evidence paths checked against TypeScript compiler oracle | Meta analysis | Measures analyzer accuracy. Should guide trust/weight, not code health directly. |
@@ -368,10 +368,140 @@ full evidence is in
368
368
  ## 2026-07-23 Architecture Coherence Follow-Up
369
369
 
370
370
  `src/runtime/commands/query-command-specs.ts` remains the canonical public
371
- query order after adding `architecture` to the graph family. The enforcement
371
+ query order after adding `architecture` to the graph family. (The file moved to
372
+ `src/runtime/query-commands/` in the 2026-07-24 boundary-resolution pass; the
373
+ public query order itself is unchanged.) The enforcement
372
374
  follow-up replaced drift's repository-specific policy with project-owned
373
375
  configuration and added stable boundary-pair identities to the shared health
374
376
  baseline. The default diff gate now blocks only new configured forbidden edges
375
377
  or explicitly forbidden cycles; accepted existing identities remain ratcheted.
376
378
  Reciprocal pairs, unmapped files, undeclared edges, and undeclared cycles remain
377
379
  contextual signals until external calibration.
380
+
381
+ ## 2026-07-24 Boundary Resolution and Coarse-Boundary Detection
382
+
383
+ `architecture` gained a second enforceable rule, `requireResolvedBoundaries`,
384
+ and a corresponding finding class `architecture:coarse-boundary:<boundary>`
385
+ carried through the same health-baseline ratchet as forbidden edges and cycles.
386
+
387
+ The rule exists because `requireAcyclic` had a structural blind spot rather than
388
+ a precision problem. `analyzeArchitectureGraph` discards every dependency whose
389
+ endpoints share a boundary before running SCC, so a boundary coarse enough to
390
+ contain both sides of a cycle passes while asserting nothing about the code it
391
+ holds. This repository was the demonstrating case: 14 declared boundaries with
392
+ `requireAcyclic: true` reported zero cycles while six of them — holding 295 of
393
+ 348 files — each contained an internal cycle.
394
+
395
+ **Validation.** The detector was run against the pre-change tree in an isolated
396
+ worktree, using the original 14-boundary configuration. `requireAcyclic`
397
+ reported 0 cycles; `detectCoarseBoundaries` reported exactly the 6 boundaries
398
+ identified by manual analysis (`queries`, `runtime`, `semantic`, `source`,
399
+ `reindex`, `symbols`), and its `narrowestEdges` named the precise imports the
400
+ repair pass then removed. On the repaired tree it reports 0. Both directions are
401
+ covered, so the result is not an artifact of a permanently-firing check.
402
+
403
+ **Precision decision.** Module-hierarchy suppression is content-aware, not
404
+ path-based. `classifyFile` decides "barrel" from the filename, which labels
405
+ every `index.ts` bookkeeping — including `src/language-parsers/index.ts`, a
406
+ 130-line cache module that was the *target* of the narrowest real back edge in
407
+ the repository. A path-based rule therefore produced a false negative on the
408
+ single most important finding. A barrel is now excluded only when the index
409
+ records no definitions of its own inside it.
410
+
411
+ Directory nesting alone is deliberately not a suppression signal. An earlier
412
+ draft suppressed any component whose sub-units shared an ancestor directory,
413
+ which silently hid the `queries` and `semantic` findings — a boundary's root
414
+ files depending on one of its own sub-directories is the most common real
415
+ intra-boundary cycle, not module bookkeeping.
416
+
417
+ **Known limits, not yet calibrated.** Sub-units are one directory level, so a
418
+ layer inversion *inside* a single directory is invisible; the `src/source`
419
+ primitives/facts/products tangle had to be derived by hand and was fixed by
420
+ splitting the directory. Test files are not SCIP-indexed and are therefore
421
+ outside boundary enforcement entirely. `requireCompletePolicy` checks that a
422
+ dependency row exists, not that it is minimal, so an allowance can outlive the
423
+ edge that justified it.
424
+
425
+ ## 2026-07-24 Boundary Enforcement Gap Closure
426
+
427
+ Five rules were added to `architecture` after auditing what boundary
428
+ enforcement still could not see. Each is opt-in and defaults to off, so
429
+ upgrading tightens no existing project's gate.
430
+
431
+ | Rule | Closes | Finding identity |
432
+ | --- | --- | --- |
433
+ | `requireMinimalPolicy` | A declared allowance outliving the edge that justified it. `requireCompletePolicy` checks a row *exists*, never that it is *minimal*, so policy widens silently. | `architecture:stale-allowance:<from>:<to>` |
434
+ | `maxBoundaryFanOut` / global `maxBoundaryFiles` / per-boundary `maxFiles` | A boundary growing until it is coupled to most of the system. A local file ceiling overrides the global default only for its reviewed boundary. Coarseness was previously caught only when it *hid a cycle*, never when it merely got large. | `architecture:boundary-limit:<kind>:<boundary>` |
435
+ | `testPaths` | Test files are excluded from the compiler project and therefore from the index, leaving them outside every boundary rule. | `architecture:test-boundary:<test>:<boundary>` |
436
+ | `subUnits: 'file'` | A layer inversion *inside* one directory, invisible when sub-units are directories. | (reuses `coarse-boundary`) |
437
+ | `fragileEdges` (report-only) | No signal distinguishing a load-bearing dependency from one resting on a single import. 60 of 251 edges here are single-import. | none — advisory |
438
+
439
+ **Test-boundary calibration.** The first rule shape — "a test may import only what
440
+ its subject's boundary may import" — produced 91 findings, nearly all
441
+ legitimate: a test for `analysis/git-history` drives it *through*
442
+ `queries/cleanup/co-change`, which is composition, not coupling. The shipped
443
+ rule allows the subject's **transitive** reach plus any boundary that reaches
444
+ the subject (a consumer is the natural driver). That yields 0 findings here,
445
+ and a planted violation (`source-vue` test importing `reindex-vue`, which is
446
+ unrelated in both directions) is caught. Subject resolution requires the
447
+ mirrored path to be a **real file**: boundary globs match paths that do not
448
+ exist, so trusting them attributed cross-cutting tests to whichever directory
449
+ they sat in and produced 4 false positives.
450
+
451
+ **One audited gap was not real.** "Dynamic `import()` counts as a static edge"
452
+ was measured with `scip-query deps`, which builds its graph with
453
+ `scipEdges: 'all-references'`. `architecture` builds with
454
+ `scipEdges: 'imports-only'`, which never includes dynamic import edges — zero
455
+ boundary edges in this repository are backed by the file whose only
456
+ `query-commands` reference is an `await import()`. The dynamic-import detector
457
+ written against that premise was removed rather than shipped, since it guarded
458
+ a case the code path cannot produce and cost a source scan per file. Recorded
459
+ here because the two graph configurations are easy to conflate when reasoning
460
+ about architecture from `deps` output.
461
+
462
+ ## 2026-07-24 Review Remediation (boundary resolution)
463
+
464
+ Seven review findings against the boundary work were resolved. Recorded because
465
+ three changed a decision rather than a line.
466
+
467
+ **The `source` / `language-parsers` split was reverted.** The target
468
+ architecture forbids re-splitting them "merely to force a layer direction," and
469
+ that is exactly what the split did once the underlying cycle was repaired. The
470
+ merged `source` boundary is now internally acyclic and is verified as such by
471
+ `requireResolvedBoundaries`, so the enforcement goal is met without
472
+ contradicting the normative decision. This is the better outcome: the rule and
473
+ the enforcement now agree instead of competing. `docs/architecture/scip-query-target-architecture.md`
474
+ records the 14-boundary configuration as superseded, with current counts.
475
+
476
+ **`subUnits` was unvalidated — the highest-risk defect.** Detection treats every
477
+ value other than `'file'` as directory granularity, so `subUnits: "files"`
478
+ passed validation and silently disabled the same-directory enforcement the
479
+ option exists to turn on. A config option whose typo mode is "quietly do
480
+ nothing" is worse than no option. Now validated as a closed set, with a
481
+ regression test, alongside tests for the growth limits and `testPaths`.
482
+
483
+ **The coarse-boundary identity encoded its members.** The identity is the
484
+ persistent baseline comparison key, so including the current SCC membership
485
+ meant adding one file to a tangle read as the old finding being fixed plus a
486
+ new one appearing — ratchet churn on a problem that never went away. Now keyed
487
+ by boundary alone.
488
+
489
+ **Plan step B1.6 was completed rather than abandoned.** The plan called for
490
+ moving the baseline checks into `queries/internal`; the literal move is
491
+ impossible, because `checkHealthBaseline` runs every health detector and would
492
+ create `internal -> cleanup` against the existing `cleanup -> internal`. The
493
+ shared parts — file format, path resolution, identity normalization, and the
494
+ new-versus-fixed comparison — moved to `queries/internal/baseline-file.ts`, and
495
+ `checkArchitectureBaseline` moved to `queries/graph/architecture-baseline.ts`
496
+ beside the report it reads. `checkHealthBaseline` stays in health because
497
+ collecting findings is intrinsically a detector-layer concern. The relocation
498
+ immediately produced the `requireMinimalPolicy` rule's first real finding: a
499
+ `queries-health -> symbols-core` allowance left stale by the moved import.
500
+
501
+ **Two smaller corrections.** `detectCoarseBoundaries` defaulted its classifier
502
+ to `() => false`, so a direct caller reported barrel and entry bookkeeping; it
503
+ now defaults to the path-based `classifyFile` test, with `architecture(db)`
504
+ still overriding it with the content-aware version. And the report described a
505
+ single-import edge as "incidental rather than load-bearing" — the graph
506
+ establishes edge breadth, not importance, so it now reports the measurement and
507
+ says explicitly that breadth alone settles nothing.
@@ -87,6 +87,35 @@ row for a boundary that may depend on nothing. `requireAcyclic` independently
87
87
  forbids multi-boundary strongly connected components. A project should enable
88
88
  both only after the observed graph has been classified and repaired.
89
89
 
90
+ `requireResolvedBoundaries` closes the gap those two leave open. Same-boundary
91
+ dependencies are always allowed, so every edge inside a boundary is discarded
92
+ before `requireAcyclic` runs — which means a boundary coarse enough to contain
93
+ both sides of a cycle passes the check while saying nothing about the code
94
+ inside it. The rule quotients each boundary by its sub-directories and requires
95
+ that quotient to be acyclic too, so "no cycles" keeps its meaning as boundaries
96
+ grow. It reports the narrowest internal edge as the inspection point, because a
97
+ hidden cycle is usually one import against a dominant direction rather than a
98
+ tangle.
99
+
100
+ Four narrower rules close the remaining holes. `requireMinimalPolicy` rejects a
101
+ declared allowance no edge uses, because `requireCompletePolicy` checks only
102
+ that a row exists and a stale row widens the policy silently.
103
+ `maxBoundaryFanOut` and global `maxBoundaryFiles` bound growth, since coarseness
104
+ was otherwise caught only when it hid a cycle. A boundary-specific `maxFiles`
105
+ overrides the global file ceiling only for that reviewed responsibility.
106
+ `testPaths` brings test files back
107
+ under enforcement — they are excluded from the compiler project and so from the
108
+ index, which put them outside every rule — judging each test against the
109
+ boundary of the code it covers, while still allowing it to reach anything that
110
+ subject transitively reaches or that reaches the subject. And a boundary may set
111
+ `subUnits: "file"` when its members form layers inside one directory.
112
+
113
+ The failure it prevents is specific: this repository's own configuration
114
+ declared 14 boundaries with `requireAcyclic: true` and reported zero cycles,
115
+ while six of those boundaries — holding 85% of all files — each contained an
116
+ internal cycle. The clean result was an artifact of granularity, not a property
117
+ of the code.
118
+
90
119
  ## What the Analyzer Should Report
91
120
 
92
121
  The report should preserve both policy truth and graph evidence:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scip-query",
3
- "version": "0.19.1",
3
+ "version": "0.19.4",
4
4
  "description": "Evidence and verification for AI coding agents: map code, reuse concepts, finish migrations, and gate diffs.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -324,7 +324,7 @@
324
324
  "bench:native-symbol-leaf": "node scripts/bench-native-symbol-leaf.mjs",
325
325
  "calibrate": "node scripts/accuracy-calibration.mjs",
326
326
  "docs:commands": "vite-node scripts/render-command-reference.ts --write",
327
- "prepublishOnly": "npm run publish:scip-windows && npm run build",
327
+ "prepublishOnly": "vite-node scripts/publish-scip-windows.ts && npm run build",
328
328
  "postinstall": "node dist/postinstall.js || true",
329
329
  "publish:scip-windows": "vite-node scripts/publish-scip-windows.ts"
330
330
  },