v0.9.16

TrafficGuard/typedaiv0.9.16Jul 14, 2026by safishamsi

AI Summary

A correctness release fixing regressions that could empty graphs due to nested gitignore patterns and closing residual path leaks.

Key Highlights

  • Fixes nested gitignore scope to prevent empty graphs.
  • Closes residual absolute path/username leaks for out-of-root references.
  • Files that become excluded are now pruned from the graph and manifest.
  • Python calls to imported modules now produce calls edges.

Full Release Notes

graphify turns any folder of code, docs, papers, images, or videos into a queryable knowledge graph. 0.9.16 is a correctness and privacy release: it fixes two regressions from 0.9.15 that could zero out a graph, closes a residual path leak, and lands a batch of extraction and reliability fixes, most from community reports.

## Highlights

- **Two 0.9.15 regressions that could empty your graph are fixed (#1873 / #1887 / #1880).** A nested `.gitignore` with a bare `*` (a common scratch-dir idiom) was applied to the whole tree instead of its own directory, so `detect()` returned zero files and produced an empty graph; `graphify update` then saw 0 nodes and refused to overwrite. Nested ignore patterns are now scoped to their own subtree.
- **Residual path/username leak closed (#1899).** Out-of-scan-root reference targets (an out-of-root `.csproj`/`.sln` project, a bash `source`) and degenerate symbols (a minified `$`, a JSONC `"//"` key) could still embed the absolute scan path in a committed `graph.json`. Both are now portable.
- **Silently-lost documents are now surfaced (#1890).** When the semantic pass returns a clean response that omits some dispatched documents, the run now reconciles dispatched-vs-returned and warns instead of dropping them without a trace.

## All fixes

- Fix: nested `.gitignore`/`.graphifyignore` patterns are scoped to their own subtree; a nested bare `*` no longer zeroes the corpus (#1873 / #1887 / #1885, thanks @Alwyn93).
- Fix: `graphify update` no longer emits 0 nodes and refuses to overwrite when the tree has a nested broad `.gitignore` (#1880).
- Fix: close residual absolute-path/username leaks for out-of-root reference targets and degenerate symbols (#1899).
- Fix: the incremental semantic-cache checkpoint no longer fails on sliced (oversized) documents (#1870).
- Fix: `--exclude` patterns persist into `update`/`watch`/hook rebuilds instead of applying only to the initial scan (#1886).
- Fix: Python calls to an imported module (`module.function()`) now produce a `calls` edge (#1883).
- Fix: semantic cache writes are scoped so a mis-attributed `source_file` cannot clobber another file's entry — including the per-chunk checkpoint (#1757 / #1835, thanks @TPAteeq).
- Fix: a full `graphify update` no longer evicts the LLM semantic edges of a re-extracted document (#1865 / #1868, thanks @xor-xe).
- Fix: ID-collision resolves to a deterministic survivor and warns only about real loss (#1851 / #1852, thanks @bchan84x).
- Fix: `--cargo` honors Cargo's `package = "..."` dependency rename (#1858 / #1861, thanks @thejesh23).
- Fix: `detect_incremental` re-extracts a legacy-manifest file when its mtime moves backwards (#1859 / #1862, thanks @thejesh23).
- Fix: the dedup summary reports the fuzzy-merge count even with zero exact merges (#1857 / #1860, thanks @thejesh23).
- Fix: uppercase TypeScript extensions (`.TS`/`.TSX`/`.MTS`/`.CTS`) are parsed with the TypeScript grammar (#1881, thanks @xkam7ar).
- Fix: Kotlin builtin/stdlib types are filtered from the references graph (#1876, thanks @kebwlmbhee).
- Fix: the stale/missing-skill version warning prints to stderr, not stdout (#1805 / #1893, thanks @Mzt00).
- Fix: semantic extraction reconciles dispatched vs returned files and warns on silently-omitted documents (#1890).

## Install

```
pip install --upgrade graphifyy
# or
uv tool install graphifyy@0.9.16
```

Then `graphify install` to update the skill for your agent.