<?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: Kaustubh_Negi</title>
    <description>The latest articles on DEV Community by Kaustubh_Negi (@kaustubh_negi).</description>
    <link>https://dev.to/kaustubh_negi</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%2F4104570%2Ff94db2d5-ebc6-4590-bf10-dff3a43375a2.jpeg</url>
      <title>DEV Community: Kaustubh_Negi</title>
      <link>https://dev.to/kaustubh_negi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kaustubh_negi"/>
    <language>en</language>
    <item>
      <title>BlastRadius: Why Severity Scores Lie, and How Graph AI Solves Real Attack Paths</title>
      <dc:creator>Kaustubh_Negi</dc:creator>
      <pubDate>Sat, 17 Oct 2026 18:28:55 +0000</pubDate>
      <link>https://dev.to/kaustubh_negi/-blastradius-why-severity-scores-lie-and-how-graph-ai-solves-real-attack-paths-4846</link>
      <guid>https://dev.to/kaustubh_negi/-blastradius-why-severity-scores-lie-and-how-graph-ai-solves-real-attack-paths-4846</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Defenders think in lists. Attackers think in graphs. As long as this is true, attackers win."&lt;/strong&gt;&lt;br&gt;
— John Lambert, Distinguished Engineer, Microsoft Threat Intelligence&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The 2:00 AM Alert Delusion
&lt;/h2&gt;

&lt;p&gt;It is 2:14 AM. Your security scanner finishes sweeping your hybrid cloud infrastructure and drops a fresh spreadsheet into your ticketing queue: &lt;strong&gt;4,821 open vulnerabilities&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Two hundred of them are flagged with a &lt;strong&gt;CVSS 9.8 or 10.0 Critical&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your SecOps team has the engineering bandwidth to patch roughly ten servers this sprint. How do you choose?&lt;/p&gt;

&lt;p&gt;If you do what 95% of security teams do, you sort the column by &lt;strong&gt;CVSS descending&lt;/strong&gt; and start patching from the top:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;legacy-ftp&lt;/code&gt;: CVSS 10.0 (Log4j remote code execution).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;batch-legacy&lt;/code&gt;: CVSS 9.8 (CGI deserialization exploit).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Congratulations: your team spent 36 uninterrupted engineering hours patching two isolated, legacy servers sitting on an air-gapped staging subnet with zero egress and zero access to customer data.&lt;/p&gt;

&lt;p&gt;Meanwhile, an unpatched &lt;strong&gt;CVSS 7.5 OpenSSL bug&lt;/strong&gt; on your internet-facing &lt;code&gt;api-gateway&lt;/code&gt; sat at ticket #384 in your backlog. Six hours later, an adversary used that single gateway to pivot into your microservices mesh and exfiltrate your entire customer database in &lt;strong&gt;three hops&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[The Vulnerability Mirage]

Isolated Subnet:
  [Attacker] ──x──&amp;gt; [legacy-ftp (CVSS 10.0)] ──x──&amp;gt; (DEAD END)

Production Route:
  [Attacker] ─────&amp;gt; [api-gateway (CVSS 7.5)] ─────&amp;gt; [db-customers (PII)]
                    ▲
                    └── THE REAL ATTACK PATH

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Severity scores tell you how dangerous a vulnerability is in isolation. They tell you nothing about whether an adversary can actually reach your crown jewels.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We built &lt;strong&gt;&lt;a href="https://github.com/saksham-2x7/BlastRadius_V1" rel="noopener noreferrer"&gt;BlastRadius&lt;/a&gt;&lt;/strong&gt; to invert this paradigm: a graph-native, autonomous AI agent powered by &lt;strong&gt;FalkorDB&lt;/strong&gt; and the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; that maps true network reachability, calculates topological choke points, and safely remediates attack paths without taking down production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Interactive Demo&lt;/strong&gt;: &lt;a href="https://www.google.com/search?q=https://blastradius-ashy.vercel.app" rel="noopener noreferrer"&gt;https://blastradius-ashy.vercel.app&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/saksham-2x7/BlastRadius_V1" rel="noopener noreferrer"&gt;https://github.com/saksham-2x7/BlastRadius_V1&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Youtube Demo Link&lt;/strong&gt;: &lt;a href="https://youtu.be/IauSZKEO8PQ" rel="noopener noreferrer"&gt;https://youtu.be/IauSZKEO8PQ&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  1. The Relational Trap vs. The Graph Reality
&lt;/h2&gt;

&lt;p&gt;Why hasn't the cybersecurity industry solved this already? Because answering the fundamental question—&lt;em&gt;"Can an attacker on the public internet walk from an exposed ingress point to our customer database through exploitable vulnerabilities?"&lt;/em&gt;—is computationally agonizing in relational databases.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Relational Nightmare (SQL)
&lt;/h3&gt;

&lt;p&gt;To trace lateral movement across a dynamic cloud network in a relational database, you must execute recursive Common Table Expressions (&lt;code&gt;WITH RECURSIVE&lt;/code&gt;) across five separate tables: &lt;code&gt;hosts&lt;/code&gt;, &lt;code&gt;network_interfaces&lt;/code&gt;, &lt;code&gt;firewall_rules&lt;/code&gt;, &lt;code&gt;installed_services&lt;/code&gt;, and &lt;code&gt;cve_vulnerabilities&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;At 4 hops, relational engines devolve into massive Cartesian joins that bring relational query planners to their knees.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Vector Search Fallacy (Naive LLMs)
&lt;/h3&gt;

&lt;p&gt;Many modern "AI security tools" attempt to dump scan reports into vector databases (RAG) and prompt an LLM: &lt;em&gt;"Find the attack path."&lt;/em&gt;&lt;br&gt;
This fails disastrously. &lt;strong&gt;Vector distance is not topological connectivity.&lt;/strong&gt; LLMs cannot reliably trace multi-hop network paths in natural language; they hallucinate hops through air-gapped subnets, fabricate firewall allowances, and skip critical lateral constraints.&lt;/p&gt;
&lt;h3&gt;
  
  
  The FalkorDB Solution
&lt;/h3&gt;

&lt;p&gt;In &lt;strong&gt;&lt;a href="https://www.falkordb.com/" rel="noopener noreferrer"&gt;FalkorDB&lt;/a&gt;&lt;/strong&gt;, network infrastructure is represented in its natural state: a directed property graph.&lt;/p&gt;

&lt;p&gt;Because FalkorDB is built on sparse matrix linear algebra (GraphBLAS) running over the ultra-fast Redis wire protocol, variable-length path traversal is not a pointer-chasing crawl—it is an optimized linear algebraic matrix multiplication executed in microseconds.&lt;/p&gt;

&lt;p&gt;Finding all paths from the public internet to our crown jewel database is a single OpenCypher query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cypher"&gt;&lt;code&gt;&lt;span class="k"&gt;MATCH&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;entry:&lt;/span&gt;&lt;span class="n"&gt;InternetEntry&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:EXPLOITABLE_ROUTE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;target:&lt;/span&gt;&lt;span class="n"&gt;CrownJewel&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;name:&lt;/span&gt; &lt;span class="s1"&gt;'db-customers'&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;length&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;hops&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Public Internet]
       │
       ├──&amp;gt; [edge-apache] ──&amp;gt; [api-gateway] ──┐
       ├──&amp;gt; [edge-nginx]  ──&amp;gt; [api-gateway] ──┼──&amp;gt; [db-customers] (CROWN JEWEL)
       ├──&amp;gt; [edge-node]   ──&amp;gt; [api-gateway] ──┘
       └──&amp;gt; [edge-apache] ──&amp;gt; [worker-java]  ─────&amp;gt; [db-customers]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One query. Instant topological reality. FalkorDB identifies the exact four attack routes an adversary can execute today.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Real Telemetry: Why CVSS and EPSS Mislead in Isolation
&lt;/h2&gt;

&lt;p&gt;To reflect real enterprise environments, BlastRadius ingests live vulnerability telemetry:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CVSS (Common Vulnerability Scoring System)&lt;/strong&gt;: Theoretical baseline severity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FIRST EPSS (Exploit Prediction Scoring System)&lt;/strong&gt;: Machine-learning exploit probability based on in-the-wild threat telemetry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CISA KEV (Known Exploited Vulnerabilities)&lt;/strong&gt;: Authoritative catalog of CVEs actively leveraged in active campaigns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Look at how raw scores compare to graph-grounded reality in our testbed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server Host&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Primary Vulnerability&lt;/th&gt;
&lt;th&gt;CVSS&lt;/th&gt;
&lt;th&gt;EPSS / KEV&lt;/th&gt;
&lt;th&gt;Graph Attack Paths&lt;/th&gt;
&lt;th&gt;True Threat Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;legacy-ftp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deprecated Storage&lt;/td&gt;
&lt;td&gt;Log4j (CVE-2021-44228)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High (KEV)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Noise&lt;/strong&gt; (No route to crown jewels)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;batch-legacy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Internal Batch Job&lt;/td&gt;
&lt;td&gt;CGI RCE (CVE-2014-6271)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Noise&lt;/strong&gt; (Dead-end subnet)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;api-gateway&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Microservice Ingress&lt;/td&gt;
&lt;td&gt;OpenSSL (CVE-2022-3602)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3 of 4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CRITICAL CHOKE POINT&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you follow traditional security advice, you spend your week patching &lt;code&gt;legacy-ftp&lt;/code&gt; and &lt;code&gt;batch-legacy&lt;/code&gt;. Your customer database remains completely exposed.&lt;/p&gt;

&lt;p&gt;BlastRadius immediately surfaces that patching a single CVE on &lt;code&gt;api-gateway&lt;/code&gt; eliminates &lt;strong&gt;75% of your total attack surface&lt;/strong&gt; in one stroke.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The Agent Mind: Parameterized MCP, Not Hallucinated Cypher
&lt;/h2&gt;

&lt;p&gt;A common anti-pattern in generative AI projects is "Text-to-SQL" or "Text-to-Cypher," where the LLM is asked to write raw queries against production databases.&lt;/p&gt;

&lt;p&gt;In cybersecurity, this is unacceptable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hallucination Risk&lt;/strong&gt;: The LLM invents relationship labels or filter predicates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Denial of Service&lt;/strong&gt;: An unconstrained, Cartesian query can lock up database memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Injection&lt;/strong&gt;: Prompt injection could manipulate the Cypher string to leak sensitive topology.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;BlastRadius uses the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;. The LLM agent never writes raw Cypher. Instead, it interacts with FalkorDB through deterministic, strongly-typed MCP tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────┐       MCP Request       ┌──────────────────┐
│                 │ ──────────────────────&amp;gt; │                  │
│    AI Agent     │                         │  FalkorDB Engine │
│ (Reasoning Core)│ &amp;lt;────────────────────── │ (Ground Truth)   │
└─────────────────┘       Typed Subgraph    └──────────────────┘

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Core MCP Toolset:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;find_choke_points()&lt;/code&gt;: Runs FalkorDB's betweenness centrality algorithms to mathematically score nodes that funnel the highest percentage of attack traffic.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_shortest_attack_path(source, target)&lt;/code&gt;: Executes FalkorDB's native shortest-path traversal to calculate minimum attacker effort.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;simulate_remediation(target_node)&lt;/code&gt;: Clones the active subgraph in memory, simulates patching or isolating the node, and recalculates remaining attack paths.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;apply_remediation(target_node)&lt;/code&gt;: Commits changes to the live graph and updates state.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;draft_jira_ticket(finding)&lt;/code&gt;: Formats an engineering ticket containing exact reproduction paths, affected assets, and rollback plans.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Handling the 4-Way Shortest Path Tie
&lt;/h3&gt;

&lt;p&gt;When an operator asks: &lt;em&gt;"Show the shortest route an attacker could take"&lt;/em&gt;, real-world networks often feature symmetric microservice ingress paths.&lt;/p&gt;

&lt;p&gt;In our reference architecture, FalkorDB evaluates all possible attack routes and detects a &lt;strong&gt;four-way tie&lt;/strong&gt;, each requiring exactly 3 hops:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;internet&lt;/code&gt; → &lt;code&gt;edge-apache&lt;/code&gt; → &lt;code&gt;api-gateway&lt;/code&gt; → &lt;code&gt;db-customers&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;internet&lt;/code&gt; → &lt;code&gt;edge-nginx&lt;/code&gt; → &lt;code&gt;api-gateway&lt;/code&gt; → &lt;code&gt;db-customers&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;internet&lt;/code&gt; → &lt;code&gt;edge-node&lt;/code&gt; → &lt;code&gt;api-gateway&lt;/code&gt; → &lt;code&gt;db-customers&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;internet&lt;/code&gt; → &lt;code&gt;edge-apache&lt;/code&gt; → &lt;code&gt;worker-java&lt;/code&gt; → &lt;code&gt;db-customers&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rather than arbitrarily picking one route or truncating results, BlastRadius highlights all four tied paths across our &lt;strong&gt;React Flow&lt;/strong&gt; topology canvas simultaneously. Operators immediately grasp the redundancy of the adversary's options.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. The Breakthrough: Graph-Governed Autonomy Tiers
&lt;/h2&gt;

&lt;p&gt;The biggest obstacle to AI agents in infrastructure is &lt;strong&gt;trust&lt;/strong&gt;. Nobody wants an autonomous agent making blind changes to production services.&lt;/p&gt;

&lt;p&gt;Most AI projects attempt to enforce safety through system prompts:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"You are a helpful assistant. Please do not modify critical servers without asking."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is dangerous. LLM system prompts can be bypassed, misunderstood, or ignored under complex context windows.&lt;/p&gt;

&lt;p&gt;In BlastRadius, &lt;strong&gt;the graph enforces safety, not the AI prompt.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  [User: "Fix everything safe"]
                                │
                                ▼
                   [Agent: Inspect Node Tier]
                                │
               ┌────────────────┴────────────────┐
               ▼                                 ▼
      [Tier 1: Leaf Worker]             [Tier 3: Choke Point]
    (Low Betweenness Centrality)       (High Centrality / Ingress)
               │                                 │
               ▼                                 ▼
       Simulate in FalkorDB              REFUSE TO MODIFY
               │                                 │
               ▼                                 ▼
         Apply Patch                     Draft Jira Ticket with
       (Paths Drop: 4 → 1)               Rollback &amp;amp; Graph Proof

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How Autonomy Tiers Are Computed:
&lt;/h3&gt;

&lt;p&gt;Before touching any node, the MCP server calculates the node's &lt;strong&gt;Autonomy Tier&lt;/strong&gt; directly from FalkorDB metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tier 1 (Safe Autonomous Remediation)&lt;/strong&gt;: Low betweenness centrality, non-ingress role, zero downstream production dependencies. The agent simulates the fix, verifies the path reduction, and executes the patch autonomously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier 3 (Human-in-the-Loop Guardrail)&lt;/strong&gt;: High betweenness centrality, ingress gateway, or shared routing component.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the operator types: &lt;em&gt;"Fix everything that is safe"&lt;/em&gt;, the agent patches the edge servers autonomously—dropping attack paths from 4 down to 1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But when it encounters &lt;code&gt;api-gateway&lt;/code&gt;, it explicitly refuses.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent informs the operator:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Remediation refused for &lt;code&gt;api-gateway&lt;/code&gt;. This node has high topological centrality and serves active ingress routes. Severing or modifying this node without maintenance coordination risks dropping production traffic. I have drafted Jira ticket SEC-402 with full graph evidence, affected paths, and a rollback plan for human approval."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The model did not decide this out of caution; the &lt;strong&gt;graph topology mathematically forbade it&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Epistemic Memory: Storing Reasoning in the Graph
&lt;/h2&gt;

&lt;p&gt;Traditional chatbot agents suffer from stateless amnesia. If you return to the console three days later and ask: &lt;em&gt;"Why didn't you patch the API gateway on Tuesday?"&lt;/em&gt;, a typical agent has no idea what you're talking about.&lt;/p&gt;

&lt;p&gt;BlastRadius writes its actions, simulations, and refusals back into FalkorDB as &lt;strong&gt;first-class graph entities&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cypher"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;d:&lt;/span&gt;&lt;span class="n"&gt;AgentDecision&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;action:&lt;/span&gt; &lt;span class="s1"&gt;'REMEDIATION_REFUSED'&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt;
    &lt;span class="py"&gt;target:&lt;/span&gt; &lt;span class="s1"&gt;'api-gateway'&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt;
    &lt;span class="py"&gt;reason:&lt;/span&gt; &lt;span class="s1"&gt;'HIGH_BETWEENNESS_CHOKE_POINT'&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;risk_score&lt;/span&gt;&lt;span class="dl"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0.89&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;timestamp&lt;/span&gt;&lt;span class="dl"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1729208000&lt;/span&gt;
&lt;span class="ss"&gt;})&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:EVALUATED_AGAINST&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;h:&lt;/span&gt;&lt;span class="n"&gt;Host&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;name:&lt;/span&gt; &lt;span class="s1"&gt;'api-gateway'&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because reasoning is stored natively in the graph:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Auditability&lt;/strong&gt;: Security teams can query historical decisions via Cypher.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explainability&lt;/strong&gt;: Every action has a bi-directional edge to the exact topological state that triggered it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Session Continuity&lt;/strong&gt;: Any operator on the team can inspect past decisions instantly.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  6. Multi-Tenancy &amp;amp; Bringing Your Own Data
&lt;/h2&gt;

&lt;p&gt;Enterprise security tools cannot be toy prototypes with hardcoded data.&lt;/p&gt;

&lt;p&gt;BlastRadius allows teams to click &lt;strong&gt;Use your own data&lt;/strong&gt;, upload network inventory or vulnerability scans, and instantly instantiate a private, isolated graph.&lt;/p&gt;

&lt;p&gt;Because FalkorDB handles multi-tenant graph namespaces with zero overhead, each user or organization operates within a strictly partitioned graph space—allowing rapid scan-to-graph conversion without infrastructure friction.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. The Technical Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Application&lt;/strong&gt;: Deployed on &lt;a href="https://www.google.com/search?q=https://blastradius-ashy.vercel.app" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graph Engine&lt;/strong&gt;: &lt;a href="https://www.falkordb.com/" rel="noopener noreferrer"&gt;FalkorDB&lt;/a&gt; (GraphBLAS-powered sparse matrix OpenCypher engine)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: FastAPI (Python 3.12) deployed on Railway&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protocol&lt;/strong&gt;: Model Context Protocol (MCP) servers exposing deterministic graph primitives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Frontend&lt;/strong&gt;: React Flow dynamic canvas rendering live attack paths, choke point halos, and edge transitions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous Integration&lt;/strong&gt;: GitHub Actions CI test suite verifying Cypher traversal accuracy, shortest-path calculation, and autonomy tier enforcement against a real, running FalkorDB container&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why BlastRadius Wins
&lt;/h2&gt;

&lt;p&gt;Most security tooling generates more data, more alerts, and more cognitive fatigue.&lt;/p&gt;

&lt;p&gt;BlastRadius does the opposite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It ignores isolated high-CVSS distractions.&lt;/li&gt;
&lt;li&gt;It pinpoints the exact topological choke point using FalkorDB graph algorithms.&lt;/li&gt;
&lt;li&gt;It proves why the choke point matters with live multi-path tracing.&lt;/li&gt;
&lt;li&gt;It executes safe remediations autonomously while enforcing rock-solid, graph-computed guardrails on critical infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Attackers will always think in graphs. It’s time our defenses did too.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://www.google.com/search?q=https://blastradius-ashy.vercel.app" rel="noopener noreferrer"&gt;https://blastradius-ashy.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/saksham-2x7/BlastRadius_V1" rel="noopener noreferrer"&gt;https://github.com/saksham-2x7/BlastRadius_V1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Youtube Demo Link&lt;/strong&gt;: &lt;a href="https://youtu.be/IauSZKEO8PQ" rel="noopener noreferrer"&gt;https://youtu.be/IauSZKEO8PQ&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>graphhacks</category>
      <category>falkordb</category>
      <category>ai</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>No pip install? No problem. Building RepoXray with Python's Standard Library</title>
      <dc:creator>Kaustubh_Negi</dc:creator>
      <pubDate>Thu, 03 Sep 2026 16:46:34 +0000</pubDate>
      <link>https://dev.to/kaustubh_negi/no-pip-install-no-problem-building-repoxray-with-pythons-standard-library-3omp</link>
      <guid>https://dev.to/kaustubh_negi/no-pip-install-no-problem-building-repoxray-with-pythons-standard-library-3omp</guid>
      <description>&lt;p&gt;What happens when you want to build a codebase analyzer, and your first instinct is to install a library for everything?&lt;/p&gt;

&lt;p&gt;You install a package for CLI handling.&lt;/p&gt;

&lt;p&gt;Another for parsing.&lt;br&gt;
Another for graphs.&lt;br&gt;
Another for searching.&lt;/p&gt;

&lt;p&gt;And suddenly your “zero-dependency” project has... a lot of dependencies. 😭&lt;/p&gt;

&lt;p&gt;For the Zero Dependency Hackathon, our team decided to build RepoXray, a command-line tool for understanding unfamiliar codebases.&lt;/p&gt;

&lt;p&gt;The catch?&lt;/p&gt;

&lt;p&gt;We couldn't use third-party runtime dependencies.&lt;/p&gt;

&lt;p&gt;So instead of asking “Which package should we use?”, we had to start asking:&lt;/p&gt;

&lt;p&gt;“What do we actually need, and can Python's standard library give us enough to build it ourselves?”&lt;/p&gt;

&lt;p&gt;That turned out to be the interesting part.&lt;/p&gt;

&lt;p&gt;What is RepoXray?&lt;/p&gt;

&lt;p&gt;When you open an unfamiliar repository, you usually want answers to a few basic questions:&lt;/p&gt;

&lt;p&gt;What is this project?&lt;br&gt;
Where is the important code?&lt;br&gt;
What depends on what?&lt;br&gt;
Which files use this one?&lt;br&gt;
If I change something here, what might break?&lt;/p&gt;

&lt;p&gt;RepoXray tries to answer those questions from the command line.&lt;/p&gt;

&lt;p&gt;Its workflow is:&lt;/p&gt;

&lt;p&gt;SCAN → INDEX → RESOLVE → ANALYZE → ANSWER&lt;/p&gt;

&lt;p&gt;It scans a repository, builds a local index, searches its contents, inspects files, resolves local relationships, and performs dependency and impact analysis.&lt;/p&gt;

&lt;p&gt;The idea isn't to replace an IDE or a full language server.&lt;/p&gt;

&lt;p&gt;It's to make exploring an unfamiliar codebase faster and more structured.&lt;/p&gt;

&lt;p&gt;Then the package manager disappeared&lt;/p&gt;

&lt;p&gt;This was the part that changed how we approached the project.&lt;/p&gt;

&lt;p&gt;Normally, reaching for an existing library is often the sensible engineering decision.&lt;/p&gt;

&lt;p&gt;Need graph traversal? There are libraries for that.&lt;br&gt;
Need parsing? There are libraries for that too.&lt;/p&gt;

&lt;p&gt;But the hackathon constraint meant we had to build around what Python already provides.&lt;/p&gt;

&lt;p&gt;Some of the pieces we ended up using were:&lt;/p&gt;

&lt;p&gt;argparse      → command-line parsing&lt;br&gt;
pathlib / os  → filesystem operations&lt;br&gt;
ast           → Python analysis&lt;br&gt;
re            → pattern matching&lt;br&gt;
hashlib       → file fingerprints&lt;br&gt;
json          → persistent index data&lt;br&gt;
collections   → graph/data structures&lt;br&gt;
sqlite3       → database inspection&lt;br&gt;
zipfile       → archive inspection&lt;br&gt;
unittest      → testing&lt;/p&gt;

&lt;p&gt;We documented 11 meaningful standard-library substitutions in our STDLIB log.&lt;/p&gt;

&lt;p&gt;But the interesting part wasn't finding a one-to-one replacement for every package.&lt;/p&gt;

&lt;p&gt;It was deciding how much functionality we actually needed.&lt;/p&gt;

&lt;p&gt;The hardest part wasn't scanning files&lt;/p&gt;

&lt;p&gt;Walking through a repository and calculating a SHA-256 hash isn't particularly difficult.&lt;/p&gt;

&lt;p&gt;Building a useful index around that information is.&lt;/p&gt;

&lt;p&gt;We had to handle things like:&lt;/p&gt;

&lt;p&gt;added and deleted files&lt;br&gt;
modified files&lt;br&gt;
renamed files&lt;br&gt;
empty projects&lt;br&gt;
corrupt indexes&lt;br&gt;
unchanged files that should be reused&lt;/p&gt;

&lt;p&gt;That led to incremental indexing, where unchanged information can be reused instead of rebuilding everything from scratch.&lt;/p&gt;

&lt;p&gt;The standard library gave us the building blocks.&lt;br&gt;
The actual behavior was ours to design.&lt;br&gt;
Import resolution: don't turn guesses into facts&lt;br&gt;
Another interesting problem was figuring out which files depend on which.&lt;/p&gt;

&lt;p&gt;For Python and JavaScript/TypeScript projects, imports aren't always straightforward file paths.&lt;/p&gt;

&lt;p&gt;There can be relative imports, different extensions, ambiguous candidates, and imports that aren't repository-local at all.&lt;/p&gt;

&lt;p&gt;So RepoXray doesn't pretend every relationship is certain.&lt;/p&gt;

&lt;p&gt;It distinguishes between:&lt;br&gt;
Resolved&lt;br&gt;
Heuristic&lt;br&gt;
Ambiguous&lt;br&gt;
Unresolved&lt;/p&gt;

&lt;p&gt;That was a deliberate choice.&lt;/p&gt;

&lt;p&gt;A tool that confidently gives you the wrong dependency graph is worse than one that admits when it isn't sure.&lt;/p&gt;

&lt;p&gt;Once those relationships exist, we can ask higher-level questions:&lt;/p&gt;

&lt;p&gt;python3 repoxray.py depends-on repoxray.py .&lt;br&gt;
python3 repoxray.py who-uses repoxray.py .&lt;br&gt;
python3 repoxray.py impact repoxray.py .&lt;/p&gt;

&lt;p&gt;So instead of simply searching for text, RepoXray can reason about repository relationships.&lt;/p&gt;

&lt;p&gt;What would we normally install?&lt;/p&gt;

&lt;p&gt;This is where the “Package Killer” idea becomes interesting, even though RepoXray itself isn't a replacement for one specific package.&lt;/p&gt;

&lt;p&gt;For graph-related functionality, for example, NetworkX would be an obvious library to consider.&lt;/p&gt;

&lt;p&gt;But we didn't recreate NetworkX.&lt;br&gt;
We didn't need all of NetworkX.&lt;/p&gt;

&lt;p&gt;We needed a smaller set of graph operations for our specific problem, so we implemented those ourselves using standard-library data structures and traversal logic.&lt;/p&gt;

&lt;p&gt;The same principle applied throughout the project.&lt;/p&gt;

&lt;p&gt;We weren't trying to rebuild the Python ecosystem.&lt;/p&gt;

&lt;p&gt;We were trying to build the functionality our application actually needed without depending on it.&lt;/p&gt;

&lt;p&gt;Then we tried to break it&lt;/p&gt;

&lt;p&gt;A demo can show that your program works once.&lt;/p&gt;

&lt;p&gt;Tests tell you what happens when someone tries to ruin your day. 😭&lt;/p&gt;

&lt;p&gt;Our test suite covers cases including:&lt;/p&gt;

&lt;p&gt;empty projects&lt;br&gt;
malformed and corrupt indexes&lt;br&gt;
ambiguous imports&lt;br&gt;
relative imports&lt;br&gt;
JavaScript imports&lt;br&gt;
cycles and self-references&lt;br&gt;
deep traversals&lt;br&gt;
incremental changes&lt;br&gt;
large-file searching&lt;br&gt;
Unicode and spaces in paths&lt;/p&gt;

&lt;p&gt;The full suite finished with:&lt;/p&gt;

&lt;p&gt;Ran 21 tests in 5.960s&lt;/p&gt;

&lt;p&gt;OK&lt;/p&gt;

&lt;p&gt;We also checked that RepoXray could import with Python's site-packages disabled:&lt;/p&gt;

&lt;p&gt;python3 -S -c "import repoxray; print('stdlib import check passed')"&lt;/p&gt;

&lt;p&gt;Result:&lt;/p&gt;

&lt;p&gt;stdlib import check passed&lt;/p&gt;

&lt;p&gt;And we packaged the application as a Python zipapp:&lt;/p&gt;

&lt;p&gt;python3 build.py&lt;/p&gt;

&lt;p&gt;producing:&lt;/p&gt;

&lt;p&gt;dist/repoxray.pyz&lt;/p&gt;

&lt;p&gt;The artifact could then be executed directly with:&lt;/p&gt;

&lt;p&gt;python3 dist/repoxray.pyz --help&lt;br&gt;
What I actually learned&lt;/p&gt;

&lt;p&gt;The biggest surprise was that zero-dependency development isn't really about avoiding imports.&lt;/p&gt;

&lt;p&gt;It's about understanding what those imports are buying you.&lt;/p&gt;

&lt;p&gt;The standard library already gives Python a lot:&lt;/p&gt;

&lt;p&gt;filesystems, hashing, parsing, data structures, serialization, databases, archives, testing, and more.&lt;/p&gt;

&lt;p&gt;But none of those things magically becomes a codebase analyzer.&lt;/p&gt;

&lt;p&gt;The engineering happens in the layer where those pieces are combined into something useful.&lt;/p&gt;

&lt;p&gt;That was probably the best part of the constraint.&lt;/p&gt;

&lt;p&gt;It forced us to stop asking:&lt;/p&gt;

&lt;p&gt;“What package does this problem have?”&lt;/p&gt;

&lt;p&gt;and start asking:&lt;/p&gt;

&lt;p&gt;“What is the actual problem we're solving?”&lt;/p&gt;

&lt;p&gt;Sometimes the answer was a few standard-library calls.&lt;/p&gt;

&lt;p&gt;Sometimes it was significantly more code.&lt;/p&gt;

&lt;p&gt;And sometimes the right answer was simply to accept a limitation instead of trying to recreate an entire ecosystem.&lt;/p&gt;

&lt;p&gt;Final thoughts&lt;/p&gt;

&lt;p&gt;RepoXray isn't trying to prove that third-party packages are bad.&lt;/p&gt;

&lt;p&gt;They're not.&lt;/p&gt;

&lt;p&gt;Packages exist for a reason, and rebuilding mature libraries from scratch is usually not a good use of engineering time.&lt;/p&gt;

&lt;p&gt;The interesting thing about this hackathon was being forced to operate without that safety net.&lt;/p&gt;

&lt;p&gt;We ended up building a codebase analyzer with repository scanning, indexing, search, import resolution, dependency relationships, impact analysis, testing, and a runnable zipapp, all while keeping the runtime dependency-free.&lt;/p&gt;

&lt;p&gt;And somewhere along the way, a simple restriction turned into one of the more useful engineering exercises we've done.&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;p&gt;“How do we avoid using packages?”&lt;/p&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;p&gt;“What can we actually build with what we already have?”&lt;/p&gt;

&lt;p&gt;For a first-year student team, that's a question I'm pretty happy we got to explore.&lt;/p&gt;

&lt;p&gt;And yes, I'm still signing up for more hackathons.&lt;/p&gt;

&lt;p&gt;Apparently I learn slowly. 😭&lt;/p&gt;

&lt;p&gt;RepoXray: &lt;a href="https://github.com/saksham-2x7/repoxray" rel="noopener noreferrer"&gt;https://github.com/saksham-2x7/repoxray&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What package would you normally reach for when building something like this? 👀&lt;/p&gt;

</description>
      <category>hackathon</category>
      <category>devtool</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>So... what happens when a first-year student decides to take hackathons seriously?</title>
      <dc:creator>Kaustubh_Negi</dc:creator>
      <pubDate>Tue, 01 Sep 2026 15:31:34 +0000</pubDate>
      <link>https://dev.to/kaustubh_negi/so-what-happens-when-a-first-year-student-decides-to-take-hackathons-seriously-3dka</link>
      <guid>https://dev.to/kaustubh_negi/so-what-happens-when-a-first-year-student-decides-to-take-hackathons-seriously-3dka</guid>
      <description>&lt;p&gt;Probably sleep deprivation. Definitely Git commits. And somehow, three projects later, I'm still here. 👀&lt;/p&gt;

&lt;p&gt;I'm a first-year B.Tech CSE (AI-ML) student at Yenepoya School of Engineering &amp;amp; Technology, Bengaluru, and part of the Kalvium program.&lt;/p&gt;

&lt;p&gt;I've been getting increasingly interested in AI/ML, software development, developer tools, and building things that actually do something. And recently, I've found hackathons to be one of the fastest ways to turn "I think I could build this" into "wait... it's actually running." 🚀&lt;/p&gt;

&lt;p&gt;Over the last few months, I've had the chance to work on a few projects:&lt;/p&gt;

&lt;p&gt;🏢 DayFlow&lt;/p&gt;

&lt;p&gt;An HRM system built for the Odoo × NMIT Hackathon, where we explored how an intelligent workforce management system could bring different HR workflows together.&lt;/p&gt;

&lt;p&gt;📱 L.A.S.A.&lt;/p&gt;

&lt;p&gt;A Local AI Smartphone Assistant for the iQOO × ReSkill Hackathon, exploring how AI could become a more natural part of the smartphone experience rather than another app you have to open.&lt;/p&gt;

&lt;p&gt;🔎 RepoXray&lt;/p&gt;

&lt;p&gt;A zero-third-party-runtime-dependency codebase analyzer built for the Zero Dependency Hackathon.&lt;/p&gt;

&lt;p&gt;This one was particularly interesting because we had to build the entire thing using Python's standard library. No installing a convenient package whenever something got annoying. 😭&lt;/p&gt;

&lt;p&gt;And apparently three hackathons weren't enough, because I'm currently taking part in PromptWars and an AI Innovation Hackathon with a six-member team.&lt;/p&gt;

&lt;p&gt;I'm still very much at the beginning of this journey, so I'm not here pretending I have everything figured out.&lt;/p&gt;

&lt;p&gt;I'm here to build, break, learn, document the process, and hopefully make the next project slightly less chaotic than the previous one.&lt;/p&gt;

&lt;p&gt;This is my first post on DEV, so here's to whatever comes next. 🥂&lt;/p&gt;

&lt;p&gt;What was the first project that made you feel like, "Okay, I'm actually building software now"?&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
