<?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: zeyusuntt</title>
    <description>The latest articles on DEV Community by zeyusuntt (@zeyusuntt).</description>
    <link>https://dev.to/zeyusuntt</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%2F4191422%2Fd218e73c-9f3a-4103-adb6-c66d293b74c7.png</url>
      <title>DEV Community: zeyusuntt</title>
      <link>https://dev.to/zeyusuntt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zeyusuntt"/>
    <language>en</language>
    <item>
      <title>What retrieval missed: a company brain on FalkorDB, tested on 1,203 held-out questions</title>
      <dc:creator>zeyusuntt</dc:creator>
      <pubDate>Sun, 18 Oct 2026 05:56:44 +0000</pubDate>
      <link>https://dev.to/zeyusuntt/what-retrieval-missed-a-company-brain-on-falkordb-tested-on-1203-held-out-questions-3m4m</link>
      <guid>https://dev.to/zeyusuntt/what-retrieval-missed-a-company-brain-on-falkordb-tested-on-1203-held-out-questions-3m4m</guid>
      <description>&lt;p&gt;I asked my agent for the authors and key reviewers of a product's technical spec. It returned all 10 employee IDs. Retrieval with the same model returned one. Two of those people were named Alice Davis.&lt;/p&gt;

&lt;p&gt;I built inherit-brain for Graph Hacks, Track 3: Company Brain. I used Salesforce's HERB benchmark, a simulated company with 30 products. I developed on six products and tested on the other 24. I wanted to see what the graph tools recovered, what retrieval missed, and where both failed.&lt;/p&gt;

&lt;p&gt;Recorded demo, including answers and tool traces: &lt;a href="https://zeyusuntt.github.io/inherit-brain/" rel="noopener noreferrer"&gt;https://zeyusuntt.github.io/inherit-brain/&lt;/a&gt;&lt;br&gt;
Code: &lt;a href="https://github.com/zeyusuntt/inherit-brain" rel="noopener noreferrer"&gt;https://github.com/zeyusuntt/inherit-brain&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Result on 1,203 held-out questions, with the plan's hash posted before the run: 80.0 for the graph tools, 39.2 for HERB's retrieval tools in the same loop, 19.2 for HERB's hybrid RAG, same model.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/D2tpskFWl8A" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

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

&lt;p&gt;inherit-brain turns a product's records into one FalkorDB graph per product: people, documents, meetings, Slack messages, pull requests, bugs and their event histories, features, customers, and who did what to which. An agent answers questions by calling nine read-only tools. Each tool runs fixed, parameterised Cypher; the model never writes a query.&lt;/p&gt;

&lt;p&gt;I use plain code to extract structure, resolve names and apply rules. Model calls extract bug histories and semantic relations such as review suggestions. I load those facts into FalkorDB and keep source record IDs on the edges.&lt;/p&gt;

&lt;p&gt;For the spec question on one product, SupportForce, the agent made one tool call (&lt;code&gt;doc_people&lt;/code&gt;), which ran three read-only queries in 21.9 ms. It returned ten people, each with the record that puts them there. The two Alice Davises are keyed by &lt;code&gt;eid_6e2f3e2b&lt;/code&gt; and &lt;code&gt;eid_e5e36dc1&lt;/code&gt;; &lt;code&gt;doc_people&lt;/code&gt; deduplicates people by employee ID across document versions.&lt;/p&gt;

&lt;p&gt;For this answer, the demo's diagram shows the stored AUTHORED and SUGGESTED edges between three versions of the spec and the ten people:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F086l9zg41a2yknyilke1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F086l9zg41a2yknyilke1.png" alt="The SupportForce spec question: three document versions and the ten people linked to them by AUTHORED and SUGGESTED edges" width="799" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7hjakqwghcxjuxme3eaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7hjakqwghcxjuxme3eaf.png" alt="The overview of the demo site" width="799" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How FalkorDB fits in
&lt;/h2&gt;

&lt;p&gt;I loaded 30 product graphs named &lt;code&gt;herb:&amp;lt;product&amp;gt;&lt;/code&gt;, containing 56,708 nodes and 164,698 edges across 16 node labels and 24 edge types. Each edge stores &lt;code&gt;src&lt;/code&gt;, a list of source record IDs that tools can return with their results. In the scored run, 46 of the 659 answers to answerable questions cited no record.&lt;/p&gt;

&lt;p&gt;The agent connects as a read-only user per product, &lt;code&gt;agent_&amp;lt;product&amp;gt;&lt;/code&gt;, created with&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ACL SETUSER agent_&amp;lt;p&amp;gt; reset on &amp;gt;&amp;lt;pw&amp;gt; (~herb:&amp;lt;p&amp;gt; +GRAPH.RO_QUERY)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;so it can run &lt;code&gt;GRAPH.RO_QUERY&lt;/code&gt; on its own product's graph and nothing else. A question about one product cannot read another.&lt;/p&gt;

&lt;p&gt;One held-out question asked who wrote the most fixes for bugs that customers later reopened in SecurityForce. The agent first tried &lt;code&gt;pr_board&lt;/code&gt; with an invalid customer-reopen argument. That call was rejected. A second &lt;code&gt;pr_board&lt;/code&gt; call returned no rows. Its third call used &lt;code&gt;bug_board&lt;/code&gt;, which ran this join:&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;b:&lt;/span&gt;&lt;span class="n"&gt;Bug&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;b.reopened&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;
  &lt;span class="n"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;$components&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="ow"&gt;OR&lt;/span&gt; &lt;span class="n"&gt;b.component&lt;/span&gt; &lt;span class="ow"&gt;IN&lt;/span&gt; &lt;span class="n"&gt;$components&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;$companies&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="ow"&gt;OR&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;x&lt;/span&gt; &lt;span class="ow"&gt;IN&lt;/span&gt; &lt;span class="n"&gt;b.companies&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;IN&lt;/span&gt; &lt;span class="n"&gt;$companies&lt;/span&gt;&lt;span class="ss"&gt;))&lt;/span&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;pr:&lt;/span&gt;&lt;span class="n"&gt;PR&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="py"&gt;fx:&lt;/span&gt;&lt;span class="n"&gt;FIXES&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;b&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&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;p:&lt;/span&gt;&lt;span class="n"&gt;Person&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="py"&gt;op:&lt;/span&gt;&lt;span class="n"&gt;OPENED&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;pr&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&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="n"&gt;b&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="py"&gt;hs:&lt;/span&gt;&lt;span class="n"&gt;HAS_EVENT&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;rs:&lt;/span&gt;&lt;span class="n"&gt;BugEvent&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;rs.type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'RESOLVED'&lt;/span&gt; &lt;span class="ow"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;pr.link&lt;/span&gt; &lt;span class="ow"&gt;IN&lt;/span&gt; &lt;span class="n"&gt;rs.fix_pr_links&lt;/span&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="n"&gt;b&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;:HAS_EVENT&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;ro:&lt;/span&gt;&lt;span class="n"&gt;BugEvent&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ro.type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'REOPENED'&lt;/span&gt; &lt;span class="ow"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;ro.ts&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;rs.ts&lt;/span&gt;
&lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="n"&gt;p.eid&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p.name&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p.role&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b.id&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pr.link&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;op.src&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fx.src&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;hs.src&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rs.id&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cypher joins the bug, its fixing PR, the author, and a resolution followed by a reopening. Python counts distinct PR links per author, because a PR can match several pairs of resolution and reopening events, and keeps everyone tied at the maximum. Julia Miller had two fixing PRs across the four matched bugs, which gave HERB's gold answer. Retrieval named four other engineers. The complete answer took 9.43 seconds across four model calls; the main join took 13.0 ms in this recording.&lt;/p&gt;

&lt;p&gt;To inspect Julia's result in FalkorDB Browser, I filtered to her employee ID (&lt;code&gt;eid_c38fe0e7&lt;/code&gt;) and returned &lt;code&gt;p, op, pr, fx, b, h, ro&lt;/code&gt;: seven nodes and six edges connecting her two PRs to their bugs and REOPENED events. The resolution events used by the scored query are not displayed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjx6pmwi5k9xsxm3d4a9q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjx6pmwi5k9xsxm3d4a9q.png" alt="FalkorDB Browser: Julia Miller opened two PRs, each FIXES a bug, each bug has a REOPENED event" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;resolve_entity&lt;/code&gt; uses full-text search (&lt;code&gt;db.idx.fulltext.queryNodes&lt;/code&gt;) as a fallback for bugs, features, documents and competitors. Person resolution matches employee IDs and normalised names, with meeting evidence for speakers. The &lt;code&gt;herb_v1.statusAt(events, $as_of)&lt;/code&gt; UDF computes status from recorded events at a cutoff date. My &lt;code&gt;bridges&lt;/code&gt; tool ranks directed betweenness on collaboration edges; its ranking depends on their orientation, and no held-out question called it.&lt;/p&gt;

&lt;p&gt;For "if this person leaves", a separate what-if user may use GRAPH.COPY to copy its product's graph into a scratch namespace, delete a person in the copy, and diff who owns the open bugs and PRs before and after. On SupportForce, if Julia Smith leaves, two open bugs and one open pull request have no owner left. My independent Python check reported no mismatches. This feature computes consequences from recorded ownership and dependencies; it was outside the scored question run.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3bw8avni4hhqgfvat89d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3bw8avni4hhqgfvat89d.png" alt="SupportForce: if Julia Smith leaves, two open bugs and one open PR lose their only recorded owner" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything runs on FalkorDB 4.22.1 and 6.0.2; the tool tests run against both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing it so I could not fool myself
&lt;/h2&gt;

&lt;p&gt;Salesforce AI Research's &lt;a href="https://github.com/SalesforceAIResearch/HERB" rel="noopener noreferrer"&gt;HERB&lt;/a&gt; supplies gold answers and includes questions that cannot be answered from the records. My held-out set contains 659 answerable and 544 unanswerable questions.&lt;/p&gt;

&lt;p&gt;Before the held-out run I froze the code, the prompts and the graphs (each hashed), wrote down the result I expected and what I would say for every outcome, and posted the plan's sha256 publicly (a &lt;a href="https://gist.github.com/zeyusuntt/3012ee12697e7afade6d820e95d6bd67" rel="noopener noreferrer"&gt;gist&lt;/a&gt; and a &lt;a href="https://web.archive.org/web/20261017025021/https://gist.github.com/zeyusuntt/3012ee12697e7afade6d820e95d6bd67" rel="noopener noreferrer"&gt;Wayback snapshot&lt;/a&gt;). A preflight refused to start any run whose hashes had drifted.&lt;/p&gt;

&lt;p&gt;I compared eight methods using Qwen3-30B-A3B-Instruct-2507 on Nebius. Four covered all 1,203 questions: inherit-brain, HERB's retrieval tools in the shared loop, whole-product prompting, and HERB's hybrid retrieval. Four tested other tool designs on smaller question sets fixed before the run: depth-1 cards, chained card access, retrieval over cards, and GraphRAG-SDK with its automatic ontology. The &lt;a href="https://github.com/zeyusuntt/inherit-brain/blob/main/results/RESULTS.md" rel="noopener noreferrer"&gt;full results&lt;/a&gt; give each method's coverage. Metered Nebius calls, including extraction and grading, cost 42.72 USD against my 50 USD cap.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Same model&lt;/th&gt;
&lt;th&gt;Structured-answer score&lt;/th&gt;
&lt;th&gt;Median input tokens per answerable question&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;inherit-brain&lt;/td&gt;
&lt;td&gt;80.0&lt;/td&gt;
&lt;td&gt;10,117&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HERB's retrieval tools, same loop&lt;/td&gt;
&lt;td&gt;39.2&lt;/td&gt;
&lt;td&gt;46,451&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Whole product in one prompt&lt;/td&gt;
&lt;td&gt;26.0&lt;/td&gt;
&lt;td&gt;125,947&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HERB's hybrid RAG (keyword and vector, one call)&lt;/td&gt;
&lt;td&gt;19.2&lt;/td&gt;
&lt;td&gt;5,176&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I scored 478 questions with structured answers using HERB's set F1, multiplied by 100. I averaged three groups equally: people, companies, and artifacts, which combines PR and URL questions. Token medians cover all 659 answerable questions.&lt;/p&gt;

&lt;p&gt;Both agents had a 12-call limit and a 60,000-token input budget per question. With the same model and loop, inherit-brain led HERB's retrieval tools by 40.8 points (95% interval 35.7 to 46.2; product-clustered bootstrap). Retrieval hit the input budget on 44.5% of questions; inherit-brain did on 1.3%. This changes the tools and the extracted representation together. It does not compare database engines.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foww99r7cjld0vyqwo78x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foww99r7cjld0vyqwo78x.png" alt="The removal test on the demo site: same model, same loop, graph tools against retrieval tools" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Giving the model graph access was not enough. On five held-out products, typed depth-1 access to the same entity cards scored 13.8 points below retrieval over those cards. Across its 280-question run, it hit the input budget on 68.9% of questions. A separate version let the model chain calls through the cards; my full tools led that version by 33.5 points on the same five products. I would package a complete join into a tool before asking the model to assemble it one step at a time. In the reopened-bug tool, Cypher performs the joins and Python counts distinct PR links. These comparisons measure whole toolkits, not traversal alone.&lt;/p&gt;

&lt;p&gt;My tools fit the questions I saw. 610 of the held-out questions share their wording (with the product name swapped) with a development question. On those, inherit-brain led retrieval by 57.9 points. On the 593 never seen, by 20.1 (12.9 to 26.5). That is still a clear lead, about a third of the size, and the results page shows it next to the headline. The split also changes the question mix: 135 of the 243 answerable unseen questions are PR questions, compared with 10 of 416 seen ones. I cannot attribute the smaller lead to unfamiliar wording alone.&lt;/p&gt;

&lt;p&gt;My extraction failed five audit rounds and passed the sixth. Two failures: an assignment needed an event on the message that handed the bug over, and an acknowledgement was not a review. Codex and a Claude agent judged sampled facts against raw records; a third Codex pass resolved disagreements. Between rounds I changed extraction rules and audit rubrics. After round four I also amended reviewer recall to target document types across versions and exclude author acknowledgements. Every round is summarised in &lt;a href="https://github.com/zeyusuntt/inherit-brain/blob/main/PREREG.md#12-development-acceptance" rel="noopener noreferrer"&gt;PREREG section 12&lt;/a&gt;. This was acceptance by model auditors on samples, not human validation.&lt;/p&gt;

&lt;p&gt;A few FalkorDB details I did not expect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;%R~herb:p&lt;/code&gt; ACL rules do not work for graph commands: &lt;code&gt;GRAPH.RO_QUERY&lt;/code&gt; declares its key as read-write, so a read-only key rule never matches. A command-scoped selector, &lt;code&gt;(~herb:p +GRAPH.RO_QUERY)&lt;/code&gt;, does.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GRAPH.COPY&lt;/code&gt; ACLs cannot distinguish source from destination. My what-if user can copy between its product graph and scratch namespace. The product graph must remain present while that user is enabled: the existing destination prevents a copy back into its name. Tests check this boundary; they do not enforce that operational condition.&lt;/li&gt;
&lt;li&gt;The server's &lt;code&gt;TIMEOUT&lt;/code&gt; was 1000 ms, so whole-graph identity reads (hashing a graph for the freeze) timed out until I passed a per-query timeout.&lt;/li&gt;
&lt;li&gt;On the directed chain &lt;code&gt;a -&amp;gt; b -&amp;gt; c&lt;/code&gt;, &lt;code&gt;samplingSize:10, samplingSeed:1&lt;/code&gt; gave &lt;code&gt;b&lt;/code&gt; a betweenness score of 0 on 4.22.1 and 1 on 6.0.2. Across two small directed fixtures, 6.0.2 passed all five checks and 4.22.1 passed two. I use a Python fallback on 4.22.1.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I kept the &lt;a href="https://github.com/zeyusuntt/inherit-brain/blob/main/docs/sponsor-feedback.md" rel="noopener noreferrer"&gt;ACL reproduction and other integration feedback&lt;/a&gt;, the &lt;a href="https://github.com/zeyusuntt/inherit-brain/blob/main/docs/falkor-versions.md" rel="noopener noreferrer"&gt;version probes and betweenness checks&lt;/a&gt;, and the &lt;a href="https://github.com/zeyusuntt/inherit-brain/blob/main/src/inherit/freeze.py#L349-L357" rel="noopener noreferrer"&gt;freeze reader's timeout override&lt;/a&gt; in the repository.&lt;/p&gt;

&lt;p&gt;With this model, whole-product prompting had 49 failed answers: 43 invalid JSON replies and six provider errors. It also returned customer IDs instead of names in 49 of 104 company answers. In a post hoc check, I mapped customer IDs to names for every method; the whole-product score rose from 26.0 to 37.3. Check output-format failures separately before reading a low score as missing facts.&lt;/p&gt;

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

&lt;p&gt;The &lt;a href="https://zeyusuntt.github.io/inherit-brain/explore.html" rel="noopener noreferrer"&gt;explorer&lt;/a&gt; contains all 1,203 held-out questions, HERB's gold answers, and the answer and score from each method that ran that question. It also shows inherit-brain's recorded tool calls and Cypher, including questions it got wrong. The site makes no model calls.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs67odywyv7zcg8d1wu5w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs67odywyv7zcg8d1wu5w.png" alt="One recorded SecurityForce question, its gold answer, and the methods' answers and scores" width="800" height="972"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With Git, Docker and uv installed, I can replay the recorded tool calls against local FalkorDB without a model key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/zeyusuntt/inherit-brain.git
&lt;span class="nb"&gt;cd &lt;/span&gt;inherit-brain
uv &lt;span class="nb"&gt;sync
&lt;/span&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
make quickstart
uv run python &lt;span class="nt"&gt;-m&lt;/span&gt; inherit.ask &lt;span class="nt"&gt;--replay&lt;/span&gt; runs/eval/A5-held &lt;span class="nt"&gt;--slot&lt;/span&gt; SecurityForce/ans/21
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same nine tools are available as an MCP server (&lt;code&gt;uv run python -m inherit.mcp_server --product SecurityForce&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;I built this with Claude Code and Codex as coding tools; the benchmark choice, experiment design, gates and release decisions were mine.&lt;/p&gt;

</description>
      <category>falkordb</category>
      <category>wemakedevs</category>
      <category>graphhacks</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
