<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Triyansh Agarwal</title>
    <description>The latest articles on DEV Community by Triyansh Agarwal (@triyansh_agarwal_670c3283).</description>
    <link>https://dev.to/triyansh_agarwal_670c3283</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4169226%2Fd8bec00d-ac81-4b04-aa43-78286a57d877.png</url>
      <title>DEV Community: Triyansh Agarwal</title>
      <link>https://dev.to/triyansh_agarwal_670c3283</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/triyansh_agarwal_670c3283"/>
    <language>en</language>
    <item>
      <title>BlastRadius: asking a graph what will break before you change the code</title>
      <dc:creator>Triyansh Agarwal</dc:creator>
      <pubDate>Sun, 18 Oct 2026 17:32:15 +0000</pubDate>
      <link>https://dev.to/triyansh_agarwal_670c3283/blastradius-asking-a-graph-what-will-break-before-you-change-the-code-m00</link>
      <guid>https://dev.to/triyansh_agarwal_670c3283/blastradius-asking-a-graph-what-will-break-before-you-change-the-code-m00</guid>
      <description>&lt;h1&gt;
  
  
  BlastRadius: asking a graph what will break before you change the code
&lt;/h1&gt;

&lt;p&gt;Changing one function in a large codebase can silently break many others, and first-time open source contributors are often afraid of exactly that. For Graph Hacks 2026 (Team Why Graph) I built BlastRadius, an agent that answers "what will break if I change this?" using a FalkorDB graph, and shows the path behind every answer.&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/triyanshag777/blastradius" rel="noopener noreferrer"&gt;https://github.com/triyanshag777/blastradius&lt;/a&gt;&lt;br&gt;
Demo video: &lt;a href="https://youtu.be/cyB5jUHiZ4M" rel="noopener noreferrer"&gt;https://youtu.be/cyB5jUHiZ4M&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;"Find usages" shows direct callers, but the real question is about connections: who depends on this through three other functions, which tests reach it, and who knows this code. That is a graph question, and a language model that only sees pieces of text is weak at it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;BlastRadius reads a Python repository with &lt;code&gt;ast&lt;/code&gt; (code is never executed) and stores it in FalkorDB: Function nodes, Person nodes, CALLS and EDITED edges. On psf/requests that is 615 functions and 1058 call edges.&lt;/p&gt;

&lt;p&gt;You ask a question in English. An LLM agent picks from a fixed set of graph tools exposed over MCP: impact, tests_for, experts, explain_path, criticality. It never writes Cypher itself. The dashboard shows the neighbourhood of the changed function, animates the exact path behind the answer, and can generate a ready pull request comment.&lt;/p&gt;

&lt;h2&gt;
  
  
  How FalkorDB is used
&lt;/h2&gt;

&lt;p&gt;Blast radius is a variable-length traversal:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MATCH p = (d:Function)-[:CALLS*1..5]-&amp;gt;(f:Function {name: $name})
WHERE d.in_tests = false AND d.name &amp;lt;&amp;gt; $name
RETURN d.name AS dependent, min(length(p)) AS hops
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The same pattern starting from test functions tells you which tests to run. shortestPath explains how two functions connect, and the built-in &lt;code&gt;algo.pageRank&lt;/code&gt; ranks how critical a function is. For Session.prepare_request it reports 16 dependents, 49 tests that reach it, and the top 5.9 percent by PageRank, which becomes a HIGH risk level.&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Check: errors your change introduces
&lt;/h2&gt;

&lt;p&gt;The feature I like most compares your uncommitted changes with the last commit. It finds removed, renamed or re-signatured functions, asks the graph who calls them, and checks every call site against the new signature. Only problems introduced by your change are reported, never old ones. When I made prepare_request require a new argument, it found 13 broken calls (12 tests and Session.request), suggested a fixed call for each, re-checked each fix against the new signature, and produced a patch. After applying it, the check reported zero new problems. It never applies or commits anything by itself, and changes to what a function does inside cannot be checked statically, so it tells you which tests to run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a graph? A small test
&lt;/h2&gt;

&lt;p&gt;I gave a plain LLM only sessions.py and asked what depends on prepare_request. It found 8 of the 16 dependents and missed every function in api.py. This is an illustrative test, not a benchmark, and a bigger context window would help on small repos, but whole repositories do not fit in a prompt and the graph also returns a verifiable path.&lt;/p&gt;

&lt;h2&gt;
  
  
  What went wrong, and what I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;My first parser linked &lt;code&gt;os.environ.get()&lt;/code&gt; to &lt;code&gt;Session.get&lt;/code&gt; because it matched calls by name, which created false paths. Skipping common method names and matching &lt;code&gt;self.x()&lt;/code&gt; inside the same file first cut the edges from 1754 to 1058.&lt;/li&gt;
&lt;li&gt;A cycle (Session.send is reachable from its own dependents) made the changed function show up as its own dependent until I excluded it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shortestPath&lt;/code&gt; is only allowed in WITH or RETURN in FalkorDB. I found that out from the error message.&lt;/li&gt;
&lt;li&gt;The free tier of my LLM provider limits tokens per minute, so the agent has to retry and keep tool results small.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;p&gt;Python only. Calls are matched by name, so dynamic dispatch, aliases and decorators are not resolved. Reviewers come from file-level git history. These limits are listed in the README.&lt;/p&gt;

&lt;p&gt;Thanks to WeMakeDevs and FalkorDB for the hackathon.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>hackathon</category>
    </item>
  </channel>
</rss>
