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.
- package/CHANGELOG.md +25 -0
- package/README.md +18 -2
- package/dist/augment-vue-worker.js +1 -1
- package/dist/{chunk-FHLYJVXF.js → chunk-25LPM4DG.js} +2 -2
- package/dist/chunk-2CTX5CMX.js +4 -0
- package/dist/chunk-2Y373BDD.js +2 -0
- package/dist/{chunk-24ET4VLC.js → chunk-2YU7I3QO.js} +2 -2
- package/dist/{chunk-63P42UR6.js → chunk-3MJ5YA4Y.js} +2 -2
- package/dist/{chunk-ZNK6K3LB.js → chunk-3SVWW4PN.js} +2 -2
- package/dist/{chunk-WWCZCH7W.js → chunk-4333ETTV.js} +2 -2
- package/dist/{chunk-Q2WEWIKX.js → chunk-4RSI5EMG.js} +2 -2
- package/dist/{chunk-CIYUFF24.js → chunk-4SALD7RU.js} +2 -2
- package/dist/{chunk-DCDOGW32.js → chunk-4T3LTWUS.js} +2 -2
- package/dist/{chunk-34MLC6UI.js → chunk-4XTA5OMB.js} +2 -2
- package/dist/chunk-52ZYCAEO.js +2 -0
- package/dist/{chunk-SJ6XSCG7.js → chunk-54HA4ZXH.js} +2 -2
- package/dist/{chunk-J4MYRIYT.js → chunk-64RFXJT5.js} +2 -2
- package/dist/{chunk-FUFNRZFJ.js → chunk-6E7UTQY7.js} +2 -2
- package/dist/{chunk-PNESKY2Z.js → chunk-6NSFJYRC.js} +2 -2
- package/dist/{chunk-AOSFSYEA.js → chunk-7B3UPBVA.js} +2 -2
- package/dist/{chunk-XCPE3G75.js → chunk-7GXM52MI.js} +2 -2
- package/dist/{chunk-6O5JOS7T.js → chunk-A2EZV2UM.js} +2 -2
- package/dist/{chunk-4BU54UJG.js → chunk-ABMYA4TN.js} +2 -2
- package/dist/{chunk-64QITTX7.js → chunk-B5NLK2B3.js} +2 -2
- package/dist/{chunk-OLG2YPLS.js → chunk-BTEE5NZQ.js} +2 -2
- package/dist/{chunk-MP43RX4O.js → chunk-C7NIYIQ4.js} +1 -1
- package/dist/{chunk-AEM24WSF.js → chunk-CFMXJPHH.js} +2 -2
- package/dist/{chunk-JJZRS2OP.js → chunk-CNKAGUPL.js} +2 -2
- package/dist/{chunk-MQ2B33LQ.js → chunk-D4U5Q3FT.js} +2 -2
- package/dist/{chunk-YZXV3CU3.js → chunk-DGAGY7RJ.js} +1 -1
- package/dist/{chunk-FRXB74RQ.js → chunk-DLWR3NUU.js} +5 -5
- package/dist/{chunk-YGQBJUS6.js → chunk-DZ74OMG6.js} +2 -2
- package/dist/{chunk-APLNTJPJ.js → chunk-EOOJGLDU.js} +2 -2
- package/dist/{chunk-TYEGFDOP.js → chunk-F6O7AAC3.js} +2 -2
- package/dist/{chunk-HFBNIIZX.js → chunk-FECYOO5O.js} +2 -2
- package/dist/{chunk-V7J4A3AH.js → chunk-FWUUZTIO.js} +2 -2
- package/dist/{chunk-KMOMNTB4.js → chunk-GBQ5NYPR.js} +2 -2
- package/dist/{chunk-JBZXJXIS.js → chunk-GPBBJ5Y4.js} +2 -2
- package/dist/{chunk-OOUJBAKJ.js → chunk-H7UKLTWJ.js} +2 -2
- package/dist/{chunk-YILKXTIY.js → chunk-HEXVUYFQ.js} +2 -2
- package/dist/{chunk-J5XJWCB3.js → chunk-HKEHS2AS.js} +2 -2
- package/dist/{chunk-5TEUKVSM.js → chunk-I5AWSI2G.js} +2 -2
- package/dist/{chunk-XYBNOILR.js → chunk-I5RJM53C.js} +2 -2
- package/dist/{chunk-WCZAABYF.js → chunk-IG7N5ZIK.js} +2 -2
- package/dist/{chunk-C3KCSAQ4.js → chunk-IUFDSKGG.js} +2 -2
- package/dist/{chunk-OQ6TCHBB.js → chunk-IZKFSVBV.js} +2 -2
- package/dist/{chunk-5OZCNAVM.js → chunk-J77UIT3I.js} +2 -2
- package/dist/{chunk-B2WQKQKP.js → chunk-K2ERX4UT.js} +2 -2
- package/dist/{chunk-PYMZU5EG.js → chunk-KP6XRY5Z.js} +2 -2
- package/dist/{chunk-FC5K7T35.js → chunk-L7SPDE73.js} +1 -1
- package/dist/{chunk-DZXFZAZO.js → chunk-LBMJEAEW.js} +2 -2
- package/dist/chunk-LHMNRHGV.js +3 -0
- package/dist/{chunk-CKFMZE77.js → chunk-M7AIS73L.js} +2 -2
- package/dist/{chunk-53SUJOJA.js → chunk-M7MTH5NR.js} +2 -2
- package/dist/{chunk-6PKO2TNZ.js → chunk-MITTUCEH.js} +2 -2
- package/dist/chunk-MSWVMDAH.js +122 -0
- package/dist/chunk-NH5ALKPW.js +2 -0
- package/dist/{chunk-3WLRW5TC.js → chunk-NPKYOIFM.js} +3 -3
- package/dist/{chunk-GIHVWNKQ.js → chunk-NRCXJDHL.js} +2 -2
- package/dist/{chunk-5GOBZI34.js → chunk-NSS46APD.js} +2 -2
- package/dist/{chunk-HCS5LB6U.js → chunk-NZL2DBT7.js} +2 -2
- package/dist/{chunk-SYGAA54M.js → chunk-OMPZHGHO.js} +2 -2
- package/dist/{chunk-AGTATREV.js → chunk-P2PC2WGR.js} +2 -2
- package/dist/{chunk-CAKPEQZB.js → chunk-Q3AFUTGB.js} +2 -2
- package/dist/{chunk-ZJGZCBYT.js → chunk-Q4IIEGXJ.js} +2 -2
- package/dist/chunk-QDV6RDCP.js +4 -0
- package/dist/{chunk-FTRNGQGR.js → chunk-QGXBRIM5.js} +2 -2
- package/dist/{chunk-WXVGNFAO.js → chunk-QOKYJ33H.js} +1 -1
- package/dist/{chunk-FB6IKAKZ.js → chunk-QRGV2F7L.js} +2 -2
- package/dist/chunk-QVWS2VWZ.js +7 -0
- package/dist/{chunk-DFQNE73Y.js → chunk-R4FQGQ4X.js} +2 -2
- package/dist/{chunk-4CZJ4YJB.js → chunk-RV2FQIX3.js} +2 -2
- package/dist/{chunk-4FMT4HPC.js → chunk-S44IULR6.js} +2 -2
- package/dist/{chunk-LQUDSHLB.js → chunk-SOAT6NLA.js} +2 -2
- package/dist/{chunk-QHKXGMOI.js → chunk-STOL2BTL.js} +2 -2
- package/dist/chunk-SVLTAG5O.js +927 -0
- package/dist/{chunk-2WCXKANA.js → chunk-U6WNH5GC.js} +2 -2
- package/dist/chunk-U7DSEKOM.js +30 -0
- package/dist/{chunk-KMUFGAIK.js → chunk-UKZBVX4U.js} +2 -2
- package/dist/chunk-UOAV44HR.js +38 -0
- package/dist/chunk-V27BEQJN.js +7 -0
- package/dist/{chunk-VIKEPD4D.js → chunk-VGRICIQI.js} +2 -2
- package/dist/chunk-VMNZB6WI.js +4 -0
- package/dist/{chunk-LF5CIKWZ.js → chunk-VTKGCT3V.js} +5 -5
- package/dist/{chunk-WFRET75Z.js → chunk-VXQNNXJE.js} +2 -2
- package/dist/{chunk-V5WBVF6K.js → chunk-WER3B7MI.js} +2 -2
- package/dist/{chunk-SSXEYWN3.js → chunk-WQTAC523.js} +2 -2
- package/dist/{chunk-GAE7WCBK.js → chunk-X6D5IC6I.js} +2 -2
- package/dist/{chunk-FBUNGRKI.js → chunk-XLTP42QA.js} +2 -2
- package/dist/chunk-XTX6QHOF.js +4 -0
- package/dist/{chunk-AYRHVJXW.js → chunk-XYADIZHU.js} +5 -5
- package/dist/{chunk-WAU7HVDI.js → chunk-YGAGTIDK.js} +2 -2
- package/dist/{chunk-BMTBVMA3.js → chunk-YIJ7ZAA4.js} +3 -3
- package/dist/{chunk-BBBKPOIT.js → chunk-YNRNA5LK.js} +2 -2
- package/dist/{chunk-BCMOTIB6.js → chunk-YVVCVR2L.js} +2 -2
- package/dist/{chunk-RPEA7P5Z.js → chunk-ZAIILQNP.js} +3 -3
- package/dist/{chunk-7SGOWD2Y.js → chunk-ZGZUZ7XE.js} +2 -2
- package/dist/{chunk-YCSTKIYU.js → chunk-ZXJYMGD3.js} +2 -2
- package/dist/cli.js +2 -2
- package/dist/{command-descriptors-3EJHQLQZ.js → command-descriptors-MFU4BCJ7.js} +174 -167
- package/dist/{config-types-BA3xLCfG.d.ts → config-types-D20KuvvZ.d.ts} +67 -0
- package/dist/{db-CzA-9_rL.d.ts → db-G_II8yXU.d.ts} +1 -1
- package/dist/diff-gate-types-C9BoYwYD.d.ts +10 -0
- package/dist/direct-navigation-MRMQFIRB.js +3 -0
- package/dist/{health-DYy13GAe.d.ts → health-oblXYgkF.d.ts} +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/queries/affected.d.ts +2 -2
- package/dist/queries/affected.js +1 -1
- package/dist/queries/architecture.d.ts +86 -4
- package/dist/queries/architecture.js +1 -1
- package/dist/queries/bottlenecks.d.ts +2 -2
- package/dist/queries/bottlenecks.js +1 -1
- package/dist/queries/by-kind.d.ts +2 -2
- package/dist/queries/by-kind.js +1 -1
- package/dist/queries/call-graph.d.ts +2 -2
- package/dist/queries/call-graph.js +1 -1
- package/dist/queries/change-surface.d.ts +2 -2
- package/dist/queries/change-surface.js +1 -1
- package/dist/queries/cleanup-plan.d.ts +2 -2
- package/dist/queries/cleanup-plan.js +1 -1
- package/dist/queries/co-change.d.ts +2 -2
- package/dist/queries/co-change.js +1 -1
- package/dist/queries/code.d.ts +2 -2
- package/dist/queries/code.js +1 -1
- package/dist/queries/complexity-hotspots.d.ts +2 -2
- package/dist/queries/complexity-hotspots.js +1 -1
- package/dist/queries/complexity.d.ts +2 -2
- package/dist/queries/complexity.js +1 -1
- package/dist/queries/convergence.d.ts +2 -2
- package/dist/queries/convergence.js +1 -1
- package/dist/queries/coupling.d.ts +2 -2
- package/dist/queries/coupling.js +1 -1
- package/dist/queries/cycles.d.ts +2 -2
- package/dist/queries/cycles.js +1 -1
- package/dist/queries/dataflow.d.ts +2 -2
- package/dist/queries/dataflow.js +1 -1
- package/dist/queries/dead.d.ts +2 -2
- package/dist/queries/dead.js +1 -1
- package/dist/queries/decorative-checkers.d.ts +2 -2
- package/dist/queries/decorative-checkers.js +1 -1
- package/dist/queries/deep-chains.d.ts +2 -2
- package/dist/queries/deep-chains.js +1 -1
- package/dist/queries/deps.d.ts +2 -2
- package/dist/queries/deps.js +1 -1
- package/dist/queries/diff-gate.d.ts +3 -3
- package/dist/queries/diff-gate.js +1 -1
- package/dist/queries/diff-impact.d.ts +4 -8
- package/dist/queries/diff-impact.js +1 -1
- package/dist/queries/doc-drift.d.ts +3 -3
- package/dist/queries/doc-drift.js +1 -1
- package/dist/queries/drift.d.ts +2 -2
- package/dist/queries/drift.js +1 -1
- package/dist/queries/duplicate-bodies.d.ts +2 -2
- package/dist/queries/duplicate-bodies.js +1 -1
- package/dist/queries/extract-candidates.d.ts +2 -2
- package/dist/queries/extract-candidates.js +1 -1
- package/dist/queries/fan.d.ts +2 -2
- package/dist/queries/fan.js +1 -1
- package/dist/queries/files.d.ts +2 -2
- package/dist/queries/health.d.ts +3 -3
- package/dist/queries/health.js +1 -1
- package/dist/queries/hierarchy.d.ts +2 -2
- package/dist/queries/hierarchy.js +1 -1
- package/dist/queries/hotspots.d.ts +2 -2
- package/dist/queries/hotspots.js +1 -1
- package/dist/queries/imports.d.ts +2 -2
- package/dist/queries/imports.js +1 -1
- package/dist/queries/incomplete-migration.d.ts +3 -2
- package/dist/queries/incomplete-migration.js +1 -1
- package/dist/queries/index.d.ts +21 -5
- package/dist/queries/index.js +1 -1
- package/dist/queries/isolated.d.ts +2 -2
- package/dist/queries/isolated.js +1 -1
- package/dist/queries/locality-candidates.d.ts +2 -2
- package/dist/queries/locality-candidates.js +1 -1
- package/dist/queries/members.d.ts +2 -2
- package/dist/queries/members.js +1 -1
- package/dist/queries/methods.d.ts +2 -2
- package/dist/queries/methods.js +1 -1
- package/dist/queries/not-implemented.d.ts +2 -2
- package/dist/queries/not-implemented.js +1 -1
- package/dist/queries/outline.d.ts +2 -2
- package/dist/queries/outline.js +1 -1
- package/dist/queries/passthrough-candidates.d.ts +2 -2
- package/dist/queries/passthrough-candidates.js +1 -1
- package/dist/queries/plan-context.d.ts +2 -2
- package/dist/queries/plan-context.js +1 -1
- package/dist/queries/react-component-duplicates.d.ts +2 -2
- package/dist/queries/react-component-duplicates.js +1 -1
- package/dist/queries/react-hook-candidates.d.ts +2 -2
- package/dist/queries/react-hook-candidates.js +1 -1
- package/dist/queries/react-large-component-pressure.d.ts +2 -2
- package/dist/queries/react-large-component-pressure.js +1 -1
- package/dist/queries/recent-duplicates.d.ts +2 -2
- package/dist/queries/recent-duplicates.js +1 -1
- package/dist/queries/redundant-reexports.d.ts +2 -2
- package/dist/queries/redundant-reexports.js +1 -1
- package/dist/queries/refs.d.ts +2 -2
- package/dist/queries/refs.js +1 -1
- package/dist/queries/self-audit.d.ts +2 -2
- package/dist/queries/self-audit.js +1 -1
- package/dist/queries/similar-chains.d.ts +2 -2
- package/dist/queries/similar-chains.js +1 -1
- package/dist/queries/similar-files.d.ts +2 -2
- package/dist/queries/similar-files.js +1 -1
- package/dist/queries/similar-signatures.d.ts +2 -2
- package/dist/queries/similar-signatures.js +1 -1
- package/dist/queries/similar.d.ts +2 -2
- package/dist/queries/similar.js +1 -1
- package/dist/queries/slice.d.ts +2 -2
- package/dist/queries/slice.js +1 -1
- package/dist/queries/stale-abstractions.d.ts +2 -2
- package/dist/queries/stale-abstractions.js +1 -1
- package/dist/queries/stats.d.ts +2 -2
- package/dist/queries/surface.d.ts +2 -2
- package/dist/queries/surface.js +1 -1
- package/dist/queries/symbols.d.ts +2 -2
- package/dist/queries/symbols.js +1 -1
- package/dist/queries/system.d.ts +2 -2
- package/dist/queries/system.js +1 -1
- package/dist/queries/test-quality.d.ts +2 -2
- package/dist/queries/test-quality.js +1 -1
- package/dist/queries/trace.d.ts +2 -2
- package/dist/queries/trace.js +1 -1
- package/dist/queries/twin-ab.d.ts +2 -2
- package/dist/queries/twin-ab.js +1 -1
- package/dist/queries/twin-drift.d.ts +2 -2
- package/dist/queries/twin-drift.js +1 -1
- package/dist/queries/unused-imports.d.ts +2 -2
- package/dist/queries/unused-imports.js +1 -1
- package/dist/queries/unused-params.d.ts +2 -2
- package/dist/queries/unused-params.js +1 -1
- package/dist/queries/vue-component-duplicates.d.ts +2 -2
- package/dist/queries/vue-component-duplicates.js +1 -1
- package/dist/queries/vue-composable-candidates.d.ts +2 -2
- package/dist/queries/vue-composable-candidates.js +1 -1
- package/dist/queries/vue-large-view-pressure.d.ts +2 -2
- package/dist/queries/vue-large-view-pressure.js +1 -1
- package/dist/queries/wrapper-candidates.d.ts +2 -2
- package/dist/queries/wrapper-candidates.js +1 -1
- package/dist/reindex-worker.js +24 -24
- package/dist/reindex.d.ts +3 -3
- package/dist/reindex.js +38 -38
- package/dist/runtime.d.ts +9 -4
- package/dist/runtime.js +2 -2
- package/dist/rust-semantic-session-worker.js +1 -1
- package/dist/rust-semantic-worker.js +1 -1
- package/dist/{scip-cli-1bVKJgXi.d.ts → scip-cli-kRpaexVJ.d.ts} +1 -1
- package/dist/watch-server.js +5 -5
- package/docs/AI_FAILURE_MODES.md +1 -1
- package/docs/COMMAND_REFERENCE.md +1 -1
- package/docs/DETECTOR_GUIDE.md +1 -1
- package/docs/analyzer-inventory.md +1 -1
- package/docs/analyzer-validation-ledger.md +131 -1
- package/docs/architecture-coherence-vision.md +29 -0
- package/package.json +2 -2
- package/dist/chunk-2NA6TYP4.js +0 -120
- package/dist/chunk-5W2VAEVR.js +0 -4
- package/dist/chunk-7TJJY2C3.js +0 -2
- package/dist/chunk-DO775SYA.js +0 -2
- package/dist/chunk-DRH3AD7W.js +0 -4
- package/dist/chunk-E3KWOHH7.js +0 -5
- package/dist/chunk-EMIIOOTM.js +0 -38
- package/dist/chunk-ESNRT7QN.js +0 -927
- package/dist/chunk-IOOCKVUA.js +0 -6
- package/dist/chunk-KC2IFAAU.js +0 -3
- package/dist/chunk-NTOBQK5H.js +0 -4
- package/dist/chunk-UJKZQLDB.js +0 -2
- package/dist/chunk-US44MEVU.js +0 -29
- package/dist/chunk-XZXUMGAA.js +0 -7
- package/dist/diff-gate-types-CG2YQ_ei.d.ts +0 -4
- 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/
|
|
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.
|
package/docs/DETECTOR_GUIDE.md
CHANGED
|
@@ -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
|
|
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,
|
|
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
|
|
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.
|
|
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": "
|
|
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
|
},
|