Repository navigation
Go services get 0 cross-repo edges (Fiber route paths empty, gRPC not captured) #686
Description
Activity
- changed the title
[-]cross-repo-intelligence: 0 edges for a Go (Fiber + gRPC) platform — Route paths empty, gRPC calls not matched[/-][+]Go services get 0 cross-repo edges (Fiber route paths empty, gRPC not captured)[/+]on Jun 29, 2026 - addedbugSomething isn't workingSomething isn't workingparsing/qualityGraph extraction bugs, false positives, missing edgesGraph extraction bugs, false positives, missing edges
on Jun 29, 2026 Thanks, this is a strong report. I’ve triaged it under #592 and #398. Treating Fiber route path resolution as the bug portion, gRPC proto-FQN linking as the #292 Tier-1 path, and Kafka as the later Tier-2 follow-up. Next step is a minimal public Fiber + proto fixture so the route-path and gRPC cases can be guarded independently.
- addedpriority/normalStandard review queue; useful PR with ordinary maintainer urgency.Standard review queue; useful PR with ordinary maintainer urgency.
on Jun 30, 2026 - addedpriority/highNeeds near-term maintainer attention; high-impact bug, regression, safety issue, or release blocker.Needs near-term maintainer attention; high-impact bug, regression, safety issue, or release blocker.and removedpriority/normalStandard review queue; useful PR with ordinary maintainer urgency.Standard review queue; useful PR with ordinary maintainer urgency.
on Sep 5, 2026 Thank you, @RawSalmon69, for the detailed breakdown!
The part you identified as the bug has moved on: Fiber Routes now carry their path (
admin.Post("/customers/:id")becomes__route__POST__/customers/{}). But theapp.Group("/admin")prefix still isn't prepended, so the full external path is still missing. Gin already resolves group prefixes, and we'll extend the same handling to Fiber.Linking generated gRPC client stubs to their handlers by proto FQN is a larger piece of work; we're tracking it under #292 Tier 1. Kafka stays with the Tier 2 track, as you suggested.
A correction to my last comment, @RawSalmon69, sorry about that: Gin group prefixes were not being resolved on current main either. That logic was lost when the indexer moved to C.
A fix covering both is ready. For a Go route, the indexer now follows the receiver back through its
Group("…")calls and prepends the prefixes. That includes nested groups (api := app.Group("/api"); v1 := api.Group("/v1")), re-assigned variables and inlineapp.Group("/x").Get(…). A non-literal prefix is left alone rather than guessed.On gofiber/recipes, 65 of 157 route→handler links now carry the full external path, for example
/api/auth/login. One known limit remains: a group passed into another function (func setup(api fiber.Router)) isn't followed yet. The PR will be linked here.- added a commit that references this issue
on Oct 4, 2026 Part of this landed on main in 2c4c784 (#2497). Thank you again, @RawSalmon69, for the detailed report.
Route registrations inside literal router groups now keep the group prefix on both indexing paths, so
admin := app.Group("/admin"); admin.Post("/customers/:id", handler)produces/admin/customers/:id. Nested and inlineGroupcalls are followed too.Not covered yet, so this issue stays open for them: dynamic prefixes, routers passed between functions,
Routecallbacks, chi mounting, and gRPC extraction. Existing indexes need a reindex to pick up the corrected paths.
Same problem as #678 and #523 (Route path comes out empty, so the matcher has nothing to compare against), but on Go, where it's total. I ran cross-repo-intelligence over a private ~50-service Go platform and got 0 edges in every category. #678 is FastAPI and #523 is generic, and #292 lists Go as a target, so here are the Go specifics.
Setup
projects_scanned: 50, so it sees all of them.Result
cross-repo-intelligence from any source repo with
target_projects: ["*"]:{"cross_http_calls":0,"cross_async_calls":0,"cross_channel":0,"cross_grpc_calls":0,"total_cross_edges":0}Same on
mode: fastandmode: full.Cause
Go HTTP routes have no path. Every Route node on a Fiber service has the verb but an empty
key_path:MATCH (r:Route) WHERE r.key_path <> ''returns nothing for the whole project. Same as #678, different framework. Fiber builds the path fromapp.Group("/admin")plusgrp.Post("/x"), so the full path is never one literal at the registration site.gRPC isn't captured at all, and it's the main backend-to-backend protocol here. Services call each other through generated stubs like
pb.NewOrderServiceClient(conn).GetOrder(ctx, req), with the address coming from an env var (ORDER_SERVICE_ADDR). No CROSS_GRPC_CALLS get emitted. The proto FQN is a clean key for this. Contracts are vendored per repo underproto/, andorderpb.OrderService/GetOrderis the same string on caller and callee even when the.protofiles have drifted apart. The address is useless to match on (it's a localhost env var); the FQN isn't. This is the Tier-1 case in #292. #294 (the emit_grpc_edge pollution bug) is fixed now, but a Go repo still givescross_grpc_calls: 0.Frontends are fine, the backends are where it breaks. The JS frontends populate
HTTP_CALLS.url_path(one had 17 calls like/admin/customers/:id). With the backend route paths empty there's nothing to join to. And even with paths filled, this platform sits behind an API gateway that rewrites paths and mounts each service at its own root, so picking the right target service needs the caller's axios baseURL too, not just the path string.Kafka. A lot of the wiring is Kafka: event topics and Debezium CDC (
dbz.mongo.*topics).MATCH (c:Channel)returns 0 on the consumers. Channels are Socket.IO/EventEmitter today and broker support is the #652 / #292 Tier-2 track, so I'm not asking for it here. Just noting HTTP plus gRPC alone won't fully connect a platform shaped like this.Repro
MATCH (r:Route) WHERE r.key_path <> '' RETURN count(r)gives 0.target_projects: ["*"]givestotal_cross_edges: 0.Fixes that would help, in order
pkg.Service/Method), from.proto/ generated*.pb.goand from the generated client stub call sites. Protocol-aware cross-repo intelligence: gRPC + typed-message + attribute-route matching (design proposal) #292 Tier 1.Can share graph dumps or test a build.