Faster queries, a graph-health gate in the skill runbook, CUDA support, and a batch of extraction/install fixes.
Performance
- Trigram query prefilter —
graphify query/path/explainand the MCP query tools now narrow candidates via a trigram index (built once per graph, rebuilt on hot-reload) before the IDF scorer, cutting the previous O(N) scan on large graphs. The prefilter is a strict superset of the exhaustive scorer, so results and ranking are unchanged; short/CJK/low-selectivity queries fall back to the full scan (#1431, thanks @papinto).
Skill runbook
- Step 4.5 graph-health gate — after building the graph, the runbook runs
diagnose_extractionand surfaces dangling/self-loop/collapsed-edge warnings before labeling (read-only; never aborts). It also anchors the semantic cache on the scan root so cache hits survive a non-cwd scan (#1437, thanks @bahcgscateringsa-design).
Languages
- CUDA (
.cu/.cuh) is now extracted via the existing C++ (tree-sitter-cpp) grammar — no new dependency. Kernels, host functions, structs, includes and host call edges are captured;<<<grid, block>>>launch syntax parses cleanly (#1411).
Extraction quality
- No more phantom duplicate nodes from cross-file type annotations. A class defined once but referenced via type annotations in N files produced 1+N nodes (the extras with the file path baked into the id, e.g.
pkg_a_py_thing). The cross-file reference now resolves to the single canonical definition — fixed across all six language extractors (#1402, thanks @ZedUserdesign).
Install & misc fixes
graphify install --platform hermesinstalls to%LOCALAPPDATA%\hermes\skillson Windows (where Hermes scans), not~/.hermes/skills(#1403, thanks @SHJordan).- The opencode plugin's search reminder no longer contains backticks that bash executed as a command substitution on every search (#1413, thanks @WSHAPER).
to_obsidian/to_canvasnever emit punctuation-only filenames (e.g.@.md) that break downstream re-sluggers — they fall back tounnamed(#1409, thanks @Mylock51).graphify extract --cargoexits with a clear error instead of a traceback whenCargo.tomlis missing/unreadable (#1428, thanks @DhruvTilva).- Internal: resolved an
F821inprs.pyvia aTYPE_CHECKINGimport (#1429, thanks @DhruvTilva).