Repository navigation
fix(graph): impact stops at a safety budget and says it was truncated - #3125
Merged
Merged
Conversation
The impact walk had no limit, so one call on a heavily referenced symbol could load every transitive dependent into the query worker or the MCP process, and a large enough answer could run the process out of memory. getImpactRadius now takes a node and edge budget, 10,000 nodes and 50,000 edges by default, merged into the depth-aware walk from PR #2000. Re-expanding a node from a nearer depth is still allowed; only new nodes and new edges spend the budget. Edge reads are limited in SQL with one row over the budget, so hitting it can be told from an exact fit. codegraph_impact says when the answer was truncated and suggests `file` or a smaller `depth`. Changed on top of the PR: - codegraph_impact uses the same budget as the library. The PR gave MCP 1,000 nodes and 5,000 edges, but that truncated 25 of 75 busy-symbol queries on excalidraw, a mid-sized repo, and dropped direct dependents an answer shows today (the walk is depth-first, so a capped walk favours its first branches). - `codegraph impact` says so too, in its text and as `truncated` in --json. Without this the CLI would have stopped at the limit silently. Validation: - Red on main: 6 of 6 dependents past a budget of 3, 10,051 nodes from the CLI, and no truncation note. - Same answers: codegraph_impact on the 25 busiest symbols of excalidraw, gin and flask at depth 2, 3 and 5 gave byte-identical text on both arms (225 of 225). - A synthetic graph with 60 callers per node, depth 3: 219,661 nodes, 174 ms, 76 MB of heap and 155 MB RSS on main; 10,000 nodes, 8 ms, 4 MB and 59 MB here. Original PR #1583 by @danusha2345. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
codegraph_impactandcodegraph impactnow stop at a node and edge budget and say the answer was truncated, so one call on a very heavily referenced symbol can't run a process out of memory. This is the impact part of #1583, split out as its own commit.Root cause
The impact walk had no limit. One call on a hub symbol at a high depth loaded every transitive dependent into the query worker or the MCP process.
Fix (from the PR)
getImpactRadiustakes a budget, 10,000 nodes and 50,000 edges by default, merged into the depth-aware walk from #2000. Re-expanding a node from a nearer depth is still allowed; only new nodes and new edges spend the budget. Edge reads are limited in SQL with one row over the budget, so hitting it can be told from an exact fit.codegraph_impactsays when the answer was truncated and suggestsfileor a smallerdepth.What we changed
codegraph_impactuses the library's budget. The PR gave MCP 1,000 nodes and 5,000 edges. On excalidraw, a mid-sized repo, that truncated 25 of 75 busy-symbol queries, and because the walk is depth-first it dropped direct dependents an answer shows today (ExcalidrawElementat depth 5 kept 147 of its 546). With the library's budget all 75 are unchanged, and the limit still stops the case it is for.codegraph impactsays so too, in its text and astruncatedin--json. Without this the CLI would have stopped at the limit silently.Left as it is
The viewer's blast-radius numbers go through the same default budget and do not say when they stop there. The viewer is not released, and a count near 10,000 is already off any bar it draws.
Validation
codegraph_impacton the 25 busiest symbols of excalidraw, gin and flask at depth 2, 3 and 5 gives byte-identical text on both arms (225 of 225).codegraph_exploredoesn't use this walk, so its output and budgets are unchanged.CODEGRAPH_KERNEL_EXPECT=1, 4 workers): 842 files, 10,209 passed, 0 failed, 87 skipped. This commit then rebased cleanly onto b6ea617. Main's new commits sharesrc/bin/codegraph.tsandsrc/mcp/tools.tswith it, with their hunks 723 and 12 lines away from this one's, and nothing this code calls changed. On this head,graph,cli-definition-groupingand the tests of those new commits pass: 7 files, 191 tests.Lands #1583 (impact part) by @danusha2345.
🤖 Generated with Claude Code