Enhancement request, follow-up to #1634 (verified working on 0.9.6 — this is about query-side traversal, not extraction). Generic across languages, though we hit it from Ruby.
Symptom
#1634 correctly binds Service.call to the def self.call method node when one exists — precise and the right choice. But affected <ClassLabel> traverses only:
Relations: calls, indirect_call, references, imports, imports_from, re_exports, inherits, extends, implements, uses, mixes_in, embeds
method / contains are (correctly, for forward noise reasons) not in that list — which means an inbound caller edge that lands on a method node of a class is unreachable when you query blast radius from the class. The more precisely #1634 binds, the fewer callers class-level affected sees.
Measured scale (our graph, 0.9.6)
- 365 cross-file
calls/references edges target Ruby method nodes.
- For 89 of them, the caller has no parallel edge to the owning class/module node — those callers are invisible to
affected <Class>.
- That 89 is a lower bound on the general case: we run a Rails-truth sidecar that appends class→class edges for exactly this reason, and the pair-dedup means many would-be-missing pairs are already bridged by it. A stock install would miss more.
Concrete shape: Draft::SnapshotService here has a single inbound references edge on its class node, while callers of its class methods bind at method granularity — affected "SnapshotService" reports one node.
Ask
When the query root is a class/module node, include its member method nodes as additional traversal roots for the reverse direction — i.e., one contains/method hop outward from the root at query time, before the normal relation-filtered walk. That keeps method/contains out of the general traversal (no noise change anywhere else) while making affected <Class> see callers that #1634 binds at method level.
An alternative with the same effect: emit a low-weight rollup edge caller --calls--> Class alongside each caller --calls--> Class#method binding. The query-time hop is probably cleaner (no link inflation).
Environment
graphifyy 0.9.6 (uv tool), macOS, Rails repo as in #1666 (~11.8k nodes / ~19.8k links).
Enhancement request, follow-up to #1634 (verified working on 0.9.6 — this is about query-side traversal, not extraction). Generic across languages, though we hit it from Ruby.
Symptom
#1634 correctly binds
Service.callto thedef self.callmethod node when one exists — precise and the right choice. Butaffected <ClassLabel>traverses only:method/containsare (correctly, for forward noise reasons) not in that list — which means an inbound caller edge that lands on a method node of a class is unreachable when you query blast radius from the class. The more precisely #1634 binds, the fewer callers class-levelaffectedsees.Measured scale (our graph, 0.9.6)
calls/referencesedges target Ruby method nodes.affected <Class>.Concrete shape:
Draft::SnapshotServicehere has a single inboundreferencesedge on its class node, while callers of its class methods bind at method granularity —affected "SnapshotService"reports one node.Ask
When the query root is a class/module node, include its member method nodes as additional traversal roots for the reverse direction — i.e., one
contains/methodhop outward from the root at query time, before the normal relation-filtered walk. That keepsmethod/containsout of the general traversal (no noise change anywhere else) while makingaffected <Class>see callers that #1634 binds at method level.An alternative with the same effect: emit a low-weight rollup edge
caller --calls--> Classalongside eachcaller --calls--> Class#methodbinding. The query-time hop is probably cleaner (no link inflation).Environment
graphifyy 0.9.6 (uv tool), macOS, Rails repo as in #1666 (~11.8k nodes / ~19.8k links).