Summary
neighbors(include_unresolved=True) constructs the unresolved-call-site NodeRef with name=callee, but NodeRef has no name field, so the callee identifier is silently discarded (pydantic v2 default extra="ignore").
Evidence (confirmed)
mcp_v2.py:1557: other=NodeRef(id=ucs_id, kind="unresolved_call_site", fqn="", name=callee)
mcp_v2.py:449: class NodeRef fields are id, kind, fqn, symbol_kind, microservice, module, role, … — no name, and no model_config override → default extra="ignore" → name=callee is dropped (silent data loss, not a crash).
Impact
Every unresolved-call-site edge returned to the LLM has fqn="" and no human-readable callee identifier in the structured NodeRef; the client must dig into attrs.callee_simple to learn what was called.
Suggested fix
Either add name: str | None = None to NodeRef, or carry the callee in fqn (or another existing field). Related: #167 (NodeRef signal gaps).
Summary
neighbors(include_unresolved=True)constructs the unresolved-call-siteNodeRefwithname=callee, butNodeRefhas nonamefield, so the callee identifier is silently discarded (pydantic v2 defaultextra="ignore").Evidence (confirmed)
mcp_v2.py:1557:other=NodeRef(id=ucs_id, kind="unresolved_call_site", fqn="", name=callee)mcp_v2.py:449:class NodeReffields areid,kind,fqn,symbol_kind,microservice,module,role, … — noname, and nomodel_configoverride → defaultextra="ignore"→name=calleeis dropped (silent data loss, not a crash).Impact
Every unresolved-call-site edge returned to the LLM has
fqn=""and no human-readable callee identifier in the structuredNodeRef; the client must dig intoattrs.callee_simpleto learn what was called.Suggested fix
Either add
name: str | None = NonetoNodeRef, or carry the callee infqn(or another existing field). Related: #167 (NodeRef signal gaps).