Correctness release: revives the merge shrink guard, fixes prune/eviction on absolute paths and newly-ignored files, stops a Java external-annotation conflation, and makes callflow and query direction/relation aware.
- Fix: the
build_merge#479 shrink guard is no longer effectively dead (#2497, thanks @sortakool). It read the post-replace node count, so a broken partial re-extract could silently destroy nodes without tripping the guard, and the guard was skipped entirely underprune_sources. The guard now diffs the on-disk baseline by node identity and refuses any loss from a source that was neither re-extracted nor pruned this run (active even underprune_sources, skipped only underdedup), and reports how many nodes a re-extract replaced. - Fix:
build_merge/merge_raw_extractionprune_sourcesnow prunes correctly when given absolute paths under a non-standard layout, deriving the scan root by suffix-matching stored source paths, and warns (instead of reporting "already clean") when a prune matches nothing (#2446, thanks @AI-invest). - Fix:
graphify updatenow removes newly-ignored files from an existing graph (#2495, thanks @alisson-acioli). A file added to.graphifyignore/--exclude(or a skip rule) is evicted even though it still exists on disk;.gitignore-driven eviction applies on an explicit fullupdate. Files that merely changed are still preserved, and a file that leaves the corpus without matching any live ignore rule stays (fail-closed, #1795). - Fix: a Java local class and a same-named external annotation (e.g. a local
class Componentand Spring's@Component) no longer collapse into one node (#2504, thanks @te7ina-honey). The Java type resolver now runs before the unique-label stub rewire and parks an imported-but-external type on its fully-qualified name, and cross-file import resolution checks the package. In-corpus annotation resolution is unchanged. - Fix:
graphify callflownow respects edge direction, so the caller/callee columns are correct (#2508, thanks @Tomaskobel). The call-flow HTML loads the graph directed and recovers direction from the stored_src/_tgtmarkers (consistent with thepathfix), and indirect calls are counted. - Fix: relational-intent verbs in a
query("calls", "uses", "extends", ...) no longer seat spurious seeds (#2507, thanks @filipechagas). Such a verb is excluded from the per-term seed guarantee, so a decoy matching only the verb no longer becomes a traversal root, while a verb that is a genuine symbol name can still be seeded on merit.