Skip to content

graphify

v0.9.12 Bugfix

This release fixes issues for SREs watching stability and regressions.

Published 16d RAG & Retrieval
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

antigravity claude-code codex gemini graphrag knowledge-graph
+5 more
leiden openclaw llm skills tree-sitter

Summary

AI summary

Fixes several critical graph extraction bugs including missing foreign‑key edges, dangling import/reference edges, hyperedge loss on update, Java call resolution, stray cache output, cross‑language edge binding, silent extractor failures, nondeterministic JSON rebuilds, and phantom type references.

Changes in this release

Bugfix Medium

Fixes PostgreSQL introspection emitting foreign-key references edges under read-only role.

Fixes PostgreSQL introspection emitting foreign-key references edges under read-only role.

Source: llm_adapter@2026-07-15

Confidence: high

Bugfix Medium

Fixes json_config emitting imports/extends edges to non-existent node IDs.

Fixes json_config emitting imports/extends edges to non-existent node IDs.

Source: llm_adapter@2026-07-15

Confidence: high

Bugfix Medium

Fixes graphify update deleting semantic hyperedges on every run.

Fixes graphify update deleting semantic hyperedges on every run.

Source: llm_adapter@2026-07-15

Confidence: high

Bugfix Medium

Fixes Java member calls resolving against receiver's declared type instead of bare method-name match.

Fixes Java member calls resolving against receiver's declared type instead of bare method-name match.

Source: llm_adapter@2026-07-15

Confidence: high

Bugfix Medium

Fixes output/cache artifacts landing in scanned corpus or CWD when --out/--graph point elsewhere.

Fixes output/cache artifacts landing in scanned corpus or CWD when --out/--graph point elsewhere.

Source: llm_adapter@2026-07-15

Confidence: high

Bugfix Medium

Fixes imports/references edges binding across language boundaries.

Fixes imports/references edges binding across language boundaries.

Source: llm_adapter@2026-07-15

Confidence: high

Bugfix Medium

Fixes Java field/parameter/return-type reference dangling on phantom node when simple name is shared by two modules.

Fixes Java field/parameter/return-type reference dangling on phantom node when simple name is shared by two modules.

Source: llm_adapter@2026-07-15

Confidence: high

Bugfix Medium

Fixes files vanishing without trace when extractor bails due to missing optional dependency.

Fixes files vanishing without trace when extractor bails due to missing optional dependency.

Source: llm_adapter@2026-07-15

Confidence: low

Bugfix Medium

Fixes build_from_json determinism across process runs.

Fixes build_from_json determinism across process runs.

Source: llm_adapter@2026-07-15

Confidence: low

Bugfix Low

Reports files that vanish when extractor fails due to missing optional dependency, naming the required extra package.

Reports files that vanish when extractor fails due to missing optional dependency, naming the required extra package.

Source: granite4.1:30b@2026-07-15-audit

Confidence: low

Bugfix Low

Makes build_from_json deterministic across process runs by sorting node iteration and preserving distinct cross‑file nodes.

Makes build_from_json deterministic across process runs by sorting node iteration and preserving distinct cross‑file nodes.

Source: granite4.1:30b@2026-07-15-audit

Confidence: low

Full changelog
  • Fix: live PostgreSQL introspection (--postgres) now emits foreign-key references edges under a read-only role (#1746, thanks @rithyKabir). The FK query read information_schema.referential_constraints, which is privilege-filtered — a role with only SELECT sees zero FK rows while tables/views/routines still appear, so every references edge silently vanished. It now reads the world-readable pg_catalog.pg_constraint (keyed by oid, which also fixes same-named constraints on sibling tables cross-matching in the old name-based joins), preserving composite-FK column order via UNNEST ... WITH ORDINALITY.

  • Fix: json_config no longer emits imports/extends edges to node IDs it never creates (#1764, thanks @oleksii-tumanov). package.json dependencies and tsconfig.json extends/$ref targets produced edges whose endpoint node was absent, so build_from_json silently dropped them (the "no matching node id" case is filtered out of real errors) — losing dependency/extends structure on two of the most common files in any JS/TS repo. The extractor now creates the referenced target as a concept node before adding the edge.

  • Fix: graphify update no longer deletes semantic hyperedges on every run (#1755, thanks @oleksii-tumanov). The AST-only rebuild treated every rebuilt corpus file as grounds to evict hyperedges anchored to it, but the AST pass never re-emits hyperedges, so doc-sourced hyperedges (exactly what semantic extraction produces) were permanently lost on the first update after a full build — even a no-op run. Hyperedge eviction is now scoped to genuinely deleted (or symlink-outside) sources, mirroring node/edge handling; replacement-by-id and dangling-member cleanup are unchanged.

  • Fix: Java member calls resolve against the receiver's declared type instead of a bare method-name match (#1696/#1697, thanks @oleksii-tumanov). gw.charge() where gw: PaymentGateway now binds to PaymentGateway.charge, not a same-named AuditLog.charge in another file. Explicit-type receivers and this are exact; current-class fields, method parameters, and explicitly-typed locals resolve via a method-scoped type table; a missing, ambiguous, inherited, or chained receiver is skipped rather than guessed (same god-node guard as the C#/Swift/Ruby resolvers). Fully-qualified and nested-type receivers are deferred (they need package/nesting-aware type identity).

  • Fix: output/cache artifacts no longer land in the scanned corpus or CWD when --out/--graph point elsewhere (#1747, thanks @bbqboogiedwonsen). extract <corpus> --out <dir> correctly wrote the graph to <dir> but detect()'s word-count/stat-index cache still created a stray graphify-out/cache/ inside the corpus (it uses the scan root); it now honors the --out dir via a threaded cache_root. And cluster-only --graph <elsewhere>/graphify-out/graph.json wrote GRAPH_REPORT.md/labels/analysis/re-clustered graph to the CWD instead of beside the input; it now writes beside --graph when that graph lives in a graphify-out/ dir, while still restoring into the CWD for an archived backup/graph.json (#934).

  • Fix: imports/references edges no longer bind across a language boundary (#1749, thanks @philberndt). The spec already forbids cross-language calls, but an unresolved Python import time could still resolve by bare stem onto a src/time.ts file node — welding a polyglot repo's halves together at a phantom edge (in the reporter's repo, 3 such edges were the only thing bridging 2409 Python nodes to 1403 TS nodes, inflating time.ts betweenness ~90x and making it the #1 "god node"). The build-time cross-language guard now covers imports/imports_from/references in addition to calls, dropping an edge only when both endpoints are known code languages of different interop families (so a config/manifest → code reference is untouched).

  • Fix: files whose extractor bailed out for a missing optional dependency no longer vanish without a trace (#1745, thanks @rithyKabir). .sql files (and other extra-gated languages) have a dispatch entry, so the #1689 no-extractor warning can't fire, and extract_sql returns an error result when tree-sitter-sql is absent, so the #1666 zero-node warning skips it too — the graph built "successfully" while an entire SQL corpus contributed nothing. extract() now surfaces these grouped by extension, naming the extra that restores the language (e.g. pip install "graphifyy[sql]").

  • Fix: build_from_json is deterministic across process runs again (#1753, thanks @erasmust-dotcom). The ghost-node merge iterated set(G.nodes()), so which node survived a (basename, label) collision depended on CPython's per-process string-hash seed — rebuilding the same extraction JSON in a fresh process could silently pick a different canonical id (breaking the cluster→relabel workflow with a KeyError on an id that vanished). The Pass 1/Pass 2 loops now iterate in sorted order. Additionally, two non-AST (semantic) nodes sharing a key but from different files are now treated as distinct concepts and both survive (mirroring the AST/AST ambiguity guard #1257) instead of one arbitrarily merging away; a genuine same-file duplicate still collapses.

  • Fix: a Java field/parameter/return-type reference to a class whose simple name is shared by two modules no longer dangles on a sourceless phantom node (#1744, thanks @aviciot). Both same-named classes already survive as distinct path-scoped nodes, but the cross-module references edge was left pointing at a bare no-source stub because _resolve_java_type_references re-pointed implements/inherits/imports but not references — so a query about the referenced class could miss it. The Java resolver now disambiguates references by the importing file's import statement (falling back to same-package), mirroring the C# resolver, and drops the orphaned phantom.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track graphify

Get notified when new releases ship.

Sign up free

About graphify

AI coding assistant skill (Claude Code, Codex, OpenCode, Cursor, Gemini CLI, OpenClaw, Factory Droid, Trae). Turn any folder of code, docs, papers, images, videos, or YouTube links into a queryable knowledge graph

All releases →

Related context

Earlier breaking changes

  • v0.8.18 Breaks Java `extends` edges; they are renamed to `inherits`. Update queries filtering on `relation="extends"` for Java nodes.

Beta — feedback welcome: [email protected]