- Feature: four more language extractors gained structural depth. Ruby paren-less self-sends (
do_thingwith no receiver or parens) are now captured as calls, with a local-variable/parameter/block-parameter in scope correctly suppressing the call (fail-closed, no fabrication) (#3960, thanks @rajatnagda45). TypeScriptabstractmethod signatures in an abstract class are now extracted as callable method members and resolve as call targets (#3961, thanks @rajatnagda45). Scala deferred (abstract) method declarations in traits and abstract classes (def foo: Int, no body) are now extracted as methods (#3962, thanks @rajatnagda45). C++ a member-function declaration inside a class (void foo();, defined out-of-line) is now classified as a method rather than a field, including pure-virtual,const, operator, and destructor forms; real data members stay fields (#3963, thanks @rajatnagda45). - Fix: a Rust type used before it is declared in the same file now resolves to its local declaration instead of fabricating an external stub; resolution is a two-pass, order-independent scan, and a forward reference whose name collides with another same-id item is kept unresolved (fail-closed) (#3903, #3782, thanks @Yyunozor).
- Fix: Rust prelude types (
Option,Result,Vec,String,Box,Rc,Arc,HashMap, and friends) no longer accumulate spurious in-degree and surface as god nodes that distort community detection and ranking; they are filtered at extraction time, and a type the file defines itself is kept. Tuple-struct and unit-struct construction (ClientId(id)) is reclassified from acallsedge to areferences/constructoredge (#3973, thanks @liam-mcelhaney122). - Fix: an Obsidian-style wikilink to a note whose name contains a dot (
[[v1.2 release]],[[note.en]]) now resolves instead of being dropped by a premature extension strip; plain, explicit-extension, anchor, and alias wikilinks are unchanged, a literal indexed file beside the link keeps precedence, and a genuinely missing target is still not fabricated (#3905, #3904, thanks @Yyunozor). - Fix: a constructor call whose target is a same-file annotation stub (a source-less node minted by an earlier annotation or generic-argument reference) is kept for cross-file resolution and binds to the real definition when there is import or namespace/using-scope evidence, instead of being dropped; a genuinely external unresolved name is still not fabricated (#3901, thanks @bercedev).
- Fix: the CLI hook-guard that protects graphify's own output directory now resolves paths and checks real containment instead of substring matching, so a sibling directory sharing a name prefix (
artifacts/graphify-notesvsartifacts/graphify) is no longer wrongly treated as inside the output dir; symlinks,.., relative paths, and case-insensitive filesystems are handled (#3964, #3959, thanks @shobhitagnihotri69). - Fix: when resolving an import of a workspace package that ships both a source entry and a built dist, the graph now prefers the source file (so edges point at authored code) and falls back to the built artifact only when no source entry exists, generalizing the existing source-over-dist preference from the
exportspath to the legacymain/modulefields (#4000, #3834, thanks @Adityakk9031). - Feature: Verilog header files (
.vh) are now detected and extracted through the same tree-sitter-verilog grammar as.v/.sv, so macros, parameters, and modules declared in headers are captured (#3983, thanks @oleksii-tumanov). - Fix: an incremental update no longer drops a hyperedge from an untouched file when a re-extracted file emits a hyperedge with the same id; carried hyperedges are now keyed by
(id, source_file)so a same-id edge from a different, unchanged file is preserved while a genuine same-file re-emit still replaces (#3997, #3981, thanks @Ayushraj06-bit). - Feature: Kotlin class-literal references in annotation arguments (
@ManyToOne(targetEntity = Customer::class)) are now extracted as attribute references to the referenced type (#3965, #3835, thanks @hopstreax). - Fix: Lua colon-method calls (
obj:method(),self:method()) now resolve to the table-qualified method definition; a non-selfreceiver fails closed with no cross-file member fabrication (#3994, thanks @rajatnagda45). - Feature: Erlang local fun references (
fun Name/Arity, as inlists:map(fun helper/1, L)) are now recorded asindirect_calledges to the arity-matched local function; remotefun Mod:Name/Arityand anonymous funs are left as-is, and an undefined or arity-mismatched local fails closed (#3996, thanks @rajatnagda45). - Fix: C# null-conditional member calls (
receiver?.Method()) now resolve through the same typed-receiver path asreceiver.Method(), including the call-site generic-argument walk; chained and element-access forms fall through to bare-name resolution with no fabrication (#3976, #3797, thanks @Cintu07).