On November 8, Graphify released a version separating repository paths from executable code and improving language-specific call analysis. Developers tracing function calls can reduce path-based code execution risks and see previously missing call relationships in the graph.

1. Separating Repository Paths from Executable Code

Code blocks generated by the /graphify run guide no longer insert scan paths directly into Python string literals. The first step writes the path to graphify-out/.graphify_root, which later analysis and update steps read.

Previously, quotes or $(...) in a path could escape the string in Path('INPUT_PATH') and execute as code. Paths are now treated as address data, not commands. This changes the route by which repository name characters became executable code.

2. Keeping the Same Project Nodes across Locations

Identifiers for placeholder nodes used when Python import targets cannot be resolved now depend less on repository location. They use project-relative locations instead of absolute paths, retaining identifiers when repositories or caches move. This fixes graph labels changing solely because a repository's address changed.

On Windows, differing path representations for the same file no longer split cache entries. Even for long-path repositories, file-state keys remain root-relative paths, preserving fast cache lookups for moved or cloned codebases.

The check that mistook newly created subfolder graphs for an older format was also fixed. New graphs no longer show unnecessary forced-extraction prompts, improving workflows that analyze only selected project folders.

3. Linking Solidity and C# Calls to Declarations

In Solidity, function calls through values of smart contract or interface types now link to their declarations. Smart contracts execute automatically on a blockchain. The release notes provide the example below, linking a call on a token variable to its declaration in the graph.

IERC20 token; token.transfer()

Calls to library functions and free functions attached to a type through using A for T directives are also linked. This fixes missing relationships between calls made this way and the attached functions.

C# records instance and static constructors, plus primary constructors that accept parameters in the type declaration, as separate nodes. Calls inside constructors belong to those nodes. Object creation and constructor calls link to constructors with matching argument counts.

Calls inside property and indexer accessors, which read or change values, now link to those members. Indexers use brackets to read and write values like arrays. Calls in expression bodies, operators, and conversion bodies are also recorded, reducing omissions outside ordinary methods.

Solidity leaves calls unlinked if the target type is unknown or candidates cannot be narrowed to one. C# also skips constructor links if two candidates match the argument count or a base-class constructor cannot be resolved.

4. Focusing File Watching on Necessary Rebuilds

When the watch tool supports event filtering, it excludes read-only events and handles only change events. This is intended to prevent recurring event queue overflows in large directories.

If the graph file is missing during watching, the entire graph is rebuilt rather than creating an incomplete one from partial information. Changes to configuration or lockfiles that determine JavaScript and TypeScript import paths also trigger full rebuilds. This fixes stale file relationships remaining in the graph after configuration changes.

5. Accuracy Gains and Cache Recomputation Costs

These changes preserve identifiers when repositories move and reduce missing language-specific calls, but require some analysis to run again. The AST cache schema, which defines how parsed code structures are stored, rises to 40, triggering affected Solidity and C# extraction again when existing caches are present. The Python identifier fix requires no cache schema change.

Graphify 0.9.104 improves reliability when paths move and when tracing language-specific calls, but some changes require re-extraction or full graph recomputation.