v0.9.6

Graphify-Labs/graphifyv0.9.6Jul 4, 2026by safishamsi

AI Summary

Major Ruby improvements including container nodes and singleton-call resolution, fixes for cross-language phantom imports, and hardened semantic extraction.

Key Highlights

  • Module/Class/Data.define now emit container nodes with attached methods.
  • Constant-receiver singleton-call resolution (e.g., `Service.call`) now works cross-file.
  • No more cross-language phantom import edges from bare npm imports.
  • Deterministic graph.json ordering for parallel semantic backends.

New Features

  • Container nodes for Ruby modules and classes.
  • Cross-file singleton call resolution.
  • Elimination of phantom import edges.
  • Hardened semantic extraction merging.
  • Fixes for Apex, Kotlin, Julia, and Scala extractors.

Full Release Notes

graphify 0.9.6 — 19 fixes and features since 0.9.5.

## Ruby (major)
- **Module / Struct.new / Class.new / Data.define container nodes (#1640).** Plain `module Foo`, `Foo = Struct.new(...) do ... end`, `Foo = Class.new(StandardError)`, and `Result = Data.define(...)` now get real container nodes with their methods attached; `Class.new(Super)` emits an inherits edge.
- **Constant-receiver singleton-call resolution (#1634).** `Service.call`, `Model.where`, `SomeJob.perform_async` now resolve cross-file, so Rails/Zeitwerk apps (no requires) get real cross-file edges instead of near-zero. Binds to the class's owned singleton method when present, else the class node for blast-radius; single-owning-class guard kept.

## Correctness and stability
- **No more cross-language phantom import edges (#1638).** An unresolved bare npm import (`import x from "pkg/colors"`) no longer aliases onto an unrelated local `colors.py` via the build alias index.
- **Semantic extraction hardened (#1631).** A malformed LLM chunk (a stray non-dict entry) no longer crashes the merge and discards every successful chunk.
- **Deterministic graph.json ordering (#1632).** Parallel semantic backends now merge chunks in submission order, so node/edge ordering is stable run-to-run (the model's content variance is separate).

## Contributor extractor fixes
- Apex interface multiple inheritance (`interface X extends A, B`) (#1645, @Synvoya).
- Kotlin interface delegation (`class Foo : Bar by baz`) (#1644, @Synvoya).

Plus fixes to `query` seed diversity (#1596), `cluster-only` sidecar (#1617), `update`/`watch` stale-source reconciliation (#1623), TS/JS extractor gaps (#1615/#1607), `merge-graphs` (#1606), Swift singleton locals (#1604), C# receiver-typed member calls (#1609), TS receiver-typed member calls (#1630), the `to_canvas` dangling-member crash (#1236), a root-source_file crash (#1618), the `claude-cli` backend bisection stall, symlink containment (#1613), and the Homebrew `python@3.x` interpreter path (#1586).

See the [CHANGELOG](https://github.com/Graphify-Labs/graphify/blob/v8/CHANGELOG.md) for full detail.

Thanks to everyone who filed issues and sent PRs. Follow the org at https://github.com/Graphify-Labs.