Skip to content

fix(graph): impact stops at a safety budget and says it was truncated - #3125

Merged
colbymchenry merged 1 commit into
mainfrom
claude/pr-1583-impact-budget
Oct 31, 2026
Merged

colbymchenry merged 1 commit into
mainfrom
claude/pr-1583-impact-budget

Conversation

@colbymchenry

Copy link
Copy Markdown
Owner

codegraph_impact and codegraph impact now 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)

getImpactRadius takes 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_impact says when the answer was truncated and suggests file or a smaller depth.

What we changed

  • codegraph_impact uses 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 (ExcalidrawElement at 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 impact says so too, in its text and as truncated in --json. Without this the CLI would have stopped at the limit silently.
  • Tests for the CLI and the CHANGELOG bullet.

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

  • Red on main: 6 dependents past a budget of 3 at node level, 10,051 from the CLI, and no truncation note.
  • Before and after: codegraph_impact on 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).
  • 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.
  • codegraph_explore doesn't use this walk, so its output and budgets are unchanged.
  • Full suite on 2da21398, a stack of this commit and its sibling from fix: bound large-repo memory and traversal work #1583 on d494e43 (Vitest 4, 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 share src/bin/codegraph.ts and src/mcp/tools.ts with 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-grouping and the tests of those new commits pass: 7 files, 191 tests.

Lands #1583 (impact part) by @danusha2345.

🤖 Generated with Claude Code

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>
@colbymchenry
colbymchenry merged commit cc86361 into main Oct 31, 2026
@colbymchenry
colbymchenry deleted the claude/pr-1583-impact-budget branch October 31, 2026 00:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant