What's fixed
Query scoring (#897)
- IDF weighting — common terms like
errororhandlethat match dozens of nodes are down-weighted, so a rare identifier likeFooBarServiceranks first and BFS expands from the right starting point - Dynamic K seeds — when one match dominates (>80% score gap vs the next candidate), graphify picks one seed instead of always three; noise nodes no longer consume BFS slots alongside the real target
- Actionable truncation — the truncation message now tells Claude what to do (
get_nodeor add acontext_filter) rather than just reporting truncation
C++ extraction (#898)
- Class data members (
int x;,static const int MAX = 100;) are now extracted as nodes withdefinesedges from the parent class — the previousfield_declarationbranch was silently a no-op due to a wrong child type filter _get_cpp_func_namenow handlesfield_identifier,destructor_name, andoperator_namenode types
C/C++ include edges (#899)
- Quoted
#include "path/to/file.h"edges now resolve relative to the including file and use the full resolved path as the target node ID — matching what extraction creates for the included file. Previously all include edges dangled with a basename-only ID and were silently dropped.
Dedup (#895)
- Pass 1 now partitions same-label groups by source file before merging — nodes with generic labels (
handle,init,run) from different files no longer collapse into artificial god nodes; cross-file matches fall through to Pass 2 fuzzy exact_mergescounter now reports only merges actually performed
Upgrade
uvx graphifyy@0.8.7 install
# or
pip install --upgrade graphifyy