Two related node-resolution problems hit non-English corpora (Spanish, accents/ñ), especially on
macOS where the filesystem stores filenames in Unicode NFD while graph.json labels are NFC.
Bug 1 — affected.resolve_seed() doesn't normalize Unicode.
It compares with .lower() only. A query in NFD never equals an NFC label:
# repro
import unicodedata, networkx as nx
from graphify.affected import resolve_seed
G = nx.Graph(); G.add_node("n1", label="Auditoría") # NFC, as stored in graph.json
resolve_seed(G, unicodedata.normalize("NFC", "Auditoría")) # -> "n1" OK
resolve_seed(G, unicodedata.normalize("NFD", "Auditoría")) # -> None ✗ (same text, NFD)
On macOS, a label argument copied from a filename arrives as NFD → affected reports "not found".
Bug 2 — serve._find_node() doesn't resolve a full label that contains punctuation.
It is diacritic-insensitive per word (good), but the search term is tokenized (_search_tokens,
strips —, /, ()…) while it's compared against norm_label, which keeps punctuation. So a user
who passes the exact node label can't resolve it:
from graphify.serve import _find_node
# label = "Skill /auditar — Auditoría inquisitiva de enlaces"
_find_node(G, "Auditoría") # -> matches (substring) OK
_find_node(G, "Skill /auditar — Auditoría inquisitiva de enlaces") # -> [] ✗
This affects explain/query/path and the MCP serve layer.
Impact: any non-ASCII knowledge base; explain/query/path/affected and the MCP server.
Environment: graphifyy 0.8.37, macOS, Python 3.14.
Two related node-resolution problems hit non-English corpora (Spanish, accents/
ñ), especially onmacOS where the filesystem stores filenames in Unicode NFD while
graph.jsonlabels are NFC.Bug 1 —
affected.resolve_seed()doesn't normalize Unicode.It compares with
.lower()only. A query in NFD never equals an NFC label:On macOS, a label argument copied from a filename arrives as NFD →
affectedreports "not found".Bug 2 —
serve._find_node()doesn't resolve a full label that contains punctuation.It is diacritic-insensitive per word (good), but the search
termis tokenized (_search_tokens,strips
—,/,()…) while it's compared againstnorm_label, which keeps punctuation. So a userwho passes the exact node label can't resolve it:
This affects
explain/query/pathand the MCP serve layer.Impact: any non-ASCII knowledge base;
explain/query/path/affectedand the MCP server.Environment: graphifyy 0.8.37, macOS, Python 3.14.