Found while instrumenting Brain to query the merged global graph for PE-80066 (https://lawnstarter.atlassian.net/browse/PE-80066). Fork v8 @ 5e9d95c11837aeabbbb5d90cb45544f49dc58ca4 (CLI 0.9.40).
Summary
explain's own disambiguation hint gives an ID that explain then refuses to resolve. In a merged global graph, labels collide across repos; explain correctly detects this and lists candidates by ID — but retrying with that exact ID fails.
Reproduction (12-repo merged global graph)
$ graphify explain 'Contractor' --graph ~/.graphify/global-graph.json
Ambiguous: 'Contractor' matches 65 nodes in different files
id: api.lawnstarter.com::app_contractor_contractor (app/Contractor.php)
...
Retry with the repo-relative path or the full node id.
$ graphify explain 'api.lawnstarter.com::app_contractor_contractor' --graph ~/.graphify/global-graph.json
No node matching 'api.lawnstarter.com::app_contractor_contractor' found
The string is a real node ID — verified by reading global-graph.json directly. The repo-relative-path retry (graphify explain 'app/Contractor.php') does resolve, so the second half of the hint works; the ID half does not.
Why it matters
Merged graphs make label collisions the norm (65 Contractor nodes across 12 repos), so the disambiguation path is the main path — and its primary suggested retry is a dead end. Consumers without the path form (e.g. when candidates span same-named files) have no working retry.
Found while instrumenting Brain to query the merged global graph for PE-80066 (https://lawnstarter.atlassian.net/browse/PE-80066). Fork
v8@5e9d95c11837aeabbbb5d90cb45544f49dc58ca4(CLI 0.9.40).Summary
explain's own disambiguation hint gives an ID thatexplainthen refuses to resolve. In a merged global graph, labels collide across repos;explaincorrectly detects this and lists candidates by ID — but retrying with that exact ID fails.Reproduction (12-repo merged global graph)
The string is a real node ID — verified by reading
global-graph.jsondirectly. The repo-relative-path retry (graphify explain 'app/Contractor.php') does resolve, so the second half of the hint works; the ID half does not.Why it matters
Merged graphs make label collisions the norm (65
Contractornodes across 12 repos), so the disambiguation path is the main path — and its primary suggested retry is a dead end. Consumers without the path form (e.g. when candidates span same-named files) have no working retry.