<?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: Pulkit Agarwal</title>
    <description>The latest articles on DEV Community by Pulkit Agarwal (@pulkit_agarwal_b319f96cc5).</description>
    <link>https://dev.to/pulkit_agarwal_b319f96cc5</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%2F4029105%2F68d74648-fcf6-4349-9b1a-f989f11fdd68.png</url>
      <title>DEV Community: Pulkit Agarwal</title>
      <link>https://dev.to/pulkit_agarwal_b319f96cc5</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pulkit_agarwal_b319f96cc5"/>
    <language>en</language>
    <item>
      <title>Which AI agent broke it? Tracing multi-agent failures back to the first wrong step with FalkorDB</title>
      <dc:creator>Pulkit Agarwal</dc:creator>
      <pubDate>Sun, 18 Oct 2026 17:31:46 +0000</pubDate>
      <link>https://dev.to/pulkit_agarwal_b319f96cc5/which-ai-agent-broke-it-tracing-multi-agent-failures-back-to-the-first-wrong-step-with-falkordb-3gd9</link>
      <guid>https://dev.to/pulkit_agarwal_b319f96cc5/which-ai-agent-broke-it-tracing-multi-agent-failures-back-to-the-first-wrong-step-with-falkordb-3gd9</guid>
      <description>&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/evnTPA-mxyI" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://butterfly-falkordb.netlify.app" rel="noopener noreferrer"&gt;butterfly-falkordb.netlify.app&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/PulkitAgrwal/butterfly" rel="noopener noreferrer"&gt;github.com/PulkitAgrwal/butterfly&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: the mistake is never at the end
&lt;/h2&gt;

&lt;p&gt;Here is a real failed run from the Who&amp;amp;When benchmark. A user asks a team of AI agents a simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where can I take martial arts classes within a five-minute walk from the New York Stock Exchange after work?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A planner makes a plan. A web-browsing agent searches, opens a result, and at step 12 clicks a link that lands on an unrelated website. Nobody notices. For the next fifteen steps the team goes in circles, and at step 28 the run ends without an answer.&lt;/p&gt;

&lt;p&gt;If you build multi-agent systems, you know this shape. The failure shows up at the end, but the mistake that caused it happened much earlier, and every step after it built on it. Finding that first wrong move means scrolling through the whole log, sometimes more than a hundred steps, and guessing.&lt;/p&gt;

&lt;p&gt;I wanted a tool that answers two questions in one click: &lt;strong&gt;which agent broke it, and at which step?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea: stop reading the log, ask the graph
&lt;/h2&gt;

&lt;p&gt;A failed run is not really a list of messages. It is a set of dependencies: this step used a URL that step introduced, this agent followed that instruction, this answer relied on that tool output. That is a graph, so I built &lt;strong&gt;Butterfly&lt;/strong&gt; on &lt;a href="https://www.falkordb.com/" rel="noopener noreferrer"&gt;FalkorDB&lt;/a&gt; for the WeMakeDevs × FalkorDB Graph Hacks hackathon.&lt;/p&gt;

&lt;p&gt;The name comes from the butterfly effect: one small flap early on, one storm at the end. Butterfly looks for the flap.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Turn the run into a graph
&lt;/h3&gt;

&lt;p&gt;Every message becomes a &lt;code&gt;(:Step)&lt;/code&gt; node, with the agent that wrote it and the facts it introduced: URLs, file names, numbers and names. When a later step reuses something an earlier step introduced, or follows its plan, instruction or tool result, Butterfly adds an edge:&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="ss"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;:Step&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;:DEPENDS_ON&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="n"&gt;via&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="nc"&gt;:Step&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;// later step relied on earlier step&lt;/span&gt;
&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;:Step&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;:FEEDS&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="nc"&gt;:Step&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;               &lt;span class="c1"&gt;// the same link, pointing forward&lt;/span&gt;
&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;:Step&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;:BY&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="nc"&gt;:Agent&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;:Step&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;:INTRODUCES&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="nc"&gt;:Entity&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each run is its own graph (&lt;code&gt;butterfly:hc-1&lt;/code&gt;, &lt;code&gt;butterfly:ag-18&lt;/code&gt;, ...), written with &lt;code&gt;UNWIND&lt;/code&gt; + &lt;code&gt;MERGE&lt;/code&gt;, so re-importing never duplicates anything. No LLM is involved in building it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Let FalkorDB rank the suspects
&lt;/h3&gt;

&lt;p&gt;The intuition: the decisive mistake is usually a step that a lot of the later run builds on. FalkorDB's built-in breadth-first search measures exactly that:&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="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;s:&lt;/span&gt;&lt;span class="n"&gt;Step&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;candidate:&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;CALL&lt;/span&gt; &lt;span class="n"&gt;algo.BFS&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'FEEDS'&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;YIELD&lt;/span&gt; &lt;span class="n"&gt;nodes&lt;/span&gt;
&lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="n"&gt;s.idx&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nodes&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;downstream&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;IN&lt;/span&gt; &lt;span class="n"&gt;nodes&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;n.is_final&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;reaches_final&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Combined with how many new facts a step introduced and how early it happened, this gives every step a score. Most of the work is done here, before any model is called.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. One LLM call, only on the top suspects
&lt;/h3&gt;

&lt;p&gt;Instead of handing a model the entire log, Butterfly gives one small LLM call just the top 5 to 10 suspects with their neighbours, and asks it to pick the decisive one and explain why.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Look for the chain back to the failure
&lt;/h3&gt;

&lt;p&gt;Finally, a shortest-path query looks for the chain of dependencies from the failed final step back to the chosen step:&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="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;f:&lt;/span&gt;&lt;span class="n"&gt;Step&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;is_final:&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="ss"&gt;}),&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;s:&lt;/span&gt;&lt;span class="n"&gt;Step&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;idx:&lt;/span&gt; &lt;span class="n"&gt;$idx&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="nf"&gt;shortestPath&lt;/span&gt;&lt;span class="ss"&gt;((&lt;/span&gt;&lt;span class="n"&gt;f&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;:DEPENDS_ON&lt;/span&gt;&lt;span class="o"&gt;*&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="n"&gt;s&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;p&lt;/span&gt;
&lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;IN&lt;/span&gt; &lt;span class="nf"&gt;nodes&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;n.idx&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;steps&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;IN&lt;/span&gt; &lt;span class="nf"&gt;relationships&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;r.via&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;via&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the martial-arts run it returns &lt;code&gt;28 ← 12&lt;/code&gt; in well under a millisecond: the final step depended directly on what step 12 introduced. In the app, that becomes an arrow from the mistake to the failure.&lt;/p&gt;

&lt;p&gt;Every query runs with &lt;code&gt;GRAPH.RO_QUERY&lt;/code&gt; and a timeout, the image is pinned, and the app shows the exact Cypher that ran, so nothing is a black box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does it actually work? 184 real failures
&lt;/h2&gt;

&lt;p&gt;I didn't want to grade myself on faults I planted, so I evaluated on &lt;strong&gt;all 184 failures in Who&amp;amp;When&lt;/strong&gt; (ICML 2025), a public benchmark where human experts labelled which agent caused each failure and at which step. The baseline is the same model (gpt-5.4-mini) reading the entire log, with the steps numbered for it, so it doesn't lose points by miscounting.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Finds the step&lt;/th&gt;
&lt;th&gt;Names the agent&lt;/th&gt;
&lt;th&gt;LLM input per run&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Whole log, steps numbered&lt;/td&gt;
&lt;td&gt;33.2%&lt;/td&gt;
&lt;td&gt;53.8%&lt;/td&gt;
&lt;td&gt;7.8k tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Butterfly, graph only (no LLM)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;28.3%&lt;/td&gt;
&lt;td&gt;58.2%&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Butterfly, graph + one call&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;34.8%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;62.5%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.8k tokens&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What that means, honestly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Naming the responsible agent:&lt;/strong&gt; Butterfly is better, 62.5% vs 53.8%, and the difference is statistically significant (paired McNemar test, p = 0.04).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finding the exact step:&lt;/strong&gt; a tie, about a third each. It is a hard problem for everyone; even the paper's own methods struggle with it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; about half the LLM tokens, because the graph decides what the model needs to read.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No LLM at all:&lt;/strong&gt; the graph alone finds the exact step 28% of the time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Be honest about what the graph proves.&lt;/strong&gt; My first version showed "proved with a shortest path" on every answer. Then I tested it like a judge would and found that for most runs the graph finds no direct chain from the chosen step to the failure: a chain exists for 66 of the 184 answers. Now the app says "no direct chain found" instead of drawing an arrow it can't back up. A chain shows that the failure depended on that step; whether the step was &lt;em&gt;wrong&lt;/em&gt; is decided by the ranking and the LLM call. I'd rather show less and have all of it be true.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fair baselines matter more than fancy ones.&lt;/strong&gt; The benchmark's official prompt asks the model to count steps itself, and it miscounts constantly. Against that prompt, Butterfly looked about twice as good. Once I numbered the steps for the baseline, the step-finding gap disappeared. The real win is naming the agent, and doing it with half the tokens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FalkorDB details worth knowing:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One graph per key made per-run isolation trivial: 184 graphs, zero extra setup.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;algo.BFS&lt;/code&gt; and &lt;code&gt;shortestPath&lt;/code&gt; run right inside Cypher, so ranking and the chain are a few lines of query, not a separate graph library.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;algo.BFS(s, 0, ...)&lt;/code&gt; did not mean "unlimited depth" for me; it returned nothing. Pass an explicit max depth.&lt;/li&gt;
&lt;li&gt;I pinned &lt;code&gt;falkordb/falkordb:v4.22.1&lt;/code&gt; after hitting crashes on 6.0.x.&lt;/li&gt;
&lt;li&gt;If you see &lt;code&gt;unknown command GRAPH.QUERY&lt;/code&gt;, you are probably talking to a plain Redis on port 6379, not FalkorDB. I moved FalkorDB to 6380.&lt;/li&gt;
&lt;li&gt;After a server restart, an index lookup for &lt;code&gt;idx: 0&lt;/code&gt; came back empty for me, so a &lt;code&gt;MERGE&lt;/code&gt; re-import could duplicate step 0. Reading one row per step index keeps the app correct.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use it from your own agent: an MCP server
&lt;/h2&gt;

&lt;p&gt;A debugger is only half the story if agents can't use it themselves. So Butterfly also runs as an MCP server. Any MCP client, such as Claude Code, Claude Desktop or Cursor, can call it as a tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add butterfly &lt;span class="nt"&gt;--&lt;/span&gt; uv run &lt;span class="nt"&gt;--directory&lt;/span&gt; /path/to/butterfly python &lt;span class="nt"&gt;-m&lt;/span&gt; butterfly.mcp_server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It exposes four tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;list_failed_runs&lt;/code&gt;: the 184 failed runs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;diagnose_run&lt;/code&gt;: the decisive agent and step, the reason, and the dependency chain back from the failure when the graph has one&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_step&lt;/code&gt;: one step's cleaned message&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;query_run_graph&lt;/code&gt;: any &lt;strong&gt;read-only&lt;/strong&gt; Cypher on that run's FalkorDB graph (&lt;code&gt;GRAPH.RO_QUERY&lt;/code&gt; with a timeout, so writes are rejected)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So you can ask your agent "which step broke run hc-1?" and it calls &lt;code&gt;diagnose_run&lt;/code&gt;, gets &lt;em&gt;web browser, step 12, chain 28 ← 12&lt;/em&gt;, and can then query the graph itself to see what depended on that step. One agent, debugging another.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Watch:&lt;/strong&gt; &lt;a href="https://youtu.be/evnTPA-mxyI" rel="noopener noreferrer"&gt;the 2:40 demo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Click around:&lt;/strong&gt; &lt;a href="https://butterfly-falkordb.netlify.app" rel="noopener noreferrer"&gt;butterfly-falkordb.netlify.app&lt;/a&gt;. Pick any of the 184 failed runs and press &lt;em&gt;Find the mistake&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run it live:&lt;/strong&gt; clone &lt;a href="https://github.com/PulkitAgrwal/butterfly" rel="noopener noreferrer"&gt;the repo&lt;/a&gt; and run &lt;code&gt;docker compose up&lt;/code&gt;. No API keys are needed; the LLM answers are cached.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plug it into your agent:&lt;/strong&gt; see the MCP section of the &lt;a href="https://github.com/PulkitAgrwal/butterfly#use-it-from-an-ai-agent-mcp" rel="noopener noreferrer"&gt;README&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next, I want to try Butterfly on live agent traces instead of a benchmark, so the MCP server can debug runs as they fail.&lt;/p&gt;

&lt;p&gt;If you build multi-agent systems, I'd love to hear how you debug them today.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>falkordb</category>
      <category>graphdatabase</category>
      <category>hackathon</category>
    </item>
  </channel>
</rss>
