v0.8.41

Graphify-Labs/graphifyv0.8.41Jun 17, 2026by safishamsi

AI Summary

A bug-fix release focusing on improving Swift cross-file class relationships, correcting prune logic for stale nodes, and fixing OpenAI token handling.

Key Highlights

  • Swift cross-file class relationships now resolve through member calls and constructors.
  • `/graphify <path> --update` prunes stale nodes correctly.
  • `export obsidian` no longer writes an empty 32-byte `graph.canvas` on populated graphs.
  • Fuzzy dedup no longer over-merges distinct nodes.
  • OpenAI-compatible backends now honour the configured `16384` output-token cap.

Full Release Notes

Bug-fix release. `pip install -U graphifyy` / `uv tool install graphifyy@0.8.41`.

### Fixes

- **Swift cross-file class relationships** now resolve through member calls and constructors. A per-file type table (from property/parameter declarations + constructor inference) types the receiver of `recv.method()`, `Type.staticMethod()`, `Singleton.shared.method()`, and `self.prop.method()`, and property/field initializers (`let vm = VM()`) are walked for constructor calls. Edges emit only when the receiver's type resolves to exactly one definition (preserving the god-node guards) and are tagged `INFERRED`. (#1356)

- **`/graphify <path> --update` prunes stale nodes correctly.** The update runbook called `build_merge` without `root=`, so absolute prune paths never matched the graph's relative `source_file` values — nothing was pruned and changed/deleted files left ghost nodes that compounded every run. (#1361)

- **`export obsidian` no longer writes an empty 32-byte `graph.canvas`** on a populated graph. `to_canvas` now falls back to one synthetic community covering every node when no community data is present (e.g. `--no-cluster` builds). (#1324)

- **Edges missing `source_file`** (occasionally emitted by the semantic/LLM extractor) are now backfilled from their endpoint nodes in `build_from_json` and the `--no-cluster` path, so they no longer reach `graph.json` without a file reference. (#1279)

- **Fuzzy dedup no longer over-merges distinct nodes** in three cases: numbered/versioned siblings (`ADR 0011` vs `ADR 0013`), cross-file `rationale`/`document` boilerplate (file-anchored like code), and cross-file labels sharing a long prefix but diverging in a distinguishing token (`testing-library jest-native` vs `react-native`, now scored on plain Jaro). Same-file near-duplicates still merge. (#1284 — thanks @van4oza, #1243)

- **OpenAI-compatible backends** (`ollama`, `openai`, `deepseek`, `kimi`) now honour their configured `16384` output-token cap instead of silently falling back to `8192`, which had been truncating deep-mode JSON mid-string. `GRAPHIFY_MAX_OUTPUT_TOKENS` still overrides. (#1365)

**Full changelog:** https://github.com/safishamsi/graphify/blob/v8/CHANGELOG.md