Summary
cross-repo-intelligence mode makes 0 CROSS_HTTP_CALLS edges between FastAPI backend and its frontend client. FastAPI extractor leaves Route.path empty. Path text lands only in Route.name / Route.qualified_name, and router mount prefix gets stripped. Matcher keys on Route.path, so it compares against nothing.
Environment
- Backend: FastAPI (
@router.get(...) + include_router(prefix=...)). ~10.9k nodes, 143 Route nodes.
- Frontend: TanStack Router SPA.
HTTP_CALLS.url_path populates fine (e.g. /admin/scenarios/:id).
Reproduction
- Index FastAPI repo (
mode: fast or full).
- Index frontend repo that calls that backend. Confirm
HTTP_CALLS.url_path populates.
- Run
index_repository(mode="cross-repo-intelligence", target_projects=[backend]) from frontend.
Result:
{"mode":"cross-repo-intelligence","cross_http_calls":0,"total_cross_edges":0}
Root cause
Backend Route nodes after fresh index:
MATCH (r:Route) WHERE r.file_path =~ '.*drona/scenario.*'
RETURN r.name, r.method, r.path, r.qualified_name
"/scenarios/{scenario_id}" "GET" "" "__route__GET__/scenarios/{scenario_id}"
"/scenarios/{scenario_id}/draft/publish" "POST" "" "__route__POST__/scenarios/{scenario_id}/draft/publish"
r.path is "" on every FastAPI route.
MATCH (r:Route) WHERE r.path <> '' ... returns 0 rows across the whole project.
- Path text sits in
name / qualified_name only.
Two gaps
Route.path empty for FastAPI. Matcher key field holds nothing. This one fact makes cross-repo linking a no-op.
- Router prefix stripped. Backend stores
/scenarios. Real mounted path is /admin/scenarios. Extractor drops include_router(prefix=...). Even with path filled from name, prefix gap plus param style ({scenario_id} vs :id) breaks a plain string match.
Suggested fix
- Fill
Route.path from decorator arg during FastAPI extraction.
- Resolve
include_router(prefix=...) mounts, prepend them, store full external path.
- Normalize path params (
{id} / :id / {id:int}) in matcher before compare.
Impact
trace_path(mode=cross_service) cannot bridge any FastAPI backend to its clients until Route.path populates. Cross-repo mode stays dead for the FastAPI plus SPA stack.
Summary
cross-repo-intelligencemode makes 0CROSS_HTTP_CALLSedges between FastAPI backend and its frontend client. FastAPI extractor leavesRoute.pathempty. Path text lands only inRoute.name/Route.qualified_name, and router mount prefix gets stripped. Matcher keys onRoute.path, so it compares against nothing.Environment
@router.get(...)+include_router(prefix=...)). ~10.9k nodes, 143 Route nodes.HTTP_CALLS.url_pathpopulates fine (e.g./admin/scenarios/:id).Reproduction
mode: fastorfull).HTTP_CALLS.url_pathpopulates.index_repository(mode="cross-repo-intelligence", target_projects=[backend])from frontend.Result:
{"mode":"cross-repo-intelligence","cross_http_calls":0,"total_cross_edges":0}Root cause
Backend Route nodes after fresh index:
r.pathis""on every FastAPI route.MATCH (r:Route) WHERE r.path <> '' ...returns 0 rows across the whole project.name/qualified_nameonly.Two gaps
Route.pathempty for FastAPI. Matcher key field holds nothing. This one fact makes cross-repo linking a no-op./scenarios. Real mounted path is/admin/scenarios. Extractor dropsinclude_router(prefix=...). Even withpathfilled fromname, prefix gap plus param style ({scenario_id}vs:id) breaks a plain string match.Suggested fix
Route.pathfrom decorator arg during FastAPI extraction.include_router(prefix=...)mounts, prepend them, store full external path.{id}/:id/{id:int}) in matcher before compare.Impact
trace_path(mode=cross_service)cannot bridge any FastAPI backend to its clients untilRoute.pathpopulates. Cross-repo mode stays dead for the FastAPI plus SPA stack.